From 04faaaf7ffb422f390262e119fe50db21683a831 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Mon, 2 Jan 2017 14:04:09 +0100 Subject: [PATCH] Update BX (nw) --- 3rdparty/bx/.appveyor.yml | 1 - 3rdparty/bx/.travis.yml | 12 +- 3rdparty/bx/LICENSE | 2 +- 3rdparty/bx/README.md | 2 +- 3rdparty/bx/include/bx/allocator.h | 2 +- 3rdparty/bx/include/bx/bx.h | 5 +- 3rdparty/bx/include/bx/cl.h | 2 +- 3rdparty/bx/include/bx/commandline.h | 2 +- 3rdparty/bx/include/bx/config.h | 2 +- 3rdparty/bx/include/bx/cpu.h | 2 +- 3rdparty/bx/include/bx/crtimpl.h | 64 ++++- 3rdparty/bx/include/bx/debug.h | 2 +- 3rdparty/bx/include/bx/easing.h | 315 ++++++++++++++++++++++++ 3rdparty/bx/include/bx/endian.h | 2 +- 3rdparty/bx/include/bx/error.h | 20 +- 3rdparty/bx/include/bx/float4x4_t.h | 2 +- 3rdparty/bx/include/bx/foreach.h | 2 +- 3rdparty/bx/include/bx/fpumath.h | 72 +++++- 3rdparty/bx/include/bx/handlealloc.h | 2 +- 3rdparty/bx/include/bx/hash.h | 5 +- 3rdparty/bx/include/bx/macros.h | 2 +- 3rdparty/bx/include/bx/maputil.h | 2 +- 3rdparty/bx/include/bx/mpscqueue.h | 2 +- 3rdparty/bx/include/bx/mutex.h | 2 +- 3rdparty/bx/include/bx/os.h | 2 +- 3rdparty/bx/include/bx/platform.h | 8 +- 3rdparty/bx/include/bx/process.h | 2 +- 3rdparty/bx/include/bx/radixsort.h | 2 +- 3rdparty/bx/include/bx/readerwriter.h | 46 +++- 3rdparty/bx/include/bx/ringbuffer.h | 2 +- 3rdparty/bx/include/bx/rng.h | 63 +++-- 3rdparty/bx/include/bx/sem.h | 2 +- 3rdparty/bx/include/bx/simd256_avx.inl | 34 ++- 3rdparty/bx/include/bx/simd256_ref.inl | 56 ++++- 3rdparty/bx/include/bx/simd_t.h | 12 +- 3rdparty/bx/include/bx/spscqueue.h | 2 +- 3rdparty/bx/include/bx/string.h | 39 ++- 3rdparty/bx/include/bx/thread.h | 2 +- 3rdparty/bx/include/bx/timer.h | 2 +- 3rdparty/bx/include/bx/tokenizecmd.h | 2 +- 3rdparty/bx/include/bx/uint32_t.h | 2 +- 3rdparty/bx/makefile | 17 -- 3rdparty/bx/scripts/bin2c.lua | 2 +- 3rdparty/bx/scripts/bx.lua | 2 +- 3rdparty/bx/scripts/genie.lua | 2 +- 3rdparty/bx/scripts/toolchain.lua | 169 +++++++++---- 3rdparty/bx/tests/dbg.cpp | 2 +- 3rdparty/bx/tests/dbg.h | 2 +- 3rdparty/bx/tests/fpumath_test.cpp | 2 +- 3rdparty/bx/tests/handle_bench.cpp | 2 +- 3rdparty/bx/tests/handle_test.cpp | 2 +- 3rdparty/bx/tests/macros_test.cpp | 2 +- 3rdparty/bx/tests/main_test.cpp | 2 +- 3rdparty/bx/tests/simd_test.cpp | 42 ++-- 3rdparty/bx/tests/string_test.cpp | 34 ++- 3rdparty/bx/tests/test.h | 2 +- 3rdparty/bx/tests/thread_test.cpp | 2 +- 3rdparty/bx/tests/tokenizecmd_test.cpp | 2 +- 3rdparty/bx/tests/uint32_test.cpp | 2 +- 3rdparty/bx/tools/bin/darwin/genie | Bin 532736 -> 524544 bytes 3rdparty/bx/tools/bin/linux/genie | Bin 511712 -> 503472 bytes 3rdparty/bx/tools/bin/windows/genie.exe | Bin 516096 -> 507904 bytes 3rdparty/bx/tools/bin2c/bin2c.cpp | 4 +- 63 files changed, 891 insertions(+), 207 deletions(-) create mode 100644 3rdparty/bx/include/bx/easing.h diff --git a/3rdparty/bx/.appveyor.yml b/3rdparty/bx/.appveyor.yml index 286a3c9cc3b..db402c41b97 100644 --- a/3rdparty/bx/.appveyor.yml +++ b/3rdparty/bx/.appveyor.yml @@ -5,7 +5,6 @@ os: environment: matrix: - - TOOLSET: vs2010 - TOOLSET: vs2012 - TOOLSET: vs2013 - TOOLSET: vs2015 diff --git a/3rdparty/bx/.travis.yml b/3rdparty/bx/.travis.yml index 7b8e2d62283..cffababe8a8 100644 --- a/3rdparty/bx/.travis.yml +++ b/3rdparty/bx/.travis.yml @@ -6,8 +6,18 @@ matrix: - compiler: clang os: osx +addons: + apt: + sources: + - ubuntu-toolchain-r-test + packages: + - gcc-4.8 + - g++-4.8 + - clang + script: - make test + - if [ "$TRAVIS_OS_NAME" == "linux" ]; then make test CXX="g++-4.8" CC="gcc-4.8"; fi + - if [ "$TRAVIS_OS_NAME" == "osx" ]; then make test; fi branches: only: diff --git a/3rdparty/bx/LICENSE b/3rdparty/bx/LICENSE index c80afb7366a..f18446330b4 100644 --- a/3rdparty/bx/LICENSE +++ b/3rdparty/bx/LICENSE @@ -1,4 +1,4 @@ -Copyright 2010-2016 Branimir Karadzic. All rights reserved. +Copyright 2010-2017 Branimir Karadzic. All rights reserved. https://github.com/bkaradzic/bx diff --git a/3rdparty/bx/README.md b/3rdparty/bx/README.md index 0e17833a8d6..3da618f9f3d 100644 --- a/3rdparty/bx/README.md +++ b/3rdparty/bx/README.md @@ -19,7 +19,7 @@ https://github.com/bkaradzic/bx [License (BSD 2-clause)](https://github.com/bkaradzic/bx/blob/master/LICENSE) ----------------------------------------------------------------------------- - Copyright 2010-2016 Branimir Karadzic. All rights reserved. + Copyright 2010-2017 Branimir Karadzic. All rights reserved. https://github.com/bkaradzic/bx diff --git a/3rdparty/bx/include/bx/allocator.h b/3rdparty/bx/include/bx/allocator.h index 61356321134..f74b78b2c59 100644 --- a/3rdparty/bx/include/bx/allocator.h +++ b/3rdparty/bx/include/bx/allocator.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/bx.h b/3rdparty/bx/include/bx/bx.h index c9419b39357..65a50d08cb4 100644 --- a/3rdparty/bx/include/bx/bx.h +++ b/3rdparty/bx/include/bx/bx.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -81,7 +81,4 @@ namespace bx } // namespace bx -// Annoying C++0x stuff.. -//namespace std { namespace tr1 {}; using namespace tr1; } - #endif // BX_H_HEADER_GUARD diff --git a/3rdparty/bx/include/bx/cl.h b/3rdparty/bx/include/bx/cl.h index 17b7bafd403..f21aa96e734 100644 --- a/3rdparty/bx/include/bx/cl.h +++ b/3rdparty/bx/include/bx/cl.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/commandline.h b/3rdparty/bx/include/bx/commandline.h index d35843f8972..bafd48e3be2 100644 --- a/3rdparty/bx/include/bx/commandline.h +++ b/3rdparty/bx/include/bx/commandline.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/config.h b/3rdparty/bx/include/bx/config.h index 43c08ec0f24..86a81521161 100644 --- a/3rdparty/bx/include/bx/config.h +++ b/3rdparty/bx/include/bx/config.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/cpu.h b/3rdparty/bx/include/bx/cpu.h index a4d5c65f8c8..91ab437019d 100644 --- a/3rdparty/bx/include/bx/cpu.h +++ b/3rdparty/bx/include/bx/cpu.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/crtimpl.h b/3rdparty/bx/include/bx/crtimpl.h index dff0120f71c..b2b3d64c95a 100644 --- a/3rdparty/bx/include/bx/crtimpl.h +++ b/3rdparty/bx/include/bx/crtimpl.h @@ -1,11 +1,13 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ #ifndef BX_CRTIMPL_H_HEADER_GUARD #define BX_CRTIMPL_H_HEADER_GUARD +#include "bx.h" + #if BX_CONFIG_ALLOCATOR_CRT # include # include "allocator.h" @@ -115,6 +117,12 @@ namespace bx { BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + if (NULL != m_file) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "CrtFileReader: File is already open."); + return false; + } + m_file = fopen(_filePath, "rb"); if (NULL == m_file) { @@ -127,17 +135,21 @@ namespace bx virtual void close() BX_OVERRIDE { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); fclose(m_file); + m_file = NULL; } virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) BX_OVERRIDE { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); fseeko64(m_file, _offset, _whence); return ftello64(m_file); } virtual int32_t read(void* _data, int32_t _size, Error* _err) BX_OVERRIDE { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); int32_t size = (int32_t)fread(_data, 1, _size, m_file); @@ -145,11 +157,11 @@ namespace bx { if (0 != feof(m_file) ) { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_EOF, "CrtFileWriter: EOF."); + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_EOF, "CrtFileReader: EOF."); } else if (0 != ferror(m_file) ) { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "CrtFileWriter: read error."); + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "CrtFileReader: read error."); } return size >= 0 ? size : 0; @@ -176,6 +188,14 @@ namespace bx virtual bool open(const char* _filePath, bool _append, Error* _err) BX_OVERRIDE { + BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + + if (NULL != m_file) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "CrtFileReader: File is already open."); + return false; + } + m_file = fopen(_filePath, _append ? "ab" : "wb"); if (NULL == m_file) @@ -189,17 +209,21 @@ namespace bx virtual void close() BX_OVERRIDE { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); fclose(m_file); + m_file = NULL; } virtual int64_t seek(int64_t _offset = 0, Whence::Enum _whence = Whence::Current) BX_OVERRIDE { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); fseeko64(m_file, _offset, _whence); return ftello64(m_file); } virtual int32_t write(const void* _data, int32_t _size, Error* _err) BX_OVERRIDE { + BX_CHECK(NULL != m_file, "Reader/Writer file is not open."); BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); int32_t size = (int32_t)fwrite(_data, 1, _size, m_file); @@ -241,6 +265,12 @@ namespace bx { BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + if (NULL != m_file) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "ProcessReader: File is already open."); + return false; + } + m_file = popen(_command, "r"); if (NULL == m_file) { @@ -254,7 +284,7 @@ namespace bx virtual void close() BX_OVERRIDE { BX_CHECK(NULL != m_file, "Process not open!"); - pclose(m_file); + m_exitCode = pclose(m_file); m_file = NULL; } @@ -267,11 +297,11 @@ namespace bx { if (0 != feof(m_file) ) { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_EOF, "CrtFileWriter: EOF."); + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_EOF, "ProcessReader: EOF."); } else if (0 != ferror(m_file) ) { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "CrtFileWriter: read error."); + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_READ, "ProcessReader: read error."); } return size >= 0 ? size : 0; @@ -280,8 +310,14 @@ namespace bx return size; } + int32_t getExitCode() const + { + return m_exitCode; + } + private: FILE* m_file; + int32_t m_exitCode; }; class ProcessWriter : public WriterOpenI, public CloserI, public WriterI @@ -301,6 +337,12 @@ namespace bx { BX_CHECK(NULL != _err, "Reader/Writer interface calling functions must handle errors."); + if (NULL != m_file) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_ALREADY_OPEN, "ProcessWriter: File is already open."); + return false; + } + m_file = popen(_command, "w"); if (NULL == m_file) { @@ -314,7 +356,7 @@ namespace bx virtual void close() BX_OVERRIDE { BX_CHECK(NULL != m_file, "Process not open!"); - pclose(m_file); + m_exitCode = pclose(m_file); m_file = NULL; } @@ -327,7 +369,7 @@ namespace bx { if (0 != ferror(m_file) ) { - BX_ERROR_SET(_err, BX_ERROR_READERWRITER_WRITE, "CrtFileWriter: write error."); + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_WRITE, "ProcessWriter: write error."); } return size >= 0 ? size : 0; @@ -336,8 +378,14 @@ namespace bx return size; } + int32_t getExitCode() const + { + return m_exitCode; + } + private: FILE* m_file; + int32_t m_exitCode; }; #endif // BX_CONFIG_CRT_PROCESS diff --git a/3rdparty/bx/include/bx/debug.h b/3rdparty/bx/include/bx/debug.h index 1154ab74e2c..c94f744aad2 100644 --- a/3rdparty/bx/include/bx/debug.h +++ b/3rdparty/bx/include/bx/debug.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/easing.h b/3rdparty/bx/include/bx/easing.h new file mode 100644 index 00000000000..3db6eec53a2 --- /dev/null +++ b/3rdparty/bx/include/bx/easing.h @@ -0,0 +1,315 @@ +/* + * Copyright 2011-2017 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx#license-bsd-2-clause + */ + +#ifndef BX_EASING_H_HEADER_GUARD +#define BX_EASING_H_HEADER_GUARD + +#include "fpumath.h" + +// Reference: +// http://easings.net/ +// http://robertpenner.com/easing/ + +namespace bx +{ + struct Easing + { + enum Enum + { + Linear, + InQuad, + OutQuad, + InOutQuad, + OutInQuad, + InCubic, + OutCubic, + InOutCubic, + OutInCubic, + InQuart, + OutQuart, + InOutQuart, + OutInQuart, + InQuint, + OutQuint, + InOutQuint, + OutInQuint, + InSine, + OutSine, + InOutSine, + OutInSine, + InExpo, + OutExpo, + InOutExpo, + OutInExpo, + InCirc, + OutCirc, + InOutCirc, + OutInCirc, + InElastic, + OutElastic, + InOutElastic, + OutInElastic, + InBack, + OutBack, + InOutBack, + OutInBack, + InBounce, + OutBounce, + InOutBounce, + OutInBounce, + + Count + }; + }; + + typedef float (*EaseFn)(float _t); + + template + float easeOut(float _t) + { + return 1.0f - ease(1.0f - _t); + } + + template + float easeMix(float _t) + { + return _t < 0.5f + ? easeFrom0toH(2.0f*_t)*0.5f + : easeFromHto1(2.0f*_t - 1.0f)*0.5f + 0.5f + ; + } + + inline float easeLinear(float _t) + { + return _t; + } + + inline float easeInQuad(float _t) + { + return fsq(_t); + } + + inline float easeOutQuad(float _t) + { + return easeOut(_t); + } + + inline float easeInOutQuad(float _t) + { + return easeMix(_t); + } + + inline float easeOutInQuad(float _t) + { + return easeMix(_t); + } + + inline float easeInCubic(float _t) + { + return _t*_t*_t; + } + + inline float easeOutCubic(float _t) + { + return easeOut(_t); + } + + inline float easeInOutCubic(float _t) + { + return easeMix(_t); + } + + inline float easeOutInCubic(float _t) + { + return easeMix(_t); + } + + inline float easeInQuart(float _t) + { + return _t*_t*_t*_t; + } + + inline float easeOutQuart(float _t) + { + return easeOut(_t); + } + + inline float easeInOutQuart(float _t) + { + return easeMix(_t); + } + + inline float easeOutInQuart(float _t) + { + return easeMix(_t); + } + + inline float easeInQuint(float _t) + { + return _t*_t*_t*_t*_t; + } + + inline float easeOutQuint(float _t) + { + return easeOut(_t); + } + + inline float easeInOutQuint(float _t) + { + return easeMix(_t); + } + + inline float easeOutInQuint(float _t) + { + return easeMix(_t); + } + + inline float easeInSine(float _t) + { + return 1.0f - fcos(_t*piHalf); + } + + inline float easeOutSine(float _t) + { + return easeOut(_t); + } + + inline float easeInOutSine(float _t) + { + return easeMix(_t); + } + + inline float easeOutInSine(float _t) + { + return easeMix(_t); + } + + inline float easeInExpo(float _t) + { + return fpow(2.0f, 10.0f * (_t - 1.0f) ) - 0.001f; + } + + inline float easeOutExpo(float _t) + { + return easeOut(_t); + } + + inline float easeInOutExpo(float _t) + { + return easeMix(_t); + } + + inline float easeOutInExpo(float _t) + { + return easeMix(_t); + } + + inline float easeInCirc(float _t) + { + return -(fsqrt(1.0f - _t*_t) - 1.0f); + } + + inline float easeOutCirc(float _t) + { + return easeOut(_t); + } + + inline float easeInOutCirc(float _t) + { + return easeMix(_t); + } + + inline float easeOutInCirc(float _t) + { + return easeMix(_t); + } + + inline float easeOutElastic(float _t) + { + return fpow(2.0f, -10.0f*_t)*fsin( (_t-0.3f/4.0f)*(2.0f*pi)/0.3f) + 1.0f; + } + + inline float easeInElastic(float _t) + { + return easeOut(_t); + } + + inline float easeInOutElastic(float _t) + { + return easeMix(_t); + } + + inline float easeOutInElastic(float _t) + { + return easeMix(_t); + } + + inline float easeInBack(float _t) + { + return easeInCubic(_t) - _t*fsin(_t*pi); + } + + inline float easeOutBack(float _t) + { + return easeOut(_t); + } + + inline float easeInOutBack(float _t) + { + return easeMix(_t); + } + + inline float easeOutInBack(float _t) + { + return easeMix(_t); + } + + inline float easeOutBounce(float _t) + { + if (4.0f/11.0f > _t) + { + return 121.0f/16.0f*_t*_t; + } + + if (8.0f/11.0f > _t) + { + return 363.0f/40.0f*_t*_t + - 99.0f/10.0f*_t + + 17.0f/ 5.0f + ; + } + + if (9.0f/10.0f > _t) + { + return 4356.0f/ 361.0f*_t*_t + - 35442.0f/1805.0f*_t + + 16061.0f/1805.0f + ; + } + + return 54.0f/ 5.0f*_t*_t + - 513.0f/25.0f*_t + + 268.0f/25.0f + ; + } + + inline float easeInBounce(float _t) + { + return easeOut(_t); + } + + inline float easeInOutBounce(float _t) + { + return easeMix(_t); + } + + inline float easeOutInBounce(float _t) + { + return easeMix(_t); + } + +} // namespace bx + +#endif // BX_EASING_H_HEADER_GUARD diff --git a/3rdparty/bx/include/bx/endian.h b/3rdparty/bx/include/bx/endian.h index 0781adec589..23e9a665b63 100644 --- a/3rdparty/bx/include/bx/endian.h +++ b/3rdparty/bx/include/bx/endian.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/error.h b/3rdparty/bx/include/bx/error.h index da1b8329b6f..598d5689c6c 100644 --- a/3rdparty/bx/include/bx/error.h +++ b/3rdparty/bx/include/bx/error.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -7,6 +7,7 @@ #define BX_ERROR_H_HEADER_GUARD #include "bx.h" +#include "string.h" #define BX_ERROR_SET(_ptr, _result, _msg) \ BX_MACRO_BLOCK_BEGIN \ @@ -48,7 +49,13 @@ namespace bx { } - void setError(ErrorResult _errorResult, const char* _msg) + void reset() + { + m_code = 0; + m_msg.clear(); + } + + void setError(ErrorResult _errorResult, const StringView& _msg) { BX_CHECK(0 != _errorResult.code, "Invalid ErrorResult passed to setError!"); @@ -72,6 +79,11 @@ namespace bx return result; } + const StringView& getMessage() const + { + return m_msg; + } + bool operator==(const ErrorResult& _rhs) const { return _rhs.code == m_code; @@ -83,8 +95,8 @@ namespace bx } private: - const char* m_msg; - uint32_t m_code; + StringView m_msg; + uint32_t m_code; }; /// diff --git a/3rdparty/bx/include/bx/float4x4_t.h b/3rdparty/bx/include/bx/float4x4_t.h index 269dd633d3d..e1a5eedfa70 100644 --- a/3rdparty/bx/include/bx/float4x4_t.h +++ b/3rdparty/bx/include/bx/float4x4_t.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/foreach.h b/3rdparty/bx/include/bx/foreach.h index 43abf621105..53a6dde7265 100644 --- a/3rdparty/bx/include/bx/foreach.h +++ b/3rdparty/bx/include/bx/foreach.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/fpumath.h b/3rdparty/bx/include/bx/fpumath.h index 7d7a2671bb2..c7438eb3105 100644 --- a/3rdparty/bx/include/bx/fpumath.h +++ b/3rdparty/bx/include/bx/fpumath.h @@ -1,5 +1,5 @@ /* - * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * Copyright 2011-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -102,16 +102,6 @@ namespace bx return _a < 0.0f ? -1.0f : 1.0f; } - inline float fstep(float _edge, float _a) - { - return _a < _edge ? 0.0f : 1.0f; - } - - inline float fpulse(float _a, float _start, float _end) - { - return fstep(_a, _start) - fstep(_a, _end); - } - inline float fabsolute(float _a) { return fabsf(_a); @@ -127,11 +117,21 @@ namespace bx return sinf(_a); } + inline float fasin(float _a) + { + return asinf(_a); + } + inline float fcos(float _a) { return cosf(_a); } + inline float facos(float _a) + { + return acosf(_a); + } + inline float fpow(float _a, float _b) { return powf(_a, _b); @@ -197,6 +197,21 @@ namespace bx return result; } + inline float fstep(float _edge, float _a) + { + return _a < _edge ? 0.0f : 1.0f; + } + + inline float fpulse(float _a, float _start, float _end) + { + return fstep(_a, _start) - fstep(_a, _end); + } + + inline float fsmoothstep(float _a) + { + return fsq(_a)*(3.0f - 2.0f*_a); + } + // References: // - Bias And Gain Are Your Friend // http://blog.demofox.org/2012/09/24/bias-and-gain-are-your-friend/ @@ -341,6 +356,7 @@ namespace bx _result[2] = 1.0f / _a[2]; } + /// Calculate tangent frame from normal. inline void vec3TangentFrame(const float* __restrict _n, float* __restrict _t, float* __restrict _b) { const float nx = _n[0]; @@ -365,6 +381,21 @@ namespace bx bx::vec3Cross(_b, _n, _t); } + /// Calculate tangent frame from normal and angle. + inline void vec3TangentFrame(const float* __restrict _n, float* __restrict _t, float* __restrict _b, float _angle) + { + vec3TangentFrame(_n, _t, _b); + + const float sa = fsin(_angle); + const float ca = fcos(_angle); + + _t[0] = -sa * _b[0] + ca * _t[0]; + _t[1] = -sa * _b[1] + ca * _t[1]; + _t[2] = -sa * _b[2] + ca * _t[2]; + + bx::vec3Cross(_b, _n, _t); + } + inline void quatIdentity(float* _result) { _result[0] = 0.0f; @@ -574,6 +605,25 @@ namespace bx _result[15] = 1.0f; } + inline void mtxFromNormal(float* __restrict _result, const float* __restrict _normal, float _scale, const float* __restrict _pos, float _angle) + { + float tangent[3]; + float bitangent[3]; + vec3TangentFrame(_normal, tangent, bitangent, _angle); + + vec3Mul(&_result[ 0], bitangent, _scale); + vec3Mul(&_result[ 4], _normal, _scale); + vec3Mul(&_result[ 8], tangent, _scale); + + _result[ 3] = 0.0f; + _result[ 7] = 0.0f; + _result[11] = 0.0f; + _result[12] = _pos[0]; + _result[13] = _pos[1]; + _result[14] = _pos[2]; + _result[15] = 1.0f; + } + inline void mtxQuat(float* __restrict _result, const float* __restrict _quat) { const float x = _quat[0]; diff --git a/3rdparty/bx/include/bx/handlealloc.h b/3rdparty/bx/include/bx/handlealloc.h index bc8b42f47d4..04303f4f49c 100644 --- a/3rdparty/bx/include/bx/handlealloc.h +++ b/3rdparty/bx/include/bx/handlealloc.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/hash.h b/3rdparty/bx/include/bx/hash.h index 6e2f0849309..d037c30a3c1 100644 --- a/3rdparty/bx/include/bx/hash.h +++ b/3rdparty/bx/include/bx/hash.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -30,8 +30,7 @@ namespace bx void add(const void* _data, int _len) { - if (BX_ENABLED(BX_PLATFORM_EMSCRIPTEN) - && BX_UNLIKELY(!isPtrAligned(_data, 4) ) ) + if (BX_UNLIKELY(!isPtrAligned(_data, 4) ) ) { addUnaligned(_data, _len); return; diff --git a/3rdparty/bx/include/bx/macros.h b/3rdparty/bx/include/bx/macros.h index d565fcad103..8dc35fa5865 100644 --- a/3rdparty/bx/include/bx/macros.h +++ b/3rdparty/bx/include/bx/macros.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/maputil.h b/3rdparty/bx/include/bx/maputil.h index 21e6067043d..4c7e4aa9c2d 100644 --- a/3rdparty/bx/include/bx/maputil.h +++ b/3rdparty/bx/include/bx/maputil.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/mpscqueue.h b/3rdparty/bx/include/bx/mpscqueue.h index 5a3db68641a..de4a6646db3 100644 --- a/3rdparty/bx/include/bx/mpscqueue.h +++ b/3rdparty/bx/include/bx/mpscqueue.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/mutex.h b/3rdparty/bx/include/bx/mutex.h index b01be030bf4..76a02e1a7e8 100644 --- a/3rdparty/bx/include/bx/mutex.h +++ b/3rdparty/bx/include/bx/mutex.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/os.h b/3rdparty/bx/include/bx/os.h index 58c315af7c8..78349ddab4b 100644 --- a/3rdparty/bx/include/bx/os.h +++ b/3rdparty/bx/include/bx/os.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/platform.h b/3rdparty/bx/include/bx/platform.h index d917d07df21..e976732c031 100644 --- a/3rdparty/bx/include/bx/platform.h +++ b/3rdparty/bx/include/bx/platform.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -202,7 +202,7 @@ # undef BX_PLATFORM_RPI # define BX_PLATFORM_RPI 1 #elif defined(__linux__) \ - || defined(__riscv__) + || BX_CPU_RISCV # undef BX_PLATFORM_LINUX # define BX_PLATFORM_LINUX 1 #elif defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) \ @@ -265,7 +265,9 @@ BX_STRINGIZE(__clang_minor__) "." \ BX_STRINGIZE(__clang_patchlevel__) #elif BX_COMPILER_MSVC -# if BX_COMPILER_MSVC >= 1900 // Visual Studio 2015 +# if BX_COMPILER_MSVC >= 1910 // Visual Studio 2017 +# define BX_COMPILER_NAME "MSVC 15.0" +# elif BX_COMPILER_MSVC >= 1900 // Visual Studio 2015 # define BX_COMPILER_NAME "MSVC 14.0" # elif BX_COMPILER_MSVC >= 1800 // Visual Studio 2013 # define BX_COMPILER_NAME "MSVC 12.0" diff --git a/3rdparty/bx/include/bx/process.h b/3rdparty/bx/include/bx/process.h index 4e4b151ee49..03c8f120624 100644 --- a/3rdparty/bx/include/bx/process.h +++ b/3rdparty/bx/include/bx/process.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/radixsort.h b/3rdparty/bx/include/bx/radixsort.h index d14398cacc8..2c4dd6a2408 100644 --- a/3rdparty/bx/include/bx/radixsort.h +++ b/3rdparty/bx/include/bx/radixsort.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/readerwriter.h b/3rdparty/bx/include/bx/readerwriter.h index ee6897b8253..d926628430d 100644 --- a/3rdparty/bx/include/bx/readerwriter.h +++ b/3rdparty/bx/include/bx/readerwriter.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -16,10 +16,11 @@ #include "error.h" #include "uint32_t.h" -BX_ERROR_RESULT(BX_ERROR_READERWRITER_OPEN, BX_MAKEFOURCC('R', 'W', 0, 1) ); -BX_ERROR_RESULT(BX_ERROR_READERWRITER_READ, BX_MAKEFOURCC('R', 'W', 0, 2) ); -BX_ERROR_RESULT(BX_ERROR_READERWRITER_WRITE, BX_MAKEFOURCC('R', 'W', 0, 3) ); -BX_ERROR_RESULT(BX_ERROR_READERWRITER_EOF, BX_MAKEFOURCC('R', 'W', 0, 4) ); +BX_ERROR_RESULT(BX_ERROR_READERWRITER_OPEN, BX_MAKEFOURCC('R', 'W', 0, 1) ); +BX_ERROR_RESULT(BX_ERROR_READERWRITER_READ, BX_MAKEFOURCC('R', 'W', 0, 2) ); +BX_ERROR_RESULT(BX_ERROR_READERWRITER_WRITE, BX_MAKEFOURCC('R', 'W', 0, 3) ); +BX_ERROR_RESULT(BX_ERROR_READERWRITER_EOF, BX_MAKEFOURCC('R', 'W', 0, 4) ); +BX_ERROR_RESULT(BX_ERROR_READERWRITER_ALREADY_OPEN, BX_MAKEFOURCC('R', 'W', 0, 5) ); namespace bx { @@ -223,6 +224,41 @@ namespace bx { }; + /// Align reader stream. + inline int32_t align(ReaderSeekerI* _reader, uint32_t _alignment, Error* _err = NULL) + { + BX_ERROR_SCOPE(_err); + const int64_t current = bx::seek(_reader); + const int64_t aligned = ( (current + _alignment-1)/_alignment) * _alignment; + const int32_t size = int32_t(aligned - current); + if (0 != size) + { + const int64_t offset = bx::seek(_reader, size); + if (offset != aligned) + { + BX_ERROR_SET(_err, BX_ERROR_READERWRITER_WRITE, "Align: read truncated."); + } + return int32_t(offset - current); + } + + return 0; + } + + /// Align writer stream (pads stream with zeros). + inline int32_t align(WriterSeekerI* _writer, uint32_t _alignment, Error* _err = NULL) + { + BX_ERROR_SCOPE(_err); + const int64_t current = bx::seek(_writer); + const int64_t aligned = ( (current + _alignment-1)/_alignment) * _alignment; + const int32_t size = int32_t(aligned - current); + if (0 != size) + { + return writeRep(_writer, 0, size, _err); + } + + return 0; + } + struct BX_NO_VTABLE ReaderOpenI { virtual ~ReaderOpenI() = 0; diff --git a/3rdparty/bx/include/bx/ringbuffer.h b/3rdparty/bx/include/bx/ringbuffer.h index f3904f4694b..28e7731e3d2 100644 --- a/3rdparty/bx/include/bx/ringbuffer.h +++ b/3rdparty/bx/include/bx/ringbuffer.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/rng.h b/3rdparty/bx/include/bx/rng.h index 0a1976d6fc8..cff323c2f95 100644 --- a/3rdparty/bx/include/bx/rng.h +++ b/3rdparty/bx/include/bx/rng.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -8,6 +8,7 @@ #include "bx.h" #include "fpumath.h" +#include "uint32_t.h" namespace bx { @@ -94,36 +95,47 @@ namespace bx }; /// Returns random number between 0.0f and 1.0f. - template - inline float frnd(Ty* _rng) + template + inline float frnd(Rng* _rng) { uint32_t rnd = _rng->gen() & UINT16_MAX; return float(rnd) * 1.0f/float(UINT16_MAX); } /// Returns random number between -1.0f and 1.0f. - template - inline float frndh(Ty* _rng) + template + inline float frndh(Rng* _rng) { return 2.0f * bx::frnd(_rng) - 1.0f; } - /// Generate random point on unit sphere. - template - static inline void randUnitSphere(float _result[3], Ty* _rng) + /// Generate random point on unit circle. + template + inline void randUnitCircle(float _result[3], Rng* _rng) { - float rand0 = frnd(_rng) * 2.0f - 1.0f; - float rand1 = frnd(_rng) * pi * 2.0f; + const float angle = frnd(_rng) * pi * 2.0f; - float sqrtf1 = sqrtf(1.0f - rand0*rand0); - _result[0] = sqrtf1 * cosf(rand1); - _result[1] = sqrtf1 * sinf(rand1); + _result[0] = fcos(angle); + _result[1] = 0.0f; + _result[2] = fsin(angle); + } + + /// Generate random point on unit sphere. + template + inline void randUnitSphere(float _result[3], Rng* _rng) + { + const float rand0 = frnd(_rng) * 2.0f - 1.0f; + const float rand1 = frnd(_rng) * pi * 2.0f; + const float sqrtf1 = fsqrt(1.0f - rand0*rand0); + + _result[0] = sqrtf1 * fcos(rand1); + _result[1] = sqrtf1 * fsin(rand1); _result[2] = rand0; } /// Generate random point on unit hemisphere. template - static inline void randUnitHemisphere(float _result[3], Ty* _rng, const float _normal[3]) + inline void randUnitHemisphere(float _result[3], Ty* _rng, const float _normal[3]) { float dir[3]; randUnitSphere(dir, _rng); @@ -148,7 +160,7 @@ namespace bx /// Sampling with Hammersley and Halton Points /// http://www.cse.cuhk.edu.hk/~ttwong/papers/udpoint/udpoints.html /// - static inline void generateSphereHammersley(void* _data, uint32_t _stride, uint32_t _num, float _scale = 1.0f) + inline void generateSphereHammersley(void* _data, uint32_t _stride, uint32_t _num, float _scale = 1.0f) { uint8_t* data = (uint8_t*)_data; @@ -164,19 +176,32 @@ namespace bx tt = 2.0f * tt - 1.0f; - const float phi = (ii + 0.5f) / _num; + const float phi = (ii + 0.5f) / _num; const float phirad = phi * 2.0f * pi; - const float st = sqrtf(1.0f-tt*tt) * _scale; + const float st = fsqrt(1.0f-tt*tt) * _scale; float* xyz = (float*)data; data += _stride; - xyz[0] = st * cosf(phirad); - xyz[1] = st * sinf(phirad); + xyz[0] = st * fcos(phirad); + xyz[1] = st * fsin(phirad); xyz[2] = tt * _scale; } } + /// Fisher-Yates shuffle. + template + inline void shuffle(Rng* _rng, Ty* _array, uint32_t _num) + { + BX_CHECK(_num != 0, "Number of elements can't be 0!"); + + for (uint32_t ii = 0, num = _num-1; ii < num; ++ii) + { + uint32_t jj = ii + 1 + _rng->gen() % (num - ii); + bx::xchg(_array[ii], _array[jj]); + } + } + } // namespace bx #endif // BX_RNG_H_HEADER_GUARD diff --git a/3rdparty/bx/include/bx/sem.h b/3rdparty/bx/include/bx/sem.h index 37141c53614..b33ab3721b0 100644 --- a/3rdparty/bx/include/bx/sem.h +++ b/3rdparty/bx/include/bx/sem.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/simd256_avx.inl b/3rdparty/bx/include/bx/simd256_avx.inl index 33f5af701e4..c8af735bfbf 100644 --- a/3rdparty/bx/include/bx/simd256_avx.inl +++ b/3rdparty/bx/include/bx/simd256_avx.inl @@ -10,7 +10,6 @@ namespace bx { - template<> BX_SIMD_FORCE_INLINE simd256_avx_t simd_ld(const void* _ptr) { @@ -38,6 +37,39 @@ namespace bx return result; } + template<> + BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_splat(float _a) + { + return _mm256_set1_ps(_a); + } + + template<> + BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_isplat(uint32_t _a) + { + const __m256i splat = _mm256_set1_epi32(_a); + const simd256_avx_t_t result = _mm256_castsi256_ps(splat); + + return result; + } + + template<> + BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_itof(simd256_avx_t_t _a) + { + const __m256i itof = _mm256_castps_si256(_a); + const simd256_avx_t_t result = _mm256_cvtepi32_ps(itof); + + return result; + } + + template<> + BX_SIMD_FORCE_INLINE simd256_avx_t_t simd_ftoi(simd256_avx_t_t _a) + { + const __m256i ftoi = _mm256_cvtps_epi32(_a); + const simd256_avx_t_t result = _mm256_castsi256_ps(ftoi); + + return result; + } + typedef simd256_avx_t simd256_t; } // namespace bx diff --git a/3rdparty/bx/include/bx/simd256_ref.inl b/3rdparty/bx/include/bx/simd256_ref.inl index b1bca3f56a6..6d9a5a31ab5 100644 --- a/3rdparty/bx/include/bx/simd256_ref.inl +++ b/3rdparty/bx/include/bx/simd256_ref.inl @@ -13,27 +13,27 @@ namespace bx template<> BX_SIMD_FORCE_INLINE simd256_ref_t simd_ld(const void* _ptr) { - const simd128_t* ptr = reinterpret_cast(_ptr); + const simd256_ref_t::type* ptr = reinterpret_cast(_ptr); simd256_ref_t result; - result.simd128_0 = simd_ld(&ptr[0]); - result.simd128_1 = simd_ld(&ptr[1]); + result.simd128_0 = simd_ld(&ptr[0]); + result.simd128_1 = simd_ld(&ptr[1]); return result; } template<> BX_SIMD_FORCE_INLINE void simd_st(void* _ptr, simd256_ref_t& _a) { - simd128_t* result = reinterpret_cast(_ptr); - simd_st(&result[0], _a.simd128_0); - simd_st(&result[1], _a.simd128_1); + simd256_ref_t* result = reinterpret_cast(_ptr); + simd_st(&result[0], _a.simd128_0); + simd_st(&result[1], _a.simd128_1); } template<> BX_SIMD_FORCE_INLINE simd256_ref_t simd_ld(float _x, float _y, float _z, float _w, float _a, float _b, float _c, float _d) { simd256_ref_t result; - result.simd128_0 = simd_ld(_x, _y, _z, _w); - result.simd128_1 = simd_ld(_a, _b, _c, _d); + result.simd128_0 = simd_ld(_x, _y, _z, _w); + result.simd128_1 = simd_ld(_a, _b, _c, _d); return result; } @@ -41,8 +41,44 @@ namespace bx BX_SIMD_FORCE_INLINE simd256_ref_t simd_ild(uint32_t _x, uint32_t _y, uint32_t _z, uint32_t _w, uint32_t _a, uint32_t _b, uint32_t _c, uint32_t _d) { simd256_ref_t result; - result.simd128_0 = simd_ild(_x, _y, _z, _w); - result.simd128_1 = simd_ild(_a, _b, _c, _d); + result.simd128_0 = simd_ild(_x, _y, _z, _w); + result.simd128_1 = simd_ild(_a, _b, _c, _d); + return result; + } + + template<> + BX_SIMD_FORCE_INLINE simd256_ref_t simd_splat(float _a) + { + simd256_ref_t result; + result.simd128_0 = simd_splat(_a); + result.simd128_1 = simd_splat(_a); + return result; + } + + template<> + BX_SIMD_FORCE_INLINE simd256_ref_t simd_isplat(uint32_t _a) + { + simd256_ref_t result; + result.simd128_0 = simd_isplat(_a); + result.simd128_1 = simd_isplat(_a); + return result; + } + + template<> + BX_SIMD_FORCE_INLINE simd256_ref_t simd_itof(simd256_ref_t _a) + { + simd256_ref_t result; + result.simd128_0 = simd_itof(_a.simd128_0); + result.simd128_1 = simd_itof(_a.simd128_1); + return result; + } + + template<> + BX_SIMD_FORCE_INLINE simd256_ref_t simd_ftoi(simd256_ref_t _a) + { + simd256_ref_t result; + result.simd128_0 = simd_ftoi(_a.simd128_0); + result.simd128_1 = simd_ftoi(_a.simd128_1); return result; } diff --git a/3rdparty/bx/include/bx/simd_t.h b/3rdparty/bx/include/bx/simd_t.h index 5e1fa55d7dc..bc1fe6622f8 100644 --- a/3rdparty/bx/include/bx/simd_t.h +++ b/3rdparty/bx/include/bx/simd_t.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -402,8 +402,14 @@ namespace bx struct simd256_ref_t { - simd128_t simd128_0; - simd128_t simd128_1; +#if BX_COMPILER_MSVC + typedef simd128_ref_t type; +#else + typedef simd128_t type; +#endif // BX_COMPILER_MSVC + + type simd128_0; + type simd128_1; }; #if !BX_SIMD_AVX diff --git a/3rdparty/bx/include/bx/spscqueue.h b/3rdparty/bx/include/bx/spscqueue.h index 0e2ceacc362..3f75496f357 100644 --- a/3rdparty/bx/include/bx/spscqueue.h +++ b/3rdparty/bx/include/bx/spscqueue.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/string.h b/3rdparty/bx/include/bx/string.h index ea21ff37f07..44002f55250 100644 --- a/3rdparty/bx/include/bx/string.h +++ b/3rdparty/bx/include/bx/string.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -48,6 +48,23 @@ namespace bx return ptr - _str; } + /// Copy _num characters from string _src to _dst buffer of maximum _dstSize capacity + /// including zero terminator. Copy will be terminated with '\0'. + inline size_t strlncpy(char* _dst, size_t _dstSize, const char* _src, size_t _num = -1) + { + BX_CHECK(NULL != _dst, "_dst can't be NULL!"); + BX_CHECK(NULL != _src, "_src can't be NULL!"); + BX_CHECK(0 < _dstSize, "_dstSize can't be 0!"); + + const size_t len = strnlen(_src, _num); + const size_t max = _dstSize-1; + const size_t num = (len < max ? len : max); + strncpy(_dst, _src, num); + _dst[num] = '\0'; + + return num; + } + /// Find substring in string. Limit search to _size. inline const char* strnstr(const char* _str, const char* _find, size_t _size) { @@ -550,12 +567,12 @@ namespace bx return *this; } - StringView(const char* _ptr, uint32_t _len = UINT32_MAX) + StringView(const char* _ptr, uint32_t _len = UINT16_MAX) { set(_ptr, _len); } - void set(const char* _ptr, uint32_t _len = UINT32_MAX) + void set(const char* _ptr, uint32_t _len = UINT16_MAX) { clear(); @@ -619,11 +636,12 @@ namespace bx { public: StringT() - : StringView("", 0) + : StringView() { } StringT(const StringT& _rhs) + : StringView() { set(_rhs.m_ptr, _rhs.m_len); } @@ -652,15 +670,18 @@ namespace bx void set(const char* _ptr, uint32_t _len = UINT32_MAX) { clear(); + append(_ptr, _len); + } + void append(const char* _ptr, uint32_t _len = UINT32_MAX) + { if (0 != _len) { - uint32_t len = uint32_t(strnlen(_ptr, _len) ); + uint32_t old = m_len; + uint32_t len = m_len + uint32_t(strnlen(_ptr, _len) ); + char* ptr = (char*)BX_REALLOC(*AllocatorT, 0 != m_len ? const_cast(m_ptr) : NULL, len+1); m_len = len; - char* ptr = (char*)BX_ALLOC(*AllocatorT, len+1); - - memcpy(ptr, _ptr, len); - ptr[len] = '\0'; + strlncpy(ptr + old, len-old+1, _ptr, _len); *const_cast(&m_ptr) = ptr; } diff --git a/3rdparty/bx/include/bx/thread.h b/3rdparty/bx/include/bx/thread.h index 155e9f5c907..8514a704280 100644 --- a/3rdparty/bx/include/bx/thread.h +++ b/3rdparty/bx/include/bx/thread.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/timer.h b/3rdparty/bx/include/bx/timer.h index 462d9757a60..622e184e968 100644 --- a/3rdparty/bx/include/bx/timer.h +++ b/3rdparty/bx/include/bx/timer.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/tokenizecmd.h b/3rdparty/bx/include/bx/tokenizecmd.h index 5bb44de1737..0fe2e00b67a 100644 --- a/3rdparty/bx/include/bx/tokenizecmd.h +++ b/3rdparty/bx/include/bx/tokenizecmd.h @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 Branimir Karadzic. All rights reserved. + * Copyright 2012-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/include/bx/uint32_t.h b/3rdparty/bx/include/bx/uint32_t.h index 2f78ac3f34a..a7d6c45ad90 100644 --- a/3rdparty/bx/include/bx/uint32_t.h +++ b/3rdparty/bx/include/bx/uint32_t.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/makefile b/3rdparty/bx/makefile index 19180d4f1dc..6a6598f80b1 100644 --- a/3rdparty/bx/makefile +++ b/3rdparty/bx/makefile @@ -6,8 +6,6 @@ GENIE=../bx/tools/bin/$(OS)/genie all: - $(GENIE) vs2008 - $(GENIE) vs2010 $(GENIE) vs2012 $(GENIE) vs2013 $(GENIE) --gcc=android-arm gmake @@ -83,21 +81,6 @@ mingw-clang-release64: .build/projects/gmake-mingw-clang make -R -C .build/projects/gmake-mingw-clang config=release64 mingw-clang: mingw-clang-debug32 mingw-clang-release32 mingw-clang-debug64 mingw-clang-release64 -.build/projects/vs2008: - $(GENIE) vs2008 -vs2008-debug32: - devenv .build/projects/vs2008/bgfx.sln /Build "Debug|Win32" -vs2008-release32: - devenv .build/projects/vs2008/bgfx.sln /Build "Release|Win32" -vs2008-debug64: - devenv .build/projects/vs2008/bgfx.sln /Build "Debug|x64" -vs2008-release64: - devenv .build/projects/vs2008/bgfx.sln /Build "Release|x64" -vs2008: vs2008-debug32 vs2008-release32 vs2008-debug64 vs2008-release64 - -.build/projects/vs2010: - $(GENIE) vs2010 - .build/projects/vs2012: $(GENIE) vs2012 diff --git a/3rdparty/bx/scripts/bin2c.lua b/3rdparty/bx/scripts/bin2c.lua index 82b3a7a1771..5dbc29d7b14 100644 --- a/3rdparty/bx/scripts/bin2c.lua +++ b/3rdparty/bx/scripts/bin2c.lua @@ -1,5 +1,5 @@ -- --- Copyright 2010-2016 Branimir Karadzic. All rights reserved. +-- Copyright 2010-2017 Branimir Karadzic. All rights reserved. -- License: https://github.com/bkaradzic/bx#license-bsd-2-clause -- diff --git a/3rdparty/bx/scripts/bx.lua b/3rdparty/bx/scripts/bx.lua index 8cae8b419e8..2f1e4e57585 100644 --- a/3rdparty/bx/scripts/bx.lua +++ b/3rdparty/bx/scripts/bx.lua @@ -1,5 +1,5 @@ -- --- Copyright 2010-2016 Branimir Karadzic. All rights reserved. +-- Copyright 2010-2017 Branimir Karadzic. All rights reserved. -- License: https://github.com/bkaradzic/bx#license-bsd-2-clause -- diff --git a/3rdparty/bx/scripts/genie.lua b/3rdparty/bx/scripts/genie.lua index edc86a7823b..1e8f9028010 100644 --- a/3rdparty/bx/scripts/genie.lua +++ b/3rdparty/bx/scripts/genie.lua @@ -1,5 +1,5 @@ -- --- Copyright 2010-2016 Branimir Karadzic. All rights reserved. +-- Copyright 2010-2017 Branimir Karadzic. All rights reserved. -- License: https://github.com/bkaradzic/bx#license-bsd-2-clause -- diff --git a/3rdparty/bx/scripts/toolchain.lua b/3rdparty/bx/scripts/toolchain.lua index fced6542b9a..5d8573a690e 100644 --- a/3rdparty/bx/scripts/toolchain.lua +++ b/3rdparty/bx/scripts/toolchain.lua @@ -1,5 +1,5 @@ -- --- Copyright 2010-2016 Branimir Karadzic. All rights reserved. +-- Copyright 2010-2017 Branimir Karadzic. All rights reserved. -- License: https://github.com/bkaradzic/bx#license-bsd-2-clause -- @@ -39,6 +39,7 @@ function toolchain(_buildDir, _libDir) { "pnacl", "Native Client - PNaCl" }, { "orbis", "Orbis" }, { "qnx-arm", "QNX/Blackberry - ARM" }, + { "riscv", "RISC-V" }, { "rpi", "RaspberryPi" }, }, } @@ -51,9 +52,11 @@ function toolchain(_buildDir, _libDir) { "vs2012-clang", "Clang 3.6" }, { "vs2013-clang", "Clang 3.6" }, { "vs2015-clang", "Clang 3.9" }, + { "vs2017-clang", "Clang with MS CodeGen" }, { "vs2012-xp", "Visual Studio 2012 targeting XP" }, { "vs2013-xp", "Visual Studio 2013 targeting XP" }, { "vs2015-xp", "Visual Studio 2015 targeting XP" }, + { "vs2017-xp", "Visual Studio 2017 targeting XP" }, { "winphone8", "Windows Phone 8.0" }, { "winphone81", "Windows Phone 8.1" }, { "winstore81", "Windows Store 8.1" }, @@ -92,6 +95,12 @@ function toolchain(_buildDir, _libDir) description = "Set tvOS target version (default: 9.0).", } + newoption { + trigger = "with-windows", + value = "#", + description = "Set the Windows target platform version (default: 10.0.10240.0).", + } + newoption { trigger = "with-dynamic-runtime", description = "Dynamically link with the runtime rather than statically", @@ -118,7 +127,7 @@ function toolchain(_buildDir, _libDir) os.exit(1) end - local androidPlatform = "android-14" + local androidPlatform = "android-24" if _OPTIONS["with-android"] then androidPlatform = "android-" .. _OPTIONS["with-android"] end @@ -133,6 +142,11 @@ function toolchain(_buildDir, _libDir) tvosPlatform = _OPTIONS["with-tvos"] end + local windowsPlatform = "10.0.10240.0" + if _OPTIONS["with-windows"] then + windowsPlatform = _OPTIONS["with-windows"] + end + local compiler32bit = false if _OPTIONS["with-32bit-compiler"] then compiler32bit = true @@ -151,35 +165,41 @@ function toolchain(_buildDir, _libDir) if "android-arm" == _OPTIONS["gcc"] then - if not os.getenv("ANDROID_NDK_ARM") or not os.getenv("ANDROID_NDK_ROOT") then - print("Set ANDROID_NDK_ARM and ANDROID_NDK_ROOT envrionment variables.") + if not os.getenv("ANDROID_NDK_ARM") + or not os.getenv("ANDROID_NDK_CLANG") + or not os.getenv("ANDROID_NDK_ROOT") then + print("Set ANDROID_NDK_CLANG and ANDROID_NDK_ROOT envrionment variables.") end - premake.gcc.cc = "$(ANDROID_NDK_ARM)/bin/arm-linux-androideabi-gcc" - premake.gcc.cxx = "$(ANDROID_NDK_ARM)/bin/arm-linux-androideabi-g++" - premake.gcc.ar = "$(ANDROID_NDK_ARM)/bin/arm-linux-androideabi-ar" + premake.gcc.cc = "$(ANDROID_NDK_CLANG)/bin/clang" + premake.gcc.cxx = "$(ANDROID_NDK_CLANG)/bin/clang++" + premake.gcc.llvm = true location (path.join(_buildDir, "projects", _ACTION .. "-android-arm")) elseif "android-mips" == _OPTIONS["gcc"] then - if not os.getenv("ANDROID_NDK_MIPS") or not os.getenv("ANDROID_NDK_ROOT") then + if not os.getenv("ANDROID_NDK_MIPS") + or not os.getenv("ANDROID_NDK_CLANG") + or not os.getenv("ANDROID_NDK_ROOT") then print("Set ANDROID_NDK_MIPS and ANDROID_NDK_ROOT envrionment variables.") end - premake.gcc.cc = "$(ANDROID_NDK_MIPS)/bin/mipsel-linux-android-gcc" - premake.gcc.cxx = "$(ANDROID_NDK_MIPS)/bin/mipsel-linux-android-g++" - premake.gcc.ar = "$(ANDROID_NDK_MIPS)/bin/mipsel-linux-android-ar" + premake.gcc.cc = "$(ANDROID_NDK_CLANG)/bin/clang" + premake.gcc.cxx = "$(ANDROID_NDK_CLANG)/bin/clang++" + premake.gcc.llvm = true location (path.join(_buildDir, "projects", _ACTION .. "-android-mips")) elseif "android-x86" == _OPTIONS["gcc"] then - if not os.getenv("ANDROID_NDK_X86") or not os.getenv("ANDROID_NDK_ROOT") then + if not os.getenv("ANDROID_NDK_X86") + or not os.getenv("ANDROID_NDK_CLANG") + or not os.getenv("ANDROID_NDK_ROOT") then print("Set ANDROID_NDK_X86 and ANDROID_NDK_ROOT envrionment variables.") end - premake.gcc.cc = "$(ANDROID_NDK_X86)/bin/i686-linux-android-gcc" - premake.gcc.cxx = "$(ANDROID_NDK_X86)/bin/i686-linux-android-g++" - premake.gcc.ar = "$(ANDROID_NDK_X86)/bin/i686-linux-android-ar" + premake.gcc.cc = "$(ANDROID_NDK_CLANG)/bin/clang" + premake.gcc.cxx = "$(ANDROID_NDK_CLANG)/bin/clang++" + premake.gcc.llvm = true location (path.join(_buildDir, "projects", _ACTION .. "-android-x86")) elseif "asmjs" == _OPTIONS["gcc"] then @@ -387,17 +407,23 @@ function toolchain(_buildDir, _libDir) location (path.join(_buildDir, "projects", _ACTION .. "-rpi")) elseif "riscv" == _OPTIONS["gcc"] then - premake.gcc.cc = "$(RISCV_DIR)/bin/riscv64-unknown-elf-gcc" - premake.gcc.cxx = "$(RISCV_DIR)/bin/riscv64-unknown-elf-g++" - premake.gcc.ar = "$(RISCV_DIR)/bin/riscv64-unknown-elf-ar" + premake.gcc.cc = "$(FREEDOM_E_SDK)/toolchain/bin/riscv32-unknown-elf-gcc" + premake.gcc.cxx = "$(FREEDOM_E_SDK)/toolchain/bin/riscv32-unknown-elf-g++" + premake.gcc.ar = "$(FREEDOM_E_SDK)/toolchain/bin/riscv32-unknown-elf-ar" location (path.join(_buildDir, "projects", _ACTION .. "-riscv")) end - elseif _ACTION == "vs2012" or _ACTION == "vs2013" or _ACTION == "vs2015" then + elseif _ACTION == "vs2012" + or _ACTION == "vs2013" + or _ACTION == "vs2015" + or _ACTION == "vs2017" + then if (_ACTION .. "-clang") == _OPTIONS["vs"] then - if "vs2015-clang" == _OPTIONS["vs"] then - premake.vstudio.toolset = ("LLVM-vs2014") + if "vs2017-clang" == _OPTIONS["vs"] then + premake.vstudio.toolset = "v141_clang_c2" + elseif "vs2015-clang" == _OPTIONS["vs"] then + premake.vstudio.toolset = "LLVM-vs2014" else premake.vstudio.toolset = ("LLVM-" .. _ACTION) end @@ -422,6 +448,11 @@ function toolchain(_buildDir, _libDir) elseif "winstore82" == _OPTIONS["vs"] then premake.vstudio.toolset = "v140" premake.vstudio.storeapp = "8.2" + + local action = premake.action.current() + action.vstudio.windowsTargetPlatformVersion = windowsPlatform + action.vstudio.windowsTargetPlatformMinVersion = windowsPlatform + platforms { "ARM" } location (path.join(_buildDir, "projects", _ACTION .. "-winstore82")) @@ -457,6 +488,10 @@ function toolchain(_buildDir, _libDir) premake.vstudio.toolset = ("v140_xp") location (path.join(_buildDir, "projects", _ACTION .. "-xp")) + elseif "vs2015-xp" == _OPTIONS["vs"] then + premake.vstudio.toolset = ("v141_xp") + location (path.join(_buildDir, "projects", _ACTION .. "-xp")) + elseif _ACTION == "xcode4" then if "osx" == _OPTIONS["xcode"] then @@ -557,6 +592,21 @@ function toolchain(_buildDir, _libDir) path.join(_libDir, "lib/win64_" .. _ACTION), } + configuration { "x32", "vs2017" } + targetdir (path.join(_buildDir, "win32_" .. _ACTION, "bin")) + objdir (path.join(_buildDir, "win32_" .. _ACTION, "obj")) + libdirs { + path.join(_libDir, "lib/win32_" .. _ACTION), + } + + configuration { "x64", "vs2017" } + defines { "_WIN64" } + targetdir (path.join(_buildDir, "win64_" .. _ACTION, "bin")) + objdir (path.join(_buildDir, "win64_" .. _ACTION, "obj")) + libdirs { + path.join(_libDir, "lib/win64_" .. _ACTION), + } + configuration { "ARM", "vs*" } targetdir (path.join(_buildDir, "arm_" .. _ACTION, "bin")) objdir (path.join(_buildDir, "arm_" .. _ACTION, "obj")) @@ -588,6 +638,9 @@ function toolchain(_buildDir, _libDir) configuration { "mingw-*" } defines { "WIN32" } includedirs { path.join(bxDir, "include/compat/mingw") } + defines { + "MINGW_HAS_SECURE_API=1", + } buildoptions { "-Wunused-value", "-fdata-sections", @@ -597,7 +650,7 @@ function toolchain(_buildDir, _libDir) "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } linkoptions { "-Wl,--gc-sections", @@ -679,7 +732,7 @@ function toolchain(_buildDir, _libDir) "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } links { "rt", @@ -687,6 +740,7 @@ function toolchain(_buildDir, _libDir) } linkoptions { "-Wl,--gc-sections", + "-Wl,--as-needed", } configuration { "linux-gcc*", "x32" } @@ -730,7 +784,7 @@ function toolchain(_buildDir, _libDir) "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } links { "rt", @@ -749,7 +803,7 @@ function toolchain(_buildDir, _libDir) "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } links { "rt", @@ -765,12 +819,11 @@ function toolchain(_buildDir, _libDir) "NoImportLib", } includedirs { - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/include", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/include", "$(ANDROID_NDK_ROOT)/sources/android/native_app_glue", } linkoptions { "-nostdlib", - "-static-libgcc", } links { "c", @@ -778,21 +831,20 @@ function toolchain(_buildDir, _libDir) "m", "android", "log", - "gnustl_static", + "c++", "gcc", } buildoptions { "-fPIC", "-no-canonical-prefixes", "-Wa,--noexecstack", - "-fstack-protector", + "-fstack-protector-strong", "-ffunction-sections", - "-Wno-psabi", -- note: the mangling of 'va_list' has changed in GCC 4.4.0 "-Wunused-value", "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } linkoptions { "-no-canonical-prefixes", @@ -811,7 +863,7 @@ function toolchain(_buildDir, _libDir) "__STEAMLINK__=1", -- There is no special prefedined compiler symbol to detect SteamLink, faking it. } buildoptions { - "-std=c++0x", + "-std=c++11", "-Wfatal-errors", "-Wunused-value", "-Wundef", @@ -831,14 +883,16 @@ function toolchain(_buildDir, _libDir) objdir (path.join(_buildDir, "android-arm/obj")) libdirs { path.join(_libDir, "lib/android-arm"), - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a", } includedirs { - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi-v7a/include", - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/include", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/include", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/include", } buildoptions { + "-gcc-toolchain $(ANDROID_NDK_ARM)", "--sysroot=" .. path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-arm"), + "-target armv7-none-linux-androideabi", "-mthumb", "-march=armv7-a", "-mfloat-abi=softfp", @@ -847,9 +901,11 @@ function toolchain(_buildDir, _libDir) "-Wundef", } linkoptions { + "-gcc-toolchain $(ANDROID_NDK_ARM)", "--sysroot=" .. path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-arm"), path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-arm/usr/lib/crtbegin_so.o"), path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-arm/usr/lib/crtend_so.o"), + "-target armv7-none-linux-androideabi", "-march=armv7-a", "-Wl,--fix-cortex-a8", } @@ -859,20 +915,26 @@ function toolchain(_buildDir, _libDir) objdir (path.join(_buildDir, "android-mips/obj")) libdirs { path.join(_libDir, "lib/android-mips"), - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/mips", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/libs/mips", } includedirs { - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/mips/include", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/libs/mips/include", } buildoptions { + "-gcc-toolchain $(ANDROID_NDK_MIPS)", "--sysroot=" .. path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-mips"), + "-target mipsel-none-linux-android", + "-mips32", "-Wunused-value", "-Wundef", } linkoptions { + "-gcc-toolchain $(ANDROID_NDK_MIPS)", "--sysroot=" .. path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-mips"), path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-mips/usr/lib/crtbegin_so.o"), path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-mips/usr/lib/crtend_so.o"), + "-target mipsel-none-linux-android", + "-mips32", } configuration { "android-x86" } @@ -880,13 +942,15 @@ function toolchain(_buildDir, _libDir) objdir (path.join(_buildDir, "android-x86/obj")) libdirs { path.join(_libDir, "lib/android-x86"), - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/libs/x86", } includedirs { - "$(ANDROID_NDK_ROOT)/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/include", + "$(ANDROID_NDK_ROOT)/sources/cxx-stl/llvm-libc++/libs/x86/include", } buildoptions { + "-gcc-toolchain $(ANDROID_NDK_X86)", "--sysroot=" .. path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-x86"), + "-target i686-none-linux-android", "-march=i686", "-mtune=atom", "-mstackrealign", @@ -896,9 +960,11 @@ function toolchain(_buildDir, _libDir) "-Wundef", } linkoptions { + "-gcc-toolchain $(ANDROID_NDK_X86)", "--sysroot=" .. path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-x86"), path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-x86/usr/lib/crtbegin_so.o"), path.join("$(ANDROID_NDK_ROOT)/platforms", androidPlatform, "arch-x86/usr/lib/crtend_so.o"), + "-target i686-none-linux-android", } configuration { "asmjs" } @@ -931,7 +997,7 @@ function toolchain(_buildDir, _libDir) "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } includedirs { "$(NACL_SDK_ROOT)/include", @@ -1045,6 +1111,9 @@ function toolchain(_buildDir, _libDir) objdir (path.join(_buildDir, "osx_universal/bin")) configuration { "osx" } + buildoptions_cpp { + "-std=c++11", + } buildoptions { "-Wfatal-errors", "-msse2", @@ -1057,6 +1126,9 @@ function toolchain(_buildDir, _libDir) linkoptions { "-lc++", } + buildoptions_cpp { + "-std=c++11", + } buildoptions { "-Wfatal-errors", "-Wunused-value", @@ -1184,7 +1256,7 @@ function toolchain(_buildDir, _libDir) buildoptions { } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } linkoptions { } @@ -1200,7 +1272,7 @@ function toolchain(_buildDir, _libDir) "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } configuration { "rpi" } @@ -1219,7 +1291,7 @@ function toolchain(_buildDir, _libDir) "-Wundef", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } includedirs { "/opt/vc/include", @@ -1236,16 +1308,21 @@ function toolchain(_buildDir, _libDir) configuration { "riscv" } targetdir (path.join(_buildDir, "riscv/bin")) objdir (path.join(_buildDir, "riscv/obj")) + defines { + "__BSD_VISIBLE", + "__MISC_VISIBLE", + } includedirs { - "$(RISCV_DIR)/sysroot/usr/include", + "$(FREEDOM_E_SDK)/toolchain/riscv32-unknown-elf/include", + path.join(bxDir, "include/compat/riscv"), } buildoptions { "-Wunused-value", "-Wundef", - "--sysroot=$(RISCV_DIR)/sysroot", + "--sysroot=$(FREEDOM_E_SDK)/toolchain/riscv32-unknown-elf", } buildoptions_cpp { - "-std=c++0x", + "-std=c++11", } configuration {} -- reset configuration diff --git a/3rdparty/bx/tests/dbg.cpp b/3rdparty/bx/tests/dbg.cpp index efbfad6b6c1..58e3f034a86 100644 --- a/3rdparty/bx/tests/dbg.cpp +++ b/3rdparty/bx/tests/dbg.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * Copyright 2011-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/dbg.h b/3rdparty/bx/tests/dbg.h index b1f23910b04..21f4433820b 100644 --- a/3rdparty/bx/tests/dbg.h +++ b/3rdparty/bx/tests/dbg.h @@ -1,5 +1,5 @@ /* - * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * Copyright 2011-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/fpumath_test.cpp b/3rdparty/bx/tests/fpumath_test.cpp index 8f98ea28365..f41cea8ba91 100644 --- a/3rdparty/bx/tests/fpumath_test.cpp +++ b/3rdparty/bx/tests/fpumath_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/handle_bench.cpp b/3rdparty/bx/tests/handle_bench.cpp index 1b1032bb226..a882cbe635d 100644 --- a/3rdparty/bx/tests/handle_bench.cpp +++ b/3rdparty/bx/tests/handle_bench.cpp @@ -52,7 +52,7 @@ int main() { typedef std::unordered_map StdUnorderedMap; StdUnorderedMap map; -// map.reserve(numElements); + map.reserve(numElements); for (uint32_t jj = 0; jj < numElements; ++jj) { std::pair ok = map.insert(std::make_pair(uint64_t(jj), uint16_t(jj) ) ); diff --git a/3rdparty/bx/tests/handle_test.cpp b/3rdparty/bx/tests/handle_test.cpp index 29019e318cf..5bcd6f8c89e 100644 --- a/3rdparty/bx/tests/handle_test.cpp +++ b/3rdparty/bx/tests/handle_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/macros_test.cpp b/3rdparty/bx/tests/macros_test.cpp index 321bc67e27b..37079de73a4 100644 --- a/3rdparty/bx/tests/macros_test.cpp +++ b/3rdparty/bx/tests/macros_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/main_test.cpp b/3rdparty/bx/tests/main_test.cpp index f6aaa90d538..47e9bf46155 100644 --- a/3rdparty/bx/tests/main_test.cpp +++ b/3rdparty/bx/tests/main_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/simd_test.cpp b/3rdparty/bx/tests/simd_test.cpp index f40b009388f..0a361f4f7aa 100644 --- a/3rdparty/bx/tests/simd_test.cpp +++ b/3rdparty/bx/tests/simd_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -11,11 +11,13 @@ #if 0 # define SIMD_DBG DBG #else -# define SIMD_DBG(_fmt, ...) BX_UNUSED(__VA_ARGS__); +# define SIMD_DBG unused #endif // 0 using namespace bx; +inline void unused(...) {} + union simd_cast { bx::simd256_t simd256; @@ -59,7 +61,6 @@ void simd_check_int32( REQUIRE(c.i[3] == _3); } -#if 0 void simd_check_int32( const char* _str , bx::simd256_t _a @@ -89,7 +90,6 @@ void simd_check_int32( REQUIRE(c.i[6] == _6); REQUIRE(c.i[7] == _7); } -#endif // 0 void simd_check_uint32( const char* _str @@ -114,7 +114,6 @@ void simd_check_uint32( REQUIRE(c.ui[3] == _3); } -#if 0 void simd_check_uint32( const char* _str , bx::simd256_t _a @@ -145,7 +144,6 @@ void simd_check_uint32( REQUIRE(c.ui[6] == _6); REQUIRE(c.ui[7] == _7); } -#endif // 0 void simd_check_float( const char* _str @@ -170,7 +168,6 @@ void simd_check_float( CHECK(bx::fequal(c.f[3], _3, 0.0001f) ); } -#if 0 void simd_check_float( const char* _str , bx::simd256_t _a @@ -201,7 +198,6 @@ void simd_check_float( CHECK(bx::fequal(c.f[6], _6, 0.0001f) ); CHECK(bx::fequal(c.f[7], _7, 0.0001f) ); } -#endif // 0 void simd_check_string(const char* _str, bx::simd128_t _a) { @@ -326,20 +322,20 @@ TEST_CASE("simd_load", "") , 0.0f, 1.0f, 2.0f, 3.0f ); -// simd_check_float("ld" -// , simd_ld(0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f) -// , 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f -// ); + simd_check_float("ld" + , simd_ld(0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f) + , 0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f + ); simd_check_int32("ild" , simd_ild(uint32_t(-1), 0, 1, 2) , uint32_t(-1), 0, 1, 2 ); -// simd_check_int32("ild" -// , simd_ild(uint32_t(-1), 0, 1, 2, 3, 4, 5, 6) -// , uint32_t(-1), 0, 1, 2, 3, 4, 5, 6 -// ); + simd_check_int32("ild" + , simd_ild(uint32_t(-1), 0, 1, 2, 3, 4, 5, 6) + , uint32_t(-1), 0, 1, 2, 3, 4, 5, 6 + ); simd_check_int32("ild" , simd_ild(uint32_t(-1), uint32_t(-2), uint32_t(-3), uint32_t(-4) ) @@ -350,13 +346,21 @@ TEST_CASE("simd_load", "") , 0, 0, 0, 0 ); - simd_check_uint32("isplat", simd_isplat(0x80000001) + simd_check_uint32("isplat", simd_isplat(0x80000001) , 0x80000001, 0x80000001, 0x80000001, 0x80000001 ); - simd_check_float("isplat", simd_splat(1.0f) + simd_check_float("splat", simd_splat(1.0f) , 1.0f, 1.0f, 1.0f, 1.0f ); + + simd_check_uint32("isplat", simd_isplat(0x80000001) + , 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001, 0x80000001 + ); + + simd_check_float("splat", simd_splat(1.0f) + , 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f + ); } TEST_CASE("simd_arithmetic", "") @@ -390,7 +394,7 @@ TEST_CASE("simd_sqrt", "") ); } -TEST_CASE("float4", "") +TEST_CASE("simd", "") { const simd128_t isplat = simd_isplat(0x80000001); simd_check_uint32("sll" diff --git a/3rdparty/bx/tests/string_test.cpp b/3rdparty/bx/tests/string_test.cpp index 3d98e38b2e8..ed83e86cc4d 100644 --- a/3rdparty/bx/tests/string_test.cpp +++ b/3rdparty/bx/tests/string_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -19,6 +19,27 @@ TEST_CASE("strnlen", "") REQUIRE(4 == bx::strnlen(test, UINT32_MAX) ); } +TEST_CASE("strlncpy", "") +{ + char dst[128]; + size_t num; + + num = bx::strlncpy(dst, 1, "blah"); + REQUIRE(num == 0); + + num = bx::strlncpy(dst, 3, "blah", 3); + REQUIRE(0 == strcmp(dst, "bl") ); + REQUIRE(num == 2); + + num = bx::strlncpy(dst, sizeof(dst), "blah", 3); + REQUIRE(0 == strcmp(dst, "bla") ); + REQUIRE(num == 3); + + num = bx::strlncpy(dst, sizeof(dst), "blah"); + REQUIRE(0 == strcmp(dst, "blah") ); + REQUIRE(num == 4); +} + TEST_CASE("StringView", "") { bx::StringView sv("test"); @@ -32,10 +53,21 @@ TEST_CASE("StringView", "") String st(sv); REQUIRE(4 == st.getLength() ); + st.append("test"); + REQUIRE(8 == st.getLength() ); + + st.append("test", 2); + REQUIRE(10 == st.getLength() ); + + REQUIRE(0 == strcmp(st.getPtr(), "testtestte") ); + st.clear(); REQUIRE(0 == st.getLength() ); REQUIRE(4 == sv.getLength() ); + st.append("test"); + REQUIRE(4 == st.getLength() ); + sv.clear(); REQUIRE(0 == sv.getLength() ); } diff --git a/3rdparty/bx/tests/test.h b/3rdparty/bx/tests/test.h index 8fb79c2c78b..33c3cf7cbc0 100644 --- a/3rdparty/bx/tests/test.h +++ b/3rdparty/bx/tests/test.h @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/thread_test.cpp b/3rdparty/bx/tests/thread_test.cpp index f0ee772aeba..54f24f37f20 100644 --- a/3rdparty/bx/tests/thread_test.cpp +++ b/3rdparty/bx/tests/thread_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/tokenizecmd_test.cpp b/3rdparty/bx/tests/tokenizecmd_test.cpp index 32e927bec1f..12502502a1a 100644 --- a/3rdparty/bx/tests/tokenizecmd_test.cpp +++ b/3rdparty/bx/tests/tokenizecmd_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 Branimir Karadzic. All rights reserved. + * Copyright 2012-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tests/uint32_test.cpp b/3rdparty/bx/tests/uint32_test.cpp index 3fe0044d67c..0c2be1e9cb7 100644 --- a/3rdparty/bx/tests/uint32_test.cpp +++ b/3rdparty/bx/tests/uint32_test.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2016 Branimir Karadzic. All rights reserved. + * Copyright 2010-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ diff --git a/3rdparty/bx/tools/bin/darwin/genie b/3rdparty/bx/tools/bin/darwin/genie index 6b8fe9f8c00aeb7726f793503d99ac3bd3133397..842ca082bdfc2697d5cee048036518f9b2d4efc0 100755 GIT binary patch delta 34243 zcma*Q2V7J~+y1|MwgG|_6j5YB5l}?Iu2@h}QS4nYNEH+T0ee|{@2ie2i5gpsNhBE8 z9!*TwBqo{|qlp^3CQ)O9sQm7k`#L7(&HMiUexB#de6RbSa;BX*v&&}MhxTbR?91j? zm}WD)^l#eobxkTvt7I@3N&fR!c{LcOEx**JLcwFB5_2`B848?{#x@nN6tjBK%<7e5 z=L}=(ipQU`T=y~S$DcdDHMa47XjNHkg!5fuvopzB&DmB9^e$oJn#!EhGGa{`myxl8 zO{F}W&Bjn-lQLe^s>+*C6}7X`FwN;OGjdt@d<2+rdRrvs_Wc>VKy9ycy&U6NPHwyW4 zh7|woJhP>t^Wq_HV;*&0XsMrNGjv{P=sf#qfmZqr3Dzvri_bLXG`DneiMe<3W(2mK*v}zs~coc24=E^J1@4H7t5Fexgx3+_)&X`#7V|>Bct05!u@}?%yaa?YxGv zj@<4n?9pBOaa)nG=WAx|$GXlK3)^x8I~?g*YD#bZED07mXW~T0uLrr0Bwk zcigq$*+q*Bju^GHna*xwpJ)pm&Q9ZMXhX^t4IlTpDSYE3tKrBzSxWH9($dIB2V?_x zp8v~@54TgHiyPnduo)u1mBRXy&e7v4IddlYXjjb6Ig@H@$IZ@nCjF#cH#rwhKB?`R zSTuOb1e+F_?>sXrN_&=9sRZqRwL&!uQ14FRt!6iE9Nd3OsfV_(=$vHc9}L)qT3 zsHoP-a~@jqj`z;~VbVr#DZ2Mlil#-s z^iAi^iy7LH9Yx-kg3a2e6^dG3_0qI`<%+soA8OPFl`VSnMt7s;?p0KLGs~#0FXJ43 zd#YBgOwsk*PMbEzR5ba|dYU%C=zQzp3e9P7ws};;`;C=+myd5O>0MfSzg&4sq0u?| zQINLE=v?(^zZPV4_I$iR>u+$Le|*q=Q>jIDT}S8WCpC(WJb7v~&3R^d<8X;)TKJd6 zdGu*x(+~=uJUw8VT4E`B|Je|uSLb4jA+IXs?A5W@QsiHnYV<9AY%v@;yZ(b&Os?pKQlt7MEYz4@!fHMo-TtXcc& zXICR%BaP%=&xt>(Q7JX^MY-z6`ZeCWU@@eZORyYJ;pC(D%e`V*LUB1P7gB?atK`b5 zZj3N$ee%TX{zgBoX`bt#zwvjI@3?FlO>)JOu9qug9`!owIu>YLV$v?1cJ&H2epp$n zcf{orZERxJuI_hrYiqpjttHfTHR)#zwrQ~&#Lxs|sMd9zn43VAI@r*)J;8Xurj=H6 zrKB1^@i#SnZV}-#i~%Meigcer_jKi%ML4ALAw@P(BzWU9i(#L^ZZOpBups*8w^XB; znWc_$bKj;|T*}v-7y3*k*Q?|jlb~Fu!F35-$4z3l*2-#O>+Sr=pJJw$mXgo7+_;oa zJ1_LALD|I4H0GOjJhiwE&NMbIqs<#B?k_REtNk!Sys^|c+%)H|MR+YU4zkv{YcUj* z5gU&fy~VU;Mqlk>rdYSk*h5>IDQ+(_hG^-T!h5-KkLR*<8YOk*_*;@LPA@k$(XumK zo-2&eCM`70)n%12$fz|+7TK$f-L$Jo;_zx?ye5)F8DVVf>6=7po65A6lSI5Q9?`Os zU7l-Uu+6Z>j4Yb^Tpk z@2cy4b$y_&kJR;vx|XQxQ+0i=t_H_^S-hsMW_7iytDCxdsH>;CmQ~mC>RM4&$n^;=>h0sA~gtjZ)V}>e@tIo2hFHb&Xcn z*6P|;UE8T^2X*bJuASAji@L_EYj<_+sjj`%weNh3gNpC3V4%7VR@Ve|eMMb|scW*j zrmAbYx@M^B2zAX;*KBpoRo6UqEl}67>N;LsC#vgYb)8CAM``dh1vAujmb%VS*Lmu? zKwTH9>k@Tcrmid0b)~wlR@XJ^x=vj;sOxL$x=~#>tLqlJ#xM3yn`1HD-01hbG~Th; zKS{z$35)%Q%J@8v50df89PcONxg75$I{t~l;?P)jGH-LPsX2ARh0{q@jDz3mhp=m50vrK9QT*;&p2LH#t(7aN5*$^ zyn>8x;kd&~!Wss58DGS4i;Pd>xKYLnIR0!l#WOfwEaM3re<&2>#`kdiu#E5E`2N{6|88zzcwZWpalBB*XL0;(86VH_H)TAF<6C8X7{@oscwdgc zD&w6wzE;MgIlfB98*qHNjMt*Lg9hDV3BGKYFXNsZpDp7Cj!&2I2US!{Op);$9G@WL z=Q%z`#=qhCXc<4w@li6qkK>s#zKi2&6nEU*$dDurD>*(?#^-T-kc>~}ct07><#;a{ zPvv+w86U{;I2n)Uc&v=K<#>#YH{y6J84p!)hktVk)!EQk#>;a&QpU|3uP5VAD)TIm z@jDz3mhp=m50vrK9QT*;&p2LH#t(7aN5*$^yn>8xaWHsESi^C58DGS4i;Pd>xKYLn zIR0!F#WOfwEaM3re<l9RGZlt3s*q>%c}$8#c9vrsRwom04hK*tlVX$kgV^k?F|| znl(vFPHNCNrCEC8^pxh!Q&Jj7HEA4`)F3^nSwok1p!QWrcvenIQkK0SEpL>)l|4H% z%Ofu>H!Z2agZ1pR@de>_d6gdG&(2zuzemcLygcbls)wEs9v&hpPHSilR~fp};yT*&Ph!Rm6vdPYFchVMws|5 zN6Quoxmr~*HdiZvTUJ_9`b%yu(`fD7@Vf2BWT$4O1=*9bQ|;L~1@^?4_I=}ebZ;># zsURgIG-!MZ6H5=8a;j$LMC6Pq$Q@G}t?Is2+HkTLodYJ9y?f?2G+Kw>Stotv~o|qdNl19lx!aV+M64M8pL&YnD z%x>Z}N?P^bc9k?cH8WkDnrf~j+W470T;qJro6FXvQ9(UfVE@1B&8_Dl>V%k^m}ORC zSd_(2ta)O6$JHRz+H{Z#Omb+$Fg0qah{i$ooILxBQT4L1X%MO@D_GOs zKQn&}O{hKvV^TA7?7{gW>AAT^xfU`_WO!6qn1^ghapi_NLOiZ-_7d5@najEA+%#Y7 zEux|=EyS63i5=0FnS;dEPP9&9d}=+$7ykw$au0T}waB z<+tlU9H}$Mc`(Oud%5px7`v;LE%A5W%0{ub9s$S z_g0&m%dqWw^SFOk?nU0MHP^Pimid}kEXbUW^~F7iCl7|Re>DkP{@Xnc?MG4YAGTN}lr38wNbSPN21g$IqIM&b65p1pf?=-0k)V!M9bJH*E(#&wA8-Z!pe zTx@T7zqAl#rbPtj2d%1L^%l!Yt!{N%43{G;C^)}v5T%X?2@A8=t4B+DR#HluJwKPO z`Sx*{1sV1TvE5{iZcWoKC4G3r$V^%><=XsTbr{e)rf1LC-ifgT`^I+fL+dG(ovgY+ zT&-knE2^2TJ-pM#r(}&uO-sy8l8=b&P`T`gn0A_vL&h*Qc)_^567%KzIg-g#oJDosAFJ{Ie|mSXK4t@2Axse5g$Z?^u|%yGTzu!>r~DP!^r zaz-VO$;?VENXj2c&!-XLvdcx!8s@4Nj<(%mEphyBj$!Dflu@aP)GKM@srMuGo=Z#1 zPL%r%df?`h{$k~TmY6&tF*|9LeDM4alk6;{NvBm+Y<xHZubw?W zBPXwbp4+K*RLw3ea!}>}^B#s!nxS$K&<==)0cVvMZm0j@R`Lt-GP8$A$T1q4GRl!k z)d?LE5j<{a-LT+%DjjYilvjv7BEl}~!7WD+lBhJ~p=PV}r#yzdLRrXrOQbyht5)_& zde$n12j}T%^>+c`9#cI2F6|!%J52^iz#uPe;CLvfj+tez{5i+d+UIV+8d%uma66i_E9=WuGE7Xy7r z~--2pqs?-a!8r_ajX|e&-NTd6dPU=47y~zL5 zLLOAp&a;b_O`3=HyfHNNX-Sjg9!1IhZb4FJR=zzmo0hfAy!_CYDi~%@%~4s&wDur5 ztdPK=Iw?#VBWat6{HP+z2}tW8RYjGj4@R2$qf+T^REe2fP6sx z6g;HiP*puRQ?NRfwk5LEbb>J1J|Xsy7ahRuu3AK|gK}v>UOYpoC5AK_igYr-?XWVL z{bX^frGtXR^t|;T59;o*BaR% zx;r8DOj>rzgumM)R{F>Wp~>`jc0=gBK-NhP(wFDcfBT4y7E_hD(Em0LRn3Z$d2q-9 zBDVs6C!k*V8${?<>-Uv;Fn5fLk8Q!@OV%h%^z3i(5xMDBi@00CY?HU!DCO^@luyln zh|Ywx$#=Ivc~eQc}Dn%i74*UuJHReq$N zK%Ym*|KD3`H01hlyufwI&o;cW`(Uk@KC3G&{Y@0Nv;~OVNSocgx{0*~VtFH5HLnho zbSflIQ6Y+?ERvETbrQ>0*aA$`O~s;2lr7kOH1q&=y+W=Tkm|7HNgtz*fK**v>ShZt zz9N=)wE2pv-EHOE--5|k-0N?vBJM`n+}zijxk{5bhh3Dz?~ul-TG~#N6m2OMT^mvz z+E~~z1lM6t z=j#kGo4$OK4XH7AOEgK7AkmqL>=ychf?+qLSgt62$-;0FQY(=(iu!<* z%TRi7)vu7`?p`d0G^fh6bmw}G=BhVxqvnM)oclF_q>ms)b7f|c^aG@PuFM{i{5&|X zNO3BGN+zWylynie##YPI-C!65B}P@))`+A$4;m0Hs4hof8_9K$B*V80@18E3X`zc8#PfndBj9qQjY_&WLhEATvVtq>*eg0l-^HIHEn@lzj zuVV41v@L-xLJct6X|k;(Ti0l+>lAMr| zMa(#A9a2t02@|6;SosQyKj-v-oIZk7fu-u62E#5$okZkl8e61%S+-alY(=$u4$~Gj z>^#Xdu^dT05;Zt+hL#{UUlzA#L|ao7pR# zR*wOdIC-%soJYwENDB34>7ZEKl%x$L9fWj?N8WLgrua}pwxOziqblC8RhlpB@Bx~aC>?ss4rCt_yN*dj~ADxAEf%F*_Kq}El6#iX`W z+78&>;Cst;(4t+R<8`6=F zT}ZX%1Gu_WeuskkC6II#QhRRWStJ>1aDkIJ_gy6Qft12kK26e+8nph!Qk4(G)==b;KNxBE=50+Fg?q_Z7=WlGg^3PS;|ov06;5$4RP?H@gIZ!;CtFAN?}9niM{<=2(6Va_kIs~0dTo}c@yfK4TI@$idqm+7YHCu_Lf9#b z`{N2pZ$iQoR?fG3kh*hLjYz5z$_Yov`c#)rgP`Q9TeL1BX>F+J9Y?J>AdH>+s8Xy~ z$TTBN?2MyYUVte>J#egzXo~sQ5hXH}wJxXX%%v_OQ*B6nSlUBUFGyWkI!{soq=Ebp zGt-3H0%^1APirHRDu;`bE>weA;ap6l7@aG}GMQ#autbjqxd+-q(n3gcxS`IIbQ6*n zFW6?9MqfeV2e4N-Ne>~V@i6U6QdE7;ek|uTnWSluj;d#dg%sZgVnn>HwYzTvcCI8Y zCEJ>6cj}8<@l@*tkg@g4qK=yiDTe2W>~I0eTUIf^eI}6FO76O@kjFMi)s$qF9l5rF zIM&qUJjza3od7dZfP6M&CJLTyW$#?TLw?;Vi z)*eX1lw|Eo(w#^V)PuYqz*K{uq-41TB~(?wD%a>+kz!pBTZ9(SP<$a1g*N0O7IWvt zQ%^01M8ihjcL7QJAng&Ob7=gMGOQ7&>!)Uz*KwH+(m1iHCEeQtl1?{fufE)O)v2cp zO<1yvd%Y+tQl7wx7cgrUNq;mJEqcjYg7XjjFeA(Qrkwl$H{b)3f}624iRVjoS~$ly z6SrjgtuUEH;Uc<~EHX`N&fb`?D@pnc61^+X0Jh4-_`Bv}L2t_7d<*uT&BNWB*2u_K zETwRxMw4{3mGJ08bFe`hHvP_(+d!t@A>jq)I7vT2+Rj~ghor%6#eqIl+~gFy8T zwYo1ojnBvE#i`y%rG>OgJC=B}=(UKX29OeDo>fHd2HK;9(5I4m1}(ix(>f(y*D^jZOV|c9G?M zC^h-^<=g9SNGmY#NvhbL)3wL!q6t?I(oD4nmJ@XzlrB6`vq;(rX&OI!Hjq@(UECT( zPe<<_oMjK5oz!A2pEkJe15a50jxwqt&k|XCSqzQaGa@p*LL^t?$ zqDiv!^1q`GlV8cDKy?pd&zC*vHt94 zS8vx+*$<_QJTIx~l}gfgkot4?Eh5P{fYZ^8p_R`nADH$5;)?_-ISr;baVeHEkS#lP zAbY>XYeO_i4Ti8ZR1O@PhC^u@c7yhY+Hkmk1{}^?6WN}&1aWyN-DUp-QSlWT4}n8D zmr3GM0Zkb4D1fp>?xxgs|L#z+f_$|luZRz2n%ha7=54;4E!23q$t=CfJ%56vtB{g} zu?yYBQ<5sDve#WT)~&VZo_|gi>k{dn%cikOJrC(YK&BFS&)~&Rp0xB$6BUP14L*bS zU4EcGAk(sR&R_>uN^bwl4`-=~8lZBsQ9~@xq`Js~ITXf$(!a{;Bx=1ekjjZ;g1q9X zG5Th57PPe-LegZC4vb>yBeCgKTYa%Hp2kJ1Y}P{f#^e$boh@!9(T!!mG*rG`1h~Hn zq*pF%^qxY=;F%@IaC8o5H=c*J9K(wsZQ%!xT>jj0#kpkKhq&dkcle8WhgXd`BkxI8@MP48CmRU}o^^o?nw34J+ zd0gUVeniV9>wG>-4S8FChotNI;#Mk+t%C8wFO7P3)C6`(=Iy@}G4K26fBNi0>Cqoulql)OozL}nR2U3ZpeHr52{{QlF$;B>l^WSAQA1ldKVQPaiF zbV~L43{Dlz>$2QKUVxOYDpFSNA*;<~uPX*IVxTR^D}l7Hp)C^k2HD!USDM8xo#fM| zzGxds|Gz zI<;-1Ih?1FU##Luvdm?vhMH4e@@exIytZ=5YBs~GE}x2!Q$Cd8JQ^O5^xj-?Ad~9y z@P)J5l6Rn%e*&qsIx&!IV%d3I?qKzjEtR%Vri;LKwD6F!7Rqw2$Q_bOAT{B+;Z6PH zHlK59Ap$2;I#T?gB=M+9C8^JRQD-ELs(A~UAmA{NMS$5L@%B-MG#QoTCr7%!fB z?JG!XIi&@NB-1kXisDDf29mrWJ?BTs36g$-6u~PfDVLzs62~&BinLd_@Iv7>BI!p+ z0&|q4&da&Hv8s_Qq^w>p29KipZh{4slke-_LmI$4B-+?nR&erea=g$3YZNVM-q1#i z!u7Tg_kO^BJZ|K^W(FirtgNc2>Y2KgGf=hw_jN!z z@|N$JE2&jpds&hj*Ugah<9Cuiht%oC#`VU_>Ez0N2U2~W*$E{5xmAqFqk24s2`|mN z$mF+;tA@SxX_A^l`j(%6^4a<;B&^r+*;>3!MCDVSqqcJf*n`P6_3(DFAfMXJYX_Sa zi<^__KIKB12dO@H>Qj;?><}IWdk6CH=}R+hBqTJ{WRh|q)#bL^LXw^^TrDUT zQpUb1&J|GI_Q1KGdWm-51We?y(Scg@EF`?f$}tG@TnkuBL(Sh;w6UWcPkoc#NZP(QeUV z9F_XfZchCQh90>VLmJIbEV){?D`c;4c!bODxeRF(uXlY(3V4sb3OJ$csgaQOs)W{E zB;9*Yj2KTfSh`278&4a6$$L3f)Qb(k94LGSVU-(ziF-wz2~^$rFb%?EnN07wI6a+5 z$*t%ek~-`YJEixNeQc`9t3x#1$)Ec~$pjhLQS#oGdBGthgN{tIK}3s_5WP#B%3zo3vo_{d%qAK zQ*99*YfiK8LW8K2M0*L<*w7qmXj-$V^mb?X@V(<1cF%fo_&x*57S**@+3t_N7eNlH z>ZR{R7YCK~_E|AehJ7!HoieQZi#R94uP+IYX;j~5mpRj>ydi2tGu87~kt|Kee`QlN z+J;PLAGiJyaB za!?$GbXpWTXpg&rq@;VI-E7LT?tRX3Cij~h6>}i@@cKFAzBo6VS|9~7?Y5{p)v7W2 zzNj;Y>KFH?7(9nu`v1w9o#7UFK)3MM1C~NKf4NkaK{MPg zwN1X0H1H}BL&#=&RIWrUluiS^*(skFkBbXzZl?9#CE~U;UV>4*rqgFzG$V%ku)q3% zt)|+-egmnOTH0-L3tQ|{BGxaYTW{;j?mPHlbBAn4A@$=D%P*o5ulkmVYKv_3JnmFw z|8xAVW1CFfvD&XhOd_MHQZ;IZMU?9>fA&(#gxdTTKxxCPgq%eSAyp95XWHn?*Yr+g z>RY2kj9hH1r|k_8>lRZFR}AEwinua&7t@Q=Drl+dY{hz>+WhlCQD+Ga&D$^q^X4R+ zy7C63F4(V-%CYqYeSjy;)KTC4N}hEt4|T6B_dLO$|qN!3avRSdY_T!rdvp=+eWloMTO65 z!=?~E%`($%Olr$g9Pe}GfZG6R``-huS`2&jQq5_V1Fl1i@LNs$wr^mX@{jKY$bk{u zj+5{!Sy{RNafkGkLHNzK)sze2_IBdjY8oFi+6xasH9XRRQ{CX{T#E{t8p{%$M95Eo zM;#~qEc9vrm_EMQoMGPIweA9`pSU!U4ul5e z{PVulq|;{Qh{3N?mAmDNbuvt%v%OcT6-!66?=b$TA|Q|PcQuUFDsnYXEO?E2>x%+$ z;5F(kud(9tYm{=?Sa!{oO~p&B`#xxE)rz`$5*-k@k7Kt2zJEFV`az-(7NY26bfYb% z!xR4f8#1bY`Y-F;#V_nUMd((-Kds}9(2g)%hOTZKZDmZ3hMJ~+5vQ;_|Bz1$aAXhW zIPg_)PjIiEZ0`>~2BshRQ2CYX#r6^43E+J2O=gE-JcJ*5bAl=0I(?XDg5L(u2mAD8 z`%-X3Kjt;yvEbLipM$r7z57dl2hBGKSxTUfS;1uoaE8agTfkp{&kSPwcVN?C<_NIf zJAVJ-;D564+G?xR>JFrP2#XOKP289^gq{d}5ZYx(zyCApQ!_i(9mjR}3Op8k2K*QJ z0ytni`(FVc1>Xe!4*mmNeggSZfsV0sqDyO)q4FfoU@|y;GV^@!Ch&6b5&HcYnQkpu zo6fu$Y@NZZ536e6cVO?s>@e(ykPL^9!Iqhv!PnsS;Pc=m;49#Pv)Nzo^-gn`e}ny1 z@DuP+#mjqFbTqVb6Es8E2BF?*9l-w{2SweugzoN~{yX~d5!odD!B@sI4+DR+hG%g) zxa3P^?{3J1u&5e4WPxkZUPNY?5B}*PXE=cjU3Tg=J;RfnU>EoS_&spg zS8U%0?gVaS;5+jEn(aqm_xXnTV{k)oJp9ixM;N|@gXt6}(5KP}@OQAEk^Fzvc;p4n zK(FCiuwLR}@LL{S<4fS(;PF3mdcDBk!TVqj{6*Qz8b;$5rbcXKB!sZC05o&H+z+xn91HC=MjtKQ( z-3>eg{=LBi5x#;jNrkkYrb5U-I1*tt!qEr|5ROAQ5#bbsGZ8LAxEkTB2=x~GlRm7F z!+p;q>H;d?@EAhH$J~ie!L7kYFHSH5Yz6NJmjN4|aQbrKaBwB?5O5XnTw;f;Ng#x8 z;Sd6@TFe=SgKvWyfWu1I-U$3LxEVP1FSbYPc5n>1_fvYF$qK|mnEsR##DjM}V;%th z5nRdDx2=3C&Q;CtYsX>5N2u9nXH z47_24Vp@DEa|OO+!C(V-9mxs2zyrV)z#FsJUKQ*&irF805nK~IESv42;Dmh1<>(uF z5TXi5pe7l$#gA*`v6fT31+K7;S%nm~kgu!qK2Z!F` z1WmwUH<)9-(w4Kyo+*bMsfD7I&pX>j>9W`IJ`WN zL*HQ>u1w>w!Uzug<#AYU9EaLQ4yU}qVf&vs+#6t`JEo(W+A4GyUW;L&D}4z}8f>FE z{CpONbC+;<2;sn$%wKQdu*Fsms}yor(Zyl40~`h%1fde=kHJZa83puR1m%}oja#;Q%hbJy^Sb2m+ zLirp^oWR1bQ#o8bi^Jv%ILuqYVGjM)q->!Z^!t@EoTu?AP*WccD^=$3lrM*0x8=~Q zABPJDa@abR!+<=ip}EW`VlfNR>p0w2$l9JYR+!@RQ`&bv(^{eEy=cjGjd@u=-} zlVdY}2AcjX%us{!T;|Oi$C}_R;3mXn$=<|=?J;0y6=r%hR`#o*%yed>_-FbwM^-f% z{8K|_dR3NohhcA17N*0&hjNw)7Jz4i1-N!Qw!aGA27UwFvm@J!z+v&shrn^*j}%ik zE`mU>!m7q&ah~=gSU+F82G-BlXbaDG+=C0C4W?rKe9arIpRa|0_4Bnxk{xu>57^qn z0S9b`?qL0VZ4g*LU!zC6Do{UP8x7Xa*QS8=^R-1_{d|p{s|JVc(-#M9aNq+r+9-nc z^R=U3{e0~^uztRF8LXeL-2?0AYtO;+ao$ER(hhY8t0B;)gqsvx3*2Q0H*o~`D7ZCv zS_0dyB>b8qnbN0`&VB_A-4 z1ou70JQh3xOuyc!D%kf^wl4#}^C`7IRot)!!euyY1N(f&_Wj^ZpEDl^UjUy4xBr6e zSHU5C;%lG{fT}tKbWV2J?}ElBUaD8J{WmUDm#Xt!x}jgd`tj~98=n9A`R+qF=;ylzH_qV2`7T&L-}M3O=eq%5{d_kJ zEYEl4pluA+k9T9-sQ=}l)6aL~;h>-I_6O_dyTicx`R)j?e!g3v+yCMM9bh`&RTY>I z){l2r>kj()?shon=evbq{e1TjSU=zW1gxL$o&xW|dG7`A9V5RyUIU-jm>qW@=%>0* z!1}4Kjs6N-wvc|RTM=B0Q{DjZU@K=>7p$MdwgT(tv0cG9mvtBhKu`y?)JMa?AG&jf zqrvq(m?wkZ0M7yIC&J6Y>O`3Gdlej2fzxjX-%(8cUkE`zjXVg}Pa}_m_0z~xVEr`m z0$4wdyav`!BkzIr(@6Pa9C3?H>=5a)Cg>< z&D<9J92^hs7RvU4;3LFx{V}9K_$G=SMu3MjWF7}T2c84A(kqNizYLrQ-UP1PgzdY) zVc>n>;AV9HGJ|6fob^49(Wfxt~>i51fKe+R!hjWaNMvAykd=Ca`B;A&vQEVhS(cYvD` ztLOhS2<_p}Xbvan0WLe2c_8>8I0f8b0o!xIS>W;Dx4<*O=a#Vl3NJkW3sKLiA+Y`tz=vS{BY-c!`bPlYf%T67&UxYauRa5yKD-ErnXhw&Zh;dw zGCu%+2Yv>wzLo86Ww}eLy~SJ^yy#u#THrsxbsZ4=ce6uN@Mv&5@N3}iVEr(8FjzlK zP6O+Q$=P82FnKIkKTLMafRKvQ<)z>-(BW=)Sfq#J8&Sy53=L!u2R|Zc5*97lg!2aRjT>8xknO_sIVKME$rO*~a0}><; z17BRioB`grlz9sH8}LeS`DJY10B*3HdAn|3!F)_lzrx1P|5Fg|!r>P^0sRJ?tk6Bl zwED^a@Sfx+l4&3r1hch*!BEbtyy4<%=Ca@$;L6}9;2>g?Y(`ptxJje~6|fNnbdpRZ zHGa&axF`6@b><+C z!QaFGG^WD6!;JD&*1jh z!2AK;0sAv>L@!S7SxL4C^?yPkSHM>Z2E&=%%%R}u_n4c3FM_**$HPAX{On!!&j#0m zUH&?#98ch- zU(CWJIJ86ti^1~8RLRXCz>C51!zr2GGl}o;eek-W%pZXtgHM5X4P*NSZ|Z-UK^c5t za0?DkQrO`+IAl0;86Wmvna*4td;?q`{8=j7W58}m-vit~pY1~(5JsZ{S>Sym*ljC@ zfCorBm2ZfK(772qbO$d$f<*8+a1MA?!b{!hWv+OfT?FSkHs8|E6|k72J59?*o^pIXY$4#I=3oS+xD zpc8W{3DG_dBa=4j?EB?AoTKMhhyM5uzv;qtRmZg2KR;iwq)AI_rx~*DeNb! zvVU1WZlUEq%z?}f!);_(9}W+_*`YOfAvj(#6)+6@_`#BCTRse%)(rSJ9LVX%fm6UU zz;6v<`y$2E|KHQ+>at1J!Qoptyb0a}`(E%`WcU%da2u!p2E2Sb^F{En9nAN^cKAP+ zEazW82<57A6Mcf0Nk6a|8H7ouJKl|Lbqm;6?chF-1$(~91@;D?Kgyg4{{187Ok(x? zPdmcGcsT6&gn175{o~B5z>fXQTfid@Gw%UEI>`JHI0orYg2PdPbJg(tUvPjE+=Rni zBzOegikD4Wb#9?ha20T^i`)W1;ETUAM}c==Vr~b151*KHt4{q-1K7|6LINCaA;WC& zD)3Z2!jpB91v~7D9fsKuob%aX1^8|77Vt*!``~5B@B{Grg`EBb_yPRSfx~OE z{SJ7)vQz(;KzPJ8GPu>?CcA|u_Xf|z9n}Imkzo_bv@ps4(7kNI7}&3&MSFuS=+Y#x zpJXcEkOQF`9HxLX!HdCPZQ(n34SW?{upL|y%JxF=NxTVt0G^9CpRd5tbVKU-{|kgz zWOx(&3kKOka8r^k z_)iD-!>m{eo?4sp+XQyBLxOi9SW%&a;2HHe!IxlPjEM{2^I>ei3H}rd%`@;~TEgWG zdIoZf$OTWbKeNNo1`hS$Py~(!-$jO9!E(hjQU-&;r@Y)!LI++;2+?l30&TD$#VYbe>PZw z2Ado->aY6f4((w4*`OgDtp8PD3$XrIgdM^9pCt|e>wi@^9IXFY;#gw!{I6BWPp?^U z*!Pfm0a*Wb_e!w-?e0xr{oC8S!1}kn_ks0qdw&SlzukQ@2+x20>)k)W0blPn+y?94 z?k)!F-|n{2Y>+Lcf4jRfSpRmn9jt%5yFOU|c6ald4$eUTdUrcG@YlQPmjl7-+uhV9 y{lMxA@WkohQTMpT#(^DonP-D%{K>outiBvh>9_epIQEDgionxcmwvYeMEyTuLy5Nl delta 38872 zcmbuI33!ZG`~PR2*^&^l3K24iB|;>UCiZ<_V&AtC$%I5US?oHfeW?(2RJEl=6>Vwg zlxoqUs;ae>T0^x(X=zbW%l|&-{ys@~`+KkVy8gYcKIeSC_u2R7%uGz5X`lXuJ%7IU z8k^yn|JE#B)zJH-ufbp>`LCbk(_lEc^l~fjLw_5Un58MraHt^K*vhBzLspB-tTujF zFw@x5r}9&lf2d?pdgZ4D$BnK0{B0_UH3)p0*j$icty<7p3-JqN5Z#x@{&?*gx*?8M%F4%1j(!5*+XU#pd2Cjm-mQLP#QPeDC zytiPcCCvRxo1rG<*|@miBTFmuJ)7ao(%!xWZq_t$)c_N(&mab+QyYDnC{!c>z}u6hWPol9w{g8@!JL8`o@NR zr|7TFFE=xEUOdz-?|$cnmU9bjhRzEOooDaO)t-J&!bb}W>iBigauyb3`qlRJ{q5<~ zHhrJgDo4R81{p27(a*ztK&WQ&*FZP_avfx7HW96F8A+x=6GfVWGf}K^?mV0G3aRcJnvkM)8 zU2188BMY~-x@6N{J6gE3(-&qfy>DUv_{l~srGMeE?h}mu)BD>DpUdvP_UE;yPdl%q zq%RyS7~ZpoHv3@V`#s+@YqPr*bnmxP`>ku?ul;tKw91_d-X7%CM90D!gOj|q86OnR zPyN7MJGQQ{N$%%H&HJ5#;=BhDjoz{vKA$I(^*Z+SY4rVFa$$FKW?ZUEx8M9)v_m&mzm~~szTuTbxof}~~Rozzj!`xGD+WYpx_w%hL)B0+* z!jB8~YTB}yg%ekFj?*fiEBNA@u3Avnf(l2fYs1bJL>_5tKXcAXrHP;a^jg@|r%ykB z^7QFb2~)aISr=NGo+!wtu%RakwvzMb@xt$qob}Ku94g#$`VW&s3!pONuJI z|I2WrW{E89f31g6+YwQ?{(72G>r}76_qUg{uj&>S{8nJoVrmrD`K!LBnL-K%-dm=% zvKRbzuex8)?Of=;uf5Xe>C-7stvlqVro{Q%p7MJ1Gw}Q=_WZg0x3*CL6iy9_=#K4YU>}JRWNFyj$67 z$gV<3d;VG3TKM&oBxB{x0o1W)cHX82`up0awK(Hn{H?EcFxs`k&99C&R@eG&*)iAH z$f(`e|=G!v>3a2n3}m+UEfzUeyW*Ka|m_`9icjaR75az&Bj?MfvK^T&U?(nE}|n6$-r zU5{%Tzo?}Bc)_)=nX#c+Tl%A`xRvo&Kh3S1>q2ZZOnnzo7Z`S16MK9~njegk}S5AvvDBgU<_@Val0?~7cakMGM%PMv*F%CBUP|+&<^Nms3 zqWPj@zOkp)Y`zfr#xTuizSx^@++M!<9E%~lo*YO`=ZNV`jSaQHd9F{E8k?K6le1j+ zmm5QkTG0#Egi(RNlb=hAtep234RL&~Stv7zJ zbsy(?e}nM@leRw7HGGrtr1gcrlk~K|U!l^r>fJF;r9D^E)9xsguwjfVX`6ALMThr1bN~pHIiL2p7<1nA7 zU-nrH(O+LXJwT;*pfZiB#r}7cD2LY`*0-`={Ds(e+Zd@e33uJOZ5(gZF7I=t{Ap}v zDi=#JI?vc|pkXPd3u7hMfqTZb#>#C%d0clbXiiSF7in>bXWe-&W6c>bXHZH>&3*_1xlA z&IjtbRXsma&+Y2@v3h=@p1ag@w|aiAo_p2v3-#Quo(I+Qka`|g&m-!2R6V~}&*SQO zQayjz=#;fTqu{K1o>$L{>RF_oSJd;Wdj6uG*VOZddfrse-_`TBdj6@Nch&R0dOlFk zhwAxAJ)fwj;XR9!ve({|g)pn9RXyF*(?dPWt7irE^ioeB_4HHEO6plzJph9t>RFeb&Zo5^6hx|L1NDqi&sg`+t^xXAr|>30~~KApK_c|0w+r zs;I)9lKz|QKPLS}?EhB!PqP1O=|9B&1Jb{n{rjYUEBil_{&nnk?v${SVTbfDV*fVj zpU(dGr9YSb?@9j{_OF-zVeDTk{k_=#hV-{*|7+6UnEkIxe+2uNO255|Q`Ky-1V1*+ zmwq?)&zAm2l~tG-(tn%%)1?0@`zJ~N8TRK%{}J|&lm5NzPnZ7f>`#&YjqG=(XCG`JL5%mJq~-%hK<~{tMD?X8(`U|DY1j0_nfW{$tW##Qtxk|0Mgrmi|NR zKOp_P*}qTvx3d2;>0jq$*ePKp`*%qHBKB{S{^{(0U;1;||DN=ZVgGvRAIAQ*(%*~y zZ%BW8_P-|mjoJUI^hdCNX@3cJhQ-qF$Nu@!@5cVw(*MYxXMyzJX8$zlzsmke(tn2i zdFx!CJu!Y465FtGV|$&%%=Gk>Tzhikgyh78Q4L;*iEG$6I;No`sd0m(CJC{ziHR|z z8pbwi5Stv65R*L0wb!m44fD=+WH}OYJ<>806VmJ%j)}QqS7$B8)1H`@oo#QS6uWTm zqP^g1+eKR$;wnznJ~7+v9@&oEyzC6Sha)4&BPH3MoDrFsk&&6?u;-3(WZ1>gOfA4@ z7e8le8CC5b$~r1LAtP~29T_OXp5(~N9TRRBX<1q>g)7RE!Cil6X=g`^{FSD1uEsxV zU-`N`ZfP;!iXR_p-eT-7(_q)nyG-$#tK8?N<2H9nXA~8CY>v2mz!X*n-&|;^RK6XV zn>KB$0<1_e2R|c-ZU;?6#D@n>oh=de(98*<_jpT->Ju`v$L3@uBsxMP>{;24^n|gF z$i&iIdVFPSUp+E$RMx+mr6F8=Kh|7X>=|gSAd0>+RViPqR%A({!dclGATBMnR2L1B z%$D+5*{PH_g`kL{O_I4%#S(=YhniK16-vakgh`osV&EZDwSbZ`m8M=NCoMxXd19$M z(w>u>kdc&-mYLyb5jx3{6KZeOGA!Iw)LX%x zo06MGY1GOIZ5b9}rwk%964D(a}1AHSqky zXd6R=np*BZ$Dl`YUIw*mW`@0VTt><&<;W)1n?5UX%os;Pk|SGAOm2H!30Kq8Lk}U^ zxHNx}A7HNFqq?Xhn5>YP7-Ww0MP>VE$fbolL0r0GuGBj@F?qD!DslnP(f(2khVimd zIX`ql&n#8;@hRE4c?oG9Gt;PyYJ90q5XNy9KQEb#iW$zWDtgbeRvw}!j`Ba79xZ%X zRI=;=36$EvECiV+CP^uz7)*v=W+sM>((c0XsS|@tNwX zD5D+Om=LivOK5q`%yo=lOG?IQdu~GZXh*Inx?-;Eq`8+dTFz{$I!_ET${7(B2F{sG zR6~x6lH#bjpOQ2&!am-fl3`EDN=V68Wh@P%76c@voXALfSdJstPSv3`h-kc>D&(|N z@-&JmF;xxw^HFNonAo6AvoMO5q|f{~suQwMmcC%;)PUo zuuM+%sceX-=Ubv>n6sqAqsq3N9LpYdM|O5*cAc=knc3Ns>@w+c1pr1S~u(yQq&}+NP1qhn$jpP?eWrK z;8QBfHCQe!V%(1=KT$r;TtPH@VyQz-_do4ESpA>hdpgqm9N@^#kt3L4|- zDH+n&uyj1jb+*jvi(yO4ikYlYb>Uh(h-{2LiS-kpr zQc9Ucr)2IrauVgl=1D_Auna#}no)8qA5peYl;hl7b8Tntq%0a$E$mb515+}RGAB5a z+GJ%BH;Aye%go5hOmi?tN7(!3(gvFtpE8QfF@$3hvK>i`FW9HaMXyW)$aJatNvg9V z>?)g~vY=F#q~RsgsowwAeQIYE+cuj5#P_*oTkmJ{O3bDsv7@~sS&qkN7Sb{W;y@*J zC^JsviD$(WlYeZ4tabFWE!Ym5m0Sz?v?BM9(iKbOTg-7Hzoof~_`+iLi77e7$Q7pS z8m?~_&-9#3ON7riH+DWBygqfu_=L2Sr1~`SOGo^F1WUGfh{;WyTWs>GMs2I-LgR_XO=k9_lGYOWQ?yDQ(EM~x;+?$A zMiHNqF_w3Ze`~EexpEa#C$~Ccshhc0L!9~a95b=w{hzJHB^L=tOul03LK+Vj-Z0xl z)T;lf;Nr6*CZE!1bw?%Ss8cHK+0T_DErnixp0Br;UT?jU!uXB3lDN>&YO9%@7+QMR zk;AT!BPTO2JJC_5jkwhRVlR~W=}s^$PN>8vlFO<>9mE=0X@4JN1@)z5x3EESK9TUT@{#DzkH|1CPF1dz9JXVnR+#+$NyQMQeDs2NalhVc@Y zrfL?kOlW>$$~UGZ{<3W-J2fl1C*)?QOq6q3Kgl!@MTboO;?bXGcd_?^)lF1PwN@Au z-gIoE+004UxM4~J7Q^js0N@U__k%r z1alLg=L5G46BQ4e!bLSo$IvOA$q`@W*%6PmMMhRH z^kVBKbGfnw^>daSU8JH=$Q(*~lkBS`ly(EE(0+g}tV^x@eYe z^^zy^Z{?`1Qdb@sOI|OZ8?yQ(3?D+o?~|-SqKuoC7v4Qrrx zX&}7uiiDTVzT)f-v!^d?SqXVL4p|U7 zd#ZO9K10if5$RNNFWGAHc)+VFsUPkz`#bG&m7vZonGd{x^^)1i(Ke87m1)E#_H$&@ z>mZ%Zb5sB|)v>g3D@542;>wlPP#&tZyyTeX9}OZtn`ElG;tjJ;{4;gtqwD`?jh{Vuhn1F)s)MECxw^}X zl#$Vs&+ucGEGnt$*(kr=28E7_;xQje2e-)mH@Yu^sF>mQtOD8L6%CQ z`Wmx0U3iDqZ!brEGx?zHj^`=AZpioFXZl#qHadC3%AH+y;5>h}|1Zr+{Z2#3ht`wi zlne)rZY0WMr(Bs4EHc-aYu3{b&uZgS?egCTQ$pFMdA?j~?~~V1Wdc1PrcBvsT__#< za=7xbgI*oNd}L90uhYb1dr=J>X<*3mtR~C$ns$~jE zcl8cEA9c5V-q#W+Ut22p>IKQn$<;%slBjo&xc_Xv|22F0N`gYuM+Ie4*I!9=W4pYZ z+{|>9cWIrd>11=2ra^7hF3pjUf$UpSZOh{GVcX_8>4mE_uu5LX=L7epg*VM17iv93 z^QiySo{!a?J|C0sNSz!R4nEVB#wMHd|1dtEOusQH*-5<;vU4Z(%gjuZn`_G+^w|}? zt^KFr`MA$-8q_K!k`q@A&o(19TWNDYXQJB`+}rlaqgTIYt+M@9%+jvZ(<)WUmam5# z-iV?PzLFTaP&NV`LH|n$#L_}@buSt-)HOHj>ii=?Q&!!rqErSJYuN* zLT)`}k3Y|ze)Q`o_2HRFIB%{LU-n>0apk9CGBJLAMpjY$$r|S+n@oSZm3FExt()rn zEV6PfmBsl3rmtP}g6UCFzGjAstmzi3>$g)T-*T=RmrYr2V$@Ajplj0&)7urid1BH> z&ALZSC^j{$pp#6W8X$U;=I8pR*z{<4`RF*Z(HV1mbZi6HiGk+1739Ip_{}o=x=a-BH!0>uBAU%ni)mH87kJrGnTnx?O98Z7#gd2idJ3C7IFNn zWqK*PMxV26YZg#iRFBf4hI)vt2The+y#lPuTK;vV|`Ifn`3o|+jFc=F>S6j&b4>0)m8W3(-f3uh|BenwMjeI zANQ;)%-ZzXV(vq0n=0~W6T|51obvw;`9?#QKl=~4Eg#M%N85@4(9*`A^vhg4o9_>h!F(#McGiKW@LVE0qN${b=hg*X5ySV^|4 zB<=p`ff(vztL6SVY(X46mcBgy5u`kphLQBNB+)w!Z2{u8kIl{fkE>j|DI9DI1#9~= zOXIn~CrQeOR8JfWrUE}AsQ^+a7pEqDX>{?=55()fRGi7M1&fddwxIH48VALnvsq2j zi;!MmX+KFRkWh`ABn>Y~N;Z|vkA4l&kFu#6U<>hVPB0tx-eO!svL})B0ol*_+3LId z{=yXr7u%{(sdtmj4^mH-u9DOYQV+4MI~A6GxRL;+wup|Tc(EjnfV5Ct_OsQnC6To2 z7s|$;YI_1UI;zRu+)lQWkRn(*PtqAkRai39uV%i6l*O$YK~jTXxyT6BkE9St)i~l* zk}5&scCyh|hYTLSsz#~h-VC;6PV_F>CP8Y+9U4SmNL~VIi)a%^Wo}QB?={Z)Z4Q-2 z(qc$8#)jOWe>1)>CL2{^;^h_hk ze4TUdAlk%GHl&0=X~C7)O;SThJ-K*SNg57mh)AeK<9Tn0&Fop;jVcFyoC<1-CF#ud z2V!#->a2hpoL6%$(JZpngG66AqQ3RqPErP>XmPALm57uHP?AN+L|e`B?gqpAP}*=A zV@Wy)DVL>TB>DWt`HkhW%p$4(Zx6&jfmD`{U|YpiI!U&gH#zuF9-og$8VD&(?CVS; zyrzf2@cK=fXjQ3w$KB%K{@nIc$@b!{2jVYjy8>GzkDHTZy9UXF2lgY94wr-)mqeA1 zC}%L-{+$zbR}pRfNILfW1My7|75P`#Mu|29sbR zm8aDUQYR7Jo01|W7|PHx{h3C3AL#4UFtn0#^p6LkTy-i>=55Y>ga`?xaeS3*8z8+d z?xfNhJiR)t!H=L_61|6$wzV6Llz1w_=D#?4vDh|-qUVw{^)5@F^2}IGQpI~L-BA4$ zx1XeAknm$Q`YA*OuQ^&fPiyCwX-P2{BIy5{^nbv8jyjjeRuCf1kuX*2+}*;4p}2;waY3$rksJb8F0V!;eLmQUxC4i%3d?v`V%_4bR;q{Q!wKQ_rg;eG5q~<3Z(V-8>3qHy1gUq*4Do z5TDkdBCr34%Xd|Tq*0oS$Ts*fOIcit-6XvRX)PD|DoH+1IMfg>vRqW#L#oY_BbKDL zkWjv1BsGE5PBrX`TGXBWAWh-qw@|2eAtiE|Pm*-y39ZJpsLb9^IqMe$&vjZt>lljF zf#rxAH`ab69WjWrwQP~@dyQ;*ovTB?dNkD2SX#lO>^w=YK@w_|t*DJ9*kIz2c|2;H z(+b)F(jP3Pkz_V=sD5H;H)_PyB-OF76sHzI>wc2rETU_et+so8nA)j@(CSBPV`qz4 z6=v(`9%kiOU&^&4*!>G&GhRj0Xd<41G@a93PEviF7*dDQ-D%^<|d zVWW;9sS70flBqlb_akWzr19JuQ%O1rX|LK_tfZuQ6^l z3$@B#KH(+mMp7}pM6emWuxuxjpEsARpGw<$o}|{^Vv`J=0MmEe3K7&xZay4(q>`-t zNNVjPLZc{jXPBzLWezokM@A5>nMWY?=UhlBhGG)i(m zX(XMjBAUifEX&Jtc@_LCF^>0R#CncbRo(An6NZrJpHZ*9j0B3Va(yx#za(ApI=_sUkxXAKQ)ukRM+mf5=CP^de ziKdOIBr{<;EZQVcj_qmU1=SbJ8q*j#SD#}I;Hg9w_efT1@WLx!Yt4|BVUUxQ45=Lk zInAyakY48VFe&Gubmdu@M$!{V(|LbcO;V32aialP`=PwS-F}3mCha&-f-u&l3OphywLMF>dA!!7>c(^st6EWY zM|EJ6U&-}L4=6Kvm6O*m8#@S})|7uxM?D?&5Z)WI4UA2YV!3v+NctGk3p`b}khCvBZ0blQsg@|tcBDp)PUM8>I)&cbE677)CZwwd zk=oc6>N$+G8c7^%k+{>u*2;Y}u#?9r7lr>Ps zsIla^jsg`y;`a>CBP88|RGk+Px!3&Upr6fAapxs-l16@Wil;UnJesBI+=X(Z=?Q5) zAF$Vvv>#GE&RNdouOO*;Q`Pe>N!Br()>yGNiKY@Yco!%fPi;BzV}wUnD$6LChG6tl z=;e@R$ktTxZ$VkgMY&0VdZchB4Y{NIs8@zTYAQm8@f6O0lE8y0i2}WwBIHuJPkg8G=y`FCn+?GLk;I?oJ-QcEYUQcDv|)x6W&ISkSS^$ zhmPbGl$1CqHMwc%fDm1xsP~`tB-Mu`FhxmP4GEXn%SpNc=>={8c`&>O38jI4sZ`!_({T9#N_n0+t4Z3GEtd75)@q-_ z$<2}XDZ%b<1E;Jba^ibWXG!or zAt(NHNZWbEkk>%w864_O3|*44XR?INI+vvUnIg3p6?5DyHjNa~AylsSfMd8nDByJ{ zFRD#av&|NDdsFc~na%NDWGQ5QXXOyNW-`!7=v>4KHzD?;%D@midoG-7_R=J~g zpDSYeQkwfAnY`zT1%0W-66SHN#p3!fnKqdYLW<(UkX%5&ohLl{QRsv7Idljg zu=>&b+5;&<91G$}_$3r98tW*K9*hXdd=t#g|6`By{=p&S3vrn z$F}UAhRZl!IA?gmMqF#V$Fg9SSsC6Yr=GQ&zO_Elw6q{t|_}AD}gBJvOQttGccsQ6w zf@>9B$`M4usKalFo!=6pbsbszT@OS3o~Ij_HcOPn1-$Ns%**i`1d@DikU zs^!(kiw_~uCleWT=#stIavev+d#CKhfsi_IU(1^0LK>?is~;7{wN3;Mqsn~=6J7=7 ziRA>OE}Xz3lI}v{@nhXiQoZ$J7bT#z-yp8Ygl28vlH|#?O`RLH-5W&L;nWtFHnQm- zIj(}mn&I@~yy-o$iEP@}o5We^dTbURFWMqKZf@tW3k{-f8#+L!*51LIlgDKm<-P(^ znLGAXkkWW)$;I^tNb6KTTV*G7b&1dsRO~pH=sJS(HSQFXrMvMnu}QklJ>sl%YkVO* zMv~k6OVM;Bg&+B)7)9(}c|Vt>IU0xNa0H}Yyobu0wSJIrAiGM^O9wb&sxVfiH>U;( z)ChYIh^7ft=@SRpHlHi4?pq?h606AO9(ssv_;6%DZKs1Ftx)Z$u50C;%O1!nm|L_D zK7d5mwenLj`AMYfYfjIL4@gr*ws>1FOc zIUvqL^5;eL!{g$tgR*i#rdK8U_*ktT2ab!n$&|<&CpeKf?r&MpO^{A;^V}t==P3>q z#&b@toIOs7v&pnjjf82poZ7+ecY(g@#nvj<>(f7o?9o*5p{K>$;`8zl9qSq)ElUafhbL-kg}-nN>g?)Qtu>tm_z%O9|f z-jwA&b(3s<#Vqyb9KF&g$0o(aqH3D0zDMhaY&^>^IW{?mZagd&Q^;r<{SP%m8l}4Z zF^9rR@rVK)g4Bvfj+{l8AbE=!iMB@SZOF9oNwFB4ZmX|(7{sb{>f>bNL-heqA(!TM zIvsSbL!)1N(S3^bJT-bXP1MbxvD-@H;I;UC5%&(=3Ye81^57Yt(^FR%-Y&=;!hcDNO?}?1W&JFRF21< zEG^(q3bMvglZ>dq+IgPca(w$%WQk7_){`WSs3;DPqeLhAvT2jru=sxV3N*ZywWmh) z^W$J~>VB5~#Hm=2O-<7ua*-S}>b=3!p9AtBU6Dft>ILaDzViyA+%G`t%t!BQ{$g?t zCHGwbM;<2bw5Q&bYk*gfIG#i0Y!}2Pd~kDwOkILR-CT;52UC510htV(Q|1O{FSJZv zYi!jxu~$U2{IE{u7~ zQV7p>S*@**)YlqlYa*#?yx28~+NEkdCy=g&qq=wN3~3!-oU8+mmdkK}STmWf=DvZ3 zSAaL-g*Jr}D}+24-wdLBu0o2I`y5}pXs6=ErYY2v1>HICcHF6QRD1x5UVr4rOQh_8 z@)md8ev%@3aJ=bdrcfHR?9zI?38}xhJcKTQHuo%BQ#J9lGd;zSY4q9P+FoLnba(U; zXQxrK_U*%AN2<>t+;f1xtI@1A=_?kzL_Jr%zu5H>^<2ULapfh7b#(y8%90Joi>iD1 zfvmlz*3cD0squzG%H?Xy+5R4+mU1iyte9?VQ@%3(6fjv0uG!OV}!ZqN}E0>2mSJTvAK(_RxQAo+X0-gWGo-2QNf z!W{`W1#Yf%>5n|8SG91#ofEhqq2R;daB$CwY>x)#fE$DTCb7K*xGlIHI7u>P=sXM| zbqYuL9=vNR^9Ard@XuhMm)L#_JYWX%eejT(%ot0COt41Z9Fk-5U1q1j6T-&`Pz5~r zWlo?5Sb!UVuYenax6J17dRMxcfj#rzq!)Bw2zN-E|f)Z3*hRVwi2v5zD(cS zdTGq3qO$dV=3_1cL{cu=7!7D|i~XJot6+QUiw{^Bsrxfj#AW<|^R1;57&z zaZK4G4Z#R7kOhN2eLe?=!5)5`BK)@!@43J^>Lt7d)^qf}$o8j5Fb-@k$2B+t)-!B- z3F*O}$6Ud10980H1z93*gz$%31+G2{s)6lr^--hSM?p`9n+7)%ZZ2Fs-E%0w6xN*v zCj!iayBKah+yQP}#mk6T0A0Xc1y>)|Yr#Jt{08tAxF5mYpbz&!x> z5ZrIz9))`h?rFG1aBsl916OacPM%yLx4)?iD1SpY2+2|)?gd^3?hpPPJOu3dfWwaf z_X8(_r-Mg>KLn2jpCfk44D%q=F6IQMfYZU#!L1&$eHM5ccpkXQKWtwFehr+j+aIz0 zRq%#K2B)g=YY_Qjt5WiB&Jzht+E>%Ccr%fx1&1;aQ5)#6#Bv)40j~l6u9HyPKNt3+(mF-h5IJl zcj0b@y94e{xSz4>H0*ZY*sE! zGaCdCxSnu*;0D4ChFb@26x>E|TfyxNw>R9ua1-E;fvY-RPV;dP!sx|Sj+_bLRPa>r z#bCD21_#@j1F@hbffvL69e6p|6vE+O2R9>*mKnYcVHN^x0sjQv2Ci9y5};8v{8tG2 zziZ;@%WYZ_ZY8*t;dX`F1MUF0!{9pLs*L64Q@0W)7(1Mc90l(5B6BSGA8-@!+auWC z61)xE0qmE|_IPk6xHtHAsAQ9i=H!w&e~Vc5!KDBWpzp7@5TG;uWtw|n{j{bZ^YndN5BCV+O!P^N9Bul43vl-Lg1tPp z!znfu&S`K*go<$e;0D6A!>tWB0&Wc4#&BD~?Fcs>ZeO^A;f{doP;L}`IRe5sxZ~kE z;f9BDjdE_I$zmb+{=#kA6g(Z=4!rPJw#S3t0QUjc1P=!P1s(|=d!6H_f-f*T4dWqv zfB@6MQ*UsD1>kAdm|q1yg8g-H#&2xj0RHkO^A>P}Tg=Sxq_A3tW8^C#moTNV0_iSg@r)K9J%v%vY^JC@$F=M$c*lDW4$xeu2cWEbf zD|ThqM%U?b^jQY8+iWDeE(g1@sq7|Xvs-lnyA{^3JO3Sa|GL2L&|s5FZ(42TIt}gG zuyA`UyIZo@&7g1j$c!UiVK)Kp;{xW~)$CrPkFI67-CNmpea!COo$PM@oZV4-*d4i_ z-Ns)@m-dm1U$e0I9J_livRm^fc2CpSl4S-%|7N%L19rDRX1ArAS=o10WcTZi?BQc+02{3$+^s* zfPVph<%H0f<^z?(a02`~_-F8W@Lyp4dQmfRhWhoQH(0-33<2xciw(f~^`f%{1pR)o z3s~JRQh^48=gIp<;*sFJVA?EHjn_|R`y{Y_9VveyDO*^-j$97Lb)?g<27-PcDZfA} zBk1>$w0kJl?;~lGP@FlFGdv5%eWc+!_+!|M!TNQi&CK!nI+FUoG6elTvL;x+kBkQE z_mOSE`h8??FyBYg=Z4@7>VA^GyA8e$9tTdFM-`y_4KG9ZSPH~Tzzyd!zYg9}4Jc-nfr> zJot0)Y~B79+w;NNA!>iwq$?pbJj6^JyQ)D7nEuf<#rM8u`+jirVdgVn0sa|00FP$V5>leHY!1@JmGq8Ta+X0LVUPBMC zQ@`LH0ztpvO$4h8UTUFqa6ftBOPmK@2A&SS30?qBKf&Q&1wR3=Wp)~3PjUeHdsaD! zGQckIcVPMRD`}7Yfx{mG=bdFf4c>l^`6BoX_y#!UJlpRmrv6_7;SmDt16ypIp?-s1 z0j%F(2Y~e(>|n5dgB=FeZ?I#)`VDq7$#Vb46}F)b0;n5oYU1wT@FFhpU~t#V%!%M$ zKQX81{0DO;_-pV>;E}i4K95-K|9*E^ScL!|{mJ|;_yKqa*!>>c_kdHthrq|cr@-ny zm@0G$tX~J;uwnn#?}P6lfPNoraN{n}?}N*M_4{CduznvL4A$?1!@=@Cm>Sv;2iC8H z+qhBx%R!~z2gf6TejhvltltNZ1nc*~sbKv+I9Inn;tZW&x(`+bm=D&kgIDMQ^!wm< z5kS8W-Uin1gLi}V`{09M{XX~@*zGB2cmdp6%0j;zXg5()^CAr^uue} zLi#PR54byhZ(TNNF!%#2b3L$rZ`%T_-`{ov;~v*(7zjaK=u(2C!IeBX!ExZ1!BfG1 zgXe(t8|0;6b%RXly#b!%&FQ@hZtWwP`hOb){r2)xuzq{FAFSVA9s}#QmlwcEcFy1z zuzq`a2dv*-%0KfVTU6d&s{P;Q!GeB!=?~U#FRO#q?IqQyE_ji=%_NQm53J4H8r+B8 zIHWxuytWSWAh1t3)n5ikgi!MZ4v-4|5Ig}KNv|w2{2cHQa6b4Tcr7@!A&1`ro(BE| zJgG6&UnaN@La!Da;V5`uD`xrUOk|VQYs-8YJfB{fWc-`pz2N)cjqTa~1bh`-k^V@D zOfR+r)n6u14ZlfU;!1@LE zP_TZ%odnh|xW_4``LEw_PeuU!hI=+xzu{g2<{NHWSitIno5s+4;3E^bg|>mugZF@s zPiFf;$#VWBVGy1|fYV_4_if}T?LM6&{0_bYHhQvs`3$yK0RIfG3hpcrSP&_$l~haO4sWzswW+zvWdH)*!&y zmCT#K`bP$ZVErS5-C+GAgD=4PM+S$%`bP#Q!1_l9XFak1tIrIm4~r1s^jlnj8{on< z%y+?IYndN|v(_`aRp2hk+{|1FT=XGxO>n!d%=MfQ#zANVJ^*eD{uA5-tY1D40qd8~ z4zPatoB`G^pT~ps%V+0I2%q3KdI@-hi%Yl~ycN6wY}v{79pISHnD>C&+++SuGQI6g zti)fBy9&-{ruCmL-DQC7be@(=u?P4QZ~%BeI1JnX-?xhdj|8^^@2$e=^#|Vuj{w(E zp8`?;kA-U(AUR;2Pkqn>c&~IBN@YL$Kj}I)BR&wT94u1j!@8 zMISJa0k8Rxc^de8@N%%%R<^GOH`vDfu5SN`d7mEtBOCAk#~|EBfJ=G=`a49jKzAh5 z>em4LKr#)a1}?T+z3K0Ed3qVVz!kui!Ii*uz@fw@*^Ki1Co^a$15gHQkU=NOWSIXq zkK$h7_-o8VB~ylWB$xzyF5NoI^m4#^w=>THFWABSI@s)lupUCsk2!$+XWeB1#_nPM z3S1ZAPl9iM!uDUlMV~R>0iQ(yEIypx7{m_%JI}A>2%!*myv`g0KDnB?1^AQo%w51y zh(8egHr>n17I1)vZD5`PZnlbfDYMhC3&J`CXn+hq21n!8>I<-UZ|;I);CA4PV1Wb7 zAK*v5IQ(PqOoT7*D_ey6f9p0bQDr3<4B_B9;QWu+-WVKP$lMKlWGnM9aBpx1cp`W@ zxH8gPB3aJAxB^aKEdn%O&b$@eANGCVd*I{X+Dke7W$;_D{|SB%>1lpE2Cn9FcpqY? z9Ar=OxrwSF!1Wc(Vc=MBEck+8dn@oN*yF+5k=_7s!cq>O2=<~+BIFp!@T2)B3-I=0 z7N#J;5+tw~EdTndj3B_5moTpbk4)ei?EwEiocT*|w-=d@fei?M!H@c17GMMd+(3Z% zB#!U|JY_UbI zfTy;QcIy8f5T?X%g#F-3EtyY%K{%LpWvqLnIC~qwq>qRnZwU+#ata+1?fkDH#emAmj!4Gp>sS( z=nX#9iFpLrc7!h(?@#E$|?49C)b{P1pg#>L`xT9~_7#OaND*K9dDb2gf~S zo(f(LUI_N5&@%i=aD6YVoM7jD>R1_|5W@OE=6&F^upb2n`Lg{Ycq8n;Nv30bFC4=k z!5)J2Dg<&1{p`>2Lztb0R!A@k0lFYSOYkK>ju0=IG8l<-{1C}>EFXzO>llQeJBY(i z0K335!B2;>eUW17|GGn1ScL$!@umIu!1w5LciBQ8gKr_hFTs{~+5SEFXK)eN|2?+< z3C`WX{6w;xfA2x4Se2V75F7{|w2>o(OQsrc#j(06?AJH)80Y{Vi46OI8|>rwBfxF< zGp7)%{eS1@EKEcIx38GzfZY!;zY0EqcfWPu&++cJ9o%&{hyN1%Dl+^QJpD_ypRJ1h z|Kctdt|P!XM7R$w{)FweAa0?l-~jN%B5r|DaO@wmUv=IFLRpu4ofS;Myf=__Afg6K&J0bYdCL#yfVQ?G`4#}s$ z7iim+dYz$JjYFxoNNY5X9x*o@OhCmoaE1Jxp9=Ku+=H_6nE^|k4 zJ`(5+ZVLNg@Tdq5KL+d!VIB`YVOQ*=zsblY{B=GDSOzvOU|t8l3;Pc6RV26v{KrBL ze+1ka@y~*%qe3^qp2|-B{}4h~ByNJfkXQ7Alw5!hc}<2 z;Cza&_Ww%|UPGT=2ft8<6TAmb=RPx7gSmyiAy?M0GB_9<4z^M}X>SV7NBrL4(CXO# zM?v_WxLY+$<7EQP!R=x125y5fF$7!(JO=y-@h5`i(acEc z%>>J%nB;uLPWr1Rku1E008hYM!S}GVeg<9vJ_K%vX?aqzg|=thbY6yC|CQk%V87v< z-xJAl{^>t6^rpck2bKC2AeGP##?K555n%mSgiXQvuMRtc!>E3gjA0;H{}tkBu>Lc~ z@x*HXpSX=9%tC2eO2kYMkUkld1?Y#x8e>?mWu>S4vFTnb@!M_c~{;z)> z{2T({>)?jp!1}kri^2N0!ELkz%NEnW4PFVXe;eEm*1ruN1=ha}-lPWgzf3^?I(S=%;y?dJx zsL3`XP?K%zV?3s{?BH$49lS^AfjfAwulC5e`wuCu53m;cj}NMjIJfch+zr~RUzHwf z-MpZx@VkSXtY5aYChtC2+G>K;8n^r4$u`j**38`pt?lwX#4Zf*wpmN?cj_ee`gNWE z=CSKwq5T_=CRIjJ;tq}r9O;3$xohvc9or32Di&*$U;jI9x1oDs?KbJjCjD`fo@vq# zn)J3ijC3?KX~2fd?$#aRur{c$yD5UFNsln;Hj_TUq)TBNt~iq}m20?0nsoAZH0YLO zlf&JUx^I$6Z`v5zV#ze=J|=yJNpEJ-OH6w6MxFc@m>j;14vS@pNpE4&SD17^lfKrZ z-)+)2ne>(>eTV2$f9ZmIOpfPG5&TX1ev{tHq`zj;TbuNwCcTYGf8V4#+L|1vO^$XZ z{Y#S`VA3y`^!6tGl1cAi(yyBIj)rdZ{|%F)lPQAbS(=DTTBx&rXZ+Q~q}xrppGogx z(%YK!K$C8N)^RI?t|mu!Q-mOs9%0ghP5Jl7z2un z(g&IJOD27=Nxy2+?`>><0^Be;?lVQO?7THd<4k%JlRm_x`(4|VH${&tfi z!4#ppNgrm?BTV{mlRm(tk1*+RCViwyAGve7QGe-zQ6@*SDMF%2pJdYSH|d!sJ;|ic zFzKUBdP$>B{$osz1&t1iWvoeGV$zdM`U;ai&ZMt3=_w|ClSzL-bff+j%MOzx)fC}* zlRn<0?>FfaO!{jkeWFP}YSJf}bjSN9$7GY^v`J4h>0g@kbd!F;q)#>JmrVLJlYZ6E z9s2akFgb3RB4nC$%dT6qAj_mTG3nVR-Or@wn)J3NJ+HC-31Bxl@=X!Cn{=ZHhBLyX z&oG4_VA2ardYnlwY|v!|8)B%n-}SM~;?zU3!7@)yUSbFS5e10qlgi*t!?SBou^+F7F8JH>7ycBXD`7F!N;&Sc$QC$=2o zoN>CnO6qcZA?0 zIhW{m53%LYLW0I}taR(tHllxyF|Blirro8Ox@lrcBt6N zy1h$YQ|2y%vT`sqTc*m87nT6DWmY&o(xuin(h zfY@?WabD2vG_mD~;ykU}DPqgf#CcS=6UCMjiF3bh$BQi|5$6uE9l-I6R<$&Pa@te!RpgJsqoD7_6^#BLN9xnD0-L4jUgxDpzy;JOwVrT01 zX0bH^)TQ+XzY28i{TQ+RxQQb}yTQ+Lve%+22TlQz?4u>wph#(uY zbFFSiiY*(mbBS*E5L-54XNhhHiY*(kGgG$%#Fl;6nXKC_#g_fn8K>JmVown}Lbt7A z%f9P$*ma?PDuQgdPCwngCbn#}PK$0|7F+gL=hZrCfs0~iihV)1&xtMjsq?gMpAlR3 zQRh+JJ}GvN*!y++nAozPj&knMg~KA`Nr1JweL(Ddv6tv}wb-(6I!knWr`WO^IWu)T zGVS2;VJ~_lj^GW(_>sNj#mC6yH+)B~{BBa(7RCOB}8X`7JtEh-jJmj_hsu z;SKhi;vYY9=})|Kd1FLSlo7l|X95z3LAzw|9NNw@_wMl|eW{qXnEIaAG$fCI>q)(3 z*>>=rkyY(GJ{Ql%y7KMAzh4_-c~f@DK1VMN`PStcxq9%b_=9J27TsmN8GSHic2>)d zD}zEThb4#}?yZRb46$75_l^W@UL3Uk^wJ*I_@MPSm$tKp1RZR%?1jM2n>|7-Z_WCh zU`w{>DXv7gRJBd+Tg~!V|83PGtIM)JQ_TAMspb0X6EOK@1x?3}D3dwE{zEc;-4 zaY2z!X&Myw1U0ggnH_u)^Bd^$}(d;f-m_0YI zq$&M8;^!9U7Uc!nvx;-=#k0%p z8AFDqjv6~AW>!`?Q3Ds`koJ^_UIV8Fh8o%C^t|G{(ya14QYbH-o2NdV zWxGdx@PX%~&iVH4e;(AxyQcF=&oNfdqOv@d_o3(Pb_KJ;XU{D!nOojHKh%dlDay{u znc01IcA@&_L(ltb3Ql=`p{ZAGw)dNc+1*7__g(Q^R^#%rt@JgCy$^bY*6jDU-E)`P z)7jR%jTAP&peQe+V0!WFQYmPD7P;0O>uj6TM18l-=BMU_+3bGyJ1+H9n5}EiJ4Aa% zN%xREqKAa~-04#L3vE4A@j_c@yE|Qatm52)eD!je?Vg&U-EDh)donQS&T@N0E9tFz zM`_*tw6VV}+FKF{2~}^`Slg=NCfYuA^?4@TturBl`50PMp^#s!vVk2HRsT zRLAFRLu#_0v$e6_**LCaUei6)n}@tQsLa3EY&G5gV#_lHs-XovJ!_uaXA4Wbw;;cJ z!ze17o87%{s6Ld*u3w;icB#E_h~4h&?;c?4@C{plit+Vo-y%jr^a+a$4fT=s6HmB0 z;qTR4P5aH(;?+9a_bIALl2=U4@FcHwX{vIUS7eR0$1AkitecEVX`Y7`yXW=19BDAsrL$LCkN(Q3@^IBIJStTWTrQtdGhNEW1XI{a! z|6eFYs6jOs|K|0AXH#P~lbV|L53i05IX-mWtG`OUK<#S7m?Gn@{uQ=B|Cd!aTvdYT42lfsQ4-W4gsHd!l(07f}JcphVna>C>oLx}dJ+KFDpvRRq(L?sM z_mMeAKK~;Jn(kKOdKj7GeQqo3|H|RcEZkN5V{r9y8_zash`)FHR)5-LYDjDEw(3!T z?-_n~`c-j%TRU;JstIl7y<(7>ebd^ynQ3G4QA4hHwyya)*?Zl+`V8}F+#&)E*On)} zmjn&SnOjyqdsg<`f}-5=tg@MGPlaJJ6xeS{O2XN4X{5a3oCj0p7Uh+hylUwy-tE;J zUwHeglka(ls|)jOtyS|A-fh&*L*B)X|DCLHh{&0hn?XnBEnp1wY3S^{yy6Twy0BH3 zp*OBfZY?AG!HnXpS+ZOG!6n`6j+4(4tcHc#O4O2Yo90PQ>b?kDD|J^X>uQS#o44v) z>a{?%$|}NVQb^C>w279XESDxyHx|d zG`)J+%Vx|jEoaluwY!UI7mtkiGIO1#P?o7OjyO{pBgsfABh1eK+*KZB}0_Qym(rU^MGuCf1+i>26L6)##Sd?w}>50rYWCJ*6}BdPrU5 z4;w^aSGzIWSd5v)_EMRttco%Z+*!%lxjd_&sLWnaY%j?wC@t%LTLDAuxwG}8B(6PB zhLsV)QKolNs5twufVk76AbKFTX{@Areht%_HDp#Uwb64dFtWU@-g=f2g^_Orm9jO2 zG~$NZ{V10)N2G&TG1SsTTVOjQ0-ew>8FeqSQ+E$^yCWOjEMu}bgoNmgQlLLd{2{w3 zeW$7}*w(cRYc+=!UY$ z2qz`dTQx9HogQy%uOd>}x?B5uw`g8onw8-$@I#ALLaHrOU4O;9yLvXl)=6cKw|TXq z-VGJMwLt4tcVJJEdNWga{Box>g(n6ngp9!3C(Hi~(=cCdO$BDc{|K!&r?E|Rd(apQ zGBo8paVrMRf6Gw6AM*a9wJ~;wk4hRAV+x}s>`e1dA`y~w=z?Y z{)zUlSG^r~hAXV`?stb)v%SWQ)$x6XgzWxZ`+ zoofsChwiI$`STL*dzj0sspz;m*C}4$JOxu1SuC%?gcTM`(2zP;5#a;k>s-fSB|HzG zf!E>luo-W#KY>9od1#$039f><(6N=9Mcf>OmGE=87hZwKVORnQ!qu=DufDIq1n4`A zjA00@fc@YWI2Im)8SoT*9@fI6@FqM5{dr~Hc6gmDsx80NOyDLJ;T>23zkyXSc?1Q3 zZ^BymHM|LDjI48o@s9mDm;gV3>F`Hb4n0QIxz@n3@CeL-XW;^P1+IZM-pOBpK>@UX zOd<&(%z?RZ^!+3NKZZx(C3qIzgjZmfBog2y{stHekHU1=VKnhzI@}A_z_ajuXyYY+ z>=+6TH^5wY6;?R7=`fb2gKOYfco1HPe#w-O9|MwM0^A3SVDoWw72FPw!#*j5hYvx2 zek}M7#zHNXu7w}Mz3@6b4(s4~=sBUzW1|ET5!?Q4W zA{oN>VF$a#^1~$J!Jd;TAbcC{h5vxZ;pb_Dhx?~cp)UL;mrj?%lJq)GI18iTgj@;$KZcd?M|cQk=FxTV zB^VTBvHT6D!$tWH0&??QJ_Uep!Sm2-I!(#XAa}tq_yWv@C*UG@6;{H{GbjlB0p5gL z3+XC;E~$m-&^D8T!x?Z3yZ}$Z)gw6QjCtxuJg5zNkd=pl}tcU3`_%C=9j-V?$ z@WasXCA0v139f;^z`ZbaDeDM)8`}86XwWjoLWF|^xJg3zFU*C(6_gwfgQwsuSPQG+ zP1y7i#smdO*OCGJ1U8GdScW`B zi@+CQ5p24S3cnHGmH&5`?eAEATVeYye#a!{Do% zXli&GE`qI}rlxQJJP!B4n=p1WeLT=&Y55Elgri|O%z$g)N6#>5j&Som!g+WVUWdcC zkWq}qvKA)6L$DnF2X27@TgeDcfwk~SXdA@JwvCFwF)$T6U^(2hodUuy;CcAS4k{FD zu{`E@mJGNVzl(%nMHPJn4?jnM!SvB?niBr&d1?x~{e^JwK6nUb!c(wIHR11N@a-jI zcnp@qw_YS;cmp1RmVKlTo4_m3(SjS>eHKd`>;ON2u`uiPtw!Y)!$ct1P@m%#JzHFy(Vh8;#T&;QBbgefo`E`f_+4cr3bYN;ta4zEMs z?+mP&pUf<9GU(t7 zFc)5f6)@*AgAQ)|k**wPvAhDq;3qH%UjB&|g<(I_b#Rk|o2V3Oc9n!+FkA$qU?sc^ z55c@&Xkr+Cjf5ZI%@aj*ddi!@hcUCAHfRf2>B09 z!Ods?rODxWcpXl;K?dV3mVeh#Fz9EickP8M;aPYXUWcck{{+IpFxb|s-jxIg!y=dg z*TAK4FWd!B!M9=U1m^$Wyz5;-6D^jZTD>bBz62{_dXswBA-EBqhp)k#@Eq(giS4s# zy(<=uh3Rk(Tm(OWTcD>;z3T{E4bQ`O;Z4}@F5*w-fC6JDGylgmt9Ruhv~6DRs(`_8 z3w#dN!n=LzUA8pV^cF;bRpbT+>GbOKf_`P46Ju0z|UYVjOs=}7#>0f za4Gc9q$y!6ya97zV0Q`zSHivUeOL=^p%f^KPoZHHoCuTP8CV3T^r&~Zws5nnCpCf9 z;q*;5PcSeRYP~5rjDkgQ6s&+B!t3xFY?i}z%x4rqFagHGpWq@mybl$C-@q$yY$V}w z=^9uBe~jdNj|y&{12>z8KW5! za5rpLKtf|^N*IyM^ny)OXhE0-ufV;qS)qla6cvF3Q>h4?1h>FB<4F%X&P^o1Ob!y0 zNDvlHCLmk{D`6Ep1pfigL*F!}5qts$6|uBVWemWFVI|x$jh2L`;T3oR+GY_igRX^f zFbZ1vQYLp6^S=)_ix75YQ3H4s*1{&)L@Z{dgF$dy4t)l{fLq}FT*AQ$coW+5NO(50 z2Ij(l=F`N`F`aPmi5YZNiN(^afQrH?u&Bggv9v0rPZ0{>b@+d?>B~6`suKDNc9=tk z@H==GwkV}$a6Gh?vLL}E*td+XfO)VAwk{_;oB*%G+4HDKnZ=SnpN!!H3rN?&&FO_C z2=h54l|K;2~wu6LV@v|fZTkRyn zhuCIe7~BNY;oGnRw%kR{;SqQohE|ajC`Wbuxl4 zzd^y^w7=3q%UGD+q~LH0+zU6rIfe5!mu8GJu2NP1xsa3j7G04a|j4!U{O@8`cr{B0LX$ zF38NvCmh^=iNUvm z0$rw{a2KqCAHpLr=wGA*D`C(|1|y7Jsag-x0OERnFPp4jWu6r6pDEdwQv_o%whwkse;{dsT?->nI*yUORCO$^G{2WR7pp~Ecl1&%2h&=ciO}wjgltweKXl(a z^bY7xp$FWdN1?Ar_q#(+LSKzOO7sL@yEVbLiBvcj{RnznhHzsPaV&B>%o%h*uS9>7 z2=_|pcwfJnKE6#x-!;^?38wfD;XmKtPw@3yZhcVqNpNX^v-s=rvoq=Ot)oa_*j*!i zd{y+lT7aW}I0tO;(WT3+X^nA33-V-lz|W@P_K%<@)1|AMh(7^;1%7rhlRsDY>y^cS z2ESeW?n}zF2>l%TDxPjXxmOF#j_O_K8Y}@Q#6uK8A|EHvWONyO4VUQW(ewU9zm7f! zUBWb6l36nwC(+(2?LIBsvHA|bgiXc&7<#LQNKo`5^ol#eOQkE&m!PLgc)ii2Q4$*) zr3(Kc{AsuOlf~atZ?)qD_=y1h%>nX#{TLyZAhcTiUJ)uXPU~iUJwm0$Y2l-N`uuU| zrFv00baRFEf}=M<50>=ZR}`#3Z-rj2X2okA)Gu*b8|%0}%4dky$(r6r^%%kwSXi;fA6taD9~wDktCPHq@BlE00WCKtane#0gC zcR*hdsS4w@=)nE>^#w+cpVtswAF<_xtBF*{;evjF~T{0RrXNI`&nPLPS`I>)n{k{-jz(3j3{+c!aN(Ld=j*Kt;_qV!~`uovQ2cI zD^&7uUs8vJrkwuKX|l#k>X44!Dq2-1Xwd;b;P)0UWfREY*o*)3XjPv;8~!s|1q{=o z9WDCTxjIV#y$(|w>md0A`EbI-&vMXsi5~0Ln>DIN`l;wv!jBMLPmjU3SRZ@(*eS;! zihq~*SuLKh4pE;B)7n|9`m4*sXpr>-RKRcwS2IAx4A<@rXg=`vfhC=ma2JQgfok1w z!vB4sIwq`$QP+gWV^rV>8u3buN*tjLk9>Pjohw>0qcG)EO$wh*slP$jm$Grbek0K( z-E#DA2dQHtv~chKu}pufdSa~BMYS2Jg<9v_tKvtJ@aOlc!jWXO;y$%`B#ZUvICVzs zO>xRP3j1Q5iW#MK3yvIOZq>#CXpvruV)gEWzswlv&yHfG7Y$K|CI0du>YA`@i0Y9D zFAP!HiCTET-wAJCdnKLp7Cb);QPqSCaN^f{8(l8(@5TSOA*vpKzx(3d>!|K^?{4^q zqMJvT#Pesoq@q`=UWr;;wfKImz4g6#wfTPP`OkQD@_rh2T!Ooo6WCzmjm_gc@s^<5 z-FXOPCR|5fk)Yy}XusnLsxXOknhjH%lc=B1Fm*fmI#|is8wUN;nshQP-n2c{6^NfzE)F5YweXiS&Q)AhJDGRo|s3(S;<=8!01tb zz7`}=vvOAD!K2i%WNnQ1gM?dSQN?SucB=O{txwD=2z{gt^ocP0wuu$RiQ+x{%m>{+ z9IrH${D%D6D7ASURXI+=!nTR(@;K(i1BuEf1x`#V63U~l|j#e?k9-~#7aO7yU@BtQ@h%xH0*b~R7a}Usz zACFNjQ;GlW7!@N79ILWZ$#270wJsI^4`bEIRKj;nR+q)ToU8)J!}jA;+IaNASS*Xs-WOWQij-UL;BlaOS)zRp8R`?Wp!ekXNg>-__RN@pm zc0rn2HHFpgjWl&`3I+HzO|?uX{ee?d3>-geN}a2R6j+~1Ga6=!-r!MPcxi(_)>I*> zXcGD}=q$dCmrR{p^!4bEsu$O4LF(`6T8Q<7smeN)^3+UIkyEt^)+aO6DzV?qP=}{7 zrQga>=Y%yGs$TSzOx0r=c2cHFoThaPEX;I23+d&{Y%E_C`6YB^P-Log)2LT#&Q_hQvDqphlRO7xt9W5bwki~kL4QCC=qBGE%qC4q z$7tWu#_~%UD)2AQR%bG`@c3H7g*S#PY7EC5vYaK{HT-|JR}Q<{ z^qJCtog$a<0mPlpicze2%hBoY#!CiC68f5%YI6=5HZM}=a#R`pTm}qFIgS zH^S-#C;aeY6`#u!%008|Tmu_ZGiH1&=Z7ftCU@xay+qKT=tb!M=;jqn25beoC%WE% z?zE&~x1e`GU&-Ux&$%2HADOLu^61(3XR980+L(YrWp%DZiJ*@@E-G$;XBSRuXC}=>fr>kyi^fxA^HUM(X)&kzkIEU_4#rYkgs(M_!@n%1SDO7G+wiw z6mqUg%ct?q%~hKT7vFSVoolrOAe{TP1CP|kiCDh%*!24iSLC1grE%pOkkom~I-TWa zCh5FnQD0|qf*3oUie8+j3a3-iviWM&bb9HR`E{;BcS7u#xeen_hHe$94O*bCO=q|~ zx-`2SC}BB~_zEjlLUG5v;5Wrp#BsT6+un$>jQbD_)8iZKp*g__ymGIQbHtxX)-w9#)0RExOg25;e77#2y40X2iSE9nS*y_hg`VNzuKg@( zZ(X5cW@+KsZC2E|?rsPTC4(r2pdY&4%x<6PN$7*o?|jCSPiI7rmax1ukt3=MH2IWf z$_jOI7VA;Jl{`m#83hO|);a}udBXkji<&LBj&E#MiRj;#9|Q5fU_ACLE#|Rj^%H7y zF$Mqd33aTP_2ql~(pn9d6i~jgxrTn{8xZ;C=4W*C`X=G!8=M<==#r+5LU=rR>&1q9 zst)zF&-QIgd3kH3X3y4|cJd>TEIbXDG<^b*{m~!rFs9M#v$YVfHf!r#_$kj*pbH*QBs&x%qyW!6tFZGeeo0}&$sAZ+3 zxMhQ?E@cHdv_YK|zPCYL7M|Ile9GWY8&nVB%?&D1c+W;vSVqZ;Hmc2KTDNZRZ*(uM zGo?SLywlL3(j=7w=okEv`Wd{7(#o~a__NCWJgE0$XD&-#+$I%2m!0#qO={g- z-pqVSe4Y{9@o(i5Ch=olQa)kl7$=O9dGz=8 zr`4)?~mN#~)q;nicBK|4r$5aMeuLrgE0kg1&OL+Gsec*pDr_1ds z`$763Y=>I)AcH1%hdL~LcZa(CAnow$4&}3uwRqvbZWzaH`uxuQQNEEH^6YK95eIl9 zBPmZ1{)e7br3-n-@$=3)S5tA3jzIdd9RG!#>exaa<$Ld{b8S-pw}idm?uWF_-j7wW z2l%Lu@8`5M`XQ~SHGQ92_>k5u?ZtiWQ%0sVKyqUPNCTC}@f?M}CHF={%VE^Gq=PEs z_`L#uh+7j#yuEQeKkQTW4^i>s`&7Up_`yCEBm8imN)vuW{xIMZ;`6wnr=L#hvE1^} zmgVz(>cAq_i5Ff{Jr-->%D$M>$TzwX9eB_FI@gQtNXxBB?2}LHi?Z}aR6IZQ>{rVc z(;El&tLnvMc4)skDSUOmx-4|=S3VEJf9+R2gg@?AiNfHQRiW^{m(?oao|jd%@a>n? zN#WfG)MeqA1Iovtb&L7#K%MJEV>ztvHnfg3j(iZd=AipW8+R`uSvv67(u1nd!6D{# z{6&rNQ>e#8eeIRrt{|M(A$7*VDE4_p`7EJ6&R10A66{qqs&EPA_^L*&Lig5Qt8+c( zp~g&MS3bK$3$hM>UDYq4^%4)On5DcI*?hRpwbK~Ji+C#_);d3%D%Vo7$?!mvOevJEE$Wk@31C>Y}jSUsb?zc;8=D%5t7oe|gir zbVy~mWE3Qgq%+=9o0n72{%@(naLkIg{`gv=ig0Vu+vqWkzoY?=pg)POj}Es_8t^Ro z2J{Er6;7zof;zr;^!7u)1dJNR2WjYwRr3U`quN=ab?bQZZMG?QVgh{)B;3Gbb*_)p z=me(6%?i!G+ZWg`OMnr+7d)(gY3NveZLTH!^mk|=PvyH+UbsBMW8;GN)Urotk(d+e z@FTQj-U)S4xb%ebd6dV(H7EZ3u{DT1Z1?jG(g~G9IP2#p)WSze=lltEKuy^iyFW#gP_1MLf^kzoIYG-wAe6^H*?u&HhSlUZHhM z`~-)-5a_#^k=sa*VUNZ5Ipj$ptJ}ViLg&(QJm7E|}eN^Xq z+M=fAYXNGM`aM8NB_Z2bzEeTp=sppauA+%* zK2hsd@r<P$uGmS6de_J(QNk)NB zXq~zhTy&pp^)??%U5raQ%l`qsl*M1bGjb*CLd6rT3lG(*>L(Z->uS}xCuH7#rvjdY zTfSFm!hV<3<|irGtV`;!aMLAqPI&5)s(+G#zT#AgYq1YGRpDB~KYm$NuSMT|Mb(Sm z>_-*wlolRy>Brk&w#aCePxvmN>w`fru$=3SODY!`@Zt14S~`WLls9i#C4FSlnbqpgDXVQ10xw-qd~ z@;XuUE$ElgIm9xO##ITqmNm2B5v zT~{%c)HCu|RanVLS^ev+okgZ+6!8{K<~N65)yYaGNA0i5x`Ck?|DQTnKjW}GdIRb7 z{;yiN0ss2{ssrLLf_Djm)jrZm58bwEGV?RLn;DbzGfVwUJ3UtB!9zz2q3* zMt!wW>l^U$@3+@mCf)fdd^Z2P>Y*4I3tXyDY0-U~TIz3`<Ro|8 z%2KaBQ`#`kN4aUgNgLdLJ0b7vp`fXJ9YTPzOB@2frg_w> zcL?Y`)U)38UyItdo2QBPPiq}LuX)z1K~HPFJYTZatC>%0qdm`i*Q+<4)`ocx^r?4^ zwi(Yip_{c3?`Yq8*D*$*{#(dqt#9=6e)WHNZBvxNdl_^eDUSP+5mSM_5`7FQZez!& zBSo*r{Oetzs+VFi$3Mf9&Wu(R;u(r{otxFqX#Ik}Ze4Gz&68yiJhpBi&@rqNpFN@SuEM;9CjNo z$shs!v9|SU{T6MoXX|!!%NDJlXBszmZPoJH9|@?xZD*Eh%J-DV0x0}enzFiMz52&i ztzY|t9qWxlk~?_`d7hBjo$6K3ZG>Ffxn4cAP3vdbUOh&x~iSqStfRLRVTMI+RB2I&kja)P_SCKgTrFU4i1Z-=|;45 zSvPfH2Z238)VUpu?G7QTo

95Y^*ZcGiA;VyaI?clo5%I^^@EScodb?{yXbEaNQn zBJahl!QIu#XZd0MQ$9iMFLCtOCdG|YTpIN(@%tUWaodL20bM@SJl$Qz?BqR<#MgU^ z_c^jaNW7rwd;)TZ9)%u@-ZfOM+DRp6g{osasn1uT>N51I3+1yX)hmw|*aLTQ5}Ddd zW$$9?^6Fi0eC|Pfxg`Je8N9IQt*Up?4hwp#ledhD@8x{*n(G!$BY5qJq(-Xad`5K3=cIf1ssA~0`lhc+ zdyX8|MX6QKv3R{1Rqx_~x$%;jDqoC#9i=W4uG8>-w@KC+WB^ zshE6Nx@>|f{R`#VH$m1&9{zUXcVE(J@@;E=x~kr*Rs>M3V*yIyeuCHr7UXrf6?DSbx}1h@>xPkdTUya;H(dF~d$m6M zc(3*ZKdkJdasQiDf7?M+8Yi}lZ&~>Lyd)#h~B%B1AdU!%i@M%Q1pVBgrPmc6MtJa#DSTbj$dZTk98JzDK)dsMSI zTBq@l%H^ADuvvk@_!5I}&NVn_p+Uzog99Hk7`ETwo`VKw{bcY$@1c6S*8T?HA7^mx zB7=RF>U3ECE&qIp>*Z|*zjt$4m0{QIHJJN~!69!Oj6Gp+*hzzn zB^&IYXYi2zpReS@X8CtmT%(p5oV3+oezn2VZx6R{DB;c4aYLB#uE8yr3?BH+poEcY z#L%HJ_U_~PuOOArwf75;3h&b^a;|RmdALt>ctljFq1yRRXhla1jEJh)^`17^qvq=q z+C|Ui1O2^>WaRJlpEkcoUHDM*^SSkZW1;Fl)S`V#+K>pD;`HwKl6}MZ(e5~EuG;X&MJW?(Fm^4e>=1t}CzSjBw0S9u(asU7T delta 30459 zcmbuo3tUun{{KJBFbpChD&7!vK$MG!h=_`4hYHqpZb}_fCY_~CM&2@K$toc9R=gbTTYWM&BK7R9f=<~c^pUe5& zKkv^u$2$0zUKbzfy)D+f=dB0gpB^3Y8=FafUYbmH&GzH(0RCJ(riWiWwn)>xTpOsF zrsF$0_;u^>iXJKO6+KemD?8HsZtr-quP&eLJ6?-?vhR+4et8{!mgA0ab7|OsLx1zj zeImE_iyfX?mUHc$b}t;s+;iw*^G6-c+ul4>)p?fLy!OpQr@N;5nfJVT$lSfy&s_QD zq0;aGfAc}Yd-W1~$M)VI`n`Ur)c%=Y;7PqGm4~K9P4Gk9)n{M_=c~FX6-(F4ul>FD zOj z{xS@@RL=XGV9>d@)2o}N8Uj2$sfEop=xuzlO{RqgJ;(K#MczvkiK@L0@Rl`y2Gd20g)`R~qyI=z9BevBD6LXh^Wupbs?Y z_ZajfgTBq64>ITv8}#I6-D%om2pHTPV0zY|rx^5u27QP@|D8ckHR#6;`cQ-Z2TiB` zGPs5r0?rx|3^(W>8T2%Re$k+hFz84J%d zfT@NA*#>>KLBG|YFEr>m27R$XpJdQ0eLDA_YzSE43ox0c81%IUeX2pf$DmI$=-UkX zbc6n|L7ySIUVoEmk0Bt}kl^iYFdWYD`A zbce6~iC{Mb6dMx68g#t~dSH@4Uu=j!%%GPT^bCVu>eXchn_vjI!y5pn8uT)QKKu0@ zmq+z-u8lEGxa)Y0_3P*HuO@6b8Th&$$35f=g4}&C@pt>)8C;32mC$w3&9CoyvBev7 zoz?93#5Rk4T(eJ$EzY0opk|*CTbw@E9?d=?wo|-4*EUUfNd!t^a;??uePYX`c2#Qj z6JiI7y->4vi7n2YYpP~%7h9Y-SB7S97Q3z3Nt(T0Y;opXcFkUe?OZHgoGVllsw9Fq zZ!VK&mx?V;o9pUN2z?907H7?MQM2cYEl!&2tY%LaTbwi3am~&aTYNItLCww-TYNFs z9?ec$8{;%B7AMTLO%swOf;eBUwVE9-wm4m`O3jWETYN3oLd^~rTYN0nRL$-vw)j@A z49yM_TYM^4l4hI57GKI`*X$;z6G5CPSEwdj6I*;Imr1iPi``r7t3OH$d?B`7?2DRx zUTpD^TxT`=J+Y(2KCaoP#TJ*ybx^ZUh%K&=Yma6h(F!0wkZYSJyd)9&iM>{{_lX@N zcBN)NA$F|T3pIO}*l}V{)$HwJi)-V`(Cp1(i%a85((LtOi!0-@YqoQh2;#%ILN%dE zY;j#&Ce1DtTU-{`)tlNF5L;Xo*G0{qE4H{OuCtmwU2JhpT*oy#TWs-2Tn9BfQ*7}> zTzkZJ_DvH(Ca`Op79m+|aXnmXH9KBxaXDO-njIy!cp9#SnjJ2-co?p!n%z-s@hn^! znjIvzcoeQA%{GfIheVeh+v)DxbSHwi7Oqe&!Zoo+iEYyC%VOUm_SGM>F(7t^*cUbX zyx8J7xXx!4&2E0-ev!R`@8$D57DLnjIweJh78B+bp*1yDq0)6Pnf_$cF0*)$D6x%SP)mY4&BYWq);DZIl-HLhOZN zU)1dLV#|K&I;+|5iCrM}am_w0cA?k@HT#6vvY$?L?a_oIA~+<%HqCxX>|(LkYW6;{ zW#4pFYW5Ri%WmXasM*P@4xJo(z%P3_PcUXq7*Gi&Y`76J;oh&7_4pmpv`wzVf>$NL zeX+QG?~Njw7Q8NdTXCY-enrA(PFVLH&s<&}ADyB{Z{M4Uq+!sm9r+?{XR7TmldQik zr!5w|X?+yQ?;l!LubN&t)M>)r9zDM*U}L@awIe@W8*O?;cF94d z>$k+x=1gB&W6OX?&os>b-tR_d^XEGorrXR9S>)n!komUgl+*o%kd z7Z>IiBn?g;k~(Zqa;l?fSW?mO{FIc!!sLR~l%Yu}#mV`}#RUzu1I<${=CyYaAZTD)#l&% z53>hVIcjRF%I!gp@}i)UVta9UVnum*MUlf^v)F;`vtva}uopQhYZk}ZRr|H(azDFT zv)0@lJhawa)7=xf%#mN*GIB%YI`jEO>Q$??Z9{>}{8p!ilpoE>e^i#XmJaH{)0R06 z?ccWKnAP%^%wY`^-?6-6Ys0+?sLCDHs_h4s7=t8ePFS-H43#K zSmvszhpbWRhYu|MtO@q0isj1wp(QP{Z{Nh_6;*dsSLPQwq7v+tRgNY3cQ_IYoA0*b zLrYfA#KMBgUksK2b#_rejH+DaAE>s*26PBE=BWmKWXZH@$<@2D0ljRr7VR3P8P>A= zl@+yW-A9(5-F!D}E>CQAS$Uj#^bTvEMKg294Hy<>udc~2FUl{gD0hsETIr~cvfnZ) zCN3ziGBze%8bGgpp07fA#U*79PmDncG3mE?Yih44sVO6mzSU8qViN4!C$T(#i6c%q zPgn+Z)dx(mC=8Rz{F=pyr4=RRYT9>}0ZwV7Qa!e3WaSsulq{2&B_+kN5?EPPQR*nH zv5y?7J|_;BreWgR3XhUn0&Id2ClaMEFb$o$)`ni>`uBPQR-V$Qc)hKjb*)V zaoXr7ODWnwPuZj?Wl|tZa}M;ir>_?V{?~4hv?jfEJp-(S@holpvtbuhTw6}NR+QVD zhhm~ssal#i&eQajg^L$E@{1f*GEeok_bPGPYz^|oP?5*1Vd`p(e@KYdN4|LK$Ggn~ zoZc3c>dq{eMaR$$+92_k(NSF(TU=PY$lFe`LU>L4og;N)nKZLr0#CP0snlw-tfZ=@ zHot6KMH!{m2B6k0Ds#2DQwJ>{Eoq$I(CXsL0o{grbN5uKWrnPgl@zsVRzBI?HgR&+ z^szIdB+ocCPz7`eX->@4VUeox?=n-?G4F8kl&eKHW5(z?cvrykiW+Uy7nkKPs!p6- zF?GxYyX4kfZ-%eMJ|`HPj2$)Q!DRq%30$)d$I zBcqa9hK?>OvR7!$J2Gm(3VUJy{sZ(;VWqCsSRV(fJH59O<+PiKASu9aRoHc6o)py0)^iqKdi7TBzlsj&HJb z?o(}FUZTxDVtF&y#;c*DA3w)xAidwNS!A_UyT7-@sK@TGMmhgaTaIUqZ@uA+V`k2B zR8`A5wj{r_f+@<#UQ$vnSEED5S=yZ_kk1j`naOYbtG44bGnq_Yh}nwZk_oPK&qhDrG zamk9j{MwodZ6@QFIm)Glnx%oGwER?juz#=`l@ZWJ&3nVYXAf^~vcEH@@`_4)E2tJf zS?g?6&+6H#309mW@V*Arrv7%Z6)PJ70Vq(qbn=1lM?J>D$1)X${e~q zD8W9XhOM$Nr=)=3WX#3+RgNOv9Bf}BW7<${$(MF7(mE!=uH9yy%vOqDw7@q#`u(rE zDo%a6(Z5f2%R3ZS;o&;69K|xyS}cr)V(5{4CHIa5weA`JPU^>JEp1W~q^g5jHrp7_ z#v-el?rg~N-@NRoh|d0Yb-uHIXVt!)e|NR?Y5z{cyxXWO6~<-Rw*`3DP;D0_Kkr7D z5o{eay>+SqbjPy%vXY_!jPmBu{j+E#<%MOn_~-qW)>hPv=v%E*5@_S1O|uhl@q(qh zvOa1Fji4R9`7mM_85LD4eJykLf~D&?PfO#{=sT=odCw^+ze8W|f2n0+Yw`=q9GcG< zTd0=o^Y1h0|J*K0D`{}|fVRrnH6U0W+-2$d|6Arb)gpl{t{}f!^Cj77JszUB&SfP9 zRr#%I9OkWYbM;D!Ro-L%-J`1tqnf=B8CugF)fKf>g$_gGsC8{Eo&I-?JAfUb+S6;a zes$~8{c?|V^Ompm&DGIptKDWFWlyqKRH;E({?TDl#<44Es`4q|5_}bW=s3NA703KL zhqY=AZTHfb*v~FldL>p?RM!;98d&H_-MWDJ#Wl_Do08$;^cJr5UA?=fESv-Nl~YEN zVPDl86Yr91@J5XOF1brIGS?SNsZWsI^OHfSvaVTjRnMsbHuX`FwV%&fF>G(z@+fYE zcnoUcOly|~E%W0hnqS{?E27wAnh#gMu+zyQMyg}-PHwqpSxJow`oI!v)2|&$j;S`u zD2I@#A6Oy-Jl8cJSmyZ-r+K}Mr^i-DPRVomhnBJ7-Xqp8grEP=GO=BYJmjd^S>@IE z2L|RXudYm7a));M)TB24HMq3eA+?P!Q|)YO@kHxoEi0+6(a)=9&tX+cE@gTABTHxX z+yCA6G=1f_D0Jm0yxvjkKb7N*td71mvX9nIz1|g* zgQfVgzGJGKQfRo528M%6_nMCJL)M-ILgW`8a&SyWr49bgRwp5Z8CO?MRO&k5wBnZzq2HU2jCZ{@l*V@uR*_r%!)JSHIk06lwdnd( zYB@-}tAXKU%;3@3wTgHR5jnZtWb+xv`htao#fAJM^D9Z;4j6Io7y7 zQd{lmi&iVo($SnwN}=*UWr6gp3X~jQrNuG6+5ZYM_*-~bQDav)3Tw6Plrb9A(mQJv z=<{#rS5oSx9oJ0uxu}GoDb2o`79ndTBci0x5JPj{WPHxx;D>`*ZO_#mIDMw-?wdS3 z(A+n1ozqlyihnQln@=o%8KXbfkWt3%y(^(iUvc<+o^h)I?R^-cdl;(Q=70!i)S|*d znURb7_cspt|1{FQJFs5XMdh`2akjENXHs1qKY6BoQBi^KG!)gcW>V+`9<*qsh_Ctu zPgO6c{z$C3dMYv)?+*t(Xt*AsqM($myE#IlxBdh$9jgiSo_4EvzO$srK2m+YC!lk0 z&-6#s)BBFJVzQ@qxEc^1+8jwgtg5ST_(yi~sFnG()eh-c9x|xc)>^_tXu|ReX-Iie z7^jwQ_a7&lG#xCz^zn{zM->l-r)Xyr-G7#rn^?})zQj>fB966pR_W`U$CuET@F>m( znrkt-YEi8mO{?`tvNSPxS|yz-#Tz@H;d~npUzjC@x!k3soSW$Bv{lCQkWX*M1iRiw z8l}eC1q~t(@yN~FlG;-lDy|0hXWp*6#}e+BpjO>$>8XC)6wq;s{*c96Ywu{WPj@V> zrFNbL(ykvt^rFa=)m_-aigF$e#%gzmS@~tPa`35+ zV%5Mo8X2XxInk!_P@c*=s;lu?TF2{ZZ_ZLy%4Wa2MID2@vuly=UFUc=F0Eg6=k@=w zel7gyu05NJMHM_tim#?VzcIX(`yKmp_q(~hJh^CX;L9OUTwHHg4g8rK9@FfG>+`LM zqjb4;bk+N-WJzTiE4~_Z&_A{-9X23K#{UTUi={+QqawHXcP*3&h7Vq$JvL)xN#FW5 zG%DHJ#r`ktNjJ-g@suUO^C+%bA1Q71g30sqSoN!e{?YMXSGu_={@c*$I@j1DtxKhC zS@Oup5UF(>L&;eVng@E+K<(I|(%buobkxVEj83l~-h5aX>^Uqn7uYlL?PJU3py%~5 z`c`XWR!$q*sPEdtP^y83ti@SYiCO-!oxHc@xY6Ri6Qz6p<00h#ToB{3H*l)qX5O=j zcgT&Yt*)t9q7|jNaP#wvL-w>*OTW99hfWYqpL&gQc^~ zA*-=BM*6^?YpqjF;+>Uv75bVk&n25v6XyI6fvvO2U0hOCG&R4fW@RqVeZ>JBHJNu! z9NT^#&^m4FWuI2@Nlwr6g_g}ovo$w&t0118cpk4#ufZ(hxcv3!#m zXWk^<5$;Rj6^sdRY5z+J)XT5?_X=gq&@~=Ui2^o1D;%Q_70;U}M|oihOO*H++Lj<| zh0!Hy=@EIKHEA!loW92v+5r8ztFCRD@(N3G*AJnddk@rKgXuSy<};kPJqKE&zv_+A ze1w(Ppz@~mq;@oI;JxYBA#xep(D|>HPHh_|eQ&7@RL?~FcT}M_Ew+aDn=DU;bkHZX z-R?V@tH;~;rv`duwJ-~Om&p%t#q@C7MmH#Hs0W0peMw$l=kyC!O zkXO*X)hG8`yNU7mgVyDe;(k9x9{-TPx~oUGSbM37JFGdXW1WAM>b=vN*zoUPS?@J> z_C8aUZOiA?tH_6}edP6Z&xX%-Tfh2W#R~FM@5ThQZ%BXKy4u|E{*%^Xi+bXD>kxJ9 zY2Ld(`i%86O9S>ri#mDGnxb|crD^{88|#4v%u_=eUjD0fgrBoldj1Q>our$7#V0_1{>3JECiIHG-O}5f!8!-)-&E zuqq~C`>6j=)8i)sA{%mw1C~XrzyCI%zlysr;FS8G2LrmOw$BE1P^WeVJfbGu7hqRY z=J>Z!Pd`YM5f262uAX@)z@frbfHQ#M&aS9FeJG%hI;#SL8!oGWhWKB;T?4n9GsfxH z!!lwj-wZy-rO_&VB_~5Y;rob2aIjIpB zJz~fR4uyN+v+yMB5=#a!72br$VFF)B{s^;RWL%?rJ{${c;2c;FpMgi=%kUgL3$MUS z(4Q|VhsDz(aJ!R>EG|yLBKTB)GJyRO$N*-*b1)ZPfh(aupJ09q(_yy(6ad!1dUzP_ zhnL_vXip?QpJ?uc3GiE31Sbrn!q8d6#cnPx!E>-}5`703!)QL`d=_TGfI&1lbikeP z-|!^7H<|eGeHg~4o+AfSFqoIp=&pl(hEO1w15d(f@B*BdO8nk@>YUF-0^fw*4|Cu@ z;6~VSC|v>L;Zc|h&%rhDIb0AufvyNbQFC%n!bg9g1h12Oa>QxaSTn%$EXQe3?}#j zEQ9^V(n4@7JPdyauRz;4@{2Z^2EzI99Ng*T;zuq{!mi^f09*jW_=vR-CP2#s`V97l zb#MaQ39muEs50F$k--W7nN3&mv1|IR+yKspHSjpx4Tt3rAC^OZzB=0ioe5kVnbd&KYoCKV;dyu%UV>*}w^_u4J7EN$-Tob>!%nwR zWB3THhnL}D`1u@eJb+m=mjc4AFbBR1%V3vz%>Q~Wa_2EWRkI|YNkhbQ5fJenRp1|#^a_tAy40JP|Q{D_}q5~jD};Jg_MYk zDX<8xDWc@?5qJi^0WU$bgB!to7{>R(TVVox0%pMja6Wtw*1+&$3IJ>18Q6aj>0vSq z<9p(}U=DP?!9@`l@54IyH@FjyUrgV@1@Iia4zIv~5^BH)$em#XoDXy0y|4&A3hUuF za4*a(B_H@QJO|s}K|Zh^MyD|U_mt6Oe8JqXguw+Tms4VR54;Zl1S5vfmoNohg*nhv zNrB-`cofDgrOQ%HreDDSfdbKEIp{ zVTToz6!wR~!{{rR07F*N)G!v-!E(44Zi6Rbz$%&=?u6098Re^~Abbkezy??k`_^$E zCl{l*xBw@>>+n&SkY+M{4Rc`d8WO_Ea5t=iC*dJ@3H}ZGk6>lHlZwEnVJ`d-*1)R_ z^1U!|E%$+cfx+n}(`W0L|2bS7*g(ec!bbWCcHBgSk@OMFf@AKbrtnU<8!C7h{tljj zD>oB=6oapx8^iD|+!%J<%8lVvcofct=iowk1uojk{P(}bWO^7O0!H4?e1;q0d^mmw z(+55PPr_$+k`R6ggELH~pI|i1eUO%dFToo4cUTVt6a|C};C1*lOc~7*{4iY&KYf^{ z+0DiMzoLY2<}R8t(`0%TM#IcsQxKT6o0`B+;5m5mF~Y}~OuhEdLU1uGgFPN+u)zo5 zQTX{2j!f1FHmcTP`9lQh^;7xeyMQ%KSP3X7W5C%6;P}l&^z}~;(KCl!MsN+RgY|GH%={BA0*}EfaMOEaJOj@MM#Jx57M%D#>EQivC!BDOg203D3LO1s zS}>Pc0n=gM4=6Bne!%?S%SHc>XmXeWufszydZx*A>v;+W7hj^}@N;+$cKnKXFdBx< zA|6bDl`scB2+LpttcM@N{qP5P26q1|EdU4p&B={!Gnsz~a3p4@c!+v;f=+cfzE9 z6Am}P;Q1!gj2pBRbUwmG4Hp@Wj7s=8yZ{55XxarhATS5^`GEpL>yNYyTnNv=4e$!Q z4ufxJ@cu-L!u~KFPK3Gegqs4xPvBuV+po!e^LFO{0WQMwOr}-lCU+L>Z)tKD!TNwE z_hGon*5tkdKZaooY0AJRcRHL3i{L7_5q=K$LwlPh_a!(V2IuonEMN-!4a|Y@K~3&5 zcnI#!cQPp2Ho4CrnA2O?! zCU+ft6dr~{J5mAo42&+KYdVo191Ax(x%eck$$b)rb)kk1Mm0=;SzXBp&Vjq(YIqbL zgqL9VZp1G(nU=#WxVSqR!tvqU82$rZfl+-Z*dqEI&W8i~(NZuYzRB&p&c%2xf*0fc z!W1~Nf0MfgPKG;S!+<9D1^5#TE+M0VG$p(zsmWar^OI>o_LPa8o+LuG%Z{R{mWVDU^IMg z41ER@v#0@l7hZxF;7zz@N` zxp)m;hcl7vOdH z)+{Pg&A$n{jT^(~XOk~<#?B){F8+8sHK@UND`XJC3l1`XU&1T!Tj*a)%}SXSu;>ml zfT3kn046WtMlcVCEyGtVCmwtimcecnbP+6v`{DEO}s!B3mZZiD~ro-b^)Bt`8 zkHRj?7)&cnrrTf^?6sVhfm>FP5$v#%CWfP6*h*#-%!MD+kq;cQhKj(O@Fr|em#44d zKWqSNRx$rSTT4a=Z>}RFxMV#yT+KEM6W~=iA9mkB%fM2&8-{J925=p`2_1LQf_1C| zunZo9_3$US7v8do3c=UlbvWm42BmWiXFV>m;I#W_A{e)YjG=-T;5m2`9@t7B-bq)$ zTv&fUH-OKthPCP1Bwu6Gew_!beVJ8KEQ4iAMYncVm8NtOhE^=TaEP~%Z z#B6}mAEsdISTcV_Q^Ckx+z7VWO~K%AAEAZTvoJkM!QmmeAASo@!idL+2Orx*O*gQ2 z9HBt46xPE{N0|S6x%dL%9E^CGn!*|wy^$sPC^dx}U>)2Jcfte}+of^V>;Ys)eya3bRAl}_3 z(`Hx%r@cu$*!3;q!N5}tzI!OpX$lH|fO}z|w<##BgBRcx7=15;5vId1wX}z=w>dCa zZSP@AH2=<`PV}(#D|kA%(alKo{ld7K&!50{jc%JyB{|p3P1C=L->#Kjk9`F_#-K-Y zy_Y{f1gq=_TR&$m`K1}cCBIAjS%%)Jm3|X@DSDSydYB)F2K1;_dII`N^scS+Ec6xV z8OHyOk3e^!hquyG z(7!Ux+#_ybz);!|?d_jc&UycYJ-x-@*!5_^84m!V&16<-=>Bl<_}RlJ?b2ZyR` z;kZy$DqIk%Hrs9e%pE$Ym+ZF0?1BzI@4Z|rJ%Vnmgmyplh3I{~g@7q?KlCLXRD7f@ z)%qOa{neKHY+VB`ARq3a)<@bBqb?$6NHW@XgLwt5tN)@wLI8htRPRMntiX<{iTLKQ zjw(J1dtpa4J&M7(uA|xZwt)OO*iPU?t+_YYH-gC8D%jda+$@@0c9EV-gfqdU$}9%-hmHh9A5RNwcLa?VFz(nXp3+EUYQ z>DuU)YD;?vq}%orJ^(#Y1g)LQeC;IZ&k#PMtEwWsc~Mujudl6Faxw9lG`^qQKRpO9 z3_aMV>iOrQ&+V$3NM~NxRfYGX{x`d-%zpIGH{Cd1N__3UW`?AmI2~LeUHk58dq3N# za7Xu+!$tZct1Z4#cXgS3%!9&JcnrJ{uCj#@J=Cfg?vvF+JrQFYm)t#~(VZ$;bDtW| z9Gg!;hoWn9d|F881a!%_27P#h3Xdh9`y*6#tZlOSR4=tFmiz|vRwqQi*jrtTr9Gaq ztN1wVt9CUv4m&MUZI2_~=16rUj{4pksm_ajGE#Mnho3~MY-oKuveEsNnzVp%^LRYt zW>}Ou5^qZk9~9NHo?8F4$2*Qv=Ki+So}&rZ`cLY@Pr~;TJ`jD6j6?n*QGZ*HWQ8q# z>-|ap+$7$w(c`=#l=NYYg#Fx~{LQ`ksB8UgiPjN)8r{ED?eZCanF+Rj$CCTps={`cYi|+Z!yt6S=T+mm=4PZN|3VPP~O`K@#!K4zMMe%lj&GqV0C`_P(khk@$ZkULx_&kZ+>&b3b)W z?DqXs{6NCf`>E-|yZfnC1JTQ3)Jp?xi2>JQ8r}Dr)Z|!Oq_QR1BF%$iReTZ|ERI!k zljz`o#j1V6t#PU;iH>_PPK6J`{!^SP6}F34M+UK&_lj?HGcL7(G>!oy6_)p%q4Db4 zAZ{EHufmgU{W2?wH_sDqgV{XOJFulwjuQWQ!X>Rf@C&@b+5nW-p}&b&>ys&8oBrx0 z@-rv)SLc%{$Db2a{9s$ZsNeyfMO~jbIo=E;e|asMHb7m@u!Uz|;d&l%wa(Myjy1*& zW)`m}e3Y*&b>3i;Ou_`h_YfZIr(WsL>htYjTOad1iE8sKTX;Y{fxk&q$tkpSzk#YW zg@O(rsJ07N4OB-`sKB=a)n&r_-jc*)6uHS5S&7ZFy?2ojxSM@{HQ{cxWDX;E!4O*y zbLJqmYKSd0s(MhPJ5$o>h0idiOJM3gI7q!mJoE8EDkznXYnQCzg^Q9^cB-vk_}`OT zu1Gm#b%}IeCacYU#oPq57N!(n**P$z)syCFpbvC6ox;wVgH=;KY zpOwq^lO=jL`uFJCsGb=TS}$(RCd-%*`v(8g*F(CEeltYn4Yzd&4wuj zz3b3M_d3yYe7={spM^n`@%4~UH89QA-Mnz9%1&ddWDQfR(rn|*orbFuVy_ymuB9=R z>W8cF5iG(7hX35NJ=~kOPUx*$=nVSq;i_r`i(g$D4+u>vB;VFcog86{u%1QOp{=qH zrQ4FMokldet8^!3S~{E2q!Fq#o%=p8Le0$~&B1hAp!tmv>PR{}|GPv^H`G*GASV(x z9i4^W_mg>6g#OJ46*Q8CD{_>YJCaJZzeQ~xX`5yK+b!w~?984So*hq{-@au*^Gxca zXhFg?PeTiz>Ye`DLb;#t_8DsWC_IUM{~;gg@tefko1vZyxQoB3@cP;o5OUE7uHPxuiYh z)&E?=wT%K>ekuH^LC?ul;Thbw6h^a#o(5VWDd?Y|)8oFM43ix6OX#m@<1a#W%(C?gaO5<)=a|)<)4A)UEL(r` zvdL-{0p>?1t6fVApLEVf^m*um ze5&rI?nbXczn9tX*=@3!s&yfuqeB8&?@aQU!(WI{C<(P*A5ZukEnG(X1;Xu98{My4 z)K3#^ebjSfZ870HW;D99eF<1xxXy~_P&Pwd9&78Db~v}uJ;D>dNk5#84@uH%Tu;1r z31^YlZYYrSd(q#^RoUYhBBq(D3ie8!*?fqUc+&R4oN4EwclA@Bme|78*>N_zIeC`4 zCJFOrsqpbM`PENVnsEOtHFrE?==E7@^LSfozqH#L-7iW`<3qNY&CmJ9ca~(%WO$qK zH%;o!G+STQc7m;^dE#spKY@&P%vRYGaB)AK-RS;KEh)o=d}0DO+&D*_p1=*7(IXVz)?7JGF0PNe-JUh|0V`AIwNMIWfo03fXplj{p2@_quFL@AMTcHiQd~PCos%S+aq2ek_UF7qVL+Bm-FzBx> z945NeTbM|j{6~kxZm?#Bs9PqpCvGWGb0_1ytSnc%Cew(OOV)rAuS`Q{p)lYTpz(V=>{f2zYNt)1bf{6&r!fd- z)Ts5s>>BmbG#dY<8r3w7dVO1?qNYPrt;(KGc(+=$YC7q@u2n~-(++>DRp$wJUaxI* z50k=Z3(>R?JB`dbrEQyaLz(-_8r`(DC%l3X{U>$UO?WTDnZ=&)(iY+JWlTKbvWDpS zuWAu~VW?@0X&e!npBOYBVB`ij$sm_-;K?8-#J*TBpxiWqlHajRotQxdPcBo}W>8`K zauuFS1+$l{v|JiAVTIZ(_K+27pK$mJbz1b26)JotcEt*nHj@)$?FtTB`iXJvOd9;* z6>8T^;)SkMmuHfH(n=LRi}>*?RoX1<`72ea*lMMmVS1TgS*iBTvZV(6du5}0utjZ6 zW#w*jn=NMS`8v;Xp|$Xw7A>%!CHrH-wMPe9c&;yeJ{3Ge`1^$SP?PRr{o8&UJ-Bs^ zdha$y@WX3V&}<5Lc#WDn+m@JYzO$wGCL{7DP2aetr7jH{Hj;N0Yt)h16nxX2>ildT z>6{|{DZ=!gGQZ_5h~!gG{3_mmH$U9e_qx64cR5w|9P)X>sY>VAQp4XM-Z;s}^OG46 zHVVhisgBH{gEp>JU(BHakFHf6=i+enT<39lwfdXo=%M{2oqP#2X`L#VOS<>oR-5N? zpI@z0`-JbWQ>W*0zwsLy-EAZV=>;+{YS?*)ZBXI!xX;}iRQ5dD?X!()^E_tA;jQYu zdE{rkUp37mpDy>S@cFi0&cORyJ^+_?+Mj{rh_0QNwDJ{ti>J+yGlWO{m+&iu%ZEz% zjh=R0*dl%KXdFR3e8w+ENFYMr|B!)nOb+2OgmXmD($6P*`rIU6EDg9{1udZBmTf9~ z0Rv{J#zb{+0dDvm+tiT-)c(dcb$)>yU>^9-rL4(= z3wEmbh4gU2gQ{R5Lwoc?YBP4!7pl=+-CU%l#v-M&1rK>xeIfDl9#%p5wsF=+f5lT& zHEAB6($ak1H9fIQZO2CFQNR|x;@vugVy z%GLfkbwU`kPhDF?xjx;m9nU5o&0*u%|MNF>=g=(&e*Prt3VJtm%~fJN-%44ejr@5i z()obex0um&m>rB zPw_0k(@T{!QoGYeziff8m!$V2n9IS0cjw$Vhys3AX^XUeg;1i}jkHCpxTUt3em|XQ zbZ_$A(7e%`Lju|vGAQ~ZPmKLkNSUpRs$Xgg3(t6`<)bYb5AsRkuy@pvr8Hv3JL>#W zp2<%k9!Ck5LKz?PdmJIa~0zu?N926F!nulnegnC z_gdaBjPx6C!$U&XT<+WShnb@9M$bgoe0^;BNk!z##`*85xz)DBUh)m6HczxriU;LO zN9+4M_w!RPB+=Q&s%?YAW6m|YdwL=Xq@qP^-U;VaPz@E$J*VP@cb!w&HH?}ee^%RT z7&V*!+~|JXq+Ve}sY^As=rOx%|!K#4f7;#S4j=7%;iB1;YZYhY-Vu7GFzPa zxsTNsq%*(qu?k<#%y08q%L>UDxiAl}2i>gJtd?gJ%XuJm7WHp!Cmw?@@z6+sVN zZdCJDp=|xGQ9aMaVAJ<4r@mI?JQj_sEgwWm+igVu{3=CWO%9)3Z&a&S+s5`e{!c!k zB~;&h%=^5pExnh%ka6>`M)l=t+Yn3YzbR=QMIOV&h&tQI9#MQ^itDN+b&^ho{1uYi zdV?C&+4>HyBLY*v_mk2k1$F!PR3=FNu@cNxlWT>$SW4NH@|6Kl^LX4J^Fwm#Ok{hQn_^~hS*=XGnzsLrZ(t!04r4-h6kv<{d4e1HmC zXY1Ezj;+b}C~$*$rMLC9>Ac^;;mFpcZk=xH8zhZ;0ioWe){`)N3klgBd_M_~C^nhi zw5bz>nYokajseDAE|D+}A z2tUiGHXF%r9bctvq`w{rRjW2~2E7s5)MCMt(HC99r`e(E^hWymlMX8AF6i#4vhT8u zi@MRNNq@+Z{8d`+h&)!^{|c$ckz&n}&t^rtm?v9vCg zuVhovA6D(k7%uZSvC}+?ZS%wt6!GU0@wRkUn>X2t1A2C8a_9T0$t!v2+T(89By&Jl zReCoSdZDY@C9LhHPTx&e_YH4yA5d%L;cWapRD698HT@o2@#N2XcnZQ}Yk6m^O~WM| zqR_Qd7%$VZJ$e>;WJFVotwS1UKKd~94W3uRJ@3U&SlzS9UEE#wWft9Qi%WYTwaLvG z^$Z?)QjV9#wyq5x`tSq7rTe@;X+rr7_k5~4eJ?c$7^<4?rR3d)s?vJ)m5j|yl?l8l z+f3loL)EIyjC}XdCjHG9{UMu!^mkYVADRwTM+ncH#7D<$JMzf)pr3h~Z(L~OhIpF@ zkCSk%KNtDJvykctzkisDx{v*7$rV`=D(wka*<0kzpp8&s-uFP9_N_cgoD&0c$xvxqx$nt`Rq0mp{p)D;#8z9skyH4FIacc7`APlKIYH*3 zXN#tfSMepapVV(Y;SUq;&=00P?`NDI$2RLxw7;dZjuP*8=%Ecu@3%Qa)Y%{XiqzFd zY)d1LF{kELGu`&s{GDIT$Xv->oiZ?4w4 zeyv8QDNFtZ7eDi(I){4r{*$_$yU`*w&UNqT9QLlx)N?vRKGb>m zW1WTH=zQ=yp_8}T*L2~4{L?XhgKRo)dbqirZijW#xvjU($7bowuF_fJ)cMs;o%Y}8 ztpB^tGyl*z)Su@D{L*_u?r*x$OBWo^=zRA@oqK<)v)56bue_%7>o;|_dsk;*yzU3B z8>%xhUFX@!I`>b}nKxbMf>k*;+e^bbIT{!WG&L^MO+3uLm9;bEQ^|{WROFBD! zrE`4Xc&$bYdg#;){u)1KOqxA*WcQi-j*8FZG?W` zZoJ^$ZyVaiGaIfRQ`rWSNw8VWR~G4czM@VW%)nPv&;deU)kAN*s_*haOfd{d8}qNcq-o_js!P4%Z|Y`y-Y zg>~Ak-4*G>ZQWMO^=g`cgJ0Xn+SY5}S6EgUwqd$vTFv`EcP^sl?z{bdyT5mS{qO&t zbDnda=RD^*&p8)c(-g91O-Swffp?{3%p>ZroftK}1v-$drG)Hza?8EFBm*HLAz$P@ zc_KpFr6))H>Yk+IwW7a)1U(trPq*@GJ&B@Eh7PQ&6k>$ny59>CK08CTglxwMVRa{j zp|oB9WN2Vr0PWig{Yf9FdbKW^hV&vB8bV}W-CUF~piJFF@UpZ3Ia9owtA`ETDL&E+yVLOE5_=LFf*?{2=>HYam^E56EA;lC7l7| z+{U#5XhPQx4I!Qnt1gJnt}f$_!CRrfx~bw!{WiSBo~*hm7}tJ}`6%V;Cga-scsH#G zU3`{GwIcL2iq$8LYyHt)A1u6C_cLAWJy3>`8@6%lMHBH)BppdBDCszbnbpT&mWQ>^ ze`&3IRhMgkI@e(Cjsf~$ib;&sOPn6kKj?t2j#vJQ9>M703gmNl`qwK2SJZPKI4vfz zo_oQG87+2D;_~DEZScjT`lxa3F4*b{-I!?l_-=8m}-{$OjAZ4(7`TyI4ud`CmgMw(0y8D09|rGYq6~%n`#7P927j zfS@f?uuAp>?$qs5h$nFO*Vej0y$1O!8Vt?@)qk`1LSxYDsl6T^L@!xi-(oUq26Bf( zTgr|pq^c>AyQ<#f@zkfG{jG>SBA5F`)V+Gn@<_ja;JQPpBk5&p-SyPTyf(oar{T4w z)6ATnn>N;43aIOtb{7};Zd$lG&a1|-W$zS4-K$_#-7BiP?($JzxEAW`X4|W}tvk{q z{ynCzSl4Agkis?Xd?SNv>ASbDmb0npu)wRoY!2tefCKMy>s~*9@CiB^MmSsHf<^8r zWX}*hI^O--I~rfMrMx!vz!Xw5Q*yR;yskFA{>LK$%E<0_S|tjf{^swaIeqZ=YEBtn z%>li>zn#$V@Fb;eX(?`3?(-8o08{eagdDzB~lb+qz&ioXt1UfcO=i1K=l zzXm9;NBC3*+{RreJH>HlI*razP>&&HhgDdigRkW8?h__2$1K>y zgTk*kw;mLVIHw*G?l&Wx9^eu4;HNNMMBgUVR5#6?Yaix3bU5WQCWhd9;cKhB|B#R^ z@O~jjgc+PmjtFmX9)46P0LxDw6<$>YQr;3=T=U=F612QRZhKo8C~yb<;~k+`%WG`! z3-y$KX=R4vf~g-i6%W;ikj$~ogX)nd+2rHGxKTW1SWLmZaR3^ztjNUPJlYZYdu-*F zNM~z?yB0z*5b^}hykuqDjtiqh*3?fSF1~|8sxJ8E*LsfC^O~BOqAO8!2CjMLLt)`i zo-3N{`b+NG8v8v+RKcj=`?YgZEqLCC=3<++3!CT2B!sJPgb==De0sJsanx^ z#JlBPnI`{{nWg|w;8s*P4|)Q(aXyS#;Cu-3L5lo2c&tyWAnE)uT0;OE)hdMZT;5A0 zO|BHN=0WkW)`YT>II#Kga|ViMk?F3&yoM+=xl#-b7f`6@LpW2q>bYUgl*^vLF0V20 zQ^1>6tQ$d$AU!J!sO(g(MKR;5B5CM2`w}6wthH5`KeZMPqArWcWcN9&RSM8ub(Pxt zA}!h{RJ8={=0;^4@Fja=kjEao&Y$+r^J`ri_>p>!Rk=l8$sBD$DiRqx+$P)~4uj7> z^)ey(wN)1q_DHY`Iuc#}RbL2I*R;#^F5jmU_Ol5mgfQP2G$H_ec}8G`CxrXP!+u1k zVG#84DCPQVGEF8-aL#^AttpX~{nna|wWRTt86dcvOKQ$kn{MEK9#f=~*nYVT^`s&?;u&q_w{N7YrmapQ9k zsJhzQxG@`^s^`@>(5q`uTfbW^tU!7@;4 zgo#-=q`D7KNLaDvXwN$>L=5L8=YB#GNm*Mx_fPD}>L!O@=bx(F!i2%RV$};Z2^riW zY}aWa5($B|pB4h6(c%(!!(#?lN-KAqE9Grv1w^mMJ8PU*YW79IOvR|7XN0-js1;{~ z8T^hUTy!OgO7A3tEAbWwAG{6+V?a3g!hUx7jIa)iDX;oSh!zH;rzdbdR?IbcJKnJ= zTqC~Y#fex(cBEa19i)h~D*HmLY6y*U zp?5czNj4w_W7LYXLMRWXXU_`3eU#A^0|L>B9XKltHFRraU!E1h1G`JyxX$-nQw$AU zFydojXe^reLjDFmxv>r1wcIkLz7F+D0UH$;JKk-@$HIW|Xy(7eS}v%(c`ft=uJul{ z^S3vAtqx|tTajk(ek}C&+II};`ohP8Q7>#_-<=m?XnLa@{e|#?5Nbz=oX#{!KxD_C zpC;rq_TXU>%2i?+3L4p^PVBbQMmFk#5YxXB;+?yBYOSqB42y10__H_@ettpdtMOlh z#-6S#8`*PT3F#Dk{wrZ!KrLF^j-EV!y3M$*9mAj2KHJFFb_rtxk0EKb9cVpz=Hs@O z)=$nHJ=1)0L=!vKC5)gO8kwg{Fw^yoY}iF1$$x{QB22XowJR>-AY9)lpT8&!7b3Qz zxvC}I&CdeND5j%iBOz^CUfpBZ=0-N*k}xh}+wH&M(Fz3xk56Zy=W8xKq zRyesqJ8v;)d!u~sRpDXke+<&YkGn=vM z7Sn>Zrq*yvv;1~%`hh^(Ti6yq`ZR57VdMJHuOQ8a8R=A-*eq8V=?D$AG_x1(qLDPM znZ0`#-A@ym<&FL5BFZJd38W^vxrGhxPoJY}TG$)?X=Cpux0RTiPx-zBfwgzj)dNWr zwpOsI7^pZ^QI z*`_UMX4MjXownD@<3nk{-GP;8i*4%oywl@3AB&{!Yj;|3Up&LdmxF911QUm~8TwP|=FNcr^vh&?hK&r^OgQ9EKZt~k|AXPQ?lOM9ff#Vho95701>7ijqHhoPTfGZ$z{>8Y~4~LZV5)K#RuHI|* zG@*TE9<88`jWFO1e{AaAF?iIjuSF9v?n)A>4hU7v!rG>a3wzdanSop;2ah|7thphQ z1QEDTJ%a8ej0@w9A1hr%eYn*t7f~m-T3G z{rX6BnYe@oJ0OX#@tLl{$g{jX5fz^IaRlIf-c9fA%khCTW(ohUL|?)`LTkijHR3_u zK{-G9;eviuEdd$x-CVmr*8)56fxif`-T7Eg*G_k*pE3v5x`g_ND`M0xxN+wQat-FE z!;ej2enoTy7p?Z#OR6R+R=DnV2Kjsv$G#xvtfcw8rumvi_{(G0BzR`|x|)E$Is>oPvrmiY_`VpIx&o^C_|9NX zEM_S+8BkOXSUGbkeS`87HmH;?3FFcgJ5;whzfnY#v-EdZPM28yyqmpPN@q)-C^HCC zXJD)jgm1c?tr#El2p#SZsl%`nUjsW1Yuj;;nEePnXyD&F1Ak7FIA{Hw)`Oo}K}&;h zb#cXa^vBl;-_^Jyq*Y&eV?7LBzk)__N9^K^Z=!Q6C_aTQS)W-&gLwVGRmfDh8XZ|h zEu8zTrfFPm-fB8X;GdZML!?&a4Jxlud8NvgD%({qQn^6oJe3!yoT>6WmFK8DQ{{A( z9ck)|Mdd`56I6~@d6ddADo3dtsj^9BN#$UbgH#Ss*C-m0*}6aIo)v03HkReo0GO)A%_yg}vlDz8;} zjmj%ku2k8sa;eHiDi?5eV1{{W#R8QxRZdsgqH==D@hXo}IZEY7m4j3cP`G{rc8$9y z-63+tby}qo>0y3tZGG*X1e8kUa-t**+ySwH$U(j@_j$7rzX0|}g_4>0-xS^;8}apg z!GNRNasZz}QiFk|KTZeE|4}#dE#10mdb%};_|V1G+|#b;_JkWy?lImI&f9OK=GyvA z*kCP>(>acWn@vMbPIJ1sfwR1tT%);xp5uyjcHahHMGLa1r=3gXb1D2)=eY9#BpNU% z{=~Su3Dc?gVD~Z5%^hlX-oulIdU|-m`B=4mZrJ1rFU6Jj#VUGOboA|;OnMDUCVDBE zOpHh-d!mxbnAl|U^Kr>!)TCq*u_&2rS)5D?UQ8w@KT9Uxf0<0&1`8=2X(3VZ7V`J$ z7P9R@3pop{%CL~jxfYULWFZNa7BY6Vg(N;^A(nL(avk_~gN3Yn!a`=%T1flT7GmFQ zageT;A=qvqA78f+p;ro7H6(>R6`w+Ws7xV~R;7@bjVWaG%PHjI))X=!HkG_MA(gC6 zOeKcYRPx&NR5Jg8RKgxgC7a|_;&(8W{PAci$vl-x;!mfND<7qj%X%w`3$~I!g;+`M za4WHlvy$0!tRyGLO5UpMYbDRGK*LHaVZXDIKfY#V&pGL8dd?~j`X&8TsFMU~*9LlM z%&4&=$4Zg8B}=k9j?1{TH{qOe4FODuLE-uNlMe;|KlxHio7ns@pyEMgYL_f^{X6>i3t71jAocvqF z*%Ch;dnAX31V) zEB49FUlhHh5YjMfc0o>=Eib)rVHmqOUXR4u^^WohQ%8-G*F2$#dndTG%(gUV zi7h%ix4@RWWRb1dR+eM8VFY_w1>2q}7KP+Xk#`pIYLy3Oi8H9CsNBXD%oj@r6qZDn zRM<-^?2-9qAFM*r!kpYCktGWkvlH{h>2hAScwEnRF!4yQC`mPjz4xGQD9dt)+48k# zMQ5K|Tg>twUKacHHgy}Jn9Cpeg+;dP!bQa;W!&EU9GD=#`I`8MfqfpM^=B7-wUWPd z+mH42(+(YeTcwm;8W~|j_XxAk?M*DENgT%h8mcu9xV=f~Rh(Ct&xBBIKj#0Y=p(1? z6}R*mj^Mz8+NFPGvbtvM`cZL=$cJLF|Dzqq3ZK)z%D%cs?8W>K;xTBa7$`@+B}QcV z#>K>r+utW+kkBDMtH*159<9V;xs5rCPhdY@4*`cR38**YIV&d$=E6#k{qCXH^Pvgc*LT-{1dh_?`y#RCru zzq~A`wA5A>otv*pRpsl##s5o+L2810da>>gn%>^Muf#FyTB;kQs$K9wtwIQ8!6opA8oM zCwS|^yvYi2Gb&1om^tfy%Y(^tvZp*a!;+qoJ=KyjW6spnsVTF#dZeR5TXcAN*aS9X zi+<3s@r!skg@u<74@1}J2(wulF#@T*C@0q@m6zgKE-f##7f8{p@+DouB<#bUoQU!6 zWWdj6CC!|fGAlb}-kg*fvyoq+c%iZiY}YPbBD?UC?tX`@GPkHA&z4=9!;g&ONS=Dk z${CPjFNiKI&skVrQdD8Lc^kYF^qvP27xl3f=c&PptKK{V)@R(=>KF~IICw!MTYP0SoUVL z{_fy^H6VLniN2qqTO&)->jT+@mvzB`cXS2o^3et{<5pcD8-HEv#~NPNrTX74$sEt= z2gnfm%>=gi2~B_Bn@%GiCQR4$m)kzkJvHgJJtD6O(=$_0ZbiAhWa+|+!lFETPWcj? zNsFWS>ax&gae&tQ+SjVT=J;oVW_1N}m*!=|1wjA|0l7m{8 zz3|cO;+&=YocU1`UlFxWKJq17Cg@68SAtHjfhKlQ)P=DjZgDjWeOMF9_PWK9eIvq6 z;gJd9<_H9_sjxW0%-XfOAcs<&s8-_)#cAZduW*YM?IT7=^Z?+@+2@m=l>19lktkxEUGT?4ycB zV5|r!I$Gj(cs++gM7C0=j-hN!E{`!X=3@vxw``1YC#$3t-9sxqe7s{iCiW%86 zqwS^!2@$WfsJ3xZPL`W1f2=dwD|cfTcCY`cWC$8D+`>VRNv~-I}7j# z>Dljm7UecO0_RTBKK7i2MK-7`x0N~USOi5l3J$sv=oztDQ8$(1ZYhmK>E=18Q}DWV z74Bc&kj}n!3W}d$)Qx5(x*bbx+yP3YVV+z_nFpT>2NHJJP|3TykRh=TrLqcyKGGGB zdsP*`>e_P(i^`?KVyQHzu&g}t76Z*vUWqak?<CUs!ZGs8Qk`HMu><|JX5G#|9@ma#>gzi1XUQs-qY#& zD?{d^Wahq!kRon4-|KV5HQh!iBI6$&q1B8btKkR!tU|3k;cz+wl9BkfOl;1jC zMB<87$cR#enct}+B3STLy{!*lq8?@Ju{+d#HdXJqUCuU5Kl-*h`Pb9*^03=ZPKJ{+ zR9;u1k5AU~zk?>WTjj&M^`S!lO#IXP3gB5_H_!zH?3aJoqmL8t&k}^Nn7#VaCu0mR zZ{DlFYr@PfJ+D-L0pIBf|6lDoZmQe%y`BVI(i1!CyMOyoxA`*vAMPAmFYC!p;0VwT zTm{5`=t+Oz9v~h_1?B@~z5K&kOve4mB8b`2H+WBGw=$q6KDe71&#yl4m`d9E(1RRx@%Ad1OZ_{6c7(g0n&lF zzeVE)7Lg7yDt0rMY@7ry>KDPSP~pNyA`pBgYfAztK$zv<8D z96T5OKLUST{jmYlQ)bObNgo*(omW)EqdNdH|0Ov7TLb@_<08WUOEdfT#+~#NUAwe= oS#Fu#yD*VmdU@|j{WRLgKaB(fwKypyk|u|q(SOAMEZygS0Txpsv;Y7A delta 16582 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 diff --git a/3rdparty/bx/tools/bin2c/bin2c.cpp b/3rdparty/bx/tools/bin2c/bin2c.cpp index 8aa1b9f9142..47fc3bc2d22 100644 --- a/3rdparty/bx/tools/bin2c/bin2c.cpp +++ b/3rdparty/bx/tools/bin2c/bin2c.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2011-2016 Branimir Karadzic. All rights reserved. + * Copyright 2011-2017 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -95,7 +95,7 @@ void help(const char* _error = NULL) fprintf(stderr , "bin2c, binary to C\n" - "Copyright 2011-2016 Branimir Karadzic. All rights reserved.\n" + "Copyright 2011-2017 Branimir Karadzic. All rights reserved.\n" "License: https://github.com/bkaradzic/bx#license-bsd-2-clause\n\n" );