From 05ec61d0b0a341dcfc38056665468d21f33e7f5c Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 04:11:35 -0500 Subject: [PATCH 01/19] Banish this file --- .gitattributes | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 176a458f9..000000000 --- a/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* text=auto From 2f2e1fbe8f89964cf45722016ba70534070fb92c Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 08:05:47 -0500 Subject: [PATCH 02/19] Major breaking changes --- autobuild.xml | 3298 +++++++++++++++++ indra/CMakeLists.txt | 76 +- indra/aistatemachine/CMakeLists.txt | 2 - indra/aistatemachine/aistatemachinethread.h | 3 +- indra/cmake/00-Common.cmake | 53 +- indra/cmake/APR.cmake | 42 +- indra/cmake/Audio.cmake | 7 +- indra/cmake/Boost.cmake | 7 +- indra/cmake/BuildPackagesInfo.cmake | 11 + indra/cmake/CARes.cmake | 5 +- indra/cmake/CMakeLists.txt | 9 +- indra/cmake/CURL.cmake | 5 +- indra/cmake/Colladadom.cmake | 53 +- indra/cmake/Copy3rdPartyLibs.cmake | 244 ++ indra/cmake/CopyBackToSource.cmake | 16 - indra/cmake/CopyWinLibs.cmake.in | 181 - indra/cmake/DeploySharedLibs.cmake | 70 + indra/cmake/DirectX.cmake | 82 - indra/cmake/DownloadPrebuilt.cmake.in | 45 - indra/cmake/EXPAT.cmake | 11 +- indra/cmake/FindAutobuild.cmake | 43 + indra/cmake/FreeType.cmake | 13 +- indra/cmake/GLOD.cmake | 10 +- indra/cmake/Hunspell.cmake | 18 +- indra/cmake/JPEG.cmake | 5 +- indra/cmake/JsonCpp.cmake | 17 +- indra/cmake/LLAudio.cmake | 1 + indra/cmake/LLPrimitive.cmake | 17 +- indra/cmake/LLSharedLibs.cmake | 8 +- indra/cmake/Linking.cmake | 71 +- indra/cmake/NDOF.cmake | 13 +- indra/cmake/OpenSSL.cmake | 7 +- indra/cmake/PNG.cmake | 6 +- indra/cmake/Prebuilt.cmake | 64 +- indra/cmake/TemplateCheck.cmake | 4 +- indra/cmake/Variables.cmake | 93 +- indra/cmake/ViewerMiscLibs.cmake | 2 +- indra/cmake/XmlRpcEpi.cmake | 14 +- indra/cmake/cmake_dummy.cpp | 36 +- indra/copy_win_scripts/start-client.py | 24 + indra/develop.py | 941 ----- indra/lib/python/indra/ipc/httputil.py | 21 + indra/lib/python/indra/ipc/siesta_test.py | 21 + .../python/indra/util/fastest_elementtree.py | 1 - indra/lib/python/uuid.py | 21 + indra/libpathing/CMakeLists.txt | 2 - indra/llaudio/CMakeLists.txt | 2 - indra/llcharacter/CMakeLists.txt | 1 - indra/llcommon/CMakeLists.txt | 27 +- indra/llcommon/llstring.cpp | 30 +- indra/llcommon/llstring.h | 35 +- indra/llimage/CMakeLists.txt | 2 +- indra/llimagej2coj/CMakeLists.txt | 2 +- indra/llinventory/CMakeLists.txt | 1 - indra/llmath/CMakeLists.txt | 1 - indra/llmath/llcalcparser.h | 50 +- indra/llmessage/CMakeLists.txt | 2 +- indra/llmessage/aicurlthread.h | 2 +- indra/llmessage/aihttptimeoutpolicy.cpp | 1 - indra/llplugin/CMakeLists.txt | 2 - indra/llprimitive/CMakeLists.txt | 1 - indra/llprimitive/llmodel.cpp | 2 +- indra/llrender/CMakeLists.txt | 3 +- indra/llvfs/CMakeLists.txt | 1 - indra/llvfs/lldir.cpp | 2 +- indra/llwindow/CMakeLists.txt | 7 +- indra/llxml/CMakeLists.txt | 2 +- indra/llxml/aixml.cpp | 2 +- indra/llxml/aixml.h | 2 +- indra/newview/CMakeLists.txt | 416 +-- indra/newview/lgghunspell_wrapper.h | 9 +- indra/newview/llappviewerwin32.cpp | 62 +- indra/newview/llcommandlineparser.cpp | 16 +- indra/newview/llfloaterregioninfo.cpp | 4 - indra/newview/llpaneleditwearable.cpp | 4 +- indra/newview/llvovolume.cpp | 2 +- indra/newview/llwebprofile.cpp | 2 +- indra/newview/rlvhandler.h | 2 - indra/newview/rlvinventory.h | 5 +- indra/newview/statemachine/CMakeLists.txt | 1 - indra/plugins/base_basic/CMakeLists.txt | 2 - indra/tools/vstool/DispatchUtility.cs | 271 ++ indra/tools/vstool/README.txt | 18 +- indra/tools/vstool/VSTool.csproj | 195 +- indra/tools/vstool/VSTool.exe | Bin 24576 -> 24576 bytes indra/tools/vstool/VSTool.sln | 40 +- indra/tools/vstool/app.config | 3 + indra/tools/vstool/main.cs | 1462 ++++---- install.xml | 1956 ---------- scripts/install.py | 1205 ------ scripts/messages/message_template.msg | 4 + scripts/messages/message_template.msg.sha1 | 1 + scripts/packages-formatter.py | 105 + scripts/template_verifier.py | 85 +- 94 files changed, 5594 insertions(+), 6149 deletions(-) create mode 100644 autobuild.xml create mode 100644 indra/cmake/BuildPackagesInfo.cmake create mode 100644 indra/cmake/Copy3rdPartyLibs.cmake delete mode 100644 indra/cmake/CopyBackToSource.cmake delete mode 100644 indra/cmake/CopyWinLibs.cmake.in create mode 100644 indra/cmake/DeploySharedLibs.cmake delete mode 100644 indra/cmake/DirectX.cmake delete mode 100644 indra/cmake/DownloadPrebuilt.cmake.in create mode 100644 indra/cmake/FindAutobuild.cmake delete mode 100755 indra/develop.py create mode 100644 indra/tools/vstool/DispatchUtility.cs create mode 100644 indra/tools/vstool/app.config delete mode 100644 install.xml delete mode 100755 scripts/install.py create mode 100644 scripts/messages/message_template.msg.sha1 create mode 100644 scripts/packages-formatter.py diff --git a/autobuild.xml b/autobuild.xml new file mode 100644 index 000000000..a2f0eef8c --- /dev/null +++ b/autobuild.xml @@ -0,0 +1,3298 @@ + + + + installables + + SDL + + copyright + Copyright (C) 1997-2012 Sam Lantinga + description + Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer. + license + lgpl + license_file + LICENSES/SDL.txt + name + SDL + platforms + + linux + + archive + + hash + 459cdc8d7c19a8025f98f61db95622ff + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/sdl_3p-update-sdl/rev/297546/arch/Linux/installer/SDL-1.2.15-linux-297546.tar.bz2 + + name + linux + + + version + 1.2.15 + + apr_suite + + copyright + Copyright © 2012 The Apache Software Foundation, Licensed under the Apache License, Version 2.0. + description + Apache portable runtime project + license + Apache 2.0 + license_file + LICENSES/apr_suite.txt + name + apr_suite + platforms + + darwin + + archive + + hash + 0c53148aa00e51c06fa246c4130915be + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/apr_3p-update-apr/rev/297252/arch/Darwin/installer/apr_suite-1.4.5.297252-darwin-297252.tar.bz2 + + name + darwin + + linux + + archive + + hash + 402552cf158e2fe953b7224f4615a957 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/apr_3p-update-apr/rev/297252/arch/Linux/installer/apr_suite-1.4.5.297252-linux-297252.tar.bz2 + + name + linux + + windows + + archive + + hash + a0674f9dfce2b15bc90bf86ef2b01196 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/apr_suite-1.5.2-windows-201601151037.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 31c5f5b399da00037edd5b094ac6b97b + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/apr_suite-1.5.2-windows64-201512102110.tar.bz2 + + name + windows64 + + + version + 1.5.2 + + ares + + copyright + Copyright 1998 by the Massachusetts Institute of Technology. + description + C-ares, an asynchronous resolver library. + license + c-ares + license_file + LICENSES/c-ares.txt + name + ares + platforms + + darwin + + archive + + hash + 637b4996f703f3e5bf835d847fc4cb81 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/ares_3p-update-ares/rev/295506/arch/Darwin/installer/ares-1.10.0.295506-darwin-295506.tar.bz2 + + name + darwin + + linux + + archive + + hash + 7771d3653a0daf22d35bf96055d02d9a + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/ares_3p-update-ares/rev/295506/arch/Linux/installer/ares-1.10.0.295506-linux-295506.tar.bz2 + + name + linux + + windows + + archive + + hash + 0c01eb6ae9b92365ace8e70cf3999bfc + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/ares-1.10.0-windows-201601150954.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 6da2b095ad9616d8a8eae9a6a5b3f2c4 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/ares-1.10.0-windows64-201512122047.tar.bz2 + + name + windows64 + + + version + 1.10.0 + + boost + + copyright + (see individual source files) + description + Boost C++ Libraries + license + boost 1.0 + license_file + LICENSES/boost.txt + name + boost + platforms + + darwin + + archive + + hash + c296845cad075250c1ae2620f175a957 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/boost_3p-update-boost/rev/297445/arch/Darwin/installer/boost-1.57-darwin-297445.tar.bz2 + + name + darwin + + linux + + archive + + hash + fb1537f7ad0b490fcb4f096c15dce9cd + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/boost_3p-update-boost/rev/297445/arch/Linux/installer/boost-1.57-linux-297445.tar.bz2 + + name + linux + + windows + + archive + + hash + d606e5c39d13f2c23d23ac498520cbac + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/boost-1.60.0-windows-201601152308.tar.bz2 + + name + windows + + windows64 + + archive + + hash + f2ff62721cffd4556d18cbec67152de1 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/boost-1.60.0-windows64-201601160313.tar.bz2 + + name + windows64 + + + version + 1.60.0 + + colladadom + + copyright + Copyright 2006 Sony Computer Entertainment Inc. + license + SCEA + license_file + LICENSES/collada.txt + name + colladadom + platforms + + darwin + + archive + + hash + 66849777a83cb69cec3c06b07da7cd3d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/Darwin/installer/colladadom-2.3.297450-darwin-297450.tar.bz2 + + name + darwin + + linux + + archive + + hash + d627c2a679f3afb8d3e090d42f53cd2e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/colladadom_3p-update-colladadom/rev/297450/arch/Linux/installer/colladadom-2.3.297450-linux-297450.tar.bz2 + + name + linux + + windows + + archive + + hash + 90a37cec15019bff53a165b90f0180a7 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/colladadom-2.3-windows-201601152346.tar.bz2 + + name + windows + + windows64 + + archive + + hash + fb9685ac71b44f4c3df11d605c7dd060 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/colladadom-2.3-windows64-201512122146.tar.bz2 + + name + windows64 + + + version + 2.3 + + curl + + copyright + Copyright (c) 1996 - 2015, Daniel Stenberg, (daniel@haxx.se). + description + Library for transferring data specified with URL syntax + license + curl + license_file + LICENSES/curl.txt + name + curl + platforms + + darwin + + archive + + hash + d1c5125650a339a5209f429c70f4d395 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/297172/arch/Darwin/installer/curl-7.38.0.297172-darwin-297172.tar.bz2 + + name + darwin + + linux + + archive + + hash + ee6c089ee193e551040d610befc5d1c1 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/curl_3p-update-curl/rev/297172/arch/Linux/installer/curl-7.38.0.297172-linux-297172.tar.bz2 + + name + linux + + windows + + archive + + hash + 6e443a01d85367e1f058fbfb378cf80e + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/curl-7.46.0-windows-201601151153.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 9aca8339f269df5f42484f4bfafbf430 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/curl-7.46.0-windows64-201512122022.tar.bz2 + + name + windows64 + + + version + 7.46.0 + + db + + copyright + Copyright (c) 1990, 2010 Oracle and/or its affiliates. All rights reserved. + description + Berkeley DB (libdb) is a programmatic toolkit that provides embedded database support for both traditional and client/server applications. + license + bsd + license_file + LICENSES/db.txt + name + db + platforms + + linux + + archive + + hash + 1cc7940e500858a9754e9a3cc3ba2237 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/db_3p-update-db/rev/295315/arch/Linux/installer/db-5.1.25-linux-295315.tar.bz2 + + name + linux + + + version + 5.1.25 + + dbus_glib + + copyright + Copyright (C) Red Hat Inc. + description + D-Bus bindings for glib + license + Academic Free License v. 2.1 + license_file + LICENSES/dbus-glib.txt + name + dbus_glib + platforms + + linux + + archive + + hash + c11ff7e2e0bd59e6e59628f24902bbcd + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/dbus-glib_3p-update-dbus-glib/rev/297768/arch/Linux/installer/dbus_glib-0.76-linux-297768.tar.bz2 + + name + linux + + + version + 0.76 + + dictionaries + + copyright + Copyright 2014 Apache OpenOffice software + description + Spell checking dictionaries to bundled into the viewer + license + various open source + license_file + LICENSES/dictionaries.txt + name + dictionaries + platforms + + common + + archive + + hash + 078604ad9373fe35081a7d3e4892ae41 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/common/lib/dictionaries-1-common-201412301501.tar.bz2 + + name + common + + + version + 1 + + elfio + + license + lgpl + license_file + LICENSES/elfio.txt + name + elfio + platforms + + linux + + archive + + hash + 031e6315a5c0829c9b9a2ec18aeb7ae3 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-elfio/rev/222074/arch/Linux/installer/elfio-1.0.3-linux-20110225.tar.bz2 + + name + linux + + + + expat + + copyright + Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd and Clark Cooper - Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers. + description + Expat is an XML parser library written in C + license + expat + license_file + LICENSES/expat.txt + name + expat + platforms + + darwin + + archive + + hash + 452d1910ef853329cd59858e6c5b2c48 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/expat_3p-update-expat/rev/297014/arch/Darwin/installer/expat-2.0.1.297014-darwin-297014.tar.bz2 + + name + darwin + + linux + + archive + + hash + f546615d76bc0f9e8bc2b9ef89f0ca86 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/expat_3p-update-expat/rev/297014/arch/Linux/installer/expat-2.0.1.297014-linux-297014.tar.bz2 + + name + linux + + windows + + archive + + hash + 97786c456086c2aeb7554c755361df81 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/expat-2.1.0-windows-201601150958.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 7a08c54a3a869068f40a6ad4ea2716bb + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/expat-2.1.0-windows64-201512092314.tar.bz2 + + name + windows64 + + + version + 2.1.0 + + fmodstudio + + copyright + FMOD Studio, copyright © Firelight Technologies Pty, Ltd., 1994-2015. + description + FMOD Studio audio system library + license + fmodstudio + license_file + LICENSES/fmodstudio.txt + name + fmodstudio + platforms + + darwin + + archive + + hash + a51da309dd81293ae2940181d345bb77 + hash_algorithm + md5 + url + https://bitbucket.org/alchemyviewer/publiclibs-darwin/downloads/fmodstudio-1.07.00-darwin-201510062322.tar.bz2 + + name + darwin + + linux + + archive + + hash + 1331456a3df95294eaf44fab990f62cd + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/linux/lib/fmodstudio-1.06.07-linux-201507231333.tar.bz2 + + name + linux + + linux64 + + archive + + hash + adc55fd330f41a66dc64a6c3f7084e79 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/linux64/lib/fmodstudio-1.07.00-linux64-201510070033.tar.bz2 + + name + linux64 + + windows + + archive + + hash + b8de0e7146e671c6cf1171f86a7b46a1 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib/fmodstudio-1.07.05-windows-201601151004.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 8b80c508ebb6cd923d3448ba6f48fe3c + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib/fmodstudio-1.07.05-windows64-201601160255.tar.bz2 + + name + windows64 + + + version + 1.07.05 + + fontconfig + + copyright + Copyright (C) 2000,2001,2002,2003,2004,2006,2007 Keith Packard, 2005 Patrick Lam, 2009 Roozbeh Pournader, 2008,2009 Red Hat, Inc., 2008 Danilo Šegan, 2012 Google, Inc. + description + Fontconfig is a library for configuring and customizing font access. + license + bsd + license_file + LICENSES/fontconfig.txt + name + fontconfig + platforms + + linux + + archive + + hash + 864f9361661748ecf0e2cec7110d70b3 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/fontconfig_3p-update-fontconfig/rev/297551/arch/Linux/installer/fontconfig-2.11.0-linux-297551.tar.bz2 + + name + linux + + + version + 2.11.0 + + freeglut + + copyright + Copyright (c) 1999-2000 Pawel W. Olszta. All Rights Reserved. + description + freeglut is a completely OpenSourced alternative to the OpenGL Utility Toolkit (GLUT) library. + license + freeglut + license_file + LICENSES/freeglut.txt + name + freeglut + platforms + + windows + + archive + + hash + f98709114cedcdfdce69c9df6a4ac2f4 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/freeglut-3.0.0-windows-201601151006.tar.bz2 + + name + windows + + windows64 + + archive + + hash + f281e5b16b380c3e3a77aafa47ba5500 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/freeglut-3.0.0-windows64-201512130218.tar.bz2 + + name + windows64 + + + version + 3.0.0 + + freetype + + copyright + Copyright 2006-2015 by David Turner, Robert Wilhelm, and Werner Lemberg. + description + Font rendering library + license + FreeType + license_file + LICENSES/freetype.txt + name + freetype + platforms + + darwin + + archive + + hash + 83618d16d974eb0af93926a10ac13297 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/freetype_3p-update-freetype/rev/297053/arch/Darwin/installer/freetype-2.4.4.297053-darwin-297053.tar.bz2 + + name + darwin + + linux + + archive + + hash + 1ac3152b440287c58509d8af0a50326d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/freetype_3p-update-freetype/rev/297053/arch/Linux/installer/freetype-2.4.4.297053-linux-297053.tar.bz2 + + name + linux + + windows + + archive + + hash + 980d01acc3f88ed345dc20fc3e0ba6c0 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/freetype-2.6.2-windows-201601151045.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 80d268872b1e9209b8932390caacd550 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/freetype-2.6.2-windows64-201512130440.tar.bz2 + + name + windows64 + + + version + 2.6.2 + + glext + + copyright + Copyright (c) 2013-2014 The Khronos Group Inc. + description + glext headers define function prototypes and constants for OpenGL extensions + license + MIT + license_file + LICENSES/glext.txt + name + glext + platforms + + common + + archive + + hash + c00da9333b1bd0f9cc121ebc365fe360 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/common/lib/glext-20150325-common-201504222056.tar.bz2 + + name + common + + + version + 20150325 + + glh-linear + + copyright + Copyright (c) 2000 Cass Everitt + description + glh - is a platform-indepenedent C++ OpenGL helper library + license + BSD + license_file + LICENSES/glh-linear.txt + name + glh-linear + platforms + + common + + archive + + hash + fed9e6e9de1ea8210b0519f54df81bef + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/common/lib/glh_linear-0.0.0-common-201412301528.tar.bz2 + + name + common + + + version + 0.0.0 + + glod + + copyright + Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia. All rights reserved. + description + Geometric Level of Detail library + license + GLOD Open-Source License 1.0 + license_file + LICENSES/glod.txt + name + glod + platforms + + darwin + + archive + + hash + 71e678d70e276fc42a56926fc28a7abd + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glod_3p-update-glod/rev/296895/arch/Darwin/installer/glod-1.0pre4.296895-darwin-296895.tar.bz2 + + name + darwin + + linux + + archive + + hash + fffd130f17cbbe2b93cc241b27262647 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/glod_3p-update-glod/rev/296895/arch/Linux/installer/glod-1.0pre4.296895-linux-296895.tar.bz2 + + name + linux + + windows + + archive + + hash + 05134ab3cf05fbfb4bed996b53a0d472 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/glod-1.0pre4-windows-201601151027.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 2da9e546e4f574ec79ea8962f2c962da + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/glod-1.0pre4-windows64-201512092328.tar.bz2 + + name + windows64 + + + version + 1.0pre4 + + google_breakpad + + copyright + Copyright (c) 2006, Google Inc. + description + Breakpad is a crossplatform library for capturing crash callstacks and runtime data. + license + BSD + license_file + LICENSES/google_breakpad.txt + name + google_breakpad + platforms + + darwin + + archive + + hash + 171b39db6d0702535b41fad5b476e39d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298033/arch/Darwin/installer/google_breakpad-1413.298033-darwin-298033.tar.bz2 + + name + darwin + + linux + + archive + + hash + 0bf69fbc829d964820b798a0494278c9 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-breakpad_3p-update-google-breakpad/rev/298033/arch/Linux/installer/google_breakpad-1413.298033-linux-298033.tar.bz2 + + name + linux + + windows + + archive + + hash + 19147e19b5cfaaaeb83ff1d9025c06df + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/google_breakpad-9e60a27-windows-201601151025.tar.bz2 + + name + windows + + windows64 + + archive + + hash + e74e54c2042b1539a81012501e4b67af + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/google_breakpad-9e60a27-windows64-201512101817.tar.bz2 + + name + windows64 + + + version + 9e60a27 + + gperftools + + copyright + Copyright (c) 2005, Google Inc. + description + Fast, multi-threaded malloc() and nifty performance analysis tools + license + BSD + license_file + LICENSES/gperftools.txt + name + gperftools + platforms + + darwin + + archive + + hash + 0137e450bf24cff7e78634bb9a1c85e4 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-perftools_3p-update-google-perftools/rev/297263/arch/Darwin/installer/gperftools-2.0.297263-darwin-297263.tar.bz2 + + name + darwin + + linux + + archive + + hash + 0c252bcaa1cb852f5c4e46a13ed459c5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-perftools_3p-update-google-perftools/rev/297263/arch/Linux/installer/gperftools-2.0.297263-linux-297263.tar.bz2 + + name + linux + + windows + + archive + + hash + 2946f9bbf227dee8881af43856ebb3a1 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/google-perftools_3p-update-google-perftools/rev/297263/arch/CYGWIN/installer/gperftools-2.0.297263-windows-297263.tar.bz2 + + name + windows + + + version + 2.0.297263 + + gstreamer + + copyright + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + license + LGPL + license_file + LICENSES/gstreamer.txt + name + gstreamer + platforms + + linux + + archive + + hash + fb1479533a7699b44d34e3a550037eb7 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/gstreamer_3p-update-gstreamer/rev/294903/arch/Linux/installer/gstreamer-0.10.6.294903-linux-294903.tar.bz2 + + name + linux + + + version + 0.10.6.294903 + + gtk-atk-pango-glib + + copyright + Copyright (various, see sources) + license + lgpl + license_file + LICENSES/gtk-atk-pango-glib.txt + name + gtk-atk-pango-glib + platforms + + linux + + archive + + hash + 15af375116f5c943ea6f4190bc764224 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/gtk_3p-gtk-atk-pango-glib/rev/294804/arch/Linux/installer/gtk_atk_pango_glib-0.1-linux-294804.tar.bz2 + + name + linux + + + version + 0.0 + + havok-source + + copyright + Uses Havok (TM) Physics. (c)Copyright 1999-2010 Havok.com Inc. (and its Licensors). All Rights Reserved. See www.havok.com for details. + description + Havok source code for libs and demos + license + havok + license_file + LICENSES/havok.txt + name + havok-source + platforms + + darwin + + archive + + hash + 5c5b4820999ae9e398801d6a46f45897 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/297312/arch/Darwin/installer/havok_source-2012.1-darwin-297312.tar.bz2 + + name + darwin + + linux + + archive + + hash + 6b0f41ddddfa60d8424d8a2e0bc2077d + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/296959/arch/Linux/installer/havok_source-2012.1-linux-296959.tar.bz2 + + name + linux + + windows + + archive + + hash + ab30ae74a665950d73ea559f019ff358 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/havok-source_3p-update-havok-source/rev/297566/arch/CYGWIN/installer/havok_source-2012.1-windows-297566.tar.bz2 + + name + windows + + + version + 2012.1 + + jpeglib + + copyright + Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding. + description + JPEG encoding, decoding library + license + libjpeg-turbo + license_file + LICENSES/jpeglib.txt + name + jpeglib + platforms + + darwin + + archive + + hash + 4d7658997fd0f93a9c55e40e40b1b0e5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jpeglib_3p-update-jpeglib/rev/296854/arch/Darwin/installer/jpeglib-8c.296854-darwin-296854.tar.bz2 + + name + darwin + + linux + + archive + + hash + 0a6641f030e173a7bc0dc8a3087b6c7d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jpeglib_3p-update-jpeglib/rev/296854/arch/Linux/installer/jpeglib-8c.296854-linux-296854.tar.bz2 + + name + linux + + windows + + archive + + hash + 581db1bb70a7f6b9a6718121d22597a9 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/jpeglib-1.4.2-windows-201601151022.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 982395e50a36334899b900d563003b83 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/jpeglib-1.4.2-windows64-201512092307.tar.bz2 + + name + windows64 + + + version + 1.4.2 + + jsoncpp + + copyright + Copyright (c) 2007-2010 by Baptiste Lepilleur + description + JsonCpp is an implementation of a JSON (http://json.org) reader and writer in C++. + license + Public Domain + license_file + LICENSES/jsoncpp.txt + name + jsoncpp + platforms + + darwin + + archive + + hash + b25a4f480e07c670ffef00c3da578f87 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297281/arch/Darwin/installer/jsoncpp-0.5.0.297281-darwin-297281.tar.bz2 + + name + darwin + + linux + + archive + + hash + 5b3b5dbf0c82c1046482a74ce9e11c38 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/jsoncpp_3p-update-jsoncpp/rev/297281/arch/Linux/installer/jsoncpp-0.5.0.297281-linux-297281.tar.bz2 + + name + linux + + windows + + archive + + hash + de7bd51771d3d45185c4977e6aec3a37 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/jsoncpp-1.6.5-windows-201601151019.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 4cfc311430b84c8a9eba472fd4469f2e + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/jsoncpp-1.6.5-windows64-201512092309.tar.bz2 + + name + windows64 + + + version + 1.6.5 + + kdu + + copyright + Kakadu software + description + JPEG2000 library by Kakadu + license + Kakadu + license_file + LICENSES/kdu.txt + name + kdu + platforms + + darwin + + archive + + hash + e62f2fc1ee9ab791d603c5b717b46119 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/kdu_3p-update-kdu/rev/296932/arch/Darwin/installer/kdu-7.2.296932-darwin-296932.tar.bz2 + + name + darwin + + linux + + archive + + hash + ed952c0cb86329e63a8db190953962d8 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/kdu_3p-update-kdu/rev/296932/arch/Linux/installer/kdu-7.2.296932-linux-296932.tar.bz2 + + name + linux + + windows + + archive + + hash + a0e5c050a4975c81611d9f1862ac57fb + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/kdu_3p-update-kdu/rev/296932/arch/CYGWIN/installer/kdu-7.2.296932-windows-296932.tar.bz2 + + name + windows + + + version + 7.2.296932 + + libhunspell + + copyright + See hunspell.txt + description + Spell checking library + license + LGPL + license_file + LICENSES/hunspell.txt + name + libhunspell + platforms + + darwin + + archive + + hash + 05eda16106df26a211f8bdd874d1fca5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/hunspell_3p-update-hunspell/rev/296916/arch/Darwin/installer/libhunspell-1.3.2.296916-darwin-296916.tar.bz2 + + name + darwin + + linux + + archive + + hash + 988deae5c63ec638ad222b400a431f5b + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/hunspell_3p-update-hunspell/rev/296916/arch/Linux/installer/libhunspell-1.3.2.296916-linux-296916.tar.bz2 + + name + linux + + windows + + archive + + hash + 440a81e502be320c789337653ad1af7c + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/libhunspell-1.3.3-windows-201601151018.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 202ec606e90c6a705bc075c334d76f86 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libhunspell-1.3.3-windows64-201512100002.tar.bz2 + + name + windows64 + + + version + 1.3.3 + + libndofdev + + copyright + Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. + description + 3DConnexion SDK + license + BSD + license_file + LICENSES/libndofdev.txt + name + libndofdev + platforms + + darwin + + archive + + hash + a01b411433dbf8a4b481de9e76d9a652 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libndofdev_3p-update-libndofdev/rev/297264/arch/Darwin/installer/libndofdev-0.1.297264-darwin-297264.tar.bz2 + + name + darwin + + windows + + archive + + hash + 1bed832715f068e3363ba90a0415092f + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/libndofdev-0.1-windows-201601151016.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 37da82fd6de8673a46c2c0860b54d6bf + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libndofdev-0.1-windows64-201512122040.tar.bz2 + + name + windows64 + + + version + 0.1 + + libpng + + copyright + Copyright (c) 2004, 2006-2014 Glenn Randers-Pehrson + description + PNG Reference library + license + libpng + license_file + LICENSES/libpng.txt + name + libpng + platforms + + darwin + + archive + + hash + 14cb5c8686a472e9e60179e46cd196f7 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297708/arch/Darwin/installer/libpng-1.6.8.297708-darwin-297708.tar.bz2 + + name + darwin + + linux + + archive + + hash + 6dec32fc2527f8cafd616f9271ff3478 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libpng_3p-update-libpng/rev/297051/arch/Linux/installer/libpng-1.6.8.297051-linux-297051.tar.bz2 + + name + linux + + windows + + archive + + hash + 28c4370ae17b7881a8604ff0ed6c204b + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/libpng-1.6.19-windows-201601151047.tar.bz2 + + name + windows + + windows64 + + archive + + hash + a6646a596c1f015831c337605bb907e5 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libpng-1.6.19-windows64-201512122034.tar.bz2 + + name + windows64 + + + version + 1.6.19 + + libuuid + + copyright + Copyright (c) 2004-2008 The OSSP Project <http://www.ossp.org/> + description + OSSP uuid is a ISO-C:1999 application programming interface (API) and corresponding command line interface (CLI) for the generation of DCE 1.1, ISO/IEC 11578:1996 and RFC 4122 compliant Universally Unique Identifier (UUID). + license + UUID + license_file + LICENSES/uuid.txt + name + libuuid + platforms + + linux + + archive + + hash + f231b6ec8bc2f050cfb1ee20bd83190d + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libuuid_3p-update-libuuid/rev/295209/arch/Linux/installer/libuuid-1.6.2-linux-295209.tar.bz2 + + name + linux + + + version + 1.6.2 + + libxml2 + + copyright + Copyright (C) 1998-2012 Daniel Veillard. All Rights Reserved. + description + Libxml2 is the XML C parser and toolkit developed for the Gnome project. + license + MIT + license_file + LICENSES/libxml2.txt + name + libxml2 + platforms + + darwin + + archive + + hash + 9303f0dd174129e297eca6cc2eb1ab3f + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libxml_3p-update-libxml/rev/297050/arch/Darwin/installer/libxml2-2.9.1.297050-darwin-297050.tar.bz2 + + name + darwin + + linux + + archive + + hash + b8b584853dc1344bb3571c13b06ec39e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libxml_3p-update-libxml/rev/297050/arch/Linux/installer/libxml2-2.9.1.297050-linux-297050.tar.bz2 + + name + linux + + windows + + archive + + hash + 6f1e3fcceab669df5c3d1c66821b2f24 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/libxml2-2.9.3-windows-201601151053.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 4453be9f68208147e4a7d508db677583 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/libxml2-2.9.3-windows64-201512122133.tar.bz2 + + name + windows64 + + + version + 2.9.3 + + llappearance_utility + + copyright + Copyright (c) 2000-2012, Linden Research, Inc. + description + Linden Lab appearance utility for server-side avatar baking services. + license + Proprietary + license_file + LICENSES/llappearanceutility.txt + name + llappearance_utility + platforms + + linux + + archive + + hash + ce1261a54d877ab5530ae6a9134a77a3 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llappearance_viewer-update-llappearance-utility/rev/294906/arch/Linux/installer/llappearance_utility-0.0.1-linux-294906.tar.bz2 + + name + linux + + + version + 0.0.1 + + llceflib + + copyright + Copyright (c) 2014-2015, Linden Research, Inc. + description + LLCefLib implements a headless web browser, rendering modern web content to a memory buffer and providing an API for injecting mouse and keyboard events. It uses the Chromium Embedded Framework (https://bitbucket.org/chromiumembedded/cef) + license + LGPL + license_file + LICENSES/llceflib.txt + name + llceflib + platforms + + darwin + + archive + + hash + 5a0f74f8e736d91d2c2c6cbc71db90bd + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/3p-llceflib_3p-llceflib/rev/309177/arch/Darwin/installer/llceflib-1.5.1.309177-darwin-309177.tar.bz2 + + name + darwin + + windows + + archive + + hash + 30bbc702d7533f8e2c56bdd0f5f22b59 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/llceflib-3.2526.1364.gf6bf57b-windows-201601160235.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 230e4ccb442bd538eabe2167f351a20d + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/llceflib-3.2526.1364.gf6bf57b-windows64-201601160304.tar.bz2 + + name + windows64 + + + version + 3.2526.1364.gf6bf57b + + llphysicsextensions_source + + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/llphysicsextensions.txt + name + llphysicsextensions_source + platforms + + darwin + + archive + + hash + 468e88a527e610804c3eecf07f4ed70b + hash_algorithm + md5 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/Darwin/installer/llphysicsextensions_source-1.0.298369-darwin-298369.tar.bz2 + + name + darwin + + linux + + archive + + hash + 793964e49c935b414c4bdbb8a0d14ad1 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/Linux/installer/llphysicsextensions_source-1.0.298369-linux-298369.tar.bz2 + + name + linux + + windows + + archive + + hash + 922aad5261aac150e5ce3c094e57f373 + url + http://s3-proxy.lindenlab.com/private-builds-secondlife-com/hg/repo/llphysicsextensions-source_llphysicsextensions-update/rev/298369/arch/CYGWIN/installer/llphysicsextensions_source-1.0.298369-windows-298369.tar.bz2 + + name + windows + + + version + 1.0.298369 + + llphysicsextensions_stub + + copyright + Copyright (c) 2010, Linden Research, Inc. + license + internal + license_file + LICENSES/llphysicsextensions.txt + name + llphysicsextensions_stub + platforms + + darwin + + archive + + hash + 1175977a191ffc936fd0ccca433c8278 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/Darwin/installer/llphysicsextensions_stub-1.0.298370-darwin-298370.tar.bz2 + + name + darwin + + linux + + archive + + hash + d13d7927692eab2d6a63e36166b72a8a + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/Linux/installer/llphysicsextensions_stub-1.0.298370-linux-298370.tar.bz2 + + name + linux + + linux64 + + archive + + hash + aa8a2f25e8629cf5e6a96cc0eb93de8e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub/rev/263415/arch/Linux/installer/llphysicsextensions_stub-0.3-linux-20120814.tar.bz2 + + name + linux64 + + windows + + archive + + hash + 9594f6fd79ee924fe675a4a23e30516e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/llphysicsextensions-stub_llphysicsextensions-update/rev/298370/arch/CYGWIN/installer/llphysicsextensions_stub-1.0.298370-windows-298370.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 50d7ea325063219a86d9439ce7458582 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib/llphysicsextensions_stub-1.0.298370-windows64-298370.tar.bz2 + + name + windows64 + + + version + 1.0.298370 + + llqtwebkit + + copyright + Copyright (C) 2015 The Qt Company Ltd. + description + QT cross-platform applicaiton and UI framework. + license + LGPL + license_file + LICENSES/llqtwebkit.txt + name + llqtwebkit + platforms + + windows64 + + archive + + hash + 433fb6ae8370375cf55013812e59f01d + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/llqtwebkit-4.8.7-windows64-201512130225.tar.bz2 + + name + windows64 + + + version + 4.8.7 + + mesa + + license + mesa + license_file + LICENSES/mesa.txt + name + mesa + platforms + + linux + + archive + + hash + 22c50a5d362cad311b4f413cfcffbba2 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/mesa_3p-update-mesa/rev/297294/arch/Linux/installer/mesa-7.11.1.297294-linux-297294.tar.bz2 + + name + linux + + + version + 7.11.1.297294 + + nvapi + + copyright + Copyright (c) 2007- 2014 NVIDIA Corporation. All rights reserved. + license + nvapi + license_file + LICENSES/nvapi.txt + name + nvapi + platforms + + windows + + archive + + hash + 347b0204795b11a982934fec640a4fd5 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/nvapi-R361-windows-201601151015.tar.bz2 + + name + windows + + windows64 + + archive + + hash + c26ef36ab5a91b9b39cf74b6fb087197 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/nvapi-R352-windows64-201512130127.tar.bz2 + + name + windows64 + + + version + R361 + + ogg_vorbis + + copyright + Copyright (c) 2002, Xiph.org Foundation + description + Audio encoding library + license + ogg-vorbis + license_file + LICENSES/ogg-vorbis.txt + name + ogg_vorbis + platforms + + darwin + + archive + + hash + 07fca1531a27915f642a5c1d95008d54 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/oggvorbis_3p-update-oggvorbis/rev/296878/arch/Darwin/installer/ogg_vorbis-1.2.2-1.3.2.296878-darwin-296878.tar.bz2 + + name + darwin + + linux + + archive + + hash + b0cd31d5b07a9fc25c4d69ba2f95eace + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/oggvorbis_3p-update-oggvorbis/rev/296878/arch/Linux/installer/ogg_vorbis-1.2.2-1.3.2.296878-linux-296878.tar.bz2 + + name + linux + + windows + + archive + + hash + e8c42c8ee03d570fa5e7fb88e7e1bc92 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/ogg_vorbis-1.3.2-1.3.5-windows-201601151012.tar.bz2 + + name + windows + + windows64 + + archive + + hash + c22591d8db9dc3353e4d3dc3d1a2b264 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/ogg_vorbis-1.3.2-1.3.5-windows64-201512122053.tar.bz2 + + name + windows64 + + + version + 1.3.2-1.3.5 + + open-libndofdev + + copyright + Copyright (c) 2008, Jan Ciger (jan.ciger (at) gmail.com) + description + Open Source replacement for 3DConnection SDK + license + BSD + license_file + LICENSES/libndofdev.txt + name + open-libndofdev + platforms + + linux + + archive + + hash + b1245d467d5914a266efa16afeb55406 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/libndofdev_3p-update-libndofdev/rev/297553/arch/Linux/installer/open_libndofdev-0.3-linux-297553.tar.bz2 + + name + linux + + + version + 0.3 + + openal + + copyright + Creative Labs + description + OpenAL is a cross-platform 3D audio API appropriate for use with gaming applications and many other types of audio applications. + license + lgpl + license_file + LICENSES/openal.txt + name + openal + platforms + + linux + + archive + + hash + 15ebe611213c9577691ffbade081549d + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openal_3p-update-openal/rev/297677/arch/Linux/installer/openal-1.12.854-1.1.0.297677-linux-297677.tar.bz2 + + name + linux + + windows + + archive + + hash + fa39ac8fe3714599293563fb7f964fca + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib/openal-1.16.0-1.1.0-windows-201504270536.tar.bz2 + + name + windows + + windows64 + + archive + + hash + fec29528320a2a67ffa7b3900135592d + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib/openal-1.16.0-1.1.0-windows64-201504270534.tar.bz2 + + name + windows64 + + + version + 1.16.0-1.1.0 + + openssl + + copyright + Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved; Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + description + Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS v1) Library + license + openssl + license_file + LICENSES/openssl.txt + name + openssl + platforms + + darwin + + archive + + hash + 0a77d56769e6075957f614be6575423e + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openssl_3p-update-openssl/rev/297168/arch/Darwin/installer/openssl-1.0.1h.297168-darwin-297168.tar.bz2 + + name + darwin + + linux + + archive + + hash + c310ba9971cbd796b303c3be67fb11c6 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/openssl_3p-update-openssl/rev/297168/arch/Linux/installer/openssl-1.0.1h.297168-linux-297168.tar.bz2 + + name + linux + + windows + + archive + + hash + 213e62795373d12621282636fc760f20 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/openssl-1.0.2e-windows-201601151130.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 44f5553704a5fc74f23342ac1216175b + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/openssl-1.0.2e-windows64-201512121953.tar.bz2 + + name + windows64 + + + version + 1.0.2e + + quicktime + + copyright + 2010 Apple + description + QuickTime 7.3 SDK for Windows + license + unknown + license_file + LICENSES/quicktime.txt + name + quicktime + platforms + + windows + + archive + + hash + 66600ab94087d295e48e326ec8961ac5 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib/quicktime-7.3-windows-201504280653.tar.bz2 + + name + windows + + + version + 7.3 + + slvoice + + copyright + 2010 Vivox, including audio coding using Polycom¨ Siren14TM (ITU-T Rec. G.722.1 Annex C) + description + Vivox SDK components + license + Mixed + license_file + LICENSES/slvoice.txt + name + slvoice + platforms + + darwin + + archive + + hash + 68a8fab5ad3a180487598d3a3e0d57b1 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slvoice_3p-update-slvoice/rev/298329/arch/Darwin/installer/slvoice-4.6.0017.21209.298329-darwin-298329.tar.bz2 + + name + darwin + + linux + + archive + + hash + 48ed7ddcf93fa3c751d677f5eb5f9367 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slvoice_3p-update-slvoice/rev/298329/arch/Linux/installer/slvoice-3.2.0002.10426.298329-linux-298329.tar.bz2 + + name + linux + + windows + + archive + + hash + 399afab7047e6fa62e7b2fb1768059ea + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slvoice_3p-update-slvoice/rev/298329/arch/CYGWIN/installer/slvoice-4.6.0017.21209.298329-windows-298329.tar.bz2 + + name + windows + + windows64 + + archive + + hash + dabbc146137c13ec2ea026aa69e1f045 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib/slvoice-4.6.0017.21209.298329-windows64-298329.tar.bz2 + + name + windows64 + + + version + 4.6.0017.21209.298329 + + tut + + copyright + Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008-2009 Michał Rzechonek + description + TUT is a small and portable unit test framework for C++. + license + bsd + license_file + LICENSES/tut.txt + name + tut + platforms + + common + + archive + + hash + 56601f1217ccd206829e8834e5a1253b + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/common/lib/tut-2008.11.30-common-201504282317.tar.bz2 + + name + common + + + version + 2008.11.30 + + uriparser + + copyright + Copyright (C) 2007, Weijia Song <songweijia@gmail.com>, Sebastian Pipping <webmaster@hartwork.org> + description + uriparser is a strictly RFC 3986 compliant URI parsing and handling library written in C. uriparser is cross-platform, fast, supports Unicode and is licensed under the New BSD license. + license + New BSD license + license_file + LICENSES/uriparser.txt + name + uriparser + platforms + + darwin + + archive + + hash + 22608adaf54e8ddc9182a719ba6e2b32 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/Darwin/installer/uriparser-0.8.0.1-darwin-299435.tar.bz2 + + name + darwin + + linux + + archive + + hash + dddfc8dea540801f93ba0382cb1e3685 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/uriparser_3p-update-uriparser/rev/299435/arch/Linux/installer/uriparser-0.8.0.1-linux-299435.tar.bz2 + + name + linux + + windows + + archive + + hash + f9f82fbd29751a969e9ab55a1f33ac7b + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/uriparser-0.8.4-windows-201601151009.tar.bz2 + + name + windows + + windows64 + + archive + + hash + dae3118551880f593f8ee907c122f097 + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/uriparser-0.8.4-windows64-201512081840.tar.bz2 + + name + windows64 + + + version + 0.8.4 + + xmlrpc-epi + + copyright + Copyright: (C) 2000 Epinions, Inc. + description + XMLRPC Library + license + xmlrpc-epi + license_file + LICENSES/xmlrpc-epi.txt + name + xmlrpc-epi + platforms + + darwin + + archive + + hash + ffd3aab8e0c0ff6dadbce49ca2809078 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/xmlrpc-emi_3p-update-xmlrpc-epi/rev/297075/arch/Darwin/installer/xmlrpc_epi-0.54.1.297075-darwin-297075.tar.bz2 + + name + darwin + + linux + + archive + + hash + 30bb26d6cc78c16047fc85a63f48fcdb + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/xmlrpc-emi_3p-update-xmlrpc-epi/rev/297075/arch/Linux/installer/xmlrpc_epi-0.54.1.297075-linux-297075.tar.bz2 + + name + linux + + windows + + archive + + hash + b41376a689fb4c9e9846d838283fdc5d + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/xmlrpc_epi-0.54.2-windows-201601151034.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 727dd03de835cb4b0ab201101f3025da + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/xmlrpc_epi-0.54.2-windows64-201512102119.tar.bz2 + + name + windows64 + + + version + 0.54.2 + + zlib + + copyright + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + description + Zlib Data Compression Library + license + zlib + license_file + LICENSES/zlib.txt + name + zlib + platforms + + darwin + + archive + + hash + 1a79eeac199c2d94e4ae4e5d0194e25f + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/zlib_3p-update-zlib/rev/296881/arch/Darwin/installer/zlib-1.2.8.296881-darwin-296881.tar.bz2 + + name + darwin + + linux + + archive + + hash + 2eb8e59b6464222dcf4435016ad5f618 + hash_algorithm + md5 + url + http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/zlib_3p-update-zlib/rev/296881/arch/Linux/installer/zlib-1.2.8.296881-linux-296881.tar.bz2 + + name + linux + + windows + + archive + + hash + a26a7a9d550dc6988528e2e70bb5e85b + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows/lib-vc14/zlib-1.2.8-windows-201601150945.tar.bz2 + + name + windows + + windows64 + + archive + + hash + 5b3a58a6a939e83f94137171b7f814de + hash_algorithm + md5 + url + http://depot.alchemyviewer.org/pub/windows64/lib-vc14/zlib-1.2.8-windows64-201512071625.tar.bz2 + + name + windows64 + + + version + 1.2.8 + + + package_description + + copyright + Copyright (c) 2014, Linden Research, Inc. + description + Second Life Viewer + license + LGPL + license_file + docs/LICENSE-source.txt + name + Second Life Viewer + platforms + + common + + configurations + + RelWithDebInfo + + build + + + configure + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo + -DWORD_SIZE:STRING=32 + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=TRUE + + + name + RelWithDebInfo + + RelWithDebInfoOS + + configure + + arguments + + ../indra + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo + -DWORD_SIZE:STRING=32 + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=FALSE + + + name + RelWithDebInfoOS + + Release + + build + + + configure + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=Release + -DWORD_SIZE:STRING=32 + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=TRUE + + + name + Release + + ReleaseOS + + configure + + arguments + + ../indra + + command + cmake + options + + -DCMAKE_BUILD_TYPE:STRING=Release + -DWORD_SIZE:STRING=32 + -DROOT_PROJECT_NAME:STRING=SecondLife + -DINSTALL_PROPRIETARY=FALSE + + + name + ReleaseOS + + + name + common + + darwin + + build_directory + build-darwin-i386 + configurations + + RelWithDebInfo + + build + + command + xcodebuild + filters + + setenv + + options + + -configuration RelWithDebInfo + -project SecondLife.xcodeproj + + + configure + + arguments + + ../indra + + options + + -G + 'Xcode' + + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + + build + + command + xcodebuild + options + + -configuration RelWithDebInfo + -project SecondLife.xcodeproj + + + configure + + options + + -G + 'Xcode' + + + name + RelWithDebInfoOS + + Release + + build + + command + xcodebuild + filters + + setenv + + options + + -configuration Release + -project SecondLife.xcodeproj + -DENABLE_SIGNING:BOOL=YES + -DSIGNING_IDENTITY:STRING="Developer ID Application: Linden Research, Inc." + + + configure + + arguments + + ../indra + + options + + -G + 'Xcode' + + + name + Release + + ReleaseOS + + build + + command + xcodebuild + options + + -configuration Release + -project SecondLife.xcodeproj + -DENABLE_SIGNING:BOOL=YES + -DSIGNING_IDENTITY:STRING="Developer ID Application: Linden Research, Inc." + + + configure + + options + + -G + 'Xcode' + + + name + ReleaseOS + + + name + darwin + + linux + + build_directory + build-linux-i686 + configurations + + RelWithDebInfo + + build + + command + make + options + + -j 12 + + + configure + + arguments + + ../indra + + options + + -G + 'Unix Makefiles' + + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + + build + + command + make + options + + -j 7 + + + configure + + options + + -G + 'Unix Makefiles' + + + name + RelWithDebInfoOS + + Release + + build + + command + make + options + + -j 12 + + + configure + + arguments + + ../indra + + options + + -G + 'Unix Makefiles' + + + name + Release + + ReleaseOS + + build + + command + make + options + + -j 7 + + + configure + + options + + -G + 'Unix Makefiles' + + + name + ReleaseOS + + default + + build + + + name + default + + + name + linux + + windows + + build_directory + build-vc140 + configurations + + RelWithDebInfo + + build + + arguments + + SecondLife.sln + + command + devenv + options + + /build + "RelWithDebInfo|Win32" + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + RelWithDebInfo + --startup + secondlife-bin + + options + + -G + "Visual Studio 14" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + + build + + arguments + + SecondLife.sln + + command + msbuild.exe + options + + /p:Configuration=RelWithDebInfo + /p:Platform=Win32 + /t:Build + /p:useenv=true + /verbosity:normal + /p:"VCBuildAdditionalOptions= /incremental" + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + RelWithDebInfo + --startup + secondlife-bin + + options + + -G + "Visual Studio 14" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + + + name + RelWithDebInfoOS + + Release + + build + + arguments + + SecondLife.sln + + command + devenv + options + + /build + "Release|Win32" + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Release + --startup + secondlife-bin + + options + + -G + "Visual Studio 14" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + + + name + Release + + ReleaseOS + + build + + arguments + + SecondLife.sln + + command + msbuild.exe + options + + /p:Configuration=Release + /p:Platform=Win32 + /t:Build + /p:useenv=true + /verbosity:normal + /p:"VCBuildAdditionalOptions= /incremental" + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Release + --startup + secondlife-bin + + options + + -G + "Visual Studio 14" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + + + name + ReleaseOS + + + name + windows + + windows64 + + build_directory + build-vc140-x86_64 + configurations + + RelWithDebInfo + + build + + arguments + + SecondLife.sln + + command + devenv + options + + /build + "RelWithDebInfo|x64" + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + RelWithDebInfo + --startup + secondlife-bin + + options + + -G + "Visual Studio 14 Win64" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + -DWORD_SIZE:STRING=64 + + + default + True + name + RelWithDebInfo + + RelWithDebInfoOS + + build + + arguments + + SecondLife.sln + + command + msbuild.exe + options + + /p:Configuration=RelWithDebInfo + /p:Platform=x64 + /t:Build + /p:useenv=true + /verbosity:normal + /p:"VCBuildAdditionalOptions= /incremental" + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + RelWithDebInfo + --startup + secondlife-bin + + options + + -G + "Visual Studio 14 Win64" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + -DWORD_SIZE:STRING=64 + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + + + name + RelWithDebInfoOS + + Release + + build + + arguments + + SecondLife.sln + + command + devenv + options + + /build + "Release|x64" + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Release + --startup + secondlife-bin + + options + + -G + "Visual Studio 14 Win64" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + -DWORD_SIZE:STRING=64 + + + name + Release + + ReleaseOS + + build + + arguments + + SecondLife.sln + + command + msbuild.exe + options + + /p:Configuration=Release + /p:Platform=x64 + /t:Build + /p:useenv=true + /verbosity:normal + /m + + + configure + + arguments + + ..\indra + && + ..\indra\tools\vstool\VSTool.exe + --solution + SecondLife.sln + --config + Release + --startup + secondlife-bin + + options + + -G + "Visual Studio 14 Win64" + -DCMAKE_SYSTEM_VERSION="10.0.10586.0" + -DWORD_SIZE:STRING=64 + -DINSTALL_PROPRIETARY=FALSE + -DUSE_KDU=FALSE + + + name + ReleaseOS + + + name + windows64 + + + version_file + newview/viewer_version.txt + + type + autobuild + version + 1.3 + + diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 8694c0dcc..964a37b95 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -3,19 +3,12 @@ # cmake_minimum_required should appear before any # other commands to guarantee full compatibility # with the version specified - -cmake_minimum_required(VERSION 2.8.10 FATAL_ERROR) - -# Eventually the third-party support modules (cmake/*.cmake) should -# know the full path to all libraries. Until that happens we need -# per-configuration link directory "libraries//lib/debug" for -# Debug and "libraries//lib/release" for Release, -# RelWithDebInfo, and MinSizeRel. CMake 2.6 does not directly support -# per-configuration link directory specification. However, we can set -# CMP0003 to OLD and link to one library (apr) on a per-configuration -# basis to convince CMake to add the proper link directory. This line -# can be removed when we use full paths for all libraries. -#cmake_policy(SET CMP0003 OLD) +## prior to 2.8, the add_custom_target commands used in setting the version did not work correctly +if(WIN32) + cmake_minimum_required(VERSION 3.4 FATAL_ERROR) +else() + cmake_minimum_required(VERSION 2.8.8 FATAL_ERROR) +endif() set(ROOT_PROJECT_NAME "Singularity" CACHE STRING "The root project/makefile/solution name. Defaults to Singularity.") @@ -24,26 +17,12 @@ project(${ROOT_PROJECT_NAME}) set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") include(Variables) - -# Load versions now. Install locations need them. include(BuildVersion) -include(UnixInstall) -if (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - set(CMAKE_BUILD_TYPE Release CACHE STRING +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type. One of: Debug Release RelWithDebInfo" FORCE) -endif (NOT CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE) - -# Create a 'prepare' target in which to perform setup actions. This -# must be the first target created so other targets can depend on it. -if(NOT STANDALONE) - # We prepare prebuilt binaries when not building standalone. - set(prepare_depends ${CMAKE_BINARY_DIR}/prepare/prebuilt) -endif(NOT STANDALONE) -if(WINDOWS) - set(prepare_depends ${prepare_depends} copy_win_libs) -endif(WINDOWS) -add_custom_target(prepare DEPENDS ${prepare_depends}) +endif (NOT CMAKE_BUILD_TYPE) add_subdirectory(cmake) add_subdirectory(${LIBS_OPEN_PREFIX}aistatemachine) @@ -70,8 +49,6 @@ if(STANDALONE) add_subdirectory(${LIBS_OPEN_PREFIX}llqtwebkit) endif(STANDALONE) -#add_subdirectory(${LIBS_OPEN_PREFIX}lscript) - if (WINDOWS AND EXISTS ${LIBS_CLOSED_DIR}copy_win_scripts) add_subdirectory(${LIBS_CLOSED_PREFIX}copy_win_scripts) endif (WINDOWS AND EXISTS ${LIBS_CLOSED_DIR}copy_win_scripts) @@ -83,42 +60,7 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llui) # viewer plugins directory add_subdirectory(${LIBS_OPEN_PREFIX}plugins) -# llplugin testbed code (is this the right way to include it?) -#if (NOT LINUX) -# add_subdirectory(${VIEWER_PREFIX}test_apps/llplugintest) -#endif (NOT LINUX) - add_subdirectory(${VIEWER_PREFIX}newview/statemachine) add_subdirectory(${VIEWER_PREFIX}newview) add_dependencies(viewer secondlife-bin) -# The use_prebuilt_binary macro in cmake/Prebuilt.cmake records -# packages in the PREBUILT property of the 'prepare' target. -get_property(PREBUILT_PACKAGES TARGET prepare PROPERTY PREBUILT) - -# Create a script to download the needed binaries. -configure_file(${CMAKE_SOURCE_DIR}/cmake/DownloadPrebuilt.cmake.in - ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake @ONLY) - -# Drive the download script at build time. Depend on 'install.xml' -# to aqcuire new binaries when needed. -add_custom_command( - COMMENT "Obtaining prebuilt binaries..." - OUTPUT ${CMAKE_BINARY_DIR}/prepare/prebuilt - COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake - DEPENDS ${CMAKE_SOURCE_DIR}/../install.xml - ${CMAKE_BINARY_DIR}/DownloadPrebuilt.cmake - ) - - -if(WINDOWS) - configure_file(${CMAKE_SOURCE_DIR}/cmake/CopyWinLibs.cmake.in - ${CMAKE_BINARY_DIR}/CopyWinLibs.cmake @ONLY) - add_custom_command( - COMMENT "Copying prebuilt libraries to viewer executable directory" - OUTPUT ${CMAKE_BINARY_DIR}/CopyWinLibs - COMMAND ${CMAKE_COMMAND} -DCUR_CONFIG:STRING=${CMAKE_CFG_INTDIR} -P ${CMAKE_BINARY_DIR}/CopyWinLibs.cmake - DEPENDS ${CMAKE_BINARY_DIR}/prepare/prebuilt ${CMAKE_BINARY_DIR}/CopyWinLibs.cmake - ) - add_custom_target(copy_win_libs DEPENDS ${CMAKE_BINARY_DIR}/CopyWinLibs) -endif(WINDOWS) \ No newline at end of file diff --git a/indra/aistatemachine/CMakeLists.txt b/indra/aistatemachine/CMakeLists.txt index 806261201..791ff9d25 100644 --- a/indra/aistatemachine/CMakeLists.txt +++ b/indra/aistatemachine/CMakeLists.txt @@ -39,5 +39,3 @@ set_source_files_properties(${aistatemachine_HEADER_FILES} list(APPEND aistatemachine_SOURCE_FILES ${aistatemachine_HEADER_FILES}) add_library (aistatemachine ${aistatemachine_SOURCE_FILES}) -add_dependencies(aistatemachine prepare) - diff --git a/indra/aistatemachine/aistatemachinethread.h b/indra/aistatemachine/aistatemachinethread.h index 193c2e0d4..bf70be6c7 100644 --- a/indra/aistatemachine/aistatemachinethread.h +++ b/indra/aistatemachine/aistatemachinethread.h @@ -34,6 +34,7 @@ #include "aistatemachine.h" #include "llthread.h" #include "aithreadsafe.h" +#include #ifdef EXAMPLE_CODE // undefined @@ -235,7 +236,7 @@ class AIStateMachineThread : public AIStateMachineThreadBase { /*virtual*/ const char* getName() const { #define STRIZE(arg) #arg - return "AIStateMachineThread<"STRIZE(THREAD_IMPL)">"; + return (boost::format("%1%%2%%3%") % "AIStateMachineThread<" % STRIZE(THREAD_IMPL) % ">").str().c_str(); #undef STRIZE } diff --git a/indra/cmake/00-Common.cmake b/indra/cmake/00-Common.cmake index 139a10b3c..f0e899fc3 100644 --- a/indra/cmake/00-Common.cmake +++ b/indra/cmake/00-Common.cmake @@ -40,22 +40,6 @@ set(CMAKE_CONFIGURATION_TYPES "RelWithDebInfo;Release;Debug" CACHE STRING # Platform-specific compilation flags. if (WINDOWS) - # Various libs are compiler specific, generate some variables here we can just use - # when we require them instead of reimplementing the test each time. - if (MSVC10) - set(MSVC_DIR 10.0) - set(MSVC_SUFFIX 100) - elseif (MSVC12) - set(MSVC_DIR 12.0) - set(MSVC_SUFFIX 120) - endif (MSVC10) - - # Remove default /Zm1000 flag that cmake inserts - string (REPLACE "/Zm1000" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - - # Always use /Zm140 - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zm140") - # Don't build DLLs. set(BUILD_SHARED_LIBS OFF) @@ -70,52 +54,43 @@ if (WINDOWS) set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${LL_C_FLAGS} /O2 /Zi /MD /MP /fp:fast" CACHE STRING "C compiler release options" FORCE) - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") + + if (WORD_SIZE EQUAL 32) + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /LARGEADDRESSAWARE") + endif (WORD_SIZE EQUAL 32) set(CMAKE_CXX_STANDARD_LIBRARIES "") set(CMAKE_C_STANDARD_LIBRARIES "") add_definitions( /DLL_WINDOWS=1 + /DNOMINMAX /DUNICODE - /D_UNICODE + /D_UNICODE /GS /TP /W3 /c /Zc:forScope - /Zc:wchar_t- + /Zc:rvalueCast + /Zc:wchar_t /nologo /Oy- + /Zm140 ) - - # SSE2 is implied on win64 - if(WORD_SIZE EQUAL 32) - add_definitions(/arch:SSE2 /D_ATL_XP_TARGETING) - else(WORD_SIZE EQUAL 32) - set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /wd4267 /wd4250 /wd4244") - endif(WORD_SIZE EQUAL 32) if (WORD_SIZE EQUAL 32) - # configure win32 API for windows XP+ compatibility - set(WINVER "0x0501" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)") - add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}") - else (WORD_SIZE EQUAL 32) - # configure win32 API for windows vista+ compatibility - set(WINVER "0x0600" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)") - add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}") + add_compile_options(/arch:SSE2) endif (WORD_SIZE EQUAL 32) - # Use special XP-compatible toolchain on 32-bit builds - if (MSVC12 AND (WORD_SIZE EQUAL 32)) - set(CMAKE_GENERATOR_TOOLSET "v120xp") - endif (MSVC12 AND (WORD_SIZE EQUAL 32)) - - # Are we using the crummy Visual Studio KDU build workaround? if (NOT DISABLE_FATAL_WARNINGS) add_definitions(/WX) endif (NOT DISABLE_FATAL_WARNINGS) + # configure win32 API for windows Vista+ compatibility + set(WINVER "0x0600" CACHE STRING "Win32 API Target version (see http://msdn.microsoft.com/en-us/library/aa383745%28v=VS.85%29.aspx)") + add_definitions("/DWINVER=${WINVER}" "/D_WIN32_WINNT=${WINVER}") + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO") SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /MANIFEST:NO") SET(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /MANIFEST:NO") diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake index c47363aa1..f43b3fda1 100644 --- a/indra/cmake/APR.cmake +++ b/indra/cmake/APR.cmake @@ -13,37 +13,43 @@ if (STANDALONE) else (STANDALONE) use_prebuilt_binary(apr_suite) if (WINDOWS) + if (LLCOMMON_LINK_SHARED) + set(APR_selector "lib") + else (LLCOMMON_LINK_SHARED) + set(APR_selector "") + endif (LLCOMMON_LINK_SHARED) set(APR_LIBRARIES - debug libapr-1.lib - optimized libapr-1.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}apr-1.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}apr-1.lib ) set(APRICONV_LIBRARIES - debug libapriconv-1.lib - optimized libapriconv-1.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}apriconv-1.lib + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}apriconv-1.lib ) set(APRUTIL_LIBRARIES - debug libaprutil-1.lib - optimized libaprutil-1.lib + debug ${ARCH_PREBUILT_DIRS_DEBUG}/${APR_selector}aprutil-1.lib ${APRICONV_LIBRARIES} + optimized ${ARCH_PREBUILT_DIRS_RELEASE}/${APR_selector}aprutil-1.lib ${APRICONV_LIBRARIES} ) + if(NOT LLCOMMON_LINK_SHARED) + list(APPEND APR_LIBRARIES Rpcrt4) + endif(NOT LLCOMMON_LINK_SHARED) elseif (DARWIN) - set(APR_LIBRARIES - debug libapr-1.0.dylib - optimized libapr-1.0.dylib - ) - set(APRUTIL_LIBRARIES - debug libaprutil-1.dylib - optimized libaprutil-1.dylib - ) + if (LLCOMMON_LINK_SHARED) + set(APR_selector "0.dylib") + set(APRUTIL_selector "0.dylib") + else (LLCOMMON_LINK_SHARED) + set(APR_selector "a") + set(APRUTIL_selector "a") + endif (LLCOMMON_LINK_SHARED) + set(APR_LIBRARIES libapr-1.${APR_selector}) + set(APRUTIL_LIBRARIES libaprutil-1.${APRUTIL_selector}) set(APRICONV_LIBRARIES iconv) else (WINDOWS) set(APR_LIBRARIES apr-1) set(APRUTIL_LIBRARIES aprutil-1) set(APRICONV_LIBRARIES iconv) endif (WINDOWS) - set(APR_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/include/apr-1 - ${LIBS_PREBUILT_LEGACY_DIR}/include/apr-1 - ) + set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/apr-1) if (LINUX) list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES}) diff --git a/indra/cmake/Audio.cmake b/indra/cmake/Audio.cmake index 27633ff72..131d20b18 100644 --- a/indra/cmake/Audio.cmake +++ b/indra/cmake/Audio.cmake @@ -8,11 +8,8 @@ if (STANDALONE) pkg_check_modules(VORBISENC REQUIRED vorbisenc) pkg_check_modules(VORBISFILE REQUIRED vorbisfile) else (STANDALONE) - use_prebuilt_binary(ogg-vorbis) - set(VORBIS_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) + use_prebuilt_binary(ogg_vorbis) + set(VORBIS_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) set(VORBISENC_INCLUDE_DIRS ${VORBIS_INCLUDE_DIRS}) set(VORBISFILE_INCLUDE_DIRS ${VORBIS_INCLUDE_DIRS}) diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake index 0421b1c9e..844d5dc49 100644 --- a/indra/cmake/Boost.cmake +++ b/indra/cmake/Boost.cmake @@ -11,11 +11,8 @@ if (STANDALONE) find_package(Boost 1.51.0 COMPONENTS date_time filesystem program_options regex system thread wave context) else (STANDALONE) use_prebuilt_binary(boost) - set(Boost_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) - set(Boost_VERSION "1.52") + set(Boost_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) + set(Boost_VERSION "1.60") if (WINDOWS) set(Boost_CONTEXT_LIBRARY diff --git a/indra/cmake/BuildPackagesInfo.cmake b/indra/cmake/BuildPackagesInfo.cmake new file mode 100644 index 000000000..a764e9b42 --- /dev/null +++ b/indra/cmake/BuildPackagesInfo.cmake @@ -0,0 +1,11 @@ +# -*- cmake -*- +# Construct the version and copyright information based on package data. +include(Python) +include(Variables) + +add_custom_command(OUTPUT packages-info.txt + COMMENT "Generating packages-info.txt for the about box" + MAIN_DEPENDENCY ${CMAKE_SOURCE_DIR}/../autobuild.xml + DEPENDS ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/../scripts/packages-formatter.py -p=${AUTOBUILD_PLATFORM_NAME} > packages-info.txt + ) diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake index 062b283c1..02fad1f55 100644 --- a/indra/cmake/CARes.cmake +++ b/indra/cmake/CARes.cmake @@ -20,8 +20,5 @@ else (STANDALONE) else (WINDOWS) set(CARES_LIBRARIES cares) endif (WINDOWS) - set(CARES_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include/ares - ${LIBS_PREBUILT_LEGACY_DIR}/include/ares - ) + set(CARES_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/ares) endif (STANDALONE) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index c6d716fed..70e448385 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -20,18 +20,17 @@ set(cmake_SOURCE_FILES CURL.cmake Colladadom.cmake ConfigurePkgConfig.cmake - CopyBackToSource.cmake - CopyWinLibs.cmake + Copy3rdPartyLibs.cmake Cwdebug.cmake DBusGlib.cmake - DirectX.cmake - DownloadPrebuilt.cmake.in + DeploySharedLibs.cmake ELFIO.cmake EXPAT.cmake ExamplePlugin.cmake FMODEX.cmake FMODSTUDIO.cmake FindAPR.cmake + FindAutobuild.cmake FindBerkeleyDB.cmake FindCARes.cmake FindColladadom.cmake @@ -73,6 +72,7 @@ set(cmake_SOURCE_FILES LLSharedLibs.cmake LLQtWebkit.cmake LLRender.cmake + LLSharedLibs.cmake LLUI.cmake LLVFS.cmake LLWindow.cmake @@ -110,7 +110,6 @@ source_group("Shared Rules" FILES ${cmake_SOURCE_FILES}) set(master_SOURCE_FILES ../CMakeLists.txt - ../develop.py ) source_group("Master Rules" FILES ${master_SOURCE_FILES}) diff --git a/indra/cmake/CURL.cmake b/indra/cmake/CURL.cmake index 8463d6531..0aafa312d 100644 --- a/indra/cmake/CURL.cmake +++ b/indra/cmake/CURL.cmake @@ -18,8 +18,5 @@ else (STANDALONE) list(APPEND CURL_LIBRARIES idn) endif(LINUX AND WORD_SIZE EQUAL 64) endif (WINDOWS) - set(CURL_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) + set(CURL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE) diff --git a/indra/cmake/Colladadom.cmake b/indra/cmake/Colladadom.cmake index afc8bcce0..e4eb71af0 100644 --- a/indra/cmake/Colladadom.cmake +++ b/indra/cmake/Colladadom.cmake @@ -10,49 +10,22 @@ if (STANDALONE) include (FindColladadom) else (STANDALONE) use_prebuilt_binary(colladadom) - - if (NOT WINDOWS AND NOT LINUX) - use_prebuilt_binary(pcre) - endif (NOT WINDOWS AND NOT LINUX) - - if (NOT DARWIN AND NOT WINDOWS) - use_prebuilt_binary(libxml) - endif (NOT DARWIN AND NOT WINDOWS) - set(COLLADADOM_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include/collada - ${LIBS_PREBUILT_DIR}/include/collada/1.4 - ${LIBS_PREBUILT_LEGACY_DIR}/include/collada - ${LIBS_PREBUILT_LEGACY_DIR}/include/collada/1.4 - ) + ${LIBS_PREBUILT_DIR}/include/collada + ${LIBS_PREBUILT_DIR}/include/collada/1.4 + ) if (WINDOWS) - if(MSVC12) - use_prebuilt_binary(pcre) - use_prebuilt_binary(libxml) - set(COLLADADOM_LIBRARIES - debug libcollada14dom23-sd - optimized libcollada14dom23-s - libxml2_a - debug pcrecppd - optimized pcrecpp - debug pcred - optimized pcre - ${BOOST_SYSTEM_LIBRARIES} - ) - else(MSVC12) - add_definitions(-DDOM_DYNAMIC) - set(COLLADADOM_LIBRARIES - debug libcollada14dom22-d - optimized libcollada14dom22 - ) - endif(MSVC12) - else (WINDOWS) - set(COLLADADOM_LIBRARIES - collada14dom - minizip - xml2 - ) + set(COLLADADOM_LIBRARIES + debug libcollada14dom23-sd + optimized libcollada14dom23-s + ) + else(WINDOWS) + set(COLLADADOM_LIBRARIES + debug collada14dom-d + optimized collada14dom + minizip + ) endif (WINDOWS) endif (STANDALONE) diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake new file mode 100644 index 000000000..3632d51bf --- /dev/null +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -0,0 +1,244 @@ +# -*- cmake -*- + +# The copy_win_libs folder contains file lists and a script used to +# copy dlls, exes and such needed to run the SecondLife from within +# VisualStudio. + +include(CMakeCopyIfDifferent) +include(Linking) + +################################################################### +# set up platform specific lists of files that need to be copied +################################################################### +if(WINDOWS) + set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug") + set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo") + set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release") + + #******************************* + # VIVOX - *NOTE: no debug version + set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") + set(vivox_files + SLVoice.exe + ca-bundle.crt + libsndfile-1.dll + vivoxplatform.dll + vivoxsdk.dll + ortp.dll + zlib1.dll + vivoxoal.dll + ) + + #******************************* + # Misc shared libs + + set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}") + set(debug_files + libapr-1.dll + libaprutil-1.dll + libapriconv-1.dll + ssleay32.dll + libeay32.dll + glod.dll + libhunspell.dll + ) + + set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") + set(release_files + libapr-1.dll + libaprutil-1.dll + libapriconv-1.dll + ssleay32.dll + libeay32.dll + glod.dll + libhunspell.dll + ) + + if(USE_TCMALLOC) + set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll) + set(release_files ${release_files} libtcmalloc_minimal.dll) + endif(USE_TCMALLOC) + + if (FMODSTUDIO) + if(WORD_SIZE STREQUAL 64) + set(debug_files ${debug_files} fmodL64.dll) + set(release_files ${release_files} fmod64.dll) + else(WORD_SIZE STREQUAL 64) + set(debug_files ${debug_files} fmodL.dll) + set(release_files ${release_files} fmod.dll) + endif(WORD_SIZE STREQUAL 64) + endif (FMODSTUDIO) +elseif(DARWIN) + set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}/Debug/Resources") + set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/Resources") + set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}/Release/Resources") + + set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") + set(vivox_files + SLVoice + ca-bundle.crt + libsndfile.dylib + libvivoxoal.dylib + libortp.dylib + libvivoxplatform.dylib + libvivoxsdk.dylib + ) + set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}") + set(debug_files + ) + set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") + set(release_files + libapr-1.0.dylib + libapr-1.dylib + libaprutil-1.0.dylib + libaprutil-1.dylib + libexception_handler.dylib + libexpat.1.5.2.dylib + libexpat.dylib + libGLOD.dylib + libhunspell-1.3.0.dylib + libndofdev.dylib + ) + + if (FMODSTUDIO) + set(debug_files ${debug_files} libfmodL.dylib) + set(release_files ${release_files} libfmod.dylib) + endif (FMODSTUDIO) + +elseif(LINUX) + # linux is weird, multiple side by side configurations aren't supported + # and we don't seem to have any debug shared libs built yet anyways... + set(SHARED_LIB_STAGING_DIR_DEBUG "${SHARED_LIB_STAGING_DIR}") + set(SHARED_LIB_STAGING_DIR_RELWITHDEBINFO "${SHARED_LIB_STAGING_DIR}") + set(SHARED_LIB_STAGING_DIR_RELEASE "${SHARED_LIB_STAGING_DIR}") + + set(vivox_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") + set(vivox_files + libsndfile.so.1 + libortp.so + libvivoxoal.so.1 + libvivoxplatform.so + libvivoxsdk.so + SLVoice + # ca-bundle.crt #No cert for linux. It is actually still 3.2SDK. + ) + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(debug_src_dir "${ARCH_PREBUILT_DIRS_DEBUG}") + set(debug_files + ) + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(release_src_dir "${ARCH_PREBUILT_DIRS_RELEASE}") + # *FIX - figure out what to do with duplicate libalut.so here -brad + set(release_files + libapr-1.so.0 + libaprutil-1.so.0 + libatk-1.0.so + libdb-5.1.so + libexpat.so + libexpat.so.1 + libfreetype.so.6.6.2 + libfreetype.so.6 + libGLOD.so + libgmodule-2.0.so + libgobject-2.0.so + libhunspell-1.3.so.0.0.0 + libopenal.so + libopenjpeg.so + libuuid.so.16 + libuuid.so.16.0.22 + libfontconfig.so.1.8.0 + libfontconfig.so.1 + ) + + if (USE_TCMALLOC) + set(release_files ${release_files} "libtcmalloc_minimal.so") + endif (USE_TCMALLOC) + + if (FMODSTUDIO) + set(debug_files ${debug_files} "libfmodL.so") + set(release_files ${release_files} "libfmod.so") + endif (FMODSTUDIO) + +else(WINDOWS) + message(STATUS "WARNING: unrecognized platform for staging 3rd party libs, skipping...") + set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-linux") + set(vivox_files "") + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(debug_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/debug") + set(debug_files "") + # *TODO - update this to use LIBS_PREBUILT_DIR and LL_ARCH_DIR variables + # or ARCH_PREBUILT_DIRS + set(release_src_dir "${CMAKE_SOURCE_DIR}/../libraries/i686-linux/lib/release") + set(release_files "") + + set(debug_llkdu_src "") + set(debug_llkdu_dst "") + set(release_llkdu_src "") + set(release_llkdu_dst "") + set(relwithdebinfo_llkdu_dst "") +endif(WINDOWS) + + +################################################################ +# Done building the file lists, now set up the copy commands. +################################################################ + +copy_if_different( + ${vivox_src_dir} + "${SHARED_LIB_STAGING_DIR_DEBUG}" + out_targets + ${vivox_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${vivox_src_dir} + "${SHARED_LIB_STAGING_DIR_RELEASE}" + out_targets + ${vivox_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${vivox_src_dir} + "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" + out_targets + ${vivox_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + + + +copy_if_different( + ${debug_src_dir} + "${SHARED_LIB_STAGING_DIR_DEBUG}" + out_targets + ${debug_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${release_src_dir} + "${SHARED_LIB_STAGING_DIR_RELEASE}" + out_targets + ${release_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +copy_if_different( + ${release_src_dir} + "${SHARED_LIB_STAGING_DIR_RELWITHDEBINFO}" + out_targets + ${release_files} + ) +set(third_party_targets ${third_party_targets} ${out_targets}) + +if(NOT USESYSTEMLIBS) + add_custom_target( + stage_third_party_libs ALL + DEPENDS ${third_party_targets} + ) +endif(NOT USESYSTEMLIBS) diff --git a/indra/cmake/CopyBackToSource.cmake b/indra/cmake/CopyBackToSource.cmake deleted file mode 100644 index d09a216e8..000000000 --- a/indra/cmake/CopyBackToSource.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# -*- cmake -*- -# Copies a binary back to the source directory - -MACRO(COPY_BACK_TO_SOURCE target) - SET(FROM $) - SET(TO ${CMAKE_CURRENT_SOURCE_DIR}) - #MESSAGE("TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${FROM} ${TO}") - ADD_CUSTOM_COMMAND( - TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy ${FROM} ${TO} - DEPENDS ${FROM} - COMMENT "Copying ${target} to ${CMAKE_CURRENT_BINARY_DIR}" - ) -ENDMACRO(COPY_BACK_TO_SOURCE) - - diff --git a/indra/cmake/CopyWinLibs.cmake.in b/indra/cmake/CopyWinLibs.cmake.in deleted file mode 100644 index 16be776d6..000000000 --- a/indra/cmake/CopyWinLibs.cmake.in +++ /dev/null @@ -1,181 +0,0 @@ -# -*- cmake -*- - -# The copy_win_libs folder contains file lists and a script used to -# copy dlls, exes and such needed to run the SecondLife from within -# VisualStudio. - -set(LIBS_PREBUILT_DIR "@LIBS_PREBUILT_DIR@") -set(LIBS_PREBUILT_LEGACY_DIR "@LIBS_PREBUILT_LEGACY_DIR@") -set(MSVC10 "@MSVC10@") -set(WORD_SIZE "@WORD_SIZE@") - -set(LIBS_RELEASE_DIR - ${LIBS_PREBUILT_DIR}/lib/release - ${LIBS_PREBUILT_LEGACY_DIR}/lib/release - ) -set(LIBS_DEBUG_DIR - ${LIBS_PREBUILT_DIR}/lib/debug - ${LIBS_PREBUILT_LEGACY_DIR}/lib/debug - ) - -function(copy_files paths names dest) - string(FIND ${dest} ${CUR_CONFIG} idx) - if(${idx} LESS 0) - return() - endif(${idx} LESS 0) - foreach(f ${names}) - foreach(p ${paths}) - set(from_file "${p}/${f}") - set(to_dest "${CMAKE_BINARY_DIR}/newview/${dest}/") - if(EXISTS ${from_file}) - message("Copying ${from_file} to ${to_dest}") - if(NOT EXISTS ${to_dest}) - execute_process(COMMAND md "${to_dest}") - endif(NOT EXISTS ${to_dest}) - execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${from_file}" "${to_dest}${f}" RESULT_VARIABLE result) - if(${result}) - message(SEND_ERROR "Unsuccessful.") - endif(${result}) - set(found 1) - break() - endif(EXISTS ${from_file}) - endforeach(p) - if(NOT found) - message(SEND_ERROR "Failed to find library: ${f}") - endif(NOT found) - endforeach(f) -endfunction(copy_files) - -set(vivox_files - ca-bundle.crt - libsndfile-1.dll - ortp.dll - SLVoice.exe - vivoxoal.dll - vivoxplatform.dll - vivoxsdk.dll - zlib1.dll - ) -copy_files("${LIBS_RELEASE_DIR}" "${vivox_files}" "Release" ) -copy_files("${LIBS_RELEASE_DIR}" "${vivox_files}" "RelWithDebInfo") -copy_files("${LIBS_DEBUG_DIR}" "${vivox_files}" "Debug") - -set(release_files - libhunspell.dll - libapr-1.dll - libaprutil-1.dll - libapriconv-1.dll - libeay32.dll - ssleay32.dll - glod.dll - qtcore4.dll - ) -copy_files("${LIBS_RELEASE_DIR}" "${release_files}" "Release") -copy_files("${LIBS_RELEASE_DIR}" "${release_files}" "RelWithDebInfo") -copy_files("${LIBS_DEBUG_DIR}" "${release_files}" "Debug") - -if(MSVC10) - copy_files("${LIBS_DEBUG_DIR}" "libcollada14dom22-d.dll" "Debug") -endif(MSVC10) - -if(WORD_SIZE EQUAL 32) -set(release_files - libcollada14dom22.dll - libtcmalloc_minimal.dll - ) - copy_files("${LIBS_RELEASE_DIR}" "${release_files}" "Release") - copy_files("${LIBS_RELEASE_DIR}" "${release_files}" "RelWithDebInfo") -endif(WORD_SIZE EQUAL 32) - -set(plugins_release_files - libeay32.dll - qtcore4.dll - qtgui4.dll - qtnetwork4.dll - qtopengl4.dll - qtwebkit4.dll - ssleay32.dll - qtxmlpatterns4.dll - ) -copy_files("${LIBS_RELEASE_DIR}" "${plugins_release_files}" "Release/llplugin") -copy_files("${LIBS_RELEASE_DIR}" "${plugins_release_files}" "RelWithDebInfo/llplugin") -if(0) - copy_files("${LIBS_RELEASE_DIR}" "${plugin_release_files}" "../test_apps/llplugintest/Release") - copy_files("${LIBS_RELEASE_DIR}" "${plugin_release_files}" "../test_apps/llplugintest/RelWithDebInfo") -endif(0) - -# Debug config runtime files required for the plugins -set(plugins_debug_files - libeay32.dll - qtcored4.dll - qtguid4.dll - qtnetworkd4.dll - qtopengld4.dll - qtwebkitd4.dll - ssleay32.dll - qtxmlpatternsd4.dll - ) -copy_files("${LIBS_DEBUG_DIR}" "${plugins_debug_files}" "Debug/llplugin") -if(0) - copy_files("${LIBS_DEBUG_DIR}" "${plugins_debug_files}" "../test_apps/llplugintest/Debug") -endif(0) - -# Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt image format plugins) -set(plugin_image_release_files - qgif4.dll - qico4.dll - qjpeg4.dll - qmng4.dll - qsvg4.dll - qtiff4.dll - ) -copy_files("${LIBS_RELEASE_DIR}/imageformats" "${plugin_image_release_files}" "Release/llplugin/imageformats") -copy_files("${LIBS_RELEASE_DIR}/imageformats" "${plugin_image_release_files}" "RelWithDebInfo/llplugin/imageformats") -if(0) - copy_files("${LIBS_RELEASE_DIR}/imageformats" "${plugin_image_release_files}" "../test_apps/llplugintest/imageformats/Release") - copy_files("${LIBS_RELEASE_DIR}/imageformats" "${plugin_image_release_files}" "../test_apps/llplugintest/imageformats/RelWithDebInfo") -endif(0) - - -# Debug config runtime files required for the plugin test mule (Qt image format plugins) -set(plugin_image_debug_files - qgifd4.dll - qicod4.dll - qjpegd4.dll - qmngd4.dll - qsvgd4.dll - qtiffd4.dll - ) -copy_files("${LIBS_DEBUG_DIR}/imageformats" "${plugin_image_debug_files}" "Debug/llplugin/imageformats") -if(0) - copy_files("${LIBS_DEBUG_DIR}/imageformats" "${plugin_image_debug_files}" "../test_apps/llplugintest/imageformats/Debug") -endif(0) - -# Release & ReleaseDebInfo config runtime files required for the plugin test mule (Qt image format plugins) -set(plugin_codec_release_files - qcncodecs4.dll - qjpcodecs4.dll - qkrcodecs4.dll - qtwcodecs4.dll - ) -copy_files("${LIBS_RELEASE_DIR}/codecs" "${plugin_codec_release_files}" "Release/llplugin/codecs") -copy_files("${LIBS_RELEASE_DIR}/codecs" "${plugin_codec_release_files}" "RelWithDebInfo/llplugin/codecs") -if(0) - copy_files("${LIBS_RELEASE_DIR}/codecs" "${plugin_codec_release_files}" "../test_apps/llplugintest/codecs/Release") - copy_files("${LIBS_RELEASE_DIR}/codecs" "${plugin_codec_release_files}" "../test_apps/llplugintest/codecs/RelWithDebInfo") -endif(0) - -# Debug config runtime files required for the plugin test mule (Qt image format plugins) -set(plugin_codec_debug_files - qcncodecsd4.dll - qjpcodecsd4.dll - qkrcodecsd4.dll - qtwcodecsd4.dll - ) -copy_files("${LIBS_DEBUG_DIR}/codecs" "${plugin_codec_debug_files}" "Debug/llplugin/codecs") -if(0) - copy_files("${LIBS_DEBUG_DIR}/codecs" "${plugin_codec_debug_files}" "../test_apps/llplugintest/codecs/Debug") -endif(0) - - - diff --git a/indra/cmake/DeploySharedLibs.cmake b/indra/cmake/DeploySharedLibs.cmake new file mode 100644 index 000000000..41b7e6a5b --- /dev/null +++ b/indra/cmake/DeploySharedLibs.cmake @@ -0,0 +1,70 @@ +# DeploySharedLibs.cmake +# This is a script to be run at build time! Its not part of the cmake configuration! +# See indra/cmake/LLSharedLibs.cmake for a macro that simplifies adding a command to a target to run this script. + +# This script requires a few cmake variable to be set on the command line: +# BIN_NAME= The full path the the binary to search for dependecies. +# SEARCH_DIRS= The full paths to dirs to search for dependencies. +# DST_PATH= The full path where the dependecies will be copied. +get_filename_component(current_dir ${CMAKE_CURRENT_LIST_FILE} PATH) +include(GetPrerequisites) + +message("Getting recursive dependencies for file: ${BIN_NAME}") + +set(EXCLUDE_SYSTEM 1) +set(RECURSE 0) +get_filename_component(EXE_PATH ${BIN_NAME} PATH) + +get_prerequisites( ${BIN_NAME} RESULTS ${EXCLUDE_SYSTEM} ${RECURSE} "${EXE_PATH}" "${SEARCH_DIRS}" ) + +foreach(DEP ${RESULTS}) + Message("Processing dependency: ${DEP}") + get_filename_component(DEP_FILE ${DEP} NAME) + set(DEP_FILES ${DEP_FILES} ${DEP_FILE}) +endforeach(DEP) + +if(DEP_FILES) + list(REMOVE_DUPLICATES DEP_FILES) +endif(DEP_FILES) + +foreach(DEP_FILE ${DEP_FILES}) + if(FOUND_FILES) + list(FIND FOUND_FILES ${DEP_FILE} FOUND) + else(FOUND_FILES) + set(FOUND -1) + endif(FOUND_FILES) + + if(FOUND EQUAL -1) + find_path(DEP_PATH ${DEP_FILE} PATHS ${SEARCH_DIRS} NO_DEFAULT_PATH) + if(DEP_PATH) + set(FOUND_FILES ${FOUND_FILES} "${DEP_PATH}/${DEP_FILE}") + set(DEP_PATH NOTFOUND) #reset DEP_PATH for the next find_path call. + else(DEP_PATH) + set(MISSING_FILES ${MISSING_FILES} ${DEP_FILE}) + endif(DEP_PATH) + endif(FOUND EQUAL -1) +endforeach(DEP_FILE) + +if(MISSING_FILES) + message("Missing:") + foreach(FILE ${MISSING_FILES}) + message(" ${FILE}") + endforeach(FILE) + message("Searched in:") + foreach(SEARCH_DIR ${SEARCH_DIRS}) + message(" ${SEARCH_DIR}") + endforeach(SEARCH_DIR) + message(FATAL_ERROR "Failed") +endif(MISSING_FILES) + +if(FOUND_FILES) + foreach(FILE ${FOUND_FILES}) + get_filename_component(DST_FILE ${FILE} NAME) + set(DST_FILE "${DST_PATH}/${DST_FILE}") + message("Copying ${FILE} to ${DST_FILE}") + execute_process( + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE} ${DST_FILE} + ) + endforeach(FILE ${FOUND_FILES}) +endif(FOUND_FILES) +message("Success!") diff --git a/indra/cmake/DirectX.cmake b/indra/cmake/DirectX.cmake deleted file mode 100644 index 56547bb7d..000000000 --- a/indra/cmake/DirectX.cmake +++ /dev/null @@ -1,82 +0,0 @@ -# -*- cmake -*- - -include(Variables) - -if (WINDOWS) - if (WORD_SIZE EQUAL 32) - set (DIRECTX_ARCHITECTURE x86) - elseif (WORD_SIZE EQUAL 64) - set (DIRECTX_ARCHITECTURE x64) - else (WORD_SIZE EQUAL 32) - set (DIRECTX_ARCHITECTURE x86) - endif (WORD_SIZE EQUAL 32) - - SET(program_files $ENV{ProgramW6432}) - if(NOT program_files) - SET(program_files $ENV{ProgramFiles}) - endif(NOT program_files) - SET(program_files_x86 "ProgramFiles(x86)") - SET(program_files_x86 $ENV{${program_files_x86}}) - - find_path(DIRECTX_ROOT_DIR Include/dxdiag.h - PATHS - "$ENV{DXSDK_DIR}" - "${program_files}/Microsoft DirectX SDK (June 2010)" - "${program_files_x86}/Microsoft DirectX SDK (June 2010)" - "${program_files}/Microsoft DirectX SDK (February 2010)" - "${program_files_x86}/Microsoft DirectX SDK (February 2010)" - "${program_files}/Microsoft DirectX SDK (March 2009)" - "${program_files_x86}/Microsoft DirectX SDK (March 2009)" - "${program_files}/Microsoft DirectX SDK (August 2008)" - "${program_files_x86}/Microsoft DirectX SDK (August 2008)" - "${program_files}/Microsoft DirectX SDK (June 2008)" - "${program_files_x86}/Microsoft DirectX SDK (June 2008)" - "${program_files}/Microsoft DirectX SDK (March 2008)" - "${program_files_x86}/Microsoft DirectX SDK (March 2008)" - "${program_files}/Microsoft DirectX SDK (November 2007)" - "${program_files_x86}/Microsoft DirectX SDK (November 2007)" - "${program_files}/Microsoft DirectX SDK (August 2007)" - "${program_files_x86}/Microsoft DirectX SDK (August 2007)" - ) - - if (DIRECTX_ROOT_DIR) - set (DIRECTX_INCLUDE_DIR "${DIRECTX_ROOT_DIR}/Include") - set (DIRECTX_LIBRARY_DIR "${DIRECTX_ROOT_DIR}/Lib/${DIRECTX_ARCHITECTURE}") - else (DIRECTX_ROOT_DIR) - find_path (WIN_KIT_ROOT_DIR Include/um/windows.h - PATHS - "${program_files}/Windows Kits/8.1" - "${program_files_x86}/Windows Kits/8.1" - "${program_files}/Windows Kits/8.0" - "${program_files_x86}/Windows Kits/8.0" - ) - - find_path (WIN_KIT_LIB_DIR dxguid.lib - "${WIN_KIT_ROOT_DIR}/Lib/winv6.3/um/${DIRECTX_ARCHITECTURE}" - "${WIN_KIT_ROOT_DIR}/Lib/Win8/um/${DIRECTX_ARCHITECTURE}" - ) - - if (WIN_KIT_ROOT_DIR AND WIN_KIT_LIB_DIR) - set (DIRECTX_INCLUDE_DIR "${WIN_KIT_ROOT_DIR}/Include/um" "${WIN_KIT_ROOT_DIR}/Include/shared") - set (DIRECTX_LIBRARY_DIR "${WIN_KIT_LIB_DIR}") - endif (WIN_KIT_ROOT_DIR AND WIN_KIT_LIB_DIR) - endif (DIRECTX_ROOT_DIR) - - if (DIRECTX_INCLUDE_DIR) - include_directories(${DIRECTX_INCLUDE_DIR}) - if (DIRECTX_FIND_QUIETLY) - message(STATUS "Found DirectX include: ${DIRECTX_INCLUDE_DIR}") - endif (DIRECTX_FIND_QUIETLY) - else (DIRECTX_INCLUDE_DIR) - message(FATAL_ERROR "Could not find DirectX SDK Include") - endif (DIRECTX_INCLUDE_DIR) - - if (DIRECTX_LIBRARY_DIR) - if (DIRECTX_FIND_QUIETLY) - message(STATUS "Found DirectX include: ${DIRECTX_LIBRARY_DIR}") - endif (DIRECTX_FIND_QUIETLY) - else (DIRECTX_LIBRARY_DIR) - message(FATAL_ERROR "Could not find DirectX SDK Libraries") - endif (DIRECTX_LIBRARY_DIR) - -endif (WINDOWS) diff --git a/indra/cmake/DownloadPrebuilt.cmake.in b/indra/cmake/DownloadPrebuilt.cmake.in deleted file mode 100644 index 5b67fedd4..000000000 --- a/indra/cmake/DownloadPrebuilt.cmake.in +++ /dev/null @@ -1,45 +0,0 @@ -# This script drives download of prebuilt packages during the build. -# The top-level CMakeLists.txt configures packages and tool locations. -set(packages "@PREBUILT_PACKAGES@") -set(python "@PYTHON_EXECUTABLE@") -set(install_dir "@CMAKE_BINARY_DIR@/packages") -set(scp "@SCP_EXECUTABLE@") -set(scripts_dir "@SCRIPTS_DIR@") -set(sentinel_dir "@CMAKE_BINARY_DIR@/prepare") -set(prebuilt_type "@PREBUILT_TYPE@") - -# In proprietary mode we use scp for download. -set(proprietary "@INSTALL_PROPRIETARY@") -if(proprietary) - set(scp_option "--scp=${scp}") - set(proprietary_message " proprietary") -endif(proprietary) - -foreach(package ${packages}) - if(${install_dir}/install.xml IS_NEWER_THAN ${sentinel_dir}/${package}_installed) - # This package is missing or out of date. - message(STATUS "Obtaining${proprietary_message} prebuilt '${package}'") - execute_process( - COMMAND ${python} install.py -p${prebuilt_type} --install-dir=${install_dir} --installed-manifest=${install_dir}/installed.xml ${scp_option} ${package} - WORKING_DIRECTORY ${scripts_dir} - RESULT_VARIABLE result - ) - if(result STREQUAL 0) - # Write a sentinel to avoid attempting a download again. - file(WRITE ${sentinel_dir}/${package}_installed "Obtained '${package}'") - else(result STREQUAL 0) - # Remove the sentinel to ensure a download is attempted again. - file(REMOVE ${sentinel_dir}/prebuilt - ${sentinel_dir}/${package}_installed) - message(FATAL_ERROR - "Failed to download or unpack prebuilt '${package}'. " - "Process returned: ${result}") - endif(result STREQUAL 0) - else(${install_dir}/install.xml IS_NEWER_THAN ${sentinel_dir}/${package}_installed) - # This package is ready. - message(STATUS "Prebuilt '${package}' is up-to-date") - endif(${install_dir}/install.xml IS_NEWER_THAN ${sentinel_dir}/${package}_installed) -endforeach(package) - -# Store a sentinel to avoid running this script unnecessarily. -file(WRITE ${sentinel_dir}/prebuilt "All prebuilts obtained successfully\n") diff --git a/indra/cmake/EXPAT.cmake b/indra/cmake/EXPAT.cmake index bafe1a91e..d11c6a9af 100644 --- a/indra/cmake/EXPAT.cmake +++ b/indra/cmake/EXPAT.cmake @@ -9,16 +9,9 @@ if (STANDALONE) else (STANDALONE) use_prebuilt_binary(expat) if (WINDOWS) - if (MSVC12) - set(EXPAT_LIBRARIES expat) - else (MSVC12) - set(EXPAT_LIBRARIES libexpatMT) - endif (MSVC12) + set(EXPAT_LIBRARIES expat) else (WINDOWS) set(EXPAT_LIBRARIES expat) endif (WINDOWS) - set(EXPAT_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) + set(EXPAT_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE) diff --git a/indra/cmake/FindAutobuild.cmake b/indra/cmake/FindAutobuild.cmake new file mode 100644 index 000000000..ea5ad6d10 --- /dev/null +++ b/indra/cmake/FindAutobuild.cmake @@ -0,0 +1,43 @@ +# -*- cmake -*- +# +# Find the autobuild tool +# +# Output variables: +# +# AUTOBUILD_EXECUTABLE - path to autobuild executable + + + +IF (NOT AUTOBUILD_EXECUTABLE) + + # If cmake was executed by autobuild, autobuild will have set the AUTOBUILD env var + IF (DEFINED ENV{AUTOBUILD}) + SET(AUTOBUILD_EXECUTABLE $ENV{AUTOBUILD}) + ELSE (DEFINED ENV{AUTOBUILD}) + IF(WIN32) + SET(AUTOBUILD_EXE_NAMES autobuild.exe autobuild.cmd) + ELSE(WIN32) + SET(AUTOBUILD_EXE_NAMES autobuild) + ENDIF(WIN32) + + SET(AUTOBUILD_EXECUTABLE) + FIND_PROGRAM( + AUTOBUILD_EXECUTABLE + NAMES ${AUTOBUILD_EXE_NAMES} + PATHS + ENV PATH + ${CMAKE_SOURCE_DIR}/.. + ${CMAKE_SOURCE_DIR}/../.. + ${CMAKE_SOURCE_DIR}/../../.. + PATH_SUFFIXES "/autobuild/bin/" + ) + ENDIF (DEFINED ENV{AUTOBUILD}) + + IF (NOT AUTOBUILD_EXECUTABLE) + IF (AUTOBUILD_FIND_REQUIRED) + MESSAGE(FATAL_ERROR "Could not find autobuild executable") + ENDIF (AUTOBUILD_FIND_REQUIRED) + ENDIF (NOT AUTOBUILD_EXECUTABLE) + + MARK_AS_ADVANCED(AUTOBUILD_EXECUTABLE) +ENDIF (NOT AUTOBUILD_EXECUTABLE) diff --git a/indra/cmake/FreeType.cmake b/indra/cmake/FreeType.cmake index 5cca587cf..2d6025f3a 100644 --- a/indra/cmake/FreeType.cmake +++ b/indra/cmake/FreeType.cmake @@ -7,18 +7,7 @@ if (STANDALONE) pkg_check_modules(FREETYPE REQUIRED freetype2) else (STANDALONE) use_prebuilt_binary(freetype) - if(MSVC12) - set(FREETYPE_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include/freetype2 - ${LIBS_PREBUILT_LEGACY_DIR}/include/freetype2 - ) - else(MSVC12) - set(FREETYPE_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) - endif (MSVC12) - + set(FREETYPE_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include/freetype2) set(FREETYPE_LIBRARIES freetype) endif (STANDALONE) diff --git a/indra/cmake/GLOD.cmake b/indra/cmake/GLOD.cmake index d688db2fe..09260582e 100644 --- a/indra/cmake/GLOD.cmake +++ b/indra/cmake/GLOD.cmake @@ -7,10 +7,8 @@ set(GLOD_FIND_REQUIRED ON) if (STANDALONE) include(FindGLOD) else (STANDALONE) - use_prebuilt_binary(GLOD) - set(GLOD_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) - set(GLOD_LIBRARIES glod) + use_prebuilt_binary(glod) + + set(GLOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include) + set(GLOD_LIBRARIES GLOD) endif (STANDALONE) diff --git a/indra/cmake/Hunspell.cmake b/indra/cmake/Hunspell.cmake index 3ea97afdf..67cf600bd 100644 --- a/indra/cmake/Hunspell.cmake +++ b/indra/cmake/Hunspell.cmake @@ -4,16 +4,12 @@ include(Prebuilt) if (STANDALONE) include(FindHunSpell) else (STANDALONE) - use_prebuilt_binary(hunspell) - - set(HUNSPELL_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/include/hunspell - ${LIBS_PREBUILT_LEGACY_DIR}/include/hunspell - ) + use_prebuilt_binary(libhunspell) - if (LINUX OR DARWIN) - set(HUNSPELL_LIBRARY hunspell-1.3) - else (LINUX OR DARWIN) - set(HUNSPELL_LIBRARY libhunspell) - endif (LINUX OR DARWIN) + if (LINUX OR DARWIN) + set(HUNSPELL_LIBRARY hunspell-1.3) + else (LINUX OR DARWIN) + set(HUNSPELL_LIBRARY libhunspell) + endif (LINUX OR DARWIN) + set(HUNSPELL_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/hunspell ) endif (STANDALONE) diff --git a/indra/cmake/JPEG.cmake b/indra/cmake/JPEG.cmake index 2fe1beb51..fd04fcce1 100644 --- a/indra/cmake/JPEG.cmake +++ b/indra/cmake/JPEG.cmake @@ -19,8 +19,5 @@ else (STANDALONE) elseif (WINDOWS) set(JPEG_LIBRARIES jpeglib) endif (LINUX) - set(JPEG_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) + set(JPEG_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE) diff --git a/indra/cmake/JsonCpp.cmake b/indra/cmake/JsonCpp.cmake index 3ab859d4d..3519ce4b9 100644 --- a/indra/cmake/JsonCpp.cmake +++ b/indra/cmake/JsonCpp.cmake @@ -10,22 +10,13 @@ if (STANDALONE) else (STANDALONE) use_prebuilt_binary(jsoncpp) if (WINDOWS) - if(MSVC12) - set(JSONCPP_LIBRARIES - debug json_vc${MSVC_SUFFIX}debug_libmt.lib - optimized json_vc${MSVC_SUFFIX}_libmt) - else(MSVC12) - set(JSONCPP_LIBRARIES - debug json_vc${MSVC_SUFFIX}d - optimized json_vc${MSVC_SUFFIX}) - endif(MSVC12) + set(JSONCPP_LIBRARIES + debug jsoncppd.lib + optimized jsoncpp.lib) elseif (DARWIN) set(JSONCPP_LIBRARIES json_linux-gcc-4.0.1_libmt) elseif (LINUX) set(JSONCPP_LIBRARIES jsoncpp) endif (WINDOWS) - set(JSONCPP_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/include/jsoncpp - ${LIBS_PREBUILT_LEGACY_DIR}/include/jsoncpp - ) + set(JSONCPP_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/jsoncpp) endif (STANDALONE) diff --git a/indra/cmake/LLAudio.cmake b/indra/cmake/LLAudio.cmake index 440032967..1f5fd63ed 100644 --- a/indra/cmake/LLAudio.cmake +++ b/indra/cmake/LLAudio.cmake @@ -1,6 +1,7 @@ # -*- cmake -*- include(Audio) +include(OPENAL) set(LLAUDIO_INCLUDE_DIRS ${LIBS_OPEN_DIR}/llaudio diff --git a/indra/cmake/LLPrimitive.cmake b/indra/cmake/LLPrimitive.cmake index dd1d806d5..f508d7e9a 100644 --- a/indra/cmake/LLPrimitive.cmake +++ b/indra/cmake/LLPrimitive.cmake @@ -1,18 +1,25 @@ # -*- cmake -*- +# these should be moved to their own cmake file +include(Prebuilt) +include(Boost) include(Colladadom) + +use_prebuilt_binary(libxml2) + set(LLPRIMITIVE_INCLUDE_DIRS ${LIBS_OPEN_DIR}/llprimitive ${COLLADADOM_INCLUDE_DIRS} ) if (WINDOWS) - set(LLPRIMITIVE_LIBRARIES - debug llprimitive - optimized llprimitive - ${COLLADADOM_LIBRARIES} - ) + set(LLPRIMITIVE_LIBRARIES + llprimitive + ${COLLADADOM_LIBRARIES} + libxml2_a + ${BOOST_SYSTEM_LIBRARIES} + ) else (WINDOWS) set(LLPRIMITIVE_LIBRARIES llprimitive diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake index 982b2d3f7..4ba1d4c02 100644 --- a/indra/cmake/LLSharedLibs.cmake +++ b/indra/cmake/LLSharedLibs.cmake @@ -1,13 +1,12 @@ # ll_deploy_sharedlibs_command # target_exe: the cmake target of the executable for which the shared libs will be deployed. macro(ll_deploy_sharedlibs_command target_exe) - SET(OUTPUT_PATH $) - + set(OUTPUT_PATH $) + if(DARWIN) SET_TEST_PATH(SEARCH_DIRS) get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE) if(IS_BUNDLE) - # If its a bundle the exe is not in the target location, this should find it. set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources) endif(IS_BUNDLE) elseif(WINDOWS) @@ -38,8 +37,7 @@ macro(ll_stage_sharedlib DSO_TARGET) # Also this directory is shared with RunBuildTest.cmake, y'know, for the tests. set_target_properties(${DSO_TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${SHARED_LIB_STAGING_DIR}) if(NOT WINDOWS) - - SET(DSO_PATH $) + get_target_property(DSO_PATH ${DSO_TARGET} LOCATION) get_filename_component(DSO_FILE ${DSO_PATH} NAME) if(DARWIN) set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources) diff --git a/indra/cmake/Linking.cmake b/indra/cmake/Linking.cmake index a0ce0f6f1..43ec796dd 100644 --- a/indra/cmake/Linking.cmake +++ b/indra/cmake/Linking.cmake @@ -1,42 +1,50 @@ # -*- cmake -*- + if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES") include(Variables) -if (NOT STANDALONE) +set(ARCH_PREBUILT_DIRS ${AUTOBUILD_INSTALL_DIR}/lib) +set(ARCH_PREBUILT_DIRS_PLUGINS ${AUTOBUILD_INSTALL_DIR}/plugins) +set(ARCH_PREBUILT_DIRS_RELEASE ${AUTOBUILD_INSTALL_DIR}/lib/release) +set(ARCH_PREBUILT_DIRS_DEBUG ${AUTOBUILD_INSTALL_DIR}/lib/debug) +if (WINDOWS) + set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs) + set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs) +elseif (LINUX) + set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/lib) + set(EXE_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs/bin) +elseif (DARWIN) + set(SHARED_LIB_STAGING_DIR ${CMAKE_BINARY_DIR}/sharedlibs) + set(EXE_STAGING_DIR "${CMAKE_BINARY_DIR}/sharedlibs") +endif (WINDOWS) - if(CMAKE_BUILD_TYPE) - string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER) - endif(CMAKE_BUILD_TYPE) +# Autobuild packages must provide 'release' versions of libraries, but may provide versions for +# specific build types. AUTOBUILD_LIBS_INSTALL_DIRS lists first the build type directory and then +# the 'release' directory (as a default fallback). +# *NOTE - we have to take special care to use CMAKE_CFG_INTDIR on IDE generators (like mac and +# windows) and CMAKE_BUILD_TYPE on Makefile based generators (like linux). The reason for this is +# that CMAKE_BUILD_TYPE is essentially meaningless at configuration time for IDE generators and +# CMAKE_CFG_INTDIR is meaningless at build time for Makefile generators +if(WINDOWS OR DARWIN) + # the cmake xcode and VS generators implicitly append ${CMAKE_CFG_INTDIR} to the library paths for us + # fortunately both windows and darwin are case insensitive filesystems so this works. + set(AUTOBUILD_LIBS_INSTALL_DIRS "${AUTOBUILD_INSTALL_DIR}/lib/") +else(WINDOWS OR DARWIN) + # else block is for linux and any other makefile based generators + string(TOLOWER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_LOWER) + set(AUTOBUILD_LIBS_INSTALL_DIRS ${AUTOBUILD_INSTALL_DIR}/lib/${CMAKE_BUILD_TYPE_LOWER}) +endif(WINDOWS OR DARWIN) - if(WINDOWS OR ${CMAKE_GENERATOR} MATCHES "Xcode") - # the cmake xcode and VS generators implicitly append ${CMAKE_CFG_INTDIR} to the library paths for us - # fortunately both windows and darwin are case insensitive filesystems so this works. - set(ARCH_PREBUILT_LINK_DIRS - ${LIBS_PREBUILT_DIR}/lib - ${LIBS_PREBUILT_LEGACY_DIR}/lib - ) - else(WINDOWS OR ${CMAKE_GENERATOR} MATCHES "Xcode") - # else block is for linux and any other makefile based generators - set(ARCH_PREBUILT_LINK_DIRS - ${LIBS_PREBUILT_DIR}/lib/${CMAKE_BUILD_TYPE_LOWER} - ${LIBS_PREBUILT_LEGACY_DIR}/lib/${CMAKE_BUILD_TYPE_LOWER} - ) - endif(WINDOWS OR ${CMAKE_GENERATOR} MATCHES "Xcode") +if (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release") + # When we're building something other than Release, append the + # packages/lib/release directory to deal with autobuild packages that don't + # provide (e.g.) lib/debug libraries. + list(APPEND AUTOBUILD_LIBS_INSTALL_DIRS ${ARCH_PREBUILT_DIRS_RELEASE}) +endif (NOT "${CMAKE_BUILD_TYPE}" STREQUAL "Release") - if (NOT "${CMAKE_BUILD_TYPE_LOWER}" STREQUAL "release") - # When we're building something other than Release, append the - # packages/lib/release directory to deal with autobuild packages that don't - # provide (e.g.) lib/debug libraries. - list(APPEND ARCH_PREBUILT_LINK_DIRS - ${LIBS_PREBUILT_DIR}/lib/release - ${LIBS_PREBUILT_LEGACY_DIR}/lib/release - ) - endif (NOT "${CMAKE_BUILD_TYPE_LOWER}" STREQUAL "release") -endif (NOT STANDALONE) - -link_directories(${ARCH_PREBUILT_LINK_DIRS}) +link_directories(${AUTOBUILD_LIBS_INSTALL_DIRS}) if (LINUX) set(DL_LIBRARY dl) @@ -46,10 +54,11 @@ else (LINUX) set(PTHREAD_LIBRARY "") endif (LINUX) -if (WINDOWS) +if (WINDOWS) set(WINDOWS_LIBRARIES advapi32 shell32 + ole32 ws2_32 mswsock psapi diff --git a/indra/cmake/NDOF.cmake b/indra/cmake/NDOF.cmake index d7fb4e686..b742874e2 100644 --- a/indra/cmake/NDOF.cmake +++ b/indra/cmake/NDOF.cmake @@ -7,7 +7,11 @@ if (STANDALONE) message(STATUS "Building without N-DoF joystick support") endif(NOT NDOF_FOUND) else (STANDALONE) - use_prebuilt_binary(ndofdev) + if (WINDOWS OR DARWIN) + use_prebuilt_binary(libndofdev) + elseif (LINUX) + use_prebuilt_binary(open-libndofdev) + endif (WINDOWS OR DARWIN) if (WINDOWS) set(NDOF_LIBRARY libndofdev) @@ -15,10 +19,7 @@ else (STANDALONE) set(NDOF_LIBRARY ndofdev) endif (WINDOWS) - set(NDOF_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/include/ndofdev - ${LIBS_PREBUILT_LEGACY_DIR}/include/ndofdev - ) + set(NDOF_INCLUDE_DIR ${ARCH_PREBUILT_DIRS}/include/ndofdev) set(NDOF_FOUND 1) endif (STANDALONE) @@ -26,6 +27,8 @@ if (NDOF_FOUND) add_definitions(-DLIB_NDOF=1) include_directories(${NDOF_INCLUDE_DIR}) else (NDOF_FOUND) + message(STATUS "Building without N-DoF joystick support") set(NDOF_INCLUDE_DIR "") set(NDOF_LIBRARY "") endif (NDOF_FOUND) + diff --git a/indra/cmake/OpenSSL.cmake b/indra/cmake/OpenSSL.cmake index d363e6af3..2860a800e 100644 --- a/indra/cmake/OpenSSL.cmake +++ b/indra/cmake/OpenSSL.cmake @@ -7,16 +7,13 @@ set(OpenSSL_FIND_REQUIRED ON) if (STANDALONE OR USE_SYSTEM_OPENSSL) include(FindOpenSSL) else (STANDALONE OR USE_SYSTEM_OPENSSL) - use_prebuilt_binary(openSSL) + use_prebuilt_binary(openssl) if (WINDOWS) set(OPENSSL_LIBRARIES ssleay32 libeay32) else (WINDOWS) set(OPENSSL_LIBRARIES ssl) endif (WINDOWS) - set(OPENSSL_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) + set(OPENSSL_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE OR USE_SYSTEM_OPENSSL) if (LINUX) diff --git a/indra/cmake/PNG.cmake b/indra/cmake/PNG.cmake index fb71c3067..1f74a3f88 100644 --- a/indra/cmake/PNG.cmake +++ b/indra/cmake/PNG.cmake @@ -9,11 +9,7 @@ if (STANDALONE) else (STANDALONE) use_prebuilt_binary(libpng) if (WINDOWS) - if(MSVC12) - set(PNG_LIBRARIES libpng16) - else(MSVC12) - set(PNG_LIBRARIES libpng15) - endif(MSVC12) + set(PNG_LIBRARIES libpng16) elseif(DARWIN) set(PNG_LIBRARIES png15) else(LINUX) diff --git a/indra/cmake/Prebuilt.cmake b/indra/cmake/Prebuilt.cmake index 2295a7574..38e24f13d 100644 --- a/indra/cmake/Prebuilt.cmake +++ b/indra/cmake/Prebuilt.cmake @@ -3,14 +3,64 @@ if(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) set(${CMAKE_CURRENT_LIST_FILE}_INCLUDED "YES") +include(FindAutobuild) +include(Variables) +if(INSTALL_PROPRIETARY) + include(FindSCP) +endif(INSTALL_PROPRIETARY) + +set(PREBUILD_TRACKING_DIR ${AUTOBUILD_INSTALL_DIR}/cmake_tracking) +# For the library installation process; +# see cmake/Prebuild.cmake for the counterpart code. +if ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${PREBUILD_TRACKING_DIR}/sentinel_installed") + file(MAKE_DIRECTORY ${PREBUILD_TRACKING_DIR}) + file(WRITE ${PREBUILD_TRACKING_DIR}/sentinel_installed "0") +endif ("${CMAKE_SOURCE_DIR}/../autobuild.xml" IS_NEWER_THAN "${PREBUILD_TRACKING_DIR}/sentinel_installed") + +# The use_prebuilt_binary macro handles automated installation of package +# dependencies using autobuild. The goal is that 'autobuild install' should +# only be run when we know we need to install a new package. This should be +# the case in a clean checkout, or if autobuild.xml has been updated since the +# last run (encapsulated by the file ${PREBUILD_TRACKING_DIR}/sentinel_installed), +# or if a previous attempt to install the package has failed (the exit status +# of previous attempts is serialized in the file +# ${PREBUILD_TRACKING_DIR}/${_binary}_installed) macro (use_prebuilt_binary _binary) - if(NOT STANDALONE) - get_property(PREBUILT_PACKAGES TARGET prepare PROPERTY PREBUILT) - list(FIND PREBUILT_PACKAGES ${_binary} _index) - if(_index LESS 0) - set_property(TARGET prepare APPEND PROPERTY PREBUILT ${_binary}) - endif(_index LESS 0) - endif(NOT STANDALONE) + if (NOT DEFINED USESYSTEMLIBS_${_binary}) + set(USESYSTEMLIBS_${_binary} ${USESYSTEMLIBS}) + endif (NOT DEFINED USESYSTEMLIBS_${_binary}) + + if (NOT USESYSTEMLIBS_${_binary}) + if("${${_binary}_installed}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/${_binary}_installed") + file(READ ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${_binary}_installed") + if(DEBUG_PREBUILT) + message(STATUS "${_binary}_installed: \"${${_binary}_installed}\"") + endif(DEBUG_PREBUILT) + endif("${${_binary}_installed}" STREQUAL "" AND EXISTS "${PREBUILD_TRACKING_DIR}/${_binary}_installed") + + if(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) + if(DEBUG_PREBUILT) + message("cd ${CMAKE_SOURCE_DIR} && ${AUTOBUILD_EXECUTABLE} install + --install-dir=${AUTOBUILD_INSTALL_DIR} + ${_binary} ") + endif(DEBUG_PREBUILT) + execute_process(COMMAND "${AUTOBUILD_EXECUTABLE}" + install + --install-dir=${AUTOBUILD_INSTALL_DIR} + -p ${AUTOBUILD_PLATFORM_NAME} + ${_binary} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" + RESULT_VARIABLE ${_binary}_installed + ) + file(WRITE ${PREBUILD_TRACKING_DIR}/${_binary}_installed "${${_binary}_installed}") + endif(${PREBUILD_TRACKING_DIR}/sentinel_installed IS_NEWER_THAN ${PREBUILD_TRACKING_DIR}/${_binary}_installed OR NOT ${${_binary}_installed} EQUAL 0) + + if(NOT ${_binary}_installed EQUAL 0) + message(FATAL_ERROR + "Failed to download or unpack prebuilt '${_binary}'." + " Process returned ${${_binary}_installed}.") + endif (NOT ${_binary}_installed EQUAL 0) + endif (NOT USESYSTEMLIBS_${_binary}) endmacro (use_prebuilt_binary _binary) endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) diff --git a/indra/cmake/TemplateCheck.cmake b/indra/cmake/TemplateCheck.cmake index 3b73dc82d..2fada2eda 100644 --- a/indra/cmake/TemplateCheck.cmake +++ b/indra/cmake/TemplateCheck.cmake @@ -8,7 +8,7 @@ macro (check_message_template _target) PRE_LINK COMMAND ${PYTHON_EXECUTABLE} ARGS ${SCRIPTS_DIR}/template_verifier.py - --mode=development --cache_master - COMMENT "Verifying message template" + --mode=development --cache_master --master_url=${TEMPLATE_VERIFIER_MASTER_URL} ${TEMPLATE_VERIFIER_OPTIONS} + COMMENT "Verifying message template - See http://wiki.secondlife.com/wiki/Template_verifier.py" ) endmacro (check_message_template) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 5b9890d5b..2d581ff59 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -23,26 +23,59 @@ set(LIBS_CLOSED_PREFIX) set(LIBS_OPEN_PREFIX) set(SCRIPTS_PREFIX ../scripts) set(VIEWER_PREFIX) +set(INTEGRATION_TESTS_PREFIX) -set(LIBS_CLOSED_DIR ${CMAKE_SOURCE_DIR}/${LIBS_CLOSED_PREFIX}) -set(LIBS_OPEN_DIR ${CMAKE_SOURCE_DIR}/${LIBS_OPEN_PREFIX}) -set(SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/${SCRIPTS_PREFIX}) -set(VIEWER_DIR ${CMAKE_SOURCE_DIR}/${VIEWER_PREFIX}) set(DISABLE_TCMALLOC OFF CACHE BOOL "Disable linkage of TCMalloc. (64bit builds automatically disable TCMalloc)") set(LL_TESTS OFF CACHE BOOL "Build and run unit and integration tests (disable for build timing runs to reduce variation)") set(DISABLE_FATAL_WARNINGS TRUE CACHE BOOL "Set this to FALSE to enable fatal warnings.") +if(LIBS_CLOSED_DIR) + file(TO_CMAKE_PATH "${LIBS_CLOSED_DIR}" LIBS_CLOSED_DIR) +else(LIBS_CLOSED_DIR) + set(LIBS_CLOSED_DIR ${CMAKE_SOURCE_DIR}/${LIBS_CLOSED_PREFIX}) +endif(LIBS_CLOSED_DIR) +if(LIBS_COMMON_DIR) + file(TO_CMAKE_PATH "${LIBS_COMMON_DIR}" LIBS_COMMON_DIR) +else(LIBS_COMMON_DIR) + set(LIBS_COMMON_DIR ${CMAKE_SOURCE_DIR}/${LIBS_OPEN_PREFIX}) +endif(LIBS_COMMON_DIR) +set(LIBS_OPEN_DIR ${LIBS_COMMON_DIR}) + +set(SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/${SCRIPTS_PREFIX}) +set(VIEWER_DIR ${CMAKE_SOURCE_DIR}/${VIEWER_PREFIX}) + +set(AUTOBUILD_INSTALL_DIR ${CMAKE_BINARY_DIR}/packages) + +set(LIBS_PREBUILT_DIR ${AUTOBUILD_INSTALL_DIR} CACHE PATH + "Location of prebuilt libraries.") + +if (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake) + # We use this as a marker that you can try to use the proprietary libraries. + set(INSTALL_PROPRIETARY ON CACHE BOOL "Install proprietary binaries") +endif (EXISTS ${CMAKE_SOURCE_DIR}/Server.cmake) +set(TEMPLATE_VERIFIER_OPTIONS "" CACHE STRING "Options for scripts/template_verifier.py") +set(TEMPLATE_VERIFIER_MASTER_URL "http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg" CACHE STRING "Location of the master message template") + +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING + "Build type. One of: Debug Release RelWithDebInfo" FORCE) +endif (NOT CMAKE_BUILD_TYPE) + if (${CMAKE_SYSTEM_NAME} MATCHES "Windows") set(WINDOWS ON BOOL FORCE) - if (WORD_SIZE EQUAL 32) - set(ARCH i686) + if (WORD_SIZE EQUAL 64) + set(ARCH x86_64 CACHE STRING "Viewer Architecture") + set(LL_ARCH ${ARCH}_win64) + set(LL_ARCH_DIR ${ARCH}-win64) + set(WORD_SIZE 64) + set(AUTOBUILD_PLATFORM_NAME "windows64") + else (WORD_SIZE EQUAL 64) + set(ARCH i686 CACHE STRING "Viewer Architecture") set(LL_ARCH ${ARCH}_win32) set(LL_ARCH_DIR ${ARCH}-win32) - elseif (WORD_SIZE EQUAL 64) - set(ARCH x86_64) - set(LL_ARCH ${ARCH}_win) - set(LL_ARCH_DIR ${ARCH}-win) - endif (WORD_SIZE EQUAL 32) + set(WORD_SIZE 32) + set(AUTOBUILD_PLATFORM_NAME "windows") + endif (WORD_SIZE EQUAL 64) endif (${CMAKE_SYSTEM_NAME} MATCHES "Windows") if (${CMAKE_SYSTEM_NAME} MATCHES "Linux") @@ -98,25 +131,6 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") COMMAND sh -c "xcodebuild -version | grep Xcode | cut -d ' ' -f2 | cut -d'.' -f1-2" OUTPUT_VARIABLE XCODE_VERSION ) string(REGEX REPLACE "(\r?\n)+$" "" XCODE_VERSION "${XCODE_VERSION}") - -# # To support a different SDK update these Xcode settings: -# if (XCODE_VERSION GREATER 4.9) # (Which would be 5.0+) -# set(CMAKE_OSX_DEPLOYMENT_TARGET 10.8) -# set(CMAKE_OSX_SYSROOT macosx10.9) -# else (XCODE_VERION GREATER 4.9) -# if (XCODE_VERSION GREATER 4.5) -# set(CMAKE_OSX_DEPLOYMENT_TARGET 10.7) -# set(CMAKE_OSX_SYSROOT macosx10.8) -# else (XCODE_VERSION GREATER 4.5) -# if (XCODE_VERSION GREATER 4.2) -# set(CMAKE_OSX_DEPLOYMENT_TARGET 10.6) -# set(CMAKE_OSX_SYSROOT macosx10.7) -# else (XCODE_VERSION GREATER 4.2) -# set(CMAKE_OSX_DEPLOYMENT_TARGET 10.6) -# set(CMAKE_OSX_SYSROOT macosx10.7) -# endif (XCODE_VERSION GREATER 4.2) -# endif (XCODE_VERSION GREATER 4.5) -# endif (XCODE_VERSION GREATER 4.9) # Hardcode SDK we build against until we can test and allow newer ones # as autodetected in the code above @@ -151,28 +165,11 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set(LL_ARCH_DIR universal-darwin) endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") -set(LIBS_PREBUILT_DIR ${CMAKE_BINARY_DIR}/packages CACHE PATH - "Location of prebuilt libraries.") - -set(LIBS_PREBUILT_LEGACY_DIR ${CMAKE_BINARY_DIR}/packages/libraries/${LL_ARCH_DIR} CACHE PATH - "Legacy location of prebuilt libraries.") - -if (WINDOWS AND WORD_SIZE EQUAL 32) - set(PREBUILT_TYPE windows) -elseif (WINDOWS AND WORD_SIZE EQUAL 64) - set(PREBUILT_TYPE windows64) -elseif(DARWIN) - set(PREBUILT_TYPE darwin) -elseif(LINUX AND WORD_SIZE EQUAL 32) - set(PREBUILT_TYPE linux) -elseif(LINUX AND WORD_SIZE EQUAL 64) - set(PREBUILT_TYPE linux64) -endif(WINDOWS AND WORD_SIZE EQUAL 32) - # Default deploy grid set(GRID agni CACHE STRING "Target Grid") set(VIEWER_CHANNEL "Singularity" CACHE STRING "Viewer Channel Name") + set(VIEWER_LOGIN_CHANNEL "${VIEWER_CHANNEL}" CACHE STRING "Fake login channel for A/B Testing") set(VIEWER_BRANDING_ID "singularity" CACHE STRING "Viewer branding id (currently secondlife|snowglobe)") diff --git a/indra/cmake/ViewerMiscLibs.cmake b/indra/cmake/ViewerMiscLibs.cmake index 275b840a0..c0a20e183 100644 --- a/indra/cmake/ViewerMiscLibs.cmake +++ b/indra/cmake/ViewerMiscLibs.cmake @@ -2,7 +2,7 @@ include(Prebuilt) if (NOT STANDALONE) - use_prebuilt_binary(vivox) + use_prebuilt_binary(slvoice) if(LINUX) use_prebuilt_binary(libuuid) if (${ARCH} STREQUAL "x86_64") diff --git a/indra/cmake/XmlRpcEpi.cmake b/indra/cmake/XmlRpcEpi.cmake index 2c93fd20c..5d59c90db 100644 --- a/indra/cmake/XmlRpcEpi.cmake +++ b/indra/cmake/XmlRpcEpi.cmake @@ -8,9 +8,13 @@ if (STANDALONE) include(FindXmlRpcEpi) else (STANDALONE) use_prebuilt_binary(xmlrpc-epi) - set(XMLRPCEPI_LIBRARIES xmlrpc-epi) - set(XMLRPCEPI_INCLUDE_DIRS - ${LIBS_PREBUILT_DIR}/include - ${LIBS_PREBUILT_LEGACY_DIR}/include - ) + if (WINDOWS) + set(XMLRPCEPI_LIBRARIES + debug xmlrpc-epid + optimized xmlrpc-epi + ) + else (WINDOWS) + set(XMLRPCEPI_LIBRARIES xmlrpc-epi) + endif (WINDOWS) + set(XMLRPCEPI_INCLUDE_DIRS ${LIBS_PREBUILT_DIR}/include) endif (STANDALONE) diff --git a/indra/cmake/cmake_dummy.cpp b/indra/cmake/cmake_dummy.cpp index 25191e2a1..ae4475a73 100644 --- a/indra/cmake/cmake_dummy.cpp +++ b/indra/cmake/cmake_dummy.cpp @@ -1,30 +1,24 @@ /** * @file cmake_dummy.cpp * - * $LicenseInfo:firstyear=2008&license=viewergpl$ - * - * Copyright (c) 2008-2009, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 + * Copyright (C) 2010, Linden Research, Inc. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ diff --git a/indra/copy_win_scripts/start-client.py b/indra/copy_win_scripts/start-client.py index 5f7ff2f29..5699f5273 100644 --- a/indra/copy_win_scripts/start-client.py +++ b/indra/copy_win_scripts/start-client.py @@ -1,4 +1,28 @@ #!/usr/bin/env python +"""\ +@file start-client.py + +$LicenseInfo:firstyear=2010&license=viewerlgpl$ +Second Life Viewer Source Code +Copyright (C) 2010-2011, Linden Research, Inc. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; +version 2.1 of the License only. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +$/LicenseInfo$ +""" import sys, getopt import os import llstart diff --git a/indra/develop.py b/indra/develop.py deleted file mode 100755 index 018003c87..000000000 --- a/indra/develop.py +++ /dev/null @@ -1,941 +0,0 @@ -#!/usr/bin/env python -# -# @file develop.py -# @authors Bryan O'Sullivan, Mark Palange, Aaron Brashears -# @brief Fire and forget script to appropriately configure cmake for SL. -# -# $LicenseInfo:firstyear=2007&license=viewergpl$ -# -# Copyright (c) 2007-2009, Linden Research, Inc. -# -# Second Life Viewer Source Code -# The source code in this file ("Source Code") is provided by Linden Lab -# to you under the terms of the GNU General Public License, version 2.0 -# ("GPL"), unless you have obtained a separate licensing agreement -# ("Other License"), formally executed by you and Linden Lab. Terms of -# the GPL can be found in doc/GPL-license.txt in this distribution, or -# online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 -# -# There are special exceptions to the terms and conditions of the GPL as -# it is applied to this Source Code. View the full text of the exception -# in the file doc/FLOSS-exception.txt in this software distribution, or -# online at -# http://secondlifegrid.net/programs/open_source/licensing/flossexception -# -# By copying, modifying or distributing this software, you acknowledge -# that you have read and understood your obligations described above, -# and agree to abide by those obligations. -# -# ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO -# WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, -# COMPLETENESS OR PERFORMANCE. -# $/LicenseInfo$ - - -import errno -import getopt -import os -import random -import re -import shutil -import socket -import sys -import commands -import shlex - -class CommandError(Exception): - pass - -def mkdir(path): - try: - os.mkdir(path) - return path - except OSError, err: - if err.errno != errno.EEXIST or not os.path.isdir(path): - raise - -def prettyprint_path_for_cmake(path): - if 'a' <= path[0] <= 'z' and path[1] == ':': - # CMake wants DOS drive letters to be in uppercase. The above - # condition never asserts on platforms whose full path names - # always begin with a slash, so we don't need to test whether - # we are running on Windows. - path = path[0].upper() + path[1:] - return path - -def getcwd(): - return prettyprint_path_for_cmake(os.getcwd()) - -source_indra = prettyprint_path_for_cmake(os.path.dirname(os.path.realpath(__file__))) - -def quote(opts): - return '"' + '" "'.join([ opt.replace('"', '') for opt in opts ]) + '"' - -class PlatformSetup(object): - generator = None - build_types = {} - for t in ('Debug', 'Release', 'RelWithDebInfo'): - build_types[t.lower()] = t - - build_type = build_types['relwithdebinfo'] - standalone = 'OFF' - unattended = 'OFF' - universal = 'OFF' - project_name = 'Singularity' - distcc = True - cmake_opts = [] - word_size = 32 - using_express = False - - def __init__(self): - self.script_dir = os.path.realpath( - os.path.dirname(__import__(__name__).__file__)) - - def os(self): - '''Return the name of the OS.''' - - raise NotImplemented('os') - - def arch(self): - '''Return the CPU architecture.''' - - return None - - def platform(self): - '''Return a stringified two-tuple of the OS name and CPU - architecture.''' - - ret = self.os() - if self.arch(): - ret += '-' + self.arch() - return ret - - def build_dirs(self): - '''Return the top-level directories in which builds occur. - This can return more than one directory, e.g. if doing a - 32-bit viewer and server build on Linux.''' - - if(os.path.basename(os.path.normpath(os.getcwd())) == 'indra'): - prefix = '../' - else: - prefix = '' - - return [prefix+'build-' + self.platform()] - - def cmake_commandline(self, src_dir, build_dir, opts, simple): - '''Return the command line to run cmake with.''' - - args = dict( - dir=src_dir, - generator=self.generator, - opts=quote(opts), - standalone=self.standalone, - unattended=self.unattended, - word_size=self.word_size, - type=self.build_type.upper(), - ) - #if simple: - # return 'cmake %(opts)s %(dir)r' % args - return ('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s ' - '-DSTANDALONE:BOOL=%(standalone)s ' - '-DUNATTENDED:BOOL=%(unattended)s ' - '-DWORD_SIZE:STRING=%(word_size)s ' - '-G %(generator)r %(opts)s %(dir)r' % args) - - def run_cmake(self, args=[]): - '''Run cmake.''' - - # do a sanity check to make sure we have a generator - if not hasattr(self, 'generator'): - raise "No generator available for '%s'" % (self.__name__,) - cwd = getcwd() - created = [] - try: - for d in self.build_dirs(): - simple = True - if mkdir(d): - created.append(d) - simple = False - try: - os.chdir(d) - cmd = self.cmake_commandline(source_indra, d, args, simple) - print 'Running %r in %r' % (cmd, d) - self.run(cmd, 'cmake') - finally: - os.chdir(cwd) - except: - # If we created a directory in which to run cmake and - # something went wrong, the directory probably just - # contains garbage, so delete it. - os.chdir(cwd) - for d in created: - print 'Cleaning %r' % d - shutil.rmtree(d) - raise - - def parse_build_opts(self, arguments): - opts, targets = getopt.getopt(arguments, 'D:o:', ['option=']) - build_opts = [] - for o, a in opts: - if o in ('-o', '--option'): - build_opts.append(a) - return build_opts, targets - - def run_build(self, opts, targets): - '''Build the default targets for this platform.''' - - raise NotImplemented('run_build') - - def cleanup(self): - '''Delete all build directories.''' - - cleaned = 0 - for d in self.build_dirs(): - if os.path.isdir(d): - print 'Cleaning %r' % d - shutil.rmtree(d) - cleaned += 1 - if not cleaned: - print 'Nothing to clean up!' - - def is_internal_tree(self): - '''Indicate whether we are building in an internal source tree.''' - - return os.path.isdir(os.path.join(self.script_dir, 'newsim')) - - def find_in_path(self, name, defval=None, basename=False): - for ext in self.exe_suffixes: - name_ext = name + ext - if os.sep in name_ext: - path = os.path.abspath(name_ext) - if os.access(path, os.X_OK): - return [basename and os.path.basename(path) or path] - for p in os.getenv('PATH', self.search_path).split(os.pathsep): - path = os.path.join(p, name_ext) - if os.access(path, os.X_OK): - return [basename and os.path.basename(path) or path] - if defval: - return [defval] - return [] - - -class UnixSetup(PlatformSetup): - '''Generic Unixy build instructions.''' - - search_path = '/usr/bin:/usr/local/bin' - exe_suffixes = ('',) - - def __init__(self): - PlatformSetup.__init__(self) - super(UnixSetup, self).__init__() - self.generator = 'Unix Makefiles' - - def os(self): - return 'unix' - - def arch(self): - cpu = os.uname()[-1] - if cpu.endswith('386'): - cpu = 'i386' - elif cpu.endswith('86'): - cpu = 'i686' - elif cpu in ('athlon',): - cpu = 'i686' - elif cpu == 'Power Macintosh': - cpu = 'ppc' - elif cpu == 'x86_64' and self.word_size == 32: - cpu = 'i686' - return cpu - - def run(self, command, name=None): - '''Run a program. If the program fails, raise an exception.''' - ret = os.system(command) - if ret: - if name is None: - name = command.split(None, 1)[0] - if os.WIFEXITED(ret): - st = os.WEXITSTATUS(ret) - if st == 127: - event = 'was not found' - else: - event = 'exited with status %d' % st - elif os.WIFSIGNALED(ret): - event = 'was killed by signal %d' % os.WTERMSIG(ret) - else: - event = 'died unexpectedly (!?) with 16-bit status %d' % ret - raise CommandError('the command %r %s' % - (name, event)) - - -class LinuxSetup(UnixSetup): - def __init__(self): - UnixSetup.__init__(self) - super(LinuxSetup, self).__init__() - try: - self.debian_sarge = open('/etc/debian_version').read().strip() == '3.1' - except: - self.debian_sarge = False - - def os(self): - return 'linux' - - def build_dirs(self): - return [PlatformSetup.build_dirs(self)[0]+'-'+self.build_type.lower()] - - def cmake_commandline(self, src_dir, build_dir, opts, simple): - args = dict( - dir=src_dir, - generator=self.generator, - opts=quote(opts), - standalone=self.standalone, - unattended=self.unattended, - type=self.build_type.upper(), - project_name=self.project_name, - word_size=self.word_size, - cxx="g++" - ) - - cmd = (('cmake -DCMAKE_BUILD_TYPE:STRING=%(type)s ' - '-G %(generator)r -DSTANDALONE:BOOL=%(standalone)s ' - '-DWORD_SIZE:STRING=%(word_size)s ' - '-DROOT_PROJECT_NAME:STRING=%(project_name)s ' - '%(opts)s %(dir)r') - % args) - if 'CXX' not in os.environ: - args.update({'cmd':cmd}) - cmd = ('CXX=%(cxx)r %(cmd)s' % args) - return cmd - - def run_build(self, opts, targets): - job_count = None - - for i in range(len(opts)): - if opts[i].startswith('-j'): - try: - job_count = int(opts[i][2:]) - except ValueError: - try: - job_count = int(opts[i+1]) - except ValueError: - job_count = True - - def get_cpu_count(): - count = 0 - for line in open('/proc/cpuinfo'): - if re.match(r'processor\s*:', line): - count += 1 - return count - - def localhost(): - count = get_cpu_count() - return 'localhost/' + str(count), count - - def get_distcc_hosts(): - try: - hosts = [] - name = os.getenv('DISTCC_DIR', '/etc/distcc') + '/hosts' - for l in open(name): - l = l[l.find('#')+1:].strip() - if l: hosts.append(l) - return hosts - except IOError: - return (os.getenv('DISTCC_HOSTS', '').split() or - [localhost()[0]]) - - def count_distcc_hosts(): - cpus = 0 - hosts = 0 - for host in get_distcc_hosts(): - m = re.match(r'.*/(\d+)', host) - hosts += 1 - cpus += m and int(m.group(1)) or 1 - return hosts, cpus - - def mk_distcc_hosts(basename, range, num_cpus): - '''Generate a list of LL-internal machines to build on.''' - loc_entry, cpus = localhost() - hosts = [loc_entry] - dead = [] - stations = [s for s in xrange(range) if s not in dead] - random.shuffle(stations) - hosts += ['%s%d.lindenlab.com/%d,lzo' % (basename, s, num_cpus) for s in stations] - cpus += 2 * len(stations) - return ' '.join(hosts), cpus - - if job_count is None: - hosts, job_count = count_distcc_hosts() - if hosts == 1: - hostname = socket.gethostname() - if hostname.startswith('station'): - hosts, job_count = mk_distcc_hosts('station', 36, 2) - os.environ['DISTCC_HOSTS'] = hosts - if hostname.startswith('eniac'): - hosts, job_count = mk_distcc_hosts('eniac', 71, 2) - os.environ['DISTCC_HOSTS'] = hosts - if job_count > 4: - job_count = 4; - opts.extend(['-j', str(job_count)]) - - if targets: - targets = ' '.join(targets) - else: - targets = 'all' - - for d in self.build_dirs(): - cmd = 'make -C %r %s %s' % (d, ' '.join(opts), targets) - print 'Running %r' % cmd - self.run(cmd) - - -class DarwinSetup(UnixSetup): - def __init__(self): - UnixSetup.__init__(self) - super(DarwinSetup, self).__init__() - self.generator = 'Xcode' - - def os(self): - return 'darwin' - - def arch(self): - if self.universal == 'ON': - return 'universal' - else: - return UnixSetup.arch(self) - - def build_dirs(self): - if(self.generator == 'Xcode'): - return PlatformSetup.build_dirs(self) - else: - return [PlatformSetup.build_dirs(self)[0]+'-'+self.build_type.lower()] - - def cmake_commandline(self, src_dir, build_dir, opts, simple): - args = dict( - dir=src_dir, - generator=self.generator, - opts=quote(opts), - standalone=self.standalone, - word_size=self.word_size, - unattended=self.unattended, - project_name=self.project_name, - universal='', - type='', - ) - if(self.generator != 'Xcode'): - args['type'] = '-DCMAKE_BUILD_TYPE=%s' % self.build_type.upper() - if self.universal == 'ON': - args['universal'] = '-DCMAKE_OSX_ARCHITECTURES:STRING=\'i386;ppc\'' - #if simple: - # return 'cmake %(opts)s %(dir)r' % args - return ('cmake -G %(generator)r ' - '%(type)s ' - '-DSTANDALONE:BOOL=%(standalone)s ' - '-DUNATTENDED:BOOL=%(unattended)s ' - '-DWORD_SIZE:STRING=%(word_size)s ' - '-DROOT_PROJECT_NAME:STRING=%(project_name)s ' - '%(universal)s ' - '%(opts)s %(dir)r' % args) - - def run_build(self, opts, targets): - if(self.generator != 'Xcode'): - if targets: - targets = ' '.join(targets) - else: - targets = 'all' - - for d in self.build_dirs(): - cmd = 'make -C %r %s %s' % (d, ' '.join(opts), targets) - print 'Running %r' % cmd - self.run(cmd) - return - - cwd = getcwd() - if targets: - targets = ' '.join(['-target ' + repr(t) for t in targets]) - else: - targets = '' - cmd = ('xcodebuild -configuration %s %s %s' % - (self.build_type, ' '.join(opts), targets)) - for d in self.build_dirs(): - try: - os.chdir(d) - print 'Running %r in %r' % (cmd, d) - self.run(cmd) - finally: - os.chdir(cwd) - - -class WindowsSetup(PlatformSetup): - gens = { - 'vc100' : { - 'gen' : r'Visual Studio 10', - 'ver' : r'10.0' - }, - 'vc120' : { - 'gen' : r'Visual Studio 12', - 'ver' : r'12.0' - } - } - - gens['vs2010'] = gens['vc100'] - gens['vs2013'] = gens['vc120'] - - search_path = r'C:\windows' - exe_suffixes = ('.exe', '.bat', '.com') - - def __init__(self): - PlatformSetup.__init__(self) - super(WindowsSetup, self).__init__() - self._generator = None - self.incredibuild = False - - def _get_generator(self): - if self._generator is None: - for version in 'vc100'.split(): - if self.find_visual_studio(version): - self._generator = version - print 'Building with ', self.gens[version]['gen'] - break - else: - print >> sys.stderr, 'Cannot find a Visual Studio installation, testing for express editions' - for version in 'vc100'.split(): - if self.find_visual_studio_express(version): - self._generator = version - self.using_express = True - print 'Building with ', self.gens[version]['gen'] , "Express edition" - break - else: - for version in 'vc100'.split(): - if self.find_visual_studio_express_single(version): - self._generator = version - self.using_express = True - print 'Building with ', self.gens[version]['gen'] , "Express edition" - break - else: - print >> sys.stderr, 'Cannot find any Visual Studio installation' - sys.exit(1) - return self._generator - - def _set_generator(self, gen): - self._generator = gen - - generator = property(_get_generator, _set_generator) - - def get_gen_str(self, gen): - if gen is None: - gen = self._generator - return self.gens[gen.lower()]['ver'] - - def os(self): - return 'win32' - - def build_dirs(self): - if(os.path.basename(os.path.normpath(os.getcwd())) == 'indra'): - prefix = '../' - else: - prefix = '' - - if self.word_size == 64: - return [prefix+'build-' + self.generator + '-Win64'] - else: - return [prefix+'build-' + self.generator] - - def cmake_commandline(self, src_dir, build_dir, opts, simple): - args = dict( - dir=src_dir, - generator=self.gens[self.generator.lower()]['gen'], - opts=quote(opts), - standalone=self.standalone, - unattended=self.unattended, - project_name=self.project_name, - word_size=self.word_size, - ) - if self.word_size == 64: - args["generator"] += r' Win64' - - #if simple: - # return 'cmake %(opts)s "%(dir)s"' % args - return ('cmake -G "%(generator)s" ' - '-DSTANDALONE:BOOL=%(standalone)s ' - '-DUNATTENDED:BOOL=%(unattended)s ' - '-DWORD_SIZE:STRING=%(word_size)s ' - '-DROOT_PROJECT_NAME:STRING=\"%(project_name)s\" ' - '%(opts)s "%(dir)s"' % args) - - def get_HKLM_registry_value(self, key_str, value_str): - import _winreg - reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) - key = _winreg.OpenKey(reg, key_str) - value = _winreg.QueryValueEx(key, value_str)[0] - print 'Found: %s' % value - return value - - def find_visual_studio(self, gen=None): - gen = self.get_gen_str(gen) - value_str = (r'EnvironmentDirectory') - key_str = (r'SOFTWARE\Microsoft\VisualStudio\%s\Setup\VS' % - gen) - print ('Reading VS environment from HKEY_LOCAL_MACHINE\%s\%s' % - (key_str, value_str)) - try: - return self.get_HKLM_registry_value(key_str, value_str) - except WindowsError, err: - key_str = (r'SOFTWARE\Wow6432Node\Microsoft\VisualStudio\%s\Setup\VS' % - gen) - - try: - return self.get_HKLM_registry_value(key_str, value_str) - except: - print >> sys.stderr, "Didn't find ", self.gens[gen]['gen'] - return '' - - def find_msbuild(self, gen=None): - gen = self.get_gen_str(gen) - - key_str = (r'SOFTWARE\Microsoft\MSBuild\ToolsVersions\12.0') - - print ('Checking MSBuild support for vs ver = %s' % gen) - if not self.get_HKLM_registry_value(key_str+'\\'+gen, "VCTargetsPath"): - return (None, None) - print ('Reading MSBuild location from HKEY_LOCAL_MACHINE\%s\MSBuildToolsPath' % - key_str) - print key_str - try: - return (self.get_HKLM_registry_value(key_str, 'MSBuildToolsPath'), gen) - except WindowsError, err: - key_str = (r'SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\%s' % - gen) - - try: - return (self.get_HKLM_registry_value(key_str, 'MSBuildToolsPath'), gen) - except WindowsError, err: - print 'Didn\'t find msbuild' - return (None, None) - - def find_visual_studio_express(self, gen=None): - gen = self.get_gen_str(gen) - try: - import _winreg - key_str = (r'SOFTWARE\Microsoft\VCEXpress\%s\Setup\VC' % - gen) - value_str = (r'ProductDir') - print ('Reading VS environment from HKEY_LOCAL_MACHINE\%s\%s' % - (key_str, value_str)) - print key_str - - reg = _winreg.ConnectRegistry(None, _winreg.HKEY_LOCAL_MACHINE) - key = _winreg.OpenKey(reg, key_str) - value = _winreg.QueryValueEx(key, value_str)[0]+"IDE" - print 'Found: %s' % value - return value - except WindowsError, err: - print >> sys.stderr, "Didn't find ", gen - return '' - - def find_visual_studio_express_single(self, gen=None): - gen = self.get_gen_str(gen) - try: - import _winreg - key_str = (r'SOFTWARE\Microsoft\VCEXpress\%s_Config\Setup\VC' % - gen) - value_str = (r'ProductDir') - print ('Reading VS environment from HKEY_CURRENT_USER\%s\%s' % - (key_str, value_str)) - print key_str - - reg = _winreg.ConnectRegistry(None, _winreg.HKEY_CURRENT_USER) - key = _winreg.OpenKey(reg, key_str) - value = _winreg.QueryValueEx(key, value_str)[0]+"IDE" - print 'Found: %s' % value - return value - except WindowsError, err: - print >> sys.stderr, "Didn't find ", gen - return '' - - def get_build_cmd(self): - if self.incredibuild: - config = self.build_type - if self.gens[self.generator]['ver'] in [ r'8.0', r'9.0' ]: - config = '\"%s|Win32\"' % config - - return "buildconsole \"%s.sln\" /build %s" % (self.project_name, config), None - environment = self.find_visual_studio() - if environment == '': - environment = self.find_visual_studio_express() - if environment == '': - environment = self.find_visual_studio_express_single() - if environment == '': - print >> sys.stderr, "Something went very wrong during build stage, could not find a Visual Studio?" - else: - build_dirs=self.build_dirs() - print >> sys.stderr, "\nSolution generation complete, it can can now be found in:", build_dirs[0] - print >> sys.stderr, "\nAs you are using an Express Visual Studio, the build step cannot be automated" - print >> sys.stderr, "\nPlease see https://wiki.secondlife.com/wiki/Microsoft_Visual_Studio#Extra_steps_for_Visual_Studio_Express_editions for Visual Studio Express specific information" - exit(0) - - msbuild_dir, tool_ver = self.find_msbuild() - - if msbuild_dir is not None and tool_ver is not None: - return ('\"%smsbuild.exe\" \"%s.sln\" /p:configuration=%s /p:VisualStudioVersion=%s' % - (msbuild_dir, self.project_name, self.build_type, tool_ver)), True - - # devenv.com is CLI friendly, devenv.exe... not so much. - return ('"%sdevenv.com" \"%s.sln\" /build %s' % - (self.find_visual_studio(), self.project_name, self.build_type)), None - - def run(self, command, name=None): - '''Run a program. If the program fails, raise an exception.''' - ret = os.system('\"'+command+'\"') - if ret: - if name is None: - name = os.path.normpath(shlex.split(command.encode('utf8'),posix=False)[0].strip('"')) - - path = self.find_in_path(name) - if not path: - ret = 'was not found' - else: - ret = 'exited with status %d' % ret - raise CommandError('the command %r %s' % - (name, ret)) - - def run_cmake(self, args=[]): - '''Override to add the vstool.exe call after running cmake.''' - PlatformSetup.run_cmake(self, args) - if self.unattended == 'OFF': - if self.using_express == False: - self.run_vstool() - - def run_vstool(self): - for build_dir in self.build_dirs(): - stamp = os.path.join(build_dir, 'vstool.txt') - try: - prev_build = open(stamp).read().strip() - except IOError: - prev_build = '' - if prev_build == self.build_type: - # Only run vstool if the build type has changed. - continue - - if(os.path.basename(os.path.normpath(os.getcwd())) == 'indra'): - tool_path = os.path.join('tools','vstool','VSTool.exe') - else: - tool_path = os.path.join('indra','tools','vstool','VSTool.exe') - vstool_cmd = (tool_path + - ' --solution \"' + - os.path.join(build_dir,'%s.sln' % self.project_name) + - '\" --config ' + self.build_type + - ' --startup secondlife-bin') - print 'Running vstool %r in %r' % (vstool_cmd, getcwd()) - self.run(vstool_cmd) - print >> open(stamp, 'w'), self.build_type - - def run_build(self, opts, targets): - cwd = getcwd() - build_cmd, msbuild = self.get_build_cmd() - - for d in self.build_dirs(): - try: - os.chdir(d) - if targets: - if msbuild: - cmd = '%s /target:%s %s' % (build_cmd, ';'.join(targets), ' '.join(opts)) - print 'Running build(targets) %r in %r' % (cmd, d) - self.run(cmd) - else: - for t in targets: - cmd = '%s /project %s %s' % (build_cmd, t, ' '.join(opts)) - print 'Running build(targets) %r in %r' % (cmd, d) - self.run(cmd) - else: - cmd = '%s %s' % (build_cmd, ' '.join(opts)) - print 'Running build %r in %r' % (cmd, d) - self.run(cmd) - finally: - os.chdir(cwd) - -class CygwinSetup(WindowsSetup): - def __init__(self): - super(CygwinSetup, self).__init__() - self.generator = 'vc80' - - def cmake_commandline(self, src_dir, build_dir, opts, simple): - dos_dir = commands.getoutput("cygpath -w %s" % src_dir) - args = dict( - dir=dos_dir, - generator=self.gens[self.generator.lower()]['gen'], - opts=quote(opts), - standalone=self.standalone, - unattended=self.unattended, - project_name=self.project_name, - word_size=self.word_size, - ) - if self.word_size == 64: - args["generator"] += r' Win64' - #if simple: - # return 'cmake %(opts)s "%(dir)s"' % args - return ('cmake -G "%(generator)s" ' - '-DUNATTENDED:BOOl=%(unattended)s ' - '-DSTANDALONE:BOOL=%(standalone)s ' - '-DWORD_SIZE:STRING=%(word_size)s ' - '-DROOT_PROJECT_NAME:STRING=%(project_name)s ' - '%(opts)s "%(dir)s"' % args) - - def run(self, command, name=None): - '''Run a program. If the program fails, raise an exception.''' - ret = os.system(command) - if ret: - if name is None: - name = os.path.normpath(shlex.split(command.encode('utf8'),posix=False)[0].strip('"')) - - path = self.find_in_path(name) - if not path: - ret = 'was not found' - else: - ret = 'exited with status %d' % ret - raise CommandError('the command %r %s' % - (name, ret)) - - -setup_platform = { - 'darwin': DarwinSetup, - 'linux2': LinuxSetup, - 'linux3': LinuxSetup, - 'win32' : WindowsSetup, - 'cygwin' : CygwinSetup - } - - -usage_msg = ''' -Usage: develop.py [options] [command [command-options]] - -Options: - -h | --help print this help message - --standalone build standalone, without Linden prebuild libraries - --unattended build unattended, do not invoke any tools requiring - a human response - --universal build a universal binary on Mac OS X (unsupported) - -t | --type=NAME build type ("Debug", "Release", or "RelWithDebInfo") - -m32 | -m64 build architecture (32-bit or 64-bit) - -N | --no-distcc disable use of distcc - -G | --generator=NAME generator name - Windows: VC100 (VS2010) (default) - Mac OS X: Xcode (default), Unix Makefiles - Linux: Unix Makefiles (default), KDevelop3 - -p | --project=NAME set the root project name. (Doesn't effect makefiles) - -Commands: - build configure and build default target - clean delete all build directories, does not affect sources - configure configure project by running cmake (default if none given) - printbuilddirs print the build directory that will be used - -Command-options for "configure": - We use cmake variables to change the build configuration. - -DPACKAGE:BOOL=ON Create "package" target to make installers - -DLL_TESTS:BOOL=OFF Don't generate unit test projects - -DEXAMPLEPLUGIN:BOOL=OFF Don't generate example plugin project - -DDISABLE_TCMALLOC:BOOL=ON Disable linkage of TCMalloc. (64bit builds automatically disable TCMalloc) - -DRELEASE_CRASH_REPORTING:BOOL=ON Enable Google Breakpad crash reporting - -DFMODSTUDIO:BOOL=ON Use FMOD Studio audio libraries - -DFMODEX:BOOL=ON Use FMOD Ex audio libraries - -Examples: - Set up a Visual Studio 2010 project with "package" target: - develop.py -G vc100 configure -DPACKAGE:BOOL=ON -''' - -def main(arguments): - setup = setup_platform[sys.platform]() - try: - opts, args = getopt.getopt( - arguments, - '?hNt:p:G:m:', - ['help', 'standalone', 'no-distcc', 'unattended', 'type=', 'incredibuild', 'generator=', 'project=']) - except getopt.GetoptError, err: - print >> sys.stderr, 'Error:', err - print >> sys.stderr, """ -Note: You must pass -D options to cmake after the "configure" command -For example: develop.py configure -DSERVER:BOOL=OFF""" - print >> sys.stderr, usage_msg.strip() - sys.exit(1) - - for o, a in opts: - if o in ('-?', '-h', '--help'): - print usage_msg.strip() - sys.exit(0) - elif o in ('--standalone',): - setup.standalone = 'ON' - elif o in ('--unattended',): - setup.unattended = 'ON' - elif o in ('-m',): - if a in ('32', '64'): - setup.word_size = int(a) - else: - print >> sys.stderr, 'Error: unknown word size', repr(a) - print >> sys.stderr, 'Supported word sizes: 32, 64' - sys.exit(1) - elif o in ('-t', '--type'): - try: - setup.build_type = setup.build_types[a.lower()] - except KeyError: - print >> sys.stderr, 'Error: unknown build type', repr(a) - print >> sys.stderr, 'Supported build types:' - types = setup.build_types.values() - types.sort() - for t in types: - print ' ', t - sys.exit(1) - elif o in ('-G', '--generator'): - setup.generator = a - elif o in ('-N', '--no-distcc'): - setup.distcc = False - elif o in ('-p', '--project'): - setup.project_name = a - elif o in ('--incredibuild'): - setup.incredibuild = True - else: - print >> sys.stderr, 'INTERNAL ERROR: unhandled option', repr(o) - sys.exit(1) - if not args: - setup.run_cmake() - return - try: - cmd = args.pop(0) - if cmd in ('cmake', 'configure'): - setup.run_cmake(args) - elif cmd == 'build': - if os.getenv('DISTCC_DIR') is None: - distcc_dir = os.path.join(getcwd(), '.distcc') - if not os.path.exists(distcc_dir): - os.mkdir(distcc_dir) - print "setting DISTCC_DIR to %s" % distcc_dir - os.environ['DISTCC_DIR'] = distcc_dir - else: - print "DISTCC_DIR is set to %s" % os.getenv('DISTCC_DIR') - for d in setup.build_dirs(): - if not os.path.exists(d): - raise CommandError('run "develop.py cmake" first') - setup.run_cmake() - opts, targets = setup.parse_build_opts(args) - setup.run_build(opts, targets) - elif cmd == 'clean': - if args: - raise CommandError('clean takes no arguments') - setup.cleanup() - elif cmd == 'printbuilddirs': - for d in setup.build_dirs(): - print >> sys.stdout, d - else: - print >> sys.stderr, 'Error: unknown subcommand', repr(cmd) - print >> sys.stderr, "(run 'develop.py --help' for help)" - sys.exit(1) - except getopt.GetoptError, err: - print >> sys.stderr, 'Error with %r subcommand: %s' % (cmd, err) - sys.exit(1) - - -if __name__ == '__main__': - try: - main(sys.argv[1:]) - except CommandError, err: - print >> sys.stderr, 'Error:', err - sys.exit(1) diff --git a/indra/lib/python/indra/ipc/httputil.py b/indra/lib/python/indra/ipc/httputil.py index c4ac0a379..d53f34a77 100644 --- a/indra/lib/python/indra/ipc/httputil.py +++ b/indra/lib/python/indra/ipc/httputil.py @@ -1,3 +1,24 @@ +#!/usr/bin/python +## $LicenseInfo:firstyear=2011&license=viewerlgpl$ +## Second Life Viewer Source Code +## Copyright (C) 2011, Linden Research, Inc. +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; +## version 2.1 of the License only. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +## $/LicenseInfo$ import warnings diff --git a/indra/lib/python/indra/ipc/siesta_test.py b/indra/lib/python/indra/ipc/siesta_test.py index 177ea710d..a35eed246 100644 --- a/indra/lib/python/indra/ipc/siesta_test.py +++ b/indra/lib/python/indra/ipc/siesta_test.py @@ -1,3 +1,24 @@ +#!/usr/bin/python +## $LicenseInfo:firstyear=2011&license=viewerlgpl$ +## Second Life Viewer Source Code +## Copyright (C) 2011, Linden Research, Inc. +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; +## version 2.1 of the License only. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +## $/LicenseInfo$ from indra.base import llsd, lluuid from indra.ipc import siesta import datetime, math, unittest diff --git a/indra/lib/python/indra/util/fastest_elementtree.py b/indra/lib/python/indra/util/fastest_elementtree.py index 3e2189c4e..4fcf662dd 100644 --- a/indra/lib/python/indra/util/fastest_elementtree.py +++ b/indra/lib/python/indra/util/fastest_elementtree.py @@ -36,7 +36,6 @@ $/LicenseInfo$ # Using cElementTree might cause some unforeseen problems, so here's a # convenient off switch. - use_celementree = True try: diff --git a/indra/lib/python/uuid.py b/indra/lib/python/uuid.py index 0bc21a35f..e956383cc 100644 --- a/indra/lib/python/uuid.py +++ b/indra/lib/python/uuid.py @@ -1,3 +1,24 @@ +#!/usr/bin/python +## $LicenseInfo:firstyear=2011&license=viewerlgpl$ +## Second Life Viewer Source Code +## Copyright (C) 2011, Linden Research, Inc. +## +## This library is free software; you can redistribute it and/or +## modify it under the terms of the GNU Lesser General Public +## License as published by the Free Software Foundation; +## version 2.1 of the License only. +## +## This library is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## Lesser General Public License for more details. +## +## You should have received a copy of the GNU Lesser General Public +## License along with this library; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +## +## Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +## $/LicenseInfo$ r"""UUID objects (universally unique identifiers) according to RFC 4122. This module provides immutable UUID objects (class UUID) and the functions diff --git a/indra/libpathing/CMakeLists.txt b/indra/libpathing/CMakeLists.txt index 35086c716..2ab424822 100644 --- a/indra/libpathing/CMakeLists.txt +++ b/indra/libpathing/CMakeLists.txt @@ -30,5 +30,3 @@ set_source_files_properties(${libpathing_HEADER_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) add_library(nd_Pathing STATIC ${libpathing_SOURCE_FILES} ${libpathing_HEADER_FILES} ) -add_dependencies(nd_Pathing prepare) - diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index 25970a99a..9644dc5a8 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -100,5 +100,3 @@ set_source_files_properties(${llaudio_HEADER_FILES} list(APPEND llaudio_SOURCE_FILES ${llaudio_HEADER_FILES}) add_library (llaudio ${llaudio_SOURCE_FILES}) -add_dependencies(llaudio prepare) - diff --git a/indra/llcharacter/CMakeLists.txt b/indra/llcharacter/CMakeLists.txt index 8dda476d9..1c4ab0b2d 100644 --- a/indra/llcharacter/CMakeLists.txt +++ b/indra/llcharacter/CMakeLists.txt @@ -73,4 +73,3 @@ set_source_files_properties(${llcharacter_HEADER_FILES} list(APPEND llcharacter_SOURCE_FILES ${llcharacter_HEADER_FILES}) add_library (llcharacter ${llcharacter_SOURCE_FILES}) -add_dependencies(llcharacter prepare) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index 72e03e709..ac506f07b 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -7,7 +7,11 @@ include(00-Common) include(LLCommon) include(APR) include(Linking) +include(Boost) +include(LLSharedLibs) include(GoogleBreakpad) +include(Copy3rdPartyLibs) +include(ZLIB) include_directories( ${EXPAT_INCLUDE_DIRS} @@ -251,11 +255,22 @@ set_source_files_properties(${llcommon_HEADER_FILES} list(APPEND llcommon_SOURCE_FILES ${cwdebug_SOURCE_FILES}) list(APPEND llcommon_SOURCE_FILES ${llcommon_HEADER_FILES}) -add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) -if(WINDOWS) -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL") -endif(WINDOWS) -add_dependencies(llcommon prepare) +if(LLCOMMON_LINK_SHARED) + add_library (llcommon SHARED ${llcommon_SOURCE_FILES}) + if(NOT WORD_SIZE EQUAL 32) + if(NOT WINDOWS) + add_definitions(-fPIC) + endif(NOT WINDOWS) + endif(NOT WORD_SIZE EQUAL 32) + if(WINDOWS) + # always generate llcommon.pdb, even for "Release" builds + set_target_properties(llcommon PROPERTIES LINK_FLAGS "/DEBUG") + endif(WINDOWS) + ll_stage_sharedlib(llcommon) +else(LLCOMMON_LINK_SHARED) + add_library (llcommon ${llcommon_SOURCE_FILES}) +endif(LLCOMMON_LINK_SHARED) + target_link_libraries( llcommon ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES} @@ -280,3 +295,5 @@ if (DARWIN) INSTALL_NAME_DIR "@executable_path/../Resources" ) endif (DARWIN) + +add_dependencies(llcommon stage_third_party_libs) diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp index 44c6d1435..f898efe04 100644 --- a/indra/llcommon/llstring.cpp +++ b/indra/llcommon/llstring.cpp @@ -174,10 +174,10 @@ S32 wchar_to_utf8chars(llwchar in_char, char* outchars) return outchars - base; } -S32 utf16chars_to_wchar(const U16* inchars, llwchar* outchar) +S32 utf16chars_to_wchar(const utf16strtype* inchars, llwchar* outchar) { - const U16* base = inchars; - U16 cur_char = *inchars++; + const utf16strtype* base = inchars; + utf16strtype cur_char = *inchars++; llwchar char32 = cur_char; if ((cur_char >= 0xD800) && (cur_char <= 0xDFFF)) { @@ -236,7 +236,7 @@ LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len) S32 i = 0; // craziness to make gcc happy (llutf16string.c_str() is tweaked on linux): - const U16* chars16 = &(*(utf16str.begin())); + const utf16strtype* chars16 = &(*(utf16str.begin())); while (i < len) { llwchar cur_char; @@ -257,18 +257,18 @@ S32 utf16str_wstring_length(const llutf16string &utf16str, const S32 utf16_len) { S32 surrogate_pairs = 0; // ... craziness to make gcc happy (llutf16string.c_str() is tweaked on linux): - const U16 *const utf16_chars = &(*(utf16str.begin())); + const utf16strtype *const utf16_chars = &(*(utf16str.begin())); S32 i = 0; while (i < utf16_len) { - const U16 c = utf16_chars[i++]; + const utf16strtype c = utf16_chars[i++]; if (c >= 0xD800 && c <= 0xDBFF) // See http://en.wikipedia.org/wiki/UTF-16 { // Have first byte of a surrogate pair if (i >= utf16_len) { break; } - const U16 d = utf16_chars[i]; + const utf16strtype d = utf16_chars[i]; if (d >= 0xDC00 && d <= 0xDFFF) { // Have valid second byte of a surrogate pair surrogate_pairs++; @@ -621,22 +621,6 @@ bool LLStringOps::isHexString(const std::string& str) } #if LL_WINDOWS -// documentation moved to header. Phoenix 2007-11-27 -namespace snprintf_hack -{ - int snprintf(char *str, size_t size, const char *format, ...) - { - va_list args; - va_start(args, format); - - int num_written = _vsnprintf(str, size, format, args); /* Flawfinder: ignore */ - va_end(args); - - str[size-1] = '\0'; // always null terminate - return num_written; - } -} - std::string ll_convert_wide_to_string(const wchar_t* in, unsigned int code_page) { std::string out; diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h index 112a25e66..be8af44dd 100644 --- a/indra/llcommon/llstring.h +++ b/indra/llcommon/llstring.h @@ -501,7 +501,14 @@ LL_COMMON_API std::string rawstr_to_utf8(const std::string& raw); // // We should never use UTF16 except when communicating with Win32! // -typedef std::basic_string llutf16string; + +#if _WIN32 && _NATIVE_WCHAR_T_DEFINED +typedef wchar_t utf16strtype; +#else +typedef U16 utf16strtype; +#endif + +typedef std::basic_string llutf16string; LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len); LL_COMMON_API LLWString utf16str_to_wstring(const llutf16string &utf16str); @@ -586,32 +593,6 @@ LL_COMMON_API std::string utf8str_removeCRLF(const std::string& utf8str); */ //@{ -/** - * @brief Implementation the expected snprintf interface. - * - * If the size of the passed in buffer is not large enough to hold the string, - * two bad things happen: - * 1. resulting formatted string is NOT null terminated - * 2. Depending on the platform, the return value could be a) the required - * size of the buffer to copy the entire formatted string or b) -1. - * On Windows with VS.Net 2003, it returns -1 e.g. - * - * safe_snprintf always adds a NULL terminator so that the caller does not - * need to check for return value or need to add the NULL terminator. - * It does not, however change the return value - to let the caller know - * that the passed in buffer size was not large enough to hold the - * formatted string. - * - */ - -// Deal with the differeneces on Windows -namespace snprintf_hack -{ - LL_COMMON_API int snprintf(char *str, size_t size, const char *format, ...); -} - -using snprintf_hack::snprintf; - /** * @brief Convert a wide string to std::string * diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt index 431744c42..e05eebc32 100644 --- a/indra/llimage/CMakeLists.txt +++ b/indra/llimage/CMakeLists.txt @@ -54,7 +54,7 @@ set_source_files_properties(${llimage_HEADER_FILES} list(APPEND llimage_SOURCE_FILES ${llimage_HEADER_FILES}) add_library (llimage ${llimage_SOURCE_FILES}) -add_dependencies(llimage prepare) + target_link_libraries( llimage ${JPEG_LIBRARIES} diff --git a/indra/llimagej2coj/CMakeLists.txt b/indra/llimagej2coj/CMakeLists.txt index e8b87e587..af7d35601 100644 --- a/indra/llimagej2coj/CMakeLists.txt +++ b/indra/llimagej2coj/CMakeLists.txt @@ -41,7 +41,7 @@ IF(WIN32) ENDIF(WIN32) add_library (llimagej2coj ${llimagej2coj_SOURCE_FILES}) -add_dependencies(llimagej2coj prepare) + target_link_libraries( llimagej2coj ${OPENJPEG_LIBRARIES} diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt index f288fa496..028117151 100644 --- a/indra/llinventory/CMakeLists.txt +++ b/indra/llinventory/CMakeLists.txt @@ -58,4 +58,3 @@ set_source_files_properties(${llinventory_HEADER_FILES} list(APPEND llinventory_SOURCE_FILES ${llinventory_HEADER_FILES}) add_library (llinventory ${llinventory_SOURCE_FILES}) -add_dependencies(llinventory prepare) diff --git a/indra/llmath/CMakeLists.txt b/indra/llmath/CMakeLists.txt index 1c43bb218..96986b79f 100644 --- a/indra/llmath/CMakeLists.txt +++ b/indra/llmath/CMakeLists.txt @@ -97,4 +97,3 @@ set_source_files_properties(${llmath_HEADER_FILES} list(APPEND llmath_SOURCE_FILES ${llmath_HEADER_FILES}) add_library (llmath ${llmath_SOURCE_FILES}) -add_dependencies(llmath prepare) diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h index 8df507bc8..19fec1776 100644 --- a/indra/llmath/llcalcparser.h +++ b/indra/llmath/llcalcparser.h @@ -33,10 +33,21 @@ #endif // Add this in if we want boost math constants. +#include + +#if defined(LL_WINDOWS) +#pragma warning(push) +// warning C4348: 'boost::spirit::terminal<...>::result_helper': redefinition of default parameter: parameter 3, 4 +#pragma warning(disable: 4348) +#endif + //#include #include #include +#if defined(LL_WINDOWS) +#pragma warning(pop) +#endif namespace expression { @@ -54,37 +65,43 @@ T max_glue(T a, T b) { return std::max(a, b); } + +struct lazy_pow_ +{ + template + struct result { typedef X type; }; + + template + X operator()(X x, Y y) const + { + return std::pow(x, y); + } +}; -template struct lazy_ufunc_ { - typedef RT result_type; - template - struct result { typedef RT type; }; + struct result { typedef A1 type; }; template - RT operator()(F f, A1 a1) const + A1 operator()(F f, A1 a1) const { return f(a1); } }; - -template + struct lazy_bfunc_ { - typedef RT result_type; - template - struct result { typedef RT type; }; + struct result { typedef A1 type; }; template - RT operator()(F f, A1 a1, A2 a2) const + A1 operator()(F f, A1 a1, A2 a2) const { return f(a1, a2); } }; - + //} // end namespace anonymous template @@ -172,9 +189,10 @@ struct grammar using boost::spirit::qi::no_case; using boost::spirit::qi::_val; - boost::phoenix::function< lazy_ufunc_ > lazy_ufunc; - boost::phoenix::function< lazy_bfunc_ > lazy_bfunc; - + boost::phoenix::function lazy_pow; + boost::phoenix::function lazy_ufunc; + boost::phoenix::function lazy_bfunc; + expression = term [_val = _1] >> *( ('+' >> term [_val += _1]) @@ -191,7 +209,7 @@ struct grammar factor = primary [_val = _1] - >> *( ("**" >> factor [_val = boost::phoenix::bind(static_cast(&std::pow),_val,_1)]) + >> *( ("**" >> factor [_val = lazy_pow(_val, _1)]) ) ; diff --git a/indra/llmessage/CMakeLists.txt b/indra/llmessage/CMakeLists.txt index 6523a2c9a..5ce76470b 100644 --- a/indra/llmessage/CMakeLists.txt +++ b/indra/llmessage/CMakeLists.txt @@ -220,7 +220,7 @@ set_source_files_properties(${llmessage_HEADER_FILES} list(APPEND llmessage_SOURCE_FILES ${llmessage_HEADER_FILES}) add_library (llmessage ${llmessage_SOURCE_FILES}) -add_dependencies(llmessage prepare) + target_link_libraries( llmessage ${CURL_LIBRARIES} diff --git a/indra/llmessage/aicurlthread.h b/indra/llmessage/aicurlthread.h index 908456b13..7046af12b 100644 --- a/indra/llmessage/aicurlthread.h +++ b/indra/llmessage/aicurlthread.h @@ -45,7 +45,7 @@ class PollSet; // For ordering a std::set with AICurlEasyRequest objects. struct AICurlEasyRequestCompare { - bool operator()(AICurlEasyRequest const& h1, AICurlEasyRequest const& h2) { return h1.get() < h2.get(); } + bool operator()(AICurlEasyRequest const& h1, AICurlEasyRequest const& h2) const { return h1.get() < h2.get(); } }; //----------------------------------------------------------------------------- diff --git a/indra/llmessage/aihttptimeoutpolicy.cpp b/indra/llmessage/aihttptimeoutpolicy.cpp index ff37b849d..52a8fb36b 100644 --- a/indra/llmessage/aihttptimeoutpolicy.cpp +++ b/indra/llmessage/aihttptimeoutpolicy.cpp @@ -30,7 +30,6 @@ #include "sys.h" #include "aihttptimeoutpolicy.h" -#define NOMINMAX #include "llerror.h" #include "lldefs.h" #include "v3math.h" diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index 5aa33696e..ba3efefbd 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -62,8 +62,6 @@ if(LINUX AND STANDALONE) target_link_libraries (llplugin rt dl) endif(LINUX AND STANDALONE) -add_dependencies(llplugin prepare) - add_subdirectory(slplugin) # # Add tests diff --git a/indra/llprimitive/CMakeLists.txt b/indra/llprimitive/CMakeLists.txt index e9478bb06..e2c4d5295 100644 --- a/indra/llprimitive/CMakeLists.txt +++ b/indra/llprimitive/CMakeLists.txt @@ -62,4 +62,3 @@ set_source_files_properties(${llprimitive_HEADER_FILES} list(APPEND llprimitive_SOURCE_FILES ${llprimitive_HEADER_FILES}) add_library (llprimitive ${llprimitive_SOURCE_FILES}) -add_dependencies(llprimitive prepare) diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 27bb606ff..3fc0a9390 100644 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -2452,7 +2452,7 @@ void LLModel::Decomposition::fromLLSD(LLSD& decomp) range = max-min; - U16 count = position.size()/6; + size_t count = position.size()/6; for (U32 j = 0; j < count; ++j) { diff --git a/indra/llrender/CMakeLists.txt b/indra/llrender/CMakeLists.txt index b03111f7e..57283e9fe 100644 --- a/indra/llrender/CMakeLists.txt +++ b/indra/llrender/CMakeLists.txt @@ -8,6 +8,7 @@ include(LLCommon) include(LLImage) include(LLMath) include(LLRender) +include(LLVFS) include(LLWindow) include(LLXML) include(LLVFS) @@ -18,6 +19,7 @@ include_directories( ${LLIMAGE_INCLUDE_DIRS} ${LLMATH_INCLUDE_DIRS} ${LLRENDER_INCLUDE_DIRS} + ${LLVFS_INCLUDE_DIRS} ${LLWINDOW_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} ${LLVFS_INCLUDE_DIRS} @@ -82,4 +84,3 @@ endif (DARWIN) list(APPEND llrender_SOURCE_FILES ${llrender_HEADER_FILES}) add_library (llrender ${llrender_SOURCE_FILES}) -add_dependencies(llrender prepare) diff --git a/indra/llvfs/CMakeLists.txt b/indra/llvfs/CMakeLists.txt index ca491529b..326f6671c 100644 --- a/indra/llvfs/CMakeLists.txt +++ b/indra/llvfs/CMakeLists.txt @@ -60,7 +60,6 @@ set_source_files_properties(${llvfs_HEADER_FILES} list(APPEND llvfs_SOURCE_FILES ${llvfs_HEADER_FILES}) add_library (llvfs ${llvfs_SOURCE_FILES}) -add_dependencies(llvfs prepare) target_link_libraries(llvfs ${Boost_FILESYSTEM_LIBRARY} diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp index def50c85b..69a89abf8 100644 --- a/indra/llvfs/lldir.cpp +++ b/indra/llvfs/lldir.cpp @@ -878,7 +878,7 @@ LLDir::SepOff LLDir::needSep(const std::string& path, const std::string& name) c { // But if BOTH path and name bring a separator, we need not add one. // Moreover, we should actually skip the leading separator of 'name'. - return SepOff(false, seplen); + return SepOff(false, static_cast(seplen)); } // Here we know that either path_ends_sep or name_starts_sep is true -- // but not both. So don't add a separator, and don't skip any characters: diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt index 34c4a8d53..2a9396526 100644 --- a/indra/llwindow/CMakeLists.txt +++ b/indra/llwindow/CMakeLists.txt @@ -11,7 +11,6 @@ project(llwindow) include(00-Common) -include(DirectX) include(LLCommon) include(LLImage) include(LLMath) @@ -144,11 +143,9 @@ if (llwindow_HEADER_FILES) endif (llwindow_HEADER_FILES) list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) -add_library (llwindow + add_library (llwindow ${llwindow_SOURCE_FILES} ${viewer_SOURCE_FILES} ) -add_dependencies(llwindow prepare) + target_link_libraries (llwindow ${llwindow_LINK_LIBRARIES}) - - diff --git a/indra/llxml/CMakeLists.txt b/indra/llxml/CMakeLists.txt index be0a510b4..2245255cd 100644 --- a/indra/llxml/CMakeLists.txt +++ b/indra/llxml/CMakeLists.txt @@ -37,7 +37,7 @@ set_source_files_properties(${llxml_HEADER_FILES} list(APPEND llxml_SOURCE_FILES ${llxml_HEADER_FILES}) add_library (llxml ${llxml_SOURCE_FILES}) -add_dependencies(llxml prepare) + target_link_libraries( llxml ${EXPAT_LIBRARIES} diff --git a/indra/llxml/aixml.cpp b/indra/llxml/aixml.cpp index d7592c431..dffe3d73a 100644 --- a/indra/llxml/aixml.cpp +++ b/indra/llxml/aixml.cpp @@ -263,7 +263,7 @@ void AIXMLElement::close_child(void) mIndentation -= 2; } -AIXMLElement::~AIXMLElement() +AIXMLElement::~AIXMLElement() noexcept(false) { if (mHasChildren) { diff --git a/indra/llxml/aixml.h b/indra/llxml/aixml.h index 9bfb783f4..3ff971101 100644 --- a/indra/llxml/aixml.h +++ b/indra/llxml/aixml.h @@ -64,7 +64,7 @@ class AIXMLElement public: AIXMLElement(std::ostream& os, char const* name, int indentation); - ~AIXMLElement(); + ~AIXMLElement() noexcept(false); template void attribute(char const* name, T const& attribute); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index fb4d8b728..c72b705a7 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -4,8 +4,9 @@ project(viewer) include(00-Common) include(Boost) +include(BuildPackagesInfo) +include(CMakeCopyIfDifferent) include(DBusGlib) -include(DirectX) include(ELFIO) if(FMODSTUDIO) include(FMODSTUDIO) @@ -13,11 +14,12 @@ endif(FMODSTUDIO) if(FMODEX) include(FMODEX) endif(FMODEX) -include(OPENAL) +include(GLOD) include(FindOpenGL) include(Hunspell) include(JsonCpp) include(LLAddBuildTest) +include(LLAppearance) include(LLAudio) include(LLCharacter) include(LLCommon) @@ -38,12 +40,12 @@ include(LLXML) include(Linking) include(NDOF) include(NVAPI) +include(OPENAL) include(StateMachine) include(TemplateCheck) include(UI) include(ViewerMiscLibs) -include(GLOD) -include(LLAppearance) + if (WINDOWS) set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP) @@ -74,8 +76,6 @@ include_directories( ${LLWINDOW_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} ${LLAPPEARANCE_INCLUDE_DIRS} -# ${LSCRIPT_INCLUDE_DIRS} -# ${LSCRIPT_INCLUDE_DIRS}/lscript_compile ) set(viewer_SOURCE_FILES @@ -1212,15 +1212,8 @@ if (WINDOWS) PROPERTIES COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" ) - foreach( src_file ${viewer_SOURCE_FILES} ) - set_source_files_properties( - ${src_file} - PROPERTIES - COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" - ) - endforeach( src_file ${viewer_SOURCE_FILES} ) list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) - + # Add resource files to the project. # viewerRes.rc is the only buildable file, but # the rest are all dependencies of it. @@ -1274,20 +1267,13 @@ if (WINDOWS) list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) - find_library(DINPUT_LIBRARY dinput8 ${DIRECTX_LIBRARY_DIR}) - find_library(DXGUID_LIBRARY dxguid ${DIRECTX_LIBRARY_DIR}) - mark_as_advanced( - DINPUT_LIBRARY - DXGUID_LIBRARY - ) - # see EXP-1765 - theory is opengl32.lib needs to be included before gdi32.lib (windows libs) set(viewer_LIBRARIES opengl32 advapi32 comdlg32 - ${DINPUT_LIBRARY} - ${DXGUID_LIBRARY} + dinput8 + dxguid gdi32 kernel32 odbc32 @@ -1300,27 +1286,6 @@ if (WINDOWS) Wbemuuid winspool ) - - find_library(DEBUG_INTEL_MEMOPS_LIBRARY ll_intel_memops - PATHS - ${LIBS_PREBUILT_DIR}/lib/debug - ${LIBS_PREBUILT_LEGACY_DIR}/lib/debug - "${QUICKTIME_SDK_DIR}\\libraries" - ) - - find_library(RELEASE_INTEL_MEMOPS_LIBRARY ll_intel_memops - PATHS - ${LIBS_PREBUILT_DIR}/lib/release - ${LIBS_PREBUILT_LEGACY_DIR}/lib/release - "${QUICKTIME_SDK_DIR}\\libraries" - ) - - if (DEBUG_INTEL_MEMOPS_LIBRARY AND RELEASE_INTEL_MEMOPS_LIBRARY) - list(APPEND viewer_LIBRARIES optimized ${RELEASE_INTEL_MEMOPS_LIBRARY}) - list(APPEND viewer_LIBRARIES debug ${DEBUG_INTEL_MEMOPS_LIBRARY}) - mark_as_advanced(RELEASE_INTEL_MEMOPS_LIBRARY) - mark_as_advanced(DEBUG_INTEL_MEMOPS_LIBRARY) - endif (DEBUG_INTEL_MEMOPS_LIBRARY AND RELEASE_INTEL_MEMOPS_LIBRARY) endif (WINDOWS) # Add the xui files. This is handy for searching for xui elements @@ -1418,42 +1383,8 @@ add_executable(${VIEWER_BINARY_NAME} ${viewer_SOURCE_FILES} ) -if (!DISABLE_TEMPLATE_CHECK) - check_message_template(${VIEWER_BINARY_NAME}) -endif (!DISABLE_TEMPLATE_CHECK) - set(PACKAGE OFF CACHE BOOL - "Add a package_viewer target that builds an installer package.") - -if(FMOD_LIBRARY_RELEASE) - get_filename_component(fmod_lib_rel_name ${FMOD_LIBRARY_RELEASE} NAME) - get_filename_component(fmod_lib_deb_name ${FMOD_LIBRARY_DEBUG} NAME) - add_custom_command(OUTPUT fmod_lib.marker - COMMENT "Copying fmod library to executable directory" - COMMAND ${CMAKE_COMMAND} -E copy_if_different "$<$>:${FMOD_LIBRARY_RELEASE}>$<$:${FMOD_LIBRARY_DEBUG}>" "${CMAKE_CFG_INTDIR}/$<$>:${fmod_lib_rel_name}>$<$:${fmod_lib_deb_name}>" - DEPENDS "${FMOD_LIBRARY_RELEASE}") - add_custom_target(fmod_lib_copy DEPENDS fmod_lib.marker prepare) - if(DARWIN AND FMOD_EXTERNAL_LIB) - add_custom_command(OUTPUT fmod_lib_install.marker - COMMAND install_name_tool -id "@executable_path/../Resources/$<$>:${fmod_lib_rel_name}>$<$:${FMOD_LIBRARY_DEBUG}>" "${CMAKE_CFG_INTDIR}/$<$>:${fmod_lib_rel_name}>$<$:${fmod_lib_deb_name}>" - DEPENDS fmod_lib.marker) - add_dependencies(fmod_lib_copy fmod_lib_install.marker) - endif(DARWIN AND FMOD_EXTERNAL_LIB) - add_dependencies(${VIEWER_BINARY_NAME} fmod_lib_copy) - - #viewer_manifest.py needs these libraries (for now its all dylib) - if(MANIFEST_LIBRARIES) - set(MANIFEST_LIBRARIES ${MANIFEST_LIBRARIES}|optimized ${fmod_lib_rel_name}|debug ${fmod_lib_deb_name}) - else(MANIFEST_LIBRARIES) - set(MANIFEST_LIBRARIES optimized ${fmod_lib_rel_name}|debug ${fmod_lib_deb_name}) - endif(MANIFEST_LIBRARIES) - - if(WINDOWS) #If windows, fmod_lib_ points to a dll. The correct .lib needs to be linked (but copying is not necessary) - set(EXTRA_LINKER_FLAGS_RELEASE "/DELAYLOAD:${fmod_lib_rel_name}") - set(EXTRA_LINKER_FLAGS_DEBUG "/DELAYLOAD:${fmod_lib_deb_name}") - endif(WINDOWS) - list(APPEND viewer_LIBRARIES optimized "${FMOD_LINK_LIBRARY_RELEASE}" debug "${FMOD_LINK_LIBRARY_DEBUG}" ) -endif(FMOD_LIBRARY_RELEASE) + "Add a package target that builds an installer package.") if (WINDOWS) set(release_flags "/MAP") @@ -1466,6 +1397,119 @@ if (WINDOWS) LINK_FLAGS_RELWITHDEBINFO "${release_flags} ${EXTRA_LINKER_FLAGS_RELEASE}" ) + if(USE_PRECOMPILED_HEADERS) + set_target_properties( + ${VIEWER_BINARY_NAME} + PROPERTIES + COMPILE_FLAGS "/Yullviewerprecompiledheaders.h" + ) + endif(USE_PRECOMPILED_HEADERS) + + # If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency + # here. + # *NOTE:Mani - This is a crappy hack to have important dependencies for the viewer_manifest copy action + # be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing. + # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py + # and have the build deps get tracked *please* tell me about it. + + if(USE_TCMALLOC) + # Configure a var for tcmalloc location, if used. + # Note the need to specify multiple names explicitly. + set(GOOGLE_PERF_TOOLS_SOURCE + ${SHARED_LIB_STAGING_DIR}/Release/libtcmalloc_minimal.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll + ${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll + ) + endif(USE_TCMALLOC) + + set(COPY_INPUT_DEPENDENCIES + # The following commented dependencies are determined at variably at build time. Can't do this here. + #${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll + ${CMAKE_SOURCE_DIR}/../etc/message.xml + ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/llcommon.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapr-1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libaprutil-1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libapriconv-1.dll + ${SHARED_LIB_STAGING_DIR}/Release/glod.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/glod.dll + ${SHARED_LIB_STAGING_DIR}/Debug/glod.dll + ${SHARED_LIB_STAGING_DIR}/Release/openjpeg.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/openjpeg.dll + ${SHARED_LIB_STAGING_DIR}/Debug/openjpegd.dll + ${SHARED_LIB_STAGING_DIR}/Release/libhunspell.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libhunspell.dll + ${SHARED_LIB_STAGING_DIR}/Debug/libhunspell.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/SLVoice.exe + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxsdk.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ortp.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libsndfile-1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/zlib1.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxplatform.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/vivoxoal.dll + ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/ca-bundle.crt + ${GOOGLE_PERF_TOOLS_SOURCE} + ${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt + ${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt + ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt + ${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll + ${ARCH_PREBUILT_DIRS_RELEASE}/ssleay32.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/libeay32.dll + ${ARCH_PREBUILT_DIRS_DEBUG}/ssleay32.dll + SLPlugin + media_plugin_quicktime + media_plugin_cef + windows-crash-logger + ) + + if (FMODSTUDIO) + if (WORD_SIZE EQUAL 64) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/Release/fmod64.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod64.dll + ${SHARED_LIB_STAGING_DIR}/Debug/fmodL64.dll + ) + else (WORD_SIZE EQUAL 64) + list(APPEND COPY_INPUT_DEPENDENCIES + ${SHARED_LIB_STAGING_DIR}/Release/fmod.dll + ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/fmod.dll + ${SHARED_LIB_STAGING_DIR}/Debug/fmodL.dll + ) + endif (WORD_SIZE EQUAL 64) + endif (FMODSTUDIO) + + add_custom_command( + OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat + COMMAND ${PYTHON_EXECUTABLE} + ARGS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + --actions=copy + --arch=${ARCH} + --artwork=${ARTWORK_DIR} + --branding_id=${VIEWER_BRANDING_ID} + --build=${CMAKE_CURRENT_BINARY_DIR} + --channel=${VIEWER_CHANNEL} + --configuration=${CMAKE_CFG_INTDIR} + --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} + --grid=${GRID} + --login_channel=${VIEWER_LOGIN_CHANNEL} + --source=${CMAKE_CURRENT_SOURCE_DIR} + --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat + --extra_libraries="${MANIFEST_LIBRARIES}" + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + stage_third_party_libs + ${COPY_INPUT_DEPENDENCIES} + COMMENT "Performing viewer_manifest copy" + ) + + add_custom_target(copy_w_viewer_manifest ALL DEPENDS ${CMAKE_CFG_INTDIR}/copy_touched.bat) + + add_dependencies(${VIEWER_BINARY_NAME} stage_third_party_libs llcommon copy_w_viewer_manifest) + + if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) + add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) + endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) # sets the 'working directory' for debugging from visual studio. if (NOT UNATTENDED) add_custom_command( @@ -1481,32 +1525,6 @@ if (WINDOWS) ) endif (NOT UNATTENDED) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/messages/message_template.msg - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message_template.msg - COMMENT "Copying message_template.msg to the runtime folder." - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} PRE_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/../../etc/message.xml - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings/message.xml - COMMENT "Copying message.xml to the runtime folder." - ) - - if (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) - add_dependencies(${VIEWER_BINARY_NAME} copy_win_scripts) - endif (EXISTS ${CMAKE_SOURCE_DIR}/copy_win_scripts) - add_custom_command( OUTPUT ${CMAKE_CFG_INTDIR}/touched.bat COMMAND ${PYTHON_EXECUTABLE} @@ -1527,40 +1545,14 @@ if (WINDOWS) DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${COPY_INPUT_DEPENDENCIES} ) - add_custom_command( - OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat - COMMAND ${PYTHON_EXECUTABLE} - ARGS - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - --arch=${ARCH} - --artwork=${ARTWORK_DIR} - --actions=copy - --branding_id=${VIEWER_BRANDING_ID} - --build=${CMAKE_CURRENT_BINARY_DIR} - --channel=${VIEWER_CHANNEL} - --configuration=${CMAKE_CFG_INTDIR} - --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - --grid=${GRID} - --login_channel=${VIEWER_LOGIN_CHANNEL} - --source=${CMAKE_CURRENT_SOURCE_DIR} - --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/copy_touched.bat - --extra_libraries="${MANIFEST_LIBRARIES}" - DEPENDS - ${VIEWER_BINARY_NAME} - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py - COMMENT "Performing viewer_manifest copy" - ) - - add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit basic_plugin_filepicker) - - if(WORD_SIZE EQUAL 32) - add_dependencies(${VIEWER_BINARY_NAME} winmm_shim) - endif(WORD_SIZE EQUAL 32) - if (PACKAGE) - add_custom_target(package_viewer ALL DEPENDS ${CMAKE_CFG_INTDIR}/touched.bat) + add_custom_target(llpackage ALL DEPENDS + ${CMAKE_CFG_INTDIR}/touched.bat + windows-setup-build-all + ) endif (PACKAGE) endif (WINDOWS) @@ -1679,8 +1671,8 @@ if (LINUX) add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched) if (PACKAGE) - add_custom_target(package_viewer ALL DEPENDS ${product}.tar.bz2) - add_dependencies(package_viewer copy_l_viewer_manifest) + add_custom_target(llpackage ALL DEPENDS ${product}.tar.bz2) + add_dependencies(llpackage copy_l_viewer_manifest) endif (PACKAGE) endif (LINUX) @@ -1723,10 +1715,10 @@ if (DARWIN) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit basic_plugin_filepicker) if (PACKAGE) - add_custom_target(package_viewer ALL DEPENDS ${VIEWER_BINARY_NAME}) + add_custom_target(llpackage ALL DEPENDS ${VIEWER_BINARY_NAME}) add_custom_command( - TARGET package_viewer POST_BUILD + TARGET llpackage POST_BUILD COMMAND ${PYTHON_EXECUTABLE} ARGS ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py @@ -1764,7 +1756,7 @@ if (PACKAGE) # set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe") set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX}") set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}") - set(VIEWER_DUMP_SYMS dump_syms.exe) + set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest) endif (WINDOWS) if (DARWIN) list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}") @@ -1773,18 +1765,16 @@ if (PACKAGE) list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/plugins/gstreamer010/${CMAKE_CFG_INTDIR}") list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/plugins/quicktime/${CMAKE_CFG_INTDIR}") list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_BINARY_DIR}/plugins/webkit/${CMAKE_CFG_INTDIR}") - set(VIEWER_SYMBOL_FILE "${SYMBOL_NAME}-darwin.tar.bz2") + set(VIEWER_SYMBOL_FILE "${SYMBOL_NAME}-darwin.tar.bz2") set(VIEWER_EXE_GLOBS "'${VIEWER_BRANDING_NAME}' SLPlugin") set(VIEWER_LIB_GLOB "*.dylib") - set(VIEWER_DUMP_SYMS dump_syms) endif (DARWIN) if (LINUX) list(APPEND SYMBOL_SEARCH_DIRS "${CMAKE_CURRENT_BINARY_DIR}/packaged") - set(VIEWER_SYMBOL_FILE "${SYMBOL_NAME}-linux-${ARCH}.tar.bz2") + set(VIEWER_SYMBOL_FILE "${SYMBOL_NAME}-linux-${ARCH}.tar.bz2") set(VIEWER_EXE_GLOBS "${VIEWER_BRANDING_ID}-do-not-run-directly SLPlugin") set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*") set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest) - set(VIEWER_DUMP_SYMS dump_syms) endif (LINUX) if(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) @@ -1803,7 +1793,7 @@ if (PACKAGE) "${SYMBOL_SEARCH_DIRS}" "${VIEWER_EXE_GLOBS}" "${VIEWER_LIB_GLOB}" - "${LIBS_PREBUILT_DIR}/bin/${VIEWER_DUMP_SYMS}|${LIBS_PREBUILT_LEGACY_DIR}/bin/${VIEWER_DUMP_SYMS}" + "${AUTOBUILD_INSTALL_DIR}/bin/dump_syms" "${VIEWER_SYMBOL_FILE}" DEPENDS generate_breakpad_symbols.py VERBATIM) @@ -1813,143 +1803,13 @@ if (PACKAGE) if(VIEWER_COPY_MANIFEST) add_dependencies(generate_breakpad_symbols ${VIEWER_COPY_MANIFEST}) endif(VIEWER_COPY_MANIFEST) - add_dependencies(package_viewer generate_breakpad_symbols) + add_dependencies(llpackage generate_breakpad_symbols) endif(RELEASE_CRASH_REPORTING OR NON_RELEASE_CRASH_REPORTING) endif (PACKAGE) # Add tests if (LL_TESTS) - ADD_VIEWER_BUILD_TEST(llagentaccess viewer) - #ADD_VIEWER_BUILD_TEST(llworldmap viewer) - #ADD_VIEWER_BUILD_TEST(llworldmipmap viewer) - ADD_VIEWER_BUILD_TEST(lltextureinfo viewer) - ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer) - ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer) - #ADD_VIEWER_COMM_BUILD_TEST(lltranslate viewer "") endif (LL_TESTS) -# Don't do these for DARWIN or LINUX here -- they're taken care of by viewer_manifest.py -if (WINDOWS) +check_message_template(${VIEWER_BINARY_NAME}) - IF(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS) - FOREACH(RUNTIME_LIB ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${RUNTIME_LIB} - ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Copying ${RUNTIME_LIB} to the runtime folder." - ) - ENDFOREACH(RUNTIME_LIB ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}) - ENDIF(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS) - - SET(BUILT_LLCOMMON $) - - set_target_properties(llcommon - PROPERTIES - LINK_FLAGS "/debug /NODEFAULTLIB:LIBCMT" - LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\"" - LINK_FLAGS_RELEASE "${release_flags} /LTCG" - LINK_FLAGS_RELWITHDEBINFO "${release_flags}" - ) - - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_LLCOMMON} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying llcommon.dll to the runtime folder." - ) - - SET(BUILT_SLPLUGIN $) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_SLPLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying SLPlugin executable to the runtime folder." - ) - - SET(BUILT_WEBKIT_PLUGIN $) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_WEBKIT_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying WebKit Plugin to the runtime folder." - ) - - SET(BUILT_QUICKTIME_PLUGIN $) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_QUICKTIME_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying Quicktime Plugin to the runtime folder." - ) - - SET(BUILT_FILEPICKER_PLUGIN $) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_FILEPICKER_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin - COMMENT "Copying filepicker Plugin to the runtime folder." - ) - -# winmm doesn't build on windows 64 - if(WORD_SIZE EQUAL 32) - SET(BUILT_WINMM_SHIM_PLUGIN $) - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${BUILT_WINMM_SHIM_PLUGIN} - ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR} - COMMENT "Copying winmm.dll to the runtime folder." - ) - endif(WORD_SIZE EQUAL 32) - - # Copying the mime_types.xml file to app_settings - set(mime_types_source "${CMAKE_SOURCE_DIR}/newview/skins/default/xui/en-us") - set(mime_types_dest "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/app_settings") - add_custom_command( - TARGET ${VIEWER_BINARY_NAME} POST_BUILD - COMMAND ${CMAKE_COMMAND} - ARGS - -E - copy_if_different - ${mime_types_source}/mime_types_windows.xml - ${mime_types_dest}/mime_types.xml - COMMENT "Copying mime_types_windows.xml to mime_types.xml." - ) - -endif (WINDOWS) - -if (DARWIN) -# Don't do this here -- it's taken care of by viewer_manifest.py -# add_custom_command(TARGET ${VIEWER_BINARY_NAME} POST_BUILD -# COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib/release/libllqtwebkit.dylib ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/llplugin/ -# DEPENDS ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib/release/libllqtwebkit.dylib -# ) -endif (DARWIN) diff --git a/indra/newview/lgghunspell_wrapper.h b/indra/newview/lgghunspell_wrapper.h index 51c1f37a7..e89b49af2 100644 --- a/indra/newview/lgghunspell_wrapper.h +++ b/indra/newview/lgghunspell_wrapper.h @@ -19,9 +19,14 @@ #define ASPELL_WRAPPER 1 #if LL_WINDOWS -#include "hunspell/hunspelldll.h" +#pragma push_macro("near") +#ifdef near +#undef near +#endif +#include +#pragma pop_macro("near") #else -#include "hunspell/hunspell.hxx" +#include #endif class lggHunSpell_Wrapper diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index 0f103fd6c..daa379ff4 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -122,6 +122,8 @@ bool create_app_mutex() return result; } +#define NVAPI_APPNAME L"Second Life" + void ll_nvapi_init(NvDRSSessionHandle hSession) { // (2) load all the system settings into the session @@ -132,12 +134,9 @@ void ll_nvapi_init(NvDRSSessionHandle hSession) return; } - NvAPI_UnicodeString profile_name; - //std::string app_name = LLTrans::getString("APP_NAME"); - std::string app_name("Second Life"); // - llutf16string w_app_name = utf8str_to_utf16str(app_name); - wsprintf(profile_name, L"%s", w_app_name.c_str()); - status = NvAPI_DRS_SetCurrentGlobalProfile(hSession, profile_name); + NvAPI_UnicodeString wsz = { 0 }; + memcpy_s(wsz, sizeof(wsz), NVAPI_APPNAME, sizeof(NVAPI_APPNAME)); + status = NvAPI_DRS_SetCurrentGlobalProfile(hSession, wsz); if (status != NVAPI_OK) { nvapi_error(status); @@ -409,11 +408,8 @@ const S32 MAX_CONSOLE_LINES = 500; void create_console() { - int h_con_handle; - long l_std_handle; CONSOLE_SCREEN_BUFFER_INFO coninfo; - FILE *fp; // allocate a console for this app AllocConsole(); @@ -423,48 +419,16 @@ void create_console() coninfo.dwSize.Y = MAX_CONSOLE_LINES; SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); - // redirect unbuffered STDOUT to the console - l_std_handle = (long)GetStdHandle(STD_OUTPUT_HANDLE); - h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); - if (h_con_handle == -1) - { - LL_WARNS() << "create_console() failed to open stdout handle" << LL_ENDL; - } - else - { - fp = _fdopen( h_con_handle, "w" ); - *stdout = *fp; - setvbuf( stdout, NULL, _IONBF, 0 ); - } + // Redirect the CRT standard input, output, and error handles to the console + freopen("CONIN$", "r", stdin); + freopen("CONOUT$", "w", stdout); + freopen("CONOUT$", "w", stderr); + + setvbuf( stdin, NULL, _IONBF, 0 ); + setvbuf( stdout, NULL, _IONBF, 0 ); + setvbuf( stderr, NULL, _IONBF, 0 ); - // redirect unbuffered STDIN to the console - l_std_handle = (long)GetStdHandle(STD_INPUT_HANDLE); - h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); - if (h_con_handle == -1) - { - LL_WARNS() << "create_console() failed to open stdin handle" << LL_ENDL; - } - else - { - fp = _fdopen( h_con_handle, "r" ); - *stdin = *fp; - setvbuf( stdin, NULL, _IONBF, 0 ); - } - // redirect unbuffered STDERR to the console - l_std_handle = (long)GetStdHandle(STD_ERROR_HANDLE); - h_con_handle = _open_osfhandle(l_std_handle, _O_TEXT); - if (h_con_handle == -1) - { - LL_WARNS() << "create_console() failed to open stderr handle" << LL_ENDL; - } - else - { - fp = _fdopen( h_con_handle, "w" ); - *stderr = *fp; - setvbuf( stderr, NULL, _IOFBF, 1024 ); //Assigning a buffer improves speed a LOT, esp on vista/win7 - //_IOLBF is borked. - } } diff --git a/indra/newview/llcommandlineparser.cpp b/indra/newview/llcommandlineparser.cpp index c50c328cc..02d2e22de 100644 --- a/indra/newview/llcommandlineparser.cpp +++ b/indra/newview/llcommandlineparser.cpp @@ -181,12 +181,18 @@ public: { mNotifyCallback(*value); } - } - virtual bool is_required(void) const - { - return mIsRequired; - } + + virtual bool is_required(void) const + { + return mIsRequired; + } + + virtual bool adjacent_tokens_only() const + { + return false; + } + protected: void xparse(boost::any& value_store, const std::vector& new_tokens) const diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp index 6f1cb5e77..5f6f149c3 100644 --- a/indra/newview/llfloaterregioninfo.cpp +++ b/indra/newview/llfloaterregioninfo.cpp @@ -508,11 +508,7 @@ void LLFloaterRegionInfo::refreshFromRegion(LLViewerRegion* region) mInfoPanels.begin(), mInfoPanels.end(), llbind2nd( -#if LL_WINDOWS - std::mem_fun1(&LLPanelRegionInfo::refreshFromRegion), -#else std::mem_fun(&LLPanelRegionInfo::refreshFromRegion), -#endif region)); } diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index dc656a0d3..497dc1e14 100644 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -738,7 +738,7 @@ BOOL LLPanelEditWearable::postBuild() { LL_WARNS() << "could not get wearable dictionary entry for wearable of type: " << mType << LL_ENDL; } - U8 num_subparts = wearable_entry->mSubparts.size(); + U8 num_subparts = (U8) wearable_entry->mSubparts.size(); for (U8 index = 0; index < num_subparts; ++index) { @@ -859,7 +859,7 @@ void LLPanelEditWearable::draw() const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mType); if (wearable_entry) { - U8 num_subparts = wearable_entry->mSubparts.size(); + U8 num_subparts = (U8) wearable_entry->mSubparts.size(); for (U8 index = 0; index < num_subparts; ++index) { diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 970bbcae9..e24e14493 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -1757,7 +1757,7 @@ void LLVOVolume::setNumTEs(const U8 num_tes) } else if(old_num_tes > num_tes && mMediaImplList.size() > num_tes) //old faces removed { - U8 end = mMediaImplList.size() ; + size_t end = mMediaImplList.size() ; for(U8 i = num_tes; i < end ; i++) { removeMediaImpl(i) ; diff --git a/indra/newview/llwebprofile.cpp b/indra/newview/llwebprofile.cpp index aa3acc14a..efbedea7f 100644 --- a/indra/newview/llwebprofile.cpp +++ b/indra/newview/llwebprofile.cpp @@ -39,7 +39,7 @@ #include "llviewermedia.h" // FIXME: don't use LLViewerMedia internals // third-party JSONCPP -#include // JSONCPP +#include // JSONCPP /* * Workflow: diff --git a/indra/newview/rlvhandler.h b/indra/newview/rlvhandler.h index d1afc57fb..95e53bc40 100644 --- a/indra/newview/rlvhandler.h +++ b/indra/newview/rlvhandler.h @@ -20,9 +20,7 @@ #include #include "rlvcommon.h" -#if LL_GNUC || LL_INTELC || LL_CLANG #include "rlvhelper.h" // Needed to make GCC happy -#endif // LL_GNUC // ============================================================================ diff --git a/indra/newview/rlvinventory.h b/indra/newview/rlvinventory.h index 90de5c73d..0aee6aa38 100644 --- a/indra/newview/rlvinventory.h +++ b/indra/newview/rlvinventory.h @@ -21,9 +21,12 @@ #include "llinventoryobserver.h" #include "llsingleton.h" +#include "rlvdefines.h" #include "rlvhelper.h" #include "rlvlocks.h" +#include + // ============================================================================ // RlvInventory class declaration // @@ -305,7 +308,7 @@ inline bool RlvInventory::isFoldedFolder(const LLInventoryCategory* pFolder, boo // .() type folder (0 != RlvAttachPtLookup::getAttachPointIndex(pFolder)) // .(nostrip) folder - || ( (pFolder) && (".("RLV_FOLDER_FLAG_NOSTRIP")" == pFolder->getName()) ) + || ((pFolder) && ((boost::format("%1%%2%%3%") % ".(" % RLV_FOLDER_FLAG_NOSTRIP % ")").str() == pFolder->getName())) // Composite folder (if composite folders are enabled and we're asked to look for them) #ifdef RLV_EXPERIMENTAL_COMPOSITEFOLDERS || ( (fCheckComposite) && (RlvSettings::getEnableComposites()) && diff --git a/indra/newview/statemachine/CMakeLists.txt b/indra/newview/statemachine/CMakeLists.txt index 03d273235..887298030 100644 --- a/indra/newview/statemachine/CMakeLists.txt +++ b/indra/newview/statemachine/CMakeLists.txt @@ -56,4 +56,3 @@ set_source_files_properties(${statemachine_HEADER_FILES} list(APPEND statemachine_SOURCE_FILES ${statemachine_HEADER_FILES}) add_library (statemachine ${statemachine_SOURCE_FILES}) -add_dependencies(statemachine prepare) diff --git a/indra/plugins/base_basic/CMakeLists.txt b/indra/plugins/base_basic/CMakeLists.txt index 4ec14131b..404ef3fee 100644 --- a/indra/plugins/base_basic/CMakeLists.txt +++ b/indra/plugins/base_basic/CMakeLists.txt @@ -36,5 +36,3 @@ set(basic_plugin_base_HEADER_FILES add_library(basic_plugin_base ${basic_plugin_base_SOURCE_FILES} ) - -add_dependencies(basic_plugin_base prepare) diff --git a/indra/tools/vstool/DispatchUtility.cs b/indra/tools/vstool/DispatchUtility.cs new file mode 100644 index 000000000..6056ac55a --- /dev/null +++ b/indra/tools/vstool/DispatchUtility.cs @@ -0,0 +1,271 @@ +#region Using Directives + +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Reflection; +using System.Security.Permissions; + +#endregion + +namespace TestDispatchUtility +{ + /// + /// Provides helper methods for working with COM IDispatch objects that have a registered type library. + /// + public static class DispatchUtility + { + #region Private Constants + + private const int S_OK = 0; //From WinError.h + private const int LOCALE_SYSTEM_DEFAULT = 2 << 10; //From WinNT.h == 2048 == 0x800 + + #endregion + + #region Public Methods + + /// + /// Gets whether the specified object implements IDispatch. + /// + /// An object to check. + /// True if the object implements IDispatch. False otherwise. + public static bool ImplementsIDispatch(object obj) + { + bool result = obj is IDispatchInfo; + return result; + } + + /// + /// Gets a Type that can be used with reflection. + /// + /// An object that implements IDispatch. + /// Whether an exception should be thrown if a Type can't be obtained. + /// A .NET Type that can be used with reflection. + /// If doesn't implement IDispatch. + [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] + public static Type GetType(object obj, bool throwIfNotFound) + { + RequireReference(obj, "obj"); + Type result = GetType((IDispatchInfo)obj, throwIfNotFound); + return result; + } + + /// + /// Tries to get the DISPID for the requested member name. + /// + /// An object that implements IDispatch. + /// The name of a member to lookup. + /// If the method returns true, this holds the DISPID on output. + /// If the method returns false, this value should be ignored. + /// True if the member was found and resolved to a DISPID. False otherwise. + /// If doesn't implement IDispatch. + [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.UnmanagedCode)] + public static bool TryGetDispId(object obj, string name, out int dispId) + { + RequireReference(obj, "obj"); + bool result = TryGetDispId((IDispatchInfo)obj, name, out dispId); + return result; + } + + /// + /// Invokes a member by DISPID. + /// + /// An object that implements IDispatch. + /// The DISPID of a member. This can be obtained using + /// . + /// The arguments to pass to the member. + /// The member's return value. + /// + /// This can invoke a method or a property get accessor. + /// + public static object Invoke(object obj, int dispId, object[] args) + { + string memberName = "[DispId=" + dispId + "]"; + object result = Invoke(obj, memberName, args); + return result; + } + + /// + /// Invokes a member by name. + /// + /// An object. + /// The name of the member to invoke. + /// The arguments to pass to the member. + /// The member's return value. + /// + /// This can invoke a method or a property get accessor. + /// + public static object Invoke(object obj, string memberName, object[] args) + { + RequireReference(obj, "obj"); + Type type = obj.GetType(); + object result = type.InvokeMember(memberName, BindingFlags.InvokeMethod | BindingFlags.GetProperty, + null, obj, args, null); + return result; + } + + #endregion + + #region Private Methods + + /// + /// Requires that the value is non-null. + /// + /// The type of the value. + /// The value to check. + /// The name of the value. + private static void RequireReference(T value, string name) where T : class + { + if (value == null) + { + throw new ArgumentNullException(name); + } + } + + /// + /// Gets a Type that can be used with reflection. + /// + /// An object that implements IDispatch. + /// Whether an exception should be thrown if a Type can't be obtained. + /// A .NET Type that can be used with reflection. + private static Type GetType(IDispatchInfo dispatch, bool throwIfNotFound) + { + RequireReference(dispatch, "dispatch"); + + Type result = null; + int typeInfoCount; + int hr = dispatch.GetTypeInfoCount(out typeInfoCount); + if (hr == S_OK && typeInfoCount > 0) + { + // Type info isn't usually culture-aware for IDispatch, so we might as well pass + // the default locale instead of looking up the current thread's LCID each time + // (via CultureInfo.CurrentCulture.LCID). + dispatch.GetTypeInfo(0, LOCALE_SYSTEM_DEFAULT, out result); + } + + if (result == null && throwIfNotFound) + { + // If the GetTypeInfoCount called failed, throw an exception for that. + Marshal.ThrowExceptionForHR(hr); + + // Otherwise, throw the same exception that Type.GetType would throw. + throw new TypeLoadException(); + } + + return result; + } + + /// + /// Tries to get the DISPID for the requested member name. + /// + /// An object that implements IDispatch. + /// The name of a member to lookup. + /// If the method returns true, this holds the DISPID on output. + /// If the method returns false, this value should be ignored. + /// True if the member was found and resolved to a DISPID. False otherwise. + private static bool TryGetDispId(IDispatchInfo dispatch, string name, out int dispId) + { + RequireReference(dispatch, "dispatch"); + RequireReference(name, "name"); + + bool result = false; + + // Members names aren't usually culture-aware for IDispatch, so we might as well + // pass the default locale instead of looking up the current thread's LCID each time + // (via CultureInfo.CurrentCulture.LCID). + Guid iidNull = Guid.Empty; + int hr = dispatch.GetDispId(ref iidNull, ref name, 1, LOCALE_SYSTEM_DEFAULT, out dispId); + + const int DISP_E_UNKNOWNNAME = unchecked((int)0x80020006); //From WinError.h + const int DISPID_UNKNOWN = -1; //From OAIdl.idl + if (hr == S_OK) + { + result = true; + } + else if (hr == DISP_E_UNKNOWNNAME && dispId == DISPID_UNKNOWN) + { + // This is the only supported "error" case because it means IDispatch + // is saying it doesn't know the member we asked about. + result = false; + } + else + { + // The other documented result codes are all errors. + Marshal.ThrowExceptionForHR(hr); + } + + return result; + } + + #endregion + + #region Private Interfaces + + /// + /// A partial declaration of IDispatch used to lookup Type information and DISPIDs. + /// + /// + /// This interface only declares the first three methods of IDispatch. It omits the + /// fourth method (Invoke) because there are already plenty of ways to do dynamic + /// invocation in .NET. But the first three methods provide dynamic type metadata + /// discovery, which .NET doesn't provide normally if you have a System.__ComObject + /// RCW instead of a strongly-typed RCW. + /// + /// Note: The original declaration of IDispatch is in OAIdl.idl. + /// + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("00020400-0000-0000-C000-000000000046")] + private interface IDispatchInfo + { + /// + /// Gets the number of Types that the object provides (0 or 1). + /// + /// Returns 0 or 1 for the number of Types provided by . + /// + /// http://msdn.microsoft.com/en-us/library/da876d53-cb8a-465c-a43e-c0eb272e2a12(VS.85) + /// + [PreserveSig] + int GetTypeInfoCount(out int typeInfoCount); + + /// + /// Gets the Type information for an object if returned 1. + /// + /// Must be 0. + /// Typically, LOCALE_SYSTEM_DEFAULT (2048). + /// Returns the object's Type information. + /// + /// http://msdn.microsoft.com/en-us/library/cc1ec9aa-6c40-4e70-819c-a7c6dd6b8c99(VS.85) + /// + void GetTypeInfo(int typeInfoIndex, int lcid, [MarshalAs(UnmanagedType.CustomMarshaler, + MarshalTypeRef = typeof(System.Runtime.InteropServices.CustomMarshalers.TypeToTypeInfoMarshaler))] out Type typeInfo); + + /// + /// Gets the DISPID of the specified member name. + /// + /// Must be IID_NULL. Pass a copy of Guid.Empty. + /// The name of the member to look up. + /// Must be 1. + /// Typically, LOCALE_SYSTEM_DEFAULT (2048). + /// If a member with the requested + /// is found, this returns its DISPID and the method's return value is 0. + /// If the method returns a non-zero value, then this parameter's output value is + /// undefined. + /// Zero for success. Non-zero for failure. + /// + /// http://msdn.microsoft.com/en-us/library/6f6cf233-3481-436e-8d6a-51f93bf91619(VS.85) + /// + [PreserveSig] + int GetDispId(ref Guid riid, ref string name, int nameCount, int lcid, out int dispId); + + // NOTE: The real IDispatch also has an Invoke method next, but we don't need it. + // We can invoke methods using .NET's Type.InvokeMember method with the special + // [DISPID=n] syntax for member "names", or we can get a .NET Type using GetTypeInfo + // and invoke methods on that through reflection. + // Type.InvokeMember: http://msdn.microsoft.com/en-us/library/de3dhzwy.aspx + } + + #endregion + } +} diff --git a/indra/tools/vstool/README.txt b/indra/tools/vstool/README.txt index 6f64aa41d..e41918003 100644 --- a/indra/tools/vstool/README.txt +++ b/indra/tools/vstool/README.txt @@ -1,9 +1,9 @@ -VSTool is a command line utility to manipulate VisualStudio settings. - -The windows cmake project configuration uses VSTool.exe - -A handy upgrade: - figure out how to make cmake build this csharp app - - or write the app using script (jscript?!?) so it doesn't need to be built. - - +VSTool is a command line utility to manipulate VisualStudio settings. + +The windows cmake project configuration uses VSTool.exe + +A handy upgrade: + figure out how to make cmake build this csharp app + - or write the app using script (jscript?!?) so it doesn't need to be built. + + diff --git a/indra/tools/vstool/VSTool.csproj b/indra/tools/vstool/VSTool.csproj index 6cd1890fe..d78814894 100644 --- a/indra/tools/vstool/VSTool.csproj +++ b/indra/tools/vstool/VSTool.csproj @@ -1,98 +1,99 @@ - - - - Local - 8.0.50727 - 2.0 - {96943E2D-1373-4617-A117-D0F997A94919} - Debug - AnyCPU - - - - - VSTool - - - JScript - Grid - IE50 - false - Exe - VSTool - Always - VSTool.VSToolMain - - - - - v2.0 - 2.0 - - - .\ - false - 285212672 - false - - - DEBUG;TRACE - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - .\ - false - 285212672 - false - - - TRACE - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - System - - - System.Data - - - - - Code - - - - - - - - - + + + + Local + 8.0.50727 + 2.0 + {96943E2D-1373-4617-A117-D0F997A94919} + Debug + AnyCPU + + + + + VSTool + + + JScript + Grid + IE50 + false + Exe + VSTool + Always + VSTool.VSToolMain + + + + + v4.0 + 2.0 + + + + .\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + + + .\ + false + 285212672 + false + + + TRACE + + + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + + + Code + + + + + + + + + \ No newline at end of file diff --git a/indra/tools/vstool/VSTool.exe b/indra/tools/vstool/VSTool.exe index 1f0b88beba014eeb81fac23655e50991c4dff6ad..2ed31a0d9aeae9906ce5b91e9a53edf6f4736f06 100755 GIT binary patch literal 24576 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 + + diff --git a/indra/tools/vstool/main.cs b/indra/tools/vstool/main.cs index be33ae98b..16bea3f8c 100644 --- a/indra/tools/vstool/main.cs +++ b/indra/tools/vstool/main.cs @@ -1,732 +1,730 @@ -// Code about getting running instances visual studio -// was borrowed from -// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx - - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Runtime.InteropServices.ComTypes; -using Microsoft.CSharp; - -namespace VSTool -{ - // The MessageFilter class comes from: - // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx - // It allows vstool to get timing error messages from - // visualstudio and handle them. - public class MessageFilter : IOleMessageFilter - { - // - // Class containing the IOleMessageFilter - // thread error-handling functions. - - // Start the filter. - public static void Register() - { - IOleMessageFilter newFilter = new MessageFilter(); - IOleMessageFilter oldFilter = null; - CoRegisterMessageFilter(newFilter, out oldFilter); - } - - // Done with the filter, close it. - public static void Revoke() - { - IOleMessageFilter oldFilter = null; - CoRegisterMessageFilter(null, out oldFilter); - } - - // - // IOleMessageFilter functions. - // Handle incoming thread requests. - int IOleMessageFilter.HandleInComingCall(int dwCallType, - System.IntPtr hTaskCaller, int dwTickCount, System.IntPtr - lpInterfaceInfo) - { - //Return the flag SERVERCALL_ISHANDLED. - return 0; - } - - // Thread call was rejected, so try again. - int IOleMessageFilter.RetryRejectedCall(System.IntPtr - hTaskCallee, int dwTickCount, int dwRejectType) - { - if (dwRejectType == 2) - // flag = SERVERCALL_RETRYLATER. - { - // Retry the thread call immediately if return >=0 & - // <100. - return 99; - } - // Too busy; cancel call. - return -1; - } - - int IOleMessageFilter.MessagePending(System.IntPtr hTaskCallee, - int dwTickCount, int dwPendingType) - { - //Return the flag PENDINGMSG_WAITDEFPROCESS. - return 2; - } - - // Implement the IOleMessageFilter interface. - [DllImport("Ole32.dll")] - private static extern int - CoRegisterMessageFilter(IOleMessageFilter newFilter, out - IOleMessageFilter oldFilter); - } - - [ComImport(), Guid("00000016-0000-0000-C000-000000000046"), - InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] - interface IOleMessageFilter - { - [PreserveSig] - int HandleInComingCall( - int dwCallType, - IntPtr hTaskCaller, - int dwTickCount, - IntPtr lpInterfaceInfo); - - [PreserveSig] - int RetryRejectedCall( - IntPtr hTaskCallee, - int dwTickCount, - int dwRejectType); - - [PreserveSig] - int MessagePending( - IntPtr hTaskCallee, - int dwTickCount, - int dwPendingType); - } - - class ViaCOM - { - public static object GetProperty(object from_obj, string prop_name) - { - try - { - Type objType = from_obj.GetType(); - return objType.InvokeMember( - prop_name, - BindingFlags.GetProperty, null, - from_obj, - null); - } - catch (Exception e) - { - Console.WriteLine("Error getting property: \"{0}\"", prop_name); - Console.WriteLine(e.Message); - throw e; - } - } - - public static object SetProperty(object from_obj, string prop_name, object new_value) - { - try - { - object[] args = { new_value }; - Type objType = from_obj.GetType(); - return objType.InvokeMember( - prop_name, - BindingFlags.DeclaredOnly | - BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.Instance | - BindingFlags.SetProperty, - null, - from_obj, - args); - } - catch (Exception e) - { - Console.WriteLine("Error setting property: \"{0}\"", prop_name); - Console.WriteLine(e.Message); - throw e; - } - } - - public static object CallMethod(object from_obj, string method_name, params object[] args) - { - try - { - Type objType = from_obj.GetType(); - return objType.InvokeMember( - method_name, - BindingFlags.DeclaredOnly | - BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.Instance | - BindingFlags.InvokeMethod, - null, - from_obj, - args); - } - catch (Exception e) - { - Console.WriteLine("Error calling method \"{0}\"", method_name); - Console.WriteLine(e.Message); - throw e; - } - } - }; - - /// - /// The main entry point class for VSTool. - /// - class VSToolMain - { - #region Interop imports - [DllImport("ole32.dll")] - public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); - - [DllImport("ole32.dll")] - public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); - #endregion - - static System.Boolean ignore_case = true; - - static string solution_name = null; - static bool use_new_vs = false; - static Hashtable projectDict = new Hashtable(); - static string startup_project = null; - static string config = null; - - static object dte = null; - static object solution = null; - - /// - /// The main entry point for the application. - /// - [STAThread] - static int Main(string[] args) - { - int retVal = 0; - bool need_save = false; - - try - { - parse_command_line(args); - - Console.WriteLine("Editing solution: {0}", solution_name); - - bool found_open_solution = GetDTEAndSolution(); - - if (dte == null || solution == null) - { - retVal = 1; - } - else - { - MessageFilter.Register(); - - // Walk through all of the projects in the solution - // and list the type of each project. - foreach (DictionaryEntry p in projectDict) - { - string project_name = (string)p.Key; - string working_dir = (string)p.Value; - if (SetProjectWorkingDir(solution, project_name, working_dir)) - { - need_save = true; - } - } - - if (config != null) - { - need_save = SetActiveConfig(config); - } - - if (startup_project != null) - { - need_save = SetStartupProject(startup_project); - } - - if (need_save) - { - if (found_open_solution == false) - { - ViaCOM.CallMethod(solution, "Close", null); - } - } - } - } - catch (Exception e) - { - Console.WriteLine(e.Message); - retVal = 1; - } - finally - { - if (solution != null) - { - Marshal.ReleaseComObject(solution); - solution = null; - } - - if (dte != null) - { - Marshal.ReleaseComObject(dte); - dte = null; - } - - MessageFilter.Revoke(); - } - return retVal; - } - - public static bool parse_command_line(string[] args) - { - string options_desc = - "--solution : MSVC solution name. (required)\n" + - "--use_new_vs : Ignore running versions of visual studio.\n" + - "--workingdir : Set working dir of a VC project.\n" + - "--config : Set the active config for the solution.\n" + - "--startup : Set the startup project for the solution.\n"; - - try - { - // Command line param parsing loop. - int i = 0; - for (; i < args.Length; ++i) - { - if ("--solution" == args[i]) - { - if (solution_name != null) - { - throw new ApplicationException("Found second --solution option"); - } - solution_name = args[++i]; - } - else if ("--use_new_vs" == args[i]) - { - use_new_vs = true; - } - - else if ("--workingdir" == args[i]) - { - string project_name = args[++i]; - string working_dir = args[++i]; - projectDict.Add(project_name, working_dir); - } - else if ("--config" == args[i]) - { - if (config != null) - { - throw new ApplicationException("Found second --config option"); - } - config = args[++i]; - } - else if ("--startup" == args[i]) - { - if (startup_project != null) - { - throw new ApplicationException("Found second --startup option"); - } - startup_project = args[++i]; - } - else - { - throw new ApplicationException("Found unrecognized token on command line: " + args[i]); - } - } - - if (solution_name == null) - { - throw new ApplicationException("The --solution option is required."); - } - } - catch(ApplicationException e) - { - - Console.WriteLine("Oops! " + e.Message); - Console.Write("Command line:"); - foreach (string arg in args) - { - Console.Write(" " + arg); - } - Console.Write("\n\n"); - Console.WriteLine("VSTool command line usage"); - Console.Write(options_desc); - throw e; - } - return true; - } - - public static bool GetDTEAndSolution() - { - bool found_open_solution = true; - - Console.WriteLine("Looking for existing VisualStudio instance..."); - - // Get an instance of the currently running Visual Studio .NET IDE. - // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1"); - string full_solution_name = System.IO.Path.GetFullPath(solution_name); - if (false == use_new_vs) - { - dte = GetIDEInstance(full_solution_name); - } - - if (dte == null) - { - try - { - Console.WriteLine(" Didn't find open solution, starting new background VisualStudio instance..."); - Console.WriteLine(" Reading .sln file version..."); - string version = GetSolutionVersion(full_solution_name); - - Console.WriteLine(" Using version: {0}...", version); - string progid = GetVSProgID(version); - - Type objType = Type.GetTypeFromProgID(progid); - dte = System.Activator.CreateInstance(objType); - Console.WriteLine(" Reading solution: \"{0}\"", full_solution_name); - - solution = ViaCOM.GetProperty(dte, "Solution"); - object[] openArgs = { full_solution_name }; - ViaCOM.CallMethod(solution, "Open", openArgs); - } - catch (Exception e) - { - Console.WriteLine(e.Message); - Console.WriteLine("Quitting do to error opening: {0}", full_solution_name); - solution = null; - dte = null; - return found_open_solution; - } - found_open_solution = false; - } - - if (solution == null) - { - solution = ViaCOM.GetProperty(dte, "Solution"); - } - - return found_open_solution; - } - - /// - /// Get the DTE object for the instance of Visual Studio IDE that has - /// the specified solution open. - /// - /// The absolute filename of the solution - /// Corresponding DTE object or null if no such IDE is running - public static object GetIDEInstance( string solutionFile ) - { - Hashtable runningInstances = GetIDEInstances( true ); - IDictionaryEnumerator enumerator = runningInstances.GetEnumerator(); - - while ( enumerator.MoveNext() ) - { - try - { - object ide = enumerator.Value; - if (ide != null) - { - object sol = ViaCOM.GetProperty(ide, "Solution"); - if (0 == string.Compare((string)ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case)) - { - return ide; - } - } - } - catch{} - } - - return null; - } - - /// - /// Get a table of the currently running instances of the Visual Studio .NET IDE. - /// - /// Only return instances that have opened a solution - /// A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object - public static Hashtable GetIDEInstances( bool openSolutionsOnly ) - { - Hashtable runningIDEInstances = new Hashtable(); - Hashtable runningObjects = GetRunningObjectTable(); - - IDictionaryEnumerator rotEnumerator = runningObjects.GetEnumerator(); - while ( rotEnumerator.MoveNext() ) - { - string candidateName = (string) rotEnumerator.Key; - if (!candidateName.StartsWith("!VisualStudio.DTE")) - continue; - - object ide = rotEnumerator.Value; - if (ide == null) - continue; - - if (openSolutionsOnly) - { - try - { - object sol = ViaCOM.GetProperty(ide, "Solution"); - string solutionFile = (string)ViaCOM.GetProperty(sol, "FullName"); - if (solutionFile != String.Empty) - { - runningIDEInstances[ candidateName ] = ide; - } - } - catch {} - } - else - { - runningIDEInstances[ candidateName ] = ide; - } - } - return runningIDEInstances; - } - - /// - /// Get a snapshot of the running object table (ROT). - /// - /// A hashtable mapping the name of the object in the ROT to the corresponding object - [STAThread] - public static Hashtable GetRunningObjectTable() - { - Hashtable result = new Hashtable(); - - int numFetched = 0; - IRunningObjectTable runningObjectTable; - IEnumMoniker monikerEnumerator; - IMoniker[] monikers = new IMoniker[1]; - - GetRunningObjectTable(0, out runningObjectTable); - runningObjectTable.EnumRunning(out monikerEnumerator); - monikerEnumerator.Reset(); - - while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0) - { - IBindCtx ctx; - CreateBindCtx(0, out ctx); - - string runningObjectName; - monikers[0].GetDisplayName(ctx, null, out runningObjectName); - - object runningObjectVal; - runningObjectTable.GetObject( monikers[0], out runningObjectVal); - - result[ runningObjectName ] = runningObjectVal; - } - - return result; - } - - public static string GetSolutionVersion(string solutionFullFileName) - { - string version; - System.IO.StreamReader solutionStreamReader = null; - string firstLine; - string format; - - try - { - solutionStreamReader = new System.IO.StreamReader(solutionFullFileName); - do - { - firstLine = solutionStreamReader.ReadLine(); - } - while (firstLine == ""); - - format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim(); - - switch(format) - { - case "7.00": - version = "VC70"; - break; - - case "8.00": - version = "VC71"; - break; - - case "9.00": - version = "VC80"; - break; - - case "10.00": - version = "VC90"; - break; - - case "11.00": - version = "VC100"; - break; - - case "12.00": - version = "VC120"; - break; - default: - throw new ApplicationException("Unknown .sln version: " + format); - } - } - finally - { - if(solutionStreamReader != null) - { - solutionStreamReader.Close(); - } - } - - return version; - } - - public static string GetVSProgID(string version) - { - string progid = null; - switch(version) - { - case "VC70": - progid = "VisualStudio.DTE.7"; - break; - - case "VC71": - progid = "VisualStudio.DTE.7.1"; - break; - - case "VC80": - progid = "VisualStudio.DTE.8.0"; - break; - - case "VC90": - progid = "VisualStudio.DTE.9.0"; - break; - - case "VC100": - progid = "VisualStudio.DTE.10.0"; - break; - - case "VC110": - progid = "VisualStudio.DTE.11.0"; - break; - - case "VC120": - progid = "VisualStudio.DTE.12.0"; - break; - - default: - throw new ApplicationException("Can't handle VS version: " + version); - } - - return progid; - } - - public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir) - { - bool made_change = false; - Console.WriteLine("Looking for project {0}...", project_name); - try - { - object prjs = ViaCOM.GetProperty(sol, "Projects"); - object count = ViaCOM.GetProperty(prjs, "Count"); - for(int i = 1; i <= (int)count; ++i) - { - object[] prjItemArgs = { (object)i }; - object prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs); - string name = (string)ViaCOM.GetProperty(prj, "Name"); - if (0 == string.Compare(name, project_name, ignore_case)) - { - Console.WriteLine("Found project: {0}", project_name); - Console.WriteLine("Setting working directory"); - - string full_project_name = (string)ViaCOM.GetProperty(prj, "FullName"); - Console.WriteLine(full_project_name); - - // *NOTE:Mani Thanks to incompatibilities between different versions of the - // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to - // the VCProjectEngine types from a different version than the one built - // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built - // in VS 8.0. To avoid this problem, we can use the com object interfaces directly, - // without the type casting. Its tedious code, but it seems to work. - - // oCfgs should be assigned to a 'Project.Configurations' collection. - object oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations"); - - // oCount will be assigned to the number of configs present in oCfgs. - object oCount = ViaCOM.GetProperty(oCfgs, "Count"); - - for (int cfgIndex = 1; cfgIndex <= (int)oCount; ++cfgIndex) - { - object[] itemArgs = {(object)cfgIndex}; - object oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs); - object oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings"); - ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", (object)working_dir); - } - - break; - } - } - made_change = true; - } - catch( Exception e ) - { - Console.WriteLine(e.Message); - Console.WriteLine("Failed to set working dir for project, {0}.", project_name); - } - - return made_change; - } - - public static bool SetStartupProject(string startup_project) - { - bool result = false; - try - { - // You need the 'unique name of the project to set StartupProjects. - // find the project by generic name. - Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project); - object prjs = ViaCOM.GetProperty(solution, "Projects"); - object count = ViaCOM.GetProperty(prjs, "Count"); - for (int i = 1; i <= (int)count; ++i) - { - object[] itemArgs = { (object)i }; - object prj = ViaCOM.CallMethod(prjs, "Item", itemArgs); - object prjName = ViaCOM.GetProperty(prj, "Name"); - if (0 == string.Compare((string)prjName, startup_project, ignore_case)) - { - object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); - ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName")); - Console.WriteLine(" Success!"); - result = true; - break; - } - } - - if (result == false) - { - Console.WriteLine(" Could not find project \"{0}\" in the solution.", startup_project); - } - } - catch (Exception e) - { - Console.WriteLine(" Failed to set the startup project!"); - Console.WriteLine(e.Message); - } - return result; - } - - public static bool SetActiveConfig(string config) - { - bool result = false; - try - { - Console.WriteLine("Trying to set active config to \"{0}\"", config); - object solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); - object solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations"); - object[] itemArgs = { (object)config }; - object solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs); - ViaCOM.CallMethod(solCfg, "Activate", null); - Console.WriteLine(" Success!"); - result = true; - } - catch (Exception e) - { - Console.WriteLine(" Failed to set \"{0}\" as the active config.", config); - Console.WriteLine(e.Message); - } - return result; - } - } -} +// Code about getting running instances visual studio +// was borrowed from +// http://www.codeproject.com/KB/cs/automatingvisualstudio.aspx + + +using System; +using System.Collections; +using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +namespace VSTool +{ + // The MessageFilter class comes from: + // http://msdn.microsoft.com/en-us/library/ms228772(VS.80).aspx + // It allows vstool to get timing error messages from + // visualstudio and handle them. + public class MessageFilter : IOleMessageFilter + { + // + // IOleMessageFilter functions. + // Handle incoming thread requests. + int IOleMessageFilter.HandleInComingCall(int dwCallType, + IntPtr hTaskCaller, int dwTickCount, IntPtr + lpInterfaceInfo) + { + //Return the flag SERVERCALL_ISHANDLED. + return 0; + } + + // Thread call was rejected, so try again. + int IOleMessageFilter.RetryRejectedCall(IntPtr + hTaskCallee, int dwTickCount, int dwRejectType) + { + if (dwRejectType == 2) + // flag = SERVERCALL_RETRYLATER. + { + // Retry the thread call immediately if return >=0 & + // <100. + return 99; + } + // Too busy; cancel call. + return -1; + } + + int IOleMessageFilter.MessagePending(IntPtr hTaskCallee, + int dwTickCount, int dwPendingType) + { + //Return the flag PENDINGMSG_WAITDEFPROCESS. + return 2; + } + + // + // Class containing the IOleMessageFilter + // thread error-handling functions. + + // Start the filter. + public static void Register() + { + IOleMessageFilter newFilter = new MessageFilter(); + IOleMessageFilter oldFilter = null; + CoRegisterMessageFilter(newFilter, out oldFilter); + } + + // Done with the filter, close it. + public static void Revoke() + { + IOleMessageFilter oldFilter = null; + CoRegisterMessageFilter(null, out oldFilter); + } + + // Implement the IOleMessageFilter interface. + [DllImport("Ole32.dll")] + private static extern int + CoRegisterMessageFilter(IOleMessageFilter newFilter, out + IOleMessageFilter oldFilter); + } + + [ComImport, Guid("00000016-0000-0000-C000-000000000046"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IOleMessageFilter + { + [PreserveSig] + int HandleInComingCall( + int dwCallType, + IntPtr hTaskCaller, + int dwTickCount, + IntPtr lpInterfaceInfo); + + [PreserveSig] + int RetryRejectedCall( + IntPtr hTaskCallee, + int dwTickCount, + int dwRejectType); + + [PreserveSig] + int MessagePending( + IntPtr hTaskCallee, + int dwTickCount, + int dwPendingType); + } + + internal class ViaCOM + { + public static object GetProperty(object from_obj, string prop_name) + { + try + { + var objType = from_obj.GetType(); + return objType.InvokeMember( + prop_name, + BindingFlags.GetProperty, null, + from_obj, + null); + } + catch (Exception e) + { + Console.WriteLine("Error getting property: \"{0}\"", prop_name); + Console.WriteLine(e.Message); + throw e; + } + } + + public static object SetProperty(object from_obj, string prop_name, object new_value) + { + try + { + object[] args = {new_value}; + var objType = from_obj.GetType(); + return objType.InvokeMember( + prop_name, + BindingFlags.DeclaredOnly | + BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.Instance | + BindingFlags.SetProperty, + null, + from_obj, + args); + } + catch (Exception e) + { + Console.WriteLine("Error setting property: \"{0}\"", prop_name); + Console.WriteLine(e.Message); + throw e; + } + } + + public static object CallMethod(object from_obj, string method_name, params object[] args) + { + try + { + var objType = from_obj.GetType(); + return objType.InvokeMember( + method_name, + BindingFlags.DeclaredOnly | + BindingFlags.Public | + BindingFlags.NonPublic | + BindingFlags.Instance | + BindingFlags.InvokeMethod, + null, + from_obj, + args); + } + catch (Exception e) + { + Console.WriteLine("Error calling method \"{0}\"", method_name); + Console.WriteLine(e.Message); + throw e; + } + } + } + + /// + /// The main entry point class for VSTool. + /// + internal class VSToolMain + { + private static readonly bool ignore_case = true; + + private static string solution_name; + private static bool use_new_vs; + private static readonly Hashtable projectDict = new Hashtable(); + private static string startup_project; + private static string config; + + private static object dte; + private static object solution; + + /// + /// The main entry point for the application. + /// + [STAThread] + private static int Main(string[] args) + { + var retVal = 0; + var need_save = false; + + try + { + parse_command_line(args); + + Console.WriteLine("Editing solution: {0}", solution_name); + + var found_open_solution = GetDTEAndSolution(); + + if (dte == null || solution == null) + { + retVal = 1; + } + else + { + MessageFilter.Register(); + + // Walk through all of the projects in the solution + // and list the type of each project. + foreach (DictionaryEntry p in projectDict) + { + var project_name = (string) p.Key; + var working_dir = (string) p.Value; + if (SetProjectWorkingDir(solution, project_name, working_dir)) + { + need_save = true; + } + } + + if (config != null) + { + need_save = SetActiveConfig(config); + } + + if (startup_project != null) + { + need_save = SetStartupProject(startup_project); + } + + if (need_save) + { + if (found_open_solution == false) + { + ViaCOM.CallMethod(solution, "Close", null); + } + } + } + } + catch (Exception e) + { + Console.WriteLine(e.Message); + retVal = 1; + } + finally + { + if (solution != null) + { + Marshal.ReleaseComObject(solution); + solution = null; + } + + if (dte != null) + { + Marshal.ReleaseComObject(dte); + dte = null; + } + + MessageFilter.Revoke(); + } + return retVal; + } + + public static bool parse_command_line(string[] args) + { + var options_desc = + "--solution : MSVC solution name. (required)\n" + + "--use_new_vs : Ignore running versions of visual studio.\n" + + "--workingdir : Set working dir of a VC project.\n" + + "--config : Set the active config for the solution.\n" + + "--startup : Set the startup project for the solution.\n"; + + try + { + // Command line param parsing loop. + var i = 0; + for (; i < args.Length; ++i) + { + if ("--solution" == args[i]) + { + if (solution_name != null) + { + throw new ApplicationException("Found second --solution option"); + } + solution_name = args[++i]; + } + else if ("--use_new_vs" == args[i]) + { + use_new_vs = true; + } + + else if ("--workingdir" == args[i]) + { + var project_name = args[++i]; + var working_dir = args[++i]; + projectDict.Add(project_name, working_dir); + } + else if ("--config" == args[i]) + { + if (config != null) + { + throw new ApplicationException("Found second --config option"); + } + config = args[++i]; + } + else if ("--startup" == args[i]) + { + if (startup_project != null) + { + throw new ApplicationException("Found second --startup option"); + } + startup_project = args[++i]; + } + else + { + throw new ApplicationException("Found unrecognized token on command line: " + args[i]); + } + } + + if (solution_name == null) + { + throw new ApplicationException("The --solution option is required."); + } + } + catch (ApplicationException e) + { + Console.WriteLine("Oops! " + e.Message); + Console.Write("Command line:"); + foreach (var arg in args) + { + Console.Write(" " + arg); + } + Console.Write("\n\n"); + Console.WriteLine("VSTool command line usage"); + Console.Write(options_desc); + throw e; + } + return true; + } + + public static bool GetDTEAndSolution() + { + var found_open_solution = true; + + Console.WriteLine("Looking for existing VisualStudio instance..."); + + // Get an instance of the currently running Visual Studio .NET IDE. + // dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.7.1"); + var full_solution_name = Path.GetFullPath(solution_name); + if (false == use_new_vs) + { + dte = GetIDEInstance(full_solution_name); + } + + if (dte == null) + { + try + { + Console.WriteLine(" Didn't find open solution, starting new background VisualStudio instance..."); + Console.WriteLine(" Reading .sln file version..."); + var version = GetSolutionVersion(full_solution_name); + + Console.WriteLine(" Using version: {0}...", version); + var progid = GetVSProgID(version); + + var objType = Type.GetTypeFromProgID(progid); + dte = Activator.CreateInstance(objType); + Console.WriteLine(" Reading solution: \"{0}\"", full_solution_name); + + solution = ViaCOM.GetProperty(dte, "Solution"); + object[] openArgs = {full_solution_name}; + ViaCOM.CallMethod(solution, "Open", openArgs); + } + catch (Exception e) + { + Console.WriteLine(e.Message); + Console.WriteLine("Quitting do to error opening: {0}", full_solution_name); + solution = null; + dte = null; + return found_open_solution; + } + found_open_solution = false; + } + + if (solution == null) + { + solution = ViaCOM.GetProperty(dte, "Solution"); + } + + return found_open_solution; + } + + /// + /// Get the DTE object for the instance of Visual Studio IDE that has + /// the specified solution open. + /// + /// The absolute filename of the solution + /// Corresponding DTE object or null if no such IDE is running + public static object GetIDEInstance(string solutionFile) + { + var runningInstances = GetIDEInstances(true); + var enumerator = runningInstances.GetEnumerator(); + + while (enumerator.MoveNext()) + { + try + { + var ide = enumerator.Value; + if (ide != null) + { + var sol = ViaCOM.GetProperty(ide, "Solution"); + if (0 == string.Compare((string) ViaCOM.GetProperty(sol, "FullName"), solutionFile, ignore_case)) + { + return ide; + } + } + } + catch + { + // ignored + } + } + + return null; + } + + /// + /// Get a table of the currently running instances of the Visual Studio .NET IDE. + /// + /// Only return instances that have opened a solution + /// A hashtable mapping the name of the IDE in the running object table to the corresponding DTE object + public static Hashtable GetIDEInstances(bool openSolutionsOnly) + { + var runningIDEInstances = new Hashtable(); + var runningObjects = GetRunningObjectTable(); + + var rotEnumerator = runningObjects.GetEnumerator(); + while (rotEnumerator.MoveNext()) + { + var candidateName = (string) rotEnumerator.Key; + if (!candidateName.StartsWith("!VisualStudio.DTE")) + continue; + + var ide = rotEnumerator.Value; + if (ide == null) + continue; + + if (openSolutionsOnly) + { + try + { + var sol = ViaCOM.GetProperty(ide, "Solution"); + var solutionFile = (string) ViaCOM.GetProperty(sol, "FullName"); + if (solutionFile != string.Empty) + { + runningIDEInstances[candidateName] = ide; + } + } + catch + { + // ignored + } + } + else + { + runningIDEInstances[candidateName] = ide; + } + } + return runningIDEInstances; + } + + /// + /// Get a snapshot of the running object table (ROT). + /// + /// A hashtable mapping the name of the object in the ROT to the corresponding object + [STAThread] + public static Hashtable GetRunningObjectTable() + { + var result = new Hashtable(); + + var numFetched = 0; + IRunningObjectTable runningObjectTable; + IEnumMoniker monikerEnumerator; + var monikers = new IMoniker[1]; + + GetRunningObjectTable(0, out runningObjectTable); + runningObjectTable.EnumRunning(out monikerEnumerator); + monikerEnumerator.Reset(); + + while (monikerEnumerator.Next(1, monikers, new IntPtr(numFetched)) == 0) + { + IBindCtx ctx; + CreateBindCtx(0, out ctx); + + string runningObjectName; + monikers[0].GetDisplayName(ctx, null, out runningObjectName); + + object runningObjectVal; + runningObjectTable.GetObject(monikers[0], out runningObjectVal); + + result[runningObjectName] = runningObjectVal; + } + + return result; + } + + public static string GetSolutionVersion(string solutionFullFileName) + { + string version; + StreamReader solutionStreamReader = null; + + try + { + solutionStreamReader = new StreamReader(solutionFullFileName); + string firstLine; + do + { + firstLine = solutionStreamReader.ReadLine(); + } while (firstLine == ""); + + var format = firstLine.Substring(firstLine.LastIndexOf(" ")).Trim(); + + switch (format) + { + case "7.00": + version = "VC70"; + break; + + case "8.00": + version = "VC71"; + break; + + case "9.00": + version = "VC80"; + break; + + case "10.00": + version = "VC90"; + break; + + case "11.00": + version = "VC100"; + break; + + case "12.00": + version = "VC140"; + break; + + default: + throw new ApplicationException("Unknown .sln version: " + format); + } + } + finally + { + solutionStreamReader?.Close(); + } + + return version; + } + + public static string GetVSProgID(string version) + { + string progid = null; + switch (version) + { + case "VC70": + progid = "VisualStudio.DTE.7"; + break; + + case "VC71": + progid = "VisualStudio.DTE.7.1"; + break; + + case "VC80": + progid = "VisualStudio.DTE.8.0"; + break; + + case "VC90": + progid = "VisualStudio.DTE.9.0"; + break; + + case "VC100": + progid = "VisualStudio.DTE.10.0"; + break; + + case "VC140": + progid = "VisualStudio.DTE.14.0"; + break; + + default: + throw new ApplicationException("Can't handle VS version: " + version); + } + + return progid; + } + + public static bool SetProjectWorkingDir(object sol, string project_name, string working_dir) + { + var made_change = false; + Console.WriteLine("Looking for project {0}...", project_name); + try + { + var prjs = ViaCOM.GetProperty(sol, "Projects"); + var count = ViaCOM.GetProperty(prjs, "Count"); + for (var i = 1; i <= (int) count; ++i) + { + object[] prjItemArgs = {i}; + var prj = ViaCOM.CallMethod(prjs, "Item", prjItemArgs); + var name = (string) ViaCOM.GetProperty(prj, "Name"); + if (0 == string.Compare(name, project_name, ignore_case)) + { + Console.WriteLine("Found project: {0}", project_name); + Console.WriteLine("Setting working directory"); + + var full_project_name = (string) ViaCOM.GetProperty(prj, "FullName"); + Console.WriteLine(full_project_name); + + // *NOTE:Mani Thanks to incompatibilities between different versions of the + // VCProjectEngine.dll assembly, we can't cast the objects recevied from the DTE to + // the VCProjectEngine types from a different version than the one built + // with. ie, VisualStudio.DTE.7.1 objects can't be converted in a project built + // in VS 8.0. To avoid this problem, we can use the com object interfaces directly, + // without the type casting. Its tedious code, but it seems to work. + + // oCfgs should be assigned to a 'Project.Configurations' collection. + var oCfgs = ViaCOM.GetProperty(ViaCOM.GetProperty(prj, "Object"), "Configurations"); + + // oCount will be assigned to the number of configs present in oCfgs. + var oCount = ViaCOM.GetProperty(oCfgs, "Count"); + + for (var cfgIndex = 1; cfgIndex <= (int) oCount; ++cfgIndex) + { + object[] itemArgs = {cfgIndex}; + var oCfg = ViaCOM.CallMethod(oCfgs, "Item", itemArgs); + var oDebugSettings = ViaCOM.GetProperty(oCfg, "DebugSettings"); + ViaCOM.SetProperty(oDebugSettings, "WorkingDirectory", working_dir); + } + + break; + } + } + made_change = true; + } + catch (Exception e) + { + Console.WriteLine(e.Message); + Console.WriteLine("Failed to set working dir for project, {0}.", project_name); + } + + return made_change; + } + + public static bool SetStartupProject(string startup_project) + { + var result = false; + try + { + // You need the 'unique name of the project to set StartupProjects. + // find the project by generic name. + Console.WriteLine("Trying to set \"{0}\" to the startup project", startup_project); + var prjs = ViaCOM.GetProperty(solution, "Projects"); + var count = ViaCOM.GetProperty(prjs, "Count"); + for (var i = 1; i <= (int) count; ++i) + { + object[] itemArgs = {i}; + var prj = ViaCOM.CallMethod(prjs, "Item", itemArgs); + var prjName = ViaCOM.GetProperty(prj, "Name"); + if (0 == string.Compare((string) prjName, startup_project, ignore_case)) + { + var solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); + ViaCOM.SetProperty(solBuild, "StartupProjects", ViaCOM.GetProperty(prj, "UniqueName")); + Console.WriteLine(" Success!"); + result = true; + break; + } + } + + if (result == false) + { + Console.WriteLine(" Could not find project \"{0}\" in the solution.", startup_project); + } + } + catch (Exception e) + { + Console.WriteLine(" Failed to set the startup project!"); + Console.WriteLine(e.Message); + } + return result; + } + + public static bool SetActiveConfig(string config) + { + var result = false; + try + { + Console.WriteLine("Trying to set active config to \"{0}\"", config); + var solBuild = ViaCOM.GetProperty(solution, "SolutionBuild"); + var solCfgs = ViaCOM.GetProperty(solBuild, "SolutionConfigurations"); + object[] itemArgs = {config}; + var solCfg = ViaCOM.CallMethod(solCfgs, "Item", itemArgs); + ViaCOM.CallMethod(solCfg, "Activate", null); + Console.WriteLine(" Success!"); + result = true; + } + catch (Exception e) + { + Console.WriteLine(" Failed to set \"{0}\" as the active config.", config); + Console.WriteLine(e.Message); + } + return result; + } + + #region Interop imports + + [DllImport("ole32.dll")] + public static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot); + + [DllImport("ole32.dll")] + public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); + + #endregion + } +} \ No newline at end of file diff --git a/install.xml b/install.xml deleted file mode 100644 index 81273c469..000000000 --- a/install.xml +++ /dev/null @@ -1,1956 +0,0 @@ - - - - installables - - 32bitcompatibilitylibs - - copyright - Copyrights: Libidn: Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 - Simon Josefsson. License GPL v3.0. - Freealut, libuuid, openal-soft: see copyright and license of the - according main packages. - - description - 32bit libraries needed for using voice - license - gpl - packages - - linux64 - - md5sum - 5add23ded1a53f57044132cb1aed4950 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/linux64-32bitcompatibilitylibs-20100903_1.tar.bz2 - - - - GLOD - - copyright - Copyright (C) 2003-04 Jonathan Cohen, Nat Duca, Chris Niski, Johns Hopkins University and David Luebke, Brenden Schubert, University of Virginia - description - Geometric Level of Detail for OpenGL - license - GLOD - packages - - darwin - - md5sum - 9b810919658a9705f0fe8a3d85ebb2d9 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glod-1.0pre4-darwin-20110610-repack.tar.bz2 - - linux - - md5sum - e84769e15f3d48ecbb07fa272c30365e - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glod-1.0pre4-linux-20110611.tar.bz2 - - linux64 - - md5sum - 9552782ad333c819c91d31087750db64 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glod-1.0pre4-linux-x86_64-20120609.tar.bz2 - - windows - - md5sum - a6c13213a76658f4ad505b968d54aba3 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glod-1.0pre4-windows-20110610.tar.bz2 - - windows64 - - md5sum - 3ed28129c186d0f531701e1aad035d15 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glod-1.0pre4-windows64-vs12-20140723.tar.bz2 - - - - SDL - - copyright - Copyright (C) 1997-2009 Sam Lantinga - description - The Simple DirectMedia Layer libraries are used for handling input and basic window/GL setup on the Linux client. - license - lgpl - packages - - linux - - md5sum - 7806c04e09f0eb490c108bfab7731b7b - url - https://bitbucket.org/SingularityViewer/libraries/downloads/SDL-1.2.14-linux-20110309.tar.bz2 - - linux64 - - md5sum - 2d40e76689d6e8c034490c1cbe9a4961 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/SDL-1.2.14-linux-x86_64-20120604.tar.bz2 - - - - apr_suite - - license - apache 2.0 - packages - - darwin - - md5sum - 3cae5f0fd8f3dd80a59b450562f781bc - url - https://bitbucket.org/SingularityViewer/libraries/downloads/apr_suite-1.4.5-darwin-20120715.tar.bz2 - - linux - - md5sum - 471db9f761e5ee66b91e0e330e331f68 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/apr_suite-1.4.5-linux-20120618.tar.bz2 - - linux64 - - md5sum - 66326975f779213886dbaaf021fa3412 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/apr_suite-1.4.5-linux-x86_64-20120604.tar.bz2 - - windows - - md5sum - ea394402d4d4af4c5238fe4e35c64389 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/apr_suite-1.4.2-windows-20110504.tar.bz2 - - windows64 - - md5sum - dddc81e3a8c3914510ae90af9b9a429d - url - https://bitbucket.org/SingularityViewer/libraries/downloads/apr_suite-1.4.5-windows64-vs12-20140710.tar.bz2 - - - - ares - - copyright - Copyright 1998 by the Massachusetts Institute of Technology. - description - Performs DNS requests and name resolves asynchronously. Used with libcurl to keep all HTTP operations async. - license - c-ares - packages - - darwin - - md5sum - 90b8ec87cab3debaf8da5436dc8f3819 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ares-1.7.1-darwin-20120712.tar.bz2 - - linux - - md5sum - 6acb4fde2fe2e02e0a91ae2a2dac166a - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ares-1.7.1-linux-20110310.tar.bz2 - - linux64 - - md5sum - e2bf7c556ce3525cb6ad20f2d4d80cf4 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ares-1.7.5-linux-x86_64-20120605.tar.bz2 - - windows - - md5sum - e4ab04da7db20ba388f2109e84f0fcda - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ares-1.7.1-windows-20110504.tar.bz2 - - windows64 - - md5sum - 9af96e2c7a819d770146917afb4ff481 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ares-1.10.0-windows64-vs12-20140709.tar.bz2 - - - - boost - - copyright - various - description - A set of portable C++ libraries which provide a wide set of functionality. Used primarily for tokenization. - license - boost - packages - - darwin - - md5sum - 6564a085a5a353a531908d2e6fcafd64 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/boost-1.52.0-darwin-20140202.tar.bz2 - - linux - - md5sum - c11e7bd8c35401f240338ebea5390499 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/boost-1.52.0-linux-20130222.tar.bz2 - - linux64 - - md5sum - fab1924c7c83c2fb945957b0a9a211e5 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/boost-1.52.0-linux64-20130531.tar.bz2 - - windows - - md5sum - eb13ff93db50d4b08648a5c78ba05310 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/boost-1.52.0-windows-20130221.tar.bz2 - - windows64 - - md5sum - 2b33deae4df210c8bb9e1aea6174bc13 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/boost-1.56.0-windows64-vs12-20140816.tar.bz2 - - - - colladadom - - copyright - Copyright 2005 Sony Computer Entertainment Inc. - description - Library for processing collada file format - license - scea - packages - - darwin - - md5sum - 4e0030cf15d4697e971eb6643286de3b - url - https://bitbucket.org/SingularityViewer/libraries/downloads/colladadom-2.2-darwin-20131006.tar.bz2 - - linux - - md5sum - 8a1017e1935ae3c88dea7f4552573f53 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/colladadom-2.2-linux-20131219.tar.bz2 - - linux64 - - md5sum - 446dbefb0d3dd0bd93f30b4ef1eaa67b - url - https://bitbucket.org/SingularityViewer/libraries/downloads/colladadom-2.2-linux64-20131219.tar.bz2 - - windows - - md5sum - 514742a082f922f1ad8d9bf08ea22bbc - url - https://bitbucket.org/SingularityViewer/libraries/downloads/colladadom-2.2-windows-20131006.tar.bz2 - - windows64 - - md5sum - 53b5cd120718119b8a31b5073a49360e - url - https://bitbucket.org/SingularityViewer/libraries/downloads/colladadom-2.3-windows64-vs12-20140816.tar.bz2 - - - - curl - - copyright - Copyright (c) 1996 - 2008, Daniel Stenberg, <daniel@haxx.se>. - description - Client-side URL transfer library. Handles moving data across the net in many different protocols. Used to GET/POST/PUT/DELETE web resources. - license - curl - packages - - darwin - - md5sum - 3f2763221bd366242865414112678570 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/curl-7.21.1-darwin-20110316.tar.bz2 - - linux - - md5sum - f35a301aa5e058b3fb15e69b984a0534 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/curl-7.21.1-linux-20110316.tar.bz2 - - linux64 - - md5sum - 6d610caca171531d71b79075ebfa54eb - url - https://bitbucket.org/SingularityViewer/libraries/downloads/curl-7.38-linux64-20141020.tar.bz2 - - windows - - md5sum - 60ed73408c4050ff9c96f26771fd6b46 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/curl-7.21.1-windows-20110504.tar.bz2 - - windows64 - - md5sum - 3820517a958655c31890eaf71bb284ba - url - https://bitbucket.org/SingularityViewer/libraries/downloads/curl-7.37.1-windows64-vs12-20140722.tar.bz2 - - - - db - - copyright - Copyright (c) 1990, 2010 Oracle and/or its affiliates. All rights reserved. - description - a high-performance, embedded database library - license - bsd - packages - - linux - - md5sum - 3262d0a90b93c81e6fb650beb88cbdbb - url - https://bitbucket.org/SingularityViewer/libraries/downloads/db-5.1.25-linux-20110309.tar.bz2 - - linux64 - - md5sum - 894f6a09e581bcf4a2c36f8f66379704 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/db-5.1.25-Linux-x86_64-20110807.tar.bz2 - - - - dbusglib - - copyright - Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc. - description - dbus/dbus-glib: headers only - license - AFL2.1 - packages - - linux - - md5sum - e4a22c3401a0f938ee0a6a2becfa7840 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/dbus_glib-0.76-linux-20110310.tar.bz2 - - linux64 - - md5sum - 3751294773dff647b3493764dc6539dc - url - https://bitbucket.org/SingularityViewer/libraries/downloads/dbus_glib-0.76-linux64-20110310.tar.bz2 - - - - elfio - - license - lgpl - packages - - linux - - md5sum - fb4e8f07c7f3e86cc8baa73f8c02f777 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/elfio-1.0.3-linux-20080812.tar.bz2 - - linux64 - - md5sum - d826535e096d707ef1a2783ce66ad2f9 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/elfio-1.0.3-linux64-20091129.tar.bz2 - - - - expat - - copyright - Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd - description - An XML parser library written in C. It is a stream-oriented parser in which an application registers handlers for things the parser might find in the XML document (like start tags). - license - mit - packages - - darwin - - md5sum - 4dc2d4b3890b981f284f5da8f810dc93 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/expat-2.0.1-darwin-20110218.tar.bz2 - - linux - - md5sum - 1a5b715652a5162145c18525196f7419 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/expat-2.0.1-linux-20110219.tar.bz2 - - linux64 - - md5sum - 58d7d0a12984cd57822c709d51ee18f7 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/expat-2.0.1-linux-x86_64-20120530.tar.bz2 - - windows - - md5sum - 5aff9e0f0e1ba7ada2f118f92139f759 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/expat-2.0.1-windows-20110215.tar.bz2 - - windows64 - - md5sum - fa21aba89409f5959a69c8cc5807103e - url - https://bitbucket.org/SingularityViewer/libraries/downloads/expat-2.1.0-windows64-vs12-20140709.tar.bz2 - - - - fmodstudio - - copyright - Copyright © 1994-2014 Firelight Technologies Pty, Ltd. - description - FMOD Studio programmer’s API's low level component. For simple sounds/channels/dsp/geometry. - license - fmod - packages - - darwin - - md5sum - a51da309dd81293ae2940181d345bb77 - url - https://bitbucket.org/alchemyviewer/publiclibs-darwin/downloads/fmodstudio-1.07.00-darwin-201510062322.tar.bz2 - - linux - - md5sum - 1331456a3df95294eaf44fab990f62cd - url - http://depot.alchemyviewer.org/pub/linux/lib/fmodstudio-1.06.07-linux-201507231333.tar.bz2 - - linux64 - - md5sum - adc55fd330f41a66dc64a6c3f7084e79 - url - http://depot.alchemyviewer.org/pub/linux64/lib/fmodstudio-1.07.00-linux64-201510070033.tar.bz2 - - windows - - md5sum - 301419a80b2e1eb6d6389dcf7bf4c06a - url - http://depot.alchemyviewer.org/pub/windows/lib/fmodstudio-1.07.00-windows-201510070018.tar.bz2 - - windows64 - - md5sum - 980b4d60a41b88c23b738ed477beed70 - url - http://depot.alchemyviewer.org/pub/windows64/lib/fmodstudio-1.07.00-windows64-201510061544.tar.bz2 - - - - fontconfig - - license - mit - packages - - linux - - md5sum - 2f88d7924fb9fcc93e44139f0fe4880a - url - https://bitbucket.org/SingularityViewer/libraries/downloads/fontconfig-2.8.0-linux-20110311.tar.bz2 - - linux64 - - md5sum - 1736c637f7ae184fa94b3eb2c0e5f5da - url - https://bitbucket.org/SingularityViewer/libraries/downloads/fontconfig-2.8.0-linux-x86_64-20120531.tar.bz2 - - - - freetype - - copyright - Copyright - description - Font - license - freetype - packages - - darwin - - md5sum - 8acd5ccfa8134833a98401b11394930d - url - https://bitbucket.org/SingularityViewer/libraries/downloads/freetype-2.4.4-darwin-20110307.tar.bz2 - - linux - - md5sum - 155c50560099db8a37540c50d9ee48d0 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/freetype-2.3.11-linux-20091103_1.tar.bz2 - - linux64 - - md5sum - 63f940c765875ee0b2fc2ed68019a602 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/freetype-2.3.11-linux-x86_64-20131230.tar.bz2 - - windows - - md5sum - fcb8ec727e72e2b8ae766d8af78f12ea - url - https://bitbucket.org/SingularityViewer/libraries/downloads/freetype-2.4.4-windows-20110218.tar.bz2 - - windows64 - - md5sum - 3049465928bf2da496b19e53a03fcbde - url - https://bitbucket.org/SingularityViewer/libraries/downloads/freetype-2.5.3-windows64-vs12-20140725.tar.bz2 - - - - glext - - copyright - Copyright (c) 2007-2010 Khronos Group Inc. - description - OpenGL Extension Header Files - license - glext - packages - - linux - - md5sum - efc62daedd2f89b46ef0e466b3ef460c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glext-82-win32-linux.tar.bz2 - - linux64 - - md5sum - efc62daedd2f89b46ef0e466b3ef460c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glext-82-win32-linux.tar.bz2 - - windows - - md5sum - efc62daedd2f89b46ef0e466b3ef460c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glext-82-win32-linux.tar.bz2 - - windows64 - - md5sum - efc62daedd2f89b46ef0e466b3ef460c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glext-82-win32-linux.tar.bz2 - - - - glib - - description - GLib is a library containing many useful C routines for things such as trees, hashes, and lists. - license - gpl - packages - - linux - - md5sum - bc5bf517ada0a3a1036e7e193884db79 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glib-2.20.5-linux32-20100529.tar.bz2 - - linux64 - - md5sum - 36575a2975f9ef70281a3062867bd2f8 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glib-2.25.17-linux-x86_64-20120422.tar.bz2 - - - - glui - - license - lgpl - packages - - darwin - - md5sum - f7aa89ac04607d52b11d5ca46b5e75e6 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glui-2.36-darwin-20110309.tar.bz2 - - windows - - md5sum - eeec9982df843043a18748276bbf39ce - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glui-2.36-windows-20110214.tar.bz2 - - windows64 - - md5sum - 919c3fdfac84aaa69c84f1ce793cd9ff - url - https://bitbucket.org/SingularityViewer/libraries/downloads/glui-2.36-windows64-vs12-20140710.tar.bz2 - - - - google_breakpad - - license - bsd - packages - - darwin - - md5sum - 5a5c90d28fd9bdc4244c56fef4216998 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/google_breakpad-0.0.0-rev1099-darwin-20131002.tar.bz2 - - linux - - md5sum - 03852edfa946bdc365b5fbd1a373b17f - url - https://bitbucket.org/SingularityViewer/libraries/downloads/google_breakpad-0.0.0-rev1099-linux-20131002.tar.bz2 - - linux64 - - md5sum - e2e8d8068eceaad66758bb5f031d5246 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/google_breakpad-0.0.0-rev1099-linux64-20131002.tar.bz2 - - windows - - md5sum - b1eda1b02e7ebf9875733303a88ca27b - url - https://bitbucket.org/SingularityViewer/libraries/downloads/google_breakpad-0.0.0-rev1099-windows-20140606.tar.bz2 - - windows64 - - md5sum - 69e360938a6a13d9b10edfe09dc1bd9d - url - https://bitbucket.org/alchemyviewer/publiclibs-vs12/downloads/google_breakpad-1400-windows64-20141105.tar.bz2 - - - - gperftools - - copyright - Copyright (c) 2005, Google Inc. - description - High performance memory allocator. - license - bsd - packages - - linux - - md5sum - c3e754fbff965bcc036d5c76f587e6be - url - https://bitbucket.org/SingularityViewer/libraries/downloads/google-perftools-1.8.3-linux-20120703.tar.bz2 - - windows - - md5sum - 82b85cce650e7409fc165bc730e2ad7a - url - https://bitbucket.org/SingularityViewer/libraries/downloads/gperftools-2.0-svn-windows-20120830.tar.bz2 - - - - gstreamer - - license - lgpl - packages - - linux - - md5sum - 5e6564f5102e3112781e3017c93e762f - url - https://bitbucket.org/SingularityViewer/libraries/downloads/gstreamer-0.10.24-linux-20091125.tar.bz2 - - linux64 - - md5sum - 37541c812162f009f50e3749220fb782 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/gstreamer-0.10.28-linux-x86_64-20120608.tar.bz2 - - - - gtk-atk-pango-glib - - copyright - Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald - description - Libraries associated with GTK for gui features. atk: interfaces for accessibility; glib: low-level core functionality for using GTK+ and GNOME; pango: layout/rendering of text w/ emphasis on internationalization. - license - lgpl - packages - - linux - - md5sum - e0eec19274dba0b58f5a1679d71f4204 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/gtk-etc-linux-20101106.tar.bz2 - - linux64 - - md5sum - 1b69a92d684a1b8208aa1d227d8d1bdf - url - https://bitbucket.org/SingularityViewer/libraries/downloads/gtk_etc-0.0.1-linux-x86_64-20120609.tar.bz2 - - - - hunspell - - copyright - various - description - A open source spell check library - license - lgpl - packages - - darwin - - md5sum - 6d103995df9f1e97d06ecc20704c30f6 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libhunspell-1.3.2-darwin-20120616.tar.bz2 - - linux - - md5sum - bc470ff6673553c5580ccb47958d7789 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libhunspell-1.3.2-linux-20120616.tar.bz2 - - linux64 - - md5sum - 889d6abceda50f12d0f22c1310844c4b - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libhunspell-1.3.2-linux-x86_64-20120708.tar.bz2 - - windows - - md5sum - bbaf7035a4a5b59153f18bca1d8fa107 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/hunspell-windows-20120704.tar.bz2 - - windows64 - - md5sum - b97500817a949b250820ca300014d2c6 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libhunspell-1.3.2-windows64-vs12-20140709.tar.bz2 - - - - jpeglib - - copyright - Copyright (c) 1991-2011, Thomas G. Lane, Guido Vollbeding - description - An open-source JPEG (JFIF) library - license - jpeglib - packages - - darwin - - md5sum - 6505f9e93ac0f7595df8dd566f49c298 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jpeglib-8c-darwin-20120712.tar.bz2 - - linux - - md5sum - e6a47cfe0a7610c57eb8c7cb4136ca09 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jpeglib-8c-linux-20110323.tar.bz2 - - linux64 - - md5sum - 7f2e1c0ea2f589c4888ec7f5a214af88 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jpeglib-7-linux-x86_64-20120531b.tar.bz2 - - windows - - md5sum - d28938e6930bf48584e332f764208822 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jpeglib-8c-windows-20120704.tar.bz2 - - windows64 - - md5sum - c2326faf530ea31391843a8c5aa8ccfe - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libjpeg_turbo-1.3.1-windows64-vs12-20140709.tar.bz2 - - - - jsoncpp - - copyright - json-cpp library released to Public Domain by Baptiste Lepilleur <blep@users.sourceforge.net> - description - jsoncpp is an implementation of a JSON (http://json.org) reader and writer in C++. - license - jsoncpp - packages - - darwin - - md5sum - 70e7a004114983a68d701a83c5d4315c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jsoncpp-0.5.0-darwin-20110131.tar.bz2 - - linux - - md5sum - 85f4be144b34bfc84976c9018192a266 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jsoncpp-0.5.0-linux-20120708.tar.bz2 - - linux64 - - md5sum - 4f87662add231b9d4b6c1e5c63560db4 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jsoncpp-0.5.0-linux64-20121208.tar.bz2 - - windows - - md5sum - 8aa2d47182e93cbc856517309fe11dc7 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jsoncpp-0.5.0-windows-20120704.tar.bz2 - - windows64 - - md5sum - a6de6a8188a87ce8048847f37b4ecd8f - url - https://bitbucket.org/SingularityViewer/libraries/downloads/jsoncpp-0.5.0-windows64-vs12-20140709.tar.bz2 - - - - libpng - - copyright - Copyright (c) 2004, 2006-2008 Glenn Randers-Pehrson - description - An open, extensible image format with lossless compression. PNG Reference Library - license - libpng - packages - - darwin - - md5sum - 80506ac813e36a51a5beadf3d08b2b81 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libpng-1.5.1-darwin-20110222.tar.bz2 - - linux - - md5sum - 7953ff3422fb0f84c1c713db0b1aa9ca - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libpng-1.5.1-linux-20110223.tar.bz2 - - linux64 - - md5sum - b6bef6d2dcc1c57fb05de868de2756ea - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libpng-1.6.13-linux64-20141020.tar.bz2 - - windows - - md5sum - a698200d34d20b53fe72fb53fc1c6dcf - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libpng-1.5.2-windows-20120704.tar.bz2 - - windows64 - - md5sum - 82ac61f5d208b0c907217fc90bb835dd - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libpng-1.6.8-windows64-vs12-20140709.tar.bz2 - - - - libuuid - - copyright - Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> - description - Generates UUIDs under Linux. Originally a part of the ext2fs filesystem. Also see lluuid.cpp for all platforms. Part of the e2fsprogs package. - license - lgpl - packages - - linux - - md5sum - ab4f25d8a2a30516cc77c47664bdf75f - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libuuid-1.6.2-linux-20110315.tar.bz2 - - linux64 - - md5sum - dc25f523bd0505bbd03fb2b277299b13 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/uuid-1.6.2-linux-x86_64-20120601.tar.bz2 - - - - libxml - - license - mit - packages - - linux - - md5sum - 899ff969b1a82a6eea6b3ec85185942f - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libxml-2.6.24-linux-20101013.tar.bz2 - - linux64 - - md5sum - 9bf2223e26eb4d659fe8e9283bfe73a2 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libxml2-2.7.8-linux-x86_64-20120420.tar.bz2 - - windows64 - - md5sum - 1c2effa8c26de72f6c92f65f83dd9e29 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libxml2-2.9.1-windows64-vs12-20140709.tar.bz2 - - - - llqtwebkit - - license - lgpl - packages - - darwin - - md5sum - 9bedf2f283e899652a5e7ac6ea3d6a08 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/llqtwebkit-4.7.1-darwin-20120228.tar.bz2 - - linux - - md5sum - 307fdcc100ba95cfb12f35aab4fd0d08 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/llqtwebkit-4.7.1-linux-20120228.tar.bz2 - - linux64 - - md5sum - 79fcd5b5e1c1ac4f35235354289205ba - url - https://bitbucket.org/SingularityViewer/libraries/downloads/llqtwebkit-4.8.6-linux64-20141021.tar.bz2 - - windows - - md5sum - ccb96fa1260ef6c3060d407b8c6b3972 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/llqtwebkit-4.7.1-windows-20120228.tar.bz2 - - windows64 - - md5sum - a1c9564dbce8f3b0a296f9924e68a221 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/llqtwebkit-4.8.6-windows64-vs12-20140710.tar.bz2 - - - - mesa - - copyright - Copyright (C) 1999-2007 Brian Paul All Rights Reserved. - description - Mesa 3-D graphics library. Provides the required Apple OpenGL headers under Linux. - license - mesa - packages - - linux - - md5sum - a816df4887085fb0f0d301336d87cd70 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/mesa-7.0-linux-20100930.tar.bz2 - - linux64 - - md5sum - 56630977f9261bd82039b0da08a0685c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/mesa-6.2.1-linux64-20081016.tar.bz2 - - - - nvapi - - copyright - Copyright (C) NVIDIA - description - NVAPI is the library suite to access nvidia profiles and performance options on windows - license - NVAPI - packages - - windows - - md5sum - 99d1b70c1305257d521edfbd34587187 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/nvapi-304-windows-20121116-singu.tar.bz2 - - windows64 - - md5sum - 5578017f13783fb7279dd39537d1e0fd - url - https://bitbucket.org/SingularityViewer/libraries/downloads/nvapi-304-windows64-20131116-singu.tar.bz2 - - - - ndofdev - - copyright - Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. - description - in use on windows and darwin for joystick support. - license - linden - packages - - darwin - - md5sum - 0cd7114c04ba7ac0a824f9f4cead4b39 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libndofdev-0.1-darwin-20110308.tar.bz2 - - linux - - md5sum - c366f71de80a56c7336c5166520b40a5 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ndofdev-linux32-0.3.1_1-20100817.tar.bz2 - - linux64 - - md5sum - d2a9640c34a9a2848ba9fc63146bdce4 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libndofdev-0.3.1-linux-x86_64-20120604.tar.bz2 - - windows - - md5sum - f897874709ed6d0ef06db3730b3eea7d - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libndofdev-windows-20120704.tar.bz2 - - windows64 - - md5sum - 10533b646d582b936b2f8d3cb32cd73c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/libndofdev-0.1-windows64-vs12-20140710.tar.bz2 - - - - ogg-vorbis - - copyright - Copyright (C) 2008 Xiph.org Foundation - description - Ogg: container format Vorbis: audio compression scheme - license - xiph-bsd - packages - - darwin - - md5sum - 600c6e3776f9c91068aef43c76eca501 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ogg_vorbis-1.2.2-1.3.2-darwin-20110510.tar.bz2 - - linux - - md5sum - 5317c7859cfa24d4e9114ac0411b2cc6 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ogg_vorbis-1.2.2-1.3.2-linux-20110511.tar.bz2 - - linux64 - - md5sum - 50d232fcf120f85bf259d1b93aa767a7 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ogg_vorbis-1.2.2-1.3.2-linux-x86_64-20120604.tar.bz2 - - windows - - md5sum - 3339ac49f5986068e7fa17b6655b9f9b - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ogg_vorbis-1.2.2-1.3.2-windows-20110510.tar.bz2 - - windows64 - - md5sum - a7c94d900a2a2551423efed99fa8e29d - url - https://bitbucket.org/SingularityViewer/libraries/downloads/ogg_vorbis-1.3.2-1.3.4-windows64-vs12-20140709.tar.bz2 - - - - openSSL - - license - openSSL - packages - - darwin - - md5sum - 1acdf58efa7a728fd390a710c659ec65 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openssl-1.0.0g-darwin-20120712.tar.bz2 - - linux - - md5sum - c57c14353e07e45c0f168313f26ace8e - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openssl-1.0.0g-linux-20120207.tar.bz2 - - linux64 - - md5sum - 10e3de555fe95d7be00b6209e26a0566 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openssl-1.0.1j-linux64-20141020.tar.bz2 - - windows - - md5sum - 30062b843657b745ab297bb674ac0b6e - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openssl-1.0.0g-windows-20120207.tar.bz2 - - windows64 - - md5sum - 66eba34f543bdd90e0656a9c97c8afae - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openssl-1.0.1h-windows64-vs12-20140709.tar.bz2 - - - - openal-soft - - copyright - Copyright (C) 2008 by authors. - description - 3D Audio library - license - lgpl - packages - - linux - - md5sum - 0b257146f1a05dcae1ca2e0d79330e6b - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openal-linux-20120202.tar.bz2 - - linux64 - - md5sum - 843758dffdb98db9523a65fab6e136e3 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openal-1.14-1.1.0-linux-x86_64-20120605.tar.bz2 - - windows - - md5sum - e75f1529adcaa6e508d1725f59d93a16 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openal-1.12.854-1.1.0-windows-20110301.tar.bz2 - - windows64 - - md5sum - 62f9844903ae76d2ae90d17ca5814060 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/openal-1.15.1-1.1.0-windows64-vs12-20140813.tar.bz2 - - - - pcre - - copyright - Copyright (c) 1997-2008 University of Cambridge - description - Perl Compatible Regular Expressions Library - license - bsd - packages - - darwin - - md5sum - fca72d132adfe24a7a057ad21b9915eb - url - https://bitbucket.org/SingularityViewer/libraries/downloads/pcre-7.6-darwin-20110504.tar.bz2 - - linux - - md5sum - a561ed0ef937f3086ba3f84f2e59b1b2 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/pcre-7.6-linux-20130216.tar.bz2 - - linux64 - - md5sum - 272bd861a7ff9f77e6908064cf52e4cf - url - https://bitbucket.org/SingularityViewer/libraries/downloads/pcre-7.6-linux64-20130216.tar.bz2 - - windows64 - - md5sum - ffdbc30ce4b9238070917073b6066b36 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/pcre-8.35-windows64-vs12-20140816.tar.bz2 - - - - pulseaudio - - copyright - Copyright 2004-2006 Lennart Poettering, Copyright 2006 Pierre Ossman (ossman@cendio.se) for Cendio AB - description - pulseaudio: headers only - license - lgpl - packages - - linux - - md5sum - 6c7325be47ddce71a3fbbd24621f86e1 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/linux-pulse-headers-0.9.14_1.tar.bz2 - - linux64 - - md5sum - 736693c3f82458baee10e3eb37bc87df - url - https://bitbucket.org/SingularityViewer/libraries/downloads/linux64-pulse-headers-0.9.14.tar.bz2 - - - - tut - - copyright - Copyright 2002-2006 Vladimir Dyuzhev, Copyright 2007 Denis Kononenko, Copyright 2008 Michal Rzechonek - description - C++ Template Unit Test - license - bsd - packages - - common - - md5sum - a1b8a118ba9df1f2a73f6aafa7980e83 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/tut-2008-11-30-common-20081208.tar.bz2 - - - - vivox - - copyright - - license - vivox - packages - - darwin - - md5sum - 68a8fab5ad3a180487598d3a3e0d57b1 - url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slvoice_3p-update-slvoice/rev/298329/arch/Darwin/installer/slvoice-4.6.0017.21209.298329-darwin-298329.tar.bz2 - - linux - - md5sum - 1c8643e27023f1d9b1523ca5794b7475 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/vivox-2.1.3010.6270-linux-20090309-rpk.tar.bz2 - - linux64 - - md5sum - 1c8643e27023f1d9b1523ca5794b7475 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/vivox-2.1.3010.6270-linux-20090309-rpk.tar.bz2 - - windows - - md5sum - 399afab7047e6fa62e7b2fb1768059ea - url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slvoice_3p-update-slvoice/rev/298329/arch/CYGWIN/installer/slvoice-4.6.0017.21209.298329-windows-298329.tar.bz2 - - windows64 - - md5sum - 399afab7047e6fa62e7b2fb1768059ea - url - http://automated-builds-secondlife-com.s3.amazonaws.com/hg/repo/slvoice_3p-update-slvoice/rev/298329/arch/CYGWIN/installer/slvoice-4.6.0017.21209.298329-windows-298329.tar.bz2 - - - - xmlrpc-epi - - copyright - Copyright 2000 Epinions, Inc. - description - Implementation of the xmlrpc protocol in C that provides an API for developers to serialize RPC requests to and from XML. - license - xmlrpc-epi - packages - - darwin - - md5sum - 0d99f62811a2ae181ccb56536134ba7c - url - https://bitbucket.org/SingularityViewer/libraries/downloads/xmlrpc_epi-0.54.1-darwin-20110307.tar.bz2 - - linux - - md5sum - d3b9f85ce4a04cd4c319a202c6367b2d - url - https://bitbucket.org/SingularityViewer/libraries/downloads/xmlrpc_epi-0.54.1-linux-20110314.tar.bz2 - - linux64 - - md5sum - 1caff2e120fac6e73cc0c60d6635d527 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/xmlrpc_epi-0.54.1-linux-x86_64-20120531.tar.bz2 - - windows - - md5sum - 0d208a90f378284e27138c22e8c15f10 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/xmlrpc_epi-0.54.1-windows-20120704.tar.bz2 - - windows64 - - md5sum - 652a2034e8a2d4cb63f77eb3cc723351 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/xmlrpc_epi-0.54.1-windows64-vs12-20140709.tar.bz2 - - - - zlib - - copyright - Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler - description - A Massively Spiffy Yet Delicately Unobtrusive Compression Library (Also Free, Not to Mention Unencumbered by Patents) - license - zlib - packages - - darwin - - md5sum - 7daee7ada1bcc90fa367775f04e9950a - url - https://bitbucket.org/SingularityViewer/libraries/downloads/zlib-1.2.5-darwin-20110211.tar.bz2 - - linux - - md5sum - c2707c0214bd0d58b35c77fa351f8cb0 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/zlib-1.2.5-linux-20110314.tar.bz2 - - linux64 - - md5sum - 367cb642f1471f85f1094827ac960dbe - url - https://bitbucket.org/SingularityViewer/libraries/downloads/zlib-1.2.6-linux-x86_64-20120419.tar.bz2 - - windows - - md5sum - d76dad53f2984827db98fd9d62232ab2 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/zlib-1.2.5-windows-20120704.tar.bz2 - - windows64 - - md5sum - 59deda6dde1e6f8cb90b2285890dce82 - url - https://bitbucket.org/SingularityViewer/libraries/downloads/zlib-1.2.8-windows64-vs12-20140709.tar.bz2 - - - - - licenses - - AFL2.1 - - url - http://opensource-definition.org/licenses/afl-2.1.html - - GLOD - - text - The GLOD Open-Source License Version 1.0 July 22, 2003 - -Copyright (C) 2003 Jonathan Cohen, Nat Duca, Johns Hopkins University -and David Luebke, Brenden Schubert, University of Virginia. All rights -reserved. - -Redistribution and use in source and binary forms, with or without -modification, is permitted provided that the following conditions are -met: - -1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer and - request. - -2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer and - request in the documentation and/or other materials provided with - the distribution. - -3. The name "GLOD" must not be used to endorse or promote products - derived from this software without prior written permission. - -4. Redistributions of any modified version of this source, whether in - source or binary form , must include a form of the following - acknowledgment: "This product is derived from the GLOD library, - which is available from http://www.cs.jhu.edu/~graphics/GLOD." - -5. Redistributions of any modified version of this source in binary - form must provide, free of charge, access to the modified version - of the code. - -6. This license shall be governed by and construed and enforced in - accordance with the laws of the State of Maryland, without - reference to its conflicts of law provisions. The exclusive - jurisdiction and venue for all legal actions relating to this - license shall be in courts of competent subject matter jurisdiction - located in the State of Maryland. - -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, GLOD IS PROVIDED -UNDER THIS LICENSE ON AN AS IS BASIS, WITHOUT WARRANTY OF ANY KIND, -EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES -THAT GLOD IS FREE OF DEFECTS, MERCHANTABLE, FIT FOR A PARTICULAR -PURPOSE OR NON-INFRINGING. ALL WARRANTIES ARE DISCLAIMED AND THE -ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE CODE IS WITH -YOU. SHOULD ANY CODE PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE -COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR) ASSUME THE COST OF ANY -NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY -CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY CODE IS -AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER. - -TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL -THE COPYRIGHT HOLDER OR ANY OTHER CONTRIBUTOR BE LIABLE FOR ANY -SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES FOR LOSS OF -PROFITS, REVENUE, OR FOR LOSS OF INFORMATION OR ANY OTHER LOSS. - -YOU EXPRESSLY AGREE TO FOREVER INDEMNIFY, DEFEND AND HOLD HARMLESS THE -COPYRIGHT HOLDERS AND CONTRIBUTORS OF GLOD AGAINST ALL CLAIMS, -DEMANDS, SUITS OR OTHER ACTIONS ARISING DIRECTLY OR INDIRECTLY FROM -YOUR ACCEPTANCE AND USE OF GLOD. - -Although NOT REQUIRED, we would appreciate it if active users of GLOD -put a link on their web site to the GLOD web site when possible. - - url - http://www.cs.jhu.edu/~graphics/GLOD/license/ - - MSDTW - - text - MICROSOFT SOFTWARE LICENSE TERMS -MICROSOFT DEBUGGING TOOLS FOR WINDOWS -These license terms are an agreement between Microsoft Corporation (or based on where you live, one of -its affiliates) and you. Please read them. They apply to the software named above, which includes the -media on which you received it, if any. The terms also apply to any Microsoft -* updates, -* supplements, -* Internet-based services -* support services, and -* Debugging symbol files that you may access over the internet -for this software, unless other terms accompany those items. If so, those terms apply. -By using the software, you accept these terms. If you do not accept them, do not use the -software. -If you comply with these license terms, you have the rights below. -1. INSTALLATION AND USE RIGHTS. One user may install and use any number of copies of the -software on your devices to design, develop, debug and test your programs. -2. ADDITIONAL LICENSING REQUIREMENTS AND/OR USE RIGHTS. -a. Distributable Code. The software contains code that you are permitted to distribute in programs -you develop if you comply with the terms below. -i. Right to Use and Distribute. The code and text files listed below are “Distributable Code.” -* REDIST.TXT Files. You may copy and distribute the object code form of code listed in -REDIST.TXT files. -* Sample Code. You may modify, copy, and distribute the source and object code form of -code marked as “sample.” -* Third Party Distribution. You may permit distributors of your programs to copy and -distribute the Distributable Code as part of those programs. -ii. Distribution Requirements. For any Distributable Code you distribute, you must -* add significant primary functionality to it in your programs; -* require distributors and external end users to agree to terms that protect it at least as much -as this agreement; -* display your valid copyright notice on your programs; and -* indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, -related to the distribution or use of your programs. -iii. Distribution Restrictions. You may not -* alter any copyright, trademark or patent notice in the Distributable Code; -* distribute any symbol files which you may access or use under these license terms for the -software; -* use Microsoft’s trademarks in your programs’ names or in a way that suggests your -programs come from or are endorsed by Microsoft; -* distribute Distributable Code to run on a platform other than the Windows platform; -* include Distributable Code in malicious, deceptive or unlawful programs; or -* modify or distribute the source code of any Distributable Code so that any part of it -becomes subject to an Excluded License. An Excluded License is one that requires, as a -condition of use, modification or distribution, that -* the code be disclosed or distributed in source code form; or -* others have the right to modify it. -3. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights -to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights -despite this limitation, you may use the software only as expressly permitted in this agreement. In -doing so, you must comply with any technical limitations in the software that only allow you to use it in -certain ways. You may not -* work around any technical limitations in the software; -* reverse engineer, decompile or disassemble the software, except and only to the extent that -applicable law expressly permits, despite this limitation; -* make more copies of the software than specified in this agreement or allowed by applicable law, -despite this limitation; -* publish the software for others to copy; -* rent, lease or lend the software; -* transfer the software or this agreement to any third party; or -* use the software for commercial software hosting services. -4. INTERNET-BASED SERVICES. Microsoft provides Internet-based services with the software. It may -change or cancel them at any time. -a. Consent for Internet-Based Services. The software contains features which may connect to -Microsoft or service provider computer systems over the Internet. In some cases, you will not -receive a separate notice when they connect. You may switch these features on or you may -choose not to use them. For more information about these features, see -http://www.microsoft.com/info/privacy/default.mspx. By using these features, you consent to the transmission of -this information. Microsoft does not use the information to identify or contact you. -b. Misuse of Internet-based Services. You may not use these services in any way that could -harm them or impair anyone else’s use of them. You may not use the services to try to gain -unauthorized access to any service, data, account or network by any means. - -5. BACKUP COPY. You may make one backup copy of the software. You may use it only to reinstall the -software. -6. DOCUMENTATION. Any person that has valid access to your computer or internal network may copy -and use the documentation for your internal, reference purposes. -7. EXPORT RESTRICTIONS. The software is subject to United States export laws and regulations. You -must comply with all domestic and international export laws and regulations that apply to the software. -These laws include restrictions on destinations, end users and end use. For additional information, see -www.microsoft.com/exporting. -8. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. -9. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based -services and support services that you use, are the entire agreement for the software and support -services. -10. APPLICABLE LAW. -a. United States. If you acquired the software in the United States, Washington state law governs -the interpretation of this agreement and applies to claims for breach of it, regardless of conflict of -laws principles. The laws of the state where you live govern all other claims, including claims under -state consumer protection laws, unfair competition laws, and in tort. -b. Outside the United States. If you acquired the software in any other country, the laws of that -country apply. -11. LEGAL EFFECT. This agreement describes certain legal rights. You may have other rights under the -laws of your country. You may also have rights with respect to the party from whom you acquired the -software. This agreement does not change your rights under the laws of your country if the laws of -your country do not permit it to do so. -12. DISCLAIMER OF WARRANTY. The software is licensed “as-is.” You bear the risk of using -it. Microsoft gives no express warranties, guarantees or conditions. You may have -additional consumer rights under your local laws which this agreement cannot change. To -the extent permitted under your local laws, Microsoft excludes the implied warranties of -merchantability, fitness for a particular purpose and non-infringement. -13. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. You can recover from -Microsoft and its suppliers only direct damages up to U.S. $5.00. You cannot recover any -other damages, including consequential, lost profits, special, indirect or incidental -damages. -This limitation applies to -* anything related to the software, services, content (including code) on third party Internet sites, or -third party programs; and -* claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, -or other tort to the extent permitted by applicable law. -It also applies even if Microsoft knew or should have known about the possibility of the damages. The -above limitation or exclusion may not apply to you because your country may not allow the exclusion or -limitation of incidental, consequential or other damages. - - - apache 2.0 - - url - http://www.apache.org/licenses/LICENSE-2.0 - - artwork - - text - COPYRIGHT AND PERMISSION NOTICE - -Second Life(TM) Viewer Artwork. Copyright (C) 2008 Linden Research, Inc. - -Linden Research, Inc. ("Linden Lab") licenses the Second Life viewer -artwork and other works in the files distributed with this Notice under -the Creative Commons Attribution-Share Alike 3.0 License, available at -http://creativecommons.org/licenses/by-sa/3.0/legalcode. For the license -summary, see http://creativecommons.org/licenses/by-sa/3.0/. - -Notwithstanding the foregoing, all of Linden Lab's trademarks, including -but not limited to the Second Life brand name and Second Life Eye-in-Hand -logo, are subject to our trademark policy at -http://secondlife.com/corporate/trademark/. - -If you distribute any copies or adaptations of the Second Life viewer -artwork or any other works in these files, you must include this Notice -and clearly identify any changes made to the original works. Include -this Notice and information where copyright notices are usually included, -for example, after your own copyright notice acknowledging your use of -the Second Life viewer artwork, in a text file distributed with your -program, in your application's About window, or on a credits page for -your work. - - url - http://svn.secondlife.com/svn/linden/trunk/doc/LICENSE-logos.txt - - boost - - url - http://www.boost.org/LICENSE_1_0.txt - - bsd - - url - http://www.opensource.org/licenses/bsd-license.php - - c-ares - - text - http://daniel.haxx.se/projects/c-ares/license.html - - curl - - url - http://curl.haxx.se/docs/copyright.html - - fmod - - url - http://www.fmod.com/files/public/LICENSE.TXT - - freetype - - url - http://freetype.sourceforge.net/FTL.TXT - - glext - - text - Copyright (c) 2007-2012 The Khronos Group Inc. - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and/or associated documentation files (the -"Materials"), to deal in the Materials without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Materials, and to -permit persons to whom the Materials are furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Materials. - -THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. - - - gpl - - url - http://www.gnu.org/licenses/gpl.html - - havok - - text - on file - - intel - - text - Haven't yet found. - - - jpeglib - - text - http://nyctergatis.com/jpeglib/ - - jsoncpp - - text - The json-cpp library and this documentation are in Public Domain. Retrieved from http://jsoncpp.sourceforge.net/ on 2009-09-04. - url - http://jsoncpp.sourceforge.net - - kdu - - text - jpeg2000 license #00024 (on file) - - lgpl - - url - http://www.gnu.org/copyleft/lgpl.html - - libpng - - text - http://www.libpng.org/pub/png/src/libpng-LICENSE.txt - - linden - - text - Using this license for Linden Lab owned library files - - mesa - - url - http://www.mesa3d.org/license.html - - mit - - text - http://www.jclark.com/xml/copying.txt - - NVAPI - - url - Licenes dir - - ogg-vorbis - - url - http://www.xiph.org/licenses/bsd/ - - openSSL - - url - http://www.openssl.org/source/license.html - - openjpeg - - url - http://www.openjpeg.org/BSDlicense.txt - - quicktime - - text - ENGLISH - -Apple Computer, Inc. -QuickTime 7 Software Developer Kit (SDK) -Software License Agreement - -PLEASE READ THIS SOFTWARE LICENSE AGREEMENT ("LICENSE") BEFORE USING THE SOFTWARE. BY USING THE SOFTWARE, YOU ARE AGREEING TO BE BOUND BY THE TERMS OF THIS LICENSE. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, SIGNIFY YOUR AGREEMENT TO BE BOUND BY THE TERMS OF THIS LICENSE BY CLICKING THE "AGREE/ACCEPT" BUTTON. IF YOU DO NOT AGREE TO THE TERMS OF THIS LICENSE, RETURN THE APPLE SOFTWARE TO THE PLACE WHERE YOU OBTAINED IT FOR A REFUND OR, IF THE SOFTWARE WAS ACCESSED ELECTRONICALLY, CLICK "DISAGREE/DECLINE". - -IMPORTANT NOTE: To the extent this software may be used to reproduce materials, it is licensed to you only for reproduction of materials you are authorized or legally permitted to reproduce. - -1. License. Any software, tools, utilities, sample code, documentation, fonts, API?s, header files and other materials accompanying this License, whether on disk, print or electronic documentation, in read only memory, or any other media, (collectively, the "Apple Software") are licensed, not sold, to you by Apple Computer, Inc. ("Apple") for use only under the terms of this License, and Apple reserves all rights not expressly granted to you. The rights granted herein are limited to Apple's and its licensors' intellectual property rights in the Apple Software and do not include any other patents or intellectual property rights. You own the media on which the Apple Software is recorded but Apple and/or Apple's licensor(s) retain ownership of the Apple Software itself. The Apple Software in this package and any copies, modifications and derivative works that this License authorizes you to make are subject to this License. - -2. Permitted Uses and Restrictions. You may use the Apple Software to develop application software that is compatible with, and runs only on Mac OS X and/or Windows platforms with QuickTime installed. Except for compiling header files and linking libraries as necessary to build your application software, you have no right to modify, incorporate into or include in combination with your own programs, license or otherwise redistribute any portion of the Apple Software. Your software application may not interfere with the functionality of QuickTime Player or the QuickTime Plug-in, including but not limited to file type or MIME type associations that are registered to QuickTime. You may make only as many internal use copies of the Apple Software as reasonably necessary to use the Apple Software as permitted in this paragraph and distribute such copies only to your employees whose job duties require them to so use the Apple Software. You must reproduce on each copy of the Apple Software or portion thereof, the -Apple copyright notice and any other proprietary legends that were on the original copy of the Apple Software. Except as expressly permitted in this License, you may not decompile, reverse engineer, disassemble, modify, rent, lease, loan, sublicense, distribute or create derivative works based upon the Apple Software in whole or part. Your rights under this License will terminate automatically without notice from Apple if you fail to comply with any term(s) of this License. In addition, Apple reserves the right to terminate this License if a new version of Apple's operating system software or the Apple Software is released which is incompatible with the Apple Software. - -3. Disclaimer Of Warranty. The Apple Software may be "alpha", "beta", "development", pre-release, untested, and/or not fully tested and may contain errors that could cause failures or loss of data, be incomplete or contain inaccuracies. YOU EXPRESSLY ACKNOWLEDGE AND AGREE THAT USE OF THE APPLE SOFTWARE IS AT YOUR SOLE RISK AND THAT THE ENTIRE RISK AS TO SATISFACTORY QUALITY, PERFORMANCE, ACCURACY AND EFFORT IS WITH YOU. EXCEPT FOR THE LIMITED WARRANTY ON MEDIA SET FORTH ABOVE AND TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE APPLE SOFTWARE IS PROVIDED "AS IS", WITH ALL FAULTS AND WITHOUT WARRANTY OF ANY KIND, AND APPLE AND APPLE'S LICENSORS (COLLECTIVELY REFERRED TO AS "APPLE" FOR THE PURPOSES OF SECTIONS 4 AND 5) HEREBY DISCLAIM ALL WARRANTIES AND CONDITIONS WITH RESPECT TO THE APPLE SOFTWARE, EITHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES AND/OR CONDITIONS OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, -OF QUIET ENJOYMENT, AND NON-INFRINGEMENT OF THIRD PARTY RIGHTS. APPLE DOES NOT WARRANT AGAINST INTERFERENCE WITH YOUR ENJOYMENT OF THE APPLE SOFTWARE, THAT THE FUNCTIONS CONTAINED IN THE APPLE SOFTWARE WILL MEET YOUR REQUIREMENTS, THAT THE OPERATION OF THE APPLE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT DEFECTS IN THE APPLE SOFTWARE WILL BE CORRECTED. NO ORAL OR WRITTEN INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED REPRESENTATIVE SHALL CREATE A WARRANTY. SHOULD THE APPLE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE ENTIRE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES OR LIMITATIONS ON APPLICABLE STATUTORY RIGHTS OF A CONSUMER, SO THE ABOVE EXCLUSION AND LIMITATIONS MAY NOT APPLY TO YOU. - -4. Limitation Of Liability. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT SHALL APPLE BE LIABLE FOR PERSONAL INJURY, OR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER, INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF PROFITS, LOSS OF DATA, BUSINESS INTERRUPTION OR ANY OTHER COMMERCIAL DAMAGES OR LOSSES, ARISING OUT OF OR RELATED TO YOUR USE OR INABILITY TO USE THE APPLE SOFTWARE, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT OR OTHERWISE) AND EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS DO NOT ALLOW THE LIMITATION OF LIABILITY FOR PERSONAL INJURY, OR OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THIS LIMITATION MAY NOT APPLY TO YOU. In no event shall Apple's total liability to you for all damages (other than as may be required by applicable law in cases involving personal injury) exceed the amount of fifty dollars ($50.00). The foregoing limitations will apply even if the above stated remedy fails of its essential -purpose. - -5. Export Control. You may not use or otherwise export or reexport the Apple Product except as authorized by United States law and the laws of the jurisdiction in which the Apple Product was obtained. In particular, but without limitation, the Apple Product may not be exported or re-exported (a) into any U.S. embargoed countries or (b) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals or the U.S. Department of Commerce Denied Person?s List or Entity List. By using the Apple Product, you represent and warrant that you are not located in any such country or on any such list. - -6. Government End Users. The Apple Software and related documentation are "Commercial Items", as that term is defined at 48 C.F.R. ?2.101, consisting of "Commercial Computer Software" and "Commercial Computer Software Documentation", as such terms are used in 48 C.F.R. ?12.212 or 48 C.F.R. ?227.7202, as applicable. Consistent with 48 C.F.R. ?12.212 or 48 C.F.R. ?227.7202-1through 227.7202-4, as applicable, the Commercial Computer Software and Commercial Computer Software Documentation are being licensed to U.S. Government end users (a) only as Commercial Items and (b) with only those rights as are granted to all other end users pursuant to the terms and conditions herein. Unpublished-rights reserved under the copyright laws of the United States. - -7. Controlling Law and Severability. This License will be governed by and construed in accordance with the laws of the State of California, as applied to agreements entered into and to be performed entirely within California between California residents. This License shall not be governed by the United Nations Convention on Contracts for the International Sale of Goods, the application of which is expressly excluded. If for any reason a court of competent jurisdiction finds any provision, or portion thereof, to be unenforceable, the remainder of this License shall continue in full force and effect. - -8. Complete Agreement. This License constitutes the entire agreement between the parties with respect to the use of the Apple Software licensed hereunder and supersedes all prior or contemporaneous understandings regarding such subject matter. No amendment to or modification of this License will be binding unless in writing and signed by Apple. Any translation of this License is done for local requirements and in the event of a dispute between the English and any non-English versions, the English version of this License shall govern. - -EA0300 - - - scea - - url - http://research.scea.com/scea_shared_source_license.html - - sleepycat - - url - http://opensource.org/licenses/sleepycat.php - - smartheap - - text - on file - - things - - - vivox - - text - on file - - xiph-bsd - - url - http://www.xiph.org/licenses/bsd/ - - xmlrpc-epi - - url - http://xmlrpc-epi.sourceforge.net/main.php?t=license - - zlib - - url - http://www.gzip.org/zlib/zlib_license.html - - - - diff --git a/scripts/install.py b/scripts/install.py deleted file mode 100755 index 6bb9eaacb..000000000 --- a/scripts/install.py +++ /dev/null @@ -1,1205 +0,0 @@ -#!/usr/bin/env python -"""\ -@file install.py -@author Phoenix -@date 2008-01-27 -@brief Install files into an indra checkout. - -Install files as specified by: -https://wiki.lindenlab.com/wiki/User:Phoenix/Library_Installation - - -$LicenseInfo:firstyear=2007&license=mit$ - -Copyright (c) 2007-2009, Linden Research, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -$/LicenseInfo$ -""" - -import sys -import os.path - -# Look for indra/lib/python in all possible parent directories ... -# This is an improvement over the setup-path.py method used previously: -# * the script may blocated anywhere inside the source tree -# * it doesn't depend on the current directory -# * it doesn't depend on another file being present. - -def add_indra_lib_path(): - root = os.path.realpath(__file__) - # always insert the directory of the script in the search path - dir = os.path.dirname(root) - if dir not in sys.path: - sys.path.insert(0, dir) - - # Now go look for indra/lib/python in the parent dies - while root != os.path.sep: - root = os.path.dirname(root) - dir = os.path.join(root, 'indra', 'lib', 'python') - if os.path.isdir(dir): - if dir not in sys.path: - sys.path.insert(0, dir) - return root - else: - print >>sys.stderr, "This script is not inside a valid installation." - sys.exit(1) - -base_dir = add_indra_lib_path() -defaultUserAgent = 'Lynx/2.8.6rel.5 libwww-FM/2.14' #pretend to be lynx because github sucks a fat dick - -import copy -import optparse -import os -import platform -import pprint -import re -import shutil -import tarfile -import tempfile -import urllib2 -import urlparse - -from indra.base import llsd -from indra.util import helpformatter - -# *HACK: Necessary for python 2.4. Consider replacing this code wart -# after python >=2.5 has deployed everywhere. 2009-10-05 -try: - from hashlib import md5 -except ImportError: - from md5 import md5 - -class InstallFile(object): - "This is just a handy way to throw around details on a file in memory." - def __init__(self, pkgname, url, md5sum, cache_dir, platform_path): - self.pkgname = pkgname - self.url = url - self.md5sum = md5sum - filename = urlparse.urlparse(url)[2].split('/')[-1] - self.filename = os.path.join(cache_dir, filename) - self.platform_path = platform_path - - def __str__(self): - return "ifile{%s:%s}" % (self.pkgname, self.url) - - def _is_md5sum_match(self): - hasher = md5(file(self.filename, 'rb').read()) - md5_sum = hasher.hexdigest() - if md5_sum == self.md5sum: - return True - print "Got:", md5_sum, " Expected ", self.md5sum - return False - - def is_match(self, platform): - """@brief Test to see if this ifile is part of platform - @param platform The target platform. Eg, windows or linux/i686/gcc/3.3 - @return Returns True if the ifile is in the platform. - """ - if self.platform_path[0] == 'common': - return True - req_platform_path = platform.split('/') - #print "platform:",req_platform_path - #print "path:",self.platform_path - # to match, every path part much match - match_count = min(len(req_platform_path), len(self.platform_path)) - for ii in range(0, match_count): - if req_platform_path[ii] != self.platform_path[ii]: - return False - #print "match!" - return True - - def fetch_local(self): - cache_path, cache_file = os.path.split(self.filename) - cache_path, cache_folder = os.path.split(os.path.normpath(cache_path)) - cache_file = os.path.join(cache_path, cache_folder.rsplit('.',1)[0] + ".", cache_file) - #print "Looking for:",cache_file - - if not os.path.exists(self.filename): - pass - elif self.md5sum and not self._is_md5sum_match(): - print "md5 mismatch:", cache_file - os.remove(self.filename) - else: - print "Found matching package:", cache_file - return - print "Downloading",self.url,"to local file",cache_file - - request = urllib2.Request(self.url) - - if re.match("/^http:\/\/github.com/", self.url): - request.add_header('User-agent', defaultUserAgent) - - file(self.filename, 'wb').write(urllib2.urlopen(request).read()) - if self.md5sum and not self._is_md5sum_match(): - raise RuntimeError("Error matching md5 for %s" % self.url) - -class LicenseDefinition(object): - def __init__(self, definition): - #probably looks like: - # { text : ..., - # url : ... - # blessed : ... - # } - self._definition = definition - - -class InstallableDefinition(object): - def __init__(self, definition): - #probably looks like: - # { packages : {platform...}, - # copyright : ... - # license : ... - # description: ... - # } - self._definition = definition - - def _ifiles_from(self, tree, pkgname, cache_dir): - return self._ifiles_from_path(tree, pkgname, cache_dir, []) - - def _ifiles_from_path(self, tree, pkgname, cache_dir, path): - ifiles = [] - if 'url' in tree: - ifiles.append(InstallFile( - pkgname, - tree['url'], - tree.get('md5sum', None), - cache_dir, - path)) - else: - for key in tree: - platform_path = copy.copy(path) - platform_path.append(key) - ifiles.extend( - self._ifiles_from_path( - tree[key], - pkgname, - cache_dir, - platform_path)) - return ifiles - - def ifiles(self, pkgname, platform, cache_dir): - """@brief return a list of appropriate InstallFile instances to install - @param pkgname The name of the package to be installed, eg 'tut' - @param platform The target platform. Eg, windows or linux/i686/gcc/3.3 - @param cache_dir The directory to cache downloads. - @return Returns a list of InstallFiles which are part of this install - """ - if 'packages' not in self._definition: - return [] - all_ifiles = self._ifiles_from( - self._definition['packages'], - pkgname, - cache_dir) - if platform == 'all': - return all_ifiles - #print "Considering", len(all_ifiles), "packages for", pkgname - # split into 2 lines because pychecker thinks it might return none. - files = [ifile for ifile in all_ifiles if ifile.is_match(platform)] - return files - -class InstalledPackage(object): - def __init__(self, definition): - # looks like: - # { url1 : { files: [file1,file2,...], md5sum:... }, - # url2 : { files: [file1,file2,...], md5sum:... },... - # } - self._installed = {} - for url in definition: - self._installed[url] = definition[url] - - def urls(self): - return self._installed.keys() - - def files_in(self, url): - return self._installed[url].get('files', []) - - def get_md5sum(self, url): - return self._installed[url].get('md5sum', None) - - def remove(self, url): - self._installed.pop(url) - - def add_files(self, url, files): - if url not in self._installed: - self._installed[url] = {} - self._installed[url]['files'] = files - - def set_md5sum(self, url, md5sum): - if url not in self._installed: - self._installed[url] = {} - self._installed[url]['md5sum'] = md5sum - -class Installer(object): - def __init__(self, install_filename, installed_filename, dryrun): - self._install_filename = install_filename - self._install_changed = False - self._installed_filename = installed_filename - self._installed_changed = False - self._dryrun = dryrun - self._installables = {} - self._licenses = {} - self._installed = {} - self.load() - - def load(self): - if os.path.exists(self._install_filename): - install = llsd.parse(file(self._install_filename, 'rb').read()) - try: - for name in install['installables']: - self._installables[name] = InstallableDefinition( - install['installables'][name]) - except KeyError: - pass - try: - for name in install['licenses']: - self._licenses[name] = LicenseDefinition(install['licenses'][name]) - except KeyError: - pass - if os.path.exists(self._installed_filename): - installed = llsd.parse(file(self._installed_filename, 'rb').read()) - try: - bins = installed['installables'] - for name in bins: - self._installed[name] = InstalledPackage(bins[name]) - except KeyError: - pass - - def _write(self, filename, state): - print "Writing state to",filename - if not self._dryrun: - file(filename, 'wb').write(llsd.format_pretty_xml(state)) - - def save(self): - if self._install_changed: - state = {} - state['licenses'] = {} - for name in self._licenses: - state['licenses'][name] = self._licenses[name]._definition - #print "self._installables:",self._installables - state['installables'] = {} - for name in self._installables: - state['installables'][name] = \ - self._installables[name]._definition - self._write(self._install_filename, state) - if self._installed_changed: - state = {} - state['installables'] = {} - bin = state['installables'] - for name in self._installed: - #print "installed:",name,self._installed[name]._installed - bin[name] = self._installed[name]._installed - self._write(self._installed_filename, state) - - def is_valid_license(self, bin): - "@brief retrun true if we have valid license info for installable." - installable = self._installables[bin]._definition - if 'license' not in installable: - print >>sys.stderr, "No license info found for", bin - print >>sys.stderr, 'Please add the license with the', - print >>sys.stderr, '--add-installable option. See', \ - sys.argv[0], '--help' - return False - if installable['license'] not in self._licenses: - lic = installable['license'] - print >>sys.stderr, "Missing license info for '" + lic + "'.", - print >>sys.stderr, 'Please add the license with the', - print >>sys.stderr, '--add-license option. See', sys.argv[0], - print >>sys.stderr, '--help' - return False - return True - - def list_installables(self): - "Return a list of all known installables." - return sorted(self._installables.keys()) - - def detail_installable(self, name): - "Return a installable definition detail" - return self._installables[name]._definition - - def list_licenses(self): - "Return a list of all known licenses." - return sorted(self._licenses.keys()) - - def detail_license(self, name): - "Return a license definition detail" - return self._licenses[name]._definition - - def list_installed(self): - "Return a list of installed packages." - return sorted(self._installed.keys()) - - def detail_installed(self, name): - "Return file list for specific installed package." - filelist = [] - for url in self._installed[name]._installed.keys(): - filelist.extend(self._installed[name].files_in(url)) - return filelist - - def _update_field(self, description, field, value, multiline=False): - """Given a block and a field name, add or update it. - @param description a dict containing all the details of a description. - @param field the name of the field to update. - @param value the value of the field to update; if omitted, interview - will ask for value. - @param multiline boolean specifying whether field is multiline or not. - """ - if value: - description[field] = value - else: - if field in description: - print "Update value for '" + field + "'" - print "(Leave blank to keep current value)" - print "Current Value: '" + description[field] + "'" - else: - print "Specify value for '" + field + "'" - if not multiline: - new_value = raw_input("Enter New Value: ") - else: - print "Please enter " + field + ". End input with EOF (^D)." - new_value = sys.stdin.read() - - if field in description and not new_value: - pass - elif new_value: - description[field] = new_value - - self._install_changed = True - return True - - def _update_installable(self, name, platform, url, md5sum): - """Update installable entry with specific package information. - @param installable[in,out] a dict containing installable details. - @param platform Platform info, i.e. linux/i686, windows/i686 etc. - @param url URL of tar file - @param md5sum md5sum of tar file - """ - installable = self._installables[name]._definition - path = platform.split('/') - if 'packages' not in installable: - installable['packages'] = {} - update = installable['packages'] - for child in path: - if child not in update: - update[child] = {} - parent = update - update = update[child] - parent[child]['url'] = llsd.uri(url) - parent[child]['md5sum'] = md5sum - - self._install_changed = True - return True - - - def add_installable_package(self, name, **kwargs): - """Add an url for a platform path to the installable. - @param installable[in,out] a dict containing installable details. - """ - platform_help_str = """\ -Please enter a new package location and url. Some examples: -common -- specify a package for all platforms -linux -- specify a package for all arch and compilers on linux -darwin/universal -- specify a mac os x universal -windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" - if name not in self._installables: - print "Error: must add library with --add-installable or " \ - +"--add-installable-metadata before using " \ - +"--add-installable-package option" - return False - else: - print "Updating installable '" + name + "'." - for arg in ('platform', 'url', 'md5sum'): - if not kwargs[arg]: - if arg == 'platform': - print platform_help_str - kwargs[arg] = raw_input("Package "+arg+":") - #path = kwargs['platform'].split('/') - - return self._update_installable(name, kwargs['platform'], - kwargs['url'], kwargs['md5sum']) - - def add_installable_metadata(self, name, **kwargs): - """Interactively add (only) library metadata into install, - w/o adding installable""" - if name not in self._installables: - print "Adding installable '" + name + "'." - self._installables[name] = InstallableDefinition({}) - else: - print "Updating installable '" + name + "'." - installable = self._installables[name]._definition - for field in ('copyright', 'license', 'description'): - self._update_field(installable, field, kwargs[field]) - print "Added installable '" + name + "':" - pprint.pprint(self._installables[name]) - - return True - - def add_installable(self, name, **kwargs): - "Interactively pull a new installable into the install" - ret_a = self.add_installable_metadata(name, **kwargs) - ret_b = self.add_installable_package(name, **kwargs) - return (ret_a and ret_b) - - def remove_installable(self, name): - self._installables.pop(name) - self._install_changed = True - - def add_license(self, name, **kwargs): - if name not in self._licenses: - print "Adding license '" + name + "'." - self._licenses[name] = LicenseDefinition({}) - else: - print "Updating license '" + name + "'." - the_license = self._licenses[name]._definition - for field in ('url', 'text'): - multiline = False - if field == 'text': - multiline = True - self._update_field(the_license, field, kwargs[field], multiline) - self._install_changed = True - return True - - def remove_license(self, name): - self._licenses.pop(name) - self._install_changed = True - - def _uninstall(self, installables): - """@brief Do the actual removal of files work. - *NOTE: This method is not transactionally safe -- ie, if it - raises an exception, internal state may be inconsistent. How - should we address this? - @param installables The package names to remove - """ - remove_file_list = [] - for pkgname in installables: - for url in self._installed[pkgname].urls(): - remove_file_list.extend( - self._installed[pkgname].files_in(url)) - self._installed[pkgname].remove(url) - if not self._dryrun: - self._installed_changed = True - if not self._dryrun: - self._installed.pop(pkgname) - remove_dir_set = set() - for filename in remove_file_list: - print "rm",filename - if not self._dryrun: - if os.path.lexists(filename): - remove_dir_set.add(os.path.dirname(filename)) - try: - os.remove(filename) - except OSError: - # This is just for cleanup, so we don't care - # about normal failures. - pass - for dirname in remove_dir_set: - try: - os.removedirs(dirname) - except OSError: - # This is just for cleanup, so we don't care about - # normal failures. - pass - - def uninstall(self, installables, install_dir): - """@brief Remove the packages specified. - @param installables The package names to remove - @param install_dir The directory to work from - """ - print "uninstall",installables,"from",install_dir - cwd = os.getcwdu() - os.chdir(install_dir) - try: - self._uninstall(installables) - finally: - os.chdir(cwd) - - def _build_ifiles(self, platform, cache_dir): - """@brief determine what files to install - @param platform The target platform. Eg, windows or linux/i686/gcc/3.3 - @param cache_dir The directory to cache downloads. - @return Returns the ifiles to install - """ - ifiles = [] - for bin in self._installables: - ifiles.extend(self._installables[bin].ifiles(bin, - platform, - cache_dir)) - to_install = [] - to_uninstall = [] - #print "self._installed",self._installed - for ifile in ifiles: - if ifile.pkgname not in self._installed: - to_install.append(ifile) - elif ifile.url not in self._installed[ifile.pkgname].urls(): - to_uninstall.append(ifile.pkgname) - to_install.append(ifile) - elif ifile.md5sum != \ - self._installed[ifile.pkgname].get_md5sum(ifile.url): - to_uninstall.append(ifile.pkgname) - to_install.append(ifile) - else: - #print "Installation up to date:", - # ifile.pkgname,ifile.platform_path - pass - #print "to_install",to_install - return [to_install, to_uninstall] - - def _install(self, to_install, install_dir): - for ifile in to_install: - tar = tarfile.open(ifile.filename, 'r') - print "Extracting",ifile.filename,"to",install_dir - if not self._dryrun: - # *NOTE: try to call extractall, which first appears - # in python 2.5. Phoenix 2008-01-28 - try: - tar.extractall(path=install_dir) - except AttributeError: - _extractall(tar, path=install_dir) - symlinks = [] - - filenames = tar.getnames() - if('autobuild-package.xml' in filenames): - filenames.remove("autobuild-package.xml") - rem_file = os.path.join(install_dir, "autobuild-package.xml") - if os.path.exists(rem_file): - os.remove(rem_file) - if _get_platform() == 'linux' or _get_platform() == 'linux64': - first = 1 - for tfile in filenames: - if tfile.find('.so.') > 0: - LINK = re.sub(r'\.so\.[0-9.]*$', '.so', tfile) - link_name = install_dir + "/" + LINK - if not os.path.exists(link_name): - if first == 1: - first = 0 - print "Adding missing symlink(s) for package %s:" % ifile.filename - target = os.path.basename(tfile) - soname = os.popen("readelf -d \"%(install_dir)s/%(tfile)s\" %(stderr_redirect)s" - " | grep SONAME | sed -e 's/.*\[//;s/\].*//'" % - {"install_dir": install_dir, "tfile": tfile, "stderr_redirect": ("2>/dev/null" if self._dryrun else "")}).read() - soname = soname.strip() - if soname: # not empty - tmpfname = os.path.dirname(LINK) + "/" + soname - if os.path.exists(install_dir + "/" + tmpfname): - target = soname - else: - print "WARNING: SONAME %s doesn't exist!" % tmpfname - if not self._dryrun: - os.symlink(target, link_name) - symlinks += [LINK] - print " %s --> %s" % (LINK, target) - if ifile.pkgname in self._installed: - self._installed[ifile.pkgname].add_files( - ifile.url, - filenames + symlinks) - self._installed[ifile.pkgname].set_md5sum( - ifile.url, - ifile.md5sum) - else: - # *HACK: this understands the installed package syntax. - definition = { ifile.url : - {'files': filenames + symlinks, - 'md5sum' : ifile.md5sum } } - self._installed[ifile.pkgname] = InstalledPackage(definition) - self._installed_changed = True - - def install(self, installables, platform, install_dir, cache_dir): - """@brief Do the installation for for the platform. - @param installables The requested installables to install. - @param platform The target platform. Eg, windows or linux/i686/gcc/3.3 - @param install_dir The root directory to install into. Created - if missing. - @param cache_dir The directory to cache downloads. Created if - missing. - """ - # The ordering of steps in the method is to help reduce the - # likelihood that we break something. - install_dir = os.path.realpath(install_dir) - cache_dir = os.path.realpath(cache_dir) - _mkdir(install_dir) - _mkdir(cache_dir) - to_install_uninstall = self._build_ifiles(platform, cache_dir) - to_install = to_install_uninstall[0] - to_uninstall = to_install_uninstall[1] - - # Filter for files which we actually requested to install. - to_install = [ifl for ifl in to_install if ifl.pkgname in installables] - to_uninstall = [ifl for ifl in to_uninstall if ifl in installables] - for ifile in to_install: - ifile.fetch_local() - if to_uninstall: - self.uninstall(to_uninstall, install_dir) - self._install(to_install, install_dir) - - def do_install(self, installables, platform, install_dir, cache_dir=None, - check_license=True, scp=None): - """Determine what installables should be installed. If they were - passed in on the command line, use them, otherwise install - all known installables. - """ - if not cache_dir: - cache_dir = _default_installable_cache() - all_installables = self.list_installables() - if not len(installables): - install_installables = all_installables - else: - # passed in on the command line. We'll need to verify we - # know about them here. - install_installables = installables - for installable in install_installables: - if installable not in all_installables: - raise RuntimeError('Unknown installable: %s' % - (installable,)) - if check_license: - # *TODO: check against a list of 'known good' licenses. - # *TODO: check for urls which conflict -- will lead to - # problems. - for installable in install_installables: - if not self.is_valid_license(installable): - return 1 - - # Set up the 'scp' handler - opener = urllib2.build_opener() - scp_or_http = SCPOrHTTPHandler(scp) - opener.add_handler(scp_or_http) - urllib2.install_opener(opener) - - # Do the work of installing the requested installables. - self.install( - install_installables, - platform, - install_dir, - cache_dir) - scp_or_http.cleanup() - - # Verify that requested packages are installed - for pkg in installables: - if pkg not in self._installed: - raise RuntimeError("No '%s' available for '%s'." % - (pkg, platform)) - - def do_uninstall(self, installables, install_dir): - # Do not bother to check license if we're uninstalling. - all_installed = self.list_installed() - if not len(installables): - uninstall_installables = all_installed - else: - # passed in on the command line. We'll need to verify we - # know about them here. - uninstall_installables = installables - for installable in uninstall_installables: - if installable not in all_installed: - raise RuntimeError('Installable not installed: %s' % - (installable,)) - self.uninstall(uninstall_installables, install_dir) - -class SCPOrHTTPHandler(urllib2.BaseHandler): - """Evil hack to allow both the build system and developers consume - proprietary binaries. - To use http, export the environment variable: - INSTALL_USE_HTTP_FOR_SCP=true - """ - def __init__(self, scp_binary): - self._scp = scp_binary - self._dir = None - - def scp_open(self, request): - #scp:codex.lindenlab.com:/local/share/install_pkgs/package.tar.bz2 - remote = request.get_full_url()[4:] - if os.getenv('INSTALL_USE_HTTP_FOR_SCP', None) == 'true': - return self.do_http(remote) - try: - return self.do_scp(remote) - except: - self.cleanup() - raise - - def do_http(self, remote): - url = remote.split(':',1) - if not url[1].startswith('/'): - # in case it's in a homedir or something - url.insert(1, '/') - url.insert(0, "http://") - url = ''.join(url) - print "Using HTTP:",url - request = urllib2.Request(url) - request.add_header('User-agent', defaultUserAgent) - return urllib2.urlopen(request) - - def do_scp(self, remote): - if not self._dir: - self._dir = tempfile.mkdtemp() - local = os.path.join(self._dir, remote.split('/')[-1:][0]) - command = [] - for part in (self._scp, remote, local): - if ' ' in part: - # I hate shell escaping. - part.replace('\\', '\\\\') - part.replace('"', '\\"') - command.append('"%s"' % part) - else: - command.append(part) - #print "forking:", command - rv = os.system(' '.join(command)) - if rv != 0: - raise RuntimeError("Cannot fetch: %s" % remote) - return file(local, 'rb') - - def cleanup(self): - if self._dir: - shutil.rmtree(self._dir) - - -# -# *NOTE: PULLED FROM PYTHON 2.5 tarfile.py Phoenix 2008-01-28 -# -def _extractall(tar, path=".", members=None): - """Extract all members from the archive to the current working - directory and set owner, modification time and permissions on - directories afterwards. `path' specifies a different directory - to extract to. `members' is optional and must be a subset of the - list returned by getmembers(). - """ - directories = [] - - if members is None: - members = tar - - for tarinfo in members: - if tarinfo.isdir(): - # Extract directory with a safe mode, so that - # all files below can be extracted as well. - try: - os.makedirs(os.path.join(path, tarinfo.name), 0777) - except EnvironmentError: - pass - directories.append(tarinfo) - else: - tar.extract(tarinfo, path) - - # Reverse sort directories. - directories.sort(lambda a, b: cmp(a.name, b.name)) - directories.reverse() - - # Set correct owner, mtime and filemode on directories. - for tarinfo in directories: - path = os.path.join(path, tarinfo.name) - try: - tar.chown(tarinfo, path) - tar.utime(tarinfo, path) - tar.chmod(tarinfo, path) - except tarfile.ExtractError, e: - if tar.errorlevel > 1: - raise - else: - tar._dbg(1, "tarfile: %s" % e) - - -def _mkdir(directory): - "Safe, repeatable way to make a directory." - if not os.path.exists(directory): - os.makedirs(directory) - -def _get_platform(): - "Return appropriate platform packages for the environment." - platform_map = { - 'darwin': 'darwin', - 'linux2': 'linux', - 'win32' : 'windows', - 'cygwin' : 'windows', - 'solaris' : 'solaris' - } - this_platform = platform_map[sys.platform] - if this_platform == 'linux': - if platform.architecture()[0] == '64bit': - # TODO -- someday when install.py accepts a platform of the form - # os/arch/compiler/compiler_version then we can replace the - # 'linux64' platform with 'linux/x86_64/gcc/4.1' - this_platform = 'linux64' - return this_platform - -def _getuser(): - "Get the user" - try: - # Unix-only. - import getpass - return getpass.getuser() - except ImportError: - import win32api - return win32api.GetUserName() - -def _default_installable_cache(): - """In general, the installable files do not change much, so find a - host/user specific location to cache files.""" - user = _getuser() - cache_dir = "/var/tmp/%s/sg.install.cache" % user - if _get_platform() == 'windows': - cache_dir = os.path.join(tempfile.gettempdir(), \ - 'sg.install.cache.%s' % user) - return cache_dir - -def parse_args(): - parser = optparse.OptionParser( - usage="usage: %prog [options] [installable1 [installable2...]]", - formatter = helpformatter.Formatter(), - description="""This script fetches and installs installable packages. -It also handles uninstalling those packages and manages the mapping between -packages and their license. - -The process is to open and read an install manifest file which specifies -what files should be installed. For each installable to be installed. - * make sure it has a license - * check the installed version - ** if not installed and needs to be, download and install - ** if installed version differs, download & install - -If no installables are specified on the command line, then the defaut -behavior is to install all known installables appropriate for the platform -specified or uninstall all installables if --uninstall is set. You can specify -more than one installable on the command line. - -When specifying a platform, you can specify 'all' to install all -packages, or any platform of the form: - -OS[/arch[/compiler[/compiler_version]]] - -Where the supported values for each are: -OS: darwin, linux, windows, solaris -arch: i686, x86_64, ppc, universal -compiler: vs, gcc -compiler_version: 2003, 2005, 2008, 3.3, 3.4, 4.0, etc. - -No checks are made to ensure a valid combination of platform -parts. Some exmples of valid platforms: - -windows -windows/i686/vs/2005 -linux/x86_64/gcc/3.3 -linux/x86_64/gcc/4.0 -darwin/universal/gcc/4.0 -""") - parser.add_option( - '--dry-run', - action='store_true', - default=False, - dest='dryrun', - help='Do not actually install files. Downloads will still happen.') - parser.add_option( - '--install-manifest', - type='string', - default=os.path.join(base_dir, 'install.xml'), - dest='install_filename', - help='The file used to describe what should be installed.') - parser.add_option( - '--installed-manifest', - type='string', - default=os.path.join(base_dir, 'installed.xml'), - dest='installed_filename', - help='The file used to record what is installed.') - parser.add_option( - '--export-manifest', - action='store_true', - default=False, - dest='export_manifest', - help="Print the install manifest to stdout and exit.") - parser.add_option( - '-p', '--platform', - type='string', - default=_get_platform(), - dest='platform', - help="""Override the automatically determined platform. \ -You can specify 'all' to do a installation of installables for all platforms.""") - parser.add_option( - '--cache-dir', - type='string', - default=_default_installable_cache(), - dest='cache_dir', - help='Where to download files. Default: %s'% \ - (_default_installable_cache())) - parser.add_option( - '--install-dir', - type='string', - default=base_dir, - dest='install_dir', - help='Where to unpack the installed files.') - parser.add_option( - '--list-installed', - action='store_true', - default=False, - dest='list_installed', - help="List the installed package names and exit.") - parser.add_option( - '--skip-license-check', - action='store_false', - default=True, - dest='check_license', - help="Do not perform the license check.") - parser.add_option( - '--list-licenses', - action='store_true', - default=False, - dest='list_licenses', - help="List known licenses and exit.") - parser.add_option( - '--detail-license', - type='string', - default=None, - dest='detail_license', - help="Get detailed information on specified license and exit.") - parser.add_option( - '--add-license', - type='string', - default=None, - dest='new_license', - help="""Add a license to the install file. Argument is the name of \ -license. Specify --license-url if the license is remote or specify \ ---license-text, otherwse the license text will be read from standard \ -input.""") - parser.add_option( - '--license-url', - type='string', - default=None, - dest='license_url', - help="""Put the specified url into an added license. \ -Ignored if --add-license is not specified.""") - parser.add_option( - '--license-text', - type='string', - default=None, - dest='license_text', - help="""Put the text into an added license. \ -Ignored if --add-license is not specified.""") - parser.add_option( - '--remove-license', - type='string', - default=None, - dest='remove_license', - help="Remove a named license.") - parser.add_option( - '--remove-installable', - type='string', - default=None, - dest='remove_installable', - help="Remove a installable from the install file.") - parser.add_option( - '--add-installable', - type='string', - default=None, - dest='add_installable', - help="""Add a installable into the install file. Argument is \ -the name of the installable to add.""") - parser.add_option( - '--add-installable-metadata', - type='string', - default=None, - dest='add_installable_metadata', - help="""Add package for library into the install file. Argument is \ -the name of the library to add.""") - parser.add_option( - '--installable-copyright', - type='string', - default=None, - dest='installable_copyright', - help="""Copyright for specified new package. Ignored if \ ---add-installable is not specified.""") - parser.add_option( - '--installable-license', - type='string', - default=None, - dest='installable_license', - help="""Name of license for specified new package. Ignored if \ ---add-installable is not specified.""") - parser.add_option( - '--installable-description', - type='string', - default=None, - dest='installable_description', - help="""Description for specified new package. Ignored if \ ---add-installable is not specified.""") - parser.add_option( - '--add-installable-package', - type='string', - default=None, - dest='add_installable_package', - help="""Add package for library into the install file. Argument is \ -the name of the library to add.""") - parser.add_option( - '--package-platform', - type='string', - default=None, - dest='package_platform', - help="""Platform for specified new package. \ -Ignored if --add-installable or --add-installable-package is not specified.""") - parser.add_option( - '--package-url', - type='string', - default=None, - dest='package_url', - help="""URL for specified package. \ -Ignored if --add-installable or --add-installable-package is not specified.""") - parser.add_option( - '--package-md5', - type='string', - default=None, - dest='package_md5', - help="""md5sum for new package. \ -Ignored if --add-installable or --add-installable-package is not specified.""") - parser.add_option( - '--list', - action='store_true', - default=False, - dest='list_installables', - help="List the installables in the install manifest and exit.") - parser.add_option( - '--detail', - type='string', - default=None, - dest='detail_installable', - help="Get detailed information on specified installable and exit.") - parser.add_option( - '--detail-installed', - type='string', - default=None, - dest='detail_installed', - help="Get list of files for specified installed installable and exit.") - parser.add_option( - '--uninstall', - action='store_true', - default=False, - dest='uninstall', - help="""Remove the installables specified in the arguments. Just like \ -during installation, if no installables are listed then all installed \ -installables are removed.""") - parser.add_option( - '--scp', - type='string', - default='scp', - dest='scp', - help="Specify the path to your scp program.") - - return parser.parse_args() - -def main(): - options, args = parse_args() - installer = Installer( - options.install_filename, - options.installed_filename, - options.dryrun) - - # - # Handle the queries for information - # - if options.list_installed: - print "installed list:", installer.list_installed() - return 0 - if options.list_installables: - print "installable list:", installer.list_installables() - return 0 - if options.detail_installable: - try: - detail = installer.detail_installable(options.detail_installable) - print "Detail on installable",options.detail_installable+":" - pprint.pprint(detail) - except KeyError: - print "Installable '"+options.detail_installable+"' not found in", - print "install file." - return 0 - if options.detail_installed: - try: - detail = installer.detail_installed(options.detail_installed) - #print "Detail on installed",options.detail_installed+":" - for line in detail: - print line - except: - raise - print "Installable '"+options.detail_installed+"' not found in ", - print "install file." - return 0 - if options.list_licenses: - print "license list:", installer.list_licenses() - return 0 - if options.detail_license: - try: - detail = installer.detail_license(options.detail_license) - print "Detail on license",options.detail_license+":" - pprint.pprint(detail) - except KeyError: - print "License '"+options.detail_license+"' not defined in", - print "install file." - return 0 - if options.export_manifest: - # *HACK: just re-parse the install manifest and pretty print - # it. easier than looking at the datastructure designed for - # actually determining what to install - install = llsd.parse(file(options.install_filename, 'rb').read()) - pprint.pprint(install) - return 0 - - # - # Handle updates -- can only do one of these - # *TODO: should this change the command line syntax? - # - if options.new_license: - if not installer.add_license( - options.new_license, - text=options.license_text, - url=options.license_url): - return 1 - elif options.remove_license: - installer.remove_license(options.remove_license) - elif options.remove_installable: - installer.remove_installable(options.remove_installable) - elif options.add_installable: - if not installer.add_installable( - options.add_installable, - copyright=options.installable_copyright, - license=options.installable_license, - description=options.installable_description, - platform=options.package_platform, - url=options.package_url, - md5sum=options.package_md5): - return 1 - elif options.add_installable_metadata: - if not installer.add_installable_metadata( - options.add_installable_metadata, - copyright=options.installable_copyright, - license=options.installable_license, - description=options.installable_description): - return 1 - elif options.add_installable_package: - if not installer.add_installable_package( - options.add_installable_package, - platform=options.package_platform, - url=options.package_url, - md5sum=options.package_md5): - return 1 - elif options.uninstall: - installer.do_uninstall(args, options.install_dir) - else: - installer.do_install(args, options.platform, options.install_dir, - options.cache_dir, options.check_license, - options.scp) - - # save out any changes - installer.save() - return 0 - -if __name__ == '__main__': - #print sys.argv - sys.exit(main()) diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg index ce7e2a442..4b46143ef 100644 --- a/scripts/messages/message_template.msg +++ b/scripts/messages/message_template.msg @@ -4245,6 +4245,10 @@ version 2.0 { ObjectOwner Variable 1 } { Questions S32 } } + { + Experience Single + { ExperienceID LLUUID } + } } // ScriptControlChange diff --git a/scripts/messages/message_template.msg.sha1 b/scripts/messages/message_template.msg.sha1 new file mode 100644 index 000000000..c533cf89a --- /dev/null +++ b/scripts/messages/message_template.msg.sha1 @@ -0,0 +1 @@ +326aaa0f3f77faaa62aac6675f2c9c17f5d14116 \ No newline at end of file diff --git a/scripts/packages-formatter.py b/scripts/packages-formatter.py new file mode 100644 index 000000000..1c7c000bd --- /dev/null +++ b/scripts/packages-formatter.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python2 +"""\ +This module formats the package version and copyright information for the +viewer and its dependent packages. + +$LicenseInfo:firstyear=2014&license=viewerlgpl$ +Second Life Viewer Source Code +Copyright (C) 2014, Linden Research, Inc. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; +version 2.1 of the License only. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +$/LicenseInfo$ +""" +import os +import sys +import errno +import re +import subprocess +import argparse + +parser = argparse.ArgumentParser() +parser.add_argument( + '-p', '--platform', + default=None, + dest='platform', + help='Override the automatically determined platform.') +parsedargs = parser.parse_args() + +_autobuild=os.getenv('AUTOBUILD', 'autobuild') + +pkg_line=re.compile('^([\w-]+):\s+(.*)$') + +def autobuild(*args): + """ + Launch autobuild with specified command-line arguments. + Return its stdout pipe from which the caller can read. + """ + # subprocess wants a list, not a tuple + temp = list(args) + if parsedargs.platform is not None : + temp.append("-p=" + str(parsedargs.platform)) + command = [_autobuild] + temp + try: + child = subprocess.Popen(command, + stdin=None, stdout=subprocess.PIPE, + universal_newlines=True) + except OSError as err: + if err.errno != errno.ENOENT: + # Don't attempt to interpret anything but ENOENT + raise + # Here it's ENOENT: subprocess can't find the autobuild executable. + print >>sys.stderr, "packages-formatter on %s: can't run autobuild:\n%s\n%s" % \ + (sys.platform, ' '.join(command), err) + sys.exit(1) + + # no exceptions yet, let caller read stdout + return child.stdout + +version={} +versions=autobuild('install', '--versions') +for line in versions: + pkg_info = pkg_line.match(line) + if pkg_info: + pkg = pkg_info.group(1) + if pkg not in version: + version[pkg] = pkg_info.group(2).strip() + else: + sys.exit("Duplicate version for %s" % pkg) + else: + sys.exit("Unrecognized --versions output: %s" % line) + +copyright={} +copyrights=autobuild('install', '--copyrights') +viewer_copyright = copyrights.readline() # first line is the copyright for the viewer itself +for line in copyrights: + pkg_info = pkg_line.match(line) + if pkg_info: + pkg = pkg_info.group(1) + if pkg not in copyright: + copyright[pkg] = pkg_info.group(2).strip() + else: + sys.exit("Duplicate copyright for %s" % pkg) + else: + sys.exit("Unrecognized --copyrights output: %s" % line) + +print viewer_copyright +for pkg in sorted(version): + print ': '.join([pkg, version[pkg]]) + if pkg in copyright: + print copyright[pkg] + else: + sys.exit("No copyright for %s" % pkg) diff --git a/scripts/template_verifier.py b/scripts/template_verifier.py index cc112d130..b44410cdd 100755 --- a/scripts/template_verifier.py +++ b/scripts/template_verifier.py @@ -1,33 +1,27 @@ -#!/usr/bin/python +#!/usr/bin/env python """\ @file template_verifier.py @brief Message template compatibility verifier. -$LicenseInfo:firstyear=2007&license=viewergpl$ - -Copyright (c) 2007-2009, Linden Research, Inc. - +$LicenseInfo:firstyear=2007&license=viewerlgpl$ Second Life Viewer Source Code -The source code in this file ("Source Code") is provided by Linden Lab -to you under the terms of the GNU General Public License, version 2.0 -("GPL"), unless you have obtained a separate licensing agreement -("Other License"), formally executed by you and Linden Lab. Terms of -the GPL can be found in doc/GPL-license.txt in this distribution, or -online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 +Copyright (C) 2010, Linden Research, Inc. -There are special exceptions to the terms and conditions of the GPL as -it is applied to this Source Code. View the full text of the exception -in the file doc/FLOSS-exception.txt in this software distribution, or -online at -http://secondlifegrid.net/programs/open_source/licensing/flossexception +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; +version 2.1 of the License only. -By copying, modifying or distributing this software, you acknowledge -that you have read and understood your obligations described above, -and agree to abide by those obligations. +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. -ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO -WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, -COMPLETENESS OR PERFORMANCE. +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA $/LicenseInfo$ """ @@ -72,14 +66,15 @@ add_indra_lib_path() import optparse import os import urllib +import hashlib from indra.ipc import compatibility from indra.ipc import tokenstream from indra.ipc import llmessage def getstatusall(command): - """ Like commands.getstatusoutput, but returns stdout and - stderr separately(to get around "killed by signal 15" getting + """ Like commands.getstatusoutput, but returns stdout and + stderr separately(to get around "killed by signal 15" getting included as part of the file). Also, works on Windows.""" (input, out, err) = os.popen3(command, 't') status = input.close() # send no input to the command @@ -146,7 +141,7 @@ def fetch(url): return open(file_name).read() else: # *FIX: this doesn't throw an exception for a 404, and oddly enough the sl.com 404 page actually gets parsed successfully - return ''.join(urllib.urlopen(url).readlines()) + return ''.join(urllib.urlopen(url).readlines()) def cache_master(master_url): """Using the url for the master, updates the local cache, and returns an url to the local cache.""" @@ -203,8 +198,13 @@ def getuser(): import getpass return getpass.getuser() except ImportError: - import win32api - return win32api.GetUserName() + import ctypes + MAX_PATH = 260 # according to a recent WinDef.h + name = ctypes.create_unicode_buffer(MAX_PATH) + namelen = ctypes.c_int(len(name)) # len in chars, NOT bytes + if not ctypes.windll.advapi32.GetUserNameW(name, ctypes.byref(namelen)): + raise ctypes.WinError() + return name.value def local_master_cache_filename(): """Returns the location of the master template cache (which is in the system tempdir) @@ -229,11 +229,14 @@ http://wiki.secondlife.com/wiki/Template_verifier.py """) parser.add_option( '-u', '--master_url', type='string', dest='master_url', - default='http://secondlife.com/app/message_template/master_message_template.msg', + default='http://bitbucket.org/lindenlab/master-message-template/raw/tip/message_template.msg', help="""The url of the master message template.""") parser.add_option( '-c', '--cache_master', action='store_true', dest='cache_master', default=False, help="""Set to true to attempt use local cached copy of the master template.""") + parser.add_option( + '-f', '--force', action='store_true', dest='force_verification', + default=False, help="""Set to true to skip the sha_1 check and force template verification.""") options, args = parser.parse_args(sysargs) @@ -251,7 +254,7 @@ http://wiki.secondlife.com/wiki/Template_verifier.py elif len(args) == 1: master_url = None current_filename = args[0] - print "master:", options.master_url + print "master:", options.master_url print "current:", current_filename current_url = 'file://%s' % current_filename # nothing specified, use defaults for everything @@ -263,15 +266,25 @@ http://wiki.secondlife.com/wiki/Template_verifier.py if master_url is None: master_url = options.master_url - + if current_url is None: current_filename = local_template_filename() print "master:", options.master_url print "current:", current_filename current_url = 'file://%s' % current_filename - # retrieve the contents of the local template and check for syntax + # retrieve the contents of the local template current = fetch(current_url) + hexdigest = hashlib.sha1(current).hexdigest() + if not options.force_verification: + # Early exist if the template hasn't changed. + sha_url = "%s.sha1" % current_url + current_sha = fetch(sha_url) + if hexdigest == current_sha: + print "Message template SHA_1 has not changed." + sys.exit(0) + + # and check for syntax current_parsed = llmessage.parseTemplateString(current) if options.cache_master: @@ -291,7 +304,7 @@ http://wiki.secondlife.com/wiki/Template_verifier.py print "Syntax-checking the local template ONLY, no compatibility check is being run." print "Cause: %s\n\n" % e return 0 - + acceptable, compat = compare( master_parsed, current_parsed, options.mode) @@ -302,9 +315,17 @@ http://wiki.secondlife.com/wiki/Template_verifier.py if acceptable: explain("--- PASS ---", compat) + if options.force_verification == False: + print "Updating sha1 to %s" % hexdigest + sha_filename = "%s.sha1" % current_filename + sha_file = open(sha_filename, 'w') + sha_file.write(hexdigest) + sha_file.close() else: explain("*** FAIL ***", compat) return 1 if __name__ == '__main__': sys.exit(run(sys.argv[1:])) + + From 13666ac62a9af821e2ce9f4aa04920902dfc4822 Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 10:06:07 -0500 Subject: [PATCH 03/19] Change out versioning code for less hacky versioning code --- .gitignore | 9 - indra/cmake/BuildVersion.cmake | 117 +++++------- indra/cmake/Variables.cmake | 3 + indra/llcommon/CMakeLists.txt | 1 - indra/llcommon/llversionviewer.h.in | 48 ----- indra/newview/CMakeLists.txt | 83 ++++++--- indra/newview/VIEWER_VERSION.txt | 1 + indra/newview/llappviewer.cpp | 53 ++---- indra/newview/llfloaterabout.cpp | 6 +- indra/newview/llfloaterreporter.cpp | 13 +- indra/newview/llpanellogin.cpp | 35 ++-- indra/newview/llstartup.cpp | 8 +- indra/newview/lltranslate.cpp | 11 +- indra/newview/lluserauth.cpp | 10 +- indra/newview/llversioninfo.cpp | 174 ++++++++++++++++++ indra/newview/llversioninfo.h | 82 +++++++++ indra/newview/llviewercontrol.cpp | 2 - indra/newview/llviewercontrol.h | 2 - indra/newview/llviewermessage.cpp | 4 +- indra/newview/llviewerstats.cpp | 3 +- indra/newview/llweb.cpp | 14 +- .../res/{viewerRes.rc.in => viewerRes.rc} | 33 ++-- indra/newview/sgversion.cpp | 33 ---- indra/newview/sgversion.h | 32 ---- 24 files changed, 451 insertions(+), 326 deletions(-) delete mode 100644 indra/llcommon/llversionviewer.h.in create mode 100644 indra/newview/VIEWER_VERSION.txt create mode 100644 indra/newview/llversioninfo.cpp create mode 100644 indra/newview/llversioninfo.h rename indra/newview/res/{viewerRes.rc.in => viewerRes.rc} (86%) delete mode 100644 indra/newview/sgversion.cpp delete mode 100644 indra/newview/sgversion.h diff --git a/.gitignore b/.gitignore index 7c302ed85..f180405b6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,3 @@ -/installed.xml -/indra/llcommon/llversionviewer.h /indra/build-* /indra/tools/vstool/obj/ *.aps @@ -26,12 +24,5 @@ qtcreator-build/ /.pc /build-* /viewer-* -/indra/newview/res/viewerRes.rc -/indra/newview/res/viewerRes_bc.rc -/indra/newview/English.lproj/InfoPlist.strings -/indra/newview/linux_tools/handle_secondlifeprotocol.sh -/indra/newview/linux_tools/install.sh -/indra/newview/linux_tools/refresh_desktop_app_entry.sh -/indra/newview/linux_tools/wrapper.sh diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake index 457a1bb16..81a228706 100644 --- a/indra/cmake/BuildVersion.cmake +++ b/indra/cmake/BuildVersion.cmake @@ -1,81 +1,54 @@ # -*- cmake -*- +# Construct the viewer version number based on the indra/VIEWER_VERSION file -# Read version components from the header file. -file(STRINGS ${LIBS_OPEN_DIR}/llcommon/llversionviewer.h.in lines - REGEX " LL_VERSION_") -foreach(line ${lines}) - string(REGEX REPLACE ".*LL_VERSION_([A-Z]+).*" "\\1" comp "${line}") - string(REGEX REPLACE ".* = ([0-9]+);.*" "\\1" value "${line}") - set(v${comp} "${value}") -endforeach(line) +if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/newview/ + set(VIEWER_VERSION_BASE_FILE "${CMAKE_CURRENT_SOURCE_DIR}/newview/VIEWER_VERSION.txt") -execute_process( - COMMAND git rev-list HEAD - OUTPUT_VARIABLE GIT_REV_LIST_STR - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - OUTPUT_STRIP_TRAILING_WHITESPACE -) + if ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) + file(STRINGS ${VIEWER_VERSION_BASE_FILE} VIEWER_SHORT_VERSION REGEX "^[0-9]+\\.[0-9]+\\.[0-9]+") + string(REGEX REPLACE "^([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" VIEWER_VERSION_MAJOR ${VIEWER_SHORT_VERSION}) + string(REGEX REPLACE "^[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" VIEWER_VERSION_MINOR ${VIEWER_SHORT_VERSION}) + string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" VIEWER_VERSION_PATCH ${VIEWER_SHORT_VERSION}) -if(GIT_REV_LIST_STR) - string(REPLACE "\n" ";" GIT_REV_LIST ${GIT_REV_LIST_STR}) -else() - string(REPLACE "\n" ";" GIT_REV_LIST "") -endif() + if (DEFINED ENV{revision}) + set(VIEWER_VERSION_REVISION $ENV{revision}) + message("Revision (from environment): ${VIEWER_VERSION_REVISION}") -if(GIT_REV_LIST) - list(LENGTH GIT_REV_LIST vBUILD) -else() - set(vBUILD 99) -endif() + else (DEFINED ENV{revision}) + execute_process( + COMMAND git rev-list HEAD + OUTPUT_VARIABLE GIT_REV_LIST_STR + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_STRIP_TRAILING_WHITESPACE + ) -configure_file( - ${CMAKE_SOURCE_DIR}/llcommon/llversionviewer.h.in - ${CMAKE_SOURCE_DIR}/llcommon/llversionviewer.h -) + if(GIT_REV_LIST_STR) + string(REPLACE "\n" ";" GIT_REV_LIST ${GIT_REV_LIST_STR}) + else() + string(REPLACE "\n" ";" GIT_REV_LIST "") + endif() -if (WINDOWS) - configure_file( - ${CMAKE_SOURCE_DIR}/newview/res/viewerRes.rc.in - ${CMAKE_SOURCE_DIR}/newview/res/viewerRes.rc - ) -endif (WINDOWS) + if(GIT_REV_LIST) + list(LENGTH GIT_REV_LIST VIEWER_VERSION_REVISION) + else(GIT_REV_LIST) + set(VIEWER_VERSION_REVISION 99) + endif(GIT_REV_LIST) + endif (DEFINED ENV{revision}) + message("Building '${VIEWER_CHANNEL}' Version ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") + else ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) + message(SEND_ERROR "Cannot get viewer version from '${VIEWER_VERSION_BASE_FILE}'") + endif ( EXISTS ${VIEWER_VERSION_BASE_FILE} ) -if (DARWIN) - configure_file( - ${CMAKE_SOURCE_DIR}/newview/English.lproj/InfoPlist.strings.in - ${CMAKE_SOURCE_DIR}/newview/English.lproj/InfoPlist.strings - ) -endif (DARWIN) - -if (LINUX) - configure_file( - ${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh.in - ${CMAKE_SOURCE_DIR}/newview/linux_tools/wrapper.sh - @ONLY - ) - configure_file( - ${CMAKE_SOURCE_DIR}/newview/linux_tools/handle_secondlifeprotocol.sh.in - ${CMAKE_SOURCE_DIR}/newview/linux_tools/handle_secondlifeprotocol.sh - @ONLY - ) - configure_file( - ${CMAKE_SOURCE_DIR}/newview/linux_tools/install.sh.in - ${CMAKE_SOURCE_DIR}/newview/linux_tools/install.sh - @ONLY - ) - configure_file( - ${CMAKE_SOURCE_DIR}/newview/linux_tools/refresh_desktop_app_entry.sh.in - ${CMAKE_SOURCE_DIR}/newview/linux_tools/refresh_desktop_app_entry.sh - @ONLY - ) -endif (LINUX) - - -# Compose the version. -set(${ROOT_PROJECT_NAME}_VERSION "${vMAJOR}.${vMINOR}.${vPATCH}.${vBUILD}") -if (${ROOT_PROJECT_NAME}_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$") - message(STATUS "Version is ${${ROOT_PROJECT_NAME}_VERSION}") -else (${ROOT_PROJECT_NAME}_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$") - message(FATAL_ERROR "Could not determine version (${${ROOT_PROJECT_NAME}_VERSION})") -endif (${ROOT_PROJECT_NAME}_VERSION MATCHES "^[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+$") + if ("${VIEWER_VERSION_REVISION}" STREQUAL "") + message("Ultimate fallback, revision was blank or not set: will use 0") + set(VIEWER_VERSION_REVISION 0) + endif ("${VIEWER_VERSION_REVISION}" STREQUAL "") + set(VIEWER_CHANNEL_VERSION_DEFINES + "LL_VIEWER_CHANNEL=\"${VIEWER_CHANNEL}\"" + "LL_VIEWER_VERSION_MAJOR=${VIEWER_VERSION_MAJOR}" + "LL_VIEWER_VERSION_MINOR=${VIEWER_VERSION_MINOR}" + "LL_VIEWER_VERSION_PATCH=${VIEWER_VERSION_PATCH}" + "LL_VIEWER_VERSION_BUILD=${VIEWER_VERSION_REVISION}" + ) +endif (NOT DEFINED VIEWER_SHORT_VERSION) diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 2d581ff59..93b98e6f6 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -178,8 +178,11 @@ string(REGEX REPLACE " +" "" VIEWER_CHANNEL_ONE_WORD "${VIEWER_CHANNEL}") set(VIEWER_BRANDING_NAME "${VIEWER_CHANNEL_ONE_WORD}") set(VIEWER_BRANDING_NAME_CAMELCASE "${VIEWER_CHANNEL_ONE_WORD}") +set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside") set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.") +set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.") + source_group("CMake Rules" FILES CMakeLists.txt) endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt index ac506f07b..c6a187840 100644 --- a/indra/llcommon/CMakeLists.txt +++ b/indra/llcommon/CMakeLists.txt @@ -233,7 +233,6 @@ set(llcommon_HEADER_FILES lltypeinfolookup.h lluri.h lluuid.h - llversionviewer.h.in llworkerthread.h metaclass.h metaclasst.h diff --git a/indra/llcommon/llversionviewer.h.in b/indra/llcommon/llversionviewer.h.in deleted file mode 100644 index 76d53b926..000000000 --- a/indra/llcommon/llversionviewer.h.in +++ /dev/null @@ -1,48 +0,0 @@ -/** - * @file llversionviewer.h - * @brief - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LLVERSIONVIEWER_H -#define LL_LLVERSIONVIEWER_H - -const S32 LL_VERSION_MAJOR = 1; -const S32 LL_VERSION_MINOR = 8; -const S32 LL_VERSION_PATCH = 6; -const S32 LL_VERSION_BUILD = ${vBUILD}; - -const char * const LL_CHANNEL = "${VIEWER_CHANNEL}"; - -#if LL_DARWIN -const char * const LL_VERSION_BUNDLE_ID = "org.singularityviewer.singularity"; -#endif - -#endif - diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index c72b705a7..5c7d51d68 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -5,6 +5,7 @@ project(viewer) include(00-Common) include(Boost) include(BuildPackagesInfo) +include(BuildVersion) include(CMakeCopyIfDifferent) include(DBusGlib) include(ELFIO) @@ -36,7 +37,6 @@ include(LLUI) include(LLVFS) include(LLWindow) include(LLXML) -#include(LScript) include(Linking) include(NDOF) include(NVAPI) @@ -76,6 +76,7 @@ include_directories( ${LLWINDOW_INCLUDE_DIRS} ${LLXML_INCLUDE_DIRS} ${LLAPPEARANCE_INCLUDE_DIRS} + ${CMAKE_CURRENT_SOURCE_DIR} ) set(viewer_SOURCE_FILES @@ -492,6 +493,7 @@ set(viewer_SOURCE_FILES llurlwhitelist.cpp lluserauth.cpp llvectorperfoptions.cpp + llversioninfo.cpp llvelocitybar.cpp llviewchildren.cpp llviewerassetstats.cpp @@ -596,7 +598,6 @@ set(viewer_SOURCE_FILES rlvui.cpp scriptcounter.cpp sgmemstat.cpp - sgversion.cpp shcommandhandler.cpp shfloatermediaticker.cpp wlfPanel_AdvSettings.cpp @@ -1030,6 +1031,7 @@ set(viewer_HEADER_FILES lluserauth.h llvectorperfoptions.h llvelocitybar.h + llversioninfo.h llviewchildren.h llviewerassetstats.h llviewerassetstorage.h @@ -1137,7 +1139,6 @@ set(viewer_HEADER_FILES roles_constants.h scriptcounter.h sgmemstat.h - sgversion.h shcommandhandler.h shfloatermediaticker.h wlfPanel_AdvSettings.h @@ -1145,6 +1146,22 @@ set(viewer_HEADER_FILES source_group("CMake Rules" FILES ViewerInstall.cmake) +# the viewer_version.txt file created here is for passing to viewer_manifest and autobuild +# the summary.json file is created for the benefit of the TeamCity builds, where +# it is used to provide descriptive information to the build results page +add_custom_target(generate_viewer_version ALL + COMMAND cmake -E echo ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION} > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + COMMAND cmake -E echo {"Type":"viewer","Version":"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}"} > ${CMAKE_BINARY_DIR}/summary.json + COMMENT "Generating viewer_version.txt for manifest processing" + ) + +set_source_files_properties( + llversioninfo.cpp + PROPERTIES + DEPENDS generate_viewer_version # dummy dependency to force recompile every time + COMPILE_DEFINITIONS "${VIEWER_CHANNEL_VERSION_DEFINES}" # see BuildVersion.cmake + ) + if (DARWIN) LIST(APPEND viewer_SOURCE_FILES llappviewermacosx.cpp) @@ -1208,11 +1225,13 @@ if (WINDOWS) # the .pch file. # All sources added to viewer_SOURCE_FILES # at this point use it. - set_source_files_properties(llviewerprecompiledheaders.cpp - PROPERTIES - COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" - ) - list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) + if(USE_PRECOMPILED_HEADERS) + set_source_files_properties(llviewerprecompiledheaders.cpp + PROPERTIES + COMPILE_FLAGS "/Ycllviewerprecompiledheaders.h" + ) + list(APPEND viewer_SOURCE_FILES llviewerprecompiledheaders.cpp) + endif(USE_PRECOMPILED_HEADERS) # Add resource files to the project. # viewerRes.rc is the only buildable file, but @@ -1257,12 +1276,18 @@ if (WINDOWS) set_source_files_properties(${viewer_RESOURCE_FILES} PROPERTIES HEADER_FILE_ONLY TRUE) + configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/res/viewerRes.rc + ${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc + ) set(viewer_RESOURCE_FILES - res/resource.h - res/viewerRes.rc + ${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc ${viewer_RESOURCE_FILES} ) + set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/viewerRes.rc + PROPERTIES COMPILE_FLAGS "-I${CMAKE_CURRENT_SOURCE_DIR}/res" + ) + SOURCE_GROUP("Resource Files" FILES ${viewer_RESOURCE_FILES}) list(APPEND viewer_SOURCE_FILES ${viewer_RESOURCE_FILES}) @@ -1397,6 +1422,8 @@ if (WINDOWS) LINK_FLAGS_RELWITHDEBINFO "${release_flags} ${EXTRA_LINKER_FLAGS_RELEASE}" ) + add_dependencies(${VIEWER_BINARY_NAME} generate_viewer_version) + if(USE_PRECOMPILED_HEADERS) set_target_properties( ${VIEWER_BINARY_NAME} @@ -1545,6 +1572,7 @@ if (WINDOWS) DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt ${COPY_INPUT_DEPENDENCIES} ) @@ -1556,7 +1584,7 @@ if (WINDOWS) endif (PACKAGE) endif (WINDOWS) -# *NOTE - this list is very sensitive to ordering, test carefully on all +# *NOTE: - this list is very sensitive to ordering, test carefully on all # platforms if you change the releative order of the entries here. # In particular, cmake 2.6.4 (when buidling with linux/makefile generators) # appears to sometimes de-duplicate redundantly listed dependencies improperly. @@ -1617,6 +1645,8 @@ if (LINUX) DEPENDS ${VIEWER_BINARY_NAME} ) + add_dependencies(${VIEWER_BINARY_NAME} generate_viewer_version) + set(product ${VIEWER_BRANDING_NAME_CAMELCASE}-${ARCH}-${${ROOT_PROJECT_NAME}_VERSION}) add_custom_command( @@ -1678,20 +1708,30 @@ endif (LINUX) if (DARWIN) set(product ${VIEWER_BRANDING_NAME}) + set(MACOSX_BUNDLE_INFO_STRING "A stable third-party Second Life viewer.") + set(MACOSX_BUNDLE_ICON_FILE "${VIEWER_BRANDING_ID}_icon.icns") + set(MACOSX_BUNDLE_GUI_IDENTIFIER "${VIEWER_BRANDING_NAME}") + set(MACOSX_BUNDLE_LONG_VERSION_STRING "${VIEWER_CHANNEL} ${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}") + set(MACOSX_BUNDLE_BUNDLE_NAME "${VIEWER_BRANDING_NAME}") + set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${VIEWER_SHORT_VERSION}") + set(MACOSX_BUNDLE_BUNDLE_VERSION "${${ROOT_PROJECT_NAME}_VERSION}") + set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2013 Siana Gearz") + set_target_properties( ${VIEWER_BINARY_NAME} PROPERTIES OUTPUT_NAME "${product}" - MACOSX_BUNDLE_INFO_STRING "A stable third-party Second Life viewer." - MACOSX_BUNDLE_ICON_FILE "${VIEWER_BRANDING_ID}_icon.icns" - MACOSX_BUNDLE_GUI_IDENTIFIER "${VIEWER_BRANDING_NAME}" - MACOSX_BUNDLE_LONG_VERSION_STRING "${${ROOT_PROJECT_NAME}_VERSION}" - MACOSX_BUNDLE_BUNDLE_NAME "${VIEWER_BRANDING_NAME}" - MACOSX_BUNDLE_SHORT_VERSION_STRING "${${ROOT_PROJECT_NAME}_VERSION}" - MACOSX_BUNDLE_BUNDLE_VERSION "${${ROOT_PROJECT_NAME}_VERSION}" - MACOSX_BUNDLE_COPYRIGHT "Copyright 2013 Siana Gearz" + MACOSX_BUNDLE_INFO_PLIST + "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist" ) + configure_file( + "${CMAKE_CURRENT_SOURCE_DIR}/Info-SecondLife.plist" + "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app/Contents/Info.plist" + ) + + add_dependencies(${VIEWER_BINARY_NAME} generate_viewer_version) + add_custom_command( TARGET ${VIEWER_BINARY_NAME} POST_BUILD COMMAND ${PYTHON_EXECUTABLE} @@ -1708,14 +1748,15 @@ if (DARWIN) --source=${CMAKE_CURRENT_SOURCE_DIR} --extra_libraries="${MANIFEST_LIBRARIES}" DEPENDS - ${VIEWER_BINARY_NAME} - ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py + ${VIEWER_BINARY_NAME} + ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py ) add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit basic_plugin_filepicker) if (PACKAGE) add_custom_target(llpackage ALL DEPENDS ${VIEWER_BINARY_NAME}) + add_dependencies(llpackage generate_viewer_version) add_custom_command( TARGET llpackage POST_BUILD diff --git a/indra/newview/VIEWER_VERSION.txt b/indra/newview/VIEWER_VERSION.txt new file mode 100644 index 000000000..f263cd11b --- /dev/null +++ b/indra/newview/VIEWER_VERSION.txt @@ -0,0 +1 @@ +1.8.6 diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 07a6a7244..8ceb12c31 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -36,7 +36,7 @@ #include "hippogridmanager.h" #include "hippolimits.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "llfeaturemanager.h" #include "lluictrlfactory.h" #include "lltexteditor.h" @@ -755,16 +755,9 @@ bool LLAppViewer::init() // Setup notifications after LLUI::initClass() has been called. LLNotifications::instance().createDefaultChannels(); LL_INFOS("InitInfo") << "Notifications initialized." << LL_ENDL ; - + writeSystemInfo(); - // Build a string representing the current version number. - gCurrentVersion = llformat("%s %d.%d.%d.%d", - gVersionChannel, - gVersionMajor, - gVersionMinor, - gVersionPatch, - gVersionBuild ); ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -1006,7 +999,8 @@ bool LLAppViewer::init() gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString(); // Save the current version to the prefs file - gSavedSettings.setString("LastRunVersion", gCurrentVersion); + gSavedSettings.setString("LastRunVersion", + LLVersionInfo::getChannelAndVersion()); gSimLastTime = gRenderStartTime.getElapsedTimeF32(); gSimFrames = (F32)gFrameCount; @@ -2161,7 +2155,7 @@ bool LLAppViewer::initConfiguration() gSavedSettings.setString("ClientSettingsFile", gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, getSettingsFilename("Default", "Global"))); - gSavedSettings.setString("VersionChannelName", gVersionChannel); + gSavedSettings.setString("VersionChannelName", LLVersionInfo::getChannel()); #if 0 //#ifndef LL_RELEASE_FOR_DOWNLOAD // provide developer build only overrides for these control variables that are not @@ -2647,17 +2641,18 @@ void LLAppViewer::removeCacheFiles(const std::string& file_mask) void LLAppViewer::writeSystemInfo() { - + if (! gDebugInfo.has("Dynamic") ) gDebugInfo["Dynamic"] = LLSD::emptyMap(); gDebugInfo["SLLog"] = LLError::logFileName(); - gDebugInfo["ClientInfo"]["Name"] = gVersionChannel; - gDebugInfo["ClientInfo"]["MajorVersion"] = gVersionMajor; - gDebugInfo["ClientInfo"]["MinorVersion"] = gVersionMinor; - gDebugInfo["ClientInfo"]["PatchVersion"] = gVersionPatch; - gDebugInfo["ClientInfo"]["BuildVersion"] = gVersionBuild; + gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel(); + gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor(); + gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor(); + gDebugInfo["ClientInfo"]["PatchVersion"] = LLVersionInfo::getPatch(); + gDebugInfo["ClientInfo"]["BuildVersion"] = LLVersionInfo::getBuild(); + #if defined(_WIN64) || defined(__x86_64__) gDebugInfo["ClientInfo"]["Architecture"] = "x86_64"; #else @@ -2703,9 +2698,8 @@ void LLAppViewer::writeSystemInfo() } // Dump some debugging info - LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME") - << " version " << gVersionMajor << "." << gVersionMinor << "." << gVersionPatch - << LL_ENDL; + LL_INFOS("SystemInfo") << "Application: " << LLTrans::getString("APP_NAME") << LL_ENDL; + LL_INFOS("SystemInfo") << "Version: " << LLVersionInfo::getChannelAndVersion() << LL_ENDL; // Dump the local time and time zone time_t now; @@ -2763,15 +2757,6 @@ void LLAppViewer::handleViewerCrash() gDebugInfo["Dynamic"]["CrashHostUrl"] = crashHostUrl; } - //We already do this in writeSystemInfo(), but we do it again here to make /sure/ we have a version - //to check against no matter what - gDebugInfo["ClientInfo"]["Name"] = gVersionChannel; - - gDebugInfo["ClientInfo"]["MajorVersion"] = gVersionMajor; - gDebugInfo["ClientInfo"]["MinorVersion"] = gVersionMinor; - gDebugInfo["ClientInfo"]["PatchVersion"] = gVersionPatch; - gDebugInfo["ClientInfo"]["BuildVersion"] = gVersionBuild; - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); if ( parcel && parcel->getMusicURL()[0]) { @@ -4736,12 +4721,12 @@ void LLAppViewer::handleLoginComplete() initMainloopTimeout("Mainloop Init"); // Store some data to DebugInfo in case of a freeze. - gDebugInfo["ClientInfo"]["Name"] = gVersionChannel; + gDebugInfo["ClientInfo"]["Name"] = LLVersionInfo::getChannel(); - gDebugInfo["ClientInfo"]["MajorVersion"] = gVersionMajor; - gDebugInfo["ClientInfo"]["MinorVersion"] = gVersionMinor; - gDebugInfo["ClientInfo"]["PatchVersion"] = gVersionPatch; - gDebugInfo["ClientInfo"]["BuildVersion"] = gVersionBuild; + gDebugInfo["ClientInfo"]["MajorVersion"] = LLVersionInfo::getMajor(); + gDebugInfo["ClientInfo"]["MinorVersion"] = LLVersionInfo::getMinor(); + gDebugInfo["ClientInfo"]["PatchVersion"] = LLVersionInfo::getPatch(); + gDebugInfo["ClientInfo"]["BuildVersion"] = LLVersionInfo::getBuild(); LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); if ( parcel && parcel->getMusicURL()[0]) diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 4f4ac87fc..d5dafa9ca 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -49,7 +49,7 @@ #include "llagent.h" #include "llviewerstats.h" #include "llviewerregion.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "lluictrlfactory.h" #include "lluri.h" #include "llweb.h" @@ -135,9 +135,9 @@ LLFloaterAbout::LLFloaterAbout() + " (64 bit)" #endif + llformat(" %d.%d.%d (%d) %s %s (%s)\n", - gVersionMajor, gVersionMinor, gVersionPatch, gVersionBuild, + LLVersionInfo::getMajor(), LLVersionInfo::getMinor(), LLVersionInfo::getPatch(), LLVersionInfo::getBuild(), __DATE__, __TIME__, - gVersionChannel)); + LLVersionInfo::getChannel().c_str())); support_widget->appendColoredText(version, FALSE, FALSE, gColors.getColor("TextFgReadOnlyColor")); support_widget->appendStyledText(LLTrans::getString("ReleaseNotes"), false, false, viewer_link_style); diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp index 05ed662bf..9088a7374 100644 --- a/indra/newview/llfloaterreporter.cpp +++ b/indra/newview/llfloaterreporter.cpp @@ -74,7 +74,7 @@ #include "llfloateravatarpicker.h" #include "lldir.h" #include "llselectmgr.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "lluictrlfactory.h" #include "llviewernetwork.h" @@ -624,10 +624,7 @@ LLSD LLFloaterReporter::gatherReport() std::ostringstream details; - details << "V" << gVersionMajor << "." // client version moved to body of email for abuse reports - << gVersionMinor << "." - << gVersionPatch << "." - << gVersionBuild << std::endl << std::endl; + details << "V" << LLVersionInfo::getVersion() << std::endl << std::endl; // client version moved to body of email for abuse reports std::string object_name = getChild("object_name")->getValue().asString(); if (!object_name.empty() && !mOwnerName.empty()) @@ -644,10 +641,8 @@ LLSD LLFloaterReporter::gatherReport() std::string version_string; version_string = llformat( - "%d.%d.%d %s %s %s %s", - gVersionMajor, - gVersionMinor, - gVersionPatch, + "%s %s %s %s %s", + LLVersionInfo::getShortVersion().c_str(), platform, gSysCPU.getFamily().c_str(), gGLManager.mGLRenderer.c_str(), diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index b346aa922..e51341416 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -42,7 +42,6 @@ #include "llfontgl.h" #include "llmd5.h" #include "llsecondlifeurls.h" -#include "sgversion.h" #include "v4color.h" #include "llappviewer.h" @@ -62,6 +61,7 @@ #include "llui.h" #include "lluiconstants.h" #include "llurlhistory.h" // OGPX : regionuri text box has a history of region uris (if FN/LN are loaded at startup) +#include "llversioninfo.h" #include "llviewertexturelist.h" #include "llviewermenu.h" // for handle_preferences() #include "llviewernetwork.h" @@ -243,13 +243,12 @@ LLPanelLogin::LLPanelLogin(const LLRect& rect) getChild("grids_btn")->setCommitCallback(boost::bind(LLPanelLogin::onClickGrids)); - std::string channel = gVersionChannel; + std::string channel = LLVersionInfo::getChannel(); + + std::string version = llformat("%s (%d)", + LLVersionInfo::getShortVersion().c_str(), + LLVersionInfo::getBuild()); - std::string version = llformat("%d.%d.%d (%d)", - gVersionMajor, - gVersionMinor, - gVersionPatch, - gVersionBuild ); LLTextBox* channel_text = getChild("channel_text"); channel_text->setTextArg("[CHANNEL]", channel); // though not displayed channel_text->setTextArg("[VERSION]", version); @@ -722,25 +721,27 @@ void LLPanelLogin::loadLoginPage() sInstance->setSiteIsAlive(false); return; } - + // Use the right delimeter depending on how LLURI parses the URL LLURI login_page = LLURI(login_page_str); LLSD params(login_page.queryMap()); LL_DEBUGS("AppInit") << "login_page: " << login_page << LL_ENDL; - // Language + // Language params["lang"] = LLUI::getLanguage(); - - // First Login? - if (gSavedSettings.getBOOL("FirstLoginThisInstall")) + + // First Login? + if (gSavedSettings.getBOOL("FirstLoginThisInstall")) { params["firstlogin"] = "TRUE"; // not bool: server expects string TRUE - } - - params["version"]= llformat("%d.%d.%d (%d)", - gVersionMajor, gVersionMinor, gVersionPatch, gVersionBuild); - params["channel"] = gVersionChannel; + } + + // Channel and Version + params["version"] = llformat("%s (%d)", + LLVersionInfo::getShortVersion().c_str(), + LLVersionInfo::getBuild()); + params["channel"] = LLVersionInfo::getChannel(); // Grid diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 7be6ffd4f..526f4ee23 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -90,7 +90,7 @@ #include "lltexteditor.h" #include "llurlentry.h" #include "lluserrelations.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "llviewercontrol.h" #include "llvfs.h" #include "llxorcipher.h" // saved password, MAC address @@ -693,9 +693,9 @@ bool idle_startup() if(!start_messaging_system( message_template_path, port, - gVersionMajor, - gVersionMinor, - gVersionPatch, + LLVersionInfo::getMajor(), + LLVersionInfo::getMinor(), + LLVersionInfo::getPatch(), FALSE, std::string(), responder, diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 833926afe..b639c7585 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -35,7 +35,7 @@ #include "llbufferstream.h" #include "lltranslate.h" #include "llui.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "llweb.h" // @@ -64,9 +64,12 @@ void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std std::string url; getTranslateUrl(url, fromLang, toLang, mesg); -// - std::string user_agent = gCurrentVersion; -// + std::string user_agent = llformat("%s %d.%d.%d (%d)", + LLVersionInfo::getChannel().c_str(), + LLVersionInfo::getMajor(), + LLVersionInfo::getMinor(), + LLVersionInfo::getPatch(), + LLVersionInfo::getBuild()); if (m_Header.empty()) { diff --git a/indra/newview/lluserauth.cpp b/indra/newview/lluserauth.cpp index d67c8d9d7..d7d7b0ce8 100644 --- a/indra/newview/lluserauth.cpp +++ b/indra/newview/lluserauth.cpp @@ -38,7 +38,7 @@ #include #include "lldir.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "llappviewer.h" #include "llviewercontrol.h" #include "llxmlrpcresponder.h" @@ -128,8 +128,8 @@ void LLUserAuth::authenticate( XMLRPC_VectorAppendString(params, "last", lastname.c_str(), 0); XMLRPC_VectorAppendString(params, "web_login_key", web_login_key.getString().c_str(), 0); XMLRPC_VectorAppendString(params, "start", start.c_str(), 0); - XMLRPC_VectorAppendString(params, "version", gCurrentVersion.c_str(), 0); // Includes channel name - XMLRPC_VectorAppendString(params, "channel", gVersionChannel, 0); + XMLRPC_VectorAppendString(params, "version", LLVersionInfo::getChannelAndVersion().c_str(), 0); // Includes channel name + XMLRPC_VectorAppendString(params, "channel", LLVersionInfo::getChannel().c_str(), 0); XMLRPC_VectorAppendString(params, "platform", PLATFORM_STRING, 0); XMLRPC_VectorAppendString(params, "platform_version", LLAppViewer::instance()->getOSInfo().getOSVersionString().c_str(), 0); @@ -215,13 +215,13 @@ void LLUserAuth::authenticate( XMLRPC_VectorAppendString(params, "last", lastname.c_str(), 0); XMLRPC_VectorAppendString(params, "passwd", dpasswd.c_str(), 0); XMLRPC_VectorAppendString(params, "start", start.c_str(), 0); - XMLRPC_VectorAppendString(params, "version", llformat("%d.%d.%d.%d", gVersionMajor, gVersionMinor, gVersionPatch, gVersionBuild).c_str(), 0); + XMLRPC_VectorAppendString(params, "version", LLVersionInfo::getVersion().c_str(), 0); // Singu Note: At the request of Linden Lab we change channel sent to the login server in the following way: // * If channel is "Singularity" we change it to "Singularity Release", due to their statistics system // not being able to distinguish just the release version // * We append "64" to channel name on 64-bit for systems for the LL stats system to be able to produce independent // crash statistics depending on the architecture - std::string chan(gVersionChannel); + std::string chan(LLVersionInfo::getChannel()); if (chan == "Singularity") { chan += " Release"; diff --git a/indra/newview/llversioninfo.cpp b/indra/newview/llversioninfo.cpp new file mode 100644 index 000000000..e53de8be3 --- /dev/null +++ b/indra/newview/llversioninfo.cpp @@ -0,0 +1,174 @@ +/** + * @file llversioninfo.cpp + * @brief Routines to access the viewer version and build information + * @author Martin Reddy + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" +#include +#include +#include "llversioninfo.h" +#include + +#if ! defined(LL_VIEWER_CHANNEL) \ + || ! defined(LL_VIEWER_VERSION_MAJOR) \ + || ! defined(LL_VIEWER_VERSION_MINOR) \ + || ! defined(LL_VIEWER_VERSION_PATCH) \ + || ! defined(LL_VIEWER_VERSION_BUILD) + #error "Channel or Version information is undefined" +#endif + +// +// Set the version numbers in indra/VIEWER_VERSION +// + +//static +S32 LLVersionInfo::getMajor() +{ + return LL_VIEWER_VERSION_MAJOR; +} + +//static +S32 LLVersionInfo::getMinor() +{ + return LL_VIEWER_VERSION_MINOR; +} + +//static +S32 LLVersionInfo::getPatch() +{ + return LL_VIEWER_VERSION_PATCH; +} + +//static +S32 LLVersionInfo::getBuild() +{ + return LL_VIEWER_VERSION_BUILD; +} + +//static +const std::string &LLVersionInfo::getVersion() +{ + static std::string version(""); + if (version.empty()) + { + std::ostringstream stream; + stream << LLVersionInfo::getShortVersion() << "." << LLVersionInfo::getBuild(); + // cache the version string + version = stream.str(); + } + return version; +} + +//static +const std::string &LLVersionInfo::getShortVersion() +{ + static std::string short_version(""); + if(short_version.empty()) + { + // cache the version string + std::ostringstream stream; + stream << LL_VIEWER_VERSION_MAJOR << "." + << LL_VIEWER_VERSION_MINOR << "." + << LL_VIEWER_VERSION_PATCH; + short_version = stream.str(); + } + return short_version; +} + +namespace +{ + /// Storage of the channel name the viewer is using. + // The channel name is set by hardcoded constant, + // or by calling LLVersionInfo::resetChannel() + std::string sWorkingChannelName(LL_VIEWER_CHANNEL); + + // Storage for the "version and channel" string. + // This will get reset too. + std::string sVersionChannel(""); +} + +//static +const std::string &LLVersionInfo::getChannelAndVersion() +{ + if (sVersionChannel.empty()) + { + // cache the version string + sVersionChannel = LLVersionInfo::getChannel() + " " + LLVersionInfo::getVersion(); + } + + return sVersionChannel; +} + +//static +const std::string &LLVersionInfo::getChannel() +{ + return sWorkingChannelName; +} + +void LLVersionInfo::resetChannel(const std::string& channel) +{ + sWorkingChannelName = channel; + sVersionChannel.clear(); // Reset version and channel string til next use. +} + +//static +LLVersionInfo::ViewerMaturity LLVersionInfo::getViewerMaturity() +{ + ViewerMaturity maturity; + + std::string channel = getChannel(); + + static const boost::regex is_test_channel("\\bTest\\b"); + static const boost::regex is_beta_channel("\\bBeta\\b"); + static const boost::regex is_project_channel("\\bProject\\b"); + static const boost::regex is_release_channel("\\bRelease\\b"); + + if (boost::regex_search(channel, is_release_channel)) + { + maturity = RELEASE_VIEWER; + } + else if (boost::regex_search(channel, is_beta_channel)) + { + maturity = BETA_VIEWER; + } + else if (boost::regex_search(channel, is_project_channel)) + { + maturity = PROJECT_VIEWER; + } + else if (boost::regex_search(channel, is_test_channel)) + { + maturity = TEST_VIEWER; + } + else + { + LL_WARNS() << "Channel '" << channel + << "' does not follow naming convention, assuming Test" + << LL_ENDL; + maturity = TEST_VIEWER; + } + return maturity; +} + + diff --git a/indra/newview/llversioninfo.h b/indra/newview/llversioninfo.h new file mode 100644 index 000000000..4e75535ec --- /dev/null +++ b/indra/newview/llversioninfo.h @@ -0,0 +1,82 @@ +/** + * @file llversioninfo.h + * @brief Routines to access the viewer version and build information + * @author Martin Reddy + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LL_LLVERSIONINFO_H +#define LL_LLVERSIONINFO_H + +#include +#include "stdtypes.h" + +/// +/// This API provides version information for the viewer. This +/// includes access to the major, minor, patch, and build integer +/// values, as well as human-readable string representations. All +/// viewer code that wants to query the current version should +/// use this API. +/// +class LLVersionInfo +{ +public: + /// return the major verion number as an integer + static S32 getMajor(); + + /// return the minor verion number as an integer + static S32 getMinor(); + + /// return the patch verion number as an integer + static S32 getPatch(); + + /// return the build number as an integer + static S32 getBuild(); + + /// return the full viewer version as a string like "2.0.0.200030" + static const std::string &getVersion(); + + /// return the viewer version as a string like "2.0.0" + static const std::string &getShortVersion(); + + /// return the viewer version and channel as a string + /// like "Second Life Release 2.0.0.200030" + static const std::string &getChannelAndVersion(); + + /// return the channel name, e.g. "Second Life" + static const std::string &getChannel(); + + /// reset the channel name used by the viewer. + static void resetChannel(const std::string& channel); + + typedef enum + { + TEST_VIEWER, + PROJECT_VIEWER, + BETA_VIEWER, + RELEASE_VIEWER + } ViewerMaturity; + static ViewerMaturity getViewerMaturity(); +}; + +#endif diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp index abcac1719..4ac560651 100644 --- a/indra/newview/llviewercontrol.cpp +++ b/indra/newview/llviewercontrol.cpp @@ -70,7 +70,6 @@ #include "llnotify.h" #include "llkeyboard.h" #include "llerrorcontrol.h" -#include "sgversion.h" #include "llappviewer.h" #include "llvosurfacepatch.h" #include "llvowlsky.h" @@ -98,7 +97,6 @@ LLControlGroup gColors("Colors"); // saved at end of session LLControlGroup gCrashSettings("CrashSettings"); // saved at end of session std::string gLastRunVersion; -std::string gCurrentVersion; extern BOOL gResizeScreenTexture; extern BOOL gDebugGL; diff --git a/indra/newview/llviewercontrol.h b/indra/newview/llviewercontrol.h index d8bdf3670..0fd6b9cd4 100644 --- a/indra/newview/llviewercontrol.h +++ b/indra/newview/llviewercontrol.h @@ -67,8 +67,6 @@ extern LLControlGroup gCrashSettings; // Set after settings loaded extern std::string gLastRunVersion; -extern std::string gCurrentVersion; - bool handleCloudSettingsChanged(const LLSD& newvalue); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index d2fdcb6fa..1a97a3463 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -126,7 +126,7 @@ #include "hippogridmanager.h" #include "hippolimits.h" #include "hippofloaterxml.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "m7wlinterface.h" #include "llgiveinventory.h" @@ -3845,7 +3845,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) // hello from object if (from_id.isNull()) return; char buf[200]; - snprintf(buf, 200, "%s v%d.%d.%d", gVersionChannel, gVersionMajor, gVersionMinor, gVersionPatch); + snprintf(buf, 200, "%s v%d.%d.%d", LLVersionInfo::getChannel().c_str(), LLVersionInfo::getMajor(), LLVersionInfo::getMinor(), LLVersionInfo::getPatch()); send_chat_from_viewer(buf, CHAT_TYPE_WHISPER, 427169570); sChatObjectAuth[from_id] = 1; return; diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 3ff7a33e0..41cf0f276 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -51,6 +51,7 @@ #include "llagentcamera.h" #include "llviewercontrol.h" #include "llfloaterdirectory.h" +#include "llversioninfo.h" #include "llfloatertools.h" #include "lldebugview.h" #include "llfasttimerview.h" @@ -780,7 +781,7 @@ void send_stats() // send fps only for time app spends in foreground agent["fps"] = (F32)gForegroundFrameCount / gForegroundTime.getElapsedTimeF32(); - agent["version"] = gCurrentVersion; + agent["version"] = LLVersionInfo::getChannelAndVersion(); std::string language = LLUI::getLanguage(); agent["language"] = language; diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index aed18769e..3e459a040 100644 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -47,7 +47,7 @@ #include "llalertdialog.h" #include "llui.h" #include "lluri.h" -#include "sgversion.h" +#include "llversioninfo.h" #include "llviewercontrol.h" #include "llviewernetwork.h" #include "llviewerparcelmgr.h" @@ -214,12 +214,12 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, const LLSD &default_subs) { LLSD substitution = default_subs; - substitution["VERSION"] = gCurrentVersion; - substitution["VERSION_MAJOR"] = gVersionMajor; - substitution["VERSION_MINOR"] = gVersionMinor; - substitution["VERSION_PATCH"] = gVersionPatch; - substitution["VERSION_BUILD"] = gVersionBuild; - substitution["CHANNEL"] = gVersionChannel; + substitution["VERSION"] = LLVersionInfo::getVersion(); + substitution["VERSION_MAJOR"] = LLVersionInfo::getMajor(); + substitution["VERSION_MINOR"] = LLVersionInfo::getMinor(); + substitution["VERSION_PATCH"] = LLVersionInfo::getPatch(); + substitution["VERSION_BUILD"] = LLVersionInfo::getBuild(); + substitution["CHANNEL"] = LLVersionInfo::getChannel(); const HippoGridInfo* grid(gHippoGridManager->getCurrentGrid()); std::string gridId(grid->isSecondLife() ? getLoginUriDomain() : grid->getGridName()); if (grid->isSecondLife()) diff --git a/indra/newview/res/viewerRes.rc.in b/indra/newview/res/viewerRes.rc similarity index 86% rename from indra/newview/res/viewerRes.rc.in rename to indra/newview/res/viewerRes.rc index 0119f9fd9..4f02238a9 100644 --- a/indra/newview/res/viewerRes.rc.in +++ b/indra/newview/res/viewerRes.rc @@ -13,8 +13,7 @@ // // Generated from the TEXTINCLUDE 2 resource. // -// Commented out because it only compiles if you have MFC installed. -//#include "winres.h" +#include "windows.h" ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS @@ -41,7 +40,7 @@ END 2 TEXTINCLUDE BEGIN - "#include ""winres.h""\r\n" + "#include ""windows.h""\r\n" "\0" END @@ -61,8 +60,8 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_LL_ICON ICON "${VIEWER_BRANDING_ID}_icon.ico" -IDI_LCD_LL_ICON ICON "${VIEWER_BRANDING_ID}_icon.ico" +IDI_LL_ICON ICON "singularity_icon.ico" +IDI_LCD_LL_ICON ICON "singularity_icon.ico" ///////////////////////////////////////////////////////////////////////////// // @@ -74,7 +73,7 @@ STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE FONT 8, "MS Sans Serif" BEGIN ICON IDI_LL_ICON,IDC_STATIC,7,7,20,20 - LTEXT "Loading ${VIEWER_CHANNEL}...",666,36,13,91,8 + LTEXT "Loading Singularity Viewer...",666,36,13,91,8 END @@ -123,14 +122,14 @@ TOOLPICKOBJECT3 CURSOR "toolpickobject3.cur" ARROWCOPY CURSOR "arrowcop.cur" ARROWDRAGMULTI CURSOR "llarrowdragmulti.cur" ARROWCOPYMULTI CURSOR "arrowcopmulti.cur" -TOOLSIT CURSOR "toolsit.cur" -TOOLBUY CURSOR "toolbuy.cur" -TOOLPAY CURSOR "toolpay.cur" -TOOLOPEN CURSOR "toolopen.cur" TOOLPIPETTE CURSOR "toolpipette.cur" TOOLPLAY CURSOR "toolplay.cur" TOOLPAUSE CURSOR "toolpause.cur" TOOLMEDIAOPEN CURSOR "toolmediaopen.cur" +TOOLBUY CURSOR "toolbuy.cur" +TOOLPAY CURSOR "toolpay.cur" +TOOLOPEN CURSOR "toolopen.cur" +TOOLSIT CURSOR "toolsit.cur" ///////////////////////////////////////////////////////////////////////////// // @@ -138,8 +137,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur" // VS_VERSION_INFO VERSIONINFO - FILEVERSION ${vMAJOR},${vMINOR},${vPATCH},${vBUILD} - PRODUCTVERSION ${vMAJOR},${vMINOR},${vPATCH},${vBUILD} + FILEVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_REVISION} + PRODUCTVERSION ${VIEWER_VERSION_MAJOR},${VIEWER_VERSION_MINOR},${VIEWER_VERSION_PATCH},${VIEWER_VERSION_REVISION} FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -156,12 +155,12 @@ BEGIN BEGIN VALUE "CompanyName", "Siana Gearz" VALUE "FileDescription", "Singularity Viewer" - VALUE "FileVersion", "${vMAJOR}.${vMINOR}.${vPATCH}.${vBUILD}" + VALUE "FileVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" VALUE "InternalName", "Second Life" VALUE "LegalCopyright", "Copyright 2001-2010, Linden Research, Inc., Copyright 2010 Siana Gearz" VALUE "OriginalFilename", "SingularityViewer.exe" VALUE "ProductName", "Singularity Viewer" - VALUE "ProductVersion", "${vMAJOR}.${vMINOR}.${vPATCH}.${vBUILD}" + VALUE "ProductVersion", "${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}.${VIEWER_VERSION_REVISION}" END END BLOCK "VarFileInfo" @@ -170,12 +169,6 @@ BEGIN END END - -///////////////////////////////////////////////////////////////////////////// -// -// Bitmap -// - #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/sgversion.cpp b/indra/newview/sgversion.cpp deleted file mode 100644 index 615064f27..000000000 --- a/indra/newview/sgversion.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright (C) 2012 Siana Gearz - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA */ - -#include "llviewerprecompiledheaders.h" - -#include "llversionviewer.h" - -#include "sgversion.h" - -const S32 gVersionMajor = LL_VERSION_MAJOR; -const S32 gVersionMinor = LL_VERSION_MINOR; -const S32 gVersionPatch = LL_VERSION_PATCH; -const S32 gVersionBuild = LL_VERSION_BUILD; - -const char* gVersionChannel = LL_CHANNEL; - -#if LL_DARWIN -const char* gVersionBundleID = LL_VERSION_BUNDLE_ID; -#endif \ No newline at end of file diff --git a/indra/newview/sgversion.h b/indra/newview/sgversion.h deleted file mode 100644 index afdc8b51a..000000000 --- a/indra/newview/sgversion.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright (C) 2012 Siana Gearz - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General - * Public License along with this library; if not, write to the - * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301 USA */ - -#ifndef SGVERSION_H -#define SGVERSION_H - -extern const S32 gVersionMajor; -extern const S32 gVersionMinor; -extern const S32 gVersionPatch; -extern const S32 gVersionBuild; - -extern const char* gVersionChannel; - -#if LL_DARWIN -extern const char* gVersionBundleID; -#endif - -#endif From e9f4b917d14b8be1bf1abdbffec5cc7f7b8cca80 Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 11:18:40 -0500 Subject: [PATCH 04/19] Fix up icon copying and make manifest actually start to kinda work again --- .gitignore | 2 + indra/cmake/Variables.cmake | 16 +- indra/lib/python/indra/util/llmanifest.py | 437 ++++++++------ indra/newview/Ascent.icns | Bin 121060 -> 0 bytes indra/newview/CMakeLists.txt | 46 +- indra/newview/icons/default/viewer.icns | Bin 0 -> 179669 bytes .../default/viewer.ico} | Bin indra/newview/icons/default/viewer.png | Bin 0 -> 33499 bytes indra/newview/icons/default/viewer_256.BMP | Bin 0 -> 262198 bytes indra/newview/lluserauth.cpp | 4 - indra/newview/res/viewerRes.rc | 4 +- indra/newview/singularity_icon.icns | Bin 62417 -> 0 bytes indra/newview/snowglobe.icns | Bin 62417 -> 0 bytes indra/newview/viewer_manifest.py | 550 +++++++++--------- 14 files changed, 586 insertions(+), 473 deletions(-) delete mode 100644 indra/newview/Ascent.icns create mode 100644 indra/newview/icons/default/viewer.icns rename indra/newview/{res/singularity_icon.ico => icons/default/viewer.ico} (100%) create mode 100644 indra/newview/icons/default/viewer.png create mode 100644 indra/newview/icons/default/viewer_256.BMP delete mode 100644 indra/newview/singularity_icon.icns delete mode 100644 indra/newview/snowglobe.icns diff --git a/.gitignore b/.gitignore index f180405b6..718308dc9 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,8 @@ /indra/viewer-* /indra/newview/vivox-runtime/ /indra/newview/dbghelp.dll +indra/newview/res/viewer_icon.* +indra/newview/res-sdl/viewer_icon.* /libraries/ /lib/ *.pyc diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 93b98e6f6..015dfb162 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -24,9 +24,10 @@ set(LIBS_OPEN_PREFIX) set(SCRIPTS_PREFIX ../scripts) set(VIEWER_PREFIX) set(INTEGRATION_TESTS_PREFIX) - -set(DISABLE_TCMALLOC OFF CACHE BOOL "Disable linkage of TCMalloc. (64bit builds automatically disable TCMalloc)") set(LL_TESTS OFF CACHE BOOL "Build and run unit and integration tests (disable for build timing runs to reduce variation)") + +# Compiler and toolchain options +set(DISABLE_TCMALLOC OFF CACHE BOOL "Disable linkage of TCMalloc. (64bit builds automatically disable TCMalloc)") set(DISABLE_FATAL_WARNINGS TRUE CACHE BOOL "Set this to FALSE to enable fatal warnings.") if(LIBS_CLOSED_DIR) @@ -168,15 +169,10 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") # Default deploy grid set(GRID agni CACHE STRING "Target Grid") -set(VIEWER_CHANNEL "Singularity" CACHE STRING "Viewer Channel Name") +set(VIEWER_CHANNEL "Singularity Test" CACHE STRING "Viewer Channel Name") -set(VIEWER_LOGIN_CHANNEL "${VIEWER_CHANNEL}" CACHE STRING "Fake login channel for A/B Testing") -set(VIEWER_BRANDING_ID "singularity" CACHE STRING "Viewer branding id (currently secondlife|snowglobe)") - -# *TODO: break out proper Branding-secondlife.cmake, Branding-snowglobe.cmake, etc -string(REGEX REPLACE " +" "" VIEWER_CHANNEL_ONE_WORD "${VIEWER_CHANNEL}") -set(VIEWER_BRANDING_NAME "${VIEWER_CHANNEL_ONE_WORD}") -set(VIEWER_BRANDING_NAME_CAMELCASE "${VIEWER_CHANNEL_ONE_WORD}") +set(ENABLE_SIGNING OFF CACHE BOOL "Enable signing the viewer") +set(SIGNING_IDENTITY "" CACHE STRING "Specifies the signing identity to use, if necessary.") set(VERSION_BUILD "0" CACHE STRING "Revision number passed in from the outside") set(STANDALONE OFF CACHE BOOL "Do not use Linden-supplied prebuilt libraries.") diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py index 0059faa2e..8d9656778 100644 --- a/indra/lib/python/indra/util/llmanifest.py +++ b/indra/lib/python/indra/util/llmanifest.py @@ -41,6 +41,14 @@ import tarfile import errno import subprocess +class ManifestError(RuntimeError): + """Use an exception more specific than generic Python RuntimeError""" + pass + +class MissingError(ManifestError): + """You specified a file that doesn't exist""" + pass + def path_ancestors(path): drive, path = os.path.splitdrive(os.path.normpath(path)) result = [] @@ -76,31 +84,9 @@ def get_default_platform(dummy): 'darwin':'darwin' }[sys.platform] -def get_default_version(srctree): - # look up llversion.h and parse out the version info - paths = [os.path.join(srctree, x, 'llversionviewer.h') for x in ['llcommon', '../llcommon', '../../indra/llcommon.h']] - for p in paths: - if os.path.exists(p): - contents = open(p, 'r').read() - major = re.search("LL_VERSION_MAJOR\s=\s([0-9]+)", contents).group(1) - minor = re.search("LL_VERSION_MINOR\s=\s([0-9]+)", contents).group(1) - patch = re.search("LL_VERSION_PATCH\s=\s([0-9]+)", contents).group(1) - build = re.search("LL_VERSION_BUILD\s=\s([0-9]+)", contents).group(1) - return major, minor, patch, build - -def get_channel(srctree): - # look up llversionserver.h and parse out the version info - paths = [os.path.join(srctree, x, 'llversionviewer.h') for x in ['llcommon', '../llcommon', '../../indra/llcommon.h']] - for p in paths: - if os.path.exists(p): - contents = open(p, 'r').read() - channel = re.search("LL_CHANNEL\s=\s\"(.+)\";\s*$", contents, flags = re.M).group(1) - return channel - - DEFAULT_SRCTREE = os.path.dirname(sys.argv[0]) -DEFAULT_CHANNEL = 'Second Life Release' -DEFAULT_CHANNEL_SNOWGLOBE = 'Snowglobe Release' +CHANNEL_VENDOR_BASE = 'Singularity' +RELEASE_CHANNEL = CHANNEL_VENDOR_BASE + ' Release' ARGUMENTS=[ dict(name='actions', @@ -121,27 +107,19 @@ ARGUMENTS=[ On Linux this would try to use Linux_i686Manifest.""", default=""), dict(name='build', description='Build directory.', default=DEFAULT_SRCTREE), - dict(name='buildtype', description="""The build type used. ('Debug', 'Release', or 'RelWithDebInfo') - Default is Release """, - default="Release"), - dict(name='branding_id', description="""Identifier for the branding set to - use. Currently, 'secondlife' or 'snowglobe')""", - default='secondlife'), + dict(name='buildtype', description='Build type (i.e. Debug, Release, RelWithDebInfo).', default=None), dict(name='configuration', - description="""The build configuration used. Only used on OS X for - now, but it could be used for other platforms as well.""", - default="Universal"), + description="""The build configuration used.""", + default="Release"), dict(name='dest', description='Destination directory.', default=DEFAULT_SRCTREE), dict(name='grid', - description="""Which grid the client will try to connect to. Even - though it's not strictly a grid, 'firstlook' is also an acceptable - value for this parameter.""", - default=""), + description="""Which grid the client will try to connect to.""", + default=None), dict(name='channel', description="""The channel to use for updates, packaging, settings name, etc.""", - default=get_channel), - dict(name='login_channel', - description="""The channel to use for login handshake/updates only.""", + default='CHANNEL UNSET'), + dict(name='channel_suffix', + description="""Addition to the channel for packaging and channel value, but not application name (used internally)""", default=None), dict(name='installer_name', description=""" The name of the file that the installer should be @@ -166,12 +144,12 @@ ARGUMENTS=[ contain the name of the final package in a form suitable for use by a .bat file.""", default=None), - dict(name='version', - description="""This specifies the version of Second Life that is - being packaged up.""", - default=get_default_version), - dict(name='extra_libraries', - description="""List of extra libraries to include in package""", + dict(name='versionfile', + description="""The name of a file containing the full version number."""), + dict(name='signature', + description="""This specifies an identity to sign the viewer with, if any. + If no value is supplied, the default signature will be used, if any. Currently + only used on Mac OS X.""", default=None) ] @@ -193,8 +171,9 @@ def usage(srctree=""): arg['description'] % nd) def main(): - print "cwd:", os.getcwd() - print " ".join(sys.argv) +## import itertools +## print ' '.join((("'%s'" % item) if ' ' in item else item) +## for item in itertools.chain([sys.executable], sys.argv)) option_names = [arg['name'] + '=' for arg in ARGUMENTS] option_names.append('help') options, remainder = getopt.getopt(sys.argv[1:], "", option_names) @@ -231,12 +210,17 @@ def main(): args[arg['name']] = default # fix up version - if isinstance(args.get('version'), str): - args['version'] = args['version'].split('.') - - # default and agni are default - if args['grid'] in ['default', 'agni']: - args['grid'] = '' + if isinstance(args.get('versionfile'), str): + try: # read in the version string + vf = open(args['versionfile'], 'r') + args['version'] = vf.read().strip().split('.') + except: + print "Unable to read versionfile '%s'" % args['versionfile'] + raise + + # unspecified, default, and agni are default + if args['grid'] in ['', 'default', 'agni']: + args['grid'] = None if 'actions' in args: args['actions'] = args['actions'].split() @@ -245,15 +229,101 @@ def main(): for opt in args: print "Option:", opt, "=", args[opt] + # pass in sourceid as an argument now instead of an environment variable + try: + args['sourceid'] = os.environ["sourceid"] + except KeyError: + args['sourceid'] = "" + + # Build base package. + touch = args.get('touch') + if touch: + print 'Creating base package' + args['package_id'] = "" # base package has no package ID wm = LLManifest.for_platform(args['platform'], args.get('arch'))(args) wm.do(*args['actions']) + # Store package file for later if making touched file. + base_package_file = "" + if touch: + print 'Created base package ', wm.package_file + base_package_file = "" + wm.package_file + # handle multiple packages if set + try: + additional_packages = os.environ["additional_packages"] + except KeyError: + additional_packages = "" + if additional_packages: + # Determine destination prefix / suffix for additional packages. + base_dest_postfix = args['dest'] + base_dest_prefix = "" + base_dest_parts = args['dest'].split(os.sep) + if len(base_dest_parts) > 1: + base_dest_postfix = base_dest_parts[len(base_dest_parts) - 1] + base_dest_prefix = base_dest_parts[0] + i = 1 + while i < len(base_dest_parts) - 1: + base_dest_prefix = base_dest_prefix + os.sep + base_dest_parts[i] + i = i + 1 + # Determine touched prefix / suffix for additional packages. + base_touch_postfix = "" + base_touch_prefix = "" + if touch: + base_touch_postfix = touch + base_touch_parts = touch.split('/') + if "arwin" in args['platform']: + if len(base_touch_parts) > 1: + base_touch_postfix = base_touch_parts[len(base_touch_parts) - 1] + base_touch_prefix = base_touch_parts[0] + i = 1 + while i < len(base_touch_parts) - 1: + base_touch_prefix = base_touch_prefix + '/' + base_touch_parts[i] + i = i + 1 + else: + if len(base_touch_parts) > 2: + base_touch_postfix = base_touch_parts[len(base_touch_parts) - 2] + '/' + base_touch_parts[len(base_touch_parts) - 1] + base_touch_prefix = base_touch_parts[0] + i = 1 + while i < len(base_touch_parts) - 2: + base_touch_prefix = base_touch_prefix + '/' + base_touch_parts[i] + i = i + 1 + # Store base channel name. + base_channel_name = args['channel'] + # Build each additional package. + package_id_list = additional_packages.split(" ") + args['channel'] = base_channel_name + for package_id in package_id_list: + try: + if package_id + "_viewer_channel_suffix" in os.environ: + args['channel_suffix'] = os.environ[package_id + "_viewer_channel_suffix"] + else: + args['channel_suffix'] = None + if package_id + "_sourceid" in os.environ: + args['sourceid'] = os.environ[package_id + "_sourceid"] + else: + args['sourceid'] = None + args['dest'] = base_dest_prefix + os.sep + package_id + os.sep + base_dest_postfix + except KeyError: + sys.stderr.write("Failed to create package for package_id: %s" % package_id) + sys.stderr.flush() + continue + if touch: + print 'Creating additional package for "', package_id, '" in ', args['dest'] + wm = LLManifest.for_platform(args['platform'], args.get('arch'))(args) + wm.do(*args['actions']) + if touch: + print 'Created additional package ', wm.package_file, ' for ', package_id + faketouch = base_touch_prefix + '/' + package_id + '/' + base_touch_postfix + fp = open(faketouch, 'w') + fp.write('set package_file=%s\n' % wm.package_file) + fp.close() + # Write out the package file in this format, so that it can easily be called # and used in a .bat file - yeah, it sucks, but this is the simplest... touch = args.get('touch') if touch: fp = open(touch, 'w') - fp.write('set package_file=%s\n' % wm.package_file) + fp.write('set package_file=%s\n' % base_package_file) fp.close() print 'touched', touch return 0 @@ -269,8 +339,8 @@ class LLManifest(object): __metaclass__ = LLManifestRegistry manifests = {} def for_platform(self, platform, arch = None): - if arch and platform != "windows": - platform = platform + '_' + arch + if arch: + platform = platform + '_' + arch + '_' return self.manifests[platform.lower()] for_platform = classmethod(for_platform) @@ -280,26 +350,15 @@ class LLManifest(object): self.file_list = [] self.excludes = [] self.actions = [] - self.src_prefix = list([args['source']]) - self.artwork_prefix = list([args['artwork']]) - self.build_prefix = list([args['build']]) - self.alt_build_prefix = list([args['build']]) - self.dst_prefix = list([args['dest']]) + self.src_prefix = [args['source']] + self.artwork_prefix = [args['artwork']] + self.build_prefix = [args['build']] + self.dst_prefix = [args['dest']] self.created_paths = [] self.package_name = "Unknown" - - def default_grid(self): - return self.args.get('grid', None) == '' + def default_channel(self): - return self.args.get('channel', None) == DEFAULT_CHANNEL - - def default_channel_for_brand(self): - if self.viewer_branding_id()=='secondlife': - return self.args.get('channel', None) == DEFAULT_CHANNEL - elif self.viewer_branding_id()=="snowglobe": - return self.args.get('channel', None) == DEFAULT_CHANNEL_SNOWGLOBE - else: - return True + return self.args.get('channel', None) == RELEASE_CHANNEL def construct(self): """ Meant to be overriden by LLManifest implementors with code that @@ -311,7 +370,7 @@ class LLManifest(object): in the file list by path().""" self.excludes.append(glob) - def prefix(self, src='', build=None, dst=None, alt_build=None): + def prefix(self, src='', build=None, dst=None): """ Pushes a prefix onto the stack. Until end_prefix is called, all relevant method calls (esp. to path()) will prefix paths with the entire prefix stack. Source and destination @@ -322,15 +381,10 @@ class LLManifest(object): dst = src if build is None: build = src - if alt_build is None: - alt_build = build - self.src_prefix.append(src) self.artwork_prefix.append(src) self.build_prefix.append(build) self.dst_prefix.append(dst) - self.alt_build_prefix.append(alt_build) - return True # so that you can wrap it in an if to get indentation def end_prefix(self, descr=None): @@ -343,30 +397,25 @@ class LLManifest(object): src = self.src_prefix.pop() artwork = self.artwork_prefix.pop() build = self.build_prefix.pop() - alt_build_prefix = self.alt_build_prefix.pop() dst = self.dst_prefix.pop() if descr and not(src == descr or build == descr or dst == descr): raise ValueError, "End prefix '" + descr + "' didn't match '" +src+ "' or '" +dst + "'" def get_src_prefix(self): """ Returns the current source prefix.""" - return os.path.relpath(os.path.normpath(os.path.join(*self.src_prefix))) + return os.path.join(*self.src_prefix) def get_artwork_prefix(self): """ Returns the current artwork prefix.""" - return os.path.relpath(os.path.normpath(os.path.join(*self.artwork_prefix))) + return os.path.join(*self.artwork_prefix) def get_build_prefix(self): """ Returns the current build prefix.""" - return os.path.relpath(os.path.normpath(os.path.join(*self.build_prefix))) - - def get_alt_build_prefix(self): - """ Returns the current alternate source prefix.""" - return os.path.relpath(os.path.normpath(os.path.join(*self.alt_build_prefix))) + return os.path.join(*self.build_prefix) def get_dst_prefix(self): """ Returns the current destination prefix.""" - return os.path.relpath(os.path.normpath(os.path.join(*self.dst_prefix))) + return os.path.join(*self.dst_prefix) def src_path_of(self, relpath): """Returns the full path to a file or directory specified @@ -383,25 +432,45 @@ class LLManifest(object): relative to the destination directory.""" return os.path.join(self.get_dst_prefix(), relpath) + def ensure_src_dir(self, reldir): + """Construct the path for a directory relative to the + source path, and ensures that it exists. Returns the + full path.""" + path = os.path.join(self.get_src_prefix(), reldir) + self.cmakedirs(path) + return path + + def ensure_dst_dir(self, reldir): + """Construct the path for a directory relative to the + destination path, and ensures that it exists. Returns the + full path.""" + path = os.path.join(self.get_dst_prefix(), reldir) + self.cmakedirs(path) + return path + def run_command(self, command): """ Runs an external command, and returns the output. Raises - an exception if the command reurns a nonzero status code. For - debugging/informational purpoases, prints out the command's + an exception if the command returns a nonzero status code. For + debugging/informational purposes, prints out the command's output as it is received.""" print "Running command:", command - fd = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) + sys.stdout.flush() + child = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, + shell=True) lines = [] while True: - lines.append(fd.stdout.readline()) + lines.append(child.stdout.readline()) if lines[-1] == '': break else: - print lines[-1].rstrip('\n'), + print lines[-1], output = ''.join(lines) - if fd.returncode: - raise RuntimeError( + child.stdout.close() + status = child.wait() + if status: + raise ManifestError( "Command %s returned non-zero status (%s) \noutput:\n%s" - % (command, fd.returncode, output) ) + % (command, status, output) ) return output def created_path(self, path): @@ -409,14 +478,24 @@ class LLManifest(object): a) verify that you really have created it b) schedule it for cleanup""" if not os.path.exists(path): - raise RuntimeError, "Should be something at path " + path + raise ManifestError, "Should be something at path " + path self.created_paths.append(path) - def put_in_file(self, contents, dst): + def put_in_file(self, contents, dst, src=None): # write contents as dst - f = open(self.dst_path_of(dst), "wb") - f.write(contents) - f.close() + dst_path = self.dst_path_of(dst) + f = open(dst_path, "wb") + try: + f.write(contents) + finally: + f.close() + + # Why would we create a file in the destination tree if not to include + # it in the installer? The default src=None (plus the fact that the + # src param is last) is to preserve backwards compatibility. + if src: + self.file_list.append([src, dst_path]) + return dst_path def replace_in(self, src, dst=None, searchdict={}): if dst == None: @@ -436,11 +515,7 @@ class LLManifest(object): # ensure that destination path exists self.cmakedirs(os.path.dirname(dst)) self.created_paths.append(dst) - if not os.path.isdir(src): - self.ccopy(src,dst) - else: - # src is a dir - self.ccopytree(src,dst) + self.ccopymumble(src, dst) else: print "Doesn't exist:", src @@ -479,30 +554,29 @@ class LLManifest(object): if method is not None: method(src, dst) self.file_list.append([src, dst]) - return [dst] + return 1 else: sys.stdout.write(" (excluding %r, %r)" % (src, dst)) sys.stdout.flush() - return [] + return 0 def process_directory(self, src, dst): if not self.includes(src, dst): sys.stdout.write(" (excluding %r, %r)" % (src, dst)) sys.stdout.flush() - return [] + return 0 names = os.listdir(src) self.cmakedirs(dst) errors = [] - found_files = [] count = 0 for name in names: srcname = os.path.join(src, name) dstname = os.path.join(dst, name) if os.path.isdir(srcname): - found_files.extend(self.process_directory(srcname, dstname)) + count += self.process_directory(srcname, dstname) else: - found_files.extend(self.process_file(srcname, dstname)) - return found_files + count += self.process_file(srcname, dstname) + return count def includes(self, src, dst): if src: @@ -520,28 +594,38 @@ class LLManifest(object): else: os.remove(path) - def ccopy(self, src, dst): - """ Copy a single file or symlink. Uses filecmp to skip copying for existing files.""" + def ccopymumble(self, src, dst): + """Copy a single symlink, file or directory.""" if os.path.islink(src): linkto = os.readlink(src) - if os.path.islink(dst) or os.path.exists(dst): + if os.path.islink(dst) or os.path.isfile(dst): os.remove(dst) # because symlinking over an existing link fails + elif os.path.isdir(dst): + shutil.rmtree(dst) os.symlink(linkto, dst) + elif os.path.isdir(src): + self.ccopytree(src, dst) else: - # Don't recopy file if it's up-to-date. - # If we seem to be not not overwriting files that have been - # updated, set the last arg to False, but it will take longer. - if os.path.exists(dst) and filecmp.cmp(src, dst, True): - return - # only copy if it's not excluded - if self.includes(src, dst): - try: - os.unlink(dst) - except OSError, err: - if err.errno != errno.ENOENT: - raise + self.ccopyfile(src, dst) + # XXX What about devices, sockets etc.? + # YYY would we put such things into a viewer package?! - shutil.copy2(src, dst) + def ccopyfile(self, src, dst): + """ Copy a single file. Uses filecmp to skip copying for existing files.""" + # Don't recopy file if it's up-to-date. + # If we seem to be not not overwriting files that have been + # updated, set the last arg to False, but it will take longer. + if os.path.exists(dst) and filecmp.cmp(src, dst, True): + return + # only copy if it's not excluded + if self.includes(src, dst): + try: + os.unlink(dst) + except OSError, err: + if err.errno != errno.ENOENT: + raise + + shutil.copy2(src, dst) def ccopytree(self, src, dst): """Direct copy of shutil.copytree with the additional @@ -557,15 +641,11 @@ class LLManifest(object): srcname = os.path.join(src, name) dstname = os.path.join(dst, name) try: - if os.path.isdir(srcname): - self.ccopytree(srcname, dstname) - else: - self.ccopy(srcname, dstname) - # XXX What about devices, sockets etc.? + self.ccopymumble(srcname, dstname) except (IOError, os.error), why: errors.append((srcname, dstname, why)) if errors: - raise RuntimeError, errors + raise ManifestError, errors def cmakedirs(self, path): @@ -582,11 +662,25 @@ class LLManifest(object): if os.path.exists(f): return f # didn't find it, return last item in list - if list: + if len(list) > 0: return list[-1] else: return None + def contents_of_tar(self, src_tar, dst_dir): + """ Extracts the contents of the tarfile (specified + relative to the source prefix) into the directory + specified relative to the destination directory.""" + self.check_file_exists(src_tar) + tf = tarfile.open(self.src_path_of(src_tar), 'r') + for member in tf.getmembers(): + tf.extract(member, self.ensure_dst_dir(dst_dir)) + # TODO get actions working on these dudes, perhaps we should extract to a temporary directory and then process_directory on it? + self.file_list.append([src_tar, + self.dst_path_of(os.path.join(dst_dir,member.name))]) + tf.close() + + def wildcard_regex(self, src_glob, dst_glob): src_re = re.escape(src_glob) src_re = src_re.replace('\*', '([-a-zA-Z0-9._ ]*)') @@ -597,7 +691,12 @@ class LLManifest(object): i = i+1 return re.compile(src_re), dst_temp - wildcard_pattern = re.compile('\*') + def check_file_exists(self, path): + if not os.path.exists(path) and not os.path.islink(path): + raise MissingError("Path %s doesn't exist" % (os.path.abspath(path),)) + + + wildcard_pattern = re.compile(r'\*') def expand_globs(self, src, dst): src_list = glob.glob(src) src_re, d_template = self.wildcard_regex(src.replace('\\', '/'), @@ -624,43 +723,53 @@ class LLManifest(object): return self.path(os.path.join(path, file), file) def path(self, src, dst=None): + sys.stdout.write("Processing %s => %s ... " % (src, dst)) sys.stdout.flush() if src == None: - raise RuntimeError("No source file, dst is " + dst) + raise ManifestError("No source file, dst is " + dst) if dst == None: dst = src dst = os.path.join(self.get_dst_prefix(), dst) - sys.stdout.write("Processing %s => %s ... " % (src, dst)) - count = 0 - is_glob = False - found_files = [] - # look under each prefix for matching paths. Paths are normalized so './../blah' will match '../blah/../blah/' - paths = set([os.path.normpath(os.path.join(self.get_src_prefix(), src)), - os.path.normpath(os.path.join(self.get_artwork_prefix(), src)), - os.path.normpath(os.path.join(self.get_build_prefix(), src)), - os.path.normpath(os.path.join(self.get_alt_build_prefix(), src))] - ) - for path in paths: - if self.wildcard_pattern.search(path): - is_glob = True - for s,d in self.expand_globs(path, dst): + def try_path(src): + # expand globs + count = 0 + if self.wildcard_pattern.search(src): + for s,d in self.expand_globs(src, dst): assert(s != d) - found_files.extend(self.process_file(s, d)) + count += self.process_file(s, d) else: + # if we're specifying a single path (not a glob), + # we should error out if it doesn't exist + self.check_file_exists(src) # if it's a directory, recurse through it - if os.path.isdir(path): - found_files.extend(self.process_directory(path, dst)) - elif os.path.exists(path): - found_files.extend(self.process_file(path, dst)) + if os.path.isdir(src): + count += self.process_directory(src, dst) + else: + count += self.process_file(src, dst) + return count - # if we're specifying a single path (not a glob), - # we should error out if it doesn't exist - if not found_files and not is_glob: - raise RuntimeError("No files match %s\n" % str(paths)) + for pfx in self.get_src_prefix(), self.get_artwork_prefix(), self.get_build_prefix(): + try: + count = try_path(os.path.join(pfx, src)) + except MissingError: + # If src isn't a wildcard, and if that file doesn't exist in + # this pfx, try next pfx. + count = 0 + continue - print "%d files" % len(found_files) - return found_files + # Here try_path() didn't raise MissingError. Did it process any files? + if count: + break + # Even though try_path() didn't raise MissingError, it returned 0 + # files. src is probably a wildcard meant for some other pfx. Loop + # back to try the next. + + print "%d files" % count + + # Let caller check whether we processed as many files as expected. In + # particular, let caller notice 0. + return count def do(self, *actions): self.actions = actions diff --git a/indra/newview/Ascent.icns b/indra/newview/Ascent.icns deleted file mode 100644 index b2d2aa3b838507ddd4cb0e7fd76f4e5bd376c2cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121060 zcmeFa1z1!~8$WzDSr(A)TsCO2#UPgM?(Xhx&IYL%0EfcR9+!?wPscH}~9g&wb|1Muo(uK$x2kqf(|%gCMNkqG8O)NZBwv z0wJX%_`!jJ{z29N)Xy3q^bd~=k02!@n#e*UTW$Z~z~Eq?06$-kAS6mufvlsTqKubN zl#rh^6^WNp7N;txN=eLuHC*|ekZ55;ISnygyd-SMfZ;c;=!P8Q-R ztC4&U>v>jlnc-7(>5|$xmPiqUu1u4UHkF5I^yEShq)becLeZHiPov9HjArX0ukSs$ z|DgBo{BeRDPa#gZ=%3JQXU2*+2!{$nel`=}5uQ2m<~Z8Xg!xUqOv8 zpFR#F;4@T*;UT1U&x`x@#bwp({H05l)>R_x!$?bHNVt9ElE~EjTo;6U0AYp3#wN8_ zW|n3LA3*X?bXHa^DJWeKpAfCStpO=55B7|34l1*@Gu5`~O+pr!ni-nS+!#H_%!Jwc zrVyc2sq4?0X=16PH&1P5WPlCw`tJSS`*-d<>b>{i*43+bzv?kK0L+B<|I3#Fo*pTB zaWN2tAwjm6ufMuZBoGMv1R`3%WegGXLnSPfab)Md#@&aH?QdLwf%u>#WT+o0 zC`Y~wAqnXF>a*LAu_!MG-yypohzJ!lpE`SK`)gzvd9McEIwK=}2rC15_Zf+YNRaGf zjii{2@xR3?|H|qyUm>suXeYo15*S80{js05Rd_f%7MkAvg5!j9=$qRz$d>c zQL*TtBD_J6)ky8gS_C&dI5@x>ga#^ypy4`%FoL}5xqAz~gS~zIA?FeH;e!XG4@j)5s?MM(2m`b*kkR(fNE9R&JzbT;Qst*9lL=Ic zs;npxhGa2VNC2wo1Eh6zNOH1@ib{&|!Vr~;#j&7CDEjE-&qz3A4PiMDkpRi+gT8^W zFh&rEhXkRTPe`B~1;Vo-U@v?|WC&9T@naxxDllPQ_*MWQ~77i zr@=MIN-z$;_A3_jD|-MMtQx9A1VE>D-|p_|>ArRQKI~??#DeI_=JQ| zvNvtrxM^LozrU}aUw~goR6s~bSa?KKOhks$+K-68_L2*o7dvZxogEz=oa~&T zef$D~A_H=0i#{R&Y6}_~S~hrE+1c9KSvxx@*VTAY}l&Vdjy?SNCrERn3%$zlA=8QSgu~+lFeSjdLq0vHlCzhe@ zD_YMV%}Y&ZrOCxFJF_Un)7v*V!q-M>YVWpsUh^|c6Ed^l%<#1A{K!CG@4(<7HzRdr z!J6}nSEJXfR>lN+xx2Z!c$h002Kaf}8|u;&Gz3gC*z|I6U8BO**v8St)z!&KxqOGA z4nsv*m8u~lmm6C~s{rh$Wy;W$RVY+tb)w}0dnFnTR+Fcx3xu%a7x1oY8%Q!J6jf!0 zFqIX_P@%xe!U_z&8JTgB1wMzTuE&LkMn!WX`NJcE{R2P`d4Avd z#h~*)vOhsT82~iQ9l#6@a)+S7q9M#6Fata=gRUO98{gG)r}rWJ0Du2s@12L7`|!Pj zM*|-bU+bpk?#}D&MTseiNr@>*nQ%&0R!&|4iwjprto?wv2Yh^u3?j$U5@Tay;-eD$ z)LqikvvUhrr3GteFZ_Ubcs_nUj9iQj3l9$q4~~nVUpSVK2`aGjOVSiJgZ4hJULhY= z=jCT-XJuvN${ZbFXJlsQ7Zj9o4Yk*A02RDnK1I4LZ7eJ;EX-__OOWO1K!98hr$VOg zW+i(4`77jQUF8ziVz1JZA9m!Yg9)=JCsu1d(y$uv_kQvCNO8^bnq|ut*REluXJqEV z1*rk%^QBsm-OE29o*r-a6vJsL$;t7l{#56@+_YFfJCoVA5^2}(ITe0D+yZU}hDXH1 z$zBPG>Psi)i*F?&a)*KJ`Of8Ha0UiV_J&uyx;iN zq39#xr{^=>)WFbau7#rM{UWBJf&P4h*;c~-H_o2CV^!Rba9o_MVOye|wbR`CjUKSA zxShSV>m0-94`1~l{w4hgS5}=uXVLH!EgfJ)G?*%)08!>lojsX}UyNEpLU=SQ3Ktz7 z5yOchM~6lDd3brc`?@uJ=LZTu<34@<_@4Cv^Kr}?VtLaZ{@2sqZ>EU%_*cG zm3;{578H93t^?t|fQX04la3Ec8KXWjUMngR!ag6w{T8@79Z}ac0?W+O)Xn4OT^8dw^s8lrUn+~JAzC-Z;^`CnX z7U+y31T!*JJPZw0p(})efuoVt8!qobJB|0EVzWlg5d&I zK9mRNLOF2uY`$tt>6s7O*+X3}b2v zo3KEr%QAutSq4HNc$`0P-h2awAYbD6r*Oa*#Y*jxEcQA;|N6lS&PYYa9-bAwnvMKZu{P#Tb4FN2p$^LD88qd6^DN z8>^$G1#4rpG+`}{CP#y<&Q`-P7%-g;CJ7=<5&w-8Dhw8j0|b>3KQLxM#7ROIAc>0< zwY6AkEOl6o4SrbaVrn1+XQ2P+>Y8+l3RRuK;LtfV4wbFSrm$7`l~t5ffm6Hrot9q- z`=f-p5E=DHdMhVusngY$X~60N8fqF^Dk22XeNq}+K#e^{jbBBDq6nPrZ)u@IV#teK zRW%uaPBqXEr>04t#D)MZt;sYs7K05$WAj8KtAOZ?4AlJEr{Am0lZ-Q}awJUAW^mOj z05yV!nx--if-z*^{vn4s6m|NjwqHpqt4g42sox67M&ot@GZ8@r~mhc!sJfyQ^Dk>cJTW<&`Q^ko;AVT@Q za4@Pa9@46r3G4$_TgD@)fUZhNI9!RB(!UaNR9O^Qg&&yxDn#Y?1i=aji!Jq0)}nI& zH4KBm9+laPL(v@T3e@me6d_e*)k(m-R(z$VIO-IBFul=<)Q3yaWE81Y0pS>$A`pfR zgo9L<&Y|(NMa_ky3R5PjDpO^^+yJfqN^#81{6G-wU9g|R4 zg(iaoK98R#V$bh-83wKknys&*PNUOn7&vuJ1soUsNP00-l}B%M?21z;Dym@Mj?U+( z(tn@`hL?mkL!G6zM4h0isS1pSCnFI`jYX|+RBMi^xQYr@2@H7@_i?0TLl~?STLnu| zQK_O3ROBXMAuvWrVDOV5!$s=qML=z|r-?vF32=>P_2bZl!N3K)3&Bq%h|T~9@B!#C zK1jC4f}&1Cq2y3ms(chxssa!bFa!hQJE9W5vLVbCh=eCX(zPKf>eNvZFiL{1EDW&Y z{6yjxMuUYxK(&_0<|AQ2GGb%6>Zl}KDnCeg&?(}ePe+~Pcali{LJ|xgb~8lOfY&*w zsEz3|N+>SQhDQGsBp0FA1uN~Noa zqXbLFCkT-}Dy!hMG*&t$BZHO6$tufcXOXfq6J0cA8R|3+y^tnE9i>TA6u|+aWhhY+ zv=UJsH8<(+r9>w+A!zpU5*s!7GPz25mI9x=oQym}iw;O}X&5>cRwdCHsxp8Egjx8L zd{RG>@`VVF^$rROG?qr0W|m?lU^=}~Ebo}w5Zj4mij0nuVC z$mn24r=TDDR0;7AT@KPq6lx)DF`XZbbU9H$0Z}TWkdC2&$y$&`S7WHki}InW0$oe7 z1Ypj*sq6P7SQnwDwqe^7!j=DWEGk!&`pg&RgxAaf-;o%Xb7e;IWYZxmux)kRbm4aXosSm1<6kaettoG_UHJQ9pq3S|18io(A( zAv)WMgCX+^i%ZKXf)ovKj*JR50*FY!k_gN?cu1y-3Sn7*$O=GY!FQqvj}ZYbMPF|r z9l~)S0W6+CA`4Cu5fhh?rG3dsv*_@S#AOdYiFKPiDL>T^upEGJjY9OYg09Z66T z$Vpl<3%vw73G|1E&Fr#JlmUeKz9wlHp+Qh&EJRoX2?7xztk_iMyqa_fht{nAjwW$r zL<^d|XcFLzQ&OKk$2@A2KZIKcE&i?!A1YwgJP5xAaFx@XV;PuHQwZYCb%56Q^@szA zj7cg)SPQgJbVMvM#Qyh9Vl|3~G_|559&jel59Rt@0?M@ISwT89Y3eINUHOUa?ZAD5Dg z=zI)@!t@yulGH{9S&gQt6kWf1bRj8tGHDm+ZYTDV^ z+dDWoIyyNyJG+4Nw41xThli)9mzOu1ANThM8T4R(Z&8T15(OO8fvdM=rDkQNmLazq z+ggfRg<9GgI$dhd*ju`~ySlhkII~<}SJ+M6!yOQFbNAqp^6>@9c0dh~3knVn2?-4i z0~y?ih{&j@XgG!x8yD+I8nw4EEvyTYGcuA(k*+f>jfG9*#&gGeVv~;|uvVjt-7ac6Qc=dUKifE^cnHyXctYK3};72Esw2qucw|;HwPytw&Owvwj<5S(b>V;P>KL%00AO4%+Jm9 zYagIDDaLSvgT(-Fqqs$fg(?Bx$Qy;f;KFGpH?av%ZUT@;W)xhRA)!4 znFJ847+35$W|k7~;O#Nm)n5?{2n-5B`SAKDA|fh0Vm|QJztx7*OloPkxZD1?uZs)p z%yz19>L}Zw&5TrV`iv5KuY@o`y z)7R|R7Fl~ZyRZP0GQfoDVrN9cW5PQxHXiCujoD!3=l-)Ifj|-QuYg5`hN|G8-D4}< zU$9{{^Eb7f=*f!PW98)xyRe-rout5su(t;5rldP3o0=}~wLKB&;RVbY_7?m>8I;Ya zJx7K|=o6rTugl(FvLOS&_L?0JbaiueWdS}5omkGIPIi+Ckj1qV=h{wQwOP5q*4G{O znly&lSJ2>K3EsFtjV#nd2$H-3CM@3C{}+5ma%Hxt*uaHME_uI2`HrJ#POhBst~?qCz8?c*yX={Xc3%YHB%a zzcD&mHX{p>I9_^*BHy$uW}-i*go( zg!i{T{>lo(dHfp7COl|I#|zDz!D(G_OneFj`jp{>TUda?i%(H_|9JgR?;XdaIZ9QiXai<-_zFI z_>C8cw*Nz`=9b2`1ENz+SjKFS)LdXFZ7^LK+?*gpUutZ=c(`kY?J0L3o=&h2VU!UZ zfE(>6>5#C{;K)c@x)?tZioJU3{Mn~pwfa?0H8-}L=`aPJ5K{{Ykv&VQLLC;g!A^djKBxi1Km&}w zKO8^-lYMXyO5R#qnM$Y2fqPP#=Nnp@n_3&bb@DgjNeMB5 znJZ3i@^$tH)L|ZRJP#f?NI4)VG$O!4TUnJsqp664{Us|dH=Ju}KG*oI4`hDqgRZ92 zT^lW;HXYfqzI0txz0lgV_3O9Rmjzh+_<;xorH(Vmb0T*jU?o1$uk2 z02`K{Jcxw?fFhycfey22%2bpIm7xI4h~C=DI>+C7zWEujAD&14L5mWkqch33bAhvq zAMiwhtN@Px0zbSj*a!jW5>cw&p57=A*iSS7aPSKV2@7^J(pFKSF=${7ECsSEL>yGn zc<}gL?qK0{LdJNec&F<+xu9cMl8p2YVn`-YhS!XR!y#%iY!8+0M?{ z4fce1Tp)m#h@Y=tKyX-)o5>U^fD5qU&?KeF1ZXBJDI*o!?#M{W*Zvw`fYjDEE-6Jw zqke0QU$`&JpXJB$<@l6(3;4LX+f1h^DQP$%x$^qm{zH&%UV<92Smbr)fg8pRr!+vbQqu5)})lp{>y3~SX zqkQ~8cle0-0b335u$rT#%40wS*${p@MS>3tx#Xv0u+qtCnaKs;lmMBJF&61LQLDCx zAN7s^J2(R202t`O_T>V==sw;qmgrqhaXWT^Tvn)uk2lzV5**~`W;IWj4(BRMpZm+6n zu#wQ$-OhNHHcdsD0@Cqx8029{RJx)FfG9D8`xE7_-VaX7jj6G#T;&OF&WDGE03CqE z@Oq-qTiM6mQ4E4+9=Y0b=t{BAMibllGqmXxWffJFK9GGOjZ9aS07(O<{N&6u_D?Ln zO;D*xMe#oMv>7uE%xs-Jd{Csp^vMe01apGqg8jYJF_7b}i_I49vzO;cy;Oue}VMkc0a7GPjjZu1%#qfj zvKV|IzeZK1sHl`E!z!?{C`DcfkHLkd#HU8(rMhjTs)0;X4GN4TNbZBsCNu44>_Kh> zmE1PFAkSkRRgFtU^KA4=hA1!u0>msx&(2P*Fhgazc1WHY+VPGkS?j9$Q*dbp@)Tk|+@(L;)3lroxkk4>GEA zEMQ5YmBpxZWigPU^~p`iN@8a@ZU(u9(L-*V6cv6=*bhF?me}r55-+ zx{`zt7UJ^_uMFi64~j*TdZS685oEIcbc%XCgQTvhrlvVrgG#Su@Y7Ue#RS267K>ei zZcY3yza*(FC08#?l97>>m6no`lUpH+myr+=z_0o~=cECNP7>K942i53#tZR-+*9p% zX(uHuy81b_)&G|#p5Wo-Lxe%FrLuo$&G5$Wa!-T(-{qbdOXz6sU3R9PxFoes4Q3Ro ztpJc}C`HxPt>JBC7#qS-`|G!E-ng^8oqXwX`}wCE^v$dP*;%ulyQ6R?_aF8y&TjS| z?q2?V`}QxUj-@_8Lv2VHTKMYP-CI5P79phJk%bWrH}+H&aSFLyP9a>xD#n$Rl$OF} z*aZt0!sQwjixyQ@R#jCmUc6+<(q+qPYL>59QM+>Gs@1FO>OefUZrz4;`)h?qb5LWh zp`g3rVq5E#@_zookAoov-AhBf{o%lc0jxj_x)_5)pinp*ieN=*Mny-*#KgwM#U~^r zCMG4Pq@<>UJ#`?}l>-u8`S}GP$;Hh}ks7_P0;sEl^cna5`D-1QyUG#%ek5|kjmXf% zqy!eooU!AecsOA;*rbu1oDiQ7pO})CmJae}nOWJ{qiM5(0vKkqIb3dGQE@R)vTVVE zh2@JDCXh!>c}#lt-PVrwi`UCWz+nG?l;m7-PmX6raUpbZjgea3}&C*fDcsW8$KHZRJ5i91`XulmQR&FAJ0d zNHU`6kLmzelq}%pqC3fXgZ@VrC8!o3kR^FdL8&outXNJ=Q8Xt8j-3-1?ZX7_iR^ax z{u}S|1u+>ZKPUlM0F(d=UWb&FlohjWzonagWC4I0M7sPgr|~x6uwyG?*s-E<{ziB_ zWPSte7yBH%FE=?Y6;7w|tcTa%r~-gI=mfOC0eN<`$hTC}kK~IH{t>YCD`fYYu#`AB z9upVGjxCGf#Li6!u>&`V3X!3aSIFY@lVRD(KWp$ENF~J!IC&b_Z+WI4c@&{rq(36H zS?5C2fw{vV+gk~Ah)az0R>DKo$or8&q}%&y4h*z_GjUm2**S2o{FoA>7!?(l7PIZX zOELY(p%@_!B0VlwvXkIMOhN(+a99`%$BD(q1?dqXAJ9d}CnR9|#z+u+r!&TY`mw7~ zYbq{d$BIFer(m%0Rx>{`DMX>_L;QAb3Qq@VYQTpL_!I#?5@2ssVwk-!r1D~T7-+gV z4p2woCv_IE^L4P$cI1mTbQ?{~{>X}pBK8ScnS3!KGa)I7$E+}( z8^?~9icO00Q^kWFA)moLhUe}VImuxBp#zYH;`WnHp!dtT9A_eA2db<8ic=xFh3rc} zD>o@MnU%ywwJMJ{j7yFQo{zTrf&g`5*6fbVP614Q0`5BtE-sD`g(Q2yX0%^&;f(6D zC-Y!$_!~x`k3J#GvumTXQ{Yr6g`Hdkw1Sgl6XPQM=i>#zJ`k`AbMUiwOL=0(s71qB zw10v7Ht@M63th!YkUd~E^gE?^_HfjR8`|6rLo3TQ9h^`*u(EQalzCG$hm>L zJRrFwj<>rGx^?(H^1$YNRbpluY6WoCC~?X+;#>~9uq@lfP*;{8G6MC{y{*60gAH6J z*xNXSJoTf}sS9W&R4E!&H>eRAc-!}R2)S-`W@kJIoOw*3Y&eHDW&=Eb#^RQ;f|y40 zl*t&iq=!)-@C6+eFJC-d^<3!T<9AORPH}t}->!|zPGkK*T&e)bMAxBcfVNMauS-}(jq08CSbg_!{sfP)Fs*jPi91Z4mc;9)^NWMFWt ze|b5dZ#+;IH7;jwY%E9t&X|>eiH~Q4Ii(~90%L>}9}DiSq~~Xh^#dzM9-VIUatkqs_FaBy zOr?uGpOCeFZ`r9FI5!)3^UO?k20I;2D^3+kPf3W23<`=$1VavdoP|LrE|Hw$6SH({Dhmj}{;q=9^0YnnOot^V2P9*D{O1O1UcP3 z*V)eci4X7Q&!{?=u3YuFTnV0~K{qhxvw=py97?m5;@rWLWC~Rufwzg?QJf3sXQ##l zx>_3>=o=cFnwr4OVq>xi({v`-*e2WD(a!ma!?(fHdb8)Y}k|aUQZqOS)>%hxBq4e9XbU7aJpU;H#g$<0DW|lS%E^c1FAk7yV#tK&m z19t}k1AM$qwfG^Ox6hyTJwP%S)J(TFHZ?(cR0AHSvlRIu(c{-IUE%(O(-;rdqmyrv ztC!5MVzNy6Kr^P1p@Bh(K5PK%iyF?5Ct(SDJI{4A+}`YW!ob`JX4U{;4Cx?OfqK98 zpNaBPMgmY_SJ$q9qo6*Ai7_^YO)5=AjWxtbP;&2ut5@1@I~)p|XU1HCiZ@vbK+ppq zDEvvhF-qLq*PIWcwTq1xF~y8bbfrm<&h?A!osBQ!OIOaYG~!X2twe^%M}d+>KT+W& zpU6<=aKyq|US%<+De7~fwcY2hp6lJ_agu4qTxra2q$Ug=QAG{*X9~O!ZxU2>%;BsN zT2+*(4l-RK_u4wHT)1O%AbPGDb2-l*b!AA<3?M?uPa^OL2tg~twkOU(l?D<_ktIR& zcCcn^dJY$@;mIYyG@YX&01 zQ5~4-B79KtJ)pzSB8(-VEKi%6GHXF|6CE&RhTOY&qw(rv(?hX91s;l1WPll6zu3`U z`V;@r6qLxB*!gCly{L&1RS=?II^WXvu*YrFGM-F8{<#$3me+Oz`G0OdnuRJ`qi12X z%2?P)g$yn0?RK{Wj1@BO^MH&1q{BCTM74 zU@9!ueCc#WP;zV4JTrgJBa`LEf=s5FJ_BUoLY`mgxv}sj`9{x`XHMUmf=PUFgr1qv8YbCz{%j+r z-sCx!CWb4R0>H88(WSvdufu$KLpn39o_ zsh7sd$Vf}WGApGCG7=!2On|`;ehH3<|Kr{$b46Z~3d>-qu^3C$h~UA9|K%pBRNixV zM*ly04iEZU{vz-ffxig+Mc^+2e-ZeLz+VLZBJdZ1zX<$A;4cDy5%`P1|0x3C>CyjT z`ERAc{I?DMr}a_pcoP5ru7G`B|3$%ogA&1(-v4F!?r_3!$%2zGa1c(@Gbr$XQ-T75 zjsFV((1SPx;xD7;BmHj*dRx2!9Ir60;=BqddyBi^B&EL3|Euz;{{uL|6g}o?{DM9% z4m5auD=TQGmc73OLkrWN@Ir{|{CEy)+E??*Rupj9*aj znP3A3dXUwh%Lq6N6_g1+Ks$u6z@aJ=DLDR4u+?Nd?g-HTOZV}er@)>5aSLjH?FJJW z(CEP#Md<#M@n{YseW$ZcROIu4)4g%KT8X?ndFH7p6j<}qX`d!Tm3xrL&vKQG#N(j zd-6^{97h0jAG*SaKl^;tFu+z*Hy%AKr0{eC-gjiMOm-aByvsb}2h{&qM!@FDThWrB z0eYg*#&Ok0(LXtJB90f31P6?KM81GStAATSL^5zXKxT}+)3}|FqW?HRfT!QMFDL++ zX_DS+xgqFeOc^0$x$%ze9+Db zd5WgF6GWfqpzsh*SoHTr7;KmZ1xF%6r0wIf2O|}E5iT?#_0gv>`1!yQFa+Em3YJ&U zv1fd90_;KW*Q!j6J%k141WvH<$vGcFz$86R-=nsF-UyswGJZkt`a_bDyRUV3b=~}9 z>FVn0zV{IfgK^oT=)Z{*9-lc1CmzGkdi%$b|HDOed*wLVgZe{AJ#`|Wq62U8O=S2> z-{7AMIMIG+Xm9|HJI9Ys0sAZFV4vK$1@-%;pGW#8Fq3@+VO;K@B6#W`ZDJuG4pM)M zn$tK10E%ip44%*#zo5pq6+8<$kwO3m*Y=G+lc0gt;Hzg~7xVZ9Wq;FlVj&+1N<=rT zjz<(={%BjOqp97MaeVX`q0hM>LL9fCv##2Eu$CCFfX8jNdr<|ztd~4~h=i)YdqN=} zYJ3MKFprHOk6Dw^GYHWGmd9V73?sLlCmQmFPkMGHm$FdCwbTTpsCCPc5r0620qK=v57Ixpn&npnt3g1je$ z{)@;-s50PO;D_Un6p$BKFrknS(371Ay|HN&Re$Zc;-cuEoHdc41Ep6#A$o1-G>UeX z^90ZzL7q$~PKe&?7~V9BfyC|r<;L?B!y}6)7V=G$9x~0n;cJI4Y|N#9Scci2y9 z=9$p60%4v_h83Yb&y|GPq%NVxZ-cv#$MI^lov`rqk}3i98#_)+}7@BSk2 z7lFSB{6*j|0)G+si@;w5{vz-ffxig+Mc^+2e-ZeL!2hKPM1@SzgP;UEAf8~fql$_U zxfpyK6C@Fynw1!xI86l=d+fIZ_#Fw}N<~G6CXXgeK+*)yH@XQ$I3yu9c{GWFrrlK0 z1Lr|n4K3(RUGxh2g9ZQ4d@Cq`TnOTTI6>fxK);bg|Kydg4aVN$`7oGo{}E?!v?FK& z&QZWa7{nJ6S8??84E*}v)6vlr35CG7&e;UT1cj#Qq|cl@ZSqv45*%a;N_-$_v$*~A zM=~MnPMkQ??rPI~%aG@nR^MO>@h?-Gde1&i@p-`Mdk0x0$IsmQSvOs_ZAl}p-CpRn zE|9@t-toJWU|td3(rqjIKx&oznlox^E0fJX>ufD5@OYV)r_zz=M^aKuC_zL^j&3tjUJdomw#IOwP?;fQc|B%1y7{zIG{R;QoUFW59=C_}b z5Vf~nJq(eTKHF$Deb?2g9;&yl@9AqV+tj{`%~H_aQ}v;4vfzo>`8nPR)ClL=0O`xU z{&v;^x@{|;=jx}`N^y$4IvN67dcBlcv4+@QOq$S);MJZgzH%jsw)HV@KgTTR#0JLF z^bS_tc;%`pGA-!nrh#<5lTSAx0tS7bgNG31o2#yU9*pYGNxvif%y0UK=!7=$6wSRe zbq0*iSD%Qe7B%{(*!rorhDLQ;agDfoP~$L*Bk?AGQv0PT=0U<)wp*JYEnVHarhQ5e z^~6lU?J7-;+neheUQt;e)^T3Z{2qYAHr{a@BezU45qUlLm}q^6X~FajpH%aAI?i|- zw10|MfUJeyeaV<9Bf^>Q*=JUE&o{Ze@Z|KJ!6WublcwKQp(cuHTko$@^m_8hVB>jc z=Z(j)9|m8gS06p>{JLi?W0Upia4Gj2)8U3!TE*Q?!l!rODz0Z^j`Gn7$4i{87pOvujgJyH+%oBn0jG_$%O|flQZ|ZQ2 zpx{dbw$1KOf`bQkhFo&(ZeN;JWolb}Dfj6n;^vI0!GxQ7o&D$XLl%Z@K08;?(YTB@ zOwIczb;x*5H8JsJmUjDwXDW}UZAhHeak9_-()Nnu)!Hl?tEZ}E$+Znq!5-H=He^>S zYuu00U7A6eRb4Fj$#JJW|Bjcmw3z$5Z~TmeCz|;O(*AwDsFrtE%SDe0as&m?W1^+>)gW~Ekf=Ra%@w@t9VXVxd^kQ&f&AiP1EdcoK;*;;P8@nEpW zvHLlhVkSppwl^}89Gst;1?`zO1$tiQNj(+h{LEe^k~!Z0^8!yIybW%#FnDO7p^{w{gxvl#TQC6x4l~r;Tg&mUo8; zt5|EBT{*d$RJd_USrA_I#682)1?q59y#V< z`{8E&C!xiAPU`Fzm?ko*rT3mPhigcL3+*po;V9?7(wc5#wr$GuO@55kflJH zFP2V~-}ou1qu6$MLF%qr=F=cM^^~;S$5b(Mti;%xww~@b2RSVwTipJiPMkKg!Z4gJu@@q&V2Qg zTQB99zdZkBN!W@8-#l^so$eY)+Gat$X;O#iJALd9T6Ei}nA=CY1n%@o=N7sxF~2}vh>r?b<>ALNBpC6gXM1;3umMS;FVm%gISM! z+^*l>)~G{$=Qa1jhCAz<%x2cl&#GH0dBB1SY2*jyQ4TK;aBiEwN>F}sTYHk4Z1#ujNP;5BZ0?cTU9op;r@mw20Fn+du%QTm$hC{F4^h{YjsP`n= zaO?Aws^0!X^A6t5rA%S@_n#u|QcafEy3=xRz0;TI{f0t>-K1TYYGKZ7iKu+>X?6>i zN0e{u)_q*N^KJz%3*$(q5~9XD_Ww8VPhF{F~ZjyR=#Dp)!jjNG=iS%H7I>&zN>wAmHQ>IFp zwtjYo+WrapR5)^huUsfP?{D{z7rBhVTy1K&g#A3&XgP^6g^+^amhbnY_DGq{+K|gEYoH1hdhtPcd<` zJmxz3%b&lig3R&Gd2;a4nMb?(u5OIe4jgvo=3@?j)EfDG-Y8IUeb=_*2c%%aqiom! z>xNI3dRIqx+tVV~^YHA0x%J0sNtGY-`%FtTduz7^dmP3NNnT2IijI@JoqYOQeVfZv z31`VGA00ejM0aK1^Od$Qpkm+y9E~HXF#a^ie!S6XkHBoY` zC-W<6XnjMQjwUco4ZQW*s+S9vZLx|zItw8udwe=XKR!huUZGlk=Zzu^{XFTKSx(!= zi?>V_|B9(_`mvUIrm3+4ko zN+$fq)gsy^u0-k%-UZGWuwkyXfPU;0w=q}tjMql<@G_($F$TaVOa-@7DW zw|%3&(!jGjmuPBn%_^aXq<({b8fn;cyI;$ZH(l~+G;7F|D@p0aymCH6QY!)8tS<;%LP zFWZ9_4>w#}9${qF-Q;d0`Ff_9s^YHow;tV>s%-$)_tHIn&E4w3O#fR~%C9X=bGU}Z zi#`2#gnWX+nsr|1rEN2zR%t;yYt|MOg(C-apT6zsoU+Ads*syfwVw0NkIm$%YaROx zvR2ou;Crc{*nYL9H%RV{?ZsfR{Fr&#p2|(kf+ttig876FbF1psCce+{p4>td+gozf z?^M;NS;x~8${$2aG`|QxWM!*?J+^-MWq)&O?JjEt{AJErMc?KvgPukUIg z$LGEJQafY&p_8*e4-;3pu9v2n8t*+@PI{^1iLLo~gFJkC$xMxfgHFsloH_@*Ct0aA zX8)&ouL6BF%C4(E+4W(`#SMNlF7G(!*jyi6n39{?epq&87XR8sIS;e%4_=vaWYgxl zn};6|ciy#5`CP}5uky;Xw)W@4_Pz3Wv1e}GjbzKmyRA*bd+u~qQe+PA_cCu?yph8< zRkG+-ZGP&;W&5pJT`l*rEbgt_Jv3S6{2`+A`|1nX`8W3!sm`+*@KMrm6P28nu{^!Q zC~eb~Zo0%2Y;)$pOR~O{jRkWZo+_xEU<5T5M`hsLuy;;rI?RsiE4Hn^y1)^48`E)l zxlFRVpxL%JOH{8Uw&B(ysdIXZFl7M^JJqgwv;}^k)+}2q1|PM_IC_2eTPK(N1B)3- z4|AH1R_zT;eIs!(bT-L-hxakt&C3pz9&MU3W8zX6 z+OW8^lRND>ICpW!6DrNYy}4CguR~{s+-ptO3UZjPRpLId%Os*H^|YbSN3X6kdx|b( zCMo7wSsbPYFm~w3#X{Povxgx zIntuo{PJd(W{5dW;#$tRr8AEGvpVMZyV|-Jh2n891SF~s{&Qcqva{d#rTp~wbL1nZ zs!1dS>^_B&oafVMDO|@k^4r9IQ={zWXym=Xa7$&hqSV5o>cfYu%Cq5wJD1Kf8mwDA z7bi)rJmK26(^&UFhLdfYicMzR;3p|&eILw0_`{>6j}s|#D4XP--Vb<~wRoUS`-rd?%ukloY8 zx*2`t?&}ZlSKGafv#;B;FRoB$p0@^Wz6STvMn#7JiHL35rCTXT;L)o$g7uU2X%4xc zyRM&kdS0-6ZTShvAWWBZugw1Zn}sv{6c1)*oO62T(x)jTxVU$f&DD^+o{I%c4Dq0X z&5`1Al7e^cESFPGBZv05$SxCW>v-E{zj6)JVfC_&`^(+7A9vKfShsHZljszDZ{#t_ z5q*)h74Dzr&RjM1pPfvmpQzND#$9wg&I~c_%B-Tc9wlrW}F^ z>NApP3JqknvTJHH-+*`YQNDDs1h|PJr>3qTBh&8txE;Vnyb1>`f2_{qu9#d(QmJ+;2vx-%e7l~KI-(JW#h$BIi9CEX7ax_8GWc=cneOE5%$Vo&A^WPW zYx;ML;O6_!6N|Hr=snD+2*`2y~)ZA+_+JH(JGIfkDt7~ zqB!6i)!Z{=YR;sK*Of~?$RAcP{jzRGnH|iHYrA+Wk7nrltbK2i#HWO>uZXN8<6BH^<@HT`MxaOi!8nJcWL|NyDg;v@$wN)U5HtEB&1f2aJ|1R1Dgz zs{p&67!jur1*B{6t(xM=EdQW&oD;y+5Pz_qPr+#;*YL>hY29*5%jaym#@Ople{ON& zGN+luh?t_HSNlcJCDj%&fS&j+xQ@3i86Cr=ZQ)6t3QZ|sA;_JZR^gE zs8`)IO?dfW!40wfgWCJL52sbVuUKolF-daO>)xLh z;jHhAyBZI7Sye`UVP4%?6W6n&jbys!fr7~Dhie|JGs+dhT7}k-5I;mMWM0-_3F*-J z4dO}{zuY-3l>GwE9?99XxFh&&$+psgk!kJo>t61@xO9h{?;7!yXW~D>d}>rn_f8M8 zm$+l`wU>Eek7i>v-5LBdKlEHYu{EUOLH2HG_j@@S>+V0%KMC>s4swg#d=Q-&-K{P6 zuIJ_}u4r%H1V8yA^wF{{`;)}(cELLfN|1a76J)yIbwpx%_VRBw|?vu^CM0Ia& z*&fSP5{b%?@0@#Pw^K(>`L2GydDN1}!BmlOeP-jDMK?I}lx9osQ=G)6sib(!#hubo zy=h@*kl}jeRM-|9p=p;^YxYjJGJRQTT6sH{BQ4wMku+4Y{$lux-nG;VoBB*jM2rMw z=Fz7#NK{;AkH{LQcLr0nKk;2(|KUx>?KYBH`ojZ0lMsa$L(4pGHhyYck_(b z?9=Jc56qb#y{YzCe-O6>nKGQkSTXd0Qq0#>6(m%tPA)X*^>T{l6T7iyPh-^ckd8hESo{O9k`@0EP*fRne%Ic z_L~;nrdKi%)})KN*7dQS54fdGB%>SiV-ga#8C^KZD0yCYUf)Oh!S#xdulVkMoSt}R z+5^ePcY4tq<6l)@6C({giT~1aWWMZitd*!%nt5^Et5?%^L>}5*O`dW&%kTZ=@XVmr z7Z~Hrn`h@p+ld&)Rj6IvIBBDj-p37We+7sr6L|2=K6{5MpPQ|jghNY93peRXtv>n0 zF6XgO1k2+HV{1oKzMjUh%10-nXy&aaY-~3q?uq?Sk4u%cu3mM4neI&xUt^njwKjEC zn{tuPDvgix7cE3MZ>e>Nuh+I*OTo>QaI4ot#e@S(Y0Krxq|f|6OuS=|Fg&ofIks)v z<}Zp7VWMyGd7mcU7u8>Fe&~hP4S}@c=PYOFO3hOa;gm?Z}Nlz4|(P(AQWEt5aCZ1d#6wP zm%4QE&tM=r&Im%BX7o_HYifgRFkLRB5sB1g7f(pQhC4an1?VZ3g{0J|Q_f!gMo=yj zWe(WbAh8y9LlXn{vFh?*ABZDdvaB6SW9%vtG|CFV#qvX(nwgJm(M&-+_%hAA_uGv6 zg3MCS8*~+#WmvTuHc^|D;OT{un?8EY!<=H4!i4{=?GH?;s3mmcUqYy)zxED6c!IZ z{v9Rp@=Xa9o5-t9_ff2^bI?ah1;`X<^_U&Fh?;pRpQkT|0%6R`WvMo69w`PjV(cT1 zW0-8DPyQjKk12AO+8Zzj|tAI>eNAZ4dtjuQ>i@P3&kjfZ{g#add zlizWA3E-FNzgrR#xYv7T=zq0f)U6}N&(4}uTsCWfcY{++e!tdXyXc`=Xcgm>K6MIc zZ`x7*FTw=>qZ9l$lFexFh2~<{yuGFzn^PVfxMWnxI-Yi8$fo+dO)SWcp^@IhY+w&0 zgG=9A6OYF**;&s1*e6PNFLk2nMT1dvO@UugC7hG`uRGOZYJj}v+z)v0U2Th58}^wL zQvhEUtCH+f-79-d)XPF9vS`9N(o3IO2|;00j(JlCVSorDQvl=r|JM-!08H675NCFC z{|8-nB)vlsS$g=hQS>)@V{r$An5({DGs#SVb=nc(#G&DjL6>l&z2dwe4nwkHhu7Eu z$2SiU;Dy>|z&@86G~OvzGsnIbo^q6dE=1wR4z3tgS+<=&thYY)B#z24syqZFGBOl~ z35CLZPxyq3eleGqXaq!6VzOy@&))8`CTj^Hh3PvUw+PehnMHM04;}0x2=7b42-ev^ zc`J($S>X*0%GSx-NL+Eo+DPE$95O$KL&)cK$;WmvHOWlJS=9d8_PujLx(0S!}!!K7e`v{fff?*FS{gHU$uOUsqJ4LV*l^ldYF9RnHrCm+1d8ka`f(E^1UF(<|l4f*fy zAi7r^PE~8VT3H+sC~H|k%^m;2^BC*C30wgJWh6pUUE?g&5Ml25@&b_>0uuO>!YQPm z>$tutmZIdv`u962Y~NagIBqDf==onRT?p2-1si$lM~FX>3hl`~?96327)9{|f{+>6 zoj4J{H`8!;`f1R5{;%jS%mFLmrZ!z6Ca2Vo!G$^SY)l|V!6{rc1~zBliDpi~!xu0W znB$+b=3YI)!h?d7?UDPduf=o9DXO3s==LYzUJm5Xpfsqb2`L^i(ryG!hgzwDQ}vBC zeLI?84NH*UB6(N++j@f<^$Y#Fa53|*zCx-vS=ckLSrG=ou|Zr=Ov^&W3I{$9qTJL$rWc z*1}IfKE?830$*-;7ahK>CpdImOzY#q8KvUk9@jA55+d`O_ZZ6S>Y17f+bu&`in09En9=yCm$GT|Z=;K^um? z)~gg1;65&mf9z2&JwyFakF93)<`W5RlT_vTqBg@2nGAOTs2Uj>{j$~RFOW%IB)8}R zOm!o4I+J<@w8PwVo*jF)og?5!dFZ07m4&vT^uYCz$$sU$q;~Kl(?d7g;XXaU0x!1W z=NjadwA;8=EBDJXPQsu^r@SMWPc+=hQ{nuo`j|;dql}#da|8v!ppE4P5gfK_SOzoG!wf zi9Zv14L)S5Ni1&c=onnQU6&^nn-zyk=eQG5-5d0v)h1p?@E^&mj5Z_!M**5{ygZQK zWm|hX2AnB&m?83B<^UsRq)Xj&Wc*ZnQaqNQdOjgO^DWg-D7O$?j^x`UL>{6Mgrn{5 z7kkI@@PV8b3DUZ>2)w~?R%>Jp2klNP)b1;pftnNFWG|P5M{QiK$wACH z3%zUcJ>RKD&R}_NozEckWC`I<8Z*bic=S^-I}BRq?a`;)>^-oR2dh~DPPeK-L&i>o z56brpX%ILr`USjdX0XZ%jKh49bQ6b_j=7~OOIZ>d9W-5z^NoJhE>XiGUA;0k@&~ai zaa8!mBAjV|V7!J!XmMMsWmhE@PNrHxdLd#I-TTtm5JK`@`Pegl&uXXz9Q`wPvg4bm zBP`cVUdBXpnVi+b3$2Lj0p~2S`8=n%*@@4Z5Z8y4mWTh)5DvQj_*4-eo0cIUkY`VdCxySDjv4MJ=43&B~&tmJnrj|y8tj^1L4-i<%TYtB@ zeP^!pr0=z2`{MwGY?sevUGP_6d+@RnSKVV`w%m+~{_z{Um?nZ=1c7D8pEN>subL9< zpUgfyMBhf;*;|vfF&05NamO{aznah$U%yBZ^wHIJ;(n)eAGvcgt{q1rzrtWILG^*v z0h8y{anf2%<^txy5&=zDNz$$sZO`;?#>BiO-q@F;0JKHu7c3Yeh826Jn!&I;`+F~3#(KN*D0XXf| z{I-OvufFLZE%cKrJ5)-Kdmn7XnF*=1J9{GtFq)(T!vzlb1=uF)RUY-b6UoDQup>EQ zeXdcOig!vLYq3Ey9E0fGi{(Aw)Kmd-<35S-5i%BIWn|_+t0#eJP-{MVqOw3@-yt=n z+X39<$t!aym5962c&+k84-MOF@)lMzn#B0uEa9RDj*iZ6S9lj~ z?HRCQRoM*cNGHD?9HLrdqgM(oz4EJ6KHi#Z?eHSfDu9TD>!`?BMXO<_9l{ z#2Y7c7{k3A{b)T)PckJ4WU4kne;8Q0nR>-zzIu4YS-%d^`-29iZ(=Iy(bdds*6@aq zX`NEiwA^QsV1cR!8#K6fD>@1RNsPnyHoi5U;62-}vHCi$y^bsV^Ao7m6wzOG!&vW= z%t-)Y$wC@Ym4y?xaIV{r(ua%|4=mL81IPp-#{#%9K>?HlJCT&y6C-;*#H0?XjS_j7 z32$B=AV@JdkWt@7yE5pg3*&&o7>>Iw%YOIYwCv0FQ?;7V1Ib6DI(X9k^HvE_yb z^hJD{EEpjzpx*5~X;;pYALOx;JV{i#9S|s>>{$iuBh0h z_Wl}mur~&Lzm90I<_=|+8C{y6w6U!^+>M85#lLujGhZ0bUs2c1K?Hc8ky$CbLy23E z#kcecdw5hEQMG$JlsZ!K zqO;|bRkjS2@d%$eE{4w6iTzO&lj}zs^{*AT&OSmUkfOb(P{XClv7-I4s&81Q%H#19 zAli>m-{ud9!J)s?NE?|gpWqQJ0gma{wynQ^h2rG)c50!C@k?> zU?b%roqJcyNQ=l53nx$)7FxfaY2MefgUx~GQH^}pnC!m5B5=<#uC*z)J;T8M)si$^ zxkp;WIqYRU%*f;s7IcZ>XSn;-{$9@Sm2EvCO-#C>RDG<~yBA_C_S-2-w#GU=EocOs zF7J0e0)qh3@}VqxeeYe>9$4mTAIQ(a%lLyyJz{87{kf%SS{XH^86#2V^D4%D2ZW2b z5TudCq$0RA9`B3bl;`0+;}le@*E4xx{;i>4P8TzPk^6C{kLK}EV4>fB@R~@S6sPqy1mx~q6#roxsu$M#Jsb)2 z=x(a9DB6Dl&|j&BRT6#+P{?W>4w{z~r;Om`4>zYox6(!UMZHf5TB~Q1+7?iFCXwg*@<^fuY*(f)HRmT!sa;syOU?Q`1+R zME^kF+x_UfS#zz4^AAdgfV!h#W)YJk`7-|>0zyx^@giH3T_`rC3LNFeCYRtX7B^WA zKI^{$Dq04@-IYH-Cypo}(m<~L0-r5v<5?X0&>~jttrZ55GtO9K<9VhpC&}*SY(IFD z&YEqwUTw8d3`5@(2;mLjPIUxSkk;!hDVSGlDWtZVxPz$r+p zEHSAinhJ>XMW_$d_~sd#+=7&361`_*!yYQqX7v7Zv?rdb=@_uD_KnmRIalo@DI>(a z!_!GKG&iLhkz(!uR)7f~tY%ACLIvHWiY7`QMH*GYWc0Myfox1xNDfj&St?|uXoe4I z&W4>SMWYalMv*36fnk;9Ik6ev0xak`3-}SC1sbEUvPNgal#v4YWt+9fesuh7@D1Cuch?Fy%W;p z8L-4gm*7+r8DU{_tErNWe5zSKiQ*nhHMzO&f6M|nnV$Lo1odwm_TzL`Fy47RL`@n7 zZAah8vWcZk6r)0u6s8_i$GWhp4enxcj(!+OibU8tdBaNFY$-Jbh6>@5d!2o%8hmO} zxn_x{fOe_z{}4rRo7ZS-!i4|r3p=nRl0qTu=%&vBzV+VoN?R~*o`i>&`=SEu@!@70 zKq{|0htkSM>TsHi@7`B8fq;xq@Oi3EGD`o+e+Io2F37nXQyt!vgv^GE%~h?saIXW+ zO(*E6<0IivJp@ZMwtVj<&e5K2?6}#ufx-|1oMk@xdj|RruRZGPH<(hRFfnxDy{Uex z>*^HoU|W9j*g1C!vGD;v;DlRv=Lu6#IXyd=v292IQA@;ajvdq>zS~LrV%46XAY0^K z$UfQ!ob)sP@ly*l9+Ui%nNi8vJSm#s}_Q1#@NO5$f?mKHdRJ`icHUJ4RN+@L+L zNIf6^@mQWJV8MZ%vC*F0kw9w&b9;VWoqoBR`BZdvB#$w?|GW)}3!Xo7;b)bcgW6ke zziJ*a9k4p_R1`b+8&4QxbM_i^89bsinH=bhxv6##g`IhzoJd3iR&`iM-o2+0;@#>r zF83|{M_qY;258wl#aJB#!vY>#QoHcIf|CVb(!OZ+VSmxk6jR<#vt%dZ%4g7}4E-jB zI21A|bFOuk!<`qt;4|402+aN2o`?ztlB}`Y52Nc)*!Lj7Jg}4xxc!yEi^i0@!SAFAmzAxJ_rPi>&Z=1W$c1am1c6UV@(AEsbd5F{S^8TFE zFQvz&20iZ;{u!Wi?A|EP9bvqP3$$m3=ck{GG7^bScjTRg(Tzz1LJbyB;wwbPsfRip znnwi#*YZFB>cRNgc(3X2iuZ8Iv4Mw-lKr06_OQW2%%U3Z~%Fh^o!oz z(?CJB)Jull#K#m}Yvgi;7znhH)V?l3bP9l6adFNx;7Bl+XW{FIEb4SkSU+NAedf7* z=U8eK3y+y3aN$JWb?Np}F8)(-i0FDB4Q&_>E+ZV~y(tK%AD(-?q3r>g*4|A3VYO3p z&0GmTU8vJV8G^^ZIq^BCblJ*LuL^OEPY4m(*@z&ub9TIPf37X7PMV~ zl0JfWwuEde(D{Akh8F`E%4T50a8Lp+%3G}mBxGduh#S?=>|zq)YXMA$ePqperok11 zHkDgYy)FRZgssy+gp!J0FMq2B`_7+)zDSX2&xC>EVMTEc$PYX(65p;6hUL$@5Zf#` zoMzt}f*&cVhQ$Njj=6eo#(Pd~bnDc+q<`>gqqIv?bV7W7Q8|Qh>k~uDsc)oylGe)0 zC(LgoFPytm@(pRP)$>@c^FjhI(6o$Y&&QThJjN~LA>Z>bQn@zc6P8f?)9MM2K#h#Q zE-O@)3O-#4BEW~Y42#5I7q48MK=d*)RjUCSc416SS@h&(6@*u|AXTvOgCXb^8eU&z z*+a={w*EEwm7&7eCnt^kE(U3Nw1B~n+RN)fvdi8ZuH&aA|E4*+U#~k@WWV2wJE-IQ zX4iXn?)c_n?%gRLdEL_+%BQ|r-?~|df5yMxTR8&_$BW_Si5gf$o^bAaEu9^ihCY43Zu&j~=>*BUx67WB$y^*X$v-a)_CU z_aq_Bv*Za+;1u7hhmmbTEo8|~v)JcuN|3CfB%xGXs6Z`Xpj<*t&2aRDS{z68h$d4_ zLB<@DayLznm4w&&B;a&7)}^kqJvx)e0qds4|5t&*u)Xt!0_O;Ofke@oWWN!^+BPCY zZG6VV-5zYt#d=GC+%9n8NZ!y98GHf9DFw)vYP~OIFS~++<1ag;D|Kuso^d$w$CUC) zmCFUZ%jAT{4liqAp=Vf$A4Iq4uK`1K6@Cl%g(|0a$&OE@S#4eUiAC0(a*1~CxQRyg z`@p(Vzb}KD^X+^4r!soH24OGKu4vgkYTW>DjGLV=W*p`u{=!&&Ob!I}8M&$1BB?2T;?6Bu%tZ>}ZjVj}nSiP6DEYlp#g(@deQw*7N4*rq8)+oH?qA8rt=D3KP+0E= zFGQZ)y%X!1TRt)fHP-ofJ9C_M)L4oN;_(i`aE);OH=blx0yK`=jJ-Sd|*QzpR?@jKM z*6gYz>%?M!eu>;;HG#1`aGyj?M=a0XJ$yJ8Rm&t~yH#%rM0CH0jO(tjxi+h@5uu2T zUIfw8$-lB8h98!pB3mOOwPlkd`VvJ_q#iY(TL}40avmOuw#n zgc3Z=5_%_a?m*nqYtnW^tiddcPWDe;E1+7d9KdvlWyO8@xx9g%Yz-tLd-0gR-5v>y zhx(0{HRld5OYFKoE6DhlgJT*LgU5%cS^vaVEqVcXtKY4&#_2}Iyt4`U{Zli%Jh@$; z3Iz7T47#@239=Uy9aL2)o2cVg<8glwzoDfOhdJ6UGwJmtnKIW=QA>XxgMVdJ4+%6q zWjv_hXSd`uMb#OCLm|4>xgjH+&7>C|F3_6;i|Sla-8d9QdM6kK#+QuHb0F8QI`lJz z>-b=CWD48v%r$k4uKSbw6-;;z5QA#p9G;!OvMbqmBQw4G2`og~+Y=3ZL$0Id`#FFz zBgj`3At2(arzGpsliIvO+}VsflvP^{x|C%xpjWl&0?*z<3jn8IjIMD`y^716fKQrUn9 z>$BE?!dF-7!r)m%Gt8ipi8Kr+s{xunfTd0Cv)GbSRC9lATQzsGp%}VlZy%`PFKpmr zd}mPt?!_3MoX*?Ryypyhn+b5G0r$7+)ay{^a+YiMF#plkL!i|?KoMk@_gd>ba{UHU zs@W8Jq%YCra|Nv;d#DyN?k@2hmck=MRX3!KfQ6}X?)^e-j8CkJthL$1Qvah=CeL!b zP%-yfPkZsdRJGK<(^u@{Oo+j&98ow*cN9V76%Q@nI7UFpcnr;XufP9BT&_DRDJh44 zN?^&?1T-&h+MN3YF+10`LSLI2WS`J&+dCt*$AsC+iJ2NCbS&TNQ4;WH=w4&B2{Wxu zqr34rvgIHiN<=v7AXPhewDzUG^0x3c;+^whBdIS5>6Y#4x;sL~oC)Gnb zm=IdN-aeIu(294;LqapJu^2Ix@i{TB0jjfnQ=iQNw4RKwN0HcP7`@Z(tWR?=gUD2p zK>s!i!RFb9Jr~G~-W3Q-qm8j8@Ba15>D#t_e9b43b(=47mEt*o#e2Ri<0ZLUR#8rt zK(bwbvHO9i`;Y3GraDSVg#L|N_bOJQT)B%Fp?;d zHWf$8L{i&{kYd4N)0~qROH+>E-w}Q3hSj-ZD9CRULj{*olOaRY-cPLTCc#G*w`pj! z38m<}ki{!wRdBE(b~M0RLu1699GIu3C+!<-Z&Dd@^Qj)obOcK>@24bNF-MqgBwe?l zKL8-23ImV%IObF31%@5%%Z8)wx8I+s%520>2wF9Sk^isCwNs*e_b&ru@M=eYxfy0v z=T)`UpNLHUSfoFId5&YsA!hLOGnR{xUK`^WGsSu0|6JCnuiNOCP&K(_Z6$76w`^Lc z;|&5SzMQ9;?DK71?*X>_kr#61^@f$ei!xGuaNCFdKO08cYWcz75JOptv>kaVgb%wo z<5P)()Q~UyA1&9wt;9-ACuXa@Q%`O`|NImfh=E#N#j7YTn9|cEd57F&G|8ZO%j9Rb zcn^?$u9!W?Y0Q|w8)^Hfb#)c~k1UIcAW#Ef9boW3-h7!O=v@T!W2@RK`tke#1Dc&mpdBw=xq~77;oE4AEs=33zvX`?AR^SXnk#En;>9D| zBn&G!p*)JD-cOo4fT&N5zN3^+J0X**b+dpP$ybacYFDZ>gee!4=IOE&#E0QZL7Nqf z$VcTVo6A5b26O&gN>k4lYWW?AO8&nJH2?s#*719D^Cr5&KBdQfo)62DSG#o=y>>bHR(WQ!!H19*72{7jQtM3)| z#>@0zo3;a~M7vQLJWMAD`VC!yuvQ$)V#hBU6wJFae-KFHZVF(1ZN--BeKsJr;D`Si z!v~t7WkdTT6J37VlQ~FCA@h2u;o6~^;2)?2LGF0SxSSO+aal(f>3WD2DTTSYJ&wA& zmAj848MxMULPUOhpQuAk8H*YK=2`@j)D9GJF%^X!E_P`QZtSi*QLEtP+R$VbpoZFg zdkw?hblxwAYvFv2BKpAja2q2!Q91&LAAWxb?D?)%5DR`Y^5@oSb(M&pJ&6i+6B0fi zLyaV^#CFKj)yYY|yk$MZTpAvcB?mfF@>EBIB))^*;}?Z{&?eDDW5cewlbAb1buziq zlvWeUZ6 z;}%$@?u81_6iJUFiaxVN zvbe&zB~`N&YoOtlkcNwqMIkaDr{hV?k5t#z6Ghwa)%mn|YaOZSHNpqUqFKD#+(c5p zzhSZ;sz$skZUw!t){b0u*fibXMa)23!^ydann@w2^NI{TtSFhOvZ6k)y(fp79FmrNxKH3TG27BP2R#JKjlu zYNpn;@)5-GpEv3~4+JM6l&r%4Dm8A`w4=^A4@>cT&23Te5a!YscEW*ReE&RTu5wddpU zn6FOD#-B(#WMIz_%f;KDsZ?V?1(k>#Yha?as)Po|hdr#m)?*=iTq53>YkY^Yn=pU8-%sG(~@wW)2iP*$?h5al^@ z7(#vS)^}FcsR~Z1yprw$p?}?~8g`y`gnR%11st#c-Mo!xQ<<0IN-ZJji1JHR|I<+9qMS zYD2#Z;gGDi$Yszj5&(NoIEd{vN5M|NB1+WC5!^QqY*7|FAmC!zP}jmdehyRuN*-Dv zy%~Bhd_;d|wR$P2li-xnJY(qH>j`X}fLBi7{5S-5L(-eI}Q*Iqa=k6zdsAkWJ@k&v|k%t@=sIY|_u_`YwbAL$$-TZbQ}~ z80nk>rBv7SjxN!DiJ8V)*L^+~J3pOEyeN0up2*vTvW265#iU6leG8m_4uf_ z|5S&;08`MWy9z|_a4kES&^GB#IEzLujx2xk^;wmv`eNSQ~h__%Lh@-JMM>e}JimE5b-}utj z9#9)$eVXoj$4E8@7Otu)4fAbp`fh0SSRXI%y(fEr8_$scaEf-t@-ER}83X3ag$U;4#GoN zfNBJBmiq3%8H6e2WE-EgL_7K+8R%d5hVGxu zM5|g`BNj2?zT8Hytkz(QlT!d<)>PQF)$w>{TKm;Chd<^+&UR%}oYojqpCYshBQln! zWgpW0vcoPSZGb4B`p_3~vhHpeV9{5%bV4;;vP==n8aY3+vGdet^1JGpjD!4o`pIqm zzMC@!ZK>NIeF^w?bKQil>ji8FWH9KeY#(Ne9C4L5k^4* z??rjyKn1FQD7KaqN5)d#E9x*$+L3!%?91`d0%ZzorJp9Xq!-azVGKjA6o~_4_jGD5 zSBI2}hedQA!l*G1-ru@stle#jw5>wEvN0wtzv_+9clG$GHd~+6t|xci<#aapkm;25HDRf!-hxGQ;ji;(X0+xPXnVL8r-eI zbLk9A(tr<`cZKUa-h=3D3t=>c9sH8aIZ&T7zJWw@{j6qZ@uJZ?w;*D4-pI!nQKOz&s6ETiD`)70p0Oe3c))Yl1Mn|WOC9Lp z?mq!88O2qct`riTKYtt!s8&@g3Q;hLgo_DFX{@)!h`jAGteOxM`oJv52dG->@&bq` z9yTS#aB;nk(4HI6ssFefmDPc;`{- z8XSbVm{h->L=Y9jg8QkIp$1o!1w^qQVk*%>%^oLhd(5kshF~e;TvZ~3XeZghi>&xE zA)2$#Cv+k=uFl5_D42k>3h%0u@5dZhE<0mY%i})Tb&lj5q!0Nwu0CRJP z<#YCX4!7G{B__JgpHx@DB+wigQ9HruQ?G^(iMN#E^J>3!DX&B`$BF8IL@YzVf}h>O z&O$fzZlxm}^<8ps%@Unjh0BgfWpDJl7A!XJk_A7A9_kLn@8Sw`oHgw)lCDiTHUZ9J zKQtc!8@Y>L4Ite+o-S|&URCfl#a8KJaAe?d= zXv^9igtIUjj;HO0=03=tH8x{q+@1sx3Y`ZhUit|SW}Zf~Q_3dXHDS8M$9}yx^*3>L zmb6Lk?45I+*kE4AVRL<1lFUEYzjQvZ9N{F}tbxxL{tC>N zGs`sOsVRX)Kcz51l{g#V7*TX=LcFQM(rHEanF1d< zUPmvupJ(hc=Tcm8Do_0W12Hu7syBL*(=Tg6!uCpKKVYKqR<^8G%4YZ zKfvw-$s0Nwlu=Ki(#!{x;yDdqeKNx6uNuFF@W-&V;s2eSRAHXlmNiuDV@k@%5pFEB z?1M0bcVZlLNO-o9CO2%2v#um-_*ri<-VZf7BXpi$hcebmLz1Zp{Dl87y%if1VVC}c zs!8qVMLsZ4K=!(e3_oi0ZzG{$rkny0G;8?r1CMcif5h%CE2H|02Qf#Cj^iHSVo_yB z#tZ|A%)4anR3xw<7L4@o`Rt#8Q`|)#cetxBf^5~@wMa9g+>_RBkX`tK9DZL_c`TS5j-?zAU~h8BC`5+pr!1t9rb|5qF2gCojG8~>%N zjSXmZ=H8MUUXvqV-`sQF)|0Hn<`K>nW4f7=xg?U|?rA*tWu|2e4I^rRk8QO|^C z8zaMk()!a3RI3d?zl3t+;(jGKSCf$BQQ!Wip1O(*h)d-r4f8_=JIeBrZ1?#7Ryh56 zjl>#7^c>2*umyCis6RT%x8=~Xp?wk-OOuv3u~(S@MQ=% za%`6ka3dn=pwE%81vok5AeetOyYCUD#py{V5->oVE4^3iO-D@&C*9m#rSn07;G&Fn z7sO{MX>UGtE5;x&d{m2i^-2UXb1qOx@Ik*mXKNG&9R)07O3<>eQeAn=(bKn4OsBN8~neB}&iOZ}aJ)Yd9!04$}(=z2g-i3oV zbzI%>X|kP{kYX!bd(7VGxGZR#H?m&O2x1(qQs(M^BTDAhAAGrDTH5UZzIvdzb_$2K z@6yGAqoC-DaoyYifdQ9ELWv>RhvvTe#_D_!Y{DRGZsLmtwZp|UfP#=1OTq+o`HCq* z-dT#do6;88OaG^8yxpGh^^#q$6uQi(PWfjV%;2ufLP%%UQ}xgL=9eO=2llaZ-#A>f z)=y;vC7mfP1_J^eGnW4oFj?PamDlpb-yJ?>e-W5(Ell&q#DmsApx+mS;Vi;))W^B1 zKHu-}zd7c)m()3SeZ(|3&LH1;0uEu&9%_!rg3R?xa7e$PWlP&!0@vV+Mcf#F+-PuY zAjonMSs+{r+62(Y5BZsU1t3t@x3NhNTL(Y<7DF zO_3CviZf+-2;|T%#=+ha%cuqlx3hW-Om%**T39%yLtf}`+jgG)u;_15z-=)KW^2y&XW- zL(czF#OkO>u&)9`(At41CzHirX);=smCL3W%M%>nH9N;fk+$LF!}JLNuQ775+`11Q zc9#84Lgu##H=v*P7ZiTbXMZqCff_J>9)QX=DHN ziR=Hwo%O8_*f=H2Xq02LmG<4<@LV{Q_S5{t_KLVJgsprs#P0J!WBu_^oQ6_t1T1t< z0d)id-oT)JZvG9Vnz{pKlj*?~q}aeUJ--U}__A$UzJ6qcreiP<^a~uAsg=(2{IC~J z9Pc++CE1MNeEh&22?jAx^Qtzb!gztCY7=%(m7ooaiY-)b0n2HbZaYd*<=b8%7hN-QV$)xoyVtAx|>fUfl}dt7YmCtceg$~`!Aa8$V_u6XuwQqlCm5&d>aZ?JKeNnqkT2TQ;BOo%-)^pq)iExRh48k>}e+ z$$o=#v(dF6W+O7k&34Bz#nlInGQ5GXGl%?VV{^)vMeP?wc3Di-1|0Se!k1Q^;SMam zccvdzLK@qfL9OCfU^M3VAd>c{KJSddW$IN2lX4l+WGvUK^x+j#b-A!jEtugvI0HqB zpnP2551C6XQsd}_BX5sQsxB@*5x8eNh0~+g6Xv9nJL5AuP?UA)##S3VGx|fCsvi^40+Jqg^`ir*z z4EkD9x}HH#CU)QZ>beV+B95mN>ewA;X-a9tts^7rbm~P$(-gT__jry`RaD=&H8rbc}c_A%JIR(vqxn9JG0ZL$+V7^uIkH#@4ovI$dfI&)= zARPjM^^H0j{gAJUkz4o91{kvvc>)i@6tM76UExaArAM!qdpCQ1 zTXpzt(hXm(ey`6?U#?@Xm#z4%pFceyzB?K}od}P${lo{%o)OjuZGNVS!ND3KHjS4~ zZA!&44oyUR@neO^?nf8=*23d)L3eD4EvUa*MP~cX0R$nsiNu~hvnUoY3o#ZP&u%sh z`?xxMZ)X;Orh!Sqf?;JU<>WhokOvIIn+V1L)a}XK z;rj6`F}-qsYeN9ymi`zH@{4`(Fjg}8?j}!Nk!u#9b1wyA!5cSUuzIez@dQN-f)EPI zn%;)TvEW;?q=bX-l+8ew{fke(9>^&_gX{o|P3h)07+I>|9FC~uUy`UA$FQmID@XEa zVw3!$!K0&i!TTc^Z%g*W%f-YKwy^3#CVVm}9FbLJP=;gXj9DOFTJ_x(H4M=(^E)w5 z|0{OyawRFa3=WujY@v&6_X^j6$N^mSGob(wTkiBWcKLiA z0V|Aa!ooojUmi4SPw>KrY#|=*!+nvm)T1hpGy&xi$`+kfu$oSmj4CX~qG@1Ys5ga= z{SVWn@N4z|+<^%y>SR?BM3*lF)i#imHw@tp&APQKV2fp>B6FOIlt5=<|9E}VmoA?j#54e0aNmI|fnJb7+99S26u_N; zprLe+!FXHIye@HRQ%}i%D=R9rv44wyLF1!eWMJ5y7Qm6f?l&_m0K&S0D4+6G1^;KHp)q=_*{X9xnra)t z2f4N+UBvfs1V_TJhfM(hQ(!+VT+qJKS&v7$dN2?{$Og0AeTNV(1u>_-e&nxnN#H%{ z#$F3x#2+9_E#ED0I_8No;eJcA-?`>r9Kb+ew7CE8aTp|!WIX?xx{!FI1Heg4A+lYM z74!g3d2bkxOE`j?!%WG7>V{Mkg8-VK14Ig18+-(h*vCYJK1wQn$VN8Ka+r3Tph!#Q zW=~EB3_~@E$Pdwk?I=@Ml3AL5;+b3J`f+-=GOawi#<~teh{1oQCf>%%b=^uOdNFQk zNe2Fd>RN@E8Vw2-y14Vnd0k83VLv|tB`h@F*zuRGrRD?)WAl0c*2UV&*zyz#xLWds znm~;gTKRhJ|6%POV?>F%MnSi2+qP}nwrzKxwr$(C-KTBaK5g66-#g#jJGq&;$t1Ir z+DZMXAC=0km9_R>&*0|wq3cWmy&K-(t?f7A46d)VKEn1y2t@I>c0z3w zd87h>k{-82LORWdUlbuWhIpmCqXW{4u`WK1twga5MR#!PU=sMu^})7gi3nFW&7Oyy z$>k>Rn)vNs=*IZVYg;rc!I;19^QZ#e*(st(cX(fBe{7E#T~sentiQ}p?^{etCZH#B zU#rn&{b3H>9pB8A3DXe$lk8$UG-j+}OxF~c%C9j{jPE&*u3c$NMmzD?(~22u`;%P$ zPE1ih?HCEWZu}5|J;2lIQ-QrHjPTFI0}cg*e&OAnVq{_w{@#<1Rw#jEVU28Itg-~{|_UfE_Nr6ll01Pg$DCtxEp z_$L5Gytyi^<+Mn9c#|c;eHUmsOF_O_g;mi3t*qIQ#e*xkS1XnZnP;kwJ=$qU0N72EV#&(uI)kGERB~zWtDQpajlwXBWL94p;U}|w^JN@@y zJb%{)nLL;@wKMEq@E@)9zk-DF*k@qG7}O~vX1~Lt&vW7;3Y12nDkN782{fHEF-D`* zL?jl%5Gd;F;=AE-Iu8Ckm1HR59^P8g*Iv-jjTMY4`NX}BrtK1uKY3(wdcQYh05^Vj zotR-HN#MmWmH%$b@PMnK+R5PaAQq6c*rpS(^&hGi+22shNjy*oPLdLgX#_9m#lu{$ zQOo^yst7{>`}>`&cEj)iAa#lv2mg*qVw4?71P@&2e41AyqSNF)qu(H=3ts*QF?S0m^-Gc>rk`=h5Ow9VL`E?+>ITy9dcd<71Fh9N3E z00^Kwcr#`tDZCI;nMpAg=maX6mF7>)6$-<`kk$zmv(DTlCnuXj&R*2LbMBt1zAxw1 ze{DI4Hw)VTi{DGS7CQikNb%M7jGY&I@tF&^)&ij zSG2zsiDn}(lxx93&23w3DAV$|xdY0l1_b%4qm~FpSo6mQZanIlBlRd5I1$~;Vewxn zbr|99QBxf@GvDEhd?2-?Sfg9+k5|39ehlvU<(?^m~y-M;6_1ja_|9ar(m@s=t3Ed|iYq zEH8?v7iJF%W3*wwtQ|c;Ez-=;gZ2!2jJY+mr0VZETzAbfQ(6{a9dwK;dQgmv)WlA2 z0(K*zX|opnr|R;oY*?h59%J)|LyyBIB{btlozB?4^FEI|{a3G|u2`TWZ=X}*(t0PX z5|LCc5&Q521J7sy^#+lZ%h5SoA>#xh=85MUjSg2?<21FBKfcU!i;FdFoTFQ)eWtEd z$k5u}*pIG5S*zh~jK2+h?Gtr5WtV0gTnMI8|191a*AAM#NAc4M>H;6^*jdad%Gn=B zUHJX5Y_!M#4>C07uY#82wd)K@jZt^MN&lq~bjRn_&I#0v@b<$&w%6=4sK# z!e;rH@`wA!Z}X`QVo{o4EMt z5HZ^CY1@}<#TQ}+b~8`O8gL}#*1mq*ISFWERsn^a_pDN zy#$u){?Ej71+@Nx^ysGv#FqXnOr~^w_At|*7L)ZHek6C|B|?4VL{z$P@>HkRg+`uv zn$`RI4a(ijAeII`MK=dx#Y*S}_2vFz+Hebb>Dee{1>5oe>tKTaGNSq_Zp$~qYsR_$}1yY2J*bOaw z+ym>2xl+Z#(~=_FDMNQr==3<6q($pXc`ZstN1m>N_j!Ojn#AoHBe(<>S(O}7LizAc zD$_9xBVUY)c^Vh!T$5`K@k8hl<)%d7LQse1cQ$>K%z-^oASm+X&nVh1AIuvz0XV>& zI{fF+VRH{t6T{Px*YgfD4NR%+@U6K`1_bxB0a7RS>yemiXAV*25-P2jN>XziM+dK1 zn@PC6eyg*{3BC-s;B#wP8ZeD_;G)*8;&7Nic)#( z#5TCBn-rGdMz$8@RdtKL7+{EKnWx{SMRLgT3YeZ+W?L^%$TRAG`V+M0W@MFfmoKK~ zl%{Y&o2&~Ipw^q6{vItM+ZU?sI2ioU?UkOTi_L)dRDZ3@+qT9Yf1tz+7#{|YsRx`c zTKh%!UP1R3`B!>?yfPD5QWGxdEZxUcUNoM+hCVM5^9HU70d7P4&Wj8e6io zaf+&(yEv*x6g^YZ!?p*V9#kxutHnei=B?raHXe4jk`4#0(O$^Ti>!(K?!nJe@2WYS za-*v?z~s6Ff<2xVC_IH-^nE1WbSXNOLA+D0Fibn1(pPg;YU`n(_;@Y3a1?YeR+Rfq5aNleu;DM5nH|>-wMNYe;34 zD1gz5=WPPCUN1m;b+}K~h-dwQ=GZruN@>Yt@YkKGH_e0U5s^U(V{ciXjmw!9P=|{LO<$jj<(qIvFfE}+_c*0A1^*biJ=Rl0uIn?6$6v95Z%xNRX zOzENYi1M^^SWY{pr=_gS`Y|8p@fReD!j>bmVW)B)dl#z_zhH1W6#_Eve&ob>lRa3a zqQS(Oa=+@1D0cK*DmHXd9D?dt7Y={qA5%u$A)31%uwuo&dyF|Xg2S&D^Fw`OC34u* zqCg4gfddP1s27>ry5fA-;nFO%(|^v}RF!GSppNZsDRlU5e(&|QjD+@uIfa2HxW2sd z9Q5m+(EsYU3Sg$0k~7h!Y;(34QmIr7ML_G7dzuop?aGm~L>nbk06>=k6>!$|&mLq}nz~A;Nvj`X z(n?#p@JcylWOAc`2c}c5I^OLvs0zo~YftLT=dZH~VTw$Cu>d)F`w=h}NONSML6WhA z5v*Y@3a%0i^$Z4!KXc}_hSXZJo37Evq{T>Si?$^hJ@_ma$wUx#8O0ye=_bX$}0fpGF8Lag6GeSGK;ITV=?)~0;dEV`7O&z_Ohu^I7Yg4+ZY#Mx? z$8Wv;YCE|q@P8!qkGo^R+^sJ)S3WEm3Qdr@{QZVt>1%+akIQn!qLZO=OoN0Q^RkGUFMQ~TZFyd4 zqBlXn|9D?3auBX?fOiTUaMLn%);haps5gm|F55i%<2(y6?Gi;Zw!2_83N7f3pEt0ysv`kOBLXyME4dZIvV(fzv-4P`OA+ zYjs#<5{d{P-np_Y2^)hY@ZB@2{qacF`Wiz2?EsHGCbVfsrktfEmJL2pQ}!qcld1#+ zZ;w(>$AC#!?MMP;$C(X-SD~~%i;23~PjgCaQd)t<9js?sCsB!OI7>G=_S9(Z>zd*Z zenY`+SVH$~#`vxHA_?Iq*nYg5iqyEGH*))ArZH`s?J#Hv)>c)7wFPAQBV6VBGODw! zF0RWy7d{K0PV83UEC>0IK-RVGVz~Tj(-ZZ2-bkgChO|`(fx*9$i1#q2T$VQBPc{UJ zq-9GiUKt!papzg3!I9oMZ2n#UP^hZ1NpLw#0NEs>5FD!hH`#qK;8t2|bdj7!4BTDa zfroKY^@3`_dCGybjPR{xSz?P*1&X*9D4j~tK;(g!tfXDGKI-aw!SBJ`QsoryXwl2X z??nE@x*nkc#cCq_)+)76 zgqD%H_yFh`Nf?qBIlQOhwwe=gr$L zodD%}znd5-F6mO2bu?nc8>k>QeBb=odr`J}d+A73Nb$UtmwDVU>K(QnV-%CYAty+A z)Y)BJ2u{z{cuKnRKGz7d2o9!5%fGOf76?d0UZ2|{SJ8^`#jE`y$xWZ$nvUV(g#qDZ zn87YNCwjPGkQhP_$kg9hg>GIWff<&`Ti{5>GsM`1Yxtct*OJF^Y43`(eCcqqr$5?L zpufB7z%&LC zi_)c$#;P$ZIawK3iWn%?aRF0zbvhEDZ54*&-uVfCVEv+|iLrj`jMyEa4DlQ}E{n)a zc%GF1iBqKwh^i={OFhIWN2$y|;3s@mskW?t2p9kDaTGHb?|$rF7cE&;2oJ zRj2d8gnv1!f&sj0$vu-@Jfdgdy+w8ahLpOnQuj@=O3FUroN@l0W?`xlFU5o{jT$_U zYO&VS*4-W!B#AH06>j7sAbtKy-fL81cPo9dFb0F^f`7m_;xs*qwF}%#z;g0HfHug- zNu?J5S?6MI@hBmZZ?jxUbyp2ykoXff%tfTdJsH8MQ6!eW@Xg%!uXGn}ck1-V75xZw zkF%%OGy|C$@SOR)_m*0%u34RzFPQ|s|LbJ@4SIXwEiA$e`V(H-k12@8 z?e;3PGKaAlWs5^imY1fk@^MlG@0*6~)%;l_rQf&kDN^$n2>RrH3;_q-nSEL^$x8O2 z?i(X&RePlGs&~a)=_i>KMM>uK=kxcoL}r+^dIeMO%vm@kxgbaK(Xyhox(7;*w z0<^l^bbrFP47ykH9a?2v$E(9scgHi5s7pWk<2Tj-K|kk?JBk$QK1IX4L;9(0Y*MTU zG{AtCUryPs;>Q8+$BSo}vCBJcMx;mgGSs08HjxM_h0xW*D@swLTAh%V`BmX}sTDs7 zRKT<7syArN61b z`PcMG(UL`V@B!6Jt4-qa zO~FP(19n0?{o?{@^FGIe>N}&9{7Y=rE;_)5$^$0IzRV1XXv+?cB59v67dkrh0qncl zHr9}7-86oU03#VMt6%ZdLk>9;Ke5I4LM4o@42qZZ7Ag1;-Vg)!dENCp?3~JpO!Mij zC&XZ|b5-Bb=7dlLEy1{M%Tfa+ABT#0-QJHUU(Klg@J=4u=4s$kcKvBBf0(~L-yz0i ze9$3c{Y!R~#*|#hq&Ew{(;FD!Xkk@|2WPVYnScWl@da6}mE?qsfnsx*lCaS( zOAAT-a=`i0S_>klqHOPoS%~HM4R*REiT;q&6K~n&VN|@bny6}^T*jA$R0lt}U_AF) zc+te4^R$S^rA<+eP!4Jm1_I4}EWM+v0WfSF(wOOO7~PI|BjT=pc`qD*zRHFL z3c5dPE4rvNH7vo8^$6SHBBaW$n`J>k+U)b5HpLyZO>t*!Y0y>qJ+RSr4FW(=x0Hw_ zX;Fn`%ct?E)8IBtZ=t&r?vMW%-yQ@-zo?Q&h3y(!@7hh&o|-w~E;AWbPf7k7k3%U@ zGQm?zKAPptt}$QXIG@emv7E=b8P6j z9O{<@(4}zP5(StB~JLUy%IZ^2IRNo6BohDY^-f(`l^w=>!*1dPf+s%9N*V< z*=ez`$$9v=D$u1Rc5IHbAeMO7aGwDCOGwZG!lKPiQ73-X)9~bb9&66T@3R&l^4O2* ziOl`1|6+Qa005_TzbnK4M@;X(P`uyk|1V7MzaRHMmZ|^c{{Kfz?_}UVnBKq+-X7Dq zdx~&iTqBOt^C6eboZ1;;i@z$I#nJspA}J)K zmh)003jCSgTWbSwcochR!S9R6OX(5YwEB_e<^wl)LcZmm57CiePw zW@fq}8NV$|%B)p~9_P;PLsY?1;W=re*~k7nZGupV2#v@)frq$%aO;QQn3Ys5@?SB* zON&_}IR9@>*&hh%Qv%i4cy~V0SwlX%nPVE$OYn<6)%l%)Su-QUi7SN6hers!|4^i! zYrR4fQaGJbzYKhIFkC-b@a4 zWS=sGDe+HHP$4Hj1K1?|(FpRzoZ;+1s1reTFxNRT{q#21Gx$eYJeSRIr+I`u_Uk)f~59wb~NO z>T*ue>+NPOGF5%^+!pYT>C!9A&D=y^X2iXlLpp7{4quz?7Q^>ykWmABlS$KNIzulP zYN_Ft%v)zD-slGmR0M70X{hBm$&-HNmpwm#x<~qdd^>pf{_bDjZYPxO!zYt|rgkYY z*NglNG$_5Jm6~C6g^Pp9Ix!fT;WKAt5RCbrUGzNQ-E=2E_NnZHM^_$P3xsQQ$8Pd_ zqW!FHG0V=0|zT z3Fp!hktYRj<(fU%8b*@Zc6$3S>MIAtvOPiyKXZoM$2CwvkuC)HAaCeV|VaSjpkdp|ANbo7= zOlP`PyqEi7Lk0=Csq@>ydtQ`=Y-hc-fpQ`1t=g|IPgzYCHZ01__X=*6sX#a<3<|T7!*lM5zz5`yI_N8*Nk}y_PCF=8u zkrNJ>#g%<+f1gwVWOoCmZah4cI=f|rFe6Ea?SN`<6^0?73VUl#B`;3xG}!P`tgO-@ zg_ft^>GMeWzk$1LO`($6TTd7}=ZJ;#=&*z2vbJ+E)S|Z72IIIzCAAGXT8h&pvZ9#) zTpd7c*2|@({|-VlFpRa|AbvU!9|Qh6Pf?GUqvUBgc;^Wmd2t{c_vT1%MWUG|LpJqJPtdKt0b|W_K7m(ck6rF zb}mSR(bHRb>m`QN?$$Fx)GoP$z;9TL?0!5mK#1P}ZhhXXN1JXPeh42VQW+wkE8n-n z_CJg}+*li(Pi!LYm}%8u&$5ylld&`tbv{)BE7IlSrG=a58ViY}7E&=wL>24rfno7S z@PA+eC5b(#h^yhK$5xfE2YI*&jgtz^H)M`W#RY_lB=yo{J5+p$9z37q$<@NHv(t&b zcDMg8$Q@8Bb1@3|=t+ABOH8!$W?PQPyJ@>4lNhbly)Olw8Qs7A!p=3Ked4`XI^CWM zcjDuAN_B4-nqJd-$ramUyM}BvNaP7(rD{xD;?;5lXWjoc?nsZi?oTT%Z0^XWL9jiY zHizIbAsaTL3?<0@HK~pZyAvZO;DUy?7Xdj;qb4~>^$Uu!042fb16-~$u0yo0 zF*p|^wyMt1k--QfipWJ^LQ05P-si08MeF8bMeVnAr*px~uh&5N$Q1PPUmQAr(|h>6FpO$NK|BjLCyMLiE-dr@49|U0 zIa&6>t9LAF_A6(qzJ9!a!jEkAKForA>#wC+#3@98Q)v6*GS?T>7mlH6V?lr_L^C@Vz_b)dd=1}c zTs02Xln2uK3c>le@;JEe$)GAI@4ilZrFQ^A1KHFO;f9W^068^i=)H8kH9guzf21mk z{l5$hyZ{_{n~-)-e8RBXZF*w56UaRcDbp2LfmuAE<3OVHxv$WZ9-Q8`R%l=TuwG|- zhVQ!UJx@xEZ9ao$n-@xyk!^Q8rppzAX?d5B>PA^Wk3GVpBp$O}Oxnm-CPaDwPc zcF4EmKOn=cFr!e;IH~#C5v0$nJYYKd3=Jj!Yx&-};vb5qpb4QYxn7*Yofgn0TD%vU zPwp|91DuZ%U0=;Y1jJhbsx6>WVdJk_iQFi6xQx~&1r<`60~%c;?cy**PiYpjku^|E z5mq7GALBZ#5J(TuKSko}vB;13!(=?BttR~NIb!MU!#9tJE#|&%i|;m9>V(hxI^is?9k%ba5c3u~V?5qVo)1RVp=UvAi_Be?G%@VX zXhH&M5wi&C&0O(slahJ@Gu1&XMJXH_PO)K#05+m?US!`_(ao|XsxXmQ0&GODpIT+g zu#!LDyMvSWg!E43!J&|phX~(na8R3*uDVxPV^mOe;C+PC+JdOhe z{}-w9NNel|UT}_l^hb#f2Q(79W4%dXC&REMsKLs_R`d_YZrFccKk%BY3A)>I zx#9gg_OHu1ypYYI5u7WRgI7)Y?==>D8+-rLwoC5A3auK3qxu0T*`RLsCu+Q=r6`?& zM^@UOqql`FKDXIv|F=l=TdGVt%BTx{w6 z5Z4q{-y^Zxef`MkU19JT{&T1O$rn{>9EI9iU9a9=0eSN2S~RVAeD__ z)a7U8Wr5h75U-jmi1|Xyf%0F<9XK~gM)_sV2%&ixhaEmtn7Y-gkrjXU9|%SZ<;Wp; zn+>hRYx-iPHReqAJ#ep7&}sucn)!t^&@?*8YN1&Lg6}&fvV(K>4@Np0hH)*f0{?h^ zse1%g8QZ^9QYmf0LOHNqK*?Y2rks}*Jc{PgDuh5$xQ`o4Zq^lrn6rj~A&!Hg8Itc_ zldFAzU>$B8!LNy#0hO`#bHhckw-e*}t7*`yr$g=k*g+$YT)(FtmmCKh{qPbzjC z_IPp>oYG;UrNINm7}r*-p{0P0Mr;w&AxlOq!VAdoHn{DOy$Tcq6iS3?6wUp3u{ZrY zkhL?nIy}Kc)*z@6(;xWTKJh?*-4{S^hA%Zsc*7o-H2bk%C^u+zzuyw2|3z1{Y*+>| z-oj^Oo}jnW_mQMOaRx;;!A;5#-lsi0c4`F?RXIl_Lzx6Z1PCM{9^ECmWl26Ny%9R+e@8r6s;7GClWsDXQ8T_H9?U>R2BN=74o`*RV((}P^GC?#_^Vn z?tA|lrV5{Q4!_QwY<*KSV(^SH-ea9X_ST=o9CN>z^KW&XBut%sXu|Q@zC@<$zN;H==Q!0^+KTXmpnI zhu|U+{}k%If3PL9S(Lhnz!B3PkOPPaBztejHwg}Y8cy1Tu5qtksrz7U_@P@yO+=ZX z@;zMVW9`Xb862K-MQrYKV)nT-(3G2 z?v6t@aC*$@vlLo!uZIl{&iXif)>D)@B?&ANjw@vkN&V@}rifl(j(neyBKO~gLp_Dm z5t%yWi^imd8Z!y;H z+~z0YH84HLKjYMK->jW^1Jz1>kReQFu(k;shPDBfh_9_TeoL!MYe20{6@*`mj|cDD=qy@>w<#qd-LKSX>9=U##>jL$+c$N@?Ywr+Zys56`kxK zZq6twCpZe|_*lbXV$QMU?*vli^tSj*!uVtgqVL3U!r2cNLP>q&RUX^6V9UgGB3OuyP; zPk&7Ttykf=*sRqJ)S9!1Kep5MVhX!*BZcGV+}Xf@RD~EyF$2FH@rZKfXGD<^UaGzK zJF2RbwC)r&_0msdir@bq)%ePd1R=BqBL9KoTI^%uT%Pka!O#KtM-saC)01OrtikomL1B&*9;F7yftN-s^7(7Prwt2j z(GS)1*(7r6F?E1-!m;-knb59nz?sGfj{D7*Eavs>$Q(Zd(fQCFrtd8~#|@Xy%xfN0G7@-6Ebl*2nx1(fU?u)yiuXT%UJg|YryvLVG~=^?K35}$_CP;nEa-i9 z2^e%#P;JUP>NXDG`qZ+&~Ixol!hDhurn3TI0{%gC@AMaoV>- zB#vv3C)Ap#dE`K^@s{8JMSo<~$>&8#9Pc3{v`6qQ2=|(E9^x5DSyeg3>~NH%mfUjp z4m^14to$Q?e?1Nk1g4kCG>_F%Gu11~^O+U=UP9PUBkCbzG%6@6*=I0?u=73o7q~J? z#*)}tE;Xr{($^=8tRH(U(#t zx!w$H!MyL*tS=#V;@7BhSs|&A&%1Nhk%lBis|7J}=WX zsr|LSdNM#=>&pYww-!jGiXMF^Pco#60NJPoDT2lVOHc_HaK`A=kl}Dw`omX3^7nRr z9O;ddF$0X=R$J-ZO6y{nYJ3;ypB6i2GpOkw4URpPh4^B(SUfF`7uHf!&+BL6H}Ly-)#7Ytv=wb37F#5^@S ze4k7SZGN!ZgsghA;6iU=qGbn`VQCqz1Y{d^bZm#yM3F$5^NAdjg+|+*&5Wpd| zp>oKXMFtO-jdWZb^DMTw_#ovlpAyDQMgGz>JBZinmP`QVKmZPb&X9v>12Z^we?g)4 z_1#~g)+Vc_at|MstKjU- zC;l57{DfDeE@5S4L0)2Ns=T zWwb~9paVgB%AVx;G0(OMK=_0_I&}wm20oyso=JLXTS?Zena|~9!KchX;@DsuEg(L< zFtQ1vMk@&6GGbQp#(*g>t%G%XYDc`llyYB$?P3BQNM@}os1b5GZ_**Q64l{1wsJt2 zArsL?ZGJMVHNM|tbXr*1v=m7d?I==>kr{1kADG#Jmm^y;_ydU=Ab@Brsn_pOJr9KaI1uA~&JKG?f0&tHJAh(mM_g?8< zh97WJAWiwP(HNAEi#_nj<21c<B9}GoOY#C9f2tZ=KI#PmhB#Ts89iWmVKJNEHi2wkot>i;BE({5gZ&_NV zg|cp|5@60$%{N|&X`y6$hKZvg|M-=(Oy2$I;ek6B5CQaj|bZ6grHJ|_?1q}dqV%VJqevPCUZ z<m@9oid{vs^!;gt_OB8j#klAb{LrZ#k6-H&O_b#=lVXq>lLl5My_ zjYTMXfVpdpNg*P@SHgJN1~4z@hCNJz2sZy%Ne+ntmH>2_u`8!@!a}mcW0qkA2nAO~ zsAxs8L*fno7%>0*wg?4Q_~mM?)J{96yP$sy0~=d#8O2?gC|G0L+WDDc;+y zWrw48$)?xItuurruHCe0qOqFBq4r{;ud9+pZ9Q2it_#cdj@D$dfN+aQTblMe85=6G z7u(xcaUFJ)!P4Wk=74N(+SVP${nNZzFXQxO={^k3PHgdB-c+#*safUK;_@`Z`)*I z{mZAxf7_4{)nXo55M>=jg!s$+x++rQiQ&yUUk57EUYy^){+Zh;4zo96$t3o8 z5I4cli>H4PBf6Md&esN)2`x{YhFEFAQ+vW4THRYQaY6p@K`lC%?{Z8dfoR52`ay$# zX6T}yQ6stcqf7uCUDO~ZncNLB?8Z=pZ{Xh^rH>>6#|yFD?j)-1Gb&w)MRU&$&P#7WZal~)`LTk03D{SIDh{z+CKn`u}p!xH24gMqgN%Y)FriE3^upccw}E)-|4X(yPRkx2Tzle z5P?V7XBGtOLpuc`9IiQ?q|>bo+GdghtotTQk*- z(vlA5Y%9DJdDgVD!CYJy#2GAhW!v|U^P*(88?=&>V^2hzi~)*#j$T=EX>~nnxP8zQ zRQiQdg=@F7hLt%Zi~c1q*D?$>Z1wf~mEaThTgq2AchWIurG;Nww!$S@% zvTh=$1Cy;fq@UcEq{2!S+`tM@D&~Z%2+^ab)AQYExyen0jGaA^N@B7|1_31qSNJut zXwgs3X@8{Ib@EwybUw6RV&x(|*O{$4m=+^UTvTH^dJd7U%#IIo~-$$mEfEmp-)tSIwvPgywYYI7k4~S zeAtAe;y}@L8!chv%Y#pin;#4Kn@y$PY#T@aXrzTwcIx7vZu>E>5!(tVuBl6iYjq|$ zJuTi>fgI`AKR@L5S4C~uHHmmP0?CeB@d~9f<@ZTq)F%&qn0j9u&S{mMdZv$kJ4V0R zwHqQR>c8P|O|%k8!M63y$ z<5js%i?yn#aP;8GV0|e)9e(b9T8;)eWrxKfEB&F2?Cr73o@SuKJ|0;dhqrOCvg>t8 zt3rrCTx*)wnE=k0U7RQl4SSY~1!jaI*xpK-Y*dT;M}3)Dt@Z;Y=t3YVCCR4kqdDnR#y>e)!K*`OdV~tDn8v*{>C`M< zhU@(Xf!V2Gwkg{xdB}}u>{ZRx5_<$`iaQpnG|M?JV_a%!}ZZ$S&~gTe{1H*d@u9XY$nUX zCzm1%&^6S+5{t8_b<)I>PyOJI<5$O$;JrWrg)g1@+ z^9SauL^XC04kG4zg$(S5zX^j6@}U2$=;K2XF;sGWG*P|(V4027a5EMX;7=-8G~!cTZc4n$GU2v*4% z!beA*mg>=Hp;KfL)Vn+bJ`Xh9j!xl6=DJS;p;Ia0f??Q;E-_exi3YTLxrt|p0S7tP ztobiU^Lr6j`piT`XPN0Z%u9T75?e0i5F7QbLj7L|bk0>te-Su$C}2s`T57>g_3VPtd!0qJM=iPr9dxKD(%d3(32R zag07E3!H#CN<^u^z}FBsJ@#L>Q~XIbmQA+m8xi~GO?nc>vyMB)K2^7EcquTA@@cx7 zAf+8$9{YE<3`I$*a9?AQznr2Y#1o=A9RTQO{1K?udzEN02e@ySh2Pqm{+FwpSy9=d zv5GK>d4HnF;Hz!*ZcE^!QS!U4BX#zpf_p(Yq75Fk;R?CweXknWNDCvk#^Y#vqptubHiO87BVE`zjRiC< zemWHei-RP7vgOX#gXU6+_Lpy|&U$U1HT{>-v+>0>6uv#3`(^aj9tI-~V3n_uxUlEv zGD7)SgXw(kWQJ!aw0BFj?X1bwV2LU%pk8adyMB1W!jUZOWG?ypyutxPPDRF-0P&=f zgsP}3Rq4zR8%9CKKpr+akY*ZlaJI6a)^5oOMhL(6819ZXKwfEGbC7Wr%XgDXt7e9g zA5SXHD;Y;POcC$9>fnNV2gH!5uX3=&~z1koG%gLwml>2#AlIpWk(iRF8BF1eoix!v#RAfIuw^fnvmDGp(J zq*5e+BCc>|y0R@D66IStYca;t)%>B{+X=_5r*8>C;nPG{!g!q^0oq8PBfKf3xrc8A z!^Eiaklvb*N4qk#53>RDfN`+tEXST-?=km<(Qw9?+|FccsQ3v3c8=#^n_lF|r;}I{ z;+*bF?=URC%;N#EuFC$`=Y65vQTq}DUfxBS=7SLxi3Cnmh9t~_iwR08MLDKiL&F}@ zn3M^Vv2GVHY=F{-P}&4#{1RH&%Ey_pxV5^Ub$O?F!}K{H0moRSlUxx;1D_*rs3rJs zpe}RZa{!+!b3$d1pBiWSFC;c`4PGb(s~Qhx?-$E&s&obMZP;S1ExuA(%Oy`z5u;J= zYafofaN(H*sD(Qq`O(8is~0xKkd=06~(N-A$9RHAl?)Z%2Hza?2!1$|4|{XxLq@5{8Q4&!rJOt;Z+ATp0(YO7S{3gNg6nlBqxFYUlG7`i zeyCGoUym>6oT;5MJ0ip-g0#CI4|57Z5%6I8hy69Z{fm*RmWTn5+>D>u*l)4hbO{Xb>ca!~c_ zs4wQbKHt9Rrh)8$K{iq;rMhw(FBkP6$IM`}o`pgf8!itL!WYjnmA(+;i@Dc9eo|du}v^%-GbEbN6$+Y0JIoFz+`LB%{ei6Dq;NSTPmLvax-C;IDQe;}X3|j+x%RS^gy@yRlY;is4EaEVq^cy=LD1(v# zPNjUa1Uatipm%aKd+nE$LenL`_w|_wBti(1aNmY=KB~gUxbBfS1Nvgy8!$Irqy@%B7 zE&vlk{4m2&->mG=GTrPv-a<2WP)^L`w#cgp(g)GnIxNA%X*TjO4Y3|e^fuZ)K3v>S zvQV$gA+i<5d#d_{p@d7SnUlgkZqjX9>qP>f`Oned|A;ZSbqnkT<1^FBfgLC^ScO~_ z1@ujmFL9UCz5=BjiqH1WL+!G_1Um0bhri(e)?lWV;Qy?mLYqMa%=J~{=LLt^gfv^^ zBA-Pz7vPIM1e`Vy7#*}|gT;{JqDojYr9qz;{^{NQQKD1@iC%u;@T?jODL z6b{Ub3lRMH0IZEY?a^c*W;Pc~?dT08)YRSXITvRCHm-k5Qvh%W9nfwI6zZ(~+tEgc z?CNoNY40Jp-f`Zm1Oq5zW?=D17xP4>I=Ww*@M@pU4{P^-f_q8;cty{y%*=k!Z%8~$ z2d)(;WxrbOx{#zX0>cFGmlnM3#f;vP!+hlMwv8KFlZJa{=ta#r9u*`jO#UlmY2l2@ zhXkd!ey(;bTaulG^LofeqDA|OF*NHxGoFwU{lq3))342zxUeXW=s5kE6Bb7Ii@eM+ z`VI7BkKzSJ`<(xSsdtJJ9cr_7%Qkn}wySp8wr$(CcG=r==t41ycBhVqcz2iN3I5wSJtn$*M+Zcu&%JAqq(bdLLgDFBoC zH=`izs8IL2K1r%F0r>3bUBxH%fI8)FiPOA&w(?RvGQ$)DHKQNSfd|l{`g$6#@8dIQ z(~o;L$Ib42*E3-zNk!89!PQ(KHEwD@s0go3+64s8Vg@U_IT;TKbmoVnx~Fyrzc zL`%jF96U&dn!wafsU1lyiMRP*S6dEizQaCP%h*D2N2guZ(4k!~56c*}8g)5pN1SBF zPu!-eE7n1Y7fld7P9t*$p=^TPE^{{`4Hx%d@s8d_z+Kl8zvh!~;nBkj-u3%RuAT>n z@Al9au&2P&=FVo^Ol{rdtBo~lTmyD_^Oq0x3+X7~3+|^^+9IpJnBWV7y*z%m&gMZ} zIgca7X-*2H*ctc5UizhzH{VQ4Za6QES_bNDO;x^}!i!mJ#I~?1JwCkWVPB^!5|qt? ztksB+PG{@)%vcW6x~YKhkJ`AC5fpAk=rp-A{>?3WRQ?RoxhwqXj1S-Z>xlqd5(+!s zoTWb&EjBH07_x>V$Pr&(L_~3pNnTV%2fvo@@%6#ggIj&V2lo#=#yK^0lF;)LbestQ^OrIm%v42!ok&J)W> zQL$4wgT*drpPQ-$VFTwB#p zPp2;l*Q*BDZ8(?v??Qt*AU1)z#{D0l%{%@)7uf@t^@(sIKH>PxHbDXt`v~%WAAcQ> z_VL;!hXm{u#CitWh^V?!q!(7OW1cb9eFrCHnaqd=X99A5VPIx~x|-T9@+5=6bUDP< z!8d4|&4X7<)!Q@4S6lSkWvL$6)gHJs-W;KZtJO$f=#p0_$WK<@SF_T4x8j!lCY*Av zdz~ihAHrWV@&^sPs{4TrBvtY<%Se(FLk4);&SmQSsCp!M$T4kZ)n?7df-|x zO@qSK2;LZ&AWDEu5t^Pg=cOtgk5GOb-$=&k)h*0&frSVsY>bE+%w!0#g6AlZjL}#i z%uCi}ocpE_Jz!vkiztO+O*(LjjqwzqR8t5`pY2?6Ix#7UsV6{`3wt{E;E&wmo?+!8 ztM^8c;k_->29Y_1E}Fzg%ib>LH(U^W$``VQmB0Blc~V!ZlqPOP+b|?1O{cnezK82s zn?Mq#lyFj$+U*e1pd|uATBvL*@E@71_d$tT*F$x^F!MQDM@$5P=AQP_sJ;dr+3Yo$ z)+en62+|ucV{K{NQbMyi-(IdYhR7;sFDAefJ|6IB1T@cFkr!P zt@?8mn_px0f}a%IVIk8$5cGDVR@o=AI$xWG7=jV`s$!rM-GyYWmHCa+jGn5aa@8^m zp;~Z?au|e#9Ej7=9Z;NeqlqBO*=fr5Jz;ZJWJ_jKMX~143|HkjdK~w zQp<}OWrMg+k3ML$&0__n`ThS`!Tu&czicy=yZSkAP*z{qTTh<&B^-5uhhr`wk{s6m zX3VBzgk|yl2DK`8Y_yobz@AVbK87|bt4=*p-|_62zdA5T#_*0U%nO<H?=G18TE6nLC^3}f=Dd*fu2_TWM?cXw^ID95Gk4X2G zpsf9Hlnpe1m9wKq*4h3zHZ#O^pOa*8s4Ryw_L`nk7N(C?9=y?LMF~#=!zn~vRWo;$ zn{e}M_& zUG^LGW4R>6w;nzzhpCZE(D!HIlDAvuSJn%GgM@5g8^~?-d!qy(E!gd0UJbbKz!ua! zU`i;6WFJ(i4+7JX=7vw!S)LzK$&7h|JcP(YmfM(O;rFJ=_-IlIB;BlsI}))@;jOr| zx{s#moE`0PQ-l!uiak85?|Q9(#3x%)-=jbbELGHqC}Zb_Os!Qu3FyWI>kAn(a~+A| zuxa>(qIbxC1GEq$5kL(;4|N#ORoNgrR1j1Kow)=+H`m3r2X|~~#M-310o3H=1me^>L&y4I(P_t;!*no?2_PTVGFs`xLjeloyP=g= zzcFrfhrN_~^nt<)q^}$ZdpQP&CD^_JB28Aa;@Aw8+E(HxJ{V0dK*SZQ#Q%8_9`A1tEOdUZsvf_0;UW&Z{h>@}L#SxX4?-h)G+TeuB)V zCv-5E#Ff}Ywc3(`b`uQ?J%(}6G`{QXy@-%D7wI`>oEz(wg37lFK&Q9|$qgmS-^6Xn z0H!YSSjKpWtwxZ8Oe=8s$Bv^qLf>re^vwthqpI-SA6vTip~X9`$WA6H?yL+?=o15Y z&%qG(z|#Dvg*mNBICwWQo7XX{V=3%1mRa4%8z&R;oCbR=QoQsS zVa1uG@x+N7kdv)4FPD&-9Ibtrm_{|}lxnnjY>y?C!D_>C8S(M!!)SqG6&^y9^hbBY ze$rD9i*1*8Iaj_8ME}R_KlOlKyl@mwQT6y|I;Wq>>P0F9BvVrM7y`ioK`MI=?4HndgN}y5P;Dtxbz=WsHUMN zytia7_l=t7;#2784n@ETzr>Uxyknbr&kr=)kobIB`PGb$tr^ z3?Z!;&hdbO!*6P`IFTF*b_ew(8?gdqVolV49Y}zn(p)NX8SOl4Zjp`ua2~+2^9%~M zjW~+qmXLhtw*$@FDfD(pkc)tJor-8zP}bRix^=Yw<|yH znMdnD;9YlrOLmAk>;;I7`P~2CQU?G?ei%#~ISEu}ds3u2>d4;R@~jfAmMGp!*sVyZ z{>N^zZO`GOeK3bZ_oLk5oY&fT;vcCUj6{IPSL}3QvEioo?EgC!0Jtmk+e1(`9M>x| z;1Pw3?V`KKexkt`5^ks$?+|nVZ=W;(pEX_LY zX9q5wbKL>LT2Ug1bhEn)*Oj!ZwhH_DFms8Q{c@N2L{D)RSTJ2D}UsH;bL7yve} zLdsE{PFIp)4V+Sje%`*Y77{H=Y{8HwC)4Zn`BetfnVU5pK6MXYDef}W+jd4^b;F_)wuL)40x(5pO;3*--k zTeIxezNqt$iQrPfKy5(Kkr`i3(6Y@a@*uP_sO30;y(1pm@?1WG;SXTs;DreCdb5^* zpJ3S4{%&PTp~COWm>%@aJ8-hN8Kw|fgDf)U$Gf~#`;Lm5@F2-^wrTw!@Z1(cK z(9<;4<*EFSSO`7RYb2*4G=)e_#+dr>t&B<$Xkr4huusm953C?QcXlealkS0Y?NgXk z=~;{58Ohe6a0SRo=fPm|vb;A2?V1UYbk*RRijm-Dp{v;6!)6^^6}oL?B-WSU2nEW+ zd1}0OUJPiuG7JPC2w7~mCF3xHZs7_+QI0>Y+h4?>Wsue?|tB76&x|rmpVivs@v8b5wX(& z2ULQ7!Q!Pq7$@ONxXx3la&h?GHW|lp%p9}*_#n>u)L*X-%OYgGY%D_)bo|I=*iWoc zB5s}%Zb}ey81R&Z6TR5U9zT`lKO5>X#nV6evO}ofEbz=1hUWFod zNZklX>1rdRWprM}#+WV9@BJ<*`~T;e{=ZF7_^WwNTyIE<5}FW9_}blq>dUO^YG(Q$ zHu`L?q5!@~f42qqiA4fUh;WFB;1D;ISV~SgNa~P(-_2Y3yyWarTe3>AW=}x<*dHz$ zE*tfps|}qu-;Zm1(BJCIDp|BJXi99GP77@`DEr36vMLbO1v9T%^3)4Kk;VA&Ni16^*jCrs9JIWAZ)E_YFRqO~DK+g9ObYJDY7gRqew5DkK8s=f0)y zSWid}zvPRJEG@9+vI8y@eC7asNxrnFnw z>b49YusHz9)xj}8?S0wea@3@i27jj`tt0ot2&NOv+@M1%z)^oo(fo)V{9bW;V zB!OpY%#D4ijjA;6tVmwr00<6+=BQht&Y7dP!Wz_#OJL$KhW2tpdmJaz&d!H5=5gP) z8}1*HBbKPQupP$Q2n^bR3gS(G^q4*4pO(baL9)}W?K^x%c4J|vvWLL}6khC65@kU~Z0JKuPr!?BcugkMkU^YYSTLgha zy1-Kg7PSR~D2}SgPsK<0H zD-;+|yRQ6Ts9IMo+$f`63RoEii$@>BxyizKo?@Wt4z;~ZmlpWKjqxe9DrLl{Rx%=x z20N4eokkNbKpuFNz=S_p0f&Jr zJH65ho;`VcJzZnAEkW;m$1{0AyC@kFXCqfp3zjMur-hKhBhnOpuL}CPBtKo(gTLze z=1Ht?b2YwbqCBPA7`DJgPH}l~OdB7&jWEqiVO#uki4cRq^F1H9{u#aIn(Wb=cm2R3 zRg*;gQ4=eL;fu`{>WYlCOINMUP-RvsZ)K^kbSn(Bi-cN-x%BSq|FYg^E$TVQgw$2 z`A5*bHRf0q3#&?Fi-tNaSZcrgy!ge>J90pULUf+!Ddki2zW^cOhrzTa3IB!4(_}Bq z-T10#& z9R^M)8!%KH5OxADM*VjmI8Q@xX}@dTWuK7Pv2&Ta4?+5X9!Fk!e;3TU%n^nzIvm4H z<{Q4K?uO-}+`>VVqoU?B&l>P%I2Ur*)fY_=HA_D&n>Hkmq3{1MQZAV z0^M-NE%(3*)?X$jGv@M(O#dH6Wy8@tWR7=NR{-Vu#AV2akD)+3qP6|WFgQ*>&&0(vjI%Sq5{CrW-7b8wf2ol4Aah2 zW3L0WwC1^l7D(}_so-Yb)62lgx8=TM!v9Q9K-BWxZiYvd9su7!hNV(Yoy*m(Ig?RL zll~w_wEc7W0l&U4PpMgknnTT=gxG|b7ljrNUz7E4lS6BPNbauj2vt>VQNZkF>0DNz@ zeX@u-Z@=}aV*Jt+es6MpGGj$w($G~I@!2B(YEHcm+pro+09f+vQ&_xp?|s7+1><-Kub4^NK;B=PuY-KoY9WT1Nk8)aQ0w&sa?&LH4;NT z)1_41Z#iG}?gQN1Gwj(R$kieNErhAvEIf0TZ(N{2b7|DM|E&W4HM#(NyyYI_v1m^Y zk`S8OcTIz=AYUPdXts7}Sj}yx)j!%R4Fv?QJwtVGy3jSn+^ghF1kXrBVH#xcYS#Xl zCSYp;Ud9E$UsSz7C8w{?pP}soenzB09?RPC?YG~N5cP4o?Ye-0y%AQ+d`z1i=0HJ5 z_)era>i&q$KDJ5z`unM_YGk1e6KH|IPb_!_p;G3{!$$_v}%CmQ5JxqrXlfsTW1UlYs?uj-8># za=S3rHuG|s5h5-lrms*}%6v03W4C|L71xNn)y(Z2W36SSQ1pSwe}S*qZTt*hGFV)> zvpAtz=CifmvpE3Ez3Nu*ls+rnnI6zfDicp)CD9t#5kl5d1Jv>a!e?cQefP`} zwfiLjj?gAq((@T>`MA`E&ke1Cwl2F9!ylk0Z0w9(%5KpHvWaSBOo#N=-hhg{sK?|4 zcg5@UQaV-(Z1KY^MytPNIq2mXx<-RvcC7+p7fU?k@kWI}A$Lpsyw&HB9l$ zOkH2p_fDdvT9w$Tu43?cVw>;Jn!#n$;YL6Vu}6@rtT6@Z@`)Ym}W2@t)KI zqSS@xJ{P7Fd+-^DdP-fTWON)2z>{#=hMxnrgX-=sSrFBMr zOMNVt$e-|K(pR45aSsZCrdA>#GGjX_$IW7!#&puI)Z~#@mM0N^Y@EwlP)*zVKK*`0 zQ+mlJAB;n8Jh58vJ-))|fkueHhzinYnu1(o!q?oyyw!b+Zy@H})4SJC3!7M>OQe$T zzBNM%OdoShs!l#PiV*d!I0)$i!)RscJlSf+UUM+ZZM#iAU1iiz4$}Bl(V5lLGjy|? zt|BG3GKo?ykm}!BOAtCz@S&Tp!h88;PNRGdvm6}1=|KWVKuQofHO>y!!-JAuqFBTm zDPn|k_NsgNI2a`aI^U@;{;-$a-@Zypk#sdtU#$BgGAL|rf78AiA93N*(q109|CAxw zNm*ObG!kq9qE4sHbwhEEPMsm07eL@;=RrN+S9M-0V~An-p}9Dm%y}GhAuQ5el6s(} z-V1dp&iMJty9mVhCLw~IR?Ez!D*N{$IL#e!w<%0m7qrdv?PH!4;12wjn$1-F?%o*I zl3xkp{+B0a}H6+(5yrSwl#G30LQ~DB7B;1oyxBSmfn)IG(6P&(z7wTV8JP8*lA&NXD+)~4Mo`(Cp<-$JY zjMUdl1S$`@AP9_3QTqtQBl;m~wNB0S@+Qta2`$@gaod-F;T$0YW5=TvL@%$$-07_P4=X`)6Tnf zbLdWuQ_uNjJOHe4xF~>`;AXmxHeqD~q`kLNwyNx0p$||-_r)sbn`Z+!Ihw3PE>xuu zp2eXkf_|;YS|u-7bPbE{`QVw68zIF`$-Fkjdy+7fC{RFO$$l2G^am{W#o9xOez^aG zA)}M{ToRz(VSvB&($*Xgb^h=f>ne)Ng#8)7<3rJOgD>W$Z&$z_N#Qk$Sb((~ojF1( z7E{!s&GGlJ1(9< zY$S`MXjZRJ{=26sqzbe|+P zjvyS0(>N=AAhA6kq~r30NjNfKP8MYs!-G3Tf%I83LkHUU*%%^|M%9A!Pjj$;h`H{` zb6FrM{-&_4C~J3ED8w?>sby@}DUa3r{77wWf@~3d0A+ij`V{&%GhE#BhTvt#elJ%COVqQ`{pG?e4Kj_+Z%0%OvQX|>I zAUkEpI~!fn`>;D57i*w!>k}4~UfHY;iy=k;1={?VB>Vr?Xqlm$!HDI~_G&}rY=2a(eGFkhx4?CAeXR`BtaAm0M7V zGrBdFP#<1SAPqf786r+wBKV4A1N~BlFJb=udUP*XibvL&!AhwD@~Ml}uu$HUJ$Ck3d+fTucwbw`r&VhdNphGZd`9O7en4E&aN-fG^zx9TTdx(@zxrj%rzq$zp(K6*M&ZApGHjY0c$%<}h{v)A@ruNzQ({ zu1z2e@6_648)guTxW2{bjB!&3J3IPz4@%1@W_LaiICs<)^%N@ApWSY(LWzN@a%5ArH8i|0=*1T^0rjJLpy zWN`Ma0}V$5Cid;8MEZ?jx&_+1y*FlF)%`g#6Tt}1XzYGX^=l7ayk@sV4i%nDDZru} zcMQqPqg^ddOWZOi1~#ZE!0yaDryvQYEHn0g2Qkt$xF+^=rP6mX71yED72Q2uf&oV5 zv>Ppkg(qnf{QRm1Eq5XnglSr#3XoFj1rPmt&CotNa(b0teZH1 zj|~eWY`7q)IkNy#Is&)F$(1+yQ(@x*>~E-Z#99Gra)@o6hz{=nmg2`|i><}r*?jHtXCX_NXBi=6AUI7Wu+yc7$&C32k?WOA=gZ>?rHzZF_|ug7nPQ8MG>_* zSN$Mj(>l#M9jnZ*L(AkkJ(HIJx)Glg;mmE13yoE?TL}N0l;B4{CJL+yI|+-*{18-X zQk_Z;D)(qy3Wh9p1PZz0rM2$^K)S=e6!-^LIUidrwy*2R*78a^es|Ko{E!u6KtPBk z`4vNC3j*qb!=WG6_j_KJ0ie@0wHW5=?IL)W&ORdEM?w}YGyi| zb)_Cx722B7>Ux-56EW?KVrD-pX9Nk4bH(l)kHgS`x-zc}3<=bo zJcbV?=?}i&l;DrZo~(3EO*+1_3Jzrl4IX3+R+0@_JsfA^Es(;)yGc^5d^f@Rc=7um z;bWk)BgKjGY@a!OjX%f)_6Od@XqU8kUb1Scmns=JQLaVZ%q&3}8+CfG7=Uqohn2YW zUa-ffohn3_kDN2p4+XomT6Ex_Qzlp$2N-PQhET3kUsg_0E+$EAtD3Iw(^fpgUS-cE zKp_x8N?QV)`7Goe3?BujbP5Axg>ONNKlEOMZRIu~&oCOADQTu8)9{$_){V%K6qO#) zPPK{%+JG(dANzZ2)qKy>C-JRE{f;g>DaJV|kVZFB50Gw?1o@4AcmMiTIe;108@T4f z;=(b#++FCWqW7cBVn7kE9w`&lu)^y@yX20))6r*tB#O7`zPOo>wWh99OV@xIG>@jv zY5({is}tWY_Q4BliHf-Ij6+YrPuJcY+ZO&s_~K}*t-kHyPCFa$Udld&XTm&r1`352 zZwND=R92(SitZ0i&(>D=8G`>svkxH$EG$ZcPQmG{~u$35DogNJAxNY$B*( zoexSk3aY;-7RE=|6;H~`vjVXLk!VFK-VU8XjhC{lv)o-Hzjjs|D|(|DUsP@8+ieN7 z!Knhs&n3J-Woy0dZz#I{)&DUOTYMlHl`61pbP#cg1rmLexH$Zsw`QtO}T8Z3Sg-F0w_})tG@o(eOP8ib)I=M_Agw6f=nI~?7aIr{3XC@U!A zIDlDWOX&CSl>(8(RyRi7slUPSYB9sH3ukY=tb}nq@D4?X#h6$v`Qb)l^0O=#Oxdo; z?wg4DBtl$)`>S1_sHj<8>etO?WCVgW!ur_w=E=og0og>3mxaFm@Ju}~j~%&PT(t`T zo!+N>IdCPa@nzs*axUm>9`l?Y?F>i_d*y^o=s996JETZ??)9C&07->5uD&hj`w|CR&swJCBmJ%GOQ?9y&17Ckn>TUi zUi8`#Kr0}Jx0F*qHB~%8C0BH|(&V-_zrE(&M4{XM(yKj9q~thof#-ZyKtD5{puJ4; zlKzR#e_7pQ+2R#O4fmc9dL&})f$!8x{K zJl|BTkFE{yZMO&nlv+XKoGQYG)gS)gU<8?g z4`4;Y^p;Wf-+*l)#sJ8$vHnz7Do(%e*33bwAQKK;#Wqd=|AiUo4USbgC0bemA@zYS zuw<`Ra8OdTV$T&;g-tF&-**Lg8C+g&&<@a(D_7s^42lPPx8t6Q4pL(DKYIC$(1_tb z-D4Li+b(@O>$G`$3m8n99r77VAuQ-sPB?&8ywKB3aMGk>Y!G7IJtMSrqXGc+P84+ylP(Pb-uzQ&e5G%Mh=qtafj zjf6ohaCj@Bg2)oouX8u{tfV$%g$^dE*4^k6f{jnn1?D0nHV|qb0<=?-=*~GmG zkNnBP$0S$tULi`<<{SsJA7Fcr0r~z@TLYgR$ytv;US$r4dj$>FJHjS1RCg_7Qzr4S^XfCOB#4T%=4{^BlAGin-xmJpa9r1@Bzs1bKB%l zx~*uQcaR#(F%cwns-9uu>%Wyld8?=GKp68Nge=5^d#YId z+XZmVN2yRA@eh=}oi>WV9}iWl;vyrdf=;8MX!Zw^x{Tc^6_8ebIkcx6iVb4~#k;Bu z`lV2eDT#c(`7l$2e?1AHNLar$iLu=xnS~P!=EK_tYj=EB&s?gVc~4cXP6;!qg}~#c z&gLj2s%_BFI(iNr4Xgx(LOn*)=|MxP>d1Dc$2^YLtcRrJeoS;8qRg*tM!L?GcKA<< zZcCP{vW%{#3&^6PB6(SLE{pfVcg>_Q*9ZB?TtbaHSIo!9%0+qpv&gy%kVDk-9h8{M z522Q?$()YwPV_`psB(ZKSs7nb8+3E~!U9K^fungMHqrEUX_30%hj9zo}t5y!2YeGyF_PYgE4SHR|Cx2r%JmmW9 zeTRr0#x`&Uoa_{6tF&p88WI}2DHd4_*Bw||i|wHYamn%ULli~5@%f$Ww!tco_<;yJ z1O^;NjfQKsHg9&RbVbvq1Fc^QGM9rue(0hENX zE7@8%ph)L7F2quX`FC=QZAXumfh&IJz%Osrg%}2se(7ruMevCgCib)0J#N*5pi`wn!E^}s3^k5*KPdP^+f@zFP2)1V=a13VtT%;`7EI8+-= zszV*H%CP~$B{O~-C4*w@6Z@zlubbF`tr4vNFC(ld^^fO;V!?LUO~9w__b-Ke0eL<$ zP_WJat2F$!5i^R-ur?HCNwS2<%)E1nP|?M5$$jgug5!UAebJ%I-~5Q)-?Qlmu3mhI zP}Uj#HeXB?S8!-DzFtHr!(!Mf5ky7|W%&dgqYpwdeao(8y-+S#cZwh;6#_LhUo?YE zi~?PNDe|giTzjZwk+Q{SZ(!0YfyQ6X;p#-nWw+xJVf9eymSMOv+6I0agN8=fDDa*_ z*luCj2&jOjU9HxJwtB$>W|4LuIJnQ;cag{iL!1ng1U{Zezu5pF@IkouCa>dUt4$j< zv21SD427k9Hc;Fms#<9j4d8W%1@NgR_`owSguX!K5c+vF4j!zoEbj+3;^cNV?=GQa zab?qtGC3+E6{X~{%tD%skjX4Lv)oR)O*t+hk70TXhG20b*RpXY3KP*tx2g7z)i;f9I>=IKG0L z$ml^4Bt$LV;$c;UJwWD8{i+!@K4_|PMyiNXj!FR$6F2AeTl#S1FiFH742bKl4RZYh zM~z#x&r=mvCH~Fz(21*9uroJ2kXmBi!cqez5`kCt9#P)Q3<8VyQ2*YC&Lo8>HesiB zIso0mkS^R~PR78bmER>M|1RmB;?cQzr z^m2UB@SIIfCEc1Ns-f+BXh-z494y(I`dYaRdq3EZW^$g@AqV2V&$5c{*ss>xzKD?@ z3hFrPz?qf8Ha@`S_8KQ#GY+`ZJWi+f%mFW?UUaS-1S=l6VbiydAf_RodEltH^9=NRq+{4Asxh%0gC^Dx zIYq#{rh$-`{}RO`(>p5^MfwWT``c6zwWUfjhR|Xvcfbzak$x>piM6Kgaj@BS0uvUZTmyB`#v5i^BtZTtA-+tHRe9`2<_Cop6QKfD6<}ightbPWga`g?m z=w9=pTHH7c=do7qu2p?#%92D6q=k^hQzk2|ZPvhmKv4sO#iRTxS?d&^JZ)l|#>!4q$cxKEk zFZ55q*=P*=NDxxS1_~J33T?NFR$3jUxHg&my&o>MrP;g`HeZqvUNi4eQb0*ICq5N& zSi$y7Y5~1IqPJA%_$oQJ^`m$>54JKG)Mb$EMJqy>TUEOsyHl@9%EbkYp6az|oc_r@ z&Oqt!SfpRVBc9Hz#IX-c=oxDfGnS84yOHO5GH&IGA*4MvgHGR|Rm{TMhXp}K_BS9T z%(p$6l>sx0{Mc7SYz^rx10gxwpgnwr=D{)aA3C!aX=Z_D7>k>rx1elN?CKLQ&^PG}{k=RPVrFW8;J1;$Cr!aiU~v zdYZT+8lm}Nj|pxZ7?=g`QNcFXsG4tZq9BS;QL)q$;WJNewzN}F!ZwgXcu|_t=VC1x zkf`q>It36AwA&izX=b8?XOL>8JZahfqwuZCu>b^XgqxHbt@UyxImWz$A(af)WRb2< z;L+uJZ;sUT4SB*gV_8U2?*Li~2=6`-`{0%92lVQbu4Yft@KslLK*~2HUDw(;X7}Zj zw&z#q0fl=p52;K}+9qH_r)q=10Ph98oQHO1m)24xM{_ugZHvvqzb?_YT|i|PKpWZ> zdwBR0l$()*t*|9yv!ix3_)l%^oV~bZ+Oen>R?9@FdVi6pohr`sMb3j8eS0=Ag}^#W zStp53N_NqqeTEBejNLC~)~fr@O;e@a#?ZR@JFHQiKRALE4ihgSx zMr^nfgIAcbwJQyk+PB#XP2jvC5-}$b3&q@SQ?xWe0z#Z?Zw}wyc}1}<-|LU9$P#Jr zO#zdMhm@oK{MY&k#Y0m3)eV+ltn(jGz}AUblS0fd>#A)cV)6BtBC^EOzI>f2;HTNn zG0`KyxTWZEAFe>HLH%8d^sJ)`c1d$NY-rB#u#jqdWk4966ig49XxIz((HXv8%G0tk z@=H3rJvA2RzqYw8j1dB-9H)k#T}FzL>`*K1!9p~GZ5Ml$>3@w7a~=XxV98v7rs8lZ z2iagL4$r6PG@E)om7et{r8wT-@iK&Dzb{fBlal+rcGVYTlm0dUjjC=C!B3uP3?^s4 zY@UsisgqMcHQpz+i{5Kfg7fk*6b}jZgI+C z`uTwpJK504Q3w*ISeQWk(kbV1=S{YKoRhU;M*l$a5cC;y`jW#6?ru?PgKn+FBAsU& z)EorJ?(!!u@1Tgda#W@j*Ra#&TjzU6>WCfz7nx_6Pn`K$Ok0M-`YwB1MZ5<^C2v=K zK5hsz-uj^U!MKb7w4um!?D1s(2p7A|KM~l&(G6A_V9(2v`X}uvd@7TKU(9ylMyYSQ z;?Tu57-f*H)upFh-}%Y^`9dV@{oH)lS(SV>sBVd0F@t?I3@KN?XG6u=bar?^rq)Az zAtsYe+KL>-Eh$_%p(s5Drku6bb0q3X*FPm4P^^!QFB<8Hv{FATOF)LwaDIjxLx0}x zguFfm(y|W?`1ixo5Tv)32NLrbWF{5J@sM9THj}VD)CyeQ4hXIPI|di5SZzD}ws2^^ ztFq=|s1(f+r?0s<3F2zfepZKu;n?6Jg9K9M7gB8qlfX8s@0Q%SfIrG6p=aA3^&v6v+MgikX4y+j8#fJ~IEj}}!4n|hA><-swZRz{+XVr2BZlc^h>M~9;kv7U9C%RBL= zmKx31NmOc9y=N}p{arXP+cvFdaRItHpGuJJkZA9x5dgL=YNk4^`jjc}0n)ajRWu9p zWo9>=?I`6g@@?`4@~XF8AR=@tXS}(h5s1SIYx}ay6CcU|!r2=2B3P)O)=tM;;_4>^ zb|eLpdTlOr03ZVD1&RStC)S@m05f6f%1_xJ-_NX^$s}%-Tw?Td*1m12T0%_sp&;XI z=ok2xL6AR$4}`tq3j+(3=j47Q1NBE)g?B3lj!t#W^DevopaGAod3yV5Kx^Whg0`9s zak>x*t4OvTg+iUX*3j9?$Ow1H=@T6%$AdU~IX`k$eXJ61lZQS0s9uCFE*`uTMNf~#Fot|Kz$>;G!6V|pO}_{uNc9NiK2 zYrR*jeV36d7h;}0NyOO1a3SrJ7dlFk%zwIUzW+^CgV#sx|ezxg!X=kGs+QM}8A7~C&V%R|)i)TPp`gL@+1E#;C z>W1VCEyO)sMlj0uMF27%Xq5p3oc0U;2MT_FrwfrOm@q{tY?FjZ{Tu zRqoS%_(y8}$?7|s{B%UEws+>~?yhsY^uR{nX>lc*g?VBaXK$JOUyK{G!bKC#cxPa9 zAJRkF;)`rAdvaUt+V~7aqV&fdaw;~*f?wN~AwtX6j&qyH! zPGv4Nn`NPBA)P(suua~-PkgU#h;%mx^%!~}LMez`p408iJtn1F__2tt(~3VDsXH7{ zJBYt*#3=*C5o7qxXGbC-!-J|5BU#KEt1cqr%8A3`>jE?7p`#aD179Bsb0_3P=?ozB z*JC6=@ww0#P|@6lPfcLh7NGlUXj$O;gh)q8Z^P8&C}r^jMd*`Rc0`i!tz~GTi?9LpWH}q%>OJ4d6HzlL2_n#D**cebR##E-!sYKM>Ik z!XSUHoq0wkhpFo-68?stkMaep`A{)}#Tx-KGu&@wSbR(DURk)-p%rtl$_R(aBwTY1 zc3k_ynLht-$QZn(3W9Nu$=-WoG@0>^+ zP$h+rYupKf7xvT}ybK-M{njZx#E>2+WEPx4y?XZFdUpjR`PY{2YaPa`QnNK*_}AFR z$Rb<5SuJGkgvmX0Z`N=5JQGgfODN=@;ilKyqQAjU&D8|?alAB1cxo^y{l5)`}MHN&IPRsmqxY&IJ8WYu0YXKjsd z?5{=bfnWKhKYDukp=o{Foh4{t84Q0_3JZnKIaWUPK_V}JQj&Nq6w8G+$68CB5nR1U zzax1%@%k~{GZQI1R}y`b6FGC%CPAi1%Px26l>Csn7<{GW81KPsfd2!FYFQ^>&t|0< znldcha@wQs0?Ta{y16px`R&jdd+}9C%3f0Pmy@yBQY9`e#@OdF`m|C0Xt3Tr*}CK+ zg$4RJ3;<0B^{0Ve7RE8rhss`3@|xYR@{lEX^oe)cE~Zj@AxeHh+~1pnq|ZVYKgmlL z7-Do*$|a21r>jZIUQ+UxlU2KPKe0WsD5cuSxY@+du$`(iLEII4O*Bc|W81J? zgzL79x9#P7$x*Lp@vGIyg(AZrb!gtaGFGmM!|F$1$-S@i-k$c>qKFUY0gWF+$vcQ? zQ+*s9 zy|wwr63ekdJ%T17H43abGPU5_ITh_d6+qCCx6dML67PhGB+~rjRO}5B7%4Llj&f)u zb;W117ptA9_7_k6RAl(f+{N9@9P70mF`Aysbl#-uJxGPflzl;!Ailmo^ZDNbEz*uh zF7Lm+2q0?%_MxuN5#bQAO5E5Th*WtfX#z6vq3O2$LWKJVlYJ&;k77B6{u`)f7CRsT zsP@cA$*6@?)sk)}qD@~lUpg;}Q{U1Kq!$S#;Y^p)px{D~gvrH7c>`^aJzT?N+FaA*2*-WYC?HmxEsOmFIRi`+C)l2e(CyfUJt) zj2VUR`HJuqm0=@@nWYgphdQ054g}dSLr~!yZIYi=lJXUxQHL*^CY{X2o)C4gHb;2Y z-Tbil0du@BHyJV}T@MqaS&K`h5m%pkSGqLuTgkEo5e*_`UAsWHG4f&?w;WHd zt`!-Qr0JO;hN?a8Jem{Z*=dvth{c6f{QL@1>1xzyHTbf}!T{|H6P zi8kB#{4h!ET;i5Zm6NrY0X-l!G0JKYvYkVbSc#z+jG>S6?}V(2Q6ZZM-)qpR;hRWO z3*fQKmGC~g8#>j13e(YF)fq@KJg9Cq;U?0un z!CUANE2Bf#fC6?Wxa@6B&YIalE$+3QTgVoLS?le=%SOT>vk5rlR^CBv)RbGffi#E` zGgXKUs5w-C#I~NIkMUue0l7-C=nj)Dd9$jQd$gtn&+5uQknxoY{-MBIv$VJZ7`?em z1eA+3!gmRIR0_N=O90hX`40dq4tCxH25OYZkgM63A~&C{6pmk)(PtJsx@*~^PEef781$2hv14sxK{)1=F@E#2M+1!fKe3N#^gdDlPwBlT| zl~1eda(4MaN+d?UW>H7ZH%m3@ZX~Ehu{&Qoo36N@o1`s}n+djXJ7={^BR$EChAHm=tG&Msa?<2#O3_RR|WC zx4^;L++z50rn>%g7}d$3h0X9`HJFwT#8M$wh~7*wVD)C)!r^2*=L5f%kMmu1d6iRM zd-0i`Qc1-PuHk@V*SkHZKX8a|0bj1bTiC6>N*CE1x20GMUwDHUMKNZI;^9LySv1~q zHV?YsUqDy=qNxFz)5ocsgR@oB3VLK@E;Ml?Jkgzm$YteOSx@~jCf8eO-F?huUn3(C zz<%Vu3sQT69HN%cRk<6-Fgxu~AsBkM70B9b8bwS1lkN|3mU3e5?qVH>U3t!Ea)+_n zD`~@2!;VJ&(vLqyEq7f1CxG45JfK@QJ^?|*j;w(7c*i9d-YG;}1qTq&Yuwr)MBUdE zk9AbFitX=^L3V2il>qQYwXiIwN^Zd$)3+8iM1d%TqH&wZ-H(ri`JWs zQ_u@M?Fzjk`qt$D6@mJC$;N_s&uuX~0LXBV?9rfBL$E_1$%yn#oZY8hkqtWyPprVJ zr5#KunzyBt3c(8g6mydIZOH(XB>k4g9#?l+)8D0oZgVS-f$!MuUmSxE95~uN&*>h3 zfB!Ln*F-e$+#Ko9;Ldv{J`7m%ql ziW&TI^c90&#MqdEPl!*{MpGpHU3}&4N;{a@!`gXb^{{=|# zyZkF~QKkzBZ>12gW`FItZ{YiZ`8|5s+6qyig zF`?}MP-!ti@A*#8j=Ts<%dB+_m^KK`3QC0Yvz}?awlfKUMva^fV%MBjMWhWQFt272 z9@a=N&^IN_z4@ZQm;&dwbg^NhWbOp>6iA=T8A7eReMKBLy&C~eTCCrh2@MuM@a3BZ zf{emtZbIVeDaWVov|+GyfqF(oi){r8M4mTI?}~4;!hb2|J6WNbY4J7`K;t8ae&if6 zglpG*H3fop16+d{{D<70o)=`m{PXg#Nnzl^X`)G0zsV zI;ThELPL=+?5X+?(D@xE%P9BV)8qbvR4+~XN0yNZ$q}B3!WQjWvt#t69+l)y*Ux>J zd+++P6(M`<|7;=g>vP_WNtG#XD%?@`JvZYvhP0%OXezLs$yv1^gS}tUC-~5=g@*tQ zzF#huT0j3LWEK)lW6PDy#T!KHFbe?a&oY*w^6SGrvUA-tXH%nPekXqZk@}MH_>6|a3ht#*Zx9P1PaY|+B-oR1LuS@Hvqsc& z&@m2WNPIDdN@&tRQ( ze)n$G9RWY~zi{^RS=y<_eIOc#VbOKZwt2w>n+EnSfmc3v`A#f4>5fDwaaqI)hA?V* zmM$jx#J=j!(O8fFVlCcgaV;5UAU!1=`WH1=aMdME^m1?6e=}RsQO+Lf@V>2@8t!SC zMl~N|?g*2VW~aY+ir^}e28W18&dNJ_tJJ!JYue?y64KH;mrY^hdoNgYnIBGYW5yC( z7kG`!N*4)_wTI_=VviJOR6&i9A22zZvMIT^4QT=nb-!(pIgH<)oYZ^4%cw3+zOwmX z$C#BV2aK%5D;vEJdta>Crhv?PF`Xk2jcY8U=iOp%)lj!DZ0up3ePbzN3l5-Flbg^ zKIX#G%LrpCejla~6ZR@A^(D591mIx>56*&G)TRF=c&vT=htPGRzOZC6;*&B31)%|G zIxmb0G-)eNhKyJMJ4vf5cD+$vAzp9i99|i=C>-K6qs~j zc^!ap9eZt`mC0M#0B1A$iU74J?YZUiY{q|jTR z$0p(E_wyge?+?I}iiu5V_!hC|W01*4te`zK$?RONJiYbhF z@TX*Xf|#^%Z0D7@5%u7l+Nj;LWZ-9R_$f#KedF`$>Jsl$G_h8AaYv)rk4|b|`2{f{ z;7j>Vp&T9o=@na@O-fY&oS@VtrczlJ;)MOvKJ%G5-eQFE~GkatN@YQpgrrBJzm{=Uv{= z0AV37_fPl;zLx{(jdHW4;4IOsYj;_7^8srdsG~y(2?z}UzjT68XXMJHUQI#2|6RYg zO$IHawZ;LKkq>$skG0^x|9ns#lSnwnL!s_wRpK0;A9OS5YM3t6xm(7MBmS;< zzfe@wwl7sVPy`?KAFfRdPM|UEL6p`^&0ME;#IzZEmP9eIAtX3g!=)-yN zlz;#jNK3sVPi2(M1JzAso<9-;(!S|UTcjwpt76Btd~Z_!HJQt#NdlBLhj<(G<5#6S zepLkk+>t6dm(i>ztuasB0JU5ZP+lSEUgcmjB(}l?eP1p@TSO3)y|4_&GISoP1gELv z3k?__-z*14tjUM8|A zht$plkv$ynURj3n^=`FvkMTAwylmxX0z^-h9Y6th6oy7r8m6JfpJ18h7yfr3rtD0O zbS`egjBv&CA9&akk0j?p-=%X=6bK;G|7LRAIM-?MUz^PwMpxvzT%qFEf?J9KaLj_C z%C}sTCPJsxIN0(^>A>(YNWB(Gyfi{Ya(^As8!Z1 zZa!JxdTw=vtA8+A=!B*-9aMO{g~MCD^sxTL?r1mAf;*j?fgQCGdp#W8p+!LyDuECq zZN@E5ux)7}aS>lr+=*OtJ0yxHzpC&(z+x_{E#8KLa6GS4F+&~{@P!bW?fL82oz*70&xZ9FPt^iKFtD8@!7G|3@#YWsohQKzbae=(ACm zUptiRNR1xAjPbwLePIT%3vTKE6m%ez0AV21vIBBCfSIah6&hKst7ka0IS{|P`zGVA z7+GMiQL85`$!;DRl0#yqyw05#)uW`OP^Y`A5@-o<|9!Rz; zr~hsx(Vwi#OU)5rrEin|a0n^VYf4xUK?UfWDQ)yh2L1@n=&xX!{qB81nngN1`f6Ic z@stF&Mc`eY>|DQfoq?zhvtWslX@Pw;8%^vZqEg685N+G2v!^F2{U!VXC|Zi+8UDHM znwA0{PF8Hd#)v*n(@)Nqovia-jfrDeyd62-@{gJw$o*HraQeN z(jY@t9bEeDGyH<-Bd21(f41=T97pYW>vx$;yo!0plq|c^#lRw+b57$4Vw(rkOtck# zH&*U^@ad5weD=m=0ccq^={lGzk@(ly!^60t084S`s!H(6J}Rt07YWMs?`NxS1?0|V z_!w^SbkB?qRoxgGFKr#5Piv>J8E%Rl5*r0hma6l5^zinvcmNQ>F*KlfA>rK+ka(Fe zS4d{GAuvdxySK^AeBk0V|4xy_Q1-eEQ&=h59=0mIj+)LYBTGos65{nAGY-6uUe41f zE+|%k-z`|V%x&#cHgkW(9zf3zBQe7jGS@iQ>LPx)_+=2kY)@8PJTlT?T17q}&a0CG z9DTz^-HwNT`+3e%y>^%|-;d(6$(`x#Ih>Ge{07^^m4TR3#~-(jFg${n2O*1Mo?)(7 z!^M3zKN01Z_Go|qStsHDg!i#HMumE49C8EX6tG=N7rXyH0Tegm(KVGxU$K*s993i_ zU+Xs&3jbCl*%93&_jL0ufCj%)aY0k-pQ-n3`2nSP-$E;Ag}22T6zp-56a`7U&a@;v zw2-xmR|QXAyN}w`nxsOMM{PUqNht38l>h($00001AObLOFp!kW4Z@gKd2uD_;=F_% z#v0+_<=vjpGiBAUJfvlHsbTQ!l&rO2cip~hYpClkKzhrV<_Sgcdl3eg{^o8BQ@sCA ztl0gEe;d>%NyStJ=H|qm`HIcqJVMN^eYAgNeZlD#%guHI%Fv zO%4N%`G?qsOCOmIASbV2Wt~ydkE<;N@Baq>im>PE``G_~|7B$P?FcBBl7GD?3|)?x z`&$bN4hOCjf_Oy%>lC^YqMB-tZetBxB%*9n>{ZMVdS_nJGIjtKf!S1SPt?n$tpFJQ zihRfY5%0y5QTI~8(VqO?Q(TI9JC8y;>UzLGSXkfQGM9>2bnQ`Y^_fKkB!wYo+*;XV zYg)p~D;ZJi`|TE|d!mw{jHWk%+w;@d658IOpe2uuqGR58gNXMtN0IsgxT6qloN9vQ zA$r*+Hcg+qoYE+W6f(!^8wwH#4B5BtzhZm5FC8z0OQ=R?#Whuo3;ninWD0^)o^M4y zY=u0fNE>c!Xo~lT>tEh!TMiuQTmn2^^so6@PF5&WqY`I`C`?)7x#Q)pPTujY6u`(| z+y7d&O81w@Bj|oMy6E?|(1WwobE&}(jslGtt;#m5FCCrInqLibmPl`$V+>FKfB%2Y z>G6LP3Noyn>Xo@Lcf3@b7Z3s7{ew$p^ZbmV^~wYgEPmDtAcFn7BO@#iwtS!3VxTnW zKb)TJ5~xLp9+B?7U>73VSpEu+F0XfS9wOlOru>@q3W0ZIB7&KSLit5@0le$qu>LKE zO&Adtxd9b9jqa$<-w;3m000000000000000D1V=i0fdBue?)~>jd``DXI2wmuu2Ik zy+q~g6x;1ITkx`}Xhaj0ycC-@tyhkdrV`d(3l%#;U#lL%BB~x7ck9W?tt)U$C+}ni z$})(DW&m$@XLr8T4|Z|7Vs-Hnp9ehnMx3x8DbV01PA}St8hY&w9<*60KeU^jw*f zVKWMXk0d^aO}8A+OlU&?EYTQD59f;V=WS#nJsbxp|6o3f%#z0CgBwk9yTx*tFh~+B zhD)D%xgh~^4=FT+?64s-!c^d>$0;DgiY6g=w}?SF)o<(uXeH2pI|HDhs2zQTBwrQJ z;lJx01JGx#Xq3t)a(|6e#i+oluPRr$!dw=&%UGl{#a=L)+5nUsqSb$pEl!?ui}xRC zA~Dm~$SHh3arCH9D8LP;g2Z?j|f{>2}#C%|4PiSjcj zQa&;$97I%+tv~+FbJh(sM*|*a)6)?3<&~&K*}Qy_pqIuxXm09VBQ<)7t{< zor5)f20Nra-Nfo&cqS}WRpA+bG4bkvkN^Mx0000000<-*yX*kMLPh3b-~+3-cV0(G zOFk#N#8=FtDh~qR-CUl0C_k|Uku(-6oB~|zVIuL?g3YKhc z2}qmNF>S*c!IuM-#cwh`L;RXtZ=JShrw*3CxC*l+lNgi>`(^Jl0K!5-42!b&Ir!v~ zjnJ0@)G63YM*A&XWQ%EtH2-4wO3#&^<^eG+*QT^@Kolt`4`{g#D^`|E8&%MF5}&Xj zZcxL+>64~zQ_IntXP?^z)G8Dk+U5EE(DS4W8L{2zvQSW*>jeE&6epCRA#qOnQo#vk zp`A8xD4qmM&x7@m7IoZ3X$JFC%n<(HZXj>>cPggWy=exV^WzxK=7vE$92%-AmWnU{ zVIPlb-o>CblJ(I8j3gpOs%b4)sx`)VM2O^BS^0lJ)|=D>EV~F1%7sc}4hUO&GS!9b zWoi0;zxMNGS9w-9I8wEO{CBnnKE{Vy&9W3R+9reh%;h26r=>OkcnWjeW%vw zE&yI`eat(UN0sj11Eq0UF^3>qkV(giicRTthXQh$G05-#d7AvH5->Gh^~r(Gv#l*d z2+u0J~POQ4er!LpFJbAY;N&1yp)>7w%aS(;6@*uc3?F0$%T>D0cwFR2jbC~Fu zmyS0x0gaQ#c3WfjYSzYmPX|(hpYiOyxHxF(Yt%ZPk><=rsm%h%{H?9WoZ75ZGh+Wt zn#?9W4rt6EUot@C=nx#b<7yB?GRYkwR?^SwWj~E9|RN5%J>aU2{Sof`f zcMGFiGdYp5n3u|7zF)vyG9VtFQ7UZcahsB_t-yE2O`JVhv9#P*xV0%EhAFoVh}qT> z2L>VOQKG!hIB3iksAONmr@Beas51X(=M%hz2Mfb69|=Ww9m1(E@1%#3EYm5^BcIb?!|5+8f%Z@w{4>7Sd6YHBB@(!7iquVj= zm&VtGNM7Knm(1$v5Bn4zSwP5N6;rN-VS&j*cjDbXgg=Na}pu3LAkpTpRbl~Y!7YilQZQ<|yb=OwPm*(pE_8C4J;ALpP)(YS_ zAhUJAWE7lvnqxpW@d)}J&4Er$Q7(M!b;2eP2JvO5R72lp03@3>&{-R#glk!XeenU6 zQaBE+?2LPBbTZ+W)NWu#O~I$xaPCd!1$8NPW3Q!RHl@Qa6l~iPmFtnaVds~dCB1Zr z!dp#uchSR?F!;EEcIWyWB(Yi{59a;5>+%LZ;o7Hn({P?q@)H}eVE{`x?XSN5gA4UK zU7lhIe%h%dk8P;h;us?sVx?TINNh`~VmI*)G)oG4^puQhIb#4F3cAo(PXH0Ol_;K) zz#LTVkmq~jJJ-9}Rov6ODfEX`U!Q`QoR)IH#{OtizS&c(}o=65fK9lZu z8do!Pb7n_;j(IYPu60q!yT#uc3dN=`@dc374F?U729>`#JYLvLaxTwd?^+54vGvT# zwJ+licfsWHD=%VQx}-0(gq#L8e@jVZ)T6|y{tx3N`Nq6Zef)b6XUywhFgBnELA41$MX}4#?V)+ATf1cVm-^B^nq2E2M-4Do{Fb{u2m=Qd=O&rqhw6CuhRe zg_1&?%7Xxd7~-r>_?ia0e5DLc$T{KzEC!I8ht{1r!klqVYm<-X>nY;qSxnTIsTBukHDZAZKBbS~ng66p%@HruqP) z^Yb6ge%fPZ^(8S2yL$nAiBOu8M0EQi(Gp@)7fA4qv=G&!@Um~m$YFO1j>u@hQoTSh zWSZ?x6uV1jaFrU{n%>`ZtR#Fw`sqPArI@FX`F8EL%YfBcC7bFJudK$NXu7V+SHmtn zBx_QnC5FX9ePYqEMDS5oI$#)XB1Ow%{|VMg%sHhKcgWPrcTP^_dK+cJ#}2$o7IOA8 zNf74#4s=YgO!yld5SeU48YLaAam{_F)8co~RA52U)*rP9K}Rz5euUUzLAC>Z_J~P%IhF zkgj(ptq1k~fu$zm#utIyg8^C?0giTu(a{j_8bBcWhA zWQ^39VlJ5U)a4Uel>KUlULp9>^2Q?;KvboK-#Cy{bP{jDl@znf_WK!JLzXh_mmMW5 zxfQ_xYFA#qLCGGJg|&vW-1&bxoO2?Dh$`HayxY-$b>^(Z;MV8h$l;!fp8`%ZTAg;1 z!rJ>_A7lME=As}y_q(jH}3+MdFF8UxGoJ`f|3! z;v{CWfJ-0IH`AbJqo&Eq78x70qA}+`N3=r_*t^!^S?$Z5_5{V{=?y!Wovi+oZL2?o zJhWX}*4z{8;6$9e=~qQ`4CT`fr9$gBTZ%%ywU0;-z+%#AzEgGG{U+vjL>ps8lLq0- z%Dibpr7CZIc0_t)yWf9QPk=kjJ_W1om(YIBSn>%(T#JoN)FFau_mTPE}Ic-b+IS zdWO6(+I{;OuDr%BIhEo0cK zLv~MYFBNDI+vzgc>iEuxY54oP!T1CrRgX3lD8mXFVxRBTb$WaZZzk;8!7{F)XS|8WiWh|}7<8;(zd6To_9yEQwKwJT0N zlW|-~ck|JSvhv#LTkU_#gH7g4eBcDCH2EhP*e!q#w5u80_Bi^+@t90;*iK4j{CHwuWp9yuc@9VWTGxinDX1U>>ce3q?TkCB zyvx+W)dplPz7<3-klR9&8eSZ3vM_k$hxJ!qs^R{v_5E7+{;ekcTRHx!|9Z4oGDG^Q zf7Q5O)zRJa^=rOoJYs6}$Th*o3uh@Qy zMjkz!j#thLek!#&Z&P;{J8)1_o~abkcCtWj2#0>X1lXzD|Apfv7A-8KQVQ10UfH+( zQbT^Yw5?};LKsL$7p9|ye<*6W&h~F{zpnD2-_!7rDP5f`qDTQ5Hwv!2D%WIGQJSlZ z*k6Kz3G0S0Mi2+FhBSR22@OVAV-_^jPxa_Vb`NjQ2i5gg*ldQIvTFy_S4UZeb!xP| z5ME6>*HF44jJB`H+Qz1le~HS{{n6KOrP;$BDlS`+-L>T}k$xv;+1u@zx%T>n<5ZC5 zTQ|@%-uh_we7qi}q=?3KmKM+>S(uCz%=_O5VQ>!x8U|3dR3ovq2} zptw+zc}kd_o((3CxS`_5Ni#i-l#@}I_fZ#y|8v5NX^%?ZDzm3n4?;#55R&kwf#@Df zX7Cp-N%6^OPUh{R1CWuQ69@K8 zVggVR%HL@WCNEG$2a&j|2#Oaz3ILwb$o~)K9Nof;;0&u;&IVFm@2p)NVRUE=dLOu`E&B531c;y}mrGbP1Z#vTmELCP}Xh*T+NuX%y&_k@XK?9+R|9y)w zC*?dDZWS|85|7YHV;Q=~ETr&jhrmqt7znI%VbXUcIX7#{ z`~x9L&bgd5hUh3ZA<<0c7`D?sh(RU}itum6LU>IA zehkReP%6?WW(gAv7`(pAK?zuKuK32~(e>z)i8gfDL9sIn_RQUF={1i@1M8u;%Zc5C zjJ((WUn}cS^9$ubh)Rh5kbxLENbUA}OHZ3FU*mdB;+j$7sv88b>FxB|vI4l_JB!yv zd2o>F&41NFxfS8w4Ph)F(v=^-Bo9+gaXW0?f;Yt{Tnd6VDxp@t(ituO4g)B@b&E;Li| z#J@_C^6mN~rGJHxPg0b4GHYFIZh%8&{(6~eK_hTS$h6x&oSON9v6Fe(`f2Ma=^fEr zg~sEaMu7pTcRj*$0HvrHL50ci%_K5m7LRH*(bj`WnhTV{_rnncwx^2VbE44?X>gS? z7|cZNq_dB4qTxk~V6o5P`yYji9!X?V9Cq;`lkNAG)7QGFnqFBdB7>}ibNdQUbqb-g z6o=1%<6B^j6wb;}-KaI#7fDN9*0l|-e*RO9qcJvk-JG?99yTxcXOikk-=CeHT^=^3 z^tVY`+OCuu7%Zqb>x8nAAprz^al##^^6(RERjQZzklneUXi0fnif<_vb$LvcJF@%t znfyyu5jZ#DJo0icyiI?d46<^~!$Q(u2=^PJqwzYC0muA17vQ(LC>V9Upe`|TRHF5R zJ6}A#@uCR$QlPm7^=UqfVmf#kn$NuKV#`}qF_#6oRQn31BPq$et_!wIAq*xA@_$f$N zkoWs?sHd^SG6fqp)U?&v4a6MqkDQ#43H7KX<79zxZI##a1es$>VW)&s<<=cRL*_P*pP*^9E%d=UGb)ihe*Ofvg#SrSNvSru`VStvw&6gTu^1Nh9B>rPg z<^mrP04}u+smZ22)n{%4b{2Wbdk@Bm^6`?AyD+MEiD*`HUQCT^&_r4EXMH82i17Nm4<@ero0QXI@khL=YjG9F_~n{(cG z8)0$d0oD3o(@1kAW|_Fk;YQv3q!~Vi`Jmn~_Ws8FaFs1v+wp5u^=Z|&zleC0nf7;| zNyclQt(fHd4F+IH!iu+komK+^x7LH{tq%$wVpug+wsDc-eF;;JE8Ykiq@dFT$YHe5 zx{mf=kFd{CuBA?+gfIPbBlWx!SAyU>w41mMOpcN!F5<`SH)M+_Xh5W~B63(gT6@Vk zcyarT_hj7f@$5k94+|BH4UAU^BkNN^3*Cr>xdU+yqwbL4didWXk6NmhjNl&XnkhT` z5Cy~e81IZGxiyHO7RBHLh@`Kn#U zuJBv#zQkac+GM5pedYfuf2w0$plN#SE`rqaMNen<9>DF(biGoWw&Dpyqi-K!3YB=< z9Prabv8L|8CJ?c@=6-J>E+>*5ZCGtx9>BkBl!Zr?JwpM+cE}yJ6QG!AZ(8Y?dvH`w zsY&&gjJ181Y^h|$abXPw1sQ=<*^V;IBWgNgkVt4i%qUF_i_qAIML+N2DM2l2-C-%l z9)l=1UJXQN$diI=5zGNzve?h|tj>D=@O`5-5bS?fP)XY0jm>pto9K!#p)-7A?e ze-w#Ye8{HIqM7s`83(`;z61^vDujZOFy&=X6L{?6Kl_K8S7LlWp@+cbD-9d{?hzcl zV-$*?v--;+4w(a>mEeZXhRO{s|6S3xjKYx!p^fYm0aN7Rf+%z8b;jDTb_IJe-AQ{{ z1l3iI2x=4lb0EAFp>zD)*hyeI7psz$`=s#|2?b!@i3sa75r6@Ngtm=AJ<{qtazFol zAmgS);2UQM&{Pi+GIV|`a&nc?G^{Z=l)i|5oQGaw3<=r*?9C6|BcrmAk(AC1U;%`L zzcTpD2d%BW+Dx=(W=m&Gz9ZkwqM^j;rlWS?&V}XfcEgJ1;ZKLx|9@+(e}?~G*8ml! zsC;3^@fiqHq(u4Dm;hlRDRaw>i!a`b2)t*!fads;O?jYVKxEdu_bfhKLSsGO%%Z{5 zNn(y_gm#gm*k^~qg%I;S$ z$2ZpBbw!|O`i{a-`CEPya%lWw?(a$Za1}^0%o{9=OujQ*DLZM5WZ~Z<`GJNE8hYKI zvJh)P7=+3uJDN&if4EUWwqRaarjJN*dfF6NaClT7h1!L>)JBn9PAwXZ82cQ;zQr~j zDe@HCY)0)PbPMe<=PQ_d7)x&DY>ZdmA~Azm^261QX5{qT0%tND_DqU--qG3Z(}U!r zOGUZ|{nGH>gLYcwf}mE!1qhi_|9|vEkbBd24jc``B!=PlS=(dfn$0Sre{$NKZPQUI zX+Wbx6JO5;7fPVp$*P^@3Ck+Z;ig@ajKov9)=MzWnTGk2TNW5jyo;p#U~}jF-N6u!w}KJk+sDVzo>NTBl3hzY;>Bl@W1ecdA_$L7;g4 z+=77IXS}SKMol4b!9ZOtG<{1AnjFhz&4RsyJW!wLUHwN%t-MR}%1kwiB_7H}?xmq9 zDIFBkEO&hGVS`^I5l^cmmFuF7^v%tzz+)B<>!hb3suR>pyBwB%2fd6mzMzUnDHkGPv58FUMzmIvarw>BAm*6QEIP!>gv^B#Jg-Pr~(OzdvaLMUMLE{dC$z4lY z1)Al5PUVIq+P2m-S3^&Ts-TJsR)~)7V=O;NJqDu)^F7$dpl87CTsrfbui6NAT zDnk2I(1^75#TmQ8I~m1I^0jfZx##l{L^$kyQ`pr?JU7I}6yJ~W#9R3mO zdq;PZgpU~(r2K~PuHwr3Rd9(;Gj9_+-@sf_abZ5=z*yRekRI7=h{fB$*R z!7VatEx{coeP#UtF6m23v;3;I@4h``li=Ji{*PC(PcDJSZne9g(~Nri7Pfox+#o0j zPX!ok_yF>Y>Cm^eI>1t{;6V@o00000000042wFLMeUJ&cKxCbI0#2=)FLL?EqOx#! z8Wj%}pyn_*!GE^ujaL6a7nDM)hEYf!N4^yY>wT=Ic7Cm&QMv3YHCQOU7U!86*FYTP zzmOYMObfzzkzv5tNcp=QTOh`M%vr5i;eQ={~N+QBWE?Y+ba3Yle zT)EY@6hQ@rg96=AVeZDs&Q%v~Wj>2I1p_#$*sVwh2(92*;^)GmGyi}277rRkNVNYW*nSeO$r=}7^^&w@2n=pa1N*3sE2t2h01J&ttS9c#d}{{$ z7*--4`j6K{t->R4K0ukMZn3{TT6~tn?~01*AHlRPm(Q3$LO=h1|9|UqkDN_}D=bC^ z6D((2Zwvii%+;hpt0|uIMbh)#R^v2P>mj=!QrzgJ`BeC{b~e8TWjblAG*iU?V<2Rw ziGSxADyDCxp(*{0hBhXWhfl-r<@X$T#GUaT--N*U-*p@REbwB4000000000000000 z002OMugP}Kb1^s(T8OPkVO`W-eH%+w^AS?alQLut`mcsDYN*YjR>!Jjk$s!sXa5R7 z;vNNPgw9?0k@gM*;U?G2dl~eSGOG8C0x3?cQ=C#MLd+KyZj_*4c?0`5Qhxs{iFD{b zD|il5ojeTF1^R;fcoy0SfB%2{-#x^ObGS8RP2$^ez{M(MZ_)Oz-pS<`WDlh6E^ntS zysMeNt&F!DLh{?D4~@yVSKsWMOPl80pOeuxfatJ>8)!doYZgGBW>CE`F4n2`Tv_Ex^FQ-Iq`-Ccz(UDHlwyOJqg66MXcVy-XQBi~00000000K5SyU$|AEpk} z4B{~1@OtjphX;-b%@*cTX53asJ(C2pN4FYA_lF5Xh&`DO$^Rc!GV~jkKb4HWL;xbd z=+J@4e*a9vIowb~T_qvZ{eSvV#e71)xsxs2%K#Hiv=*d>$7*KUv+8@k_J1Iqo_+8@(vilUI>^ z9iiZ2KSS{nWkhXIx}TRh0E$x}T64LZ4uo&#di9h`)q#K);jE0%j-ZYn1vunR=9QO| zwB--nF`Arg)*e4bIRz4GDeMp!mAK)^VTM&z2u^NMvj_dVtPt&mG8PZ1?noL^V(~cp z{3o^G#hVp+un((7W1_orRePsBnRbIt)lbm8C$As}XL5FI4{5Wyo<;ox5jSGz(vWF8@rZgV&bk!qf5oCQL=LEvVzz_r}U*GZ_bgO(|Cl1@EXy^r3 zb@I<&n)G#@Q?O_;w`R9(+dkX2ZQHhO+qP}nwtcp3n|`}ae4^?J$Us!FO-N#>a2 zTc_#JpB+UC<8OtqdcF?NAS|z48I8v7eNpkU z-^v9QFc>-=8p7fg#i%sK&l&S(#8o z(ibNMe&zF!h^%n7N&SPP_%IlbG833*lwvA|M<3ol;)1yfRSav9jLqsBydyZ zkih~3Z%dc_qn?2CgQi?AhBktxw7t4jzIi5j_Ps}Pw)D-rM<1oGi{#*`?I_@tL z|JeGlAb_?RON6K_P%V~y&p{`IJD9svloO`bvi*@i zRL>jwkZgTmmQ;E{GM*rECDZ=Uua3MWvUQ@@4Z?&a9OXs4l@GjYK~ut5uRx_AzS(GG zkA!`6khsuAnWmkLuyO}=kfw-g&ton+O7Ak;%LpFAA?a=2R zt07jkPis8VTv>Papdfn1hJcO468J(OLOboWf+-~ZGV_ze2 zH%f;|2mlABKbI|DSa!~4wF|%IZcXJCXXu)kq6})^^nQ86H2(m>C{U0s{sx2G}XyT1aNts5B;1U6-sXL)Wdm=~Eh3cYrJMp&T~Pq`}lfWe&t7U_H!3UWifxO;V#iUY(p$ zN@CLHZB(yR_2KiGpg4V_p$CqCwrj_ki!Xt*Qjs@?R((s|0(+b$1{~0#Mwym#T~_UE z-&DvQG-m1+6In2I2Z<(qn#$FdB_ryLOV_!wy_#d%rC}Qo6`Uvqe^3A-^_&e7SVWiq z8Dl(y?ECpmv#5n7o#H0X)A%MKF|e<|M?y9-hDg*T0a-qJ4Z~Bv<=&$b=X3&L=L@pM zR$jKFT|ThJm?eYd!|-XKQXB&&bsiPh@u)y&vAFuN*s-9mm{+R?C6nf}U*j zgXH4SE+shGA_Amae&UY4!e$CAwNC$Fr6%y-|9LV3+Pqj9|0dS+9?)j_qZ^32?}wZ zdy>%FnW=sJN3WKc=6-$A>#LM{GZ*S+;4AM~s)^xo^uIVM>P-d20bvR!UgOFlOQZA5l}u|9k@w4~t#I9f z>VSG`Log{fqYGvaU#4fjU|qLjgnxhh6;hn75coC4e0{HV>19`NsTE#+M1c~2#%a;= z99U*8xtWws!_w?1bmBF!<-me=T=h85KH*sq2t4Y^EIPn$Nro9wa^216n3%Ly zMH^%x<#wFXj^Sg{{)w$UF0z|EnN0?W0Mo0K2Lb3PptLXk9={tJ2wwV>ITl zE3}HnM=||yutj*1B*}Q+wKdg}Q(zWx3YFYlw^b_To(wFu z2$=XU@af&sue-C;7i-oJ7VsDA;}3e-T`R!Lg3z04O01zXw!HbTmC%P_R_5LnliTc2 z!!b*<@{N+Lt|Scz2M>GZaI;ZC0HtRa2|7iRVX=f@`w=n4>vB zh2T|RA-S3t^1Ba#)nhhyF932zKH?#Z8hZUe!hHZ}ekUmP3WbItv3#$)JF_@y;9OId zb!8VK$Fy8;4gcwfY*kuTqzzkIol3C{DOJun&|!7thPu7yi;r*Y@5*W(y8>KVzaD zIJ&JB?~MMn8r;2(oTZx*a5ogUw^)sdNRz%4r0`Wlv+R=t8|$&Z6;#FRPA=(}+Z3jK zt6-ITh|1vEjemxFXGR0#os7R8>!x`=5(axX{!zW;v#3A^{VsYK_QbldQ#m;{- zc74cIcTUbIyt+Qxu36qFfcVsrE%UB?(YWAY#?rMw9a}K_4j8$A$cRblSP_jnuIxw* zy|y2pdR6-9#cq`k&4zqhtKT0AQ_-WVs$x8~sTxj5LilIBOvmrbo(95(x zTcy8Fn~!|W4q3Tgx+A0Ua<%+w*}h(G=~{9DN7(UjYSm&n*2`shi@3oYy!Gp&$gY}R?GGJK6E375`)XrY-;gqIL#(x zG_*S9T1leno;{a(M?$s4j)yc;8+qX8CwaG$5S#NqX^L>Qad^<59b?xb$?9G>J4$1d zcsIyI>X2wh#m)fvKu{>0oiOEda+Hlt$5T`WcvVN4h>ziXvsw7lyn>H`REV29B{BT3 z1qH4s->}xKe*Syut8`%CM2-wUo$PeHY+zz3@NAabHzFZ_JHt#v>nyPdqEp>2ZC4XK zN+aD48T}I~djp2Ox>&u(CdSQ|p*bo3VE_rT37|+c`_FA1x3epzLi%!|?tgk#B4?!& z$~U$wLldDlR6Tw)=C*J4n>u)lB!Ns|eU_LA0%S(HmzDV5DW}M@<+_kE+OC$vTzo%f zI}5MzH;g@jtIu3st$+f`U_)d#&5ZWgP|-z7E1w|S@i>xH z3b46ujQBwT%ksAQd_n`=cL5abi-ntr*uo#22c6A<(-$VNJfA#S9=tC%fqu<+?Au4Z zzVxuX`yUe6S2U_v-f@JJxkb zC*o&AMVI=3EbG)jq5Q4SPD@xWxFsr zxQ5}yc2j-7EydTZ>W;*n@r4@M{fe>o*I)v?qnfvcTA_LH@hrCL75Abo@*{Fz975w* zZkcl1M>>TSJNf%@hU2z8kkQN&fIfK0RJ($aL3KHRgpjiXxJ$K;>yuc(A$0EA z*WU#5VagBNvA7$#^f-@H+%NpX$}h+pB=^tq>VI z+hpeikXza&@Jg1ce_&2~qK%4g=d*L;>&~S9;iqGv`M>NG29nbL`>~W(x?fYWrBUfhaGBYNKk_tS4>#?mt2s( zWp8px`H!6!_;J7Yif9RQW=T}DX=Z~|QvHr^Ir>KSlDk2j6`8R2>H+Ecuwp<+s9)56 z4=Te%-;5cL(sE+Vwi>~tT^-AZ4ye(4kl$PB5FD45_fGqedV>sPux(iwY`wo6{Nn_h z_(M|zPokst(zOOZd1NjLgC8EWY9|v7q(F7B=r%PL-j#s8{nl(EDO2~Tf7?f&Eb8<2 zsqXRP2Vy1pIEuRNOQqUm;0i7)C)-$Td^_bpUv6TRN-*k|pa?0360?)}tSoU4E3u^@ zkW~%DO3lIBZOo9Cy(3`owZ)Jws{^7VMUz`pg&)sg!v^ZXnP(j<7@sm&1U&c%Wc-4D z#FIT>_x`T%@hMuE26nk^v7Kq$GUJ0%z~()+f#3YrUs{2-Y4aTBCYLI@===tJy>&G; zwlYLRe`XK<)c_Fv1lSKDJwWf;6*8PUTaD>fQQ=uW4bNDtqfina%moFzn2f^DArTSk zDHj;erS=2NL#$x$`eXW-T*LG@M@YwwI%4qtGfpg&N&`}BtF*l4Ht|T z?quhG5h!;tL;LgLt=Trqzmpx<5KjaS6KPm)BZ#J0&ycIve#)^bbn&B_N3V7}K&Ap= zIV>42W#C@6o1kZP*v7w?Nmc30qfDaINz}-m`0TqhA9%CTeL?ptyAcK#faoQ`zl%_8 zT&)S^9qHZ=mn8SPgN#?jQh9Kdyum&aVQYtf_(97;#EZr9{n@O1dIETb%Yf8&Ks@8$ zr_b~Fk=;u3ErHV*&K|-*B$_AMHKxfgSFj2SL^2*rBPf}+{`za;pT3L$LqhtKE3ZM^ zqDRGBU)sr9{1dT88(3yIiHt%5wN68sNB}g3V<~$F5P-m@N14d~4+toyBCHsI(U2l@ zZ}y5tkoQH0#|@+&q*DTvC(|`MnkSU+`u7yAY(|0{B%-aCWcvOGPOj?iY~ye+YPBk7vgI77ROkZW z$^6LaWWQZGXK;`yPtk^b&Y2ovWMNND3yLGY)kWMBK1B>EOI580<6SnQFATQ%K8!aqb+` z+x!+tUSOfCk$Z{X;+XL;Xv%Q_b{Wh-kX6NUUjH(P8?bW$6pdBsPSw}Xba0Q+)?(d+PeVLYl-gu)`Q4;=G&E!zb~;Nc4<=i zLv@-0*^$w9!EKtBd6-xGoyQ;&RRFoz6zZwuf`Hc(y_O!IlRs-p6C;BB_4sl*Cz&Wi zNxCPIlNxmdrZ|VXLcR)=vJRdtMbubeOO>g?v{QiM!A~h-Mz3Jr7E(UbKX(o*TLS}p zzrMQQ;FJnZ9jgq3U-~`{2H8YiIZwlhT-^QeG{~VOXKz3CptV6}n%IZ6pwa{V+)m)B z!MhdCnJ;K1Z8vg7`BApYLvUy#AF-Noi%vPwgC9(s>o3w7kaM0ZTZ1#2o7_CSyj{DU zf-EL5@_B+5!e1nl@(OVXPliTGG(lC&RbTmzNrz|yf`;tG@X-5d`fi^dQ-4(v0==pS491~F=_i`MZxRV8U$fbxwWfqB@9{YYxSM76; zCjSVlCsioZYze(NCdQ*H2I5cX9Pu0;>-LKKIp8EWv&T3c)yHt|XJ$2F9K+l+^-~n4 zPb$S)K0T_QGc7+|&JV1vh^$ZyuzX-c?71F9yF>C4ETPJDPl93l?A35TgZHa!Zz418 z>sHnGP=C-n6HOtt5|1qr2{Sv%=H9`Nnt6)^h3}~DYgDp;!PEIDcc@M4b%LWCIIO8O zTDF&?{EO!O5kwCmUju@w(!9^pVly40W&nP}&z$BB{4?mWeV#YaALD}%$&w)<=Y0Qi zkS+PS8w-?FnP|@vJM=x<`pyKGck@WjK3%%a0#jgK<8#Y4#1*^7yhRW7@~c`pGJmJ&9Wyb=Gv)yF;v~ zAC`d(_7@4QiNk}#F!ZvDtpLyuW@w;qVR7$6!HJQdq_~ zJ>He}H*A?Pp(|1&dSA_{ZN^0L9RCXR%Ux0W3G<{BxF)rVf>LuuWFeK22-xniM9q&D*g;Fwcuk6ZRQO zLv-HP1u7z7)~$CAxoA|-IbjZ;iL;=0`P2LzIJWLbXd?2R*}-)`t+rD5|92G{fPCJ} znpm1&&=RZ`i@O>v{F$4!FaS8`mMca6EzJIAgQsj;CIcRtuN}M@wL_Lm=}bitd+is- zW6oPi*sWI{u{4tGLy{k(dsBZjpkvt(r3M{z; zI^ZW$C5I@fh7UHCEhtcF217rYHZ%cv)vFGGw+7&}UYlQLy)7xnrSolDT%yogFs8I-ON(q*N z8xzBUBmdYb^mnk!r$ztl!T(u@{~1(%DI3iWuH&rN>r0`9B^p?GfPxhZ_-5}#@5iLT z3C$2MS=DgZrCu$uLoIL>?ni}PQzrOM&025o>X88%euQSk1| zbg&Aho(9-#Kf;Kx&u6Str+UrTH0(0u;JtG+Xau8`4#(c(DJGt03#&MDsQ%s+eZ}Mw zNQSC2F{Y`84NA!NdZ1#lei7wmDgIx42&z9}=1kJsoWMBaRrg3XB6%F?ezhBTO}Pl3 zPhp7PRDs=;66lD>Epc`Qp(A^GZGRrVK|xJWZZ;^?(H1q$jsLIlp^H&<<#bNy&Af*z zn6|h}U&qs}zA15a1JNGX)J?pEU#VmO+LSIk9`AUwj2C+_mSr|8zCW-WVM^?D<5=iN zBi{!C<>A(_a4Me#-RS-%1OAgMBLiz!bFU#M^uVt(6kx~af**hp>|>a3?E*Mu!7vgy^f0hs=ftGu3l6s&I~^M}0B z#x_EL1UnStT3o}VrA@w2Wdqik!u7aA^EN|mTmT1_|9C^8Di;zl{IrR`mL=WfQ@bQV zUBs=g59iN9^%8T?w^Y%a2~5iaiuHef0S0Azrp$y+ccE^kE!ptn zkvj3;7U+gHX#@YfvcCLxxM5$d?$N-^P*T5!kl3eG zIuJ@CnQzQss?mK7PMg471BO#=w^p-KWY+H@7+NdCt4um2IGBuY&ZI*hZS@yYgw$;F z!!bwwJ>*?aZzh2dnT|Scg0Fr%Zx%`hz6f8mEp@CB{}b^(fZhk^9Rz^H^Wgygv&X$k z2n0GqzsL+eSPs`eJb!;n2{$}x4A1g=wg{Ex`f*el?%nCUS0`5z|5<5FOESKcD$xCH zTVp4PHDWAZ34z2%P+Hxfp1JfjNxH3~^|D5JQR%3*Iskq6qGSb2P17XWEKa5wK30FS-%!90lRMJIadiYo`#639V9xS zlxXNE2k(e-xqB4w5yglOL@ihPolMM>*>$->z*CxEmG^+I>hI>pvwQ=GTQXI2Uc+N(3d3#4)HMQ~Jh~h^S z6*uxw4fsH$V6ypvxlJ-ARcJlmuTxk(PqSsuHf^A!@K1E{<+Z!#WexZ@Lf{DWCp!(zA%fO(K0 z8HcPKA|u8LDT5Lx#7X6jd)7~Lc`X-5Z+0YiHd!vvu!c2#gD_Jpx@t1dv$l3gRm30U zUY#Vplp)MdPC&fvs%Eg4qR)$-QfQedH)$=MLTHJ8_>%`vztmTO3n!d?XEG<_SMHR( zlB!y!ZUx#Z#Nho}8Y9IaJTlAb)Ek4)_)U!jmt(hp(IF=kBfIwV@Q-cW26`GJmk5Wt zF!vs=$_&0~bY3gYde2na47rn(W`Xxh=?5r+mH(GFk!D-PzmQ6TQZCx9RKc9PMp{HH-BNLbxZl|zLOw)r=tF1-IbGqw1xkANJ zt3+FTI`5duVP6KzXBY22W%ozUOAcGs!}N&9{}SP7xSO)ypttgq37N~<7A)m-9e8=; zjS7)5mFZ9xqL3^brY5#~Oe16^XEJWW6{5&_z=wYu2ci;KqEo?cB%9Dlj#j7+raOBuV5CuQ`E zLdpgk6iaJyT{$zY7GtPYtDQMRof5&QNL`#9>`C6L$t#9L8`N{6Z`C0*K>PNk2OSs9 z-YIE%blGFHV8lLaP*zPqqu}XKf~z7TcB-l2k01of^1Lq2DjD`Q;JR+o zz2&R~Z9KWG8X;Fum}w^$7~he^S^TdHD;|+Yv#`c!LldNk9tu=&vv;j{J%@~R`=GOZ zeUc;h;|GP^*W>tVF1W7}X&6c=5uHW6k4E~DS2~&P!?HlG?X};hDJi4w?am;s?Io^C z7l@W$Sxq{H!hG!0EabsvuF~UpaaNethE_&$nC=&7T&L^)u3qxhc{VJTwy&wEOL1f0 z%yZkbGL1U?Kf4fEl_+!vFksEwonL0C-i7T^4hG*fzjg&Lym`ch=z6SL!x|cTKpRv9 zY=x+XRnyI~ZkR8Jc04J~OH%y`P1}QUyvu0vnD-dep-{0L)fe>wxeWqUXjb2Q|2pgl zOk8S^{i1~b^5xvX3=cDLbq*mD2FD>By)AOAs4s)!W-TltCzsMRoH!eE0Olw}QPtHh zwrc!)3<%tAdsh0}3Hwe%*NlCf>U`eFPhkfu{BXJzGhClichwW3CecW6_<3hyN-EvC z8D)MbJw@d4)QxBFLgo=5M!x~DqiTq5Sa%3)8_XK&zV*S}xe>oT6NQ(UjlVhp)~WP0 zknEOIDLz3`FOI~A3qj%)CqIVz*>v)7@#e6>)RpBGEr#`{v?pdYS}qV2+R@Xz`WBwl zql1>~ATvneez)2~ZNEY_!bJIIV~EUvfyxD?nsO~+R}{sn1rvqq1k)!=xoB|V@tXKL z{*A~r{AxD&M~}v6K)Sw9zd%3S7nz7|u13G7zAeymdz%38=Ypfm0?BR#4cwiMhf_N^#I*i`n0H+1#6RT~r_rBOFAw*{#Ad3%-13pGBJspyv zUmT96do*4$y)`L zi7$6=$VIuvB)gmzNhOghOP@-m&0K;GLzkV;#=$N7|y8T#b z;8Db^y+*EXhq}mP$YCba>ZDVBEpj|YZxobTKtpbnu+H1pD^k4J+ugLpmWsJgwz2lZ zn}1Z-=|-#ZRfnPGvNcu&{p-lHoQ*T8)wozJ8svUpD=kYW&4QT-#G@l!1m^{_sli=T zrv4V+fGvM*+32}&%qEw4wap#o`a4!p%Q^ZBIP^-aQnnn$U2A_g!@r!xUAOW5)%M+n z_+|C)tt@7gyEFJfzkRb5yK8E@?(DP8JiVwZnGlix^l6FxZlSwwZ@YHP z;|&LRP@;W3Lo+DgjJ?PRIv-;*7W~T%U|qu&bx>%zc4)p@gJj1qbta|8XMvF5JYNes zKPPs}BJeU4nLlrtV)4T-BLxIoS^@lf@$3(TfC(?j~Gdpuxz#%;OH7;7-* z>99gS_;YS8Ye8Us;2kXH|2Iab*8K85`o$$D)k_i$0${B&F=MnrVvbOFCUPu3#_}%X zNJ<148*aE#4<5q&4#Umm&TjGz^#00 z(I@Za-$j`grW?wt)*55-@yT^_9H;hTYPGeUWNQeXtd0P^p5EI5V*UUuLyC*gH(jd* zjqoFH5jg8gxsJiYM!2L4Wo)!5iz1!ayzLxJ)r4syzh5x?h6sXU?f4iRn2?u>jLx(L zEJ3u_pd=|FVKi~0b}{bS{oqIZlSwPkMe2@mcAJz$V)D zfurtfyu+PtRi~TcZL@%Nni*xD!pdzFvnWCqN1Brx0d~3F0+~}flWBufr>J|&(%A90 zp1nik^x79kXg1^a51t!vp^CknlSJTo4sxNlV6UZ83xlI>T=OugI|}#7-b77{J`-7h zLP7OR*hd6D+@v?hE!K--V;etEGP zvk1**Fl8|Fq>RpMEuOVPhA->B4@X;pKH;R<$01zGdDAwmSO5i;tFU4&^XPA-oxCKh z;A}Cehl&iO=Ciz0yDmS)!{wcyoYk58iv6864LOl;>JyJLZB15&0m@OuD?JJWprvu^ zh71T8JAkKP2J&z|3BVO?&~V?V6~-h1arR&1q6BKF^x4MzaO0?UikyAn0%2>e<#+}p zpnS$UO%adac`6hf_)qq|F#H-SWWbeL_u0wdbiQLcPgVtV8T zuC7wU1~aRMcaB!oksqe$RN61%)Kpjn7IEHbA_KU6-k*m^5>$v|r|}uQvnYdFElYb< z5yyn$e~E1%8f3sW`_p?|9R4e(V~{5WvOJBRaXVA%QT-wQ5Zmr7_0xjx0y=%*Spg8C zBjSCFYwWLSVvm=Neo`>&abI>QsHI=3q9*>l%<}rbz3mvVS&vUDP@Vxc6naLu;v~cm z1oj$g^_N|);^(r>q_POE)800ERf_F|GmKvgZr%P~#C;IheBpRW=bqwL6lUk?!+opu z40ur@>*&v6q7={whkrE#iklvc-A^&U$5I6U!a@`1$jbAsll6Xma5 zHzu8V6$j>&NvW$%bkLH58@s@_J>txsI8yo1Nq}^h_~)VYwA|p;4MI&kQD%%KNL|+t zO}N)GVyPyYLq6v2bycO&9k~lP2B^C>fXn!`XeJQR5nok@R&4CwTx@ zJtSm#TBBkyQf%}uFL!ruj7NWrJqEvNq0ldw`1q=IVReT>xzm~AqRtkV=jU1QrMR^~ z9ajsB^QTZ3KR7tv3z%!CF0VG~ZW2|z>G|Z@MPr*Wc-0U!L-1S0BvO2#(p%5(l zVEqWun6?W$TGswU9xyrR1s{YbUcFch&11)C-U@&b&!vF(?jfjQ_}{%tTh4Ig`;M{x zeYBrKaYL}#USkrGM0DW5jT*Arf)zFYSby%K#YWz~)doMcdY#Ljy=;zL`GJZrr_o}R z5kq@ix^wRckI5WW^#}79R6U`3M02Q41ym^*do{{6V*h? z#XT#w;T+)$Ng&M(-R>mm0`xsL742nxb3ITUL0#mJbxdqQ zn<=gKt8hC_NJd$Ipph*Z2R=9EH?ch;oD?BeRzLpdO~uOp{;K}6DVJ@Jaz>@T%}jn8 zG))9_Kwn#jO8~27O^y6VvOh(XIWRNA}pV2tJZHB}QioZ7d)PHKFotH3Q4`)LMS06Vm~u;oec13I(Ir z+cs!@t(26%Koa-p0s7fh*@l0m8EP5^=#`~N3XK*r^^o5oO>}h>&Y8vL{+qORn1kgE z493$8GGyW-pM2h4>{Pyu@(f?zIHzS?q&;gNg-k^8U@Xn9f$o%G)l_2u5;N>+Q-!yf zJuERX?`fUZC7u{BIHFN2YrjMn7&u%&Lul40~Z=vCPx1tn2=qoO5SGVq7QK%3!h@w%U`#x?ct zwOo0~rZibeqvhxniV>w9NZ8+V`T^A6H?g6G*HY?B=`x%bn@Phkjoq6Vukxjqbp@3+ zdbcI(UIoi%1Gx0;eb8J&CHyj)j&T5bK*Fq+zjnuRi`<;U4#V7u;n0g zH&)@WagK~LFKU92pEYxs`sEL4pSFPSgFgvgkY7e$6?0R!Ya_Lom4v5qN)xuoy5`iB zKXk<`bn{{#9ojoC4e))7RwY{deUB{1L;mTbHB(V^XZ86c=+!UtEGx+HIOd}zxzFyc zfyk+TAn2teI9SGs*Up^Z>}z!n2jLz$bK@%8eP?v+h#)baH1PN~BVw%j14=C(L>-%s)NqqrmWvV$>Q+-XTO>0okE&W|;9 zDnSkpF(C78i{BxtK^%`2%jTE#>kYR1cc7LzCw%?}6tULovc*T+r*kwsBxcNIu~#Ix z7^6;?6>0wn4vg0AeS-BxbZWTSO)*atXDjX3xP-FP-00~ji%qaYt;C~N9q?o3dF~dc z?<%p11Ge2e8;*q$m#hdYC8YHH;&Jyw! zuI4^bj7dAkh4WGh>6?|n5xH4P4z(mZB_N`JEJBA-vkY(Y%kK32h-4Wdz$5!9=bC69 z>?JGtZ`rSvb1zak?VK65bvD`DXb&O3>9dT8%qlSKtfsoF9<#=~>6U%&I|*l1 z8ZUh32_u9%fpj4E7t=d}O7E=WfCbeUdFwOi(v~`%wfP?R@gdl?8iNwUjqYQ#rd%>< z;}vPmi3;Zh8z0PO#KK*N)bu) z9qj}C)Q~6_IM9(eJH^yHYa|h#6Kw-r1i`a3`=n<~ea4^50ZbA{_&wkUB~0KN4!i(h z1_5|Rr^lzWc{IzHmy^uQftKIbf-zQW`rNvRzRxp+-ms*MyA4k zeuu1H9an7p1~0ZqWrlGF+sq5b)Tblo_Oggl9e}@y^#YF|^^foXzrZEz#~+(Z8!7sa zHECK3O0i}A%F>mA_D4E)5BGuCy*J1uy&q5!VN9wCCt zP|gCHK~W=OggH?p&V#&~Xw5I>&FKOIu{-Xh#<^;2Lc`D5F{R$(wY!GO=3 zm=s{D)*E%hygTNt9!sL+H4B@Q7a&@x7-6XExn7T{AW*|91DpM(O@4r($yt?64?HA< z^8FUBtkbC*dFh3db!oF+j7aHU8+pRRQ>Fd`W?;OY;buE$v1U!|T0|mm^_tSU^XHe& zf7F1IcxE6Uk`bFIQ%W&Hkb$}=)E?Rbq+J1BlpxStp|7KXwoL_qqi2rN{61Q^gXwqi z){IY~klT)TXYv@qv}BftymyBoB0)&rS?sV|ysa@0YNmNZ(MT~2>+bM8=TdSkIAsJ7 zI4hKvq7*`&=3oZ`YIl+a`!xK;pK0PrN|4rXcz+V{-Ek$fZ1*@=*Fokuk&aY4(u^Ca z!cb^yL)f(wm<|Wtp%jD^4nW6}9*^1RpXxGdr_l4`{X4-ds)snTd#7ndK(AHarUwMw z_Z4KB(1zfy17bDBH@v&<1J9)PtP9So5fZv2-J3bX&X4y$eIS~GPkke?YRmS*kz(UJIeKLOCBMVOK3 z>80CU{`TfMnZq<-z6IPA5dGYJW7y!&U*LF zL68s<{8+*}2-ZgND+z{h)_aha;QANjL#2Wv11OS|wdT;QWoA#k108P$K$ZJ|V5h-x zB`JgiKKj))6tKsx5-2XV7`3}`o*5sq%b#C}MH5j&_XqsM>aJ;%Hfh=0bInOhh)+o`XjoK4C6O`v!~n10gy^*F zyu9%Y4ATyFle%;-pP!#qTvIyafZ4k_i0$)Nta@Uwy{oA+i^O*3v6&XuJipAg#hX^t zS(jNd80HK!ONO;wK-2cEmRmaQwe_@x9FAD(=9Mu?mCS4I3TDvE4D~GRT|&}RFf(i4 zc`emBDOCx!QqRmNOqZ*t@7K2L+#92gPQK}E5~gdWg<-nlL>Hc0WCYDX9P49ZVr*z& z!V$Q6Qn0p(vCb$qlf@G|dE_;OkhOUs(Xrlq7SoFB8(WkD6ss8U|8EUw@|;%#dai+C z7!9LH8&(BKjAH1O1Yg+lT0LOgmw4Xam7Pu+WPZ)#eBV>C4^Pw~@(8F+u@;Xf4f zF^vAP;-O-CdS-e?G5zp69@e0^tC*TW*OcO(Vi-FD&!>s!(~A3w^VkLW|1Zz4{qFe{ z?8I;0zl8O`UFJT2Pq7l?eGBMQ({L#icOQ7FVeN_^VKguv#rKK{45MNbiU;U=_(1U# zm5iw~?N{F=KJbqbH7bUYHEmtWw_UjT#=&}_1r@8RMJ_>m^&nOPH1Gu~8?Va$vw z%`42z%*x8mFDxmqsHtyTu&hKMBMoA7b)TH%#H6Ie#H5t8^z4Gts=DT$Wi51!)Q^!V z9vOIyNn}`LRCHWYYG!s$eo1vp=aM$~CgGa|N#PMefqudM{(*kJenC-b`NgH>O&v>0 zVaVXCOd>-9eZ1T}d1-4p+vZo5=R`%sBfNnBaj}Os18kAiibKg(Jf?OV{8oRJy>0Z_8m>GZ~haY%6OnUnFty zVT)5&U3qn(d}oXr-j{6VV9TU4%+1W{<_s%KYc_``@bGeTOW1WT@*J8|&$7h^0nMYdbDqEOqe?OHNN( zyNMcHTD4&!-y5V#F`^};X@aA+<2w0BeS)IW^NWfwil%#RUSCgcbbzxij@45Q%$T-7 ztkB6LFeW9VPK;@@c+tr<9eMsfKK`x(Yh!&~16#hm$k9C@B00O%hJ>+f%$$QVdxqDjPc|eM|%bXIKBo#Jmg*5~k0!(lh0I=a26>xMR)u=)|VIE8^J_M>qe-_(E?S z>!Pt(3_XfET@>5B>&i!8y!HOlh6M~~k$YftQkE%57}I5&n;3u!>Y3VyS1;Og>P)ef zP~zqu9GT&U!F)!cS#!ClGMMg}ffwqR4mX3k3 zAAOX?Wx8X zNt)K(-B?wSo*D1X$L*|ndA(V%xW$uD7or%7hufXzo!_5*Wp5M7b$+4R?NUV%8U5O55xx`Hltzw({~|fnSFEaBZ?ms zmC8HlTvt5!-PDVrMi-5?mr&4OKBAcZQSrJZ zqy{96M4@TvYp+*KO+7@q4;Q5N4<0HG8ImA*#7I;v6Ke+#5&kK>NeqI}?r*!*)MIq;WR2>V4$o!fG`>x#i?jJvV@z&wVn!Gq6 zT^HqPJ!(G70iPI0j4G2-cIP2RNLOtHm|Ctrmmr}simd0tpk0r zuNUvbd;4VL%a*SmED7?EcsN_5L7v8pAcxmx358tG*UF<0shwDQOPf0hLFFh+e&Qh!^`K_l$KUh zRaMF=C~%KTc@3Iw%>zO+{*o9Zt zmlc(kmzR~6;$`ZkWu+x$W##2~CAX>)ji+`V3#$~j-$0tX>CbCNm*&pK(R(?ad~TTNoi>bUPh{@z$@868r-QKINRFZ(bb0- zvtWE|c{2krfRT(u$x;Q&fzX;H5M)q>4(s$_m|v z5Kvnyutq*GxL{)8f)!78`bo3c80{HMn@m!(bLE89l;jo^;svAmSRP)07vjZgB`}_{ zau|#i8Vk_W+|!2GD+k_8EF4?2Iol~kOe2%`z&$WcFTP!VMNVE}KAtDbq2y*~=gM

pg;}e?)?4x3|NR(Ze76r4GSb3He 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

MO*ZyF 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

*N{|GdQii4X4Ab3P6J=Q#Izf$_h?9OHYs-xBus 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

#eMigp6jYARnFwmb@8< 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 diff --git a/indra/newview/installers/windows/install_welcome.bmp b/indra/newview/installers/windows/install_welcome.bmp new file mode 100644 index 0000000000000000000000000000000000000000..196a5b7a7e0179fb9ac572b4c0dea3b6c9801687 GIT binary patch literal 52576 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 ICon?(A1_5If&c&j literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 5ec4a4274..446bb536f 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -1,207 +1,314 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; secondlife setup.nsi -;; Copyright 2004-2008, Linden Research, Inc. +;; Copyright 2004-2011, Linden Research, Inc. +;; Copyright 2013-2015 Alchemy Viewer Project ;; -;; NSIS Unicode 2.38.1 or higher required +;; This library is free software; you can redistribute it and/or +;; modify it under the terms of the GNU Lesser General Public +;; License as published by the Free Software Foundation; +;; version 2.1 of the License only. +;; +;; This library is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; Lesser General Public License for more details. +;; +;; You should have received a copy of the GNU Lesser General Public +;; License along with this library; if not, write to the Free Software +;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +;; +;; Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA +;; +;; NSIS Unicode 2.46.5 or higher required ;; http://www.scratchpaper.com/ ;; -;; Author: James Cook, Don Kjer, Callum Prentice +;; Author: James Cook, Don Kjer, Callum Prentice, Drake Arconis ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;-------------------------------- +;Include Modern UI -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Compiler flags -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -SetOverwrite on ; overwrite files -SetCompress auto ; compress iff saves space -SetCompressor /solid /final lzma ; compress whole installer as one block -SetDatablockOptimize off ; only saves us 0.1%, not worth it -XPStyle on ; add an XP manifest to the installer -RequestExecutionLevel admin ; on Vista we must be admin because we write to Program Files + !include "LogicLib.nsh" + !include "StdUtils.nsh" + !include "FileFunc.nsh" + !include "x64.nsh" + !include "WinVer.nsh" + !include "MUI2.nsh" -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Project flags -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;------------------------------- +;Global Variables + ; These will be replaced by manifest scripts + %%INST_VARS%% + %%WIN64_BIN_BUILD%% -%%VERSION%% + Var INSTPROG + Var INSTEXE + Var INSTSHORTCUT + Var AUTOSTART + Var COMMANDLINE ; command line passed to this installer, set in .onInit + Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer + Var SKIP_DIALOGS ; set from command line in .onInit. autoinstall + ; GUI and the defaults. + Var SKIP_AUTORUN ; skip automatic launch of viewer after install + Var STARTMENUFOLDER -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Tweak for different servers/builds (this placeholder is replaced by viewer_manifest.py) -;; For example: -;; !define INSTFLAGS "%(flags)s" -;; !define INSTNAME "SecondLife%(grid_caps)s" -;; !define SHORTCUT "Second Life (%(grid_caps)s)" -;; !define URLNAME "secondlife%(grid)s" -;; !define AUTHOR "Linden Research, Inc." -;; !define UNINSTALL_SETTINGS 1 +;-------------------------------- +;General -%%GRID_VARS%% + ;Name and file + Name "${APPNAME}" + OutFile "${INSTOUTFILE}" + Caption "${CAPTIONSTR}" + BrandingText "${VENDORSTR}" -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Alows us to determine if we're running on 64 bit OS; ${If} macros -!include "x64.nsh" -!include "LogicLib.nsh" + ;Default installation folder +!ifdef WIN64_BIN_BUILD + InstallDir "$PROGRAMFILES64\${APPNAMEONEWORD}" +!else + InstallDir "$PROGRAMFILES\${APPNAMEONEWORD}" +!endif -;; are 64 bit binaries packaged in this installer -%%WIN64_BIN_BUILD%% + ;Get installation folder from registry if available and 32bit otherwise do it in init +!ifndef WIN64_BIN_BUILD + InstallDirRegKey HKLM "SOFTWARE\${VENDORSTR}\${APPNAMEONEWORD}" "" +!endif -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; - language files - one for each language (or flavor thereof) -;; (these files are in the same place as the nsi template but the python script generates a new nsi file in the -;; application directory so we have to add a path to these include files) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -!include "%%SOURCE%%\installers\windows\lang_de.nsi" -!include "%%SOURCE%%\installers\windows\lang_en-us.nsi" -!include "%%SOURCE%%\installers\windows\lang_es.nsi" -!include "%%SOURCE%%\installers\windows\lang_fr.nsi" -!include "%%SOURCE%%\installers\windows\lang_ja.nsi" -!include "%%SOURCE%%\installers\windows\lang_it.nsi" -!include "%%SOURCE%%\installers\windows\lang_ko.nsi" -!include "%%SOURCE%%\installers\windows\lang_nl.nsi" -!include "%%SOURCE%%\installers\windows\lang_pt-br.nsi" -!include "%%SOURCE%%\installers\windows\lang_zh.nsi" + ;Request application privileges for Windows Vista + RequestExecutionLevel admin + + ;Compression + SetCompress auto ; compress to saves space + SetCompressor /solid /final lzma ; compress whole installer as one block + + ;File Handling + SetOverwrite on -# *TODO: Move these into the language files themselves -LangString LanguageCode ${LANG_GERMAN} "de" -LangString LanguageCode ${LANG_ENGLISH} "en" -LangString LanguageCode ${LANG_SPANISH} "es" -LangString LanguageCode ${LANG_FRENCH} "fr" -LangString LanguageCode ${LANG_JAPANESE} "ja" -LangString LanguageCode ${LANG_ITALIAN} "it" -LangString LanguageCode ${LANG_KOREAN} "ko" -LangString LanguageCode ${LANG_DUTCH} "nl" -LangString LanguageCode ${LANG_PORTUGUESEBR} "pt" -LangString LanguageCode ${LANG_SIMPCHINESE} "zh" +;-------------------------------- +;Version Information -Name "${VIEWERNAME}" + VIProductVersion "${VERSION_LONG}" + VIAddVersionKey "ProductName" "Singularity Viewer" + VIAddVersionKey "Comments" "A viewer for the meta-verse!" + VIAddVersionKey "CompanyName" "${VENDORSTR}" + VIAddVersionKey "LegalCopyright" "Copyright © 2010-2016, ${VENDORSTR}" + VIAddVersionKey "FileDescription" "${APPNAME} Installer" + VIAddVersionKey "ProductVersion" "${VERSION_LONG}" -SubCaption 0 $(LicenseSubTitleSetup) ; override "license agreement" text +;-------------------------------- +;Interface Settings -BrandingText "Prepare to Implode!" ; bottom of window text -Icon "%%SOURCE%%\installers\windows\${INSTALL_ICON}" -UninstallIcon "%%SOURCE%%\installers\windows\${UNINSTALL_ICON}" -WindowIcon off ; show our icon in left corner -# BGGradient 9090b0 000000 notext -CRCCheck on ; make sure CRC is OK -#InstProgressFlags smooth colored ; new colored smooth look -InstProgressFlags -InstallColors /windows -ShowInstDetails show ; no details, no "show" button -SetOverwrite on ; stomp files by default -AutoCloseWindow true ; after all files install, close window + ;Show Details + ShowInstDetails hide + ShowUninstDetails hide -InstallDir "%%INSTALLDIR%%" -InstallDirRegKey HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "" -DirText $(DirectoryChooseTitle) $(DirectoryChooseSetup) + !define MUI_ICON "%%SOURCE%%\installers\windows\install_icon.ico" + !define MUI_UNICON "%%SOURCE%%\installers\windows\uninstall_icon.ico" + !define MUI_WELCOMEFINISHPAGE_BITMAP "%%SOURCE%%\installers\windows\install_welcome.bmp" + !define MUI_UNWELCOMEFINISHPAGE_BITMAP "%%SOURCE%%\installers\windows\uninstall_welcome.bmp" + !define MUI_ABORTWARNING -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Variables -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Var INSTPROG -Var INSTEXE -Var INSTFLAGS -Var INSTSHORTCUT -Var COMMANDLINE ; command line passed to this installer, set in .onInit -Var SHORTCUT_LANG_PARAM ; "--set InstallLanguage de", passes language to viewer +;-------------------------------- +;Language Selection Dialog Settings -;;; Function definitions should go before file includes, because calls to -;;; DLLs like LangDLL trigger an implicit file include, so if that call is at -;;; the end of this script NSIS has to decompress the whole installer before -;;; it can call the DLL function. JC + ;Show all languages, despite user's codepage + !define MUI_LANGDLL_ALLLANGUAGES -!include "FileFunc.nsh" ; For GetParameters, GetOptions -!insertmacro GetParameters -!insertmacro GetOptions + ;Remember the installer language + !define MUI_LANGDLL_REGISTRY_ROOT "HKLM" + !define MUI_LANGDLL_REGISTRY_KEY "SOFTWARE\${VENDORSTR}\${APPNAMEONEWORD}" + !define MUI_LANGDLL_REGISTRY_VALUENAME "InstallerLanguage" + + ;Always show the dialog + !define MUI_LANGDLL_ALWAYSSHOW -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; After install completes, launch app -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function .onInstSuccess - Push $R0 # Option value, unused - ${GetOptions} $COMMANDLINE "/AUTOSTART" $R0 - # If parameter was there (no error) just launch - # Otherwise ask - IfErrors label_ask_launch label_launch - -label_ask_launch: - # Don't launch by default when silent - IfSilent label_no_launch - MessageBox MB_YESNO $(InstSuccesssQuestion) \ - IDYES label_launch IDNO label_no_launch - -label_launch: - # Assumes SetOutPath $INSTDIR - Exec '"$INSTDIR\$INSTEXE" $INSTFLAGS $SHORTCUT_LANG_PARAM' -label_no_launch: - Pop $R0 +;-------------------------------- +;Install Pages + + !define MUI_PAGE_CUSTOMFUNCTION_PRE check_skip + !insertmacro MUI_PAGE_WELCOME + + ;License Page + !define MUI_PAGE_CUSTOMFUNCTION_PRE check_skip + !insertmacro MUI_PAGE_LICENSE "%%SOURCE%%\..\..\doc\GPL-license.txt" + + ;Directory Page + !define MUI_PAGE_CUSTOMFUNCTION_PRE check_skip + !insertmacro MUI_PAGE_DIRECTORY + + ;Start Menu Folder Page + !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" + !define MUI_STARTMENUPAGE_REGISTRY_KEY "SOFTWARE\${VENDORSTR}\${APPNAMEONEWORD}" + !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" + !define MUI_PAGE_CUSTOMFUNCTION_PRE check_skip + !insertmacro MUI_PAGE_STARTMENU Application $STARTMENUFOLDER + + ;Install Progress Page + !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckWindowsServPack + !insertmacro MUI_PAGE_INSTFILES + + ; Finish Page + !define MUI_PAGE_CUSTOMFUNCTION_PRE check_skip_finish + !define MUI_FINISHPAGE_RUN + !define MUI_FINISHPAGE_RUN_FUNCTION launch_viewer + !define MUI_FINISHPAGE_NOREBOOTSUPPORT + !insertmacro MUI_PAGE_FINISH + +;-------------------------------- +;Uninstall Pages + + !insertmacro MUI_UNPAGE_WELCOME + !insertmacro MUI_UNPAGE_CONFIRM + !insertmacro MUI_UNPAGE_INSTFILES + !insertmacro MUI_UNPAGE_FINISH + +;-------------------------------- +;Languages + + !include "%%SOURCE%%\installers\windows\lang_en-us.nsi" + !include "%%SOURCE%%\installers\windows\lang_fr.nsi" + !include "%%SOURCE%%\installers\windows\lang_de.nsi" + !include "%%SOURCE%%\installers\windows\lang_es.nsi" + !include "%%SOURCE%%\installers\windows\lang_zh.nsi" + !include "%%SOURCE%%\installers\windows\lang_ja.nsi" + !include "%%SOURCE%%\installers\windows\lang_pl.nsi" + !include "%%SOURCE%%\installers\windows\lang_it.nsi" + !include "%%SOURCE%%\installers\windows\lang_pt-br.nsi" + !include "%%SOURCE%%\installers\windows\lang_da.nsi" + !include "%%SOURCE%%\installers\windows\lang_ru.nsi" + !include "%%SOURCE%%\installers\windows\lang_tr.nsi" + +;-------------------------------- +;Reserve Files + + ;If you are using solid compression, files that are required before + ;the actual installation should be stored first in the data block, + ;because this will make your installer start faster. + + !insertmacro MUI_RESERVEFILE_LANGDLL + ReserveFile "${NSISDIR}\Plugins\NSISdl.dll" + ReserveFile "${NSISDIR}\Plugins\nsDialogs.dll" + ReserveFile "${NSISDIR}\Plugins\StartMenu.dll" + ReserveFile "${NSISDIR}\Plugins\StdUtils.dll" + ReserveFile "${NSISDIR}\Plugins\System.dll" + ReserveFile "${NSISDIR}\Plugins\UserInfo.dll" + +;-------------------------------- +; Local Functions + +;Page pre-checks for skip conditions +Function check_skip + StrCmp $SKIP_DIALOGS "true" 0 +2 + Abort FunctionEnd +Function check_skip_finish + StrCmp $SKIP_DIALOGS "true" 0 +4 + StrCmp $AUTOSTART "true" 0 +3 + Call launch_viewer + Abort +FunctionEnd -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Make sure we're not on Windows 98 / ME -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +Function launch_viewer + ${StdUtils.ExecShellAsUser} $0 "$INSTDIR\$INSTEXE" "open" "$SHORTCUT_LANG_PARAM" +FunctionEnd + +;Check version compatibility Function CheckWindowsVersion - DetailPrint "Checking Windows version..." - Call GetWindowsVersion - Pop $R0 - ; Just get first two characters, ignore 4.0 part of "NT 4.0" - StrCpy $R0 $R0 2 - ; Blacklist certain OS versions - StrCmp $R0 "95" win_ver_bad - StrCmp $R0 "98" win_ver_bad - StrCmp $R0 "ME" win_ver_bad - StrCmp $R0 "NT" win_ver_bad - Return -win_ver_bad: - MessageBox MB_YESNO $(CheckWindowsVersionMB) IDNO win_ver_abort - Return -win_ver_abort: - Quit -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Make sure the user can install/uninstall -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function CheckIfAdministrator - DetailPrint $(CheckAdministratorInstDP) - UserInfo::GetAccountType - Pop $R0 - StrCmp $R0 "Admin" lbl_is_admin - MessageBox MB_OK $(CheckAdministratorInstMB) - Quit -lbl_is_admin: - Return -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function un.CheckIfAdministrator - DetailPrint $(CheckAdministratorUnInstDP) - UserInfo::GetAccountType - Pop $R0 - StrCmp $R0 "Admin" lbl_is_admin - MessageBox MB_OK $(CheckAdministratorUnInstMB) - Quit -lbl_is_admin: - Return -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Checks to see if the current version has already been installed (according to the registry). -; If it has, allow user to bail out of install process. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function CheckIfAlreadyCurrent - Push $0 - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Version" - StrCmp $0 ${VERSION_LONG} 0 DONE - MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK DONE +!ifdef WIN64_BIN_BUILD + ${IfNot} ${RunningX64} + MessageBox MB_OK|MB_ICONSTOP "This version requires a 64 bit operating system." Quit + ${EndIf} +!endif - DONE: - Pop $0 - Return + ${If} ${AtMostWinXP} + MessageBox MB_OK $(CheckWindowsVersionMB) + Quit + ${EndIf} FunctionEnd - + +;Check service pack compatibility and suggest upgrade +Function CheckWindowsServPack + ${If} ${IsWinVista} + ${AndIfNot} ${IsServicePack} 2 + MessageBox MB_OK $(CheckWindowsServPackMB) + DetailPrint $(UseLatestServPackDP) + Return + ${EndIf} + + ${If} ${IsWin2008} + ${AndIfNot} ${IsServicePack} 2 + MessageBox MB_OK $(CheckWindowsServPackMB) + DetailPrint $(UseLatestServPackDP) + Return + ${EndIf} + + ${If} ${IsWin7} + ${AndIfNot} ${IsServicePack} 1 + MessageBox MB_OK $(CheckWindowsServPackMB) + DetailPrint $(UseLatestServPackDP) + Return + ${EndIf} + + ${If} ${IsWin2008R2} + ${AndIfNot} ${IsServicePack} 1 + MessageBox MB_OK $(CheckWindowsServPackMB) + DetailPrint $(UseLatestServPackDP) + Return + ${EndIf} +FunctionEnd + +;Make sure the user can install/uninstall +Function CheckIfAdministrator + DetailPrint $(CheckAdministratorInstDP) + UserInfo::GetAccountType + Pop $R0 + StrCmp $R0 "Admin" lbl_is_admin + MessageBox MB_OK $(CheckAdministratorInstMB) + Quit +lbl_is_admin: + Return +FunctionEnd + +Function un.CheckIfAdministrator + DetailPrint $(CheckAdministratorUnInstDP) + UserInfo::GetAccountType + Pop $R0 + StrCmp $R0 "Admin" lbl_is_admin + MessageBox MB_OK $(CheckAdministratorUnInstMB) + Quit +lbl_is_admin: + Return +FunctionEnd + +;Checks for CPU compatibility +Function CheckCPUFlags + Push $1 + System::Call 'kernel32::IsProcessorFeaturePresent(i) i(10) .r1' + IntCmp $1 1 OK_SSE2 + MessageBox MB_OKCANCEL $(MissingSSE2) /SD IDOK IDOK OK_SSE2 + Quit + + OK_SSE2: + Pop $1 + Return +FunctionEnd + +;Checks if installed version is same as installer and offers to cancel +Function CheckIfAlreadyCurrent +!ifdef WIN64_BIN_BUILD + SetRegView 64 +!endif + Push $0 + ReadRegStr $0 HKLM "SOFTWARE\${VENDORSTR}\$INSTPROG" "Version" + StrCmp $0 ${VERSION_LONG} 0 continue_install + StrCmp $SKIP_DIALOGS "true" continue_install + MessageBox MB_OKCANCEL $(CheckIfCurrentMB) /SD IDOK IDOK continue_install + Quit +continue_install: + Pop $0 + Return +FunctionEnd + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Close the program, if running. Modifies no variables. ; Allows user to bail out of install process. @@ -210,8 +317,9 @@ Function CloseSecondLife Push $0 FindWindow $0 "Second Life" "" IntCmp $0 0 DONE - MessageBox MB_YESNOCANCEL $(CloseSecondLifeInstMB) IDYES CLOSE IDNO DONE - Goto CANCEL_INSTALL ; IDCANCEL + + StrCmp $SKIP_DIALOGS "true" CLOSE + MessageBox MB_OKCANCEL $(CloseSecondLifeInstMB) IDOK CLOSE IDCANCEL CANCEL_INSTALL CANCEL_INSTALL: Quit @@ -221,214 +329,16 @@ Function CloseSecondLife SendMessage $0 16 0 0 LOOP: - FindWindow $0 "Second Life" "" - IntCmp $0 0 DONE - Sleep 500 - Goto LOOP + FindWindow $0 "Second Life" "" + IntCmp $0 0 DONE + Sleep 500 + Goto LOOP DONE: Pop $0 Return FunctionEnd -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Test our connection to secondlife.com -; Also allows us to count attempted installs by examining web logs. -; *TODO: Return current SL version info and have installer check -; if it is up to date. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function CheckNetworkConnection - Push $0 - Push $1 - Push $2 # Option value for GetOptions - DetailPrint $(CheckNetworkConnectionDP) - ; Look for a tag value from the stub installer, used for statistics - ; to correlate installs. Default to "" if not found on command line. - StrCpy $2 "" - ${GetOptions} $COMMANDLINE "/STUBTAG=" $2 - GetTempFileName $0 - !define HTTP_TIMEOUT 5000 ; milliseconds - ; Don't show secondary progress bar, this will be quick. - NSISdl::download_quiet \ - /TIMEOUT=${HTTP_TIMEOUT} \ - "http://install.secondlife.com/check/?stubtag=$2&version=${VERSION_LONG}" \ - $0 - Pop $1 ; Return value, either "success", "cancel" or an error message - ; MessageBox MB_OK "Download result: $1" - ; Result ignored for now - ; StrCmp $1 "success" +2 - ; DetailPrint "Connection failed: $1" - Delete $0 ; temporary file - Pop $2 - Pop $1 - Pop $0 - Return -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Delete files in Documents and Settings\\SecondLife\cache -; Delete files in Documents and Settings\All Users\SecondLife\cache -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;Function RemoveCacheFiles -; -;; Delete files in Documents and Settings\\SecondLife -;Push $0 -;Push $1 -;Push $2 -; DetailPrint $(RemoveCacheFilesDP) -; -; StrCpy $0 0 ; Index number used to iterate via EnumRegKey -; -; LOOP: -; EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0 -; StrCmp $1 "" DONE ; no more users -; -; ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" -; StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing -; -; ; Required since ProfileImagePath is of type REG_EXPAND_SZ -; ExpandEnvStrings $2 $2 -; -; ; When explicitly uninstalling, everything goes away -; RMDir /r "$2\Application Data\SecondLife\cache" -; -; CONTINUE: -; IntOp $0 $0 + 1 -; Goto LOOP -; DONE: -;Pop $2 -;Pop $1 -;Pop $0 -; -;; Delete files in Documents and Settings\All Users\SecondLife -;Push $0 -; ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData" -; StrCmp $0 "" +2 -; RMDir /r "$0\SecondLife\cache" -;Pop $0 -; -;; Delete filse in C:\Windows\Application Data\SecondLife -;; If the user is running on a pre-NT system, Application Data lives here instead of -;; in Documents and Settings. -;RMDir /r "$WINDIR\Application Data\SecondLife\cache" -; -;FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Delete the installed shader files -;;; Since shaders are in active development, we'll likely need to shuffle them -;;; around a bit from build to build. This ensures that shaders that we move -;;; or rename in the dev tree don't get left behind in the install. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function RemoveOldShaders - -;; Remove old shader files first so fallbacks will work. see DEV-5663 -RMDir /r "$INSTDIR\app_settings\shaders\*" - -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Delete the installed XUI files -;;; We've changed the directory hierarchy for skins, putting all XUI and texture -;;; files under a specific skin directory, i.e. skins/default/xui/en-us as opposed -;;; to skins/xui/en-us. Need to clean up the old path when upgrading -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function RemoveOldXUI - -;; remove old XUI and texture files -RmDir /r "$INSTDIR\skins\html" -RmDir /r "$INSTDIR\skins\xui" -RmDir /r "$INSTDIR\skins\textures" -Delete "$INSTDIR\skins\*.txt" - -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Remove any releasenotes files. -;;; We are no longer including release notes with the viewer. This will delete -;;; any that were left behind by an older installer. Delete will not fail if -;;; the files do not exist -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function RemoveOldReleaseNotes - -;; remove releasenotes.txt file from application directory, and the shortcut -;; from the start menu. -Delete "$SMPROGRAMS\$INSTSHORTCUT\SL Release Notes.lnk" -Delete "$INSTDIR\releasenotes.txt" - -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Delete a xui file that causes crash in Silver skin in cases where it was -;;; left behind by an older installer. -;;; See SNOW-348 -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function RemoveOldAboutLandSilver - -Delete "$INSTDIR\skins\silver\xui\en-us\floater_about_land.xml" - -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Delete files in Documents and Settings\\SecondLife -; Delete files in Documents and Settings\All Users\SecondLife -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function un.DocumentsAndSettingsFolder - -; Delete files in Documents and Settings\\SecondLife -Push $0 -Push $1 -Push $2 - - DetailPrint "Deleting files in Documents and Settings folder" - - StrCpy $0 0 ; Index number used to iterate via EnumRegKey - - LOOP: - EnumRegKey $1 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList" $0 - StrCmp $1 "" DONE ; no more users - - ReadRegStr $2 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\$1" "ProfileImagePath" - StrCmp $2 "" CONTINUE 0 ; "ProfileImagePath" value is missing - - ; Required since ProfileImagePath is of type REG_EXPAND_SZ - ExpandEnvStrings $2 $2 - - ; If uninstalling a normal install remove everything - ; Otherwise (preview/dmz etc) just remove cache - StrCmp $INSTFLAGS "" RM_ALL RM_CACHE - RM_ALL: - RMDir /r "$2\Application Data\SecondLife" - RM_CACHE: - # Local Settings directory is the cache, there is no "cache" subdir - RMDir /r "$2\Local Settings\Application Data\SecondLife" - # Vista version of the same - RMDir /r "$2\AppData\Local\SecondLife" - Delete "$2\Application Data\SecondLife\user_settings\settings_windlight.xml" - - CONTINUE: - IntOp $0 $0 + 1 - Goto LOOP - DONE: - -Pop $2 -Pop $1 -Pop $0 - -; Delete files in Documents and Settings\All Users\SecondLife -Push $0 - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" "Common AppData" - StrCmp $0 "" +2 - RMDir /r "$0\SecondLife" -Pop $0 - -; Delete filse in C:\Windows\Application Data\SecondLife -; If the user is running on a pre-NT system, Application Data lives here instead of -; in Documents and Settings. -RMDir /r "$WINDIR\Application Data\SecondLife" - -FunctionEnd - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; Close the program, if running. Modifies no variables. ; Allows user to bail out of uninstall process. @@ -437,8 +347,7 @@ Function un.CloseSecondLife Push $0 FindWindow $0 "Second Life" "" IntCmp $0 0 DONE - MessageBox MB_YESNOCANCEL $(CloseSecondLifeUnInstMB) IDYES CLOSE IDNO DONE - Goto CANCEL_UNINSTALL ; IDCANCEL + MessageBox MB_OKCANCEL $(CloseSecondLifeUnInstMB) IDOK CLOSE IDCANCEL CANCEL_UNINSTALL CANCEL_UNINSTALL: Quit @@ -448,395 +357,262 @@ Function un.CloseSecondLife SendMessage $0 16 0 0 LOOP: - FindWindow $0 "Second Life" "" - IntCmp $0 0 DONE - Sleep 500 - Goto LOOP + FindWindow $0 "Second Life" "" + IntCmp $0 0 DONE + Sleep 500 + Goto LOOP DONE: Pop $0 Return FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; -; Delete the stored password for the current Windows user -; DEV-10821 -- Unauthorised user can gain access to an SL account after a real user has uninstalled -; -Function un.RemovePassword - -DetailPrint "Removing Second Life password" - -SetShellVarContext current -Delete "$APPDATA\SecondLife\user_settings\password.dat" -SetShellVarContext all - +; Test our connection to secondlife.com +; Also allows us to count attempted installs by examining web logs. +; *TODO: Return current SL version info and have installer check +; if it is up to date. +Function CheckNetworkConnection + ; Uneeded - LD + Return + Push $0 + Push $1 + Push $2 # Option value for GetOptions + DetailPrint $(CheckNetworkConnectionDP) + ; Look for a tag value from the stub installer, used for statistics + ; to correlate installs. Default to "" if not found on command line. + StrCpy $2 "" + ${GetOptions} $COMMANDLINE "/STUBTAG=" $2 + GetTempFileName $0 + !define HTTP_TIMEOUT 5000 ; milliseconds + ; Don't show secondary progress bar, this will be quick. + NSISdl::download_quiet \ + /TIMEOUT=${HTTP_TIMEOUT} \ + "http://install.secondlife.com/check/?stubtag=$2&version=${VERSION_LONG}" \ + $0 + Pop $1 ; Return value, either "success", "cancel" or an error message + ; MessageBox MB_OK "Download result: $1" + ; Result ignored for now + ; StrCmp $1 "success" +2 + ; DetailPrint "Connection failed: $1" + Delete $0 ; temporary file + Pop $2 + Pop $1 + Pop $0 + Return FunctionEnd -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Delete the installed files -;;; This deletes the uninstall executable, but it works -;;; because it is copied to temp directory before running -;;; -;;; Note: You must list all files here, because we only -;;; want to delete our files, not things users left in the -;;; application directories. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function un.ProgramFiles +;-------------------------------- +;Installer Sections -;; Remove mozilla file first so recursive directory deletion doesn't get hung up -Delete "$INSTDIR\app_settings\mozilla\components" +Section "Viewer" + SectionIn RO + SetShellVarContext all +!ifdef WIN64_BIN_BUILD + SetRegView 64 +!endif + ;Start with some default values. + StrCpy $INSTPROG "${APPNAMEONEWORD}" + StrCpy $INSTEXE "${INSTEXE}" + StrCpy $INSTSHORTCUT "${APPNAME}" -;; This placeholder is replaced by the complete list of files to uninstall by viewer_manifest.py -%%DELETE_FILES%% + Call CheckIfAlreadyCurrent + Call CloseSecondLife ; Make sure we're not running + Call CheckNetworkConnection ; ping secondlife.com -;; Optional/obsolete files. Delete won't fail if they don't exist. -Delete "$INSTDIR\dronesettings.ini" -Delete "$INSTDIR\message_template.msg" -Delete "$INSTDIR\newview.pdb" -Delete "$INSTDIR\newview.map" -Delete "$INSTDIR\SecondLife.pdb" -Delete "$INSTDIR\SecondLife.map" -Delete "$INSTDIR\comm.dat" -Delete "$INSTDIR\*.glsl" -Delete "$INSTDIR\motions\*.lla" -Delete "$INSTDIR\trial\*.html" -Delete "$INSTDIR\newview.exe" -;; Remove entire help directory -Delete "$INSTDIR\help\Advanced\*" -RMDir "$INSTDIR\help\Advanced" -Delete "$INSTDIR\help\basics\*" -RMDir "$INSTDIR\help\basics" -Delete "$INSTDIR\help\Concepts\*" -RMDir "$INSTDIR\help\Concepts" -Delete "$INSTDIR\help\welcome\*" -RMDir "$INSTDIR\help\welcome" -Delete "$INSTDIR\help\*" -RMDir "$INSTDIR\help" + SetOutPath "$INSTDIR" + ;Remove old shader files first so fallbacks will work. + RMDir /r "$INSTDIR\app_settings\shaders\*" + + ;This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py + %%INSTALL_FILES%% + +;!ifdef WIN64_BIN_BUILD +; ExecWait '"$INSTDIR\redist\vc_redist.x64.exe" /passive' +;!else +; ExecWait '"$INSTDIR\redist\vc_redist.x86.exe" /passive' +;!endif + + ;Pass the installer's language to the client to use as a default + StrCpy $SHORTCUT_LANG_PARAM "--set InstallLanguage $(LanguageCode)" + + ;Create startmenu shortcuts + !insertmacro MUI_STARTMENU_WRITE_BEGIN Application + CreateDirectory "$SMPROGRAMS\$STARTMENUFOLDER" +!ifdef WIN64_BIN_BUILD + CreateShortCut "$SMPROGRAMS\$STARTMENUFOLDER\$INSTSHORTCUT x64.lnk" "$\"$INSTDIR\$INSTEXE$\"" "$SHORTCUT_LANG_PARAM" + CreateShortCut "$SMPROGRAMS\$STARTMENUFOLDER\Uninstall $INSTSHORTCUT x64.lnk" "$\"$INSTDIR\uninst.exe$\"" "" +!else + CreateShortCut "$SMPROGRAMS\$STARTMENUFOLDER\$INSTSHORTCUT.lnk" "$\"$INSTDIR\$INSTEXE$\"" "$SHORTCUT_LANG_PARAM" + CreateShortCut "$SMPROGRAMS\$STARTMENUFOLDER\Uninstall $INSTSHORTCUT.lnk" "$\"$INSTDIR\uninst.exe$\"" "" +!endif + WriteINIStr "$SMPROGRAMS\$STARTMENUFOLDER\SL Create Account.url" "InternetShortcut" "URL" "http://join.secondlife.com/" + WriteINIStr "$SMPROGRAMS\$STARTMENUFOLDER\SL Your Account.url" "InternetShortcut" "URL" "http://www.secondlife.com/account/" + WriteINIStr "$SMPROGRAMS\$STARTMENUFOLDER\SL Scripting Language Help.url" "InternetShortcut" "URL" "http://wiki.secondlife.com/wiki/LSL_Portal" -Delete "$INSTDIR\uninst.exe" -RMDir "$INSTDIR" + !insertmacro MUI_STARTMENU_WRITE_END -IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER + ;Other shortcuts + SetOutPath "$INSTDIR" + ;CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM" + CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" "$INSTDIR\$INSTEXE" "$SHORTCUT_LANG_PARAM" + CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" "$INSTDIR\uninst.exe" "" + + ;Write registry + WriteRegStr HKLM "SOFTWARE\${VENDORSTR}\$INSTPROG" "" "$INSTDIR" + WriteRegStr HKLM "SOFTWARE\${VENDORSTR}\$INSTPROG" "Version" "${VERSION_LONG}" + WriteRegStr HKLM "SOFTWARE\${VENDORSTR}\$INSTPROG" "Shortcut" "$INSTSHORTCUT" + WriteRegStr HKLM "SOFTWARE\${VENDORSTR}\$INSTPROG" "Exe" "$INSTEXE" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "Comments" "A viewer for the meta-verse!" +!ifdef WIN64_BIN_BUILD + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTSHORTCUT x64" +!else + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTSHORTCUT" +!endif + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayIcon" "$INSTDIR\$INSTEXE" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayVersion" "${VERSION_LONG}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "InstallLocation" "$INSTDIR" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "InstallSource" "$EXEDIR\" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "HelpLink" "http://www.singularityviewer.org" + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "NoModify" 1 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "NoRepair" 1 + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "Publisher" "${VENDORSTR}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "URLInfoAbout" "http://www.singularityviewer.org" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "URLUpdateInfo" "http://www.singularityviewer.org" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" "$\"$INSTDIR\uninst.exe$\"" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "QuietUninstallString" "$\"$INSTDIR\uninst.exe$\" /S" + ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 + IntFmt $0 "0x%08X" $0 + WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "EstimatedSize" "$0" + + + ;Write URL registry info + WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(Default)" "URL:Second Life" + WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" "" + WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" "$INSTDIR\$INSTEXE" + ;; URL param must be last item passed to viewer, it ignores subsequent params + ;; to avoid parameter injection attacks. + WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" "$\"$INSTDIR\$INSTEXE$\" -url $\"%1$\"" + + WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "(Default)" "URL:Second Life" + WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" "" + WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" "$\"$INSTDIR\$INSTEXE$\"" + ;; URL param must be last item passed to viewer, it ignores subsequent params + ;; to avoid parameter injection attacks. + WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" "$\"$INSTDIR\$INSTEXE$\" -url $\"%1$\"" + + ;Create uninstaller + SetOutPath "$INSTDIR" + WriteUninstaller "$INSTDIR\uninst.exe" + +SectionEnd + +;-------------------------------- +;Installer Functions +Function .onInit + ;Don't install on unsupported operating systems + Call CheckWindowsVersion + ;Don't install if not administator + Call CheckIfAdministrator + ;Don't install if we lack required cpu support + Call CheckCPUFlags + + Push $0 + + ;Get installation folder from registry if available for 64bit +!ifdef WIN64_BIN_BUILD + SetRegView 64 + ReadRegStr $0 HKLM "SOFTWARE\${VENDORSTR}\${APPNAMEONEWORD}" "" + IfErrors +2 0 ; If error jump past setting SKIP_AUTORUN + StrCpy $INSTDIR $0 +!endif + + ${GetParameters} $COMMANDLINE ; get our command line + + ${GetOptions} $COMMANDLINE "/SKIP_DIALOGS" $0 + IfErrors +2 0 ; If error jump past setting SKIP_DIALOGS + StrCpy $SKIP_DIALOGS "true" + + ${GetOptions} $COMMANDLINE "/SKIP_AUTORUN" $0 + IfErrors +2 0 ; If error jump past setting SKIP_AUTORUN + StrCpy $SKIP_AUTORUN "true" + + ${GetOptions} $COMMANDLINE "/AUTOSTART" $0 + IfErrors +2 0 ; If error jump past setting AUTOSTART + StrCpy $AUTOSTART "true" + + ${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English + ; If no language (error), then proceed + IfErrors lbl_configure_default_lang + ; No error means we got a language, so use it + StrCpy $LANGUAGE $0 + Goto lbl_return + +lbl_configure_default_lang: + ;For silent installs, no language prompt, use default + IfSilent lbl_return + StrCmp $SKIP_DIALOGS "true" lbl_return + + !insertmacro MUI_LANGDLL_DISPLAY + +lbl_return: + Pop $0 + Return +FunctionEnd + +;-------------------------------- +;Uninstaller Section + +Section "Uninstall" + SectionIn RO + SetShellVarContext all +!ifdef WIN64_BIN_BUILD + SetRegView 64 +!endif + + StrCpy $INSTPROG "${APPNAMEONEWORD}" + StrCpy $INSTEXE "${INSTEXE}" + StrCpy $INSTSHORTCUT "${APPNAME}" + + Call un.CloseSecondLife + + !insertmacro MUI_STARTMENU_GETFOLDER Application $STARTMENUFOLDER + RMDir /r "$SMPROGRAMS\$STARTMENUFOLDER" + + ;This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py + %%DELETE_FILES%% + + ;Optional/obsolete files. Delete won't fail if they don't exist. + Delete "$INSTDIR\message_template.msg" + Delete "$INSTDIR\VivoxVoiceService-*.log" + + ;Shortcuts in install directory + Delete "$INSTDIR\$INSTSHORTCUT.lnk" + Delete "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" + + Delete "$INSTDIR\uninst.exe" + RMDir "$INSTDIR" + + IfFileExists "$INSTDIR" FOLDERFOUND NOFOLDER FOLDERFOUND: - MessageBox MB_YESNO $(DeleteProgramFilesMB) IDNO NOFOLDER + ;Silent uninstall always removes all files (/SD IDYES) + MessageBox MB_YESNO $(DeleteProgramFilesMB) /SD IDYES IDNO NOFOLDER RMDir /r "$INSTDIR" NOFOLDER: - -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Uninstall settings -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -UninstallText $(UninstallTextMsg) -ShowUninstDetails show - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Uninstall section -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Section Uninstall - -; Start with some default values. -StrCpy $INSTFLAGS "" -StrCpy $INSTPROG "${INSTNAME}" -StrCpy $INSTEXE "${INSTEXE}" -StrCpy $INSTSHORTCUT "${SHORTCUT}" -Call un.CheckIfAdministrator ; Make sure the user can install/uninstall - -; uninstall for all users (if you change this, change it in the install as well) -SetShellVarContext all - -; Make sure we're not running -Call un.CloseSecondLife - -; Clean up registry keys and subkeys (these should all be !defines somewhere) -DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" -DeleteRegKey HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" - -; Clean up shortcuts -Delete "$SMPROGRAMS\$INSTSHORTCUT\*.*" -RMDir "$SMPROGRAMS\$INSTSHORTCUT" - -Delete "$DESKTOP\$INSTSHORTCUT.lnk" -Delete "$INSTDIR\$INSTSHORTCUT.lnk" -Delete "$INSTDIR\$INSTSHORTCUT Portable.lnk" -Delete "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" - -; Clean up cache and log files. -; Leave them in-place for non AGNI installs. - -!ifdef UNINSTALL_SETTINGS -Call un.DocumentsAndSettingsFolder -!endif - -; remove stored password on uninstall -Call un.RemovePassword - -Call un.ProgramFiles - -SectionEnd ; end of uninstall section - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; (From the NSIS documentation, JC) -; GetWindowsVersion -; -; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/ -; Updated by Joost Verburg -; -; Returns on top of stack -; -; Windows Version (95, 98, ME, NT x.x, 2000, XP, 2003) -; or -; '' (Unknown Windows Version) -; -; Usage: -; Call GetWindowsVersion -; Pop $R0 -; ; at this point $R0 is "NT 4.0" or whatnot -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function GetWindowsVersion + DeleteRegKey HKLM "SOFTWARE\${VENDORSTR}\$INSTPROG" + DeleteRegKey /ifempty HKLM "SOFTWARE\${VENDORSTR}" + DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" - Push $R0 - Push $R1 - - ReadRegStr $R0 HKLM \ - "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion - - IfErrors 0 lbl_winnt - - ; we are not NT - ReadRegStr $R0 HKLM \ - "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber - - StrCpy $R1 $R0 1 - StrCmp $R1 '4' 0 lbl_error - - StrCpy $R1 $R0 3 - - StrCmp $R1 '4.0' lbl_win32_95 - StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 - - lbl_win32_95: - StrCpy $R0 '95' - Goto lbl_done - - lbl_win32_98: - StrCpy $R0 '98' - Goto lbl_done - - lbl_win32_ME: - StrCpy $R0 'ME' - Goto lbl_done - - lbl_winnt: - - StrCpy $R1 $R0 1 - - StrCmp $R1 '3' lbl_winnt_x - StrCmp $R1 '4' lbl_winnt_x - - StrCpy $R1 $R0 3 - - StrCmp $R1 '5.0' lbl_winnt_2000 - StrCmp $R1 '5.1' lbl_winnt_XP - StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error - - lbl_winnt_x: - StrCpy $R0 "NT $R0" 6 - Goto lbl_done - - lbl_winnt_2000: - Strcpy $R0 '2000' - Goto lbl_done - - lbl_winnt_XP: - Strcpy $R0 'XP' - Goto lbl_done - - lbl_winnt_2003: - Strcpy $R0 '2003' - Goto lbl_done - - lbl_error: - Strcpy $R0 '' - lbl_done: - - Pop $R1 - Exch $R0 - -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Note: to add new languages, add a language file include to the list -;; at the top of this file, add an entry to the menu and then add an -;; entry to the language ID selector below -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function .onInit -!ifdef WIN64_BIN_BUILD - ${IfNot} ${RunningX64} - MessageBox MB_OK|MB_ICONSTOP "This version requires 64 bit operating sytem." - Quit - ${EndIf} -!endif - Push $0 - ${GetParameters} $COMMANDLINE ; get our command line - ${GetOptions} $COMMANDLINE "/LANGID=" $0 ; /LANGID=1033 implies US English - ; If no language (error), then proceed - IfErrors lbl_check_silent - ; No error means we got a language, so use it - StrCpy $LANGUAGE $0 - Goto lbl_return - -lbl_check_silent: - ; For silent installs, no language prompt, use default - IfSilent lbl_return - - ; If we currently have a version of SL installed, default to the language of that install - ; Otherwise don't change $LANGUAGE and it will default to the OS UI language. - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "InstallerLanguage" - IfErrors lbl_build_menu - StrCpy $LANGUAGE $0 - -lbl_build_menu: - Push "" - # Use separate file so labels can be UTF-16 but we can still merge changes - # into this ASCII file. JC - !include "%%SOURCE%%\installers\windows\language_menu.nsi" - - Push A ; A means auto count languages for the auto count to work the first empty push (Push "") must remain - LangDLL::LangDialog $(InstallerLanguageTitle) $(SelectInstallerLanguage) - Pop $0 - StrCmp $0 "cancel" 0 +2 - Abort - StrCpy $LANGUAGE $0 - - ; save language in registry - WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "InstallerLanguage" $LANGUAGE -lbl_return: - Pop $0 - Return -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function un.onInit - ; read language from registry and set for uninstaller - ; Key will be removed on successful uninstall - ReadRegStr $0 HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\${INSTNAME}" "InstallerLanguage" - IfErrors lbl_end - StrCpy $LANGUAGE $0 -lbl_end: - Return -FunctionEnd - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; MAIN SECTION -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Section "" ; (default section) - -SetShellVarContext all ; install for all users (if you change this, change it in the uninstall as well) - -; Start with some default values. -StrCpy $INSTFLAGS "${INSTFLAGS}" -StrCpy $INSTPROG "${INSTNAME}" -StrCpy $INSTEXE "${INSTEXE}" -StrCpy $INSTSHORTCUT "${SHORTCUT}" - -Call CheckWindowsVersion ; warn if on Windows 98/ME -Call CheckIfAdministrator ; Make sure the user can install/uninstall -Call CheckIfAlreadyCurrent ; Make sure that we haven't already installed this version -Call CloseSecondLife ; Make sure we're not running -#Call CheckNetworkConnection ; ping secondlife.com - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Don't remove cache files during a regular install, removing the inventory cache on upgrades results in lots of damage to the servers. -;Call RemoveCacheFiles ; Installing over removes potentially corrupted - ; VFS and cache files. - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Need to clean out shader files from previous installs to fix DEV-5663 -Call RemoveOldShaders - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Need to clean out old XUI files that predate skinning -Call RemoveOldXUI - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Clear out old releasenotes.txt files. These are now on the public wiki. -Call RemoveOldReleaseNotes - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Remove an old xui file that should not be in Silver skin -Call RemoveOldAboutLandSilver - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; Files -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; This placeholder is replaced by the complete list of all the files in the installer, by viewer_manifest.py -%%INSTALL_FILES%% - -# Pass the installer's language to the client to use as a default -StrCpy $SHORTCUT_LANG_PARAM "--set InstallLanguage $(LanguageCode)" - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Shortcuts in start menu -CreateDirectory "$SMPROGRAMS\$INSTSHORTCUT" -SetOutPath "$INSTDIR" -CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\$INSTSHORTCUT.lnk" \ - "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM" - - -WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Create Account.url" \ - "InternetShortcut" "URL" \ - "http://www.secondlife.com/registration/" -WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Your Account.url" \ - "InternetShortcut" "URL" \ - "http://www.secondlife.com/account/" -WriteINIStr "$SMPROGRAMS\$INSTSHORTCUT\SL Scripting Language Help.url" \ - "InternetShortcut" "URL" \ - "http://wiki.secondlife.com/wiki/LSL_Portal" -CreateShortCut "$SMPROGRAMS\$INSTSHORTCUT\Uninstall $INSTSHORTCUT.lnk" \ - '"$INSTDIR\uninst.exe"' '' - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Other shortcuts -SetOutPath "$INSTDIR" -CreateShortCut "$DESKTOP\$INSTSHORTCUT.lnk" \ - "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM" -CreateShortCut "$INSTDIR\$INSTSHORTCUT.lnk" \ - "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM" -CreateShortCut "$INSTDIR\$INSTSHORTCUT Portable.lnk" \ - "$INSTDIR\$INSTEXE" "$INSTFLAGS $SHORTCUT_LANG_PARAM --portable" -CreateShortCut "$INSTDIR\Uninstall $INSTSHORTCUT.lnk" \ - '"$INSTDIR\uninst.exe"' '' - - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Write registry -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "" "$INSTDIR" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Version" "${VERSION_LONG}" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Flags" "$INSTFLAGS" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Shortcut" "$INSTSHORTCUT" -WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\${AUTHOR}\$INSTPROG" "Exe" "$INSTEXE" -WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "DisplayName" "$INSTPROG (remove only)" -WriteRegStr HKEY_LOCAL_MACHINE "Software\Microsoft\Windows\CurrentVersion\Uninstall\$INSTPROG" "UninstallString" '"$INSTDIR\uninst.exe"' - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; Write URL registry info -WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "(default)" "URL:Second Life" -WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}" "URL Protocol" "" -WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"' -;; URL param must be last item passed to viewer, it ignores subsequent params -;; to avoid parameter injection attacks. -WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"' - -; write out uninstaller -WriteUninstaller "$INSTDIR\uninst.exe" - -; end of default section SectionEnd -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; EOF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;-------------------------------- +;Uninstaller Functions + +Function un.onInit + + Call un.CheckIfAdministrator + + !insertmacro MUI_UNGETLANGUAGE + +FunctionEnd diff --git a/indra/newview/installers/windows/lang_da.nsi b/indra/newview/installers/windows/lang_da.nsi new file mode 100644 index 000000000..756e275f6 --- /dev/null +++ b/indra/newview/installers/windows/lang_da.nsi @@ -0,0 +1,56 @@ +; First is default +!insertmacro MUI_LANGUAGE "Danish" + +; Language string +LangString LanguageCode ${LANG_DANISH} "da" + +; Language selection dialog +LangString SelectInstallerLanguage ${LANG_DANISH} "Vælg venligst sprog til installation" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_DANISH} "Installationsmappe" +LangString DirectoryChooseUpdate ${LANG_DANISH} "Vælg ${APPNAME} mappe til opdatering til version ${VERSION_LONG}.(XXX):" +LangString DirectoryChooseSetup ${LANG_DANISH} "Vælg mappe hvor ${APPNAME} skal installeres:" + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_DANISH} "Kunne ikke finde programmet '$INSTPROG'. Baggrundsopdatering fejlede." + +; check windows version +LangString CheckWindowsVersionDP ${LANG_DANISH} "Checker Windows version..." +LangString CheckWindowsVersionMB ${LANG_DANISH} '${APPNAME} supporterer kun Windows XP.$\n$\nForsøg på installation på Windows $R0 kan resultere i nedbrud og datatab.$\n$\n' +LangString CheckWindowsServPackMB ${LANG_DANISH} "It is recomended to run ${APPNAME} on the latest service pack for your operating system.$\nThis will help with performance and stability of the program." +LangString UseLatestServPackDP ${LANG_DANISH} "Please use Windows Update to install the latest Service Pack." + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_DANISH} "Checker rettigheder til installation..." +LangString CheckAdministratorInstMB ${LANG_DANISH} 'Det ser ud til at du benytter en konto med begrænsninger.$\nDu skal have "administrator" rettigheder for at installere ${APPNAME}.' + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_DANISH} "Checker rettigheder til at afinstallere..." +LangString CheckAdministratorUnInstMB ${LANG_DANISH} 'Det ser ud til at du benytter en konto med begrænsninger.$\nDu skal have "administrator" rettigheder for at afinstallere ${APPNAME}.' + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_DANISH} "Det ser ud til at ${APPNAME} ${VERSION_LONG} allerede er installeret.$\n$\nØnsker du at installere igen?" + +; checkcpuflags +LangString MissingSSE2 ${LANG_DANISH} "This machine may not have a CPU with SSE2 support, which is required to run ${APPNAME} ${VERSION_LONG}. Do you want to continue?" + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_DANISH} "Venter på at Alchemy skal lukke ned..." +LangString CloseSecondLifeInstMB ${LANG_DANISH} "Alchemy kan ikke installeres mens programmet kører.$\n$\nAfslut programmet for at fortsætte.$\nVælg ANNULÉR for at afbryde installation." + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_DANISH} "Venter på at Alchemy skal lukke ned..." +LangString CloseSecondLifeUnInstMB ${LANG_DANISH} "Alchemy kan ikke afinstalleres mens programmet kører.$\n$\nAfslut programmet for at fortsætte.$\nVælg ANNULÉR for at afbryde installation." + +; CheckNetworkConnection +LangString CheckNetworkConnectionDP ${LANG_DANISH} "Checker netværksforbindelse..." + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_DANISH} "Sletter cache filer i dokument mappen" + +; delete program files +LangString DeleteProgramFilesMB ${LANG_DANISH} "Der er stadig filer i ${APPNAME} program mappen.$\n$\nDette er sandsynligvis filer du har oprettet eller flyttet til :$\n$INSTDIR$\n$\nØnsker du at fjerne disse filer?" + +; uninstall text +LangString UninstallTextMsg ${LANG_DANISH} "Dette vil afinstallere ${APPNAME} ${VERSION_LONG} fra dit system." diff --git a/indra/newview/installers/windows/lang_de.nsi b/indra/newview/installers/windows/lang_de.nsi index b717a4d3a5aa19c60e69bd3370366dfa19b65d52..b2e9299bd2b698ff5f7bdba2bc9deb0ebf9c8994 100644 GIT binary patch literal 3899 zcmd5<&1xe@5WXAy4i#Z=0$vkx%pMk5(i*XnEG%oC!@@Gs)My&b^oZ^rd#z>PB*%RQ zpM2Ac<*S|6VZ(dNlWXqGJ%N`8OU(1cySYS?l$iPMp)kDU`p8m?Dmo1>1R?z_vaw-9v5XOS;FE?B3EH8;hzp zy}B&~J{ITQal@_6pEEWqvw4bgy+Dc#l~<^|L+9sWvsPUn?yllyyr;El<_H|!w|R1F zM>>Bt@yGc5qWC=XA!KZ&%U_; ze$Z=b0ki`k`?1|H)GYX^knW7Fl1w1)P_}u(2gbmz34xl(rkf{gA<7`4)=um#viQ+w zvsV2&BnAH-@jx!nDeUCi|8Np>{ex+o>K{&IPrHbXMy&rNjfJ8AAdy_Sjnvn&_%e-& z;UIjN=LY1kI}ttE^`lO4)bzjA)}Uq-5ViOHS*zj6*N?sHN&jl}d2ltl{06+BZynlr z%Vn-)qFWG_3?M-Ys9}LT;|o4=>?~Vp*6-@nzCU74hY z#+?$m4yb%wB%l)E8D*K4J`fpFYs@S|dgVX<_a;Xh0HsFY+?G)cj1 zozH|QYx~B*QXJx%-FzJ+nt!Jphv=nMC8Ac4k`ew#1=y4Cj_h|McK4ZCcCb1YuZEpg z-!HOfD2`>lV}iCdFt@~3F~eGjW-Z2_%oD?DcE@vhGDHf?=Z>Lkf7p@3_j0($#9;FX z8kGL`PZ#pSe)m!UCT3nYTjnV;Uo0s-X$mYxxbO_I5YHc+uZj&B>+nlIx?Z4MXuKzT zIuL6Tf5BeiH%0W8!tNQ116X!SU;5YqQ!He{D?${{OL_6`C`no9l0c?mgC{yTxn3o|KA$OJ%pUP*h n-}YDYxi+oF{0$y*L%Z0^_{C!S3MC6;mnre9C~ZfktZaV)Kg?mf literal 8260 zcmeI1+iF`!6o%)z(0ACFKvHN-=w*9R64^B-c9KR;oQpt^Y}pn%1xe1qC2!ixK0~ie z+y9%T@yu*%ADpHD$Xdv5AZb*HD-fq!KB$ zP4DhX6Kp7?ssL@7JV%h{!@{ z=zCj(r-*o=U52ukorqAO6$AG{uZ6Dm729&B&kGp^3_f}CB* zv*cOo+x4+{D-V*tmfP!cBiDIrB|WvcIUly93tI7CxM$jPq|e0Zz3$BAYp~bzcl)|S z9LYCU4?S*{x=U^%XRbTo2oD_jNb@{;p7`q%|7_u2`n3@^`1GaERk-P?viFUi;(bR9 zwJ8~fGc>!<=c%r>k7n>pjLYr#rOHZJ`9wPJDv$BkM4#c;&t>l2y9xCc96Z!-L&v=2;CjZTo2Kh=>xX8HqdF{7JfQO$Yxg%L0c zqXc`_b9TKpH_MsB3Wg?n)!0uprJ`O+CdDKeS;wqjSR6> z=+1ExvL3!520V=y7K$^h5UdE52n>LvkvIb8fHBUM7cdXicjEmp(HbhUF<_zEH50z8 zvDQZFzI!CSn)2hZcADzXc~C+nc{D6@K?=fkS#{wl12 zV|u|$ADcq@(_>TD%F;Gfhe9O^F(QJ7aI2vpVW#XLztJ!DOV##7JRb@T-{95RAK+j(YH(kBHQatbIlrvqu(mNnOc%D2t(|6_T6js#{& ztvt}WnfGa6|D0)zBndLF)xc6vPO2t6Kb$e!?~^$hHeUFiw%o?pp2>ma{r#qbX+ z_t=$uq}@(l1Zk#QdUx^-$_$_h;x(`-%Kydg$ZN{~s1XMM8a z!Zf>FX-JHVS{nj7!s&COjH4c#eRPo6xlt4E4c%uwE5Z4>a8cbGu`1#qqAg@l$P)J7 zRJ{d#w}U|9mhb+hD10G_yDNKc2Z`H~w)C}Vu1|)ve+q@EHU9-9g0Sdo!@IF^j=?4r zjy*rXhabff=>()r)!$XLJK0lhe7~VN7kLCLS>~a?b@pUeb^g_#zl~MkyZV!VU=6D* zhyH{E*T5BlNvv+dM_?Hq3ZFO`SJ%pN=Xj*LW+zElCd?X`LfE9?ORG(g-c6*3ImXSh z`%o-ta}oRyI)-Cu8d%t(6srh*qRoWT-P1Wrn+ns$f_A8?(qbfQ=w0&DPtK;s@JDtM15Th=!7JG^ z61F(aF$qht`_w&dQOk@i&^hW7GUIWDdc_i!WVjbGj8q%&J{u^^9wc_u{8_*If&;NNrX0FeRcBt?8Do7SH9bJl5 zI8lvOzjjf3;#s6kO>UOb4%^I>!eqf@UaS~!v^uf%edZl|K03`#6QSo#=O+A8W0@a+ zrK`3los@L0p5*sMn@+W}VNa)4>oed9rU}MP#_v&Xp|hBsMyUgEDV)O9nIgfNz)(-D zkp%m0U-1sV8FG3JC#y2A!QNNa(dFrp9DgIoUY7!hK4q<+3zd(np%v|=R z9ay&cMeG_)3)6A1lE<_GeBk%-6&~5C+$(~hyq2~3{o=*7rw(KXzq0IWPcYv!6OI0l hzon&7O*^`#4m@;(IYK^qtl7NYGKucjI_ua6`~~eYsmlNW diff --git a/indra/newview/installers/windows/lang_en-us.nsi b/indra/newview/installers/windows/lang_en-us.nsi index 9ff4820756075df220da2d38cea8b3d94aa1fdc8..b83a35cdb048a607a8b6fa81c882c1d75dd2e496 100644 GIT binary patch literal 3688 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 literal 7438 zcmeI1U2j`O5QgWv5@h*UX=Nv%3|u$@4Q`d_)^ zf-8Oi@IE`<>>m5rJ|RT{ge-rZvpYK<@4Pd+=a1h%vtVCZ&qg-3iGKI=9qi1y_MLU? z%KEzcf!(tm8|wd=zB@LsbKU9avm593^&M=@9@tN|Yi--sdrO}O_Rfy2rI`as8A>;(7UhuYf%UEK;L-@W6egwsb=@$df0%BzW$w0EpW}- zQ(dqkXuUzSoRLTv%}GC$oJqVFG#(pwY*ThVvzMBEsNXyK=E}S1g&mF09y*WuxJUcC zf2kGFXe8Y(^y=sun&SCVla9TOGY8Vitxr~0^=}uJuePO`1#S7UD;ODwf3Bhy5`G6z6f%G0X-NoOK(DnAT_7x<~CJSnrL zZyyHYnbG8YgVbw{gnga264H+B3-Kphx+i9NDVcmf6US`WL;E(q9@&$n+_2mu88z?M zAH!(TJfAsZ)O#w~kusjh;nCOf0QF!r&4>N?8|I`+U1-c$FRw&F95Gb>FUD^Zsn6|m zNnXwJyD{29n!%Cd82u1YLZ!n8XiYSoBkOp7UF&Qss%=$~eMNgu@m*JZgRXc*q;6JO z#Tl4dMO7MVbkm%NMNjo|pE+`y*GIT9&mP;?`j4c{DXV?9DX&~h@1bmhbwGbT9-huv zg(okfSMlgj){|$c*O<+r#RxbkGd?5yu% znrYlDH`f6VVu{FAwGHCeefy;5`lt3dzJlT!?75_z>U&RXGG{{> zeXN-I=b^?B_rwHLf!UgzyFAx#UXur6hR2eADeZrY-_9>Xt(+vEMEsGTucGfg0@M^T zl-$8uH12;|$qkpxZOlwi+E~LxAzK6}3=apWHr=6+x#abiC4`6whTw{LR9=iU##bE%7ISMxGb8Ifa|@KewD z8}AiGXj)zUu1IaSWp=tLB$r&VGnIbZEMz>4H;LA=TSzr(QTOThd-4`_aTSX<(X}Zy z(yoG7)2Fbz;nd7`1M@NV*p*%?cb|CBaZ_R>)!p2AY|PYs`j*kOYU3^MXNS|?A)id8 z>W9DRspzJ>%V0m0PLSx1zKZrBwe)Sm-Xi_c-myh38z>%LLlUa1d-PU3gKKHuyrb7< zu_D!v*>vWq3N6R`?5^ss;Qh8WXc>-5=5E@{)ZsquPf`wmak^sPi+L|tAC0?YL8<*e zJrid8_y2Yt%;G%n!*-Rw6YV?6>(|pWe9oeCx6U(xx--?=$Y_dX-?>s*k(^udy(V~7^}9KX)4Hc1IupB>_rtn;ph69nG}c-^BO!m8)ewR#5O zERj4|J-N!djFz(Q2cv8hvmDD?9iJy!l G7W@<1?-UOJ diff --git a/indra/newview/installers/windows/lang_ja.nsi b/indra/newview/installers/windows/lang_ja.nsi index f564291f7dcfdd4f71973d17de4801f1f43f3ebe..f4cf3c75cfa0785b7303186d4ae8a5c66b943d37 100644 GIT binary patch literal 4306 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 QZS|{u36lV|OH*0?AB_l?KmY&$ diff --git a/indra/newview/installers/windows/lang_pl.nsi b/indra/newview/installers/windows/lang_pl.nsi new file mode 100644 index 000000000..bb9978694 --- /dev/null +++ b/indra/newview/installers/windows/lang_pl.nsi @@ -0,0 +1,56 @@ +; First is default +!insertmacro MUI_LANGUAGE "Polish" + +; Language string +LangString LanguageCode ${LANG_POLISH} "pl" + +; Language selection dialog +LangString SelectInstallerLanguage ${LANG_POLISH} "Proszę wybrać język instalatora" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_POLISH} "Katalog instalacji" +LangString DirectoryChooseUpdate ${LANG_POLISH} "Wybierz katalog instalacji ${APPNAME} w celu aktualizacji wersji ${VERSION_LONG}.(XXX):" +LangString DirectoryChooseSetup ${LANG_POLISH} "Wybierz katalog instalacji ${APPNAME} w:" + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_POLISH} "Nie można odnaleźć programu '$INSTPROG'. Cicha aktualizacja zakończyła się niepowodzeniem." + +; check windows version +LangString CheckWindowsVersionDP ${LANG_POLISH} "Sprawdzanie wersji Windows..." +LangString CheckWindowsVersionMB ${LANG_POLISH} '${APPNAME} obsługuje tylko Windows XP.$\n$\nPróba zainstalowania na Windows $R0 może spowodować awarie i utratę danych.$\n$\n' +LangString CheckWindowsServPackMB ${LANG_POLISH} "Zalecane jest uruchamianie ${APPNAME} z najnowszym dostępnym Service Packiem zainstalowanym w systemie.$\nPomaga on w podniesieniu wydajności i stabilności programu." +LangString UseLatestServPackDP ${LANG_POLISH} "Użyj usługi Windows Update, aby zainstalować najnowszy Service Pack." + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_POLISH} "Sprawdzanie zezwolenia na instalację..." +LangString CheckAdministratorInstMB ${LANG_POLISH} 'Używasz "ograniczonego" konta.$\nMusisz być zalogowany jako "administrator" aby zainstalować ${APPNAME}.' + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_POLISH} "Sprawdzanie zezwolenia na odinstalowanie..." +LangString CheckAdministratorUnInstMB ${LANG_POLISH} 'Używasz "ograniczonego" konta.$\nMusisz być być zalogowany jako "administrator" aby zainstalować ${APPNAME}.' + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_POLISH} "${APPNAME} ${VERSION_LONG} jest już zainstalowane.$\n$\nCzy chcesz zainstalować ${APPNAME} ponownie?" + +; checkcpuflags +LangString MissingSSE2 ${LANG_POLISH} "Ten komputer może nie mieć procesora z obsługą SSE2, który jest wymagany aby uruchomić ${APPNAME} w wersji ${VERSION_LONG}. Chcesz kontynuować?" + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_POLISH} "Oczekiwanie na zamknięcie Alchemy..." +LangString CloseSecondLifeInstMB ${LANG_POLISH} "Alchemy nie może zostać zainstalowane, ponieważ jest już włączone.$\n$\nZakończ swoje działania i wybierz OK aby zamknąć Alchemy i kontynuować.$\nWybierz CANCEL aby anulować instalację." + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_POLISH} "Oczekiwanie na zamknięcie Alchemy..." +LangString CloseSecondLifeUnInstMB ${LANG_POLISH} "Alchemy nie może zostać zainstalowane, ponieważ jest już włączone.$\n$\nZakończ swoje działania i wybierz OK aby zamknąć Alchemy i kontynuować.$\nWybierz CANCEL aby anulować." + +; CheckNetworkConnection +LangString CheckNetworkConnectionDP ${LANG_POLISH} "Sprawdzanie połączenia sieciowego..." + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_POLISH} "Kasowanie plików pamięci podręcznej (cache) w folderze Documents and Settings" + +; delete program files +LangString DeleteProgramFilesMB ${LANG_POLISH} "Nadal istnieją pliki w katalogu instalacyjnym ${APPNAME}.$\n$\nMożliwe, że są to pliki, które stworzyłeś/stworzyłaś lub przeniosłeś/przeniosłaś do:$\n$INSTDIR$\n$\nCzy chcesz je usunąć?" + +; uninstall text +LangString UninstallTextMsg ${LANG_POLISH} "To spowoduje odinstalowanie ${APPNAME} ${VERSION_LONG} z Twojego systemu." diff --git a/indra/newview/installers/windows/lang_pt-br.nsi b/indra/newview/installers/windows/lang_pt-br.nsi index da56a3c3369e8607fb44716ecba1969eaec70750..d7984a50c614f43bcb0643a023dfe885f0240e6d 100644 GIT binary patch literal 3953 zcmd5Y}F5WO4lf0zmeoB*v*^q3q9MOF-O+Bm*`1Y`?2-z}m8}%{F+~qW z1N79Npg-0(+|^g)O;WT#3&@6SlEaxd^WF@f(sS*6AnhsTOqF>!J^4x-&n^@yah9&9 z{g+pr!R54b*`wCTx=_wa_WW$zIz2f(c}iEx%t|$5^1*2{J3WzqOyc+LTGysbXFrRb zm!skMW_mg8O?uD9@2Ry2M|L>pBxq|W)hf4#7AJABZ+uXB&Te~ogLU{znOfqvmxBqc zGAYX8sQ6q^Y6;Q8m`bgyJ*obYtJ((#Z>(EU;Cq0x7u|)fm%4LnJ>Te%H$^F1!}?FB zEnud~eYO5={i|)!r)*9asR~U-BNj0tSlzq80*uaRH0WIS-qS)kMJkjk*YA|8|D+{5 zkIS*~MQ=Rm4+k%=hJ(xZ?MJt_w~wCyhvqOR9Lhxl+zlR8K5T%FVGHnkUUDIqN;!4s zoV=L?g*sb|;CtbzVDF{CUfKHt$BwsNKWlJoAi=JGr-k)?{l}7XVv|@C93Zi@aCU~9 z6rG>-2a}u8czAipIhkf;Cj_CTaMiKHqN3y?eQekQ^Fs!sL9op8#JjKyAdgV59uT zKHZMmXFnNyIw*e=K#8T23a&Zh$ZUO~v+=jU7mJQPbOgwPUlBM@Obd2tJeq=OzP5Va z==_A;a-@n( zgs4-an}-z%R0<77fn1T}by-AmJY1VcH#H^r{Dn={AH*ypN+b~VRQkvSA*7I3Q7hMl z4k}eG$y;?Is(Hv?IkFNAVx{sEXN`@e~2 zb=`l3=+0l!)SbA03~KIJrK_ZbxSGR;8r7?xb*rVOI9g~6QWI}WKDY;09yBw0z5YcC z2fu3^Q(NoK1qPVcYV&VVv895H1pa^1zJoM3|xz6~rIw0F8ar+gvf3j|SUQ|<>l9fKn4$TwjVG6O-$w8iCbej}&f zKAPm@5V6l_$-j`3Ps>NEDJwhP3;O@##BADRl$imCJL}$btufVWj2ltM}$#}y3iGUWKW7E?Ti@T{n37CQFjB5oK}b8+;hk*uAHf%h0VFz;-C3kz@m++Z;5vNmYZ%``VC%r*M8QZ?S1bht((T|&|CIf-BAldjsyiC!HJKAzW@+3 BXO;i} literal 7832 zcmeI1+ix316vodp692<0s?=73sN%6aR3QmfL>rgf;2~1wI&Lv_9OFxGsDCW#1ELa7 zyaV5Fj>j|OTf9lRNFd9*_U_J^bNSA9&dmPt`{!2Km)5a?4Q-^~9i1yXv$j38rj4zu zs~_7(_P{Rm|4iqm_3WAMG<9r;v0a@j+prt&U`-%R~ zN~knbNAt8b^Qk@3(*r#{4s&p=ZC^;zret*WA)+4kub+PbGbO!3R8vgu$HjBgq+sdzGHY+6T5Ji|^ZG>D`c)M|P}#$F?gE>;}Ex z2G8WO@gg>&eW&o{`NXwp`_3h4Sj+ZZV z2a7-wUW}HOF&iqjPeOE}FTsb)Y{^E(GtWrJS2|XTWz+g$1W!5|7ex?%CJBdOo)oiV z$vBfFod+u;wOSA2h_rrfE%K-*9bzuzp2znk{s)?soB(;RGw&|< z=8kMFM{V188h;Vull)rGmr?4-ev@=E)Y+!Yzoz|c?{sfNcdx49)#IHq%^3u|xSsBj zQg`k!qNQhgLYU|E(}1#mzzP{dJW2#rLI6?pyOpvI&KU-~-KQtwkb}Ud4YAB)@dfAm zV%1H%W#5L+ZM(Y?i_zaH_IVVqip4q}Dy_^>8lxP!W0@D*c0RQ-q8%&n`E&UPw(*+L z7Z1Bn&*jNV!*-h1)y-;C~Waoj(_9A|Op zc~(gyufga7>ham;1XUm>Jw*A~PUxJdj_?jV zM4U?=;T{#wxpttK@+m8FYnn@yy_7yK?WJ@}(k`TTADNHhfsTyAQDnf6yQ0JwzEr=k+@HzucPoS#Tm9TlRjc zClwnsIJ-My#0xkidDeEdu!N~Xk5=w5=?89RJIML!mfnLc zk1gDv_p4pKha?&!?FtQrrg}SWdm1y8c8=-U_1hqH)!bbi6Q65UU+xtmq5%2i2iQnE G&VK^avRah@ diff --git a/indra/newview/installers/windows/lang_ru.nsi b/indra/newview/installers/windows/lang_ru.nsi new file mode 100644 index 000000000..e61d39f56 --- /dev/null +++ b/indra/newview/installers/windows/lang_ru.nsi @@ -0,0 +1,56 @@ +; First is default +!insertmacro MUI_LANGUAGE "Russian" + +; Language string +LangString LanguageCode ${LANG_RUSSIAN} "ru" + +; Language selection dialog +LangString SelectInstallerLanguage ${LANG_RUSSIAN} "Выберите язык программы установки" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_RUSSIAN} "Каталог установки" +LangString DirectoryChooseUpdate ${LANG_RUSSIAN} "Выберите каталог ${APPNAME} для обновления до версии ${VERSION_LONG}.(XXX):" +LangString DirectoryChooseSetup ${LANG_RUSSIAN} "Выберите каталог для установки ${APPNAME}:" + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_RUSSIAN} "Не удалось найти программу «$INSTPROG». Автоматическое обновление не выполнено." + +; check windows version +LangString CheckWindowsVersionDP ${LANG_RUSSIAN} "Проверка версии Windows..." +LangString CheckWindowsVersionMB ${LANG_RUSSIAN} '${APPNAME} может работать только в Windows XP.$\n$\nПопытка установки в Windows $R0 может привести к сбою и потере данных.$\n$\n' +LangString CheckWindowsServPackMB ${LANG_RUSSIAN} "It is recomended to run ${APPNAME} on the latest service pack for your operating system.$\nThis will help with performance and stability of the program." +LangString UseLatestServPackDP ${LANG_RUSSIAN} "Please use Windows Update to install the latest Service Pack." + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_RUSSIAN} "Проверка разрешений на установку..." +LangString CheckAdministratorInstMB ${LANG_RUSSIAN} 'Вероятно, у вас ограниченный аккаунт.$\nДля установки ${APPNAME} необходимы права администратора.' + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_RUSSIAN} "Проверка разрешений на удаление..." +LangString CheckAdministratorUnInstMB ${LANG_RUSSIAN} 'Вероятно, у вас ограниченный аккаунт.$\nДля удаления ${APPNAME} необходимы права администратора.' + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_RUSSIAN} "Вероятно, версия ${APPNAME} ${VERSION_LONG} уже установлена.$\n$\nУстановить ее снова?" + +; checkcpuflags +LangString MissingSSE2 ${LANG_RUSSIAN} "Возможно, на этом компьютере нет ЦП с поддержкой SSE2, которая необходима для работы ${APPNAME} ${VERSION_LONG}. Продолжить?" + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_RUSSIAN} "Ожидаю завершения работы Alchemy..." +LangString CloseSecondLifeInstMB ${LANG_RUSSIAN} "Alchemy уже работает, выполнить установку невозможно.$\n$\nЗавершите текущую операцию и нажмите кнопку «OK», чтобы закрыть Alchemy и продолжить установку.$\nНажмите кнопку «ОТМЕНА» для отказа от установки." + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_RUSSIAN} "Ожидаю завершения работы Alchemy..." +LangString CloseSecondLifeUnInstMB ${LANG_RUSSIAN} "Alchemy уже работает, выполнить удаление невозможно.$\n$\nЗавершите текущую операцию и нажмите кнопку «OK», чтобы закрыть Alchemy и продолжить удаление.$\nНажмите кнопку «ОТМЕНА» для отказа от удаления." + +; CheckNetworkConnection +LangString CheckNetworkConnectionDP ${LANG_RUSSIAN} "Проверка подключения к сети..." + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_RUSSIAN} "Удаление файлов кэша из папки «Documents and Settings»" + +; delete program files +LangString DeleteProgramFilesMB ${LANG_RUSSIAN} "В каталоге программы ${APPNAME} остались файлы.$\n$\nВероятно, это файлы, созданные или перемещенные вами в $\n$INSTDIR$\n$\nУдалить их?" + +; uninstall text +LangString UninstallTextMsg ${LANG_RUSSIAN} "Программа ${APPNAME} ${VERSION_LONG} будет удалена из вашей системы." diff --git a/indra/newview/installers/windows/lang_tr.nsi b/indra/newview/installers/windows/lang_tr.nsi new file mode 100644 index 000000000..5d524929f --- /dev/null +++ b/indra/newview/installers/windows/lang_tr.nsi @@ -0,0 +1,56 @@ +; First is default +!insertmacro MUI_LANGUAGE "Turkish" + +; Language string +LangString LanguageCode ${LANG_TURKISH} "tr" + +; Language selection dialog +LangString SelectInstallerLanguage ${LANG_TURKISH} "Lütfen yükleyicinin dilini seçin" + +; installation directory text +LangString DirectoryChooseTitle ${LANG_TURKISH} "Yükleme Dizini" +LangString DirectoryChooseUpdate ${LANG_TURKISH} "${VERSION_LONG}.(XXX) sürümüne güncelleştirme yapmak için ${APPNAME} dizinini seçin:" +LangString DirectoryChooseSetup ${LANG_TURKISH} "${APPNAME}'ın yükleneceği dizini seçin:" + +; CheckStartupParams message box +LangString CheckStartupParamsMB ${LANG_TURKISH} "'$INSTPROG' programı bulunamadı. Sessiz güncelleştirme başarılamadı." + +; check windows version +LangString CheckWindowsVersionDP ${LANG_TURKISH} "Windows sürümü kontrol ediliyor..." +LangString CheckWindowsVersionMB ${LANG_TURKISH} "${APPNAME} sadece Windows XP'i destekler.$\n$\nWindows $R0 üzerine yüklemeye çalışmak sistem çökmelerine ve veri kaybına neden olabilir.$\n$\n" +LangString CheckWindowsServPackMB ${LANG_TURKISH} "It is recomended to run ${APPNAME} on the latest service pack for your operating system.$\nThis will help with performance and stability of the program." +LangString UseLatestServPackDP ${LANG_TURKISH} "Please use Windows Update to install the latest Service Pack." + +; checkifadministrator function (install) +LangString CheckAdministratorInstDP ${LANG_TURKISH} "Yükleme izni kontrol ediliyor..." +LangString CheckAdministratorInstMB ${LANG_TURKISH} "'Sınırlı' bir hesap kullanıyor görünüyorsunuz.$\n${APPNAME}'ı yüklemek için bir 'yönetici' olmalısınız." + +; checkifadministrator function (uninstall) +LangString CheckAdministratorUnInstDP ${LANG_TURKISH} "Kaldırma izni kontrol ediliyor..." +LangString CheckAdministratorUnInstMB ${LANG_TURKISH} "'Sınırlı' bir hesap kullanıyor görünüyorsunuz.$\n${APPNAME}'ı kaldırmak için bir 'yönetici' olmalısınız." + +; checkifalreadycurrent +LangString CheckIfCurrentMB ${LANG_TURKISH} "${APPNAME} ${VERSION_LONG} zaten yüklü.$\n$\nTekrar yüklemek ister misiniz?" + +; checkcpuflags +LangString MissingSSE2 ${LANG_TURKISH} "Bu makinede SSE2 desteğine sahip bir CPU bulunmayabilir, ${APPNAME} ${VERSION_LONG} çalıştırmak için bu gereklidir. Devam etmek istiyor musunuz?" + +; closesecondlife function (install) +LangString CloseSecondLifeInstDP ${LANG_TURKISH} "Alchemy'ın kapatılması bekleniyor..." +LangString CloseSecondLifeInstMB ${LANG_TURKISH} "Alchemy zaten çalışırken kapatılamaz.$\n$\nYaptığınız işi bitirdikten sonra Alchemy'ı kapatmak ve devam etmek için Tamam seçimini yapın.$\nYüklemeyi iptal etmek için İPTAL seçimini yapın." + +; closesecondlife function (uninstall) +LangString CloseSecondLifeUnInstDP ${LANG_TURKISH} "Alchemy'ın kapatılması bekleniyor..." +LangString CloseSecondLifeUnInstMB ${LANG_TURKISH} "Alchemy zaten çalışırken kaldırılamaz.$\n$\nYaptığınız işi bitirdikten sonra Alchemy'ı kapatmak ve devam etmek için Tamam seçimini yapın.$\nİptal etmek için İPTAL seçimini yapın." + +; CheckNetworkConnection +LangString CheckNetworkConnectionDP ${LANG_TURKISH} "Ağ bağlantısı kontrol ediliyor..." + +; removecachefiles +LangString RemoveCacheFilesDP ${LANG_TURKISH} "Belgeler ve Ayarlar klasöründeki önbellek dosyaları siliniyor" + +; delete program files +LangString DeleteProgramFilesMB ${LANG_TURKISH} "${APPNAME} program dizininizde hala dosyalar var.$\n$\nBunlar muhtemelen sizin oluşturduğunuz veya şuraya taşıdığınız dosyalar:$\n$INSTDIR$\n$\nBunları kaldırmak istiyor musunuz?" + +; uninstall text +LangString UninstallTextMsg ${LANG_TURKISH} "Bu adımla ${APPNAME} ${VERSION_LONG} sisteminizden kaldırılacaktır." diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi index d17e860df933ffac36093d13c3bc217bf077a126..764ac0cfd24317391c9c8a623b0a94d8286f55f6 100644 GIT binary patch literal 3758 zcmc&%TW=Fb6n>AC|1gar(MnZR^|3rut`kyAiLv6C=AjZ=?6JLKz3c9-6Wpqj69Tr$ zRfRYt7(xhy5Xc1*Oo&bRFU2#v`;@=XGds@W+Zs@%R6);7^2levh}{Uoo4|TC>xj#2q7)j0n05h~oi7 z&l3pvJ;M+*FuxxBv@%;QKdGL)r-cgH&zj{m>-ime?~oSuX>JiNUK$t)`Y!q}4_)*R z!tH#H7GIoJa${p-rF@J(X;mx#r+D8OZ%Ut*qAK>y6{^)u1k@fEN%{A)%oJ z)-+Z(SCnfF;b|2e{;9nQG=EY(nj^V=bgtLu4~_;#E)JeU#?}luUVzk^*=;hj#3Ml- zzobjcAM+h%_Miz-jwllv8po;z1=niEFI?afKkpB?*s=YHu026D;aY_M&TKY@*7mCr z(9N;BWRrz$dS{O=96Io00dS-DR~dd}bBaDFlDo_1vrSUmazuJZzC+ccTf9o3KFGqJ zdHo&PpEt9I#!`tsTO)tXng>~0Sg|ILAvO-8yU9VUjt7MBRX3Y`HitlWCrRbe!k|H%H^ZP7|Ue zp*WV3@TA8Ph{2tNAOnIRM}U2VE21RoX{1DLElE|0L7nwAdKA*|kgfjA9k-kYBrIqc zrQm;-*IJ{3Up2O<_lDsyZ&-+!PDYJ(k%>_uk`QGP=urSpLD7`V+3o8Z$~UcL=c&KJ z$j;45YFA#3-trl%m;rL2FK$^Yi+z1fuG{t3g6x(~I>l&`939YHsamO2-_Fy!dml1T zO3MK59DT^l@!A1-^8SYP5XdDDV#e;ev3Qf*UIzhg56#a(83I#rYwPNwsVm(BmXbd+ zWFh%8f;M+#R`T?VgT}G{hp^f9b_|=OVj+?ar&JZojbqEsy)WwJM{dT~(N6oR!3%-B zd1aJtlbyRjISz3^{;jELdi{XhoZ}g;9%bl@_0!5)eK&-Ysi-8xw1%1=7BvkzJ{TPM zzCFR(1OV#@TRc!gNF!O%QCt{@)<@nzh%zTudpHm6Q%HvXC6o}@-<*MIUjJZDBI!9Vz-4e>@g9BSF&q2yKESn1ZSz~&g9xPdzSD=Vz%}FS% z9>(iMdVh^|Hp~{swi{0w#~hYnwgQMTT_Pv5e9bZ*9h2Qvj_k-=%SEe@hnLX$#@mW< z+@OeGw0WgKOF3W*c71_8JNA4s`fj|?7^u#q@GmmZnGwD$2X>SH7dfa?)F}sNVznID zJmSatgrZ*cDzeNM^@e6{FXB4Db~d26_!u)vugo`lR%V0FKjG7h4N(;*lyMw}=EqS{ z!i~%^Vjp_h;RSZsSq;f;TPu&D%fl(yQFP5-9AL#|>xPDCAzLk%$Ya6?Ov2%Cb90j1ddOzA z9Wk;z|B=R>W^4U83Z2d8QTS{c)?)3+9B7A}Jm9Vy2W8{+O9(h=o^Eir;k$*W;2$?6 BjXwYY literal 5554 zcmcgwU2Icj82;SF;&2!f6HRo4&jndcU@Kl|1TVx5VaaydwS{(BWm|t~*0tDn6`XX= zjK~~Vym0>BctO%juDwuixDz!ophTl4h7gHJq689A>+_tmk8@7DZarf$C++$D-tT?i z=Xrm=ulnyUA;k+KC2}G!3b;<;EJaMjMM8{=DUrt0jbeis5Lw*Ea2^*Kk;I#E{KxgN zX`H3#6kEi!(1c&~kYI6o)bD5Uw)% z)41ryRT|%Q>bg)L>Rm4>kMAidiuqFdytE|+UDLQrE?Ht&;9t^-)<|fZ(LKN~DIr%U zJpefc{hh@3v~@u2hP`{msBZJ1@Ivc-kfez{c(Mo9(<}2M=T2N(5N{f~E1m7L`z?B} zu8FhxZ!NT){xw1^ZpLRkuBo{qwP|tNeVGTM5#4LbMxrKRZwlUw>)s*C1zaD&zr@pV z;H3O)aAY~p4%j64^?6KR?uU#RBvGytuS#(vaW=k^PgkCo9xp(b!wzTtbRjci_Z(Tu z*fE$xORUVxVIHzE3q~Ea_^+|Q`Y_%;im{NzL3W#-bK)(c|9f%&XeTsS>&$CK%HZF& z>66+g+Gem%>C#@ktbOKrOKS~h%QrQm>Gl~m9YE~(^qBG>mPQe0Jnz-xXVEH*)wV+r0YqIC32G>?FR)<1lim zLk;&sH%7XZ%heJBKY$|myuxeEXp>;qyblab+4G^O^&Rtk5i^p#^#C-9DF+RtVh#&5*_kezjx7i(jgT- zm9cZ9)9z<@LtR zs?-0C-7oX8MRKuO{L+Z6IHD|uJ}-(0%jx%A`81Pl`w^ABwo%UP?YxuKn(Lv+=s#Zk zsuUV=1r?Kx%*9Oe=h&$s+Ag%mCTgo>6cx?rMcI!=am_lzbwUF7cb{F9boOUTI(vCa zUn@WRr;m>+9K+to#Mj88s(Lo6Jk99g6eCszrN?>A6{H^R)zdY>%xn9|pHtOD%9xj(`+1zBIf!3v(# z-@FmOsXa5iU7IUDI1?J-UF|B1dvest*eN*-o4KRKzHU;_x=Q25w)R;hcx~fNd!2IJ z6=aX3@($OETn&Hm_IWKd(v}q3hniuF!EfXLQrURQzPBe)8GF?C*TIJ(w~tnQ#twkd zMXR-_v6Co;=^=Z}81-s)zBPPN`%RsNO5*~#3=YV0q@zP-l^z=PcV8U$wCHEe$U cd8ynQ{!*i_Zom3dX}iW)R9;)HVq2N;ALpT+FaQ7m diff --git a/indra/newview/installers/windows/uninstall_icon.BMP b/indra/newview/installers/windows/uninstall_icon.BMP index 562b56676a9a87037f773cdd4ce2f2f1ba66b9d3..e7291fcc353a3279f9ddcbfafccb4a931cdbe74c 100644 GIT binary patch literal 260154 zcmeFa2Y6mbmH!`l4V{o)oW$Ld)r%$D>h8T;a_@E=cgMZ=IL)a}b(~ImPe>swOK%H- zT^2SFU}2X9LJ3XEyz~El&fL-aN|sAV^7|W*p66)pojzwypL_3HIk@yM?>K?KLP2MN zPvC7QoUN-9PI#xvUwZcm29}|J-urfF$3Z&{w9`O44YbohI}NncKsybz(?B~7w9`O4 z4YbohI}NncKsybz(?B~7w9`O44YbohI}Nncz+q`1l}f$swbx#I$6x>Y*LVNrFMoN@ zpa1;l_x|Zme|p~^|Mx3RJDU998Rzy9^de({T6ocxoY{N#)u|MT z{XNJ4=7`LC<&{@H0>8ib;)~tB^rbHqefG1T?eokt&s072)Kj&V{lHI#^FW#KGC>*@22*4?pV$3^s!nPy(ME^F&P&VhDqwT=15l5XF= zeHB36wo>x8ZQHi`aA{^4*AcdE-MWVBV@cbpL*82fTefUj+ZMc$v5s|}hpQLYA8|*@ z9$#|FC5!j(-#_!d`|ca@xzByB{6GHVKRW&2|NY-5@SBfU{f}J2&j0C8e|kE6f5#nn zjECQrE?s)@?Af!gojP^uO;e^!xq0&B$+x^7m^5k90qSR_nb)n$jg($da@|&XxIFTKi4!N@cC_?Z>Kv|*BekWhHB6W=;db&e(|Fyw zZsz^pGXCM(Wae`XWa5`=Xm`ep8P{KU;f0qWtI(U+0r*M3`OR-WN(|t5)cwTunBVul z_q{F;Km73EJ$v>nn>TOXRij3Y`gFg3{hp|)sd>7(y81I!RaMXYy+UPW<+K0jP*G9w z+#7|yefvI7A4f{tDkJaBfIfZte3pKWlpd+G#Ou6{H}){ zdT0nb^?23&FTeb9hZ}Faak1=``^JtP`?b2dx*zxMUH*T?#U;NjDk}P&*7W;KC@wDi zeI~@Rm{(X>WcAbc>GtGNKbFNb_7Tg{DSZ{Z4xs*_pmqE{KtV>zb!(trW?trf>?7u7 zrlE|vGEPXt^`ZTR`4txz2@mPH#_NKD!ao!h75;%#c*ubK*ZSg{QTTMiq4M#TGwlRpQk=DA@-S>_j<4CqxCqUU)IXJ z3kvf87}s@ZTKKADz@LOm)eR}v+Rso%0r-`@_bNqdq3c^TK_a~~n| zKDKFHKjvqqp-vntrY*;f^<#g>mWn@ZzA>fGcpcILyXU%PeykVrLwRmemo$Lr)@MRG zKS%jFUNmhGuSt(~9oxJ)Y0u_4{4M>(`G&ORTI0Ionj?;&hlopPS2{{i;>9OkdeO`8 z@bWJNeYk(EsHpfi+1c6O*ZjUA{`nHRf6kma*X-N3Z@~*MywICi8ZrOlh4zf)%v zqvgZ=SBDNAJaFE5=lOHbJy*~nNx43D=+NO@>*Kuh&Q*Uc+tGI%qeF-DR4GJ{f0S&c^vC_={D(pjP-L*x#j>Ub=`ga?bpCKJIwoeLa70;+0okxwd1+j!n$HxVYH$>C@Ls7P!8Bds~Wp z<364CmdvB9uj}1Aq})pes!mAB=RUJM){k{!ADQ>D59(%?x4w`4AE{1k6Z?$wiEU%r zRv)oV?4xxW+XNi7J=eqa5!=3=RJz4*8P-s4dMD(W{!v+(@ZH;$mzS|ON<%(r>wNNh z_wM7$%1Y@+X_<6cnWe%>l21y0xl_!?tBs|helOE~8cTVl&1IoZN%K8*L)%y{q@hjA zymVh>uC%n&=0iQ^m3bfQ9jy<_g_A?(US7^xn15I|xMH0FXPGJZ26qAP(7$NFS5;Ly zfv>Kv^ffiruDZI)_v%&R;C<<@l+wR;>(=chcwc_=lQU<|+<)0+mt9D_Uw-wO#}n@> z{_qK%OYZ8_sguKw96frJpFMk)pEYZ`m(21rX9k!)eVXpco0_EYn*3>AaSb2pgnRM; z@}^IpqH7>sr*+*>FP76cKp&x9W=emtKKbeEmSe~9VtGiZKeZLad4@65_2bxaUaTEB zbe!~jDa)LHW?lM=>x%iA_nFr%$4bvB&J~U zRmycs2>I!wB8_2h(ZprHs;{m`L9O#frMN{70xUAz8| ze1xwK7%<>5&dRR7`s%s=@-P2V_OqY;>@?2#j~BhK=MGNZvSrI&|o+b9(B!rG&pdnYfHHg`IDOS>+2_4Icd0_uN0B*VD#LoH(I5oj8%ah8B6P>$G*Rb77zEXT18D;6mQSR_O%wO?k|ppm~g^ zt>uTZ*tT^V=NkKA!~Up$<+F#eJiSLP%i=y~meUve9`FDzXcN;o_plG+Rd<}~#&n_^ zKYoIrFd@vHKE{s^I8=LGk5d_Gx(;>6j~|=lr~3-|<9xbJY}-~ku0mx>txNrIL<+~3aJXrs=uYD~~akWo29Y<&Uk@uzd zz2ucw%+lA^))-*hR904C+hf0D|Hw9q&|5ZDCY1Yf*^)pyKU|lW$9m~HXSzrp>>_s_px4V+q%51`(C}uWZShIo0v~#9`-G5V_xg~ zI9^QK8izh({_CA*X8pFthUizK-__FlYt&jpfuAq}ze0@cY?exdS-Ylk+9dz*ZW zdBj{Z>xBF~8(;k=X`b~R$IZ(ta3KzxN8I1~*Sst*w6Qq4-N*dQG|ZDap-n8~p1JFc zAsIKMu{@@fr^gT1A&)Z%+Spk{l2XonTz~8v+{LocCay1xA8^aLM$C_EqpvuAW?gUx zei@&9)*0s<)41kvmcyKKo9jfp#=6|czQ9Y&4=HB{ah;hoL7x$ane%}Tax>SGd7a=W z&OP8Nt~aECwpe$ZN9J|RYn=uhr`yEx*!IwM9a=ZGAx*E%>RD`zScGIec0RE{)BE!G zf34@>K0AN@{41}z>Z*Cf_<6PmU;k}yd)r~(o&A3;6LjYA{u^$%VYzVpSLRRrGApZx zoo$Hjz_s`!oD&6_%dxU>ooDAffrr_j))3FL(rGx)gIkep=QE^4m|wUL=ZlOT?!igswfHKz2Ve1wGF^wdvQQ1#NjvV>Gx^?R|-+lMpW4`sRZ)N}L zSHJrB@nr8KXL!c&3t#xxI{9PY1UEXLaGYCcJ<{{}*iy~0($Z2p*HqjUJE)h%MnkMR zo&gZoH=jVUQ(~kc&M!Z~VztOe;;(@EaQGLxwzRag*dYT-N=hVOjfWGx6ZBKmX`%<| z3HBYG6>Woj$6je)m9qD_u4m6|_R?i#u~(!$lxEv~R#sMX9_x%{aowb$Zoot9eC{*z zva_>X_wL;#Gh3#r%&r=+T*`>y6&>3qm^h4LNeE8V+y(|s4o-fmWha{6R`UAuCY zMBC68`JpUJbI*d-ot{^-b+dlyWZ@y;2V4c4#^i_LG{~)>qje_j;H{F9B1_pLo%Pth zYcFKimS@D-@o`GEPk|rBgGMW?6TQLuNV(T~&>=Qw@DkTgd91@3ndYrN0`B7aNNF3_ z4{u?2;zL180@7AzPl4|62~^g6CKB&SiP_^9(2smgi|;Gn`i0J;4u>wGL)OW;7cxjV zGTVjyV87sX#q=HLrXjU6$P}?Y(fv2j`TCpx+;h)W@a{X`GdSMf<--QS?!WH3>$b>F z`7>+6{)cCvBXB%y*f7OSh(m?=s{9yT*IUeL`0!zh4b-v^Ru^9%JmWJJ7nibUCbyxl zD3{?&c!$01+O?a;>tyGn$V|p3_8@%vbIv)(pLNz*g0ppfR>u8V{){uu@MoTRx@7Iy z&27_Xw&z(MeE=OhMhJb=KfpQx_A=6BNW0m6w{9UHS_CMI*YUn(JLo^qHhsqa<9Kmx zqyTfvJhMh`u;$ZGKf{0OQ=d|Ln(jOJv(FCeWzDCbetHI+>Q6iEG=It|r}|S*J+-;7 zGtWHJ@Dp%%mfD})0?21v=EvDK^I*QL2|f!t5WR>U7if&ILmS+V@sKl3{I zG|h(OiAYcTJwB>clz$X|Ni0s_HX}|#e00b z8-G06`_aF6$2;C}f?^THS6;dAGpwC;Am@<(TDRipw6<;sB98wn}HSRiw5q z_Ed7qvA?2c$6k{{+uD2GhkWkS<>dD_x}Z)hi*4dPeF_|Mkul;}&`<(47txdHvCQWu zkddGG#3$T`KJ;OK)>&tozF|%52l@|wqz*O^wkNpy(1$(*?@14JFxw%KH~63Mxr2YG z2XB4wgCDfI>@)lD$xnU~o^u-0pLEhm&G)*ty$k$#szX+YUmQGxtYEL$L;PIkqj{PA zCD~#2faYTJqEF^iQW9*2s7H}Cq7U15Xau=~-GQ8mYol-SrF-lgMz}LPP>1mt7u}r5 zsKkaTv6TF%yQv>_J9v~VF+DF`-=Z%1o^t9YdMnyWwl??zdx$z3JD%%1aM`(Ymy~Ge zYwOpq-+bqtcaG!R7d*@Ns=ncIyy^VN`=ol#_&q=T;Sa~^8H8_(&P>O_FUZ0RF1WyN z*s#INfAOnVueN*iJUk11B(!6`4m80&vtR5BwDy4ye87L?BOkHrWUtH~z{Y|{=?mUK zhraK9@3Z>Q6k}s=L|Lx)3{1Ww|FK0nb?WTj{qA>r=pG*6EKp~XoLlKEs=@BDRmg9B zAI=RqCk$nrI73$O`~>|_C+I&rW3oP=L*(Xr-}_#(rO;*QLejy52RG|5bQ$_nGSm7-9>)Bd*iqp*O!g7_W-q`!d(WPd!VByTKsnL_Z@xnJ;x&J9Z+v1fZQ{j{!1^YiKdjBjqul{#i5kTm#S-bwB#ik2d$gJ$i>c z*2~)1heY;S9({lZio$6 zZ-4vSPf#54!~gx?KU;XuJ@@>CbwLZ-X9w>~mYLqyy9o}uXJ65~;7IE?Jxg8oPy3{2 z0j798*I+sVnGXMpN2P}={DK7w^o+|4ofp?zI(_Y2t&Ue0({V`p+WXTez ze)O!-ET?Cryq=GCy5=4`&9Psid9yFj!{n)q8H(P z)&g$n6L|q>AN1_SRI_iOZPhnDNT2l0{OFT<-~rsxH}nn8;C<@q`wZ59BJ-?G?1PlC zu>bG{=!<*e3~F!j2F76zNfX{TU8%jXeZl@pWU@nUPzPHGn?yWn_8jYCpTPrj)LI?3 zIOB^pI7hR+7C)K|10BWnNPjfPBobL>x*HviJwRLnUd0}P@1aF(AZ!6_L3EvDkF5pz z!!82v&_DUCJK7_ZBR9}B^oN~=?OIyei)Z4#sJQu@FMs*Vg+JEwyPWC4_s8RVyOHl> zDxN#x_rL%Br}V9XZ94b+HToNzK@+n1{i;=~ym;UE4w((#L37A`onv}E!{D#K{(3K8 z$LpIiUf%%l7him_$!+BDd*1UNlcCyAukW0AoqzbXYuEbCn>SngjT<*YKPHFae`pjs zVa#RAmidJX7Ye_#4WI}39G!>01JGB{I(48m^e_Oe(k~Esj}(BPqd$l(3%x;~eQM-OO4TgEdnRTNz!6j%5Duc=V6ChF<{q5}yd1g=a`-+B_v+kTGT_uomz^ee^Iq z$9T{KG%5bK`?hdRzw8q!HV-}qG>aX=*!Z{LkoACL`i8HWJJ;Bx$X)8O=dlj<2j%!c z^v8O|8^6%=d)vPH)vxAro)`5!e1AOa{K)&HvY}6qf6_tE`re@Z|D*IziWmnv9Nw4B z?-nm!YAOpQ`SRt><6?u0FHMJ` z_rNdwB%XE13CUsyeS;%#E4$rcyNlNim-yY-+N9XGv}JGLWo#7IiOvQ`><6+Q-O7B> zkJ$9_T!6OZ!Ncq~e2*Q793oBRfY~FG+oq4PA>cD;4t_-*NbcLS4$}4JgQMr+LsE1) zdkn7GOXi6!$-Lm%sOPDR{t!Q#4GZ4EH*IJe>5aWa|1)po269BYDTQv7uKV$=x8Ax( z&+Yd4@BjYqQ;F$wo(IqWz3_dM0ivT5bnc&}IK{ov7me8W&^x*S{ufP|Zh%&VEAutk zWA-0>fq(D^UXnd9Imw>02ha}X@C)VC$5tbyA8ZMD8NH93K%Y}af8ZSXPZ?vQi_k&v zOR|U72XqRp(4M{-D+2Z^`IOTS`cJ%Q^)n{pv;H_&*2OrC&zRJqoP7YV%$s{+0oX;XnfehY&<}mm zmUs#6p-X6ueMVkF_sDB#hCPP{!3}+>p1bCnYrgx)Baf_;zAxgN*2MLAcJJ?v=Ogcv zVyoyIL%kILe^T=QHPJ*0-HA?t_t8P((iZ)c_G3S_#iLWGyupJ zvpjSWGK4bdL3C(3O!CM4D#-?u>BwF5kZfGj*XTs_9Q%MT${sOp5>K+Yvg(*UAo{U3 z;$8DMv6D5XgC=B$nE!~5V87AF*oo*L_8DCPPl=ALT(Zq{ePT4P;v=gb2+hKvM{=vi==(7Ne4`a<@R&pfbI=nH!!+D^#Yc#W(_pJOYi zKiebbh)kyqV_;h(evYNs^Z4rcFyI-!CuQ&G10Pdmc7`H8wYj5j8I!mN_34i}!vCxr zo`y#7J6Hp_B}E2^uMM~C4|K@*l2f)fYHu{cILJWa`>ct%(+9Xj{zxVmJ&4|HuZ6?c z^gYWji|^-u=R4o&`M>}BzbA=b-v9T`_wYV)OXm{rQv9z#Ydats{T(_1n!}!l{{ehR z=qu`JbS!?D-dVOX_5yqZ@HjjJ595PThOWSd!zX7?k@d*sB;IFwhj!GXKDGybKD7L< zcfHH>4|@hJ;2Y2va*2IImU9M3f5>oT4)lXg0niEfAo!)|66OVLN$f7d~*4 zo`?COzMnpm=k$4IkLPtc$NPKM_nEq%*uQXlg5nlu-FDk;H);?6gbfHiLc`EGd=Abz zBZBtW2k-^%!6!V04Gf=U+LYL10Cm`JaLXP;=h#=VF7_UB7yM&0bIqPm7k+{t=$kQV z$39Y*Yv=;rh3=UjZE1%sihhRPpb5r;FDYkE$O_tX4c)}^BicaI%!6{;qHnP|slz&< zYu121VjkG$%z<+FE{;n+^I%-)FV2%ODMQZ2a@sKlYmIZG9lSwG9(bpm^|KDz#&t0- za6vh8hIxZ`coumDO@l+mqz&V`IpB{#gV>VrA2`C+#MXz_=>z)I{LOzLAN|Q%pkM3&d@bmee&J>Cjb3A3(5YzN zVqwv4XAST>e8BkNQ#@wls&BLPRc^Mn^nA08j~-==L}%Mrj3+r^~HK>`(k(n5A=oZ7VjD!v_6{$_34W}MDCzx#JlEOux`dzxz!QR zI`&xjZQeWZf<#;XT}|wtb3pw*h}qK6Jo+A5f*0`<@B=tYBo2vA zz!!i&pjBiN@g)2cY;EX=^FU-h^unC6UGZJ$1DOV0;h#e%=pf3l<2lFVn)N|j=!IC0 zzKXUG^H&VO=762b*%@{u_7QVLf8i%ENBU)rtd(olg5F_{*c8l-JZvLy#CY&~ET><} zMVGc#@Jav3QPzkrL^xc1lLHo~*%QsLg@F1n0;6YW_X zPq?>dVW1V!teqX9E3tF6pY|*T`WC(t-J6~fU6?KtO*m)>c^rLT`iJ&O*>m-4=P=@3 zix(oZ;caXNbf);nvA4($^eViI-bW`R@0pkSG24JX(96UR(P8w3FDn{y=m7X1y$j8X zCrwA7laT@B!*}Qu<|Xi{cNAw?bir$0v z;eGmmmaz%oXX+x)z!Bx>VdNKjk-n)XFy0`>$sE!1$Q5u$ij6>DaXjXXpMuV0{CE#v zP#0N)jez|u{b>D5zB%MPbOB$oCUmEG-}V|FR6C;?^f~>qH^>#u*Ve7I+x~zbaK_r$ zC&?Cj1{gUa-^TU?yfa5qcv`$|XL)fyu-%ZC;%Vy}{lqvCH|#6(&=}SyYr}Rx{>#2h z>6=^srFU}H>3zI>Y(rXx&H2B6Z|Dx~`Cq{`_7pk^`ORKqS3(Qe z-;_g3&^xvie9k?4g`S5e(Z$d^`Wn83w$UTBVb7pvAfX@AXOyu=#0j8l_ATlI#zz0p zC%!NAj&IM{>?br&8S_ELGY518`Ubv6Z&Q~#_!iJ6?WxcFm(T(c+46`sT<02jz9cnVpJJV1^j ztDy__5_!#fSS$1aKIscQgWpIu;GT6bcXU1W2et!xnfyfN*}9lN^8$C^iM?fw>^(Rq zwnx9UG@oDU{6^axX}6=W#fNAw(czX_MLc6kKeKQN4N10r~irn zVgKv=zq6kIzg#r(EAYuap#Q)%dJdWv510-YEm=H3HlRHh#Jd6V2b`YQ@p_ie;RDF7 zH$P7O+nEl!ioKJ4=y=}m^2;wb87~^L^BVRIU4cC-Ti#)>tG>ky7#BLF9QxzAB>her z_Mhnk=v3{kOtfWv==TOq?~8U!-cyeKNuSWM>|tAj=*M&iyu&#Zx(c01|D@RR=r{O+ z=aH~EnFqE$HiYD-@izT3ckCJZpe}sMSsyZtIkRr`BjvKy4L_7a=lC$_*The-I%;RJ z2+^|Bdc5Abvgc%Edzt+K?ud(F_v;xfv&p~-HaNPGxnVP4uY*(gntdW=9<-w`)((C( zFY6b5k32+o(pEm6?Wy+J>=0}yw55Kl;OV|EAh2906cAbV&Fogx?6U-k%_1>J=WfscW` zi9aE~nM$hZm`#5@D=by&LKOFy)Fa2?X?EjB_{p(-fCK~=VaupqcoJUSW zuizM2j2;BfdMCi^Hw?{(L;j;9knPYh&-KD%>=FEfJi$jJmcU-Khxnq<80CzIZXl0% z0Ot+RC^DOJbU*q9`eJN+4}3#(6Xobu@);9arXTnSy%_sPzM%imQOuLN#3SGlbPH=h zKCn*4M!(P&z=jad+ZySIwZPky;V+=;@DI>i$Vsl@56ZDU@D-37%#rbF3oa=qhK)?a z7e;4M7hXhXi)LbKbH@%9-I=XI|Jbn15&KcJXEp+UH?%8T)7BX0 z4j!U!sxd8Qz`V$(FYrSAgA~0CzQ7wcEB&L#5?kARW9H1dSp(y-Ze$>HhQ?_NpFsbT zowhFUjgJ7%;8W_t7mN>X!7=^?1!4ry5;%l+u^r$`@B$j-SOPMv1{rO zuVQZKE!sk3=uhT@jz@Q5tHi$HLG(CwJnO|aLNB6g=o?zb7h*oxA+(40urbhA_|Vw7 z%njVo2Qmqr%9`mLpbVW3k25E1eAbF>1U|tH{j(SJ9p}t9835+Y8o(R<&=#OADdVEQ z83#UN{>+cM;EVUX>4&w!tMESd0{H;z7&mUb?5XhG4D1f_r2iZJ_~d7-$8XfO%p&GCuucuTY14Xb+l@tT1~;cuHw)ujqaI>!s`a z{QT!XKP7oa@16gwzWuSv1JN$e0P;J&y&rt=!GDwPOMzF>h&|&;tQMX_FTwlRY1%jQ z+hprI?0wOo`Pph~aqSp85U)6BUNmC*U-I0Z3x$qk=bL{i9&CQ!gMF4wX+ElCgO!s? zkHNd9%aIBA)9^liJba8kL*I!m%tyq(#gD*eML(e*kZHvEp{<1X&EG_4V}~X`6-%&?OCRkg^L#u~OMxQb#Y&7PKf6w`=;wBDx3{KJQ%mY5dhGXuGfz8e}dx(6J z{bc>Boy92FGh`=YU{`}vWG3+kcptgOI_a0Wqlc->oV7PLKJftL33LJ883X@|_0u=} zFPUQdiai6a=nLK_t^%L4XV`F(jm_u($RWm~47rKi(R;VQ(zB}z(DgB%7oXK>xAFZ^ zeH?Ja8K7){uCke)5YAsi9)o9OE%b&iKvt8-9`dl_?x0WR80SHs$P{RkYjhF7J@ZUx z({v8=!ma@*!{%Ww(XU3&F%GhUb)k>qc<>^1;cMo^ys5*y86O#h&IMQW!Tgvf?chPy z5Zi!n))w)^e5p@8@+fDH^a&te@K>;_*e7sDIqhf@$H%6D@0bHN2x%;%9&?FyA9JN2 z0DM!%SR+R8oh;&P11&ZH4j31}R>z)TE{x3_XbWDz6Zh0Ja+QQ~dq~#jGp%t`@(Q_s@2AcdYvTX!YQK*`dS$Pt-R6E)$*n5nCI3E$$0; zGj-owMGq4H(>b-Z)jUjxp_laA ziuQ~Wab$EQdIkGi{N!{d>lF%_$$O65?(iYz-MPq<^Mw)784LY zEza_ZPn?wc;0Hfs{yp|3b|$ihm;kZ97)Qnr(0j{2l0QFIzn5{6^woRd`F8vM=sNyr zG5{X{eCip95qb~cE7B?dqkZ^^^wPJ*caMs$FVen$lRbgodG-%};@y7$y5W447#Dlj zr;pihraR#+^=aP;A;p$NHsGt{r#|}Vqh9Y;d7aO|gQi!J^Vr$&68V6>oovtBiGIv4 zJ?*qp&2NPNp~2g4zuoJbYjz&>=}&*!^f3I5j*^XNbI@-qTVMF;#01bOyd!hpefQb? zILo3=PEM|LGT+^rB7I$Hx(yy-E%ePe%!zMpfD>pPUZOqEzA;z)9&|G@6C0f|X#3=o zPa4kP+nSmx`395adz6?x0B&gezyl8$P9A;qG4cFN;p!CG+znpelJrkK^^}!;;R|1| z*ap5kGFiTx;Szj4{q)lor$BCxA3sjETaEN^iNz+swftnS^B%8raElk9x3LMBqt3{@ zo{O=*c;2Ufe_{n=Egdvyu+=cJM3k2s{H{p=;nV(c&+~H@}dsOTqse!ukC z@1(cZ%1^1(x5^siFFq%E)5y6a@`&dK;B9PV>DE`&*Z0KqC4r`URs;I$7A*mdY3g|&tT_k9cIgD4D);WrV02E?b`VQ zaS41{^u54zHuev;t!!`8>+%CEuFZJZIp|X4qU)M%#J$=)C;5 z;0WAe17t#!vGN7XHV_YPlPz$+bnWe;v)dJeyIu5pr{Zk4DCSzq9?@R0*c0?yhG&Tv zH>vK;f}2$DCh^@Z;_>zJ*}6)e=g7v~s{{>8+vP``-7mq?1=_jB7;K zR{^5?%cPqo>OG~C7zdkAa^@qF0rhIXM?7g-jzSAAZh-&89W-Mm-4y;U~ME28gI z^y5XR=8Hm$vU%-11G^KS1Rpl~#Q3n$N2eU1KK1ZHpnV{-AIf7Hc2F#f?dSuYh);~o zz!><$*yZ@XaX$1B>tRF0@#7pQqb*}lm-r}Skpi7NcM;F?e%whZ$*4bQP2ZHC@>%(I z{O;T(vQegp|GIHDrtj6At9RXoitp+qw{!LG%h|8I@(S;~y%#*o#(t-snK_f^^s0U`LQ0U;<+c# zwsk&bjDc)noJbo{4rKO0Tl%1mzG?Uo>67nEex!(76R$=Fz|+L?;J*mOrpSx=@D{** zj9Zb$dhwb%ndPy5Wa|ryUS=P$A5!E|mo6cOCV!h}4qlP0`I7Yf zld>7Em5sDOwo{q-`Bd@TyTDb1DElLRNy%$n-nw4AC(Ug8w_In^QTuiHHV-nCz2Y5Y z-ce|WBjW%(>HN2|?DQYWwzc>p_BnBP@t8f^B3?OSihe#?ox_zg1~TT2^znMzGM;P! zi;d!Q5Ql^Jm2bZ>FJJ0<*;I@8jd{h*?VPNgj*d)6;77K}d!Z-zFUA_*YPp0ylkLho zIUnG?B)&7oZwT;RVZJG@xXU^6$2+vcp*R3H-}uHiddtTB8NM#QFy~(Q$oSkb9*6H7 z&zD-KM=EPwx2^lO@?KA$ueUC13O0Yx`||fwimMs#%ij5n{P+WkKdx2mag<_jC49@K zopuhTolKlSNAMeb$2-CBA@2nv2e2{U3K@X^!x(&DjPd!+Ao*FvdM~%nXFl_pYQ>G~ z^juZHc4!+1;72in$%-TVg7_G`uQPQ!OOoGg&o0TwK4OZ0eY849D}N(>yq>o5_wD>l z{=c0uDz3&En~S`!=NCS!SmURKkG<%A#quU7{yw;!e%hv=h!>r&)G7{DqjQbE@E?2# zKk}SG@=W2I`di)D74SVi8NUsx7)uqu9i+JVZ1#=c5L0Y=H8Q*%+Qxz6_iOb0+FtSf zZ?O3}%OXBaoQ!8jh}jWaJ09Wn&MnqQRuKE+o-@#>_Z0*9s(h0#;PdPGgF6+cy-G3B z9UC`p+|W)xZPQQ03v{G2o{MzGv>5*5w|wxK^n77=>;Qa%H&g#}wt>D!#^^kG2)`4m z=e)NlUcOKI>jrE$#jOtNdD`0mou}R24u|4E=Y0>!$A6VGL(anG>)W%nihbL=C8W}e z@QI}{Ki*T;IV>>A^AV|2sd}M)6JoD15P4u!DsLrd~;so?qfQD%t!gJ#+V4 z#s9trAOnc`>zv^8dZyrocG@{2?HF&tXYd<*2mc`xbe_CZziTx^?+=#~2Ot*sX7Rqx zS3iPHfqfx;zZE-8=d;fduND1%T``?+%69#RVoBdRS{mx)s%}r!JxrRbzIv*!R%tp< zZFAMOXObS$*Wu@JEOTtVhFq;pzyJL$AXjtJdX?t3NNqkgkHh0Z^!^?B_>FphAl0i^ zsqfLfhu%Z_DDMh7ok#J$;StlfsgBMTo$4Pkr7!B~Ow0Oy+uNxBPP>nJ)M4Ck|MrZ! zvCW}rY}+E$oZq3o)SrESq^*>(#Q!|M%zIbAga<|7P%hW8+`n^ZoCCzso)M+_h@{{5hYmtF8H2L4Mw!#0QPp zSv{HrjafaqTiT<0wbK;ZblupkYnP_(-MTh*Robmv=floz z<|)n3&uc6w$Zrxf7UmZ;6&DpW78eyZl@u2@78e&am6nz?mX?$>^(rlG)OAyz-sO$e zl~u3l+1ym0KD~8LuXjsIi_PB;@pIz)A;vFSN@D+d-$b!;1H}bIXL{BrydNVPuxDvB zkLKrkI7({?gzgMobUt?WeO%wTg#<;1buBNfNx~8e7wz{#Vs;Wt60*zHw z)k-Uy*&R#r4sRaQ1u^zGYJSy9m_UD#An(YH}{LsQ?reHw-9CgHfTyu7TbcX?T3 zd0DR}Jr~(1oNHf7n`CF$p6FhCRBU@yqCG1qVebmGheeG=Mfpud1%-|Ig?UY)_r`)e z?Y-@PPGfE^v;a*6+7P`o<%mW|jW4o$G>LwUma?*Yh}OC_3D=E!KD!AJ4QM@;ntR{I zg8UruNS9_B75$1=M7v$#lR(4WyLJ1kXycDXg?X=(lob3-H1Hy_0GXk4qR;95#JhBM zyjjm+55w-)b0jCeQQnvQ_{i73`sLX>wr~Bs@cvq9vA%C7nk_Hax7>P{r-V~om!){# zRM#oW%F0Spy+qT!N=s70tDYe#NtKl7Ta6{fDdAK!1058mib;!$QsNi#QbnRq<)w-W zl@=8!%|9eft{>(?*UPwx@-@2|AK{cfKhpm#RB``ddf(KZQ`K|2 z;WzC@DlWjYx1&b!yPf=2=V&)}w0>hk@BfU`^TOlCjn}s_c{g>O-sRz&yyNYi9{FVH z-|3yGZ{SUAuyd*08PGAX<_Y}d&<#FM9}&E&(kRX;9{ z(V%CT>h)c=dOcS?LEq+)-I(Hi+HvE?D&_Yw#-up!96dTo$Bedk$mr3dQls=-uOP*< zyCd{|qSBP%X!!7y@aBgP8=B(%#bHW`oemv3BsF9(zvnVo&vp;=g9i;v4bnS<0|yL9 z3Gdnme$%Lb%2M`3dnEaj(!S|^gIeuf*uxsV<4{vwovNzV-fEAlDs9hg-zzFa3zdCR z(1Re=SMN7MBgphVeach4dnf!MJ}DPXl_`}BN(uBnr)a3EZ%X_F9|fKfJqBJ0v>JH@ z8ipSvds02K`5m<`K0B*>s;sp5&!X`kiTA%n%tSuqy?UN>`@Q$xJ5tX#cIElVH_H3+ z@$;4~UGiIKYLsw4LGNQso}zC)&CvUEGxZIOSu-u=dgjdO1~XJPWBN2b13uMHpB7-6 z-bI-W^?$$EDrz$Cp#l7MJwiqTVp=<)SHXh+-FS9AZ2C5YqOT#|X&95qko zJ7WglrwHp}J+o$o_068m_oiq0Ir`qm+&O}|z#Kmhm^atY*LSoR%oi+}uV>g77%W_< z-=Y;P((~?%7U^9#VDTcqM9!ZU%Yy?{f?>L*I8}v?5th8#>?;W>i|8^zkWTi-f!3dY|y(iz(#{jN_ig+ z*t}`8z4M^w3hkX9#f_U&-XS5RbeCcoEkxKiH{0iOW)1;F*v zWdZN(0l=OZXn)wJMHepA`v?N<9ecQN;R3%)w&--YwN0=vt}1!@p#)TcZ6) zr+lOHLhVyXGp}P_Ow(=D2YoGFobFq5XRKsQn+tQ&{PfQ3Qmt>f%~|u;JF6?gS}t1A zyf*P)T(cKG^lt2G@!lE-AFf}wR`1TN745Ef@SkYeZB)8>(?-3Ay3udhyh-oQZW1qS z*0(M;`>ld)+qSxG;*ae+w%NO^JM~`9jvd?e`vW`moyi?~7jKt+vvSX#-EQ}u-G0x- zd-U#4_+4_o4a)mOy#IR1C42Rr?WIoVta|_GGN*TL{T2E)DeofbcM04TS6t3}MM|&G zyQll?9b(Rl+O>$X$9Cw28T*SM=l1&S%VkY4SszRL0r-}cI@n#YJ^ zX&#w#vAONr7v{>GnY+N&64rF7y-R%AWtXsKTle0*7yCm!$t()Ce$xdXRbhN!IK5za!y%%+X zUnx3-SD?edE8-9FO5hXyj=X4jiTGgQ1@nAE{X|!$_bqdBvQs^JbpMY`-be4l`)`uo zFS$f`-lcckplk8FzLSc)l}-|mtVBnN&*6ESyY$!c72+wq`?YMj=B{@ymo5|ENzcJ| zOO}c!rTgG_VDS?1wcZzn-dHmZpMph;RCW}gUUNJ8K@(S5zh8n3xZ+A= z#FZ^Uvf@g?KFJ2;Lkrk9VW`9TzVt=e& z=~u%K32&^D4RVq6hj?EyX1msVxyeq}%R8gkF^fc#I;S(bh2|o!7@tUA1zv$>(TAc{ z$%BO#%$E0Z-m(EMuYz13RhD)hei;-Xd3 zl^5x|&w8hG#mZ&yhFhU^ESC&3UedR+ZB5eck^j-v@SAwvbhPxj>3i|6gMVdv9g;@g zzwp8f^nNS0S<6(s?o3X^wu{w=$&p1486duQ$N>6hTpM5SvMxm)EnDnNJ}qD3kXMpl zS_8JY>;m{+YgxfsgPgNE&|GReVbUSu#mmJvTcJ7iruv7YM4>o~l|Ki=!ccj<> zd*FKq|6i)T+PhbL&%I=Tc;9rWcuG1I9UAoN6<5ecxFXmB=v#R6%6(TRdU&7N1Io)t z;oqx}3#R8SP41BwE$g_&t&(=ZW6C!Lm93Ncj9}qsf1V4`$5ldlig)Dn8Oa+%J<*4 ztoQ3KU+$LPG0D$=cA%T_HGNC`dj)Rt_p|+^@8!5D-_7;YzEYm9mRhnjLt#zJuNexAn`l&@*{ zFuPB*fd1!N{BQany^qcp|C|0#^b7hw@dfKUvj|j zli#5!|Km8!0p5?0$RnE@b_yWh#p}%4zIDR46OdI=?_=9Y z9_W6L^7q*{84eyisQUZW_7bxJz!S0n-5+fzPP(f!@mBd?tamMdcS79@jQMYIx(&P zS4&4Gz#d;K{mJ)E^!$x|H$*&Y-)Q0YjCX4v*Kb^Jb|pL$b$`^8#w%tk2YMwYF>&H} zPkcE$E2{WW` z(Er%jl551e6mL01|C`;v=uo{M`CqY^HuZkA0}innn)QFME#QC2PzV19{eK~LzvL`F zN-{^;D$AGaK12VnBpxTbhV_~LC(a@Mm#t@ZknDcR|Fr&JPdos-KU4oF_CGNJ?8{AC zHppjx{*t*hzE%pCi;sEIXOD!&dzDE`W zT^f9VE0hQS?;|!4c+hmRc+t{*(*N+kcr`=s2fO~NE3dLTnfm`q$$~5Qh1kKqt6H|n z>;qnh{~5>Z{(YCH^*{2!Y!k^QrT7ZB+;X$y+d&UM{II+2w%cSgUuo+wd8coK!vD;J zvIib`(A{&-r^Wv_+Ir;^nXM$gw-^fgAKQDo{3@loHolkM59x-BSNTPcj&_rN*4d9~ zJjsnno#+Socf0ZaWPiY~aS!_|{7m1~4@|wwjrrZF{(=WaxYZjk3jRKPq5U?#F#R9w zLHHk=?mFquM;?9H>Df5@mXTzDd+>n=`8JZ%bGc^U5kr!18F&R7xtUL-n-V)2TNNAG zcwgraIvZ}m`){V+*LM?2uG8Ga`{oZ3%fPn{GS1?CEqt8l{~M2(?~ndZeE;R>(>CN< z;{TiP->m=f)ieG6O#QF2qs9P;5ggi{SYe0(BzA_zi!lIX0{8Q-E{D1kY zLH{duCH;@@D?cFd`SF9%|GTC86aOFmFZ;ix{n(ElW&JTXx~(VPnbJvyExJP zvi0?SuItT~Mg~v^y8s*o-M=H)O!)qiqlQoU59ojF006vi-YMOC^K3u=g?@g@53>El zUv}^#e}A$c`}7y~fw)J7j!U?1dLz@W_BC^v$#f^?kEjZn?$m6xuD9Zm~F-=#MiA_`ikkZ#Mrz zi~H-${Vmn|KmDnA|GMi$C*pnCF19w-82MlGHG5Y!aEx&T{#Seq9oa_gFEgfLb`5$M zc_wJK`|;DwS5IPn`VO9*nJLBQ(RX!}>ik7#Fw*yJrVCYXQBps)ZH@=hcZM7w2EZH= z-zvy}Aa_k(EnlvE5YH!Z3|m+5|AP;JUkCqV7p;=4XCJ{)wEr_>fU*Nx#sJ}eWP$K& z=K$vabN*)M0iw%928jRhV`U4N-@7A`0lRnal>Abvp!+Wq|6Bi>Bjwmb!6(Az$MzThD^}3j_BUAz|4ZI( z-KLn|PMss}Q@r=!bieqaG5&(5^n1}y5AgG!8R!>2HPm15;3&WJz+}Jr(hL3C&8y_o zaqcMIhvzf-BKpOO10Wk1_eOnNPWFp^gYdcMp4ImfpYV6zbGOC+u>DpkE(mWdLq}%t zKIdyo65x8VVqKj1)x71r|I?EF!acDVomH7^!eQ{+q zdXNvz@xX+a%{~|JCH{g^<8{vMOkT7|)BS~*BYInThn(rfc`?uEw}e$AO!-5$mG zIoo6XyNHD*XMDs4?c7u{lXFz`J~33{eu>U+_O;CR-@Mi7T#vZF+o;&zhHW~(-6p=? zCckd;O21Bee#5#AZrvKia`Zcp=z8gV;|J}nd_U9ow(lVZjP1W#XM$^O9>mUWzx_7Z zGIzOK4<1mw{L^%M2mXK%61ulE8ja#AMi~fB^cx9UQ_Hwuunm&9AhAK7!AR@_&eRm=G#_F4a>)un zakSts#-E4NbY;*i`ix&!4>6Gi1U~xRvjqR|bf?ZGl(YB9z9bVR$*!GEiAN4!- zOtkUC^CZUKX4|cmoL{?km16s%g>|b9N9)(G5pIa{tyP@Q_*>7kthaL{o^1)X{zl<7 z#G8Vx&u?91ob?gwlgo}f=H=DdhN9;6P;()kL_dLHJlf! zJ^jbNqCFADOveV9A7w$-ATuOW@Da>buxA^z&UpT>SfSQ#@jz?@d>_d>uvzxj#vOj!CfNs@nz$`s`)FX>TbE^0N;Xk2M*k#Z`j_V z`kZ<=0*3uDkA9 zFHr0QI=aSP13g`HwY%o(t1P`58WHGTXG}bgvM)(><^;V;h7x~PJSe2`UMaLJTGO*A z)Y~T-Ri5HT*IaXz^{=sPJjG;e{OhhGy~gIlyfjD0JduMpTz{RrUUS!49BW}+H)&lr z-E^bAiyzi~v*OaksSfCyz~JS;Ew>0y2i&dt&hM=UZ}kUnyVV`M?V!K?w%gntx8E*b z_I7vY9s0KSU3a>>?!43Aeb-%1;P1KTZpE+e=9}6&AG*iBt$p8p_qzM;y;pJL``rEa z-R~cK-~o$=$#-=4j}JZcuzTpChb%sZjrqtUk2nF}x^|B~YANw%_n2bNdiTRU{`eDo zuiJj-mQ=v^x0OC+Dc|CL`st^gz~WTl`Wdh9wJ0y7y0-gt8uMeCls~QX8Nt)Ewf>q@ z#(C%|(PW*h_hJ9=BM&>)FED%v zCx)l{6+2Y?&^@5I`vVW$FC5-yxD;OHli%y^)j8a~_eOl*?3xybiZp5@7KcnZ(*zt-oN4c z>*0N#eKK9YLwbq(8?M*4=0&%6iAI4tM6=*TbPPWHLGW=Ajy3xA=W)?u;- z`IGb!WD;^oTU*G#_@%Fv`UeO|O-@W(y`$V76>izeNUd7kI zgYfl3M$`Tw@$|z9KR;shZ@l0iee7{NPkQVL<8S}Cd`o!Q`01&q;c5Sr`0y#?Klsyl zROz$+nP-4!1kYLe?6c2#eH+3*``q*LRiAIZe)idLPu}y-f7Z&LS1il!le*7;Ho5<7 zQchjvW%l))+F1YUFO0>w5uTN-$N<#1G9Nx;cnG0B(hr(5IrSpjSQe z<*vK#@Yh~Kvc+UhE2X)P&z zRVb~Houlij%5bf;x~h*?JDW#H`>HKZfX(jmGZ+}{ryGQbT}{xIba8#KTVA3D(KTK5C> z?#duHe2A`4Mo+qVz%*f%^N9>Dq^oU{B z_elB{j7s_+IYRvoCy!LWC#HGXe1rh3DNx)Dl8l4=bjhU)h+hYivCbglI@r$h8R zY{J8^p-P943Qt1^xuHV_8lHv%I{7kt^_b1d^buTUajY{x9B;jW%4&BH8l9FZu&O-nIH9)dHOBL!n1r`(K)`Z z_$=L@;d}Qy&6j7N<|}hg_qF+yo$c!i&sM!NeQklDNWiu7$ZsyAp2}nWI@PHwR-XE; zD?Z2fD~jXj+U}K>0Q&9DQbF;#zJKXC0@4n?zsmaeI@b^AbzTA?e?a;9eqdPwT=x=? zmUr}nfHFbvPJVECCqJlrfg%l4xL)TMl61lq>y7ODD8?x|0|BQ#zB&4D@9Xr4A7rCLk459?y?!?f066-gTL z04{`=Aqfnv(6vE=yS_?=-@(FR8Up^=gF(GJYR?4PpMhL!zu3oS(0&exp#AP&CQ#ZB zfF48#{QzCpi8g9PYZW>A9iwii_@3vT|BYOYL(se%|>f`Mge_@`YVa z_7&nE=H2Ox5Bq|gu8Iq7@>j}dn<{r#W()58tUS^Zw{~oiUpKDAts7hH z*N-c8>&6xPb>n*}E%6)1m$~&5O8th3Wp16)^%HvejT6h=hKWk+dn+xobYp$F-_+2@ zZEPs_nknSNrWVbgy)a(rq)U{kEBPPI-R&%o@LARzJ6WW}V+TyUy*L)z9zJ{f=4v z{jNC!obvpxxdWW8{qDH~E!{PLpxdeYU2_Ne-SY-H<@-HKx!*Hyuv4DjGk>sCp1-(N z8uOdeHtNtO^r61zsZYBnjbo7ZXFeKVbDFEU&DR`flh;pk)STz_*Bbh1O);(0eQmN< zt$S9j)?5pIz=7dNcnLV0o}|-i0xpHq%~LDb!^%J!J<4gToU|cV^YE-dbGPKAo7@*%c98loq z_s{k7`{%oPbxH>$X}>%-w=T!etIKn9YO?)o!Q9$hUHA0!mCmm2>F3nuxH+{-YjSj- z?dMeMUg=!j&r|*RluMSYjmoq9>?%REu9ePJ9%XZDd%C%`*?wWaTz6sro__IQ@s9Xm zwG^x`#e8B>&P&nxm>^17TYH2gdF-4Bz=#!^gJ79qRQ$8 z6LZd2+R30Hx07$sTqfmq_LK5D`^kA-ly>ry^ScOiU(nT00SfhdZw6ibw8CzFS`pAy z(A`fj2D%A)_!%WV{H)Tf)U00FsafSc9WWax>zN9m{VNlc1KRg;?YUrXZy-m|)6WC? z0J#FuPepEOUf&!)pR^*+FR08-&F`D*7gpt^E~v`$i)sr}i|PvelKw?0fnPeHD7C0I zpM2_g>ReD6U}1H>zpy&bF9eil*Gj3kuqu>YsB}>c*9CsD(nX}|Ye`L^Us6}-mklWP z%LW$vm4i$C@_|5cYN^Hs7S$G}7S|P~meductc|W0)fPGR}7F?CVtR?^Nyc6d<7iXkoHwU~&PpAvysH z0^Lk1=w$TMkPkftnu69My-my&jrTlXbQn^uo55&TG%wnp0R6Xyo@ssouLcg zP}s$2qh7QzQ8ZGY&<->tdKOJ}7HxGh+8QSwgyzPI_KdzW>0GorHuGM*ta@%tl8#n7 zCR_L7kBqeWdaTNj1MteYW}boWMcW#0mS{Hjw2%7So}Kgz$x=JV)Onz5kiXBjM&44r zujlzWx8uBvSRdc27&I{G{eHRUnXYAyQu@xkg4Ph3}2` zZT-lLU<1&P)gjG6t^^wZ{cj-oi{2OCd-xt+hwmpMuci0vk>A>H_Ih%DSMj}gU)Q3C z)Kmef^g~KKpOU^O^;6LoqOa*?qA#O4(Vb`!{tx^u`h@>Y2FM2JEt?Nn0Kb>@H2n{+ z8^4$5c+s_i@q=`~@s;$yrQ*fFZ_@pNuR_`vn;<{oe_gAOxqSuL4JwIoLWEd?9|3VXZWpyPxU*7o$PlHKgsVM@o|62$d9G=jQC_~*RW5e zwhcWswR!OAs&{5;b^r5Hi)*?y^Dlflw?cd>h&&&8yJbE+AL@iQX&DgjV}0X!_`a{n zN%&kmFCI^Lo;1<%=y`ZO0r*~fBfdB2rF}EL?~$5X+Cy?%`W@caJ|YJuC%S&J^2Phw zdjMSz--{Nc>&5q?8|cOKhGarWp(F9W=t?w)P7$p^bI5=R(7Nc(Xi~Ik^sZDqoX|Wp ztU97&_#fJ)EHiC!os`A8F@+DtNv_P2oXQjL=VW!#voOp2Wzze+BQRMpx4`>vo!);r z&HMHo)O>xngzrohi=PG+c65`3AN1=)@#jRzstLl2rQ-96(#vKKp`UecdRnPnOOBC_ zYc30VzPS(6<@8D4vbl1l!|^W!+M~2S*B&+GORsDH#Osbdogz7Jw!P#(ww~-h=>y|= zH?^dP^m>4xL$bu%=$4>g?3#PgBs>o-nhr7@uY2@U3;i$tN5A(Wl^@s_y)7RR2)Zz} zpdvpd-57MOY~O{_gVMR=2c2m5*vBf9jZ7KW;$`^-*x1o}|&A9jZOGkY~vf-4}Mg2O;K7e0a@^{eTtdn)8 z%eaQeBXA!;zO8H`0NY41(qyXnRKlzLr zPIdtP8uoxv#l`rSa2Pg`5-c-qgsl{Do8=xCxBS;otBak-RilS|3 zOCTE;9V1)ZYy{CFspLVuYy{-Q#Jr9nP559!?)eFgC#iJ1=||{3xfXvUywNh1UNf6^ zj`V*1X&>`>S)J`!S$Lo42PZYu>&ywg-;(#=On?97mw#Nsb351R`4-+Qf%gaN%n9D_ zFTFnr`$%%mY;Vawct83-=y|Tq|F={+om7BN5U$U~XGkIANF`rW6O~HVrh?o}e0+^H zLAo9NUav6{d7YA8mmS|lsqDG@&M9oTNlLYMsfPTnDYNt0&jhdou?Ye6gvkQw4cU_p zI}&+dbY=V>?foDFjPBrl)AiE#qR&~T`vc$4?xT261o8fyzS7^~|GDUK0s0)6U!k~? z_;$Xo18>9kh2|TZe~gcuz=ethT&U{{YYOEz7rLd2FKrlnZfftyPp0;df6p7@@z*0G zkOx;d@%^7kbp3@iqalCNMkf$Rr2qg1gP$$**I2PKN#NCr$RA)X_^Hb?+p zU@HCrb|JpMYyo_Kd;@sj{C=h4Z;K(p|Ii$Oy(tmb3M!Tj?<+)|EupOP7?3e9>V)?W}H9p{sDj8 z{{8mdg9Qub>wI*uD^@J6zvLWzs5#3QH=ec>S%%$@Y%^OQe@JVU-5%298h)2upOXEQ zQmjL~eqL(4$;yuKz2sr1)Od{{T&IXB;DZ5@uc?W7;`6*tX^`%R?@eA?Dp`Pk56I7( z)PnZ|{|DX={6AH?VXE}R^a#!VKK>`XAM}0D`S<|vJ^DWAd}u%F{W*!wH{Lh?hxZE- z-X{$ZWI*8|{11;4CnK(QVNH=!Y|L#Kbbjjc(H~9S((tzbXZ(I7*?`>HHss{g;_7Ze zr?=qu4Bk(8K9kp5@Vwe7Hj&7RBo%*~Z9u#a9K-M68{H4!3n)eB6Ays*rxO#f7=ZX) zaR7K+c7XZ+Q%mIIVe3WzpBRATe((WJXPDlH-y4dgJJ9o{OT_E>U7P{+q4$^~|o{uV=J*);aM0AnE;XzF*F{zMi!PzHip)L7xZT z9+|-UEfy&J#8h>p>xC~;i{pvkLkv%`7Gik9D?S4t8y|cd$o3Nc1&YyNa|!AbzEAUh z2HzY1cgx^?@j5zR0BxB4Z!{yjP^s~L!uQi6|6^Y^$NU1{N4r1R`guYBo6V2D4{)f? zKa}t1R~E_!fd2(mI&U)lA9Vah{kyx1M}8`Gm+A z$U(c$xgU#hpJ&Xl=GuD~^!pw-_kNhawJX=&d;P~V(j3$4xnta2+k#(R&gWOZ-+sS+ zOtw)kIcfX_@@_Q0)%}$;*AIW*Tx;GX%oFfq<^)=xEi&wPI~F6021 z6VMnCaiHb{p!=EwfaYudk2(*wnJ40vc_Z9knn$9)sj)x&esg~_rnd|6E_3>f>s`K! zzAkl-v3*^Q{c#2N`Y}HjKIX?*njg16XCB`ot?++T`}^fm8F_xrir~Jd&p+=d%`iKe zy-A5a|C!c(_8JZzJVf`8at`ea=#{z;{?U_QpY;gxotWQq|GT;3bwS>P8qe29>l@^q zuNAbOIepp!U7mmFz31HVZdh*wKVO$}pUA%9o|X%2ald1~I_!Y+_wTlTztw!pymAlT4fpp#@9!TG>f8+bZ9?;*1_G?a1eSh;Y>j7#XkmogdLgs+zBiwNkc>rDT z|4+VgZ~2qFA}+uxcM|@=NyGt&A?<>{3A+H_lRhtN%~}V5O~4g)fS-eQY2A+6&3KqL z!Pt!CEBT>*MoTqO?MWNhpX%3v{R)QtpDg>FNBzIU{#f?IV{S|jc^ms^UwZKc z?W(twkbP=2pBsH1K0lY!bG}c~m7LRGf-kSU^XCxX<27V`h4s5g^R4#7$A>K-=WZDv zzcFhyT;AW0*w_4xkM-ls8~zRVWZx`k1@%I00Q~?{=WB7liTj=Qn;f8FKe7RaeZzk> z-0x2RBmPayA83D!fAlLoTlVCDdVfAE8b7va85!Taj7(~Ij!bTKj!bBAj*NSwjEs5x zf0h?aWrs#II#0U4c=gG*AFW_ncY4oQz}f*DBcLv!-_s5;6Y3bTWpahgokpMMWBt6w z3g&0MT?u^-aK%nNATsy0IN*0dG8*Lg*a++6MVxbJoO z!*=*Pn(M242WDY^f>{VZa*t?_*r)y*AAtJr_`e6S|2-uiKUJY* zK)p-;$IMS@eU8k2=UiFz@p-c1i}PiDw+m!TuM1^cpHr``_@0eDE|AqjLE7vk&f@-i^Ey z>VV`N_cN}yoos@IxPg5p?19l7Hg!>BVCD$)F=GaNj=pdy*VfQ|`uwc%bwn>O_t0@4 zee*Y(qQ|aw68mS`=f^%%us>X9pz_>;mtT5GYkW^3r_qG|3^~UC&ODu7ZN37JRlk*W zFs{BmxmR5eHQs&B#`k#5)J~+}-pBWh@mbsBvbjCY>uG$?9AA{%*FGMb+drM&JKaxW zKT-Rw&+l|UWWO~upWN%R%sckmf_t*h#h#dNU%ux5I)6vap3(kXS=RA<+1wL+fB%Ps zbrC*3-3orD4;}|=YwrtXb?5V83(iwNA(h7eC!ZTs|04P1soP@u?HD#aLm}_z2?FDe zfA@90T3g|4hVvPed-@MC-Dh5qH3hRYCrI9d)$#$$ywiMK$vk?7m@CkQJRx{D%%g9B zxkJ_arqF!E1X!puVWAFyn4m0cO;})FmyKIh-@pQ5TjT~$+Flov2L~fAFK%r^l1^d-1m&ZI1!#?)=moy{$&m^;dW_5pGjq%unI(+z0ohkM%W?kV7B+d0bS?MNe z=yMY$x1rBVbDDUL;2ic0%v0xCuQdE?4j+%H`Fw2r0mHlY1dx5@-p2Paf8Q{#`91P) zx!1fbbF(hD2lgZW(Zk0$-^cn+=iN2(^_$nMg!ews`;>lvg62OM`TNxU|AhU|pSk7a z(Ep2CJpFWP`|>X?kgdHhlI>ty*AIV`?Wb5f`~E?8{TN>$bOZ(%Bk-6hwgJuSc_)OuwV4)v#$Hxk3Vww2%U?> z`IoQY%(xn;?>|-L))KN$z7uU3@*cEbW-0sR-z>wsWnW*9NawXb*KtqgVMmSDzNPqzBKMle$Q|pX+L|w%xcD75B2vG*!R5C22|D+#`-NEI2HSW=06Q|#{8CjwE<55^>wU^jiYshHJ$$_t?(-_w{zYqiJb#R{lQ9FTqbc{ce!lbljs3HFkJm;&)+=5k#QnOg z)`#)EvQPe1>*?!5=j}57zR`N>{pq+@{w?=f+h^~W=J^seAME=$zY1!7A@^0GDG8eY zQ0eTyU#mjNAoRzwJRaJ^&a%PC#t{?|Jou8SAH7w#U6Ca)xBTa)ol3>-8DtAos%z zxG!*yUvuGEu8Fz6Ga2t2_9w}RQPBNfy*SGf^A%nxsZsR~)c9`J_?~^aM)%pe zIDmcQ>qmOe=c>;c&pY(<&11eMK`qZ}Kl7a?w;yS~i|>{DAih`TeViZZy^Hak-ZQsn z@_Xp#VNZ|k>+$}+`ux;;qx+HOgMA<88}6expEdr{xWBvPi)U{-$=@lPrF!ccQy?pHWXFiZQe;4m-p3mj`0{@@BfM*`se`?>~vQHMYwtaia zYZbZAC;3_jHUH+g|0`c}8GU}tdjVY(bt~%5#vZ z`?V_Fta}+XUSaH_IezH4*82F|%yP`f^xkpqb>4CBu8f!Lf(>=Pewf=M`!T%_>Urwp z2l2h*-ud{R`2_C6x}NvW;?*|=Y?C<(j$btI*mJgHvV!fOBe%1hZ z)i^*}LHDbw?w7^P_l}&OrE@@Av}l2SHP4=P-JgURg`-D~D(Pd{fAv-9KG=T}dljv} zZ|eGt@4+%-{m}1sHo&lNV|#p`)BZ^Bqt_?Wd!zfxJY)PI&PPvHjQyylXLEa++YjRV z1RtOLJ3rrPzG2_Q`1JLY{C)NLE%V;rx0>&DAMCTI2l?vWul)5t;(l`Lb7fU$GM}jD zhV#^X{{`%twHw#n1KheCkK=3W(w}AX#tmj|GS}ThZVbN9{H*(Z<{H?MM4J%W18)ml zEON1I>HSBU_rdx9QU3t@7C)_B9(51uf4EG(KhX~O7=U)bEtd<_D{G11-|Zn%pMdrN zyq`k|K^M96qpZ}-+YtG-~|4a^mdA~5{XY+pGUiSi#f7Lpxi_ZTKG!lCS zb^k9JVqYBN{Yo0|moMSjpPV&|dA}vCS~bVMnq>CRsP1F`{v^yC9EmxVeK4Ds=V-y_ zSKWW2(v6y<)Sf=g`N6+ef1ZB6(SP~?k=|RI5O7ca&FgU*?tP4JYI@3jz&?63?S7r) zoIW+*=smBIpP$IR^YOKpN44I>_l)s%h5o*;=Nr9G)O_Zpe}qq4n%;$n* z+5jK_o0@?70IUhv9sukqG_`+?{i*$?{uk*#V*zmQwcpqP!@lKTV}7Gu8n;^gN8gXp zeaF6K#^^uT!QK|#6HNAfybs+c`KVv=j-78A?xG&7@v02)$gNgr1wVm zmHU8wt>p#&ewfc!t@nCQ-4APek=~maKSg{Gt*4(Ki}Ss&&v+lYh5fDr>iy}oJ}>>^ zRh|FnefYS~4joo44>%7PH%$Lk_WYcVH8EASv&!TE+Xjn_*Wmm z`u=1_8L`YLLuP+mYwRU5dH(VxUv%ok`ShICThh8^3+$@42Vmm!|db?=`ole!h+G!9Df9U)|I9(ygRYdlcBTJ(xupMmDL(#Nd=19OTx&UZ`=Ab-@`o7LBbN_e1eN@XN_leA# z=jxxkz7~#o_Cy&!$=J+D@0s5Z*^m7EWaf3BPKV({T}%=_2-j$PszIHJYak9Rp9z6Ngs3t z>h|aA${2K+qz}0|X=SV*Bbn)YV=H}B+35QQU#-83zb^ya^Y>*AJP)?vuYrAl&B6a+ z>_G}!;Oqe65+55le}MT(#0AU0_`_*)0QCPE{~P{Y|FhW>6|s-r3D|^)eY_XQuW-42 zl%^NJ@b7H^Y(X350RsMAPY|`==l{UG$@vGpfV2TV=ZD@O>OOn`)&Uah{wD9w`_-+; z2MFta$^iLLeY9NY$GSJ>WE<46sQcCKg6@NTp5=|R@k-jXYMGM#Gac_wnKD(+q~M&u zk8%DS*q8h6u82JUO`7L-Hp^XOF}!^q5$Di)>b)+L|MXf<&5vl16p>kbTbTpeB)h%+5J2_jBLB01TAEyZ7G> zV=)c4oGa@g+k>w(oX%+`nX3m%*3TD6#$fP2^cuf1hF&W<8^=pdcBWlfdQBfy&VP@7 z|B!1WW6+-^YtWxWZN>B#B@6tgtM6d!4F7)ge>pqAD`SMfC$M(F+W^`*TXS63?c&qc z0-68&5c&T%ssBMAwCRU-+`HbXhaqc;yOxfBOG!d7aew`6T=K$$piJ(0%mr z^Sm>j<<`1QOU%or?pHpGvpNfFOqntT=go{QQTA~bb=}uqE2()m^88h9(L8?`=c~r2 zuwi^|rpM9hyMF8*+iQ$_zHa9Air8lz)%8^IN_*=T-vhJAJpHuRT!_`UUxV{_bl(Qv zM?aSfymLm6+pnvd|9`+f^Z1VYZZH1hwA?T4^v5W#?(%Q}@5X=sn_;Uo*1@OaI%DY7 z%4XJ_*Ci_>U9vMXBzxTu@PDCX4*rW|4EwuZd1;d*KQC7bf|WV?PXG0cVb|hk!2RG$ zBxmzv$;rx;?2NsVHT`+~jq@Y_z}g+P0s24M{}=H>%qK{)12$Lr^VN6_{wis`FF|kc zsdIos8(xSR!<+>c?SY7~@Apbr_I=)k?At}1*Utx^b6<1JGw&Dl0^8YvxOYtMkMr9! z2SD9d_HhOGtoixAKlb`@`F=k>h7Iukf55%tpZB}xg8bXqSg-2)pKOEsUE_Vs=qCF- zpR0S9Z%W$0=YJV{>Jr&Mle%Aoc%SD)@w_RVg^IIhKbF_(z9!1P)qU3W4D<18SksJY zyNl`FHO9QPi?oq;Df{|5y4;?7jUD&A;(f4on7SXb@8dV?$I+havhR6o)bh+6I9zQH zUn~0i-sex&edXTz`W=v;4)gY@9_DCy3htTZgc|K<3!0vI}v+_P&?O zls2d4zhB);F}w60yYQJFhEd z<+o|mT3&wn#U%F6WV~?_EZ!hMGCeOt%FcfUxohFmULBd?dDozvyO{^Hom9#>JaMqCf(FO}>e zmrCKTxl&wYYy*D}e_ugb!lgyDf$83(X1GV1JZ}xEIE_z z*POtXK7T%~|Ib;%j(zTfG;zN1_t{6G>|4zz_u+E-Z|p(n;~VZH_JckjtM{(H@AmrA zcMRF*ejl6(pmBdH{{6mEAM?Ww@E%WC8s|Fww>s+TWv<4@J-lCi4c#9yMCWCoYfTUTGi&)t`md~8f1k5m+^njnwj1aSnFdwr%8<6zrc_pP%ec)3arHX8Wg@8CI`uU8#XwUv13mXo|TVm{r0V zMz%g@be}#x?SS)POuTPwp2_F2KcBXMuY+BokI&Z%++$V}&(6>uD$H61=UjG{g8KMm zKh%7q`>e$#vTyn}Yz{|lfQ|D!|6t$V8zv8I*f;ze?#aGc)l0f#eznu~RM#nO&Xb+} zp?A3VvnN#dd33Ll$j3$cZg@|{y5pRzXN|nUtWmg*`ln=Laupo#tbR#0DTzd2b?cp zYly59WQ@2)_RVV`86(Ro|0}+__>{gAXOF-0INl$p`=P(@*|(an`>2_lHLQo+`_Jju zO7r(4zu)DG!r2}==MjECd;G}0(H`rAYW|5j#a^@0e199yI<0fpK>O8q2K(5*Z}#%g z=Lh>d7q?rtuJR_>$2q3|3%U>X$B!>D?0+it>(wv0pX^t?wM5V3QqFDeUVRqBz4HO0 ze1@|R_UfK9uQsp8tIzFej1T_Fyjx)3^iy-Tg2}fq_A))!CKls+!}p5pn`=;~f#0va zn_mCp{Oc@9+!yAWz`phO$^M5p!{SskbGfHwYv0RN=X0k#h#2|r$r>NT?uL1%>(_Z* zk61UHllAOTH%j*CaNQ)iGiu4f!gSB@;X?<-t^K=a$pPrP``BG`$Ci@=nM;#CuiWQv zliVpa&EK&$hJQPYHpkf?ZwvktJ79dA$Pf6N2G(Mrb+>wc}lKxOvyRw`feRp&4DJoz5oyOp%V89C^!M?Zf& z&woaBzo@Xrbeua5pI?4b-TzGL*RLlv@2zBXAH4_UA9f0Jivs?wJt&oX`Ux@iX$y@F zpf6;WeXa2P=}S5O$v)1}Q@gADTlO9Qn9Z)td+zc6`PdCU-Kp4TyszA+^7#Yy``0af z#uoS9Zv6Hys`J?ss!8_vO5i^5>uvtsYrOU4y}l2>Rv9y#gY^W?bH>~xW+84KW7pW5 zC2!`FatQo8w!`a@!-phs9m?CRp9{Z_j}PW=mAt9<+uv>emih?p|Df$rI{;e{+5!IG z$Q@)3y~^hhjXw~?1VNo3dt7BHT+m1g=DZ?%hx{G-e}&9=>(u=}pVTgk`keFm!~A{_ z=Ue8@3{~W8@Sd7Q?t_KgzL~wwtJC^a+#CK~tRL&^wYu;4kK%sUV~%UcKlLo&-#m8w zM}7ZhZr^Pu8Shu(KE8_O(8vFk3>!KO=VWw~_K5fEfc+{};_RQ%T%WQ(T_#MJQ1a7H zKgnmGeI^a+*DtAguhD&;%M;BTq}`&XW1lkp7smHtystiuVcz)rcpT_`EU(Yk$GuLx z;`PH>JI42SK0mHFPs{GF!WA}vb$!)+@~<|))b_N-2Rm+ZxaNH}ali5VqS)VQzOw-d z+7Hd=Sy!oieD}GPo&T)dGe1@^`+3can;d=U*Bh<$ybrqyu{UaLsHbtpM)t_RTjmou z2je+oZ_$;DtFCdkO0He`Gi%A=qPk} z{++nyr)J-C&;CqsAF&=j4!Jk%M|w~0jg}bAH}{*_)5qMBi#bj1Dat>EF@SmOY(R4S zZ`e0lNQQ1l{U2;VPut`E=03h^(0%st55xSdo;|vkyxG2;)T#3-*gtzcy+xM&ahTa> z*zX|q8`Ky2{Es8g&waaQFONB!fM;qMpT+j`F$PHFAA0ZEciIou9s4{d(c4Dwu5rJ! zovQyX-Zy?f&RsG#z_D+0eab$1c$9l;zb?zY*Z+Wh)_9>2Ui;|-AXgNvYB(3G@+tHB z^FF%B`}RePUdMfZz0Z%U&c`&~`p;yZGj#@{H*b7($zJk_WRJMU@Mc+0#d+@d+k`96 zuiNqXb}5(@@qhHlVfjzjp@J=vKmC6Fefqn{;r9o2h5v)GJ8@g!?ZDJWC3o+7$zI+= zGN(MLy#iT7uQYi=n+_dW=KgqoV4QtZgNgio>{DB+J>~DeDpLap`IlH6t*I&zsVZ$*iALnGe*&aQ1)cq=Ft+$8l&zLb&CQh7K z(yw1X=za%j*sy`d`>wagovFtb$b=^85Z8@gMHj;cMdRd;0oV%~zXgV<~4_ z)%UmDtM9Mzzk7eI?pyXFJ8s_RNdFD{obzI|->@I?AF^Myq~}Xlm8$t;-#7=ky}zl> z7r_6{oA$7BA7kF->kv1)*gbPfEy-BcO)___)1DgE>2s#nPSW&j%;%tkt2hPVZK8M-@`UHpv@>hJRy#cxC3t*p7 z#@?NhF}InC3tWCM!3JcFzFmqIHox?fBmsEhM?)w3LMuQ~QL*G&Gwy2(37K0w4iKIiny>RH6U z_4%Roj(xJE=knnGuX62W8t-@h=1a`a8ZO`V>`~JGtvBVh*Xks(f2QO888c?k=f`~D zemMKPgEWBd*MQH@p5Dd@vj&qiUiqg@Gj@%&41Io1?|BV0-@hKpys7IuUrB3vsSp6;7zsYhJvK}&C4x9&T zQhCV_R^jX?V$>!>q^lg!+-9ido^C#+3&A7KcMs(K;2)w250xc?{_sk zjqwfl5%cWNz}X5`-}TBqE?rgw64=)>Sbcua+%x7LiZq4ynBzXueBO)krT3}RE4?D; z2fx+L`SUR?<6g%DePoJn04#cL7x9? z>ps}Gx=;3R*yyAro5i>u8SQqgx?sd(FIh|MLgBYGZ{j|p=o7_V$$vyk;igQt48+DD>VWa1c zbHjK6I5+DKDVUtN?!@Qrl)^dSzi4-<>>nxEEc?KH?B^%pcLg>iZV#L-u=dE>f?V_p zXiouq0?-$v{O{eMaf{|EU4Bq)fU6b4E}}+QfV|@V`7cQ^Vx+?PsQV#KVm)AKr_%R9 zk7#@z&N7Fu7Gpok>6_W<&cAoO^UC+$owbta1L7Xx*Av-CydUa*qR;R9N-XAG+TWbAuW*Y=AufUB0hRZ4_sAV&9?n`Dwp&fpf<@ud4g@x%xa` z7~iMhp1u<7rDs28U+HU^c+1%0h<&g5o`1ftcG-KtXn@mx+&j?ysQ<(D@>Ru5smdih zZzhp>_wmZkmn!!;<0{CZH6LlujK=WjtzCmOM3KqB3`eMX? zzT~YRfc${V4WO5Rb}zI6!>|ttxy{^>@EI02m*NHWqkHRH`>oF(=sw>=e{KRb-)nvNm^L6>&M%CvPBRSm^!+0nkfi;3Px3yDwBKn| zH`<@9`^G=U{&%v^Gwd+82YG(_{Fu?*rAucSF=8aymv?X`F8gc}`}xmwo`2@dSu$zT zq>}#q`%4F~-?&l3lKYi?yO)Qvy70ehp3gF`dhcUqFuEG#gu4_Q8K5`)03Rr2E{nqwM?l+};b;CsgiBVZSTp$~w*yuajG!Z{zyw zy6J>%mjH}CRvw@d!oUaFUld)C+sSAH%9;4IQ) z$2hN+@u|2@t>{-F9v4o%%dBa*+I1-X7qEXcwu#}$BU6QtVprr5KuDVb5ssGFa zur9jln@dZzx7_RZ=A(@J>Fc{?^L%_Cy$!(oY~SO^4j9chI?wyU`GpbtEvXp+?}?Ai z86M`obNXZAeREH`*fhp|aBsW&-u1K?zaN@u&Z_e>yEv$6s&^$N>=+y>Cs zPsr`T$MM`J>b>ROzn0YdaA_PC>OSo>-#^2@*L>Ol@E_d==H7_24?V&C#QTb~-+0bs zBJ=L!bv>@oTsHmu!)rf*=3gpl^SaxaxGQDr{4Vfgk<(}G4n1}`qpy$Rc;x8l&ljM_ zg*~*?P1lomFnf*Ujkzwa>6UZPc))kzv`SzdYkIVb@R;jx#xHXG*wNT3oc&<*z3ykj z-v=AwZ2|wTw+GG^7(0+R=0-Vupiuh?-2Z-{xIpqIRW>yPTPw&Jg&t%)f4&YGBX5x% zOZv#B4eMq7+BLFs2YQJ%jz+wM*I{u})JC7x+{s?>Kc!9Sul?80U2nACvu|^KmVM8E zg7zEDr|q{k!07_6s`t2OJo}6peg4R3zv15AYc}r}=K9@z>F-tCyC&9mx@LM-o%XwU zpWN_#TE@_?VR3fHT~}Wwl~CXB()An6(HNy?U?{5H-f`_}h&&r`3A?cGwFXxUGp_bzr)%@1^+H9o%9#t(Dv zN5Fj|`}Y0z>_ZbwydV1f5&Io#-%_gPPkR&lWl^_df9;VCUr539hh*=lJN+!|^=nt- z{$3|rHm#T43%`_1^zx|3gv+VcAj5XJn6{R8g#Sod@XnxT5n9CF|TB>DX0 zKhz<8>|%X;4K&~6`%u4j_rB9cu+JEpI?8js+uA+6s{6|RNa@w zo96NgW<{bw8y_yCa&u<@W{pZ37<&#SWU?x{#$oDFa~AMuZSH0Gz8-Za+vxIFWg zeV6and|4Ir$bzXx=$CDKcR8v2cb>~r9(#AYVusEbJtOCx_ufX2T|LzJs-Cs_esNJz zjajp1Q};0&e1LTN{B!EQvi}roeAIo|DcCAKcT{H&u`dZWfVDjHoUCteZJX2k)3NXU zCC`0=k8ka4EY7FjulCuzPa*Th&yRflM6Fk!UvvDHd+^^L@#IL%kaPZhc%9f1y=%x@ zvrd0#_4|lZ8%j2My-Vk2<)m+y+$A6D9y+p-JK_px zUaKVb5A2;I`zGFEblox@=e!!Y#hMkZ!b!JD&S31{MXyldf+liwe`bt%X9JEDptd*b z8Eb?7jM%@t`91u7fgOqLL1YUwu7FRFKlXaibV+e2>BaPMM$`uIlsjU5Pce919>Vt&uRW~bra`1+CN(+(To%-U$5 z!#RD7AItAk_Yv!V_3RC$`umGI{8_nYTzh=`50XE*n#tuMzD=L@oNW1Zl+MHVn!js@ zYFifiUReKTJ+Cl#w-hXW7jf{Pur86q`wP^6b}St|d{BMoh{cHU{j;izuGzTGz8m(T zqT~+0Oj*vyKAgijE9AuSW2aq*_s&30uDt$S-l)HU`^x%zy*(+-79ch#nEs&eA9DZm z!Q73Szb}~I7<&V@Y2Cur{c^IibjDEnp55?)jP~zXIb1TPJTCi}yeJ5(&u;V$8?`Q|2?enMY%rC6?J+3hB|Y|`u?i*umL{j4;x^gukm}5dv<*f4}B(A zJMlI(w6DhA#@>%W^O@s|=|1dw=*Rg^ z94ve-e++Wx@E>x}M{sc4h*Eezj?X79Ya5OomIE8Ulk8zvXq-?m?s{ui@cU_7U}utS z0sWAbpC+--y@AYAy1bvO`*9WsdzYN{r*E1i*|T1S-7&qx#S7}lfnQr_K8wYjPCpS&q?=Yzbwbnuz`E$c34?)jFq7bLQ};Px2gI+t(-Ex_6Z^W5((^89WmgeK!C5 zy5AVO5B8rzu8(tib!HdN6^{4xMRC4~_w5;)j0MQPK5v`nWBkL{!!51p*;qeh-{n*J z+Ctym^6c|{3E!_!^Xbne}_&vOHbsd zc@N)e^7ppSR(oQ!|K?7~S!News!pXPm-_pO$zaQ9veTXd% zWi8dd0cWS&|L&fPdu|8z7fF%p`Pscvau>Elp0m8^U9$Z_MZY{P2Y+o9@ z`mLJRxA(HYw{hP)y=Nc4o8v?F=^yL9edhbHFNWuHv<4H@{p!&D?qGl1xUrm-U-H3w z?@ObG4U^bEo4WsbV!Y3sBo@vW)p$SFyF<=x4bSl&U7g(vxYzt1>-m;@`#S3DY`HhF zyJ4%xTjV=0(&7han?O#dtRHUX9i}z4vje(=>af-pBd3b8NH@7S+d?LvwR_v40=)db(j|?l|f5 zeIGp&w-NmBv$>bY`TRcK2m6foA3(fct1@bQIGclKh_fcC{k*VQCdY4LeV60c{66(Q zR?jE*rjJkUqS{ErMvnb3)(>+j-VQ{}pPu`;zt8vG>pr-rCiweA*{@d8;}ku-8+%`^ zKK_w)AIo7Z!#!*DxR+JyP3_zF+aV`z`fN~dpHWSUR(F&G1v@<(sn`$u@C#CnPQ<pP~ zYhn&S^*@F7GafXtztR4v_Ge>9=)RfR#VZ!?!@$1}nKzGlFB^Z>+~*2QkJ9a*PcpcjmHLFqFXHyoM{{!+;jnsGb+-vWf)p|1T zxYs@#%&VA!`+W>%=A-^qu;fk5+t?e=?^*o}**~1S8vAPz`?4;GzPJNv1He3cb;4X; zocrHSz=zM8Do2*RAcq$|7_9|(jCEv1V>zC`9PFPsg$=;(KY9@CextQQ_xJa2>@CNR z9E`D_ivI)Yi_p`IS>pJ=S$Cihkq;kc-{kVzv!s23)(0q-)bdkOdQm@~M`bKgFEeq~?J!*1Ld>{pGme>U>` z?CBkVa{xd8{0r!Q@C_jXn9Sy^#Z~+;OlE%RiBWIqQ>MO?%7g@XGdW55Wf-Y8x`TfP&QnY!Hn-_Pp-psd8sYkM7;EpLRUvW&cp}!3Q5oFS0bw6ZZb9;t= zU(46Lp0T|?7o)bB{+adJl>0FhqoziI^U9oG6xy^s2D=JY%L zu-vQ07~kLNe~fw90p_io?@!;BI_Ldejeo&Bxd-o><0t=QpW08|N4?C&`{6l}AHb8A< zl;=z3@0)sl5a-kGy4-%~mpNa}X}Q_bbtJ@}uR(>uDMgB;u3S@Tvt zpQk>)>49axZT?v7Qy+hiWG($da`&vo%=^4p-@aqRv67nocprXBKOcVi@jZj(=(5^! zbP2e}Vr;(~bMV%7J;!tJ_~&(VpNpZjmHhV~rM+1GlEw*)7vlP#ntj>;_l%=1b+ z%=aOc=6mkr>__(i=W|5d^Kof=^*M)=_2~Rbcf#NQ5%=kvMzfH=VvnoO=dmXq_3z9z z{j`sbHSIi{b;BAr_v$$oQn7#RaG@N{oFzv#b&{hQlMz=R_CB`L-B9z7=ggI(E9=U! zrH|<%_gSbtQr|bHoqKy-$uUL0__6$JVw)+_3hv{2wbyL$32(IkW)#m{zxz zBfEy9&u^#J{6qE~|E|{0z9#lJWo6b_w<;@{->5_5fV-S_N!zu&SSp8W$kawL5+dW1ee9{w@p|1oXCx^CylUhFkIvhZQ^`}jLyOOB>>4)~9>|JZ)i z3pam>|MOwZ8y;TpfchDS=HD-ekWV^TkD@ApD)=rx=;2^k6-?RhTxvQ z66zMK+o$Bea4u$;(eDTUYY}seLVWL5n2Y)7$vc&Oo|72*{yN{&+xLk7Fz0V#L3h8H zzW>k`7~ene11$TR`&a*yvA^Zs`2o~0`m^-+aa9Ib+p_xSeB!VkM(yO;e9ZN?WxRhi zW_M8czwLo|eT4LC5j z2JGW==o#!R2Quc#!Tp6A^Dy>N-QT-e3TIT8ebcaCae8%S{}A}6_8(l;7V{9Wp!-Gh zo|7E(Ph^Att^Ka^+&lhxr49JvnOksvAJ6U$&g>5Te{bU>{>?pLe1FbsbNL`Xj>0 z4j21d{=vSR@8N3y)P5KLyEz`3w+8nv<~Ox{69>DTxcbas#mu?4d490Zc)#+smrB*j zcgVNj_0)YeJSXFmk3Nz&-grHU{j;I_@%nya?dPZNvya!!>1x1UUM$zg@3lV#|E{;e zu+Ou1tY5^}NLR!@wcqQ1$bO>stIr>?PyavJXES!dzrU~noXN-cU$6GwC~Yp^vahbt z`2NtZugmXXzi9RY#?Mc|z4pMN7cMt#JlN0D7`G^QiyYiB1ow7JQ)`D_Dl?(ZEAu91 zrw>m3J-n(_YW9D9Qcf&?Qa1JaV~k;Hd*0*AN11Z`nL7ELO;jPA4E=I zd;cr_*WCAz#pA!$l4C1g(cE7Y`y1^)y!3gKCvdq!Zv#yIkhz9~^X`{}ztmK_#F(OZ z4%WO!r5O93_H7$4xtTj8cf&BSUlp}|vR@5*qTa%5(;nPo!S6o+_7A}KFP#4}xG#&n zQnzCs%FQyWF?63R(0@Me^1}6}W}opt-eY6u@xCX-|Iw_*$OeSk@AZWD7JN)U+f(CD zGauIVpJ@(&8V2pxds_2brpC`%)SBlb@4BFwxHjTkdob_o`(T0W-&3_hNiVQJapEM* z&HSn4Z4&Eb#}*n67%%C zjX!^QRqF)yj|+AG#B#%S$bLFzg_7IfRzB?)^ZJf!vLAkpkJ)du@w zVfSI4@S|Y9Ds;aJu6Kj?x3IwdiZ{VL*7CNpe>rr2!E2uV>@l~=NN_&V@gLX#p4-`8 z&+JXqeb)VL?$6qHZv%Yp&-nt$^IFv=FmGgQ0eaR;EY7^k_LWAu@8W)UR-eylIiDZ* zI$59%piXM8kNhA{=JxWMeSFx%3*GPa-M8FRr?c`u#(CJynkM`FXIl4XVh?Yk?z69t z{rv1Z=8SH&Q?OTNFQ0iXs{7zQ=J(@yI`(-DeSQ=FJN>u1?|pxp^YgjCAnp%y{WkCC zbAF7;H1?1C{Z9AI)$aG!d!QQp#nNm0>%P5KK{;wuScx2I|8V8X7L$GHDk^eh5 z|3S}w@thjq{ywaG!98r^O!WD|b{0VI^QVFT*^kJ6aKC>A*PCFzofN@t7A-@r5A#nm z$CX14vn+g=+hugqbCrGa?`;6=LC=@3QTC1BZ+(AX_hSwqp3^1&W;yQTSG_-=51~Kc zwBPjlLTBi2!q?{+9_sVcABBHv*f;UN?%&0Ea@2n_tA{#h^Zn#LSkzAC2|c}St?pN^ zOx^!hCQY7#IU4;+KEZj|Z@ke=s#QCS^?mH$pNW}WiMn4C>_5S?Iq-jKJ%WCU`uwn4 z_IdD1KgO{iowa57kGK!=efL1~Q)++c_b2Y-q0Kd#Z|Z%vzEAFTxn50kbumBRSDnet z^R>af>FeeB8+Vne`$J4%+-*$ZG_ti&wPv*JT#&KUmducTOWj`%rV#M{1 zdsBm_e{Xzyr}K{aeY6J??hTHS+?AU+2fW z2eTe%dH@QsZw`ra0vE{>>rr-AT<90 ztox;SZcT7sL-x(O7kT@8C4a`<=vAyPxl^lQ!SBc3h@$1~;U~Q*`+_R)!@iIGZQSq9^-({-vriik z&12_dmk03N<9_j)LH+l-Z+v|h>$_ebr~8`ow>iJ2I8&PUz2l#3G=eXzd2&2fpV|4* zsPSoEANKE8hwfuepG=uDMQ7!I_Sq-Wy!jhozuH-y-I0oY>i&~ppT0>0Fy62#=X1k; zacQ11@cXTObL`XC*X81$n7?m(prQBdjd07w{NDG6ZH?{Yi?I(o;JLT_yE?zS+V_#{ zyIy{Geedx*OJ#pczkh0cPwr1_{YL9}N!(+<%|X@sWUY_#_mS4KwpJSRE?z&fwrxuG z9m65}$A7IY|62P}uox?s^IS8&_g`Q0qWnwO3$_=)uwOK@y7~skSJemmCjy_}uzzgD zOKOvjBi}$j_$ZyxqF=Phb2*>fAp?os7s&**ZP?^#yH zwY*SALrlde=G)Yb>2At-X5q===7g4BYS@sTbkwco_T&h!&`k+ zb8e)o{l|Lz81s{N`1qRJx9rmnXdKOce$DmitWM1AAp295{ZBvr4D2^Q%j_4b?#F$8 z?B%h0c$Iydo6tUFW#9NPrf$hxKbHFX)ca8LozHL1+B7}ThJEumU|-{Yqy5ef#Msxo zU!eV9KgK_pkM;J3Hk`R#ulrST#%}37eLDtX?;h%CzwPKHC$@YY#P?S3Pr<#@diK(3 zAB|%kezWH5;oFlX6T_Q0-uU#-NNMcapDXnJmH(Lk zZ)`w34sd#JuFAgp{QQ`@&)CuA`yKagU%xpI()jw$=jUD@r~mH$Ho9*(pxin*^-`4p&`w{QP=P#Z6B>wR_I__2ft@iu8UkdFf|7rv9erZ33*L`EV zoe#&eTpa)J*D7DC?r#VC%*R6j&uF`lpKZaIs)xKjQ-$*iyoH)3y{;F_XxOuSn@Fw zI1gt5(G|k7+%aUtx3eE>~yc_G9bXr_A${ zS#lmSUJRYx)-Snkx31f{v0T2h0ULT=D7llXAlDb@KKc^=weB@JvF`N*_D!Du#OgX4 z6P#G_4D|nL<^LFbmZQs_l*3DE!RN;et_6>wF8>J5*nSx2gJU1=4D>oot0{XY*N~l~ zD@a=ZYi0Am>tyQ~>^B(qfb5*xT6WBCCEI7UkZm(t$krLnWy`cTbfryrK{gC3FB=DA z9^#O)GO)q9GO%8mB>sE7@>lKYPt<$Iyty);8)x6d{+!1S?jNy!Kkf$;_nR|Xo#wmR zo{#r!O+SqDo8ycQ*XL_`{9Mm3*|#x2bNtTV2P-Du$9y??;;inn=;<{xyENCQ>`#+{ z0|u1vT+9|NS|qW5CUxJO#Yy%js=ZP6{md@tKKlCjf13Qh(R`P)4D__~&y?ylkRr@Xb%=>BX4|dt>KI4Do-{t!Z`))t4p5bP-zx|`9$o2hj zgZlZuZR;Yx@9eF!bTqe@D!#Wly?x{Uq5JkYGq+&$-(>&vJLK5nhc#Em+PtgNIsaaB z@T-xd2lvjWKeq1el`)ws=mmnv2ocyCMaAXmVf(K**F6A#W7Dv+VtkKXClT z?T9C3WxsN=raxA{+obQSWu)J0Wn@6zh=0caJzl)Z?By#(@5y{3_wB%XJLLAl6~*~B z#&=p_{e9)%#ruwZJqJ4Q`R%=Ia((RYHT`{teWQh*eKJJ;m3vd)=Uj{yoX>xi?%$U_ zy?Y7R*1hx{Kl@BtwoGRKOxE}u``p9pW^`lUu$k4Vy*=pZ_3=J)6y`Z-jvtTB-o&zz z=KH#yv3;S|o7c#&ALpOGfvx!k{DK#cu>|3Le-=Lhd6&u27eHB$G@YWwgh zYJ9z}1N+Eb=(`ve7@H1gIs?0tXCv^-4Mya?7nQCL#2Co&yoC* zm%|Q}g&lav`1pa=GuAfwIQZl6>5r{{H-UZh_M*o3?@e!DHIq$!F7f_)$nn;n{w9YO zzaamW)+V-ogPv!MxdVND=cfF*VleyfjnMoJ=L#d_0=x@zWRC82%l5_ zk1c;1et&H_yp-(MlA`&KNe<>2?HqC~dXLaU+@lPbKVMc3s4gofejv*iOqN9xzLMoX zm6g?_o|DxRo64&3ugi+DO=S6)# z{kQC!`Yhf*&pjVU>~n7y=fH%0;_mV49yn_gy*nq;I?BKI4lpsk*6#!EITyqB>l~U} zT{2hWTsoY!$)4Uq^s*N1nx!*4az@|m_wwfr|Fi6$daE2=1YcY8cQ1o^#PaLws!xAx z!~0-AKC467-`rCEoz@C_^8OrSc;k0})N?rhYioNk>n&W}vY*@1UXHD5C_4w=5c^rx z{drHwzc)7r`)!ig=YAsQJ6YfRea%bI{}<#0auUbk{~w0#7jh31&L7*}_k2m~RYo@U zx==O_e@HgY{z^8iUL>nmt(2up7R!S9^JLD6EoUtTXgUn~>j|7Y;e+~3#F{rzMcTf;ZJ8|GE- zQ^fenJvCpyW_kDg8}8fUesFm{_VmYkd%gC%d_R0n%fDW!RfucN{f&H85aViJ4`Y7j z`*c5_UjH7i{=QWq&Os+eP?oXety5FHgN9cabB%lAx>;81^At>P)+#Nf1M7)pl z_)z1kUFFu2COks`|D);UwLZVbFs5$db>GMPQLZnF_v2dc>;Sc%kG*#7bNsLcW*<+yz8Bg+$GPF& zymp3h%RgRA^R<9|wXZ>)KhS-*x6kagFuDE~fzKcL`jO^`?DwymdXM<*_b<^H|Hz6) z@?T*8$kG>sem(Z>n7ueIpI?NYR6TD7Gx<56ntOP8?jE_1?c>84Jcst}km3!!(C>m7 znK-}K#Rj|$=DH?QZz?52&j>3eG>2|K9PjUq@Fp zk?jNj5w{nJ^S2NDyBt|wAGy1i5R?2>axo(>75khWRJ{6g$r^IGWcJ7TdR&7plib;_ zO8&;7QjlxTAjnAHi?jB&OWNj5vUcqn`SsUjLhfgP`$^b~J{o6Bjvw-sO#SIKnbP-F znehF~GQRiAGOpK)GUmG%Wpwu^WaJkWWMrpXW$YKX%7m|Pm7m-FO}=`%jPn02`2YSD z6Z=#9Kd5yp*ax##yS)!U##8wEF4j+q?;o<9gLl<=$36D*Fka;6*w-81%OCaiF|W^D zpQ-PeSfBa7DBmBkZ*-qpY5B4FGy423tCu@j3A$gEx)1iJ<8|YnI_BM4wQ6-a zS4qzE`yM}=>+}7+%D&0^1m{N$+6W?X<;=+BgGdH=9*X?z8b1#k_%##CKhoYDD4LOvtz;aLa}5=of^3!Y0HF#q*I{M10S4eP~ni zQHMK{v)r;DX+CX_`9F@z(F2HK)^w5mJ0|IQoCjgkXxnJxxPNI6&fwU-ZL4bjs+B8b z;erJ+%W^+z)Cd_m;5!-B?;{!0>tz|)^FG(2p}O?{@D>^H(JeCY zqnl;Or#H)pj<-m!rk6{{C(9`R-JUNayAj<2S6cm)C2)jr*O>EAKJg;(gA&YjO5X&W|xO<9^xz z*7$ELX>RlUjQ4w6_Nn{yzf-Y))^)#81Jw5`XLi1W3#kM(_11bG*KLv&D^|&Z1&d|+wAnIo^Z*&(zrBp<@wkla ze2)z8@uCdw^1KZA`dR7s#nbY`rw>Z+cgo6l?Qh1qMf!YDMf$vbll=JJO)~Jqo8;@) zE|HHOFC!hFDkGhrMQ;BE`2NuTzID!(7MQu+Qgb(^N89LmoO^!Guy1nvUh{F@a=d@n z@~=H1fuHZ$=RFqo^O}3oe!F!ePO81&`~x-iCi~T^pS}7%^ZcwUU``lx|0iLb(YQea)%{wPZYgPibAs7}pfSJNE91Mk zJU^e0JHoed>Su$U8N!|L@(s<@ar0X^(ys?CIbBHc;l`KC4aZgrD%ZgYopdG`V7^48tb zwe>%xXS;t&@3;ObA3lANy!%KQ`S=O!*RO4S|L>svJzu;?nqkgf3(etLJ8oomqcvFQW(uZ#f+F@DgSkG>tP-=ppw z*6vvoJN)ZQ*pvREWX!B9dlz<=tX&)7Bk$AYSjr_=;mRpe*2tS-t{BWY2F+uBoSC** zwvBi|HX+x)W7u7iv*<0^H1uIv(CJSyzvCa}*Pb^@I{IjG7POPC18_*Q`Ce^P%y1i0jFG7MM?mkH1S+uUIb& zhP0BIoy*JgE)`_zcaO-JE)UA!PBo?fr`2U($9v?bub!1&9iEb|@7*U~wYp6@HNQzZ zym6~^XjM%*w7p+Cw83gtUOK#fy?oK^dg9BKDJ8F}x~GV)n1 zlW*|-r;Vo%2Yxj_&-XO20Z!**+(YwAWgj-c)Q0Hu$C;;Z8F3%<_4)fXtd9F4h?T*owOH-`OMN z81iD;qmMnfjPbdzjr(rh9z4^lXZO^iU*`n+?e~nnOV)pTnQZ8NCHmIhM=pFP_{oK4 z<|#+yiHm%hYo27JEs?BM-%G~k`TDs%yZN-Tg1JWz>_h zbM`y3aaE_401r zf5=A-{~>R`_*ZFscNuA31F`*sW#q%h%19^p{>=No_t@1ZU$1djNi%9Q{W z&Dlq~?{fRj4zvyZeg4d8bl=yGasRo!yYYL~=@hlh#jd8_N3C%L_l^Fe=<&(KfQpkY1LeXZ{!&yRD$q5G!3r@6|Y z#>bD9fBODp-_GuEF~6zv**sq?-cR)J-D_$2x6B)xo6J3HdYa?2F+Ov%%0F$m-WT)< z-7>o1^FuZ-)VI!MrTYDOQ!rZ&`_%tCb1>>?Z^riKnEkh5zn3^Eb$> znX6>-q@^;Ve}Ba54@>vPSIHOkZ;(%$RF$3|JS3glm6eXoZjldPFDLC9RFU?L?~%3* zs!OZ7Ri))?RiwqM6{Y#}*Gj7wu90@HTq_M9_@lg5rHu05vSt~1`{6S3sn!1G_upL7 z_`ZrIZ`7<*(wy%%`L%VrWZj3(!@iSww|uN0%kd}p{J5V?o{zo!M)S3oUvtjx9*y(v z*f;*I^K+T^igMtZ>w|Bs+DQ$y?6<@|zDif4zF*}|`QiIM!o4+M|9?mK3kz!`v0twq zYJ3%at`G74$#_4Xt?}Wx#P;u7?nA#n#=hD|)80sT%>%4igeA#yJvJ2eo(Y1EXUVr7|b!*dQ?HcGP9;eOiB58BJ!ulGI zzmc?Gx?**gjf+Ohx>Z~7eVMw}tj@qST5Irl4ZgN|$tqdgzrM`<{O_`4=-aY-`4;@` zjM!SWG97wt*2)#QE?p~Y=M0ebGro}xGrp2_)4ss^T-HtPAnT@lDr+ZwEGy>CmF2(g zk!8zvp>DrJ7A@L_o}Df7%iK-iel7N#E|;-m7RivoGjZ>ZlP(=TmrokrD{Y>-Mm~Jy z3i$Fj$j8mA$=k2rC(Y|r(e?UEm88)N6{X>G6{TM7o2C8}S4pF%u9DZEzFMBCaIQRG zv5fNn`aNZ&EqwnEp#2@5JXh*fzoVqly%kHEf=R~xE$@f+BloBKwdnH)cEH#I!+pfO zi4oc)zB(|&M5eboBC_R5fb;AU|FLgh;od>S`z7~R2m6(8My}7C$LH!2X7)fB z`zPf3Q}M5Uf2jSipEj?b=<7$ZRiO2>zsfwXR_}Q|75j;r&-+4kz}ACM8~UKu9i{H) zoAbe?+PimR?Hls{WTV!%)XcE(zCPyUF~&bU?{3K(eyP^XGAGoK^o>)%^fqYXCag4B zv~Zg;LvC~}-6>14mMz_7*0SBQY~DgyJMAm1&RAV!?euQ4c191Zo><>u^^ukHX5jnb zXD^e(*et)!8Ye3z_rU5d%O`b}o&PB`unEF7v=fMzMjRYdwBmM_g1S=;&gxT;K9iCeV&s2GwSm@_Q#IZx!`2Ke*L;~ zzterN-=GrC$kFOQZM;+avxbX`FmM5lwPCu2taD#M2@kpcbZV%FSb>HPIb z`Q(%S(*Dh!@_G}T?bi4cY5PW9Y4+lsQm@tx^3tO>$}>^L za1S`nnbS*(?~|Cf?9;~&7w$I~>+99ukGwzQKEKy|^=G3zUyOh2_p9!+w@>qBCU4e& zXK-T=FVEz{8Qfm?hrs7Ajr}v4>nq#`-JdLD#*8WHYjwYVJ?K8z=e$1F_qpH5>_2cb zda3*7dH8tWbI%xuu?}rsP~*2YAYwm}f1A^%4RF4G?0pEhx0S~;&yh0|9XDqx{rcPQVv&RmTnSC0`^a%?MM__4&UB8U}UgnMJiq&1_ zkM1e+Mt_IZOXiKi=g0nlYhPS{l=!$rme^{ePKz@9?V9``&jPduHfO1@+zwLI}}&Q$qqI zsz4G=AV30C5JG_Hq9b}|2ACO`K4)yl9y^X5d+fw<5}({8PHZ11<8o7;dy|~_aeSU9 z_nx(X_w#$-wRRC=;>37z|M)(?wbtHy?X~w>-(P><*I9wzU+da_r{s-Cpjlp)`*#3UKJwbL~{br5%$?-d@$)#<rxH!8N}A>v7mTzn9|+=Dp><)q&Rb2lL+8 ze68=fH9k8wI>387KVp!rSO4Dc=j(k7wfC0yo}CX!`y6<&e!%bd`o6kK)1Mmif3YhJ z?rUDZ1i$~b{LgPO=9PJD{^85zR-o4%>?_KYZSC6hS{CV`6<&kpf^;f?v@7+Ew@7?JIr{%r7XTVu` z@7{TN_ii8ZlDzlQWpG8_ed#K=2Cf^t_23PoUmidDHs}4e=y`+j+NC71ydVp5QhbZYW%#PG{j0J4byKY0zft3UVty~bWApccxZdm0H+}kkKVSK8$Lu`S z=3{?6yWgMthW|m_5Ape3?%T0!w&vxJ^@Hps^K|>H-OrZ7=n*n;0yREzeYz$#+?NAA z`20=3*?9k_*!?#cZ}G~52TosKpX}KK_gAiRrcKO~g~a={ZoIE`KGjvm_Yd~@J$tVb z{buaFYxn)UXMRpU?~RUBn{Rue2jafr{XjO~#P`8In&;>1y$sy{fE}`FGpp7k_@(%wzRGzHyBF+&BFA@ax}@-}~x^^3892 zi}?OSxpD0a*uy*WT3?qu?rQ@bV2|8Bwntum`5WLvgZs!=ZoMXtufjKY_xd&FX}x|{ z9$&v8uixkc7r|wDeB+8dzIhc~m&doj%^TpBi@Wmh?tAj`z2AeI%Fl1Y&kqeA+d~e@8A~ct%zkW;xlqUJmToDlJvx)uH_AkmF<(r$80*vyd_kT*fuiVGy7mxcZ@zJI-XP4Ia)++Z4(pZ;E#~#}? zIfL_kUc7JOe2@Q{>u`H~yt;?Yg;>t39Tjl7^O|pM$y|gy0kH%1kN9pCGvz@sgc7Rx%TZNow2>NsbvT$(jVh{oY(l?MZo5}KED4yQ(YPaSI-9g{eaIOs;8~LABgX{pUQPt z|J$06=l6LzU(06J2t-qgMLPe?czxePH-=`4YDC z;s@~S6g&fG&VX}r>+A(^5nPg6=PrXQ;F{bze;wSEn+CU#iaQ3^PhXLXz4z$P_#Mt2 zz}c1+a{csGxpDTUi|g!PGsmu-zAV>HU6N}j`{Y{h1#nKToH!#_j-Qe%$9lmDxqS4P zTt0FH9Fhws?vT&>0`o}2`IDa`zJFg1?dp*9$=DIk8UCk+ zKPNf({%ZTDrMw_Ti7~zz>G8gWImy1o1s?Zv$@eqH)71K`|EJG`Kh{@{>%J@Pn0)2E z9uKx9?lwBaTaUvV$D?-N*nZd62W&piv9b472W;^Bwcayt<6Y&1_Pm(dp4xqEex2HV zYUa8&&zkWWvK5_S*5#Qv&hXE(`%mNkv$gxm{l{?s0r7_A{>l|Au={z`_^|urBm84| zxL%!qMDu&W+z-j^yWCg3XSlCEkb(94gYEr5{=Vv2kNbKLbdBUtyKnDR2=CGLo}KsR zD8Ryho=%voc}++StI}JM>pX(oIk9t_;fwO-^y$ybnbTj8 zb0=PbV<+L8a_%hLgMaYwO7BIv+o8l2|bilbX<<=Ey*={tsQIB^r)0N17O_*ITw2AAZ*(Tj57$OXA@_&hi( z=MSBcb3G^J+`$vzxSTt1RL<@{ET<2imE*@gCr6LGFNY7kM_%u3>E3fwdbX^Sp5|tH zbDN}n<7R1I+aMcjYGrl#3aMJSPG%G@l_?WvlgBQW{H$b2O^lKFu_F!dqr+d6$k8vz zsKL+4=poNZ_|WGh3jQaIw!VL1+;cK6j+{V3ly6#UoNr!svadWpotQt{SqsG|IS)c@h&z7AJZIk6J?xGD8Fcec%6*QhowCob7q5CY-}?H-w>9?8 z`n`tx*hRw^IHS2T?T0lsb3%ro3uJq7t`w2yFUIa)_%E>gI#=KQ`wtw=HFU5BAh|wg z8r=8t{PZB;@7s7k_;-Z#@{_OBJ|@rC59WTr?uYvN%6+R#?f+{2bB(!(I`evSM8mig_pp8v1kJI*{h zO=j+$|C`$X-+pzi{Px|Q)Wdem=kB&jUw50F-PchtA5`L+8N-IeYk`oI898c}310xdyJwxuZAa>`~r- z^cJ`+XOG>M(><5vV10%3G;WaNN8guYa5ET355Ft>H`L0(hNW`q;1#~_20G$8xN7$g zUY1h_F3QOReR6XDdFkywE4};9fK$@j)hj3Vo&d+>MCTDXvFETH=zg8?WpB&At~coe zc|-PeJd!>2>!f>Ii*#(>F1s4GNYm<#vc9@rR+g=i%7yD?=HwMpls`u%kITm2PsZLy zNp$#ViHR62W5>Yzp}!@=2R$bvfbu^A`yY$%Z*BjlC4KA|-?+H3zRAh4zB!qRzS6uj z-%?`!Rn*0m`wi6kJ?@*i*#_di%X#bTyZkqHKGfES`22?dF82-Zy=PUW$9=W?IYuAo zGw#_s&)@g^#p*Mwz1KRq#?IJJjiKR{=p5aJZoGe?kG?)P-v6ZR{^Q4w;QoE)4uJdZ z9kO!ya+y|4u21La=K9p`>-s#(f91Z$04j~Iul|0p&u{E~sLeOrCq6RyJ>%~O{zvWU zQ+?|BSAPEc^DYC}eZL=P{W{ObABgvA_qESM`EQ`}Ho88)pa1Uu&DDbk?C)3G|GP(G z4EKNjEo}b}`^@~-I?vwsKDS=pxY8y{{YIbnkmh_QRp$U1#M)*J*G@PV74e&dZ7JJ~^@f61XfU4qO3O!F6y0+>{ds zZ;?~KMgJWA*R_?>wQ&ZS?9kO5M^8^zYPB*K3q{(;Fl|yHtt`awI1`QIet~B`PdTBF7Ao z@R85Uuos_`p)WjVr1C$^wf#xt{gT24OKQYuUtUavuQ(}&m_Na{$c_0|U~4qy_xk&T zV}5-eLi+Xfd2#Ljld(Sh53>7)|7v?&?t9Yn_dV&i|6cA|<9$=d_Imm4x*W<8JNCu1 z|8R&gJZp*d;gy)RIp99?^Zysw{YT`T?=zO*ytFI#SFUiT6w}wI>+!*T%X?3ExxD`m zai9Oi&waK18ZRldcVG2@r(XxM`5fz)n+fsdv}eP$^TE>Q_=56#F87TdaJlZ)`E<@l zwf#L6PaoI&u>Mo5Gc|*`>nhCrc>nrm-Da-6Z$4_0duKZ2{`oy}^=PLY+1VyNJNFO^ zcba(k(5`OTzw3nT-u=+Rx+R-sdD%v|-z4*9Y?N_1RWc!OyyT?BN@Da_ z85H`GvUwzI-Z@vzr1M<)X0efZa zzSgN+_-&gP-@3VO%X@nH;J?E7%o8$wM&i3@jjsuPp*6nA#QUDluX+AY#P0v(CsQ9i zdJXQsWabQNZ*QkQQzO%ga;2moMe5+bsqec!i@9#Y`%t^@ukH1-`@#AB;8@?&pI)xd z)2~n3eeOdr_f1{av-g_YvH6`Rc<=iBwzo47>nq>=$JqAxZ+rprez(`W_*C2f#qJ1q zUhO6F%fC8l=FffW%1&}(oy6^3a+>uN_HF9`ozk^!uXJtSCtW-CBYUKSUbo%buSm;| zd(zVUK-ycb!mnPJXJ^6Phfy#}t!zP1~(cW0lpaDQ5A zx1me0zpanaEB&zRk?an_uAPr$C!F2Ba+B<+Stac|E=WhqW!ckm5%j@n{JkCL47c02 zpO&_5r=+dvBsd|hTaQWWmLuS>v^E~5Z|5c1(s)anHl3Fp8;(eGL#J%7YnQFHyJgeL z7OAh^CTl9UNOjp(a(&z3expnnw?gtVCQ{Rj!|p5hBW29+k@)$aGQ1xG{}t*3jD-6d z_eTzYp4fk=B!-RjWk!Yh3KPbfn16nD5_SGGVt#65_{(+p{W`8sd%ZpG>$6~VzvhAZ z`-lVC|9;#zdZ3@(*XJ_u%({NRpZ_+$Z|i&5ePUnrg$?&jZO@L~vuke?KNqI?RxvMz zqLG+?yx;CypZ^of^TYkuUVBwudifq}0-cq%wl-P5qQ;pD_ZJn?&rhyzHNO68jZc8> z?N!@ve_M#ZuX#S8wN1_MS>E@v`NrORI@GiGp3mRk?pysFV)ui&Z+LIHZ|=3;b9{V1 z*f(RiT-o0j@O*$^{`XWQKQ-=G-~UIfJ7MP5W^Vgme*d&w=)u2d9fgzK`{cmRPHElL zA#I!YN_%6Mv^DMn`=x!$0cqdbBW>`fZR=6lz4er|HYvY)0dkx2?ToZ;J14E%&x1Z` z+kO#w30#)e9aq3r+1+$bwk}yNTUTz!?mm$1+u^ex57`dFHnxMXZQBFc*7UM8)-+1v z(lyf3cvg09y#UTj%a(J}%zks@8EM{pN}4yF1Si08a8#N%9)ahFWyks+*|z?OY;V{v z+v@j8Q(c#AUE3**YdU1(%2sJuzDw3FX_l20+hl3!PAQw;BJ*Z8$>a%jl9@aeyB{w} zG12(^V`cc@(Qx0|edYb&=dJx$zkke-PsykugW&%Vi61kF2!0vGzIlYS}i{ z_jqr8WVM%O{GLi(*HXDp4s8Y8--M1Zb9b;N*G1xe?d|y_?Y`muOZQk4=qz@mO=_yE ziTCO0rLS)tF$s2`I-fTV0pEq*DnIvC$GM!hc|Nbs;c?%_`8L)M`1@9e+F0LTL)9@m z9`L(1(X;(j-Us=2e%|}J@AdCt@72zGF+O(P#P~rzzvlbY-}htQMCaw@9rGV zT-D62&)nMo_=oNI>4&7Jz1yI9{a)=v8;~Ckoc(rV(ZkElPUSj^{fw8Io zYq}qVO&jk>!;-DCe(^fly8g6m-EbbDQ`Vm``&$}L%9i?GZ~`2Y#&wD#;IM37dq_6d z9s~zKw`^R!Pd2RDE9+P6k^1HBvUcfiSyj1HYRa2sNohOW-wpS7;6rYpwzmlGCy?ul zm55Oh*!a;h{6!n@d))VI|L{Sd!T!G}5pX|t^l)ElBr$(%gl|%EjBgGxe_3v-Z|V39 z`g>X5R_pvcGaGfDEv?-d?z?thp9clUJXk*qVScyjy|Q*$r>t4p4)1w(Dt5`TvR0`q>5x+8{`9Rfy?BFUr!S$0FGCW?#*oh+ z1NRj}$njghU+unff5;1;0?*3`xF0rbu!;FoB1ZXgV#0kziP659)cF_Xx-maC)5iSd zj<6M*)hE>ak8<6O1&wsMKM?QDT)aWCzQ*|U~$46h^d!L-$|H)5&>~WvI4a@zS>SZ#Ox}(~C zGe5uD{Rv#RJI|Px=MT31Uc7JoeSc4n{x4el4CF<;JfEja19`rH|8M;O?7rU5;8endFNPR8iU~A98J9^`(ldr1S&DiQ|2DNLhGq=)pwk_7yUX?W~&M^M+S_syzJ}+xl zUy;?TI1W~=yz0lwl~<&uq*<0P*dVpbk4x=}ld@*{38ZcxA z&v;_^aD4hOY@&lmLT0{?RpYV(8pd92;{;!l;qIX-N?vHRY$thK!W?>E4E zwfDh3zpd-p9J#5H!+RaKtMRk)Uvqt1joqi8pK*M_{rpeM^*zhJzMo+CbsW#VyLaLK zY4S$9rFt3MpGdr4fX`o$!8PKaaLslspZzWB&-m;6L3MqP`~Fxzg!k6x_jn)3^=rOA z6rS&I?v2ZT5ItJ&CyS(eQ99(eO+>hl; zj>_^SM`U@`VX3K990EPypj0p354tTX_Q|sHE?HW(7axC*RAK8EFY1K%U9xCyo6Mil zEVHNXU_AIXdRMm4(=$n;M}$$w3zLz9;6Ap0zs>yy?1X3YH7*E=^VQ#XeSY=z zO@7~><9E4la{S7D3)|DzkNcYAa=EX$zK|ThiI)Suzp0yR{S0`yzKL4n3mVJw$#DP2 zhWmH#+;PsFhWopAYrO9$_e*r_4!qZX1f63fSdSU*yFE(Y7#_=e{SQ2SXzjk|BN^%D z`aX{LMh|FS6~8}(`-b<{_WOM~*SE7dz40Nry=`*}sp%^wINKG*@1J1ozUTX^9#HOw z*nije?=H*wSl@qlO{whO+$NpP`|!*6$%?AIvO;ZOrOGZ@UfB)yg9GsBpy5tURS(;T zEU&7LNKMsIa7>oNy_zM86H>FZ7r^Bur=+Uvpj0kCFO`+&W%1&3fNghw>5}v4X~hMp zEI(n7yRYl}mR6pUWlPS1vr<)gRu)(Ac~Ak$%g?$vBa2H8NL9r#i}IsVRel5_FZ%P!(RN9;l1Vl^TzHQ?z{Ou<^H%h@_oeon(r%v z`^$*=HP^q+%lEl{;%4>x-B{n)ecgBMzRd~P9I}lk?K8I7AM;!O2Wou5wqIjam;c7^ z59R-Q=HxZJ_qgxo_)M;kaeLY)qtNwt@%PObnN2!|m$f-2717fR_l?hgiyB|g!2SHs zvZq&l{#O{sbNB8Y`an;~F1T;(zU%Y*bA86|w{r}7I>75s)Lg$mzi;$kDEC8Z`(96! zUk8NR`(XPY;J)4;<-7+ko^x%!iSONy;__Z8EjcA6ptR()l$HiiQGN!l!)XP)E?aa|%1Y0KptAfV@6q?2 zHYhI-e7=g#K)Ka3op#{25? z2ibl4do|Y&_p$q>`6<4o#L+9U`)gglU+erDBbvD1^YKG?Z{q>Od7dSeHm20r5~%Jl zaP7Z8*Z(B{J$vT)x1QZo9;hwUcv$n}I@g^aUXL91-t^7T-_uY?jn9nX&2#7Ouw!^X zDZBsh;RCsI=eA?Hzf-x7-OrO!>Je_dPo5%Ebr!vS>hrtxO7;8Uz2$x||NC)YbD`)- zf3Dx_0#wM0v7mbbFZ+U~=T&(sJ?pKy! zR~5?pGUY#hFg894}u$jt}lH zn%in@|IEqTr8s{h<90VnUgkQ956?EXKXQ1OiTg(l9!Wj#1^Dj4+Wb*&u218Ae15TZ zKLWcSO>b`ky}fXsI+=36R=E#PH>j@;pLLBEuh#F`dE@7!53H>Z*nR(;5PsfU{s-)S z|G3}Ue#`y9bMEE&)b`u4dv2}|d+*tO(gZS^-es3)fZ{BXdL?>*ZXG872>9H~~nT^w|?T7c=$KZJ1o2SXf{MP1cyzkk3 zo99=5pM1ZU>vQdWu)lBO|Dc?oa=&fild=E#)iJWBtX^tC^`b2@f9f{uUuS^(A-sn# z9`6m8l>3(dmTSShce!6-xnEh)3pWGYFCT#SRh8$YbRpa~{(<@k7L^qz@e2ZWU%6ko z_@v>#r%M)VtYCQmD{>znW+3jX51>AO*?i0Wk~yt1cUrSdF4$zaUzE2=3bHpaUUxEF z4r9zNeZBbpBL;=z-)p}A1wTd%et}xRAjbC5^H01VKV~?6{i7v6HbN#PM~mO?o4$VA z-&f~y->l7~Hod=(A7bZS|3Li&6DN4~K3E2F&!IWLK%PI4>(knn8}DQD>xNU;x*?7M{_xUf}+NUQ?AB5U}xNkt5=I49= zZRNk|_2qsT?ti@BKM?ngy@%_8IA3#pMPMR%z9Jty*KHH;E9W)G7o6)?-djv^x=Qn$ zm(~U5^FLIRCu^vYtp-aMG|KD=8<~%4tCY>_!1pBvHozaoH@3FYwf*Wl!~ezj(iVqh zF}8LwzP80Nh z`*X?hO@;T9$8D5}c^jn&6y|J}w8V18>4Zxn{0|=%L5v^e8%(}`7~EH1UvMabH!R0hR-J7uQuL5^?Hxow>gD;>kF|E+v-w`F%jWs;kKw32W}1o-dz{>pzh4zT>!eboh?^x^=ki`DlJ#QOz7 zHed65ZjR55`%R8dV}94y*SwyW)AMrs%5%eOSMHiW$sK^D*6EHeu?%B%^SWcI|(@V_0dsJ|cN^Q*lyxiZa};YS<0A7uOe z{=R4TvB&uQYWLMvTbpg;cD3c|=c~Q9fcpy%!~0(5%TVAaAeH0#zCg@x{eJZa%z4fE z)!z^D`9u7Ey*~B%Radz_e}B7QqVbLT{GITBkMa5EPT9s>d>dsNm|Cz=Cgoe(KM~uX zpS}Vco*?m~Bjm-;#L8zr9V;(hiS~O{e9N<7sN%%jPy8J z%zQG{*r3(e+qH)KZhxP0Ut@Rm`;G7KO2c{2-rHwNx$kk^)RlDK<$Fk9kK4;{>eD=* zPmT56TwjCQeQct!^;*-nxpL7upXT<}-YciH*0+u^{5Ial?i-)q&d>iz%+>jmA6xF< zx^>g>bARa)XG&2vJ-umWERR>)8*oeyI<4LV{*JCc=J)$u&KrNo_Z#?G7f8vnra{W%xML-=pFAH;tX^Sg1s$@O_L zzsCE)F~7$9Zp^Q_e*As)eP*BsgSkHi+dqkzU%6kD+aRe?xia{LL^z))&wn~WUifqj z_I{{Od-)Xf^ZK->Hw?S4y?rsGhWir3Mo3mPef{xcWqNvouaf%ya-F*m-q-V-C^lgC z?YJJxeQW1++k^J~+vmy8d5{0fdF=iMzpW>(|Jd<6UaarMxZ2-l?Vs|&`usZX-OS5L zPCp&qQ`09$p>=(gtC)bk|$A8sbs?W4n$*c1X#C^kmx8K2X-^Kvz4fpW_`tzN9jejn0|F-q} zZOrfG_^tHf{U$f(r?%hA?J55Q^*yce75cW#9#5XH(6>D(-Zyc-zo*CM_pOib`T8oY z&G)#k^4OAO---q6q-H^bES1|Eg;| z+ppK5y2xCY=l5%T672W8{MUHK<-Ynlvx^!H?`L4|mHX4N`P0BuxNm*`&A#lk1}ALv zOy8gvQ{~0yli|N25t~0oeSGZvVAId1vA*&?YUD6{{t-fNA9MMH%f!Sep|_7UJW^zZ z`p=BzQ-6QGa^LgWUArH`eUIZtTAo{5Z+&`i?KkDV;lHsvUjJzz#`pYuGj7M&GdIq6 zZNBk=$$zWeH~b)%XSPl3%rW>x?aZfnetmuO#B9+TpIL|ZoaH`iaGN>12IBrRjrZZc zj^VqB-S36_&CNQuYLzp&D96mzsk%wW9jwB~QXhqDHu1jd03DZP`+8m5@9I6z_ACEA z1lxY&|Dyve*PkL?-QeZ?`uqIq2WYO(&waL)`!?5S_-<m&a2 z@p<1?#jNo@jSalqfXxF2dVNFs{oFWU>%3V``RpySY+i$u&)I^l+wAAQ`u)L}H)Xrw zzp0O_|7>7=eOpJ@+MePV_4VW6go|EytGPOCH@r9S=k?)!mEt^ln*JQH2)o~(`x@ih zn84NnOs zw%xwpe9q(x&>=i`4V*8u{uC6Sdj6|Qe2(B8pBcZ0zi;in9j6ap$md%-4~Ovgb#89E z-pwkwwUK<_xJX@(k9By@on_8-Yxi|MzJa*^Z0-I>Q(tBr&rR0+K5>F^TRXP%ye!5C zf&19~TKtsNa#=kwzJKn$So-7qcB*Dxhl8m21pg!}BU7+JXv=>b4!I}@!o)GN` zwex+TKQvG1)&hckgoZhbd<$l5XMKsS26GszqCUUcyO})i{V{vuRwh=KPoXsg zzQ^SHg7SUlnu79uCf66R`~LbqwfqIt@B9B=kMlF&{B$tM@P3Drp0d?Rj;nK`!poe| z!zcTO4a)ZodLe_jKb^XMB0WE2Ol+@wj~YHyqN(r2VfPclhD%E1XyrchcSp+f)L5CH znJ5+5{^iVlMZC{F&hvTP*ZXVpcGkXgukCuS9M|`F?^8XY+dLP}S~y=v4oYi3G$PMOI)_8xQwK$)p-T(2AKbray+`n=Cnseg#F~)`}_bZ*rj4Sfi_byISE+7qhK zzHqA(JiXxdgpohkYH|og&Wf2!eDkJllljvbpFV8|yw^OR<-YR&X_!N;yL3Kzakyl0 z2zgj4;93Rzw>U=r{kRL|rLFN*jU5&=uyKQ<$vtx zVNSfAzr#t5)I5KLGoD=E)U+6f@q9v!->J+`k!3uOD~sqmr^nCSTkfy=0}9Op*6AD{ z#y7Arq}ug5;!5tlvxfeF71-VtA|ci_{ufEqXxn0ISE@wK)pO^J~1XcK>bV{*4<> z_W{O%4X_6Hv$Xrlea7%9_vJX;-wyXH7gsQcP_`^6NEY?^SGqdO)FZXeSNX5M#pAt7 zH@{(Gf9$>fCmuY%-;<^$VsZhl9yR>e|Fpj@K-Y4gwAQEG_n`J%?X=$qn8mh%t@-Pi zt{UR31=$HQ5BsnHl;k8zWkIS`p=;?0p%+}|eB>VUz8db;N_6%rzJC?>R`W;ND`tTH zsRe2a)?pv&K-tulzB$zMXXDRLFWTmtn76|>t)R&_b^I0wo9FZ5{ek5snLn+Co_Edr zd$vEg&Zo6DQ0~?Fl>0VkZ*9M4|GiqD^#c|W>(8HmJOrvEtgoO_^?>>iLH6En^WE<( z^J;tp#rd|zS2BmVp0POt|F%G`Ltj^4e|*jkUsn1qCo5%#lbPJ)WF&2JQtT&~F*40pMPFbU&qOJ)LrG?W zEHX$$#>=8Cz+B=bY%fet0C8r&A}7gLm6z;W%4e&=GEg%v#Ror#httg5yEe{OZjjT1 zD{9-}kZ)DKnXALM0$t@{Imb3o?;A(FZ|uHu|IN4MI%_F(cXvzUmc}RM=YQ6AU&ry> zxOUY!cI+tgJ#3?QyqtJHkmuJmxlI4DO8DY&Kh*YHUFY}z)&KGH-_wd zb-Z&x>g%45rR(<6TLqt$`zC%vdUYJl*DBXdU6=Zf>heWA3)55MooV!eOizz>)JG&g zLM6PxIN z+U_gL-|icqv)d`mX>p44w>wh`wmQLa?^CylkJWZ6|NZ$sVr|=JX6id)&{MxWTLMkxTUF_=0o%fjpn7L%MnXviW<-X>JRN>7V-B zi1nuwZ1Lq~>~ylycEkG?Cp&qEla;*9a6c`v!AXe5_K%t=BZd~>`{%;@d}s8~47eYz zxjiR#H2(hR;ZE$R;mqAL%1I*6pAjAAWJiUm-|tLH(wtwMGmCpmz2BLi1#feborOq+ ze>_`Zm%L%Hk=us>SG>mlh3!3*jarD z)d#L@q@Q2yzV`KreCsXczN7JeW8;(Df7W(id-<CQroQ=l>VL%Z2I{Y?&o+yD!u(D$J`PY1QaJ$>CPYXP#|=0>k?l#$0XHcT z{g4{#o0b;K*l?aD=7yM)mB4tB1fHh^#)~F7j28zWZwQLnaus03NNR_(HTLQ#`bj8{k%3cB}%5DE7TUy6O7LQ z=n+y(22+y8%9MmCeI8^AP&pajVlsKf$vh{;`mFE_DRh5I;#hM&J^viOX92pSj2NUU zCrPR`Mu6KUuQxsw-Y9nzX3W0wC4)|xQ2p)sQNBAe&NL#}y- z^f?05j&jWV!Xy`|eq{mk!|5Dx6O*ERQ&M9b#*jEu$S+UJDsm^E1^j)DM;6X%Gj`tQ@j`w1r~jT!G9hON>+WFdli__5c0Z}b$x4L# ziQC~l+)vozOOJ1GQev0;62_KF)R<`!HF_F#J@`MQkUrmJeEyNx{9*X}!$sqL?dR8g zALIBX4P+Ag>;1}CaL)_S1LMg77RE(busvRn`4Mi87sN#HjJSwKf&!rDDKO^?H|NXe z8L}9IKR!nC6g)$Ue748&%uI+0lZl*v3i@Ftx@A7kUpeu^lH5cg4iL5fhBpP;%R`*6 zW8wOtR@df$`$aLMWfHkQ<^CIQSnluJr`+ExMMXtFm_B{_H><0w-|6b=I{D1GPcQ%V zYge43tijU6`hS&+%Z$%oLJdXN;WhmTmjA}?YoC&}{psZV;646;=KO8$&)R;=f6My- z|6NWS`>(GB`Ta&msNavhH?OO-zQ6ka^~E{9bsX3H%}VkzONgNsW+gaNlB3jyJ9#_< z@Y_izCQQ|5Bx1Ca5;jWG#v*k;a~e z<3~7#9*G{~phtW;v9V5JR;3gbwiryv+wJ70wn|P~yQ5GYke}7+jLX@@xV0Ai-mOpM z!29RK2izxbICn~mESjU^W8kF5e=+?$S@1s6QSPhH53u;?fGC5}k z$mSVI=NZZ5*-2Mlqo35*v-wN`HOC2Y;rJ8e9`OOl6F7^>AuP*FlI7$HSLNGUp4Re} zGuqP=BGCytZ_fm{KLwv($I!p|=9_Bw9gX)lZ+?>d&(!Dt=%cARj_2ytE3CP4Semvn zziN4z$@Q5UAGto$hlC%awMxBq!+qty(E)*+zu)(F^M0QFSMHnfetsW7IUeu_yw|O? zxm24^rDsdmUtw;ObrUmm&QNq}8u^?gS%8nFK35SsJ|DZSwm`X_gnyWze&Q$>JTt~` z58(0XY!=J)c0O`uVP}ub;=}SClaJXYM}oj*PJ`+Cm} zMk7J8>KM+O47~fD$TKt$^u1}EI}_cZet_El>BJuMQe&|F@v<~KS*pn~YW;o{`DJ7O zmH)wT{Q+H%uLz%C*Wo>L)^h*qRpxN+>Kc&y&(!WK_vz)oa`lRHBb4_h4`A)TPh$qw zEfwlG&NBR|#kr~EZQ_XW;+*k}?ZQttwp{H(9M6V6FL7grJ25;v_>GR%iB+28{UrQ% zVtG9wY=jeotx@Q<=9lAxCC@=ZSb>uoy%zpAVgGlresr6YliVs~hE#vccvgY)5dR?^tMeBjT4mO#-*?Ci&$rZLq$(&9&+-2-`*@6Sq z4|>oMJ&dR8Hu1y4S?$>KUBna3=#VDH8#Ml!-ygX4$pzc+dHC(At@!ws_nC>ivGpKf zmy;Q<+(&vk0RCqtZ1-ivZ;?!m`J-1#d}OH;6*dR{&vnKOn@$h^1m@>W=AMmE{*&v& z_aDXm;9eR(fO~}w;Qpwd9^t4iNK(H5srwou#FH;Tmm8l!?{A#mUsoo&_uHI^k_MG{Q2~CP9sk!GA>}+X=`7bOF4#QuTq=0VWQJZ;}jbe`?G+iHoQt=AS2HN6(e; z5i{xKpCsW!GR^!R%6F~x=^7oT=7&^WV7Jldx(^qlgP{Ad@HSe(GZ3vkLhx6m@>qL@ zqWqF=c<;wBw&^8~9yUbABFCzvztDhveJzT8)eEX~Qt$_}u>A%2os$zIWiGXWQn;@< zzh&h7R%$*UKi_a4?x_9OZNKC-owLj2`3rO9G~9pu#v5|w$`#qiS`Pzp|5@Ap+qdBU z<;%|D!#%9M(1_hH!R}|7F}ymCPwRT-deL2`)(7uxe}6w6fL-?dej`KpuXzBq=>gu? zdA$(4&&&s)uT%3dpr1-@|62N;myOSNN;7k*%j7vzlXA$z<~rkIGqCrW*!xs+K&jY; zM4pKxXYBBJ#)ihj(?lo2$RuO}`$Q*NQ&gZ4H6W0>&C&B$>wo~AJTBk2N9b|MG{^w+& z1KN`NZ??QgD(90x zqPv}_dI0__R2L-f_TdAF#sk=XWRsH?yHS#2RuS))NKE*ACt~CrxIdMi{&C#LvBu7; zuSUJk_-rbz4;L&43w|5Nk)x0!;4a*Z88w9dAmoUr$dN<%jzOv)LZtFMdiY?Dxe~sk zHyq_WI)-x&#=Z#1MpkW2OhkdpOO9eUpFz(_v4TMgJJ-q4-Dt6Z?JA+He;N#g!k%L2YNOpNcPxi z=-G+f$6|ExByz%lywI2-U~n?HJE68i?K2NfOgTy=n_2h<19 z?N%Q?fZ!*Q?`x6FxMoR@Ym$_hdWnx%!g?JGiTURf^Uvgd7Qz2CeE(?lZ6tE+lNcKH z`VZ<`s?VPe?{mp3PSkuKb-(%a z29#3oUqVk&4e|a8e15Ivf2`f-880N)r@cL=Pr?1yUzf|5S&xZ$f5QgmJ?Q82KTEs+ z(MNwX_14WBa^=z`=g=YMk*BUuUbe{C{j!PaPQ9&1+89Oo4*!F>9$fGDA2&IFwdEGU zocFfXzYoOt_yoF74xb)je0+QZxWA^T&?$_8Z^Npbk%MM4#$$#vVh}OmkeOBvMGl@$ zerP7I&p^&Ha^&D?JVP^_k%KuloMS^~@GQ-8Mh%&coavXNhfbHUku#mJ;WH&-NZo}P>tISYHgP@+dKbK=9-NfvqQ>_oVnyocu=UMFD-6We@QNqa!2Wa0Z~XLd<; zhVp+e-0u|ZKipSz_>r64jt|f#`7S2px5(7-)CTaY`}^9T+&(?{g^jG8yTkY?*_nG> z&J)L|Uz3c!<9FvI0o^uI{|ELHkuLwObag`_|4$PCkNQX&AH=J#)T(&^bih_8A*z;q z|6+Q57VzKCLC5O7L$41laz+g<@)zxWE6t{J8gw;v6G5$Ecx&&WIP0gG1$r z7sqSPf!AC)xIjh^F2MgAYjOf{#0aV66*SjJp3f;H=A4okZF+x7=o?y0Ji3e?!OV$| zoNF-($!8-+&7+p2vE|dDuWS72Av$cK#D-Upld6%Vv32JqAr4OCwRE_j(Pi~O7TXH^fvn6pPc`H!gR^ zj&@}jGQ7fx8dD*0k&B5hD~z3q4qJ?@WWN$w<-{Um!m7wWEp=idmcsXHCoWX6gmoOy9ut|6uQs`tMq2(4K>d*z|(jUGyQe zYAu5AM{jWr3u=$A_V!lL|G5-jzeaoa$EO*)56}Ia>CYkc3pCGf z>if*urQCn*@gscxOT_zoWc`NUY`m{_{|4iCFJA0pzJLQJw^*`hfr z0c!7EFs5Jg7}oZixk+sNADsW!d|zMsJj4gH4hW)d=UeV3W4-T<#z?-6iSq*r_;lQGBOlCc@tY zz_YK&vN`};X1DGBKGg@TL$?oKpi8pSK>9xHKGN8KKA**F=z<)40!1zy%*{rEyd2$j zeS>VabMO)RAup$c_jRBj+NmY9!Rc0@bp_2WYMudpX2C)C{Oqe;chE;pb{bqZKu@J8 zulG5*E^-Xd_u=DnjmcbNkmP;ny&xpIzcY#7Vg3izhxUKS=9vB$=D$ir>i>q+|1S%f zf$x;b|C%1tV*c+$?nz9Mm7XK<_W{fQtxZ1o1({sD&X2XFmkQY2hC9 zHE-LMVaPDfZLt7355D6|4yV>Iq5zvxAk!w)GvDwoi3^`8%KJQON`>?Q7SltheZq6K zrj*#C9-<=T^M=N+(8=NYcm znk6{^&1KrTiQK*)wfP?WxxYZ{Z(;#n*RhQHS>^=6&(}Jrj&Wo@6JA?0vqDxcIqx)Y zepxP@{F1YML!T@!p@$@?3SO2u$x+MT<0dDSXC@=Qm7H;_D|f@y-TrNTEj_l4=c^t2 z(n?)f?TnQfNXnD^t3$som5A;8Z63%2Wv_K#pGz@O?RaR}ROr zbsK%)hwgKn*Y!0E_=dhPFg$n9r{~Yu=WuR~Jq&Wv_xW;D_tTej0Inb4KUKLO*==NA z3a=%1`*KsdeR&)Q*!}~O&$jm)yx-*gM*Yn>{N@~^2SWc7|9_NVk7pyZ`L4{wZvC&! ze~V9G?n_#13p&2ZNs8Kp9$xPxj9rUvu65!gS4(`<8Y2@`hOb7SuXf_`6@q0f`*9$F z*NlunhI#udu?ef3m~dpImGQ{f@KxB7l}uPQfBO&rO`l&Awd|re z`uec@CwqJ4)mN4K7oCm{?0$W{Oz6k`XB+Q-H1!%ieSLiwm@j}e$;}I2l5MP2IVE=`{I9@P)R;Q4+Kr5OY)E`J z99QfEU9Qw^7w|RHMHVuEZnpb@^JMXCX2tJE@~rB!opc}w2iYC~$s9}O{Ydx(RE8o4 z9_6{O=czv6yl_!+QaOJ*oXg;IncdiG^aFlDj_VtkSb^;;aD6*9svF20bd@!QLoipXTRSO`n$M(eoGGT$w}1z zWuX7c{)bt-maRwti3hkp{Kx$N=H8h5xX0+=baZlh9J(AGoff+b>l;~!#)5TUvj#`6XSjzrfnN+ZnHAI_a7Gs!7SzB!O0gVMA)!6-jPV?-)+xy3By4JXdb&O{=wp~A? z`Vbvq<}y*cuf7p>Uwd~}Ym8Aupa1L3nAU2bIxRaBJ_Hyl z^&Wg|PxjC&aENo5b4zZ@VYUw;`K;=Rbk3!mO67am&ra>}Wu_q04j|!^;Wjoj9ge57 zZ{f>LL#J>}xm>S)Umn++n|xTmUnQ|Q-w*!-(tf`^=3W!mte@3uw%2Zd3;&7vP2O+Q z|4V_;Nvf0?vQ1<^zP@UJ8o{zJj-i%zTvjNCq{X$ z>u?22wT1M^$yW0G(~~1)&Ws68@5vML@Re8LexK9c-X;wVb(-t@{)`zjK3u+h`CIh( zpLpk;cdGyLFaI+8S#V$H>D6BT^Q;A?+}}uUv9xrdRL-3!4YTu&ZPs? z^5O6PwS4VMAIS&r|FwMi^Z!FW|JGm1qnG|fE*yJbHm*D_MOj*JS07*{_pynZ5%)9h zAT|W>90fz4t5Ec?uQ)6TF(89>rQlljICFzK0KAVNK3H z>F8*ay1F_kE-wDdIdkTGt+uxIwZn%GAA0}&_p5&JgCAu4;upUd_UqVu{p?S$`&X}C z7UlX&u>GT{~HUl{g z>Fpzz>Hd@)sbO4wjVr6C=1BF7d}rD8Tt2Jk;Pu(etur%Emd`@Y%9Z7F3Y_J$@@4t# zd|9Ed&B(^?zvTSG-~Oxo*?<2(o$vhqPvvu;{ju}GZ~sU>_uluNw;uh4+`jQmr(@?` z;;|i03VFcvq-rNEaigSDOUlHyWhNb=*Zv6eMI0VbW^p_x?FhE?2sZVok-DADb|x|x znXNJ%naX?8k2pEVJob%DL#DBxaSVCXFYWeGCzoTnna3F4cU1C2er{5F0g z-)DZS_df*x7xozck^Wcif0u>y{!{ZGv!Bg>nwfl<`xf~B^*&^AEQ@>ew0o$>Gx3ws z?Ps0z#KYWwa~__BLz01?6DkieZ&)kuVH|P%60W1#(RCBsn%{FeTfZ&sJO5O6ZU3&* zxc(2NZq4VN71dW6=h))RoKh__$7MRD#pzN$CCjOpoGDfK#Z^+tNE1tJ^cUPpZ`q0{Rbbx{~yV_Z-1Y;js8Mjd*%O-+c*C} z4(@-4accV|DPgIM4KI_i)Z(KeH%s)`J)j#LaOHla2R+Vq6f#O>C}PwSi6<@2%b^~7>M-Hwg+z`lPw_}DSeEm=VJ^pLr9QOCx&*^d9 z4@i6c!N;EV|LE_2+G{b~EAKV$9{TtBoITbpG0}Qo1Jd4q@AVFzi$-fcnTP zS-rAPnzw%-+nc__IJQ5Mt(&p=8~#YvH~f*D>ixDfZF!6L&y=M2H0nU3B}JcG@_ngs zJlF9&=ZRr{E|}++XE-AXBu4m=&bC62WhOe>e{1o z^@+~g*U`~VeZQVLv?{;C{5`kT=D+gFE9<`Vo$nO?{ont6)W7}PzrFbDa$kM^J9lqW zQ>3@&5WPLr_vg-=BMAwyGMf3)!l`S7u^v*mhcR|Lg7K0OVWa(s4BC!hTzq6Wy^wq+ z(qN3)k7R88*a-R~f!+4@nV*&MP*FhTSjNmpn*DJ8^HkObt&?wj{UiC|5B?th|5(2A zJAcjmCO>3e!|%zX*Zy4Y-1!swA-_Uy9fhckch80HfRqmMV7@jGE40$zl}fpF!6%L(20^MYsHc9NUzl{9f|NDP``q$1RA=gx$ue!~G-uk>sWM~6bZ0u>F>~e&XU6ntGHcdMhhs8x#tfM~ zYnC%}=1iG0d$yzdbLP%<)~?ws_wIek`RPx7E`R!`f9HJr+kY$XzyDL`bD#SN`6K7` z*MGoo_%8iP@5|DvBa)K5%1MZ?mSpCJOrYN;CFO*Zn0QK3lg~Iw$*0*zCY^F+U_U7- zu$_`}miL_DJ*R`-tDn(*J+7~N=Lj4R9P`fQNxnbz4A*g5lDUphd5Zm$qDW4*+sP@X zxb~C6`CNG#d5Zm$$X>tXGfsSbFQ4s2o)Cq%otSunW5*>i!IkXC#T`et_m{^xeoPec z3CEq-SY-T@GA8CI?>X*Rc`Q`MvLAg^qCsrzQ71b3$bU>m9l_^0EHN=hoT&e#)XztA zp4gaUd_UI_bAWU0kf^9tPGm%xjLTo^R4+R%J6pc!w6y$@Y-{@O&ekp8WnRqhI-56t zm+^CdDi`|x+$mwMgxuWePHJi@wbX1UCp$~>^KzZMyj&?L80U;rUW|tyh8GjyMS;r; z_~CM*2u>8coR~DJ*eRZ*e3)$bFcm&bo-|pePMhk?nL7u4Q|s*6(^nd)ve+*Nb@ALUS_3Lu~XFvPtq&HrF?f-q}owo$t z!dkq&(#iMgIR5(jb$U%wTf0WqD%P%%b?a&k>gv`?ecd|qo`(85QLJyM2Ms1}*sx(e zV-eQVle}IwQ8!c_rehKnIv3;*!~Y7h4+G#5S&#V`zykJJ~f4FFrQHy(1QM74Qg1!piOq|d`Av+e^>VG`73E{ z{l2vB`YYMB>-#)oKg5Upk@WWdnUs}nlk(D~vUqWsEM2-pYO1Sc#qt_ixnjAjUbRxz ztXTzCORd820#3k_b?ep=qr(Zqi#oUgFZ`T<59HAeC+OGP=yF2m`9_rm$}|MJ<-es+a&{%1e?S=>MW^FNPP-aC%-TfZ*v_4EJqPydwi8;^Z&zW#>1@#gFD)*G+;-g@f|<}Z57_x9Uw z;orY$q+Zv%@4g4m|G)OGJG_eP%CEhSce8O4fBCkTZ1tDj&F+^tF*Yu-9mht}lVsd5 zv2j_P*s%?E7B;ScL81!L1sEiR3ZjFAP}h@$G;`-Y6+i`by{F!hkPsNvnY+I;?_Ftl zK@`&zm_P1!rrnu&^X|E){m!|0T1jy?=74jmqXxdf;xlSaP9JB=X;qR=^NfrhT_*@y zk%cvDf}wvPM`rSe&^v$=d~B2Y@WWC3(MNYdx7h{#V<%_~DDCg$)Wr7rl&;NNWI=tGmDsE;}cbkZd1ABF8m7kx02qd)Yz zDE{Dsk)RQ7x*aqE`=Ad+sz3c{1o}pRZioEaj_vLGwtfuPOnP9u`jekTKv#?e4F{!t zBMry?Ht3eyaE`X=oa-2#sh=A=PJP979u&|1$^Ba)dxO*;|9CEB^E>Kftc&ogw>GOQ zS03lVE1R&^T^kP!Y*XjYZ{;6<+=@CGtvo8KOIs3X3F*#=seER>{*Vp&$fq{W< z4i681<67}O@ji5iJ29X9b8%7OXW;j$T{~k2z@ut(WQ4YN&u$fSf|`_+q^5wVRxf@Wr^Sy`Ft zk?bRC_K_?#o2cHhL9^8y2`wjEm2xETaE{6(NtI=4Ol3?)V=8nXP#fqmt?+mY?>adQ zU*G_DI{LMO{C+Jr_nelO_mw8gXYtHlb=R&M?UPUTYd`<_JniwH&DEZGe7^R?lk2e` zgLVMzpqtY60qw~rW3{KAI)El9ZF@F4ccJsfV}|V~abNvev3LeG*Rx#Drgx)ed=J{* zuRZYuwS#!4{b>8fX$Q2&AK$09C!W}g>(6gL``KR2)%JjjHg@ds$M7)Wh+I)cE)~HSut~nvj^FCM6tJ6O$6uWZE|HMGAO= zctPijRPaSAcmjMtJYoeOScxYxt>B4F7f*m6h$pBK&!nU#58{5!MMZ@n9qsKufL(tV z@#wYC@yF8@1_t`?sjRI0(f<7h-V6)d_AzAooV2vG58w}&)zZ>DtEsVZ7VHDGrdiF@ znni2Y&(k%o)&lBkt)Q)~t!OUV*4j3!t*sTUZB{$A_I5NuY5UTxqXXBV5p8YlnB#Qz zZfR;9?&|Iu?rClsK3QHq+>xI@+*VjP+)_|5)MU30HDqL*s#~{?Ij6n2&iRX{K6gIz z^a96}XVyBrro=eBybe32Oi4ydLQB+}w|5ebC%PMLQ%i7Daok9a*VA#szIUR-+i-8! zGw4~=65Mp`*<_Bc30RU$6CXnp>b#+y&j@PtfkB zhI!{3H@e{+NVgfMX*fRG?j9N%`Oe8M{$xixPwwr}THD%qZ9{|RC@RvbPMpxnK#PwZ zf=yV16>iEG4pqQ>jR zzVVoGTbw5fjj`5hdPEgPDq7NOv+$Q?aH;KdlxJ~i)UZ(iqf1UY1Yn3&t6=mPvK3im@YTLL` zvv1j=*+W9K+~8m>cf$srd*lc|cJN^D`pnD|Pghn}{{XV=?>jp?|AKtz0|P_f8XO#k zjy(cC7`fp*a6M)GwVpF>_Wd-C-`Us4|FONDFFJdMcXW62`j%$3ro5b278R+bCr4KUVVhPm}%qGi5)&Ov%qLgPl*U z*tg>NB`Nw_sa?*sp7-?Vn{mbW@b|akH+-GvXW;i6`-@jUV|H^U|hKJQ} zx3=K%r%c~0uc?J0Y1o;2>@#8!{H+LvEF3xF(AAtG!F2)@21@rM) z%`BFk7)PlXQ#7uOjmCMF$1#2E8II9;ah=XLhI8WDOI<_fjn5&z6YnAVihZKudB$U6 z`(o$BH5Yo8c#fdrTB7tm;<%u6Ts+J8yN&NI`igrQ`-)>mYV1qbigRPfeSMSge?>7L z?`6!}>vQ(z8>?CH$}F~bZca8a%JmQZo?8cHf-BhuH<&7lNY3?^Fv8V<^Ck= zVUPYzPfyRigptG8xf}ZAA485@b?nUK+biSSYxTYG-~I8aQ~Uw&{jR>#ytTVat*x); zH6_JrWpObtD=AS6$p*;J*K)1t-L}=Mv)L=Jtd)JdzkvK-$}B#i%-=r|a)riRmRr6M z75hYwxQ`Px9v{8VeU0(j(R1!TqOYK%=RKZF<6fLIUQ5S4_vt#pC!XiTzM$fsqR%Kb zJa6=v`@Y6L;hd z>Rs1r44U`3IlM2v`@n$u*U$mxo$BUI&;jaOTe!2LoL7VI%gF{PEYyx;I}d&U+m0Po z%BQ}#m#AUTsmJcgD{JmIFaZEWJWpvH4zTbvVA92eAhTx@&N z3tdac#=FjVPV^Pjvya#}_7TU%qvBo{qN0yDC-%pq;yR+9*SNkv>0}nm4#@hIpbOcn zudHNCms(j=bPo&L#ub#drbe<}flY5)vV?Sdo+n8>8yK)(my}fgH|h9ETH zn>KBg?Cm`ta%CCw^^1~xeN!+Nb0GI<4j?LB2ECkX#=F$fFH+p;dzrzO*3LBsWdO%%s6L*%E@v4#%UIzXz#$0gp=uw`>*ty*8+e>Wk zz8fL?`Ub)e5C9t>g!x+HFz${()(~IFXqTeKYs9u^A3APqbl!N4*!Jvi+!xmv`;K={ z<8iS)UO#dELe#U5cn9OP;+hMc6W4iOBY?|k; z|9mtwsC^IdzqwsqYB|LL+S^oTbv5|`)pE=M#fS$SgAIT*DQ-_r?od`NPh-EF9xQuJ zna3=?!IH(Y8-9RH$>K|6mqGqBH&qP#GLF-E&ttSt=LDs`v~Q%N_q^CS!*egxSKL#) zo1o&I#e0c;<2{Uh#kMCE?`S-Jq2DB)YowwN-9x;`c+Xe#@9giNgzvr$yuVbM`s_kB z>%A>fNXSvPYgfNazC6V2biT)O^(60YK|z`gI=(G4Qw0RR>W$LU>K_7Y^0&aQeoyH5 zra$lc^V&q5&&Ur5{1 zWs7A#WKJM-fUOvZharndM$!1a+(u*Ec&+EY@f>aIJY(o1_67C4-nf4`*LYqpo+*yg zJv_I?G2{KkF>&q1sOaZOsn6JbEEYxAv3xBDAnVuRdy`!s#1<@wXOWT3Y{w2&CcPeZ zz3$7SZN&2I#QTWnC@CpDTQf4syc`bazXB`vR}`-&Sx<3#!S`nT{PyI3nv+hS=J&O< zXloD)sOs+GbuI7%R#kCefp|IQfg+5dqvQv)+tu7du?@C`UmQZsq?NLd*Fxs)vkJQC zUX0HyP#U*3k4DGr9>+Yd5&M^Wow$A?QF?c3p5Nd?zyC6Rr^N>Sis8Ga;k!n|-@2Un z`+dRQd3z&Uw=R$E-hGzh^*Ya!jt?6jm>sUHUd`=D7qJ~VqGiOz)&1`1(Mny%r|Aj}7YWW2P+@6`)qkOqJ zpS|_g7U%#AnXk`M_yV`X21ti5kYtt}daORa-PE{k^Eh{@{j2FK?tL})xSGCS=lOQ% z^)`IV9Ld*m2(o@7Fc(Xt>C>09Pe0u&g@-$!ik5Ab%d^yPZ9I_FG0-Ki)VnkKeX)!yUi^dbM}(_}){z27bWWrbh07{3k3x zDVlBrzz>*fvyIr0AIv`ac%S^j^Glew_d>{~5Xh)l$SR6U3He97W423w1L!aoJ7hiS z_*Q&JiruZi9I%kRH8X?-tzgjc`xwRR-Lbn-9UsT+!0p&=HZ3PPxqWR`R@pPPwRQhY zF?)lKugB~Ot7Gc;w=I8PvW_wE!2j0Lsx9vX9{Km${e-JTyQ^z;?{7QAX;bH9_*Z{wV4g)Bz7%Q&t8Wz>No{H~?$_ zU_}O$oiP<`?wsB7^Up1T4^Zd;hcJf84=C(%Q~v+H{D)ny`|~nDcQGH!D$JRIZ05}M zY}t}57O}lohD_Iao?`ao!`r->+ep_ZJwG;9m6DQrqEb>yr&m@wen7SBNXI8!F7moY z{drgV|C`sFb4F*U_EdATwzKmjF9#mj2|Qp;MY&oD`LE-Fq5mHv8z47Vv!$kj0i|^-}vcLhfGd85cWusdpFWFLV!K*E7g_;B+jZ zI)-}s%PXY+{ofeG=t`xCh#}pFzkdB#?2h;y`8deO;|fYVWF#duEtjOSpV!sZ|C14y z3)}u1X3XB?->aR&&z#Zz1#y5yot-=n^55Cnj?y4Cyqe+wXvOdY>Ud!20J%9i1IqUB zB4yV55%RPCOJK87EO0Z%HsR1D$TndE5I@|m%_!^l!B4Ul-)13u?X^`bFd&14hj%ex z@pM@aUU$drT{0iC-;Po?@aLU55FcOl;jv?tKOMv6o;7i~h+AFlcsKi>{|!e*_&3|z zwb$F*cq-(7HN^rN8`PT0O2PuDloNdX=uwrhKzZ;3D)I5nEHE%x{^fMU0AT}IbRA$1 z^jYMiz@G)azf6Dsg=D6Xr$2Y8e=&RGjrDBd7s>G7H#1;wM`bdGC!HNyc6S%AIoYW?kqcg3 zUhcvJ7Xl9qAApVpu%VRT!GjHK-n=+@+Dk!*VFgIuz^D27?T7rM{IpBSe<3rkhTg2c zB==oB@9$4`eF}I#3U>W+_QDHGr1#$oXKU6Rl_Dd*LQM_9_bxmxYHJWyNB8ON->+t; zrFHL0Oe}x5sHp14sDJf$E?h3@_3K1gE;YBumN6ZYT^eF2dp^R0UMx^ z*8mSle!x*I0LlN{TyC>kdsxUun>=&o7U0tYnU@#E1E2%wd8j%b=oYm9jk5j#elOv4 z0@*9S3<6FkmW6JuhpczS?$)hyVf2XKMWa0Xg9nE*5)zu%XJnK->u}WmEBWz7eT|`^ z;ZZ-n8MD8zoHFJ2_4_Wpz1k%B0XHHq_&6|uwXg#mHPvbbYyjYaRUHou9Uu>LfDN%g zws((1`Q+pM@=Gr+mArrn_VwL}SU@cN08~T6We>Y-0Z&``X36fa^IW0JkgTU1`$*V1 zE2Zb3Tg={jH%tl&Qh?Lxm5_e}Kc1%R`5QO7V)h$0==Jm{X3tVn`wu53Iu_XN<&QQr zH0rr`r%(5Nr@w!|tfghj`5PwZFE)P;4r+hh+{}Lq|GyPJKnLsqCvt+SD=G*N%ugU6 z2zX$Z4FEillA7AhR;|jBXS}ijvhWM!1;G{oW}W!NjS2pP)&X4c`W*b0c*HqSPsb;K zO`jgbKKnEdx%D;R`(eW7z@Mkr)IePwSH3OT_}I4Z+ov5tyfh*?x%5}1r8WOGhRgkm zYGz_B3bU5h#m1v~?)u64alY*x9UYnvY60x%>Qu{t394;wQfq3ec_nlJ%9BcFlt z8VJ{5@m(#EeKT|B2DV~_EJa22>ajcc?;z`S-#rugwvhkGljOij52j*0rIlG(CBC(_ z^`p4luf95m8hWmnJ$V1R)~6rm|D6zW#(cLM&exayzxVZN{|y@;81g@#`2Q5}0QFcl z6g7gWEGI3d)<8xgFVHI(IsnxOO$WYRV`a}MEF9jckA&)H{l=6av{Ve48mC`Gb z-JbWpRA2H@D9}|@nQD-bE}{O1TY^jsuR8oJViA^Ct_Y8`SBs^eG@=K z@y^RIcLlK7v!dDBHKi;%y5A7H8F!Jq>W7N7t+fITly1AgU{vV2({ z@PJ{^p98^9R41Hbfr&bwO&r~ybo@-b(;npCti?M9LdRdjKL0EQal01GV_eU>6R|tu zcWM;BBikN2zLb{Mw&HYj|Z@smlfscwp!NN_Nf=+qkJ({^)nH@B<3tQ8OpJWwF`kMKYTTzNsdAK+5HK%?v)Pd6CvxIVAw z`A4ogxtMz_LDF+m7o$#YxU^zLF6v{SmXLQhiqoOm8id6MUPoUOgM503+2>fTr(+Tm z%iaer_eW#(a?jo~rsJFIUzz-Mb^JBazaMe}?|}{Q6539z7gh^Aa9vj?uR&gLC2E5Z z9=Hf~LG=2-gauHPVbTHQpdg98{@O;}58w@dI;}tF!pL7wOfbp%Y&`QI;&$sH?*rNN zmshd*^Aj*9IZ!8enD`v^Gr2;wH7I^Zavt(tS+$DWF(;sgo|=)8(z4cSEtytbU3=e{ zj!)~}jnF#EIv(G|<=)!kexmc`jeNheXVsrHHfjM_AE3OoMXe0s?U8`ip{x|zT)^dCw{sQ6uO zZt3HM%N6x`fp3AFL1mTFeteL!8zK`7Qi_nV>a@1vncJ2XH!gMJZ~75f%V( zfTQpM<`Mr((jYrlSi)YO7Q{aK-CoH0 zYQ*ja_1GP1<>^>_$a-4e((S{i_#OH4G$}LlbYxOe>04!GHUCL5d&<3|dbuVp*Oc$q zf_H9(dyowPAAmnv*r{&S*-3uDPPGPk!Ikg>!Uj;?YlNse9vFGSEG?~9-m;}go(2E< zbI&e?To!nsL(C8LtzG_jp$A-v+$Wq)8st66`XJQKT+H5nI~4ghj73FtppKTFW9#*a+DQ;-+CUSBK7+Z(ZV ztQR(h2g<$7IDo+E970TSi+(S{(7y_r}|k!*6aQ}!s8+z&$euthML9P zmYCRo@bKZ14+;v(9wuBa)yt(dF~P z+dI^1Z7^L2P?Qmtl++D-y8!vIk&ySO5$LlVae#2d0cicY(O4kPT}b|u zZlJjHZ(uiA)}T)yd-IJDY1uN=$&F}3>~2_s?+$joE8mv<_!OrnO0hfA`D0^wPImU` zZOFZwVXT)+I=&gRH~I8dK0stu^9#G?yQreEPKh6~*mI))RgY^4^+~(j1tRQ{wG(*8Pj;niyui zT$A^&7q8rk_jTIi=lJpRNmNTqtcgMXJQpt4jM?9c z-M*hZ-R@GzU~y={^7*3qUzR6br<)w+>)fFHFz1rTm*P=7n{HrcPbLX3vfU{=QI`^^chd1m z?_axC1OKaXe7trfE30R7T3YeTR4-SoiQ%c^n=$+AKSoSGymh}ZY=A!l9{3UD1g(bu zucE0*ttKo$L%mvooPaXq1sA)p0BRm#fyf4sq#-3Pu1#LCJcqsZI`BX~fv6E04EY~} zxIM)KH$dJ8vKcehNejQA{F{2z))*vQjs%{EPtO&z$3Bj^>Sr!pswq)XDr#wIsnGEk zFjn#lBQBS6??y({yG$Mb)*XxHJagm!TdECu?ws~db#?qV@BvC4oxB#gfllZI)yN4b zE3W_+ph(XNq`CmW18a&+Q5n{-kT-2Ak>7oHC!_j6UWf&Hc`qWI4*T`5!rAK8M!IW8{yfUNquBlOz(Asv5UcVc4k{}dLM>1$#bWA-k-H+6iIKW;pK z+z#K|Z38?998e7E0+*pKAgvKl18h*Gv&Mx7h7K@_2S!eSEh}qK*}Jz9cp!mrJ-@;`=-9xZ{sZ9p4=Hw*w#Etly}r{7DGq=&LjJD4p3iJ+=ULGI z>$rqFlEDbUZL@0MrK4fCnC7`S~MqZ0uP%BH}b~K_lRO^5g4k-Rb^3 z((x&V7aXhtJH&I-)BCZ;ZON-8B^5ssYht+kd1GtbnzH`(8-M1UbMyc6;bH!5*#6JJ z2G~|tr5m!9mgEt z!sV`7rP;P^Q{}WYEi)~xD^QlprZ})B2I=^{y}jS1wXH>-y{Y5h{QuwN!Q1;kfDLdr z;eo;b0az!f0DNE5(+xjh8?SU`SsBgM4|A z{kBDmxP8YCO@>eJV0L!LdnF~#`#O%qB&%ySlZEy13?ag-+=>NZS zaFG8w{C}@tod7FnU46Y;1OC_Xz?J3NiQ|RC$BT-F3ewVs^A8?4of{iFV5hb038S}m zt;(R|+Z9FIY_~T~X>4r$KKbyerVhz^;~KZb`xEGQ-`07c=Ko;MKVl5HumIX)zyWVY z?7s-PK-KU8)HF6|m6eqvW#wgRVNUkQvB=22yv>`3?BvIfiXtpNPnG3?*;Q2?KkVu0 zy_alys-s0bFJksCS#R>a_|_&h`EH_(0rCR^3jnMgp9kJoTAFzk)d+2B8bLn5NGWoF zi&v~TWBc&KK^t`ZY}5yfE-V~=v9E9BFHu(%ysq6vP1Mt&-)Hi@InF2AI5*#C+%b6v zumIly7WjFr6PkwDAJqk|=;_ufcJJyh2n`)j^7GZaaGt8Pp6MhVk9}rl8AE7qb2CNNITH{bFv$Iv?0BTmO6S4sLg7oSZ@UY literal 262198 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 diff --git a/indra/newview/installers/windows/uninstall_icon.ico b/indra/newview/installers/windows/uninstall_icon.ico index c4ec6c70bd7f325369d8763afef61ee8e93f2960..290b1dc2b880448cfb5a5877b660a448c331b832 100644 GIT binary patch literal 367994 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 U(hkPq&zuK87Crv{R~!HT0b1u?=Kufz literal 25214 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 V66ANQ|7`dYdgX77pi9Oo{J$@MqwxR$ diff --git a/indra/newview/installers/windows/uninstall_icon_singularity.BMP b/indra/newview/installers/windows/uninstall_icon_singularity.BMP deleted file mode 100644 index e7291fcc353a3279f9ddcbfafccb4a931cdbe74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260154 zcmeFa2Y6mbmH!`l4V{o)oW$Ld)r%$D>h8T;a_@E=cgMZ=IL)a}b(~ImPe>swOK%H- zT^2SFU}2X9LJ3XEyz~El&fL-aN|sAV^7|W*p66)pojzwypL_3HIk@yM?>K?KLP2MN zPvC7QoUN-9PI#xvUwZcm29}|J-urfF$3Z&{w9`O44YbohI}NncKsybz(?B~7w9`O4 z4YbohI}NncKsybz(?B~7w9`O44YbohI}Nncz+q`1l}f$swbx#I$6x>Y*LVNrFMoN@ zpa1;l_x|Zme|p~^|Mx3RJDU998Rzy9^de({T6ocxoY{N#)u|MT z{XNJ4=7`LC<&{@H0>8ib;)~tB^rbHqefG1T?eokt&s072)Kj&V{lHI#^FW#KGC>*@22*4?pV$3^s!nPy(ME^F&P&VhDqwT=15l5XF= zeHB36wo>x8ZQHi`aA{^4*AcdE-MWVBV@cbpL*82fTefUj+ZMc$v5s|}hpQLYA8|*@ z9$#|FC5!j(-#_!d`|ca@xzByB{6GHVKRW&2|NY-5@SBfU{f}J2&j0C8e|kE6f5#nn zjECQrE?s)@?Af!gojP^uO;e^!xq0&B$+x^7m^5k90qSR_nb)n$jg($da@|&XxIFTKi4!N@cC_?Z>Kv|*BekWhHB6W=;db&e(|Fyw zZsz^pGXCM(Wae`XWa5`=Xm`ep8P{KU;f0qWtI(U+0r*M3`OR-WN(|t5)cwTunBVul z_q{F;Km73EJ$v>nn>TOXRij3Y`gFg3{hp|)sd>7(y81I!RaMXYy+UPW<+K0jP*G9w z+#7|yefvI7A4f{tDkJaBfIfZte3pKWlpd+G#Ou6{H}){ zdT0nb^?23&FTeb9hZ}Faak1=``^JtP`?b2dx*zxMUH*T?#U;NjDk}P&*7W;KC@wDi zeI~@Rm{(X>WcAbc>GtGNKbFNb_7Tg{DSZ{Z4xs*_pmqE{KtV>zb!(trW?trf>?7u7 zrlE|vGEPXt^`ZTR`4txz2@mPH#_NKD!ao!h75;%#c*ubK*ZSg{QTTMiq4M#TGwlRpQk=DA@-S>_j<4CqxCqUU)IXJ z3kvf87}s@ZTKKADz@LOm)eR}v+Rso%0r-`@_bNqdq3c^TK_a~~n| zKDKFHKjvqqp-vntrY*;f^<#g>mWn@ZzA>fGcpcILyXU%PeykVrLwRmemo$Lr)@MRG zKS%jFUNmhGuSt(~9oxJ)Y0u_4{4M>(`G&ORTI0Ionj?;&hlopPS2{{i;>9OkdeO`8 z@bWJNeYk(EsHpfi+1c6O*ZjUA{`nHRf6kma*X-N3Z@~*MywICi8ZrOlh4zf)%v zqvgZ=SBDNAJaFE5=lOHbJy*~nNx43D=+NO@>*Kuh&Q*Uc+tGI%qeF-DR4GJ{f0S&c^vC_={D(pjP-L*x#j>Ub=`ga?bpCKJIwoeLa70;+0okxwd1+j!n$HxVYH$>C@Ls7P!8Bds~Wp z<364CmdvB9uj}1Aq})pes!mAB=RUJM){k{!ADQ>D59(%?x4w`4AE{1k6Z?$wiEU%r zRv)oV?4xxW+XNi7J=eqa5!=3=RJz4*8P-s4dMD(W{!v+(@ZH;$mzS|ON<%(r>wNNh z_wM7$%1Y@+X_<6cnWe%>l21y0xl_!?tBs|helOE~8cTVl&1IoZN%K8*L)%y{q@hjA zymVh>uC%n&=0iQ^m3bfQ9jy<_g_A?(US7^xn15I|xMH0FXPGJZ26qAP(7$NFS5;Ly zfv>Kv^ffiruDZI)_v%&R;C<<@l+wR;>(=chcwc_=lQU<|+<)0+mt9D_Uw-wO#}n@> z{_qK%OYZ8_sguKw96frJpFMk)pEYZ`m(21rX9k!)eVXpco0_EYn*3>AaSb2pgnRM; z@}^IpqH7>sr*+*>FP76cKp&x9W=emtKKbeEmSe~9VtGiZKeZLad4@65_2bxaUaTEB zbe!~jDa)LHW?lM=>x%iA_nFr%$4bvB&J~U zRmycs2>I!wB8_2h(ZprHs;{m`L9O#frMN{70xUAz8| ze1xwK7%<>5&dRR7`s%s=@-P2V_OqY;>@?2#j~BhK=MGNZvSrI&|o+b9(B!rG&pdnYfHHg`IDOS>+2_4Icd0_uN0B*VD#LoH(I5oj8%ah8B6P>$G*Rb77zEXT18D;6mQSR_O%wO?k|ppm~g^ zt>uTZ*tT^V=NkKA!~Up$<+F#eJiSLP%i=y~meUve9`FDzXcN;o_plG+Rd<}~#&n_^ zKYoIrFd@vHKE{s^I8=LGk5d_Gx(;>6j~|=lr~3-|<9xbJY}-~ku0mx>txNrIL<+~3aJXrs=uYD~~akWo29Y<&Uk@uzd zz2ucw%+lA^))-*hR904C+hf0D|Hw9q&|5ZDCY1Yf*^)pyKU|lW$9m~HXSzrp>>_s_px4V+q%51`(C}uWZShIo0v~#9`-G5V_xg~ zI9^QK8izh({_CA*X8pFthUizK-__FlYt&jpfuAq}ze0@cY?exdS-Ylk+9dz*ZW zdBj{Z>xBF~8(;k=X`b~R$IZ(ta3KzxN8I1~*Sst*w6Qq4-N*dQG|ZDap-n8~p1JFc zAsIKMu{@@fr^gT1A&)Z%+Spk{l2XonTz~8v+{LocCay1xA8^aLM$C_EqpvuAW?gUx zei@&9)*0s<)41kvmcyKKo9jfp#=6|czQ9Y&4=HB{ah;hoL7x$ane%}Tax>SGd7a=W z&OP8Nt~aECwpe$ZN9J|RYn=uhr`yEx*!IwM9a=ZGAx*E%>RD`zScGIec0RE{)BE!G zf34@>K0AN@{41}z>Z*Cf_<6PmU;k}yd)r~(o&A3;6LjYA{u^$%VYzVpSLRRrGApZx zoo$Hjz_s`!oD&6_%dxU>ooDAffrr_j))3FL(rGx)gIkep=QE^4m|wUL=ZlOT?!igswfHKz2Ve1wGF^wdvQQ1#NjvV>Gx^?R|-+lMpW4`sRZ)N}L zSHJrB@nr8KXL!c&3t#xxI{9PY1UEXLaGYCcJ<{{}*iy~0($Z2p*HqjUJE)h%MnkMR zo&gZoH=jVUQ(~kc&M!Z~VztOe;;(@EaQGLxwzRag*dYT-N=hVOjfWGx6ZBKmX`%<| z3HBYG6>Woj$6je)m9qD_u4m6|_R?i#u~(!$lxEv~R#sMX9_x%{aowb$Zoot9eC{*z zva_>X_wL;#Gh3#r%&r=+T*`>y6&>3qm^h4LNeE8V+y(|s4o-fmWha{6R`UAuCY zMBC68`JpUJbI*d-ot{^-b+dlyWZ@y;2V4c4#^i_LG{~)>qje_j;H{F9B1_pLo%Pth zYcFKimS@D-@o`GEPk|rBgGMW?6TQLuNV(T~&>=Qw@DkTgd91@3ndYrN0`B7aNNF3_ z4{u?2;zL180@7AzPl4|62~^g6CKB&SiP_^9(2smgi|;Gn`i0J;4u>wGL)OW;7cxjV zGTVjyV87sX#q=HLrXjU6$P}?Y(fv2j`TCpx+;h)W@a{X`GdSMf<--QS?!WH3>$b>F z`7>+6{)cCvBXB%y*f7OSh(m?=s{9yT*IUeL`0!zh4b-v^Ru^9%JmWJJ7nibUCbyxl zD3{?&c!$01+O?a;>tyGn$V|p3_8@%vbIv)(pLNz*g0ppfR>u8V{){uu@MoTRx@7Iy z&27_Xw&z(MeE=OhMhJb=KfpQx_A=6BNW0m6w{9UHS_CMI*YUn(JLo^qHhsqa<9Kmx zqyTfvJhMh`u;$ZGKf{0OQ=d|Ln(jOJv(FCeWzDCbetHI+>Q6iEG=It|r}|S*J+-;7 zGtWHJ@Dp%%mfD})0?21v=EvDK^I*QL2|f!t5WR>U7if&ILmS+V@sKl3{I zG|h(OiAYcTJwB>clz$X|Ni0s_HX}|#e00b z8-G06`_aF6$2;C}f?^THS6;dAGpwC;Am@<(TDRipw6<;sB98wn}HSRiw5q z_Ed7qvA?2c$6k{{+uD2GhkWkS<>dD_x}Z)hi*4dPeF_|Mkul;}&`<(47txdHvCQWu zkddGG#3$T`KJ;OK)>&tozF|%52l@|wqz*O^wkNpy(1$(*?@14JFxw%KH~63Mxr2YG z2XB4wgCDfI>@)lD$xnU~o^u-0pLEhm&G)*ty$k$#szX+YUmQGxtYEL$L;PIkqj{PA zCD~#2faYTJqEF^iQW9*2s7H}Cq7U15Xau=~-GQ8mYol-SrF-lgMz}LPP>1mt7u}r5 zsKkaTv6TF%yQv>_J9v~VF+DF`-=Z%1o^t9YdMnyWwl??zdx$z3JD%%1aM`(Ymy~Ge zYwOpq-+bqtcaG!R7d*@Ns=ncIyy^VN`=ol#_&q=T;Sa~^8H8_(&P>O_FUZ0RF1WyN z*s#INfAOnVueN*iJUk11B(!6`4m80&vtR5BwDy4ye87L?BOkHrWUtH~z{Y|{=?mUK zhraK9@3Z>Q6k}s=L|Lx)3{1Ww|FK0nb?WTj{qA>r=pG*6EKp~XoLlKEs=@BDRmg9B zAI=RqCk$nrI73$O`~>|_C+I&rW3oP=L*(Xr-}_#(rO;*QLejy52RG|5bQ$_nGSm7-9>)Bd*iqp*O!g7_W-q`!d(WPd!VByTKsnL_Z@xnJ;x&J9Z+v1fZQ{j{!1^YiKdjBjqul{#i5kTm#S-bwB#ik2d$gJ$i>c z*2~)1heY;S9({lZio$6 zZ-4vSPf#54!~gx?KU;XuJ@@>CbwLZ-X9w>~mYLqyy9o}uXJ65~;7IE?Jxg8oPy3{2 z0j798*I+sVnGXMpN2P}={DK7w^o+|4ofp?zI(_Y2t&Ue0({V`p+WXTez ze)O!-ET?Cryq=GCy5=4`&9Psid9yFj!{n)q8H(P z)&g$n6L|q>AN1_SRI_iOZPhnDNT2l0{OFT<-~rsxH}nn8;C<@q`wZ59BJ-?G?1PlC zu>bG{=!<*e3~F!j2F76zNfX{TU8%jXeZl@pWU@nUPzPHGn?yWn_8jYCpTPrj)LI?3 zIOB^pI7hR+7C)K|10BWnNPjfPBobL>x*HviJwRLnUd0}P@1aF(AZ!6_L3EvDkF5pz z!!82v&_DUCJK7_ZBR9}B^oN~=?OIyei)Z4#sJQu@FMs*Vg+JEwyPWC4_s8RVyOHl> zDxN#x_rL%Br}V9XZ94b+HToNzK@+n1{i;=~ym;UE4w((#L37A`onv}E!{D#K{(3K8 z$LpIiUf%%l7him_$!+BDd*1UNlcCyAukW0AoqzbXYuEbCn>SngjT<*YKPHFae`pjs zVa#RAmidJX7Ye_#4WI}39G!>01JGB{I(48m^e_Oe(k~Esj}(BPqd$l(3%x;~eQM-OO4TgEdnRTNz!6j%5Duc=V6ChF<{q5}yd1g=a`-+B_v+kTGT_uomz^ee^Iq z$9T{KG%5bK`?hdRzw8q!HV-}qG>aX=*!Z{LkoACL`i8HWJJ;Bx$X)8O=dlj<2j%!c z^v8O|8^6%=d)vPH)vxAro)`5!e1AOa{K)&HvY}6qf6_tE`re@Z|D*IziWmnv9Nw4B z?-nm!YAOpQ`SRt><6?u0FHMJ` z_rNdwB%XE13CUsyeS;%#E4$rcyNlNim-yY-+N9XGv}JGLWo#7IiOvQ`><6+Q-O7B> zkJ$9_T!6OZ!Ncq~e2*Q793oBRfY~FG+oq4PA>cD;4t_-*NbcLS4$}4JgQMr+LsE1) zdkn7GOXi6!$-Lm%sOPDR{t!Q#4GZ4EH*IJe>5aWa|1)po269BYDTQv7uKV$=x8Ax( z&+Yd4@BjYqQ;F$wo(IqWz3_dM0ivT5bnc&}IK{ov7me8W&^x*S{ufP|Zh%&VEAutk zWA-0>fq(D^UXnd9Imw>02ha}X@C)VC$5tbyA8ZMD8NH93K%Y}af8ZSXPZ?vQi_k&v zOR|U72XqRp(4M{-D+2Z^`IOTS`cJ%Q^)n{pv;H_&*2OrC&zRJqoP7YV%$s{+0oX;XnfehY&<}mm zmUs#6p-X6ueMVkF_sDB#hCPP{!3}+>p1bCnYrgx)Baf_;zAxgN*2MLAcJJ?v=Ogcv zVyoyIL%kILe^T=QHPJ*0-HA?t_t8P((iZ)c_G3S_#iLWGyupJ zvpjSWGK4bdL3C(3O!CM4D#-?u>BwF5kZfGj*XTs_9Q%MT${sOp5>K+Yvg(*UAo{U3 z;$8DMv6D5XgC=B$nE!~5V87AF*oo*L_8DCPPl=ALT(Zq{ePT4P;v=gb2+hKvM{=vi==(7Ne4`a<@R&pfbI=nH!!+D^#Yc#W(_pJOYi zKiebbh)kyqV_;h(evYNs^Z4rcFyI-!CuQ&G10Pdmc7`H8wYj5j8I!mN_34i}!vCxr zo`y#7J6Hp_B}E2^uMM~C4|K@*l2f)fYHu{cILJWa`>ct%(+9Xj{zxVmJ&4|HuZ6?c z^gYWji|^-u=R4o&`M>}BzbA=b-v9T`_wYV)OXm{rQv9z#Ydats{T(_1n!}!l{{ehR z=qu`JbS!?D-dVOX_5yqZ@HjjJ595PThOWSd!zX7?k@d*sB;IFwhj!GXKDGybKD7L< zcfHH>4|@hJ;2Y2va*2IImU9M3f5>oT4)lXg0niEfAo!)|66OVLN$f7d~*4 zo`?COzMnpm=k$4IkLPtc$NPKM_nEq%*uQXlg5nlu-FDk;H);?6gbfHiLc`EGd=Abz zBZBtW2k-^%!6!V04Gf=U+LYL10Cm`JaLXP;=h#=VF7_UB7yM&0bIqPm7k+{t=$kQV z$39Y*Yv=;rh3=UjZE1%sihhRPpb5r;FDYkE$O_tX4c)}^BicaI%!6{;qHnP|slz&< zYu121VjkG$%z<+FE{;n+^I%-)FV2%ODMQZ2a@sKlYmIZG9lSwG9(bpm^|KDz#&t0- za6vh8hIxZ`coumDO@l+mqz&V`IpB{#gV>VrA2`C+#MXz_=>z)I{LOzLAN|Q%pkM3&d@bmee&J>Cjb3A3(5YzN zVqwv4XAST>e8BkNQ#@wls&BLPRc^Mn^nA08j~-==L}%Mrj3+r^~HK>`(k(n5A=oZ7VjD!v_6{$_34W}MDCzx#JlEOux`dzxz!QR zI`&xjZQeWZf<#;XT}|wtb3pw*h}qK6Jo+A5f*0`<@B=tYBo2vA zz!!i&pjBiN@g)2cY;EX=^FU-h^unC6UGZJ$1DOV0;h#e%=pf3l<2lFVn)N|j=!IC0 zzKXUG^H&VO=762b*%@{u_7QVLf8i%ENBU)rtd(olg5F_{*c8l-JZvLy#CY&~ET><} zMVGc#@Jav3QPzkrL^xc1lLHo~*%QsLg@F1n0;6YW_X zPq?>dVW1V!teqX9E3tF6pY|*T`WC(t-J6~fU6?KtO*m)>c^rLT`iJ&O*>m-4=P=@3 zix(oZ;caXNbf);nvA4($^eViI-bW`R@0pkSG24JX(96UR(P8w3FDn{y=m7X1y$j8X zCrwA7laT@B!*}Qu<|Xi{cNAw?bir$0v z;eGmmmaz%oXX+x)z!Bx>VdNKjk-n)XFy0`>$sE!1$Q5u$ij6>DaXjXXpMuV0{CE#v zP#0N)jez|u{b>D5zB%MPbOB$oCUmEG-}V|FR6C;?^f~>qH^>#u*Ve7I+x~zbaK_r$ zC&?Cj1{gUa-^TU?yfa5qcv`$|XL)fyu-%ZC;%Vy}{lqvCH|#6(&=}SyYr}Rx{>#2h z>6=^srFU}H>3zI>Y(rXx&H2B6Z|Dx~`Cq{`_7pk^`ORKqS3(Qe z-;_g3&^xvie9k?4g`S5e(Z$d^`Wn83w$UTBVb7pvAfX@AXOyu=#0j8l_ATlI#zz0p zC%!NAj&IM{>?br&8S_ELGY518`Ubv6Z&Q~#_!iJ6?WxcFm(T(c+46`sT<02jz9cnVpJJV1^j ztDy__5_!#fSS$1aKIscQgWpIu;GT6bcXU1W2et!xnfyfN*}9lN^8$C^iM?fw>^(Rq zwnx9UG@oDU{6^axX}6=W#fNAw(czX_MLc6kKeKQN4N10r~irn zVgKv=zq6kIzg#r(EAYuap#Q)%dJdWv510-YEm=H3HlRHh#Jd6V2b`YQ@p_ie;RDF7 zH$P7O+nEl!ioKJ4=y=}m^2;wb87~^L^BVRIU4cC-Ti#)>tG>ky7#BLF9QxzAB>her z_Mhnk=v3{kOtfWv==TOq?~8U!-cyeKNuSWM>|tAj=*M&iyu&#Zx(c01|D@RR=r{O+ z=aH~EnFqE$HiYD-@izT3ckCJZpe}sMSsyZtIkRr`BjvKy4L_7a=lC$_*The-I%;RJ z2+^|Bdc5Abvgc%Edzt+K?ud(F_v;xfv&p~-HaNPGxnVP4uY*(gntdW=9<-w`)((C( zFY6b5k32+o(pEm6?Wy+J>=0}yw55Kl;OV|EAh2906cAbV&Fogx?6U-k%_1>J=WfscW` zi9aE~nM$hZm`#5@D=by&LKOFy)Fa2?X?EjB_{p(-fCK~=VaupqcoJUSW zuizM2j2;BfdMCi^Hw?{(L;j;9knPYh&-KD%>=FEfJi$jJmcU-Khxnq<80CzIZXl0% z0Ot+RC^DOJbU*q9`eJN+4}3#(6Xobu@);9arXTnSy%_sPzM%imQOuLN#3SGlbPH=h zKCn*4M!(P&z=jad+ZySIwZPky;V+=;@DI>i$Vsl@56ZDU@D-37%#rbF3oa=qhK)?a z7e;4M7hXhXi)LbKbH@%9-I=XI|Jbn15&KcJXEp+UH?%8T)7BX0 z4j!U!sxd8Qz`V$(FYrSAgA~0CzQ7wcEB&L#5?kARW9H1dSp(y-Ze$>HhQ?_NpFsbT zowhFUjgJ7%;8W_t7mN>X!7=^?1!4ry5;%l+u^r$`@B$j-SOPMv1{rO zuVQZKE!sk3=uhT@jz@Q5tHi$HLG(CwJnO|aLNB6g=o?zb7h*oxA+(40urbhA_|Vw7 z%njVo2Qmqr%9`mLpbVW3k25E1eAbF>1U|tH{j(SJ9p}t9835+Y8o(R<&=#OADdVEQ z83#UN{>+cM;EVUX>4&w!tMESd0{H;z7&mUb?5XhG4D1f_r2iZJ_~d7-$8XfO%p&GCuucuTY14Xb+l@tT1~;cuHw)ujqaI>!s`a z{QT!XKP7oa@16gwzWuSv1JN$e0P;J&y&rt=!GDwPOMzF>h&|&;tQMX_FTwlRY1%jQ z+hprI?0wOo`Pph~aqSp85U)6BUNmC*U-I0Z3x$qk=bL{i9&CQ!gMF4wX+ElCgO!s? zkHNd9%aIBA)9^liJba8kL*I!m%tyq(#gD*eML(e*kZHvEp{<1X&EG_4V}~X`6-%&?OCRkg^L#u~OMxQb#Y&7PKf6w`=;wBDx3{KJQ%mY5dhGXuGfz8e}dx(6J z{bc>Boy92FGh`=YU{`}vWG3+kcptgOI_a0Wqlc->oV7PLKJftL33LJ883X@|_0u=} zFPUQdiai6a=nLK_t^%L4XV`F(jm_u($RWm~47rKi(R;VQ(zB}z(DgB%7oXK>xAFZ^ zeH?Ja8K7){uCke)5YAsi9)o9OE%b&iKvt8-9`dl_?x0WR80SHs$P{RkYjhF7J@ZUx z({v8=!ma@*!{%Ww(XU3&F%GhUb)k>qc<>^1;cMo^ys5*y86O#h&IMQW!Tgvf?chPy z5Zi!n))w)^e5p@8@+fDH^a&te@K>;_*e7sDIqhf@$H%6D@0bHN2x%;%9&?FyA9JN2 z0DM!%SR+R8oh;&P11&ZH4j31}R>z)TE{x3_XbWDz6Zh0Ja+QQ~dq~#jGp%t`@(Q_s@2AcdYvTX!YQK*`dS$Pt-R6E)$*n5nCI3E$$0; zGj-owMGq4H(>b-Z)jUjxp_laA ziuQ~Wab$EQdIkGi{N!{d>lF%_$$O65?(iYz-MPq<^Mw)784LY zEza_ZPn?wc;0Hfs{yp|3b|$ihm;kZ97)Qnr(0j{2l0QFIzn5{6^woRd`F8vM=sNyr zG5{X{eCip95qb~cE7B?dqkZ^^^wPJ*caMs$FVen$lRbgodG-%};@y7$y5W447#Dlj zr;pihraR#+^=aP;A;p$NHsGt{r#|}Vqh9Y;d7aO|gQi!J^Vr$&68V6>oovtBiGIv4 zJ?*qp&2NPNp~2g4zuoJbYjz&>=}&*!^f3I5j*^XNbI@-qTVMF;#01bOyd!hpefQb? zILo3=PEM|LGT+^rB7I$Hx(yy-E%ePe%!zMpfD>pPUZOqEzA;z)9&|G@6C0f|X#3=o zPa4kP+nSmx`395adz6?x0B&gezyl8$P9A;qG4cFN;p!CG+znpelJrkK^^}!;;R|1| z*ap5kGFiTx;Szj4{q)lor$BCxA3sjETaEN^iNz+swftnS^B%8raElk9x3LMBqt3{@ zo{O=*c;2Ufe_{n=Egdvyu+=cJM3k2s{H{p=;nV(c&+~H@}dsOTqse!ukC z@1(cZ%1^1(x5^siFFq%E)5y6a@`&dK;B9PV>DE`&*Z0KqC4r`URs;I$7A*mdY3g|&tT_k9cIgD4D);WrV02E?b`VQ zaS41{^u54zHuev;t!!`8>+%CEuFZJZIp|X4qU)M%#J$=)C;5 z;0WAe17t#!vGN7XHV_YPlPz$+bnWe;v)dJeyIu5pr{Zk4DCSzq9?@R0*c0?yhG&Tv zH>vK;f}2$DCh^@Z;_>zJ*}6)e=g7v~s{{>8+vP``-7mq?1=_jB7;K zR{^5?%cPqo>OG~C7zdkAa^@qF0rhIXM?7g-jzSAAZh-&89W-Mm-4y;U~ME28gI z^y5XR=8Hm$vU%-11G^KS1Rpl~#Q3n$N2eU1KK1ZHpnV{-AIf7Hc2F#f?dSuYh);~o zz!><$*yZ@XaX$1B>tRF0@#7pQqb*}lm-r}Skpi7NcM;F?e%whZ$*4bQP2ZHC@>%(I z{O;T(vQegp|GIHDrtj6At9RXoitp+qw{!LG%h|8I@(S;~y%#*o#(t-snK_f^^s0U`LQ0U;<+c# zwsk&bjDc)noJbo{4rKO0Tl%1mzG?Uo>67nEex!(76R$=Fz|+L?;J*mOrpSx=@D{** zj9Zb$dhwb%ndPy5Wa|ryUS=P$A5!E|mo6cOCV!h}4qlP0`I7Yf zld>7Em5sDOwo{q-`Bd@TyTDb1DElLRNy%$n-nw4AC(Ug8w_In^QTuiHHV-nCz2Y5Y z-ce|WBjW%(>HN2|?DQYWwzc>p_BnBP@t8f^B3?OSihe#?ox_zg1~TT2^znMzGM;P! zi;d!Q5Ql^Jm2bZ>FJJ0<*;I@8jd{h*?VPNgj*d)6;77K}d!Z-zFUA_*YPp0ylkLho zIUnG?B)&7oZwT;RVZJG@xXU^6$2+vcp*R3H-}uHiddtTB8NM#QFy~(Q$oSkb9*6H7 z&zD-KM=EPwx2^lO@?KA$ueUC13O0Yx`||fwimMs#%ij5n{P+WkKdx2mag<_jC49@K zopuhTolKlSNAMeb$2-CBA@2nv2e2{U3K@X^!x(&DjPd!+Ao*FvdM~%nXFl_pYQ>G~ z^juZHc4!+1;72in$%-TVg7_G`uQPQ!OOoGg&o0TwK4OZ0eY849D}N(>yq>o5_wD>l z{=c0uDz3&En~S`!=NCS!SmURKkG<%A#quU7{yw;!e%hv=h!>r&)G7{DqjQbE@E?2# zKk}SG@=W2I`di)D74SVi8NUsx7)uqu9i+JVZ1#=c5L0Y=H8Q*%+Qxz6_iOb0+FtSf zZ?O3}%OXBaoQ!8jh}jWaJ09Wn&MnqQRuKE+o-@#>_Z0*9s(h0#;PdPGgF6+cy-G3B z9UC`p+|W)xZPQQ03v{G2o{MzGv>5*5w|wxK^n77=>;Qa%H&g#}wt>D!#^^kG2)`4m z=e)NlUcOKI>jrE$#jOtNdD`0mou}R24u|4E=Y0>!$A6VGL(anG>)W%nihbL=C8W}e z@QI}{Ki*T;IV>>A^AV|2sd}M)6JoD15P4u!DsLrd~;so?qfQD%t!gJ#+V4 z#s9trAOnc`>zv^8dZyrocG@{2?HF&tXYd<*2mc`xbe_CZziTx^?+=#~2Ot*sX7Rqx zS3iPHfqfx;zZE-8=d;fduND1%T``?+%69#RVoBdRS{mx)s%}r!JxrRbzIv*!R%tp< zZFAMOXObS$*Wu@JEOTtVhFq;pzyJL$AXjtJdX?t3NNqkgkHh0Z^!^?B_>FphAl0i^ zsqfLfhu%Z_DDMh7ok#J$;StlfsgBMTo$4Pkr7!B~Ow0Oy+uNxBPP>nJ)M4Ck|MrZ! zvCW}rY}+E$oZq3o)SrESq^*>(#Q!|M%zIbAga<|7P%hW8+`n^ZoCCzso)M+_h@{{5hYmtF8H2L4Mw!#0QPp zSv{HrjafaqTiT<0wbK;ZblupkYnP_(-MTh*Robmv=floz z<|)n3&uc6w$Zrxf7UmZ;6&DpW78eyZl@u2@78e&am6nz?mX?$>^(rlG)OAyz-sO$e zl~u3l+1ym0KD~8LuXjsIi_PB;@pIz)A;vFSN@D+d-$b!;1H}bIXL{BrydNVPuxDvB zkLKrkI7({?gzgMobUt?WeO%wTg#<;1buBNfNx~8e7wz{#Vs;Wt60*zHw z)k-Uy*&R#r4sRaQ1u^zGYJSy9m_UD#An(YH}{LsQ?reHw-9CgHfTyu7TbcX?T3 zd0DR}Jr~(1oNHf7n`CF$p6FhCRBU@yqCG1qVebmGheeG=Mfpud1%-|Ig?UY)_r`)e z?Y-@PPGfE^v;a*6+7P`o<%mW|jW4o$G>LwUma?*Yh}OC_3D=E!KD!AJ4QM@;ntR{I zg8UruNS9_B75$1=M7v$#lR(4WyLJ1kXycDXg?X=(lob3-H1Hy_0GXk4qR;95#JhBM zyjjm+55w-)b0jCeQQnvQ_{i73`sLX>wr~Bs@cvq9vA%C7nk_Hax7>P{r-V~om!){# zRM#oW%F0Spy+qT!N=s70tDYe#NtKl7Ta6{fDdAK!1058mib;!$QsNi#QbnRq<)w-W zl@=8!%|9eft{>(?*UPwx@-@2|AK{cfKhpm#RB``ddf(KZQ`K|2 z;WzC@DlWjYx1&b!yPf=2=V&)}w0>hk@BfU`^TOlCjn}s_c{g>O-sRz&yyNYi9{FVH z-|3yGZ{SUAuyd*08PGAX<_Y}d&<#FM9}&E&(kRX;9{ z(V%CT>h)c=dOcS?LEq+)-I(Hi+HvE?D&_Yw#-up!96dTo$Bedk$mr3dQls=-uOP*< zyCd{|qSBP%X!!7y@aBgP8=B(%#bHW`oemv3BsF9(zvnVo&vp;=g9i;v4bnS<0|yL9 z3Gdnme$%Lb%2M`3dnEaj(!S|^gIeuf*uxsV<4{vwovNzV-fEAlDs9hg-zzFa3zdCR z(1Re=SMN7MBgphVeach4dnf!MJ}DPXl_`}BN(uBnr)a3EZ%X_F9|fKfJqBJ0v>JH@ z8ipSvds02K`5m<`K0B*>s;sp5&!X`kiTA%n%tSuqy?UN>`@Q$xJ5tX#cIElVH_H3+ z@$;4~UGiIKYLsw4LGNQso}zC)&CvUEGxZIOSu-u=dgjdO1~XJPWBN2b13uMHpB7-6 z-bI-W^?$$EDrz$Cp#l7MJwiqTVp=<)SHXh+-FS9AZ2C5YqOT#|X&95qko zJ7WglrwHp}J+o$o_068m_oiq0Ir`qm+&O}|z#Kmhm^atY*LSoR%oi+}uV>g77%W_< z-=Y;P((~?%7U^9#VDTcqM9!ZU%Yy?{f?>L*I8}v?5th8#>?;W>i|8^zkWTi-f!3dY|y(iz(#{jN_ig+ z*t}`8z4M^w3hkX9#f_U&-XS5RbeCcoEkxKiH{0iOW)1;F*v zWdZN(0l=OZXn)wJMHepA`v?N<9ecQN;R3%)w&--YwN0=vt}1!@p#)TcZ6) zr+lOHLhVyXGp}P_Ow(=D2YoGFobFq5XRKsQn+tQ&{PfQ3Qmt>f%~|u;JF6?gS}t1A zyf*P)T(cKG^lt2G@!lE-AFf}wR`1TN745Ef@SkYeZB)8>(?-3Ay3udhyh-oQZW1qS z*0(M;`>ld)+qSxG;*ae+w%NO^JM~`9jvd?e`vW`moyi?~7jKt+vvSX#-EQ}u-G0x- zd-U#4_+4_o4a)mOy#IR1C42Rr?WIoVta|_GGN*TL{T2E)DeofbcM04TS6t3}MM|&G zyQll?9b(Rl+O>$X$9Cw28T*SM=l1&S%VkY4SszRL0r-}cI@n#YJ^ zX&#w#vAONr7v{>GnY+N&64rF7y-R%AWtXsKTle0*7yCm!$t()Ce$xdXRbhN!IK5za!y%%+X zUnx3-SD?edE8-9FO5hXyj=X4jiTGgQ1@nAE{X|!$_bqdBvQs^JbpMY`-be4l`)`uo zFS$f`-lcckplk8FzLSc)l}-|mtVBnN&*6ESyY$!c72+wq`?YMj=B{@ymo5|ENzcJ| zOO}c!rTgG_VDS?1wcZzn-dHmZpMph;RCW}gUUNJ8K@(S5zh8n3xZ+A= z#FZ^Uvf@g?KFJ2;Lkrk9VW`9TzVt=e& z=~u%K32&^D4RVq6hj?EyX1msVxyeq}%R8gkF^fc#I;S(bh2|o!7@tUA1zv$>(TAc{ z$%BO#%$E0Z-m(EMuYz13RhD)hei;-Xd3 zl^5x|&w8hG#mZ&yhFhU^ESC&3UedR+ZB5eck^j-v@SAwvbhPxj>3i|6gMVdv9g;@g zzwp8f^nNS0S<6(s?o3X^wu{w=$&p1486duQ$N>6hTpM5SvMxm)EnDnNJ}qD3kXMpl zS_8JY>;m{+YgxfsgPgNE&|GReVbUSu#mmJvTcJ7iruv7YM4>o~l|Ki=!ccj<> zd*FKq|6i)T+PhbL&%I=Tc;9rWcuG1I9UAoN6<5ecxFXmB=v#R6%6(TRdU&7N1Io)t z;oqx}3#R8SP41BwE$g_&t&(=ZW6C!Lm93Ncj9}qsf1V4`$5ldlig)Dn8Oa+%J<*4 ztoQ3KU+$LPG0D$=cA%T_HGNC`dj)Rt_p|+^@8!5D-_7;YzEYm9mRhnjLt#zJuNexAn`l&@*{ zFuPB*fd1!N{BQany^qcp|C|0#^b7hw@dfKUvj|j zli#5!|Km8!0p5?0$RnE@b_yWh#p}%4zIDR46OdI=?_=9Y z9_W6L^7q*{84eyisQUZW_7bxJz!S0n-5+fzPP(f!@mBd?tamMdcS79@jQMYIx(&P zS4&4Gz#d;K{mJ)E^!$x|H$*&Y-)Q0YjCX4v*Kb^Jb|pL$b$`^8#w%tk2YMwYF>&H} zPkcE$E2{WW` z(Er%jl551e6mL01|C`;v=uo{M`CqY^HuZkA0}innn)QFME#QC2PzV19{eK~LzvL`F zN-{^;D$AGaK12VnBpxTbhV_~LC(a@Mm#t@ZknDcR|Fr&JPdos-KU4oF_CGNJ?8{AC zHppjx{*t*hzE%pCi;sEIXOD!&dzDE`W zT^f9VE0hQS?;|!4c+hmRc+t{*(*N+kcr`=s2fO~NE3dLTnfm`q$$~5Qh1kKqt6H|n z>;qnh{~5>Z{(YCH^*{2!Y!k^QrT7ZB+;X$y+d&UM{II+2w%cSgUuo+wd8coK!vD;J zvIib`(A{&-r^Wv_+Ir;^nXM$gw-^fgAKQDo{3@loHolkM59x-BSNTPcj&_rN*4d9~ zJjsnno#+Socf0ZaWPiY~aS!_|{7m1~4@|wwjrrZF{(=WaxYZjk3jRKPq5U?#F#R9w zLHHk=?mFquM;?9H>Df5@mXTzDd+>n=`8JZ%bGc^U5kr!18F&R7xtUL-n-V)2TNNAG zcwgraIvZ}m`){V+*LM?2uG8Ga`{oZ3%fPn{GS1?CEqt8l{~M2(?~ndZeE;R>(>CN< z;{TiP->m=f)ieG6O#QF2qs9P;5ggi{SYe0(BzA_zi!lIX0{8Q-E{D1kY zLH{duCH;@@D?cFd`SF9%|GTC86aOFmFZ;ix{n(ElW&JTXx~(VPnbJvyExJP zvi0?SuItT~Mg~v^y8s*o-M=H)O!)qiqlQoU59ojF006vi-YMOC^K3u=g?@g@53>El zUv}^#e}A$c`}7y~fw)J7j!U?1dLz@W_BC^v$#f^?kEjZn?$m6xuD9Zm~F-=#MiA_`ikkZ#Mrz zi~H-${Vmn|KmDnA|GMi$C*pnCF19w-82MlGHG5Y!aEx&T{#Seq9oa_gFEgfLb`5$M zc_wJK`|;DwS5IPn`VO9*nJLBQ(RX!}>ik7#Fw*yJrVCYXQBps)ZH@=hcZM7w2EZH= z-zvy}Aa_k(EnlvE5YH!Z3|m+5|AP;JUkCqV7p;=4XCJ{)wEr_>fU*Nx#sJ}eWP$K& z=K$vabN*)M0iw%928jRhV`U4N-@7A`0lRnal>Abvp!+Wq|6Bi>Bjwmb!6(Az$MzThD^}3j_BUAz|4ZI( z-KLn|PMss}Q@r=!bieqaG5&(5^n1}y5AgG!8R!>2HPm15;3&WJz+}Jr(hL3C&8y_o zaqcMIhvzf-BKpOO10Wk1_eOnNPWFp^gYdcMp4ImfpYV6zbGOC+u>DpkE(mWdLq}%t zKIdyo65x8VVqKj1)x71r|I?EF!acDVomH7^!eQ{+q zdXNvz@xX+a%{~|JCH{g^<8{vMOkT7|)BS~*BYInThn(rfc`?uEw}e$AO!-5$mG zIoo6XyNHD*XMDs4?c7u{lXFz`J~33{eu>U+_O;CR-@Mi7T#vZF+o;&zhHW~(-6p=? zCckd;O21Bee#5#AZrvKia`Zcp=z8gV;|J}nd_U9ow(lVZjP1W#XM$^O9>mUWzx_7Z zGIzOK4<1mw{L^%M2mXK%61ulE8ja#AMi~fB^cx9UQ_Hwuunm&9AhAK7!AR@_&eRm=G#_F4a>)un zakSts#-E4NbY;*i`ix&!4>6Gi1U~xRvjqR|bf?ZGl(YB9z9bVR$*!GEiAN4!- zOtkUC^CZUKX4|cmoL{?km16s%g>|b9N9)(G5pIa{tyP@Q_*>7kthaL{o^1)X{zl<7 z#G8Vx&u?91ob?gwlgo}f=H=DdhN9;6P;()kL_dLHJlf! zJ^jbNqCFADOveV9A7w$-ATuOW@Da>buxA^z&UpT>SfSQ#@jz?@d>_d>uvzxj#vOj!CfNs@nz$`s`)FX>TbE^0N;Xk2M*k#Z`j_V z`kZ<=0*3uDkA9 zFHr0QI=aSP13g`HwY%o(t1P`58WHGTXG}bgvM)(><^;V;h7x~PJSe2`UMaLJTGO*A z)Y~T-Ri5HT*IaXz^{=sPJjG;e{OhhGy~gIlyfjD0JduMpTz{RrUUS!49BW}+H)&lr z-E^bAiyzi~v*OaksSfCyz~JS;Ew>0y2i&dt&hM=UZ}kUnyVV`M?V!K?w%gntx8E*b z_I7vY9s0KSU3a>>?!43Aeb-%1;P1KTZpE+e=9}6&AG*iBt$p8p_qzM;y;pJL``rEa z-R~cK-~o$=$#-=4j}JZcuzTpChb%sZjrqtUk2nF}x^|B~YANw%_n2bNdiTRU{`eDo zuiJj-mQ=v^x0OC+Dc|CL`st^gz~WTl`Wdh9wJ0y7y0-gt8uMeCls~QX8Nt)Ewf>q@ z#(C%|(PW*h_hJ9=BM&>)FED%v zCx)l{6+2Y?&^@5I`vVW$FC5-yxD;OHli%y^)j8a~_eOl*?3xybiZp5@7KcnZ(*zt-oN4c z>*0N#eKK9YLwbq(8?M*4=0&%6iAI4tM6=*TbPPWHLGW=Ajy3xA=W)?u;- z`IGb!WD;^oTU*G#_@%Fv`UeO|O-@W(y`$V76>izeNUd7kI zgYfl3M$`Tw@$|z9KR;shZ@l0iee7{NPkQVL<8S}Cd`o!Q`01&q;c5Sr`0y#?Klsyl zROz$+nP-4!1kYLe?6c2#eH+3*``q*LRiAIZe)idLPu}y-f7Z&LS1il!le*7;Ho5<7 zQchjvW%l))+F1YUFO0>w5uTN-$N<#1G9Nx;cnG0B(hr(5IrSpjSQe z<*vK#@Yh~Kvc+UhE2X)P&z zRVb~Houlij%5bf;x~h*?JDW#H`>HKZfX(jmGZ+}{ryGQbT}{xIba8#KTVA3D(KTK5C> z?#duHe2A`4Mo+qVz%*f%^N9>Dq^oU{B z_elB{j7s_+IYRvoCy!LWC#HGXe1rh3DNx)Dl8l4=bjhU)h+hYivCbglI@r$h8R zY{J8^p-P943Qt1^xuHV_8lHv%I{7kt^_b1d^buTUajY{x9B;jW%4&BH8l9FZu&O-nIH9)dHOBL!n1r`(K)`Z z_$=L@;d}Qy&6j7N<|}hg_qF+yo$c!i&sM!NeQklDNWiu7$ZsyAp2}nWI@PHwR-XE; zD?Z2fD~jXj+U}K>0Q&9DQbF;#zJKXC0@4n?zsmaeI@b^AbzTA?e?a;9eqdPwT=x=? zmUr}nfHFbvPJVECCqJlrfg%l4xL)TMl61lq>y7ODD8?x|0|BQ#zB&4D@9Xr4A7rCLk459?y?!?f066-gTL z04{`=Aqfnv(6vE=yS_?=-@(FR8Up^=gF(GJYR?4PpMhL!zu3oS(0&exp#AP&CQ#ZB zfF48#{QzCpi8g9PYZW>A9iwii_@3vT|BYOYL(se%|>f`Mge_@`YVa z_7&nE=H2Ox5Bq|gu8Iq7@>j}dn<{r#W()58tUS^Zw{~oiUpKDAts7hH z*N-c8>&6xPb>n*}E%6)1m$~&5O8th3Wp16)^%HvejT6h=hKWk+dn+xobYp$F-_+2@ zZEPs_nknSNrWVbgy)a(rq)U{kEBPPI-R&%o@LARzJ6WW}V+TyUy*L)z9zJ{f=4v z{jNC!obvpxxdWW8{qDH~E!{PLpxdeYU2_Ne-SY-H<@-HKx!*Hyuv4DjGk>sCp1-(N z8uOdeHtNtO^r61zsZYBnjbo7ZXFeKVbDFEU&DR`flh;pk)STz_*Bbh1O);(0eQmN< zt$S9j)?5pIz=7dNcnLV0o}|-i0xpHq%~LDb!^%J!J<4gToU|cV^YE-dbGPKAo7@*%c98loq z_s{k7`{%oPbxH>$X}>%-w=T!etIKn9YO?)o!Q9$hUHA0!mCmm2>F3nuxH+{-YjSj- z?dMeMUg=!j&r|*RluMSYjmoq9>?%REu9ePJ9%XZDd%C%`*?wWaTz6sro__IQ@s9Xm zwG^x`#e8B>&P&nxm>^17TYH2gdF-4Bz=#!^gJ79qRQ$8 z6LZd2+R30Hx07$sTqfmq_LK5D`^kA-ly>ry^ScOiU(nT00SfhdZw6ibw8CzFS`pAy z(A`fj2D%A)_!%WV{H)Tf)U00FsafSc9WWax>zN9m{VNlc1KRg;?YUrXZy-m|)6WC? z0J#FuPepEOUf&!)pR^*+FR08-&F`D*7gpt^E~v`$i)sr}i|PvelKw?0fnPeHD7C0I zpM2_g>ReD6U}1H>zpy&bF9eil*Gj3kuqu>YsB}>c*9CsD(nX}|Ye`L^Us6}-mklWP z%LW$vm4i$C@_|5cYN^Hs7S$G}7S|P~meductc|W0)fPGR}7F?CVtR?^Nyc6d<7iXkoHwU~&PpAvysH z0^Lk1=w$TMkPkftnu69My-my&jrTlXbQn^uo55&TG%wnp0R6Xyo@ssouLcg zP}s$2qh7QzQ8ZGY&<->tdKOJ}7HxGh+8QSwgyzPI_KdzW>0GorHuGM*ta@%tl8#n7 zCR_L7kBqeWdaTNj1MteYW}boWMcW#0mS{Hjw2%7So}Kgz$x=JV)Onz5kiXBjM&44r zujlzWx8uBvSRdc27&I{G{eHRUnXYAyQu@xkg4Ph3}2` zZT-lLU<1&P)gjG6t^^wZ{cj-oi{2OCd-xt+hwmpMuci0vk>A>H_Ih%DSMj}gU)Q3C z)Kmef^g~KKpOU^O^;6LoqOa*?qA#O4(Vb`!{tx^u`h@>Y2FM2JEt?Nn0Kb>@H2n{+ z8^4$5c+s_i@q=`~@s;$yrQ*fFZ_@pNuR_`vn;<{oe_gAOxqSuL4JwIoLWEd?9|3VXZWpyPxU*7o$PlHKgsVM@o|62$d9G=jQC_~*RW5e zwhcWswR!OAs&{5;b^r5Hi)*?y^Dlflw?cd>h&&&8yJbE+AL@iQX&DgjV}0X!_`a{n zN%&kmFCI^Lo;1<%=y`ZO0r*~fBfdB2rF}EL?~$5X+Cy?%`W@caJ|YJuC%S&J^2Phw zdjMSz--{Nc>&5q?8|cOKhGarWp(F9W=t?w)P7$p^bI5=R(7Nc(Xi~Ik^sZDqoX|Wp ztU97&_#fJ)EHiC!os`A8F@+DtNv_P2oXQjL=VW!#voOp2Wzze+BQRMpx4`>vo!);r z&HMHo)O>xngzrohi=PG+c65`3AN1=)@#jRzstLl2rQ-96(#vKKp`UecdRnPnOOBC_ zYc30VzPS(6<@8D4vbl1l!|^W!+M~2S*B&+GORsDH#Osbdogz7Jw!P#(ww~-h=>y|= zH?^dP^m>4xL$bu%=$4>g?3#PgBs>o-nhr7@uY2@U3;i$tN5A(Wl^@s_y)7RR2)Zz} zpdvpd-57MOY~O{_gVMR=2c2m5*vBf9jZ7KW;$`^-*x1o}|&A9jZOGkY~vf-4}Mg2O;K7e0a@^{eTtdn)8 z%eaQeBXA!;zO8H`0NY41(qyXnRKlzLr zPIdtP8uoxv#l`rSa2Pg`5-c-qgsl{Do8=xCxBS;otBak-RilS|3 zOCTE;9V1)ZYy{CFspLVuYy{-Q#Jr9nP559!?)eFgC#iJ1=||{3xfXvUywNh1UNf6^ zj`V*1X&>`>S)J`!S$Lo42PZYu>&ywg-;(#=On?97mw#Nsb351R`4-+Qf%gaN%n9D_ zFTFnr`$%%mY;Vawct83-=y|Tq|F={+om7BN5U$U~XGkIANF`rW6O~HVrh?o}e0+^H zLAo9NUav6{d7YA8mmS|lsqDG@&M9oTNlLYMsfPTnDYNt0&jhdou?Ye6gvkQw4cU_p zI}&+dbY=V>?foDFjPBrl)AiE#qR&~T`vc$4?xT261o8fyzS7^~|GDUK0s0)6U!k~? z_;$Xo18>9kh2|TZe~gcuz=ethT&U{{YYOEz7rLd2FKrlnZfftyPp0;df6p7@@z*0G zkOx;d@%^7kbp3@iqalCNMkf$Rr2qg1gP$$**I2PKN#NCr$RA)X_^Hb?+p zU@HCrb|JpMYyo_Kd;@sj{C=h4Z;K(p|Ii$Oy(tmb3M!Tj?<+)|EupOP7?3e9>V)?W}H9p{sDj8 z{{8mdg9Qub>wI*uD^@J6zvLWzs5#3QH=ec>S%%$@Y%^OQe@JVU-5%298h)2upOXEQ zQmjL~eqL(4$;yuKz2sr1)Od{{T&IXB;DZ5@uc?W7;`6*tX^`%R?@eA?Dp`Pk56I7( z)PnZ|{|DX={6AH?VXE}R^a#!VKK>`XAM}0D`S<|vJ^DWAd}u%F{W*!wH{Lh?hxZE- z-X{$ZWI*8|{11;4CnK(QVNH=!Y|L#Kbbjjc(H~9S((tzbXZ(I7*?`>HHss{g;_7Ze zr?=qu4Bk(8K9kp5@Vwe7Hj&7RBo%*~Z9u#a9K-M68{H4!3n)eB6Ays*rxO#f7=ZX) zaR7K+c7XZ+Q%mIIVe3WzpBRATe((WJXPDlH-y4dgJJ9o{OT_E>U7P{+q4$^~|o{uV=J*);aM0AnE;XzF*F{zMi!PzHip)L7xZT z9+|-UEfy&J#8h>p>xC~;i{pvkLkv%`7Gik9D?S4t8y|cd$o3Nc1&YyNa|!AbzEAUh z2HzY1cgx^?@j5zR0BxB4Z!{yjP^s~L!uQi6|6^Y^$NU1{N4r1R`guYBo6V2D4{)f? zKa}t1R~E_!fd2(mI&U)lA9Vah{kyx1M}8`Gm+A z$U(c$xgU#hpJ&Xl=GuD~^!pw-_kNhawJX=&d;P~V(j3$4xnta2+k#(R&gWOZ-+sS+ zOtw)kIcfX_@@_Q0)%}$;*AIW*Tx;GX%oFfq<^)=xEi&wPI~F6021 z6VMnCaiHb{p!=EwfaYudk2(*wnJ40vc_Z9knn$9)sj)x&esg~_rnd|6E_3>f>s`K! zzAkl-v3*^Q{c#2N`Y}HjKIX?*njg16XCB`ot?++T`}^fm8F_xrir~Jd&p+=d%`iKe zy-A5a|C!c(_8JZzJVf`8at`ea=#{z;{?U_QpY;gxotWQq|GT;3bwS>P8qe29>l@^q zuNAbOIepp!U7mmFz31HVZdh*wKVO$}pUA%9o|X%2ald1~I_!Y+_wTlTztw!pymAlT4fpp#@9!TG>f8+bZ9?;*1_G?a1eSh;Y>j7#XkmogdLgs+zBiwNkc>rDT z|4+VgZ~2qFA}+uxcM|@=NyGt&A?<>{3A+H_lRhtN%~}V5O~4g)fS-eQY2A+6&3KqL z!Pt!CEBT>*MoTqO?MWNhpX%3v{R)QtpDg>FNBzIU{#f?IV{S|jc^ms^UwZKc z?W(twkbP=2pBsH1K0lY!bG}c~m7LRGf-kSU^XCxX<27V`h4s5g^R4#7$A>K-=WZDv zzcFhyT;AW0*w_4xkM-ls8~zRVWZx`k1@%I00Q~?{=WB7liTj=Qn;f8FKe7RaeZzk> z-0x2RBmPayA83D!fAlLoTlVCDdVfAE8b7va85!Taj7(~Ij!bTKj!bBAj*NSwjEs5x zf0h?aWrs#II#0U4c=gG*AFW_ncY4oQz}f*DBcLv!-_s5;6Y3bTWpahgokpMMWBt6w z3g&0MT?u^-aK%nNATsy0IN*0dG8*Lg*a++6MVxbJoO z!*=*Pn(M242WDY^f>{VZa*t?_*r)y*AAtJr_`e6S|2-uiKUJY* zK)p-;$IMS@eU8k2=UiFz@p-c1i}PiDw+m!TuM1^cpHr``_@0eDE|AqjLE7vk&f@-i^Ey z>VV`N_cN}yoos@IxPg5p?19l7Hg!>BVCD$)F=GaNj=pdy*VfQ|`uwc%bwn>O_t0@4 zee*Y(qQ|aw68mS`=f^%%us>X9pz_>;mtT5GYkW^3r_qG|3^~UC&ODu7ZN37JRlk*W zFs{BmxmR5eHQs&B#`k#5)J~+}-pBWh@mbsBvbjCY>uG$?9AA{%*FGMb+drM&JKaxW zKT-Rw&+l|UWWO~upWN%R%sckmf_t*h#h#dNU%ux5I)6vap3(kXS=RA<+1wL+fB%Ps zbrC*3-3orD4;}|=YwrtXb?5V83(iwNA(h7eC!ZTs|04P1soP@u?HD#aLm}_z2?FDe zfA@90T3g|4hVvPed-@MC-Dh5qH3hRYCrI9d)$#$$ywiMK$vk?7m@CkQJRx{D%%g9B zxkJ_arqF!E1X!puVWAFyn4m0cO;})FmyKIh-@pQ5TjT~$+Flov2L~fAFK%r^l1^d-1m&ZI1!#?)=moy{$&m^;dW_5pGjq%unI(+z0ohkM%W?kV7B+d0bS?MNe z=yMY$x1rBVbDDUL;2ic0%v0xCuQdE?4j+%H`Fw2r0mHlY1dx5@-p2Paf8Q{#`91P) zx!1fbbF(hD2lgZW(Zk0$-^cn+=iN2(^_$nMg!ews`;>lvg62OM`TNxU|AhU|pSk7a z(Ep2CJpFWP`|>X?kgdHhlI>ty*AIV`?Wb5f`~E?8{TN>$bOZ(%Bk-6hwgJuSc_)OuwV4)v#$Hxk3Vww2%U?> z`IoQY%(xn;?>|-L))KN$z7uU3@*cEbW-0sR-z>wsWnW*9NawXb*KtqgVMmSDzNPqzBKMle$Q|pX+L|w%xcD75B2vG*!R5C22|D+#`-NEI2HSW=06Q|#{8CjwE<55^>wU^jiYshHJ$$_t?(-_w{zYqiJb#R{lQ9FTqbc{ce!lbljs3HFkJm;&)+=5k#QnOg z)`#)EvQPe1>*?!5=j}57zR`N>{pq+@{w?=f+h^~W=J^seAME=$zY1!7A@^0GDG8eY zQ0eTyU#mjNAoRzwJRaJ^&a%PC#t{?|Jou8SAH7w#U6Ca)xBTa)ol3>-8DtAos%z zxG!*yUvuGEu8Fz6Ga2t2_9w}RQPBNfy*SGf^A%nxsZsR~)c9`J_?~^aM)%pe zIDmcQ>qmOe=c>;c&pY(<&11eMK`qZ}Kl7a?w;yS~i|>{DAih`TeViZZy^Hak-ZQsn z@_Xp#VNZ|k>+$}+`ux;;qx+HOgMA<88}6expEdr{xWBvPi)U{-$=@lPrF!ccQy?pHWXFiZQe;4m-p3mj`0{@@BfM*`se`?>~vQHMYwtaia zYZbZAC;3_jHUH+g|0`c}8GU}tdjVY(bt~%5#vZ z`?V_Fta}+XUSaH_IezH4*82F|%yP`f^xkpqb>4CBu8f!Lf(>=Pewf=M`!T%_>Urwp z2l2h*-ud{R`2_C6x}NvW;?*|=Y?C<(j$btI*mJgHvV!fOBe%1hZ z)i^*}LHDbw?w7^P_l}&OrE@@Av}l2SHP4=P-JgURg`-D~D(Pd{fAv-9KG=T}dljv} zZ|eGt@4+%-{m}1sHo&lNV|#p`)BZ^Bqt_?Wd!zfxJY)PI&PPvHjQyylXLEa++YjRV z1RtOLJ3rrPzG2_Q`1JLY{C)NLE%V;rx0>&DAMCTI2l?vWul)5t;(l`Lb7fU$GM}jD zhV#^X{{`%twHw#n1KheCkK=3W(w}AX#tmj|GS}ThZVbN9{H*(Z<{H?MM4J%W18)ml zEON1I>HSBU_rdx9QU3t@7C)_B9(51uf4EG(KhX~O7=U)bEtd<_D{G11-|Zn%pMdrN zyq`k|K^M96qpZ}-+YtG-~|4a^mdA~5{XY+pGUiSi#f7Lpxi_ZTKG!lCS zb^k9JVqYBN{Yo0|moMSjpPV&|dA}vCS~bVMnq>CRsP1F`{v^yC9EmxVeK4Ds=V-y_ zSKWW2(v6y<)Sf=g`N6+ef1ZB6(SP~?k=|RI5O7ca&FgU*?tP4JYI@3jz&?63?S7r) zoIW+*=smBIpP$IR^YOKpN44I>_l)s%h5o*;=Nr9G)O_Zpe}qq4n%;$n* z+5jK_o0@?70IUhv9sukqG_`+?{i*$?{uk*#V*zmQwcpqP!@lKTV}7Gu8n;^gN8gXp zeaF6K#^^uT!QK|#6HNAfybs+c`KVv=j-78A?xG&7@v02)$gNgr1wVm zmHU8wt>p#&ewfc!t@nCQ-4APek=~maKSg{Gt*4(Ki}Ss&&v+lYh5fDr>iy}oJ}>>^ zRh|FnefYS~4joo44>%7PH%$Lk_WYcVH8EASv&!TE+Xjn_*Wmm z`u=1_8L`YLLuP+mYwRU5dH(VxUv%ok`ShICThh8^3+$@42Vmm!|db?=`ole!h+G!9Df9U)|I9(ygRYdlcBTJ(xupMmDL(#Nd=19OTx&UZ`=Ab-@`o7LBbN_e1eN@XN_leA# z=jxxkz7~#o_Cy&!$=J+D@0s5Z*^m7EWaf3BPKV({T}%=_2-j$PszIHJYak9Rp9z6Ngs3t z>h|aA${2K+qz}0|X=SV*Bbn)YV=H}B+35QQU#-83zb^ya^Y>*AJP)?vuYrAl&B6a+ z>_G}!;Oqe65+55le}MT(#0AU0_`_*)0QCPE{~P{Y|FhW>6|s-r3D|^)eY_XQuW-42 zl%^NJ@b7H^Y(X350RsMAPY|`==l{UG$@vGpfV2TV=ZD@O>OOn`)&Uah{wD9w`_-+; z2MFta$^iLLeY9NY$GSJ>WE<46sQcCKg6@NTp5=|R@k-jXYMGM#Gac_wnKD(+q~M&u zk8%DS*q8h6u82JUO`7L-Hp^XOF}!^q5$Di)>b)+L|MXf<&5vl16p>kbTbTpeB)h%+5J2_jBLB01TAEyZ7G> zV=)c4oGa@g+k>w(oX%+`nX3m%*3TD6#$fP2^cuf1hF&W<8^=pdcBWlfdQBfy&VP@7 z|B!1WW6+-^YtWxWZN>B#B@6tgtM6d!4F7)ge>pqAD`SMfC$M(F+W^`*TXS63?c&qc z0-68&5c&T%ssBMAwCRU-+`HbXhaqc;yOxfBOG!d7aew`6T=K$$piJ(0%mr z^Sm>j<<`1QOU%or?pHpGvpNfFOqntT=go{QQTA~bb=}uqE2()m^88h9(L8?`=c~r2 zuwi^|rpM9hyMF8*+iQ$_zHa9Air8lz)%8^IN_*=T-vhJAJpHuRT!_`UUxV{_bl(Qv zM?aSfymLm6+pnvd|9`+f^Z1VYZZH1hwA?T4^v5W#?(%Q}@5X=sn_;Uo*1@OaI%DY7 z%4XJ_*Ci_>U9vMXBzxTu@PDCX4*rW|4EwuZd1;d*KQC7bf|WV?PXG0cVb|hk!2RG$ zBxmzv$;rx;?2NsVHT`+~jq@Y_z}g+P0s24M{}=H>%qK{)12$Lr^VN6_{wis`FF|kc zsdIos8(xSR!<+>c?SY7~@Apbr_I=)k?At}1*Utx^b6<1JGw&Dl0^8YvxOYtMkMr9! z2SD9d_HhOGtoixAKlb`@`F=k>h7Iukf55%tpZB}xg8bXqSg-2)pKOEsUE_Vs=qCF- zpR0S9Z%W$0=YJV{>Jr&Mle%Aoc%SD)@w_RVg^IIhKbF_(z9!1P)qU3W4D<18SksJY zyNl`FHO9QPi?oq;Df{|5y4;?7jUD&A;(f4on7SXb@8dV?$I+havhR6o)bh+6I9zQH zUn~0i-sex&edXTz`W=v;4)gY@9_DCy3htTZgc|K<3!0vI}v+_P&?O zls2d4zhB);F}w60yYQJFhEd z<+o|mT3&wn#U%F6WV~?_EZ!hMGCeOt%FcfUxohFmULBd?dDozvyO{^Hom9#>JaMqCf(FO}>e zmrCKTxl&wYYy*D}e_ugb!lgyDf$83(X1GV1JZ}xEIE_z z*POtXK7T%~|Ib;%j(zTfG;zN1_t{6G>|4zz_u+E-Z|p(n;~VZH_JckjtM{(H@AmrA zcMRF*ejl6(pmBdH{{6mEAM?Ww@E%WC8s|Fww>s+TWv<4@J-lCi4c#9yMCWCoYfTUTGi&)t`md~8f1k5m+^njnwj1aSnFdwr%8<6zrc_pP%ec)3arHX8Wg@8CI`uU8#XwUv13mXo|TVm{r0V zMz%g@be}#x?SS)POuTPwp2_F2KcBXMuY+BokI&Z%++$V}&(6>uD$H61=UjG{g8KMm zKh%7q`>e$#vTyn}Yz{|lfQ|D!|6t$V8zv8I*f;ze?#aGc)l0f#eznu~RM#nO&Xb+} zp?A3VvnN#dd33Ll$j3$cZg@|{y5pRzXN|nUtWmg*`ln=Laupo#tbR#0DTzd2b?cp zYly59WQ@2)_RVV`86(Ro|0}+__>{gAXOF-0INl$p`=P(@*|(an`>2_lHLQo+`_Jju zO7r(4zu)DG!r2}==MjECd;G}0(H`rAYW|5j#a^@0e199yI<0fpK>O8q2K(5*Z}#%g z=Lh>d7q?rtuJR_>$2q3|3%U>X$B!>D?0+it>(wv0pX^t?wM5V3QqFDeUVRqBz4HO0 ze1@|R_UfK9uQsp8tIzFej1T_Fyjx)3^iy-Tg2}fq_A))!CKls+!}p5pn`=;~f#0va zn_mCp{Oc@9+!yAWz`phO$^M5p!{SskbGfHwYv0RN=X0k#h#2|r$r>NT?uL1%>(_Z* zk61UHllAOTH%j*CaNQ)iGiu4f!gSB@;X?<-t^K=a$pPrP``BG`$Ci@=nM;#CuiWQv zliVpa&EK&$hJQPYHpkf?ZwvktJ79dA$Pf6N2G(Mrb+>wc}lKxOvyRw`feRp&4DJoz5oyOp%V89C^!M?Zf& z&woaBzo@Xrbeua5pI?4b-TzGL*RLlv@2zBXAH4_UA9f0Jivs?wJt&oX`Ux@iX$y@F zpf6;WeXa2P=}S5O$v)1}Q@gADTlO9Qn9Z)td+zc6`PdCU-Kp4TyszA+^7#Yy``0af z#uoS9Zv6Hys`J?ss!8_vO5i^5>uvtsYrOU4y}l2>Rv9y#gY^W?bH>~xW+84KW7pW5 zC2!`FatQo8w!`a@!-phs9m?CRp9{Z_j}PW=mAt9<+uv>emih?p|Df$rI{;e{+5!IG z$Q@)3y~^hhjXw~?1VNo3dt7BHT+m1g=DZ?%hx{G-e}&9=>(u=}pVTgk`keFm!~A{_ z=Ue8@3{~W8@Sd7Q?t_KgzL~wwtJC^a+#CK~tRL&^wYu;4kK%sUV~%UcKlLo&-#m8w zM}7ZhZr^Pu8Shu(KE8_O(8vFk3>!KO=VWw~_K5fEfc+{};_RQ%T%WQ(T_#MJQ1a7H zKgnmGeI^a+*DtAguhD&;%M;BTq}`&XW1lkp7smHtystiuVcz)rcpT_`EU(Yk$GuLx z;`PH>JI42SK0mHFPs{GF!WA}vb$!)+@~<|))b_N-2Rm+ZxaNH}ali5VqS)VQzOw-d z+7Hd=Sy!oieD}GPo&T)dGe1@^`+3can;d=U*Bh<$ybrqyu{UaLsHbtpM)t_RTjmou z2je+oZ_$;DtFCdkO0He`Gi%A=qPk} z{++nyr)J-C&;CqsAF&=j4!Jk%M|w~0jg}bAH}{*_)5qMBi#bj1Dat>EF@SmOY(R4S zZ`e0lNQQ1l{U2;VPut`E=03h^(0%st55xSdo;|vkyxG2;)T#3-*gtzcy+xM&ahTa> z*zX|q8`Ky2{Es8g&waaQFONB!fM;qMpT+j`F$PHFAA0ZEciIou9s4{d(c4Dwu5rJ! zovQyX-Zy?f&RsG#z_D+0eab$1c$9l;zb?zY*Z+Wh)_9>2Ui;|-AXgNvYB(3G@+tHB z^FF%B`}RePUdMfZz0Z%U&c`&~`p;yZGj#@{H*b7($zJk_WRJMU@Mc+0#d+@d+k`96 zuiNqXb}5(@@qhHlVfjzjp@J=vKmC6Fefqn{;r9o2h5v)GJ8@g!?ZDJWC3o+7$zI+= zGN(MLy#iT7uQYi=n+_dW=KgqoV4QtZgNgio>{DB+J>~DeDpLap`IlH6t*I&zsVZ$*iALnGe*&aQ1)cq=Ft+$8l&zLb&CQh7K z(yw1X=za%j*sy`d`>wagovFtb$b=^85Z8@gMHj;cMdRd;0oV%~zXgV<~4_ z)%UmDtM9Mzzk7eI?pyXFJ8s_RNdFD{obzI|->@I?AF^Myq~}Xlm8$t;-#7=ky}zl> z7r_6{oA$7BA7kF->kv1)*gbPfEy-BcO)___)1DgE>2s#nPSW&j%;%tkt2hPVZK8M-@`UHpv@>hJRy#cxC3t*p7 z#@?NhF}InC3tWCM!3JcFzFmqIHox?fBmsEhM?)w3LMuQ~QL*G&Gwy2(37K0w4iKIiny>RH6U z_4%Roj(xJE=knnGuX62W8t-@h=1a`a8ZO`V>`~JGtvBVh*Xks(f2QO888c?k=f`~D zemMKPgEWBd*MQH@p5Dd@vj&qiUiqg@Gj@%&41Io1?|BV0-@hKpys7IuUrB3vsSp6;7zsYhJvK}&C4x9&T zQhCV_R^jX?V$>!>q^lg!+-9ido^C#+3&A7KcMs(K;2)w250xc?{_sk zjqwfl5%cWNz}X5`-}TBqE?rgw64=)>Sbcua+%x7LiZq4ynBzXueBO)krT3}RE4?D; z2fx+L`SUR?<6g%DePoJn04#cL7x9? z>ps}Gx=;3R*yyAro5i>u8SQqgx?sd(FIh|MLgBYGZ{j|p=o7_V$$vyk;igQt48+DD>VWa1c zbHjK6I5+DKDVUtN?!@Qrl)^dSzi4-<>>nxEEc?KH?B^%pcLg>iZV#L-u=dE>f?V_p zXiouq0?-$v{O{eMaf{|EU4Bq)fU6b4E}}+QfV|@V`7cQ^Vx+?PsQV#KVm)AKr_%R9 zk7#@z&N7Fu7Gpok>6_W<&cAoO^UC+$owbta1L7Xx*Av-CydUa*qR;R9N-XAG+TWbAuW*Y=AufUB0hRZ4_sAV&9?n`Dwp&fpf<@ud4g@x%xa` z7~iMhp1u<7rDs28U+HU^c+1%0h<&g5o`1ftcG-KtXn@mx+&j?ysQ<(D@>Ru5smdih zZzhp>_wmZkmn!!;<0{CZH6LlujK=WjtzCmOM3KqB3`eMX? zzT~YRfc${V4WO5Rb}zI6!>|ttxy{^>@EI02m*NHWqkHRH`>oF(=sw>=e{KRb-)nvNm^L6>&M%CvPBRSm^!+0nkfi;3Px3yDwBKn| zH`<@9`^G=U{&%v^Gwd+82YG(_{Fu?*rAucSF=8aymv?X`F8gc}`}xmwo`2@dSu$zT zq>}#q`%4F~-?&l3lKYi?yO)Qvy70ehp3gF`dhcUqFuEG#gu4_Q8K5`)03Rr2E{nqwM?l+};b;CsgiBVZSTp$~w*yuajG!Z{zyw zy6J>%mjH}CRvw@d!oUaFUld)C+sSAH%9;4IQ) z$2hN+@u|2@t>{-F9v4o%%dBa*+I1-X7qEXcwu#}$BU6QtVprr5KuDVb5ssGFa zur9jln@dZzx7_RZ=A(@J>Fc{?^L%_Cy$!(oY~SO^4j9chI?wyU`GpbtEvXp+?}?Ai z86M`obNXZAeREH`*fhp|aBsW&-u1K?zaN@u&Z_e>yEv$6s&^$N>=+y>Cs zPsr`T$MM`J>b>ROzn0YdaA_PC>OSo>-#^2@*L>Ol@E_d==H7_24?V&C#QTb~-+0bs zBJ=L!bv>@oTsHmu!)rf*=3gpl^SaxaxGQDr{4Vfgk<(}G4n1}`qpy$Rc;x8l&ljM_ zg*~*?P1lomFnf*Ujkzwa>6UZPc))kzv`SzdYkIVb@R;jx#xHXG*wNT3oc&<*z3ykj z-v=AwZ2|wTw+GG^7(0+R=0-Vupiuh?-2Z-{xIpqIRW>yPTPw&Jg&t%)f4&YGBX5x% zOZv#B4eMq7+BLFs2YQJ%jz+wM*I{u})JC7x+{s?>Kc!9Sul?80U2nACvu|^KmVM8E zg7zEDr|q{k!07_6s`t2OJo}6peg4R3zv15AYc}r}=K9@z>F-tCyC&9mx@LM-o%XwU zpWN_#TE@_?VR3fHT~}Wwl~CXB()An6(HNy?U?{5H-f`_}h&&r`3A?cGwFXxUGp_bzr)%@1^+H9o%9#t(Dv zN5Fj|`}Y0z>_ZbwydV1f5&Io#-%_gPPkR&lWl^_df9;VCUr539hh*=lJN+!|^=nt- z{$3|rHm#T43%`_1^zx|3gv+VcAj5XJn6{R8g#Sod@XnxT5n9CF|TB>DX0 zKhz<8>|%X;4K&~6`%u4j_rB9cu+JEpI?8js+uA+6s{6|RNa@w zo96NgW<{bw8y_yCa&u<@W{pZ37<&#SWU?x{#$oDFa~AMuZSH0Gz8-Za+vxIFWg zeV6and|4Ir$bzXx=$CDKcR8v2cb>~r9(#AYVusEbJtOCx_ufX2T|LzJs-Cs_esNJz zjajp1Q};0&e1LTN{B!EQvi}roeAIo|DcCAKcT{H&u`dZWfVDjHoUCteZJX2k)3NXU zCC`0=k8ka4EY7FjulCuzPa*Th&yRflM6Fk!UvvDHd+^^L@#IL%kaPZhc%9f1y=%x@ zvrd0#_4|lZ8%j2My-Vk2<)m+y+$A6D9y+p-JK_px zUaKVb5A2;I`zGFEblox@=e!!Y#hMkZ!b!JD&S31{MXyldf+liwe`bt%X9JEDptd*b z8Eb?7jM%@t`91u7fgOqLL1YUwu7FRFKlXaibV+e2>BaPMM$`uIlsjU5Pce919>Vt&uRW~bra`1+CN(+(To%-U$5 z!#RD7AItAk_Yv!V_3RC$`umGI{8_nYTzh=`50XE*n#tuMzD=L@oNW1Zl+MHVn!js@ zYFifiUReKTJ+Cl#w-hXW7jf{Pur86q`wP^6b}St|d{BMoh{cHU{j;izuGzTGz8m(T zqT~+0Oj*vyKAgijE9AuSW2aq*_s&30uDt$S-l)HU`^x%zy*(+-79ch#nEs&eA9DZm z!Q73Szb}~I7<&V@Y2Cur{c^IibjDEnp55?)jP~zXIb1TPJTCi}yeJ5(&u;V$8?`Q|2?enMY%rC6?J+3hB|Y|`u?i*umL{j4;x^gukm}5dv<*f4}B(A zJMlI(w6DhA#@>%W^O@s|=|1dw=*Rg^ z94ve-e++Wx@E>x}M{sc4h*Eezj?X79Ya5OomIE8Ulk8zvXq-?m?s{ui@cU_7U}utS z0sWAbpC+--y@AYAy1bvO`*9WsdzYN{r*E1i*|T1S-7&qx#S7}lfnQr_K8wYjPCpS&q?=Yzbwbnuz`E$c34?)jFq7bLQ};Px2gI+t(-Ex_6Z^W5((^89WmgeK!C5 zy5AVO5B8rzu8(tib!HdN6^{4xMRC4~_w5;)j0MQPK5v`nWBkL{!!51p*;qeh-{n*J z+Ctym^6c|{3E!_!^Xbne}_&vOHbsd zc@N)e^7ppSR(oQ!|K?7~S!News!pXPm-_pO$zaQ9veTXd% zWi8dd0cWS&|L&fPdu|8z7fF%p`Pscvau>Elp0m8^U9$Z_MZY{P2Y+o9@ z`mLJRxA(HYw{hP)y=Nc4o8v?F=^yL9edhbHFNWuHv<4H@{p!&D?qGl1xUrm-U-H3w z?@ObG4U^bEo4WsbV!Y3sBo@vW)p$SFyF<=x4bSl&U7g(vxYzt1>-m;@`#S3DY`HhF zyJ4%xTjV=0(&7han?O#dtRHUX9i}z4vje(=>af-pBd3b8NH@7S+d?LvwR_v40=)db(j|?l|f5 zeIGp&w-NmBv$>bY`TRcK2m6foA3(fct1@bQIGclKh_fcC{k*VQCdY4LeV60c{66(Q zR?jE*rjJkUqS{ErMvnb3)(>+j-VQ{}pPu`;zt8vG>pr-rCiweA*{@d8;}ku-8+%`^ zKK_w)AIo7Z!#!*DxR+JyP3_zF+aV`z`fN~dpHWSUR(F&G1v@<(sn`$u@C#CnPQ<pP~ zYhn&S^*@F7GafXtztR4v_Ge>9=)RfR#VZ!?!@$1}nKzGlFB^Z>+~*2QkJ9a*PcpcjmHLFqFXHyoM{{!+;jnsGb+-vWf)p|1T zxYs@#%&VA!`+W>%=A-^qu;fk5+t?e=?^*o}**~1S8vAPz`?4;GzPJNv1He3cb;4X; zocrHSz=zM8Do2*RAcq$|7_9|(jCEv1V>zC`9PFPsg$=;(KY9@CextQQ_xJa2>@CNR z9E`D_ivI)Yi_p`IS>pJ=S$Cihkq;kc-{kVzv!s23)(0q-)bdkOdQm@~M`bKgFEeq~?J!*1Ld>{pGme>U>` z?CBkVa{xd8{0r!Q@C_jXn9Sy^#Z~+;OlE%RiBWIqQ>MO?%7g@XGdW55Wf-Y8x`TfP&QnY!Hn-_Pp-psd8sYkM7;EpLRUvW&cp}!3Q5oFS0bw6ZZb9;t= zU(46Lp0T|?7o)bB{+adJl>0FhqoziI^U9oG6xy^s2D=JY%L zu-vQ07~kLNe~fw90p_io?@!;BI_Ldejeo&Bxd-o><0t=QpW08|N4?C&`{6l}AHb8A< zl;=z3@0)sl5a-kGy4-%~mpNa}X}Q_bbtJ@}uR(>uDMgB;u3S@Tvt zpQk>)>49axZT?v7Qy+hiWG($da`&vo%=^4p-@aqRv67nocprXBKOcVi@jZj(=(5^! zbP2e}Vr;(~bMV%7J;!tJ_~&(VpNpZjmHhV~rM+1GlEw*)7vlP#ntj>;_l%=1b+ z%=aOc=6mkr>__(i=W|5d^Kof=^*M)=_2~Rbcf#NQ5%=kvMzfH=VvnoO=dmXq_3z9z z{j`sbHSIi{b;BAr_v$$oQn7#RaG@N{oFzv#b&{hQlMz=R_CB`L-B9z7=ggI(E9=U! zrH|<%_gSbtQr|bHoqKy-$uUL0__6$JVw)+_3hv{2wbyL$32(IkW)#m{zxz zBfEy9&u^#J{6qE~|E|{0z9#lJWo6b_w<;@{->5_5fV-S_N!zu&SSp8W$kawL5+dW1ee9{w@p|1oXCx^CylUhFkIvhZQ^`}jLyOOB>>4)~9>|JZ)i z3pam>|MOwZ8y;TpfchDS=HD-ekWV^TkD@ApD)=rx=;2^k6-?RhTxvQ z66zMK+o$Bea4u$;(eDTUYY}seLVWL5n2Y)7$vc&Oo|72*{yN{&+xLk7Fz0V#L3h8H zzW>k`7~ene11$TR`&a*yvA^Zs`2o~0`m^-+aa9Ib+p_xSeB!VkM(yO;e9ZN?WxRhi zW_M8czwLo|eT4LC5j z2JGW==o#!R2Quc#!Tp6A^Dy>N-QT-e3TIT8ebcaCae8%S{}A}6_8(l;7V{9Wp!-Gh zo|7E(Ph^Att^Ka^+&lhxr49JvnOksvAJ6U$&g>5Te{bU>{>?pLe1FbsbNL`Xj>0 z4j21d{=vSR@8N3y)P5KLyEz`3w+8nv<~Ox{69>DTxcbas#mu?4d490Zc)#+smrB*j zcgVNj_0)YeJSXFmk3Nz&-grHU{j;I_@%nya?dPZNvya!!>1x1UUM$zg@3lV#|E{;e zu+Ou1tY5^}NLR!@wcqQ1$bO>stIr>?PyavJXES!dzrU~noXN-cU$6GwC~Yp^vahbt z`2NtZugmXXzi9RY#?Mc|z4pMN7cMt#JlN0D7`G^QiyYiB1ow7JQ)`D_Dl?(ZEAu91 zrw>m3J-n(_YW9D9Qcf&?Qa1JaV~k;Hd*0*AN11Z`nL7ELO;jPA4E=I zd;cr_*WCAz#pA!$l4C1g(cE7Y`y1^)y!3gKCvdq!Zv#yIkhz9~^X`{}ztmK_#F(OZ z4%WO!r5O93_H7$4xtTj8cf&BSUlp}|vR@5*qTa%5(;nPo!S6o+_7A}KFP#4}xG#&n zQnzCs%FQyWF?63R(0@Me^1}6}W}opt-eY6u@xCX-|Iw_*$OeSk@AZWD7JN)U+f(CD zGauIVpJ@(&8V2pxds_2brpC`%)SBlb@4BFwxHjTkdob_o`(T0W-&3_hNiVQJapEM* z&HSn4Z4&Eb#}*n67%%C zjX!^QRqF)yj|+AG#B#%S$bLFzg_7IfRzB?)^ZJf!vLAkpkJ)du@w zVfSI4@S|Y9Ds;aJu6Kj?x3IwdiZ{VL*7CNpe>rr2!E2uV>@l~=NN_&V@gLX#p4-`8 z&+JXqeb)VL?$6qHZv%Yp&-nt$^IFv=FmGgQ0eaR;EY7^k_LWAu@8W)UR-eylIiDZ* zI$59%piXM8kNhA{=JxWMeSFx%3*GPa-M8FRr?c`u#(CJynkM`FXIl4XVh?Yk?z69t z{rv1Z=8SH&Q?OTNFQ0iXs{7zQ=J(@yI`(-DeSQ=FJN>u1?|pxp^YgjCAnp%y{WkCC zbAF7;H1?1C{Z9AI)$aG!d!QQp#nNm0>%P5KK{;wuScx2I|8V8X7L$GHDk^eh5 z|3S}w@thjq{ywaG!98r^O!WD|b{0VI^QVFT*^kJ6aKC>A*PCFzofN@t7A-@r5A#nm z$CX14vn+g=+hugqbCrGa?`;6=LC=@3QTC1BZ+(AX_hSwqp3^1&W;yQTSG_-=51~Kc zwBPjlLTBi2!q?{+9_sVcABBHv*f;UN?%&0Ea@2n_tA{#h^Zn#LSkzAC2|c}St?pN^ zOx^!hCQY7#IU4;+KEZj|Z@ke=s#QCS^?mH$pNW}WiMn4C>_5S?Iq-jKJ%WCU`uwn4 z_IdD1KgO{iowa57kGK!=efL1~Q)++c_b2Y-q0Kd#Z|Z%vzEAFTxn50kbumBRSDnet z^R>af>FeeB8+Vne`$J4%+-*$ZG_ti&wPv*JT#&KUmducTOWj`%rV#M{1 zdsBm_e{Xzyr}K{aeY6J??hTHS+?AU+2fW z2eTe%dH@QsZw`ra0vE{>>rr-AT<90 ztox;SZcT7sL-x(O7kT@8C4a`<=vAyPxl^lQ!SBc3h@$1~;U~Q*`+_R)!@iIGZQSq9^-({-vriik z&12_dmk03N<9_j)LH+l-Z+v|h>$_ebr~8`ow>iJ2I8&PUz2l#3G=eXzd2&2fpV|4* zsPSoEANKE8hwfuepG=uDMQ7!I_Sq-Wy!jhozuH-y-I0oY>i&~ppT0>0Fy62#=X1k; zacQ11@cXTObL`XC*X81$n7?m(prQBdjd07w{NDG6ZH?{Yi?I(o;JLT_yE?zS+V_#{ zyIy{Geedx*OJ#pczkh0cPwr1_{YL9}N!(+<%|X@sWUY_#_mS4KwpJSRE?z&fwrxuG z9m65}$A7IY|62P}uox?s^IS8&_g`Q0qWnwO3$_=)uwOK@y7~skSJemmCjy_}uzzgD zOKOvjBi}$j_$ZyxqF=Phb2*>fAp?os7s&**ZP?^#yH zwY*SALrlde=G)Yb>2At-X5q===7g4BYS@sTbkwco_T&h!&`k+ zb8e)o{l|Lz81s{N`1qRJx9rmnXdKOce$DmitWM1AAp295{ZBvr4D2^Q%j_4b?#F$8 z?B%h0c$Iydo6tUFW#9NPrf$hxKbHFX)ca8LozHL1+B7}ThJEumU|-{Yqy5ef#Msxo zU!eV9KgK_pkM;J3Hk`R#ulrST#%}37eLDtX?;h%CzwPKHC$@YY#P?S3Pr<#@diK(3 zAB|%kezWH5;oFlX6T_Q0-uU#-NNMcapDXnJmH(Lk zZ)`w34sd#JuFAgp{QQ`@&)CuA`yKagU%xpI()jw$=jUD@r~mH$Ho9*(pxin*^-`4p&`w{QP=P#Z6B>wR_I__2ft@iu8UkdFf|7rv9erZ33*L`EV zoe#&eTpa)J*D7DC?r#VC%*R6j&uF`lpKZaIs)xKjQ-$*iyoH)3y{;F_XxOuSn@Fw zI1gt5(G|k7+%aUtx3eE>~yc_G9bXr_A${ zS#lmSUJRYx)-Snkx31f{v0T2h0ULT=D7llXAlDb@KKc^=weB@JvF`N*_D!Du#OgX4 z6P#G_4D|nL<^LFbmZQs_l*3DE!RN;et_6>wF8>J5*nSx2gJU1=4D>oot0{XY*N~l~ zD@a=ZYi0Am>tyQ~>^B(qfb5*xT6WBCCEI7UkZm(t$krLnWy`cTbfryrK{gC3FB=DA z9^#O)GO)q9GO%8mB>sE7@>lKYPt<$Iyty);8)x6d{+!1S?jNy!Kkf$;_nR|Xo#wmR zo{#r!O+SqDo8ycQ*XL_`{9Mm3*|#x2bNtTV2P-Du$9y??;;inn=;<{xyENCQ>`#+{ z0|u1vT+9|NS|qW5CUxJO#Yy%js=ZP6{md@tKKlCjf13Qh(R`P)4D__~&y?ylkRr@Xb%=>BX4|dt>KI4Do-{t!Z`))t4p5bP-zx|`9$o2hj zgZlZuZR;Yx@9eF!bTqe@D!#Wly?x{Uq5JkYGq+&$-(>&vJLK5nhc#Em+PtgNIsaaB z@T-xd2lvjWKeq1el`)ws=mmnv2ocyCMaAXmVf(K**F6A#W7Dv+VtkKXClT z?T9C3WxsN=raxA{+obQSWu)J0Wn@6zh=0caJzl)Z?By#(@5y{3_wB%XJLLAl6~*~B z#&=p_{e9)%#ruwZJqJ4Q`R%=Ia((RYHT`{teWQh*eKJJ;m3vd)=Uj{yoX>xi?%$U_ zy?Y7R*1hx{Kl@BtwoGRKOxE}u``p9pW^`lUu$k4Vy*=pZ_3=J)6y`Z-jvtTB-o&zz z=KH#yv3;S|o7c#&ALpOGfvx!k{DK#cu>|3Le-=Lhd6&u27eHB$G@YWwgh zYJ9z}1N+Eb=(`ve7@H1gIs?0tXCv^-4Mya?7nQCL#2Co&yoC* zm%|Q}g&lav`1pa=GuAfwIQZl6>5r{{H-UZh_M*o3?@e!DHIq$!F7f_)$nn;n{w9YO zzaamW)+V-ogPv!MxdVND=cfF*VleyfjnMoJ=L#d_0=x@zWRC82%l5_ zk1c;1et&H_yp-(MlA`&KNe<>2?HqC~dXLaU+@lPbKVMc3s4gofejv*iOqN9xzLMoX zm6g?_o|DxRo64&3ugi+DO=S6)# z{kQC!`Yhf*&pjVU>~n7y=fH%0;_mV49yn_gy*nq;I?BKI4lpsk*6#!EITyqB>l~U} zT{2hWTsoY!$)4Uq^s*N1nx!*4az@|m_wwfr|Fi6$daE2=1YcY8cQ1o^#PaLws!xAx z!~0-AKC467-`rCEoz@C_^8OrSc;k0})N?rhYioNk>n&W}vY*@1UXHD5C_4w=5c^rx z{drHwzc)7r`)!ig=YAsQJ6YfRea%bI{}<#0auUbk{~w0#7jh31&L7*}_k2m~RYo@U zx==O_e@HgY{z^8iUL>nmt(2up7R!S9^JLD6EoUtTXgUn~>j|7Y;e+~3#F{rzMcTf;ZJ8|GE- zQ^fenJvCpyW_kDg8}8fUesFm{_VmYkd%gC%d_R0n%fDW!RfucN{f&H85aViJ4`Y7j z`*c5_UjH7i{=QWq&Os+eP?oXety5FHgN9cabB%lAx>;81^At>P)+#Nf1M7)pl z_)z1kUFFu2COks`|D);UwLZVbFs5$db>GMPQLZnF_v2dc>;Sc%kG*#7bNsLcW*<+yz8Bg+$GPF& zymp3h%RgRA^R<9|wXZ>)KhS-*x6kagFuDE~fzKcL`jO^`?DwymdXM<*_b<^H|Hz6) z@?T*8$kG>sem(Z>n7ueIpI?NYR6TD7Gx<56ntOP8?jE_1?c>84Jcst}km3!!(C>m7 znK-}K#Rj|$=DH?QZz?52&j>3eG>2|K9PjUq@Fp zk?jNj5w{nJ^S2NDyBt|wAGy1i5R?2>axo(>75khWRJ{6g$r^IGWcJ7TdR&7plib;_ zO8&;7QjlxTAjnAHi?jB&OWNj5vUcqn`SsUjLhfgP`$^b~J{o6Bjvw-sO#SIKnbP-F znehF~GQRiAGOpK)GUmG%Wpwu^WaJkWWMrpXW$YKX%7m|Pm7m-FO}=`%jPn02`2YSD z6Z=#9Kd5yp*ax##yS)!U##8wEF4j+q?;o<9gLl<=$36D*Fka;6*w-81%OCaiF|W^D zpQ-PeSfBa7DBmBkZ*-qpY5B4FGy423tCu@j3A$gEx)1iJ<8|YnI_BM4wQ6-a zS4qzE`yM}=>+}7+%D&0^1m{N$+6W?X<;=+BgGdH=9*X?z8b1#k_%##CKhoYDD4LOvtz;aLa}5=of^3!Y0HF#q*I{M10S4eP~ni zQHMK{v)r;DX+CX_`9F@z(F2HK)^w5mJ0|IQoCjgkXxnJxxPNI6&fwU-ZL4bjs+B8b z;erJ+%W^+z)Cd_m;5!-B?;{!0>tz|)^FG(2p}O?{@D>^H(JeCY zqnl;Or#H)pj<-m!rk6{{C(9`R-JUNayAj<2S6cm)C2)jr*O>EAKJg;(gA&YjO5X&W|xO<9^xz z*7$ELX>RlUjQ4w6_Nn{yzf-Y))^)#81Jw5`XLi1W3#kM(_11bG*KLv&D^|&Z1&d|+wAnIo^Z*&(zrBp<@wkla ze2)z8@uCdw^1KZA`dR7s#nbY`rw>Z+cgo6l?Qh1qMf!YDMf$vbll=JJO)~Jqo8;@) zE|HHOFC!hFDkGhrMQ;BE`2NuTzID!(7MQu+Qgb(^N89LmoO^!Guy1nvUh{F@a=d@n z@~=H1fuHZ$=RFqo^O}3oe!F!ePO81&`~x-iCi~T^pS}7%^ZcwUU``lx|0iLb(YQea)%{wPZYgPibAs7}pfSJNE91Mk zJU^e0JHoed>Su$U8N!|L@(s<@ar0X^(ys?CIbBHc;l`KC4aZgrD%ZgYopdG`V7^48tb zwe>%xXS;t&@3;ObA3lANy!%KQ`S=O!*RO4S|L>svJzu;?nqkgf3(etLJ8oomqcvFQW(uZ#f+F@DgSkG>tP-=ppw z*6vvoJN)ZQ*pvREWX!B9dlz<=tX&)7Bk$AYSjr_=;mRpe*2tS-t{BWY2F+uBoSC** zwvBi|HX+x)W7u7iv*<0^H1uIv(CJSyzvCa}*Pb^@I{IjG7POPC18_*Q`Ce^P%y1i0jFG7MM?mkH1S+uUIb& zhP0BIoy*JgE)`_zcaO-JE)UA!PBo?fr`2U($9v?bub!1&9iEb|@7*U~wYp6@HNQzZ zym6~^XjM%*w7p+Cw83gtUOK#fy?oK^dg9BKDJ8F}x~GV)n1 zlW*|-r;Vo%2Yxj_&-XO20Z!**+(YwAWgj-c)Q0Hu$C;;Z8F3%<_4)fXtd9F4h?T*owOH-`OMN z81iD;qmMnfjPbdzjr(rh9z4^lXZO^iU*`n+?e~nnOV)pTnQZ8NCHmIhM=pFP_{oK4 z<|#+yiHm%hYo27JEs?BM-%G~k`TDs%yZN-Tg1JWz>_h zbM`y3aaE_401r zf5=A-{~>R`_*ZFscNuA31F`*sW#q%h%19^p{>=No_t@1ZU$1djNi%9Q{W z&Dlq~?{fRj4zvyZeg4d8bl=yGasRo!yYYL~=@hlh#jd8_N3C%L_l^Fe=<&(KfQpkY1LeXZ{!&yRD$q5G!3r@6|Y z#>bD9fBODp-_GuEF~6zv**sq?-cR)J-D_$2x6B)xo6J3HdYa?2F+Ov%%0F$m-WT)< z-7>o1^FuZ-)VI!MrTYDOQ!rZ&`_%tCb1>>?Z^riKnEkh5zn3^Eb$> znX6>-q@^;Ve}Ba54@>vPSIHOkZ;(%$RF$3|JS3glm6eXoZjldPFDLC9RFU?L?~%3* zs!OZ7Ri))?RiwqM6{Y#}*Gj7wu90@HTq_M9_@lg5rHu05vSt~1`{6S3sn!1G_upL7 z_`ZrIZ`7<*(wy%%`L%VrWZj3(!@iSww|uN0%kd}p{J5V?o{zo!M)S3oUvtjx9*y(v z*f;*I^K+T^igMtZ>w|Bs+DQ$y?6<@|zDif4zF*}|`QiIM!o4+M|9?mK3kz!`v0twq zYJ3%at`G74$#_4Xt?}Wx#P;u7?nA#n#=hD|)80sT%>%4igeA#yJvJ2eo(Y1EXUVr7|b!*dQ?HcGP9;eOiB58BJ!ulGI zzmc?Gx?**gjf+Ohx>Z~7eVMw}tj@qST5Irl4ZgN|$tqdgzrM`<{O_`4=-aY-`4;@` zjM!SWG97wt*2)#QE?p~Y=M0ebGro}xGrp2_)4ss^T-HtPAnT@lDr+ZwEGy>CmF2(g zk!8zvp>DrJ7A@L_o}Df7%iK-iel7N#E|;-m7RivoGjZ>ZlP(=TmrokrD{Y>-Mm~Jy z3i$Fj$j8mA$=k2rC(Y|r(e?UEm88)N6{X>G6{TM7o2C8}S4pF%u9DZEzFMBCaIQRG zv5fNn`aNZ&EqwnEp#2@5JXh*fzoVqly%kHEf=R~xE$@f+BloBKwdnH)cEH#I!+pfO zi4oc)zB(|&M5eboBC_R5fb;AU|FLgh;od>S`z7~R2m6(8My}7C$LH!2X7)fB z`zPf3Q}M5Uf2jSipEj?b=<7$ZRiO2>zsfwXR_}Q|75j;r&-+4kz}ACM8~UKu9i{H) zoAbe?+PimR?Hls{WTV!%)XcE(zCPyUF~&bU?{3K(eyP^XGAGoK^o>)%^fqYXCag4B zv~Zg;LvC~}-6>14mMz_7*0SBQY~DgyJMAm1&RAV!?euQ4c191Zo><>u^^ukHX5jnb zXD^e(*et)!8Ye3z_rU5d%O`b}o&PB`unEF7v=fMzMjRYdwBmM_g1S=;&gxT;K9iCeV&s2GwSm@_Q#IZx!`2Ke*L;~ zzterN-=GrC$kFOQZM;+avxbX`FmM5lwPCu2taD#M2@kpcbZV%FSb>HPIb z`Q(%S(*Dh!@_G}T?bi4cY5PW9Y4+lsQm@tx^3tO>$}>^L za1S`nnbS*(?~|Cf?9;~&7w$I~>+99ukGwzQKEKy|^=G3zUyOh2_p9!+w@>qBCU4e& zXK-T=FVEz{8Qfm?hrs7Ajr}v4>nq#`-JdLD#*8WHYjwYVJ?K8z=e$1F_qpH5>_2cb zda3*7dH8tWbI%xuu?}rsP~*2YAYwm}f1A^%4RF4G?0pEhx0S~;&yh0|9XDqx{rcPQVv&RmTnSC0`^a%?MM__4&UB8U}UgnMJiq&1_ zkM1e+Mt_IZOXiKi=g0nlYhPS{l=!$rme^{ePKz@9?V9``&jPduHfO1@+zwLI}}&Q$qqI zsz4G=AV30C5JG_Hq9b}|2ACO`K4)yl9y^X5d+fw<5}({8PHZ11<8o7;dy|~_aeSU9 z_nx(X_w#$-wRRC=;>37z|M)(?wbtHy?X~w>-(P><*I9wzU+da_r{s-Cpjlp)`*#3UKJwbL~{br5%$?-d@$)#<rxH!8N}A>v7mTzn9|+=Dp><)q&Rb2lL+8 ze68=fH9k8wI>387KVp!rSO4Dc=j(k7wfC0yo}CX!`y6<&e!%bd`o6kK)1Mmif3YhJ z?rUDZ1i$~b{LgPO=9PJD{^85zR-o4%>?_KYZSC6hS{CV`6<&kpf^;f?v@7+Ew@7?JIr{%r7XTVu` z@7{TN_ii8ZlDzlQWpG8_ed#K=2Cf^t_23PoUmidDHs}4e=y`+j+NC71ydVp5QhbZYW%#PG{j0J4byKY0zft3UVty~bWApccxZdm0H+}kkKVSK8$Lu`S z=3{?6yWgMthW|m_5Ape3?%T0!w&vxJ^@Hps^K|>H-OrZ7=n*n;0yREzeYz$#+?NAA z`20=3*?9k_*!?#cZ}G~52TosKpX}KK_gAiRrcKO~g~a={ZoIE`KGjvm_Yd~@J$tVb z{buaFYxn)UXMRpU?~RUBn{Rue2jafr{XjO~#P`8In&;>1y$sy{fE}`FGpp7k_@(%wzRGzHyBF+&BFA@ax}@-}~x^^3892 zi}?OSxpD0a*uy*WT3?qu?rQ@bV2|8Bwntum`5WLvgZs!=ZoMXtufjKY_xd&FX}x|{ z9$&v8uixkc7r|wDeB+8dzIhc~m&doj%^TpBi@Wmh?tAj`z2AeI%Fl1Y&kqeA+d~e@8A~ct%zkW;xlqUJmToDlJvx)uH_AkmF<(r$80*vyd_kT*fuiVGy7mxcZ@zJI-XP4Ia)++Z4(pZ;E#~#}? zIfL_kUc7JOe2@Q{>u`H~yt;?Yg;>t39Tjl7^O|pM$y|gy0kH%1kN9pCGvz@sgc7Rx%TZNow2>NsbvT$(jVh{oY(l?MZo5}KED4yQ(YPaSI-9g{eaIOs;8~LABgX{pUQPt z|J$06=l6LzU(06J2t-qgMLPe?czxePH-=`4YDC z;s@~S6g&fG&VX}r>+A(^5nPg6=PrXQ;F{bze;wSEn+CU#iaQ3^PhXLXz4z$P_#Mt2 zz}c1+a{csGxpDTUi|g!PGsmu-zAV>HU6N}j`{Y{h1#nKToH!#_j-Qe%$9lmDxqS4P zTt0FH9Fhws?vT&>0`o}2`IDa`zJFg1?dp*9$=DIk8UCk+ zKPNf({%ZTDrMw_Ti7~zz>G8gWImy1o1s?Zv$@eqH)71K`|EJG`Kh{@{>%J@Pn0)2E z9uKx9?lwBaTaUvV$D?-N*nZd62W&piv9b472W;^Bwcayt<6Y&1_Pm(dp4xqEex2HV zYUa8&&zkWWvK5_S*5#Qv&hXE(`%mNkv$gxm{l{?s0r7_A{>l|Au={z`_^|urBm84| zxL%!qMDu&W+z-j^yWCg3XSlCEkb(94gYEr5{=Vv2kNbKLbdBUtyKnDR2=CGLo}KsR zD8Ryho=%voc}++StI}JM>pX(oIk9t_;fwO-^y$ybnbTj8 zb0=PbV<+L8a_%hLgMaYwO7BIv+o8l2|bilbX<<=Ey*={tsQIB^r)0N17O_*ITw2AAZ*(Tj57$OXA@_&hi( z=MSBcb3G^J+`$vzxSTt1RL<@{ET<2imE*@gCr6LGFNY7kM_%u3>E3fwdbX^Sp5|tH zbDN}n<7R1I+aMcjYGrl#3aMJSPG%G@l_?WvlgBQW{H$b2O^lKFu_F!dqr+d6$k8vz zsKL+4=poNZ_|WGh3jQaIw!VL1+;cK6j+{V3ly6#UoNr!svadWpotQt{SqsG|IS)c@h&z7AJZIk6J?xGD8Fcec%6*QhowCob7q5CY-}?H-w>9?8 z`n`tx*hRw^IHS2T?T0lsb3%ro3uJq7t`w2yFUIa)_%E>gI#=KQ`wtw=HFU5BAh|wg z8r=8t{PZB;@7s7k_;-Z#@{_OBJ|@rC59WTr?uYvN%6+R#?f+{2bB(!(I`evSM8mig_pp8v1kJI*{h zO=j+$|C`$X-+pzi{Px|Q)Wdem=kB&jUw50F-PchtA5`L+8N-IeYk`oI898c}310xdyJwxuZAa>`~r- z^cJ`+XOG>M(><5vV10%3G;WaNN8guYa5ET355Ft>H`L0(hNW`q;1#~_20G$8xN7$g zUY1h_F3QOReR6XDdFkywE4};9fK$@j)hj3Vo&d+>MCTDXvFETH=zg8?WpB&At~coe zc|-PeJd!>2>!f>Ii*#(>F1s4GNYm<#vc9@rR+g=i%7yD?=HwMpls`u%kITm2PsZLy zNp$#ViHR62W5>Yzp}!@=2R$bvfbu^A`yY$%Z*BjlC4KA|-?+H3zRAh4zB!qRzS6uj z-%?`!Rn*0m`wi6kJ?@*i*#_di%X#bTyZkqHKGfES`22?dF82-Zy=PUW$9=W?IYuAo zGw#_s&)@g^#p*Mwz1KRq#?IJJjiKR{=p5aJZoGe?kG?)P-v6ZR{^Q4w;QoE)4uJdZ z9kO!ya+y|4u21La=K9p`>-s#(f91Z$04j~Iul|0p&u{E~sLeOrCq6RyJ>%~O{zvWU zQ+?|BSAPEc^DYC}eZL=P{W{ObABgvA_qESM`EQ`}Ho88)pa1Uu&DDbk?C)3G|GP(G z4EKNjEo}b}`^@~-I?vwsKDS=pxY8y{{YIbnkmh_QRp$U1#M)*J*G@PV74e&dZ7JJ~^@f61XfU4qO3O!F6y0+>{ds zZ;?~KMgJWA*R_?>wQ&ZS?9kO5M^8^zYPB*K3q{(;Fl|yHtt`awI1`QIet~B`PdTBF7Ao z@R85Uuos_`p)WjVr1C$^wf#xt{gT24OKQYuUtUavuQ(}&m_Na{$c_0|U~4qy_xk&T zV}5-eLi+Xfd2#Ljld(Sh53>7)|7v?&?t9Yn_dV&i|6cA|<9$=d_Imm4x*W<8JNCu1 z|8R&gJZp*d;gy)RIp99?^Zysw{YT`T?=zO*ytFI#SFUiT6w}wI>+!*T%X?3ExxD`m zai9Oi&waK18ZRldcVG2@r(XxM`5fz)n+fsdv}eP$^TE>Q_=56#F87TdaJlZ)`E<@l zwf#L6PaoI&u>Mo5Gc|*`>nhCrc>nrm-Da-6Z$4_0duKZ2{`oy}^=PLY+1VyNJNFO^ zcba(k(5`OTzw3nT-u=+Rx+R-sdD%v|-z4*9Y?N_1RWc!OyyT?BN@Da_ z85H`GvUwzI-Z@vzr1M<)X0efZa zzSgN+_-&gP-@3VO%X@nH;J?E7%o8$wM&i3@jjsuPp*6nA#QUDluX+AY#P0v(CsQ9i zdJXQsWabQNZ*QkQQzO%ga;2moMe5+bsqec!i@9#Y`%t^@ukH1-`@#AB;8@?&pI)xd z)2~n3eeOdr_f1{av-g_YvH6`Rc<=iBwzo47>nq>=$JqAxZ+rprez(`W_*C2f#qJ1q zUhO6F%fC8l=FffW%1&}(oy6^3a+>uN_HF9`ozk^!uXJtSCtW-CBYUKSUbo%buSm;| zd(zVUK-ycb!mnPJXJ^6Phfy#}t!zP1~(cW0lpaDQ5A zx1me0zpanaEB&zRk?an_uAPr$C!F2Ba+B<+Stac|E=WhqW!ckm5%j@n{JkCL47c02 zpO&_5r=+dvBsd|hTaQWWmLuS>v^E~5Z|5c1(s)anHl3Fp8;(eGL#J%7YnQFHyJgeL z7OAh^CTl9UNOjp(a(&z3expnnw?gtVCQ{Rj!|p5hBW29+k@)$aGQ1xG{}t*3jD-6d z_eTzYp4fk=B!-RjWk!Yh3KPbfn16nD5_SGGVt#65_{(+p{W`8sd%ZpG>$6~VzvhAZ z`-lVC|9;#zdZ3@(*XJ_u%({NRpZ_+$Z|i&5ePUnrg$?&jZO@L~vuke?KNqI?RxvMz zqLG+?yx;CypZ^of^TYkuUVBwudifq}0-cq%wl-P5qQ;pD_ZJn?&rhyzHNO68jZc8> z?N!@ve_M#ZuX#S8wN1_MS>E@v`NrORI@GiGp3mRk?pysFV)ui&Z+LIHZ|=3;b9{V1 z*f(RiT-o0j@O*$^{`XWQKQ-=G-~UIfJ7MP5W^Vgme*d&w=)u2d9fgzK`{cmRPHElL zA#I!YN_%6Mv^DMn`=x!$0cqdbBW>`fZR=6lz4er|HYvY)0dkx2?ToZ;J14E%&x1Z` z+kO#w30#)e9aq3r+1+$bwk}yNTUTz!?mm$1+u^ex57`dFHnxMXZQBFc*7UM8)-+1v z(lyf3cvg09y#UTj%a(J}%zks@8EM{pN}4yF1Si08a8#N%9)ahFWyks+*|z?OY;V{v z+v@j8Q(c#AUE3**YdU1(%2sJuzDw3FX_l20+hl3!PAQw;BJ*Z8$>a%jl9@aeyB{w} zG12(^V`cc@(Qx0|edYb&=dJx$zkke-PsykugW&%Vi61kF2!0vGzIlYS}i{ z_jqr8WVM%O{GLi(*HXDp4s8Y8--M1Zb9b;N*G1xe?d|y_?Y`muOZQk4=qz@mO=_yE ziTCO0rLS)tF$s2`I-fTV0pEq*DnIvC$GM!hc|Nbs;c?%_`8L)M`1@9e+F0LTL)9@m z9`L(1(X;(j-Us=2e%|}J@AdCt@72zGF+O(P#P~rzzvlbY-}htQMCaw@9rGV zT-D62&)nMo_=oNI>4&7Jz1yI9{a)=v8;~Ckoc(rV(ZkElPUSj^{fw8Io zYq}qVO&jk>!;-DCe(^fly8g6m-EbbDQ`Vm``&$}L%9i?GZ~`2Y#&wD#;IM37dq_6d z9s~zKw`^R!Pd2RDE9+P6k^1HBvUcfiSyj1HYRa2sNohOW-wpS7;6rYpwzmlGCy?ul zm55Oh*!a;h{6!n@d))VI|L{Sd!T!G}5pX|t^l)ElBr$(%gl|%EjBgGxe_3v-Z|V39 z`g>X5R_pvcGaGfDEv?-d?z?thp9clUJXk*qVScyjy|Q*$r>t4p4)1w(Dt5`TvR0`q>5x+8{`9Rfy?BFUr!S$0FGCW?#*oh+ z1NRj}$njghU+unff5;1;0?*3`xF0rbu!;FoB1ZXgV#0kziP659)cF_Xx-maC)5iSd zj<6M*)hE>ak8<6O1&wsMKM?QDT)aWCzQ*|U~$46h^d!L-$|H)5&>~WvI4a@zS>SZ#Ox}(~C zGe5uD{Rv#RJI|Px=MT31Uc7JoeSc4n{x4el4CF<;JfEja19`rH|8M;O?7rU5;8endFNPR8iU~A98J9^`(ldr1S&DiQ|2DNLhGq=)pwk_7yUX?W~&M^M+S_syzJ}+xl zUy;?TI1W~=yz0lwl~<&uq*<0P*dVpbk4x=}ld@*{38ZcxA z&v;_^aD4hOY@&lmLT0{?RpYV(8pd92;{;!l;qIX-N?vHRY$thK!W?>E4E zwfDh3zpd-p9J#5H!+RaKtMRk)Uvqt1joqi8pK*M_{rpeM^*zhJzMo+CbsW#VyLaLK zY4S$9rFt3MpGdr4fX`o$!8PKaaLslspZzWB&-m;6L3MqP`~Fxzg!k6x_jn)3^=rOA z6rS&I?v2ZT5ItJ&CyS(eQ99(eO+>hl; zj>_^SM`U@`VX3K990EPypj0p354tTX_Q|sHE?HW(7axC*RAK8EFY1K%U9xCyo6Mil zEVHNXU_AIXdRMm4(=$n;M}$$w3zLz9;6Ap0zs>yy?1X3YH7*E=^VQ#XeSY=z zO@7~><9E4la{S7D3)|DzkNcYAa=EX$zK|ThiI)Suzp0yR{S0`yzKL4n3mVJw$#DP2 zhWmH#+;PsFhWopAYrO9$_e*r_4!qZX1f63fSdSU*yFE(Y7#_=e{SQ2SXzjk|BN^%D z`aX{LMh|FS6~8}(`-b<{_WOM~*SE7dz40Nry=`*}sp%^wINKG*@1J1ozUTX^9#HOw z*nije?=H*wSl@qlO{whO+$NpP`|!*6$%?AIvO;ZOrOGZ@UfB)yg9GsBpy5tURS(;T zEU&7LNKMsIa7>oNy_zM86H>FZ7r^Bur=+Uvpj0kCFO`+&W%1&3fNghw>5}v4X~hMp zEI(n7yRYl}mR6pUWlPS1vr<)gRu)(Ac~Ak$%g?$vBa2H8NL9r#i}IsVRel5_FZ%P!(RN9;l1Vl^TzHQ?z{Ou<^H%h@_oeon(r%v z`^$*=HP^q+%lEl{;%4>x-B{n)ecgBMzRd~P9I}lk?K8I7AM;!O2Wou5wqIjam;c7^ z59R-Q=HxZJ_qgxo_)M;kaeLY)qtNwt@%PObnN2!|m$f-2717fR_l?hgiyB|g!2SHs zvZq&l{#O{sbNB8Y`an;~F1T;(zU%Y*bA86|w{r}7I>75s)Lg$mzi;$kDEC8Z`(96! zUk8NR`(XPY;J)4;<-7+ko^x%!iSONy;__Z8EjcA6ptR()l$HiiQGN!l!)XP)E?aa|%1Y0KptAfV@6q?2 zHYhI-e7=g#K)Ka3op#{25? z2ibl4do|Y&_p$q>`6<4o#L+9U`)gglU+erDBbvD1^YKG?Z{q>Od7dSeHm20r5~%Jl zaP7Z8*Z(B{J$vT)x1QZo9;hwUcv$n}I@g^aUXL91-t^7T-_uY?jn9nX&2#7Ouw!^X zDZBsh;RCsI=eA?Hzf-x7-OrO!>Je_dPo5%Ebr!vS>hrtxO7;8Uz2$x||NC)YbD`)- zf3Dx_0#wM0v7mbbFZ+U~=T&(sJ?pKy! zR~5?pGUY#hFg894}u$jt}lH zn%in@|IEqTr8s{h<90VnUgkQ956?EXKXQ1OiTg(l9!Wj#1^Dj4+Wb*&u218Ae15TZ zKLWcSO>b`ky}fXsI+=36R=E#PH>j@;pLLBEuh#F`dE@7!53H>Z*nR(;5PsfU{s-)S z|G3}Ue#`y9bMEE&)b`u4dv2}|d+*tO(gZS^-es3)fZ{BXdL?>*ZXG872>9H~~nT^w|?T7c=$KZJ1o2SXf{MP1cyzkk3 zo99=5pM1ZU>vQdWu)lBO|Dc?oa=&fild=E#)iJWBtX^tC^`b2@f9f{uUuS^(A-sn# z9`6m8l>3(dmTSShce!6-xnEh)3pWGYFCT#SRh8$YbRpa~{(<@k7L^qz@e2ZWU%6ko z_@v>#r%M)VtYCQmD{>znW+3jX51>AO*?i0Wk~yt1cUrSdF4$zaUzE2=3bHpaUUxEF z4r9zNeZBbpBL;=z-)p}A1wTd%et}xRAjbC5^H01VKV~?6{i7v6HbN#PM~mO?o4$VA z-&f~y->l7~Hod=(A7bZS|3Li&6DN4~K3E2F&!IWLK%PI4>(knn8}DQD>xNU;x*?7M{_xUf}+NUQ?AB5U}xNkt5=I49= zZRNk|_2qsT?ti@BKM?ngy@%_8IA3#pMPMR%z9Jty*KHH;E9W)G7o6)?-djv^x=Qn$ zm(~U5^FLIRCu^vYtp-aMG|KD=8<~%4tCY>_!1pBvHozaoH@3FYwf*Wl!~ezj(iVqh zF}8LwzP80Nh z`*X?hO@;T9$8D5}c^jn&6y|J}w8V18>4Zxn{0|=%L5v^e8%(}`7~EH1UvMabH!R0hR-J7uQuL5^?Hxow>gD;>kF|E+v-w`F%jWs;kKw32W}1o-dz{>pzh4zT>!eboh?^x^=ki`DlJ#QOz7 zHed65ZjR55`%R8dV}94y*SwyW)AMrs%5%eOSMHiW$sK^D*6EHeu?%B%^SWcI|(@V_0dsJ|cN^Q*lyxiZa};YS<0A7uOe z{=R4TvB&uQYWLMvTbpg;cD3c|=c~Q9fcpy%!~0(5%TVAaAeH0#zCg@x{eJZa%z4fE z)!z^D`9u7Ey*~B%Radz_e}B7QqVbLT{GITBkMa5EPT9s>d>dsNm|Cz=Cgoe(KM~uX zpS}Vco*?m~Bjm-;#L8zr9V;(hiS~O{e9N<7sN%%jPy8J z%zQG{*r3(e+qH)KZhxP0Ut@Rm`;G7KO2c{2-rHwNx$kk^)RlDK<$Fk9kK4;{>eD=* zPmT56TwjCQeQct!^;*-nxpL7upXT<}-YciH*0+u^{5Ial?i-)q&d>iz%+>jmA6xF< zx^>g>bARa)XG&2vJ-umWERR>)8*oeyI<4LV{*JCc=J)$u&KrNo_Z#?G7f8vnra{W%xML-=pFAH;tX^Sg1s$@O_L zzsCE)F~7$9Zp^Q_e*As)eP*BsgSkHi+dqkzU%6kD+aRe?xia{LL^z))&wn~WUifqj z_I{{Od-)Xf^ZK->Hw?S4y?rsGhWir3Mo3mPef{xcWqNvouaf%ya-F*m-q-V-C^lgC z?YJJxeQW1++k^J~+vmy8d5{0fdF=iMzpW>(|Jd<6UaarMxZ2-l?Vs|&`usZX-OS5L zPCp&qQ`09$p>=(gtC)bk|$A8sbs?W4n$*c1X#C^kmx8K2X-^Kvz4fpW_`tzN9jejn0|F-q} zZOrfG_^tHf{U$f(r?%hA?J55Q^*yce75cW#9#5XH(6>D(-Zyc-zo*CM_pOib`T8oY z&G)#k^4OAO---q6q-H^bES1|Eg;| z+ppK5y2xCY=l5%T672W8{MUHK<-Ynlvx^!H?`L4|mHX4N`P0BuxNm*`&A#lk1}ALv zOy8gvQ{~0yli|N25t~0oeSGZvVAId1vA*&?YUD6{{t-fNA9MMH%f!Sep|_7UJW^zZ z`p=BzQ-6QGa^LgWUArH`eUIZtTAo{5Z+&`i?KkDV;lHsvUjJzz#`pYuGj7M&GdIq6 zZNBk=$$zWeH~b)%XSPl3%rW>x?aZfnetmuO#B9+TpIL|ZoaH`iaGN>12IBrRjrZZc zj^VqB-S36_&CNQuYLzp&D96mzsk%wW9jwB~QXhqDHu1jd03DZP`+8m5@9I6z_ACEA z1lxY&|Dyve*PkL?-QeZ?`uqIq2WYO(&waL)`!?5S_-<m&a2 z@p<1?#jNo@jSalqfXxF2dVNFs{oFWU>%3V``RpySY+i$u&)I^l+wAAQ`u)L}H)Xrw zzp0O_|7>7=eOpJ@+MePV_4VW6go|EytGPOCH@r9S=k?)!mEt^ln*JQH2)o~(`x@ih zn84NnOs zw%xwpe9q(x&>=i`4V*8u{uC6Sdj6|Qe2(B8pBcZ0zi;in9j6ap$md%-4~Ovgb#89E z-pwkwwUK<_xJX@(k9By@on_8-Yxi|MzJa*^Z0-I>Q(tBr&rR0+K5>F^TRXP%ye!5C zf&19~TKtsNa#=kwzJKn$So-7qcB*Dxhl8m21pg!}BU7+JXv=>b4!I}@!o)GN` zwex+TKQvG1)&hckgoZhbd<$l5XMKsS26GszqCUUcyO})i{V{vuRwh=KPoXsg zzQ^SHg7SUlnu79uCf66R`~LbqwfqIt@B9B=kMlF&{B$tM@P3Drp0d?Rj;nK`!poe| z!zcTO4a)ZodLe_jKb^XMB0WE2Ol+@wj~YHyqN(r2VfPclhD%E1XyrchcSp+f)L5CH znJ5+5{^iVlMZC{F&hvTP*ZXVpcGkXgukCuS9M|`F?^8XY+dLP}S~y=v4oYi3G$PMOI)_8xQwK$)p-T(2AKbray+`n=Cnseg#F~)`}_bZ*rj4Sfi_byISE+7qhK zzHqA(JiXxdgpohkYH|og&Wf2!eDkJllljvbpFV8|yw^OR<-YR&X_!N;yL3Kzakyl0 z2zgj4;93Rzw>U=r{kRL|rLFN*jU5&=uyKQ<$vtx zVNSfAzr#t5)I5KLGoD=E)U+6f@q9v!->J+`k!3uOD~sqmr^nCSTkfy=0}9Op*6AD{ z#y7Arq}ug5;!5tlvxfeF71-VtA|ci_{ufEqXxn0ISE@wK)pO^J~1XcK>bV{*4<> z_W{O%4X_6Hv$Xrlea7%9_vJX;-wyXH7gsQcP_`^6NEY?^SGqdO)FZXeSNX5M#pAt7 zH@{(Gf9$>fCmuY%-;<^$VsZhl9yR>e|Fpj@K-Y4gwAQEG_n`J%?X=$qn8mh%t@-Pi zt{UR31=$HQ5BsnHl;k8zWkIS`p=;?0p%+}|eB>VUz8db;N_6%rzJC?>R`W;ND`tTH zsRe2a)?pv&K-tulzB$zMXXDRLFWTmtn76|>t)R&_b^I0wo9FZ5{ek5snLn+Co_Edr zd$vEg&Zo6DQ0~?Fl>0VkZ*9M4|GiqD^#c|W>(8HmJOrvEtgoO_^?>>iLH6En^WE<( z^J;tp#rd|zS2BmVp0POt|F%G`Ltj^4e|*jkUsn1qCo5%#lbPJ)WF&2JQtT&~F*40pMPFbU&qOJ)LrG?W zEHX$$#>=8Cz+B=bY%fet0C8r&A}7gLm6z;W%4e&=GEg%v#Ror#httg5yEe{OZjjT1 zD{9-}kZ)DKnXALM0$t@{Imb3o?;A(FZ|uHu|IN4MI%_F(cXvzUmc}RM=YQ6AU&ry> zxOUY!cI+tgJ#3?QyqtJHkmuJmxlI4DO8DY&Kh*YHUFY}z)&KGH-_wd zb-Z&x>g%45rR(<6TLqt$`zC%vdUYJl*DBXdU6=Zf>heWA3)55MooV!eOizz>)JG&g zLM6PxIN z+U_gL-|icqv)d`mX>p44w>wh`wmQLa?^CylkJWZ6|NZ$sVr|=JX6id)&{MxWTLMkxTUF_=0o%fjpn7L%MnXviW<-X>JRN>7V-B zi1nuwZ1Lq~>~ylycEkG?Cp&qEla;*9a6c`v!AXe5_K%t=BZd~>`{%;@d}s8~47eYz zxjiR#H2(hR;ZE$R;mqAL%1I*6pAjAAWJiUm-|tLH(wtwMGmCpmz2BLi1#feborOq+ ze>_`Zm%L%Hk=us>SG>mlh3!3*jarD z)d#L@q@Q2yzV`KreCsXczN7JeW8;(Df7W(id-<CQroQ=l>VL%Z2I{Y?&o+yD!u(D$J`PY1QaJ$>CPYXP#|=0>k?l#$0XHcT z{g4{#o0b;K*l?aD=7yM)mB4tB1fHh^#)~F7j28zWZwQLnaus03NNR_(HTLQ#`bj8{k%3cB}%5DE7TUy6O7LQ z=n+y(22+y8%9MmCeI8^AP&pajVlsKf$vh{;`mFE_DRh5I;#hM&J^viOX92pSj2NUU zCrPR`Mu6KUuQxsw-Y9nzX3W0wC4)|xQ2p)sQNBAe&NL#}y- z^f?05j&jWV!Xy`|eq{mk!|5Dx6O*ERQ&M9b#*jEu$S+UJDsm^E1^j)DM;6X%Gj`tQ@j`w1r~jT!G9hON>+WFdli__5c0Z}b$x4L# ziQC~l+)vozOOJ1GQev0;62_KF)R<`!HF_F#J@`MQkUrmJeEyNx{9*X}!$sqL?dR8g zALIBX4P+Ag>;1}CaL)_S1LMg77RE(busvRn`4Mi87sN#HjJSwKf&!rDDKO^?H|NXe z8L}9IKR!nC6g)$Ue748&%uI+0lZl*v3i@Ftx@A7kUpeu^lH5cg4iL5fhBpP;%R`*6 zW8wOtR@df$`$aLMWfHkQ<^CIQSnluJr`+ExMMXtFm_B{_H><0w-|6b=I{D1GPcQ%V zYge43tijU6`hS&+%Z$%oLJdXN;WhmTmjA}?YoC&}{psZV;646;=KO8$&)R;=f6My- z|6NWS`>(GB`Ta&msNavhH?OO-zQ6ka^~E{9bsX3H%}VkzONgNsW+gaNlB3jyJ9#_< z@Y_izCQQ|5Bx1Ca5;jWG#v*k;a~e z<3~7#9*G{~phtW;v9V5JR;3gbwiryv+wJ70wn|P~yQ5GYke}7+jLX@@xV0Ai-mOpM z!29RK2izxbICn~mESjU^W8kF5e=+?$S@1s6QSPhH53u;?fGC5}k z$mSVI=NZZ5*-2Mlqo35*v-wN`HOC2Y;rJ8e9`OOl6F7^>AuP*FlI7$HSLNGUp4Re} zGuqP=BGCytZ_fm{KLwv($I!p|=9_Bw9gX)lZ+?>d&(!Dt=%cARj_2ytE3CP4Semvn zziN4z$@Q5UAGto$hlC%awMxBq!+qty(E)*+zu)(F^M0QFSMHnfetsW7IUeu_yw|O? zxm24^rDsdmUtw;ObrUmm&QNq}8u^?gS%8nFK35SsJ|DZSwm`X_gnyWze&Q$>JTt~` z58(0XY!=J)c0O`uVP}ub;=}SClaJXYM}oj*PJ`+Cm} zMk7J8>KM+O47~fD$TKt$^u1}EI}_cZet_El>BJuMQe&|F@v<~KS*pn~YW;o{`DJ7O zmH)wT{Q+H%uLz%C*Wo>L)^h*qRpxN+>Kc&y&(!WK_vz)oa`lRHBb4_h4`A)TPh$qw zEfwlG&NBR|#kr~EZQ_XW;+*k}?ZQttwp{H(9M6V6FL7grJ25;v_>GR%iB+28{UrQ% zVtG9wY=jeotx@Q<=9lAxCC@=ZSb>uoy%zpAVgGlresr6YliVs~hE#vccvgY)5dR?^tMeBjT4mO#-*?Ci&$rZLq$(&9&+-2-`*@6Sq z4|>oMJ&dR8Hu1y4S?$>KUBna3=#VDH8#Ml!-ygX4$pzc+dHC(At@!ws_nC>ivGpKf zmy;Q<+(&vk0RCqtZ1-ivZ;?!m`J-1#d}OH;6*dR{&vnKOn@$h^1m@>W=AMmE{*&v& z_aDXm;9eR(fO~}w;Qpwd9^t4iNK(H5srwou#FH;Tmm8l!?{A#mUsoo&_uHI^k_MG{Q2~CP9sk!GA>}+X=`7bOF4#QuTq=0VWQJZ;}jbe`?G+iHoQt=AS2HN6(e; z5i{xKpCsW!GR^!R%6F~x=^7oT=7&^WV7Jldx(^qlgP{Ad@HSe(GZ3vkLhx6m@>qL@ zqWqF=c<;wBw&^8~9yUbABFCzvztDhveJzT8)eEX~Qt$_}u>A%2os$zIWiGXWQn;@< zzh&h7R%$*UKi_a4?x_9OZNKC-owLj2`3rO9G~9pu#v5|w$`#qiS`Pzp|5@Ap+qdBU z<;%|D!#%9M(1_hH!R}|7F}ymCPwRT-deL2`)(7uxe}6w6fL-?dej`KpuXzBq=>gu? zdA$(4&&&s)uT%3dpr1-@|62N;myOSNN;7k*%j7vzlXA$z<~rkIGqCrW*!xs+K&jY; zM4pKxXYBBJ#)ihj(?lo2$RuO}`$Q*NQ&gZ4H6W0>&C&B$>wo~AJTBk2N9b|MG{^w+& z1KN`NZ??QgD(90x zqPv}_dI0__R2L-f_TdAF#sk=XWRsH?yHS#2RuS))NKE*ACt~CrxIdMi{&C#LvBu7; zuSUJk_-rbz4;L&43w|5Nk)x0!;4a*Z88w9dAmoUr$dN<%jzOv)LZtFMdiY?Dxe~sk zHyq_WI)-x&#=Z#1MpkW2OhkdpOO9eUpFz(_v4TMgJJ-q4-Dt6Z?JA+He;N#g!k%L2YNOpNcPxi z=-G+f$6|ExByz%lywI2-U~n?HJE68i?K2NfOgTy=n_2h<19 z?N%Q?fZ!*Q?`x6FxMoR@Ym$_hdWnx%!g?JGiTURf^Uvgd7Qz2CeE(?lZ6tE+lNcKH z`VZ<`s?VPe?{mp3PSkuKb-(%a z29#3oUqVk&4e|a8e15Ivf2`f-880N)r@cL=Pr?1yUzf|5S&xZ$f5QgmJ?Q82KTEs+ z(MNwX_14WBa^=z`=g=YMk*BUuUbe{C{j!PaPQ9&1+89Oo4*!F>9$fGDA2&IFwdEGU zocFfXzYoOt_yoF74xb)je0+QZxWA^T&?$_8Z^Npbk%MM4#$$#vVh}OmkeOBvMGl@$ zerP7I&p^&Ha^&D?JVP^_k%KuloMS^~@GQ-8Mh%&coavXNhfbHUku#mJ;WH&-NZo}P>tISYHgP@+dKbK=9-NfvqQ>_oVnyocu=UMFD-6We@QNqa!2Wa0Z~XLd<; zhVp+e-0u|ZKipSz_>r64jt|f#`7S2px5(7-)CTaY`}^9T+&(?{g^jG8yTkY?*_nG> z&J)L|Uz3c!<9FvI0o^uI{|ELHkuLwObag`_|4$PCkNQX&AH=J#)T(&^bih_8A*z;q z|6+Q57VzKCLC5O7L$41laz+g<@)zxWE6t{J8gw;v6G5$Ecx&&WIP0gG1$r z7sqSPf!AC)xIjh^F2MgAYjOf{#0aV66*SjJp3f;H=A4okZF+x7=o?y0Ji3e?!OV$| zoNF-($!8-+&7+p2vE|dDuWS72Av$cK#D-Upld6%Vv32JqAr4OCwRE_j(Pi~O7TXH^fvn6pPc`H!gR^ zj&@}jGQ7fx8dD*0k&B5hD~z3q4qJ?@WWN$w<-{Um!m7wWEp=idmcsXHCoWX6gmoOy9ut|6uQs`tMq2(4K>d*z|(jUGyQe zYAu5AM{jWr3u=$A_V!lL|G5-jzeaoa$EO*)56}Ia>CYkc3pCGf z>if*urQCn*@gscxOT_zoWc`NUY`m{_{|4iCFJA0pzJLQJw^*`hfr z0c!7EFs5Jg7}oZixk+sNADsW!d|zMsJj4gH4hW)d=UeV3W4-T<#z?-6iSq*r_;lQGBOlCc@tY zz_YK&vN`};X1DGBKGg@TL$?oKpi8pSK>9xHKGN8KKA**F=z<)40!1zy%*{rEyd2$j zeS>VabMO)RAup$c_jRBj+NmY9!Rc0@bp_2WYMudpX2C)C{Oqe;chE;pb{bqZKu@J8 zulG5*E^-Xd_u=DnjmcbNkmP;ny&xpIzcY#7Vg3izhxUKS=9vB$=D$ir>i>q+|1S%f zf$x;b|C%1tV*c+$?nz9Mm7XK<_W{fQtxZ1o1({sD&X2XFmkQY2hC9 zHE-LMVaPDfZLt7355D6|4yV>Iq5zvxAk!w)GvDwoi3^`8%KJQON`>?Q7SltheZq6K zrj*#C9-<=T^M=N+(8=NYcm znk6{^&1KrTiQK*)wfP?WxxYZ{Z(;#n*RhQHS>^=6&(}Jrj&Wo@6JA?0vqDxcIqx)Y zepxP@{F1YML!T@!p@$@?3SO2u$x+MT<0dDSXC@=Qm7H;_D|f@y-TrNTEj_l4=c^t2 z(n?)f?TnQfNXnD^t3$som5A;8Z63%2Wv_K#pGz@O?RaR}ROr zbsK%)hwgKn*Y!0E_=dhPFg$n9r{~Yu=WuR~Jq&Wv_xW;D_tTej0Inb4KUKLO*==NA z3a=%1`*KsdeR&)Q*!}~O&$jm)yx-*gM*Yn>{N@~^2SWc7|9_NVk7pyZ`L4{wZvC&! ze~V9G?n_#13p&2ZNs8Kp9$xPxj9rUvu65!gS4(`<8Y2@`hOb7SuXf_`6@q0f`*9$F z*NlunhI#udu?ef3m~dpImGQ{f@KxB7l}uPQfBO&rO`l&Awd|re z`uec@CwqJ4)mN4K7oCm{?0$W{Oz6k`XB+Q-H1!%ieSLiwm@j}e$;}I2l5MP2IVE=`{I9@P)R;Q4+Kr5OY)E`J z99QfEU9Qw^7w|RHMHVuEZnpb@^JMXCX2tJE@~rB!opc}w2iYC~$s9}O{Ydx(RE8o4 z9_6{O=czv6yl_!+QaOJ*oXg;IncdiG^aFlDj_VtkSb^;;aD6*9svF20bd@!QLoipXTRSO`n$M(eoGGT$w}1z zWuX7c{)bt-maRwti3hkp{Kx$N=H8h5xX0+=baZlh9J(AGoff+b>l;~!#)5TUvj#`6XSjzrfnN+ZnHAI_a7Gs!7SzB!O0gVMA)!6-jPV?-)+xy3By4JXdb&O{=wp~A? z`Vbvq<}y*cuf7p>Uwd~}Ym8Aupa1L3nAU2bIxRaBJ_Hyl z^&Wg|PxjC&aENo5b4zZ@VYUw;`K;=Rbk3!mO67am&ra>}Wu_q04j|!^;Wjoj9ge57 zZ{f>LL#J>}xm>S)Umn++n|xTmUnQ|Q-w*!-(tf`^=3W!mte@3uw%2Zd3;&7vP2O+Q z|4V_;Nvf0?vQ1<^zP@UJ8o{zJj-i%zTvjNCq{X$ z>u?22wT1M^$yW0G(~~1)&Ws68@5vML@Re8LexK9c-X;wVb(-t@{)`zjK3u+h`CIh( zpLpk;cdGyLFaI+8S#V$H>D6BT^Q;A?+}}uUv9xrdRL-3!4YTu&ZPs? z^5O6PwS4VMAIS&r|FwMi^Z!FW|JGm1qnG|fE*yJbHm*D_MOj*JS07*{_pynZ5%)9h zAT|W>90fz4t5Ec?uQ)6TF(89>rQlljICFzK0KAVNK3H z>F8*ay1F_kE-wDdIdkTGt+uxIwZn%GAA0}&_p5&JgCAu4;upUd_UqVu{p?S$`&X}C z7UlX&u>GT{~HUl{g z>Fpzz>Hd@)sbO4wjVr6C=1BF7d}rD8Tt2Jk;Pu(etur%Emd`@Y%9Z7F3Y_J$@@4t# zd|9Ed&B(^?zvTSG-~Oxo*?<2(o$vhqPvvu;{ju}GZ~sU>_uluNw;uh4+`jQmr(@?` z;;|i03VFcvq-rNEaigSDOUlHyWhNb=*Zv6eMI0VbW^p_x?FhE?2sZVok-DADb|x|x znXNJ%naX?8k2pEVJob%DL#DBxaSVCXFYWeGCzoTnna3F4cU1C2er{5F0g z-)DZS_df*x7xozck^Wcif0u>y{!{ZGv!Bg>nwfl<`xf~B^*&^AEQ@>ew0o$>Gx3ws z?Ps0z#KYWwa~__BLz01?6DkieZ&)kuVH|P%60W1#(RCBsn%{FeTfZ&sJO5O6ZU3&* zxc(2NZq4VN71dW6=h))RoKh__$7MRD#pzN$CCjOpoGDfK#Z^+tNE1tJ^cUPpZ`q0{Rbbx{~yV_Z-1Y;js8Mjd*%O-+c*C} z4(@-4accV|DPgIM4KI_i)Z(KeH%s)`J)j#LaOHla2R+Vq6f#O>C}PwSi6<@2%b^~7>M-Hwg+z`lPw_}DSeEm=VJ^pLr9QOCx&*^d9 z4@i6c!N;EV|LE_2+G{b~EAKV$9{TtBoITbpG0}Qo1Jd4q@AVFzi$-fcnTP zS-rAPnzw%-+nc__IJQ5Mt(&p=8~#YvH~f*D>ixDfZF!6L&y=M2H0nU3B}JcG@_ngs zJlF9&=ZRr{E|}++XE-AXBu4m=&bC62WhOe>e{1o z^@+~g*U`~VeZQVLv?{;C{5`kT=D+gFE9<`Vo$nO?{ont6)W7}PzrFbDa$kM^J9lqW zQ>3@&5WPLr_vg-=BMAwyGMf3)!l`S7u^v*mhcR|Lg7K0OVWa(s4BC!hTzq6Wy^wq+ z(qN3)k7R88*a-R~f!+4@nV*&MP*FhTSjNmpn*DJ8^HkObt&?wj{UiC|5B?th|5(2A zJAcjmCO>3e!|%zX*Zy4Y-1!swA-_Uy9fhckch80HfRqmMV7@jGE40$zl}fpF!6%L(20^MYsHc9NUzl{9f|NDP``q$1RA=gx$ue!~G-uk>sWM~6bZ0u>F>~e&XU6ntGHcdMhhs8x#tfM~ zYnC%}=1iG0d$yzdbLP%<)~?ws_wIek`RPx7E`R!`f9HJr+kY$XzyDL`bD#SN`6K7` z*MGoo_%8iP@5|DvBa)K5%1MZ?mSpCJOrYN;CFO*Zn0QK3lg~Iw$*0*zCY^F+U_U7- zu$_`}miL_DJ*R`-tDn(*J+7~N=Lj4R9P`fQNxnbz4A*g5lDUphd5Zm$qDW4*+sP@X zxb~C6`CNG#d5Zm$$X>tXGfsSbFQ4s2o)Cq%otSunW5*>i!IkXC#T`et_m{^xeoPec z3CEq-SY-T@GA8CI?>X*Rc`Q`MvLAg^qCsrzQ71b3$bU>m9l_^0EHN=hoT&e#)XztA zp4gaUd_UI_bAWU0kf^9tPGm%xjLTo^R4+R%J6pc!w6y$@Y-{@O&ekp8WnRqhI-56t zm+^CdDi`|x+$mwMgxuWePHJi@wbX1UCp$~>^KzZMyj&?L80U;rUW|tyh8GjyMS;r; z_~CM*2u>8coR~DJ*eRZ*e3)$bFcm&bo-|pePMhk?nL7u4Q|s*6(^nd)ve+*Nb@ALUS_3Lu~XFvPtq&HrF?f-q}owo$t z!dkq&(#iMgIR5(jb$U%wTf0WqD%P%%b?a&k>gv`?ecd|qo`(85QLJyM2Ms1}*sx(e zV-eQVle}IwQ8!c_rehKnIv3;*!~Y7h4+G#5S&#V`zykJJ~f4FFrQHy(1QM74Qg1!piOq|d`Av+e^>VG`73E{ z{l2vB`YYMB>-#)oKg5Upk@WWdnUs}nlk(D~vUqWsEM2-pYO1Sc#qt_ixnjAjUbRxz ztXTzCORd820#3k_b?ep=qr(Zqi#oUgFZ`T<59HAeC+OGP=yF2m`9_rm$}|MJ<-es+a&{%1e?S=>MW^FNPP-aC%-TfZ*v_4EJqPydwi8;^Z&zW#>1@#gFD)*G+;-g@f|<}Z57_x9Uw z;orY$q+Zv%@4g4m|G)OGJG_eP%CEhSce8O4fBCkTZ1tDj&F+^tF*Yu-9mht}lVsd5 zv2j_P*s%?E7B;ScL81!L1sEiR3ZjFAP}h@$G;`-Y6+i`by{F!hkPsNvnY+I;?_Ftl zK@`&zm_P1!rrnu&^X|E){m!|0T1jy?=74jmqXxdf;xlSaP9JB=X;qR=^NfrhT_*@y zk%cvDf}wvPM`rSe&^v$=d~B2Y@WWC3(MNYdx7h{#V<%_~DDCg$)Wr7rl&;NNWI=tGmDsE;}cbkZd1ABF8m7kx02qd)Yz zDE{Dsk)RQ7x*aqE`=Ad+sz3c{1o}pRZioEaj_vLGwtfuPOnP9u`jekTKv#?e4F{!t zBMry?Ht3eyaE`X=oa-2#sh=A=PJP979u&|1$^Ba)dxO*;|9CEB^E>Kftc&ogw>GOQ zS03lVE1R&^T^kP!Y*XjYZ{;6<+=@CGtvo8KOIs3X3F*#=seER>{*Vp&$fq{W< z4i681<67}O@ji5iJ29X9b8%7OXW;j$T{~k2z@ut(WQ4YN&u$fSf|`_+q^5wVRxf@Wr^Sy`Ft zk?bRC_K_?#o2cHhL9^8y2`wjEm2xETaE{6(NtI=4Ol3?)V=8nXP#fqmt?+mY?>adQ zU*G_DI{LMO{C+Jr_nelO_mw8gXYtHlb=R&M?UPUTYd`<_JniwH&DEZGe7^R?lk2e` zgLVMzpqtY60qw~rW3{KAI)El9ZF@F4ccJsfV}|V~abNvev3LeG*Rx#Drgx)ed=J{* zuRZYuwS#!4{b>8fX$Q2&AK$09C!W}g>(6gL``KR2)%JjjHg@ds$M7)Wh+I)cE)~HSut~nvj^FCM6tJ6O$6uWZE|HMGAO= zctPijRPaSAcmjMtJYoeOScxYxt>B4F7f*m6h$pBK&!nU#58{5!MMZ@n9qsKufL(tV z@#wYC@yF8@1_t`?sjRI0(f<7h-V6)d_AzAooV2vG58w}&)zZ>DtEsVZ7VHDGrdiF@ znni2Y&(k%o)&lBkt)Q)~t!OUV*4j3!t*sTUZB{$A_I5NuY5UTxqXXBV5p8YlnB#Qz zZfR;9?&|Iu?rClsK3QHq+>xI@+*VjP+)_|5)MU30HDqL*s#~{?Ij6n2&iRX{K6gIz z^a96}XVyBrro=eBybe32Oi4ydLQB+}w|5ebC%PMLQ%i7Daok9a*VA#szIUR-+i-8! zGw4~=65Mp`*<_Bc30RU$6CXnp>b#+y&j@PtfkB zhI!{3H@e{+NVgfMX*fRG?j9N%`Oe8M{$xixPwwr}THD%qZ9{|RC@RvbPMpxnK#PwZ zf=yV16>iEG4pqQ>jR zzVVoGTbw5fjj`5hdPEgPDq7NOv+$Q?aH;KdlxJ~i)UZ(iqf1UY1Yn3&t6=mPvK3im@YTLL` zvv1j=*+W9K+~8m>cf$srd*lc|cJN^D`pnD|Pghn}{{XV=?>jp?|AKtz0|P_f8XO#k zjy(cC7`fp*a6M)GwVpF>_Wd-C-`Us4|FONDFFJdMcXW62`j%$3ro5b278R+bCr4KUVVhPm}%qGi5)&Ov%qLgPl*U z*tg>NB`Nw_sa?*sp7-?Vn{mbW@b|akH+-GvXW;i6`-@jUV|H^U|hKJQ} zx3=K%r%c~0uc?J0Y1o;2>@#8!{H+LvEF3xF(AAtG!F2)@21@rM) z%`BFk7)PlXQ#7uOjmCMF$1#2E8II9;ah=XLhI8WDOI<_fjn5&z6YnAVihZKudB$U6 z`(o$BH5Yo8c#fdrTB7tm;<%u6Ts+J8yN&NI`igrQ`-)>mYV1qbigRPfeSMSge?>7L z?`6!}>vQ(z8>?CH$}F~bZca8a%JmQZo?8cHf-BhuH<&7lNY3?^Fv8V<^Ck= zVUPYzPfyRigptG8xf}ZAA485@b?nUK+biSSYxTYG-~I8aQ~Uw&{jR>#ytTVat*x); zH6_JrWpObtD=AS6$p*;J*K)1t-L}=Mv)L=Jtd)JdzkvK-$}B#i%-=r|a)riRmRr6M z75hYwxQ`Px9v{8VeU0(j(R1!TqOYK%=RKZF<6fLIUQ5S4_vt#pC!XiTzM$fsqR%Kb zJa6=v`@Y6L;hd z>Rs1r44U`3IlM2v`@n$u*U$mxo$BUI&;jaOTe!2LoL7VI%gF{PEYyx;I}d&U+m0Po z%BQ}#m#AUTsmJcgD{JmIFaZEWJWpvH4zTbvVA92eAhTx@&N z3tdac#=FjVPV^Pjvya#}_7TU%qvBo{qN0yDC-%pq;yR+9*SNkv>0}nm4#@hIpbOcn zudHNCms(j=bPo&L#ub#drbe<}flY5)vV?Sdo+n8>8yK)(my}fgH|h9ETH zn>KBg?Cm`ta%CCw^^1~xeN!+Nb0GI<4j?LB2ECkX#=F$fFH+p;dzrzO*3LBsWdO%%s6L*%E@v4#%UIzXz#$0gp=uw`>*ty*8+e>Wk zz8fL?`Ub)e5C9t>g!x+HFz${()(~IFXqTeKYs9u^A3APqbl!N4*!Jvi+!xmv`;K={ z<8iS)UO#dELe#U5cn9OP;+hMc6W4iOBY?|k; z|9mtwsC^IdzqwsqYB|LL+S^oTbv5|`)pE=M#fS$SgAIT*DQ-_r?od`NPh-EF9xQuJ zna3=?!IH(Y8-9RH$>K|6mqGqBH&qP#GLF-E&ttSt=LDs`v~Q%N_q^CS!*egxSKL#) zo1o&I#e0c;<2{Uh#kMCE?`S-Jq2DB)YowwN-9x;`c+Xe#@9giNgzvr$yuVbM`s_kB z>%A>fNXSvPYgfNazC6V2biT)O^(60YK|z`gI=(G4Qw0RR>W$LU>K_7Y^0&aQeoyH5 zra$lc^V&q5&&Ur5{1 zWs7A#WKJM-fUOvZharndM$!1a+(u*Ec&+EY@f>aIJY(o1_67C4-nf4`*LYqpo+*yg zJv_I?G2{KkF>&q1sOaZOsn6JbEEYxAv3xBDAnVuRdy`!s#1<@wXOWT3Y{w2&CcPeZ zz3$7SZN&2I#QTWnC@CpDTQf4syc`bazXB`vR}`-&Sx<3#!S`nT{PyI3nv+hS=J&O< zXloD)sOs+GbuI7%R#kCefp|IQfg+5dqvQv)+tu7du?@C`UmQZsq?NLd*Fxs)vkJQC zUX0HyP#U*3k4DGr9>+Yd5&M^Wow$A?QF?c3p5Nd?zyC6Rr^N>Sis8Ga;k!n|-@2Un z`+dRQd3z&Uw=R$E-hGzh^*Ya!jt?6jm>sUHUd`=D7qJ~VqGiOz)&1`1(Mny%r|Aj}7YWW2P+@6`)qkOqJ zpS|_g7U%#AnXk`M_yV`X21ti5kYtt}daORa-PE{k^Eh{@{j2FK?tL})xSGCS=lOQ% z^)`IV9Ld*m2(o@7Fc(Xt>C>09Pe0u&g@-$!ik5Ab%d^yPZ9I_FG0-Ki)VnkKeX)!yUi^dbM}(_}){z27bWWrbh07{3k3x zDVlBrzz>*fvyIr0AIv`ac%S^j^Glew_d>{~5Xh)l$SR6U3He97W423w1L!aoJ7hiS z_*Q&JiruZi9I%kRH8X?-tzgjc`xwRR-Lbn-9UsT+!0p&=HZ3PPxqWR`R@pPPwRQhY zF?)lKugB~Ot7Gc;w=I8PvW_wE!2j0Lsx9vX9{Km${e-JTyQ^z;?{7QAX;bH9_*Z{wV4g)Bz7%Q&t8Wz>No{H~?$_ zU_}O$oiP<`?wsB7^Up1T4^Zd;hcJf84=C(%Q~v+H{D)ny`|~nDcQGH!D$JRIZ05}M zY}t}57O}lohD_Iao?`ao!`r->+ep_ZJwG;9m6DQrqEb>yr&m@wen7SBNXI8!F7moY z{drgV|C`sFb4F*U_EdATwzKmjF9#mj2|Qp;MY&oD`LE-Fq5mHv8z47Vv!$kj0i|^-}vcLhfGd85cWusdpFWFLV!K*E7g_;B+jZ zI)-}s%PXY+{ofeG=t`xCh#}pFzkdB#?2h;y`8deO;|fYVWF#duEtjOSpV!sZ|C14y z3)}u1X3XB?->aR&&z#Zz1#y5yot-=n^55Cnj?y4Cyqe+wXvOdY>Ud!20J%9i1IqUB zB4yV55%RPCOJK87EO0Z%HsR1D$TndE5I@|m%_!^l!B4Ul-)13u?X^`bFd&14hj%ex z@pM@aUU$drT{0iC-;Po?@aLU55FcOl;jv?tKOMv6o;7i~h+AFlcsKi>{|!e*_&3|z zwb$F*cq-(7HN^rN8`PT0O2PuDloNdX=uwrhKzZ;3D)I5nEHE%x{^fMU0AT}IbRA$1 z^jYMiz@G)azf6Dsg=D6Xr$2Y8e=&RGjrDBd7s>G7H#1;wM`bdGC!HNyc6S%AIoYW?kqcg3 zUhcvJ7Xl9qAApVpu%VRT!GjHK-n=+@+Dk!*VFgIuz^D27?T7rM{IpBSe<3rkhTg2c zB==oB@9$4`eF}I#3U>W+_QDHGr1#$oXKU6Rl_Dd*LQM_9_bxmxYHJWyNB8ON->+t; zrFHL0Oe}x5sHp14sDJf$E?h3@_3K1gE;YBumN6ZYT^eF2dp^R0UMx^ z*8mSle!x*I0LlN{TyC>kdsxUun>=&o7U0tYnU@#E1E2%wd8j%b=oYm9jk5j#elOv4 z0@*9S3<6FkmW6JuhpczS?$)hyVf2XKMWa0Xg9nE*5)zu%XJnK->u}WmEBWz7eT|`^ z;ZZ-n8MD8zoHFJ2_4_Wpz1k%B0XHHq_&6|uwXg#mHPvbbYyjYaRUHou9Uu>LfDN%g zws((1`Q+pM@=Gr+mArrn_VwL}SU@cN08~T6We>Y-0Z&``X36fa^IW0JkgTU1`$*V1 zE2Zb3Tg={jH%tl&Qh?Lxm5_e}Kc1%R`5QO7V)h$0==Jm{X3tVn`wu53Iu_XN<&QQr zH0rr`r%(5Nr@w!|tfghj`5PwZFE)P;4r+hh+{}Lq|GyPJKnLsqCvt+SD=G*N%ugU6 z2zX$Z4FEillA7AhR;|jBXS}ijvhWM!1;G{oW}W!NjS2pP)&X4c`W*b0c*HqSPsb;K zO`jgbKKnEdx%D;R`(eW7z@Mkr)IePwSH3OT_}I4Z+ov5tyfh*?x%5}1r8WOGhRgkm zYGz_B3bU5h#m1v~?)u64alY*x9UYnvY60x%>Qu{t394;wQfq3ec_nlJ%9BcFlt z8VJ{5@m(#EeKT|B2DV~_EJa22>ajcc?;z`S-#rugwvhkGljOij52j*0rIlG(CBC(_ z^`p4luf95m8hWmnJ$V1R)~6rm|D6zW#(cLM&exayzxVZN{|y@;81g@#`2Q5}0QFcl z6g7gWEGI3d)<8xgFVHI(IsnxOO$WYRV`a}MEF9jckA&)H{l=6av{Ve48mC`Gb z-JbWpRA2H@D9}|@nQD-bE}{O1TY^jsuR8oJViA^Ct_Y8`SBs^eG@=K z@y^RIcLlK7v!dDBHKi;%y5A7H8F!Jq>W7N7t+fITly1AgU{vV2({ z@PJ{^p98^9R41Hbfr&bwO&r~ybo@-b(;npCti?M9LdRdjKL0EQal01GV_eU>6R|tu zcWM;BBikN2zLb{Mw&HYj|Z@smlfscwp!NN_Nf=+qkJ({^)nH@B<3tQ8OpJWwF`kMKYTTzNsdAK+5HK%?v)Pd6CvxIVAw z`A4ogxtMz_LDF+m7o$#YxU^zLF6v{SmXLQhiqoOm8id6MUPoUOgM503+2>fTr(+Tm z%iaer_eW#(a?jo~rsJFIUzz-Mb^JBazaMe}?|}{Q6539z7gh^Aa9vj?uR&gLC2E5Z z9=Hf~LG=2-gauHPVbTHQpdg98{@O;}58w@dI;}tF!pL7wOfbp%Y&`QI;&$sH?*rNN zmshd*^Aj*9IZ!8enD`v^Gr2;wH7I^Zavt(tS+$DWF(;sgo|=)8(z4cSEtytbU3=e{ zj!)~}jnF#EIv(G|<=)!kexmc`jeNheXVsrHHfjM_AE3OoMXe0s?U8`ip{x|zT)^dCw{sQ6uO zZt3HM%N6x`fp3AFL1mTFeteL!8zK`7Qi_nV>a@1vncJ2XH!gMJZ~75f%V( zfTQpM<`Mr((jYrlSi)YO7Q{aK-CoH0 zYQ*ja_1GP1<>^>_$a-4e((S{i_#OH4G$}LlbYxOe>04!GHUCL5d&<3|dbuVp*Oc$q zf_H9(dyowPAAmnv*r{&S*-3uDPPGPk!Ikg>!Uj;?YlNse9vFGSEG?~9-m;}go(2E< zbI&e?To!nsL(C8LtzG_jp$A-v+$Wq)8st66`XJQKT+H5nI~4ghj73FtppKTFW9#*a+DQ;-+CUSBK7+Z(ZV ztQR(h2g<$7IDo+E970TSi+(S{(7y_r}|k!*6aQ}!s8+z&$euthML9P zmYCRo@bKZ14+;v(9wuBa)yt(dF~P z+dI^1Z7^L2P?Qmtl++D-y8!vIk&ySO5$LlVae#2d0cicY(O4kPT}b|u zZlJjHZ(uiA)}T)yd-IJDY1uN=$&F}3>~2_s?+$joE8mv<_!OrnO0hfA`D0^wPImU` zZOFZwVXT)+I=&gRH~I8dK0stu^9#G?yQreEPKh6~*mI))RgY^4^+~(j1tRQ{wG(*8Pj;niyui zT$A^&7q8rk_jTIi=lJpRNmNTqtcgMXJQpt4jM?9c z-M*hZ-R@GzU~y={^7*3qUzR6br<)w+>)fFHFz1rTm*P=7n{HrcPbLX3vfU{=QI`^^chd1m z?_axC1OKaXe7trfE30R7T3YeTR4-SoiQ%c^n=$+AKSoSGymh}ZY=A!l9{3UD1g(bu zucE0*ttKo$L%mvooPaXq1sA)p0BRm#fyf4sq#-3Pu1#LCJcqsZI`BX~fv6E04EY~} zxIM)KH$dJ8vKcehNejQA{F{2z))*vQjs%{EPtO&z$3Bj^>Sr!pswq)XDr#wIsnGEk zFjn#lBQBS6??y({yG$Mb)*XxHJagm!TdECu?ws~db#?qV@BvC4oxB#gfllZI)yN4b zE3W_+ph(XNq`CmW18a&+Q5n{-kT-2Ak>7oHC!_j6UWf&Hc`qWI4*T`5!rAK8M!IW8{yfUNquBlOz(Asv5UcVc4k{}dLM>1$#bWA-k-H+6iIKW;pK z+z#K|Z38?998e7E0+*pKAgvKl18h*Gv&Mx7h7K@_2S!eSEh}qK*}Jz9cp!mrJ-@;`=-9xZ{sZ9p4=Hw*w#Etly}r{7DGq=&LjJD4p3iJ+=ULGI z>$rqFlEDbUZL@0MrK4fCnC7`S~MqZ0uP%BH}b~K_lRO^5g4k-Rb^3 z((x&V7aXhtJH&I-)BCZ;ZON-8B^5ssYht+kd1GtbnzH`(8-M1UbMyc6;bH!5*#6JJ z2G~|tr5m!9mgEt z!sV`7rP;P^Q{}WYEi)~xD^QlprZ})B2I=^{y}jS1wXH>-y{Y5h{QuwN!Q1;kfDLdr z;eo;b0az!f0DNE5(+xjh8?SU`SsBgM4|A z{kBDmxP8YCO@>eJV0L!LdnF~#`#O%qB&%ySlZEy13?ag-+=>NZS zaFG8w{C}@tod7FnU46Y;1OC_Xz?J3NiQ|RC$BT-F3ewVs^A8?4of{iFV5hb038S}m zt;(R|+Z9FIY_~T~X>4r$KKbyerVhz^;~KZb`xEGQ-`07c=Ko;MKVl5HumIX)zyWVY z?7s-PK-KU8)HF6|m6eqvW#wgRVNUkQvB=22yv>`3?BvIfiXtpNPnG3?*;Q2?KkVu0 zy_alys-s0bFJksCS#R>a_|_&h`EH_(0rCR^3jnMgp9kJoTAFzk)d+2B8bLn5NGWoF zi&v~TWBc&KK^t`ZY}5yfE-V~=v9E9BFHu(%ysq6vP1Mt&-)Hi@InF2AI5*#C+%b6v zumIly7WjFr6PkwDAJqk|=;_ufcJJyh2n`)j^7GZaaGt8Pp6MhVk9}rl8AE7qb2CNNITH{bFv$Iv?0BTmO6S4sLg7oSZ@UY diff --git a/indra/newview/installers/windows/uninstall_icon_singularity.ico b/indra/newview/installers/windows/uninstall_icon_singularity.ico deleted file mode 100644 index 290b1dc2b880448cfb5a5877b660a448c331b832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367994 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 U(hkPq&zuK87Crv{R~!HT0b1u?=Kufz diff --git a/indra/newview/installers/windows/uninstall_icon_snowglobe.BMP b/indra/newview/installers/windows/uninstall_icon_snowglobe.BMP deleted file mode 100644 index e7291fcc353a3279f9ddcbfafccb4a931cdbe74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260154 zcmeFa2Y6mbmH!`l4V{o)oW$Ld)r%$D>h8T;a_@E=cgMZ=IL)a}b(~ImPe>swOK%H- zT^2SFU}2X9LJ3XEyz~El&fL-aN|sAV^7|W*p66)pojzwypL_3HIk@yM?>K?KLP2MN zPvC7QoUN-9PI#xvUwZcm29}|J-urfF$3Z&{w9`O44YbohI}NncKsybz(?B~7w9`O4 z4YbohI}NncKsybz(?B~7w9`O44YbohI}Nncz+q`1l}f$swbx#I$6x>Y*LVNrFMoN@ zpa1;l_x|Zme|p~^|Mx3RJDU998Rzy9^de({T6ocxoY{N#)u|MT z{XNJ4=7`LC<&{@H0>8ib;)~tB^rbHqefG1T?eokt&s072)Kj&V{lHI#^FW#KGC>*@22*4?pV$3^s!nPy(ME^F&P&VhDqwT=15l5XF= zeHB36wo>x8ZQHi`aA{^4*AcdE-MWVBV@cbpL*82fTefUj+ZMc$v5s|}hpQLYA8|*@ z9$#|FC5!j(-#_!d`|ca@xzByB{6GHVKRW&2|NY-5@SBfU{f}J2&j0C8e|kE6f5#nn zjECQrE?s)@?Af!gojP^uO;e^!xq0&B$+x^7m^5k90qSR_nb)n$jg($da@|&XxIFTKi4!N@cC_?Z>Kv|*BekWhHB6W=;db&e(|Fyw zZsz^pGXCM(Wae`XWa5`=Xm`ep8P{KU;f0qWtI(U+0r*M3`OR-WN(|t5)cwTunBVul z_q{F;Km73EJ$v>nn>TOXRij3Y`gFg3{hp|)sd>7(y81I!RaMXYy+UPW<+K0jP*G9w z+#7|yefvI7A4f{tDkJaBfIfZte3pKWlpd+G#Ou6{H}){ zdT0nb^?23&FTeb9hZ}Faak1=``^JtP`?b2dx*zxMUH*T?#U;NjDk}P&*7W;KC@wDi zeI~@Rm{(X>WcAbc>GtGNKbFNb_7Tg{DSZ{Z4xs*_pmqE{KtV>zb!(trW?trf>?7u7 zrlE|vGEPXt^`ZTR`4txz2@mPH#_NKD!ao!h75;%#c*ubK*ZSg{QTTMiq4M#TGwlRpQk=DA@-S>_j<4CqxCqUU)IXJ z3kvf87}s@ZTKKADz@LOm)eR}v+Rso%0r-`@_bNqdq3c^TK_a~~n| zKDKFHKjvqqp-vntrY*;f^<#g>mWn@ZzA>fGcpcILyXU%PeykVrLwRmemo$Lr)@MRG zKS%jFUNmhGuSt(~9oxJ)Y0u_4{4M>(`G&ORTI0Ionj?;&hlopPS2{{i;>9OkdeO`8 z@bWJNeYk(EsHpfi+1c6O*ZjUA{`nHRf6kma*X-N3Z@~*MywICi8ZrOlh4zf)%v zqvgZ=SBDNAJaFE5=lOHbJy*~nNx43D=+NO@>*Kuh&Q*Uc+tGI%qeF-DR4GJ{f0S&c^vC_={D(pjP-L*x#j>Ub=`ga?bpCKJIwoeLa70;+0okxwd1+j!n$HxVYH$>C@Ls7P!8Bds~Wp z<364CmdvB9uj}1Aq})pes!mAB=RUJM){k{!ADQ>D59(%?x4w`4AE{1k6Z?$wiEU%r zRv)oV?4xxW+XNi7J=eqa5!=3=RJz4*8P-s4dMD(W{!v+(@ZH;$mzS|ON<%(r>wNNh z_wM7$%1Y@+X_<6cnWe%>l21y0xl_!?tBs|helOE~8cTVl&1IoZN%K8*L)%y{q@hjA zymVh>uC%n&=0iQ^m3bfQ9jy<_g_A?(US7^xn15I|xMH0FXPGJZ26qAP(7$NFS5;Ly zfv>Kv^ffiruDZI)_v%&R;C<<@l+wR;>(=chcwc_=lQU<|+<)0+mt9D_Uw-wO#}n@> z{_qK%OYZ8_sguKw96frJpFMk)pEYZ`m(21rX9k!)eVXpco0_EYn*3>AaSb2pgnRM; z@}^IpqH7>sr*+*>FP76cKp&x9W=emtKKbeEmSe~9VtGiZKeZLad4@65_2bxaUaTEB zbe!~jDa)LHW?lM=>x%iA_nFr%$4bvB&J~U zRmycs2>I!wB8_2h(ZprHs;{m`L9O#frMN{70xUAz8| ze1xwK7%<>5&dRR7`s%s=@-P2V_OqY;>@?2#j~BhK=MGNZvSrI&|o+b9(B!rG&pdnYfHHg`IDOS>+2_4Icd0_uN0B*VD#LoH(I5oj8%ah8B6P>$G*Rb77zEXT18D;6mQSR_O%wO?k|ppm~g^ zt>uTZ*tT^V=NkKA!~Up$<+F#eJiSLP%i=y~meUve9`FDzXcN;o_plG+Rd<}~#&n_^ zKYoIrFd@vHKE{s^I8=LGk5d_Gx(;>6j~|=lr~3-|<9xbJY}-~ku0mx>txNrIL<+~3aJXrs=uYD~~akWo29Y<&Uk@uzd zz2ucw%+lA^))-*hR904C+hf0D|Hw9q&|5ZDCY1Yf*^)pyKU|lW$9m~HXSzrp>>_s_px4V+q%51`(C}uWZShIo0v~#9`-G5V_xg~ zI9^QK8izh({_CA*X8pFthUizK-__FlYt&jpfuAq}ze0@cY?exdS-Ylk+9dz*ZW zdBj{Z>xBF~8(;k=X`b~R$IZ(ta3KzxN8I1~*Sst*w6Qq4-N*dQG|ZDap-n8~p1JFc zAsIKMu{@@fr^gT1A&)Z%+Spk{l2XonTz~8v+{LocCay1xA8^aLM$C_EqpvuAW?gUx zei@&9)*0s<)41kvmcyKKo9jfp#=6|czQ9Y&4=HB{ah;hoL7x$ane%}Tax>SGd7a=W z&OP8Nt~aECwpe$ZN9J|RYn=uhr`yEx*!IwM9a=ZGAx*E%>RD`zScGIec0RE{)BE!G zf34@>K0AN@{41}z>Z*Cf_<6PmU;k}yd)r~(o&A3;6LjYA{u^$%VYzVpSLRRrGApZx zoo$Hjz_s`!oD&6_%dxU>ooDAffrr_j))3FL(rGx)gIkep=QE^4m|wUL=ZlOT?!igswfHKz2Ve1wGF^wdvQQ1#NjvV>Gx^?R|-+lMpW4`sRZ)N}L zSHJrB@nr8KXL!c&3t#xxI{9PY1UEXLaGYCcJ<{{}*iy~0($Z2p*HqjUJE)h%MnkMR zo&gZoH=jVUQ(~kc&M!Z~VztOe;;(@EaQGLxwzRag*dYT-N=hVOjfWGx6ZBKmX`%<| z3HBYG6>Woj$6je)m9qD_u4m6|_R?i#u~(!$lxEv~R#sMX9_x%{aowb$Zoot9eC{*z zva_>X_wL;#Gh3#r%&r=+T*`>y6&>3qm^h4LNeE8V+y(|s4o-fmWha{6R`UAuCY zMBC68`JpUJbI*d-ot{^-b+dlyWZ@y;2V4c4#^i_LG{~)>qje_j;H{F9B1_pLo%Pth zYcFKimS@D-@o`GEPk|rBgGMW?6TQLuNV(T~&>=Qw@DkTgd91@3ndYrN0`B7aNNF3_ z4{u?2;zL180@7AzPl4|62~^g6CKB&SiP_^9(2smgi|;Gn`i0J;4u>wGL)OW;7cxjV zGTVjyV87sX#q=HLrXjU6$P}?Y(fv2j`TCpx+;h)W@a{X`GdSMf<--QS?!WH3>$b>F z`7>+6{)cCvBXB%y*f7OSh(m?=s{9yT*IUeL`0!zh4b-v^Ru^9%JmWJJ7nibUCbyxl zD3{?&c!$01+O?a;>tyGn$V|p3_8@%vbIv)(pLNz*g0ppfR>u8V{){uu@MoTRx@7Iy z&27_Xw&z(MeE=OhMhJb=KfpQx_A=6BNW0m6w{9UHS_CMI*YUn(JLo^qHhsqa<9Kmx zqyTfvJhMh`u;$ZGKf{0OQ=d|Ln(jOJv(FCeWzDCbetHI+>Q6iEG=It|r}|S*J+-;7 zGtWHJ@Dp%%mfD})0?21v=EvDK^I*QL2|f!t5WR>U7if&ILmS+V@sKl3{I zG|h(OiAYcTJwB>clz$X|Ni0s_HX}|#e00b z8-G06`_aF6$2;C}f?^THS6;dAGpwC;Am@<(TDRipw6<;sB98wn}HSRiw5q z_Ed7qvA?2c$6k{{+uD2GhkWkS<>dD_x}Z)hi*4dPeF_|Mkul;}&`<(47txdHvCQWu zkddGG#3$T`KJ;OK)>&tozF|%52l@|wqz*O^wkNpy(1$(*?@14JFxw%KH~63Mxr2YG z2XB4wgCDfI>@)lD$xnU~o^u-0pLEhm&G)*ty$k$#szX+YUmQGxtYEL$L;PIkqj{PA zCD~#2faYTJqEF^iQW9*2s7H}Cq7U15Xau=~-GQ8mYol-SrF-lgMz}LPP>1mt7u}r5 zsKkaTv6TF%yQv>_J9v~VF+DF`-=Z%1o^t9YdMnyWwl??zdx$z3JD%%1aM`(Ymy~Ge zYwOpq-+bqtcaG!R7d*@Ns=ncIyy^VN`=ol#_&q=T;Sa~^8H8_(&P>O_FUZ0RF1WyN z*s#INfAOnVueN*iJUk11B(!6`4m80&vtR5BwDy4ye87L?BOkHrWUtH~z{Y|{=?mUK zhraK9@3Z>Q6k}s=L|Lx)3{1Ww|FK0nb?WTj{qA>r=pG*6EKp~XoLlKEs=@BDRmg9B zAI=RqCk$nrI73$O`~>|_C+I&rW3oP=L*(Xr-}_#(rO;*QLejy52RG|5bQ$_nGSm7-9>)Bd*iqp*O!g7_W-q`!d(WPd!VByTKsnL_Z@xnJ;x&J9Z+v1fZQ{j{!1^YiKdjBjqul{#i5kTm#S-bwB#ik2d$gJ$i>c z*2~)1heY;S9({lZio$6 zZ-4vSPf#54!~gx?KU;XuJ@@>CbwLZ-X9w>~mYLqyy9o}uXJ65~;7IE?Jxg8oPy3{2 z0j798*I+sVnGXMpN2P}={DK7w^o+|4ofp?zI(_Y2t&Ue0({V`p+WXTez ze)O!-ET?Cryq=GCy5=4`&9Psid9yFj!{n)q8H(P z)&g$n6L|q>AN1_SRI_iOZPhnDNT2l0{OFT<-~rsxH}nn8;C<@q`wZ59BJ-?G?1PlC zu>bG{=!<*e3~F!j2F76zNfX{TU8%jXeZl@pWU@nUPzPHGn?yWn_8jYCpTPrj)LI?3 zIOB^pI7hR+7C)K|10BWnNPjfPBobL>x*HviJwRLnUd0}P@1aF(AZ!6_L3EvDkF5pz z!!82v&_DUCJK7_ZBR9}B^oN~=?OIyei)Z4#sJQu@FMs*Vg+JEwyPWC4_s8RVyOHl> zDxN#x_rL%Br}V9XZ94b+HToNzK@+n1{i;=~ym;UE4w((#L37A`onv}E!{D#K{(3K8 z$LpIiUf%%l7him_$!+BDd*1UNlcCyAukW0AoqzbXYuEbCn>SngjT<*YKPHFae`pjs zVa#RAmidJX7Ye_#4WI}39G!>01JGB{I(48m^e_Oe(k~Esj}(BPqd$l(3%x;~eQM-OO4TgEdnRTNz!6j%5Duc=V6ChF<{q5}yd1g=a`-+B_v+kTGT_uomz^ee^Iq z$9T{KG%5bK`?hdRzw8q!HV-}qG>aX=*!Z{LkoACL`i8HWJJ;Bx$X)8O=dlj<2j%!c z^v8O|8^6%=d)vPH)vxAro)`5!e1AOa{K)&HvY}6qf6_tE`re@Z|D*IziWmnv9Nw4B z?-nm!YAOpQ`SRt><6?u0FHMJ` z_rNdwB%XE13CUsyeS;%#E4$rcyNlNim-yY-+N9XGv}JGLWo#7IiOvQ`><6+Q-O7B> zkJ$9_T!6OZ!Ncq~e2*Q793oBRfY~FG+oq4PA>cD;4t_-*NbcLS4$}4JgQMr+LsE1) zdkn7GOXi6!$-Lm%sOPDR{t!Q#4GZ4EH*IJe>5aWa|1)po269BYDTQv7uKV$=x8Ax( z&+Yd4@BjYqQ;F$wo(IqWz3_dM0ivT5bnc&}IK{ov7me8W&^x*S{ufP|Zh%&VEAutk zWA-0>fq(D^UXnd9Imw>02ha}X@C)VC$5tbyA8ZMD8NH93K%Y}af8ZSXPZ?vQi_k&v zOR|U72XqRp(4M{-D+2Z^`IOTS`cJ%Q^)n{pv;H_&*2OrC&zRJqoP7YV%$s{+0oX;XnfehY&<}mm zmUs#6p-X6ueMVkF_sDB#hCPP{!3}+>p1bCnYrgx)Baf_;zAxgN*2MLAcJJ?v=Ogcv zVyoyIL%kILe^T=QHPJ*0-HA?t_t8P((iZ)c_G3S_#iLWGyupJ zvpjSWGK4bdL3C(3O!CM4D#-?u>BwF5kZfGj*XTs_9Q%MT${sOp5>K+Yvg(*UAo{U3 z;$8DMv6D5XgC=B$nE!~5V87AF*oo*L_8DCPPl=ALT(Zq{ePT4P;v=gb2+hKvM{=vi==(7Ne4`a<@R&pfbI=nH!!+D^#Yc#W(_pJOYi zKiebbh)kyqV_;h(evYNs^Z4rcFyI-!CuQ&G10Pdmc7`H8wYj5j8I!mN_34i}!vCxr zo`y#7J6Hp_B}E2^uMM~C4|K@*l2f)fYHu{cILJWa`>ct%(+9Xj{zxVmJ&4|HuZ6?c z^gYWji|^-u=R4o&`M>}BzbA=b-v9T`_wYV)OXm{rQv9z#Ydats{T(_1n!}!l{{ehR z=qu`JbS!?D-dVOX_5yqZ@HjjJ595PThOWSd!zX7?k@d*sB;IFwhj!GXKDGybKD7L< zcfHH>4|@hJ;2Y2va*2IImU9M3f5>oT4)lXg0niEfAo!)|66OVLN$f7d~*4 zo`?COzMnpm=k$4IkLPtc$NPKM_nEq%*uQXlg5nlu-FDk;H);?6gbfHiLc`EGd=Abz zBZBtW2k-^%!6!V04Gf=U+LYL10Cm`JaLXP;=h#=VF7_UB7yM&0bIqPm7k+{t=$kQV z$39Y*Yv=;rh3=UjZE1%sihhRPpb5r;FDYkE$O_tX4c)}^BicaI%!6{;qHnP|slz&< zYu121VjkG$%z<+FE{;n+^I%-)FV2%ODMQZ2a@sKlYmIZG9lSwG9(bpm^|KDz#&t0- za6vh8hIxZ`coumDO@l+mqz&V`IpB{#gV>VrA2`C+#MXz_=>z)I{LOzLAN|Q%pkM3&d@bmee&J>Cjb3A3(5YzN zVqwv4XAST>e8BkNQ#@wls&BLPRc^Mn^nA08j~-==L}%Mrj3+r^~HK>`(k(n5A=oZ7VjD!v_6{$_34W}MDCzx#JlEOux`dzxz!QR zI`&xjZQeWZf<#;XT}|wtb3pw*h}qK6Jo+A5f*0`<@B=tYBo2vA zz!!i&pjBiN@g)2cY;EX=^FU-h^unC6UGZJ$1DOV0;h#e%=pf3l<2lFVn)N|j=!IC0 zzKXUG^H&VO=762b*%@{u_7QVLf8i%ENBU)rtd(olg5F_{*c8l-JZvLy#CY&~ET><} zMVGc#@Jav3QPzkrL^xc1lLHo~*%QsLg@F1n0;6YW_X zPq?>dVW1V!teqX9E3tF6pY|*T`WC(t-J6~fU6?KtO*m)>c^rLT`iJ&O*>m-4=P=@3 zix(oZ;caXNbf);nvA4($^eViI-bW`R@0pkSG24JX(96UR(P8w3FDn{y=m7X1y$j8X zCrwA7laT@B!*}Qu<|Xi{cNAw?bir$0v z;eGmmmaz%oXX+x)z!Bx>VdNKjk-n)XFy0`>$sE!1$Q5u$ij6>DaXjXXpMuV0{CE#v zP#0N)jez|u{b>D5zB%MPbOB$oCUmEG-}V|FR6C;?^f~>qH^>#u*Ve7I+x~zbaK_r$ zC&?Cj1{gUa-^TU?yfa5qcv`$|XL)fyu-%ZC;%Vy}{lqvCH|#6(&=}SyYr}Rx{>#2h z>6=^srFU}H>3zI>Y(rXx&H2B6Z|Dx~`Cq{`_7pk^`ORKqS3(Qe z-;_g3&^xvie9k?4g`S5e(Z$d^`Wn83w$UTBVb7pvAfX@AXOyu=#0j8l_ATlI#zz0p zC%!NAj&IM{>?br&8S_ELGY518`Ubv6Z&Q~#_!iJ6?WxcFm(T(c+46`sT<02jz9cnVpJJV1^j ztDy__5_!#fSS$1aKIscQgWpIu;GT6bcXU1W2et!xnfyfN*}9lN^8$C^iM?fw>^(Rq zwnx9UG@oDU{6^axX}6=W#fNAw(czX_MLc6kKeKQN4N10r~irn zVgKv=zq6kIzg#r(EAYuap#Q)%dJdWv510-YEm=H3HlRHh#Jd6V2b`YQ@p_ie;RDF7 zH$P7O+nEl!ioKJ4=y=}m^2;wb87~^L^BVRIU4cC-Ti#)>tG>ky7#BLF9QxzAB>her z_Mhnk=v3{kOtfWv==TOq?~8U!-cyeKNuSWM>|tAj=*M&iyu&#Zx(c01|D@RR=r{O+ z=aH~EnFqE$HiYD-@izT3ckCJZpe}sMSsyZtIkRr`BjvKy4L_7a=lC$_*The-I%;RJ z2+^|Bdc5Abvgc%Edzt+K?ud(F_v;xfv&p~-HaNPGxnVP4uY*(gntdW=9<-w`)((C( zFY6b5k32+o(pEm6?Wy+J>=0}yw55Kl;OV|EAh2906cAbV&Fogx?6U-k%_1>J=WfscW` zi9aE~nM$hZm`#5@D=by&LKOFy)Fa2?X?EjB_{p(-fCK~=VaupqcoJUSW zuizM2j2;BfdMCi^Hw?{(L;j;9knPYh&-KD%>=FEfJi$jJmcU-Khxnq<80CzIZXl0% z0Ot+RC^DOJbU*q9`eJN+4}3#(6Xobu@);9arXTnSy%_sPzM%imQOuLN#3SGlbPH=h zKCn*4M!(P&z=jad+ZySIwZPky;V+=;@DI>i$Vsl@56ZDU@D-37%#rbF3oa=qhK)?a z7e;4M7hXhXi)LbKbH@%9-I=XI|Jbn15&KcJXEp+UH?%8T)7BX0 z4j!U!sxd8Qz`V$(FYrSAgA~0CzQ7wcEB&L#5?kARW9H1dSp(y-Ze$>HhQ?_NpFsbT zowhFUjgJ7%;8W_t7mN>X!7=^?1!4ry5;%l+u^r$`@B$j-SOPMv1{rO zuVQZKE!sk3=uhT@jz@Q5tHi$HLG(CwJnO|aLNB6g=o?zb7h*oxA+(40urbhA_|Vw7 z%njVo2Qmqr%9`mLpbVW3k25E1eAbF>1U|tH{j(SJ9p}t9835+Y8o(R<&=#OADdVEQ z83#UN{>+cM;EVUX>4&w!tMESd0{H;z7&mUb?5XhG4D1f_r2iZJ_~d7-$8XfO%p&GCuucuTY14Xb+l@tT1~;cuHw)ujqaI>!s`a z{QT!XKP7oa@16gwzWuSv1JN$e0P;J&y&rt=!GDwPOMzF>h&|&;tQMX_FTwlRY1%jQ z+hprI?0wOo`Pph~aqSp85U)6BUNmC*U-I0Z3x$qk=bL{i9&CQ!gMF4wX+ElCgO!s? zkHNd9%aIBA)9^liJba8kL*I!m%tyq(#gD*eML(e*kZHvEp{<1X&EG_4V}~X`6-%&?OCRkg^L#u~OMxQb#Y&7PKf6w`=;wBDx3{KJQ%mY5dhGXuGfz8e}dx(6J z{bc>Boy92FGh`=YU{`}vWG3+kcptgOI_a0Wqlc->oV7PLKJftL33LJ883X@|_0u=} zFPUQdiai6a=nLK_t^%L4XV`F(jm_u($RWm~47rKi(R;VQ(zB}z(DgB%7oXK>xAFZ^ zeH?Ja8K7){uCke)5YAsi9)o9OE%b&iKvt8-9`dl_?x0WR80SHs$P{RkYjhF7J@ZUx z({v8=!ma@*!{%Ww(XU3&F%GhUb)k>qc<>^1;cMo^ys5*y86O#h&IMQW!Tgvf?chPy z5Zi!n))w)^e5p@8@+fDH^a&te@K>;_*e7sDIqhf@$H%6D@0bHN2x%;%9&?FyA9JN2 z0DM!%SR+R8oh;&P11&ZH4j31}R>z)TE{x3_XbWDz6Zh0Ja+QQ~dq~#jGp%t`@(Q_s@2AcdYvTX!YQK*`dS$Pt-R6E)$*n5nCI3E$$0; zGj-owMGq4H(>b-Z)jUjxp_laA ziuQ~Wab$EQdIkGi{N!{d>lF%_$$O65?(iYz-MPq<^Mw)784LY zEza_ZPn?wc;0Hfs{yp|3b|$ihm;kZ97)Qnr(0j{2l0QFIzn5{6^woRd`F8vM=sNyr zG5{X{eCip95qb~cE7B?dqkZ^^^wPJ*caMs$FVen$lRbgodG-%};@y7$y5W447#Dlj zr;pihraR#+^=aP;A;p$NHsGt{r#|}Vqh9Y;d7aO|gQi!J^Vr$&68V6>oovtBiGIv4 zJ?*qp&2NPNp~2g4zuoJbYjz&>=}&*!^f3I5j*^XNbI@-qTVMF;#01bOyd!hpefQb? zILo3=PEM|LGT+^rB7I$Hx(yy-E%ePe%!zMpfD>pPUZOqEzA;z)9&|G@6C0f|X#3=o zPa4kP+nSmx`395adz6?x0B&gezyl8$P9A;qG4cFN;p!CG+znpelJrkK^^}!;;R|1| z*ap5kGFiTx;Szj4{q)lor$BCxA3sjETaEN^iNz+swftnS^B%8raElk9x3LMBqt3{@ zo{O=*c;2Ufe_{n=Egdvyu+=cJM3k2s{H{p=;nV(c&+~H@}dsOTqse!ukC z@1(cZ%1^1(x5^siFFq%E)5y6a@`&dK;B9PV>DE`&*Z0KqC4r`URs;I$7A*mdY3g|&tT_k9cIgD4D);WrV02E?b`VQ zaS41{^u54zHuev;t!!`8>+%CEuFZJZIp|X4qU)M%#J$=)C;5 z;0WAe17t#!vGN7XHV_YPlPz$+bnWe;v)dJeyIu5pr{Zk4DCSzq9?@R0*c0?yhG&Tv zH>vK;f}2$DCh^@Z;_>zJ*}6)e=g7v~s{{>8+vP``-7mq?1=_jB7;K zR{^5?%cPqo>OG~C7zdkAa^@qF0rhIXM?7g-jzSAAZh-&89W-Mm-4y;U~ME28gI z^y5XR=8Hm$vU%-11G^KS1Rpl~#Q3n$N2eU1KK1ZHpnV{-AIf7Hc2F#f?dSuYh);~o zz!><$*yZ@XaX$1B>tRF0@#7pQqb*}lm-r}Skpi7NcM;F?e%whZ$*4bQP2ZHC@>%(I z{O;T(vQegp|GIHDrtj6At9RXoitp+qw{!LG%h|8I@(S;~y%#*o#(t-snK_f^^s0U`LQ0U;<+c# zwsk&bjDc)noJbo{4rKO0Tl%1mzG?Uo>67nEex!(76R$=Fz|+L?;J*mOrpSx=@D{** zj9Zb$dhwb%ndPy5Wa|ryUS=P$A5!E|mo6cOCV!h}4qlP0`I7Yf zld>7Em5sDOwo{q-`Bd@TyTDb1DElLRNy%$n-nw4AC(Ug8w_In^QTuiHHV-nCz2Y5Y z-ce|WBjW%(>HN2|?DQYWwzc>p_BnBP@t8f^B3?OSihe#?ox_zg1~TT2^znMzGM;P! zi;d!Q5Ql^Jm2bZ>FJJ0<*;I@8jd{h*?VPNgj*d)6;77K}d!Z-zFUA_*YPp0ylkLho zIUnG?B)&7oZwT;RVZJG@xXU^6$2+vcp*R3H-}uHiddtTB8NM#QFy~(Q$oSkb9*6H7 z&zD-KM=EPwx2^lO@?KA$ueUC13O0Yx`||fwimMs#%ij5n{P+WkKdx2mag<_jC49@K zopuhTolKlSNAMeb$2-CBA@2nv2e2{U3K@X^!x(&DjPd!+Ao*FvdM~%nXFl_pYQ>G~ z^juZHc4!+1;72in$%-TVg7_G`uQPQ!OOoGg&o0TwK4OZ0eY849D}N(>yq>o5_wD>l z{=c0uDz3&En~S`!=NCS!SmURKkG<%A#quU7{yw;!e%hv=h!>r&)G7{DqjQbE@E?2# zKk}SG@=W2I`di)D74SVi8NUsx7)uqu9i+JVZ1#=c5L0Y=H8Q*%+Qxz6_iOb0+FtSf zZ?O3}%OXBaoQ!8jh}jWaJ09Wn&MnqQRuKE+o-@#>_Z0*9s(h0#;PdPGgF6+cy-G3B z9UC`p+|W)xZPQQ03v{G2o{MzGv>5*5w|wxK^n77=>;Qa%H&g#}wt>D!#^^kG2)`4m z=e)NlUcOKI>jrE$#jOtNdD`0mou}R24u|4E=Y0>!$A6VGL(anG>)W%nihbL=C8W}e z@QI}{Ki*T;IV>>A^AV|2sd}M)6JoD15P4u!DsLrd~;so?qfQD%t!gJ#+V4 z#s9trAOnc`>zv^8dZyrocG@{2?HF&tXYd<*2mc`xbe_CZziTx^?+=#~2Ot*sX7Rqx zS3iPHfqfx;zZE-8=d;fduND1%T``?+%69#RVoBdRS{mx)s%}r!JxrRbzIv*!R%tp< zZFAMOXObS$*Wu@JEOTtVhFq;pzyJL$AXjtJdX?t3NNqkgkHh0Z^!^?B_>FphAl0i^ zsqfLfhu%Z_DDMh7ok#J$;StlfsgBMTo$4Pkr7!B~Ow0Oy+uNxBPP>nJ)M4Ck|MrZ! zvCW}rY}+E$oZq3o)SrESq^*>(#Q!|M%zIbAga<|7P%hW8+`n^ZoCCzso)M+_h@{{5hYmtF8H2L4Mw!#0QPp zSv{HrjafaqTiT<0wbK;ZblupkYnP_(-MTh*Robmv=floz z<|)n3&uc6w$Zrxf7UmZ;6&DpW78eyZl@u2@78e&am6nz?mX?$>^(rlG)OAyz-sO$e zl~u3l+1ym0KD~8LuXjsIi_PB;@pIz)A;vFSN@D+d-$b!;1H}bIXL{BrydNVPuxDvB zkLKrkI7({?gzgMobUt?WeO%wTg#<;1buBNfNx~8e7wz{#Vs;Wt60*zHw z)k-Uy*&R#r4sRaQ1u^zGYJSy9m_UD#An(YH}{LsQ?reHw-9CgHfTyu7TbcX?T3 zd0DR}Jr~(1oNHf7n`CF$p6FhCRBU@yqCG1qVebmGheeG=Mfpud1%-|Ig?UY)_r`)e z?Y-@PPGfE^v;a*6+7P`o<%mW|jW4o$G>LwUma?*Yh}OC_3D=E!KD!AJ4QM@;ntR{I zg8UruNS9_B75$1=M7v$#lR(4WyLJ1kXycDXg?X=(lob3-H1Hy_0GXk4qR;95#JhBM zyjjm+55w-)b0jCeQQnvQ_{i73`sLX>wr~Bs@cvq9vA%C7nk_Hax7>P{r-V~om!){# zRM#oW%F0Spy+qT!N=s70tDYe#NtKl7Ta6{fDdAK!1058mib;!$QsNi#QbnRq<)w-W zl@=8!%|9eft{>(?*UPwx@-@2|AK{cfKhpm#RB``ddf(KZQ`K|2 z;WzC@DlWjYx1&b!yPf=2=V&)}w0>hk@BfU`^TOlCjn}s_c{g>O-sRz&yyNYi9{FVH z-|3yGZ{SUAuyd*08PGAX<_Y}d&<#FM9}&E&(kRX;9{ z(V%CT>h)c=dOcS?LEq+)-I(Hi+HvE?D&_Yw#-up!96dTo$Bedk$mr3dQls=-uOP*< zyCd{|qSBP%X!!7y@aBgP8=B(%#bHW`oemv3BsF9(zvnVo&vp;=g9i;v4bnS<0|yL9 z3Gdnme$%Lb%2M`3dnEaj(!S|^gIeuf*uxsV<4{vwovNzV-fEAlDs9hg-zzFa3zdCR z(1Re=SMN7MBgphVeach4dnf!MJ}DPXl_`}BN(uBnr)a3EZ%X_F9|fKfJqBJ0v>JH@ z8ipSvds02K`5m<`K0B*>s;sp5&!X`kiTA%n%tSuqy?UN>`@Q$xJ5tX#cIElVH_H3+ z@$;4~UGiIKYLsw4LGNQso}zC)&CvUEGxZIOSu-u=dgjdO1~XJPWBN2b13uMHpB7-6 z-bI-W^?$$EDrz$Cp#l7MJwiqTVp=<)SHXh+-FS9AZ2C5YqOT#|X&95qko zJ7WglrwHp}J+o$o_068m_oiq0Ir`qm+&O}|z#Kmhm^atY*LSoR%oi+}uV>g77%W_< z-=Y;P((~?%7U^9#VDTcqM9!ZU%Yy?{f?>L*I8}v?5th8#>?;W>i|8^zkWTi-f!3dY|y(iz(#{jN_ig+ z*t}`8z4M^w3hkX9#f_U&-XS5RbeCcoEkxKiH{0iOW)1;F*v zWdZN(0l=OZXn)wJMHepA`v?N<9ecQN;R3%)w&--YwN0=vt}1!@p#)TcZ6) zr+lOHLhVyXGp}P_Ow(=D2YoGFobFq5XRKsQn+tQ&{PfQ3Qmt>f%~|u;JF6?gS}t1A zyf*P)T(cKG^lt2G@!lE-AFf}wR`1TN745Ef@SkYeZB)8>(?-3Ay3udhyh-oQZW1qS z*0(M;`>ld)+qSxG;*ae+w%NO^JM~`9jvd?e`vW`moyi?~7jKt+vvSX#-EQ}u-G0x- zd-U#4_+4_o4a)mOy#IR1C42Rr?WIoVta|_GGN*TL{T2E)DeofbcM04TS6t3}MM|&G zyQll?9b(Rl+O>$X$9Cw28T*SM=l1&S%VkY4SszRL0r-}cI@n#YJ^ zX&#w#vAONr7v{>GnY+N&64rF7y-R%AWtXsKTle0*7yCm!$t()Ce$xdXRbhN!IK5za!y%%+X zUnx3-SD?edE8-9FO5hXyj=X4jiTGgQ1@nAE{X|!$_bqdBvQs^JbpMY`-be4l`)`uo zFS$f`-lcckplk8FzLSc)l}-|mtVBnN&*6ESyY$!c72+wq`?YMj=B{@ymo5|ENzcJ| zOO}c!rTgG_VDS?1wcZzn-dHmZpMph;RCW}gUUNJ8K@(S5zh8n3xZ+A= z#FZ^Uvf@g?KFJ2;Lkrk9VW`9TzVt=e& z=~u%K32&^D4RVq6hj?EyX1msVxyeq}%R8gkF^fc#I;S(bh2|o!7@tUA1zv$>(TAc{ z$%BO#%$E0Z-m(EMuYz13RhD)hei;-Xd3 zl^5x|&w8hG#mZ&yhFhU^ESC&3UedR+ZB5eck^j-v@SAwvbhPxj>3i|6gMVdv9g;@g zzwp8f^nNS0S<6(s?o3X^wu{w=$&p1486duQ$N>6hTpM5SvMxm)EnDnNJ}qD3kXMpl zS_8JY>;m{+YgxfsgPgNE&|GReVbUSu#mmJvTcJ7iruv7YM4>o~l|Ki=!ccj<> zd*FKq|6i)T+PhbL&%I=Tc;9rWcuG1I9UAoN6<5ecxFXmB=v#R6%6(TRdU&7N1Io)t z;oqx}3#R8SP41BwE$g_&t&(=ZW6C!Lm93Ncj9}qsf1V4`$5ldlig)Dn8Oa+%J<*4 ztoQ3KU+$LPG0D$=cA%T_HGNC`dj)Rt_p|+^@8!5D-_7;YzEYm9mRhnjLt#zJuNexAn`l&@*{ zFuPB*fd1!N{BQany^qcp|C|0#^b7hw@dfKUvj|j zli#5!|Km8!0p5?0$RnE@b_yWh#p}%4zIDR46OdI=?_=9Y z9_W6L^7q*{84eyisQUZW_7bxJz!S0n-5+fzPP(f!@mBd?tamMdcS79@jQMYIx(&P zS4&4Gz#d;K{mJ)E^!$x|H$*&Y-)Q0YjCX4v*Kb^Jb|pL$b$`^8#w%tk2YMwYF>&H} zPkcE$E2{WW` z(Er%jl551e6mL01|C`;v=uo{M`CqY^HuZkA0}innn)QFME#QC2PzV19{eK~LzvL`F zN-{^;D$AGaK12VnBpxTbhV_~LC(a@Mm#t@ZknDcR|Fr&JPdos-KU4oF_CGNJ?8{AC zHppjx{*t*hzE%pCi;sEIXOD!&dzDE`W zT^f9VE0hQS?;|!4c+hmRc+t{*(*N+kcr`=s2fO~NE3dLTnfm`q$$~5Qh1kKqt6H|n z>;qnh{~5>Z{(YCH^*{2!Y!k^QrT7ZB+;X$y+d&UM{II+2w%cSgUuo+wd8coK!vD;J zvIib`(A{&-r^Wv_+Ir;^nXM$gw-^fgAKQDo{3@loHolkM59x-BSNTPcj&_rN*4d9~ zJjsnno#+Socf0ZaWPiY~aS!_|{7m1~4@|wwjrrZF{(=WaxYZjk3jRKPq5U?#F#R9w zLHHk=?mFquM;?9H>Df5@mXTzDd+>n=`8JZ%bGc^U5kr!18F&R7xtUL-n-V)2TNNAG zcwgraIvZ}m`){V+*LM?2uG8Ga`{oZ3%fPn{GS1?CEqt8l{~M2(?~ndZeE;R>(>CN< z;{TiP->m=f)ieG6O#QF2qs9P;5ggi{SYe0(BzA_zi!lIX0{8Q-E{D1kY zLH{duCH;@@D?cFd`SF9%|GTC86aOFmFZ;ix{n(ElW&JTXx~(VPnbJvyExJP zvi0?SuItT~Mg~v^y8s*o-M=H)O!)qiqlQoU59ojF006vi-YMOC^K3u=g?@g@53>El zUv}^#e}A$c`}7y~fw)J7j!U?1dLz@W_BC^v$#f^?kEjZn?$m6xuD9Zm~F-=#MiA_`ikkZ#Mrz zi~H-${Vmn|KmDnA|GMi$C*pnCF19w-82MlGHG5Y!aEx&T{#Seq9oa_gFEgfLb`5$M zc_wJK`|;DwS5IPn`VO9*nJLBQ(RX!}>ik7#Fw*yJrVCYXQBps)ZH@=hcZM7w2EZH= z-zvy}Aa_k(EnlvE5YH!Z3|m+5|AP;JUkCqV7p;=4XCJ{)wEr_>fU*Nx#sJ}eWP$K& z=K$vabN*)M0iw%928jRhV`U4N-@7A`0lRnal>Abvp!+Wq|6Bi>Bjwmb!6(Az$MzThD^}3j_BUAz|4ZI( z-KLn|PMss}Q@r=!bieqaG5&(5^n1}y5AgG!8R!>2HPm15;3&WJz+}Jr(hL3C&8y_o zaqcMIhvzf-BKpOO10Wk1_eOnNPWFp^gYdcMp4ImfpYV6zbGOC+u>DpkE(mWdLq}%t zKIdyo65x8VVqKj1)x71r|I?EF!acDVomH7^!eQ{+q zdXNvz@xX+a%{~|JCH{g^<8{vMOkT7|)BS~*BYInThn(rfc`?uEw}e$AO!-5$mG zIoo6XyNHD*XMDs4?c7u{lXFz`J~33{eu>U+_O;CR-@Mi7T#vZF+o;&zhHW~(-6p=? zCckd;O21Bee#5#AZrvKia`Zcp=z8gV;|J}nd_U9ow(lVZjP1W#XM$^O9>mUWzx_7Z zGIzOK4<1mw{L^%M2mXK%61ulE8ja#AMi~fB^cx9UQ_Hwuunm&9AhAK7!AR@_&eRm=G#_F4a>)un zakSts#-E4NbY;*i`ix&!4>6Gi1U~xRvjqR|bf?ZGl(YB9z9bVR$*!GEiAN4!- zOtkUC^CZUKX4|cmoL{?km16s%g>|b9N9)(G5pIa{tyP@Q_*>7kthaL{o^1)X{zl<7 z#G8Vx&u?91ob?gwlgo}f=H=DdhN9;6P;()kL_dLHJlf! zJ^jbNqCFADOveV9A7w$-ATuOW@Da>buxA^z&UpT>SfSQ#@jz?@d>_d>uvzxj#vOj!CfNs@nz$`s`)FX>TbE^0N;Xk2M*k#Z`j_V z`kZ<=0*3uDkA9 zFHr0QI=aSP13g`HwY%o(t1P`58WHGTXG}bgvM)(><^;V;h7x~PJSe2`UMaLJTGO*A z)Y~T-Ri5HT*IaXz^{=sPJjG;e{OhhGy~gIlyfjD0JduMpTz{RrUUS!49BW}+H)&lr z-E^bAiyzi~v*OaksSfCyz~JS;Ew>0y2i&dt&hM=UZ}kUnyVV`M?V!K?w%gntx8E*b z_I7vY9s0KSU3a>>?!43Aeb-%1;P1KTZpE+e=9}6&AG*iBt$p8p_qzM;y;pJL``rEa z-R~cK-~o$=$#-=4j}JZcuzTpChb%sZjrqtUk2nF}x^|B~YANw%_n2bNdiTRU{`eDo zuiJj-mQ=v^x0OC+Dc|CL`st^gz~WTl`Wdh9wJ0y7y0-gt8uMeCls~QX8Nt)Ewf>q@ z#(C%|(PW*h_hJ9=BM&>)FED%v zCx)l{6+2Y?&^@5I`vVW$FC5-yxD;OHli%y^)j8a~_eOl*?3xybiZp5@7KcnZ(*zt-oN4c z>*0N#eKK9YLwbq(8?M*4=0&%6iAI4tM6=*TbPPWHLGW=Ajy3xA=W)?u;- z`IGb!WD;^oTU*G#_@%Fv`UeO|O-@W(y`$V76>izeNUd7kI zgYfl3M$`Tw@$|z9KR;shZ@l0iee7{NPkQVL<8S}Cd`o!Q`01&q;c5Sr`0y#?Klsyl zROz$+nP-4!1kYLe?6c2#eH+3*``q*LRiAIZe)idLPu}y-f7Z&LS1il!le*7;Ho5<7 zQchjvW%l))+F1YUFO0>w5uTN-$N<#1G9Nx;cnG0B(hr(5IrSpjSQe z<*vK#@Yh~Kvc+UhE2X)P&z zRVb~Houlij%5bf;x~h*?JDW#H`>HKZfX(jmGZ+}{ryGQbT}{xIba8#KTVA3D(KTK5C> z?#duHe2A`4Mo+qVz%*f%^N9>Dq^oU{B z_elB{j7s_+IYRvoCy!LWC#HGXe1rh3DNx)Dl8l4=bjhU)h+hYivCbglI@r$h8R zY{J8^p-P943Qt1^xuHV_8lHv%I{7kt^_b1d^buTUajY{x9B;jW%4&BH8l9FZu&O-nIH9)dHOBL!n1r`(K)`Z z_$=L@;d}Qy&6j7N<|}hg_qF+yo$c!i&sM!NeQklDNWiu7$ZsyAp2}nWI@PHwR-XE; zD?Z2fD~jXj+U}K>0Q&9DQbF;#zJKXC0@4n?zsmaeI@b^AbzTA?e?a;9eqdPwT=x=? zmUr}nfHFbvPJVECCqJlrfg%l4xL)TMl61lq>y7ODD8?x|0|BQ#zB&4D@9Xr4A7rCLk459?y?!?f066-gTL z04{`=Aqfnv(6vE=yS_?=-@(FR8Up^=gF(GJYR?4PpMhL!zu3oS(0&exp#AP&CQ#ZB zfF48#{QzCpi8g9PYZW>A9iwii_@3vT|BYOYL(se%|>f`Mge_@`YVa z_7&nE=H2Ox5Bq|gu8Iq7@>j}dn<{r#W()58tUS^Zw{~oiUpKDAts7hH z*N-c8>&6xPb>n*}E%6)1m$~&5O8th3Wp16)^%HvejT6h=hKWk+dn+xobYp$F-_+2@ zZEPs_nknSNrWVbgy)a(rq)U{kEBPPI-R&%o@LARzJ6WW}V+TyUy*L)z9zJ{f=4v z{jNC!obvpxxdWW8{qDH~E!{PLpxdeYU2_Ne-SY-H<@-HKx!*Hyuv4DjGk>sCp1-(N z8uOdeHtNtO^r61zsZYBnjbo7ZXFeKVbDFEU&DR`flh;pk)STz_*Bbh1O);(0eQmN< zt$S9j)?5pIz=7dNcnLV0o}|-i0xpHq%~LDb!^%J!J<4gToU|cV^YE-dbGPKAo7@*%c98loq z_s{k7`{%oPbxH>$X}>%-w=T!etIKn9YO?)o!Q9$hUHA0!mCmm2>F3nuxH+{-YjSj- z?dMeMUg=!j&r|*RluMSYjmoq9>?%REu9ePJ9%XZDd%C%`*?wWaTz6sro__IQ@s9Xm zwG^x`#e8B>&P&nxm>^17TYH2gdF-4Bz=#!^gJ79qRQ$8 z6LZd2+R30Hx07$sTqfmq_LK5D`^kA-ly>ry^ScOiU(nT00SfhdZw6ibw8CzFS`pAy z(A`fj2D%A)_!%WV{H)Tf)U00FsafSc9WWax>zN9m{VNlc1KRg;?YUrXZy-m|)6WC? z0J#FuPepEOUf&!)pR^*+FR08-&F`D*7gpt^E~v`$i)sr}i|PvelKw?0fnPeHD7C0I zpM2_g>ReD6U}1H>zpy&bF9eil*Gj3kuqu>YsB}>c*9CsD(nX}|Ye`L^Us6}-mklWP z%LW$vm4i$C@_|5cYN^Hs7S$G}7S|P~meductc|W0)fPGR}7F?CVtR?^Nyc6d<7iXkoHwU~&PpAvysH z0^Lk1=w$TMkPkftnu69My-my&jrTlXbQn^uo55&TG%wnp0R6Xyo@ssouLcg zP}s$2qh7QzQ8ZGY&<->tdKOJ}7HxGh+8QSwgyzPI_KdzW>0GorHuGM*ta@%tl8#n7 zCR_L7kBqeWdaTNj1MteYW}boWMcW#0mS{Hjw2%7So}Kgz$x=JV)Onz5kiXBjM&44r zujlzWx8uBvSRdc27&I{G{eHRUnXYAyQu@xkg4Ph3}2` zZT-lLU<1&P)gjG6t^^wZ{cj-oi{2OCd-xt+hwmpMuci0vk>A>H_Ih%DSMj}gU)Q3C z)Kmef^g~KKpOU^O^;6LoqOa*?qA#O4(Vb`!{tx^u`h@>Y2FM2JEt?Nn0Kb>@H2n{+ z8^4$5c+s_i@q=`~@s;$yrQ*fFZ_@pNuR_`vn;<{oe_gAOxqSuL4JwIoLWEd?9|3VXZWpyPxU*7o$PlHKgsVM@o|62$d9G=jQC_~*RW5e zwhcWswR!OAs&{5;b^r5Hi)*?y^Dlflw?cd>h&&&8yJbE+AL@iQX&DgjV}0X!_`a{n zN%&kmFCI^Lo;1<%=y`ZO0r*~fBfdB2rF}EL?~$5X+Cy?%`W@caJ|YJuC%S&J^2Phw zdjMSz--{Nc>&5q?8|cOKhGarWp(F9W=t?w)P7$p^bI5=R(7Nc(Xi~Ik^sZDqoX|Wp ztU97&_#fJ)EHiC!os`A8F@+DtNv_P2oXQjL=VW!#voOp2Wzze+BQRMpx4`>vo!);r z&HMHo)O>xngzrohi=PG+c65`3AN1=)@#jRzstLl2rQ-96(#vKKp`UecdRnPnOOBC_ zYc30VzPS(6<@8D4vbl1l!|^W!+M~2S*B&+GORsDH#Osbdogz7Jw!P#(ww~-h=>y|= zH?^dP^m>4xL$bu%=$4>g?3#PgBs>o-nhr7@uY2@U3;i$tN5A(Wl^@s_y)7RR2)Zz} zpdvpd-57MOY~O{_gVMR=2c2m5*vBf9jZ7KW;$`^-*x1o}|&A9jZOGkY~vf-4}Mg2O;K7e0a@^{eTtdn)8 z%eaQeBXA!;zO8H`0NY41(qyXnRKlzLr zPIdtP8uoxv#l`rSa2Pg`5-c-qgsl{Do8=xCxBS;otBak-RilS|3 zOCTE;9V1)ZYy{CFspLVuYy{-Q#Jr9nP559!?)eFgC#iJ1=||{3xfXvUywNh1UNf6^ zj`V*1X&>`>S)J`!S$Lo42PZYu>&ywg-;(#=On?97mw#Nsb351R`4-+Qf%gaN%n9D_ zFTFnr`$%%mY;Vawct83-=y|Tq|F={+om7BN5U$U~XGkIANF`rW6O~HVrh?o}e0+^H zLAo9NUav6{d7YA8mmS|lsqDG@&M9oTNlLYMsfPTnDYNt0&jhdou?Ye6gvkQw4cU_p zI}&+dbY=V>?foDFjPBrl)AiE#qR&~T`vc$4?xT261o8fyzS7^~|GDUK0s0)6U!k~? z_;$Xo18>9kh2|TZe~gcuz=ethT&U{{YYOEz7rLd2FKrlnZfftyPp0;df6p7@@z*0G zkOx;d@%^7kbp3@iqalCNMkf$Rr2qg1gP$$**I2PKN#NCr$RA)X_^Hb?+p zU@HCrb|JpMYyo_Kd;@sj{C=h4Z;K(p|Ii$Oy(tmb3M!Tj?<+)|EupOP7?3e9>V)?W}H9p{sDj8 z{{8mdg9Qub>wI*uD^@J6zvLWzs5#3QH=ec>S%%$@Y%^OQe@JVU-5%298h)2upOXEQ zQmjL~eqL(4$;yuKz2sr1)Od{{T&IXB;DZ5@uc?W7;`6*tX^`%R?@eA?Dp`Pk56I7( z)PnZ|{|DX={6AH?VXE}R^a#!VKK>`XAM}0D`S<|vJ^DWAd}u%F{W*!wH{Lh?hxZE- z-X{$ZWI*8|{11;4CnK(QVNH=!Y|L#Kbbjjc(H~9S((tzbXZ(I7*?`>HHss{g;_7Ze zr?=qu4Bk(8K9kp5@Vwe7Hj&7RBo%*~Z9u#a9K-M68{H4!3n)eB6Ays*rxO#f7=ZX) zaR7K+c7XZ+Q%mIIVe3WzpBRATe((WJXPDlH-y4dgJJ9o{OT_E>U7P{+q4$^~|o{uV=J*);aM0AnE;XzF*F{zMi!PzHip)L7xZT z9+|-UEfy&J#8h>p>xC~;i{pvkLkv%`7Gik9D?S4t8y|cd$o3Nc1&YyNa|!AbzEAUh z2HzY1cgx^?@j5zR0BxB4Z!{yjP^s~L!uQi6|6^Y^$NU1{N4r1R`guYBo6V2D4{)f? zKa}t1R~E_!fd2(mI&U)lA9Vah{kyx1M}8`Gm+A z$U(c$xgU#hpJ&Xl=GuD~^!pw-_kNhawJX=&d;P~V(j3$4xnta2+k#(R&gWOZ-+sS+ zOtw)kIcfX_@@_Q0)%}$;*AIW*Tx;GX%oFfq<^)=xEi&wPI~F6021 z6VMnCaiHb{p!=EwfaYudk2(*wnJ40vc_Z9knn$9)sj)x&esg~_rnd|6E_3>f>s`K! zzAkl-v3*^Q{c#2N`Y}HjKIX?*njg16XCB`ot?++T`}^fm8F_xrir~Jd&p+=d%`iKe zy-A5a|C!c(_8JZzJVf`8at`ea=#{z;{?U_QpY;gxotWQq|GT;3bwS>P8qe29>l@^q zuNAbOIepp!U7mmFz31HVZdh*wKVO$}pUA%9o|X%2ald1~I_!Y+_wTlTztw!pymAlT4fpp#@9!TG>f8+bZ9?;*1_G?a1eSh;Y>j7#XkmogdLgs+zBiwNkc>rDT z|4+VgZ~2qFA}+uxcM|@=NyGt&A?<>{3A+H_lRhtN%~}V5O~4g)fS-eQY2A+6&3KqL z!Pt!CEBT>*MoTqO?MWNhpX%3v{R)QtpDg>FNBzIU{#f?IV{S|jc^ms^UwZKc z?W(twkbP=2pBsH1K0lY!bG}c~m7LRGf-kSU^XCxX<27V`h4s5g^R4#7$A>K-=WZDv zzcFhyT;AW0*w_4xkM-ls8~zRVWZx`k1@%I00Q~?{=WB7liTj=Qn;f8FKe7RaeZzk> z-0x2RBmPayA83D!fAlLoTlVCDdVfAE8b7va85!Taj7(~Ij!bTKj!bBAj*NSwjEs5x zf0h?aWrs#II#0U4c=gG*AFW_ncY4oQz}f*DBcLv!-_s5;6Y3bTWpahgokpMMWBt6w z3g&0MT?u^-aK%nNATsy0IN*0dG8*Lg*a++6MVxbJoO z!*=*Pn(M242WDY^f>{VZa*t?_*r)y*AAtJr_`e6S|2-uiKUJY* zK)p-;$IMS@eU8k2=UiFz@p-c1i}PiDw+m!TuM1^cpHr``_@0eDE|AqjLE7vk&f@-i^Ey z>VV`N_cN}yoos@IxPg5p?19l7Hg!>BVCD$)F=GaNj=pdy*VfQ|`uwc%bwn>O_t0@4 zee*Y(qQ|aw68mS`=f^%%us>X9pz_>;mtT5GYkW^3r_qG|3^~UC&ODu7ZN37JRlk*W zFs{BmxmR5eHQs&B#`k#5)J~+}-pBWh@mbsBvbjCY>uG$?9AA{%*FGMb+drM&JKaxW zKT-Rw&+l|UWWO~upWN%R%sckmf_t*h#h#dNU%ux5I)6vap3(kXS=RA<+1wL+fB%Ps zbrC*3-3orD4;}|=YwrtXb?5V83(iwNA(h7eC!ZTs|04P1soP@u?HD#aLm}_z2?FDe zfA@90T3g|4hVvPed-@MC-Dh5qH3hRYCrI9d)$#$$ywiMK$vk?7m@CkQJRx{D%%g9B zxkJ_arqF!E1X!puVWAFyn4m0cO;})FmyKIh-@pQ5TjT~$+Flov2L~fAFK%r^l1^d-1m&ZI1!#?)=moy{$&m^;dW_5pGjq%unI(+z0ohkM%W?kV7B+d0bS?MNe z=yMY$x1rBVbDDUL;2ic0%v0xCuQdE?4j+%H`Fw2r0mHlY1dx5@-p2Paf8Q{#`91P) zx!1fbbF(hD2lgZW(Zk0$-^cn+=iN2(^_$nMg!ews`;>lvg62OM`TNxU|AhU|pSk7a z(Ep2CJpFWP`|>X?kgdHhlI>ty*AIV`?Wb5f`~E?8{TN>$bOZ(%Bk-6hwgJuSc_)OuwV4)v#$Hxk3Vww2%U?> z`IoQY%(xn;?>|-L))KN$z7uU3@*cEbW-0sR-z>wsWnW*9NawXb*KtqgVMmSDzNPqzBKMle$Q|pX+L|w%xcD75B2vG*!R5C22|D+#`-NEI2HSW=06Q|#{8CjwE<55^>wU^jiYshHJ$$_t?(-_w{zYqiJb#R{lQ9FTqbc{ce!lbljs3HFkJm;&)+=5k#QnOg z)`#)EvQPe1>*?!5=j}57zR`N>{pq+@{w?=f+h^~W=J^seAME=$zY1!7A@^0GDG8eY zQ0eTyU#mjNAoRzwJRaJ^&a%PC#t{?|Jou8SAH7w#U6Ca)xBTa)ol3>-8DtAos%z zxG!*yUvuGEu8Fz6Ga2t2_9w}RQPBNfy*SGf^A%nxsZsR~)c9`J_?~^aM)%pe zIDmcQ>qmOe=c>;c&pY(<&11eMK`qZ}Kl7a?w;yS~i|>{DAih`TeViZZy^Hak-ZQsn z@_Xp#VNZ|k>+$}+`ux;;qx+HOgMA<88}6expEdr{xWBvPi)U{-$=@lPrF!ccQy?pHWXFiZQe;4m-p3mj`0{@@BfM*`se`?>~vQHMYwtaia zYZbZAC;3_jHUH+g|0`c}8GU}tdjVY(bt~%5#vZ z`?V_Fta}+XUSaH_IezH4*82F|%yP`f^xkpqb>4CBu8f!Lf(>=Pewf=M`!T%_>Urwp z2l2h*-ud{R`2_C6x}NvW;?*|=Y?C<(j$btI*mJgHvV!fOBe%1hZ z)i^*}LHDbw?w7^P_l}&OrE@@Av}l2SHP4=P-JgURg`-D~D(Pd{fAv-9KG=T}dljv} zZ|eGt@4+%-{m}1sHo&lNV|#p`)BZ^Bqt_?Wd!zfxJY)PI&PPvHjQyylXLEa++YjRV z1RtOLJ3rrPzG2_Q`1JLY{C)NLE%V;rx0>&DAMCTI2l?vWul)5t;(l`Lb7fU$GM}jD zhV#^X{{`%twHw#n1KheCkK=3W(w}AX#tmj|GS}ThZVbN9{H*(Z<{H?MM4J%W18)ml zEON1I>HSBU_rdx9QU3t@7C)_B9(51uf4EG(KhX~O7=U)bEtd<_D{G11-|Zn%pMdrN zyq`k|K^M96qpZ}-+YtG-~|4a^mdA~5{XY+pGUiSi#f7Lpxi_ZTKG!lCS zb^k9JVqYBN{Yo0|moMSjpPV&|dA}vCS~bVMnq>CRsP1F`{v^yC9EmxVeK4Ds=V-y_ zSKWW2(v6y<)Sf=g`N6+ef1ZB6(SP~?k=|RI5O7ca&FgU*?tP4JYI@3jz&?63?S7r) zoIW+*=smBIpP$IR^YOKpN44I>_l)s%h5o*;=Nr9G)O_Zpe}qq4n%;$n* z+5jK_o0@?70IUhv9sukqG_`+?{i*$?{uk*#V*zmQwcpqP!@lKTV}7Gu8n;^gN8gXp zeaF6K#^^uT!QK|#6HNAfybs+c`KVv=j-78A?xG&7@v02)$gNgr1wVm zmHU8wt>p#&ewfc!t@nCQ-4APek=~maKSg{Gt*4(Ki}Ss&&v+lYh5fDr>iy}oJ}>>^ zRh|FnefYS~4joo44>%7PH%$Lk_WYcVH8EASv&!TE+Xjn_*Wmm z`u=1_8L`YLLuP+mYwRU5dH(VxUv%ok`ShICThh8^3+$@42Vmm!|db?=`ole!h+G!9Df9U)|I9(ygRYdlcBTJ(xupMmDL(#Nd=19OTx&UZ`=Ab-@`o7LBbN_e1eN@XN_leA# z=jxxkz7~#o_Cy&!$=J+D@0s5Z*^m7EWaf3BPKV({T}%=_2-j$PszIHJYak9Rp9z6Ngs3t z>h|aA${2K+qz}0|X=SV*Bbn)YV=H}B+35QQU#-83zb^ya^Y>*AJP)?vuYrAl&B6a+ z>_G}!;Oqe65+55le}MT(#0AU0_`_*)0QCPE{~P{Y|FhW>6|s-r3D|^)eY_XQuW-42 zl%^NJ@b7H^Y(X350RsMAPY|`==l{UG$@vGpfV2TV=ZD@O>OOn`)&Uah{wD9w`_-+; z2MFta$^iLLeY9NY$GSJ>WE<46sQcCKg6@NTp5=|R@k-jXYMGM#Gac_wnKD(+q~M&u zk8%DS*q8h6u82JUO`7L-Hp^XOF}!^q5$Di)>b)+L|MXf<&5vl16p>kbTbTpeB)h%+5J2_jBLB01TAEyZ7G> zV=)c4oGa@g+k>w(oX%+`nX3m%*3TD6#$fP2^cuf1hF&W<8^=pdcBWlfdQBfy&VP@7 z|B!1WW6+-^YtWxWZN>B#B@6tgtM6d!4F7)ge>pqAD`SMfC$M(F+W^`*TXS63?c&qc z0-68&5c&T%ssBMAwCRU-+`HbXhaqc;yOxfBOG!d7aew`6T=K$$piJ(0%mr z^Sm>j<<`1QOU%or?pHpGvpNfFOqntT=go{QQTA~bb=}uqE2()m^88h9(L8?`=c~r2 zuwi^|rpM9hyMF8*+iQ$_zHa9Air8lz)%8^IN_*=T-vhJAJpHuRT!_`UUxV{_bl(Qv zM?aSfymLm6+pnvd|9`+f^Z1VYZZH1hwA?T4^v5W#?(%Q}@5X=sn_;Uo*1@OaI%DY7 z%4XJ_*Ci_>U9vMXBzxTu@PDCX4*rW|4EwuZd1;d*KQC7bf|WV?PXG0cVb|hk!2RG$ zBxmzv$;rx;?2NsVHT`+~jq@Y_z}g+P0s24M{}=H>%qK{)12$Lr^VN6_{wis`FF|kc zsdIos8(xSR!<+>c?SY7~@Apbr_I=)k?At}1*Utx^b6<1JGw&Dl0^8YvxOYtMkMr9! z2SD9d_HhOGtoixAKlb`@`F=k>h7Iukf55%tpZB}xg8bXqSg-2)pKOEsUE_Vs=qCF- zpR0S9Z%W$0=YJV{>Jr&Mle%Aoc%SD)@w_RVg^IIhKbF_(z9!1P)qU3W4D<18SksJY zyNl`FHO9QPi?oq;Df{|5y4;?7jUD&A;(f4on7SXb@8dV?$I+havhR6o)bh+6I9zQH zUn~0i-sex&edXTz`W=v;4)gY@9_DCy3htTZgc|K<3!0vI}v+_P&?O zls2d4zhB);F}w60yYQJFhEd z<+o|mT3&wn#U%F6WV~?_EZ!hMGCeOt%FcfUxohFmULBd?dDozvyO{^Hom9#>JaMqCf(FO}>e zmrCKTxl&wYYy*D}e_ugb!lgyDf$83(X1GV1JZ}xEIE_z z*POtXK7T%~|Ib;%j(zTfG;zN1_t{6G>|4zz_u+E-Z|p(n;~VZH_JckjtM{(H@AmrA zcMRF*ejl6(pmBdH{{6mEAM?Ww@E%WC8s|Fww>s+TWv<4@J-lCi4c#9yMCWCoYfTUTGi&)t`md~8f1k5m+^njnwj1aSnFdwr%8<6zrc_pP%ec)3arHX8Wg@8CI`uU8#XwUv13mXo|TVm{r0V zMz%g@be}#x?SS)POuTPwp2_F2KcBXMuY+BokI&Z%++$V}&(6>uD$H61=UjG{g8KMm zKh%7q`>e$#vTyn}Yz{|lfQ|D!|6t$V8zv8I*f;ze?#aGc)l0f#eznu~RM#nO&Xb+} zp?A3VvnN#dd33Ll$j3$cZg@|{y5pRzXN|nUtWmg*`ln=Laupo#tbR#0DTzd2b?cp zYly59WQ@2)_RVV`86(Ro|0}+__>{gAXOF-0INl$p`=P(@*|(an`>2_lHLQo+`_Jju zO7r(4zu)DG!r2}==MjECd;G}0(H`rAYW|5j#a^@0e199yI<0fpK>O8q2K(5*Z}#%g z=Lh>d7q?rtuJR_>$2q3|3%U>X$B!>D?0+it>(wv0pX^t?wM5V3QqFDeUVRqBz4HO0 ze1@|R_UfK9uQsp8tIzFej1T_Fyjx)3^iy-Tg2}fq_A))!CKls+!}p5pn`=;~f#0va zn_mCp{Oc@9+!yAWz`phO$^M5p!{SskbGfHwYv0RN=X0k#h#2|r$r>NT?uL1%>(_Z* zk61UHllAOTH%j*CaNQ)iGiu4f!gSB@;X?<-t^K=a$pPrP``BG`$Ci@=nM;#CuiWQv zliVpa&EK&$hJQPYHpkf?ZwvktJ79dA$Pf6N2G(Mrb+>wc}lKxOvyRw`feRp&4DJoz5oyOp%V89C^!M?Zf& z&woaBzo@Xrbeua5pI?4b-TzGL*RLlv@2zBXAH4_UA9f0Jivs?wJt&oX`Ux@iX$y@F zpf6;WeXa2P=}S5O$v)1}Q@gADTlO9Qn9Z)td+zc6`PdCU-Kp4TyszA+^7#Yy``0af z#uoS9Zv6Hys`J?ss!8_vO5i^5>uvtsYrOU4y}l2>Rv9y#gY^W?bH>~xW+84KW7pW5 zC2!`FatQo8w!`a@!-phs9m?CRp9{Z_j}PW=mAt9<+uv>emih?p|Df$rI{;e{+5!IG z$Q@)3y~^hhjXw~?1VNo3dt7BHT+m1g=DZ?%hx{G-e}&9=>(u=}pVTgk`keFm!~A{_ z=Ue8@3{~W8@Sd7Q?t_KgzL~wwtJC^a+#CK~tRL&^wYu;4kK%sUV~%UcKlLo&-#m8w zM}7ZhZr^Pu8Shu(KE8_O(8vFk3>!KO=VWw~_K5fEfc+{};_RQ%T%WQ(T_#MJQ1a7H zKgnmGeI^a+*DtAguhD&;%M;BTq}`&XW1lkp7smHtystiuVcz)rcpT_`EU(Yk$GuLx z;`PH>JI42SK0mHFPs{GF!WA}vb$!)+@~<|))b_N-2Rm+ZxaNH}ali5VqS)VQzOw-d z+7Hd=Sy!oieD}GPo&T)dGe1@^`+3can;d=U*Bh<$ybrqyu{UaLsHbtpM)t_RTjmou z2je+oZ_$;DtFCdkO0He`Gi%A=qPk} z{++nyr)J-C&;CqsAF&=j4!Jk%M|w~0jg}bAH}{*_)5qMBi#bj1Dat>EF@SmOY(R4S zZ`e0lNQQ1l{U2;VPut`E=03h^(0%st55xSdo;|vkyxG2;)T#3-*gtzcy+xM&ahTa> z*zX|q8`Ky2{Es8g&waaQFONB!fM;qMpT+j`F$PHFAA0ZEciIou9s4{d(c4Dwu5rJ! zovQyX-Zy?f&RsG#z_D+0eab$1c$9l;zb?zY*Z+Wh)_9>2Ui;|-AXgNvYB(3G@+tHB z^FF%B`}RePUdMfZz0Z%U&c`&~`p;yZGj#@{H*b7($zJk_WRJMU@Mc+0#d+@d+k`96 zuiNqXb}5(@@qhHlVfjzjp@J=vKmC6Fefqn{;r9o2h5v)GJ8@g!?ZDJWC3o+7$zI+= zGN(MLy#iT7uQYi=n+_dW=KgqoV4QtZgNgio>{DB+J>~DeDpLap`IlH6t*I&zsVZ$*iALnGe*&aQ1)cq=Ft+$8l&zLb&CQh7K z(yw1X=za%j*sy`d`>wagovFtb$b=^85Z8@gMHj;cMdRd;0oV%~zXgV<~4_ z)%UmDtM9Mzzk7eI?pyXFJ8s_RNdFD{obzI|->@I?AF^Myq~}Xlm8$t;-#7=ky}zl> z7r_6{oA$7BA7kF->kv1)*gbPfEy-BcO)___)1DgE>2s#nPSW&j%;%tkt2hPVZK8M-@`UHpv@>hJRy#cxC3t*p7 z#@?NhF}InC3tWCM!3JcFzFmqIHox?fBmsEhM?)w3LMuQ~QL*G&Gwy2(37K0w4iKIiny>RH6U z_4%Roj(xJE=knnGuX62W8t-@h=1a`a8ZO`V>`~JGtvBVh*Xks(f2QO888c?k=f`~D zemMKPgEWBd*MQH@p5Dd@vj&qiUiqg@Gj@%&41Io1?|BV0-@hKpys7IuUrB3vsSp6;7zsYhJvK}&C4x9&T zQhCV_R^jX?V$>!>q^lg!+-9ido^C#+3&A7KcMs(K;2)w250xc?{_sk zjqwfl5%cWNz}X5`-}TBqE?rgw64=)>Sbcua+%x7LiZq4ynBzXueBO)krT3}RE4?D; z2fx+L`SUR?<6g%DePoJn04#cL7x9? z>ps}Gx=;3R*yyAro5i>u8SQqgx?sd(FIh|MLgBYGZ{j|p=o7_V$$vyk;igQt48+DD>VWa1c zbHjK6I5+DKDVUtN?!@Qrl)^dSzi4-<>>nxEEc?KH?B^%pcLg>iZV#L-u=dE>f?V_p zXiouq0?-$v{O{eMaf{|EU4Bq)fU6b4E}}+QfV|@V`7cQ^Vx+?PsQV#KVm)AKr_%R9 zk7#@z&N7Fu7Gpok>6_W<&cAoO^UC+$owbta1L7Xx*Av-CydUa*qR;R9N-XAG+TWbAuW*Y=AufUB0hRZ4_sAV&9?n`Dwp&fpf<@ud4g@x%xa` z7~iMhp1u<7rDs28U+HU^c+1%0h<&g5o`1ftcG-KtXn@mx+&j?ysQ<(D@>Ru5smdih zZzhp>_wmZkmn!!;<0{CZH6LlujK=WjtzCmOM3KqB3`eMX? zzT~YRfc${V4WO5Rb}zI6!>|ttxy{^>@EI02m*NHWqkHRH`>oF(=sw>=e{KRb-)nvNm^L6>&M%CvPBRSm^!+0nkfi;3Px3yDwBKn| zH`<@9`^G=U{&%v^Gwd+82YG(_{Fu?*rAucSF=8aymv?X`F8gc}`}xmwo`2@dSu$zT zq>}#q`%4F~-?&l3lKYi?yO)Qvy70ehp3gF`dhcUqFuEG#gu4_Q8K5`)03Rr2E{nqwM?l+};b;CsgiBVZSTp$~w*yuajG!Z{zyw zy6J>%mjH}CRvw@d!oUaFUld)C+sSAH%9;4IQ) z$2hN+@u|2@t>{-F9v4o%%dBa*+I1-X7qEXcwu#}$BU6QtVprr5KuDVb5ssGFa zur9jln@dZzx7_RZ=A(@J>Fc{?^L%_Cy$!(oY~SO^4j9chI?wyU`GpbtEvXp+?}?Ai z86M`obNXZAeREH`*fhp|aBsW&-u1K?zaN@u&Z_e>yEv$6s&^$N>=+y>Cs zPsr`T$MM`J>b>ROzn0YdaA_PC>OSo>-#^2@*L>Ol@E_d==H7_24?V&C#QTb~-+0bs zBJ=L!bv>@oTsHmu!)rf*=3gpl^SaxaxGQDr{4Vfgk<(}G4n1}`qpy$Rc;x8l&ljM_ zg*~*?P1lomFnf*Ujkzwa>6UZPc))kzv`SzdYkIVb@R;jx#xHXG*wNT3oc&<*z3ykj z-v=AwZ2|wTw+GG^7(0+R=0-Vupiuh?-2Z-{xIpqIRW>yPTPw&Jg&t%)f4&YGBX5x% zOZv#B4eMq7+BLFs2YQJ%jz+wM*I{u})JC7x+{s?>Kc!9Sul?80U2nACvu|^KmVM8E zg7zEDr|q{k!07_6s`t2OJo}6peg4R3zv15AYc}r}=K9@z>F-tCyC&9mx@LM-o%XwU zpWN_#TE@_?VR3fHT~}Wwl~CXB()An6(HNy?U?{5H-f`_}h&&r`3A?cGwFXxUGp_bzr)%@1^+H9o%9#t(Dv zN5Fj|`}Y0z>_ZbwydV1f5&Io#-%_gPPkR&lWl^_df9;VCUr539hh*=lJN+!|^=nt- z{$3|rHm#T43%`_1^zx|3gv+VcAj5XJn6{R8g#Sod@XnxT5n9CF|TB>DX0 zKhz<8>|%X;4K&~6`%u4j_rB9cu+JEpI?8js+uA+6s{6|RNa@w zo96NgW<{bw8y_yCa&u<@W{pZ37<&#SWU?x{#$oDFa~AMuZSH0Gz8-Za+vxIFWg zeV6and|4Ir$bzXx=$CDKcR8v2cb>~r9(#AYVusEbJtOCx_ufX2T|LzJs-Cs_esNJz zjajp1Q};0&e1LTN{B!EQvi}roeAIo|DcCAKcT{H&u`dZWfVDjHoUCteZJX2k)3NXU zCC`0=k8ka4EY7FjulCuzPa*Th&yRflM6Fk!UvvDHd+^^L@#IL%kaPZhc%9f1y=%x@ zvrd0#_4|lZ8%j2My-Vk2<)m+y+$A6D9y+p-JK_px zUaKVb5A2;I`zGFEblox@=e!!Y#hMkZ!b!JD&S31{MXyldf+liwe`bt%X9JEDptd*b z8Eb?7jM%@t`91u7fgOqLL1YUwu7FRFKlXaibV+e2>BaPMM$`uIlsjU5Pce919>Vt&uRW~bra`1+CN(+(To%-U$5 z!#RD7AItAk_Yv!V_3RC$`umGI{8_nYTzh=`50XE*n#tuMzD=L@oNW1Zl+MHVn!js@ zYFifiUReKTJ+Cl#w-hXW7jf{Pur86q`wP^6b}St|d{BMoh{cHU{j;izuGzTGz8m(T zqT~+0Oj*vyKAgijE9AuSW2aq*_s&30uDt$S-l)HU`^x%zy*(+-79ch#nEs&eA9DZm z!Q73Szb}~I7<&V@Y2Cur{c^IibjDEnp55?)jP~zXIb1TPJTCi}yeJ5(&u;V$8?`Q|2?enMY%rC6?J+3hB|Y|`u?i*umL{j4;x^gukm}5dv<*f4}B(A zJMlI(w6DhA#@>%W^O@s|=|1dw=*Rg^ z94ve-e++Wx@E>x}M{sc4h*Eezj?X79Ya5OomIE8Ulk8zvXq-?m?s{ui@cU_7U}utS z0sWAbpC+--y@AYAy1bvO`*9WsdzYN{r*E1i*|T1S-7&qx#S7}lfnQr_K8wYjPCpS&q?=Yzbwbnuz`E$c34?)jFq7bLQ};Px2gI+t(-Ex_6Z^W5((^89WmgeK!C5 zy5AVO5B8rzu8(tib!HdN6^{4xMRC4~_w5;)j0MQPK5v`nWBkL{!!51p*;qeh-{n*J z+Ctym^6c|{3E!_!^Xbne}_&vOHbsd zc@N)e^7ppSR(oQ!|K?7~S!News!pXPm-_pO$zaQ9veTXd% zWi8dd0cWS&|L&fPdu|8z7fF%p`Pscvau>Elp0m8^U9$Z_MZY{P2Y+o9@ z`mLJRxA(HYw{hP)y=Nc4o8v?F=^yL9edhbHFNWuHv<4H@{p!&D?qGl1xUrm-U-H3w z?@ObG4U^bEo4WsbV!Y3sBo@vW)p$SFyF<=x4bSl&U7g(vxYzt1>-m;@`#S3DY`HhF zyJ4%xTjV=0(&7han?O#dtRHUX9i}z4vje(=>af-pBd3b8NH@7S+d?LvwR_v40=)db(j|?l|f5 zeIGp&w-NmBv$>bY`TRcK2m6foA3(fct1@bQIGclKh_fcC{k*VQCdY4LeV60c{66(Q zR?jE*rjJkUqS{ErMvnb3)(>+j-VQ{}pPu`;zt8vG>pr-rCiweA*{@d8;}ku-8+%`^ zKK_w)AIo7Z!#!*DxR+JyP3_zF+aV`z`fN~dpHWSUR(F&G1v@<(sn`$u@C#CnPQ<pP~ zYhn&S^*@F7GafXtztR4v_Ge>9=)RfR#VZ!?!@$1}nKzGlFB^Z>+~*2QkJ9a*PcpcjmHLFqFXHyoM{{!+;jnsGb+-vWf)p|1T zxYs@#%&VA!`+W>%=A-^qu;fk5+t?e=?^*o}**~1S8vAPz`?4;GzPJNv1He3cb;4X; zocrHSz=zM8Do2*RAcq$|7_9|(jCEv1V>zC`9PFPsg$=;(KY9@CextQQ_xJa2>@CNR z9E`D_ivI)Yi_p`IS>pJ=S$Cihkq;kc-{kVzv!s23)(0q-)bdkOdQm@~M`bKgFEeq~?J!*1Ld>{pGme>U>` z?CBkVa{xd8{0r!Q@C_jXn9Sy^#Z~+;OlE%RiBWIqQ>MO?%7g@XGdW55Wf-Y8x`TfP&QnY!Hn-_Pp-psd8sYkM7;EpLRUvW&cp}!3Q5oFS0bw6ZZb9;t= zU(46Lp0T|?7o)bB{+adJl>0FhqoziI^U9oG6xy^s2D=JY%L zu-vQ07~kLNe~fw90p_io?@!;BI_Ldejeo&Bxd-o><0t=QpW08|N4?C&`{6l}AHb8A< zl;=z3@0)sl5a-kGy4-%~mpNa}X}Q_bbtJ@}uR(>uDMgB;u3S@Tvt zpQk>)>49axZT?v7Qy+hiWG($da`&vo%=^4p-@aqRv67nocprXBKOcVi@jZj(=(5^! zbP2e}Vr;(~bMV%7J;!tJ_~&(VpNpZjmHhV~rM+1GlEw*)7vlP#ntj>;_l%=1b+ z%=aOc=6mkr>__(i=W|5d^Kof=^*M)=_2~Rbcf#NQ5%=kvMzfH=VvnoO=dmXq_3z9z z{j`sbHSIi{b;BAr_v$$oQn7#RaG@N{oFzv#b&{hQlMz=R_CB`L-B9z7=ggI(E9=U! zrH|<%_gSbtQr|bHoqKy-$uUL0__6$JVw)+_3hv{2wbyL$32(IkW)#m{zxz zBfEy9&u^#J{6qE~|E|{0z9#lJWo6b_w<;@{->5_5fV-S_N!zu&SSp8W$kawL5+dW1ee9{w@p|1oXCx^CylUhFkIvhZQ^`}jLyOOB>>4)~9>|JZ)i z3pam>|MOwZ8y;TpfchDS=HD-ekWV^TkD@ApD)=rx=;2^k6-?RhTxvQ z66zMK+o$Bea4u$;(eDTUYY}seLVWL5n2Y)7$vc&Oo|72*{yN{&+xLk7Fz0V#L3h8H zzW>k`7~ene11$TR`&a*yvA^Zs`2o~0`m^-+aa9Ib+p_xSeB!VkM(yO;e9ZN?WxRhi zW_M8czwLo|eT4LC5j z2JGW==o#!R2Quc#!Tp6A^Dy>N-QT-e3TIT8ebcaCae8%S{}A}6_8(l;7V{9Wp!-Gh zo|7E(Ph^Att^Ka^+&lhxr49JvnOksvAJ6U$&g>5Te{bU>{>?pLe1FbsbNL`Xj>0 z4j21d{=vSR@8N3y)P5KLyEz`3w+8nv<~Ox{69>DTxcbas#mu?4d490Zc)#+smrB*j zcgVNj_0)YeJSXFmk3Nz&-grHU{j;I_@%nya?dPZNvya!!>1x1UUM$zg@3lV#|E{;e zu+Ou1tY5^}NLR!@wcqQ1$bO>stIr>?PyavJXES!dzrU~noXN-cU$6GwC~Yp^vahbt z`2NtZugmXXzi9RY#?Mc|z4pMN7cMt#JlN0D7`G^QiyYiB1ow7JQ)`D_Dl?(ZEAu91 zrw>m3J-n(_YW9D9Qcf&?Qa1JaV~k;Hd*0*AN11Z`nL7ELO;jPA4E=I zd;cr_*WCAz#pA!$l4C1g(cE7Y`y1^)y!3gKCvdq!Zv#yIkhz9~^X`{}ztmK_#F(OZ z4%WO!r5O93_H7$4xtTj8cf&BSUlp}|vR@5*qTa%5(;nPo!S6o+_7A}KFP#4}xG#&n zQnzCs%FQyWF?63R(0@Me^1}6}W}opt-eY6u@xCX-|Iw_*$OeSk@AZWD7JN)U+f(CD zGauIVpJ@(&8V2pxds_2brpC`%)SBlb@4BFwxHjTkdob_o`(T0W-&3_hNiVQJapEM* z&HSn4Z4&Eb#}*n67%%C zjX!^QRqF)yj|+AG#B#%S$bLFzg_7IfRzB?)^ZJf!vLAkpkJ)du@w zVfSI4@S|Y9Ds;aJu6Kj?x3IwdiZ{VL*7CNpe>rr2!E2uV>@l~=NN_&V@gLX#p4-`8 z&+JXqeb)VL?$6qHZv%Yp&-nt$^IFv=FmGgQ0eaR;EY7^k_LWAu@8W)UR-eylIiDZ* zI$59%piXM8kNhA{=JxWMeSFx%3*GPa-M8FRr?c`u#(CJynkM`FXIl4XVh?Yk?z69t z{rv1Z=8SH&Q?OTNFQ0iXs{7zQ=J(@yI`(-DeSQ=FJN>u1?|pxp^YgjCAnp%y{WkCC zbAF7;H1?1C{Z9AI)$aG!d!QQp#nNm0>%P5KK{;wuScx2I|8V8X7L$GHDk^eh5 z|3S}w@thjq{ywaG!98r^O!WD|b{0VI^QVFT*^kJ6aKC>A*PCFzofN@t7A-@r5A#nm z$CX14vn+g=+hugqbCrGa?`;6=LC=@3QTC1BZ+(AX_hSwqp3^1&W;yQTSG_-=51~Kc zwBPjlLTBi2!q?{+9_sVcABBHv*f;UN?%&0Ea@2n_tA{#h^Zn#LSkzAC2|c}St?pN^ zOx^!hCQY7#IU4;+KEZj|Z@ke=s#QCS^?mH$pNW}WiMn4C>_5S?Iq-jKJ%WCU`uwn4 z_IdD1KgO{iowa57kGK!=efL1~Q)++c_b2Y-q0Kd#Z|Z%vzEAFTxn50kbumBRSDnet z^R>af>FeeB8+Vne`$J4%+-*$ZG_ti&wPv*JT#&KUmducTOWj`%rV#M{1 zdsBm_e{Xzyr}K{aeY6J??hTHS+?AU+2fW z2eTe%dH@QsZw`ra0vE{>>rr-AT<90 ztox;SZcT7sL-x(O7kT@8C4a`<=vAyPxl^lQ!SBc3h@$1~;U~Q*`+_R)!@iIGZQSq9^-({-vriik z&12_dmk03N<9_j)LH+l-Z+v|h>$_ebr~8`ow>iJ2I8&PUz2l#3G=eXzd2&2fpV|4* zsPSoEANKE8hwfuepG=uDMQ7!I_Sq-Wy!jhozuH-y-I0oY>i&~ppT0>0Fy62#=X1k; zacQ11@cXTObL`XC*X81$n7?m(prQBdjd07w{NDG6ZH?{Yi?I(o;JLT_yE?zS+V_#{ zyIy{Geedx*OJ#pczkh0cPwr1_{YL9}N!(+<%|X@sWUY_#_mS4KwpJSRE?z&fwrxuG z9m65}$A7IY|62P}uox?s^IS8&_g`Q0qWnwO3$_=)uwOK@y7~skSJemmCjy_}uzzgD zOKOvjBi}$j_$ZyxqF=Phb2*>fAp?os7s&**ZP?^#yH zwY*SALrlde=G)Yb>2At-X5q===7g4BYS@sTbkwco_T&h!&`k+ zb8e)o{l|Lz81s{N`1qRJx9rmnXdKOce$DmitWM1AAp295{ZBvr4D2^Q%j_4b?#F$8 z?B%h0c$Iydo6tUFW#9NPrf$hxKbHFX)ca8LozHL1+B7}ThJEumU|-{Yqy5ef#Msxo zU!eV9KgK_pkM;J3Hk`R#ulrST#%}37eLDtX?;h%CzwPKHC$@YY#P?S3Pr<#@diK(3 zAB|%kezWH5;oFlX6T_Q0-uU#-NNMcapDXnJmH(Lk zZ)`w34sd#JuFAgp{QQ`@&)CuA`yKagU%xpI()jw$=jUD@r~mH$Ho9*(pxin*^-`4p&`w{QP=P#Z6B>wR_I__2ft@iu8UkdFf|7rv9erZ33*L`EV zoe#&eTpa)J*D7DC?r#VC%*R6j&uF`lpKZaIs)xKjQ-$*iyoH)3y{;F_XxOuSn@Fw zI1gt5(G|k7+%aUtx3eE>~yc_G9bXr_A${ zS#lmSUJRYx)-Snkx31f{v0T2h0ULT=D7llXAlDb@KKc^=weB@JvF`N*_D!Du#OgX4 z6P#G_4D|nL<^LFbmZQs_l*3DE!RN;et_6>wF8>J5*nSx2gJU1=4D>oot0{XY*N~l~ zD@a=ZYi0Am>tyQ~>^B(qfb5*xT6WBCCEI7UkZm(t$krLnWy`cTbfryrK{gC3FB=DA z9^#O)GO)q9GO%8mB>sE7@>lKYPt<$Iyty);8)x6d{+!1S?jNy!Kkf$;_nR|Xo#wmR zo{#r!O+SqDo8ycQ*XL_`{9Mm3*|#x2bNtTV2P-Du$9y??;;inn=;<{xyENCQ>`#+{ z0|u1vT+9|NS|qW5CUxJO#Yy%js=ZP6{md@tKKlCjf13Qh(R`P)4D__~&y?ylkRr@Xb%=>BX4|dt>KI4Do-{t!Z`))t4p5bP-zx|`9$o2hj zgZlZuZR;Yx@9eF!bTqe@D!#Wly?x{Uq5JkYGq+&$-(>&vJLK5nhc#Em+PtgNIsaaB z@T-xd2lvjWKeq1el`)ws=mmnv2ocyCMaAXmVf(K**F6A#W7Dv+VtkKXClT z?T9C3WxsN=raxA{+obQSWu)J0Wn@6zh=0caJzl)Z?By#(@5y{3_wB%XJLLAl6~*~B z#&=p_{e9)%#ruwZJqJ4Q`R%=Ia((RYHT`{teWQh*eKJJ;m3vd)=Uj{yoX>xi?%$U_ zy?Y7R*1hx{Kl@BtwoGRKOxE}u``p9pW^`lUu$k4Vy*=pZ_3=J)6y`Z-jvtTB-o&zz z=KH#yv3;S|o7c#&ALpOGfvx!k{DK#cu>|3Le-=Lhd6&u27eHB$G@YWwgh zYJ9z}1N+Eb=(`ve7@H1gIs?0tXCv^-4Mya?7nQCL#2Co&yoC* zm%|Q}g&lav`1pa=GuAfwIQZl6>5r{{H-UZh_M*o3?@e!DHIq$!F7f_)$nn;n{w9YO zzaamW)+V-ogPv!MxdVND=cfF*VleyfjnMoJ=L#d_0=x@zWRC82%l5_ zk1c;1et&H_yp-(MlA`&KNe<>2?HqC~dXLaU+@lPbKVMc3s4gofejv*iOqN9xzLMoX zm6g?_o|DxRo64&3ugi+DO=S6)# z{kQC!`Yhf*&pjVU>~n7y=fH%0;_mV49yn_gy*nq;I?BKI4lpsk*6#!EITyqB>l~U} zT{2hWTsoY!$)4Uq^s*N1nx!*4az@|m_wwfr|Fi6$daE2=1YcY8cQ1o^#PaLws!xAx z!~0-AKC467-`rCEoz@C_^8OrSc;k0})N?rhYioNk>n&W}vY*@1UXHD5C_4w=5c^rx z{drHwzc)7r`)!ig=YAsQJ6YfRea%bI{}<#0auUbk{~w0#7jh31&L7*}_k2m~RYo@U zx==O_e@HgY{z^8iUL>nmt(2up7R!S9^JLD6EoUtTXgUn~>j|7Y;e+~3#F{rzMcTf;ZJ8|GE- zQ^fenJvCpyW_kDg8}8fUesFm{_VmYkd%gC%d_R0n%fDW!RfucN{f&H85aViJ4`Y7j z`*c5_UjH7i{=QWq&Os+eP?oXety5FHgN9cabB%lAx>;81^At>P)+#Nf1M7)pl z_)z1kUFFu2COks`|D);UwLZVbFs5$db>GMPQLZnF_v2dc>;Sc%kG*#7bNsLcW*<+yz8Bg+$GPF& zymp3h%RgRA^R<9|wXZ>)KhS-*x6kagFuDE~fzKcL`jO^`?DwymdXM<*_b<^H|Hz6) z@?T*8$kG>sem(Z>n7ueIpI?NYR6TD7Gx<56ntOP8?jE_1?c>84Jcst}km3!!(C>m7 znK-}K#Rj|$=DH?QZz?52&j>3eG>2|K9PjUq@Fp zk?jNj5w{nJ^S2NDyBt|wAGy1i5R?2>axo(>75khWRJ{6g$r^IGWcJ7TdR&7plib;_ zO8&;7QjlxTAjnAHi?jB&OWNj5vUcqn`SsUjLhfgP`$^b~J{o6Bjvw-sO#SIKnbP-F znehF~GQRiAGOpK)GUmG%Wpwu^WaJkWWMrpXW$YKX%7m|Pm7m-FO}=`%jPn02`2YSD z6Z=#9Kd5yp*ax##yS)!U##8wEF4j+q?;o<9gLl<=$36D*Fka;6*w-81%OCaiF|W^D zpQ-PeSfBa7DBmBkZ*-qpY5B4FGy423tCu@j3A$gEx)1iJ<8|YnI_BM4wQ6-a zS4qzE`yM}=>+}7+%D&0^1m{N$+6W?X<;=+BgGdH=9*X?z8b1#k_%##CKhoYDD4LOvtz;aLa}5=of^3!Y0HF#q*I{M10S4eP~ni zQHMK{v)r;DX+CX_`9F@z(F2HK)^w5mJ0|IQoCjgkXxnJxxPNI6&fwU-ZL4bjs+B8b z;erJ+%W^+z)Cd_m;5!-B?;{!0>tz|)^FG(2p}O?{@D>^H(JeCY zqnl;Or#H)pj<-m!rk6{{C(9`R-JUNayAj<2S6cm)C2)jr*O>EAKJg;(gA&YjO5X&W|xO<9^xz z*7$ELX>RlUjQ4w6_Nn{yzf-Y))^)#81Jw5`XLi1W3#kM(_11bG*KLv&D^|&Z1&d|+wAnIo^Z*&(zrBp<@wkla ze2)z8@uCdw^1KZA`dR7s#nbY`rw>Z+cgo6l?Qh1qMf!YDMf$vbll=JJO)~Jqo8;@) zE|HHOFC!hFDkGhrMQ;BE`2NuTzID!(7MQu+Qgb(^N89LmoO^!Guy1nvUh{F@a=d@n z@~=H1fuHZ$=RFqo^O}3oe!F!ePO81&`~x-iCi~T^pS}7%^ZcwUU``lx|0iLb(YQea)%{wPZYgPibAs7}pfSJNE91Mk zJU^e0JHoed>Su$U8N!|L@(s<@ar0X^(ys?CIbBHc;l`KC4aZgrD%ZgYopdG`V7^48tb zwe>%xXS;t&@3;ObA3lANy!%KQ`S=O!*RO4S|L>svJzu;?nqkgf3(etLJ8oomqcvFQW(uZ#f+F@DgSkG>tP-=ppw z*6vvoJN)ZQ*pvREWX!B9dlz<=tX&)7Bk$AYSjr_=;mRpe*2tS-t{BWY2F+uBoSC** zwvBi|HX+x)W7u7iv*<0^H1uIv(CJSyzvCa}*Pb^@I{IjG7POPC18_*Q`Ce^P%y1i0jFG7MM?mkH1S+uUIb& zhP0BIoy*JgE)`_zcaO-JE)UA!PBo?fr`2U($9v?bub!1&9iEb|@7*U~wYp6@HNQzZ zym6~^XjM%*w7p+Cw83gtUOK#fy?oK^dg9BKDJ8F}x~GV)n1 zlW*|-r;Vo%2Yxj_&-XO20Z!**+(YwAWgj-c)Q0Hu$C;;Z8F3%<_4)fXtd9F4h?T*owOH-`OMN z81iD;qmMnfjPbdzjr(rh9z4^lXZO^iU*`n+?e~nnOV)pTnQZ8NCHmIhM=pFP_{oK4 z<|#+yiHm%hYo27JEs?BM-%G~k`TDs%yZN-Tg1JWz>_h zbM`y3aaE_401r zf5=A-{~>R`_*ZFscNuA31F`*sW#q%h%19^p{>=No_t@1ZU$1djNi%9Q{W z&Dlq~?{fRj4zvyZeg4d8bl=yGasRo!yYYL~=@hlh#jd8_N3C%L_l^Fe=<&(KfQpkY1LeXZ{!&yRD$q5G!3r@6|Y z#>bD9fBODp-_GuEF~6zv**sq?-cR)J-D_$2x6B)xo6J3HdYa?2F+Ov%%0F$m-WT)< z-7>o1^FuZ-)VI!MrTYDOQ!rZ&`_%tCb1>>?Z^riKnEkh5zn3^Eb$> znX6>-q@^;Ve}Ba54@>vPSIHOkZ;(%$RF$3|JS3glm6eXoZjldPFDLC9RFU?L?~%3* zs!OZ7Ri))?RiwqM6{Y#}*Gj7wu90@HTq_M9_@lg5rHu05vSt~1`{6S3sn!1G_upL7 z_`ZrIZ`7<*(wy%%`L%VrWZj3(!@iSww|uN0%kd}p{J5V?o{zo!M)S3oUvtjx9*y(v z*f;*I^K+T^igMtZ>w|Bs+DQ$y?6<@|zDif4zF*}|`QiIM!o4+M|9?mK3kz!`v0twq zYJ3%at`G74$#_4Xt?}Wx#P;u7?nA#n#=hD|)80sT%>%4igeA#yJvJ2eo(Y1EXUVr7|b!*dQ?HcGP9;eOiB58BJ!ulGI zzmc?Gx?**gjf+Ohx>Z~7eVMw}tj@qST5Irl4ZgN|$tqdgzrM`<{O_`4=-aY-`4;@` zjM!SWG97wt*2)#QE?p~Y=M0ebGro}xGrp2_)4ss^T-HtPAnT@lDr+ZwEGy>CmF2(g zk!8zvp>DrJ7A@L_o}Df7%iK-iel7N#E|;-m7RivoGjZ>ZlP(=TmrokrD{Y>-Mm~Jy z3i$Fj$j8mA$=k2rC(Y|r(e?UEm88)N6{X>G6{TM7o2C8}S4pF%u9DZEzFMBCaIQRG zv5fNn`aNZ&EqwnEp#2@5JXh*fzoVqly%kHEf=R~xE$@f+BloBKwdnH)cEH#I!+pfO zi4oc)zB(|&M5eboBC_R5fb;AU|FLgh;od>S`z7~R2m6(8My}7C$LH!2X7)fB z`zPf3Q}M5Uf2jSipEj?b=<7$ZRiO2>zsfwXR_}Q|75j;r&-+4kz}ACM8~UKu9i{H) zoAbe?+PimR?Hls{WTV!%)XcE(zCPyUF~&bU?{3K(eyP^XGAGoK^o>)%^fqYXCag4B zv~Zg;LvC~}-6>14mMz_7*0SBQY~DgyJMAm1&RAV!?euQ4c191Zo><>u^^ukHX5jnb zXD^e(*et)!8Ye3z_rU5d%O`b}o&PB`unEF7v=fMzMjRYdwBmM_g1S=;&gxT;K9iCeV&s2GwSm@_Q#IZx!`2Ke*L;~ zzterN-=GrC$kFOQZM;+avxbX`FmM5lwPCu2taD#M2@kpcbZV%FSb>HPIb z`Q(%S(*Dh!@_G}T?bi4cY5PW9Y4+lsQm@tx^3tO>$}>^L za1S`nnbS*(?~|Cf?9;~&7w$I~>+99ukGwzQKEKy|^=G3zUyOh2_p9!+w@>qBCU4e& zXK-T=FVEz{8Qfm?hrs7Ajr}v4>nq#`-JdLD#*8WHYjwYVJ?K8z=e$1F_qpH5>_2cb zda3*7dH8tWbI%xuu?}rsP~*2YAYwm}f1A^%4RF4G?0pEhx0S~;&yh0|9XDqx{rcPQVv&RmTnSC0`^a%?MM__4&UB8U}UgnMJiq&1_ zkM1e+Mt_IZOXiKi=g0nlYhPS{l=!$rme^{ePKz@9?V9``&jPduHfO1@+zwLI}}&Q$qqI zsz4G=AV30C5JG_Hq9b}|2ACO`K4)yl9y^X5d+fw<5}({8PHZ11<8o7;dy|~_aeSU9 z_nx(X_w#$-wRRC=;>37z|M)(?wbtHy?X~w>-(P><*I9wzU+da_r{s-Cpjlp)`*#3UKJwbL~{br5%$?-d@$)#<rxH!8N}A>v7mTzn9|+=Dp><)q&Rb2lL+8 ze68=fH9k8wI>387KVp!rSO4Dc=j(k7wfC0yo}CX!`y6<&e!%bd`o6kK)1Mmif3YhJ z?rUDZ1i$~b{LgPO=9PJD{^85zR-o4%>?_KYZSC6hS{CV`6<&kpf^;f?v@7+Ew@7?JIr{%r7XTVu` z@7{TN_ii8ZlDzlQWpG8_ed#K=2Cf^t_23PoUmidDHs}4e=y`+j+NC71ydVp5QhbZYW%#PG{j0J4byKY0zft3UVty~bWApccxZdm0H+}kkKVSK8$Lu`S z=3{?6yWgMthW|m_5Ape3?%T0!w&vxJ^@Hps^K|>H-OrZ7=n*n;0yREzeYz$#+?NAA z`20=3*?9k_*!?#cZ}G~52TosKpX}KK_gAiRrcKO~g~a={ZoIE`KGjvm_Yd~@J$tVb z{buaFYxn)UXMRpU?~RUBn{Rue2jafr{XjO~#P`8In&;>1y$sy{fE}`FGpp7k_@(%wzRGzHyBF+&BFA@ax}@-}~x^^3892 zi}?OSxpD0a*uy*WT3?qu?rQ@bV2|8Bwntum`5WLvgZs!=ZoMXtufjKY_xd&FX}x|{ z9$&v8uixkc7r|wDeB+8dzIhc~m&doj%^TpBi@Wmh?tAj`z2AeI%Fl1Y&kqeA+d~e@8A~ct%zkW;xlqUJmToDlJvx)uH_AkmF<(r$80*vyd_kT*fuiVGy7mxcZ@zJI-XP4Ia)++Z4(pZ;E#~#}? zIfL_kUc7JOe2@Q{>u`H~yt;?Yg;>t39Tjl7^O|pM$y|gy0kH%1kN9pCGvz@sgc7Rx%TZNow2>NsbvT$(jVh{oY(l?MZo5}KED4yQ(YPaSI-9g{eaIOs;8~LABgX{pUQPt z|J$06=l6LzU(06J2t-qgMLPe?czxePH-=`4YDC z;s@~S6g&fG&VX}r>+A(^5nPg6=PrXQ;F{bze;wSEn+CU#iaQ3^PhXLXz4z$P_#Mt2 zz}c1+a{csGxpDTUi|g!PGsmu-zAV>HU6N}j`{Y{h1#nKToH!#_j-Qe%$9lmDxqS4P zTt0FH9Fhws?vT&>0`o}2`IDa`zJFg1?dp*9$=DIk8UCk+ zKPNf({%ZTDrMw_Ti7~zz>G8gWImy1o1s?Zv$@eqH)71K`|EJG`Kh{@{>%J@Pn0)2E z9uKx9?lwBaTaUvV$D?-N*nZd62W&piv9b472W;^Bwcayt<6Y&1_Pm(dp4xqEex2HV zYUa8&&zkWWvK5_S*5#Qv&hXE(`%mNkv$gxm{l{?s0r7_A{>l|Au={z`_^|urBm84| zxL%!qMDu&W+z-j^yWCg3XSlCEkb(94gYEr5{=Vv2kNbKLbdBUtyKnDR2=CGLo}KsR zD8Ryho=%voc}++StI}JM>pX(oIk9t_;fwO-^y$ybnbTj8 zb0=PbV<+L8a_%hLgMaYwO7BIv+o8l2|bilbX<<=Ey*={tsQIB^r)0N17O_*ITw2AAZ*(Tj57$OXA@_&hi( z=MSBcb3G^J+`$vzxSTt1RL<@{ET<2imE*@gCr6LGFNY7kM_%u3>E3fwdbX^Sp5|tH zbDN}n<7R1I+aMcjYGrl#3aMJSPG%G@l_?WvlgBQW{H$b2O^lKFu_F!dqr+d6$k8vz zsKL+4=poNZ_|WGh3jQaIw!VL1+;cK6j+{V3ly6#UoNr!svadWpotQt{SqsG|IS)c@h&z7AJZIk6J?xGD8Fcec%6*QhowCob7q5CY-}?H-w>9?8 z`n`tx*hRw^IHS2T?T0lsb3%ro3uJq7t`w2yFUIa)_%E>gI#=KQ`wtw=HFU5BAh|wg z8r=8t{PZB;@7s7k_;-Z#@{_OBJ|@rC59WTr?uYvN%6+R#?f+{2bB(!(I`evSM8mig_pp8v1kJI*{h zO=j+$|C`$X-+pzi{Px|Q)Wdem=kB&jUw50F-PchtA5`L+8N-IeYk`oI898c}310xdyJwxuZAa>`~r- z^cJ`+XOG>M(><5vV10%3G;WaNN8guYa5ET355Ft>H`L0(hNW`q;1#~_20G$8xN7$g zUY1h_F3QOReR6XDdFkywE4};9fK$@j)hj3Vo&d+>MCTDXvFETH=zg8?WpB&At~coe zc|-PeJd!>2>!f>Ii*#(>F1s4GNYm<#vc9@rR+g=i%7yD?=HwMpls`u%kITm2PsZLy zNp$#ViHR62W5>Yzp}!@=2R$bvfbu^A`yY$%Z*BjlC4KA|-?+H3zRAh4zB!qRzS6uj z-%?`!Rn*0m`wi6kJ?@*i*#_di%X#bTyZkqHKGfES`22?dF82-Zy=PUW$9=W?IYuAo zGw#_s&)@g^#p*Mwz1KRq#?IJJjiKR{=p5aJZoGe?kG?)P-v6ZR{^Q4w;QoE)4uJdZ z9kO!ya+y|4u21La=K9p`>-s#(f91Z$04j~Iul|0p&u{E~sLeOrCq6RyJ>%~O{zvWU zQ+?|BSAPEc^DYC}eZL=P{W{ObABgvA_qESM`EQ`}Ho88)pa1Uu&DDbk?C)3G|GP(G z4EKNjEo}b}`^@~-I?vwsKDS=pxY8y{{YIbnkmh_QRp$U1#M)*J*G@PV74e&dZ7JJ~^@f61XfU4qO3O!F6y0+>{ds zZ;?~KMgJWA*R_?>wQ&ZS?9kO5M^8^zYPB*K3q{(;Fl|yHtt`awI1`QIet~B`PdTBF7Ao z@R85Uuos_`p)WjVr1C$^wf#xt{gT24OKQYuUtUavuQ(}&m_Na{$c_0|U~4qy_xk&T zV}5-eLi+Xfd2#Ljld(Sh53>7)|7v?&?t9Yn_dV&i|6cA|<9$=d_Imm4x*W<8JNCu1 z|8R&gJZp*d;gy)RIp99?^Zysw{YT`T?=zO*ytFI#SFUiT6w}wI>+!*T%X?3ExxD`m zai9Oi&waK18ZRldcVG2@r(XxM`5fz)n+fsdv}eP$^TE>Q_=56#F87TdaJlZ)`E<@l zwf#L6PaoI&u>Mo5Gc|*`>nhCrc>nrm-Da-6Z$4_0duKZ2{`oy}^=PLY+1VyNJNFO^ zcba(k(5`OTzw3nT-u=+Rx+R-sdD%v|-z4*9Y?N_1RWc!OyyT?BN@Da_ z85H`GvUwzI-Z@vzr1M<)X0efZa zzSgN+_-&gP-@3VO%X@nH;J?E7%o8$wM&i3@jjsuPp*6nA#QUDluX+AY#P0v(CsQ9i zdJXQsWabQNZ*QkQQzO%ga;2moMe5+bsqec!i@9#Y`%t^@ukH1-`@#AB;8@?&pI)xd z)2~n3eeOdr_f1{av-g_YvH6`Rc<=iBwzo47>nq>=$JqAxZ+rprez(`W_*C2f#qJ1q zUhO6F%fC8l=FffW%1&}(oy6^3a+>uN_HF9`ozk^!uXJtSCtW-CBYUKSUbo%buSm;| zd(zVUK-ycb!mnPJXJ^6Phfy#}t!zP1~(cW0lpaDQ5A zx1me0zpanaEB&zRk?an_uAPr$C!F2Ba+B<+Stac|E=WhqW!ckm5%j@n{JkCL47c02 zpO&_5r=+dvBsd|hTaQWWmLuS>v^E~5Z|5c1(s)anHl3Fp8;(eGL#J%7YnQFHyJgeL z7OAh^CTl9UNOjp(a(&z3expnnw?gtVCQ{Rj!|p5hBW29+k@)$aGQ1xG{}t*3jD-6d z_eTzYp4fk=B!-RjWk!Yh3KPbfn16nD5_SGGVt#65_{(+p{W`8sd%ZpG>$6~VzvhAZ z`-lVC|9;#zdZ3@(*XJ_u%({NRpZ_+$Z|i&5ePUnrg$?&jZO@L~vuke?KNqI?RxvMz zqLG+?yx;CypZ^of^TYkuUVBwudifq}0-cq%wl-P5qQ;pD_ZJn?&rhyzHNO68jZc8> z?N!@ve_M#ZuX#S8wN1_MS>E@v`NrORI@GiGp3mRk?pysFV)ui&Z+LIHZ|=3;b9{V1 z*f(RiT-o0j@O*$^{`XWQKQ-=G-~UIfJ7MP5W^Vgme*d&w=)u2d9fgzK`{cmRPHElL zA#I!YN_%6Mv^DMn`=x!$0cqdbBW>`fZR=6lz4er|HYvY)0dkx2?ToZ;J14E%&x1Z` z+kO#w30#)e9aq3r+1+$bwk}yNTUTz!?mm$1+u^ex57`dFHnxMXZQBFc*7UM8)-+1v z(lyf3cvg09y#UTj%a(J}%zks@8EM{pN}4yF1Si08a8#N%9)ahFWyks+*|z?OY;V{v z+v@j8Q(c#AUE3**YdU1(%2sJuzDw3FX_l20+hl3!PAQw;BJ*Z8$>a%jl9@aeyB{w} zG12(^V`cc@(Qx0|edYb&=dJx$zkke-PsykugW&%Vi61kF2!0vGzIlYS}i{ z_jqr8WVM%O{GLi(*HXDp4s8Y8--M1Zb9b;N*G1xe?d|y_?Y`muOZQk4=qz@mO=_yE ziTCO0rLS)tF$s2`I-fTV0pEq*DnIvC$GM!hc|Nbs;c?%_`8L)M`1@9e+F0LTL)9@m z9`L(1(X;(j-Us=2e%|}J@AdCt@72zGF+O(P#P~rzzvlbY-}htQMCaw@9rGV zT-D62&)nMo_=oNI>4&7Jz1yI9{a)=v8;~Ckoc(rV(ZkElPUSj^{fw8Io zYq}qVO&jk>!;-DCe(^fly8g6m-EbbDQ`Vm``&$}L%9i?GZ~`2Y#&wD#;IM37dq_6d z9s~zKw`^R!Pd2RDE9+P6k^1HBvUcfiSyj1HYRa2sNohOW-wpS7;6rYpwzmlGCy?ul zm55Oh*!a;h{6!n@d))VI|L{Sd!T!G}5pX|t^l)ElBr$(%gl|%EjBgGxe_3v-Z|V39 z`g>X5R_pvcGaGfDEv?-d?z?thp9clUJXk*qVScyjy|Q*$r>t4p4)1w(Dt5`TvR0`q>5x+8{`9Rfy?BFUr!S$0FGCW?#*oh+ z1NRj}$njghU+unff5;1;0?*3`xF0rbu!;FoB1ZXgV#0kziP659)cF_Xx-maC)5iSd zj<6M*)hE>ak8<6O1&wsMKM?QDT)aWCzQ*|U~$46h^d!L-$|H)5&>~WvI4a@zS>SZ#Ox}(~C zGe5uD{Rv#RJI|Px=MT31Uc7JoeSc4n{x4el4CF<;JfEja19`rH|8M;O?7rU5;8endFNPR8iU~A98J9^`(ldr1S&DiQ|2DNLhGq=)pwk_7yUX?W~&M^M+S_syzJ}+xl zUy;?TI1W~=yz0lwl~<&uq*<0P*dVpbk4x=}ld@*{38ZcxA z&v;_^aD4hOY@&lmLT0{?RpYV(8pd92;{;!l;qIX-N?vHRY$thK!W?>E4E zwfDh3zpd-p9J#5H!+RaKtMRk)Uvqt1joqi8pK*M_{rpeM^*zhJzMo+CbsW#VyLaLK zY4S$9rFt3MpGdr4fX`o$!8PKaaLslspZzWB&-m;6L3MqP`~Fxzg!k6x_jn)3^=rOA z6rS&I?v2ZT5ItJ&CyS(eQ99(eO+>hl; zj>_^SM`U@`VX3K990EPypj0p354tTX_Q|sHE?HW(7axC*RAK8EFY1K%U9xCyo6Mil zEVHNXU_AIXdRMm4(=$n;M}$$w3zLz9;6Ap0zs>yy?1X3YH7*E=^VQ#XeSY=z zO@7~><9E4la{S7D3)|DzkNcYAa=EX$zK|ThiI)Suzp0yR{S0`yzKL4n3mVJw$#DP2 zhWmH#+;PsFhWopAYrO9$_e*r_4!qZX1f63fSdSU*yFE(Y7#_=e{SQ2SXzjk|BN^%D z`aX{LMh|FS6~8}(`-b<{_WOM~*SE7dz40Nry=`*}sp%^wINKG*@1J1ozUTX^9#HOw z*nije?=H*wSl@qlO{whO+$NpP`|!*6$%?AIvO;ZOrOGZ@UfB)yg9GsBpy5tURS(;T zEU&7LNKMsIa7>oNy_zM86H>FZ7r^Bur=+Uvpj0kCFO`+&W%1&3fNghw>5}v4X~hMp zEI(n7yRYl}mR6pUWlPS1vr<)gRu)(Ac~Ak$%g?$vBa2H8NL9r#i}IsVRel5_FZ%P!(RN9;l1Vl^TzHQ?z{Ou<^H%h@_oeon(r%v z`^$*=HP^q+%lEl{;%4>x-B{n)ecgBMzRd~P9I}lk?K8I7AM;!O2Wou5wqIjam;c7^ z59R-Q=HxZJ_qgxo_)M;kaeLY)qtNwt@%PObnN2!|m$f-2717fR_l?hgiyB|g!2SHs zvZq&l{#O{sbNB8Y`an;~F1T;(zU%Y*bA86|w{r}7I>75s)Lg$mzi;$kDEC8Z`(96! zUk8NR`(XPY;J)4;<-7+ko^x%!iSONy;__Z8EjcA6ptR()l$HiiQGN!l!)XP)E?aa|%1Y0KptAfV@6q?2 zHYhI-e7=g#K)Ka3op#{25? z2ibl4do|Y&_p$q>`6<4o#L+9U`)gglU+erDBbvD1^YKG?Z{q>Od7dSeHm20r5~%Jl zaP7Z8*Z(B{J$vT)x1QZo9;hwUcv$n}I@g^aUXL91-t^7T-_uY?jn9nX&2#7Ouw!^X zDZBsh;RCsI=eA?Hzf-x7-OrO!>Je_dPo5%Ebr!vS>hrtxO7;8Uz2$x||NC)YbD`)- zf3Dx_0#wM0v7mbbFZ+U~=T&(sJ?pKy! zR~5?pGUY#hFg894}u$jt}lH zn%in@|IEqTr8s{h<90VnUgkQ956?EXKXQ1OiTg(l9!Wj#1^Dj4+Wb*&u218Ae15TZ zKLWcSO>b`ky}fXsI+=36R=E#PH>j@;pLLBEuh#F`dE@7!53H>Z*nR(;5PsfU{s-)S z|G3}Ue#`y9bMEE&)b`u4dv2}|d+*tO(gZS^-es3)fZ{BXdL?>*ZXG872>9H~~nT^w|?T7c=$KZJ1o2SXf{MP1cyzkk3 zo99=5pM1ZU>vQdWu)lBO|Dc?oa=&fild=E#)iJWBtX^tC^`b2@f9f{uUuS^(A-sn# z9`6m8l>3(dmTSShce!6-xnEh)3pWGYFCT#SRh8$YbRpa~{(<@k7L^qz@e2ZWU%6ko z_@v>#r%M)VtYCQmD{>znW+3jX51>AO*?i0Wk~yt1cUrSdF4$zaUzE2=3bHpaUUxEF z4r9zNeZBbpBL;=z-)p}A1wTd%et}xRAjbC5^H01VKV~?6{i7v6HbN#PM~mO?o4$VA z-&f~y->l7~Hod=(A7bZS|3Li&6DN4~K3E2F&!IWLK%PI4>(knn8}DQD>xNU;x*?7M{_xUf}+NUQ?AB5U}xNkt5=I49= zZRNk|_2qsT?ti@BKM?ngy@%_8IA3#pMPMR%z9Jty*KHH;E9W)G7o6)?-djv^x=Qn$ zm(~U5^FLIRCu^vYtp-aMG|KD=8<~%4tCY>_!1pBvHozaoH@3FYwf*Wl!~ezj(iVqh zF}8LwzP80Nh z`*X?hO@;T9$8D5}c^jn&6y|J}w8V18>4Zxn{0|=%L5v^e8%(}`7~EH1UvMabH!R0hR-J7uQuL5^?Hxow>gD;>kF|E+v-w`F%jWs;kKw32W}1o-dz{>pzh4zT>!eboh?^x^=ki`DlJ#QOz7 zHed65ZjR55`%R8dV}94y*SwyW)AMrs%5%eOSMHiW$sK^D*6EHeu?%B%^SWcI|(@V_0dsJ|cN^Q*lyxiZa};YS<0A7uOe z{=R4TvB&uQYWLMvTbpg;cD3c|=c~Q9fcpy%!~0(5%TVAaAeH0#zCg@x{eJZa%z4fE z)!z^D`9u7Ey*~B%Radz_e}B7QqVbLT{GITBkMa5EPT9s>d>dsNm|Cz=Cgoe(KM~uX zpS}Vco*?m~Bjm-;#L8zr9V;(hiS~O{e9N<7sN%%jPy8J z%zQG{*r3(e+qH)KZhxP0Ut@Rm`;G7KO2c{2-rHwNx$kk^)RlDK<$Fk9kK4;{>eD=* zPmT56TwjCQeQct!^;*-nxpL7upXT<}-YciH*0+u^{5Ial?i-)q&d>iz%+>jmA6xF< zx^>g>bARa)XG&2vJ-umWERR>)8*oeyI<4LV{*JCc=J)$u&KrNo_Z#?G7f8vnra{W%xML-=pFAH;tX^Sg1s$@O_L zzsCE)F~7$9Zp^Q_e*As)eP*BsgSkHi+dqkzU%6kD+aRe?xia{LL^z))&wn~WUifqj z_I{{Od-)Xf^ZK->Hw?S4y?rsGhWir3Mo3mPef{xcWqNvouaf%ya-F*m-q-V-C^lgC z?YJJxeQW1++k^J~+vmy8d5{0fdF=iMzpW>(|Jd<6UaarMxZ2-l?Vs|&`usZX-OS5L zPCp&qQ`09$p>=(gtC)bk|$A8sbs?W4n$*c1X#C^kmx8K2X-^Kvz4fpW_`tzN9jejn0|F-q} zZOrfG_^tHf{U$f(r?%hA?J55Q^*yce75cW#9#5XH(6>D(-Zyc-zo*CM_pOib`T8oY z&G)#k^4OAO---q6q-H^bES1|Eg;| z+ppK5y2xCY=l5%T672W8{MUHK<-Ynlvx^!H?`L4|mHX4N`P0BuxNm*`&A#lk1}ALv zOy8gvQ{~0yli|N25t~0oeSGZvVAId1vA*&?YUD6{{t-fNA9MMH%f!Sep|_7UJW^zZ z`p=BzQ-6QGa^LgWUArH`eUIZtTAo{5Z+&`i?KkDV;lHsvUjJzz#`pYuGj7M&GdIq6 zZNBk=$$zWeH~b)%XSPl3%rW>x?aZfnetmuO#B9+TpIL|ZoaH`iaGN>12IBrRjrZZc zj^VqB-S36_&CNQuYLzp&D96mzsk%wW9jwB~QXhqDHu1jd03DZP`+8m5@9I6z_ACEA z1lxY&|Dyve*PkL?-QeZ?`uqIq2WYO(&waL)`!?5S_-<m&a2 z@p<1?#jNo@jSalqfXxF2dVNFs{oFWU>%3V``RpySY+i$u&)I^l+wAAQ`u)L}H)Xrw zzp0O_|7>7=eOpJ@+MePV_4VW6go|EytGPOCH@r9S=k?)!mEt^ln*JQH2)o~(`x@ih zn84NnOs zw%xwpe9q(x&>=i`4V*8u{uC6Sdj6|Qe2(B8pBcZ0zi;in9j6ap$md%-4~Ovgb#89E z-pwkwwUK<_xJX@(k9By@on_8-Yxi|MzJa*^Z0-I>Q(tBr&rR0+K5>F^TRXP%ye!5C zf&19~TKtsNa#=kwzJKn$So-7qcB*Dxhl8m21pg!}BU7+JXv=>b4!I}@!o)GN` zwex+TKQvG1)&hckgoZhbd<$l5XMKsS26GszqCUUcyO})i{V{vuRwh=KPoXsg zzQ^SHg7SUlnu79uCf66R`~LbqwfqIt@B9B=kMlF&{B$tM@P3Drp0d?Rj;nK`!poe| z!zcTO4a)ZodLe_jKb^XMB0WE2Ol+@wj~YHyqN(r2VfPclhD%E1XyrchcSp+f)L5CH znJ5+5{^iVlMZC{F&hvTP*ZXVpcGkXgukCuS9M|`F?^8XY+dLP}S~y=v4oYi3G$PMOI)_8xQwK$)p-T(2AKbray+`n=Cnseg#F~)`}_bZ*rj4Sfi_byISE+7qhK zzHqA(JiXxdgpohkYH|og&Wf2!eDkJllljvbpFV8|yw^OR<-YR&X_!N;yL3Kzakyl0 z2zgj4;93Rzw>U=r{kRL|rLFN*jU5&=uyKQ<$vtx zVNSfAzr#t5)I5KLGoD=E)U+6f@q9v!->J+`k!3uOD~sqmr^nCSTkfy=0}9Op*6AD{ z#y7Arq}ug5;!5tlvxfeF71-VtA|ci_{ufEqXxn0ISE@wK)pO^J~1XcK>bV{*4<> z_W{O%4X_6Hv$Xrlea7%9_vJX;-wyXH7gsQcP_`^6NEY?^SGqdO)FZXeSNX5M#pAt7 zH@{(Gf9$>fCmuY%-;<^$VsZhl9yR>e|Fpj@K-Y4gwAQEG_n`J%?X=$qn8mh%t@-Pi zt{UR31=$HQ5BsnHl;k8zWkIS`p=;?0p%+}|eB>VUz8db;N_6%rzJC?>R`W;ND`tTH zsRe2a)?pv&K-tulzB$zMXXDRLFWTmtn76|>t)R&_b^I0wo9FZ5{ek5snLn+Co_Edr zd$vEg&Zo6DQ0~?Fl>0VkZ*9M4|GiqD^#c|W>(8HmJOrvEtgoO_^?>>iLH6En^WE<( z^J;tp#rd|zS2BmVp0POt|F%G`Ltj^4e|*jkUsn1qCo5%#lbPJ)WF&2JQtT&~F*40pMPFbU&qOJ)LrG?W zEHX$$#>=8Cz+B=bY%fet0C8r&A}7gLm6z;W%4e&=GEg%v#Ror#httg5yEe{OZjjT1 zD{9-}kZ)DKnXALM0$t@{Imb3o?;A(FZ|uHu|IN4MI%_F(cXvzUmc}RM=YQ6AU&ry> zxOUY!cI+tgJ#3?QyqtJHkmuJmxlI4DO8DY&Kh*YHUFY}z)&KGH-_wd zb-Z&x>g%45rR(<6TLqt$`zC%vdUYJl*DBXdU6=Zf>heWA3)55MooV!eOizz>)JG&g zLM6PxIN z+U_gL-|icqv)d`mX>p44w>wh`wmQLa?^CylkJWZ6|NZ$sVr|=JX6id)&{MxWTLMkxTUF_=0o%fjpn7L%MnXviW<-X>JRN>7V-B zi1nuwZ1Lq~>~ylycEkG?Cp&qEla;*9a6c`v!AXe5_K%t=BZd~>`{%;@d}s8~47eYz zxjiR#H2(hR;ZE$R;mqAL%1I*6pAjAAWJiUm-|tLH(wtwMGmCpmz2BLi1#feborOq+ ze>_`Zm%L%Hk=us>SG>mlh3!3*jarD z)d#L@q@Q2yzV`KreCsXczN7JeW8;(Df7W(id-<CQroQ=l>VL%Z2I{Y?&o+yD!u(D$J`PY1QaJ$>CPYXP#|=0>k?l#$0XHcT z{g4{#o0b;K*l?aD=7yM)mB4tB1fHh^#)~F7j28zWZwQLnaus03NNR_(HTLQ#`bj8{k%3cB}%5DE7TUy6O7LQ z=n+y(22+y8%9MmCeI8^AP&pajVlsKf$vh{;`mFE_DRh5I;#hM&J^viOX92pSj2NUU zCrPR`Mu6KUuQxsw-Y9nzX3W0wC4)|xQ2p)sQNBAe&NL#}y- z^f?05j&jWV!Xy`|eq{mk!|5Dx6O*ERQ&M9b#*jEu$S+UJDsm^E1^j)DM;6X%Gj`tQ@j`w1r~jT!G9hON>+WFdli__5c0Z}b$x4L# ziQC~l+)vozOOJ1GQev0;62_KF)R<`!HF_F#J@`MQkUrmJeEyNx{9*X}!$sqL?dR8g zALIBX4P+Ag>;1}CaL)_S1LMg77RE(busvRn`4Mi87sN#HjJSwKf&!rDDKO^?H|NXe z8L}9IKR!nC6g)$Ue748&%uI+0lZl*v3i@Ftx@A7kUpeu^lH5cg4iL5fhBpP;%R`*6 zW8wOtR@df$`$aLMWfHkQ<^CIQSnluJr`+ExMMXtFm_B{_H><0w-|6b=I{D1GPcQ%V zYge43tijU6`hS&+%Z$%oLJdXN;WhmTmjA}?YoC&}{psZV;646;=KO8$&)R;=f6My- z|6NWS`>(GB`Ta&msNavhH?OO-zQ6ka^~E{9bsX3H%}VkzONgNsW+gaNlB3jyJ9#_< z@Y_izCQQ|5Bx1Ca5;jWG#v*k;a~e z<3~7#9*G{~phtW;v9V5JR;3gbwiryv+wJ70wn|P~yQ5GYke}7+jLX@@xV0Ai-mOpM z!29RK2izxbICn~mESjU^W8kF5e=+?$S@1s6QSPhH53u;?fGC5}k z$mSVI=NZZ5*-2Mlqo35*v-wN`HOC2Y;rJ8e9`OOl6F7^>AuP*FlI7$HSLNGUp4Re} zGuqP=BGCytZ_fm{KLwv($I!p|=9_Bw9gX)lZ+?>d&(!Dt=%cARj_2ytE3CP4Semvn zziN4z$@Q5UAGto$hlC%awMxBq!+qty(E)*+zu)(F^M0QFSMHnfetsW7IUeu_yw|O? zxm24^rDsdmUtw;ObrUmm&QNq}8u^?gS%8nFK35SsJ|DZSwm`X_gnyWze&Q$>JTt~` z58(0XY!=J)c0O`uVP}ub;=}SClaJXYM}oj*PJ`+Cm} zMk7J8>KM+O47~fD$TKt$^u1}EI}_cZet_El>BJuMQe&|F@v<~KS*pn~YW;o{`DJ7O zmH)wT{Q+H%uLz%C*Wo>L)^h*qRpxN+>Kc&y&(!WK_vz)oa`lRHBb4_h4`A)TPh$qw zEfwlG&NBR|#kr~EZQ_XW;+*k}?ZQttwp{H(9M6V6FL7grJ25;v_>GR%iB+28{UrQ% zVtG9wY=jeotx@Q<=9lAxCC@=ZSb>uoy%zpAVgGlresr6YliVs~hE#vccvgY)5dR?^tMeBjT4mO#-*?Ci&$rZLq$(&9&+-2-`*@6Sq z4|>oMJ&dR8Hu1y4S?$>KUBna3=#VDH8#Ml!-ygX4$pzc+dHC(At@!ws_nC>ivGpKf zmy;Q<+(&vk0RCqtZ1-ivZ;?!m`J-1#d}OH;6*dR{&vnKOn@$h^1m@>W=AMmE{*&v& z_aDXm;9eR(fO~}w;Qpwd9^t4iNK(H5srwou#FH;Tmm8l!?{A#mUsoo&_uHI^k_MG{Q2~CP9sk!GA>}+X=`7bOF4#QuTq=0VWQJZ;}jbe`?G+iHoQt=AS2HN6(e; z5i{xKpCsW!GR^!R%6F~x=^7oT=7&^WV7Jldx(^qlgP{Ad@HSe(GZ3vkLhx6m@>qL@ zqWqF=c<;wBw&^8~9yUbABFCzvztDhveJzT8)eEX~Qt$_}u>A%2os$zIWiGXWQn;@< zzh&h7R%$*UKi_a4?x_9OZNKC-owLj2`3rO9G~9pu#v5|w$`#qiS`Pzp|5@Ap+qdBU z<;%|D!#%9M(1_hH!R}|7F}ymCPwRT-deL2`)(7uxe}6w6fL-?dej`KpuXzBq=>gu? zdA$(4&&&s)uT%3dpr1-@|62N;myOSNN;7k*%j7vzlXA$z<~rkIGqCrW*!xs+K&jY; zM4pKxXYBBJ#)ihj(?lo2$RuO}`$Q*NQ&gZ4H6W0>&C&B$>wo~AJTBk2N9b|MG{^w+& z1KN`NZ??QgD(90x zqPv}_dI0__R2L-f_TdAF#sk=XWRsH?yHS#2RuS))NKE*ACt~CrxIdMi{&C#LvBu7; zuSUJk_-rbz4;L&43w|5Nk)x0!;4a*Z88w9dAmoUr$dN<%jzOv)LZtFMdiY?Dxe~sk zHyq_WI)-x&#=Z#1MpkW2OhkdpOO9eUpFz(_v4TMgJJ-q4-Dt6Z?JA+He;N#g!k%L2YNOpNcPxi z=-G+f$6|ExByz%lywI2-U~n?HJE68i?K2NfOgTy=n_2h<19 z?N%Q?fZ!*Q?`x6FxMoR@Ym$_hdWnx%!g?JGiTURf^Uvgd7Qz2CeE(?lZ6tE+lNcKH z`VZ<`s?VPe?{mp3PSkuKb-(%a z29#3oUqVk&4e|a8e15Ivf2`f-880N)r@cL=Pr?1yUzf|5S&xZ$f5QgmJ?Q82KTEs+ z(MNwX_14WBa^=z`=g=YMk*BUuUbe{C{j!PaPQ9&1+89Oo4*!F>9$fGDA2&IFwdEGU zocFfXzYoOt_yoF74xb)je0+QZxWA^T&?$_8Z^Npbk%MM4#$$#vVh}OmkeOBvMGl@$ zerP7I&p^&Ha^&D?JVP^_k%KuloMS^~@GQ-8Mh%&coavXNhfbHUku#mJ;WH&-NZo}P>tISYHgP@+dKbK=9-NfvqQ>_oVnyocu=UMFD-6We@QNqa!2Wa0Z~XLd<; zhVp+e-0u|ZKipSz_>r64jt|f#`7S2px5(7-)CTaY`}^9T+&(?{g^jG8yTkY?*_nG> z&J)L|Uz3c!<9FvI0o^uI{|ELHkuLwObag`_|4$PCkNQX&AH=J#)T(&^bih_8A*z;q z|6+Q57VzKCLC5O7L$41laz+g<@)zxWE6t{J8gw;v6G5$Ecx&&WIP0gG1$r z7sqSPf!AC)xIjh^F2MgAYjOf{#0aV66*SjJp3f;H=A4okZF+x7=o?y0Ji3e?!OV$| zoNF-($!8-+&7+p2vE|dDuWS72Av$cK#D-Upld6%Vv32JqAr4OCwRE_j(Pi~O7TXH^fvn6pPc`H!gR^ zj&@}jGQ7fx8dD*0k&B5hD~z3q4qJ?@WWN$w<-{Um!m7wWEp=idmcsXHCoWX6gmoOy9ut|6uQs`tMq2(4K>d*z|(jUGyQe zYAu5AM{jWr3u=$A_V!lL|G5-jzeaoa$EO*)56}Ia>CYkc3pCGf z>if*urQCn*@gscxOT_zoWc`NUY`m{_{|4iCFJA0pzJLQJw^*`hfr z0c!7EFs5Jg7}oZixk+sNADsW!d|zMsJj4gH4hW)d=UeV3W4-T<#z?-6iSq*r_;lQGBOlCc@tY zz_YK&vN`};X1DGBKGg@TL$?oKpi8pSK>9xHKGN8KKA**F=z<)40!1zy%*{rEyd2$j zeS>VabMO)RAup$c_jRBj+NmY9!Rc0@bp_2WYMudpX2C)C{Oqe;chE;pb{bqZKu@J8 zulG5*E^-Xd_u=DnjmcbNkmP;ny&xpIzcY#7Vg3izhxUKS=9vB$=D$ir>i>q+|1S%f zf$x;b|C%1tV*c+$?nz9Mm7XK<_W{fQtxZ1o1({sD&X2XFmkQY2hC9 zHE-LMVaPDfZLt7355D6|4yV>Iq5zvxAk!w)GvDwoi3^`8%KJQON`>?Q7SltheZq6K zrj*#C9-<=T^M=N+(8=NYcm znk6{^&1KrTiQK*)wfP?WxxYZ{Z(;#n*RhQHS>^=6&(}Jrj&Wo@6JA?0vqDxcIqx)Y zepxP@{F1YML!T@!p@$@?3SO2u$x+MT<0dDSXC@=Qm7H;_D|f@y-TrNTEj_l4=c^t2 z(n?)f?TnQfNXnD^t3$som5A;8Z63%2Wv_K#pGz@O?RaR}ROr zbsK%)hwgKn*Y!0E_=dhPFg$n9r{~Yu=WuR~Jq&Wv_xW;D_tTej0Inb4KUKLO*==NA z3a=%1`*KsdeR&)Q*!}~O&$jm)yx-*gM*Yn>{N@~^2SWc7|9_NVk7pyZ`L4{wZvC&! ze~V9G?n_#13p&2ZNs8Kp9$xPxj9rUvu65!gS4(`<8Y2@`hOb7SuXf_`6@q0f`*9$F z*NlunhI#udu?ef3m~dpImGQ{f@KxB7l}uPQfBO&rO`l&Awd|re z`uec@CwqJ4)mN4K7oCm{?0$W{Oz6k`XB+Q-H1!%ieSLiwm@j}e$;}I2l5MP2IVE=`{I9@P)R;Q4+Kr5OY)E`J z99QfEU9Qw^7w|RHMHVuEZnpb@^JMXCX2tJE@~rB!opc}w2iYC~$s9}O{Ydx(RE8o4 z9_6{O=czv6yl_!+QaOJ*oXg;IncdiG^aFlDj_VtkSb^;;aD6*9svF20bd@!QLoipXTRSO`n$M(eoGGT$w}1z zWuX7c{)bt-maRwti3hkp{Kx$N=H8h5xX0+=baZlh9J(AGoff+b>l;~!#)5TUvj#`6XSjzrfnN+ZnHAI_a7Gs!7SzB!O0gVMA)!6-jPV?-)+xy3By4JXdb&O{=wp~A? z`Vbvq<}y*cuf7p>Uwd~}Ym8Aupa1L3nAU2bIxRaBJ_Hyl z^&Wg|PxjC&aENo5b4zZ@VYUw;`K;=Rbk3!mO67am&ra>}Wu_q04j|!^;Wjoj9ge57 zZ{f>LL#J>}xm>S)Umn++n|xTmUnQ|Q-w*!-(tf`^=3W!mte@3uw%2Zd3;&7vP2O+Q z|4V_;Nvf0?vQ1<^zP@UJ8o{zJj-i%zTvjNCq{X$ z>u?22wT1M^$yW0G(~~1)&Ws68@5vML@Re8LexK9c-X;wVb(-t@{)`zjK3u+h`CIh( zpLpk;cdGyLFaI+8S#V$H>D6BT^Q;A?+}}uUv9xrdRL-3!4YTu&ZPs? z^5O6PwS4VMAIS&r|FwMi^Z!FW|JGm1qnG|fE*yJbHm*D_MOj*JS07*{_pynZ5%)9h zAT|W>90fz4t5Ec?uQ)6TF(89>rQlljICFzK0KAVNK3H z>F8*ay1F_kE-wDdIdkTGt+uxIwZn%GAA0}&_p5&JgCAu4;upUd_UqVu{p?S$`&X}C z7UlX&u>GT{~HUl{g z>Fpzz>Hd@)sbO4wjVr6C=1BF7d}rD8Tt2Jk;Pu(etur%Emd`@Y%9Z7F3Y_J$@@4t# zd|9Ed&B(^?zvTSG-~Oxo*?<2(o$vhqPvvu;{ju}GZ~sU>_uluNw;uh4+`jQmr(@?` z;;|i03VFcvq-rNEaigSDOUlHyWhNb=*Zv6eMI0VbW^p_x?FhE?2sZVok-DADb|x|x znXNJ%naX?8k2pEVJob%DL#DBxaSVCXFYWeGCzoTnna3F4cU1C2er{5F0g z-)DZS_df*x7xozck^Wcif0u>y{!{ZGv!Bg>nwfl<`xf~B^*&^AEQ@>ew0o$>Gx3ws z?Ps0z#KYWwa~__BLz01?6DkieZ&)kuVH|P%60W1#(RCBsn%{FeTfZ&sJO5O6ZU3&* zxc(2NZq4VN71dW6=h))RoKh__$7MRD#pzN$CCjOpoGDfK#Z^+tNE1tJ^cUPpZ`q0{Rbbx{~yV_Z-1Y;js8Mjd*%O-+c*C} z4(@-4accV|DPgIM4KI_i)Z(KeH%s)`J)j#LaOHla2R+Vq6f#O>C}PwSi6<@2%b^~7>M-Hwg+z`lPw_}DSeEm=VJ^pLr9QOCx&*^d9 z4@i6c!N;EV|LE_2+G{b~EAKV$9{TtBoITbpG0}Qo1Jd4q@AVFzi$-fcnTP zS-rAPnzw%-+nc__IJQ5Mt(&p=8~#YvH~f*D>ixDfZF!6L&y=M2H0nU3B}JcG@_ngs zJlF9&=ZRr{E|}++XE-AXBu4m=&bC62WhOe>e{1o z^@+~g*U`~VeZQVLv?{;C{5`kT=D+gFE9<`Vo$nO?{ont6)W7}PzrFbDa$kM^J9lqW zQ>3@&5WPLr_vg-=BMAwyGMf3)!l`S7u^v*mhcR|Lg7K0OVWa(s4BC!hTzq6Wy^wq+ z(qN3)k7R88*a-R~f!+4@nV*&MP*FhTSjNmpn*DJ8^HkObt&?wj{UiC|5B?th|5(2A zJAcjmCO>3e!|%zX*Zy4Y-1!swA-_Uy9fhckch80HfRqmMV7@jGE40$zl}fpF!6%L(20^MYsHc9NUzl{9f|NDP``q$1RA=gx$ue!~G-uk>sWM~6bZ0u>F>~e&XU6ntGHcdMhhs8x#tfM~ zYnC%}=1iG0d$yzdbLP%<)~?ws_wIek`RPx7E`R!`f9HJr+kY$XzyDL`bD#SN`6K7` z*MGoo_%8iP@5|DvBa)K5%1MZ?mSpCJOrYN;CFO*Zn0QK3lg~Iw$*0*zCY^F+U_U7- zu$_`}miL_DJ*R`-tDn(*J+7~N=Lj4R9P`fQNxnbz4A*g5lDUphd5Zm$qDW4*+sP@X zxb~C6`CNG#d5Zm$$X>tXGfsSbFQ4s2o)Cq%otSunW5*>i!IkXC#T`et_m{^xeoPec z3CEq-SY-T@GA8CI?>X*Rc`Q`MvLAg^qCsrzQ71b3$bU>m9l_^0EHN=hoT&e#)XztA zp4gaUd_UI_bAWU0kf^9tPGm%xjLTo^R4+R%J6pc!w6y$@Y-{@O&ekp8WnRqhI-56t zm+^CdDi`|x+$mwMgxuWePHJi@wbX1UCp$~>^KzZMyj&?L80U;rUW|tyh8GjyMS;r; z_~CM*2u>8coR~DJ*eRZ*e3)$bFcm&bo-|pePMhk?nL7u4Q|s*6(^nd)ve+*Nb@ALUS_3Lu~XFvPtq&HrF?f-q}owo$t z!dkq&(#iMgIR5(jb$U%wTf0WqD%P%%b?a&k>gv`?ecd|qo`(85QLJyM2Ms1}*sx(e zV-eQVle}IwQ8!c_rehKnIv3;*!~Y7h4+G#5S&#V`zykJJ~f4FFrQHy(1QM74Qg1!piOq|d`Av+e^>VG`73E{ z{l2vB`YYMB>-#)oKg5Upk@WWdnUs}nlk(D~vUqWsEM2-pYO1Sc#qt_ixnjAjUbRxz ztXTzCORd820#3k_b?ep=qr(Zqi#oUgFZ`T<59HAeC+OGP=yF2m`9_rm$}|MJ<-es+a&{%1e?S=>MW^FNPP-aC%-TfZ*v_4EJqPydwi8;^Z&zW#>1@#gFD)*G+;-g@f|<}Z57_x9Uw z;orY$q+Zv%@4g4m|G)OGJG_eP%CEhSce8O4fBCkTZ1tDj&F+^tF*Yu-9mht}lVsd5 zv2j_P*s%?E7B;ScL81!L1sEiR3ZjFAP}h@$G;`-Y6+i`by{F!hkPsNvnY+I;?_Ftl zK@`&zm_P1!rrnu&^X|E){m!|0T1jy?=74jmqXxdf;xlSaP9JB=X;qR=^NfrhT_*@y zk%cvDf}wvPM`rSe&^v$=d~B2Y@WWC3(MNYdx7h{#V<%_~DDCg$)Wr7rl&;NNWI=tGmDsE;}cbkZd1ABF8m7kx02qd)Yz zDE{Dsk)RQ7x*aqE`=Ad+sz3c{1o}pRZioEaj_vLGwtfuPOnP9u`jekTKv#?e4F{!t zBMry?Ht3eyaE`X=oa-2#sh=A=PJP979u&|1$^Ba)dxO*;|9CEB^E>Kftc&ogw>GOQ zS03lVE1R&^T^kP!Y*XjYZ{;6<+=@CGtvo8KOIs3X3F*#=seER>{*Vp&$fq{W< z4i681<67}O@ji5iJ29X9b8%7OXW;j$T{~k2z@ut(WQ4YN&u$fSf|`_+q^5wVRxf@Wr^Sy`Ft zk?bRC_K_?#o2cHhL9^8y2`wjEm2xETaE{6(NtI=4Ol3?)V=8nXP#fqmt?+mY?>adQ zU*G_DI{LMO{C+Jr_nelO_mw8gXYtHlb=R&M?UPUTYd`<_JniwH&DEZGe7^R?lk2e` zgLVMzpqtY60qw~rW3{KAI)El9ZF@F4ccJsfV}|V~abNvev3LeG*Rx#Drgx)ed=J{* zuRZYuwS#!4{b>8fX$Q2&AK$09C!W}g>(6gL``KR2)%JjjHg@ds$M7)Wh+I)cE)~HSut~nvj^FCM6tJ6O$6uWZE|HMGAO= zctPijRPaSAcmjMtJYoeOScxYxt>B4F7f*m6h$pBK&!nU#58{5!MMZ@n9qsKufL(tV z@#wYC@yF8@1_t`?sjRI0(f<7h-V6)d_AzAooV2vG58w}&)zZ>DtEsVZ7VHDGrdiF@ znni2Y&(k%o)&lBkt)Q)~t!OUV*4j3!t*sTUZB{$A_I5NuY5UTxqXXBV5p8YlnB#Qz zZfR;9?&|Iu?rClsK3QHq+>xI@+*VjP+)_|5)MU30HDqL*s#~{?Ij6n2&iRX{K6gIz z^a96}XVyBrro=eBybe32Oi4ydLQB+}w|5ebC%PMLQ%i7Daok9a*VA#szIUR-+i-8! zGw4~=65Mp`*<_Bc30RU$6CXnp>b#+y&j@PtfkB zhI!{3H@e{+NVgfMX*fRG?j9N%`Oe8M{$xixPwwr}THD%qZ9{|RC@RvbPMpxnK#PwZ zf=yV16>iEG4pqQ>jR zzVVoGTbw5fjj`5hdPEgPDq7NOv+$Q?aH;KdlxJ~i)UZ(iqf1UY1Yn3&t6=mPvK3im@YTLL` zvv1j=*+W9K+~8m>cf$srd*lc|cJN^D`pnD|Pghn}{{XV=?>jp?|AKtz0|P_f8XO#k zjy(cC7`fp*a6M)GwVpF>_Wd-C-`Us4|FONDFFJdMcXW62`j%$3ro5b278R+bCr4KUVVhPm}%qGi5)&Ov%qLgPl*U z*tg>NB`Nw_sa?*sp7-?Vn{mbW@b|akH+-GvXW;i6`-@jUV|H^U|hKJQ} zx3=K%r%c~0uc?J0Y1o;2>@#8!{H+LvEF3xF(AAtG!F2)@21@rM) z%`BFk7)PlXQ#7uOjmCMF$1#2E8II9;ah=XLhI8WDOI<_fjn5&z6YnAVihZKudB$U6 z`(o$BH5Yo8c#fdrTB7tm;<%u6Ts+J8yN&NI`igrQ`-)>mYV1qbigRPfeSMSge?>7L z?`6!}>vQ(z8>?CH$}F~bZca8a%JmQZo?8cHf-BhuH<&7lNY3?^Fv8V<^Ck= zVUPYzPfyRigptG8xf}ZAA485@b?nUK+biSSYxTYG-~I8aQ~Uw&{jR>#ytTVat*x); zH6_JrWpObtD=AS6$p*;J*K)1t-L}=Mv)L=Jtd)JdzkvK-$}B#i%-=r|a)riRmRr6M z75hYwxQ`Px9v{8VeU0(j(R1!TqOYK%=RKZF<6fLIUQ5S4_vt#pC!XiTzM$fsqR%Kb zJa6=v`@Y6L;hd z>Rs1r44U`3IlM2v`@n$u*U$mxo$BUI&;jaOTe!2LoL7VI%gF{PEYyx;I}d&U+m0Po z%BQ}#m#AUTsmJcgD{JmIFaZEWJWpvH4zTbvVA92eAhTx@&N z3tdac#=FjVPV^Pjvya#}_7TU%qvBo{qN0yDC-%pq;yR+9*SNkv>0}nm4#@hIpbOcn zudHNCms(j=bPo&L#ub#drbe<}flY5)vV?Sdo+n8>8yK)(my}fgH|h9ETH zn>KBg?Cm`ta%CCw^^1~xeN!+Nb0GI<4j?LB2ECkX#=F$fFH+p;dzrzO*3LBsWdO%%s6L*%E@v4#%UIzXz#$0gp=uw`>*ty*8+e>Wk zz8fL?`Ub)e5C9t>g!x+HFz${()(~IFXqTeKYs9u^A3APqbl!N4*!Jvi+!xmv`;K={ z<8iS)UO#dELe#U5cn9OP;+hMc6W4iOBY?|k; z|9mtwsC^IdzqwsqYB|LL+S^oTbv5|`)pE=M#fS$SgAIT*DQ-_r?od`NPh-EF9xQuJ zna3=?!IH(Y8-9RH$>K|6mqGqBH&qP#GLF-E&ttSt=LDs`v~Q%N_q^CS!*egxSKL#) zo1o&I#e0c;<2{Uh#kMCE?`S-Jq2DB)YowwN-9x;`c+Xe#@9giNgzvr$yuVbM`s_kB z>%A>fNXSvPYgfNazC6V2biT)O^(60YK|z`gI=(G4Qw0RR>W$LU>K_7Y^0&aQeoyH5 zra$lc^V&q5&&Ur5{1 zWs7A#WKJM-fUOvZharndM$!1a+(u*Ec&+EY@f>aIJY(o1_67C4-nf4`*LYqpo+*yg zJv_I?G2{KkF>&q1sOaZOsn6JbEEYxAv3xBDAnVuRdy`!s#1<@wXOWT3Y{w2&CcPeZ zz3$7SZN&2I#QTWnC@CpDTQf4syc`bazXB`vR}`-&Sx<3#!S`nT{PyI3nv+hS=J&O< zXloD)sOs+GbuI7%R#kCefp|IQfg+5dqvQv)+tu7du?@C`UmQZsq?NLd*Fxs)vkJQC zUX0HyP#U*3k4DGr9>+Yd5&M^Wow$A?QF?c3p5Nd?zyC6Rr^N>Sis8Ga;k!n|-@2Un z`+dRQd3z&Uw=R$E-hGzh^*Ya!jt?6jm>sUHUd`=D7qJ~VqGiOz)&1`1(Mny%r|Aj}7YWW2P+@6`)qkOqJ zpS|_g7U%#AnXk`M_yV`X21ti5kYtt}daORa-PE{k^Eh{@{j2FK?tL})xSGCS=lOQ% z^)`IV9Ld*m2(o@7Fc(Xt>C>09Pe0u&g@-$!ik5Ab%d^yPZ9I_FG0-Ki)VnkKeX)!yUi^dbM}(_}){z27bWWrbh07{3k3x zDVlBrzz>*fvyIr0AIv`ac%S^j^Glew_d>{~5Xh)l$SR6U3He97W423w1L!aoJ7hiS z_*Q&JiruZi9I%kRH8X?-tzgjc`xwRR-Lbn-9UsT+!0p&=HZ3PPxqWR`R@pPPwRQhY zF?)lKugB~Ot7Gc;w=I8PvW_wE!2j0Lsx9vX9{Km${e-JTyQ^z;?{7QAX;bH9_*Z{wV4g)Bz7%Q&t8Wz>No{H~?$_ zU_}O$oiP<`?wsB7^Up1T4^Zd;hcJf84=C(%Q~v+H{D)ny`|~nDcQGH!D$JRIZ05}M zY}t}57O}lohD_Iao?`ao!`r->+ep_ZJwG;9m6DQrqEb>yr&m@wen7SBNXI8!F7moY z{drgV|C`sFb4F*U_EdATwzKmjF9#mj2|Qp;MY&oD`LE-Fq5mHv8z47Vv!$kj0i|^-}vcLhfGd85cWusdpFWFLV!K*E7g_;B+jZ zI)-}s%PXY+{ofeG=t`xCh#}pFzkdB#?2h;y`8deO;|fYVWF#duEtjOSpV!sZ|C14y z3)}u1X3XB?->aR&&z#Zz1#y5yot-=n^55Cnj?y4Cyqe+wXvOdY>Ud!20J%9i1IqUB zB4yV55%RPCOJK87EO0Z%HsR1D$TndE5I@|m%_!^l!B4Ul-)13u?X^`bFd&14hj%ex z@pM@aUU$drT{0iC-;Po?@aLU55FcOl;jv?tKOMv6o;7i~h+AFlcsKi>{|!e*_&3|z zwb$F*cq-(7HN^rN8`PT0O2PuDloNdX=uwrhKzZ;3D)I5nEHE%x{^fMU0AT}IbRA$1 z^jYMiz@G)azf6Dsg=D6Xr$2Y8e=&RGjrDBd7s>G7H#1;wM`bdGC!HNyc6S%AIoYW?kqcg3 zUhcvJ7Xl9qAApVpu%VRT!GjHK-n=+@+Dk!*VFgIuz^D27?T7rM{IpBSe<3rkhTg2c zB==oB@9$4`eF}I#3U>W+_QDHGr1#$oXKU6Rl_Dd*LQM_9_bxmxYHJWyNB8ON->+t; zrFHL0Oe}x5sHp14sDJf$E?h3@_3K1gE;YBumN6ZYT^eF2dp^R0UMx^ z*8mSle!x*I0LlN{TyC>kdsxUun>=&o7U0tYnU@#E1E2%wd8j%b=oYm9jk5j#elOv4 z0@*9S3<6FkmW6JuhpczS?$)hyVf2XKMWa0Xg9nE*5)zu%XJnK->u}WmEBWz7eT|`^ z;ZZ-n8MD8zoHFJ2_4_Wpz1k%B0XHHq_&6|uwXg#mHPvbbYyjYaRUHou9Uu>LfDN%g zws((1`Q+pM@=Gr+mArrn_VwL}SU@cN08~T6We>Y-0Z&``X36fa^IW0JkgTU1`$*V1 zE2Zb3Tg={jH%tl&Qh?Lxm5_e}Kc1%R`5QO7V)h$0==Jm{X3tVn`wu53Iu_XN<&QQr zH0rr`r%(5Nr@w!|tfghj`5PwZFE)P;4r+hh+{}Lq|GyPJKnLsqCvt+SD=G*N%ugU6 z2zX$Z4FEillA7AhR;|jBXS}ijvhWM!1;G{oW}W!NjS2pP)&X4c`W*b0c*HqSPsb;K zO`jgbKKnEdx%D;R`(eW7z@Mkr)IePwSH3OT_}I4Z+ov5tyfh*?x%5}1r8WOGhRgkm zYGz_B3bU5h#m1v~?)u64alY*x9UYnvY60x%>Qu{t394;wQfq3ec_nlJ%9BcFlt z8VJ{5@m(#EeKT|B2DV~_EJa22>ajcc?;z`S-#rugwvhkGljOij52j*0rIlG(CBC(_ z^`p4luf95m8hWmnJ$V1R)~6rm|D6zW#(cLM&exayzxVZN{|y@;81g@#`2Q5}0QFcl z6g7gWEGI3d)<8xgFVHI(IsnxOO$WYRV`a}MEF9jckA&)H{l=6av{Ve48mC`Gb z-JbWpRA2H@D9}|@nQD-bE}{O1TY^jsuR8oJViA^Ct_Y8`SBs^eG@=K z@y^RIcLlK7v!dDBHKi;%y5A7H8F!Jq>W7N7t+fITly1AgU{vV2({ z@PJ{^p98^9R41Hbfr&bwO&r~ybo@-b(;npCti?M9LdRdjKL0EQal01GV_eU>6R|tu zcWM;BBikN2zLb{Mw&HYj|Z@smlfscwp!NN_Nf=+qkJ({^)nH@B<3tQ8OpJWwF`kMKYTTzNsdAK+5HK%?v)Pd6CvxIVAw z`A4ogxtMz_LDF+m7o$#YxU^zLF6v{SmXLQhiqoOm8id6MUPoUOgM503+2>fTr(+Tm z%iaer_eW#(a?jo~rsJFIUzz-Mb^JBazaMe}?|}{Q6539z7gh^Aa9vj?uR&gLC2E5Z z9=Hf~LG=2-gauHPVbTHQpdg98{@O;}58w@dI;}tF!pL7wOfbp%Y&`QI;&$sH?*rNN zmshd*^Aj*9IZ!8enD`v^Gr2;wH7I^Zavt(tS+$DWF(;sgo|=)8(z4cSEtytbU3=e{ zj!)~}jnF#EIv(G|<=)!kexmc`jeNheXVsrHHfjM_AE3OoMXe0s?U8`ip{x|zT)^dCw{sQ6uO zZt3HM%N6x`fp3AFL1mTFeteL!8zK`7Qi_nV>a@1vncJ2XH!gMJZ~75f%V( zfTQpM<`Mr((jYrlSi)YO7Q{aK-CoH0 zYQ*ja_1GP1<>^>_$a-4e((S{i_#OH4G$}LlbYxOe>04!GHUCL5d&<3|dbuVp*Oc$q zf_H9(dyowPAAmnv*r{&S*-3uDPPGPk!Ikg>!Uj;?YlNse9vFGSEG?~9-m;}go(2E< zbI&e?To!nsL(C8LtzG_jp$A-v+$Wq)8st66`XJQKT+H5nI~4ghj73FtppKTFW9#*a+DQ;-+CUSBK7+Z(ZV ztQR(h2g<$7IDo+E970TSi+(S{(7y_r}|k!*6aQ}!s8+z&$euthML9P zmYCRo@bKZ14+;v(9wuBa)yt(dF~P z+dI^1Z7^L2P?Qmtl++D-y8!vIk&ySO5$LlVae#2d0cicY(O4kPT}b|u zZlJjHZ(uiA)}T)yd-IJDY1uN=$&F}3>~2_s?+$joE8mv<_!OrnO0hfA`D0^wPImU` zZOFZwVXT)+I=&gRH~I8dK0stu^9#G?yQreEPKh6~*mI))RgY^4^+~(j1tRQ{wG(*8Pj;niyui zT$A^&7q8rk_jTIi=lJpRNmNTqtcgMXJQpt4jM?9c z-M*hZ-R@GzU~y={^7*3qUzR6br<)w+>)fFHFz1rTm*P=7n{HrcPbLX3vfU{=QI`^^chd1m z?_axC1OKaXe7trfE30R7T3YeTR4-SoiQ%c^n=$+AKSoSGymh}ZY=A!l9{3UD1g(bu zucE0*ttKo$L%mvooPaXq1sA)p0BRm#fyf4sq#-3Pu1#LCJcqsZI`BX~fv6E04EY~} zxIM)KH$dJ8vKcehNejQA{F{2z))*vQjs%{EPtO&z$3Bj^>Sr!pswq)XDr#wIsnGEk zFjn#lBQBS6??y({yG$Mb)*XxHJagm!TdECu?ws~db#?qV@BvC4oxB#gfllZI)yN4b zE3W_+ph(XNq`CmW18a&+Q5n{-kT-2Ak>7oHC!_j6UWf&Hc`qWI4*T`5!rAK8M!IW8{yfUNquBlOz(Asv5UcVc4k{}dLM>1$#bWA-k-H+6iIKW;pK z+z#K|Z38?998e7E0+*pKAgvKl18h*Gv&Mx7h7K@_2S!eSEh}qK*}Jz9cp!mrJ-@;`=-9xZ{sZ9p4=Hw*w#Etly}r{7DGq=&LjJD4p3iJ+=ULGI z>$rqFlEDbUZL@0MrK4fCnC7`S~MqZ0uP%BH}b~K_lRO^5g4k-Rb^3 z((x&V7aXhtJH&I-)BCZ;ZON-8B^5ssYht+kd1GtbnzH`(8-M1UbMyc6;bH!5*#6JJ z2G~|tr5m!9mgEt z!sV`7rP;P^Q{}WYEi)~xD^QlprZ})B2I=^{y}jS1wXH>-y{Y5h{QuwN!Q1;kfDLdr z;eo;b0az!f0DNE5(+xjh8?SU`SsBgM4|A z{kBDmxP8YCO@>eJV0L!LdnF~#`#O%qB&%ySlZEy13?ag-+=>NZS zaFG8w{C}@tod7FnU46Y;1OC_Xz?J3NiQ|RC$BT-F3ewVs^A8?4of{iFV5hb038S}m zt;(R|+Z9FIY_~T~X>4r$KKbyerVhz^;~KZb`xEGQ-`07c=Ko;MKVl5HumIX)zyWVY z?7s-PK-KU8)HF6|m6eqvW#wgRVNUkQvB=22yv>`3?BvIfiXtpNPnG3?*;Q2?KkVu0 zy_alys-s0bFJksCS#R>a_|_&h`EH_(0rCR^3jnMgp9kJoTAFzk)d+2B8bLn5NGWoF zi&v~TWBc&KK^t`ZY}5yfE-V~=v9E9BFHu(%ysq6vP1Mt&-)Hi@InF2AI5*#C+%b6v zumIly7WjFr6PkwDAJqk|=;_ufcJJyh2n`)j^7GZaaGt8Pp6MhVk9}rl8AE7qb2CNNITH{bFv$Iv?0BTmO6S4sLg7oSZ@UY diff --git a/indra/newview/installers/windows/uninstall_icon_snowglobe.ico b/indra/newview/installers/windows/uninstall_icon_snowglobe.ico deleted file mode 100644 index 290b1dc2b880448cfb5a5877b660a448c331b832..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 367994 zcmeFa1$b7+);65FQ;NHLAc9MPAb|)WLK5Qcu0((k2rk9lwZ%$tFOUE&6fecyp+*HQ zv**9>d7d4fq;T4EPS5wA@B80e*UD_2SvG5CuUWGmGqYFB-ZU#++6-kav*_2&%p%Rq z%xcv#oPUbzM{v!`%6MMi%&cE|Gc#LT!+E2wW@a@yn3?6}8PDH-#jM9bGczd-=kHf~ z-7Im~D`t&QC#pgVhU+L^`q#5(&xU|cJ9qB9vuoF`JG*u3_65pagf3mW?C#jHV?n1* z9Sd!2YzjMd>a-WI53s|@$*DCf#q(wD?Cj>*+S)$r(4m9C^P+wG_M%m*R-#3V7U~%H z1nPf=>(6lgDc+wne*Ac%XcitGUb}bi-X4AWxX<(S@L1>R>A9g-uU@D44xSSzH3tWW z8{XdDTYC5Iwc63eeo9PCjFYdISEoUP2ECq5z@A)Nb6o#tjVaLot#}yp5K}(Pt7-%+XhwA@|-;eWlTkVhcgWH&kNSmf&MZYH6(G3G+;rfMg+rnJAbM<^VDL+Yu^{B3ecX;TD7vxwdU1p zi*~i^ie8OtiZC}P^?rC?x3NB*+nkJW>wD78DetOz{mfsRH5~n`Wz!MAS~na1t7YTi zznV7~@k@g`1Al4WEa#VwtwT<@b+kDY>E|_v`Zsy<*%il(8B<~J-g_N~4EcI| zNJznfo;|<#@;Pk(G9+aG*0i*Pk&73fsyuDlw2y%MhkU=}-<>CS0bfj92OR4i{mb^A6*Hdp`qOf zAt52%albq6wK;U?&>N;W`TP67*S&l9iLh&zx^%I(H^I%^d@Dyn|=%z-|?!rlvM9ZQsw&uT+m7JyzJ; z+Y8_zTDNX3+O%n-p$^fuZClzpW$#!54`u(_wr!)qZfbZ|YuOTg12&fLwQAK;Yu>!M zvbVej&`_7UXSBNu$ZON~c^nuR*rjjZzJ-pCjske7ciOdUr_o-s9ULp1SQl_oZLn?D z$rAVzFAX3tMrg48>N@W?ZQ4|`u&^NR%OMBLl5Okfu<>0n=4?g#4>5iS)}aH&kKa-E zGw?w1h3#-mA&s3o+X{>Y8rl`W<0;;G1bIFM-j9L*Bj9ik?~TsS&#$hxWm?kS4I4JB zJfI@=%EQAW8NA4cT!se+2Y(ElM+OB24M({d`27yKXq1zV3rn^Qe13rb&4<3`K-c=C zj?6xN`lPtKyZ7zizkl7#%*X}?(PO#;ZZ=@V66L=eCZ6@(LUSMK&Rq0O3Lja@I3~7KLA`01_t_n?HlOx zwO6?7Aulh_L(ucX9v<#TQ1_RpFM#bYUApw6+}wc&`emex)YN2=oRlaM6XO*mB_)W| zlq8Xno+h%gGR43F{l$a=ckF$qep3ZdATAgD&n!PuWvuLKYRAU66batFM3QfBk>c+v(u3SZW{A5O7~v}NqkD@X(XL`(q=(23 z^AcI1o}yoHACVs5CQ|%dM1mLUbn7X?dUq2cj$O1+r>-K%p|c3}@q82z5Rk$4SFBi3 zCMh!XkQc^kZ_9eZ+p3=6xWlnD5MyshyQU(ngQbY*XeDB7t;Imc+G3(t8EsM6JKFM? zceQ1aZ)r39-q(gYR}x8G8;Qt{c-F=O<0;2vbBy1Og+Io1AM1LeuVr1~Wl>l7xi~#S ze@oZfPl*mc>}iGet?J{s2ABsl6alRoW9&9Z`^{AQ@wVn-lv{aiUCNu<-u!pukqKqw z(M3Jv(aDwNfl=?uZCP(>vjRTQvhC}L=+4%~@Ca@L955F9Sl3tW`@8ijYX7s(J}a9R z8+pXbx}or8+n}BE0M0u?73~%xx|4+%?OsmXG2lIUa#~q=dTt$gZcQI~e%DZWVRMW; zy~s*_JH4FTH~d4nFub&u(WAbI>|_m|S&Hxu%}|fI2yE2|d}yd>4DRFdC?q5(jr6nq zjQE%%eVe0w@*U3vf_Bb3I49xUA=j~**xJ9Wc4l5}d49E{ys)H^yt*S=-nqCRbD{q7 z!s2@J!sl-C>|#r~|Kmn-yk{9L3OI*DZmh!~hbD?H@*u?1?GgG&D%)STZe6*42{A|6 zzA5d&kX)0wXeK$e7?M~GhAN%tc|>Jc(y#h zy`Ma{F+#4(D6geszQ^`i2j_p}C;94)_QU%2c?3I=qPL%!7-wkTgm#18S%{Qw4aC}v z%G%`>t>ops!{nW_o8{fpYvlF4dGgZcP?Uq@-BT;&-E&*zwXbK&YnwdezOfCoA-$?9 zoejslG!!}%jCo)Hbb#$g_BX92X zm*4I7lHZ-2EiZj;C(kZwATO?Lhx57e?vCE_@@6l2VSOLDf3lSv=~_`lK?fqyZ-@hB zKpkNFQU2Z!F%Bn_e)PZc83{4R$bVh-)oyQfk~jCnV*Z*f?|icm z`sXf>&#EiWu5^&MzgZ%$?8%aa%fjVnQ#|B?jCyi_!^_)`4)lEpJD;StpB5K+TyLNK zmAXfsvEL_kZ74p^sHWZCVlThlo-e=LxmA9>XRF-5ezyGL)6ueE&2+hM>l(Rr?FKnv zXts>n8)u|a+hF>gs^`->JWs*oHVexfh?9b~}v74M-p z;n4k<&K6>dUwQ4=QfIkh)<`*V_%u0nKITKg1j=L2n=S&(J>fBbYW1yyttgWzmq~0EgP* zlk_H9zsO`6>X$FW{D;dR-!U@4f4cPd9xVg==1V`1LDHpXlB`#wx%}|$H?-EZDvLm4 zJ$n1pzrL_>v1lLiFKRzNEbyDY;7b7PBk zrGx!Q>Et*<_Hr03o$Rt@*Y@#R-D-B)hwpr-Sy!(hd}&AcU4c3SXn(+CFWC5)Ab-j~ zp7dkWg$8?=_#s|wh@&|chstUWGiY{@)wP2W{Rfu(?oOg z1g(u_oYu}NPHSTkr?qIDpf#(PBpTLC77eN;imGLufkP{;VyRZ5!UwHHwX!WlgYwlh z`v%oj`_TbD4=_K8W&2a6OsNzX9(>HDz4cSq4%ScIY+61IadmwBeI0P`>ZQKLrrjT<-G zch8<)>|JKLdP@?|;G?Q~0)X=g&-FHIGkr@4ob8Xy_Lw2M<0n zWx|Ag-Xlj2b-=fr!^DZ>>=!OvXoGpztA^HJ{{PxF`Obw4GI;s&v+Gk*_U(0a+=2OV zVS%G#!AnaAhdl-U{(A}s4m`Pj!GcHOg@yP3FxP&0i!Z)&{kpU*DENNLm@(gc>F&N2 zZSMmPe}F<~=WPWsF-Ho=jJZ5x@#054U|aD8_xJqWx+QC#IrFUF(xvD3Mn~-}B%RN3 z*jwo1v!@^{>-6rKGk@v7YSnlA1pM3ocI}d{U%DjwZr^@;#gHLK_x0{gUTiOniaJ<0 zYSg9G^XESa`26$JYF_=fH*QiP+&b&Wy;lhWV|B6nTRP%2g zLLTK$o|JK$Ha$yNx9(w$f2*>8@nwFytXLucWgWx&@`{<+YlQn|W^X+{Z%O&=Ln*bIY*zhINv#0EfWPXez@zGqK7{@I_rHVr`1s@z^mp-`dJoSI!#DhJ zzzBRpkM#2L7>VOiyk`15+v7WUey9ly!*#;o#Kc55^6Evn52 z{5g^M2EPef={q8B%BRCRTefVe{9fcGk4YCw;;QgrTf9yj8Z~NELf%tu^lhTSyoUenG2j8esLT3uN{Me2;VR?o=a8LtWF2FvHEwbtdF8 z6Yb1$b90*o|EFr7xS)@wEnBv%qE5qz5kss~Qj!h_2KYbn_w#+^>+AgpW7cCI@4kv9SX7 zSU^@@>lyILW@Yx%`22tYIbu-mKrKIi2>q{OWCQ@QTL~>LxAV?%d z28tw%@iYX4bS1747{Hza?%n+zm#Z^mK33-#zu(b=r934 z4%!R{4#6TZJ_feIWsfQU`P~;68G7H7ekl56jo{l7e$Q6$KedL>w`~&<)E<6U8~A@Z z!Iul4FCnUHa}nLGg^0ClDdKyy6v_5hBCA&;ZIDYHE#JKsptcy$yS_+wY>NBMMNIb= zA_mV#xkIW#qw;Z_C}eZ_0H^ugOJ0uWF-Q%WA3J z8!3NyR44Gj=$j`U;gA9S()2gcFGb(4q5(YZ)2xmN>Dxyj_FzA3Z!=y0fq%=i#P}bG zKi3L;jQ)E1t^HaMckl$b2eoMm{NeX*51DshyH+C4shXJM_olX`-<$I5(eKM|CVwbT zPAx0HnNdX^-#SvBSkOv-Grf{Lf$PU7ejp15zb!wDdreO8Cey zgKwR3;QECJXbAQ85Qv-j3iubTw_!YJospdIg9m(D#GU?r1MXOF0Pod$2V@&Y-zR*p z^j}AGw1)q^x|kR6hVuWPm{LZbno(Y!o?S(r{oF^M-xMV;eg)t6#&E+|wWMx{Bj|*_0Q|X@!Zi|oZNMM{BMn9$UAT{@@bdI5hX2Zy zE8AqICH>$5UXxZGcdl(1)(i}57L1o*{p5SU9(BbmpEtD~13!|dW>uAE=GKsB7dDjV z7SxoN)_cesM;FW6*UrdWXTOkF3I@q@3*l3qUrU}@Y^`WKGNrCu9rva-!li=ZeK_i* zUsm~5(GGQpzIC=w9x{f5KE?>YzMO-63HxcG>krmCT4$yw|Ii1zPG6snzv8`G^Dy{c z>3e4VQ5~`F;#x*qpZ0QNGgw|))=*ylq_ModEkNGA{FS`<)o^)v zc{9WHjeX^%-Fcw1fjs+}yWBsnzMSj-hL&zuPvK6#KK-j)-=SZg_|xaA_h;fC8Q>!@ z&)9E@KjuAcveQ$3r2dfq>@&*V0C(lH=Xw?Fj;=dgyO?_O@6xrIPM-O zZyx_dUi;ieUR~K#t)JYzuuIAUB;)9U#5wDX^|lb4n^mlwAu$s4D($h+6i%3EI!k+%;`koV56mA8&em*1hh zb8N1>S&%C4oZBJqTsytuZfyu3A79-G%nE(m^0+0rQ3AyXQj%K-gX;a^WAga-?( z5$`p{AM^e8nQ6&CDf}@;8`i66H);2|W@T8f<+@b_`tDfw54D0(4dm_3cJkH+8+l_J z)(p4V%kOtN$saDPmzTE$%5P@XkY^S(RprIcas4vz-{~x`uJ0<3E$=P&Epn0jmio$V zA6v=k7(deN8elAFUTkfxB>tYz|HOz;g+KJ)+?4T~SW&e12d|nIr?V?ul#QawB(w?F6 z#)YHu%HgH*M8RUYaoGqtZ;Zd3+TTV_h^;R3o!`{rZ5t}wIUaLum$q8RKS+&Z)Sr5o z!-a{!puj>?{6GEl(+=s$@qfUdYgPu_4f@Y@JI)#M9IJ}YQ_E<#wm8c>TWk^U7AwEp zxK{_H25HwB^Za&0jbJRmPPZn19KpBT(} z$GU%{?aZ$!Pi>5mGlpf#ytI6on>ADBXN{Hl*%M@L>S&qMZ-MNeI!O*p86gLzj+8mc zqhxB#NEzxGE!#HlE-RLKUzU0I70tZzhnkCJ{i1bE>JI0lq3n0Y@k{kz;vW+!f`WsK z%|G#dY?BldiTSeu|3KJ&&SOK0#w~r`Uz+fUpVuhq=Q~aM`An9+9>b)+=Md?SwNP)j{?g4MMYgnXmu24nNWS;xt6I%6 zA87XGwM8&+X8+RX)5KrRr@>E-tL(oD|Dd2^_;dcB5FMuQ=W~kxz@OuXVa>WJc(1S9 zT8UWTA8*@24C`H0^zYM3>)kz3I@{;S-VV94x8o4$joshZmRZ@r~eEB(IK9Wj=Hz}IvRq2o_{IIr=rp#CfUDTY7% z(`^!>!qxm=;g7z;IS2ayfqj7Z6M`sH>JxM+8sASooqK7vEyK0$Hp$Yl#{l5THDKWD zG)ngDF&wy$#Q8AU%N}dNJqOC3w&~Kgb+l~WI83YXQ9G^F+hvHq=v=?L@L`+aSpam# z7dpT=TgKe@!>0Ry_niM@O`Q5)Z2pg!t(Ngo;Xk;;cJf<+Yqjj}q+1_{z0fbZV4byj z^$J?6nw3PmI#ooc28d5>=B?I`+gV0vUE0J-JFFQy*bP!VceE$|h==VtSoZ9aCA)P< zlpUK#Xf4enwZ^q$MAh=WMcMc30{;)Rrj^TzwzVp0?XbR%Qnap7QRCWjd$iRH>&yHm zg8}ZM-Tww~Ce>tRuA6&7w5R2C<@1 z?Re3kMuMnQB}7#Cu$@-n{Ys)zsdA!nsq&)o2jxYj56X#(@0Zgme^5r$EmKN#0k1rp zDf~qO<`3}C7MnlMoH?aUba)Wv&xTkn%78Qwyjxfc*RF9`1NRhF%Xy1x<$Oi;@_wR5 zg#fKqr7+Q;db(&-BS$o5h+0*$MNI{1qJ>3{=+k?q z*1c1dXxF%&=xR}4*a07V#9YUQ2MPGImLrz0mOg*L{HNCVk3XK5m6@?ECns~;zyUd1 z2Mx;IGGuVx=AlD}Y@R!J(Z;=d&+k~Z>f76~u`7S-(0=OoZQ3mOzIE$`KeTGK;73zv z*>e7m23YU|${$*`nEykI7W2Lb{LsAlyziSgpR2&ydd~NNAFQlq{b*%rfEF!2{?Xli z>5m!ddoK+gy620m%)Bk|S#9p$KW8Ii88^bmwqfejsY~E*>p`EVjz3F$1HXgyvG)nb zjvaf?6tJfE?y+OH-^2QDpKrf;vSRMs6NkdWHtut;y#LwbyLYA4#q)C1 z_U*S04H!_k&)I1$*2+!e7IBf>Y`~iOlhkXUk&KnA2 zV)hq|9(`la+_?`YuUYeJH?BMXUAX--^?Y|zHoACG4moh(*Mnom9NOpQxxq9B#1wxe zBVXTb1zF(vlqtWgpFjWCgiV{S)+I0gnKu9KXK&w@?_In0EcEngvFVeg=f8@N{{nb# zp)88meaL}4HcdcOW{^j_LzZ-AU`flBNSo8AbXW1uDKHE2M-s%0B znR^Qd=bbB@Gw12&OO`x}IB?)bS<~nL8;_ySZ{D~ez0tQnTfhF{SM%om{_*P7kGk&K zb@}c8Mtom}6Z&`0Rb*{)m^o_uq7V(4gYu{NITi_*j zs?=WT};ig=nwj*bqDLj&|wacJNz${w02Fy4v#7!6>@_&l7e*doRk>BmKT z67B5N-aFjWOFqlv=fF6s=gP5T{fO^y_-5?jvSM#lA645c?_b zA@(PY->`p1e^8KLTkL7Q&X^+Tp^EbYk5$|kW9ks|r8REcnDKWC8Z~OjJ)|lg4Kh-3 zO5i`^-gHngVvvoB{X!fS-m}sW2dCa=JYJI~O*F*fX^d@ytQeyw^w=`}9%6%3+bGpN zw57)_5=TH=)gI&Ic#rXBtcUS-h?m+kdi3aae=$z()v&OT{#c7b3{bd=wL@Pw#u{2` zh}YsZ#_4J3-=smsC89qw&Wy2q8jh9jpkFiRfWS2sGst`7DdV_EFYg0i#WU7LUV!g{ zacPX_V!R#OLcAOKqT;9A8$&+vXnckPYfBN+4 z4M8d*Q^wR& zyiXpfJ-W0V&>OW^m)F@AV=Q5Vlx~q1#u!-2Ud6;x2CR>5us*!A9kFPR7=!=i?>X@8 zedt;)^#5n-AoM`PIH&N39xFZ*Pqqo0rTQOj7ip&qSyI=DFX?Bg$Ct9?HT|4?p*;CK zX=A;lmvoWm&MN0dSaxwGXai{@eZoOekN24#Yt(PXPZ* z=%>G9TzH1|zk?qBj{firJo=r-h}(SDwQIKr!24I&kKY-O3f^hd8}@yU4W6E!f;?m& z<~`J>#t-P4I>-2{p&kw6mEtMd{yi)#>^`nNK%F=6-UGzO{|ue{6+FHL9{&QoZlb&h z9&85RBIu(msn37)9Q0z3#){WSH*Ci1IsnfG*dyKq`4l1%znTMjU2}7DBQUO{4j(=| z8TV4K_L>YleSxp%(4j*Uac>Oh_?5cBK14mCOo6K^DR17R94Sxghkl>e8#HL}2)x?^ zJ&uI^c1cf9Z-=umP6=SJ0=f!1i2$o?l`8(3h({?d-1Eb?<(yJ7U7S zb?tJkYnLw9Ifuc#>N>97VBQVjdBdiCyQ|Q#ugSlXbKx-~M%bpMrQVB7KjTLp)3Jmp&v|HykVS^>@xw>whc83lYN zAMw1yh7A>1w?K?v|n~S<|_0U}_U!FMFWw2iaMf8gSNtJ7bMC#u_uuI4Kcv&xr|IVq&}k9w#ROaF013 z@GR+7?}AP1Gjf`UE_K^%(_tUd1hwPs|rFbZEYoGd)3zIoMT8IMPE)ofRr_a&^bIdg_K3ovsgjt%GP{*392(Vn8=J;Y^$UlYb_<3Aq9 zI-x5g#qhC1#L&@$w4wQfwIPECX?cTkHMTu^)CkZ3e&iq~9CSE2Io`y+g0zzI$M?8B zWd9(*&0d7|wiO}HoskCvxi6eMX(d2i=e=+jTM^-Ei~Jj1v?%wk$iLA|#CUW^4h}mJ z=hZ{R_w6YX`u5Zkee98s!-1eB`#K`mhNDRJcNA%W^Z+N321xY>@VcLaNWrtocqiGX zr%3YdfxH}cBHp8$h(#N*?p;K*YiAMFyOS2-+))ee*-rR&X(haETZ+D&T4-J!n**#h zPa7-EqXWTGcp^?D)w@LxD&q^CY`K`buUhq+d41WjKz#`?X+cuhn6 zDDoa4CP2jiBCeM44a{G`I3LD>FsDY0ZF3RZrMZYhOm{pWrF&D6<4{)&ajvS3a;ur+<2D7T8*5a;S5(;jhH-H<~9@#BnPh(bI}6l2O6`vFj~Ln?+>kHKuLseS5GyA1K=-t{}f8P)<&i4`H zpvR2sF{u8G!9Y9&bB^e-*W`gA7Kw4kh<``?cnso6`t@uiM!8lJ)B3)n&GUN|apY#& z(oi$`NtgkahM37kfo9rV+?(wAo|fN>xltM_UXq^*7~@1fFs9rXi~T$n6}T8RC zd65Rhfax5v$~ge*K_#E6|U46y{!eVaz#VLH!XErN^C{($6?P z#&3rs-jVbtbZv%Mn#y7(;)xdrnaR~LugWbMugikGH{@5t-;@VGE-w#`dPjaa>`la> zzaclKy(U*iy&@L|m}yhJ-q!M*s)|@!3&a%}^yv>V=_b4|#N;BT9I++TQ5EB0;DO?U z8|aS;3B-KUh-1li}|1sxt!oHD*y<0T}&q%*P<_5Vxk3DAmt|4w6@xP3tWh@)w z&^TVHo&#gten>mS7Q@bj z!OoEObi4XuqR0E%;$SnmH4AiqjCkxRr4hgX5#roGlHbm(BEOweSAMf^xjebTO@7O3 zGb+n(aG%eem{dyT=-H6+x?BMMjdd%7c=)EU3y9+c4^&J)Y>bL21RwN1!TzA)YE@ib zkxfuB{?LCB6CQ%^H@6$G|H&oiKdV-)a>iKq(4}=#^dHjAI2mKSKWt0M*jvW$sn}cU zywZF2PvqU`+E{Q8!qSje* zUf2r|CeQE4L7t%6YOeru1Cdw9CVnKhW|v}rkfUA8t9(k4h-Hm{EmwO25Ho0qOQcOO zjjg8+0E~8#df*P7j*AS_kRbBiWI>neXJ#L+G zglgY_N&I3oZ1pJDavE%z{9+LHJZvE!DLV5X%ez;!)`wg(?0DC1)&nz!b&8#R-&aN*vWxOxv`@I5tP+i#->R8df zf)X}S#fEc_3Uq)mX5@iRKVs1|?D4qH?}L)^N34Et>=%3J+PayNKi^TdUgPkCleRe64ir93g)Qm%@9T~76SN27k}w5ymx@ZTW& zl6w;jJWx7dlz&1@q=r2r*J1w>OVYn~?OK<-+<}iszsl)_cQ~f1I6ugq{4|w+QT#1* zU&S0^@6*SK-~J^0HF;!eL;3A;dwF&N@=Sf&QeOFHlf1GcL0y1@5UK<`|7vy>i#kE;(9N6eS^Kc zx!qqL9A6Xr^k@gG!46^^g#BmVGsG4f?SL8s4SSQ+TnKth{qKV~@N|5y!gqF!4wI7f zBd*R!KlI;7zv-B#&vlFSd!y{*Y@1?k`?j{RUm1g}uqWxtmH>I>`L=Ve*?fP36+C*W^g-E#saJL(V)yKcF5mmY#N*@#&`fYdDs++2d&}!L*CumO@6nni~R13Uh@0Pd*t0C<1waH!~T{IiuPL@Z7>(AA#WAL%O7rjBfl%~ z!8^z|jO$mCL+;||UFGGC?(*`sFzg+%mP^CmkfSjl;?cG6p2YG5)OL=5b2YGa*r#!sUUlvZro~ocXAb$h>&-eA9FDQG6 zKA_XD?{6^D?+*I2(o;2mfB&oWf0dL!_PTju{_|MbKcoH|_M0%jALl*#zMtpcdj|R~ zM4WA7F~j>!$iJGrv%^!~-q->A^n&H3FQ>{Idk0`2mJhDGVh>rNymNG_JT|o=bh)1V zzA#XJJHHXmD3i^ zp3zhunr;qgB2RCKmzR#Nmsc;IlNV2ZB~KsSC%?j8qt$bAum{Flj!Ewzhs9gU!GV=z zfBRQtTDQt-4!|+M@I3_m*XIH{{l+2hcPEu zED!BoFAwZJEcdQoB)?dcjeS(J#3h`tkkK z7rs0L{dkt+pOQc6NB<}NremM(>rnJV4&3{>Fz^-a2=lS-eQDTDC=gx~xDhU$RxMT(DTKnl)CgoSu(;TI1#X+3V$$ zQ4?fF;t<)Vx1Y3aXD(Yc`A9ae^_uM2=nc)ysy4p64SQXv_mutf{ly0R&;3Eg^dB@0 z$m*x)hyF)%9i+tfzjs!@j3-L|M*8*sukU#>{pMqP249aMS3pWPgALfyzk22FXg!0 zVRBgB5}BKlC*%FYuHmH3O*bH0(SI5FJEBU`zkK;}pML3SPh49zQS)EQpSnXHsvMVSPtmWBd*r+FO~Fq` ze;@1-$K}PruVQawJGp;Ff*hHdCUfHZ%k;!4GArq0**|5h%t@UnGvi0dw78FDYU-yl zIc};RhkE~Ozwk-9|>$23_X0k?^_q2}n zstIqkFOU8YgYFmG+osbG-6b9LU%F%e$N>1N0|EnINdG6FEb&cGODRUb>iZ_TuiL%n zd-e?b_DFjS<|7$)jnq77ZCV*QJ1oZk)dyJO8eFjT^FXjc!lfLc)WM7v|>FSUwJGYONH7lD->?f1&zVWK8_`$o# z68~#alKy~z%gAXHSyKL=ELq~4mXcJ0e#3r6>XNd5)B)I6 z`diqp?(2<#{JD274!+JIy=sVAzHe$NUcIrOFI~DgWJ?#v0n)`O50H;NXG5i<<0$Fe z3;XD}2MzntoN(@FpN~AHgR$Q(SN7`JAN%RDq)-FcccS#35*nej~ z$hZd&d+wYJboa2s9yY}T=48d*LeSp}^gEG$yG-nBi>d z_C~G(KF@CkeXkzp06Op+SouASei!ZyWL_43@SO4pg)9PX+KcXOLNptzP_1*TC~4Oz z6?+f|f;Q|y#J)YXcM>wU1N{zaFXagA=Nl@W)Lum7iS5!)c5N3YZLC9OOY;cq;R+D% zzhj|&^ln+L%7^cXW>v}w`zEyn^12}JETJKe>qEwnGkl#M^j(8)U*r%s`oWd_`-6VW ze_u#H;w=Lb;$oiDkN1o3SELV!eh_?Df(LBd7W)>hs+Cvz*s5kl(YAJFVNleE)*?ddXdQ+YRHaJ2nrKHdbM>b+bs#qG7CP$o-Ht0+6CM84#i;*9 zet-2X!1)ku0%YFMR#gAUMwI`c1NNA<2XxTNeqf`OE7cMEemiLuKI|%Lln=l@$P7R> z_D^Ps#`Q8pQ|y&&ZXU`~9kepevrj1A9kn^cRh58lg@O_>iSFX^^RzH|z(<(3%n& zWN7B~GNI?$qDk!>tx2sMt#M5}TN8Y%k%>C80NJQB3p_~FYF3QUYE%d{LKsW%I~03Y z`wFW@AzF*3{#uI~^|YQ1s%h>`YinM{bu8||&&o)p|L+3gXo5@9KWoJ0Viy=8D$V8Q3G53K*c(t~wBVP!)*U z+&>E7UexC>NI%y1sfs!^itdZr*t?2%PzPb4R!axeTeIo_QM2km>_Z)(5o#ErdgTFH z^~%}U&zc~*+l~=YVOuo2E@_%&y#`wAMm4o|O=@fH%oY2)V;s=?K}Ocg~hNZ78cWMSAX?7fByHS`}X~Kam0w-Cp|ot z9<#Gsb*yL4O-D;Y4_xcfWAl-oJvSfe(PQHaVAJ6qJ#^TJV<8Q-C6hG!NNL)g@ttx z*H!!I(WA9cR(o0Om+80AUp>bDz*^Y*n{)Q;vqQ_5pF5bGyczofS72}5PL$j$NZ|fc z9rSB2EA{70OVej}6*xF-!2Zd6L{U6!qdFYUQmV=Uul9@T zWy!s~rsw)IrX}jwUf}J$7JD_nDx5s|LE(Z0Po{6!aNmCa{%il%p6`E^)|b7<-z-Ca zNI8E_?%lED`>*qd?Ahz)whFpH9WLU5DZM3+O`pSilT(ac1 z0XufwY6AQ84|7((49EZUb>=s}bLV##>_z|d_|e~w%$jvu^;LHE z&O&D=>VoO-0Q^BG6ptJn))s~aZ!XNsJB2;?&!F#*CT`g9U6+#I?Efj;|E_wOkKopg zXVI{YUmQ5_=+MN8hxP^rehwaRoG7B*MC@>?#gAc;M6I3bk(Y>`!mwFD_d@``Q!tCA7VpcaL|Ur+}sldlPCXP zICt*jr7Kqa>b+~%(bE4n==-1X^zL0*54i*eojWHF?%n&_fpOyw6#9Cv0o_{)d-q;l zn3%Y$V9c0Xg;S@Bf`tnojoGs0hxR4s=zrG6fBXHLH*das>(;YC{3gf76UW5iB}*>s z%gWkWn3Hn|Qeoju?k)YlQs4iI46a^%YJ=a3nRe=wIJRTQ!!PH| zp}zkE||OW_elQjeJg(jkN?SMKz~(0#=(P6cdc0QwEwPMj~o5JEb|xfnseuG zzm?|rU6w!Hm-(Xi|M%Lz#{rBh#s3V|)l_*IkdnYy>gP38o(5!UFqVUmf`ETa*ML8y zD7eCs+lz3gv#MH^k9pZl{btSomVe}f%IUz&4+ch(aaX`66cQOTz*flw5sIzgJTgDv z&+s^37^KdxsK=2YLOqTb)Z>Ok5$b_m>VNTn%oC9Zptb$qJP~BX|Ni|i2mY4>|3BaW z=ahGc)vzJJM#!!ym;|L_@7Ig0^(0g6Hc5s@li>@ zcVC$o!GQw@%APuPsu-Y+a;9+R%$ah8BS(&uHwEkouV4!B<5wi`8cX1y0Buw%38=p^ z;qc+ZRZIc&R5bK_3NdhZ!g1=t_kR|oudk2e8p zJw7_%+?RlTwtl97-vaU{Am>p40sCtM2{;bY0ef|W30OA^Az)u}C;`V|1RRGGu(vmY zfc?smI$)1;6!tAgBS(M&oW~GwEmnv8{QNi_1`i$_Pr$u+TuZ=lVoAX7WhLnV`;n{z zo=e8{6diCqmB%b~;5pl;OrUf1OU8l!75V<7XZQ_ET_&%w&tNp-E#@HRe7?80&-}i9 zeHI{Rfes6CtN?4Wi(UeYaa{p&94s*f|j5UIJF& zycjq;yR5`sdsA42a|PIczuE|&A*Y27YjCUp`|>|0U~fLk=lQ8{ZknTNJ@)Mv0di|> zC;=OhzoZC|OJGw8*o^ZRK-bO4Jzxr3aJ~h(C5nLc5I^LFLHC*BLp#MW<{!!QpScIS zRss9_L;d~zmLgBd*T{8o3UFG7R;|?W8I)&mt*FHD*^+>~80TIB=W*Q#tH$N}{1IasP=y^iPCi=JT)B9rGWR8AsXdqK(kT!tK7ESYb~08LGf z4cD0W<1d2BTlL3hnKMM?4NLdFpmxLo*=i)^So`{yQ_2Nb1MdRc07Nc z{|z}yR6aQ73VH#kTtPj1_FyhLQ&4$xm^%mg>WTpN7kQMPgQKH8a*;6~S#fZ3a$sJF zBIwoY`7!gA_3GtRbkFdd;To@-fM8B20#g+1Uv>7zn)-=``jWcV zySFocTM)UgdI6mAyQn(!#&K`#X=mx8e%sT{&6U3+r@-CajlanzJUsdcFE8d=>dm|} z%)`UHg$IxaWE}Rrbtt(P@MZG-v+I}(wSr#VpbYRklNx@i6#1S!6aWY0fpS;5pNJCy z<21kxxVovlYQWp1bm3loBPjYvD{`Mb2j*lm0C{5ojMLyN!N6bBlKeE4jmfd89C576 z|GC_mzv?+S;Mf$Dj`6p9UjRLg*PiR8uA|gfjQct;f8rm2xz7ynypOQI81f?OrOJ`0 ze!mrCy|FBoBazosj;Us_4alwZ82xlFay(`1-o3l=-xW)Md9xMde}(ytFxDu5o+00r zAt zze%jufjmpV#<1oiDm2;|L!-iV@`t^U~oR{BI z{6_w>e*IVPWA0xGbM3VpqnO)@<3QK0)J=n)A`g}Nt?Kse+o{}+&=r*@(X3d%! z@|~%6(3YrOyS9P`4eIOp(p26}*a_MIjEi=Pm!`)C-jcuFRljGRM9l3}{z2py)N^R6 z`2%TU8?9TnIg1=_Svz*@u=u;?enuU61>ejb_~yGpeS^J4uB=4l$Vz73M9No?Pvj5e zp?(XwMvWTGC#m?({Dlo0Hqy$MFR#_ARg1X|k>9b6(j(Sau3R~lM-B9I&Y`JqhZTcUQ(9$9#ZeJ4%%e$w0iaGL}ZyezHW}3aCfWE5%#t5!z9}wxOHqH>Sxy>K^LA??C&`Mh@%t^v6MN zf2%JL-;!@5mq;db;6C};uU|h6`z=+@!^)K_t30s5!NCIg5|tdtH}?IourLkZq^hLt zAa9sA5_1#{&vM_oqLKRRi5!yH$HL!B6u8dc-BfvL;VWQ%N%bDzB~b4O%r%K~^)8N? zYf=HP@gCpf`|wF9VBe?w*)D=wtkPgK;6W<0{V{M(ezb7{Fn!n z`pR*T_K-Mn9zoeb_mvJY4^b>BULr4z(gEPDl`dUcjhB=S`zNoFN7QNNLM31h zqxuT%A^Rcqh`ixBpJyM#GpaxHoZ}(+!*K^ZS91{dH_C=GpnRx%Jf`f~uh_@QXTHzt zkh8K?kgdALIRb4sXi#$IoR%`zZ7}6Ro5%i2ozmsT`dK$^4fDCu4k1^l;tTr*`v`3U za8P3;ao{+^I`nx7WlGtzUvs=+->2+pe~1Ie0??*xChk84zc*uy?oFTk-`(#`<*k~mOjtP{X(e|pGwX_d>kMg9v_&iI>oO($d`E9~?DMQ{P@Sgr1Kt7<4sxge? z1@)Tru`c!#+Humx>l`CFF7SP}%X8l6IrWv#kbd+V_QRFP@zLqu$&Fi5#(#Ex<;s=H z(7AEo|6|&4jsxsN>@TE~coIkAPCighEZJA6+w7O5gEaCTUL!AgPP(Y~e3#=Q>*4d{ zG5VakPa8`9NU@anPWem zQQz|9E&C*GJ;nqD?6;(c{fl;&vSi;NpEz!i_k4!-gyT8o1iM&t&T*CFHs!%Os3V-; zQQvsZzQwT#{j4b0HthtSNyD+Bsg3KInsdp(G+D-N& zw#WH4`xejny+C|u55cQGs6#B7fi`W+DlN`@T8{1(2Mjh&#hjUlh zLZt_sA3ztB%_lD?L)J&S;Gb2xK>6~V_&^ubxW)M^+b6En59&1Apv|I90o@0&-z}Qo z_x}xXr8jQeC<`6W1&_ZYU#Q!}oAh$LqntT!rXH|w(YA4pKpII8c}gCW50pL6IcAf$ ztcU%8eHA=ZvZt-2jV0iD`eu}UhW%8wgME(uj6nWUu56PfpXYnDL6kr5Q~sz!*%scX zey~jfabbM~>M5?N@tp6__H&*<+44Qk1O2 zIlEVC<~7BJf1699gA7h>DtL)R{C!gc{ zK9Al^_9A}I=TcnR1(+C^~h#%WwNu8%o zqHW|?k5Xd|&-uQOkJ5jo0~{AQPSPe&Z-^sp2*)b&hH@uv)Em-D9H@7+VQAw9a`z8q z?8X12z5hr0L0>as5B$L6gOKYp^ncRy6#eNLzn94$>IVB4`w04vk}K^g`#SkRUEudH z=fUJFk0~cUOPI zaNOXxDaUK*kkTjW7Uf7F9>TBPqz=NiDVakS%0C1j ztI{#r{5EacKE?O&ulQ|)yBOCGKsOEpr%PCa`6@ItcqZ1hmcu7<9`QrWPjCo*dMEVv zBy_eAc7VUBwh20Y41HxG^mQKUUJpGUi9X>88Xft2buZ)ff9rLV*v41DyKp;KPUDZA-{5 z0N29Nzufo^`qc^cO~_7-)9mvcZ`uE0L#1v9C_DBw-s3U&t!xI*IqvW|+FOnrEO{Nz zNIu77UNb$WJ;#{+4CBx(^z$vCF9-2!){uQY$l4rq)xd8Lya$>-g8nr`99cu?Ne!Ok z+1jA566SC3;JGs3LuHij6EJ@)h1j{bajarU!OK65UDcm`QK`TGuj&fxWKJ2{AB;bx zu&z)FW6+0$7sY?l|EPm${3q6;%jjT?Q7pr_&ys+8Roo}zLG@$3G>!Y@F>+frgzoI8 zedoLmV?aqzGN;`C72x~~@2NE(+GJDU{KY8$>*%X%!KY-byEJDErfG~Q&vihIXAJ`A zDF&u7ql_Ib88fP%Gj{YJ#gC#L#(=8WQ9Uly7-w3|$n$?HE|hCXc)uFvoUN8ETV{v& zPG{2?PsVxTTf|L=88c?M6ZF_l)A-I8#dtE#lYm&xe;DJ5F~OIB@xf0A#(JVpMWg?p z;TVtptG*8~4>T>+yb$yAKa{4|c>E7Qjm@~PO3uxA%o5)-&+z?z1G={p^U@hycZdCo zeOVkR<3Dvkyk-KSWGpDIy)Xt8b}xm1d0;95`j(3GG#zj)T?gW!1D}IEilN*vM{D#~ zeMS7Xq~1ctePEyRVQXi>b}z(Oy%=*g#%PuV6|;%!MJ2{()A&suf8y#&a5aTuah$mK zDdv17V>x+VB9>FdajpX{-*NuL?*aIU6>#mz2x`p{$A2j44^>Y;m ziaCmD+$WD!?59b&6~_uNPu^A%_#EvM=E(@7p4u0-r!vQcKN}Bd@6msI!?w6KICx=U`#c?3@8CP+FX`w6Hi|1eQ3qw7h^iE+Bpo zV08iYUqDP7!1`kI=GOlodtV)0MV75k8{N1&gb*~41a}W1io1IPL6hJi3GOZl?lkTi z9FpMHxCG)#pnH1e&Agf4>vQ(++vil>+@ztQXU)7fYt8)et-4lqtLoc+PM!S*{}}^d zTQ>%NIi_BHJph%LX;e_PH?F^Ne$C)|69c+!fvNYV&U4Lz!TQg68_w;IxaX+`Qm_SDq~e}2(pt1= zo{IR@K(n;w&6=g5zgQajj-?^~OK;MoQF@a`jnWaTrZ;TZ;4K5!_O?O&`fuykua{B3 zeqGG<#C%W8`K(*Jb_VVb;~fLPeb>Bsv-eG#G=7i!^d9$G!_ncr6T`^?b4F{%K|UX_ zys_P2zrgX?Z}AUbkvDM4r0Mhia?mbraA_o%f%FEZhbI9Y?oqX5i>&}e}z zfX|#Qz;B&fsr}HW3wf0@a=A9bwXKVAb8U+_+ZFX!SLF5X0)4DRJ1I&JnmKi}*{99yLnkWjubt^BEXC{;T1q<~R7MK4IJ|EE|yT`2oi7)%Y;i{xn7l z_$6SJ9EE!DNMB#!>pMbW#0btU(TmN8d$D;7Z||X~2M$F}ik@ufzcvKmb00itpcsTa zX5hg7xF%c|u8pq`oQQrv|Nec|Z}3~$2lqkWkDj7;FGdg1qkA{e9`oHG8^1v3ST4^a z{+xpRtjeeO$C|G*xpENmPe1IGupn9fBfB$i~FMOZIsJ>%k$D(iAn9;cI zQDO}Gu`x!E9%%yi7x&o;_#Wd$qj(>yersb@FE$(-xtG7ddaYstddy9nI6+PVxNqB( z$&=8hYzq37P1QZvf~Lt}^kEA@@41=iX*LVJ*i;WW?#DKFF8a#NW1t7!eAR;v`5E`1 zLw~l#=q+E%YxEfAw*0lw!xZi4s2 z{5X9q?pucAE?v4r^?^ftg8$^6cMEmjJM_FmexS|`J=w&ZIkWk^(bsH-oXNe-W(Lc^ zMdRh9H6!HswZr82P;WVD@n{hkG#NeFG;klpNl6#nZ6qxatw)o&5^LCFFiW8c2L0=gU0R3Y}JHmw5I~*#(xn zHEUK&JS(TZ6IX+r~0DwX+=ju$~N9I}|pL zdo@l~HjwQg@4NrNeu=t>L>{b;3mMV9E!kEZc3`;AFw`1b{Vx7-OuMyVVK3P(aUV|p zKi0p=nDb@Le-^(0J!TukdY#obz_-HIv&}a#mi;Y0l&x01It6%R zUABPjy|o;`2S~-g;$GVd{$7E93tyo2U$H_!76f8#_7{dP(0*qb`~%x-Q5!ffOj=sYF{re9rl{h}Q+NH2_=T5nE#}2t2JzTfp9JX)YhV$Wb+A6l< z{I+ZcHf_dvZs?!&r#*%HAz zfgZlh|BoF1!T(SC9R4p}yjT(aT3<2$%D2M5qSq_@7W=F@kO%g&0D8gBM%;q<3;Z#M z;1WG)LxKWja1i`7Y!-URifL0P1L!HsePvaDS@aH`0w9i=I%R?koIF8J1$Y}cWunH^ ziE^5T+L!mA7C1=+1x^;h(->0}LV~8?|E9?4_`m7FQ{{}{K=i5&lrux7$(hrq$=Nfe z;T(e$=3qN#md0GQ4VH6e1$m8X$%Y>MsTl=qm^H?;{8H>mvvB?JfKF?J4{9 z=^^{}?k@ZE>Lz>l>?(V8?;?A4>ns?(x^)u0x_1%-`*an)-h;$~`E!+>wdNnsg;f4j z{LlPDre1M;-KBGT;fy{3-OvlFEBe87XlgGyHOD&Xc;Bs64TkKV1rD-DYil@)p6D0a z6a8O%wQd5{cb>#q$x?-SbJvq>;o*3j+ z-#`N~xLpJE?rjJ(LciWdVpxa9a#)8((x+o%>C>qRdiFL!&)%kTcxM3H5nY<0e{VD4 ztI%AG?3Rg9-I_~mL2D;SO;MeMXJ*)#?zq07wpt9)I7`=U3*b5h|-;X>>`BvoV z7XAMm{&`*z>`pZMeGk{xqGNsZq-ezba&YW=Rm6b$Rq$GG@meZ0z_vkEiQmY94XuGb zBiMIvBYX52sg6DqKojmYzu4!B1Qd)zal*D-n!sGdgL*N=OfV10Vk^O$@70_c07`xn=& z$ZNl6N0y$(+#8~mVH}mX@R~A+~068_xRvm6Gkr@?t{a?+gG;}{_ zTn}HD>fyot+f)xXiQYTV74Tobnp8cWxz`5z@N!>H)uRyiybs^M+LiboD(;m$a1U%l z2DlHjbuVn)+qt6XjkWPx)u@R0Pv=<9ty{mxe1r2CH|6I7KWYE@H;9#@Io|Yibq4>s zPk_lk_mS?!{U-pk7d8JkxK}dL8}ecFnUJc#0_0g;6RyqdHEi};HhWL%UfX=H%pP32 z|BL3H`w#1WOlE&H?h(g5xJ`^if0j|eXkaYt#6;KXVkUalEbUTQa)0hkeZG?1cbR+c z{uZ|N%RyVvlXgSzujMNA>|W5Z7-Xk{>IJCz*7~h<-00Knjb6n*ET4GKQ2m=#|0c-9 zhvb0!*l=H!Oc_x6ziRwLxX>&E9y={G;!Ws;@XZ zXY!9RSYC7YH|xLW&!4Y?IQezZv}x#H;w;-)Y!Azx)^~$%-T?GS1*$D@MN+v-cqLZ}wXsta_gsy{DB8;C`4a1KcB;`{QxH=(_L|%zr)TJkT1p z8NKMIx>rHZwqjy!uUwzS_ixDpf5-B`va_mN9y!yq6l_Tq*mvC{h-DxPtodg-fDCxE zU4RS>LvMH0$IHqVa6e1c(@4pJ?rS?h*+}U~pr4BB zFOJ?EeHhF=+cw4jues-5^QzxEWPp3{nSJ=U=Mehl8%r2620udpgqHK z5cjpuE*spdn)}z!@+v9DwXPys@e0n3)}y5n0GRP zW4ll3Kl6{=_%+woz1-VKFH^oCTZYY7d~+`*2J5>*7VcT^t+)sO{m_F;>puF}!sib_ zuX*NP_nT+^*W6q9M=!*W@$UouXa2c={M-&D(WmpnXv-*`qI#Gg5evu*B5%7aeuD&f66kT<1yubGkq}hp6xO?k}Ydgl9NzB!?+Fjcm7@c^E?6Y|Ay-a?c80!KOfg( zb2Rs?^9J`E<8i#2UGG&aqhcC^d+^`Cesu-rUi0q&8PK+0^Ur;+H5B*R?7w$&?hnlR zUt3Iatt3`-%P-kRTl2He`wI%6_%%h%2H%Um1J}9ehvmSE+zJn|eHd1b9`16XhdbNQ z!_~zs-~F&0zv15k_m_T0w;(fDLcXD+W49QiXrQN~9r&+^y6Je- zQ3Hfan>LDn%n2F)Ir`81@7THH4cGtMGykUl=Xf9e<`}=$c`XCnlUel`hwdwzZ|ePT zaIbB@qZp)YzsbL~?$^fs%C!A#TSE||uSIWaYd-c2{en(U_?oWI{Z8||G7mjmnOEV_ zs=V}QRXz*u?{K4=SB}%o%LnO)O|>nb^KZ<39duq{ z_6f_o6hORL1+fV10QxucHoFY49WdoUZ#jlAVntIX3_0N3*wXJ$$$_>3-1kt~0gk7X zzL|Caynve?3eZ*X-vazk#@GqhgR%C`JGTGK|L2VVBmTEXjZ*XP(N=nLPRIJM{7okJ zTJN>5SN=W=_nLo>_u1~Ncn`XtY4=UN2k)@^Cign_s|g#x{BsX*_WhcB)_q^t+ga^O ziH(TQP43xOANON@XWp%NUY(yFuP#83*DwldgchVHz{A}g=SGclgbd&;oit>~E0^mWNeZ9$3a$){cz+DvJ!PM!q=3 zt+GW1Mi?@{-1`_%b^!Lv$A}F~o1o(YGcMG*0@n;wo`_gr0QWtG3|R6*OO9y71F#3m zCbJAURut_2r((<&b13kxuz|>G`(m^kP>7ye>q~))%MehkMb>rw{1W;~Vt+`)2qIJ?rti7vDFg z=R51sv$c>HLnfZ!cuztLLlz(pup^I@EaanG3-izk|8Ho=0PPP)3{KOGJk z;Cxl_kKBOs*GyQ(0z^oZq*#O<2SH}a)KiADn8OZbnhAmKWA?yL?{|=Qgc0ZZN zPJcK5i2rMV|Jd2HW-0zv{?Gbu=zMn0E&g8leC8fddareV0CIhm=YxBeY0iTcRBeRq zovHiC_pJE$Htasvd_p{Jve^6s!@r`)*?ANvtm9g*4Zgvz;&?*|dcL6~z1UfYUPXmb z^!=0c>PRPgv7rdPI^K`sUO%I_m-p!9-j?{RD7`x5MX&E2rRZC`=*6Cv*cURv$ASz! zWk4P*vcUcXGVx$lapV^{v&g{mt_4+IGMxEGj^e}oBWCr+b!ecL!SR5K3Gf=VBd!0O z8*r`I+6Ndmz=#FS+Nrw7e4kBUVCDrZ1Be4!IacPeH{}B`|MYk1Kjx^{z?fw$kD+() za#i&oZS$@4-AeEK8oX=0x8k08H^4Ps&hz7d>nDg~6L7n{q{tHT{B=2;Xa#K%&?vkUa* zcsF`;vM(hkL{oC?BZ}VFjNTmWLW+ z=g5xj+(ZZCxSD&z@0-4!b>Fo6MvlsHD$D3V$ST*cSbn+I$@Q%v+}oV(zhV1_DWAuA z5cp>>_ZI$ZiCJEy1?u+dzOtV^H#Ijs+gzDmY^|tmyTSX*jV0*i#-iY>jN&|cTX~A! zZVObP*E@inRVePl7)p(~L+NR$l$H{ww&`gplotP3y-tn2PjMH=;kT95e!TxH97o9z zVe==;U#SU2VLgvQc->C}b*i2LN_pmNy2A;$GZ2pn|Ibz;R z9G+uQ{KNmNaUG8T*$?o4C|NLN0J^XAU&SUmM&Ve6Z9mJbj$vTSl>KM9*5f={228ov zc98kkGEiFtw5cMv-fHUpF~4u=@%oDNYNrGA5&CZG`4$^`xw{FyJmpK#CkImW4m)tj zs7P;iRnqvrGQHVdjS?=6rL@?)^fo;$3)155Q^I9G^&4{^-v2d@#WEDVqYAygGK-?G zZ>AT=`q7Im6_ib2yYq5;Rf;>_iC*rkO;@JpvDA*)4{)x^exB>rZ1Yte8*)CB!L==XEG1%-Y`fL%yKv3yRR|y$xZ{E5XJa_MP>7XH|N6aR$A9^@3s_o}f4T z8qgc?9rJw^irHP2V)rnrY3y^L#4F<{J?<`LyiHd~kH3%4{3&*C4fPw|M*;i4*#)^_ z8QR~N;-8+U*f-G>eR&q_0&D^M2bMvcOWcvR6noT*9<8&bqhoVg{6J`rT+**iRn5KP zKa+dKIrFZ-daq&O-_(C>t!;q1r)E5;asu|f+WxCC0gnHjs$%|Eu$n86XRR&#^YeqB zvj5CK=Cj4~{MkpkKAPb z<{7;?H9*+}6<@&TJlj!+o}V5^apy6Wc?IeF!P;lB4VdXwO7YJzt{JVXSe_eypzF)_ohTX^c=zK4edp=)1?}4uc*9GWtewO!4{kP_y$Jk8W z-{bui-C16SVxeP?j``Bfi+kw7i7Ck2n-I&un;o{$JvT~vb)8a^6Dc8Tw&GlK&3rpj z!a*kkH7S0dJtbWpP4ChYC?n}P#h-A`@*Dnr{C-EsgM*TrSjbM|^@Tb(bqyL{$y8rik#p?z;_lKu&R4*IT~~2GVMR)z>ooJ{@EU? z`vU&W`;^H)+W<2cL>yq)SDrhjK+< zofnP5y;_O!cGK^lnUn{5)tF+AccFWy=hBU+t917^YInCz(TnrJI)D2foIcp0IeL1O z;tw|h-!&=WP)$laTnnhJ_>bFNkzx=p7ooXQaeX!o|@_-{bdHRliF-R7>s0 z`^O)ET{zr?Ql6bs$4! zw9BvoJbz%at1b9P48YfDWe3bLE=vuB=fChch@mHXtGVa7GNwJ{*qUX)w7Hsp&e7ET z580|_HHrDz1fP$!DzftbDf^Ex0>wYpDv+JPe|tTrE3^J%`hGPg$+pLg`Sdxdb5uE> zDYJTOUX!)%n|fg07q4P{PSh6nmf{J>Ty}kIn?s!<(n*>Ej1B$Gm`RDZ)=+v%BI5anlz65qB^{|_0dpI>zb++S4xsecSLpq_x4=7vcd2hE z<-umyfsPcnr!wTkQSFy_xDF*Ag4~?xPU#6x)UlHuAECsD2PiS_CB?jsrWcQI(z7e8 z=*7{Vln~yBk}nLV_+uXQXl)rfIPx211K5tu?@&~Y1#?ZqyjC3xqRtK3SKvCB!9V)| zzF(%@ga0`^e;;d|VEqk?{_|P_pVEKC|Fv2FE&Ln$ z&$*=~?uX7>;y&X%I4{*PKjbt!|E4?}*Qe}0t~U$+;GX%P+rEUw_8;*5hMsPP{)Tsl zAGX&q-JTls8nz%hatXyezfMW0*`y{XQEI{qmB+nJO{Ao#Kyc?oi3efB;mZ@w^rN&V z2kHIWWcu+vc*pi#{7rh7{8YXF5wehx@Q{*kEI=&Rn&Ke`Nw6CU`(an2f+!d`@1P7d?@10Iykp#lz6HGrCc0JN#VWd)ed_KpOVMo16IQajKVx$=3mKx zAqQqWVETdVK0xu$HS_F#U&VdUJC3=T3+N9UqRylyEzgQWK*!_sHuwu1|S#fZ`6dz`h=oe0MGEe6+zc z^gjLuy}iGHQqOgy^r(@P@e*>89*ghaE4%Ra4eCR%6S4d2!=HDdwCAVQF*#@C+CggU zLyEr|LNR-4Qq0csI4|THIIqN$9+Yy)8#Z7N#q4hgA5au?M|2#>^`P-CRa8CmS2AG6 z0vrn|z&9#Afv;q}VZZ+o{x$dP`;9RG&efgl6#sa32K>*!I#gQ!{~rE3w|AEvq5nLm zI7{AV$X)h)PtWIL-anIjE5Fb8Wt?+0%;m|c_~(0fV^L{JKG%=pkF-$nxQfsBR--pN zZRz!H2Ne^<-&hXaf3CP;?%!p+1z)L@9s{1C)9>G95bO8*l&AFW$tFs>+?U?KhCE(} z7;Z-;NL2?BZ&1zcpWlj{~-%w5Zisy{v-ac3;j=0`rpoo z|2VGTny;1bXW27-Ki7M+#Qj$G-`ekIiT6$JRotiT;-t0}Exv!xu&?Oxrs|Z6`x$?* zp3dJ8o5vh(jeLJ5z4_q;CB?l^_L%E zkG(>xI zLOQQA@_YF=@;}+0ZHiUy&+^s}_MiDTYrP-kU*)fmVWZ}g8S`iL{iZ$yd6W~ZD;)bB z9GR0|?QH`7hawKIrDE{}#O86QyHWJxNQ#YlP08^uDGhp>{&*{;-<(A0mwQn9g?9Az z?i}QIvC5vmd+|M`o^_)a+bYnVrI^D3JXl?ruFq%g3)B6T1?lEOt}T|L#G?%;<7NQ8 zPmRXDhzVYYQ+mW8N;}h%(!!l7?Lrqyjq<0|2kT%1&QtvBhxGdKWr{t~9{jhb)T_SW ze>mdLZm=y?>CBY;Y7Q~Wz@pAYBtM^!T?Q=ipy3B}Ol0y8nP6X_;wLK^Fk=6#_MhkC zX#Hn9t9a^V*gc{&}sbPsM+T|LYw%aDdm=L;c4!8~>Pxs`!TtF#k#hbo_70 zNljm+^3`lPKd$A2v7ccBW}#MM=KaS5@~FH%_0j<7Kj(6Y0}<0Fo@hz2H&;-?-B3!o z<`2E?Lh0eHfEM)jY%9t**P7l&4yAV~uN439AFqM0uvdIP*;tm6jyI$@9PcLPdh+L~ zr<FqgZ9JeK;+%shz;?+Bc)s!Ny(Q-AQ$LK(cjmg^TCA(H6R6k=45nho-fMd!iFEnW(Tw^7-Ium z7qzMhs{EPls$u_i?x*8$?f-TBr|duYU$kfeKL>5$pVyxH9R3mi*N6R2&dR@8`!#%k zvi%>>f6f8Gzm5ZR-lyjEv;1a@{ms0GV_QVCX z2Fhorp4NP5-dif(GtN8Hy9+Lqam|O`DIG?<_au~}cU7g^n7fsFsww>x;YkUH>ni?Z z_B!Cb7iFApL-$uO>YjsKOs*{xabR+7)~*#d(-n>j&xyq5j;=A&y?gKj%!CdYyOoCn6ZFWJiz&n zX%Dy_u6%%5545TU>ajr9JGR4`6E*h3b3zgSIoGLyXU!L?wFNqKXrGQb0H=Qs|ET{Z z&qe&u5##^L{_`_Huq~?o%P|1{lj9Hmf6hZK_FwU@WkA;fjQKuB{-<+)W3CU&H`_eE zPRIbygF(&T68oPGEJVp?dqThaD7{ZUR-aO!yQwD|Ll2uOeN^0^gU&17+tB+eL{2OHAMef8+YzJ?Tisvo@y_o0`l4Lv{F1M>KR>g?bAyy0_*Fc>aRKfH>jd8$jtQB6!~UyWz>EW|YX6#h z*naTT6a2RU|4WuEQtP2&?X)!Tf9iAjzk1<91I0g&|9Q4G_}AQP{^0|df5ZQ4?lZ^x zb&Q&61JoRUgMZTo@EmVF?vcqqkA=_cP}IWzxoL$d<$Q1W^uEM;Z{hwF>T$>GQQE0S z$}VSI0Dl)_Qec*UK5y6QpiZ;k^0ua*7(>DhXEy~mMmEzXTt-2wA8O3{t^cphL$ zUbVfC`0o{L^}Q9CAGq0;-rw+{AJcTc`2N{u$dd=;!H{w6e0hIp-|JJb|pN|Pkj>2&O%PPkKJcgxwfZ+$Y)@>yNJRZt+U{3qu7XHJh zLjTY8rngrHD4U;R=zS{uZ_E)Fia|Xv;eZ3B9IH(kXPYa%XIuV<$PV=5t#O(Bzu1g% z!`g`Vkx#LOZ#70-TxTz~eY-&xB-}j@dyZX_U9ewE1Mt8cfq8jZQ zTaZ?E&7ovqQK$Tf|L}Y>^UiZaE&TI5Cj+WJ#6Cdtul&EV|9TwA`gyT|AJTus>OCCT z{yWHJSci)F@ANzQzjWzRL#$nqg0(53|1Mnr&#e7g^KZm{tpA#O&QElXlI8tp^Ir?k zY?iP*&v9~Meo8vqoiZYZAm(bUd^g8n$!9z%`tE*;d2)&3Z*Rc7j#0?B+o;-o>WO;v z4!%4+!du6Gs0F-x9EKWQec1c2;q$+v*ZUjMA8rq)KiwZgKi?gRdaX0vUYehn|ChU* z;QzfX@qg<5Fk-)xdIGf|)P-N6w*UA*7rJ{qh@!%`(b-dn=*ZsnbS$g~omkt0j)r!l z!>hZ{!NpDK;Ot5iHY6V{>WKN_-Ez>J_J!nd%wOmH|HItt`llWT$9RbHkDL>7J&1jP zj{ntjVTQi(z1KN_X#))VUl;siZIro);SKwL683-O=jcDie=YoX@NkhGdE7sH{>S?N z0sga&QD)YGSocl+H|zfv{Wo-<=f(tkmJ$3+1;>Dg$L2;&9=7)yaw?AXz&*#|NtXs8 z|GR?v`%6knOhD~7fl@GcC;8DnO1wH1wcehTbYs36-+K@KQ}1s?eBJ`{hAKe!i_q<5 z1u$O({^UXr=yEgl*`4K>)3c>A@`8qxbR__`BL=yD2I@c0F|M!@GB%cCuPvoF55wu% zquX@n_AR<_{yZJp|2^&4u#k2v8%*04bf8VMTxnfU16nt^Ds7l(OY?f*A;w zzEdam|B8Rqc0OtUQ6p-E`Jbt%9bo=H`nX_BS=D}Ve6BI@fAM%jR{yWZdv)Elu+)MKAHbZb_#ArLo#X#{e?R|t{<|^e zf2YD;;Q23SuKz0iw~YPZzj)rU=HICMA?|0}ulYCgKEr2O`+d#<+3y2U4y@*2kRUV%Z&x+Uf>>aK4LwN@qfJRu426e)Lfq&8B9;FAEp=2Uek-` zvGnpq9KC%0ilQG~!~FjH_$&@cpy!Vs)1&iYbbogrx)EBRB39O;>tT)P?vBoM@Ayo5 zbSr|MJdRa({NN!yxpABxUq4C@?>?ma_oAWm&*@s!Lppo-d)m9GJ8hU$hnD))qlE#D zDa5xHO&nxT0RwB2-+(&g-`ke_x)i0MO~0gZEpt$i+m~`ga~m-T*RAF`D85++^fRI= z=Kl@;Gv@)A_gKeUZ2z z&X_^We+NAOYq9@I_stlP>p$Qh`5%u*n`2ZwW@Vmlrrxs+W9~l`_i5ed@gE)|<7e&7 z8o=e*rQnZ;(EG@~I>)<+{ElPs@Mfq9)ScM6 z_W*MR?w?&ncdwkFTh|`o`E{1id%iH`Z0zUj&p!VsF+uMtfiP>sg*t4_nZ z*Q9}+oT#r?73$|+f_gN|LtSg-pka-3(70APW&eg1#Q;3-!ZluP1GLVY-0SB+vip79 zFSeVU`?D?O`j3(Sar~#&3sAKf!~aA7P5!YC82vr`XU9<3+NaTWiq);|VXGEnzojF1_jX2p6)cDV=d~`rZRc8tVFJj zOOb1Xg4D|X8*;6dgL>7;K?57+k=;3G#^|b4%;!L|+J94@6#r%n z!2BEfuWCSs|L5_4m-_1>)ea^9a=_rble;-8<53Un`TdCqJ1(62GyuMToDUwU_?1HC!s zPWO*bqPvkN=*IQiw0HL<+P&>49o)2<_HEii`}f_T1A8ve(Jf2q_~!X^Y|A15{B2!9 zN4JO3;hlTw!0rpQZ|@BNeD1kPd%wR-2X-8ygIm_op^eMv;QGaMaNT@5uy!`>51mf? z*36<^n~%}9tr4_w#YS2?H;@)iUrgiumQlaH)2UNOZ}M<;p=J%LQKOorsjhtis$DrZ zIhOf?8rkL`uNpb1gJWUXQN(9>267Odb!5M%>z;bvyBYJF^MTE}uZsJP*pFr4WBlv* zkLQ2z^MB00qu})r=VSe2=AYN0M?OE|bL>Czzot94Z%^mBL!ND08T@C)fc#%P{-fi6 zUH>!Z`djnQH7mAVJbq!0`)Ka94>aq37XFPKcpT=;^SoKp2Sm(AO)jzzY`}1Oet8~6 zMO>jv7cN6zkJHwbD{1@EVA{SgfHth$L7O&Sp)G6o)6P{3fkm`)^-^F3?Od~(c7}!m zYiUQ=R@xkPh&HUhOdHmnqs^-})3#M%v~A^T+PY!|ZCSRIHZNU7o0rU^O^asH#)Z>q z?b6M(YUNp4wqO@6nLLW-`ukA8FkkB3bqu*U52mI~T*#?LRkF7$OqI&!BHQ9$lWpM~ zPHLv)UY+1Ru^gv$Tqb_Qrd|y}xl)kghYnyN8d+Hf5&iNRo{WR>qewG3<#QC4H z|5@|DO#Yp)7UU|m)+qQ-G5P1-B%kvCi2s^l{fD=_{)?w8`gHO9UycDkVEfJ5ujZf6 z%hY}StVbsQtn((c{nPy8+Li6+I4JYE`S~4-TYSKwF?mp5Z$>}g_NBzA0J?Q)51l<2 zN{7}3)7qJS6gG1Ltq7hQRu=@3SG1oSWl~F zFQKI~R?(8hr)crKeYAK=5UrTKlvd3PrImA6(aPD&X~nE1w0y<_S~h(SEe)ATi>EK6 zxw8+`jF5d4GHwb@^Yx*z{RdFr_PxouSr4jTy9rgbvmu+3`KUzUuc>gJ98^4S4ysf% z2h}X|t*l?Zq-<+nL3FJHzLedyQ;Y##J*P9eq-(@kIgIl z&*Oh~qHTkkSabT<{Bu8-Pw{`|%$ep`AN4KPe}ewEwAg=3?ca?3;rlK8LmoBvS^4Ml z*SgQoHf#PZ*KF8*#lMP!P5$eM$ynRN%mdgCT%Bh_@1y$DA8rk%7vUr6#Kv*7VU9m7 zm^hvmOqxhD#?Pamz`Zm*XfMqRTuuw7EusZMOKCyy3Sc!Y2nnV6A!}*QlqEEM%oGZl zxQ3=rKT6X>j!=-_LJA%|iDpk;LUX3BqS;fH(=5E6HEAKuoG=f^o<-9G=FsE`TWNg2 z_vAlf9{CR$MZN zwzzCvwY=zzXXyI!bFgL%q;wzpVCn|T1^Cx>zwG+Y_tw;X*b&3`Yuk_9T;*xn{+s-B z{D=Ba3VMK?KrL|i=kSl`|H1#(x6=XxrAM0<0`b2d|3_@eIUwhLS!zEj?$gitDEq{= z3edX$asHWii|*sK&V_VdJQ8a_F78ysVgnBN=E6MRrmz9S=nM@N$Euu+dmf?7d@p>Um7&(u|`_7{ABWBQ;;Va13do}qEnoT46 z`q7}SzSParo7yxVOf~JBlU>=;RHQ(D%KPmXl>3_;l<(UdR5Z_*kbyk1M(LumdF67l z1D?&*F#xy)=cX?3SdYd28!}+p|DkveNIyGg#Xt1zSG7Oz&-4F#IG|@T>p#{U|9kky z`tL2aY}uT_eFfaxG#8xztN9<<_*c4bht*w2)2JnN>e8Fes|do%yB z=AY}Myq?B-tM$At&BoaLm0ome%LM4<6dLb6k;V<4MB|1`rLjXpXw1+#G-lX*8VfGR zdM}`{K8tDW@TH2kQ9~Ed@V-;Yd%!{(K71Rnm3({vZ^jn#9=3&s_MJn+dQAqu^T>C| zA{sGxK8+YOhlUTBMLzwflXt)AG^|e$4e2?F26hXe-W|qJC$}-+e+2kzeni`M*Si2)4#SL*@cKC&(` ztn9zJHk3K`Yu0`^PviX0rD09V%4Z{D22y%F7=n~P51U)vVef1Ura z{_DJ7=lN&;Z#RKDd-#)=i$Aq)I+AKTbfz+8lx{UDi0+&-GoP#zRxx0v4>0XN$Iidj{Xtj@#LWHK7OQz*&`plfn196o zvTehf=n0_tNAKkn<{!4e=X2~o`u(-sv~lCR$yh(c-MN`W{Acz2hpzot^RIMY#eJE+ zKP&&{v)<-e6mHb@ZG;9Xl>VuC|=IbY4!KJ1(M* z9hL!0@p>^nUrO!U1MQYjJNFR$KA1YUn?;@4&7e+R$no&Lqvtg0=suM?xJ{vUt`o`A zWg@k06+kVUjG{V@1F3A$>hSr6VfS-E2EL&0zWI{!fd8U-a>)us3&^@QC8SHW@}evI zP_B`&pEvEH@eHu_`VVSdIObo;0Pd|?8<68H=3mdfP`)2B!1`~l|I*!|f^=z6%fdhW zf3nFx*8eQ?srV1;|1$p>+`*e;d)6V|9+>OuJ}s&o)wlKUZM=XFqCf1N6N%^`E)0w*An5 z*@gLUsQKsdACrIdo$&q~{t^GT!us#;xc`z{>n5@@^Ut}30nI$+e-F30{WB!W&N#K71IX4|mjcW~~x;2JSHCs2tdL_Vl5t%z@ zF3Gk(-*-7>kv!kY@`dxsT4jq#7yI&}3-ix)GOmdlagpX;^RAx(G2^F9|F6gX5j&Xc zLc)(I{byca|JAc!u>V~V|H1#OUKq?j=6@>v|6Kl0o;=wa{U6?;2aj}Z)fo04>%S@g zqW_22nNT@^S_?j_3}8)j%Q%4bcmT_@$-im)&9M)Q?lbo$?*{jy)w;e|j~#2QFX&iG zOzY$zySenEHVuYQ%X;3_w#7K5kL}zH{#jRagM|1rGwMt|ATpR)hq;U`<8*T{SB`PQ~&V~qdv zdcT|l=y5>)PmVkJ|MmPoEd$CHsJw)8lT7fMU#1T**ZW}^u&kZSxd3dST0a}Fl{|19 zV8j4=UGI7r8>}S;yST}AEeBJ}xB;B_FoA;xrRP+RfObGS_Y z5&sSQ9R5$8I_8Z2Iq&`b{G>~ZM#x#!I`is3*v@GE&ng2-4sdQP1Dbnt3pv2Gn*4K& zYt1#=gnp2j-pC_)+aK3E0CCPB+>^n)4i?8p94jI&@NQ8L{YQGqHjTZhdF>&Jf0lt} zwTDvcMx)5B^(69i4JI$Q>Es38yxeCgKknrL{a1R;exCJwF>L=_a(13WZQ5{rz_wr8 zfBvl(xc73Ot&hRSg8lcxaXs4xl55KVYTeKm|Ed3<`ETerR60~1E-F+4ic)~t+gAeG1YwiUb-kaxdKwo%mUrImU)T*b&l{X89mJONF~vQ`=+xSe*n)q=|ImNbe|ZiU_)kLockFlZ zAG+o}_w#DgqG2}v^*EsZf5@M*13DJf>poyS8rNVxm&{vU_mORwTGx^}RdJ7_lJO2$ ztI!!b(Wa`6aI0Y}yl`*YBY)*Fr_Ov2aLt@A^}s#qTCbL9RlmP%Qg?)G=;R}t)*LFC z2bKj!3;2UJO~#UY8^mbJ2N?d}!oT(bECU{vSdaCc<%0QV+YedEru$y7{qB&hHcg=O zus7!a@wSoEFzHlfgs576q^M-$BTAR(B=Y923Eyuoi{>pUOM&|`1@nmVh4YJQB?^nW zVP<+8}3ujngDZ;`^e)y$o*xv8n&`+Bj`WIe`ets;CAiX{Vx8GA3xFtx#N%M z|4A<3pYuO$|F!>DH2`p9`T>>!%Up1km*_bOrVOw>Q1d{c*KE`JLeCLXik6kjikfAL zN!UeM6X5u$Hc%IFay^?80{OCNY*$J&!~JT3>uzpeOVqD5MAoV?QaDx_D{566B^o#m z7fovomDZfJtUnwzSwC`fo(g-wwm`>#ieEDh;5bm(0+V}dyRUWMvu%*FDJ)Yh>-l8i z9d-vcf4Fd{GD=jn9VM#Rj1-m2`Uu-nJw=H^&7k}Bz`q@pE|5=_DVSH5E0j;#AqTWa z9molBKyB26>y|4n>y#@d>)@K}@b%+fFlyranx%_Kr&2}8sU&X;OGn-h+uEgy$cEUj zwOwi1&c3{a45)q}hyhfO0N7`>{;w>r}#(wHx$qIeA54;pPue8@|FN&4k;TkLA`YIJEAS)s+VA#Pv;B&RDfY-K#82O}aL5=dpwj%CVjS_`q zBh(VyU?)1m*K_|5)BkfUz;*!qb3a0U{!@B-dNTh40me%VIwwsqst)CxYG?FQ!*E$V#u7)@$&o;N~PuQEnd zwHs@25B|#oHe;awV??Dg!$i5_9Yyhitwf>R^<**a18^;Tow?QZ@->&v&%pcqxkV`k z;sg^V@mc|OgOWfA1N^!i_N@ZhsSlgc7W{XD&(!^2z&pnX0N4Lr8`S~-D98t^@=vK3aXkq6l z>XdO1_Qk7<@`b93lKCr%qIoLH!ny5ak=(pxR01j^ZmxoDRiGMRFAC?b4qd7vN)+gf zdpt^1vzaKW+Dw5A0JeY~WT5hRQKPEAl7o7VBM_4hQ}JPT-Tl4qIlgP;LjG|mA4_f>2l59P+;{6-4flKn)f!tSDQ-lpn$isdaKi{~v4S;&Sw z#bwbv#c?09qDb!I!T|0~aiEwimZyL$1^#WIGxn$@vk!2!;@{MNmI2iN6#v}Un&I3 zcN=inR20b7R20l@fh?H2nJk#6nJlExTo%p)1gjKYu6Y}^_47mE4#p4a=!2}8Q|~O zez2Y+zNESiBgx5rtgK$yU)tM^m(|J#K=#G~V*&7=1>;23a()Vx%Z!8#=pl;bcaa5h zHIfCstB*Q>fp4u|^Jm}I7bf!IwFNoxI%fl!@7sDnE##4vr48(2Rrtobhz(j+C?!1+ zH+F$PHTB*i1CHRoaUH>Zjd>0a^gl5h|G%~TXAb5cbI1SSJ7TzO-4y)8=JT=D`tl!> z0mBY(OsMPw+X=)XJ?hjKO&v#oqh6v+k+z79JVePt9Yo2(3bJJ3jN<|1dX6JCz;Rs%)bH^*e~;fuhpPVId;&P1B<(BU zShgC~*yofVFYL?v1BgLv82*rh0AM^`vt619J1|~UEbS}G7V9mG7i=es=68cEw*_1@ z^5eCMd~F53%YwpqUpSu&><7z#U0JPyr>s)8g{)Sru&l%5$QVar-S1dk#eZ4sKXat) zzv6!x*8d8^`oC@#{+~Q~Qt~&+$Cv0S?uP!lKdauc(0|TFIqoy%OKmN7fMY=`n7>o; zDAo;W<}OAL-6$rF-7MNU!*-VIh8SrO?$2mooYe4>mC9tIGG13M6JTJxs8V(Uc*nhm z&NJ+p_wv*5dK!2L1bAz}7TXH=tm0H@Uug>D0I13Uht&-5YxN%dVq2{WP#M4Bee43k zd7!9nt01ujrWwF-A!GLNJND%#<2)dTN){n=>f8dsKTs|Z=R6s{AOP1lT2?4ELfV$} z0lZ~}5*oH8@LogM7WWpmB{a$x_Yvib4}r{ggKz05>pS(6EgOxH)ofglBa}i;SW0?S z#XN%Qwi0zd^n79cNA73nr_xi@3q0Vrm!Y>gdVWdF{bv4;p!f9PTeog~7XRp3|1n32>D1QImE?NY*~9roH+DcY+iFkc=uT- z>Qx^ET^=H;l$ijz4wSfGvI#0l#P1VIKq4D+bBxc+KC};NR(et+zNvhyi^(dmNYl3*fD^=X1h) zJ|BI4cx@95IS67{u7|I$3a&|S17&5ru3T0DauR3(^Z@r}fM{NKr0Cmay&Tl*p!9T^ zC!H#_m(A>Kr5AL*vttF>4K>*wxW}po7xc3S<`r>%#c_6D#A2PC8>!ydJck4JKelt{ z&b!f%y!ZY4_ltc>{|_D7?~Z3j|L8qzsBGP+7Uq9cRB%PDp{)~Yiw4@@JX{=Y75H@< zr%d2C(xs-I^k`UDtX{fP+=z-3;isa-?(O%)l<_-7>t^GGUAg|UeCaXLwoD)pWI+YI zu244Egs>|cjNg6;ArhZw1Ams~^DO&T#Bnr2gq=w%)~TVwv>UA(_|Ti$+C2b5z@}4k8IOwnjA9ls2o1*mK-zk zrbOLBR;}0&@kdEnqe2PkXjf7?!44=?!nRUrg<7Z?)u~ceHnuM-U7FX!`d_oK{`VBw zr%$iD{{H^6VAoqbfBrn*r}#g1?3g=hM}HjYJ3`j3VVDqHNyGSuS1_Ca+w6DbJmKjehD+ zu{OzB*|qarS*hYcS*p}_Ub z&v-k-g3_gM4pt~tYNq%#X5cf%bXl?_Bg6{kXV{it%n;c+m^zvSWwUa=6b`>Fs?_`upFL{riQ92K7CJeKmXGSi@e_bgUt2IXMdOB5K#JDeKg! zCF|C$E$h{*BOBDOD;qYbFPk)OD7$v)%)Q$s>p!p^&vUna_Uu_HjQxD|DgMu%J>|T2 z&+hcqt5(Q>06#Ho*ibQS=nw&WAbfm=3B&~gv7zAnVDzX_V$7IPV(i#4!f)JI;qUJ! z#s>rl?mIMT;zWr#Bx3Sp^hOVvDUKWt7Z2_yircp`HK7;BB~I{Y`_v`#o; zn~Am3(Q&PCU^rMK4DW#&p|XZTn5a?XL*VZ}_&I(b3apkjs?U+NYWj(ZU5{@!~}SK3YBFja-eN_2Bv5 zB6Q6fv36~k!2CV2W5*7$b?cUwhYuX+fq6gqKZkpkjnvfCJZDax9DDfi!HeJT-1!LG zA5NV({@~Qf6ZaXXPoKJX_RQ(KXU_uR;djoRJ9`^*#&2QX=uO6@OBZikzI^FAo+G_} z<;vx2SWh4d&lKa))5wVX_g+Q3j{fO~=$HTf^Mm_;`Ez9CAOEy%+moM1j@~YANiA9&1b7QH-z zNhXdPdpK#y;<%(mi+)a8x9(5LJ9eaB-Ld1&=6(APFF$qa#G(rq&dB79rmoLu6 zy_^#fab-5@xU;a9&rAl^besWxr!(+;M+kEK;5&Ej1l_oCZ5%#pj`!buO6RkGkGj#9 z$B!Q`iax;Q9z1wZCO$sCbbS2t((oUp*epm(ODkalGF99}Qqs>= zGBSRdkec$#-Pf;0^n(Y#JiT=3=le^SM&8Dpyqg|wYi_uC9Jt}(aRvzgOl1G<+3Ox2 z*%6MHpIuHI)v>#fq1B|M3l{(bS_ z!i67iE?Imfs!yNLNDq$3O2CGG z$F}$XijV(`|Ba8QLhs-I;**vpB4Xdri-!;C;jLT$b9>jW7uWp8?S?H_9qHzF0CK=G za21F!w(2$RYsAN3^*jFU?*;$QM~{vF{M7Lx_?)5hyCS-G4~>{K;bg?BRjH9{*8CE+ zVuiT2b?YzZPoDhC^s85s>%4jMroi9hr~fbb`e*zn`>OPGa>bJTJ0K6woF4L>)8CA+F$9s$Ki-hoz_N- z9eX%p@#5Hs)vJGrL|zxQVS|X=v**v-&zwo`fA{Vio8;u=-2ckC*}sy^AwRT*KbVw~ zEUw4Ap=S>tiXU#@{^i!8LkZV{0*^&@>B4cr9*(m<#?z%L{#{#Uxk|LW%g{_}FJ z0J-9!gamr}^r?7!@1D4O>C&IBuUd6Ia?qen$PYI{22Op*7JQ1|PknFl{HrZ=9{+bV zqCnLj5w!a)Yems5DjTi6yYepaE_TxF^buB+0ry@K()<+B;ygg#Z zjC_98Xz{bQx@${vR z4exPmc=Tv$R7l8~$nM?OB2U~2Il$PQjtf2^3y2*&&H$TH%h?(+Yu2rZHEaF^?sXlH zYq&di{&~--Q*VdexbeC&&zbm74fj(_{d2#^xIsnKkAq+nuE)d(t{eVv_cq(Qe}C6L$s+l|@%bD8}6j~*LK1=G@g>5W>!@x%o2{N+n}gmI)h*RK7~^#cbI zBLkoL3k*!#bqvVZuV9CxE;+$beUtV~K0KfHcTPf<6#f9saGdG6fLQOlR#j2tx3tQnmI z->4t6&U+j}4IwOY^yvMOix5He5}cEAt*;7WX)c#ham)e0gb|8{Nn?il27M-<=M7Ho~|(`!RyP|!u_{Cnv9 zFUsC8UoKF;|K-x&y?7DPl29l8^-!OqBq3m-%0|J$PTST36F{qd70-%p5$c;m!lb{uQ| zbI$ZXNBw8r0dV$ZQqtdQCB}<|7)QF#wSvcw1Zo9zi}S=ohtea~uTP2CxbYY0J;B~n z)TT`$YR{g(ZaIHGtcx_6HOswsOYYsqxEuFwV;j>nT&BpudZ_i(CL}CT6zWV0G|MsLhZDKT(7$P zqKFQ6O%gIK9>V}8U9HXr%ZS}a5qwT;pNQb~P4{7drrRLn)7=LdpYA@$-*oq3fOFFA zZGiO|_sH~&TLy^82-zo`kl8&_JhOWS=#|-C1FUa$|7Nr9rKOs8@BQ{>)xG~wi~D1} z?Z`?5DMdL>JmFkjwf<9oOsNgpaL`5rZ8XqE18p?WMgwg$&_)AoG|)x^Z8XqE18p?W zMgwg$&_)AoG|)x^Z8XqE18p?WMgwg$&?*h2QmGT)eDlrszVXHzANcd1|NOx}{pn91 z`r{w}_~AeN;SV2aga3UTy#D&@A3a{-_rL%B$BtKcH*p4Ez$frbV`Jm{;Gw^z^El?) z(9rOH*72)f{pwSCSN>Fe8|N&2L;f6nE92Z(UU}ubHhASceFM1Nu|jM3I@Y#FtEX?z zpZ}M_4}bW>3*HLoow^JE5#d;H#2&EE@X619_OsLA9pntW^tT`bm?JXlwbx$z1pKb| zsJiI?D2kqc{`p?|pOC7jo_eYe@Z^(E*8Zcz6Hh$R_gJAdTperMqt(;*Df|7UpbsPT zKN39l*kc3QAmHFgc%qCwV4t6P=9$VDUwpAd-x=wK96$zO3pnTAb3EGs$SC+8U8Db} zDL#1c;86XS%oP0x-9@{1?_Ruf=gwvNKicK`PwEvwygpnS>%EoqaDBDRe=B{y-MZVi zZ@+{-GSkfKmSwHo$2rihwYD+;Ski6VwygxH+geKA)~#Dt9WKo*<2u5YEn8M|eJp8f zb;x@+VDsk9Yg&W1GuE-L^KkXz`Xla0*<<~G=c2uP_s)3Wfd_``|Fg>f<3IkRgT5pC z8T{tsRsSQGu=9WNlb@Uk-`{oDUE|=lB}UQ|a?9k&lW(0gY0_#h18#XpzgL!(=dN8K+!|AUImdwLW55X3F*7BgFN` zwME=;pOcgOUDDj#-0vO@x_8fcxwSgv135Ww9YUYUI%uR~g3_gpv6kM%-+D9=sm zk_Hgn`b3|YHR;i=W1Dv-?cOwpzofr7-;g$6Yg~6+bHow!5OE3ZN=FGw zy!gaRFM9bMUjBuk7x!-#6&3$FJ3IRan%}p?KVL)l&z?Q|`aOI0%-8?D_av4^%>Q`d zefjzC(;3Am`7r;dUAuN3xZr{d{Q2jfFKCyfTpv5MYj?i&alr-WtH0*$=sS+luH6Ny z7se#-{PW{Ib(*)M?Ck<$w+88c!yLjqj&;0rn{+?N+V*i@D-r_amUTCy);e{9a4jtP2E?qkNZr!>Hy7^9>I(hO* zb^lAj%d!=|j_*(G?}{s~SjZVUXMQ{%cf9bvog^>9 zT<_jJEk(X@pH6#9=26z$_3Rl^?j-|NC#2+apIIL3$2zf(%=_2}bu-Ib-pBrrR42BH zea893wlQt3kJu*m(K3x~0*+dr>*4x{ZQn{N-D0>5YbZCp6Y@;|sH{x*?&-?Q%h(&G zA)mBmK6yQR_Ht!qrSzk;OuDShQsE@YCndk!DdywV#?nx~hv`0zrM%LnvQVd_>7Kfw zZLAm4(587_y00=xKdc*EvCe?A%oKcsyMTA- zUo_yWsw$npS65g1nwn}?U0vmS^eA!gzVug0=^I_Tba@5dm*4#4j2ScbUU}t}7ZdN7 zUw!uR#QTard`9PzJ34ge;IJb{jT-4^&6??F&Yb2Yv;2%10j5oxs(bRLBx$@Rf2vnp z!-qQIo;-lOY11a_8c5e^SvS;+<@62EM`)Ls(qF7ke)_uk*m1mA9#ZO0X#sJbVa#;> zICh*DYX=S;Cp}-vGUuOJm;U0qVt(d*=5_P2(sPP)1?N+mAg(DhFJ7n1CaM191Sa_@ zQzjn*l*jydJ!uko6aAz~nJ~#uo?M>**AoRXFWl?Q%gQHCtoMh9i7KmWf=QF=e0_cE zKpAzJht5Kka@`z4e!8r_p6m4Zan4~r%yYxbkwflFOm%6-V6*py#aH^ItD!}UZ* zs=c!`wk55r8{bq{W9hz*Hg3X%@lEN33FOr`%WGMuwR@cl`*c6!)W>)i@+P!M$E$D3 zWBz!}V;pTQKa|C`Ez>yH*azidEZU{V59?uk#;LC#FI>`w``9-271D_lL)x;Bqu;Yn zv}OFTF7T}LaKm>@nMcU4OV%IuNBt|GJ&fh)J!)PS_c^nizS#GG2XH}~n8vw>eHf>@ zV^ue%6Wq9Qj0ZFi<&A~+9Wev>5l((sO1$)I`TO4-K79BC%a$$MdEmf-I{nW?p5khsZ9I<7 z_#^L2?|aEBub8Fp)2GG&+orOz0^1(@9s5VNQG}kdsWPG5m&=v}()r=Kygb%R*C9{# z8#ZUNb|J6K%0hqfnzY=Pm6?6olv1BO(g-c#di9EJ()$nIrRyb>m#qd4bk4^J7^$FOBz*XMTbDZJ8g( zVcq7}8oldG(c%&4e(}<8)yLPRw{DkSUBemQzyJHccl^z7eseO<(Ht*&U-S92p4HtU zS%tkK+a*i3f1cMlh6^$NLfsS7FLJ~><;R$BfQ=BYi9Z)e?u9hO$_rE{SNVm?C$1gZ zDDG|YG3F6-&8!ph^K5+epQL%#cN{k_ufT;kY#woc>tFM-ywJwt=yo6TGt)3n>V!72 zjCyq`b4=r!!&we<%5AC>@fz!LANv9?F+Zf79mI8J(gb}*9A?f3I>^mj zOXhWgqd50~tGM2f2HIlXaUPl1F|TDBaGY)v%VXO^*L7&!*oHK{Hmhf`F=7#t@!0vq z0!{DB-~W}KgL{77ym{ALd+oJziShGn55E41C!W~qd$a!=@<3+}AGztKo0bX3Z!mx2 zmswfe>}*4H2d>2@;hZSYT#l86>pVN>2|UdHw1jw`l}^KX9`s_gq5cacR{}6zgmA`~ zzK{9L2hhGY)lKJR_S3vhs2}q}8r#MG!oAUS#{9y4IA3J!a1Ty0uf@VDN)=Zz!TCSb*g}J299rN;_NzNQ|J^EMAWoj$6je)m9qD_u6y@v_R?i#u~($slxEv~R#sM19_x%{aowb$Zoos! zeC{*zva_>X*REY9Gn=QX%&r=+T*`_ATD>3qm^h4LNeD_y&G(S0Y$-Y!;$a{6R` zojY@uMBC68`JpUJbI*d-ot{^-b+dlyWZ@y;2V4c4#^i_LG{~)>qje_j;H{F9B1_pL zo%PthYcFKimS@D-@o`GEPk|rBgGMW?6TQLuNV(T~&>=Qw@DkTgd91@3ndYrN0`B7a zNNF3_4{u?2;zL180@4;|Pl4|62~^f}CKB&SiP_^9(2smgi|;Gn`i0J;4u>wGL)OW; z7cxjVGTVjyV87sX#q=HLrXjU6$P}?Y(fzm3`TEU!_St7Ec=w&}860o#@?nEu_uqKq zjhkhs{E0PT|HCuT5jY+?bg1Gc#GyibRep@F>nvt9Y}io62KulMRu^9%JmWJJ7nibU zCbyxlD3{?&c!$01+_{U!>tN@j$V|p3_8@%v^UgcZpL5PRf^&6!PR9K?{;adk@@JoY zrey88O>NU>wij3)eE{v-M+kk>KfpQx_A=6BNW0j5mo6b6S_CMI*YUo2JLo^qHhsqa z<9KmxqyTfvJhMh`u;w$*Jj;LXbDvXshVI+>bI%RyWzA=vd1eNj?$0>m41d~br~A`S zKfS51v(G-;@Dp%%j@qBw49I6(=EvDK^I*QL2|f!t5WR>U7i4g`zPf6zfO7lF(JADs6_~5XA{nvlZ z;ypgzjX$33{pe%7_r32uL9vM9Yp&VzMb^$bkaNg?ty^*b>Hd;SE^(_@ul54BV#NwS zXU=TV!2r`Qq8pQiq8$fKi>6Helh1yNJ{@$TG6$VNuSy-M_SFS?KHHsq^2z?wpZ>IC zzeTUsm+t8_M7 zMQZC}PbIe;`zv~O>@_L0t-aTM$mc#?PJTb53+lwO*e2f7r@$c>86%Db4JBZ65j~k6 z%Y1$U8Tpyde8zqJ<0t!b&N8lv7S=y4SVsUEt5t9kN3F;@}x%1$)IF;^#6S z&CBdB$quszG#8r}eKMbtl3+7LJ&LRmeb~N3Bgh@>4&+Q+8-0^6-DBr4!kyuPI*iA- z=;lO5B{ocnrQ}E5P5r3b!J}k}>3Qk;W_8i`lv6j+ThUgswZRwIL)6jO@m$}5%Z?p8 zr9?yDShsH7rn~RHdo16+;90)c^$m~XP3K46C)IPtANtA?ct&gPL?0x(xj(nQ46^ zkJ$qN9UpBm_7E8!?5OY@Ci@6|vlrl=y=PBJ;RW^vpqz1$qx3-?`e9A1A>sg?jqMHX zPzQQp&a9s`qMwnU%$K^X9XkN|E!sNt^w$ax}W^yC!6}< z9=$^z>t${1Ln8Yuk3PTy@(WtVX2Px_Pk8w4ym@mE+;h)8V|aHDTmQGe{q4uaTkk&} zb$;ak_q^vlCnyei@_+yLPZ!*G-+lkZx}XK^vxD~~%S`X<-2?~Sv#;n~aHRE{o~17P zr+w110F%9*YcL&wOo#u)qte3_e*XOVdd6kC&Wr0Toi=Tn?1(vb28@n+-}~Oj{+O;@ zym+xwKYG?^rqeT0Ue8B6U2~6}=GZUMyxAA%Ve-|VjjuWA`GSe?q|I5^mNKp&IdiUS zcCIg8w0qKo$1K&gg9b^-2SlUsTIamRlTCHt1M0>!)=%!OEp5ORbj^I27td2r2b>}Y z(TngtYXP_PiM#-`4|?`uirF{Nw(6T6q)+;0e)LH_@Br@U8~O%k@IH0*eFp14k$Ki8 z_Cd;6*nju}^u;}K2DP_%1LLrVqzUhvuGHSxzF>bPGT9+FsDmwpO(GsOdyaLn&)|VM zYOM}iobg2)oTJ%ZiyzH~fsW#Oq(7Qs5{WD`-Hi^%9w06OuVRnD_s}9X5VioeAi7Sn z$JPSQf$%%a0D6GW(Rt`Q0DT3mQwLf@4+GFD{Q{BqNCEgc`h(cA&>Qqg zUS>XJ=uiM17HJrM1n7s9dd!)7(%28z5vUi(kMkl0FU%J?0q)^_WGg-j>t$V($2P2$ zd+-lUV<#Z97cN}r6=%Xfvp(q;-lq@wX{Oicn=!!CZMWTK_2E6ms0@(zdZ)7q_uz$b zSP%2Zw}EHS&8&qnSTpsomC=>xNahcZNB@{>_yvG3@rl4$c!qR_%~SFP8Dn+=YXKkB zM-Rhuj0ZhHlj487Zw=S<%RZ4}^WbAZv)CbwjeiRcSr0g-Z}^(IbB#@k+@&6S9_wI# zP>v5of2>!$@jrTgZ|h4hy_C;+Uex#S{qd~xBkz;ShCV_5Njp93dz1G657Iv=VjSpj zcwaWZTeN7A?X~vP{B6;YgHHDE-|zPB-D`E=Q-Mo(*8FkFTZfH~&o3Hts^3(HI0ALW z&n8Pn$7U-KBY@VIFJErDg%|_-2oGvcO()9Ua@c9eYG@z*PaV;x`P;OC=Cy}*&z_~@FkE?zfW;&)?flVab}mc4g_!W5|xo^)pNY|SWj-H1P zNzv)-F}P+gnJ2a+^MYrio~JJQL;P$uEO-asw4rUJH}(?!&%BWv$PwwL6uMEm?#H*^ ze)}#xx7+K#|NFmBC#KJN9z6fI!uL@Ih>lLsxqp`86!%MCG+^ID@8|;fUo>U90a_8R z%-3X(*?;f_{=px3N%p|xBzw*tKs%JfFO*XsTaA={uqEJS^geO|eNGwufpg?PWsHq3 zLI=Sw$sSrC&?&S+d-`Uq2-vISQ%*nVKk=fK!+-DC7w>PMVF zKlDjk;w7|)E}=E{8F>laBd?(u_8b}nH}s`??)vMm|K6jIKDt)=zKCyH6W8O}y}vb{ zkGxNct)g!X^-%o(Ny+~=MH4A>Cprb*M+c$1*+=b->1ffsot2_1km)Kj9fdAs&(S5& z03ch;^3X-d5Xztj(V^)u$shBpBpXboBX`k5vT;pcqZ83{>;t|id&Ia&Jjvq9s$=$m z=*QZKcg^3#PS%(Xnvfl0{v$eq{YD>SC!&AYXLJQTB|5fp$u`sVi7jcmQ0F8TBWJGo zLg*uSPx{m9vKD9$-2%QC2b+O8qr0Iw`9r36@GFrqltXji5dK6@GY`$lVkp?wYHvO< z>!J_liX31q@E~)g57q>oGY{k#G7>zZXTe=U>!#=E3)x3L^T1Z2FYJ+MJ0WZ1HL@Ok zj;)~nY>${DGMzSzfo+laIhJD2`bXPTAh5z0nBcAOnf-vnJ+FAK()CBbi|IAbPXC z77pLk_bk6IzMuEq?|!%Y&wu{&Q^YSH`CI3Ecptf?bBXsW{#T&2?H7&y7M%diVb8<= z06rx274Sh`a!1v=mdNa{8DrY^8(OS_`S4=`jqjQ z8*68c*qro%j?q7*+gR`r=OD}#{$?)V3qPE>z{B`P`i_&Wg>|te`ewc8Am)v1Vh&u> z9({wIj;^6!d|Y@6Tq0x1Lyn2JO>ct-=$o|y@GyEB*})jBk^Pa*GMuwc>M>?)L&~1T z`?!bjc-%w!!5?Ct>>ofm<3SUYF*iW6%xp7cAAmf;)&h_<0An$C@Cxpteg((WXHAR^ z&R93H8CizjW-RCexx{+FEp)-&0@P)G^usvNA37ep1$oJw>6?6X5c5KQv)A-PUF3-R z!Ut~D^Dtl4_tR(aoIcO&@w_hQcz?_KK2!G-`xkCcP~762JMOsSX6@l0u>qk+Xc#(& z&%rroM9?1l0KULI_=Kmhf#I`En-Y5rpbq;DZrNk#9Q!KP#oj~if`4pguGtgn!cXu6 zeKRKQ*hlJe4PC&y&^_~`E$y&H(a+EuG{IQ#CFRTsSwVZQp__PqL>p+Dc~DMU^er|g zbyz2K%^J{0%mdq;IZzJY#c|1J9*hh9#d$I&WyslBPCLe6t#NL&gEvUY1Mifxe%3+T zxGv@eE+|LNFmLb<&mym&X>iDxv|)VK2he|b7eYP2KE~nshFRG|B3%$rwM;%`)g0k7MFZ9y9qlAxh#4!n-~2eonf}M_QUK} zY+H0Rwk`XtI#w4u4q1Z@#$Iza1wF7=+7pY@NY0oqAzF2uC13+GN9;uU!frzr(HCve z!zwpBReNdUh~~_;6`fg(P4r~8Hhr-7%pH9pnzu2aRq?5fkKf1oG*9yjurbloqMs%o z0J@Vtvge1G1O5m!h%E{Kfg@~9Y<*~*KA=y{-~0#i(VwgZ`lWw-E$Eeg;briRUSnR+ zsc7C}VbN}94e&dB!1&-(JZ9snZ?pAPZnn1ce3Olj9%YO~XWLkeCplr`<3FG$wJ!51 zSQ9oD`x4j0n37-SXTeYGZ|qn5Vt54)^o8yg?;0MoKAQ*i>5Dx??x1JHyXIT4ZpK%+ z)e+A+_E`9B+B@)qKgHO{0_Y6>hGvj=_ydg3UP3#PEoSTE&me=4y_(zW`ljUr`mdVW zB$m$^-Ut4cV)>bTeXQ5QHP8N*=$VBtiB3}B4SvEl))~A3wixnQbY*&kb9~N^IP1d> z=d5ny#*JQnlAY^u&WHWV-eXTA>#@Pv8}ncN%$w&+RzW@fyjF3g*jup;=9lXG7Y-IKZj1xL6l*~bB@V1>w~t? z3$Yx16>TBruNZ*M0XvnmGwew0Bj$+y!cSn1^vfDqE7zT>$5@_%z@PV7~a|0N1pqAFi>HFM2|Bk=nOd){Tu8$XbYWz-Gh8&E~4FE$j0CM zm9KoIf^Tjnv3xtb|9i3Xk0c8u-}wKI3dy~L;?vi~=P7i!_SfPz!n5g8;ojsfx{Q4j z?O7a8xVL9vpcT=qogJYov2(Sb_ACYZ7QPbQo1PI}m@X4dIA{oY9DQH0Qeuh z3(blrO-G=Ukpbkxcjy%6CHgh}kBtKzGA=q99+lr}&m*x0Xp!-;ztKz39r@@-^dEGJ z-h=kxefofwu?gU3>LSm;5#{J%vw2jX+;Xifc-4}X#GpRIpjQa0bjBvbf?`xo7}h6i!*)Ra z%f3wMn_K@!@8qo2`*``-`1tlQruUD)_s9g+sWpFq^MC!{&|TW|H^4Ra6gmm{&0b?y zLJQd6ltW9#HbUpS5wgY;Z{6yy2x|l!n0(anvy=9H; zJvb+}N59~iere0zGY{54JJwEJ_6b^GPgxtd(E1x>EFK^m(4Gt8-2nLmPS5LjJHg=;wM-g zwX;}+XxV8!UhiDlb275M%>Dp(#Ko}t^$eETWZ(oF9Noy=uowBy;G+>sV6WLjd{JnOa>he9 zkVia#^9E=XnN2ymAN>M-F*d#jz9G7aa&#;Cj0r8%4}64PjQt~D(0}MC=1E=R5%37Q zg*6}_SSMqnUuX+pLx|^Xjr7A>;BCtA7tnS12k0&2B-ii<<=7th3djxS$oRAcmy{F3 zMyBBlqqC?BFQT*Y=EVQ1(^#!L_LpwW^b7XYsFV# zUf=|tL)X$CT?!vV1C+79;2WILFXOS7!~^IbK4p)eH+Bzh=wCMe|H!W0^6hVbyUE5^9N(VT z!S+28U;Lw#iOx91nbVkc_PO{a>!EbfXthBkzElgsc0a+ZC;CV(!~ z)?)JFUGqb^$M)17Ha%;}zKTCA{>xazlcB>H6PCSZzB2j`KGIw)h9Eg$W2n77^Fv$a z0`1@f!fT=nE29tiS~jqi6RW3Ov}b*bW@2h{#|{w1Rwl46Ej{wf#Q|iJOj1O+XG5!K6V`3LDKV+Wx&i0jYkh$zt!gJL7tuBJ4K3pfF(2#@+QWO;80af} zXzX0(25#sBnS@Sd&GZdWhE9janG-fXYsEGKpWuf6*$euPbLN{20CQ#y;EjH03(%I7 zanaw51D`Q}=0{!d#e3fL!`k3gcprO#e1LU~9Xn3;RQPTN_6#;0_Llh3=80dR_h4=R z;D5#dfB5F$p0P>6J+hCs&;T|Jw1Q2*Jh2@apMJ4ds6#%q2Te#;n7txArL?x!^uGN* z>H1zj``OPH9Uo>cbw%S@;JH`&gD-N0$jhOzIJh$gUp(EM(=3j~jo8I?epJh{;k1E+< z<)qSMcHWMzM<(D;!~6L0@G<%feJ8pw9})i+KLVc>{e*r%rV;0dwi4bqe-oXJ9nKt~ zf7((mKC)+;DM#1hJL*Wu1ZyjKX!VfE=u_r|jmDhu?>T=}+{7V|!6~|(dBA7baLk=Cu-Un0 z50Ov8sr9RN7NcO#ke!TyT@6l=nZzI9edHSJq+jNa9;PmH*526o!~>8g&;@vB4E!(F zPv7vrWQy%8_6)e9FLOk{Sxp{$z<%LNBF|&Y8$HCn;nT6#w2kGo zr5rs+JLQk z^Gs;dbPn^vt^p{+=3y?;uSU-?4zhuDp^xHt@FI2LYv#nfsl&V(9~p$s1y}UJ{Fo>0 z;6c_9+kkJ@7V*Swi@$O{Qd>StSk7g7XOv^k9Kx~SX?`xUhUYGcttxh9 zxFtpp|D1jHS@<%BE5;`dN?l|bbHyHET+S|JUzx5JzRlkjKbjt9Z`eEVt$I%1d$9Si zFYFz1k3PT;Df7kts;a6K?(59XK^B1rjbSPHR@~R@9^(D@E5scVUN?HcXJ=34|3e!V z6A(Tv&hnYhoRa$3$3AZUJ@zGbCbEW@0I|LpN5&7(d&@tPKR-tQmvM^p)d%7EHv9hQ zI{s)f03QH+>KTaPdJo`Vq*MN{_Tj&zm;OzB_n7GV67Bo9*%SDkXaC?Q-u(xl8_rjW zaj|#3dYS!Zx)a_~pZ1*)Qfx_N1HL+b>SK>R=Jjrs*ZB-QXnGYnkDU!Kkq_wG$@aXR z=*RrhGtM~O{6_d68ocw)JH5WSX6I3#|NQ4o55wQ+DA|ZM2mQCQ^@X2KOaPt2J2DSE z@PN&avn=Z5%G1u>7RP)DJy&N z#TPBMf$xq?mhWb`1fNeo{j|j?klW+Njg{?IBRyPVu?cW3KiTWN$Lk#2;sxk!Yy#$} zGcvE|VyrKo_vzP8&;LQ!4eXvU>T8&r04jaPEja;<*8M8yi`=^)>bNbNUo5ru1BbJy)Q!L-TuO zQ`(s^F#`0h&bsC2E)t&}}x+Hu5sQVWr zQ)fy}lx*9!b%%KQ*VrNWKlmreXZT%y#5ZMA+^_zBL^(c%=Jkg9c|q^dERyb6s_TD| zAJB-L(Y`baCog>Od*ACOdACpd_y0r-FKhmH%SO6X-=M5U7wJsuO_`@dIuYsmM%|NSiK81&KPw5oK!RC{k`GjOZo!ajb&s?cGyOr)%pO@=D)rv(o9};hGkqz^j z=sOktc+si(qR^sjUOUgg?!+g-hmAflK5X>SDF>)eJ$w*oAIR*7@>qr)6w6{e`amb* z6Js+l2L3R1Ilgb44}HXX*bs62I0wpT%NW!pKFV06K*x@q#Phr#cS=e!>i1gHx89b)+1Fs z_XOIu%%_YokS&Z8X(P&k%syyKAJow|4L>1$@&n0_6me_f)yM#NnphtE7lGImc`+Z} z0=SQHE7DjmUQ;KtJl4;w#~7LQW8blDY|~o3*2>7s>?8I=iahGnDa6p^Z}ZH-Ymzlz zlb(N4Hp30Fk><;GDic4SE}nZoxQY;Ef5a~-c`eIZ){FO~nQi})>r6UoyAI#xL58wd zyo1a;3T<#?9DpaC|8|s}{v+A87JtM(C+;pDvu9hxD@RPx&qu3sxN^oo#=MKaPYqJ?LX$_OYM_QwUGaqSKQpr$=c}X$aDmLWSe{ldV>FAtnuBJOXxG% zuDp};QQk}9J7fHZ0N)kno8pSQoF{+0T^k&V190=LZ+)w$Y}}vX>*5P@?uCzx&mH4& z_|EZssbzYkvX*sQyKgP;t@Qa;>$0X`^9Q{ze?O(Tn(@BuoiECd->>-N8pR$*D)v^w zw`|&I=TO?o#0hi+zrlCB6AT~nUNCY18}r?e0r)?R!S}@&pZ^S!pH-~)a(jL8i(jl( z+_+ZHRrPIy)^PxS6eF0VIKuxBAA|RGrfz3R@|*41CHdG#O!2ReR_AEtZ>Nv9(pLVy zouA47w=+h?)i`5wk@xld!t;tXeqQ+4jqX=0Z@l8~gWBk)b^3{T(fLXr#i43+uF)I* zgAd_Ho-;_EDSSu&s~fulzQ-ryzd;pasp7wb6gQv6zVRPoicPOVhPOfMI8gk4wVq$w zEx!LXHa}-s#HWdq@$3jOJ7R0cBfQnQ#rnt!Vt?Fo1{(FgVgN76H+d1CU(X-htvKzq ziivLDuwldcHu`Cuej;9=Bc1VFqBEvN@E`x>gU_Vr3%gzo;K7A{}ko~>2v+uki9 zm0pBTERFf`p0bvCE$^wznRRRv(^#)%|C#qK+r~CArQdknTB`P(;n_P?^6M?-KF&wH zPu^?rzRnZ=Mdxr|*15;il7SD)|G7`NxvPzC4y7A#5_t_&7aaU zcfV2m?;8LzfSA9|3BICd3SMZVog>nY@fLgrzrlC#A2LDb$(QPXt)}b!;d0^t!~)+b z-q-o+C$K57FQo6cV5jMP_F3Y!qTg>Srt@vtuHRBD={rYDL!DgJ?XJ3qNpsa#clFgG zP3Ng?uG)4_(nI<>{5+0jjxE=atF`I>zrO?IYED|O(%fdL&Bx|(csz*SzbhZVLGKTw zdh{su-MV(udq|(;T|uYwDBd?bVtS(L=xouc{t;99qMpvQtnU*~r2hNtKITz}al`$4 zGU~=Qho-S@vs80_uliDd_WhC8QpOVh^ZYXJUHt}n0f+1bzbzf#+$=BEYud4Cii zG-PLWYZNqOb?a(rx2|0pb={!W2z2S(p`lZ! z_IkETX$Pg9IyQ9bcwuA5PVE~yD(%#vLqo^*7bv~3S(?skuQJtbuQp0)Ykkm{`V3=q z3aQ48^XSsW=F`}%TNj%nbJcZY7HeQF*;%%x?%CN5-LtbAbF@aSvoSZPdxM}+``wtA zm)nr1G(SJDp`akYQP5DBU(i@wRM1ddRM=QjT-;DxT+~=vTGCKjQqtI?w6sCjjlFu7 zH&j}iSLIPzi26m{p)=b#mWs77Z9E4S)cHJjA+1~ zrO`Z^p6lT(9pL$#Oeic0-;n0aEdu9tEkU$&$T>Y{{KX~d=ML;%c_qb3-J~D#88gly zGi6NrrjAm+`P(3!)!4UhzXttZxzfH3wY4>kWsN<{ z%NokddNk^}$OhqD`%>B{JHz%w_u8Xk+p7}oSxE_dSD-yCYA7noZ!9V(Y{)OnYZSdV z6y#~|ZU1u`a&w^tXd=*t=%q17G(u{8k=?CP^kcM?mEBFW)}>LnZqW1DjeuxC>#5Y- zdp8v1=ZHr-HPNW(SG*$H?F^p;8t&Sq%NwGNKNJ<_y;f3E@Ke#i%g6#`hR%upN$)4# zqqE~pdIozacE6q@IqB{4zU0RzzVXu6XKmlMsg)>PIX8fkhFPTtQ*?WN9ap^s_)X0B8^9?aW#I^d^9KRx#n0B=E{1QyVlUNXIVo++dQ%xQ@l?*cI+6X{9nfC6z83zMkVR!Q5FvwHELvPq@L>) zq8+UAV~Gr`;E{DGQC%?@>I{B34e%B%0*LUN+p9*0=>^E8mj7@692$QfoDXIfmZ^p zMqYu2;Rnf{RQGKDN3E03&gz;fD=q$$X#7Xw{qGPnkq>#lo+sUQ|NZxm(DRL*c|P*( z^1gihyroMP{|1^GDcq0O`xuiZ>zhy0_5R!peFJ0W3`@D5F=Lv+bd^n?HdW7nPw~^H z2AHaMQKn7_Fh%K@rQSXr?AX=Ji^i(f;d@B&z(Khzg)IVbh;`la~WL`E$ z&6D{~pU(Fw!n#<`%$Z?*vu5$V>6w1EzV|U_wqOo0+s_5&&hhi~9qsw^1oP+V8TR=G z3l`|VXax)Py!*n1de;qDw9qfs^Yx1tFY-(Dy!((>M8_3jL?!C<3O z-iHG=ZQNwufEoXPwr@`qr*pW9wzjYu2vztM$JQz$$(J1OQJuBQU(l?=>8*(04?@Cjfo{ zaJ^({z&m>YuqOuEANFbC#S8R4fincfY0;l$YkZ$riR9q}oRjdJgq~0D!nXw8F7L~CC|)C)6E0Irmn`zjgum6RR=QQf zHz|16wOc8A6}U@`c9**qM#szCa_D;bQb#-CU+;y8-bM4ecci*^OSA{NR;ustFJ9yp zYd_K{-{`zp`xMg5>zEhQbQ|?SUrQFH`_|kUD;d+~!kjcey)(N+>sw}X*8KI(>hiFb zOO`jSP5c+v?1c}#8@o!px7xvn>(;K(yEAJ4EpDs$W83zv_AcwCdM{`D_HFwAflKwB$?bXFMFb=~#XyK6}WiYdF0Ugxg6*76SD_L^&( z#)xBS9+`8ox$W5#=E|IzyTH~G)^vrvOMK;(m$PPD_wL=7`OAd|-j~vKf}36TKCt0z z=Z*x2mp0*4conYsmZ*W=gXW#7EqZrqvt-+5+Z*->*(f>bHc38h-muYaT))BV+HF|3 z-mhD;)^E^vMvzPFyJ#TLf#_k)8t7uB#2@07z$f}2dC~G>@xg+N=KA`&39d}91wW#Z!9sYw0r0UGH8lSt`Dh zo`dfeFA+~l_rdSLqQ&BCy)O#CFJ833FVy-L@lJTul?$am1q&Cd>?lCJrgrp!&Q+iE zYh!2}#(#WjLGk`2g*X0Yd4zsGpFMVr{i)#`H(%F7n`ODz&T!E0)3=Zn@U6Oft-PN#Dx0HA%Ne{zq5CZ{m5=(bDIp@5Q?g{*~=@ zNE&(n;)^fR`>oh!%~SEZGdU64E>a&RM;1C{fcV}a1L&V|ZG64Ux&(Q&bdfXpv~00M zUP*pw4cOwc3*dXLWjSjNa?aMx`q^uU`WD{2X3sT=9^Pa2 zfbud@`1e}mg6VlnlY8Vv^SaIN_guXPxng5ng}l+YCWB1BW23~m1=}Ue`3kccm>0U8 zZ+-CXZR{Ro-etRYS$f44m#bgNGub_|o5btbP=+hRo%r5tD&f`ie$ew-^fQmboQ&P4x4g8Q`XWL*Ekreu10xgKR(X`#Em%_j3KzZxs7k&*~d#w@>hw z>{#s9=(`ELE4^wp@_&^RO&|xHctW~;h3w)LW(Qs+d8X$Uop{r}@1Xa=ZT<4I>>KQS zqYXM+F1j;aBzjErl7s(styD5V@&FzgKW>b#RNO#u#AdwzPU?Lj zFrB{|xn}y`=-%`{Hb4B2{+Im%-%IzKP2HsbO|FUG;eXa(Jg565=zhtxsQ-;moAiFL z0ghGon@q^m|MX+}AAZLM2;(d=Ihxo2noE=ZM`i(u{x|;DT3CRyYlV17el1CVDjp}D;fb$^n=|8X4V0PjagmIW^2jTH(Ow{?EDQoSNo;+ z*88d7%lBh{bEY5h<|qAN|6xDcf5I>H#eTW(R&@rv2XfnJG8 zOqejv6JO5G%4){@@1)*;_0?C6_wgw=N?&2`uU@s3{fNyqcl+gI#~^HP>35O#Oe2WWhCiLhNAA zwawdP_5rWM|BPdH|DLPT`X6~y!iiSTd#Z~vz5g67DGY*V|#CtU!_#n#`n_uAzgpjO26>2QEuW- zJNnTLr?}y%ll(yc0XNQ{>i7HA?h${rpW!?E0jc-9(Z4<2UvzM|Teabm;P1m1+Hd0v z)BnL9g#WSWZj}Cf^sz^ro{h6_8A%4XhYmi(w~?Hl%QgFs7?OO;z$@6uO?)EVl-SAG zs@TZJ`#OKn*>E%7e<$_6zMD{Tqvj^wH-Cs&2EJ{OaTf1u=Ho>F-+07)fAoLi`!7SE zwj$RO|KEK7CjF1Ep6T~z>VK6TH3mS8;L!HO3PTJau`@JYi~%4MkhS3@7*`2mT~j~|Tw-znXn`2XmC+5gS;zs1bVr$(=)^?%U6Q731n@GAEF zAs{`U>Hmx0{k5tG98$MMUgUophnPc44@8n0XPb}e|xZ*@cku64WIHK(Er#00C?YYsdVqHv;4dl`ufQ~ z%=Qz0(aw+f-Kl=e?@sfZe?P|W`TYVv<5$^!+>hJ&S^re!mt8l@uUSvbmopd6UIf~E zJCBk7A7f+eHNHOIA>+GZFTC)AM+Q8hZ>Bw@@0;Cr+ihm2&~BM@i^a)Af1F9c|IK`V zv-uZT++Szz@2cMa$xp=lH{K{Z5%0@(v9+xzN@2D=Px>gk-l#=U7&gkllrl3Q#_EqGvoj< z0OpYRRzU^?xoh%j*)r{ecs_|^*t&xMAAA7(I`|*EXr*L5`v{Jr{ht{FlpWAK1_=Kn z3xr=g2QdGi^EW#W5M3rRK>Uv%D_g+)-tCDD*tzpk>HZM!3jTkv|Dk`y0?Y@%|5qF! z@J);X5@(AtK-chOCcuN4asZz?mLJ03djikziF~dY-!=4y?I4?+cJvif<8S%>+y}dZ zIA4fITA9TquCzALU-BJOtB*Xxu3>Eey8lY?zxA&r+0LTW$y;L?3&I;q z(UBRv&-vQo1h`(LSQlr0HSap_|D|8|GN{#;y zlZJBY#db;B)Gz%r4)GJl)mg920~^bH1Lh~&z~&p~9oC`sSR4>}AUkb^)~j;>TfgB! zvQTm$oC^{IlpK&=P;4mJ1QrK08L-x^*I9Nr7Ys4L#1=@-1;g2s&I6OPDDzh>4rnnf z$pO){{r?=_05n}ETbDC{%k=GGcwo0|W3!R%Y!JHud4OLK`~dVQHa50hNGbk+th zibsQu9^^w)JTT#9v(LqQiNB!Kc%5@QlNZg>bble{h~8G-A!mAVUd%K4Eg_cC@@(%i zw@Wd8&h}XU4q~Cn86UAhJ2#cg5LVY%lVO$pO)5-30yj*}H7>>%D-IeS6{k ztL$7F{lz+nUlYe#&$+f>t$?%7CRwrnVRC9<|8ay zCRqVU4mQ~dl7&m9o6RnlZH|9#@j~G$opRkAERLtTu^o0)ufQ`*r5Gi#?Z@58aqVvr9v3<DVCiqb$f8WQJr4K7!c__H2XJ8PER}E7aO89*B*A?<0AK9Ktif6!^`TOr=tj~B~u~XT5CLiHwU{qwC%E(9`wTx$CdH*3#>s5rOV?#>Dd|dy-UVPSC4lDDh{-gF+hbl|sv+ zH9d<$y*;8)uo;FOLKJ06FGR(z8l>>&0TA8tc7*m zqIKPJ%gy>OepvUdic1rx+OKZ{gO~lc-6lNkcem?1zqcQ_-581OCoC?r?YA zd8d5YJKf!P>D%7--0kkU`)+^lJ@+_)zwf?#6~DTdZ))p&=sx?l_5%;x?;g1Se#MO+ za1TE4pnvG#L5qjUcXarV4?p~fd-&mpEk1^g`RJpMIsxChc8@(~De-3axMI$F_rrbR z3s3O9Zu_5GQUTxJR{E5se2e?(r=NBLi&KT`FL`~hMR_6BwcV%Fm><)m{As0M5? z>#r$goTr|8+J%(ypVYjba`?q@ewuGG=f}eu9)H|F{`lis*JDZ_OV-JHAMuYo`iNuw z0>g)JVt9H`u|vfV-9g3O4<39_IDEixDZI)jzu(=jbGZBOkNCdN-FL6{K{2^|@44IG zbFbj;yWQP)-=*)P-{tPnp51lV9S&VCP|Wdmol9tMrPJ>?aJ#$x_S^gc?Ynrw-xm2p zyrO*Z$}Qp%(TwrPO~xa)+$@^937XnxG`3HCLY$Cu+x2?(5xZKt-_?uv`@s9}Vyq9| zziHn-c%NsVOxJIhUgG|yefrkC==L7bC~%i(7MzHV!G}KpJ`N~V`~^BcaQgv&hXC5= zTh|7+@3&Y7@ebhD{kQsCZ@Cpd65JxW0o-K%9zLIe$q~sA`A=y;rs%!}?9;vQ7wTyp zCVP-SNgqKbA(u2>*n=>xjSn9K+BZOZ#T?nkIRD$($Njf!FSS0MG2Nl{5^uWmjynyE zukQpWfbetIJ;G7I*FECtd+)i|-zQqT_dfCU{ht?a-|z1iEdmeR|Dbee9HI_ z{xlv{`i%e5mw+z`p0)IuXP))?HiUoX+2`b|KG$^p%roJhyyu>K-pZa+EX(eby3akI z+&`a`Q&)MJeLbr-*1!4-V=-=oXCx~!K=VZ2JgvC{wgy`dYkE4YPwRX_>wV&hCk-U$ zgo`Kq<6n5(@bc(mUyvN+`Z535BaepvWI$E~Ibrxkc0Q~)JhC*A75<>)>;n&my}AE> z?GLg-`}KL9El5^KPP2daVb7Z%&)y=(ZO?80MHAu; zs~-7s&pmhf8*aSbY(?z;CfW$#MvOwfBS<*vG_Lhr0pyS{y@ zeZSg1u1|HP&K)Zp?>)#LaeZnkdAB7=tCUtrUg|oM%+)4oO;x4uQ(fgO z?L$gm6-p~)=jghsGF&UIuIlC0&gK!)-fBx-r8Ua04rvW(%-1+JzVbpE@3odbm9AFv z>#K2V`&4ReRa#r6)~2+U`%2%xZ?)5Xi?mwr=hV3V{i^lONR1oVuf`AT-^b}%X{}QI z2iJgFr)xiGfIxYJRA+GizHacqzJAD{es0JBrGs@psGlD?xW5~!{GrMpI00Y+ zN(bwI*o23nLzE6C6`qC+bVCLYFgy(ro`witg9r8Zz@UNsT))1x`j4L)`@cQCQ>V0o z|39%*@5kGJ9aSjp-Md2X?Nr$RLig7Hr0LytU58Zf4eDK<3P;*ob$aSu9=%iO^eqBQ z%k{pF%3Qg=$w=B$X_?;V;r|cx4$h%zub!$~#yezAAlj+X{@2J4zF0Qqjq+u7>p7EU zuC9K9=)3w5oBy3WXyyiU($Z`N~AOXY7&tgrW3UG#1Evp?x8^YmYkh3EL% zqVs%h@j1Fb%lGVlhA+=P!&l~>>HFkUcCN22JXiJ3_I(NjMFOssM}AWo^;90~*Q!o! zvGUY!ZSi@&Z&4ga*LJV81kitXmI{i`_x(!G6Ogv^{Z!Vk$N9d0j|&nA`Tff;^aIKg z;JSx^w7k6^2$TtWcJPDBJNSXUlnMp|y*nNXz4RZP6$$j}=!f*~?1xl#_QNW>_@RO! z6IjjjbFYLsuF>)Lpo z<%jpt|CF@`wb_28fVz~Ah(OzT-7HnV$vySyceut2pgAz78qL$@qf~1N_hDVkeW=zt zv?56(9>9h0GB|-D6}mP^aMxR@@Ho#pf8~7TG2+0Xsseg|6|nUG~fM#Q+)UHKkKtE5VR9;ecoq%7NF|@pYh$! z)qla0*G~Tnmq54klrP9SUunBf>pDP|(k$I)ou8ztZ*`NjYi!3oeW`tp#?QO(6rb1O zbH1?CslGz|!@N73b+RwW>8!ZWMt_ZbR?d_r*6F{=TH*b7(%=8D|9Um>zWid&oOt$l zh~#d5c6&dhytBJxc)njdy2z~_Rp3{TD%5?RUp^$?Egh8WR}9P7eU4u}vcRnxk?&V2 zU8(X_faT?7l;yjXR;SRd8kui>tya25eX6}*!x*D&48K~}%J*x=6f2Lk#H|@q{iaDuC-w4MCRe!4lY0BjlLb?BJ-NbfnNsOCPpR@-rdBDf z^joIYI9>a#)BCus)2jWp>AF|CS?Sj4)qd-YTBkg}ZAOjXKC`deHlx;GI;+-QI;a7HQ0HN?WNzo6v{)o~u6Xo-~d@+K>5Ye9dW&<~C1roJC$=%~5ln+fQrgt2M>6 zR`-39wQAin`)JL5zz;Yu90@N0XVa2&YE8hUaJp$qh2K22Qfa{XM&WFt?d@9a@jC4_d%kYG_J3TdUjvNo;Z}|;_KSxUx%vI| zABX)5+`N9deqO(PH@8-4|0M03=jPPr__?)tZgx$!pCy>nCs)_q{XC_!s=NEyeRACF zK1yqHbf4{KSLgnA_1$%D@qCc zlKw@hg?;kLr;ex2MU?>-ROkDPtMmKF0)CO>tN>Rwb;;B@ciR|U9O?O4x}fm)x&UffUZYsGu2FZ_Tv;TK#g z6+Q*pgDgL@EITy=d@I$ppVc$qex_2&rwhW~b@fxVkL)M=Iz{_CMf*G%NN50Bm?RpQ zQ~+&=PJn_yHxmmw82!}eLr;OGptVSE6LLl4-7gd!hLr0jFxnN(i}uGu|1F_=njgj{ zv=0wZHx25We$+2~HAi#o(e86Tr(1iA@pG2J8B_hl$otvvTAUxfpYXo<`*Y{c_5~x*cy00Y>&0i zlZv`J_I`447dN@Elb=%3)lDuIt(10kQ%kz0ruE2n!1S{21~baD-Hh@aH?wCNW=Iyy zD3grnNh%stIulvYi&XU4OL{=EV0Ld($%kG!soBVa-Z`l`3D~vrMfYxw$|M(@%9Q50 zASd#i$qLn{E$u@4?y1?x8MOskmeCjW=2j$-$eekSHv|DPb(y66gQ|uLBd&eG%-zOJ$brZFx?Cm6_lZv`H(SV;= z)LCgq=)%_*b~4(i6KzZojnpNy0}Y9uMN=I`TOEwH#)=1_xiO+Wqwh>Q7p;!TycaL4 zo*SK{qm+)$*1h;6BW=1KqcY?GyfU_lXP|r0w#J(&n$11qlRme52R%cw#Lh8w9_Z@j z@AIvZcUAA}d4A6AIPW6X$G0j54hVX`Z|()AYnkI%@%%W+D)hJ3(G14Q4j3a4e}{ao zkr7Jad*gjuKk_2j0Q6&ZNOO=Y!3IG88%X}5_r>=fzK7T0`w7Tv>HRw7xAvR8o|NBN zd@tVDwdf%=ML;V3kP^?Qr0+@n6!eAYYg(D;%VvH^O^=0g_1 z?`7Rh|HJFX@8vmObZub#Al+|#CH-%ycroysbbsKhkoLwV$WQoR*XmSya=;u;fhn$|;H0Vs#J3Fwc7e1X+AwCsEo{zlUJRhD9bwZo842bu! zzVSSK-`nIQd@i0Bk0(4&n&^1+JiML&e6PI`-y8JMz8T+lOHC>5Cb=#B4)1Fpkpq(w zT|Y_r;(hHsfUbw{MGMmP;(O5z^kRBLG9jeUk$7KpC7MI0h}NJvWWac6U36zODcUr8 zS1KM(XdW6?9nmrT4{cMHnKrvl%3|G^!Utm|S7u61<%#!mvO4Hln5F(o>3!Z2n539n z;Qe<`@4uSneR~dSp1xbccczNPPXi0vyNSXN`gMZ%bAn{mc;UrT@%aSlWwVFS&$>4~ zt<kPUOVBTN&An(6o`)7q2bqr7J^HDc{ulqF-+PhD5A2QJ zmX8PoU6`6*k)M)o47ygf?*i#T>0I)IPPBXMW0lE9ri^Rxvit&UZ0vm6M15_k`YUit z`(&jy4mvk=+3?T$YsQ?Ex@r9T{r>tB-WJ?i_a1-!*bnZ^=J+Kl(rDd9Ka>w^TZvRDe$quFuD3NFn1$C0|n$luFj7 zg4|7fe2q0;x*h#qr!f+FoswRc9p6c*?794oDQvijO0{>X`uxr*v-8={1h50K2?6wk z$pYyO*^>@C5_w>BW&9uQ{U8I3?%;jX_0spE&zYwC1K-c;rFc*T@&4@I(%<6$Ip}c# z`W%>7p}3OxcAl;SZ^QS6<{O)TjE|ha#fk-7tm}(w3gtH!x+RJ)tsiuLYWIlGruL5e z;M?Nyw<05u2Um|iDYa$r8L4Hp9gW{jr%To$?*b$|F1*OUF$g>kp9h!;zl(q2>6mAA zbuS-Az6+^*ebrA={C)%M0r>>-_a!3?EC!I0uV6NT><2f!RIwV#fEm~aC5qih223p> zo+H3ENC0183jP6hA-=zC0epXa19;#3ex>4Xiy^`P&>VohDH=6BL~5}vvk^q2qzNC4 z!-mbI`zD%)CnEi)`NeoA@{pw$_}Lmi|Ey0*@3+@;J%{r<+id+oai^XJdg`RE{5tXNt<$vOB?bCxe|JZ&km47(rMX0|^5kk%@@J*3Gs z{4TpbCHpC*SciE1g48&ZmF?ks$-@q*aT-IoP7zbU2LmKuQxo#U=Xo8{Al(n&o4mGE zvH<@cke@fP8Se-F54<1ve~NU&6zPd+5t{sc{7-m4==-4a@d4m_^nK9z(0se{9&DWT`^Yy0ob1@dcm733d0NHQOoPg#4z&r8)WE_5g#{W%g zAjYGw=i-0n0ATk`45*r+x=-F4-wo}c&a0My_3F3reuM6p$Gr#U@wEof`}))(-jmcl z+@s8QAwIwrJm@`)dmHz^iQ#WWyiebs-)DSz_gLe6%L?rTf5u(;yISL3rq5p$y6@QM z{(&a1HO73=WcE+B?xSZ{2BAlrz0QXHXQBJIORXw5Nh3a2!@bvZqvs~Jr%mAV*IXc8 zA9uy~KT*86`u+C%?PIcyddYF)FOYYm`7Q6Qq`7|h^X6Lf4q={vA2TP=9CaD$eKTl%GhXTM zgL&rrn{pusz?^`_fQSP%9{}Cg8~`+5^MBNNu+2OXugn|a{?a@W{Y{Pi;rE;Sn=!pz zh=zU4jXYS~vCfcul|JN`8WfbXyVzsCKJ{pzp-&fmY&`u$e(E%VAfcsJbN z4ZXj+q{Gv;OLp z?b5m(wVUxUZGy2G$yf42{fw4sqS}+zus_wW0s9pU`#)LsIgk3k!~SUY!((pDH}V$t z(Z2Y?^T_p;ms(YCDk1ySXg)XkJbZpGr{{d1q$@e6zXV@idFRg|zQ=3G`U>lJk>*?N zhmQ|iK+fGVK7J$CYPh_=AF;3b8z1Y(nK%3!?#aGc&+5q|irq0*=UK95_?Ke3< z!+vA~4Eu)vYPjE>{zv?qm_N||82{*3dZz60es%wPS~PxilQJ^4Ss9to;tZMC@(dZ* z{0tfMdKnq@+W%QzFqIt|*6=Lp_QDm%-+H)$W!>pLV*zUiY>a@qgnmz3#7wAT#Fohw zGItt%o{#nO8Y`He^>!unIgq1;oxp-$!7E||C@@<%f{V`@C{K!3`CCWa|8A#OqQ|eka?xSz^dK2{6)kI_t#Tkz70FKUhNN#ryd)1M*7_}`hQ z)2q!_;IZnrvJS@8w!HTG&)N7MubJA36x{pxo-saadt5fRr+Gb%@0sI^a{JoH zV{`i_(|f1;N$e+TzxDZ@?uYERg65NZU6y&rej9L4_PN*-^X*Gl{%_~+sM*unoheH? zoGlx>gYWPEl(5dj$0u9C&-B9MU~TSsuB_~IHf+IJ>L;Yq_&@Tw0rk$4kDt6Hrr(ZX z(=!zEj-DVe?)Z0K*Q>P^&Sp5DLAj^@5Yv6;1zA%tOLKzcJyZXNb81 zUC0xHcf&mT2ADfky>9}|M@)c)IujP^0Eh|7vetwJ=5^V)RrL)lAhtzr@VM=DF?nz> z;_~9wHbl8TFx3k8cU7=ot#WzH12ODlzkf+nvj224`=?g-_tY4RJ*Y#64%V4s?_kyy z&Op*!-xHN?kOn?CVR9S#yfmkY=LpVW&%iu&p7lz@zvl4qn3~VW#vd@eYfk{#SMF_m zAM^JO^P1ly|CW2r%Q83Xa(iGu;vYSHjPrf0?{wZ>BVWH+%}RLh1HDh__a|un{gJ;< z-Tx!(fA;iE#|Qs!)Z*!2j{jhfgsP{>2|*KJj~cy>jXCw;!#f`fb>be0kFcXg{_+f!ar8b)L53WLmE| zMfLFm?xFRjZ-_Mk`1ooI0)IcS1@!y1Hvm`U1`^n3ZOE~Yo&e82{C)C|`w)2n_6=J0 z;qT)fRv%v3=l#ulo&4X5yce_*?2z};7X1PC_K^K5ca&4z?+e}MoUrCin_|D{Q>R_` zxgUS{&|x|kiSsXC#+h+7P~U&D%FQKYpL{3UGUPpIzsyqh$-h~Kcgw!M9+A##f3D-6 z%)^cvt;cJL*Vi*2=zVG2oBW>PKGJ^nfSJ{ly&mfCC$R5%rwypAD~$D9+;<}O1I>Rh z?(esGh;{vH$lYJ|zm&>o{qMcV#DPd&v0t;Qf5r);rbu3qBvMjJ{_{R=+Z_wLRs} z;dkQm{JlxGA+QJQ;b$!R^lV|Ak;wRoKBm3XUZI$e&;DQ218n*RT@SJAk+R%_f8R%7 z^90oV)I9`&=HE}|?=Z1`;0riA5c&e>(Kh^R4T$w1qx;$yg4_{xzX=yK#^}D$e~tMq z`)UK6{_DNWTs31`x2S{AMArM1ofKEth`RWCOWfyGuKJtS_;~&pXD4F@R7tbuucu`H zRO)^q`uaGJV<`6X^!V;O%(Z)$K0o693W)b_l*X`IiSfPaxYcvVJNxQ|MwF;W{*PG=dVT&vtgdR z(+@CLXum#o{DXUZ?EQSlzp@WopzO0&;1+AJ)ctTF$LHe#K91~yj|r@O(2t!j0R1;T zAmHEn{;K^!uFvT|*{3aV`j7rH)qmTAYJ31NfSiEZ0N(TJ2Q$`BwQP@j3*-#Re&q_~ zFxTr-%t7vh8E~KD9KUA5vs@E%eWx~R45#@CPZp3haEGoE+o=bOiTO@dmU)qdtXO>RHZd>7v<_d$HG%=S`+t=g$ef9aN_eS?4%?JBF&NtjgaXxGOrEz~}$>-19aGbqy zCt@P}+Kji(lJ(usi?lo7Tbcd|Z0q_fu8HeHd=9Hmv^LD|BWqTzh^_4dt~1}4^z-ib z8T%30hR`M$d*EyV{gK7(&ylfB|F{kK>D7ylzl#`v{f#cZH#Wd=Z|s4w1(Eg}J79W- zeXOsxAhEZ=Fs^+L`vU);zJO;Q+J9o- z-?C2@w6=X~$*UE)&nNj>8#VuCxc@6(c@cen%zFj5HsYP`bOMRWYnajo_7xtZmdkLkVR-0QsK-d!0l*##TweEl%D zNA_cSAJp^I#}DFr$G!9MJ@X0Nhjl&g@B2Jog61Q(k8~gGyZjz}{np;!zq17UX#TK| zKc(%NvZf1|x2#8;J05wBnBD=t&AJFztiGvN+QNRaZq2IL+A;8-@$cu)>oUL7+m1xr z5cn7Rf2x0AY{BMU=ga($&lbihp)D)z@t_8Ok`JG#kd)((YrnGv^a&DeK=`q%`K7v= z+G3>tv=edtH~D}l7r;276=MMA{JCrnz~}od|3>>w3=sPMKJNz|W9;wxRmg$*|CSGv z|6;wH`F_>_c-1&ST0-}$s_vJ?%=ZqQpQUp^n>TNceKpUVcHN(V8HFQP%VDiOeVJx#2uD-+u$UX6?jvXFs_Q2Z$7mJ)Pn|l6P=DdIQAL<`q-{L2=%A@W<{STMP_b1u`9|O=1xaD$zdSxvU z{JT9w>J!i&fcF#Vzpnw>e4xt%X#UUg@ALoEf6e)u{GZ7IFz*-U{A}J2-0NN-@~>KF zbCDb;=K-=Bb)gTpbW zvKMCa@*FMr{HptpRk~htl-kp$IY0RK>d({9H~LQ>Akuql69VqZzj-}Q!o832O-)a^ z57^79k9cRs%M@~GCE_?|JouF&82^?alEiJH&6^pEgqOVhjX z^9w#X*D`OlJ=Aiqey$>Jv*`dR#oR;UdF@<2M7D3;5?i~5+#Gyw z!td#ikAuIbwk76EL_UYc87HszWA^^JoFBE{=)JwN|403PvTy7EuKpL)0Fv_ls#Uyy z&GP-Ij(_z5tnW`|lo88}GGzA0wZdK^ljkpA@_EOOoKMeLy(O($G{>I0XQguG)3=A0 zb9*LEoP?Rw!*P~NFP+s{`;}L;ukW!tp!;?{0l8Q9t^eZsa~aq0d71h~$T=S;vd_54 z@~<&|GW#jH_i;XJFku~^wi#OQb>C=yGta)|-q-UD`<{F1eQ8<`|6X%@>gU_|9^6y! z`_wskU+#GH)UN;bF9|Vvg3oT*OXl3NJ>W9gZCCow7fbrj7vkf;$Jao7%(Z&B?Ap0K zwssG@CH}qsXD`F=xe8 zydQPn*8Pq4bKeKfq}tCsf8{Hg z=P!%1Z#wANC-C{DWviChSMyvF`=?s>c{aqzk)v>ilVShW+OucedXHS&zlZ?%b^q%?skp0NdPi9{C>BP8azXo*PEnCmiKAwR6 z7GYk`*Yi-v^RYedCm+`voo|cSUiacde|p!x_@sXRl(uKd=I@bDQ-400_mr%A&I7gw zUJkA=m-GRbpl*Mru8aW}N&28Gl2*prQIeUyJGRnCl#RY`;1&A2`1>-zJ%3+j|Fd8l zE)DDhY!3bpV-Hf;0%r#hm-yJg`2);PA}(0^`JYaj1EBxU_}}pF`k&37sEB>^PQWHa z?Bl&aeuc~Jqcpt$hJSAZU<+C^4-oM0dV;9^KK}>iP0l~)1*8q|IY0FNQ1{^junv$| z_cwWe-mh*&K0sLaQwGR~>Z9dCKi0i5$6KS0McuD<2Xr6o^DJ+ijaSmTWs8*TpXzvj z(xl0HCI#mNeuVSqz`opbXGP@sZ_qryvsvyMi{b6_h&YGVQ}1<|{HND?YJQA+qx;e8 zcM|q(-)=K7k3F5>Jc{!ptvCC08S6JE^KQ9%UP|`4mo%#5hwO7!2Q`W8V|LC-xu5;s zIbfg^-o5{B7>jARi}9q)l|(f4N@z$;hi`_un-%j=}Z&&S!% zPxh-+gzlq{pXZ(NEVovzTVP%`b-(gyoYh%aW74EaIB#ZjiL#HgsO!A?YDvvIk>{^+ zljixuIA1kBg$?6#Gd+%0-}Phn*j{7Y^K~*_#T)==IN)k;zF#( z{TiIdqx&}SKKi*_;GHvi+C*^)|$3I7Tb(e<=csKt0-wj)( zu?{{R*BOJaP&Tt>y(U>1>5`q9A=zsNf&X(QbKu`3W60Hh<)uxK{JdN#2v+9E+x^!w zhFpc80rvwhkerPZB_}IWvNLu|*3{?lH_ndy18aBG2I&82|6jxlF`ppG4%l4f&sX3z zxKz@5UVz@<6XyU2H#iqFhB*r?+5-_|-|v;M?EAb6*|&>2ub&S-=f38cXWlR91-7#T zaqpPiALqAe4uHC^?BfdVS@ZLKf9&<+^8J2%3>)D6|A2ePKks+X1^KtJv0l~pKi(Sm zyT<#N(M|SwK3BKSUzfCo&;Jtk)FrZiDs{gI@jlOq;(1dz3l(S2ek8Bfc~z8stNX0$ z8Rp~Hu%;Q)b{EsTYm9ko7ilByQug(Abh$nE8awWJ#rt6GFm*p<-^Xv(kE1=;W#98w zsO6bCaJbqYzLxa&z0aSl`^vrb_1hyq9p>#*JzoCRUkvxky!DqEORFy*=RNMT8`i1a zy1;12bk;A;RKs&~vLr7z8+_+T-iG1e|4))R=x>ra^cr0STP8_SVFA`2zp_T(j<5a0 ztbrGT`@c&5mT77q@^kTfa;;VX|IzPv z`+i*BPuaKn!P#!qeee6z-&dcX_n^Bk!)xRNM7_TD9#{6`{D=AorjB#}e$}hc&kx=I z66bnyc3v0E%5UAemAv%Q3rXys%6Q+fKN)A}jWO)wY+C5P)MTFDvTte@hI>8^KlZ+i z<6M24K<@+Y>F+zOH?h6jE5)nj-o3tRXD$2s`di%x|4#P}|3R-tBKsQOMZI9`1$Dil zW=53huz$?T}xB`d1+o#IDy~VMWJ*J{$ z4Z9Z1UntpwE|kI@v!%Gm*arR{{=S0zT**scBbmc*jM*G#3!D$)|9@`>oIl{=0>%W! z2BZ(UQF12St2u#9z5aSq|DUsj9sAq|Y2tk2@3W6W*|(Zc?!)Eu-`IoD$2Z(Z><4{5 zR_|SX-|h9K?-;Vr{XRGoK;!;Y{QG^SKIVrV;60wOG|qMUZ*|nw%Uq3*dw9S63c5dN zkj~3)+qR9o`0`7qnf<~VJa=#`eEuJy`=8*pl+?TneSOyF*P0&wXV&tQ^j}%G z{yt~z>fXj=_LY10nrL67v6q;g4|~cL?V)mhK6`oinrp6w{=Rb0tEtD5eZFr__w@?i zT|GzrJmuZ-Z)-pF1vMAM+%W1yZo$X*+-rDXvGDG}*GT%%>#aWzF2H;` zI5Es5YJ23XN327?hq(n_$t;-8p7OZt$=#t^UR+ctdy9*d@BRDsO7Zqdl0D$hk~R1e z*}G%99N51vwz9|F0o!m9xW7pDrq9=}@#knG_D}=a1+7j9#e?2>GW!i+erv1C$Hp-_^tr?<05K z65q!>f7MF2;T+yCcwV)1!#UV(+O(FJQ?P$(eSWe(MbDPyneCroW?0=ib)*JzeYG&J zqY37AU{(od7}@%q(S7>(v;)qEG4Z~!c_yF7{(Ra3z7BSUK0aS7aF1C@JUc^ss4#04 zoO9V(3hLvN{ZR9b?z0w~$iC^@usIyH0XEL_{DXaaZyC4>o;CbBvqs=L;-8X@l{@uu*|%qR zjBCev@%AZ_J@9<6KP~C&*&}a|?7AY<4~vS&_x$rxT%`CsXnFt6Q(+Ub0{H<`O-ROF6f> zd-Yii_s$21@)^!P*sFWayxP1TuRgb@F+TVw^KOBC(@)LW3MSve*vs@>n^=tR4c{xW zZ>~X|27bTxZhHNX^RKfcabK8g0{hnAC;K1Z42u)Z%;lbz&Al&HozIJkst7P$)E8Y_^%`BL;k5T(Y%jN zJae4;|3iPD^H4&6pYgu>`%d%qYWa6|fI9EEPtg2mpTF(v!M#F1-z?)xn*JVB<2QT! zsXK;$wE;Hw?EA|#_h)SY^(t_@=Vqm_;u*8N(6fy(UZtyI3`%T8bDdGgsrzl zXXK!_9{v3BJpU=x{i4DeQ*rJ%e17>!b^lYTSFf(ryt|Uoee@oXf7mI^EeiOz_MlYm z=_kb4r!6!#fWDAf_O-(Er!VFBC;K=@PwlSqZ`pVJV>Y`o@43hO=VLecbSGk;@xF4O z%I6Q*?^~zz8C%?YyZ+n1sm^DQt0viFD}npKuebSkukqHG_xe8cDrL-Y4%QPm&lz=t zn1#4`lwG55l)ULr$N}*0*bc9U4jz!ibs%q}elGkzKHi_dS@I^|Yk#--Tk0dY|AV$i z?Eq{+Xb1RzBX^KF_;Q~^H2y#k69jdF>@k(4a9%?xnDw&k9&|PI{}P$@=85}%KCV?3 z^*QJBhxz>=&bQ2)8LG(H;5{{q+y@J}eKUKVSEu!quH>hmev(f={Z#7Lt5;I-wtu%osqJZv4|d$-aLxN{;(p`z zMX|rrd}jj^v>%$!v#wJ4`0jJdJN;F;XMU_;=5v}CH#z#yuQyuhc^`5)VsF&gP*3BG zjqKr9Tjmou2je-TZ_<^EtFAFOORin{(;t_EMZ1$YPvpL|j}H_ecR1x<^Ly>z$>HC0 zHpbeWxGgX~N!E}{@xPy;|3CWzvId+FJMee41F39427IByxpkHQ{OPqc54!!QOVIyc zdjBua3!>k}{++nyr)J-C&;CqsAF&=j4!Jk%M|w~0jg}bAH}{*_)5qMBi#bj1Dat>E zF@SmOY(R4SZ`e0lNQQ1j{U2;VPut=C=03h^(0%st55fGb?%#APd81uhsa^XOuz&h` zdW$UkV=%MNu-{(l)vqV?`5#4|pZj*rULJEc0ngMjK8x+=V+@eUKlI+S@3bGRJN9`_ zqPLCUUE_XdJ5~Q(yl?z|oV#RffMeh0`jmb2@F@4xeqEM(um1u2tnor4y!O)vK&~iS z)o?CWD8Fz&QJ+ z1{3-F#?M#owI@5|+&#v9;C0{J6Rz)rKB7INErENZD=yFHe12YCeVMr@#`=1NHo3fX zV*StG-_$r|!04v$`2#nc+20(qKktCK4!`H;s_w@C# zny)s~#!}9PSKnXbfA{`a-M8#VcHF$rk^UR@Ip@V_zhOV(KV-jZN%t2oFIDqL zzkUXCdw*A*FM$7@H|0U)KE}Mu*CB3pv3usE$0cJ)SIOM5Mtf>lr_Y&MD@oHM&JE*v z<8akg7FVLq)s(F!u+Q`}_Rw@xL3k#Mu^O51fx-d=9k*^a&6T+?hF9s6WS&*j1WU*)QcG~Vy@^%t0*HB`Rs{!K}{H{Xy~U#*?Q{;7`l zr%jtipC9vq`{3;F_EI0ZUjsfrdwLrs%o7#eVyHF9lZ~%?Q1`;eUG9uw%mJadinf$PUz){<~xCV=!DaLp0nGA%W6OG zw-e3YS=8|Y&D&=Vzh3q&d&|bW*0)b&-p0<1+cOt^Dw*h^V=o=KFF>unVCA=9{|3ul z$a=_lIdC4V3FRd}ScNkmlf%WkOR?by8l?^8~xegdZrL&cSL*kjL#qC`YijJ4+u4%&l_5g=kB?u zAC$t^H#L56Z~6Cj*7;m&i%lQDKWB%1`*<(8j33AIwahZwZ+yTQ|JLu)&JE)Q;M}a+q+nv=x*eapT?%J`|Dv6xvVW*xqwE3qv7euS-xb)9xIJ*T zz}h2g3v$sbpgjfb2|!;5CqV9({ ziS>ZR9ZTN_J*?4LILjQqT8#ZDr*CGbJOAGC&MV)0ch*Xx4~Tn&Ur%Ho@qVcLi9WyY zE3xc*UBZ3Jd(>#Z=}+-GX0^@S^Ok+pN3HAg%o^4GR$zg7{%Sazb371~2bZrE2t zj`F75Z*@3iJ!IVQy=T(xVpauQlb7;eygP~iLj~)laK?QJKVyC;?S@(Q?}hfj`v#F6 zC|KA=>x&Wp`I5J`AMyh(H-KIO+P%;Q48cAmp!A;KF3(>D?YBOEp!<9e{kaL$e6RK4W7>dlIlnNvI?XWL)Ax^TK$7Brh-)Mib?i>FY``^hv&#=SX9_0Dy^J7ML=gysE*s$SbU*5)cao3c|Oa$>b;Nc@tmORCXX5TH`d?x zdT(QUYQDFR^pQgDtq+Cs(`;;I*$4lL?3=xMk?wQPjhC9fU`)G9pk)O#wX)CxuRc%cw9L74zs4w1*eaU!xc%Pf=l$<;zhAG; z4)E%1fsHTl|K*Lo9=$`8eQ&}3eZ|@nm^Z(f$rWmjFt7p0V{*R%Uzgn@?~t^G{Uv?p zR@Hs7PyJ^efOXLoUtd_Nz2#oNHy&o(Pha0Ho9E;E=xqSrXZs#UcED)9(Rtn%&M%DE zZ$Zrncu#z6&hRkzozou^@0)wl#ilX#gL~WE_pYbK`2EmKb5@<7*~M9%)P3yT#r&+{ zJSU@sXXDkao6P%(mDzS04+L+UrIFE#FBynnsU=O*{e^)tV(eaN^vU!S!K ztyfs~<2Hc4enM^!K91);QSUAH{iAX8a;Yj~tGz z!kPC+-|K!h{C%(?-WKrhdVAn(fw2R5qpp{O`wF$M!2R$0iVGxfLS<7ku(g7m5$Hk2 z^XKc3G5jXkwy2kEShrTzu3jbEx1pD4{Yb=1cpVltL2dLI&7JH9|C3sm{@Q=_?6pSw zJ^MD-XW94sCuqOXeA<3%1Dr14s(O!m#xktZTv9zegxbnvTxsS&ptH4#QUMoAFExW_p}4~6Dp`(Fy9~i4*gx$eyB~b{zGUB zLOX!`y!(H7CI5SO&6a$vJ>04}%k06njyVK9PK!HZc37Iu4ot(`(DiFq%cisqlD-@J z5|+Fv#fx57-#>Hs4e+O~k~Q5gF4gY#uY10@oL{8 zt+&x%TUV-9jraDP4&7&--|2pXh7IK2d+v~0IGcn0{5+4-_4QHL8^YITtgk)&i0MPE zH-5j-`lyx{?RoH;uj~h}T`b0TF_mRrxsTX4{XJIi?RyycbS}SR{e9|zvLABKTz|y= z53iIyi)Ul6ziTe9VEQ9+c>Pxz)6$1^v+&ogSuGoJe{aT|%xzmY%g*g-lCiJ@_SbOc zMj6Q&auFE0*|5K5xN_q-V*kya#cwLVPS4|v8@|anSMl_!(Za_Cqpy+dpU=`gdWZ5> zgZ(41l{4%r?DaWU_KdsH|D5|><{H|AWLrR=pkQJ-DPI3$tUr+K7q9*T&+Asn8H#;` z?DxTb;%wG4c5jv4yLQNq?OSErmQBk1#`SB3HXwcXPRZUhUG^>p``|xs(!H7sWd3wo zyK_tB|GmdcF_Gu3s|GX;u?w*SD#n}L-^AZ2JM`M1f z=}lvukIOS}*?0MF&6ia{k1UvKh<@2Ncb1dNSMyw+^4PoE1v7L;=@~h1zxx(??CPS% zSM{{j_lt{)YRs51le&-D;QgfIXP;5`mHj7K4wPQg~`xuZIJhvp+=Ksih$n|*hMe>7 z!|V7K=v_nJnsxdEE8jz$+CZ|=BcHbDXJy}O{>JsPb@L|Ku?_eA&K){8D<^%c^NQ^Y`iHFS^0$=l z0pE{raNf7mes8l~3=r@i<^O_QptS>P0}}N=WFL>sythQ|`7!QGF0cEMHu-y)IV;P( z(KqY!JN9u^E>tu1{2rWLP2C6kTHi0Hdw52V8YMk(M$S9$yekdr*H5bNpGu$Kus=g4 zPMlbx?05W38Z~ZMLfwC|l0BD)wLRn}4fihAr;l&6-`IgL$Cn)AC+7G3YjzUujjtbR zKJBpa&8&^~Ih>Qn__6#xbsw?*m(N^Rs=vRW{a=-P# zN9a6!ulYN+skUXI?}hbm*7FK;cS^zHcMu2v1?vJixVJ$4XUEdvgZtHYj#!Ks-#eqa z=$eV^%sXKpDoXCqi(QC4A zNpq}bvTt!ST%lT}<)#q}oE%0^#>_^%k`TwEcAL@T% zT&djC@3h>9`MpT@4fo!s1?SwK%0>Nmny+V1x||u#?5Tsf_dJJ}{rpv{+*Z=HOJ^B9 zaujFfm%N8FaZ|B>Dt&&(eoXi2^WVi9UzF?PTv3Xh7w1?qaao_MY*ymHa-~aKGw_5E_&3`Nx5c03{nN0kbr2R47XP+qb#OS`C|D1GR z@}9+g$$XUc`Q82O^`3D*&z4a3sfpOnj$D|TTdi~YG-nQf`Z&+wwS9fkwObb%HEOh; zlfg4_(P#7D*ZoG&eX#!|a($fBt24WBu5i4kFN*U`yl>CYWGq1T^?BPoALAds9&Tw( z&&K*8`!1i#*B1KjmS>;uOZa|;nooZ&A-5mXf&^b*^ZO4~F5%4R(9d^|$2LXpJ!;iC zqi>NTo4O-E&3pJ}lfSopw%QY;{WrHu&b(%lxn+Tbn$P)JoRi@gasF~5`}?+ylA_KdCAZxMq4LCdH{&)9W+;iKvw@8Xy&(F@~k~_Zz@|@*O?~?5gD*ELq+5cT6s@{+D&SDCK*>_oS=u^TR$LXg^n?E%*G#*blf@AHc-@rXFnSe!f;@*=Ot@ z`S%H0MCNhN(r?wgzP*?Iy^Z_c={@`S-5ejXPybl=?K9tpeK9D2wt661a5B(ZS5sK)!T-W_soYj}?L=<4iVz`f@8SkJfI z+t*QFXUn~b?G5{$dB*r$37Q}4(Gjsr9JUYfnAu@|wSA9n99_86PisTk?ta@77g3`8LTJ#Cq8ovgemq(Yv?fq|6`Pw_6TxA0WpL?n$Blp-ng0amBq%GTw9b`vcwAdS5K& z=l(C+0%HSsHM(zneC`>iudlNr^=h=<>AjCzou=6<^*+wOonxbQu&6%99GaWci~akU z*V7dKGhG`}=&~z3zj1YJ$H{l>KTY z-<+U_cYV(*)W<)x<|8?XWw>Xp9`~|py{UcsemmsEO`i?w?bE7B(aH|8uVA}pBNh8$ zAAZ4%TFBr1NeaiK$A38I@s~mUyqX-$T%dWpD6S6~HjjThyjKpxJ{_3s8#uOl~D4tru|NTAlUh~|S#y+3d{-P}8 z{l7vl!JVdG0QEuNGl{#wk-E_v_0_oZROhR6fN`}t3)?iVx9 zuYG-*=Qq0FQ1kpxRJ;NCeV!M36VDD!$n`}zKlNqo^K`mzVjXgi*TdOGtNS7QzBk(W z{+@fh?q2JYeSP15nfa)H6)buK^EP(J^Lti5L-r5muEhRY#J;QxqAzY= zT0bz)UY#(P7w7)BWANd#Cd;8E&&$F2_eX0U9%CI^)<}-#F9rL@PGAG@`w#C2yI*Uq z(Ea_r>wC(PL;GXwr{aHK`U3PcW0pAnZ`K{?L*&DU*)y@c_AF_ip!ER?CRLUL%Uc`% zmqq*+&VB}Y74!sy|0Q3P?)SHU>K5$nwR1fJ{!hxj_WaQgi2Q%Q*TeOKcBq%^z=T3nO#k=zqm2}SDZC)yis*KvjfjX_1?xX z(Q`C$zK`|sdZdi=887Lwu@p7mu9%n6*%j9N6P)cB%B9T7Il>jT~OpTn;UG(67Alx5+Nd4BbDcrv2Ola%lboa%BBS za%}%@Zv&Ej0ApVc7iY-64ZY>a!6IvST#siZ4le$4E861_c*tFVus@%}BE>odK3R`ab5Fzj0&C$M{}{mve$eKd29 zRQE&nHMeK@_qBY@>lxeYb1`b0>7QAjO}S6>_1VK$isoBipZCf~Pn0W_{WaY$*PPzI z#f{`QuwO8d@hf}tZj1VFE%*8CuNh!^*BP5Ui)3||GP>4&gV{i%ZkB_z3;3Qx3$PYGDo3{W z7RCpu;{e0I>kV-KkJ%#-vG26sJs%g#xVV3BA?ALkjh39*4JB)c@dt8-T&OX?o+(x2 z;EJ{p|7ruM|1Bg3wE)NegqEp$e1CfN!s9$2%`7uh)p2jGp?_!MJe}R=_*aeKy~A3c zsrOO;&76LxAC`O77~}gp{f{vZJHWh^^Zn`DQs=zCtMMl8bNu9=>{I)x`>2<> zcpr0nuy4Pcj2%0U?CY7hjT)Us1I95`#AMe9Y>F2{Q zKe}t699~jO4le@tSd8s=Vh-NwE@yb|9sj&;>~%i0wvzw;!?YJmU(`5(@j_hxQ?pMS zp!~xZaQ4bQ2lt%#93A_tYp}jike{n(iezrU9PxRrbgw`m*e=ivwQCr}2 z#^wOXz02=A{nz_fZGgGA4gaid8RoU_O-3|F2Ax;EH{A0qd-lqkJpYAqCv>0t_Q#JO zCqMq!yX1opK9t6d8~(t^QUA_d)kpi-SkunKSvRb4bFZFbAr<>a4i?Jc%o%cMLq|EBF%fa~LGNQb-3>MW zXwGaoyu6MaS^S7Da-W6TBlSIGy|l+$F-Lsg?0e+MBJ?HOb!2r5#0{%Y%Kwp~G~_zp zkpuIvk7;EqIkaOa`uw(Q%|B${@$YK=>}z6wQ&uL<5?k2=>~k++Ree1Vfc*o@v6jLA zXYLPc&-91D{>_q&yyN08O7HP&_efPeC#`h-57|%d`*+Mc8(?C9(04SpK=%Uay=HR% zjQLgnnfqsaN?QOeGxosb`;4D&?tK^c@*4KOxEYtRc;C$H)0rKZpQUHyeDuKw@>-K* z_WxVDUkmkp^c^3suQU2!x4^&KzsD=j8`OP#R`(6_5&tH~mze8|>%M2-`~8;vAkU|| z@9ePCes8Otua?Mtyl20yW#9FO{ZRXFDeHTaTA!n_ebMYk<+mMuW#59@s#&SHXD?np za(Nl)yL2W`Vm}Z0_w4V>kwfVd(IfOe^6-x!FNav%#p=r&%HeFc4=?ifk3#E@ta}r@ z!(U(Wn63ik7B==gKZ*JE-~GvdZvD6C%DV37_>XB5)^t5Xc4M#Mq4^J*-^bqxTXHz9 zQ^0?u{YUnqUbyiK{GShM-tgeO`_#`kF!x?LfPBJ%rS;{&=I`ZT-fI6G`FzQ~(S5RS zdi?U|H30YYl~A`>*)Apjg|jikjDA1(UyYb+1mb(Q!d%RUPu#BT^PI%c_t*KJ-o8it zhdF-}3%dKo^!fh#LmKA66_E&Nx#P;qQEN{Q|N2tEzN!1s=Qz0JIg=-#eS)2$tzzxK z*Z}ZvZNR?SHDDi~MbBU-*_Sa#_U|p!n1`{C>i+JHQaG);?3sf7ic_mA`v<^3wSWJL zHkgNi1>G;2^Q`2ceg6z#MNg8D`w8U&GUnO z#`~48x=^ZCzD>UUuDkB5;W-%}fB2!i{`zZ4?4J(ZkJtAbX+J-8pMAV;PFH>Q@?yC@ zey{y0_;Pi{W5Irw#<)efn`HmCLAbYDm|8pZ zQke;LUYR#BJAH8K@4*!--DdTZ{N!_uR1e-tMnq?``3)xOdlok3A|4jXw-cq&^zv zQD=ADCoxaI+xYVbSF}oC|EN&+k1aK9hwP_gRw%jsZTVAvF|Y5qCi~&n_?Z1h>%TkC ze-Cr+{M|>E!@pt8@Tgmc{X@`wjR`bAU}_4i7nm5}0mT3Jt8Lo{{<-$T2JD3oP(1T) z*vq@5XvUqG7j_Tk2|ouagDZ0P3XX`p6IRWNt67*~f=HywLp~-+jwHbvi5mBbOTAW*w4?tW6tPSI|X}X_VStMqPh>>V}3uLr(>Vj(C0VtztexK``-7rIX|EK z3*!DT*KhNFKIg}nOk@AJ-|uwaTH)?nCH)pHjF--#hwV z_swGe?LE*wtT{E3xcAJ18Lh`@ex5oXF;9P<96R=7IXKYRgohS9tZ@MO zKLC5SANjxibMN=;7tg8z?(f068{EStPDh^~Y-a)VK7R`MpZSpN1^0WGalHZN+e#7a zX3-Ml`Y``Ab4)qpFw4S+xm89sIaApu|K0|`9&~@{N@d^p{nq#QbwB0+;yGRNZ;7GwCrAA^vwEn5Hs4R~gGKFB zp3u|V#_E3c%GCXDWx~Wsn4{6B-*$hm+RFu zR~Pg1ebt%VJYO5!o4#J2zi~&Yy1(Ij%+Nx7e>CkY`EA>GeqVj0_hg=XZ5;PCw3kNX zU-r{7CPrNExHmO;`uE1ScRKHwKMH@I`g?F?Yt{WE_ATQZdPY9~5!j30S3VnC*<)_? zTr)3__;r4~b0F)1rU#%9`*vv$j-Y-J*L}HzJi0W0S92u z$o{@L_e1mV!@5_BXV(PxHDu3>yOFoQTk@yfiC)F(k~_H?7W{tfjVM~$4t~-bvS&$K ztTvck(i(f5TT33!??@kAPSQt}lZ;ViWpvZCWoW}PG7Kx^zsJjew?03)H|+b^-^Ts! zTp#rVJo~f((L8oOc6k8LJ?hb?83k^vR@2lXO=8r=NZ-&6>Rq_N$%N*&V6ar|v%i_UW6{ z2jdN@ay~cg7nkNK1Ha$eH^)AGeO)g8iTV4s2O4_M-Uzo`%8IzU$?8*LNSiy;Sx$_4%j9_vHTA=C8Gmm&85x+w51pPuBV1zE(g&kVAy{U>^}hR??>Gx<)*o>U#@d{>n`%<0cx@`mIuZYz0<+DIN||K?#|bKZhhl0CbD>>N>E zc8x5D`JQEEOp9}6NP{v-{P%kKk|fNefSLcoM@9ly5giik%GqU%Gv87o~ z@0sWKGrZMDHRndU+JCIak1;=ahmWtheak-WfX316=hs}H&g#U>4zfR4+5hB|Pr-h( z)69OM>VDkk$6g-0hgaFRxe4tcZ_U@sM_S?1|a%|IAL40rZ z{si1Rt!FQt_R%=z;Wul(9=<(UGBLb~gJm>(B@El>NR}@H<`x``38;Pz0a+U#p&zqbpOhe{}iFCSM4j#PI)w zVIR+hHA?Oq+CL9IJlHRq{eTqCz8~{9@00xLHF4%p4V+1Ek7RSU&!jsgV?uRFA6FGU zK20QNVOz-t^I7v-OD1}LGUsx&kn|aKWc#r4vTay7*?~2t^?5R=ei<2@z<+PlW~uj# z`ME;hU-^&u|HcNy;{d1k=Bn(g&(Dvk`-~k;zTa{0_Vt_dAdRo@e17irar*D>Z=?H$ z1N!|Y#~0=HnJ?EFnACmj^XH6i=K6Z}_)aE*{eJ!WmVENbC(^WOGW(}A*M~E?Lf!B9 zSx3(3mYQInKEGk##wV)(uFmgz`)!@ivmfzpeE!n8PvRf1qvKxn-)g_l`=!u+@~<`k z@0a#tc-=R)+xc)j%f<2k-s9y<)%~qtpLxCCwsx1_wsbKwHJI09eE$cyPm1epjm|Ld zxUXg7coT~=Hb1=jjg-3ouQlKnoX6N-4$WU%4>5I3eEu(zZz7s{ed!#mo5q zy0UZdwf=hU*mjru6xbG6#qp;jyK)pi6g=Jebn=@ajkUE}YPo#U#@jz97%1%txBoo`K|72 zyl-_M&(r(-*4Nkk2VM(j4^v+w?Qg=EDd6Ai?+J2#+T&k}_6O{%{_}m*W%qG|{gzhy z-#(Gg|I_vA=l`~)E4076$>+!NdI^3$V*CBGU>l}YKpyM?t&7Ec{Fv5*`DHdY?{alE zZa=c7UCKN^nI-2T+W@&&6!sym=D)r&9OLS)62lyxJRO-_PuV?xU}d|EJ0C8_jn)%P`OH zxQ}xCrRY8Q4r3$s_xM>J%6`PZ+uKLqU$x(|&%B@J{$Q8A?lb;Z{$0M$uKSfU z``bNyf?VGZ*QuZX+m_Dq`}UqXOGk5isp5N^)7vxVAG&XkGjj_@{$2J?y-kiRd{A>` ztj)VRo%8QC2fq?IdT{T2`Xg)JO3D7e*EN!VuWuY<-!UCtcMSfg=Ino82frGzbz%$< zelH)>e*Ak~139*~X-f8gTUAH@zu%T)b_sHVN6A0x0*96$FS+Om=>B6kXXg>j6?s_l zW&b|!HTYBWLf7kWa+n;%KBlbFOGUl(xx_(4O5!Qx=F9gx`|C> z?Sv+>W_)8^tA{-y%lnj*ReiDg+#;8S|)w73yZQV=X;nPp0MT=ziPi2kIvClocZbmou4Vzh=+S`MkULWr>M`50W z=J@g0>`g2iX}+)P8QT|Xy?Koc`*Hs18`zp(z<_&cM{k~Z!cjLku zha7MI>F;u2;q&sJwAQip8}vM5)NSbNJ2U0a6@%G-uZQNZLtnqI?VCIwYYo4xs;748 z_m$6~M)<7qe`M)X@cV1Y!Np|%aVeVnh~!|N(e^=Cq4x+q#NU(w^JmNQe${39`1fV$ zyos`4+?TTSr?Rqg#Iv$;d=ptQ_BB~Hy0I)B)kv0(Y$(5uY=CP6S=9eNS@c6WSbi{I16$4zFRxjyQ>Vcz)BIFAo|n2X1$54TlRCC+R2d> z4P^Vk>ta8vxdV~0^F8Hs{8HRcYyAnlz3xxt9)c2{ z!QG)l2gLh0j}JAzT2*c?Y0NVO@IRVfUhDH~3}fmRUiW>xALaU@ct5W7&JIxP`Pgf| za?j5NeLi@dUA{jR`)+1moPEQ6BKx|Z)B62GaMqjSJ-jaZ;xdi#k0Sp5cjjR9uVKcV z_U*8T-PG?L_sr|%QfjzCPo8r}fSb7=NF>Cp>5 zKiL2I=buY>9(KzV?4MfQFRU>Ye~;(#IQBUkSZjRf>E+oR4ZQZd|J&Iyo8yNqF#CAo z^}WyrI?fIE=Cw17TmJD{ny&@yt9=dX{DJPfy?th{g~|0d4}AW}*N-$mWWR5n)O*Bd zzITDf_=lD?l>dPJLyKPs`t{hiWA@^>e0~vnQuVwU%;e{MYVP6XxqIY3wvP{I@Eq8) zO^Vm`K)(xSWa9i@7aQ75khWRJ`&t$r^OAWcJ1R zdRzl8lH8fENdEf4QjlxTAjnAHjkET)O4`N^vU>F@`SsT&Lhh%5`w7^KJ`!h3jve%+ zO#bOrnbi9g8Tb85GPdVSGN#81GU~e*WMsF;WccS5WO&D$W%TDa%eb#@mY>`HUA}y( zjPn02`2YT86Z=#9-+%mOun%Ufc6%RyjHmGRU96uJ-#=hE2k)x$j(hCqVZ6xCv9CA2 zmp|(3V_u)RK2zT_u|D&EQNBN7-{?NI((+^TXY~17R4;eD5_G>Rbsy|c#p}jBbps~>u1|HJ=kQ`aXi3exD@HTAIlIIC-#*?q{tKTMm-qR7ydU}d#s(ODk7>H< zdkW_Hd9Cj;uacbS_dR|#*XR3tm3@=zJ0bhHZ?X<;=(<#GdH=9*X?z8b1x3>&y#(d2cwtubvckR z&vH-p{=9iI!*V}j#4s7$?>iaM=R+CQ<0Tp1{RJ7?^*I^TJzg}iKl6TXJXAsJHM&QK{Hw;Z zW@nc31EOo_=W}m|jqky}i|u`WANP;;@q>Aj<2S6cm)C2)jr*O>EAKJg;(gA&YjO5X z&W|xO<9^xz*7$EJX=d~MjQ4w5_Nn{yzf-Y)+I7ESebo0WXLi1W3#kM(_1 zd}4xy}7%+@nU_KepkWD7R;4V41l&rdN+K@!@5!$UdCaw`a#R)kDsy_xpIm zJ^avq$G)3^6I~tm?rLjoJa^~t0ojXLnpv2ImyLOV2j)F4`>}5*?Z?YyRp&B(twdgZ z6>@F7a;^B9AD<(c6YrN}>)%FyeN9R4cMi_Kyhe)B24mm-A-fLZdJuk!Tkui#AAtSZ zkLR%;vq<)W_hQ5|#n`J@2pg9#85vo!bH^^6L%2oOuGt{VmaUL^^A^g~DKlmK$bK@m zZ#x86tUI477r z2paRNy)wRw%k%U3IR3r%Tbt+h?)Z4#+eh;nI^K=nM6EYV<0$Lzr>yO<$0vp6H@Cfg zPV@C1u{l1+z4I44JauDA-KYMi55HaW`v2b9Q-0s_rS|AYF}~}~k9zgO8s4#$FJc}> zN7=u7k`xzYNKsLdazl2=5ZAuFILFpr`Ph7HI5Vt~H}H`(N#dyrMaX=+0Uh%Hv|MIeI$DaPJKmJuR=YK4F^76s) zKEL)9?1PT)1J`Ed=M^JwS&SHls|c)<_d?_}3M4Zl4`=OVG|eA<%6frlXo5}BOg76{ra_x@BbaNzxxa4NmI<(Ypyw5 zYsYPk-tZo3ym_oKKm7wPulcY6)C2YR!M|l+bHv&!&b_;~x5vi&zL($5?J@UgLXBVV z?>PHS?sB<4tDUUz*?sZ#(I@{pbn*`L_S{viB6Q!dKVZOslFvTtAgx-F{pzuP{!^{{ zhW)X+caZGYuU}8p=eO}b=XcOvrQ%&@_t588zn^x__&T0@lAj-yPrNU)fjI z6SSWGzV)$uU9S}G&D{0S-#2<6X};adgL{Cw|K4Mz_w=v)<{FLhk8OBg{*%!!A;u4S z^U=4X^?TI4!`eM-Vh4YH5qr{Kkc{bdWcU0|lC@(!eB?d4980<6DqJ~5${Kky%oT$< z$Dn!4k2BL2%9dgG$p+;5w+*>Nau&QP8wNip^E&=T=63kA{M!9`Nk<<|&b+p=x&KYF z?%VTa%b41du@&d&Wfu9BnNbLq%}P(-BU~9fwqxx;4x<3)>6*1`XFfDO4{<%2&jR!5 z@bP!Z%4KV1-k_E;y;FIa+PQ*E{_Y_e)%kuI*s-Sc{iM3|?{Js=^yM?sqy3Z8<=uPa z%a*rD$7VN3``2%l_ARSP`!@GV`_@=Z%S-#$u9eT5UMroNT_eqEo*`}TD~{x6=s@c8R||7qjt!+~GT&+|PEY=G1G828ZpQrU+MFts82{Bh>#TSnXmeSQ9Z z4f#jhZ*zUDb5RT3)#bz^hG+wBIo{01`_%pK!Tz*q)1mtVG~RF3s#OyEr#jEiKEg3$ z#+3Z@(@*kg`%ifWpz40DsyCIqhCDxfev_x9?yKL=oTae^M)TqO)3?#SUdO-fZS;9h zlLtxEdS?U7HHhsk_hjEJz6W-t(0tFn)daVfFYM*jy*$c3eZ;CI!y2BIGS@%#&GR+J zKeDWj{7?2UIfA^H_UK~|E@OP|YvaCKw+GMk>e)TD=+`-he*0Y`?~t|MUL@;!UWUH4 z_mB(U4t{c>nR&_)dEz2p=9(uNX^SLl#rKl2ajt%D*G_(I55Aw*aP860Z(cA!R`t3? zR(AWFY#Q-|Y@hkItRK@*(&u-S4FhYcKd`FL-LiSG96J@^zc)(*47SrOSH{O8e%w$%l<@koOy2FCR3iAn!N5N8W96x4iw@ zUAo??bFI8n=O6N6gMY|dFI*~(?kpqCY9O}1zl?nFNEzt}-=BH^cOSXp_-i%pC}~P< zrawpBrj|4BuQ~fj_g!w^*?~5pzt5jJiSGN_G44ONcQ<~oI-R1Hx!Bdz`>1t}dFKoB zsy;t!X4HNz#Qx3M&kx>NlvXy07(pL8nEw#WKd(x!hXX)`{RwX1f5^$gVRcB5{;OO`L&fn5GJ zS-2n#`TTV)RLc`h(J~(dF`az3b$Y##N>J`wvK`wq>P5)0^aj*UCxT z`cZ% zd}6h~*}XTGG`go^$?G*Ml{Dk~O@3{iE?M`X^RVw^-Yp;N$8!7$K0od!ljmbEztMc{ z<=33EyGP@^JNAu#>-=2iy`mhr=KA0pt9DXDE&DC7kFU}dsP9*~U4Hn!mvCy_B%ayZK>?9|NaKuhySmwU&_CCbTNJUoMT}% zKaBBzU-6V2m{mn`2b=Trwv2vGew{N%mM+-}UUq<+UAk7U+U>7=yk>Q}tX>5j#pATu zoh5D7msnrn@z;{}OBbwevVOrxS+imjzAsbPs+AeIMr#!wufo?>E?OZA`__}$pIt4B z2EQdMmu|w}&WNoQ%hRFPW-VWa>*Ce2dR9MKJMC*(H|4#qcDXcs@^X3Y zsVn5^3TMi570W39uiaHf+Q9dJAKKski8G~c_1j7s-d(Yz37BNu-{M|qKXQM%UyD9} zU%eVP+46v429YKNbJ#_lMdK`)Tv~iN1amTLoHA`>V|JYW1Gi6S1GD`MfVw2W&kE zwW0SPzpd2$e6!xaPWt znBD?S+<=uP3+8W8X2^}M#oJ{u){@0L%v!Qjmdu$itEYU4)d{P!te)CcR!{o|t2@?r zSiNNVoN4%e_}NRq;bQy@7k`$^eT?hk`Rnm_$Z50|E!-h)EyUx6^ES$_GseiWiQiy# zlcf{7$kOp&%hGY3us)SVlLz5>Y?V2`Y?0ZsH_7Z-X<&Z6Or5$0 zdcRUek6t1}2G5ngeWuDc-;Bcf4nN}@$sW?APGf2Fa&>vP-mUURopR9lN>cCHJEZP2 z6{U8q+vKIk%gGCmmX+u3zXIzrdGW!^|_A~Bxwm#HC;NI9r|#kXo7`QkLW$G;fddC3*Y{aU_D`wL@7Nzb zTIYh3{d)E4$h}VY!G8TpIFm=?6r1l4@_w-y-LP#g=jVKW=KOq~ACJxJWOP6FTEeH& zeNx`eTJ}BjthXd`PyU&w;XUA%(*f$eTgdZioKGLnvX3k4K&AEfaZZ0RW>K)7_dl8a zB~4eEmc7?veZv=FH4=%$(S<>}T1zeJj>>S+rmS_GGM<=~LIrj2Y{dmpQ*| zmN_$5$?Pffz|m&#v_*L$QwyhzktO54#_B9f#&^TDJFef#k_kQJ*NMGk$;9tv$)q1- z@udE;VCH;f(eOwn%}V^3pZ{g{R`43ES({|;lo{x;?=1_)_K*c*zLN!`zm@r;y2-qe zU1i>g&RCsf-taGF?y%2g?$C}hXILln=WPV*SW`C0@v96SvPk;% zosC&@6Q$Ev!{y_T`%1evy31>gakg8dkEPA)b)@MFw@cl}uag%azFwYw@Md}Dp9s zK70E#UuN=V^?3$2_VDsdE}X&bb$<|i{?gb#rMbSsJ<$D$GHTSQlHOML>(zzsgMH5H zV|}0djm-W7H=~!jZ=Q#b_dWNFaTx2+<^?r=YXc(o6Zy9}ecAx$>&M=QfP1U?%6!1R zvEzJC;S1vZH+eq#d5L*o@NauUdX>`S!&={_er1*Y-#4H?KK*;YFK_RZva0jxsFQD* z3txQ$dRjN7$@Z;VkO$u?Qzx&)S<1^~{8+}qt7YSUqIUD13hO54iUJ|A~9==&sW1?spv9GxVl{dhZ1xK!8N= zDu^N>ia-(q1PCNR6(K-W3DG2aox=1Pk7p)hJ8p5}*kdP-llaX|;w1L#WNhcAtb4QG zH(5#EwX$x`Z{N>;o^yUhh_Mr6=a28&=bT^vo%7w_z4x=9=U}hP7hk)9y(OQ2{gM3o zJHG=b|B&|@1)t?u5I*}3pY_&P<#Vq*kk3E5CLg>s42Bq!y8$aW%H9|aZ#cym>D6( z`IDt&#$;JoFj)!{J}I-}pE3Mjmhp^K9 zd)y!0dOGh}%lXIG~}Uoh`2_pJ}K z+8@k&qxm|%=Z^8&xzPdM+w~EHv|i(Tf1I!9EmZF(IlSbH6Kxqcw-_xiqiO4Fa1 z^M9!)4DM@Pe+_Z}1NqL@Hp8DcUbj3_F1_{ISLOW&=jHu}1K^^( z|NJFzS>Au)s=W97F!s8<|KbgBQ{H>=7Pt-W7`*fH+s41V`Nns6-|vXNZ!lhejr~`@ zE}wbvRr&10+w#uCoAS^m~Nis8IA{Jzfm(0j#Brp0I!~X>- z&&aB*XJjMVzj@ZPvN9*dw{}K`uL|woiuTvdw{ib2&HKsuz50%=-v{z~uSehX>HFh+ z<-eV?^F+-@e>~kE$$i8BAnu36{4V$HTsAxA<dP-X!^6YU)dlxAZ*fZIF2%ik*fK&7kV`A8{Utm`6j;)j?uh0U(aRW{0DTvj_C*D zeQyjXcwL7%&coW#@A>}f&R=7!kNemV>;LojI^VJOo9QC&d2p^vUV7=9;6sB)*jMkrE^pp~Z}9G| z+pN=i=d!$cXGq?Ga#(zA3NWx&f}qYd44Gl^a*V6?x_QB`_$j3=hc5!{_DY zp|kSx)zk9mN}s$qG${A)eO>O|{cYBj_!=?(Z_16KcjbCVmE1V7U#=eABNy6s%87&f zq;=mZ*;(H&HPy#u^{Rt#zERe!UMGtdEu(HVUkY;5Wmayq%*dD~*~#N2E6E}~=2=M& zdqy&p|1r-b_s|gW~-F|23x{!FNyd z-FV;BdEGeQlP~?oZ_8J|{B?Q%jaTH+r5<^C@UT3(*v58;ynLx!UO3Yvw=O+T z-^Opjqu(}AF1>jDHe9;^F3O|f%kt>j6?ysE5cZlpV$Ai?^_$?fJi5X2Zr!CfUU3iH z2M@qQgF9DWg`3Jxi@Vr|S8wqC_rX1Rf!O?o;oIOAxGB%`*z;GfgJF68%2j!A`LaA@ zt;mO$E`R}faPho67(6QvE}Q{vfy!>^5<$+uLKf@8$d&^IFY+ zocr*I@p5#Oep&K;vsNehKI`-jyWCgZ*E;`b+<%(+zUscN&;9btkI?-gbiWJT-%P$g zL(1TK1K-i)CvJ_x`Y(JKJon;#wf-F6$^W?)}++_y?^~@JhkInO;{ZK-2c+*{lXUNCltbJz zzG>4IsjaAzij_O1sHj#JE~t>AISXV)cBW(`$4N^3G)ayfCkatwBsStXnLg!H5 znLgldrtjlcvSa|_Pbgi(0s0AqxaSaH2ULO@0z#yu5vOPuZr@GIWx!#*++sq8vhtDwg<(V_X@XyozCvpGj>b`RSO}PIu`G)2G=9(IGKaVj! zbf0>Je=ZN-SJxlW`d%>iLu&gj_tozi?rRKWVB`K^y&o;!S3m1cRUC~q!a z{DNG%_(i$W|0*220N<2zm*F1#gNHW=2 z;M)0{a&A|t4EEjSJ-=jdk@r@d-CHZ?_EgI7IebI^J#ZJ?k>T^VICcYEm!Y%QWa!M0 z44u9TF3Z(Zm*h&{1-WvvADovfC(g>{DaYLTDCXHuIgIZT3#dTR_&05MH^)PoF&w;izGiQSyB^YB!2p2!~5v) z=Ol9KvodAuGctADGZH@j8Hs}b2~%zCUl{j{%!s2VkPzi7NsaR@&rbH0=ckkNXFFTr zo9**qJP1B}<2`yEcyVCJHKLpcp&H`O-!a#jH+K)c@n3^({YkmcG1V!1{d)PTr};M4 zH?ghJI~(^J?xTx_FK|X{W!evGG;>yl;0xqHQLfCU&R>M?5B)djzOL2x=+VoL)*3pw z2OzaRrv&bMb$)sfi1%&2AN)H)dikkWY9Esq>j!f`p!=b*zH;CCQv1J}|6Fq}^0?q} zme6~o2YkFex1n`CbME#0Yy9Vq>3jX1!J4o9H@s)9Ctd6HczN0r<9^Ni|CaUbbUgoG zzki-}boQIIcm7|-{{Qy3x65xle~9t0Bl7v@+hn-6T`nJOmn+9QK{x1;OWkeK*VZqm zPQ43n-jg$D-j{P{e_aMo-IL2F2jy}fd^>enE}yyzhUD_;YjWlEb?i;Ka^^O;BUjGe zmCI*&{@MHBfm}ZKKrZ&(kdyTl($~}|=g)p1=ip{A&YpfxjyKlI$%YLwc=9HncNZUV z2i&szCvV8$iEDD<#IRgAepLo~FU!EOOJGn2dIqHbXg@e7{oQAzzw5M|=zWX%WuKK} zJ)fZu?u>qF4h^qF*XS;E^ZlV=`uf~_|5v5^Z@&2k+<(N{ z0dT*gQ#NnfBqc@E`gDzMzMty8-k(SLuiV!hK&^@OHQo=7`HkL(YQEt<`H`vbnRq|& zKWa~(`cp5y^7G$ccNs%16$G~TQ3YoCYm-$2)GbYp%$|K0t2TgQ&t->=&L zTW4Yn_y76ZX#Wp~&HC25&ffPwzf<16*(RU8LtcNiTL!z@>0$4b{*G=L=CD9R1g|mD00oHyZq|^qqX)kCSZsar`sV4L^@=uadJp*X8W7+t^!jrst-d zIeJ}AcV7cTa=PmZxGbkSFUhHnK`*jP!8nCi=miSQLA#gOwS_*T0)e+^orIltH6 zADr{+^$^mpuh)yK`;X`P@IOfR4gXbpT<&|;i}yY2*MF~et@*wg$M$;p?R`0vBX;hK zr~hz>IXv6R_2HG6dvm~j*606k()~B6J3nGB!By!{?r*Mf<`>b|r}yK7`U^-ZHNK$wp38mX2VAau<9xd2 zqiTO&#gpgtzEb}Q?lZNJwd*R(`gs5PC%tB^y>Gp-UtYM>DUYsp$*r^9a^_IG^d0IV z7w$Is@TtSSa{O?=969oe;Y)kl>xMhs?JrnwRw^`bO4U6&(`?b1?zNcPvZ$gZ0GvSa-o*;KX*?(di73wOzkoOLoQZ>Hp=#7biH zbeSF&E)i2F$W%06dGA5>U*rEsv_EdjCnRRd1W68`;>(T>_svR-@-0k@_pK!7Uq`Q5 zjn?~!`!(mc^*%W4YJ#478}|q2`>swHA7JxFjsJ}=&=??y{~B{PdFyo;ACQMH2|9w>kRo+(-;D3OF^l=$hWDYm?;qP6q5Hx0{oq{R^PgU= z&-1U3>ptfpnEPg2*3)~f?b!OxW4w1`e%sp_$n}-){$p%={5P=xb-xGOo_nJ9f2lXZ zT~~X({M%n#Fze^ObMp{2v2ODA9=XW<6pl4_f^O+)J}Ny2j!DnK~T|dISN_u5_+HQk8a;*KX96dBFt(>3M z+GczS`rGyzadA0aQM(0atO{I*t}Z~R&SAxgG18UdPBNeuYqAWO}uyTis5$0 zfs4}KJSgq^FMxh&+jmad_MQQ!rLE~SeLFA8-lqGqfA>{6*my=-8oK2`U5D(eJtDg| zw@Q6gvuvx}D^+FtsP!Fy`%N-yMvdfU%wbF~4&7JoN6NH`lZo>`VR%0d{wp*Fm<;zd z?~k1LX>$MZk{CAGml+l2D@>Sfa{d+BNsRNSk@GV~M!Z}{+^_TcwAb6?zFrH)_iG(! zWQ;hP{*U0k@dG1tU$4u+HS5Oxe*W9~z8&8~_sM-V7B<{BV|#Y)p1t=r`Ey~KZwu>U zD4NLmXZm&D#{9psIzQZh{q@)6#g|^-oqy_kQb?pyyHqWi(zH@vspH|JW|4J{_H90Z?!GJs4!~zWUST^3&1?sux%p*j-v5#`RX0h~ zhHcW?bXgAV8v<9Qb?+5vVZWv6lCN!f~4S-xn$%$rpwnaRcIe!L{b zL=*E*mx*Ji!hNgz%KNdOw)(Ge|Fm(RkSXKF!2fX)KW&oF=KPVq`6;o!W#s(jW}H96 zj`I^kdgJ`2-ltsmUl*h3zKQ>>-Us4;TjvXCf4Ld-8y{iT?%`-b~3zQ8?!E~6vuQe9O= zzE4jteSJH~Nzi@9`Mh}u#4hw!`MIw?&gHzV^LgVO9`|jYZ*%=Xyl;J|&Gr3bs5)oI z198`GdbXd)`=I#F&wD@jz5YG)UUlBf@zHgY;|In3TJO_%-;d>UoLieGK2iJMJ2a8C zs##l~wYC58_dAHwPf1@#uR+Vsqv&9l(ZZI79%rc3HKb;$M&M`TOoA*n8Jk@ck=aQ_J0KS&JO$k^U$xSv3+FIFO^ zM4<6gW#V%--}kuhY5&AApF;nilL)vUJ9VNjHIke^Ho`YIImWk?oWCqL)wf}02K~L< z-&V)@xn_3hI$Jt+XSna`zFrRsj(M*eu$=*Mv1^#MOmyl?e9Nbeu( z<Y(I)UCVRKD?$Y)XvUkTxxYGwtNmCs>syhqLgMMj(XHE5kE-uO5hRd>d z=M`ycxGGIMhrl)2Q+H8zl-80*AC`vt2LS#ygrdIwzSQ%WA9eSoq3#ZIYB&z+b_C-t z>p5^%>bIPc`pu_7A2=y>HOHlHQ?Kl( zW_`D+qq2Qtw`|+c0q?nXDh|uWvNow)(*oAurp@`O9ibI_ zG$z#gk8<731&wvNKN|1NTD(EIzUKKKulZWrx4FI@zw$IrV_h5b+BGa(&DXUqOumff zQ{&Tmx%TtHdyS)IKY5GJ<(X^d@zK}!{;y8=fAW(bd)%jQ!*aj6YNHf0?x?zN*5_B< zpT+lf*BSHb{K4Aq<@+Yy_xJSZ|Dt1`fx3uS=kt7Npw1VF|7{$A?(6vs&h^ztt6z5! zIKQrcr=DlW^+)#e*u36qyK>&56^&Q!w<_3H-YX7)OB!SP!)_ z^5K2QrEznYG}NGjn-x8>b4xEc0ZxKG*}3(UG;BEypUzlb8Gb3x2Ed>+)LxYOZHh}$ zU&}n$+AHvm-gw5zw^STqZuM=0+HH4OTj>tl7TarY$+ntH%)h)Hg6&(c%C@aHW$PA> zgDsnH`LTKPO{refBAZq=O6{ieQd@IDwr%Ri>h?K~opo_WYO7C!Q?jkq?JG`Km5iwfK-ME#43J_ew#|HhOwylEa4+ z(}$t?VdVOg9?SX1eEO4c|5NycXJy*>F%mU-yd;HB_GP&_|AMqQ+v7vdUrj8!jcZHm zeLFQyRNaU3s{LLp==TNw>n2q5gZp``?tA&C+Ta==T5ojUyOwoqFTndoc&~aN9P`_8 zJzFC;W90B&=k03#to+wn-#(-J^z$>1FSwuoNwvPG+1K|IbYJK3yzu<wDby=lUVMw=uuR`#`N<>;0kdVt;dP zT>hK*EGXZ%+z*^*Z+#Xse-l4o^7$ZpaOo^x>#|us!+qU`?}wE0e(qcTEB6ntoJF7i zvrmlumH+pSZ2V|kBkC_74w-zDqN`n9XO;eC&+Ue+!v7PiQe;)Bcw zZ>D!;FFieTC3;dA<9J~*c?{e~`zMe6q#57WTK||&{~Gv|pZinE`KMFwOCaaZV4S}o zKGIj58sl4@r8$49uSz*YY+Xmr-#~sI+}m$!zX6@_G+*=&p&+V zT)GJN4uEbsL{@cg0GeJ@5b)~)q@9Pf=E z(7Gyde+c&t@2&RxV>vgrvo*b$A+^2crG<>?D`q(d6ejMUWpv+*{nZaB_e1pGjs1Je zvOYHUKT=&PNA|Q!cgr#2@?%o7?x@tL23D%=kxiAo;5aw|k4_ryRIlq}`;_I?x-(L} z?kqSbo8VscdPTofZx{e@dHtZQD?2HbYp+UW!o#w-xRv$Z4@zNPlO)BK z(YF&u|4tZVd1(I_xR1VTZGXaZpD?_)-2b%EeZzgX-lyE35l6j`oL}pGWpIBZIltEW zcX;(aH%{E6alf1E8{OA^SNCmAz}Ap$K54J9J^q~E@;@-f7p(o7tGfI*aepZPcd{n0 z;l0Owx5j5`eazd_J{g7Hf0uaQ%#qoxb9lKo$K2WU^um1;^WSHTuW$5z{-@c~t1{`Tey%6ZhLS20b6(^(Shr-(TN1{x6jKA!GYqPn6#Wgz9~; z{s*|P=SMm3!OQ1d%{TeIThmva*V-P|gL2-Y(06cYp|1sK3~Wo_Fqxt z46KiPV%>jNw@o9dK#QESi9z=@e%4LDpnr{z2F$USM)HJf7Bc+XTNlLhpbwP z?!*733l7QrS^K0gw^7oQHc8yHc;bFf`&IYH6Wjlq(Rz*bHP@d&4N&uajroIgpZ;F0 z^}~I1zcfF^w}Cu*GrGUsjr(<+Uvos0_j@sZ2=8q^U^vgUq}Jw?np*<(9R{xc`)mD= z^WW1mFTVA3PkEqPsQIwg$91hcKfE3}^xpK%(BIQg$QYlQ!<*->-C^hO{;G8Ul~-Pt zhYue(mivd4`{;h2lrkRS=KItsGSz3%+ov(VJ6@@AKfJfx59a>}?rSX+Kk2XayS&%f z-|GKp*5?0K_bvBLyk_{Xe*NS4Z~cJPe01OA{t`I91kNk(L5pJ9Y!_baZ*zVx?^pic zsCj%%&->fQ%Z`eAi*$Cpo>N$k6YfLn`>1+;eKTqx~fp#mnr|@ zoPo!Gd_aZe|C%)y;J=0Xf{OA%!|8REmkjTf`=zVTz-4?y5JI`HuNjo`vJ1waSf8TX z7w|FaZ}fAO_xgR{yn*uGYQBE&wfg*vX9NJqzDGSk0f}*7`KxC*~Kc`w{4VG`+nE z^!CDi#>tfXwaR^X+NiNQeAaukcw_yZ&YL(Ne_*vfp!@zcA^g0z{152<$h_ZbzvX`5 zI``^)s{MBEo?Gif?>*f&eKOShblhCyXkELbj>l&*zd_gMA0E;*y5E!g5AHj^iaETh z`>!yM2ky(@;05|L50MM5C*RLuE>B>Luh#f5^<#FdPyJeGtb_+D6&V$Qg%-N-{m)L*O zm~i5It@l6c$E2~(G8Qm~xqbBflkdk*n@C^(RLPHxkh#gx;@5rC*Khm#>Rj%ddo!t~ zkBsp{bl!~*G)^#if~WVvHc)#Gt@#D&{DE4Zj%~U5KAK-&q?)MQ*YP~7lU_f+xBiv# z-s|Z%Yj?0t?^Ux#_j{~+`at^nMxVd`bZdP-E@u9&Ja~BD8N8s}Z>1Kr!6`1vF}h#R z9A0zpaK`!UI^FtPbldtht@qh{eHP3 zeB3`8_l@4e^+2AlwZ7S44t2iSK6tL%Cf`@iYmG0s)~~#`nCtYE<~c9!2(0ISsya`$ zF-Eo(Y*^VOOJ?n2J*s_Dw!D+rmmJuDc$nDOYNf0F8au=PwZzgEr)4c#yOvnn;vDuo zd{@o4y1y0 zveE(GQ{SJ@($6c?&(-h1cPUlyz07yyyRK1qF~1k@yD`81PL22Rd%@gaMvbo+-p`w{ zOXlS5lG&gzXOE;MmNQQ$ToU1b_=E^@{3zd8>irYozQ+3M116aofX4h|ecIm>#~6P~ z_!P-yoUbS;T9(t>XYzd$^XnR3^wMdqSjUCov#Iy1#v7;~usUz@0TbujYbp@q+cBlx z#0}n>u%?gC)SO%&;Ez$gI={xTR`)&4_r|(xosak!{+qFUwX+!`XPlfly!7&$Iega6 z&hY6xK3%iRa{v8b*_vId`;WL+>VpUOnU_64zjiC@EUjbSWv-daqjPwzk23WM+uKL% zZ|})%YyGyjZ*=aPeg}L&fd6jnul#rO0Ly>fS6|>+FAuQ3SY!V{zF!ce`C8v|YkY3r zZ)$v+^SiOW*7dxao>$vfo*Q1f_V9|ie(vk>!$G`1#AEvSiHa=WqaB|xwg0wt3uW^f z=Buq~khM$p$fCksvUt{RSu$r2{O^D(8t(_i{Hm9xR;D#G;%KA$LE7(+_dVT5kBRwJ z_f@N{X4|}7wOr$T)q4xLzv?u+A7H%<1#tpaIj+wOr0%cL{6=H`ZusA2V*X|Gn^}u*mz03wf?YB<-)jFHv_C(+1`SV;_^A={ z+^1sYQ=g2LXFnAV@5dPKd$Iq-G0#yCg#QyX=hyx|tNjIWk+Lv7PS&!XOcffm6}{bV zxbOD&DfcyZ*SO!r{;oBg_w?RgQ_6jh>t+^}ZzFX^SP~Arp zjn?a!zO9vuj`L}4U-e!&rDJ_Nn8R=LeRSW%{C0i*U&UITKl!oc{{8#+96$Frtas+m z&Zeg~&CKQT#`Z>?(}Pc|_dvX(_aF1e{VwNCJmm3TeWlC!omjJm@2FOFU-@s(QwZ-v z;{8zGo0wng`v$J&6WgQxrnYBwpB&%SedW2y?UnBV->$Ms zsaahw)vFq1b;(|MZ~5=}fHh0n;Qk2BH??xhB~wE)Iko23!7;z`Fo^etr^;E&d*$&+ z-mhCXgzm%rRp@>Y)}r&~xh6jFVt?L?<01Sv+z;Zv$@$&9-_-iNoL}?(;GAFceK+UV zT0il=#y$)2gTdUNkM_?c=U48}&TWv?s9YKQY$BXbluv&$L7x3&40=D_r@ed%`gwiY z(;J5FYj0o7l!?B?ut|~?O<#ZfbXky|;HzYOf0M4=2k+~-P85ykzMa=&xo>q|w>@az zzrCLPocH*zoJaQ?{aR06|FQFTyjYwt##{4?(-K@(=O+OvpGp0|CLdW&h zZe>lZ2I2s{FV8&keZ41_-iuT3%cHfv(bngGs&)PV_vOMsKl4oJ$6SZ*EB6ahWQRKr z>G5BEm-;j9Rr1F9M&rKWzuWI%xo>lTore3w0VDZNy~e+mw}0El{WjZ<16$vFPTZ5uh4fODBm}EzrUx)*7t3U@5TCRt>$~&S9@-Kvae?4 z4yj(*ARAWfl4bLh`%OmsmHQr6E@*`-UaSvijCOkQzSh%}UoQ8FxvlEX*|%yX&o+^3V_ zzakOMpQbTBIzQI*^J%WHypNhZftY`i(A&paKH)MaF-qv|;~pLKa9 zVs=;eL%8p8+*r$VtMxXf_wN0s+&BC;y5seq26B8a&NuURjGno9zN`5r2B!Y4x^MVF zEzfM5+?iwWiLo=E*7^1EJ#(@}$N0>Bc&}LQa}RE_X4h!kf2#RD+}AmL_t574h_N(A;X9jrUwweiOR{~vuJ*fr&(nV8zlUJ$H}O9{z;gWw z*7Xfu&2MDPuW^9Z`uyByTe)v*eTMI5Oka=fTBN={-^Y9SsQ3EF|9rgOw@;;~GC3*jV3= zqwCn7;vD1a=Rv=V0eGvmIt6E}?;2NKqzel`pb>Gg@hcDFgt( z-j9#_@Lsvhn(J2g^?rP#asTP+{zt_xF^}gS_x$efXWrJq16(g_i9z5#x?fA2vUR4p z54Y(>uw#5Smoa_~-{t4O7xQ>Nz}Nu)8{GfRs{!b~S;PMc*2D&Gz29)3oGm2w4;kn4 z^8P>$pwDeA$@4YL&y|K^MV@e;eT`fPyYK}%|3iDhbUaw=LE00dJ)w5J5B!JL3Ei=P z;25D{>1yA~g$KC5#6E+i%vI5tU-fPg*ZW8;nX^wymoWxl>SdnptCp&+YF%waozK+Z z+&UliI*r{GwqEymolk3hE0>>QP2Bzv*s(zL-qiYRz0bavj_WCO41v!vwZ5QwpZQKf z^*&SU3+TRoe4nxWm5kqy{JkFM7tY*`{_iH;7&*Q$HUt71c`p&tw_jBdAKF52W`U&0Ux^T9``8sM)I##IL+qfpTqg^|S zvV8Ws)woo3DwOkHKaYv`&3L!VeQM*XkB0YXrt+TqTo^y#S)IeXXLhF1{UYl8dJpb* zKKriRWnE>>_eZ-I=hM{vAOHBH;uqom-8;9P{`2RU8>-x|bmlRy$h#-k7VV$%*6QVV zXrG^IzSjTiJZR4E`n=$}zu6Aff1U53Tvup~#fBuX;zWl6% zPGJ+`k&RrBn`hH^PLH2Cx13*%2NYTdtkX3XnOedh2f_vJj?KLGbD*H*BGP`0crNEVIxH@iN|j7Mspukv4ii^qGlZhgb# z{^-5_Cmy`G-?L^+#MA;@KWg}||LI6yfUo5|=~$m~--GJ8>a;%wSj@J89rM>YUDf1S zE3*@1Ir^{?tjS4~%7Ro`hp(k4gkEr6^O1AR^Qt*loAKFO`1~!LTdf~yub2V;rxvId z>_8vtKw0r--%`f&mlhx3{xbBc=QpE$kLUYd-XCgr%Zid#dfv6}?`ePVIG>KSfpTx0 zPq}Yv_E!5n{rATDY#gwfTz|!i^C3_lVPgfg>IXE22-17M=DVL+=8f@zSJq`kMkZj^N{3^DE40mh7}cPF4!MPsRr%?RQd=cl)9u%iw(;v41YwpTk&RCUw39 z^7|=f?jHQd4@^}4vv%i1*6y0j+Wk`{FP5A?K8kzy#LAM)cv+Dh&;9$7SjRs_*5)Tm zWnQvWV9RqsPO_}UZqT(p^qj-zYGc!U>*xzC8n#!Z zCxAG!Uy+mKTbGyY+rVq9z(!C#BgF?l$cNL++PgN-S8h<#gDa}-aLBhM->lW)tHD=! z*u=3$#`|WF?;G7$?tkX9a))~<^!D~j)83}X*5`lPy07zi?%uxToI7`x^&Xn(9WN)} z57hbfo?NE?SS@_n#KIAM+jT3soofX-v_0Bmg z=iDhuSp%+|{R*}#3(_3Ldd{2njH;%1*ub`8;q0Bhk~um*?SL$pz0Ws0zZL#7XQfbU zeu13#W4FnVRXdgc{(2v|w(Ya=>V57QpI7rUy*bKxg>v5VUi*4O>Unxx<9z>f+}D`A z!5iPBmgukX1=sikbv`o=>DKwnRve|K+5B_=zD0$5Sd+U&vQiH_S;?(VHoVVDJm6#| z?sHPn{n+S@z6r$r6UWW)O@RNC$L2dz$7jI(aINh*u~Uinr%rTYr%Yt+o+(Zeb^eU# zFef`IOyhoMZj#pg;+(~tTgLmH6naCRrj^8@9O1C@|kzuQSLjM z?>99)&i$vY``XKY=k_hucs(o4&HK@Ya$*p;KQqOw(XC^WW*&mZE6RNrrq<84ozJiF ze<1faKETg?*AE26{$30a;JeFzzYnl6z)sd?(3+r*yZUoA@;8mmcQXD*K5wA$y2fma zIVY^|Bs1dx<3Va?fx?6cnayznj?ZCxE^ENeO~gN>#`;RqVwoGxwZz&GOS2M~FOtCZ zl)!w^B!~IpAj#3~Rk<0?T>8`J%~mwiv(oGob*V=wieP8_!x^MlEjy>o& z#3{z>du922&1-)C-&8WQNpdrf__E=Bw&8t?<$Xf4lM%nqNl)12q$M`^!lo=>z0TPZ zIb|Me_ss!$zrCrPR_M}XU=t~WCk-Y9nzX3oCyC?p@PFHCZ=8dnyuKAf%*Hzz5|H$OGT zVGfBipZao1)@)}^VKeisn^}jh#g~_P$jQy z11yY-uwZ+p9`hsI950B8;2LoejRgfj->1O5U$}X{e6AsjX~g5xBu~LLq{wG`2G`82 zm@t{c`_IQeEW)>};QA{ke^{TJDC7a6`fqqspuIfg`8pSF1Zwr(9B_Yj%v706txviC z_S=^G$BrrY85@~B`v(gaEcjMcRn@yaJv|qmI``@2zjOPhbC!Fs?C1V}m21mP%)f>) z6ul3x=|`~qH@dHVN>=;RsrkWs;sLGs+uEPie#?K$`vCu4P8?|YXE*b>Ewi|dW}R(byC8nNZNF) z?nh2_^t$13M;}j*48u;9bY7Fn*m36cX-;|s`#`tTIL7=Dj^Rh5r#bi$UrubSQQe?{@MsyPTPMhkeE50VC_+KXaeD;j;OyvU;h` zkAah#mz$crTla(4meXoSpLs-OoyDCDsQCt#H2u?(c#7+nxC7Yq&4ZQYSiW5%=g= zNX%bEKTj6Ck93s#8uJ4*f07di|C7TeJF5Sw)2C4T!v}DFG9sr@0}Rvi12-d_YvK`bDYKT3?64~5GRxO%mCS3Bk5ctnOr;R8f%QO z`gk_4DPYWTR$Mso1hq$E0O|zJT51Rz^O9r}b;2$Ab}UcF@|82%(-UIx3A%32EVw_P zm|y46f95lvQQdbm-`}(6aqd6WnE#`Xigg~(ty?#_=gMi>zmN4*%gaoy&y4X=>oa{w z#4$Qnso&jjU-@r*K%nODkNw@cpQr!IeKX(B9|I`I1Mz_OxV5&HYU`==Z0Y@1SleXB zoD5wv6rY+#Jts+45@Tu1H5(tFk8Z0LDA$vS4-+&_oZ^CO#>9;rO9c9ug+320Q9TLc zJ~3QV3Hn-t$-K{G6K8VW>9uE&9FZnDNn4~Ki~3&P5t*6Q4(GejwjKcQ;eU?dKYkz` zWOO?P@PBSWGh^Kv13W(d_cMr zSFB;~&$46G9hqZKz5Zu@k5Rt6<^d%Id&%q3ceFk`v)z{k@3YYREW>^D9`0u*9fJFZ zoQwo)yz+m)lNQ(DON?62Jvx?4bl76z{zb(6#c2Nw=J-aNxIcEvcw&DG^#So9fjB_V zqd9My2ZXCnm?Wt{&wq-sc3+Pr!{KC}7mO74^_&|_#e!t@F}!aw@XmK4*U)It=ce)A znfMNk162PPkb5jojY0e4WkYtdR8eEp@%t^*myP}_|AXPi1A0Hc*~I*MAKpusE%$HT zVh!h>o>95~RCQmuPcQ$?TQ{9Er%%yOuov!^lGD1iKEA)!CAPtR)qipq!+k&hRrB4N z{}Z|Ij{gPpe98soQWr3;yS%SY)SS(|Qd5^Rhdg8M#NeH%*J-za0TcALK0 z<;5-33fpDP(r!51V|2T0gNFi2bKq4&Yqj12{kGrzbh;3z9T0!0Nu{2=UYl z@Z~0E(DNIo=hwA~?)f(F!F%#tCw5Z6#!ljW7-NiK4gs-;6Qgs9CR>}pzCNz+k%W)P zh?wT&5O>Uuk8reJup%wqDWk4fiS}=rkw%T5{utGJIKNHT=QWldUo3Otsh{hbT{(_& z-{?N;X1)FP+vxBuM`QloyXk=*5%WK7-GA`lp4_^5Lk#yBQ!FnlHM(!s=?(T(x~;me zTz?FKnxECLPmZDvwE*9+ zO;V%xNq*W9$xH2YvXjvKq+=G!|75mPfXn|J^gl1B!AjBUdGS8mhWqe6Q8|x)0Ga52M*Lo1YRnFa zi>M^$UoO+9E|c&{i|FN_E8*iZ&H5h7cOC1~dvusFKdkx!yNy5BeYhAM1l^B?x6ul& zfoSa!g1>5&$J#R#<+p6Zdp{-&%GF zK<_ir`&4Q`spvu?*F=&tePTRwL*wCTq7z|k5;lSTBqwY_B7LICPB`_X$Vn;er(o03 z8?_l6Pv^DiY-h2ZiOt4laZP4BVdH1Azs8A}R3mAz`_TI%lCRuP4CX$Zce$Ts_FtxNP=ipN&&_J5me)ay-$7pA z=F3ch^C`-A;(lX2-fOPU@gyEsBwF4p_p^xq(SBcA>~3FD%og(fH4+oP!iku?6z&(( z(?5grINj*H#%hfBnV3zjjp2grSRroXICctl65NHGF;m9TAB3Is1Uq>gpD{-LLx@$L zM^7BfG1tO({Dz~P$H(xVW6_rhCf-O7pW_h_O;IG1o}2pw%;R_v#;`qR z{u7{&DT>YGQ^qb~uE|>Fmux}z_e*wS8|d;G%}?y*dIm|o=s!qiI|Zx!PXp=10~yo; zGP`{__<-E(PRY&g0PRwcdk9YLH@)vqkE>6^S7>cQ=i%;U&7Bs*`RvSY`gHJjDa857 z@ELAr6VDrtE6)v-^DgwUVD2XpA1D%z_%h>KB|UDxq{P%qe8hV0*RhJ6e+4=JBF^V* z_@74XAC13_#7=)4LhE|UBIL`nouJ31mbK8@#u$#mu#Xe^-dgT|H` z^QXi6Thf@L2Ndz#$Svk{XQqxY*Mdg?|eK75B{CA6UT?UIw+ZMdJKe24pn z_b&I9|Jlm_Q~>{Tl>f#D5GPn4Aov0J-zl08C}z$GW$oLV{p|dM zqH#)gW|u`;hh(Rs^@&>Jpsts61RQp9h~?F)53rz*$G^>SecU`p^`6%m?zj8&J&64! zGj5-g5LHXPf2|WaWhMXpQhcnQJN)|i+0K-)g`6|&m_p9)Y|ih`wjcMLDZIxd-eb!6 zLTA!**s-B@(sMJl=D=gF9a|t%#}*L(O*gfHIC6wk>Iz!xqt53Pl5@^aj5fVLYv>zV zOFp`h9>dMl`8D1*`si}TlmN*^bTIUAaA_!rrab3@9yrFUArFV{?p9& zmHYSL{vq=Q8Ql1=aJjv3+rc7&o3yGG&DAH(pHVPWjeYrZNd`x46tF7ET&=g zn(>3!QRBym$;&LJV0mril;w;iX>R#s=;NAydWa5NC9&ZZ5+7MDNz?0y_xDO>{2?^I zLvj+jx!=Sw_yPA)e;?mq>-=_nU)Rlg^UXKq`t|GFqttAnw=RLosyN<;3U%joe;5xn(#_^S%yYv zUr4zVIZds%ueOZ)JC{*6E_bF+b!`|nyuyi^Rv~ebYsoJwjLt-dt;JTdUx{7k#A0K@ z)=_`j;KW31fbUgKTtp3VX`Pc2vy1EW05z&Z)cMJG+ z;Cv4H@83@2HR=T^^M@Q^WLICpQ`X^B?3U z*%%-dz^%bEyVuB zd6QQ;Q^qgG&o3iJBiEYbT5tbj?P7d~zILfY9Ee6NCGLBIuH}2oT`;F#>ljx1&Dtb3{|~PJE9dRnUV$2*7xQZ@pwHb}V0#>y z3qfqbeL!aEI4Ik5=19fjld@pWN#=dG%ADM7k`}j?+;Fw>7hcv#LgbDhY-ig=L>+#@ z1zH_HeFyh~0+IES5XEtW21$yl2RqU8MoEfpl*H&=l5DVBQlgsR{9ZJvnd|Z(x#?j^ zk4LBC@I~?6l9|}UbqkVu0h~{Q<4GsDu1^?Wz_#wg2cY~9g6e-x8m~(`#y#n=8Cdk+ z9|L5=JCK({JdmwEL30DPbFd?jm($7fG;io&96{>`ZQzL6))>Op7HoWBK7;o$JcsL9 zCidWS(|J4vn|w@i{ouE;P4B`;%WqPjp#H&&0W=O!KcLWU9si*3!JwO*A0L@`6p-&E z;_DKRn*T2gn~~5(9MvxAF|FqRPUM`#L~J59TSuH$&b_)z)fdqFOFrNt0vkbo5HV#{ z2*TM90eM=u2Yt-jc5N6ojQ6%!iCqrgi6tj8)-b66O(~F)S@o)A=EzMW!lqAAGwa}R}$}6(R)&zmrRXc<9;(fjvq)j@VMhy<^En`+&Qu6KI8ir z1_y}wUpHLr>h6@r26TVctY2DRpW!}p_=eH_lP8YD{avgFy^1-!*-|kVokst65SMFD zvR!w;T3u(jR>v%<0cb7Lu1)0j{ix=9@YntVxxdK)cwFZ)>T6jOgg9TvL3NHJ>zVM_ zwnY`Pb^TSRWzS18bm1$`fyQCkv_|8~b?~yxNsihGA9p*cTr(N*ZBANjn`@82)g%6G zeJnk;o$IRueQA?SqchfKuut6SWW-UsPUymRz-^61JJENIH@X>*hARn2sZaI53u5;~ z>Ky%ShC4_v;ReZzUf|C4a!Bw87S6t+`%ekwj84Zo4mOAY|XKu(rI{Q#er z!)N8NpRL>Y13z@1<2x#|Ow=wX7}+UH=vf97pxE9aBodJ?}cQDHuV|L(Z@ zOve5AJdWvqODtf{Pg-m%K7PNG6tx>aypz7)?fB+eCq8nk#7Av2Hc@T(R{Z%^C!Sa# z*v7IS2NHP9*a&Qxx4#)p*y6;5V7V_ExnUPWIlyT3I zWeZ!#_vg|#INg~|U5}oB=JXKfGv{ZO>OFIabX<>KUS|`%ymo9)be`Tj@6x9RB{9v))70PZQbi}mML zui$=sIkIkU2KVD54p%)!mjm+>be!MT0qE`X->b{iH8cjmANaZN`hY;(uYSR-^>6x{ z$rrR|0Ii4rx(>r^jr+5tv3#fOskeFLBwH(8q#7Fe0<*}2*(c+ftSsV%Y!~M7;OBT;=U67MR}f$1rtvu`d~PzIo6|)r|<51{EYS6xLK{?57+xX`d8*9gu(qh*327_S6_eCaIveagZrvB__<$QUHw_@ z=U483|NGz1`R9NB=Sd>+%r63+zpvcCHaz5X`cSOy?;EW_Zs)GgZa!x+x0c-5AhLZEfdv!jg8QK?cLd`ImT@I{Fkhe zGd*uR*Dif1zy0OEa=!Tf59IUj{Dt%K{oj=nN1k`qa9{VF#C7!9ZRFai*IrTOIQF=? zmbk8{Bg0wOW|4zuajj(~oeZ(?((LCXVz~|#*=*}IX)W)O+{eCNzkNK{T*t(*ee9od zt@50G^gJgK%WL!CzP?9p@+oYevAN0Elv8N_X*hO@JOImk=WyKYtN&1+kaC*$J7u1m zjc>?H=e^)uPAcD#{p{2}#?`TDC$R8|*grSqIpOii)kN3=T-#cK{ zH|cTXqs-^qZTCCrcjG(qJNON1?Qh{f3HfdMTlF`a-w&_x8T>cOeYN^uVazwyK5n$jLtH{0ovJWa+|L&cKC! zdF9pD;Qp}F(a|mq4Ru=U`^$w37k;>D)24Um@$Y~4-FK`0{LlY9`)P1r*Xh+>{;S*z zOu4^{+F~hn{>o)@q+veGs`~Sq3X&k`o^u4n=R|P7BQlk7!J^nSDPzw6I@a{4%BF7@-fuzkx1#yAjO*1>+ux4%Z)XmV0oU|) zQ0rOmxbjAiVRyr;CFxPz%V@4#VvO&VS6=0woWs)D*)DZ;by8GR^yf>LF8z9KZSCu) zPoF;Z!3Q6#`@s)>knu17@-Gv95zW`v{si5>b?b((J}~PA9FvBf4YF#*a%Tx^+|@41 zbGjGKkRz;#)37jKsut%vRSWW@isKs=5RQ+qPLkz zXCy1-jFXXcdQ_Xm@tm|XXz3X=^{lbFoy~S8HW!<%HXWPFbJEXHuRnthpS3m(o5p^| zIqX@#wcBTz(|eZK{TzM$XC*(xo@4*Klb5cxA8Q}ieZ>s-v0$68$Ft5m`5B|wjL_re zIo>hP^4h$#px2J_86!VG@EyGn67-^Op`^UQDc{)gcI!XD#4(*Mf+@3OGo ze`@|?_Otmo`)=sWpR$4bPn}+Cb3MqeXWz8c$)KX-iK@9lw>5I9$`;8 zX$fsSr@={yU(ffba`e85?Je&+-EH5IjzfPehYx(uY1;YwQn&33PEFM<<~g=Hi{@9! zq8XV^X;HeA&(Cry=4Hw{;^KA1S+araetil3r(EM3N^-?;B8VFsx!$W-FSdG7u55-& zHH-44cG*m4&&onMTt3%XQNY@RE9N_c{paMx7hgp8uR5LW9ftd8{`V>?D?hh?|Ngr} zLqly}``Xu5eDu*rN&oh5|2FOy<^GT1{+&Cw|38xVKKqxfZS-gI`m6t!Jh=CJa`O1Q%u_oqNeLTddU%;kXDmJ{ za*sq$?*hHxglmsuJ?L?^qp(qGLlMLNe;y}zjpD!ZTJJS{S6(0MexF$0Pq$;EJ+SZJ z4n8*8@!-e3?I7#_4DYkm27mu2{~rH$;yvu|wXf6Tx*xFi`v)I;(*L8s`$><*aIU<^ zymRQ^=XLg2uf#;_c@0>5{=LULxh|TxMm9=h*hbva{h2WN_d+vVZS8Jb#fS#iub2G*wdcx~1Ni8pm}V&vl*{=I4UBez}G-l0agF zAL(o>^jKz6B>pW@vQr|ZAU#@2@{@?4rpY||T6%iAbge$ob^AIyI~d=uXAP~&ud#m5 z1J(RjUww7Qcfb4HqQC$9zmNL&fB*OAeo^jg%>VHD2aGAw+jENE9>({VEng}L39&Mj z_0qx_*9hZ&NZ}r)+3g7COGboE^&>K9JA!%fk>T`0@|sA4X=Xo?x$)B@=#K<;+uLV- zR^~%R0kzYaGaqU8!}-rsxi@H?eDfP0$q#?<_wfJ6^0nXmE7mvpA?q4`U*35APvzmm zKcXMnol8Nbghw>+K1V<=I0;TjLuC-^@V$AheH|NIE&xe9$v#K)pH=yBctIS|fseihK~^4RC_d%}CT zep_VP)LIFnmLJJDaS``V+S%|(4jlXjdiVQ`Z~Z=FYTuRZJHYnuGOz7>vTf_@5+6r@ zIO_*bV?B{D`gp^czY_)`;6*qb2v+Ip6ut-^vFc{M7mU=Rd;!$a(9nAMhK#M}N`>vSHmBNl9j1 znD{D5PTK7x(0`Yb((fcD4oYhBB_}EQBKz2+LDvTMlad14DJhqE&Ly66G3dGa8r|39 z`ndNVf#ZQ=-g|kL&riL?_qZs@e2-8&$o>UUBq!VLWFfZy^O zCq90F*A8I&Md58HCiZjeyd);Lmi@T6^Z53W_B_YWi6TDXyb~LXjep$6#GK_h=N)U$ zh1yv5qt8k-h>bn#L`R?b&)KLm#5|`ZCgzM2^bbF?^Uecb*iN6gx|oEydr|I$d4e(m!xs?~TWHr*N+fALDPwzVL-FRDAo}-!A## z4}X~ckN^0OVXFB)pYIdDDEI&7Z+<%W?YCb4|K5G~9l^J7FWv#^=5uu(e|`N9{Z3L_ zyG^z$wr`UiJ8BK;>b6UL-464dhWa{D>};q94JL1BY~0CQgq`#x@08t)8>$b}If)8g zk3@Ti_p%nDVjuH{_4D*z1mraa_&c+Hn64eF+XoKpmyY&ha{cCO@^^pxZ}Qha`d{*= zfAWv=jo41e$+^h5 z_)X5~ZE)*n;Ewya_uMDhCq3`U@1K)%i|^v$rn{~7ab#!TGGv3eN>8A-JqQ z_UD9seQFBd!MsK_pcVhW6;yK%gLXN5=v_I{`#tIE`U`1m`%7s%{1) zM=~(*CsJ0{EajyeWbN8A*|1@~R996=&8BMET(e2GZrLo`wrv4hrB-2h0Vm+ejvd>{ z(cy&QMIGFL7k*B_2kPjC6ZGrtayg;vaq2xVj~(lk0s8uGT)R$x{jgc5cj)TXfBM|# zK3DVqxA!IBQ5;wP;5g1^$kT{Ia?)v{;&y=P$(g-k@0zKbX z-|Mc|RbAavuivY8714ZibMp^Ro;>+iME8oK+;pjQPwjhpdVZXil9-Z|m@t%+oz0Vz z;(2t`el-HVg`pwA>MrE;2?*Gs1_JI1+@OahC{Xqhy1Y@ zFbt5+_i`%Ycr2uA_u1PB7@@VXUFX0*@W4J7eTcrpAn$}@9AOy8UchiW4CDG^!qM0; zCS~SKf?t!;@-cwYX^9*pYrpc zF9L6VOPPs%5q|f^Hf7D4W88mDGxoY`=f1w}%IBZA@ee<2L!OK_9um^6F84L_Pd}k} z)}^Z7>J=n^t6LD~vh~Z&D&?|8%$th6@~}_tSL#lphn)dx0MSFhPCH!$szJziznf@b zH;#jM^N=9WL`V=12?ia2EU|`_8!^6YhzFc%qv=7{IYfP!bapm1ICVPD)Nvl9CdY)Z}C(1;;5V$x2#Us*;+TqNJy%XvgU|PtQnGGSkx( z=p~h`jC3V46EHJN$;!%94rd=$vJYn|*#xzc4VbOum{4-E6;qB0G@PR_lSz>zDokNa zLSYJIA3!tUQMK?`EAKur3|-&=ueJ881^NAIZtgiXFYjwrlFs6ueM)$Ejr!3?QR=UM z{h9jkuNJAZ9{yaN^~ffihoMBH9I!(=j#eLeBu0Jo(P$I_>DajtZX&$CPIvqW`ql0g zgL_c1-OF}w8XFb;IOsS^oi&Tf0gNdMWxtCOtv>wleyz-!6^ZM|mS6oUQni%`Kv5iZ z4?i5CKJ*ZkeLA>LyY|5c_o=oL4(MD6hq?!B1>YkT-zXG<;+W1+?xzx_;#+rVWhUCY zEPH|5qt2YUQ=NI=3iaN57OMB${f_$lb4yj9#mVZH&9$n({|R-)if(n;vJ+bQ39bF`YCWsa^x<~2hO<&g1R$qEAl{kK+DR{kt1D*E++fL$Mgr!P!RO??mgfcdSh zE%Te3n&xADfYLm_g-VMkEgGJ#v6WUpTWJGqYimQX!S=TH`R(m(DDCq*sC0Co2uR20 zFP)vZ28Cc-Tj#>s+P>}0O~c(i-NU^t&BG_k%ZEGj^M~6D3x`_^3Wl03mZ8RsjFa^n zH?rC}&uy&z&7+^zKK|HZ>l2S}u(~}FW_5ErWPRd^B$Pyy1g*HcC!#*VUg(%gyd8>q zJ=9-M^}2KS1gpEQZ`(cSUR2`k&~a}EUf={2ZS3u6d{5BWZDY1UI(M$q<0m?fw?6)O zoUYJ073zoXO(kv;DDDaP*g@-Kj~zlGs4I`-Si8qT-F@hubWY`v9qPw%k;jk4SRZ?I zxAoCque3fg>;J5eKlZV8(V{TxjvZCC0Rg9Kw`}RJ-Msl+?S>8K>NajXSGR20xw_)w zp~je)!Kyuba<&{koU7oVn0eYaK(ZyJrXeD}Rbr@g0;~sNlQv?WlzzX zYf+I}b^N$m23UObC_gI8gZVKrO}U?a8Yg>tEH}HkeJ*==tU(EuJw4-PFRxUTbUUQu zG<%_AeG%6PJVE{S;#^;+KNfg`qAzE>9!J-RHgui6jb|#x?Of8G>h$MyoQ9&Wb8b)P z0#8sJi|a(4s25P*j*jU*`Z{r)fX;Z)hUzc0h&J?2V(~xjlHJ``${zS%=l#zHdHp(B z-XD3|92~5ew{BG}+qbKhEnC!Fe}6T1^JboV_%J_u;6UG|%*^ADRaRF21ib8rU0q#& zLpt<1Lif2zuFI(?eY=;+`}&Yt0&Jw3dkwMD5Z zFXxp-MM~-M)fYP+l-6u!`nL@&+tv|pMmGsw-wLt>Ujx2 z{uv#8IFH@=T)bmPAFkVqYeXLeGqwABdG2RkUYkwsZcEuSPc1Y3-=Z)nD5yq?j2x5# z13BBVLuD|T%Sd}ILzQNUjpY_e;+D9$hIa}JEAAp4+KCe<{+j&c`uqF;Vq`?oWbA7_ zr;YnxT&%+Iu=4%3Ha@4blNa@#gwuvbzvc|0R0~a{U1AajOXX(4&}zi)>@zk zV6(lJ;T!M;^YB>5JU#bf9;IMT(Y(?Zn&(+gb=ut1)e&A?r_qfLC$2r;HH6pShv-g> zL$np=1jYUIb>et3oVaG9dx`r9D6S<);}P`&QoXpB{<-yI7i~pf`nIA@5A|*7T7h%a zdwC_|{|aFq?kkzQ+o$aH*VZxrHCZe&vRm4_SCMz_9-5%s95JS;H;0wY(rL zjUP-*EcYf}kM-z3^!E1NK|XSrJGVfd{1*7gCELyny1h8MyT{e5^r45pY`xoH?u=1j#JC~WwMu5TmiTtU&-L{PL5IC1U@it7kEUt@d!B$Ii1?g6h~ z1L(tEerXL`u_B#?g!Zz4U0g;aehcXTsS_u7ZtqE@x%&jKtFKdPAoqj*l@iDS+8Q7~pXa5e z^~ipHnQYFSwUWF0=in; zrKXm9kT0wu<6ob2KG}DpuaEybbO1ZC255yGP~XzbYs<@cRY?gi1N|4{TX5va5uV4` zx!m2mOU!S-9VB^q`9cq{6l;Jj%*!(t^X@Qs4bg>!az3cPMjSi0p?ZBGy#5+-?A%^| zF0RqHb=9Z7UL3n>C-4(N=Qd&t`fJ5C6XC>l&eu4fOL*TB-g^e#eLrA zlg&*7cjdoFLxbuMVED6 z-@fQCxjpe2^YrpJd3x@H9w5`?=|yvwf&Vi*ly&D4>Iv^$N9TkSklNC@9**`o8BTZK ziQ0-j#n=QCV;18Q=lVYMZN;%O6l2uaPxMUUzIrIyP#SPg43K`RkJm#FP}c}OAb5Wz=)V-D5Hdgk=s(wF>Nf`l z7PCLRxkK{w{2V;T7c#&O%)>+AMZ}|M{$6OIIj+Cf`CN~qV~u8XZN#~N&e!YDFXS5M z>%~1qJ@w&yEb8?Ai#l=bWKgtohSbKV(ctwP@xEzY@5dG|j$^^WEo{#o zMIyN#>v~O>N5`<`S%~&w&ykapdv|1Hl(|{0wf_oVvA-jGJ@I<7(+j#c?B_Qo{nIz; z)G2;vYpc2*wt%XhZeHICJz!N8hc6H>$9JFzbLa@^0WB6K_h3w;+2@Oc$eFZ8@^JHE z?jCC)i$-F8W&zT?H9HlmvpCf`Un9;h^g40*WM(i#A|p=$8{3fKXUgZ>MT98vQN3b-XR zvseCVTRwZ^jqQ*De3+NV3g`lNV-1i7T_Eu+3*=aBe%qn`*zANm-}$Aq6@6byAD7bh zo7~?5x!#O-nPc+uJP2OD6+RcsO)tKGR;L zBc-LCi%LqWm|I?M{SVUTQM}vPvuD4j=k>1Ufl+_MejBF47tpPvlgIU)MZcvv6#(jPEu0GhODfz z$Ls3q|AlP!IvHQH*^{r1A>-e$^nKnu#_$LJx7IdwRTumLySsT^XS-sB9uR8)rTlma zFF97IXm)_SJZ?@+?S`*-w*2ZVTcp`uOH3Z_t1x%T7MO~83mp}B*jO1r@WKm)SDWuT zkLzmOUt7E2otfaLbI9c3xgGD&*EHvOU-rQV``OOzb>R03@p#R4hiz#!x(76G*uc#Q zd6hFV1`-b*v@RqWzp1I|pM=fckns&VzgSsrcv!s^Yk=QF2aw&{%dJ=k)WaXRrmPHW z0J}dh*#WQyfUn4ayf>_ZEn2uwdgkfn&;be=;2`EO=>f&M+~EJ?`9Ie6nm#WBFr0aK zuEjUgm(82EiLG3o#e#PCN#N-k&6CZZba>mgaWl#KBM=$mEixHKQQF~qqGLd z%~j1QDJR%k|7_`H_yl`;E{0B;Y=L2#3_BY#z-&zhaOSJ$JHHxycd~m-hCAQb1%9GF z#JZk=-@{MGbEoD*{o)I&P5=A9VX)Danu3CcG#&n?O%B@~(L3UC5Rb=YqNd3RuuJpbJw=}GV9ShJEXa2w_}`JtJ>+r%1x=;1~!dS1UDdXf!zH$Lo@ zSJpD$r5P+Ru$#dbPviBVb-T^p#`D4ZEl6bpecqYqxVWnKj~=c3rNb}xtl^gnyVa%6 zcccB-cQ`V_zuVEFzS_~wQ^5bL$rjMmsMJ(ek}rTlF~P@<98t&@C=Yr-IWDe+`T8bF zzkLxlK&$~gH5niR@+{&}pw9x`U!cB!BAzMu>4m~e>Elw`it&j)wC|p6U9b7+1VV?u z+VtGB%h>zx2bnf)EMh@H1Jakw2_87m$UgflR+{s?A8c4lP44hdn>{-U z{Ey<(&d2`+&%6|Pt=babx6!<}H?8ZFLHi+C*RNvFKD*rX?mK~O{rV%O;NY*3Q$x_b z%^w%JHON;-)9FP;DcPy1J>dxn8lZ{Sz#owGfTO+u#Q$@1xj8+(mu=ZN4;&cIh>vgC zl#x;Lq}5vYucXHp`89@yhDY`IhRuFrK4tLlEB9Xd`qX=%2i%Id;A8L!tiw9MT2rl5 zU=09&U`6u>h76F0Z-5!LKo%Kcl|TA0N_zge6(%?M1bcaHg)JZkdH~9yVOtN|)&kCJ zHTzcxsm7tGhCJ&N{XUA!JaL535 zJHR*LyP~atm(s_@w1v$c@eCB#KzzL_^~Gh4k{GKGZnX|_A)@4)Ld-8~cW zw&4GWljQJ|9!$Z0N^7#RO1$do8b{x{YD{^0-lME@t@572;ZLy;qx@&c4V1~^8(fTRaNT%dgDP`kWzNt*P+ob}+5 zhzoS{hYUbDLet>iE@I$_{-$~%9li;&eH^}H+mJhNIeY%O)#U5Qwr(j!9<4#pxsBI@ zziYNT;`hYssgTV+CFSgagoNsk^71NXHZ?W>lP&h{4DCS!8Q-=ig)#T1?%X&28$Jzd zfWN^S;LXksH4%D1iV3Q3Zd9sa3q*ck1-Svq7f8tm|3_Rfm$S0YVBLFEdi}LP_M|uX zzxxW%Q2^rD;s7ZwNUWa)AHP_5F}&Nk@AI`K9fb^81^INm_F?S)(B~~R&7Hf6E%nVZ z1qF6MzELIO^)`K;ZCy`#e6rs`pJ#?1KQkqzb4PM=$?K5uf2x=9_4+(xZW(m{XEFz- z_x37}wzR4{u>LQHPf#6lgdj~EuYwFfz5o;xc$9nrNe{@_5Z1x<(nlX2V$VFi7Baw6 z=HW(p!oxvRlp}O1#s!idAH3cx9&jhdyb|B8rEJ0cP_|)xDGLql*V*nIyq@?y{B+Hs zp_E5!FexFSeuX5JKB1TK?fEqfzg$D7cfm6ERQoP`{k8gU@C8_gHGqZI0PqQ_MO<(- z`~kJxV2}aG7oY$#fF&*%SpMH`IyIm{3V_b{76Sg~|cPeDRqqRL`d{b)b>4^CF@#-D0)*%;5o%Uy^GyaQ{1S3&bp@CVjn0$WKBSi>vJN^NTZ;SUTMK+et?Vq3qg zmOl7X4D^7o0eCEj9&i)#1d~4y?RP(g|eoZmZBRX2iOipg!l9Ez9x1z%O?+%;&ImF&M zZ1%=nyZE_gytAqK&Q70JW;Qpg>#zo>KzwjL`2*M0@+#;7%E13ACJ6h4jp_kee0-Pe z>zggTGIs~~>oTkXRsrq?&Cwn-A~u+4^J*2!t3f`wh`)hvqNnFl@cLEkqmSdk>s!F< zwY9vk-DxrQ#OrBIk1eFhW^X=ta3CJ~yv4Fy_9(^PQNCQ-6NBRHg&yCSzf*Jm8vo0s z{VxLp>OUYK;3vorEVs8&Jb$|&n4dQ|;ksE~kfs2qAM9U9Mz5ud3OfrDv=VxNCzOq%* z1Gqz~@>L?|s>eFRW#se;$u-k`;M!hl$RSKaXeZ&{Hy!lUp~Wr-4&cO$fqvgVI(_~l;T^M0z+<<%VD z*|W+onwr$5*dL(0tyQU`H9$kXQic3r*ds(Kf*n9x13(98MofU5o_+@VNtQ^97Dm87 zb~Wh%5f_8p0JCGU{-%9`T=D;J!uQb^_8zeL8ir#38|2QLz0~y9TRWJ)zXkC(Cn4vn zCh&9yKOM5+$-++ud*7L{*Cpl6g#SYS!T9)!Kjr3@K1_bOB3~|Ia15Khp~L^P)!|=` z@5Im$r#(Xc2t8mXU=3^mwT-X?)LMB(DRP66F97TSN1y}DBl!IjVhVhy0!_Xtrme_+G~v((f+Y5VpfX+HGpPd~W=d|CJd9b~hS-`b{+7jnSG z@O|>rNd>3tMUF6QQzNG} zKq+#Akw2iw4@_~vGV+6AfB6Q<$0r$av75BLg52FL;C3yWg;`Nk2OYnM4pGW??U5=9!gj;lgmXWpgoj{b}rLtrE?n z*!1|M)2IEf$Zk)(p8WT~@6(f$TYPhJO5AH}>woOLCx($P*P#6?MJv~1zxFl2Pp~Jz zdo3+WE_8ra_ySn5CaAPpm2$)dkNN^2Ke&a~0FpGq4#5_ZUEXZ zED7s)+HY6r0BBvGj_*PQ;&0ZH-O%*ftDD%06&a@8yPL7LA2bo2gXSSqD3VQ|r%--; z8Q%kW*)oM?W^zk%@=z3H{I`xBE5C&&p6SYe&#?x$9s7j6 z3>hE_zCh*h1E@!ikQ(|1R99&_0L>SGVuHvPh<&M8M#fnwIJips@PkczHZBO)0GCs-u8#bt*e?^LmQx9il z^=?Z|Eq;OW<%&HqoMn8&W`E`9h(U+f?>ojC;4k41`~YHt)9nQ00&i1-Z1;6v+6C87ujX-Y=J8??y(H zn++NN`kjl$cjoH+AU+paV2@cJVsI2G&9*s76dcS$PF~0gAMkK*|dM ze_&NM%L>CD7SfkrmPl{Ey_ZpbAUD_o-Q1UupAP%|?*iGnbw|MKPhvle5z41A%IhKH zYx+EjyCd8Es#PlX!66xcU|&K)@&6PSmT7xp=xz2kx;JEegFdc4ecTA|+`a~Q8h$`w z$O~MCynwVvKn;9@Dr;+O{=kp{M*V>i6JXBD8k8d=o8S**VsF14&E~$mlfC=yKDK>Z zC4BL<7<;naY4$tv&x0;cqkHnpB|ZLEU#YMq@a&Y7uJsui#ZQrp-_gOX%$6Uxpg=+hiOj?5qk%Ho;_c#!RxQpTrlo?<9%z%4uCyE{;{Ef&uj1CS&;whd$3O!^num& zb-bdYTw4QZ{=irRAUBu_f8Y_8pFbkS#GI9af=*ANyX2^o)|WLo@0+&gV*19^UwI^T>Jlgc$j}5YyZcw2G~_!uaw|h zP}A9|)F5AQWnHaOihV*x{efk9$efou%wl8v<f=(YcJC1LF%`bQDTGhO3 zmm;O6s+p;&-M*4k_JkFCVvvmA*VlJD?QJdM>V{LEH-HlCmQ|SM{X>gGLHS~Wk zVV{6>!1{&;r3Un``2$y$tH+NO4j(Hj8Y)Ol9nL=xeJVF5X23#w*^`gnh7AgXjBk-; zb(_V~^h8rr+mA?xPdRmn*X#GVCEA}t&wWG3fg1mV@%<5Vz~&2}J_JADZLs|pAr`0_ zI)Iv{MzylCa-^)hOexIC9yuBud^&I2wjm4Y@k2t$7oVp{(!heMs?MMG_V(RDYkJC~ zMKmvL_BLK`(7kxq1~lkys?7n?1Hu;ozIOaG(7xQ-!mB7pXmj%j;sHiV5d&Pjdi5Fe z`|l5$A>(HwKUipC;qY^(Pmla9@`{4i)tjk^d^+@e2HhL;e5%cJV>~YB{%x8=TAO}bo%G3S*{C51uhThKLVN;%m8Q-FB_AMg%CmJUi0R8~qBYhz0 z1dR9j&EBW+-i-HV%mHH#7<0gw1I8RM=72E=j5%P;0b>prbHJDb#vCx_z%`r$xV6il z>Jno^7?f-Mx9tINn|IdeC;_3n@TPK}AFv1YN!BzViHoVIhJj;f6 z`GS3Hc$Y5-_on;1dO>6#BD|{?@Ew77@dC)kq_xkU_yK1Ke8a@}Spx6k0fDylKk)<7 z@NM{sACQJ`!%zHxG<-XL$wUL3<-j*gbb*fp&$E9xZQ5;)PNpxJ?yGfg@1Hk3eA{g^ zmWc~UNpJsY?@yeFyJ#b~RbCOitNV-bkzv99!~GjZtH&RF3;68u)uT1jfnPFuHvWL{ z<7;&_>SW}P>(t3UuLj#+V<*{BX>M@khq| zFy_bjS>dQL=7%vq9J68kkug7v`7wT0IBJafF{S4R^c$0o?|gXZS0-)$o%7&tzjXY> z$~F58oB{of_8YIm)YNlA|22UYXN-Pq0v+WntzXgqcrB98SbVmFCTvFd4P5u z*l7RGui37H8^t^8AZIxB@2tj}<&0l4c7Q(4`0O!w+uIZRNxF9I0|*t~==hxGiBKUr z@M9lfhVAx__v568n>8Lk<^g=hgM-jz#y=W=wd0#{-JAKP9$zzi4n7Z2d$3ZHEopaVU&fBOUIhVO*8yhnYo9ZU U(hkPq&zuK87Crv{R~!HT0b1u?=Kufz diff --git a/indra/newview/installers/windows/uninstall_welcome.bmp b/indra/newview/installers/windows/uninstall_welcome.bmp new file mode 100644 index 0000000000000000000000000000000000000000..097d09429264c6444bcfbff3e0f9b53b5da41d76 GIT binary patch literal 52576 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 ZFOR=x{}X6%)qjCq_FrH<{|k(e{{zaz4F~`L literal 0 HcmV?d00001 diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 3e441bc2f..43ea452b3 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -43,7 +43,7 @@ viewer_dir = os.path.dirname(__file__) # Put it FIRST because some of our build hosts have an ancient install of # indra.util.llmanifest under their system Python! sys.path.insert(0, os.path.join(viewer_dir, os.pardir, "lib", "python")) -from indra.util.llmanifest import LLManifest, main, path_ancestors, CHANNEL_VENDOR_BASE, RELEASE_CHANNEL, ManifestError +from indra.util.llmanifest import LLManifest, main, proper_windows_path, path_ancestors, CHANNEL_VENDOR_BASE, RELEASE_CHANNEL, ManifestError try: from llbase import llsd except ImportError: @@ -404,8 +404,28 @@ class WindowsManifest(ViewerManifest): prev = d return result + + def sign_command(self, *argv): + return [ + "signtool.exe", "sign", "/v", + "/n", self.args['signature'], + "/p", os.environ['VIEWER_SIGNING_PWD'], + "/d","%s" % self.channel(), + "/t","http://timestamp.comodoca.com/authenticode" + ] + list(argv) + + def sign(self, *argv): + subprocess.check_call(self.sign_command(*argv)) def package_finish(self): + if 'signature' in self.args and 'VIEWER_SIGNING_PWD' in os.environ: + try: + self.sign(self.args['configuration']+"\\"+self.final_exe()) + self.sign(self.args['configuration']+"\\SLPlugin.exe") + self.sign(self.args['configuration']+"\\SLVoice.exe") + except: + print "Couldn't sign binaries. Tried to sign %s" % self.args['configuration'] + "\\" + self.final_exe() + # a standard map of strings for replacing in the templates substitution_strings = { 'version' : '.'.join(self.args['version']), @@ -433,14 +453,19 @@ class WindowsManifest(ViewerManifest): substitution_strings['caption'] = self.app_name() + ' ${VERSION}' inst_vars_template = """ - OutFile "%(installer_file)s" - !define INSTNAME "%(app_name_oneword)s" - !define SHORTCUT "%(app_name)s" + !define INSTOUTFILE "%(installer_file)s" + !define INSTEXE "%(final_exe)s" + !define APPNAME "%(app_name)s" + !define APPNAMEONEWORD "%(app_name_oneword)s" + !define VERSION "%(version_short)s" + !define VERSION_LONG "%(version)s" + !define VERSION_DASHES "%(version_dashes)s" !define URLNAME "secondlife" - Caption "%(caption)s" + !define CAPTIONSTR "%(caption)s" + !define VENDORSTR "Singularity Viewer Project" """ - tempfile = "secondlife_setup_tmp.nsi" + tempfile = "singularity_setup_tmp.nsi" # the following replaces strings in the nsi template # it also does python-style % substitution self.replace_in("installers/windows/installer_template.nsi", tempfile, { @@ -448,7 +473,9 @@ class WindowsManifest(ViewerManifest): "%%SOURCE%%":self.get_src_prefix(), "%%INST_VARS%%":inst_vars_template % substitution_strings, "%%INSTALL_FILES%%":self.nsi_file_commands(True), - "%%DELETE_FILES%%":self.nsi_file_commands(False)}) + "%%DELETE_FILES%%":self.nsi_file_commands(False), + "%%WIN64_BIN_BUILD%%":"!define WIN64_BIN_BUILD 1" if self.is_win64() else "", + }) # We use the Unicode version of NSIS, available from # http://www.scratchpaper.com/ @@ -466,19 +493,12 @@ class WindowsManifest(ViewerManifest): # self.remove(self.dst_path_of(tempfile)) - # If we're on a build machine, sign the code using our Authenticode certificate. JC - sign_py = os.path.expandvars("${SIGN}") - if not sign_py or sign_py == "${SIGN}": - sign_py = 'C:\\buildscripts\\code-signing\\sign.py' - else: - sign_py = sign_py.replace('\\', '\\\\\\\\') - python = os.path.expandvars("${PYTHON}") - if not python or python == "${PYTHON}": - python = 'python' - if os.path.exists(sign_py): - self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of(installer_file).replace('\\', '\\\\\\\\'))) - else: - print "Skipping code signing,", sign_py, "does not exist" + if 'signature' in self.args and 'VIEWER_SIGNING_PWD' in os.environ: + try: + self.sign(self.args['configuration'] + "\\" + substitution_strings['installer_file']) + except: + print "Couldn't sign windows installer. Tried to sign %s" % self.args['configuration'] + "\\" + substitution_strings['installer_file'] + self.created_path(self.dst_path_of(installer_file)) self.package_file = installer_file From e8ec5d750c39acb686e52ac8d114e90f8abd29dd Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 12:49:35 -0500 Subject: [PATCH 06/19] Hacks to get fmod working for now --- indra/cmake/FMODSTUDIO.cmake | 2 +- indra/llaudio/llaudioengine_fmodstudio.cpp | 4 ++-- indra/llaudio/llstreamingaudio_fmodstudio.cpp | 2 +- indra/newview/CMakeLists.txt | 5 +++++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake index fac23b3d3..bfaf6ac66 100644 --- a/indra/cmake/FMODSTUDIO.cmake +++ b/indra/cmake/FMODSTUDIO.cmake @@ -108,5 +108,5 @@ endif (FMOD_LIBRARY_RELEASE AND FMOD_INCLUDE_DIR) if (FMOD) message(STATUS "Building with FMOD Studio audio support") - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMODSTUDIO") + set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMODSTUDIO=1") endif (FMOD) diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp index 93541d3de..d86748ebe 100644 --- a/indra/llaudio/llaudioengine_fmodstudio.cpp +++ b/indra/llaudio/llaudioengine_fmodstudio.cpp @@ -281,8 +281,8 @@ void F_STDCALL decode_dealloc(void *ptr, FMOD_MEMORY_TYPE type, const char *sour bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata) { - -#if LL_WINDOWS + LL_WARNS("AudioImpl") << "BARKBARKBARK" << LL_ENDL; +#if 0 //LL_WINDOWS if(!attemptDelayLoad()) return false; #endif diff --git a/indra/llaudio/llstreamingaudio_fmodstudio.cpp b/indra/llaudio/llstreamingaudio_fmodstudio.cpp index 5ef93fd00..047b6e5f1 100644 --- a/indra/llaudio/llstreamingaudio_fmodstudio.cpp +++ b/indra/llaudio/llstreamingaudio_fmodstudio.cpp @@ -226,7 +226,7 @@ std::string utf16input_to_utf8(char* input, U32 len, utf_endian_type_t type) } } } - llutf16string out_16((U16*)input, len / 2); + llutf16string out_16((utf16strtype*)input, len / 2); if (len % 2) { out_16.push_back((input)[len - 1] << 8); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 5d43cfa2d..7ebe1c7f3 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1417,6 +1417,10 @@ if (WINDOWS) list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) endif (WINDOWS) +if (FMODSTUDIO) + set(FMOD_LIBRARY ${FMOD_LINK_LIBRARY_RELEASE}) +endif (FMODSTUDIO) + set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) @@ -1646,6 +1650,7 @@ target_link_libraries(${VIEWER_BINARY_NAME} ${Boost_DATE_TIME_LIBRARY} ${DBUSGLIB_LIBRARIES} ${OPENGL_LIBRARIES} + ${FMOD_LIBRARY} # must come after LLAudio ${GLOD_LIBRARIES} ${APRUTIL_LIBRARIES} ${OPENGL_LIBRARIES} From 1d2995666f8448d9b2235d82782ba2f58e91dc84 Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 13:07:51 -0500 Subject: [PATCH 07/19] Remove FMOD Ex --- indra/cmake/CMakeLists.txt | 1 - indra/cmake/FMODEX.cmake | 116 --- indra/cmake/FMODSTUDIO.cmake | 11 +- indra/llaudio/CMakeLists.txt | 21 +- indra/llaudio/llaudioengine_fmodex.cpp | 1027 -------------------- indra/llaudio/llaudioengine_fmodex.h | 139 --- indra/llaudio/llaudioengine_fmodstudio.cpp | 2 +- indra/llaudio/lllistener_fmodex.cpp | 141 --- indra/llaudio/lllistener_fmodex.h | 71 -- indra/llaudio/llstreamingaudio_fmodex.cpp | 596 ------------ indra/llaudio/llstreamingaudio_fmodex.h | 89 -- indra/newview/CMakeLists.txt | 11 +- indra/newview/llappviewer.cpp | 14 +- indra/newview/llstartup.cpp | 15 - 14 files changed, 11 insertions(+), 2243 deletions(-) delete mode 100644 indra/cmake/FMODEX.cmake delete mode 100644 indra/llaudio/llaudioengine_fmodex.cpp delete mode 100644 indra/llaudio/llaudioengine_fmodex.h delete mode 100644 indra/llaudio/lllistener_fmodex.cpp delete mode 100644 indra/llaudio/lllistener_fmodex.h delete mode 100644 indra/llaudio/llstreamingaudio_fmodex.cpp delete mode 100644 indra/llaudio/llstreamingaudio_fmodex.h diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 70e448385..3c53fade8 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -27,7 +27,6 @@ set(cmake_SOURCE_FILES ELFIO.cmake EXPAT.cmake ExamplePlugin.cmake - FMODEX.cmake FMODSTUDIO.cmake FindAPR.cmake FindAutobuild.cmake diff --git a/indra/cmake/FMODEX.cmake b/indra/cmake/FMODEX.cmake deleted file mode 100644 index ae95866c4..000000000 --- a/indra/cmake/FMODEX.cmake +++ /dev/null @@ -1,116 +0,0 @@ -# -*- cmake -*- - -include(Linking) - -if (FMODEX AND FMODSTUDIO) - message( FATAL_ERROR "You can not enable two FMOD variants at the same time." ) -endif (FMODEX AND FMODSTUDIO) - -unset(FMOD_LIBRARY_RELEASE CACHE) -unset(FMOD_LIBRARY_DEBUG CACHE) -unset(FMOD_INCLUDE_DIR CACHE) - -set(FMOD_EXTERNAL_LIB OFF) - -if(STANDALONE OR WINDOWS) - if (NOT FMODEX_SDK_DIR AND WINDOWS) - GET_FILENAME_COMPONENT(REG_DIR [HKEY_CURRENT_USER\\Software\\FMOD\ Programmers\ API\ Windows] ABSOLUTE) - set(FMODEX_SDK_DIR ${REG_DIR} CACHE PATH "Path to the FMOD Ex SDK." FORCE) - endif (NOT FMODEX_SDK_DIR AND WINDOWS) - if(NOT FMODEX_SDK_DIR AND STANDALONE) - message(FATAL_ERROR "FMODEX_SDK_DIR not set!") - endif(NOT FMODEX_SDK_DIR AND STANDALONE) -endif(STANDALONE OR WINDOWS) - -if(FMODEX_SDK_DIR) - set(fmod_lib_paths "${FMODEX_SDK_DIR}/api" "${FMODEX_SDK_DIR}/api/lib" ) - set(fmod_inc_paths "${FMODEX_SDK_DIR}/api/inc") - - if(WINDOWS) - set(CMAKE_FIND_LIBRARY_SUFFIXES_OLD ${CMAKE_FIND_LIBRARY_SUFFIXES}) - set(CMAKE_FIND_LIBRARY_SUFFIXES .dll) - endif(WINDOWS) - if(WORD_SIZE EQUAL 64) - find_library(FMOD_LIBRARY_RELEASE fmodex64 PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - find_library(FMOD_LIBRARY_DEBUG fmodexL64 PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - else(WORD_SIZE EQUAL 64)#Check if CMAKE_FIND_LIBRARY_PREFIXES is set to 'lib' for darwin. - find_library(FMOD_LIBRARY_RELEASE fmodex PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - find_library(FMOD_LIBRARY_DEBUG fmodexL PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - endif(WORD_SIZE EQUAL 64) - if(WINDOWS) - set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES_OLD}) - if(WORD_SIZE EQUAL 64) - find_library(FMOD_LINK_LIBRARY_RELEASE fmodex64_vc PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - find_library(FMOD_LINK_LIBRARY_DEBUG fmodexL64_vc PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - else(WORD_SIZE EQUAL 64)#Check if CMAKE_FIND_LIBRARY_PREFIXES is set to 'lib' for darwin. - find_library(FMOD_LINK_LIBRARY_RELEASE fmodex_vc PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - find_library(FMOD_LINK_LIBRARY_DEBUG fmodexL_vc PATHS ${fmod_lib_paths} NO_DEFAULT_PATH) - endif(WORD_SIZE EQUAL 64) - else(WINDOWS) - set(FMOD_LINK_LIBRARY_RELEASE ${FMOD_LIBRARY_RELEASE}) - set(FMOD_LINK_LIBRARY_DEBUG ${FMOD_LIBRARY_DEBUG}) - endif(WINDOWS) - find_path(FMOD_INCLUDE_DIR fmod.hpp ${fmod_inc_paths}) - if(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) - if(STANDALONE) - message(FATAL_ERROR "Provided FMODEX_SDK_DIR path not found '{$FMODEX_SDK_DIR}'") - else(STANDALONE) - message(STATUS "Provided FMODEX_SDK_DIR path not found '${FMODEX_SDK_DIR}'. Falling back to prebuilts") - endif(STANDALONE) - else(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) - message(STATUS "Using system-provided FMOD Ex Libraries") - set(FMOD_EXTERNAL_LIB ON) - endif(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) -endif (FMODEX_SDK_DIR) - -if (NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) - if(WINDOWS) - set(lib_suffix .dll) - elseif(DARWIN) - set(lib_suffix .dylib) - else(WINDOWS) - set(lib_suffix .so) - endif(WINDOWS) - if(WINDOWS) - if(WORD_SIZE EQUAL 64) - set(FMOD_LIBRARY_RELEASE ${LIBS_PREBUILT_DIR}/lib/release/fmodex64${lib_suffix}) - set(FMOD_LIBRARY_DEBUG ${LIBS_PREBUILT_DIR}/lib/debug/fmodexL64${lib_suffix}) - else(WORD_SIZE EQUAL 64) - set(FMOD_LIBRARY_RELEASE ${LIBS_PREBUILT_DIR}/lib/release/fmodex${lib_suffix}) - set(FMOD_LIBRARY_DEBUG ${LIBS_PREBUILT_DIR}/lib/debug/fmodexL${lib_suffix}) - endif(WORD_SIZE EQUAL 64) - else(WINDOWS) - if(WORD_SIZE EQUAL 64) - set(FMOD_LIBRARY_RELEASE ${LIBS_PREBUILT_DIR}/lib/release/libfmodex64${lib_suffix}) - set(FMOD_LIBRARY_DEBUG ${LIBS_PREBUILT_DIR}/lib/debug/libfmodex64L${lib_suffix}) - else(WORD_SIZE EQUAL 64) - set(FMOD_LIBRARY_RELEASE ${LIBS_PREBUILT_DIR}/lib/release/libfmodex${lib_suffix}) - set(FMOD_LIBRARY_DEBUG ${LIBS_PREBUILT_DIR}/lib/debug/libfmodexL${lib_suffix}) - endif(WORD_SIZE EQUAL 64) - endif(WINDOWS) - set(FMOD_LINK_LIBRARY_RELEASE ${FMOD_LIBRARY_RELEASE}) - set(FMOD_LINK_LIBRARY_DEBUG ${FMOD_LIBRARY_DEBUG}) - if(WINDOWS) - string(REPLACE ".dll" "_vc.lib" FMOD_LINK_LIBRARY_RELEASE ${FMOD_LIBRARY_RELEASE}) - string(REPLACE ".dll" "_vc.lib" FMOD_LINK_LIBRARY_DEBUG ${FMOD_LIBRARY_DEBUG}) - endif(WINDOWS) - use_prebuilt_binary(fmodex) - set(FMOD_INCLUDE_DIR - ${LIBS_PREBUILT_DIR}/include/fmodex) -endif(NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) - -if(FMOD_LIBRARY_RELEASE AND FMOD_INCLUDE_DIR) - set(FMOD ON) - if (NOT FMOD_LIBRARY_DEBUG) #Use release library in debug configuration if debug library is absent. - set(FMOD_LIBRARY_DEBUG ${FMOD_LIBRARY_RELEASE}) - endif (NOT FMOD_LIBRARY_DEBUG) -else (FMOD_LIBRARY_RELEASE AND FMOD_INCLUDE_DIR) - message(STATUS "No support for FMOD EX audio (need to set FMODEX_SDK_DIR?)") - set(FMOD OFF) - set(FMODEX OFF) -endif (FMOD_LIBRARY_RELEASE AND FMOD_INCLUDE_DIR) - -if (FMOD) - message(STATUS "Building with FMOD Ex audio support") - set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMODEX") -endif (FMOD) diff --git a/indra/cmake/FMODSTUDIO.cmake b/indra/cmake/FMODSTUDIO.cmake index bfaf6ac66..e7ce595ef 100644 --- a/indra/cmake/FMODSTUDIO.cmake +++ b/indra/cmake/FMODSTUDIO.cmake @@ -2,10 +2,6 @@ include(Linking) -if (FMODEX AND FMODSTUDIO) - message( FATAL_ERROR "You can not enable two FMOD variants at the same time." ) -endif (FMODEX AND FMODSTUDIO) - unset(FMOD_LIBRARY_RELEASE CACHE) unset(FMOD_LIBRARY_DEBUG CACHE) unset(FMOD_INCLUDE_DIR CACHE) @@ -86,10 +82,17 @@ if (NOT FMOD_LIBRARY_RELEASE OR NOT FMOD_INCLUDE_DIR) endif(WINDOWS) set(FMOD_LINK_LIBRARY_RELEASE ${FMOD_LIBRARY_RELEASE}) set(FMOD_LINK_LIBRARY_DEBUG ${FMOD_LIBRARY_DEBUG}) + if(WINDOWS) string(REPLACE ".dll" "_vc.lib" FMOD_LINK_LIBRARY_RELEASE ${FMOD_LIBRARY_RELEASE}) string(REPLACE ".dll" "_vc.lib" FMOD_LINK_LIBRARY_DEBUG ${FMOD_LIBRARY_DEBUG}) endif(WINDOWS) + + set (FMOD_LIBRARY + debug ${FMOD_LINK_LIBRARY_DEBUG} + optimized ${FMOD_LINK_LIBRARY_RELEASE} + ) + use_prebuilt_binary(fmodstudio) set(FMOD_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/fmodstudio) diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt index 9644dc5a8..f6ea97d07 100644 --- a/indra/llaudio/CMakeLists.txt +++ b/indra/llaudio/CMakeLists.txt @@ -5,12 +5,7 @@ project(llaudio) include(00-Common) include(Audio) include(LLAudio) -if (FMODSTUDIO) - include(FMODSTUDIO) -endif (FMODSTUDIO) -if (FMODEX) - include(FMODEX) -endif (FMODEX) +include(FMODSTUDIO) include(OPENAL) include(LLCommon) include(LLMath) @@ -68,20 +63,6 @@ if (FMODSTUDIO) ) endif (FMODSTUDIO) -if (FMODEX) - list(APPEND llaudio_SOURCE_FILES - llaudioengine_fmodex.cpp - lllistener_fmodex.cpp - llstreamingaudio_fmodex.cpp - ) - - list(APPEND llaudio_HEADER_FILES - llaudioengine_fmodex.h - lllistener_fmodex.h - llstreamingaudio_fmodex.h - ) -endif (FMODEX) - if (OPENAL) list(APPEND llaudio_SOURCE_FILES llaudioengine_openal.cpp diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp deleted file mode 100644 index 8b71012ba..000000000 --- a/indra/llaudio/llaudioengine_fmodex.cpp +++ /dev/null @@ -1,1027 +0,0 @@ -/** - * @file audioengine_FMODEX.cpp - * @brief Implementation of LLAudioEngine class abstracting the audio support as a FMOD 3D implementation - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "linden_common.h" - -#include "llstreamingaudio.h" -#include "llstreamingaudio_fmodex.h" - -#include "llaudioengine_fmodex.h" -#include "lllistener_fmodex.h" - -#include "llerror.h" -#include "llmath.h" -#include "llrand.h" - -#include "fmod.hpp" -#include "fmod_errors.h" -#include "lldir.h" -#include "llapr.h" - -#include "sound_ids.h" - -#if LL_WINDOWS //Some ugly code to make missing fmodex.dll not cause a fatal error. -#define WIN32_LEAN_AND_MEAN -#include "windows.h" -#include -#pragma comment(lib, "delayimp.lib") - -bool attemptDelayLoad() -{ - __try - { -#if defined(_WIN64) - if( FAILED( __HrLoadAllImportsForDll( "fmodex64.dll" ) ) ) - return false; -#else - if( FAILED( __HrLoadAllImportsForDll( "fmodex.dll" ) ) ) - return false; -#endif - } - __except( EXCEPTION_EXECUTE_HANDLER ) - { - return false; - } - return true; -} -#endif - -static bool sVerboseDebugging = false; - -FMOD_RESULT F_CALLBACK windCallback(FMOD_DSP_STATE *dsp_state, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int outchannels); - -FMOD::ChannelGroup *LLAudioEngine_FMODEX::mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT] = {0}; - -//This class is designed to keep track of all sound<->channel assocations. -//Used to verify validity of sound and channel pointers, as well as catch cases were sounds -//are released with active channels still attached. -class CFMODSoundChecks -{ - typedef std::map > active_sounds_t; - typedef std::set dead_sounds_t; - typedef std::map active_channels_t; - typedef std::map dead_channels_t; - - active_sounds_t mActiveSounds; - dead_sounds_t mDeadSounds; - active_channels_t mActiveChannels; - dead_channels_t mDeadChannels; -public: - enum STATUS - { - ACTIVE, - DEAD, - UNKNOWN - }; - STATUS getPtrStatus(LLAudioChannel* channel) - { - if(!channel) - return UNKNOWN; - return getPtrStatus(dynamic_cast(channel)->mChannelp); - } - STATUS getPtrStatus(LLAudioBuffer* sound) - { - if(!sound) - return UNKNOWN; - return getPtrStatus(dynamic_cast(sound)->mSoundp); - } - STATUS getPtrStatus(FMOD::Channel* channel) - { - if(!channel) - return UNKNOWN; - else if(mActiveChannels.find(channel) != mActiveChannels.end()) - return ACTIVE; - else if(mDeadChannels.find(channel) != mDeadChannels.end()) - return DEAD; - return UNKNOWN; - } - STATUS getPtrStatus(FMOD::Sound* sound) - { - if(!sound) - return UNKNOWN; - if(mActiveSounds.find(sound) != mActiveSounds.end()) - return ACTIVE; - else if(mDeadSounds.find(sound) != mDeadSounds.end()) - return DEAD; - return UNKNOWN; - } - void addNewSound(FMOD::Sound* sound) - { - assertActiveState(sound,true,false); - - mDeadSounds.erase(sound); - mActiveSounds.insert(std::make_pair(sound,std::set())); - } - void removeSound(FMOD::Sound* sound) - { - assertActiveState(sound,true); - - active_sounds_t::const_iterator it = mActiveSounds.find(sound); - llassert(it != mActiveSounds.end()); - if(it != mActiveSounds.end()) - { - if(!it->second.empty()) - { - LL_WARNS("AudioImpl") << "Removing sound " << sound << " with attached channels: \n"; - for(std::set::iterator it2 = it->second.begin(); it2 != it->second.end();++it2) - { - switch(getPtrStatus(*it2)) - { - case ACTIVE: - LL_CONT << " Channel " << *it2 << " ACTIVE\n"; - break; - case DEAD: - LL_CONT << " Channel " << *it2 << " DEAD\n"; - break; - default: - LL_CONT << " Channel " << *it2 << " UNKNOWN\n"; - } - } - LL_CONT << LL_ENDL; - } - llassert(it->second.empty()); - mDeadSounds.insert(sound); - mActiveSounds.erase(sound); - } - } - void addNewChannelToSound(FMOD::Sound* sound,FMOD::Channel* channel) - { - assertActiveState(sound,true); - assertActiveState(channel,true,false); - - mActiveSounds[sound].insert(channel); - mActiveChannels.insert(std::make_pair(channel,sound)); - } - void removeChannel(FMOD::Channel* channel) - { - assertActiveState(channel,true); - - active_channels_t::const_iterator it = mActiveChannels.find(channel); - llassert(it != mActiveChannels.end()); - if(it != mActiveChannels.end()) - { -#ifdef SHOW_ASSERT - STATUS status = getPtrStatus(it->second); - llassert(status != DEAD); - llassert(status != UNKNOWN); -#endif - - active_sounds_t::iterator it2 = mActiveSounds.find(it->second); - llassert(it2 != mActiveSounds.end()); - if(it2 != mActiveSounds.end()) - { - it2->second.erase(channel); - } - mDeadChannels.insert(*it); - mActiveChannels.erase(channel); - } - } - - template - void assertActiveState(T ptr, bool try_log=false, bool active=true) - { -#ifndef SHOW_ASSERT - if(try_log && sVerboseDebugging) -#endif - { - CFMODSoundChecks::STATUS chan = getPtrStatus(ptr); - if(try_log && sVerboseDebugging) - { - if(active) - { - if(chan == CFMODSoundChecks::DEAD) - LL_WARNS("AudioImpl") << __FUNCTION__ << ": Using unexpectedly dead " << typeid(T*).name() << " " << ptr << LL_ENDL; - else if(chan == CFMODSoundChecks::UNKNOWN) - LL_WARNS("AudioImpl") << __FUNCTION__ << ": Using unexpectedly unknown " << typeid(T*).name() << " " << ptr << LL_ENDL; - } - else if(chan == CFMODSoundChecks::ACTIVE) - LL_WARNS("AudioImpl") << __FUNCTION__ << ": Using unexpectedly active " << typeid(T*).name() << " " << ptr << LL_ENDL; - } - llassert( active == (chan == CFMODSoundChecks::ACTIVE) ); - } - } -} gSoundCheck; - -LLAudioEngine_FMODEX::LLAudioEngine_FMODEX(bool enable_profiler, bool verbose_debugging) -{ - sVerboseDebugging = verbose_debugging; - mInited = false; - mWindGen = NULL; - mWindDSP = NULL; - mSystem = NULL; - mEnableProfiler = enable_profiler; -} - - -LLAudioEngine_FMODEX::~LLAudioEngine_FMODEX() -{ -} - - -inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string) -{ - if(result == FMOD_OK) - return false; - LL_WARNS("AudioImpl") << string << " Error: " << FMOD_ErrorString(result) << LL_ENDL; - return true; -} - -void* F_STDCALL decode_alloc(unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) -{ - if(type & FMOD_MEMORY_STREAM_DECODE) - { - LL_INFOS("AudioImpl") << "Decode buffer size: " << size << LL_ENDL; - } - else if(type & FMOD_MEMORY_STREAM_FILE) - { - LL_INFOS("AudioImpl") << "Stream buffer size: " << size << LL_ENDL; - } - return new char[size]; -} -void* F_STDCALL decode_realloc(void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) -{ - memset(ptr,0,size); - return ptr; -} -void F_STDCALL decode_dealloc(void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr) -{ - delete[] (char*)ptr; -} - -bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata) -{ - -#if LL_WINDOWS - if(!attemptDelayLoad()) - return false; -#endif - - U32 version = 0; - FMOD_RESULT result; - - LL_DEBUGS("AppInit") << "LLAudioEngine_FMODEX::init() initializing FMOD" << LL_ENDL; - - //result = FMOD::Memory_Initialize(NULL, 0, &decode_alloc, &decode_realloc, &decode_dealloc, FMOD_MEMORY_STREAM_DECODE | FMOD_MEMORY_STREAM_FILE); - //if(Check_FMOD_Error(result, "FMOD::Memory_Initialize")) - // return false; - - result = FMOD::System_Create(&mSystem); - if(Check_FMOD_Error(result, "FMOD::System_Create")) - return false; - - //will call LLAudioEngine_FMODEX::allocateListener, which needs a valid mSystem pointer. - LLAudioEngine::init(num_channels, userdata); - - result = mSystem->getVersion(&version); - Check_FMOD_Error(result, "FMOD::System::getVersion"); - - if (version < FMOD_VERSION) - { - LL_WARNS("AppInit") << "Error : You are using the wrong FMOD Ex version (" << version - << ")! You should be using FMOD Ex" << FMOD_VERSION << LL_ENDL; - } - -// result = mSystem->setSoftwareFormat(44100, FMOD_SOUND_FORMAT_PCM16, 0, 0, FMOD_DSP_RESAMPLER_LINEAR); -// Check_FMOD_Error(result,"FMOD::System::setSoftwareFormat"); - - // In this case, all sounds, PLUS wind and stream will be software. - result = mSystem->setSoftwareChannels(num_channels + 2); - Check_FMOD_Error(result,"FMOD::System::setSoftwareChannels"); - - U32 fmod_flags = FMOD_INIT_NORMAL; - if(mEnableProfiler) - { - fmod_flags |= FMOD_INIT_ENABLE_PROFILE; - } - -#if LL_LINUX - bool audio_ok = false; - - if (!audio_ok) - { - if (NULL == getenv("LL_BAD_FMOD_PULSEAUDIO")) /*Flawfinder: ignore*/ - { - LL_DEBUGS("AppInit") << "Trying PulseAudio audio output..." << LL_ENDL; - if((result = mSystem->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO)) == FMOD_OK && - (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK) - { - LL_DEBUGS("AppInit") << "PulseAudio output initialized OKAY" << LL_ENDL; - audio_ok = true; - } - else - { - Check_FMOD_Error(result, "PulseAudio audio output FAILED to initialize"); - } - } - else - { - LL_DEBUGS("AppInit") << "PulseAudio audio output SKIPPED" << LL_ENDL; - } - } - if (!audio_ok) - { - if (NULL == getenv("LL_BAD_FMOD_ALSA")) /*Flawfinder: ignore*/ - { - LL_DEBUGS("AppInit") << "Trying ALSA audio output..." << LL_ENDL; - if((result = mSystem->setOutput(FMOD_OUTPUTTYPE_ALSA)) == FMOD_OK && - (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK) - { - LL_DEBUGS("AppInit") << "ALSA audio output initialized OKAY" << LL_ENDL; - audio_ok = true; - } - else - { - Check_FMOD_Error(result, "ALSA audio output FAILED to initialize"); - } - } - else - { - LL_DEBUGS("AppInit") << "ALSA audio output SKIPPED" << LL_ENDL; - } - } - if (!audio_ok) - { - if (NULL == getenv("LL_BAD_FMOD_OSS")) /*Flawfinder: ignore*/ - { - LL_DEBUGS("AppInit") << "Trying OSS audio output..." << LL_ENDL; - if((result = mSystem->setOutput(FMOD_OUTPUTTYPE_OSS)) == FMOD_OK && - (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK) - { - LL_DEBUGS("AppInit") << "OSS audio output initialized OKAY" << LL_ENDL; - audio_ok = true; - } - else - { - Check_FMOD_Error(result, "OSS audio output FAILED to initialize"); - } - } - else - { - LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL; - } - } - if (!audio_ok) - { - LL_WARNS("AppInit") << "Overall audio init failure." << LL_ENDL; - return false; - } - - // We're interested in logging which output method we - // ended up with, for QA purposes. - FMOD_OUTPUTTYPE output_type; - if(!Check_FMOD_Error(mSystem->getOutput(&output_type), "FMOD::System::getOutput")) - { - switch (output_type) - { - case FMOD_OUTPUTTYPE_NOSOUND: - LL_INFOS("AppInit") << "Audio output: NoSound" << LL_ENDL; break; - case FMOD_OUTPUTTYPE_PULSEAUDIO: - LL_INFOS("AppInit") << "Audio output: PulseAudio" << LL_ENDL; break; - case FMOD_OUTPUTTYPE_ALSA: - LL_INFOS("AppInit") << "Audio output: ALSA" << LL_ENDL; break; - case FMOD_OUTPUTTYPE_OSS: - LL_INFOS("AppInit") << "Audio output: OSS" << LL_ENDL; break; - default: - LL_INFOS("AppInit") << "Audio output: Unknown!" << LL_ENDL; break; - }; - } -#else // LL_LINUX - - // initialize the FMOD engine - result = mSystem->init( num_channels + 2, fmod_flags, 0); - if (result == FMOD_ERR_OUTPUT_CREATEBUFFER) - { - /* - Ok, the speaker mode selected isn't supported by this soundcard. Switch it - back to stereo... - */ - result = mSystem->setSpeakerMode(FMOD_SPEAKERMODE_STEREO); - Check_FMOD_Error(result,"Error falling back to stereo mode"); - /* - ... and re-init. - */ - result = mSystem->init( num_channels + 2, fmod_flags, 0); - } - if(Check_FMOD_Error(result, "Error initializing FMOD Ex")) - return false; -#endif - - if (mEnableProfiler) - { - Check_FMOD_Error(mSystem->createChannelGroup("None", &mChannelGroups[AUDIO_TYPE_NONE]), "FMOD::System::createChannelGroup"); - Check_FMOD_Error(mSystem->createChannelGroup("SFX", &mChannelGroups[AUDIO_TYPE_SFX]), "FMOD::System::createChannelGroup"); - Check_FMOD_Error(mSystem->createChannelGroup("UI", &mChannelGroups[AUDIO_TYPE_UI]), "FMOD::System::createChannelGroup"); - Check_FMOD_Error(mSystem->createChannelGroup("Ambient", &mChannelGroups[AUDIO_TYPE_AMBIENT]), "FMOD::System::createChannelGroup"); - } - - // set up our favourite FMOD-native streaming audio implementation if none has already been added - if (!getStreamingAudioImpl()) // no existing implementation added - setStreamingAudioImpl(new LLStreamingAudio_FMODEX(mSystem)); - - LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init() FMOD Ex initialized correctly" << LL_ENDL; - - int r_numbuffers, r_samplerate, r_channels, r_bits; - unsigned int r_bufferlength; - char r_name[256]; - FMOD_SPEAKERMODE speaker_mode; - if (!Check_FMOD_Error(mSystem->getDSPBufferSize(&r_bufferlength, &r_numbuffers), "FMOD::System::getDSPBufferSize") && - !Check_FMOD_Error(mSystem->getSoftwareFormat(&r_samplerate, NULL, &r_channels, NULL, NULL, &r_bits), "FMOD::System::getSoftwareFormat") && - !Check_FMOD_Error(mSystem->getDriverInfo(0, r_name, 255, 0), "FMOD::System::getDriverInfo") && - !Check_FMOD_Error(mSystem->getSpeakerMode(&speaker_mode), "FMOD::System::getSpeakerMode")) - { - std::string speaker_mode_str = "unknown"; - switch(speaker_mode) - { - #define SPEAKER_MODE_CASE(MODE) case MODE: speaker_mode_str = #MODE; break; - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_RAW) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_MONO) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_STEREO) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_QUAD) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_SURROUND) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_5POINT1) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_7POINT1) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_SRS5_1_MATRIX) - SPEAKER_MODE_CASE(FMOD_SPEAKERMODE_MYEARS) - default:; - #undef SPEAKER_MODE_CASE - } - - r_name[255] = '\0'; - int latency = 1000.0 * r_bufferlength * r_numbuffers /r_samplerate; - - LL_INFOS("AppInit") << "FMOD device: "<< r_name << "\n" - << "Output mode: "<< speaker_mode_str << "\n" - << "FMOD Ex parameters: " << r_samplerate << " Hz * " << r_channels << " * " <getVersion(&version), "FMOD::System::getVersion")) - { - return llformat("FMOD Ex %1x.%02x.%02x", version >> 16, version >> 8 & 0x000000FF, version & 0x000000FF); - } - } - return "FMODEx"; -} - - -void LLAudioEngine_FMODEX::allocateListener(void) -{ - mListenerp = (LLListener *) new LLListener_FMODEX(mSystem); - if (!mListenerp) - { - LL_WARNS("AudioImpl") << "Listener creation failed" << LL_ENDL; - } -} - - -void LLAudioEngine_FMODEX::shutdown() -{ - LL_INFOS("AudioImpl") << "About to LLAudioEngine::shutdown()" << LL_ENDL; - LLAudioEngine::shutdown(); - - LL_INFOS("AudioImpl") << "LLAudioEngine_FMODEX::shutdown() closing FMOD Ex" << LL_ENDL; - if ( mSystem ) // speculative fix for MAINT-2657 - { - LL_INFOS("AudioImpl") << "LLAudioEngine_FMODEX::shutdown() Requesting FMOD Ex system closure" << LL_ENDL; - Check_FMOD_Error(mSystem->close(), "FMOD::System::close"); - LL_INFOS("AudioImpl") << "LLAudioEngine_FMODEX::shutdown() Requesting FMOD Ex system release" << LL_ENDL; - Check_FMOD_Error(mSystem->release(), "FMOD::System::release"); - } - LL_INFOS("AudioImpl") << "LLAudioEngine_FMODEX::shutdown() done closing FMOD Ex" << LL_ENDL; - - delete mListenerp; - mListenerp = NULL; -} - - -LLAudioBuffer * LLAudioEngine_FMODEX::createBuffer() -{ - return new LLAudioBufferFMODEX(mSystem); -} - - -LLAudioChannel * LLAudioEngine_FMODEX::createChannel() -{ - return new LLAudioChannelFMODEX(mSystem); -} - -bool LLAudioEngine_FMODEX::initWind() -{ - mNextWindUpdate = 0.0; - - cleanupWind(); - - - FMOD_DSP_DESCRIPTION dspdesc; - memset(&dspdesc, 0, sizeof(FMOD_DSP_DESCRIPTION)); //Set everything to zero - strncpy(dspdesc.name,"Wind Unit", sizeof(dspdesc.name)); //Set name to "Wind Unit" - dspdesc.channels=2; - dspdesc.read = &windCallback; //Assign callback. - if(Check_FMOD_Error(mSystem->createDSP(&dspdesc, &mWindDSP), "FMOD::createDSP") || !mWindDSP) - return false; - - float frequency = 44100; - if (!Check_FMOD_Error(mWindDSP->getDefaults(&frequency,0,0,0), "FMOD::DSP::getDefaults")) - { - mWindGen = new LLWindGen((U32)frequency); - if (!Check_FMOD_Error(mWindDSP->setUserData((void*)mWindGen), "FMOD::DSP::setUserData") && - !Check_FMOD_Error(mSystem->playDSP(FMOD_CHANNEL_FREE, mWindDSP, false, 0), "FMOD::System::playDSP")) - return true; //Success - } - - cleanupWind(); - return false; -} - - -void LLAudioEngine_FMODEX::cleanupWind() -{ - if (mWindDSP) - { - Check_FMOD_Error(mWindDSP->remove(), "FMOD::DSP::remove"); - Check_FMOD_Error(mWindDSP->release(), "FMOD::DSP::release"); - mWindDSP = NULL; - } - - delete mWindGen; - mWindGen = NULL; -} - - -//----------------------------------------------------------------------- -void LLAudioEngine_FMODEX::updateWind(LLVector3 wind_vec, F32 camera_height_above_water) -{ - LLVector3 wind_pos; - F64 pitch; - F64 center_freq; - - if (!mEnableWind) - { - return; - } - - if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL)) - { - - // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up) - // need to convert this to the conventional orientation DS3D and OpenAL use - // where +X = right, +Y = up, +Z = backwards - - wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], -wind_vec.mV[0]); - - // cerr << "Wind update" << endl; - - pitch = 1.0 + mapWindVecToPitch(wind_vec); - center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0)); - - mWindGen->mTargetFreq = (F32)center_freq; - mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain; - mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec); - } -} - -//----------------------------------------------------------------------- -void LLAudioEngine_FMODEX::setInternalGain(F32 gain) -{ - if (!mInited) - { - return; - } - - gain = llclamp( gain, 0.0f, 1.0f ); - - FMOD::ChannelGroup *master_group; - if(Check_FMOD_Error(mSystem->getMasterChannelGroup(&master_group), "FMOD::System::getMasterChannelGroup")) - return; - master_group->setVolume(gain); - - LLStreamingAudioInterface *saimpl = getStreamingAudioImpl(); - if ( saimpl ) - { - // fmod likes its streaming audio channel gain re-asserted after - // master volume change. - saimpl->setGain(saimpl->getGain()); - } -} - -// -// LLAudioChannelFMODEX implementation -// - -LLAudioChannelFMODEX::LLAudioChannelFMODEX(FMOD::System *system) : LLAudioChannel(), mSystemp(system), mChannelp(NULL), mLastSamplePos(0) -{ -} - - -LLAudioChannelFMODEX::~LLAudioChannelFMODEX() -{ - if(sVerboseDebugging) - LL_DEBUGS("AudioImpl") << "Destructing Audio Channel. mChannelp = " << mChannelp << LL_ENDL; - - cleanup(); -} - -static FMOD_RESULT F_CALLBACK channel_callback(FMOD_CHANNEL *channel, FMOD_CHANNEL_CALLBACKTYPE type, void *commanddata1, void *commanddata2) -{ - if(type == FMOD_CHANNEL_CALLBACKTYPE_END) - { - FMOD::Channel* chan = reinterpret_cast(channel); - LLAudioChannelFMODEX* audio_channel = NULL; - chan->getUserData((void**)&audio_channel); - if(audio_channel) - { - audio_channel->onRelease(); - } - } - return FMOD_OK; -} - -void LLAudioChannelFMODEX::onRelease() -{ - llassert(mChannelp); - if(sVerboseDebugging) - LL_DEBUGS("AudioImpl") << "Fmod signaled channel release for channel " << mChannelp << LL_ENDL; - gSoundCheck.removeChannel(mChannelp); - mChannelp = NULL; //Null out channel here so cleanup doesn't try to redundantly stop it. - cleanup(); -} - -bool LLAudioChannelFMODEX::updateBuffer() -{ - if (LLAudioChannel::updateBuffer()) - { - // Base class update returned true, which means the channel buffer was changed, and not is null. - - // Grab the FMOD sample associated with the buffer - FMOD::Sound *soundp = ((LLAudioBufferFMODEX*)mCurrentBufferp)->getSound(); - if (!soundp) - { - // This is bad, there should ALWAYS be a sound associated with a legit - // buffer. - LL_ERRS("AudioImpl") << "No FMOD sound!" << LL_ENDL; - return false; - } - - // Actually play the sound. Start it off paused so we can do all the necessary - // setup. - if(!mChannelp) - { - FMOD_RESULT result = getSystem()->playSound(FMOD_CHANNEL_FREE, soundp, true, &mChannelp); - Check_FMOD_Error(result, "FMOD::System::playSound"); - if(result == FMOD_OK) - { - if(sVerboseDebugging) - LL_DEBUGS("AudioImpl") << "Created channel " << mChannelp << " for sound " << soundp << LL_ENDL; - - gSoundCheck.addNewChannelToSound(soundp,mChannelp); - mChannelp->setCallback(&channel_callback); - mChannelp->setUserData(this); - } - } - } - - // If we have a source for the channel, we need to update its gain. - if (mCurrentSourcep && mChannelp) - { - FMOD_RESULT result; - - gSoundCheck.assertActiveState(this); - result = mChannelp->setVolume(getSecondaryGain() * mCurrentSourcep->getGain()); - Check_FMOD_Error(result, "FMOD::Channel::setVolume"); - result = mChannelp->setMode(mCurrentSourcep->isLoop() ? FMOD_LOOP_NORMAL : FMOD_LOOP_OFF); - Check_FMOD_Error(result, "FMOD::Channel::setMode"); - } - - return true; -} - - -void LLAudioChannelFMODEX::update3DPosition() -{ - if (!mChannelp) - { - // We're not actually a live channel (i.e., we're not playing back anything) - return; - } - - LLAudioBufferFMODEX *bufferp = (LLAudioBufferFMODEX *)mCurrentBufferp; - if (!bufferp) - { - // We don't have a buffer associated with us (should really have been picked up - // by the above if. - return; - } - - gSoundCheck.assertActiveState(this); - - if (mCurrentSourcep->isAmbient()) - { - // Ambient sound, don't need to do any positional updates. - set3DMode(false); - } - else - { - // Localized sound. Update the position and velocity of the sound. - set3DMode(true); - - LLVector3 float_pos; - float_pos.setVec(mCurrentSourcep->getPositionGlobal()); - FMOD_RESULT result = mChannelp->set3DAttributes((FMOD_VECTOR*)float_pos.mV, (FMOD_VECTOR*)mCurrentSourcep->getVelocity().mV); - Check_FMOD_Error(result, "FMOD::Channel::set3DAttributes"); - } -} - - -void LLAudioChannelFMODEX::updateLoop() -{ - if (!mChannelp) - { - // May want to clear up the loop/sample counters. - return; - } - - gSoundCheck.assertActiveState(this); - - // - // Hack: We keep track of whether we looped or not by seeing when the - // sample position looks like it's going backwards. Not reliable; may - // yield false negatives. - // - U32 cur_pos; - Check_FMOD_Error(mChannelp->getPosition(&cur_pos,FMOD_TIMEUNIT_PCMBYTES),"FMOD::Channel::getPosition"); - - if (cur_pos < (U32)mLastSamplePos) - { - mLoopedThisFrame = true; - } - mLastSamplePos = cur_pos; -} - - -void LLAudioChannelFMODEX::cleanup() -{ - LLAudioChannel::cleanup(); - - if (!mChannelp) - { - llassert(mCurrentBufferp == NULL); - //LL_INFOS("AudioImpl") << "Aborting cleanup with no channel handle." << LL_ENDL; - return; - } - - if(sVerboseDebugging) - LL_DEBUGS("AudioImpl") << "Stopping channel " << mChannelp << LL_ENDL; - - gSoundCheck.removeChannel(mChannelp); - mChannelp->setCallback(NULL); - Check_FMOD_Error(mChannelp->stop(),"FMOD::Channel::stop"); - - mChannelp = NULL; - mLastSamplePos = 0; -} - - -void LLAudioChannelFMODEX::play() -{ - if (!mChannelp) - { - LL_WARNS("AudioImpl") << "Playing without a channel handle, aborting" << LL_ENDL; - return; - } - - gSoundCheck.assertActiveState(this,true); - - bool paused=true; - Check_FMOD_Error(mChannelp->getPaused(&paused), "FMOD::Channel::getPaused"); - if(!paused) - { - Check_FMOD_Error(mChannelp->setPaused(true), "FMOD::Channel::setPaused"); - Check_FMOD_Error(mChannelp->setPosition(0,FMOD_TIMEUNIT_PCMBYTES), "FMOD::Channel::setPosition"); - } - Check_FMOD_Error(mChannelp->setPaused(false), "FMOD::Channel::setPaused"); - - if(sVerboseDebugging) - LL_DEBUGS("AudioImpl") << "Playing channel " << mChannelp << LL_ENDL; - - getSource()->setPlayedOnce(true); - - if(LLAudioEngine_FMODEX::mChannelGroups[getSource()->getType()]) - Check_FMOD_Error(mChannelp->setChannelGroup(LLAudioEngine_FMODEX::mChannelGroups[getSource()->getType()]),"FMOD::Channel::setChannelGroup"); -} - - -void LLAudioChannelFMODEX::playSynced(LLAudioChannel *channelp) -{ - LLAudioChannelFMODEX *fmod_channelp = (LLAudioChannelFMODEX*)channelp; - if (!(fmod_channelp->mChannelp && mChannelp)) - { - // Don't have channels allocated to both the master and the slave - return; - } - - gSoundCheck.assertActiveState(this,true); - - U32 cur_pos; - if(Check_FMOD_Error(fmod_channelp->mChannelp->getPosition(&cur_pos,FMOD_TIMEUNIT_PCMBYTES), "Unable to retrieve current position")) - return; - - cur_pos %= mCurrentBufferp->getLength(); - - // Try to match the position of our sync master - Check_FMOD_Error(mChannelp->setPosition(cur_pos,FMOD_TIMEUNIT_PCMBYTES),"Unable to set current position"); - - // Start us playing - play(); -} - - -bool LLAudioChannelFMODEX::isPlaying() -{ - if (!mChannelp) - { - return false; - } - - gSoundCheck.assertActiveState(this); - - bool paused, playing; - Check_FMOD_Error(mChannelp->getPaused(&paused),"FMOD::Channel::getPaused"); - Check_FMOD_Error(mChannelp->isPlaying(&playing),"FMOD::Channel::isPlaying"); - return !paused && playing; -} - - -// -// LLAudioChannelFMODEX implementation -// - - -LLAudioBufferFMODEX::LLAudioBufferFMODEX(FMOD::System *system) : LLAudioBuffer(), mSystemp(system), mSoundp(NULL) -{ -} - - -LLAudioBufferFMODEX::~LLAudioBufferFMODEX() -{ - if(mSoundp) - { - if(sVerboseDebugging) - LL_DEBUGS("AudioImpl") << "Release sound " << mSoundp << LL_ENDL; - - gSoundCheck.removeSound(mSoundp); - Check_FMOD_Error(mSoundp->release(),"FMOD::Sound::Release"); - mSoundp = NULL; - } -} - - -bool LLAudioBufferFMODEX::loadWAV(const std::string& filename) -{ - // Try to open a wav file from disk. This will eventually go away, as we don't - // really want to block doing this. - if (filename.empty()) - { - // invalid filename, abort. - return false; - } - - if (!LLAPRFile::isExist(filename, LL_APR_RPB)) - { - // File not found, abort. - return false; - } - - if (mSoundp) - { - gSoundCheck.removeSound(mSoundp); - // If there's already something loaded in this buffer, clean it up. - Check_FMOD_Error(mSoundp->release(),"FMOD::Sound::release"); - mSoundp = NULL; - } - - FMOD_MODE base_mode = FMOD_LOOP_NORMAL | FMOD_SOFTWARE; - FMOD_CREATESOUNDEXINFO exinfo; - memset(&exinfo,0,sizeof(exinfo)); - exinfo.cbsize = sizeof(exinfo); - exinfo.suggestedsoundtype = FMOD_SOUND_TYPE_WAV; //Hint to speed up loading. - // Load up the wav file into an fmod sample -#if LL_WINDOWS - FMOD_RESULT result = getSystem()->createSound((const char*)utf8str_to_utf16str(filename).c_str(), base_mode | FMOD_UNICODE, &exinfo, &mSoundp); -#else - FMOD_RESULT result = getSystem()->createSound(filename.c_str(), base_mode, &exinfo, &mSoundp); -#endif - - if (result != FMOD_OK) - { - // We failed to load the file for some reason. - LL_WARNS("AudioImpl") << "Could not load data '" << filename << "': " << FMOD_ErrorString(result) << LL_ENDL; - - // - // If we EVER want to load wav files provided by end users, we need - // to rethink this! - // - // file is probably corrupt - remove it. - LLFile::remove(filename); - return false; - } - - gSoundCheck.addNewSound(mSoundp); - - // Everything went well, return true - return true; -} - - -U32 LLAudioBufferFMODEX::getLength() -{ - if (!mSoundp) - { - return 0; - } - - gSoundCheck.assertActiveState(this); - U32 length; - Check_FMOD_Error(mSoundp->getLength(&length, FMOD_TIMEUNIT_PCMBYTES),"FMOD::Sound::getLength"); - return length; -} - - -void LLAudioChannelFMODEX::set3DMode(bool use3d) -{ - gSoundCheck.assertActiveState(this); - - FMOD_MODE current_mode; - if(Check_FMOD_Error(mChannelp->getMode(¤t_mode),"FMOD::Channel::getMode")) - return; - FMOD_MODE new_mode = current_mode; - new_mode &= ~(use3d ? FMOD_2D : FMOD_3D); - new_mode |= use3d ? FMOD_3D : FMOD_2D; - - if(current_mode != new_mode) - { - Check_FMOD_Error(mChannelp->setMode(new_mode),"FMOD::Channel::setMode"); - } -} - - -FMOD_RESULT F_CALLBACK windCallback(FMOD_DSP_STATE *dsp_state, float *originalbuffer, float *newbuffer, unsigned int length, int inchannels, int outchannels) -{ - // originalbuffer = fmod's original mixbuffer. - // newbuffer = the buffer passed from the previous DSP unit. - // length = length in samples at this mix time. - // userdata = user parameter passed through in FSOUND_DSP_Create. - - LLWindGen *windgen; - FMOD::DSP *thisdsp = (FMOD::DSP *)dsp_state->instance; - - thisdsp->getUserData((void **)&windgen); - - if (windgen) - windgen->windGenerate((LLAudioEngine_FMODEX::MIXBUFFERFORMAT *)newbuffer, length); - - return FMOD_OK; -} diff --git a/indra/llaudio/llaudioengine_fmodex.h b/indra/llaudio/llaudioengine_fmodex.h deleted file mode 100644 index fe93d8c48..000000000 --- a/indra/llaudio/llaudioengine_fmodex.h +++ /dev/null @@ -1,139 +0,0 @@ -/** - * @file audioengine_FMODEX.h - * @brief Definition of LLAudioEngine class abstracting the audio - * support as a FMOD 3D implementation - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_AUDIOENGINE_FMODEX_H -#define LL_AUDIOENGINE_FMODEX_H - -#include "llaudioengine.h" -#include "lllistener_fmodex.h" -#include "llwindgen.h" - -//Stubs -class LLAudioStreamManagerFMODEX; -namespace FMOD -{ - class System; - class Channel; - class ChannelGroup; - class Sound; - class DSP; -} - -//Interfaces -class LLAudioEngine_FMODEX : public LLAudioEngine -{ -public: - LLAudioEngine_FMODEX(bool enable_profiler, bool verbose_debugging); - virtual ~LLAudioEngine_FMODEX(); - - // initialization/startup/shutdown - virtual bool init(const S32 num_channels, void *user_data); - virtual std::string getDriverName(bool verbose); - virtual void allocateListener(); - - virtual void shutdown(); - - /*virtual*/ bool initWind(); - /*virtual*/ void cleanupWind(); - - /*virtual*/void updateWind(LLVector3 direction, F32 camera_height_above_water); - - typedef F32 MIXBUFFERFORMAT; - - FMOD::System *getSystem() const {return mSystem;} -protected: - /*virtual*/ LLAudioBuffer *createBuffer(); // Get a free buffer, or flush an existing one if you have to. - /*virtual*/ LLAudioChannel *createChannel(); // Create a new audio channel. - - /*virtual*/ void setInternalGain(F32 gain); - - bool mInited; - - LLWindGen *mWindGen; - - FMOD::DSP *mWindDSP; - FMOD::System *mSystem; - bool mEnableProfiler; - -public: - static FMOD::ChannelGroup *mChannelGroups[LLAudioEngine::AUDIO_TYPE_COUNT]; -}; - - -class LLAudioChannelFMODEX : public LLAudioChannel -{ -public: - LLAudioChannelFMODEX(FMOD::System *audioengine); - virtual ~LLAudioChannelFMODEX(); - void onRelease(); -protected: - /*virtual*/ void play(); - /*virtual*/ void playSynced(LLAudioChannel *channelp); - /*virtual*/ void cleanup(); - /*virtual*/ bool isPlaying(); - - /*virtual*/ bool updateBuffer(); - /*virtual*/ void update3DPosition(); - /*virtual*/ void updateLoop(); - - void set3DMode(bool use3d); -protected: - FMOD::System *getSystem() const {return mSystemp;} - FMOD::System *mSystemp; - FMOD::Channel *mChannelp; - S32 mLastSamplePos; - - friend class CFMODSoundChecks; -}; - - -class LLAudioBufferFMODEX : public LLAudioBuffer -{ -public: - LLAudioBufferFMODEX(FMOD::System *audioengine); - virtual ~LLAudioBufferFMODEX(); - - /*virtual*/ bool loadWAV(const std::string& filename); - /*virtual*/ U32 getLength(); - friend class LLAudioChannelFMODEX; -protected: - FMOD::System *getSystem() const {return mSystemp;} - FMOD::System *mSystemp; - FMOD::Sound *getSound() const{ return mSoundp; } - FMOD::Sound *mSoundp; - - friend class CFMODSoundChecks; -}; - - -#endif // LL_AUDIOENGINE_FMODEX_H diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp index d86748ebe..930af7fc2 100644 --- a/indra/llaudio/llaudioengine_fmodstudio.cpp +++ b/indra/llaudio/llaudioengine_fmodstudio.cpp @@ -477,7 +477,7 @@ std::string LLAudioEngine_FMODSTUDIO::getDriverName(bool verbose) return llformat("FMOD Studio %1x.%02x.%02x", version >> 16, version >> 8 & 0x000000FF, version & 0x000000FF); } } - return "FMODEx"; + return "FMOD Studio"; } diff --git a/indra/llaudio/lllistener_fmodex.cpp b/indra/llaudio/lllistener_fmodex.cpp deleted file mode 100644 index e70dc7c60..000000000 --- a/indra/llaudio/lllistener_fmodex.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/** - * @file listener_fmod.cpp - * @brief implementation of LISTENER class abstracting the audio - * support as a FMOD 3D implementation (windows only) - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "linden_common.h" -#include "llaudioengine.h" -#include "lllistener_fmodex.h" -#include "fmod.hpp" - -//----------------------------------------------------------------------- -// constructor -//----------------------------------------------------------------------- -LLListener_FMODEX::LLListener_FMODEX(FMOD::System *system) -{ - mSystem = system; - init(); -} - -//----------------------------------------------------------------------- -LLListener_FMODEX::~LLListener_FMODEX() -{ -} - -//----------------------------------------------------------------------- -void LLListener_FMODEX::init(void) -{ - // do inherited - LLListener::init(); - mDopplerFactor = 1.0f; - mRolloffFactor = 1.0f; -} - -//----------------------------------------------------------------------- -void LLListener_FMODEX::translate(LLVector3 offset) -{ - LLListener::translate(offset); - - mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)mPosition.mV, NULL, (FMOD_VECTOR*)mListenAt.mV, (FMOD_VECTOR*)mListenUp.mV); -} - -//----------------------------------------------------------------------- -void LLListener_FMODEX::setPosition(LLVector3 pos) -{ - LLListener::setPosition(pos); - - mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)mPosition.mV, NULL, (FMOD_VECTOR*)mListenAt.mV, (FMOD_VECTOR*)mListenUp.mV); -} - -//----------------------------------------------------------------------- -void LLListener_FMODEX::setVelocity(LLVector3 vel) -{ - LLListener::setVelocity(vel); - - mSystem->set3DListenerAttributes(0, NULL, (FMOD_VECTOR*)mVelocity.mV, (FMOD_VECTOR*)mListenAt.mV, (FMOD_VECTOR*)mListenUp.mV); -} - -//----------------------------------------------------------------------- -void LLListener_FMODEX::orient(LLVector3 up, LLVector3 at) -{ - LLListener::orient(up, at); - - // Welcome to the transition between right and left - // (coordinate systems, that is) - // Leaving the at vector alone results in a L/R reversal - // since DX is left-handed and we (LL, OpenGL, OpenAL) are right-handed - at = -at; - - mSystem->set3DListenerAttributes(0, NULL, NULL, (FMOD_VECTOR*)at.mV, (FMOD_VECTOR*)up.mV); -} - -//----------------------------------------------------------------------- -void LLListener_FMODEX::commitDeferredChanges() -{ - mSystem->update(); -} - - -void LLListener_FMODEX::setRolloffFactor(F32 factor) -{ - //An internal FMODEx optimization skips 3D updates if there have not been changes to the 3D sound environment. - //Sadly, a change in rolloff is not accounted for, thus we must touch the listener properties as well. - //In short: Changing the position ticks a dirtyflag inside fmodex, which makes it not skip 3D processing next update call. - if(mRolloffFactor != factor) - { - LLVector3 pos = mVelocity - LLVector3(0.f,0.f,.1f); - mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)pos.mV, NULL, NULL, NULL); - mSystem->set3DListenerAttributes(0, (FMOD_VECTOR*)mVelocity.mV, NULL, NULL, NULL); - } - mRolloffFactor = factor; - mSystem->set3DSettings(mDopplerFactor, 1.f, mRolloffFactor); -} - - -F32 LLListener_FMODEX::getRolloffFactor() -{ - return mRolloffFactor; -} - - -void LLListener_FMODEX::setDopplerFactor(F32 factor) -{ - mDopplerFactor = factor; - mSystem->set3DSettings(mDopplerFactor, 1.f, mRolloffFactor); -} - - -F32 LLListener_FMODEX::getDopplerFactor() -{ - return mDopplerFactor; -} - - diff --git a/indra/llaudio/lllistener_fmodex.h b/indra/llaudio/lllistener_fmodex.h deleted file mode 100644 index 8a91b3a2e..000000000 --- a/indra/llaudio/lllistener_fmodex.h +++ /dev/null @@ -1,71 +0,0 @@ -/** - * @file listener_fmod.h - * @brief Description of LISTENER class abstracting the audio support - * as an FMOD 3D implementation (windows and Linux) - * - * $LicenseInfo:firstyear=2002&license=viewergpl$ - * - * Copyright (c) 2002-2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_LISTENER_FMODEX_H -#define LL_LISTENER_FMODEX_H - -#include "lllistener.h" - -//Stubs -namespace FMOD -{ - class System; -} - -//Interfaces -class LLListener_FMODEX : public LLListener -{ - public: - LLListener_FMODEX(FMOD::System *system); - virtual ~LLListener_FMODEX(); - virtual void init(); - - virtual void translate(LLVector3 offset); - virtual void setPosition(LLVector3 pos); - virtual void setVelocity(LLVector3 vel); - virtual void orient(LLVector3 up, LLVector3 at); - virtual void commitDeferredChanges(); - - virtual void setDopplerFactor(F32 factor); - virtual F32 getDopplerFactor(); - virtual void setRolloffFactor(F32 factor); - virtual F32 getRolloffFactor(); - protected: - FMOD::System *mSystem; - F32 mDopplerFactor; - F32 mRolloffFactor; -}; - -#endif - - diff --git a/indra/llaudio/llstreamingaudio_fmodex.cpp b/indra/llaudio/llstreamingaudio_fmodex.cpp deleted file mode 100644 index 39436977a..000000000 --- a/indra/llaudio/llstreamingaudio_fmodex.cpp +++ /dev/null @@ -1,596 +0,0 @@ -/** - * @file streamingaudio_fmod.cpp - * @brief LLStreamingAudio_FMODEX implementation - * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#include "linden_common.h" - -#include "llmath.h" - -#include "fmod.hpp" -#include "fmod_errors.h" - -#include "llstreamingaudio_fmodex.h" - -inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string) -{ - if (result == FMOD_OK) - return false; - LL_WARNS("AudioImpl") << string << " Error: " << FMOD_ErrorString(result) << LL_ENDL; - return true; -} - -class LLAudioStreamManagerFMODEX -{ -public: - LLAudioStreamManagerFMODEX(FMOD::System *system, const std::string& url); - FMOD::Channel* startStream(); - bool stopStream(); // Returns true if the stream was successfully stopped. - bool ready(); - - const std::string& getURL() { return mInternetStreamURL; } - - FMOD_RESULT getOpenState(FMOD_OPENSTATE& openstate, unsigned int* percentbuffered=NULL, bool* starving=NULL, bool* diskbusy=NULL); -protected: - FMOD::System* mSystem; - FMOD::Channel* mStreamChannel; - FMOD::Sound* mInternetStream; - bool mReady; - - std::string mInternetStreamURL; -}; - - - -//--------------------------------------------------------------------------- -// Internet Streaming -//--------------------------------------------------------------------------- -LLStreamingAudio_FMODEX::LLStreamingAudio_FMODEX(FMOD::System *system) : - mSystem(system), - mCurrentInternetStreamp(NULL), - mFMODInternetStreamChannelp(NULL), - mGain(1.0f), - mMetaData(NULL) -{ - FMOD_RESULT result; - - // Number of milliseconds of audio to buffer for the audio card. - // Must be larger than the usual Second Life frame stutter time. - const U32 buffer_seconds = 10; //sec - const U32 estimated_bitrate = 128; //kbit/sec - result = mSystem->setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES); - Check_FMOD_Error(result, "FMOD::System::setStreamBufferSize"); - - // Here's where we set the size of the network buffer and some buffering - // parameters. In this case we want a network buffer of 16k, we want it - // to prebuffer 40% of that when we first connect, and we want it - // to rebuffer 80% of that whenever we encounter a buffer underrun. - - // Leave the net buffer properties at the default. - //FSOUND_Stream_Net_SetBufferProperties(20000, 40, 80); -} - - -LLStreamingAudio_FMODEX::~LLStreamingAudio_FMODEX() -{ - stop(); - for (U32 i = 0; i < 100; ++i) - { - if (releaseDeadStreams()) - break; - ms_sleep(10); - } -} - - -void LLStreamingAudio_FMODEX::start(const std::string& url) -{ - //if (!mInited) - //{ - // LL_WARNS() << "startInternetStream before audio initialized" << LL_ENDL; - // return; - //} - - // "stop" stream but don't clear url, etc. in case url == mInternetStreamURL - stop(); - - if (!url.empty()) - { - if(mDeadStreams.empty()) - { - LL_INFOS() << "Starting internet stream: " << url << LL_ENDL; - mCurrentInternetStreamp = new LLAudioStreamManagerFMODEX(mSystem,url); - mURL = url; - mMetaData = new LLSD; - } - else - { - LL_INFOS() << "Deferring stream load until buffer release: " << url << LL_ENDL; - mPendingURL = url; - } - } - else - { - LL_INFOS() << "Set internet stream to null" << LL_ENDL; - mURL.clear(); - } -} - -enum utf_endian_type_t -{ - UTF16LE, - UTF16BE, - UTF16 -}; - -std::string utf16input_to_utf8(unsigned char* input, U32 len, utf_endian_type_t type) -{ - if (type == UTF16) - { - type = UTF16BE; //Default - if (len > 2) - { - //Parse and strip BOM. - if ((input[0] == 0xFE && input[1] == 0xFF) || - (input[0] == 0xFF && input[1] == 0xFE)) - { - input += 2; - len -= 2; - type = input[0] == 0xFE ? UTF16BE : UTF16LE; - } - } - } - llutf16string out_16((U16*)input, len / 2); - if (len % 2) - { - out_16.push_back((input)[len - 1] << 8); - } - if (type == UTF16BE) - { - for (llutf16string::iterator i = out_16.begin(); i < out_16.end(); ++i) - { - llutf16string::value_type v = *i; - *i = ((v & 0x00FF) << 8) | ((v & 0xFF00) >> 8); - } - } - return utf16str_to_utf8str(out_16); -} - -void LLStreamingAudio_FMODEX::update() -{ - if (!releaseDeadStreams()) - { - llassert_always(mCurrentInternetStreamp == NULL); - return; - } - - if(!mPendingURL.empty()) - { - llassert_always(mCurrentInternetStreamp == NULL); - LL_INFOS() << "Starting internet stream: " << mPendingURL << LL_ENDL; - mCurrentInternetStreamp = new LLAudioStreamManagerFMODEX(mSystem,mPendingURL); - mURL = mPendingURL; - mMetaData = new LLSD; - mPendingURL.clear(); - } - - // Don't do anything if there are no streams playing - if (!mCurrentInternetStreamp) - { - return; - } - - unsigned int progress; - bool starving; - bool diskbusy; - FMOD_OPENSTATE open_state; - FMOD_RESULT res = mCurrentInternetStreamp->getOpenState(open_state, &progress, &starving, &diskbusy); - - if (res != FMOD_OK || open_state == FMOD_OPENSTATE_ERROR) - { - stop(); - return; - } - else if (open_state == FMOD_OPENSTATE_READY) - { - // Stream is live - - // start the stream if it's ready - if (!mFMODInternetStreamChannelp && - (mFMODInternetStreamChannelp = mCurrentInternetStreamp->startStream())) - { - // Reset volume to previously set volume - setGain(getGain()); - Check_FMOD_Error(mFMODInternetStreamChannelp->setPaused(false), "FMOD::Channel::setPaused"); - } - } - - if(mFMODInternetStreamChannelp) - { - if(!mMetaData) - mMetaData = new LLSD; - - FMOD::Sound *sound = NULL; - - if(mFMODInternetStreamChannelp->getCurrentSound(&sound) == FMOD_OK && sound) - { - FMOD_TAG tag; - S32 tagcount, dirtytagcount; - if(sound->getNumTags(&tagcount, &dirtytagcount) == FMOD_OK && dirtytagcount) - { - mMetaData->clear(); - - for(S32 i = 0; i < tagcount; ++i) - { - if(sound->getTag(NULL, i, &tag)!=FMOD_OK) - continue; - std::string name = tag.name; - switch(tag.type) //Crappy tag translate table. - { - case(FMOD_TAGTYPE_ID3V2): - if (!LLStringUtil::compareInsensitive(name, "TIT2")) name = "TITLE"; - else if(name == "TPE1") name = "ARTIST"; - break; - case(FMOD_TAGTYPE_ASF): - if (!LLStringUtil::compareInsensitive(name, "Title")) name = "TITLE"; - else if (!LLStringUtil::compareInsensitive(name, "WM/AlbumArtist")) name = "ARTIST"; - break; - case(FMOD_TAGTYPE_FMOD): - if (!LLStringUtil::compareInsensitive(name, "Sample Rate Change")) - { - LL_INFOS() << "Stream forced changing sample rate to " << *((float *)tag.data) << LL_ENDL; - Check_FMOD_Error(mFMODInternetStreamChannelp->setFrequency(*((float *)tag.data)), "FMOD::Channel::setFrequency"); - } - continue; - default: - if (!LLStringUtil::compareInsensitive(name, "TITLE") || - !LLStringUtil::compareInsensitive(name, "ARTIST")) - LLStringUtil::toUpper(name); - break; - } - - switch(tag.datatype) - { - case(FMOD_TAGDATATYPE_INT): - (*mMetaData)[name]=*(LLSD::Integer*)(tag.data); - LL_INFOS() << tag.name << ": " << *(int*)(tag.data) << LL_ENDL; - break; - case(FMOD_TAGDATATYPE_FLOAT): - (*mMetaData)[name]=*(LLSD::Float*)(tag.data); - LL_INFOS() << tag.name << ": " << *(float*)(tag.data) << LL_ENDL; - break; - case(FMOD_TAGDATATYPE_STRING): - { - std::string out = rawstr_to_utf8(std::string((char*)tag.data,tag.datalen)); - if (out.length() && out[out.size() - 1] == 0) - out.erase(out.size() - 1); - (*mMetaData)[name]=out; - LL_INFOS() << tag.name << "(RAW): " << out << LL_ENDL; - } - break; - case(FMOD_TAGDATATYPE_STRING_UTF8) : - { - U8 offs = 0; - if (tag.datalen > 3 && ((unsigned char*)tag.data)[0] == 0xEF && ((char*)tag.data)[1] == 0xBB && ((char*)tag.data)[2] == 0xBF) - offs = 3; - std::string out((char*)tag.data + offs, tag.datalen - offs); - if (out.length() && out[out.size() - 1] == 0) - out.erase(out.size() - 1); - (*mMetaData)[name] = out; - LL_INFOS() << tag.name << "(UTF8): " << out << LL_ENDL; - } - break; - case(FMOD_TAGDATATYPE_STRING_UTF16): - { - std::string out = utf16input_to_utf8((unsigned char*)tag.data, tag.datalen, UTF16); - if (out.length() && out[out.size() - 1] == 0) - out.erase(out.size() - 1); - (*mMetaData)[name] = out; - LL_INFOS() << tag.name << "(UTF16): " << out << LL_ENDL; - } - break; - case(FMOD_TAGDATATYPE_STRING_UTF16BE): - { - std::string out = utf16input_to_utf8((unsigned char*)tag.data, tag.datalen, UTF16BE); - if (out.length() && out[out.size() - 1] == 0) - out.erase(out.size() - 1); - (*mMetaData)[name] = out; - LL_INFOS() << tag.name << "(UTF16BE): " << out << LL_ENDL; - } - default: - break; - } - } - } - if(starving) - { - bool paused = false; - if (mFMODInternetStreamChannelp->getPaused(&paused) == FMOD_OK && !paused) - { - LL_INFOS() << "Stream starvation detected! Pausing stream until buffer nearly full." << LL_ENDL; - LL_INFOS() << " (diskbusy="<setPaused(true), "FMOD::Channel::setPaused"); - } - } - else if(progress > 80) - { - Check_FMOD_Error(mFMODInternetStreamChannelp->setPaused(false), "FMOD::Channel::setPaused"); - } - } - } -} - -void LLStreamingAudio_FMODEX::stop() -{ - mPendingURL.clear(); - - if(mMetaData) - { - delete mMetaData; - mMetaData = NULL; - } - if (mFMODInternetStreamChannelp) - { - Check_FMOD_Error(mFMODInternetStreamChannelp->setPaused(true), "FMOD::Channel::setPaused"); - Check_FMOD_Error(mFMODInternetStreamChannelp->setPriority(0), "FMOD::Channel::setPriority"); - mFMODInternetStreamChannelp = NULL; - } - - if (mCurrentInternetStreamp) - { - LL_INFOS() << "Stopping internet stream: " << mCurrentInternetStreamp->getURL() << LL_ENDL; - if (mCurrentInternetStreamp->stopStream()) - { - delete mCurrentInternetStreamp; - } - else - { - LL_WARNS() << "Pushing stream to dead list: " << mCurrentInternetStreamp->getURL() << LL_ENDL; - mDeadStreams.push_back(mCurrentInternetStreamp); - } - mCurrentInternetStreamp = NULL; - //mURL.clear(); - } -} - -void LLStreamingAudio_FMODEX::pause(int pauseopt) -{ - if (pauseopt < 0) - { - pauseopt = mCurrentInternetStreamp ? 1 : 0; - } - - if (pauseopt) - { - if (mCurrentInternetStreamp) - { - stop(); - } - } - else - { - start(getURL()); - } -} - - -// A stream is "playing" if it has been requested to start. That -// doesn't necessarily mean audio is coming out of the speakers. -int LLStreamingAudio_FMODEX::isPlaying() -{ - if (mCurrentInternetStreamp) - { - return 1; // Active and playing - } - else if (!mURL.empty() || !mPendingURL.empty()) - { - return 2; // "Paused" - } - else - { - return 0; - } -} - - -F32 LLStreamingAudio_FMODEX::getGain() -{ - return mGain; -} - - -std::string LLStreamingAudio_FMODEX::getURL() -{ - return mURL; -} - - -void LLStreamingAudio_FMODEX::setGain(F32 vol) -{ - mGain = vol; - - if (mFMODInternetStreamChannelp) - { - vol = llclamp(vol * vol, 0.f, 1.f); //should vol be squared here? - - Check_FMOD_Error(mFMODInternetStreamChannelp->setVolume(vol), "FMOD::Channel::setVolume"); - } -} - -/*virtual*/ bool LLStreamingAudio_FMODEX::getWaveData(float* arr, S32 count, S32 stride/*=1*/) -{ - if(!mFMODInternetStreamChannelp || !mCurrentInternetStreamp) - return false; - - bool muted=false; - FMOD_RESULT res = mFMODInternetStreamChannelp->getMute(&muted); - if(res != FMOD_OK || muted) - return false; - - static std::vector local_array(count); //Have to have an extra buffer to mix channels. Bleh. - if(count > (S32)local_array.size()) //Expand the array if needed. Try to minimize allocation calls, so don't ever shrink. - local_array.resize(count); - - if( mFMODInternetStreamChannelp->getWaveData(&local_array[0],count,0) == FMOD_OK && - mFMODInternetStreamChannelp->getWaveData(&arr[0],count,1) == FMOD_OK ) - { - for(S32 i = count-1;i>=0;i-=stride) - { - arr[i] += local_array[i]; - arr[i] *= .5f; - } - return true; - } - return false; -} - -/////////////////////////////////////////////////////// -// manager of possibly-multiple internet audio streams - -LLAudioStreamManagerFMODEX::LLAudioStreamManagerFMODEX(FMOD::System *system, const std::string& url) : - mSystem(system), - mStreamChannel(NULL), - mInternetStream(NULL), - mReady(false) -{ - mInternetStreamURL = url; - - /*FMOD_CREATESOUNDEXINFO exinfo; - memset(&exinfo,0,sizeof(exinfo)); - exinfo.cbsize = sizeof(exinfo); - exinfo.suggestedsoundtype = FMOD_SOUND_TYPE_OGGVORBIS; //Hint to speed up loading.*/ - - FMOD_RESULT result = mSystem->createStream(url.c_str(), FMOD_2D | FMOD_NONBLOCKING | FMOD_IGNORETAGS, 0, &mInternetStream); - - if (result!= FMOD_OK) - { - LL_WARNS() << "Couldn't open fmod stream, error " - << FMOD_ErrorString(result) - << LL_ENDL; - mReady = false; - return; - } - - mReady = true; -} - -FMOD::Channel *LLAudioStreamManagerFMODEX::startStream() -{ - // We need a live and opened stream before we try and play it. - FMOD_OPENSTATE open_state; - if (getOpenState(open_state) != FMOD_OK || open_state != FMOD_OPENSTATE_READY) - { - LL_WARNS() << "No internet stream to start playing!" << LL_ENDL; - return NULL; - } - - if(mStreamChannel) - return mStreamChannel; //Already have a channel for this stream. - - Check_FMOD_Error(mSystem->playSound(FMOD_CHANNEL_FREE, mInternetStream, true, &mStreamChannel), "FMOD::System::playSound"); - return mStreamChannel; -} - -bool LLAudioStreamManagerFMODEX::stopStream() -{ - if (mInternetStream) - { - bool close = true; - FMOD_OPENSTATE open_state; - if (getOpenState(open_state) == FMOD_OK) - { - switch (open_state) - { - case FMOD_OPENSTATE_CONNECTING: - close = false; - break; - default: - close = true; - } - } - - if (close && mInternetStream->release() == FMOD_OK) - { - mStreamChannel = NULL; - mInternetStream = NULL; - return true; - } - else - { - return false; - } - } - else - { - return true; - } -} - -FMOD_RESULT LLAudioStreamManagerFMODEX::getOpenState(FMOD_OPENSTATE& state, unsigned int* percentbuffered, bool* starving, bool* diskbusy) -{ - if (!mInternetStream) - return FMOD_ERR_INVALID_HANDLE; - FMOD_RESULT result = mInternetStream->getOpenState(&state, percentbuffered, starving, diskbusy); - Check_FMOD_Error(result, "FMOD::Sound::getOpenState"); - return result; -} - -void LLStreamingAudio_FMODEX::setBufferSizes(U32 streambuffertime, U32 decodebuffertime) -{ - Check_FMOD_Error(mSystem->setStreamBufferSize(streambuffertime / 1000 * 128 * 128, FMOD_TIMEUNIT_RAWBYTES), "FMOD::System::setStreamBufferSize"); - FMOD_ADVANCEDSETTINGS settings; - memset(&settings,0,sizeof(settings)); - settings.cbsize=sizeof(settings); - settings.defaultDecodeBufferSize = decodebuffertime;//ms - Check_FMOD_Error(mSystem->setAdvancedSettings(&settings), "FMOD::System::setAdvancedSettings"); -} - -bool LLStreamingAudio_FMODEX::releaseDeadStreams() -{ - // Kill dead internet streams, if possible - std::list::iterator iter; - for (iter = mDeadStreams.begin(); iter != mDeadStreams.end();) - { - LLAudioStreamManagerFMODEX *streamp = *iter; - if (streamp->stopStream()) - { - LL_INFOS() << "Closed dead stream" << LL_ENDL; - delete streamp; - mDeadStreams.erase(iter++); - } - else - { - iter++; - } - } - - return mDeadStreams.empty(); -} \ No newline at end of file diff --git a/indra/llaudio/llstreamingaudio_fmodex.h b/indra/llaudio/llstreamingaudio_fmodex.h deleted file mode 100644 index 15a4af931..000000000 --- a/indra/llaudio/llstreamingaudio_fmodex.h +++ /dev/null @@ -1,89 +0,0 @@ -/** - * @file streamingaudio_fmod.h - * @author Tofu Linden - * @brief Definition of LLStreamingAudio_FMOD implementation - * - * $LicenseInfo:firstyear=2009&license=viewergpl$ - * - * Copyright (c) 2009, Linden Research, Inc. - * - * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/programs/open_source/licensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - * $/LicenseInfo$ - */ - -#ifndef LL_STREAMINGAUDIO_FMOD_H -#define LL_STREAMINGAUDIO_FMOD_H - -#include "stdtypes.h" // from llcommon - -#include "llstreamingaudio.h" -#include "lltimer.h" - -//Stubs -class LLAudioStreamManagerFMODEX; -namespace FMOD -{ - class System; - class Channel; -} - -//Interfaces -class LLStreamingAudio_FMODEX : public LLStreamingAudioInterface -{ - public: - LLStreamingAudio_FMODEX(FMOD::System *system); - /*virtual*/ ~LLStreamingAudio_FMODEX(); - - /*virtual*/ void start(const std::string& url); - /*virtual*/ void stop(); - /*virtual*/ void pause(int pause); - /*virtual*/ void update(); - /*virtual*/ int isPlaying(); - /*virtual*/ void setGain(F32 vol); - /*virtual*/ F32 getGain(); - /*virtual*/ std::string getURL(); - - /*virtual*/ bool supportsMetaData(){return true;} - /*virtual*/ const LLSD *getMetaData(){return mMetaData;} //return NULL if not playing. - /*virtual*/ bool supportsWaveData(){return true;} - /*virtual*/ bool getWaveData(float* arr, S32 count, S32 stride = 1); - /*virtual*/ bool supportsAdjustableBufferSizes(){return true;} - /*virtual*/ void setBufferSizes(U32 streambuffertime, U32 decodebuffertime); -private: - bool releaseDeadStreams(); - - FMOD::System *mSystem; - - LLAudioStreamManagerFMODEX *mCurrentInternetStreamp; - FMOD::Channel *mFMODInternetStreamChannelp; - std::list mDeadStreams; - - std::string mURL; - std::string mPendingURL; - F32 mGain; - - LLSD *mMetaData; -}; - - -#endif // LL_STREAMINGAUDIO_FMOD_H diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 7ebe1c7f3..72f045f63 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -9,12 +9,7 @@ include(BuildVersion) include(CMakeCopyIfDifferent) include(DBusGlib) include(ELFIO) -if(FMODSTUDIO) - include(FMODSTUDIO) -endif(FMODSTUDIO) -if(FMODEX) - include(FMODEX) -endif(FMODEX) +include(FMODSTUDIO) include(GLOD) include(FindOpenGL) include(Hunspell) @@ -1417,10 +1412,6 @@ if (WINDOWS) list(APPEND viewer_SOURCE_FILES ${viewer_INSTALLER_FILES}) endif (WINDOWS) -if (FMODSTUDIO) - set(FMOD_LIBRARY ${FMOD_LINK_LIBRARY_RELEASE}) -endif (FMODSTUDIO) - set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES}) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 8ceb12c31..a0ae18270 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -4490,19 +4490,7 @@ void LLAppViewer::shutdownAudio() if (gAudiop) { // shut down the audio subsystem - - bool want_longname = false; - if (gAudiop->getDriverName(want_longname) == "FMOD") - { - // This hack exists because fmod likes to occasionally - // crash or hang forever when shutting down, for no - // apparent reason. - LL_WARNS() << "Hack, skipping FMOD audio engine cleanup" << LL_ENDL; - } - else - { - gAudiop->shutdown(); - } + gAudiop->shutdown(); delete gAudiop; gAudiop = NULL; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 526f4ee23..4198a5247 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -49,10 +49,6 @@ # include "llaudioengine_fmodstudio.h" #endif -#if LL_FMODEX -# include "llaudioengine_fmodex.h" -#endif - #ifdef LL_OPENAL #include "llaudioengine_openal.h" #endif @@ -434,17 +430,6 @@ void init_audio() } #endif -#ifdef LL_FMODEX - if (!gAudiop -#if !LL_WINDOWS - && NULL == getenv("LL_BAD_FMODEX_DRIVER") -#endif // !LL_WINDOWS - ) - { - gAudiop = (LLAudioEngine *) new LLAudioEngine_FMODEX(gSavedSettings.getBOOL("SHEnableFMODExProfiler"),gSavedSettings.getBOOL("SHEnableFMODEXVerboseDebugging")); - } -#endif - #ifdef LL_OPENAL if (!gAudiop #if !LL_WINDOWS From a5b03d1c0fe4578b3e6843aaf51ee5730cee2ac0 Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 13:14:09 -0500 Subject: [PATCH 08/19] Kill winmmshim, remove dead files --- AscentChangelog.txt | 81 - doc/asset_urls.txt | 5 - doc/releasenotes-where.txt | 5 - doc/viewer-changes.txt | 0 indra/newview/viewer_manifest.py | 5 - indra/plugins/CMakeLists.txt | 4 - .../plugins/webkit/windows_volume_catcher.cpp | 56 +- indra/plugins/winmmshim/CMakeLists.txt | 40 - indra/plugins/winmmshim/forwarding_api.cpp | 1627 ----------------- indra/plugins/winmmshim/forwarding_api.h | 390 ---- indra/plugins/winmmshim/winmm.def | 218 --- indra/plugins/winmmshim/winmm_shim.cpp | 200 -- scripts/build_version.py | 54 - scripts/update_version_files.py | 306 ---- scripts/xcode_fix.sh | 48 - 15 files changed, 6 insertions(+), 3033 deletions(-) delete mode 100644 AscentChangelog.txt delete mode 100644 doc/asset_urls.txt delete mode 100644 doc/releasenotes-where.txt delete mode 100644 doc/viewer-changes.txt delete mode 100644 indra/plugins/winmmshim/CMakeLists.txt delete mode 100644 indra/plugins/winmmshim/forwarding_api.cpp delete mode 100644 indra/plugins/winmmshim/forwarding_api.h delete mode 100644 indra/plugins/winmmshim/winmm.def delete mode 100644 indra/plugins/winmmshim/winmm_shim.cpp delete mode 100755 scripts/build_version.py delete mode 100755 scripts/update_version_files.py delete mode 100644 scripts/xcode_fix.sh diff --git a/AscentChangelog.txt b/AscentChangelog.txt deleted file mode 100644 index d7c9aff00..000000000 --- a/AscentChangelog.txt +++ /dev/null @@ -1,81 +0,0 @@ -->> Features implemented in Ascent: - -In-World: -------------------------------------------------- -* Alpha skins and Tattoo Layers -* Inventory Pre-caching -* Avatar Radar -* Multiple Attachment Points -* Idle time of avatars around you (Not perfect) -* Client tags/coloring for various clients, and extra client definitions -* Force Away button to fake being away if you really want to avoid someone :V -* Double-Click teleport (Not all the functionality of Emerald yet) -Preferences (Options are in Ascent Options): -* Disable Look At -* Disable Point At and beam end -* Fetch inventory in background on login (No waiting for caching when searching) -* Display your client tag to yourself -* Display your client tag color to yourself -* Rez objects as land group when possible -* Some settings can now be saved per account after changing an option in the preferences. Currently affected settings: - Edit Beam color - Client Tag Color -Communication Window: -- Friend List: - * Friend List Online/Total counts (Not perfect) - * Shows what rights your friends have given you (Mod, See on map, Online) - -Chat Bar: -* Emerald-style Chatbar as Commandline (See Preferences) -* MU-style poses. -* OOC Auto-close. - -Instant Messages: -* MU-style poses. -* OOC Auto-close. - -Advanced -> Ascent: -* Fake Away Status -* Force Ground Sit (Lets you sit anywhere) -* Phantom Avatar (Prevents you visually from being pushed.) -* Toggle IM Notification (Ability to hide '%n is typing...' notification from being sent.) -* Close All Dialogs -* Message Log -* Message Builder -* Sound Explorer -* Asset Blacklist -* AO options - -Object Pie Menus: -* Measure: Select on one object, then another, to get the exact distance between the two -* Data: Reports prim rotation and position in a format usable in LSL scripts. -* Script Counter - -Self Pie Menu: -* Animation Explorer - -Agent Pie Menus: -* Script Counter -* Copy Agent UUID -* Debug - -Parcel Window: -------------------------------------------------- -- General tab: -- Objects tab: - * In Sim/Online/Offline indicators for Parcel Object Owner listings (Online is currently wonky - This is an issue with SL, Emerald has the same problem.) - -Build Window: -------------------------------------------------- -- General tab: - * Last Owner shown in Build "General" Tab - * Group object is set to has a "View" button to see the group's profile - * Copy Object Key button -- Build Tab: - * Copy/Paste Position buttons - * Copy/Paste Size buttons - * Copy/Paste Rotation buttons - * Copy/Paste Primitive Parameters buttons - -Known issues: -Online/Total counts in the friends list sometimes go haywire. Not often or by a large margin, but it happens. \ No newline at end of file diff --git a/doc/asset_urls.txt b/doc/asset_urls.txt deleted file mode 100644 index e42a45c89..000000000 --- a/doc/asset_urls.txt +++ /dev/null @@ -1,5 +0,0 @@ -SLASSET_LIBS_WIN32=http://automated-builds-secondlife-com.s3.amazonaws.com/oss-viewer/export/slviewer-win32-libs-oss-viewer-1.23.4.0.zip -SLASSET_MD5=http://automated-builds-secondlife-com.s3.amazonaws.com/oss-viewer/export/md5sums-oss-viewer-1.23.4.0.txt -SLASSET_LIBS_DARWIN=http://automated-builds-secondlife-com.s3.amazonaws.com/oss-viewer/export/slviewer-darwin-libs-oss-viewer-1.23.4.0.tar.gz -SLASSET_ART=http://automated-builds-secondlife-com.s3.amazonaws.com/oss-viewer/export/slviewer-artwork-oss-viewer-1.23.4.0.zip -SLASSET_LIBS_LINUXI386=http://automated-builds-secondlife-com.s3.amazonaws.com/oss-viewer/export/slviewer-linux-libs-oss-viewer-1.23.4.0.tar.gz diff --git a/doc/releasenotes-where.txt b/doc/releasenotes-where.txt deleted file mode 100644 index 4af586690..000000000 --- a/doc/releasenotes-where.txt +++ /dev/null @@ -1,5 +0,0 @@ -For full release notes, see: - http://wiki.secondlife.com/wiki/Release_Notes - -For a log of viewer changes, see: - doc/viewer-changes.txt diff --git a/doc/viewer-changes.txt b/doc/viewer-changes.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 43ea452b3..125a69c90 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -322,11 +322,6 @@ class WindowsManifest(ViewerManifest): self.path("media_plugin_webkit.dll") self.end_prefix() - # Plugin volume control - if not self.is_win64() and self.prefix(src='../plugins/winmmshim/%s' % self.args['configuration'], dst=""): - self.path("winmm.dll") - self.end_prefix() - # For WebKit/Qt plugin runtimes if self.prefix(src=self.args['configuration']+"/llplugin", dst="llplugin"): self.path("libeay32.dll") diff --git a/indra/plugins/CMakeLists.txt b/indra/plugins/CMakeLists.txt index 259ed1bde..de57249ba 100644 --- a/indra/plugins/CMakeLists.txt +++ b/indra/plugins/CMakeLists.txt @@ -13,9 +13,5 @@ if (WINDOWS OR DARWIN) add_subdirectory(quicktime) endif (WINDOWS OR DARWIN) -if (WINDOWS AND WORD_SIZE EQUAL 32) - add_subdirectory(winmmshim) -endif (WINDOWS AND WORD_SIZE EQUAL 32) - add_subdirectory(example_basic) add_subdirectory(example_media) diff --git a/indra/plugins/webkit/windows_volume_catcher.cpp b/indra/plugins/webkit/windows_volume_catcher.cpp index 934ebee17..bb1173ce0 100644 --- a/indra/plugins/webkit/windows_volume_catcher.cpp +++ b/indra/plugins/webkit/windows_volume_catcher.cpp @@ -42,44 +42,14 @@ private: VolumeCatcherImpl(); ~VolumeCatcherImpl(); - typedef void (WINAPI *set_volume_func_t)(F32); - typedef void (WINAPI *set_mute_func_t)(bool); - - set_volume_func_t mSetVolumeFunc; - set_mute_func_t mSetMuteFunc; - - // tests if running on Vista, 7, 8 + once in CTOR - bool isWindowsVistaOrHigher(); - F32 mVolume; F32 mPan; - bool mSystemIsVistaOrHigher; }; -bool VolumeCatcherImpl::isWindowsVistaOrHigher() -{ - OSVERSIONINFO osvi; - ZeroMemory(&osvi, sizeof(OSVERSIONINFO)); - osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&osvi); - return osvi.dwMajorVersion >= 6; -} - VolumeCatcherImpl::VolumeCatcherImpl() : mVolume(1.0f), // default volume is max mPan(0.f) // default pan is centered { - mSystemIsVistaOrHigher = isWindowsVistaOrHigher(); - - if ( ! mSystemIsVistaOrHigher ) - { - HMODULE handle = ::LoadLibrary(L"winmm.dll"); - if(handle) - { - mSetVolumeFunc = (set_volume_func_t)::GetProcAddress(handle, "setPluginVolume"); - mSetMuteFunc = (set_mute_func_t)::GetProcAddress(handle, "setPluginMute"); - } - } } VolumeCatcherImpl::~VolumeCatcherImpl() @@ -90,26 +60,12 @@ void VolumeCatcherImpl::setVolume(F32 volume) { mVolume = volume; - if ( mSystemIsVistaOrHigher ) - { - // set both left/right to same volume - // TODO: use pan value to set independently - DWORD left_channel = (DWORD)(mVolume * 65535.0f); - DWORD right_channel = (DWORD)(mVolume * 65535.0f); - DWORD hw_volume = left_channel << 16 | right_channel; - ::waveOutSetVolume(NULL, hw_volume); - } - else - { - if (mSetMuteFunc) - { - mSetMuteFunc(volume == 0.f); - } - if (mSetVolumeFunc) - { - mSetVolumeFunc(mVolume); - } - } + // set both left/right to same volume + // TODO: use pan value to set independently + DWORD left_channel = (DWORD)(mVolume * 65535.0f); + DWORD right_channel = (DWORD)(mVolume * 65535.0f); + DWORD hw_volume = left_channel << 16 | right_channel; + ::waveOutSetVolume(NULL, hw_volume); } void VolumeCatcherImpl::setPan(F32 pan) diff --git a/indra/plugins/winmmshim/CMakeLists.txt b/indra/plugins/winmmshim/CMakeLists.txt deleted file mode 100644 index bf74f8180..000000000 --- a/indra/plugins/winmmshim/CMakeLists.txt +++ /dev/null @@ -1,40 +0,0 @@ -# -*- cmake -*- - -project(winmm_shim) - -### winmm_shim -# *HACK - override msvcrt implementation (intialized on 00-Common) to be -# statically linked for winmm.dll this relies on vc taking the last flag on -# the command line -set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") -set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT") -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT") - -set(winmm_shim_SOURCE_FILES - forwarding_api.cpp - winmm_shim.cpp - ) - -set(winmm_shim_HEADER_FILES - forwarding_api.h - winmm.def - ) - -list(APPEND winmm_shim_SOURCE_FILES ${winmm_shim_HEADER_FILES}) - -set_source_files_properties(${media_plugin_webkit_HEADER_FILES} - PROPERTIES HEADER_FILE_ONLY TRUE) - -add_library(winmm_shim - SHARED - ${winmm_shim_SOURCE_FILES} -) - -if (WINDOWS) - set_target_properties( - winmm_shim - PROPERTIES - LINK_FLAGS "/MANIFEST:NO" - OUTPUT_NAME "winmm" - ) -endif (WINDOWS) diff --git a/indra/plugins/winmmshim/forwarding_api.cpp b/indra/plugins/winmmshim/forwarding_api.cpp deleted file mode 100644 index 745c97309..000000000 --- a/indra/plugins/winmmshim/forwarding_api.cpp +++ /dev/null @@ -1,1627 +0,0 @@ -/** - * @file forwarding_api.cpp - * @brief forwards winmm API calls to real winmm.dll - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "forwarding_api.h" - -CloseDriver_type CloseDriver_orig; -OpenDriver_type OpenDriver_orig; -SendDriverMessage_type SendDriverMessage_orig; -DrvGetModuleHandle_type DrvGetModuleHandle_orig; -GetDriverModuleHandle_type GetDriverModuleHandle_orig; -DefDriverProc_type DefDriverProc_orig; -DriverCallback_type DriverCallback_orig; -mmsystemGetVersion_type mmsystemGetVersion_orig; -sndPlaySoundA_type sndPlaySoundA_orig; -sndPlaySoundW_type sndPlaySoundW_orig; -PlaySoundA_type PlaySoundA_orig; -PlaySoundW_type PlaySoundW_orig; -waveOutGetNumDevs_type waveOutGetNumDevs_orig; -waveOutGetDevCapsA_type waveOutGetDevCapsA_orig; -waveOutGetDevCapsW_type waveOutGetDevCapsW_orig; -waveOutGetVolume_type waveOutGetVolume_orig; -waveOutSetVolume_type waveOutSetVolume_orig; -waveOutGetErrorTextA_type waveOutGetErrorTextA_orig; -waveOutGetErrorTextW_type waveOutGetErrorTextW_orig; -waveOutOpen_type waveOutOpen_orig; -waveOutClose_type waveOutClose_orig; -waveOutPrepareHeader_type waveOutPrepareHeader_orig; -waveOutUnprepareHeader_type waveOutUnprepareHeader_orig; -waveOutWrite_type waveOutWrite_orig; -waveOutPause_type waveOutPause_orig; -waveOutRestart_type waveOutRestart_orig; -waveOutReset_type waveOutReset_orig; -waveOutBreakLoop_type waveOutBreakLoop_orig; -waveOutGetPosition_type waveOutGetPosition_orig; -waveOutGetPitch_type waveOutGetPitch_orig; -waveOutSetPitch_type waveOutSetPitch_orig; -waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig; -waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig; -waveOutGetID_type waveOutGetID_orig; -waveOutMessage_type waveOutMessage_orig; -waveInGetNumDevs_type waveInGetNumDevs_orig; -waveInGetDevCapsA_type waveInGetDevCapsA_orig; -waveInGetDevCapsW_type waveInGetDevCapsW_orig; -waveInGetErrorTextA_type waveInGetErrorTextA_orig; -waveInGetErrorTextW_type waveInGetErrorTextW_orig; -waveInOpen_type waveInOpen_orig; -waveInClose_type waveInClose_orig; -waveInPrepareHeader_type waveInPrepareHeader_orig; -waveInUnprepareHeader_type waveInUnprepareHeader_orig; -waveInAddBuffer_type waveInAddBuffer_orig; -waveInStart_type waveInStart_orig; -waveInStop_type waveInStop_orig; -waveInReset_type waveInReset_orig; -waveInGetPosition_type waveInGetPosition_orig; -waveInGetID_type waveInGetID_orig; -waveInMessage_type waveInMessage_orig; -midiOutGetNumDevs_type midiOutGetNumDevs_orig; -midiStreamOpen_type midiStreamOpen_orig; -midiStreamClose_type midiStreamClose_orig; -midiStreamProperty_type midiStreamProperty_orig; -midiStreamPosition_type midiStreamPosition_orig; -midiStreamOut_type midiStreamOut_orig; -midiStreamPause_type midiStreamPause_orig; -midiStreamRestart_type midiStreamRestart_orig; -midiStreamStop_type midiStreamStop_orig; -midiConnect_type midiConnect_orig; -midiDisconnect_type midiDisconnect_orig; -midiOutGetDevCapsA_type midiOutGetDevCapsA_orig; -midiOutGetDevCapsW_type midiOutGetDevCapsW_orig; -midiOutGetVolume_type midiOutGetVolume_orig; -midiOutSetVolume_type midiOutSetVolume_orig; -midiOutGetErrorTextA_type midiOutGetErrorTextA_orig; -midiOutGetErrorTextW_type midiOutGetErrorTextW_orig; -midiOutOpen_type midiOutOpen_orig; -midiOutClose_type midiOutClose_orig; -midiOutPrepareHeader_type midiOutPrepareHeader_orig; -midiOutUnprepareHeader_type midiOutUnprepareHeader_orig; -midiOutShortMsg_type midiOutShortMsg_orig; -midiOutLongMsg_type midiOutLongMsg_orig; -midiOutReset_type midiOutReset_orig; -midiOutCachePatches_type midiOutCachePatches_orig; -midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig; -midiOutGetID_type midiOutGetID_orig; -midiOutMessage_type midiOutMessage_orig; -midiInGetNumDevs_type midiInGetNumDevs_orig; -midiInGetDevCapsA_type midiInGetDevCapsA_orig; -midiInGetDevCapsW_type midiInGetDevCapsW_orig; -midiInGetErrorTextA_type midiInGetErrorTextA_orig; -midiInGetErrorTextW_type midiInGetErrorTextW_orig; -midiInOpen_type midiInOpen_orig; -midiInClose_type midiInClose_orig; -midiInPrepareHeader_type midiInPrepareHeader_orig; -midiInUnprepareHeader_type midiInUnprepareHeader_orig; -midiInAddBuffer_type midiInAddBuffer_orig; -midiInStart_type midiInStart_orig; -midiInStop_type midiInStop_orig; -midiInReset_type midiInReset_orig; -midiInGetID_type midiInGetID_orig; -midiInMessage_type midiInMessage_orig; -auxGetNumDevs_type auxGetNumDevs_orig; -auxGetDevCapsA_type auxGetDevCapsA_orig; -auxGetDevCapsW_type auxGetDevCapsW_orig; -auxSetVolume_type auxSetVolume_orig; -auxGetVolume_type auxGetVolume_orig; -auxOutMessage_type auxOutMessage_orig; -mixerGetNumDevs_type mixerGetNumDevs_orig; -mixerGetDevCapsA_type mixerGetDevCapsA_orig; -mixerGetDevCapsW_type mixerGetDevCapsW_orig; -mixerOpen_type mixerOpen_orig; -mixerClose_type mixerClose_orig; -mixerMessage_type mixerMessage_orig; -mixerGetLineInfoA_type mixerGetLineInfoA_orig; -mixerGetLineInfoW_type mixerGetLineInfoW_orig; -mixerGetID_type mixerGetID_orig; -mixerGetLineControlsA_type mixerGetLineControlsA_orig; -mixerGetLineControlsW_type mixerGetLineControlsW_orig; -mixerGetControlDetailsA_type mixerGetControlDetailsA_orig; -mixerGetControlDetailsW_type mixerGetControlDetailsW_orig; -mixerSetControlDetails_type mixerSetControlDetails_orig; -mmGetCurrentTask_type mmGetCurrentTask_orig; -mmTaskBlock_type mmTaskBlock_orig; -mmTaskCreate_type mmTaskCreate_orig; -mmTaskSignal_type mmTaskSignal_orig; -mmTaskYield_type mmTaskYield_orig; -timeGetSystemTime_type timeGetSystemTime_orig; -timeGetTime_type timeGetTime_orig; -timeSetEvent_type timeSetEvent_orig; -timeKillEvent_type timeKillEvent_orig; -timeGetDevCaps_type timeGetDevCaps_orig; -timeBeginPeriod_type timeBeginPeriod_orig; -timeEndPeriod_type timeEndPeriod_orig; -joyGetNumDevs_type joyGetNumDevs_orig; -joyConfigChanged_type joyConfigChanged_orig; -joyGetDevCapsA_type joyGetDevCapsA_orig; -joyGetDevCapsW_type joyGetDevCapsW_orig; -joyGetPos_type joyGetPos_orig; -joyGetPosEx_type joyGetPosEx_orig; -joyGetThreshold_type joyGetThreshold_orig; -joyReleaseCapture_type joyReleaseCapture_orig; -joySetCapture_type joySetCapture_orig; -joySetThreshold_type joySetThreshold_orig; -mmioStringToFOURCCA_type mmioStringToFOURCCA_orig; -mmioStringToFOURCCW_type mmioStringToFOURCCW_orig; -mmioInstallIOProcA_type mmioInstallIOProcA_orig; -mmioInstallIOProcW_type mmioInstallIOProcW_orig; -mmioOpenA_type mmioOpenA_orig; -mmioOpenW_type mmioOpenW_orig; -mmioRenameA_type mmioRenameA_orig; -mmioRenameW_type mmioRenameW_orig; -mmioClose_type mmioClose_orig; -mmioRead_type mmioRead_orig; -mmioWrite_type mmioWrite_orig; -mmioSeek_type mmioSeek_orig; -mmioGetInfo_type mmioGetInfo_orig; -mmioSetInfo_type mmioSetInfo_orig; -mmioSetBuffer_type mmioSetBuffer_orig; -mmioFlush_type mmioFlush_orig; -mmioAdvance_type mmioAdvance_orig; -mmioSendMessage_type mmioSendMessage_orig; -mmioDescend_type mmioDescend_orig; -mmioAscend_type mmioAscend_orig; -mmioCreateChunk_type mmioCreateChunk_orig; -mciSendCommandA_type mciSendCommandA_orig; -mciSendCommandW_type mciSendCommandW_orig; -mciSendStringA_type mciSendStringA_orig; -mciSendStringW_type mciSendStringW_orig; -mciGetDeviceIDA_type mciGetDeviceIDA_orig; -mciGetDeviceIDW_type mciGetDeviceIDW_orig; -mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig; -mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig; -mciGetDriverData_type mciGetDriverData_orig; -mciGetErrorStringA_type mciGetErrorStringA_orig; -mciGetErrorStringW_type mciGetErrorStringW_orig; -mciSetDriverData_type mciSetDriverData_orig; -mciDriverNotify_type mciDriverNotify_orig; -mciDriverYield_type mciDriverYield_orig; -mciSetYieldProc_type mciSetYieldProc_orig; -mciFreeCommandResource_type mciFreeCommandResource_orig; -mciGetCreatorTask_type mciGetCreatorTask_orig; -mciGetYieldProc_type mciGetYieldProc_orig; -mciLoadCommandResource_type mciLoadCommandResource_orig; -mciExecute_type mciExecute_orig; - -// grab pointers to function calls in the real DLL -void init_function_pointers(HMODULE winmm_handle) -{ - CloseDriver_orig = (CloseDriver_type)::GetProcAddress(winmm_handle, "CloseDriver"); - OpenDriver_orig = (OpenDriver_type)::GetProcAddress(winmm_handle, "OpenDriver"); - SendDriverMessage_orig = (SendDriverMessage_type)::GetProcAddress(winmm_handle, "SendDriverMessage"); - DrvGetModuleHandle_orig = (DrvGetModuleHandle_type)::GetProcAddress(winmm_handle, "DrvGetModuleHandle"); - GetDriverModuleHandle_orig = (GetDriverModuleHandle_type)::GetProcAddress(winmm_handle, "GetDriverModuleHandle"); - DefDriverProc_orig = (DefDriverProc_type)::GetProcAddress(winmm_handle, "DefDriverProc"); - DriverCallback_orig = (DriverCallback_type)::GetProcAddress(winmm_handle, "DriverCallback"); - mmsystemGetVersion_orig = (mmsystemGetVersion_type)::GetProcAddress(winmm_handle, "mmsystemGetVersion"); - sndPlaySoundA_orig = (sndPlaySoundA_type)::GetProcAddress(winmm_handle, "sndPlaySoundA"); - sndPlaySoundW_orig = (sndPlaySoundW_type)::GetProcAddress(winmm_handle, "sndPlaySoundW"); - PlaySoundA_orig = (PlaySoundA_type)::GetProcAddress(winmm_handle, "PlaySoundA"); - PlaySoundW_orig = (PlaySoundW_type)::GetProcAddress(winmm_handle, "PlaySoundW"); - waveOutGetNumDevs_orig = (waveOutGetNumDevs_type)::GetProcAddress(winmm_handle, "waveOutGetNumDevs"); - waveOutGetDevCapsA_orig = (waveOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsA"); - waveOutGetDevCapsW_orig = (waveOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsW"); - waveOutGetVolume_orig = (waveOutGetVolume_type)::GetProcAddress(winmm_handle, "waveOutGetVolume"); - waveOutSetVolume_orig = (waveOutSetVolume_type)::GetProcAddress(winmm_handle, "waveOutSetVolume"); - waveOutGetErrorTextA_orig = (waveOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextA"); - waveOutGetErrorTextW_orig = (waveOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextW"); - waveOutOpen_orig = (waveOutOpen_type)::GetProcAddress(winmm_handle, "waveOutOpen"); - waveOutClose_orig = (waveOutClose_type)::GetProcAddress(winmm_handle, "waveOutClose"); - waveOutPrepareHeader_orig = (waveOutPrepareHeader_type)::GetProcAddress(winmm_handle, "waveOutPrepareHeader"); - waveOutUnprepareHeader_orig = (waveOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveOutUnprepareHeader"); - waveOutWrite_orig = (waveOutWrite_type)::GetProcAddress(winmm_handle, "waveOutWrite"); - waveOutPause_orig = (waveOutPause_type)::GetProcAddress(winmm_handle, "waveOutPause"); - waveOutRestart_orig = (waveOutRestart_type)::GetProcAddress(winmm_handle, "waveOutRestart"); - waveOutReset_orig = (waveOutReset_type)::GetProcAddress(winmm_handle, "waveOutReset"); - waveOutBreakLoop_orig = (waveOutBreakLoop_type)::GetProcAddress(winmm_handle, "waveOutBreakLoop"); - waveOutGetPosition_orig = (waveOutGetPosition_type)::GetProcAddress(winmm_handle, "waveOutGetPosition"); - waveOutGetPitch_orig = (waveOutGetPitch_type)::GetProcAddress(winmm_handle, "waveOutGetPitch"); - waveOutSetPitch_orig = (waveOutSetPitch_type)::GetProcAddress(winmm_handle, "waveOutSetPitch"); - waveOutGetPlaybackRate_orig = (waveOutGetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutGetPlaybackRate"); - waveOutSetPlaybackRate_orig = (waveOutSetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutSetPlaybackRate"); - waveOutGetID_orig = (waveOutGetID_type)::GetProcAddress(winmm_handle, "waveOutGetID"); - waveOutMessage_orig = (waveOutMessage_type)::GetProcAddress(winmm_handle, "waveOutMessage"); - waveInGetNumDevs_orig = (waveInGetNumDevs_type)::GetProcAddress(winmm_handle, "waveInGetNumDevs"); - waveInGetDevCapsA_orig = (waveInGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsA"); - waveInGetDevCapsW_orig = (waveInGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsW"); - waveInGetErrorTextA_orig = (waveInGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextA"); - waveInGetErrorTextW_orig = (waveInGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextW"); - waveInOpen_orig = (waveInOpen_type)::GetProcAddress(winmm_handle, "waveInOpen"); - waveInClose_orig = (waveInClose_type)::GetProcAddress(winmm_handle, "waveInClose"); - waveInPrepareHeader_orig = (waveInPrepareHeader_type)::GetProcAddress(winmm_handle, "waveInPrepareHeader"); - waveInUnprepareHeader_orig = (waveInUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveInUnprepareHeader"); - waveInAddBuffer_orig = (waveInAddBuffer_type)::GetProcAddress(winmm_handle, "waveInAddBuffer"); - waveInStart_orig = (waveInStart_type)::GetProcAddress(winmm_handle, "waveInStart"); - waveInStop_orig = (waveInStop_type)::GetProcAddress(winmm_handle, "waveInStop"); - waveInReset_orig = (waveInReset_type)::GetProcAddress(winmm_handle, "waveInReset"); - waveInGetPosition_orig = (waveInGetPosition_type)::GetProcAddress(winmm_handle, "waveInGetPosition"); - waveInGetID_orig = (waveInGetID_type)::GetProcAddress(winmm_handle, "waveInGetID"); - waveInMessage_orig = (waveInMessage_type)::GetProcAddress(winmm_handle, "waveInMessage"); - midiOutGetNumDevs_orig = (midiOutGetNumDevs_type)::GetProcAddress(winmm_handle, "midiOutGetNumDevs"); - midiStreamOpen_orig = (midiStreamOpen_type)::GetProcAddress(winmm_handle, "midiStreamOpen"); - midiStreamClose_orig = (midiStreamClose_type)::GetProcAddress(winmm_handle, "midiStreamClose"); - midiStreamProperty_orig = (midiStreamProperty_type)::GetProcAddress(winmm_handle, "midiStreamProperty"); - midiStreamPosition_orig = (midiStreamPosition_type)::GetProcAddress(winmm_handle, "midiStreamPosition"); - midiStreamOut_orig = (midiStreamOut_type)::GetProcAddress(winmm_handle, "midiStreamOut"); - midiStreamPause_orig = (midiStreamPause_type)::GetProcAddress(winmm_handle, "midiStreamPause"); - midiStreamRestart_orig = (midiStreamRestart_type)::GetProcAddress(winmm_handle, "midiStreamRestart"); - midiStreamStop_orig = (midiStreamStop_type)::GetProcAddress(winmm_handle, "midiStreamStop"); - midiConnect_orig = (midiConnect_type)::GetProcAddress(winmm_handle, "midiConnect"); - midiDisconnect_orig = (midiDisconnect_type)::GetProcAddress(winmm_handle, "midiDisconnect"); - midiOutGetDevCapsA_orig = (midiOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsA"); - midiOutGetDevCapsW_orig = (midiOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsW"); - midiOutGetVolume_orig = (midiOutGetVolume_type)::GetProcAddress(winmm_handle, "midiOutGetVolume"); - midiOutSetVolume_orig = (midiOutSetVolume_type)::GetProcAddress(winmm_handle, "midiOutSetVolume"); - midiOutGetErrorTextA_orig = (midiOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextA"); - midiOutGetErrorTextW_orig = (midiOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextW"); - midiOutOpen_orig = (midiOutOpen_type)::GetProcAddress(winmm_handle, "midiOutOpen"); - midiOutClose_orig = (midiOutClose_type)::GetProcAddress(winmm_handle, "midiOutClose"); - midiOutPrepareHeader_orig = (midiOutPrepareHeader_type)::GetProcAddress(winmm_handle, "midiOutPrepareHeader"); - midiOutUnprepareHeader_orig = (midiOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiOutUnprepareHeader"); - midiOutShortMsg_orig = (midiOutShortMsg_type)::GetProcAddress(winmm_handle, "midiOutShortMsg"); - midiOutLongMsg_orig = (midiOutLongMsg_type)::GetProcAddress(winmm_handle, "midiOutLongMsg"); - midiOutReset_orig = (midiOutReset_type)::GetProcAddress(winmm_handle, "midiOutReset"); - midiOutCachePatches_orig = (midiOutCachePatches_type)::GetProcAddress(winmm_handle, "midiOutCachePatches"); - midiOutCacheDrumPatches_orig = (midiOutCacheDrumPatches_type)::GetProcAddress(winmm_handle, "midiOutCacheDrumPatches"); - midiOutGetID_orig = (midiOutGetID_type)::GetProcAddress(winmm_handle, "midiOutGetID"); - midiOutMessage_orig = (midiOutMessage_type)::GetProcAddress(winmm_handle, "midiOutMessage"); - midiInGetNumDevs_orig = (midiInGetNumDevs_type)::GetProcAddress(winmm_handle, "midiInGetNumDevs"); - midiInGetDevCapsA_orig = (midiInGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsA"); - midiInGetDevCapsW_orig = (midiInGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsW"); - midiInGetErrorTextA_orig = (midiInGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextA"); - midiInGetErrorTextW_orig = (midiInGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextW"); - midiInOpen_orig = (midiInOpen_type)::GetProcAddress(winmm_handle, "midiInOpen"); - midiInClose_orig = (midiInClose_type)::GetProcAddress(winmm_handle, "midiInClose"); - midiInPrepareHeader_orig = (midiInPrepareHeader_type)::GetProcAddress(winmm_handle, "midiInPrepareHeader"); - midiInUnprepareHeader_orig = (midiInUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiInUnprepareHeader"); - midiInAddBuffer_orig = (midiInAddBuffer_type)::GetProcAddress(winmm_handle, "midiInAddBuffer"); - midiInStart_orig = (midiInStart_type)::GetProcAddress(winmm_handle, "midiInStart"); - midiInStop_orig = (midiInStop_type)::GetProcAddress(winmm_handle, "midiInStop"); - midiInReset_orig = (midiInReset_type)::GetProcAddress(winmm_handle, "midiInReset"); - midiInGetID_orig = (midiInGetID_type)::GetProcAddress(winmm_handle, "midiInGetID"); - midiInMessage_orig = (midiInMessage_type)::GetProcAddress(winmm_handle, "midiInMessage"); - auxGetNumDevs_orig = (auxGetNumDevs_type)::GetProcAddress(winmm_handle, "auxGetNumDevs"); - auxGetDevCapsA_orig = (auxGetDevCapsA_type)::GetProcAddress(winmm_handle, "auxGetDevCapsA"); - auxGetDevCapsW_orig = (auxGetDevCapsW_type)::GetProcAddress(winmm_handle, "auxGetDevCapsW"); - auxSetVolume_orig = (auxSetVolume_type)::GetProcAddress(winmm_handle, "auxSetVolume"); - auxGetVolume_orig = (auxGetVolume_type)::GetProcAddress(winmm_handle, "auxGetVolume"); - auxOutMessage_orig = (auxOutMessage_type)::GetProcAddress(winmm_handle, "auxOutMessage"); - mixerGetNumDevs_orig = (mixerGetNumDevs_type)::GetProcAddress(winmm_handle, "mixerGetNumDevs"); - mixerGetDevCapsA_orig = (mixerGetDevCapsA_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsA"); - mixerGetDevCapsW_orig = (mixerGetDevCapsW_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsW"); - mixerOpen_orig = (mixerOpen_type)::GetProcAddress(winmm_handle, "mixerOpen"); - mixerClose_orig = (mixerClose_type)::GetProcAddress(winmm_handle, "mixerClose"); - mixerMessage_orig = (mixerMessage_type)::GetProcAddress(winmm_handle, "mixerMessage"); - mixerGetLineInfoA_orig = (mixerGetLineInfoA_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoA"); - mixerGetLineInfoW_orig = (mixerGetLineInfoW_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoW"); - mixerGetID_orig = (mixerGetID_type)::GetProcAddress(winmm_handle, "mixerGetID"); - mixerGetLineControlsA_orig = (mixerGetLineControlsA_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsA"); - mixerGetLineControlsW_orig = (mixerGetLineControlsW_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsW"); - mixerGetControlDetailsA_orig = (mixerGetControlDetailsA_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsA"); - mixerGetControlDetailsW_orig = (mixerGetControlDetailsW_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsW"); - mixerSetControlDetails_orig = (mixerSetControlDetails_type)::GetProcAddress(winmm_handle, "mixerSetControlDetails"); - mmGetCurrentTask_orig = (mmGetCurrentTask_type)::GetProcAddress(winmm_handle, "mmGetCurrentTask"); - mmTaskBlock_orig = (mmTaskBlock_type)::GetProcAddress(winmm_handle, "mmTaskBlock"); - mmTaskCreate_orig = (mmTaskCreate_type)::GetProcAddress(winmm_handle, "mmTaskCreate"); - mmTaskSignal_orig = (mmTaskSignal_type)::GetProcAddress(winmm_handle, "mmTaskSignal"); - mmTaskYield_orig = (mmTaskYield_type)::GetProcAddress(winmm_handle, "mmTaskYield"); - timeGetSystemTime_orig = (timeGetSystemTime_type)::GetProcAddress(winmm_handle, "timeGetSystemTime"); - timeGetTime_orig = (timeGetTime_type)::GetProcAddress(winmm_handle, "timeGetTime"); - timeSetEvent_orig = (timeSetEvent_type)::GetProcAddress(winmm_handle, "timeSetEvent"); - timeKillEvent_orig = (timeKillEvent_type)::GetProcAddress(winmm_handle, "timeKillEvent"); - timeGetDevCaps_orig = (timeGetDevCaps_type)::GetProcAddress(winmm_handle, "timeGetDevCaps"); - timeBeginPeriod_orig = (timeBeginPeriod_type)::GetProcAddress(winmm_handle, "timeBeginPeriod"); - timeEndPeriod_orig = (timeEndPeriod_type)::GetProcAddress(winmm_handle, "timeEndPeriod"); - joyGetNumDevs_orig = (joyGetNumDevs_type)::GetProcAddress(winmm_handle, "joyGetNumDevs"); - joyConfigChanged_orig = (joyConfigChanged_type)::GetProcAddress(winmm_handle, "joyConfigChanged"); - joyGetDevCapsA_orig = (joyGetDevCapsA_type)::GetProcAddress(winmm_handle, "joyGetDevCapsA"); - joyGetDevCapsW_orig = (joyGetDevCapsW_type)::GetProcAddress(winmm_handle, "joyGetDevCapsW"); - joyGetPos_orig = (joyGetPos_type)::GetProcAddress(winmm_handle, "joyGetPos"); - joyGetPosEx_orig = (joyGetPosEx_type)::GetProcAddress(winmm_handle, "joyGetPosEx"); - joyGetThreshold_orig = (joyGetThreshold_type)::GetProcAddress(winmm_handle, "joyGetThreshold"); - joyReleaseCapture_orig = (joyReleaseCapture_type)::GetProcAddress(winmm_handle, "joyReleaseCapture"); - joySetCapture_orig = (joySetCapture_type)::GetProcAddress(winmm_handle, "joySetCapture"); - joySetThreshold_orig = (joySetThreshold_type)::GetProcAddress(winmm_handle, "joySetThreshold"); - mciDriverNotify_orig = (mciDriverNotify_type)::GetProcAddress(winmm_handle, "mciDriverNotify"); - mciDriverYield_orig = (mciDriverYield_type)::GetProcAddress(winmm_handle, "mciDriverYield"); - mmioStringToFOURCCA_orig = (mmioStringToFOURCCA_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCA"); - mmioStringToFOURCCW_orig = (mmioStringToFOURCCW_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCW"); - mmioInstallIOProcA_orig = (mmioInstallIOProcA_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcA"); - mmioInstallIOProcW_orig = (mmioInstallIOProcW_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcW"); - mmioOpenA_orig = (mmioOpenA_type)::GetProcAddress(winmm_handle, "mmioOpenA"); - mmioOpenW_orig = (mmioOpenW_type)::GetProcAddress(winmm_handle, "mmioOpenW"); - mmioRenameA_orig = (mmioRenameA_type)::GetProcAddress(winmm_handle, "mmioRenameA"); - mmioRenameW_orig = (mmioRenameW_type)::GetProcAddress(winmm_handle, "mmioRenameW"); - mmioClose_orig = (mmioClose_type)::GetProcAddress(winmm_handle, "mmioClose"); - mmioRead_orig = (mmioRead_type)::GetProcAddress(winmm_handle, "mmioRead"); - mmioWrite_orig = (mmioWrite_type)::GetProcAddress(winmm_handle, "mmioWrite"); - mmioSeek_orig = (mmioSeek_type)::GetProcAddress(winmm_handle, "mmioSeek"); - mmioGetInfo_orig = (mmioGetInfo_type)::GetProcAddress(winmm_handle, "mmioGetInfo"); - mmioSetInfo_orig = (mmioSetInfo_type)::GetProcAddress(winmm_handle, "mmioSetInfo"); - mmioSetBuffer_orig = (mmioSetBuffer_type)::GetProcAddress(winmm_handle, "mmioSetBuffer"); - mmioFlush_orig = (mmioFlush_type)::GetProcAddress(winmm_handle, "mmioFlush"); - mmioAdvance_orig = (mmioAdvance_type)::GetProcAddress(winmm_handle, "mmioAdvance"); - mmioSendMessage_orig = (mmioSendMessage_type)::GetProcAddress(winmm_handle, "mmioSendMessage"); - mmioDescend_orig = (mmioDescend_type)::GetProcAddress(winmm_handle, "mmioDescend"); - mmioAscend_orig = (mmioAscend_type)::GetProcAddress(winmm_handle, "mmioAscend"); - mmioCreateChunk_orig = (mmioCreateChunk_type)::GetProcAddress(winmm_handle, "mmioCreateChunk"); - mciSendCommandA_orig = (mciSendCommandA_type)::GetProcAddress(winmm_handle, "mciSendCommandA"); - mciSendCommandW_orig = (mciSendCommandW_type)::GetProcAddress(winmm_handle, "mciSendCommandW"); - mciSendStringA_orig = (mciSendStringA_type)::GetProcAddress(winmm_handle, "mciSendStringA"); - mciSendStringW_orig = (mciSendStringW_type)::GetProcAddress(winmm_handle, "mciSendStringW"); - mciGetDeviceIDA_orig = (mciGetDeviceIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDA"); - mciGetDeviceIDW_orig = (mciGetDeviceIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDW"); - mciGetDeviceIDFromElementIDA_orig = (mciGetDeviceIDFromElementIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDA"); - mciGetDeviceIDFromElementIDW_orig = (mciGetDeviceIDFromElementIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDW"); - mciGetDriverData_orig = (mciGetDriverData_type)::GetProcAddress(winmm_handle, "mciGetDriverData"); - mciGetErrorStringA_orig = (mciGetErrorStringA_type)::GetProcAddress(winmm_handle, "mciGetErrorStringA"); - mciGetErrorStringW_orig = (mciGetErrorStringW_type)::GetProcAddress(winmm_handle, "mciGetErrorStringW"); - mciSetDriverData_orig = (mciSetDriverData_type)::GetProcAddress(winmm_handle, "mciSetDriverData"); - mciSetYieldProc_orig = (mciSetYieldProc_type)::GetProcAddress(winmm_handle, "mciSetYieldProc"); - mciFreeCommandResource_orig = (mciFreeCommandResource_type)::GetProcAddress(winmm_handle, "mciFreeCommandResource"); - mciGetCreatorTask_orig = (mciGetCreatorTask_type)::GetProcAddress(winmm_handle, "mciGetCreatorTask"); - mciGetYieldProc_orig = (mciGetYieldProc_type)::GetProcAddress(winmm_handle, "mciGetYieldProc"); - mciLoadCommandResource_orig = (mciLoadCommandResource_type)::GetProcAddress(winmm_handle, "mciLoadCommandResource"); - mciExecute_orig = (mciExecute_type)::GetProcAddress(winmm_handle, "mciExecute"); -} - -extern "C" { - LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"CloseDriver\n"); - return CloseDriver_orig( hDriver, lParam1, lParam2); - } - - HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"OpenDriver\n"); - return OpenDriver_orig( szDriverName, szSectionName, lParam2); - } - - LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"SendDriverMessage\n"); - return SendDriverMessage_orig( hDriver, message, lParam1, lParam2); - } - - HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"DrvGetModuleHandle\n"); - return DrvGetModuleHandle_orig( hDriver); - } - - HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"GetDriverModuleHandle\n"); - return GetDriverModuleHandle_orig( hDriver); - } - - LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"DefDriverProc\n"); - return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2); - } - - BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"DriverCallback\n"); - return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2); - } - - UINT WINAPI mmsystemGetVersion(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmsystemGetVersion\n"); - return mmsystemGetVersion_orig(); - } - - BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"sndPlaySoundA\n"); - return sndPlaySoundA_orig( pszSound, fuSound); - } - - BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"sndPlaySoundW\n"); - return sndPlaySoundW_orig( pszSound, fuSound); - } - - BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"PlaySoundA\n"); - return PlaySoundA_orig( pszSound, hmod, fdwSound); - } - - BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"PlaySoundW\n"); - return PlaySoundW_orig( pszSound, hmod, fdwSound); - } - - UINT WINAPI waveOutGetNumDevs(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetNumDevs\n"); - return waveOutGetNumDevs_orig(); - } - - MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetDevCapsA\n"); - return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc); - } - - MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetDevCapsW\n"); - return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc); - } - - - MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetVolume\n"); - return waveOutGetVolume_orig( hwo, pdwVolume); - } - - MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutSetVolume\n"); - return waveOutSetVolume_orig( hwo, dwVolume); - } - - MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetErrorTextA\n"); - return waveOutGetErrorTextA_orig( mmrError, pszText, cchText); - } - - MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetErrorTextW\n"); - return waveOutGetErrorTextW_orig( mmrError, pszText, cchText); - } - - //MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) - //{ - // //OutputDebugString(L"waveOutGetErrorTextW\n"); - // return waveOutOpen_orig( phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); - //} - - //MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) - //{ - // //OutputDebugString(L"waveOutGetErrorTextW\n"); - // return waveOutClose_orig( hwo ); - //} - - MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutPrepareHeader\n"); - return waveOutPrepareHeader_orig( hwo, pwh, cbwh); - } - - MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutUnprepareHeader\n"); - return waveOutUnprepareHeader_orig( hwo, pwh, cbwh); - } - - - //MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) - //{ - // //OutputDebugString(L"waveOutUnprepareHeader\n"); - // return waveOutWrite_orig( hwo, pwh, cbwh); - //} - - MMRESULT WINAPI waveOutPause( HWAVEOUT hwo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutPause\n"); - return waveOutPause_orig( hwo); - } - - MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutRestart\n"); - return waveOutRestart_orig( hwo); - } - - MMRESULT WINAPI waveOutReset( HWAVEOUT hwo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutReset\n"); - return waveOutReset_orig( hwo); - } - - MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutBreakLoop\n"); - return waveOutBreakLoop_orig( hwo); - } - - MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetPosition\n"); - return waveOutGetPosition_orig( hwo, pmmt, cbmmt); - } - - MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetPitch\n"); - return waveOutGetPitch_orig( hwo, pdwPitch); - } - - MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutSetPitch\n"); - return waveOutSetPitch_orig( hwo, dwPitch); - } - - MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetPlaybackRate\n"); - return waveOutGetPlaybackRate_orig( hwo, pdwRate); - } - - MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutSetPlaybackRate\n"); - return waveOutSetPlaybackRate_orig( hwo, dwRate); - } - - MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutGetID\n"); - return waveOutGetID_orig( hwo, puDeviceID); - } - - MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveOutMessage\n"); - return waveOutMessage_orig( hwo, uMsg, dw1, dw2); - } - - UINT WINAPI waveInGetNumDevs(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInGetNumDevs\n"); - return waveInGetNumDevs_orig(); - } - - MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInGetDevCapsA\n"); - return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic); - } - - MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInGetDevCapsW\n"); - return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic); - } - - MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInGetErrorTextA\n"); - return waveInGetErrorTextA_orig(mmrError, pszText, cchText); - } - - MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInGetErrorTextW\n"); - return waveInGetErrorTextW_orig(mmrError, pszText, cchText); - } - - MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInOpen\n"); - return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); - } - - MMRESULT WINAPI waveInClose( HWAVEIN hwi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInClose\n"); - return waveInClose_orig( hwi); - } - - MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInPrepareHeader\n"); - return waveInPrepareHeader_orig( hwi, pwh, cbwh); - } - - MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInUnprepareHeader\n"); - return waveInUnprepareHeader_orig( hwi, pwh, cbwh); - } - - MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInAddBuffer\n"); - return waveInAddBuffer_orig( hwi, pwh, cbwh); - } - - MMRESULT WINAPI waveInStart( HWAVEIN hwi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInStart\n"); - return waveInStart_orig( hwi); - } - - MMRESULT WINAPI waveInStop( HWAVEIN hwi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInStop\n"); - return waveInStop_orig(hwi); - } - - MMRESULT WINAPI waveInReset( HWAVEIN hwi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInReset\n"); - return waveInReset_orig(hwi); - } - - MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInGetPosition\n"); - return waveInGetPosition_orig( hwi, pmmt, cbmmt); - } - - MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInGetID\n"); - return waveInGetID_orig( hwi, puDeviceID); - } - - MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"waveInMessage\n"); - return waveInMessage_orig( hwi, uMsg, dw1, dw2); - } - - UINT WINAPI midiOutGetNumDevs(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutGetNumDevs\n"); - return midiOutGetNumDevs_orig(); - } - - MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamOpen\n"); - return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen); - } - - MMRESULT WINAPI midiStreamClose( HMIDISTRM hms) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamClose\n"); - return midiStreamClose_orig( hms); - } - - MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamProperty\n"); - return midiStreamProperty_orig( hms, lppropdata, dwProperty); - } - - MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamPosition\n"); - return midiStreamPosition_orig( hms, lpmmt, cbmmt); - } - - MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamOut\n"); - return midiStreamOut_orig( hms, pmh, cbmh); - } - - MMRESULT WINAPI midiStreamPause( HMIDISTRM hms) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamPause\n"); - return midiStreamPause_orig( hms); - } - - MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamRestart\n"); - return midiStreamRestart_orig( hms); - } - - MMRESULT WINAPI midiStreamStop( HMIDISTRM hms) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiStreamStop\n"); - return midiStreamStop_orig( hms); - } - - MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiConnect\n"); - return midiConnect_orig( hmi, hmo, pReserved); - } - - MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiDisconnect\n"); - return midiDisconnect_orig( hmi, hmo, pReserved); - } - - MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutGetDevCapsA\n"); - return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc); - } - - MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutGetDevCapsW\n"); - return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc); - } - - MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutGetVolume\n"); - return midiOutGetVolume_orig( hmo, pdwVolume); - } - - MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutSetVolume\n"); - return midiOutSetVolume_orig( hmo, dwVolume); - } - - MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutGetErrorTextA\n"); - return midiOutGetErrorTextA_orig( mmrError, pszText, cchText); - } - - MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutGetErrorTextW\n"); - return midiOutGetErrorTextW_orig( mmrError, pszText, cchText); - } - - MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutOpen\n"); - return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen); - } - - MMRESULT WINAPI midiOutClose( HMIDIOUT hmo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutClose\n"); - return midiOutClose_orig( hmo); - } - - MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutPrepareHeader\n"); - return midiOutPrepareHeader_orig( hmo, pmh, cbmh); - } - - MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutUnprepareHeader\n"); - return midiOutUnprepareHeader_orig(hmo, pmh, cbmh); - } - - MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutShortMsg\n"); - return midiOutShortMsg_orig( hmo, dwMsg); - } - - MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutLongMsg\n"); - return midiOutLongMsg_orig(hmo, pmh, cbmh); - } - - MMRESULT WINAPI midiOutReset( HMIDIOUT hmo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutReset\n"); - return midiOutReset_orig( hmo); - } - - MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutCachePatches\n"); - return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache); - } - - MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutCacheDrumPatches\n"); - return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache); - } - - MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutGetID\n"); - return midiOutGetID_orig( hmo, puDeviceID); - } - - MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiOutMessage\n"); - return midiOutMessage_orig( hmo, uMsg, dw1, dw2); - } - - UINT WINAPI midiInGetNumDevs(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInGetNumDevs\n"); - return midiInGetNumDevs_orig(); - } - - MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInGetDevCapsA\n"); - return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic); - } - - MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInGetDevCapsW\n"); - return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic); - } - - MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInGetErrorTextA\n"); - return midiInGetErrorTextA_orig( mmrError, pszText, cchText); - } - - MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInGetErrorTextW\n"); - return midiInGetErrorTextW_orig( mmrError, pszText, cchText); - } - - MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInOpen\n"); - return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen); - } - - MMRESULT WINAPI midiInClose( HMIDIIN hmi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInClose\n"); - return midiInClose_orig( hmi); - } - - MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInPrepareHeader\n"); - return midiInPrepareHeader_orig( hmi, pmh, cbmh); - } - - MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInUnprepareHeader\n"); - return midiInUnprepareHeader_orig( hmi, pmh, cbmh); - } - - MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInAddBuffer\n"); - return midiInAddBuffer_orig( hmi, pmh, cbmh); - } - - MMRESULT WINAPI midiInStart( HMIDIIN hmi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInStart\n"); - return midiInStart_orig( hmi); - } - - MMRESULT WINAPI midiInStop( HMIDIIN hmi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInStop\n"); - return midiInStop_orig(hmi); - } - - MMRESULT WINAPI midiInReset( HMIDIIN hmi) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInReset\n"); - return midiInReset_orig( hmi); - } - - MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInGetID\n"); - return midiInGetID_orig( hmi, puDeviceID); - } - - MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"midiInMessage\n"); - return midiInMessage_orig( hmi, uMsg, dw1, dw2); - } - - UINT WINAPI auxGetNumDevs(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"auxGetNumDevs\n"); - return auxGetNumDevs_orig(); - } - - MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"auxGetDevCapsA\n"); - return auxGetDevCapsA_orig( uDeviceID, pac, cbac); - } - - MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"auxGetDevCapsW\n"); - return auxGetDevCapsW_orig( uDeviceID, pac, cbac); - } - - MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"auxSetVolume\n"); - return auxSetVolume_orig( uDeviceID, dwVolume); - } - - MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"auxGetVolume\n"); - return auxGetVolume_orig( uDeviceID, pdwVolume); - } - - MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"auxOutMessage\n"); - return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2); - } - - UINT WINAPI mixerGetNumDevs(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetNumDevs\n"); - return mixerGetNumDevs_orig(); - } - - MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetDevCapsA\n"); - return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps); - } - - MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetDevCapsW\n"); - return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps); - } - - MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerOpen\n"); - return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen); - } - - MMRESULT WINAPI mixerClose( HMIXER hmx) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerClose\n"); - return mixerClose_orig( hmx); - } - - DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerMessage\n"); - return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2); - } - - MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetLineInfoA\n"); - return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo); - } - - MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetLineInfoW\n"); - return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo); - } - - MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetID\n"); - return mixerGetID_orig( hmxobj, puMxId, fdwId); - } - - MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetLineControlsA\n"); - return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls); - } - - MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetLineControlsW\n"); - return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls); - } - - MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetControlDetailsA\n"); - return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails); - } - - MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerGetControlDetailsW\n"); - return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails); - } - - MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mixerSetControlDetails\n"); - return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails); - } - - DWORD WINAPI mmGetCurrentTask(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmGetCurrentTask\n"); - return mmGetCurrentTask_orig(); - } - - void WINAPI mmTaskBlock(DWORD val) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmTaskBlock\n"); - return mmTaskBlock_orig(val); - } - - UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmTaskCreate\n"); - return mmTaskCreate_orig(a, b, c); - } - - BOOL WINAPI mmTaskSignal(DWORD a) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmTaskSignal\n"); - return mmTaskSignal_orig(a); - } - - VOID WINAPI mmTaskYield() - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmTaskYield\n"); - mmTaskYield_orig(); - } - - MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"timeGetSystemTime\n"); - return timeGetSystemTime_orig( pmmt, cbmmt); - } - - DWORD WINAPI timeGetTime(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"timeGetTime\n"); - return timeGetTime_orig(); - } - - MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"timeSetEvent\n"); - return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent); - } - - MMRESULT WINAPI timeKillEvent( UINT uTimerID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"timeKillEvent\n"); - return timeKillEvent_orig( uTimerID); - } - - MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"timeGetDevCaps\n"); - return timeGetDevCaps_orig( ptc, cbtc); - } - - MMRESULT WINAPI timeBeginPeriod( UINT uPeriod) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"timeBeginPeriod\n"); - return timeBeginPeriod_orig( uPeriod); - } - - MMRESULT WINAPI timeEndPeriod( UINT uPeriod) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"timeEndPeriod\n"); - return timeEndPeriod_orig( uPeriod); - } - - UINT WINAPI joyGetNumDevs(void) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyGetNumDevs\n"); - return joyGetNumDevs_orig(); - } - - MMRESULT WINAPI joyConfigChanged(DWORD dwFlags) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyConfigChanged\n"); - return joyConfigChanged_orig(dwFlags); - } - - MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyGetDevCapsA\n"); - return joyGetDevCapsA_orig( uJoyID, pjc, cbjc); - } - - MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyGetDevCapsW\n"); - return joyGetDevCapsW_orig( uJoyID, pjc, cbjc); - } - - MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyGetPos\n"); - return joyGetPos_orig( uJoyID, pji); - } - - MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyGetPosEx\n"); - return joyGetPosEx_orig( uJoyID, pji); - } - - MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyGetThreshold\n"); - return joyGetThreshold_orig( uJoyID, puThreshold); - } - - MMRESULT WINAPI joyReleaseCapture( UINT uJoyID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joyReleaseCapture\n"); - return joyReleaseCapture_orig( uJoyID); - } - - MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joySetCapture\n"); - return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged); - } - - MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"joySetThreshold\n"); - return joySetThreshold_orig( uJoyID, uThreshold); - } - - BOOL WINAPI mciDriverNotify(HANDLE hwndCallback, UINT uDeviceID, UINT uStatus) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciDriverNotify\n"); - return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus); - } - - UINT WINAPI mciDriverYield(UINT uDeviceID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciDriverYield\n"); - return mciDriverYield_orig(uDeviceID); - } - - FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioStringToFOURCCA\n"); - return mmioStringToFOURCCA_orig( sz, uFlags); - } - - FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioStringToFOURCCW\n"); - return mmioStringToFOURCCW_orig( sz, uFlags); - } - - LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioInstallIOProcA\n"); - return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags); - } - - LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioInstallIOProcW\n"); - return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags); - } - - HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioOpenA\n"); - return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen); - } - - HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioOpenW\n"); - return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen); - } - - MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioRenameA\n"); - return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); - } - - MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioRenameW\n"); - return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename); - } - - MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioClose\n"); - return mmioClose_orig( hmmio, fuClose); - } - - LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioRead\n"); - return mmioRead_orig( hmmio, pch, cch); - } - - LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioWrite\n"); - return mmioWrite_orig( hmmio, pch, cch); - } - - LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioSeek\n"); - return mmioSeek_orig(hmmio, lOffset, iOrigin); - } - - MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioGetInfo\n"); - return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo); - } - - MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioSetInfo\n"); - return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo); - } - - MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioSetBuffer\n"); - return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer); - } - - MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioFlush\n"); - return mmioFlush_orig( hmmio, fuFlush); - } - - MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioAdvance\n"); - return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance); - } - - LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioSendMessage\n"); - return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2); - } - - MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioDescend\n"); - return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend); - } - - MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioAscend\n"); - return mmioAscend_orig( hmmio, pmmcki, fuAscend); - } - - MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mmioCreateChunk\n"); - return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate); - } - - MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciSendCommandA\n"); - return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2); - } - - MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciSendCommandW\n"); - return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2); - } - - MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciSendStringA\n"); - return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); - } - - MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciSendStringW\n"); - return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback); - } - - MCIDEVICEID WINAPI mciGetDeviceIDA( LPCSTR pszDevice) - { - //OutputDebugString(L"mciGetDeviceIDA\n"); - return mciGetDeviceIDA_orig( pszDevice); - } - - MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetDeviceIDW\n"); - return mciGetDeviceIDW_orig( pszDevice); - } - - MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType ) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n"); - return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType ); - } - - MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType ) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n"); - return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType ); - } - - DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetDriverData\n"); - return mciGetDriverData_orig(uDeviceID); - } - - BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetErrorStringA\n"); - return mciGetErrorStringA_orig( mcierr, pszText, cchText); - } - - BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetErrorStringW\n"); - return mciGetErrorStringW_orig( mcierr, pszText, cchText); - } - - BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciSetDriverData_type\n"); - return mciSetDriverData_orig( uDeviceID, dwData ); - } - - BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciSetYieldProc\n"); - return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData); - } - - BOOL WINAPI mciFreeCommandResource(UINT uTable) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciFreeCommandResource\n"); - return mciFreeCommandResource_orig(uTable); - } - - HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetCreatorTask\n"); - return mciGetCreatorTask_orig( mciId); - } - - YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciGetYieldProc\n"); - return mciGetYieldProc_orig( mciId, pdwYieldData); - } - - UINT WINAPI mciLoadCommandResource(HANDLE hInstance, LPCWSTR lpResName, UINT wType) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciLoadCommandResource"); - return mciLoadCommandResource_orig(hInstance, lpResName, wType); - } - - - BOOL WINAPI mciExecute(LPCSTR pszCommand) - { - ll_winmm_shim_initialize(); - //OutputDebugString(L"mciExecute\n"); - return mciExecute_orig(pszCommand); - } -} diff --git a/indra/plugins/winmmshim/forwarding_api.h b/indra/plugins/winmmshim/forwarding_api.h deleted file mode 100644 index 80fd164ad..000000000 --- a/indra/plugins/winmmshim/forwarding_api.h +++ /dev/null @@ -1,390 +0,0 @@ -/** - * @file forwarding_api.h - * @brief forwards winmm API calls to real winmm.dll - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -// this turns off __declspec(dllimport) for the functions declared in mmsystem.h -#define _WINMM_ -#include -#include - -void init_function_pointers(HMODULE winmm_handle); -void ll_winmm_shim_initialize(); - -typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst); - -typedef LRESULT (WINAPI *CloseDriver_type)( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2); -extern CloseDriver_type CloseDriver_orig; -typedef HDRVR (WINAPI *OpenDriver_type)( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2); -extern OpenDriver_type OpenDriver_orig; -typedef LRESULT (WINAPI *SendDriverMessage_type)( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2); -extern SendDriverMessage_type SendDriverMessage_orig; -typedef HMODULE (WINAPI *DrvGetModuleHandle_type)( HDRVR hDriver); -extern DrvGetModuleHandle_type DrvGetModuleHandle_orig; -typedef HMODULE (WINAPI *GetDriverModuleHandle_type)( HDRVR hDriver); -extern GetDriverModuleHandle_type GetDriverModuleHandle_orig; -typedef LRESULT (WINAPI *DefDriverProc_type)( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2); -extern DefDriverProc_type DefDriverProc_orig; -typedef BOOL (WINAPI *DriverCallback_type)(DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2); -extern DriverCallback_type DriverCallback_orig; -typedef UINT (WINAPI *mmsystemGetVersion_type)(void); -extern mmsystemGetVersion_type mmsystemGetVersion_orig; -typedef BOOL (WINAPI *sndPlaySoundA_type)( LPCSTR pszSound, UINT fuSound); -extern sndPlaySoundA_type sndPlaySoundA_orig; -typedef BOOL (WINAPI *sndPlaySoundW_type)( LPCWSTR pszSound, UINT fuSound); -extern sndPlaySoundW_type sndPlaySoundW_orig; -typedef BOOL (WINAPI *PlaySoundA_type)( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound); -extern PlaySoundA_type PlaySoundA_orig; -typedef BOOL (WINAPI *PlaySoundW_type)( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound); -extern PlaySoundW_type PlaySoundW_orig; -typedef UINT (WINAPI *waveOutGetNumDevs_type)(void); -extern waveOutGetNumDevs_type waveOutGetNumDevs_orig; -typedef MMRESULT (WINAPI *waveOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc); -extern waveOutGetDevCapsA_type waveOutGetDevCapsA_orig; -typedef MMRESULT (WINAPI *waveOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc); -extern waveOutGetDevCapsW_type waveOutGetDevCapsW_orig; -typedef MMRESULT (WINAPI *waveOutGetVolume_type)( HWAVEOUT hwo, LPDWORD pdwVolume); -extern waveOutGetVolume_type waveOutGetVolume_orig; -typedef MMRESULT (WINAPI *waveOutSetVolume_type)( HWAVEOUT hwo, DWORD dwVolume); -extern waveOutSetVolume_type waveOutSetVolume_orig; -typedef MMRESULT (WINAPI *waveOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText); -extern waveOutGetErrorTextA_type waveOutGetErrorTextA_orig; -typedef MMRESULT (WINAPI *waveOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText); -extern waveOutGetErrorTextW_type waveOutGetErrorTextW_orig; -typedef MMRESULT (WINAPI *waveOutOpen_type)( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -extern waveOutOpen_type waveOutOpen_orig; -typedef MMRESULT (WINAPI *waveOutClose_type)( HWAVEOUT hwo); -extern waveOutClose_type waveOutClose_orig; -typedef MMRESULT (WINAPI *waveOutPrepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); -extern waveOutPrepareHeader_type waveOutPrepareHeader_orig; -typedef MMRESULT (WINAPI *waveOutUnprepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); -extern waveOutUnprepareHeader_type waveOutUnprepareHeader_orig; -typedef MMRESULT (WINAPI *waveOutWrite_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh); -extern waveOutWrite_type waveOutWrite_orig; -typedef MMRESULT (WINAPI *waveOutPause_type)( HWAVEOUT hwo); -extern waveOutPause_type waveOutPause_orig; -typedef MMRESULT (WINAPI *waveOutRestart_type)( HWAVEOUT hwo); -extern waveOutRestart_type waveOutRestart_orig; -typedef MMRESULT (WINAPI *waveOutReset_type)( HWAVEOUT hwo); -extern waveOutReset_type waveOutReset_orig; -typedef MMRESULT (WINAPI *waveOutBreakLoop_type)( HWAVEOUT hwo); -extern waveOutBreakLoop_type waveOutBreakLoop_orig; -typedef MMRESULT (WINAPI *waveOutGetPosition_type)( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt); -extern waveOutGetPosition_type waveOutGetPosition_orig; -typedef MMRESULT (WINAPI *waveOutGetPitch_type)( HWAVEOUT hwo, LPDWORD pdwPitch); -extern waveOutGetPitch_type waveOutGetPitch_orig; -typedef MMRESULT (WINAPI *waveOutSetPitch_type)( HWAVEOUT hwo, DWORD dwPitch); -extern waveOutSetPitch_type waveOutSetPitch_orig; -typedef MMRESULT (WINAPI *waveOutGetPlaybackRate_type)( HWAVEOUT hwo, LPDWORD pdwRate); -extern waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig; -typedef MMRESULT (WINAPI *waveOutSetPlaybackRate_type)( HWAVEOUT hwo, DWORD dwRate); -extern waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig; -typedef MMRESULT (WINAPI *waveOutGetID_type)( HWAVEOUT hwo, LPUINT puDeviceID); -extern waveOutGetID_type waveOutGetID_orig; -typedef MMRESULT (WINAPI *waveOutMessage_type)( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); -extern waveOutMessage_type waveOutMessage_orig; -typedef UINT (WINAPI *waveInGetNumDevs_type)(void); -extern waveInGetNumDevs_type waveInGetNumDevs_orig; -typedef MMRESULT (WINAPI *waveInGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic); -extern waveInGetDevCapsA_type waveInGetDevCapsA_orig; -typedef MMRESULT (WINAPI *waveInGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic); -extern waveInGetDevCapsW_type waveInGetDevCapsW_orig; -typedef MMRESULT (WINAPI *waveInGetErrorTextA_type)(MMRESULT mmrError, LPSTR pszText, UINT cchText); -extern waveInGetErrorTextA_type waveInGetErrorTextA_orig; -typedef MMRESULT (WINAPI *waveInGetErrorTextW_type)(MMRESULT mmrError, LPWSTR pszText, UINT cchText); -extern waveInGetErrorTextW_type waveInGetErrorTextW_orig; -typedef MMRESULT (WINAPI *waveInOpen_type)( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -extern waveInOpen_type waveInOpen_orig; -typedef MMRESULT (WINAPI *waveInClose_type)( HWAVEIN hwi); -extern waveInClose_type waveInClose_orig; -typedef MMRESULT (WINAPI *waveInPrepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); -extern waveInPrepareHeader_type waveInPrepareHeader_orig; -typedef MMRESULT (WINAPI *waveInUnprepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); -extern waveInUnprepareHeader_type waveInUnprepareHeader_orig; -typedef MMRESULT (WINAPI *waveInAddBuffer_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh); -extern waveInAddBuffer_type waveInAddBuffer_orig; -typedef MMRESULT (WINAPI *waveInStart_type)( HWAVEIN hwi); -extern waveInStart_type waveInStart_orig; -typedef MMRESULT (WINAPI *waveInStop_type)( HWAVEIN hwi); -extern waveInStop_type waveInStop_orig; -typedef MMRESULT (WINAPI *waveInReset_type)( HWAVEIN hwi); -extern waveInReset_type waveInReset_orig; -typedef MMRESULT (WINAPI *waveInGetPosition_type)( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt); -extern waveInGetPosition_type waveInGetPosition_orig; -typedef MMRESULT (WINAPI *waveInGetID_type)( HWAVEIN hwi, LPUINT puDeviceID); -extern waveInGetID_type waveInGetID_orig; -typedef MMRESULT (WINAPI *waveInMessage_type)( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); -extern waveInMessage_type waveInMessage_orig; -typedef UINT (WINAPI *midiOutGetNumDevs_type)(void); -extern midiOutGetNumDevs_type midiOutGetNumDevs_orig; -typedef MMRESULT (WINAPI *midiStreamOpen_type)( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -extern midiStreamOpen_type midiStreamOpen_orig; -typedef MMRESULT (WINAPI *midiStreamClose_type)( HMIDISTRM hms); -extern midiStreamClose_type midiStreamClose_orig; -typedef MMRESULT (WINAPI *midiStreamProperty_type)( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty); -extern midiStreamProperty_type midiStreamProperty_orig; -typedef MMRESULT (WINAPI *midiStreamPosition_type)( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt); -extern midiStreamPosition_type midiStreamPosition_orig; -typedef MMRESULT (WINAPI *midiStreamOut_type)( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh); -extern midiStreamOut_type midiStreamOut_orig; -typedef MMRESULT (WINAPI *midiStreamPause_type)( HMIDISTRM hms); -extern midiStreamPause_type midiStreamPause_orig; -typedef MMRESULT (WINAPI *midiStreamRestart_type)( HMIDISTRM hms); -extern midiStreamRestart_type midiStreamRestart_orig; -typedef MMRESULT (WINAPI *midiStreamStop_type)( HMIDISTRM hms); -extern midiStreamStop_type midiStreamStop_orig; -typedef MMRESULT (WINAPI *midiConnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved); -extern midiConnect_type midiConnect_orig; -typedef MMRESULT (WINAPI *midiDisconnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved); -extern midiDisconnect_type midiDisconnect_orig; -typedef MMRESULT (WINAPI *midiOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc); -extern midiOutGetDevCapsA_type midiOutGetDevCapsA_orig; -typedef MMRESULT (WINAPI *midiOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc); -extern midiOutGetDevCapsW_type midiOutGetDevCapsW_orig; -typedef MMRESULT (WINAPI *midiOutGetVolume_type)( HMIDIOUT hmo, LPDWORD pdwVolume); -extern midiOutGetVolume_type midiOutGetVolume_orig; -typedef MMRESULT (WINAPI *midiOutSetVolume_type)( HMIDIOUT hmo, DWORD dwVolume); -extern midiOutSetVolume_type midiOutSetVolume_orig; -typedef MMRESULT (WINAPI *midiOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText); -extern midiOutGetErrorTextA_type midiOutGetErrorTextA_orig; -typedef MMRESULT (WINAPI *midiOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText); -extern midiOutGetErrorTextW_type midiOutGetErrorTextW_orig; -typedef MMRESULT (WINAPI *midiOutOpen_type)( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -extern midiOutOpen_type midiOutOpen_orig; -typedef MMRESULT (WINAPI *midiOutClose_type)( HMIDIOUT hmo); -extern midiOutClose_type midiOutClose_orig; -typedef MMRESULT (WINAPI *midiOutPrepareHeader_type)( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); -extern midiOutPrepareHeader_type midiOutPrepareHeader_orig; -typedef MMRESULT (WINAPI *midiOutUnprepareHeader_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); -extern midiOutUnprepareHeader_type midiOutUnprepareHeader_orig; -typedef MMRESULT (WINAPI *midiOutShortMsg_type)( HMIDIOUT hmo, DWORD dwMsg); -extern midiOutShortMsg_type midiOutShortMsg_orig; -typedef MMRESULT (WINAPI *midiOutLongMsg_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh); -extern midiOutLongMsg_type midiOutLongMsg_orig; -typedef MMRESULT (WINAPI *midiOutReset_type)( HMIDIOUT hmo); -extern midiOutReset_type midiOutReset_orig; -typedef MMRESULT (WINAPI *midiOutCachePatches_type)( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache); -extern midiOutCachePatches_type midiOutCachePatches_orig; -typedef MMRESULT (WINAPI *midiOutCacheDrumPatches_type)( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache); -extern midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig; -typedef MMRESULT (WINAPI *midiOutGetID_type)( HMIDIOUT hmo, LPUINT puDeviceID); -extern midiOutGetID_type midiOutGetID_orig; -typedef MMRESULT (WINAPI *midiOutMessage_type)( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); -extern midiOutMessage_type midiOutMessage_orig; -typedef UINT (WINAPI *midiInGetNumDevs_type)(void); -extern midiInGetNumDevs_type midiInGetNumDevs_orig; -typedef MMRESULT (WINAPI *midiInGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic); -extern midiInGetDevCapsA_type midiInGetDevCapsA_orig; -typedef MMRESULT (WINAPI *midiInGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic); -extern midiInGetDevCapsW_type midiInGetDevCapsW_orig; -typedef MMRESULT (WINAPI *midiInGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText); -extern midiInGetErrorTextA_type midiInGetErrorTextA_orig; -typedef MMRESULT (WINAPI *midiInGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText); -extern midiInGetErrorTextW_type midiInGetErrorTextW_orig; -typedef MMRESULT (WINAPI *midiInOpen_type)( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -extern midiInOpen_type midiInOpen_orig; -typedef MMRESULT (WINAPI *midiInClose_type)( HMIDIIN hmi); -extern midiInClose_type midiInClose_orig; -typedef MMRESULT (WINAPI *midiInPrepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh); -extern midiInPrepareHeader_type midiInPrepareHeader_orig; -typedef MMRESULT (WINAPI *midiInUnprepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh); -extern midiInUnprepareHeader_type midiInUnprepareHeader_orig; -typedef MMRESULT (WINAPI *midiInAddBuffer_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh); -extern midiInAddBuffer_type midiInAddBuffer_orig; -typedef MMRESULT (WINAPI *midiInStart_type)( HMIDIIN hmi); -extern midiInStart_type midiInStart_orig; -typedef MMRESULT (WINAPI *midiInStop_type)( HMIDIIN hmi); -extern midiInStop_type midiInStop_orig; -typedef MMRESULT (WINAPI *midiInReset_type)( HMIDIIN hmi); -extern midiInReset_type midiInReset_orig; -typedef MMRESULT (WINAPI *midiInGetID_type)( HMIDIIN hmi, LPUINT puDeviceID); -extern midiInGetID_type midiInGetID_orig; -typedef MMRESULT (WINAPI *midiInMessage_type)( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); -extern midiInMessage_type midiInMessage_orig; -typedef UINT (WINAPI *auxGetNumDevs_type)(void); -extern auxGetNumDevs_type auxGetNumDevs_orig; -typedef MMRESULT (WINAPI *auxGetDevCapsA_type)( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac); -extern auxGetDevCapsA_type auxGetDevCapsA_orig; -typedef MMRESULT (WINAPI *auxGetDevCapsW_type)( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac); -extern auxGetDevCapsW_type auxGetDevCapsW_orig; -typedef MMRESULT (WINAPI *auxSetVolume_type)( UINT uDeviceID, DWORD dwVolume); -extern auxSetVolume_type auxSetVolume_orig; -typedef MMRESULT (WINAPI *auxGetVolume_type)( UINT uDeviceID, LPDWORD pdwVolume); -extern auxGetVolume_type auxGetVolume_orig; -typedef MMRESULT (WINAPI *auxOutMessage_type)( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2); -extern auxOutMessage_type auxOutMessage_orig; -typedef UINT (WINAPI *mixerGetNumDevs_type)(void); -extern mixerGetNumDevs_type mixerGetNumDevs_orig; -typedef MMRESULT (WINAPI *mixerGetDevCapsA_type)( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps); -extern mixerGetDevCapsA_type mixerGetDevCapsA_orig; -typedef MMRESULT (WINAPI *mixerGetDevCapsW_type)( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps); -extern mixerGetDevCapsW_type mixerGetDevCapsW_orig; -typedef MMRESULT (WINAPI *mixerOpen_type)( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen); -extern mixerOpen_type mixerOpen_orig; -typedef MMRESULT (WINAPI *mixerClose_type)( HMIXER hmx); -extern mixerClose_type mixerClose_orig; -typedef DWORD (WINAPI *mixerMessage_type)( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); -extern mixerMessage_type mixerMessage_orig; -typedef MMRESULT (WINAPI *mixerGetLineInfoA_type)( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo); -extern mixerGetLineInfoA_type mixerGetLineInfoA_orig; -typedef MMRESULT (WINAPI *mixerGetLineInfoW_type)( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo); -extern mixerGetLineInfoW_type mixerGetLineInfoW_orig; -typedef MMRESULT (WINAPI *mixerGetID_type)( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId); -extern mixerGetID_type mixerGetID_orig; -typedef MMRESULT (WINAPI *mixerGetLineControlsA_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls); -extern mixerGetLineControlsA_type mixerGetLineControlsA_orig; -typedef MMRESULT (WINAPI *mixerGetLineControlsW_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls); -extern mixerGetLineControlsW_type mixerGetLineControlsW_orig; -typedef MMRESULT (WINAPI *mixerGetControlDetailsA_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails); -extern mixerGetControlDetailsA_type mixerGetControlDetailsA_orig; -typedef MMRESULT (WINAPI *mixerGetControlDetailsW_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails); -extern mixerGetControlDetailsW_type mixerGetControlDetailsW_orig; -typedef MMRESULT (WINAPI *mixerSetControlDetails_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails); -extern mixerSetControlDetails_type mixerSetControlDetails_orig; -typedef DWORD (WINAPI *mmGetCurrentTask_type)(void); -extern mmGetCurrentTask_type mmGetCurrentTask_orig; -typedef void (WINAPI *mmTaskBlock_type)(DWORD); -extern mmTaskBlock_type mmTaskBlock_orig; -typedef UINT (WINAPI *mmTaskCreate_type)(LPTASKCALLBACK, HANDLE*, DWORD_PTR); -extern mmTaskCreate_type mmTaskCreate_orig; -typedef BOOL (WINAPI *mmTaskSignal_type)(DWORD); -extern mmTaskSignal_type mmTaskSignal_orig; -typedef VOID (WINAPI *mmTaskYield_type)(VOID); -extern mmTaskYield_type mmTaskYield_orig; -typedef MMRESULT (WINAPI *timeGetSystemTime_type)( LPMMTIME pmmt, UINT cbmmt); -extern timeGetSystemTime_type timeGetSystemTime_orig; -typedef DWORD (WINAPI *timeGetTime_type)(void); -extern timeGetTime_type timeGetTime_orig; -typedef MMRESULT (WINAPI *timeSetEvent_type)( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent); -extern timeSetEvent_type timeSetEvent_orig; -typedef MMRESULT (WINAPI *timeKillEvent_type)( UINT uTimerID); -extern timeKillEvent_type timeKillEvent_orig; -typedef MMRESULT (WINAPI *timeGetDevCaps_type)( LPTIMECAPS ptc, UINT cbtc); -extern timeGetDevCaps_type timeGetDevCaps_orig; -typedef MMRESULT (WINAPI *timeBeginPeriod_type)( UINT uPeriod); -extern timeBeginPeriod_type timeBeginPeriod_orig; -typedef MMRESULT (WINAPI *timeEndPeriod_type)( UINT uPeriod); -extern timeEndPeriod_type timeEndPeriod_orig; -typedef UINT (WINAPI *joyGetNumDevs_type)(void); -extern joyGetNumDevs_type joyGetNumDevs_orig; -typedef MMRESULT (WINAPI *joyConfigChanged_type)(DWORD dwFlags); -extern joyConfigChanged_type joyConfigChanged_orig; -typedef MMRESULT (WINAPI *joyGetDevCapsA_type)( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc); -extern joyGetDevCapsA_type joyGetDevCapsA_orig; -typedef MMRESULT (WINAPI *joyGetDevCapsW_type)( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc); -extern joyGetDevCapsW_type joyGetDevCapsW_orig; -typedef MMRESULT (WINAPI *joyGetPos_type)( UINT uJoyID, LPJOYINFO pji); -extern joyGetPos_type joyGetPos_orig; -typedef MMRESULT (WINAPI *joyGetPosEx_type)( UINT uJoyID, LPJOYINFOEX pji); -extern joyGetPosEx_type joyGetPosEx_orig; -typedef MMRESULT (WINAPI *joyGetThreshold_type)( UINT uJoyID, LPUINT puThreshold); -extern joyGetThreshold_type joyGetThreshold_orig; -typedef MMRESULT (WINAPI *joyReleaseCapture_type)( UINT uJoyID); -extern joyReleaseCapture_type joyReleaseCapture_orig; -typedef MMRESULT (WINAPI *joySetCapture_type)( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged); -extern joySetCapture_type joySetCapture_orig; -typedef MMRESULT (WINAPI *joySetThreshold_type)( UINT uJoyID, UINT uThreshold); -extern joySetThreshold_type joySetThreshold_orig; -typedef BOOL (WINAPI *mciDriverNotify_type)(HANDLE hwndCallback, UINT uDeviceID, UINT uStatus); -extern mciDriverNotify_type mciDriverNotify_orig; -typedef UINT (WINAPI *mciDriverYield_type)(UINT uDeviceID); -extern mciDriverYield_type mciDriverYield_orig; -typedef FOURCC (WINAPI *mmioStringToFOURCCA_type)( LPCSTR sz, UINT uFlags); -extern mmioStringToFOURCCA_type mmioStringToFOURCCA_orig; -typedef FOURCC (WINAPI *mmioStringToFOURCCW_type)( LPCWSTR sz, UINT uFlags); -extern mmioStringToFOURCCW_type mmioStringToFOURCCW_orig; -typedef LPMMIOPROC (WINAPI *mmioInstallIOProcA_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags); -extern mmioInstallIOProcA_type mmioInstallIOProcA_orig; -typedef LPMMIOPROC (WINAPI *mmioInstallIOProcW_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags); -extern mmioInstallIOProcW_type mmioInstallIOProcW_orig; -typedef HMMIO (WINAPI *mmioOpenA_type)( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen); -extern mmioOpenA_type mmioOpenA_orig; -typedef HMMIO (WINAPI *mmioOpenW_type)( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen); -extern mmioOpenW_type mmioOpenW_orig; -typedef MMRESULT (WINAPI *mmioRenameA_type)( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename); -extern mmioRenameA_type mmioRenameA_orig; -typedef MMRESULT (WINAPI *mmioRenameW_type)( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename); -extern mmioRenameW_type mmioRenameW_orig; -typedef MMRESULT (WINAPI *mmioClose_type)( HMMIO hmmio, UINT fuClose); -extern mmioClose_type mmioClose_orig; -typedef LONG (WINAPI *mmioRead_type)( HMMIO hmmio, HPSTR pch, LONG cch); -extern mmioRead_type mmioRead_orig; -typedef LONG (WINAPI *mmioWrite_type)( HMMIO hmmio, const char _huge* pch, LONG cch); -extern mmioWrite_type mmioWrite_orig; -typedef LONG (WINAPI *mmioSeek_type)( HMMIO hmmio, LONG lOffset, int iOrigin); -extern mmioSeek_type mmioSeek_orig; -typedef MMRESULT (WINAPI *mmioGetInfo_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo); -extern mmioGetInfo_type mmioGetInfo_orig; -typedef MMRESULT (WINAPI *mmioSetInfo_type)( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo); -extern mmioSetInfo_type mmioSetInfo_orig; -typedef MMRESULT (WINAPI *mmioSetBuffer_type)( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer); -extern mmioSetBuffer_type mmioSetBuffer_orig; -typedef MMRESULT (WINAPI *mmioFlush_type)( HMMIO hmmio, UINT fuFlush); -extern mmioFlush_type mmioFlush_orig; -typedef MMRESULT (WINAPI *mmioAdvance_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance); -extern mmioAdvance_type mmioAdvance_orig; -typedef LRESULT (WINAPI *mmioSendMessage_type)( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2); -extern mmioSendMessage_type mmioSendMessage_orig; -typedef MMRESULT (WINAPI *mmioDescend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend); -extern mmioDescend_type mmioDescend_orig; -typedef MMRESULT (WINAPI *mmioAscend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend); -extern mmioAscend_type mmioAscend_orig; -typedef MMRESULT (WINAPI *mmioCreateChunk_type)(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate); -extern mmioCreateChunk_type mmioCreateChunk_orig; -typedef MCIERROR (WINAPI *mciSendCommandA_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); -extern mciSendCommandA_type mciSendCommandA_orig; -typedef MCIERROR (WINAPI *mciSendCommandW_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2); -extern mciSendCommandW_type mciSendCommandW_orig; -typedef MCIERROR (WINAPI *mciSendStringA_type)( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback); -extern mciSendStringA_type mciSendStringA_orig; -typedef MCIERROR (WINAPI *mciSendStringW_type)( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback); -extern mciSendStringW_type mciSendStringW_orig; -typedef MCIDEVICEID (WINAPI *mciGetDeviceIDA_type)( LPCSTR pszDevice); -extern mciGetDeviceIDA_type mciGetDeviceIDA_orig; -typedef MCIDEVICEID (WINAPI *mciGetDeviceIDW_type)( LPCWSTR pszDevice); -extern mciGetDeviceIDW_type mciGetDeviceIDW_orig; -typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDA_type)( DWORD dwElementID, LPCSTR lpstrType ); -extern mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig; -typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDW_type)( DWORD dwElementID, LPCWSTR lpstrType ); -extern mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig; -typedef DWORD_PTR (WINAPI *mciGetDriverData_type)(UINT uDeviceID); -extern mciGetDriverData_type mciGetDriverData_orig; -typedef BOOL (WINAPI *mciGetErrorStringA_type)( MCIERROR mcierr, LPSTR pszText, UINT cchText); -extern mciGetErrorStringA_type mciGetErrorStringA_orig; -typedef BOOL (WINAPI *mciGetErrorStringW_type)( MCIERROR mcierr, LPWSTR pszText, UINT cchText); -extern mciGetErrorStringW_type mciGetErrorStringW_orig; -typedef BOOL (WINAPI *mciSetDriverData_type)(UINT uDeviceID, DWORD_PTR dwData); -extern mciSetDriverData_type mciSetDriverData_orig; -typedef BOOL (WINAPI *mciSetYieldProc_type)( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData); -extern mciSetYieldProc_type mciSetYieldProc_orig; -typedef BOOL (WINAPI *mciFreeCommandResource_type)(UINT uTable); -extern mciFreeCommandResource_type mciFreeCommandResource_orig; -typedef HTASK (WINAPI *mciGetCreatorTask_type)( MCIDEVICEID mciId); -extern mciGetCreatorTask_type mciGetCreatorTask_orig; -typedef YIELDPROC (WINAPI *mciGetYieldProc_type)( MCIDEVICEID mciId, LPDWORD pdwYieldData); -extern mciGetYieldProc_type mciGetYieldProc_orig; -typedef UINT (WINAPI *mciLoadCommandResource_type)(HANDLE hInstance, LPCWSTR lpResName, UINT wType); -extern mciLoadCommandResource_type mciLoadCommandResource_orig; -typedef BOOL (WINAPI *mciExecute_type)(LPCSTR pszCommand); -extern mciExecute_type mciExecute_orig; diff --git a/indra/plugins/winmmshim/winmm.def b/indra/plugins/winmmshim/winmm.def deleted file mode 100644 index c55a2845f..000000000 --- a/indra/plugins/winmmshim/winmm.def +++ /dev/null @@ -1,218 +0,0 @@ -; -; winmm.def -; -; Exports for WINMM DLL -; - -LIBRARY WINMM -EXPORTS -CloseDriver -DefDriverProc -DriverCallback -DrvGetModuleHandle -GetDriverModuleHandle -;MigrateAllDrivers -;MigrateSoundEvents -;NotifyCallbackData -OpenDriver -;PlaySound -PlaySoundA -PlaySoundW -SendDriverMessage -;WOW32DriverCallback -;WOW32ResolveMultiMediaHandle -;WOWAppExit -;WinmmLogoff -;WinmmLogon -;aux32Message -auxGetDevCapsA -auxGetDevCapsW -auxGetNumDevs -auxGetVolume -auxOutMessage -auxSetVolume -;gfxAddGfx -;gfxBatchChange -;gfxCreateGfxFactoriesList -;gfxCreateZoneFactoriesList -;gfxDestroyDeviceInterfaceList -;gfxEnumerateGfxs -;gfxLogoff -;gfxLogon -;gfxModifyGfx -;gfxOpenGfx -;gfxRemoveGfx -;joy32Message -joyConfigChanged -joyGetDevCapsA -joyGetDevCapsW -joyGetNumDevs -joyGetPos -joyGetPosEx -joyGetThreshold -joyReleaseCapture -joySetCapture -joySetThreshold -;mci32Message -mciDriverNotify -mciDriverYield -mciExecute -mciFreeCommandResource -mciGetCreatorTask -mciGetDeviceIDA -mciGetDeviceIDFromElementIDA -mciGetDeviceIDFromElementIDW -mciGetDeviceIDW -mciGetDriverData -mciGetErrorStringA -mciGetErrorStringW -mciGetYieldProc -mciLoadCommandResource -mciSendCommandA -mciSendCommandW -mciSendStringA -mciSendStringW -mciSetDriverData -mciSetYieldProc -;mid32Message -midiConnect -midiDisconnect -midiInAddBuffer -midiInClose -midiInGetDevCapsA -midiInGetDevCapsW -midiInGetErrorTextA -midiInGetErrorTextW -midiInGetID -midiInGetNumDevs -midiInMessage -midiInOpen -midiInPrepareHeader -midiInReset -midiInStart -midiInStop -midiInUnprepareHeader -midiOutCacheDrumPatches -midiOutCachePatches -midiOutClose -midiOutGetDevCapsA -midiOutGetDevCapsW -midiOutGetErrorTextA -midiOutGetErrorTextW -midiOutGetID -midiOutGetNumDevs -midiOutGetVolume -midiOutLongMsg -midiOutMessage -midiOutOpen -midiOutPrepareHeader -midiOutReset -midiOutSetVolume -midiOutShortMsg -midiOutUnprepareHeader -midiStreamClose -midiStreamOpen -midiStreamOut -midiStreamPause -midiStreamPosition -midiStreamProperty -midiStreamRestart -midiStreamStop -mixerClose -mixerGetControlDetailsA -mixerGetControlDetailsW -mixerGetDevCapsA -mixerGetDevCapsW -mixerGetID -mixerGetLineControlsA -mixerGetLineControlsW -mixerGetLineInfoA -mixerGetLineInfoW -mixerGetNumDevs -mixerMessage -mixerOpen -mixerSetControlDetails -;mmDrvInstall -mmGetCurrentTask -mmTaskBlock -mmTaskCreate -mmTaskSignal -mmTaskYield -mmioAdvance -mmioAscend -mmioClose -mmioCreateChunk -mmioDescend -mmioFlush -mmioGetInfo -mmioInstallIOProcA -mmioInstallIOProcW -mmioOpenA -mmioOpenW -mmioRead -mmioRenameA -mmioRenameW -mmioSeek -mmioSendMessage -mmioSetBuffer -mmioSetInfo -mmioStringToFOURCCA -mmioStringToFOURCCW -mmioWrite -mmsystemGetVersion -;mod32Message -;mxd32Message -sndPlaySoundA -sndPlaySoundW -;tid32Message -timeBeginPeriod -timeEndPeriod -timeGetDevCaps -timeGetSystemTime -timeGetTime -timeKillEvent -timeSetEvent -waveInAddBuffer -waveInClose -waveInGetDevCapsA -waveInGetDevCapsW -waveInGetErrorTextA -waveInGetErrorTextW -waveInGetID -waveInGetNumDevs -waveInGetPosition -waveInMessage -waveInOpen -waveInPrepareHeader -waveInReset -waveInStart -waveInStop -waveInUnprepareHeader -waveOutBreakLoop -waveOutClose -waveOutGetDevCapsA -waveOutGetDevCapsW -waveOutGetErrorTextA -waveOutGetErrorTextW -waveOutGetID -waveOutGetNumDevs -waveOutGetPitch -waveOutGetPlaybackRate -waveOutGetPosition -waveOutGetVolume -waveOutMessage -waveOutOpen -waveOutPause -waveOutPrepareHeader -waveOutReset -waveOutRestart -waveOutSetPitch -waveOutSetPlaybackRate -waveOutSetVolume -waveOutUnprepareHeader -waveOutWrite -;wid32Message -;winmmSetDebugLevel -;wod32Message -setPluginVolume -setPluginMute \ No newline at end of file diff --git a/indra/plugins/winmmshim/winmm_shim.cpp b/indra/plugins/winmmshim/winmm_shim.cpp deleted file mode 100644 index aac349bf5..000000000 --- a/indra/plugins/winmmshim/winmm_shim.cpp +++ /dev/null @@ -1,200 +0,0 @@ -/** - * @file winmmshim.cpp - * @brief controls volume level of process by intercepting calls to winmm.dll - * - * $LicenseInfo:firstyear=2010&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ -#include "forwarding_api.h" -#include -#include -#include - -using std::wstring; - -static float sVolumeLevel = 1.f; -static bool sMute = false; -static CRITICAL_SECTION sCriticalSection; - -BOOL APIENTRY DllMain( HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - InitializeCriticalSection(&sCriticalSection); - return TRUE; -} - -void ll_winmm_shim_initialize(){ - static bool initialized = false; - // do this only once - EnterCriticalSection(&sCriticalSection); - if (!initialized) - { // bind to original winmm.dll - TCHAR system_path[MAX_PATH]; - TCHAR dll_path[MAX_PATH]; - ::GetSystemDirectory(system_path, MAX_PATH); - - // grab winmm.dll from system path, where it should live - wsprintf(dll_path, "%s\\winmm.dll", system_path); - HMODULE winmm_handle = ::LoadLibrary(dll_path); - - if (winmm_handle != NULL) - { // we have a dll, let's get out pointers! - initialized = true; - init_function_pointers(winmm_handle); - ::OutputDebugStringA("WINMM_SHIM.DLL: real winmm.dll initialized successfully\n"); - } - else - { - // failed to initialize real winmm.dll - ::OutputDebugStringA("WINMM_SHIM.DLL: Failed to initialize real winmm.dll\n"); - } - } - LeaveCriticalSection(&sCriticalSection); -} - - -extern "C" -{ - // tracks the requested format for a given waveout buffer - struct WaveOutFormat - { - WaveOutFormat(int bits_per_sample) - : mBitsPerSample(bits_per_sample) - {} - int mBitsPerSample; - }; - typedef std::map wave_out_map_t; - static wave_out_map_t sWaveOuts; - - MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen) - { - ll_winmm_shim_initialize(); - if (pwfx->wFormatTag != WAVE_FORMAT_PCM - || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16)) - { // uncompressed 8 and 16 bit sound are the only types we support - return WAVERR_BADFORMAT; - } - - MMRESULT result = waveOutOpen_orig(phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen); - if (result == MMSYSERR_NOERROR - && ((fdwOpen & WAVE_FORMAT_QUERY) == 0)) // not just querying for format support - { // remember the requested bits per sample, and associate with the given handle - WaveOutFormat* wave_outp = new WaveOutFormat(pwfx->wBitsPerSample); - sWaveOuts.insert(std::make_pair(*phwo, wave_outp)); - } - return result; - } - - MMRESULT WINAPI waveOutClose( HWAVEOUT hwo) - { - ll_winmm_shim_initialize(); - wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); - if (found_it != sWaveOuts.end()) - { // forget what we know about this handle - delete found_it->second; - sWaveOuts.erase(found_it); - } - return waveOutClose_orig( hwo); - } - - MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh) - { - ll_winmm_shim_initialize(); - MMRESULT result = MMSYSERR_NOERROR; - - if (sMute) - { // zero out the audio buffer when muted - memset(pwh->lpData, 0, pwh->dwBufferLength); - } - else if (sVolumeLevel != 1.f) - { // need to apply volume level - wave_out_map_t::iterator found_it = sWaveOuts.find(hwo); - if (found_it != sWaveOuts.end()) - { - WaveOutFormat* formatp = found_it->second; - switch (formatp->mBitsPerSample){ - case 8: - { - char volume = (char)(sVolumeLevel * 127.f); - for (unsigned int i = 0; i < pwh->dwBufferLength; i++) - { - // unsigned multiply doesn't use most significant bit, so shift by 7 bits - // to get resulting value back into 8 bits - pwh->lpData[i] = (pwh->lpData[i] * volume) >> 7; - } - break; - } - case 16: - { - short volume_16 = (short)(sVolumeLevel * 32767.f); - - // copy volume level 4 times into 64 bit MMX register - __m64 volume_64 = _mm_set_pi16(volume_16, volume_16, volume_16, volume_16); - __m64* sample_64; - __m64* last_sample_64 = (__m64*)(pwh->lpData + pwh->dwBufferLength - sizeof(__m64)); - // for everything that can be addressed in 64 bit multiples... - for (sample_64 = (__m64*)pwh->lpData; - sample_64 <= last_sample_64; - ++sample_64) - { - //...multiply the samples by the volume... - __m64 scaled_sample = _mm_mulhi_pi16(*sample_64, volume_64); - // ...and shift left 1 bit since an unsigned multiple loses the most significant bit - // 0x7FFF * 0x7FFF = 0x3fff0001 - // 0x3fff0001 << 1 = 0x7ffe0002 - // notice that the LSB is always 0...should consider dithering - *sample_64 = _mm_slli_pi16(scaled_sample, 1); - } - - // the captain has turned off the MMX sign, you are now free to use floating point registers - _mm_empty(); - - // finish remaining samples that didn't fit into 64 bit register - for (short* sample_16 = (short*)sample_64; - sample_16 < (short*)(pwh->lpData + pwh->dwBufferLength); - ++sample_16) - { - *sample_16 = (*sample_16 * volume_16) >> 15; - } - - break; - } - default: - // don't do anything - break; - } - } - } - return waveOutWrite_orig( hwo, pwh, cbwh); - } - - void WINAPI setPluginVolume(float volume) - { - sVolumeLevel = volume; - } - - void WINAPI setPluginMute(bool mute) - { - sMute = mute; - } -} diff --git a/scripts/build_version.py b/scripts/build_version.py deleted file mode 100755 index 4bef290b7..000000000 --- a/scripts/build_version.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/env python -# -# Print the build information embedded in a header file. -# -# Expects to be invoked from the command line with a file name and a -# list of directories to search. The file name will be one of the -# following: -# -# llversionserver.h -# llversionviewer.h -# -# The directory list that follows will include indra/llcommon, where -# these files live. - -import errno, os, re - -def get_version(filename): - fp = open(filename) - data = fp.read() - fp.close() - - vals = {} - m = re.search('const S32 LL_VERSION_MAJOR = (\d+);', data) - vals['major'] = m.group(1) - m = re.search('const S32 LL_VERSION_MINOR = (\d+);', data) - vals['minor'] = m.group(1) - m = re.search('const S32 LL_VERSION_PATCH = (\d+);', data) - vals['patch'] = m.group(1) - m = re.search('const S32 LL_VERSION_BUILD = (\d+);', data) - vals['build'] = m.group(1) - - return "%(major)s.%(minor)s.%(patch)s.%(build)s" % vals - -if __name__ == '__main__': - import sys - - try: - for path in sys.argv[2:]: - name = os.path.join(path, sys.argv[1]) - try: - print get_version(name) - break - except OSError, err: - if err.errno != errno.ENOENT: - raise - else: - print >> sys.stderr, 'File not found:', sys.argv[1] - sys.exit(1) - except AttributeError: - print >> sys.stderr, 'Error: malformatted file: ', name - sys.exit(1) - except IndexError: - print >> sys.stderr, ('Usage: %s llversion[...].h [directories]' % - sys.argv[0]) diff --git a/scripts/update_version_files.py b/scripts/update_version_files.py deleted file mode 100755 index 864a154ed..000000000 --- a/scripts/update_version_files.py +++ /dev/null @@ -1,306 +0,0 @@ -#!/usr/bin/python -"""\ -@file update_version_files.py -@brief Update all of the various files in the repository to a new -version number, instead of having to figure it out by hand - -$LicenseInfo:firstyear=2006&license=viewergpl$ - -Copyright (c) 2006-2009, Linden Research, Inc. - -Second Life Viewer Source Code -The source code in this file ("Source Code") is provided by Linden Lab -to you under the terms of the GNU General Public License, version 2.0 -("GPL"), unless you have obtained a separate licensing agreement -("Other License"), formally executed by you and Linden Lab. Terms of -the GPL can be found in doc/GPL-license.txt in this distribution, or -online at http://secondlifegrid.net/programs/open_source/licensing/gplv2 - -There are special exceptions to the terms and conditions of the GPL as -it is applied to this Source Code. View the full text of the exception -in the file doc/FLOSS-exception.txt in this software distribution, or -online at -http://secondlifegrid.net/programs/open_source/licensing/flossexception - -By copying, modifying or distributing this software, you acknowledge -that you have read and understood your obligations described above, -and agree to abide by those obligations. - -ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO -WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, -COMPLETENESS OR PERFORMANCE. -$/LicenseInfo$ -""" - -import sys -import os.path - -def add_indra_lib_path(): - root = os.path.realpath(__file__) - # always insert the directory of the script in the search path - dir = os.path.dirname(root) - if dir not in sys.path: - sys.path.insert(0, dir) - - # Now go look for indra/lib/python in the parent dies - while root != os.path.sep: - root = os.path.dirname(root) - dir = os.path.join(root, 'indra', 'lib', 'python') - if os.path.isdir(dir): - if dir not in sys.path: - sys.path.insert(0, dir) - return root - else: - print >>sys.stderr, "This script is not inside a valid installation." - sys.exit(1) - -add_indra_lib_path() - -import getopt, os, re, commands -from indra.util import llversion - -svn = os.path.expandvars("${SVN}") -if not svn or svn == "${SVN}": svn = "svn" - -def usage(): - print "Usage:" - print sys.argv[0] + """ [options] - -Options: - --version - Specify the version string to replace current version. - --skip-on-branch - Specify a regular expression against which the current branch - is matched. If it matches, then leave version strings alone. - Use this to avoid changing version strings on release candidate - builds. - --server - Update llversionserver.h only with new version - --viewer - Update llversionviewer.h only with new version - --channel - Specify the viewer channel string to replace current channel. - --server_channel - Specify the server channel string to replace current channel. - --src-root - Location of source tree - --verbose - --help - Print this message and exit. - -Common Uses: - # Update server and viewer build numbers to the current SVN revision: - update_version_files.py - - # Update build numbers unless we are on a release branch: - update_version_files.py --skip-on-branch='^Branch_' - - # Update server and viewer version numbers explicitly: - update_version_files.py --version=1.18.1.6 - - # Update just the viewer version number explicitly: - update_version_files.py --viewer --version=1.18.1.6 - - # Update just the server build number to the current SVN revision: - update_version_files.py --server - - # Update the viewer channel - update_version_files.py --channel="First Look Puppeteering" - - # Update the server channel - update_version_files.py --server_channel="Het Grid" - -""" -def _getstatusoutput(cmd): - """Return Win32 (status, output) of executing cmd -in a shell.""" - if os.path.sep != "/": - # stupid #%#$$ windows - cmd = 'cmd.exe /c "'+cmd+'"' - pipe = os.popen(cmd, 'r') - text = pipe.read() - sts = pipe.close() - if sts is None: sts = 0 - if text[-1:] == '\n': text = text[:-1] - return sts, text - -re_map = {} - -#re_map['filename'] = (('pattern', 'replacement'), -# ('pattern', 'replacement') -re_map['indra/llcommon/llversionviewer.h'] = \ - (('const S32 LL_VERSION_MAJOR = (\d+);', - 'const S32 LL_VERSION_MAJOR = %(VER_MAJOR)s;'), - ('const S32 LL_VERSION_MINOR = (\d+);', - 'const S32 LL_VERSION_MINOR = %(VER_MINOR)s;'), - ('const S32 LL_VERSION_PATCH = (\d+);', - 'const S32 LL_VERSION_PATCH = %(VER_PATCH)s;'), - ('const S32 LL_VERSION_BUILD = (\d+);', - 'const S32 LL_VERSION_BUILD = %(VER_BUILD)s;'), - ('const char \* const LL_CHANNEL = "(.+)";', - 'const char * const LL_CHANNEL = "%(VIEWER_CHANNEL)s";')) -re_map['indra/newview/res/viewerRes.rc'] = \ - (('FILEVERSION [0-9,]+', - 'FILEVERSION %(VER_MAJOR)s,%(VER_MINOR)s,%(VER_PATCH)s,%(VER_BUILD)s'), - ('PRODUCTVERSION [0-9,]+', - 'PRODUCTVERSION %(VER_MAJOR)s,%(VER_MINOR)s,%(VER_PATCH)s,%(VER_BUILD)s'), - ('VALUE "FileVersion", "[0-9.]+"', - 'VALUE "FileVersion", "%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s"'), - ('VALUE "ProductVersion", "[0-9.]+"', - 'VALUE "ProductVersion", "%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s"')) - -# Trailing ',' in top level tuple is special form to avoid parsing issues with one element tuple -re_map['indra/newview/Info-SecondLife.plist'] = \ - (('CFBundleVersion\n\t[0-9.]+', - 'CFBundleVersion\n\t%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s'),) - -re_map['indra/newview/Info-Snowglobe.plist'] = \ - (('CFBundleVersion\n\t[0-9.]+', - 'CFBundleVersion\n\t%(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s'),) - -# This will probably only work as long as InfoPlist.strings is NOT UTF16, which is should be... -re_map['indra/newview/English.lproj/InfoPlist.strings'] = \ - (('CFBundleShortVersionString = "Second Life version [0-9.]+";', - 'CFBundleShortVersionString = "Second Life version %(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s";'), - ('CFBundleGetInfoString = "Second Life version [0-9.]+', - 'CFBundleGetInfoString = "Second Life version %(VER_MAJOR)s.%(VER_MINOR)s.%(VER_PATCH)s.%(VER_BUILD)s')) - - -version_re = re.compile('(\d+).(\d+).(\d+).(\d+)') -svn_branch_re = re.compile('^URL:\s+\S+/([^/\s]+)$', re.MULTILINE) -svn_revision_re = re.compile('^Last Changed Rev: (\d+)$', re.MULTILINE) - -def main(): - script_path = os.path.dirname(__file__) - src_root = script_path + "/../" - verbose = False - - opts, args = getopt.getopt(sys.argv[1:], - "", - ['version=', - 'channel=', - 'server_channel=', - 'skip-on-branch=', - 'src-root=', - 'verbose', - 'viewer', - 'help']) - update_viewer = False - new_version = None - new_viewer_channel = None - skip_on_branch_re = None - for o,a in opts: - if o in ('--version'): - new_version = a - if o in ('--skip-on-branch'): - skip_on_branch_re = re.compile(a) - if o in ('--channel'): - new_viewer_channel = a - if o in ('--src-root'): - src_root = a - if o in ('--verbose'): - verbose = True - if o in ('--server'): - update_server = True - if o in ('--viewer'): - update_viewer = True - if o in ('--help'): - usage() - return 0 - - if not(update_viewer): - update_viewer = True - - # Get current channel/version from llversion*.h - try: - viewer_channel = llversion.get_viewer_channel() - viewer_version = llversion.get_viewer_version() - except IOError: - print "Viewer version file not present, skipping..." - viewer_channel = None - viewer_version = None - update_viewer = False - - if verbose: - print "Source Path:", src_root - if viewer_channel != None: - print "Current viewer channel/version: '%(viewer_channel)s' / '%(viewer_version)s'" % locals() - print - - # Determine new channel(s) - if new_viewer_channel != None and len(new_viewer_channel) > 0: - viewer_channel = new_viewer_channel - - # Determine new version(s) - if new_version: - m = version_re.match(new_version) - if not m: - print "Invalid version string specified!" - return -1 - if update_viewer: - viewer_version = new_version - else: - # Assume we're updating just the build number - cl = '%s info "%s"' % (svn, src_root) - status, output = _getstatusoutput(cl) - if verbose: - print - print "svn info output:" - print "----------------" - print output - - branch_match = svn_branch_re.search(output) - revision_match = svn_revision_re.search(output) - if not branch_match or not revision_match: - print "Failed to execute svn info, output follows:" - print output - return -1 - branch = branch_match.group(1) - revision = revision_match.group(1) - if skip_on_branch_re and skip_on_branch_re.match(branch): - print "Release Candidate Build, leaving version files untouched." - return 0 - if update_viewer: - m = version_re.match(viewer_version) - viewer_version = m.group(1)+"."+m.group(2)+"."+m.group(3)+"."+revision - - if verbose: - if update_viewer: - print "Setting viewer channel/version: '%(viewer_channel)s' / '%(viewer_version)s'" % locals() - print - - # split out version parts - if viewer_version != None: - m = version_re.match(viewer_version) - VER_MAJOR = m.group(1) - VER_MINOR = m.group(2) - VER_PATCH = m.group(3) - VER_BUILD = m.group(4) - - # For readability and symmetry with version strings: - VIEWER_CHANNEL = viewer_channel - - # Iterate through all of the files in the map, and apply the - # substitution filters - for filename in re_map.keys(): - try: - # Read the entire file into a string - full_fn = src_root + '/' + filename - file = open(full_fn,"r") - file_str = file.read() - file.close() - - if verbose: - print "Processing file:",filename - for rule in re_map[filename]: - repl = rule[1] % locals() - file_str = re.sub(rule[0], repl, file_str) - - file = open(full_fn,"w") - file.write(file_str) - file.close() - except IOError: - print "File %(filename)s not present, skipping..." % locals() - return 0 - -main() diff --git a/scripts/xcode_fix.sh b/scripts/xcode_fix.sh deleted file mode 100644 index 608b390ad..000000000 --- a/scripts/xcode_fix.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/bin/sh - -echo 'Linden fix for Xcode 4.6 to have 10.6SDK so it can build older branches.' - -echo 'Be sure to have the xcode_4.3_for_lion.dmg mounted! This script pulls from that volume!' - -echo 'Creating temporary directory. . .' - -mkdir temp - -pushd temp - -echo 'Copying 10.6SDK. . .' - -cp -R /Volumes/Xcode/Xcode.app/Contents//Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.6.sdk . - -echo 'Linking darwin10 folders as darwin11. . .' - -pushd MacOSX10.6.sdk/Developer/usr/llvm-gcc-4.2/lib/gcc/ - -ln -s i686-apple-darwin10 i686-apple-darwin11 - -popd - -pushd MacOSX10.6.sdk/usr/lib/gcc/ - -ln -s i686-apple-darwin10 i686-apple-darwin11 - -popd - -pushd MacOSX10.6.sdk/usr/lib/ - -ln -s i686-apple-darwin10 i686-apple-darwin11 - -popd - -echo 'Changing ownership and moving SDK to machine. . . Password required for sudo commands.' - -sudo chown -R root:wheel MacOSX10.6.sdk - -sudo mv MacOSX10.6.sdk/ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs - -popd - -rm -rf temp - -echo 'Xcode fix complete.' - From 2a072bfc678b4e59f1a07fe1bfe3621b4d46660d Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 13:31:21 -0500 Subject: [PATCH 09/19] Add package-based licenses to about floater --- indra/newview/CMakeLists.txt | 1 + indra/newview/llfloaterabout.cpp | 27 +++++++++++++++++++++++++++ indra/newview/viewer_manifest.py | 4 ++++ 3 files changed, 32 insertions(+) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 72f045f63..c9655a98a 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1377,6 +1377,7 @@ set(viewer_APPSETTINGS_FILES app_settings/viewerart.xml ${CMAKE_SOURCE_DIR}/../etc/message.xml ${CMAKE_SOURCE_DIR}/../scripts/messages/message_template.msg + packages-info.txt ) source_group("App Settings" FILES ${viewer_APPSETTINGS_FILES}) diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index d5dafa9ca..4fe064959 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -111,6 +111,9 @@ LLFloaterAbout::LLFloaterAbout() LLViewerTextEditor *credits_widget = getChild("credits_editor", true); + + LLViewerTextEditor *licenses_widget = + getChild("licenses_editor", true); childSetAction("copy_btn", onAboutClickCopyToClipboard, this); @@ -328,6 +331,30 @@ LLFloaterAbout::LLFloaterAbout() credits_widget->setTakesFocus(TRUE); credits_widget->setHandleEditKeysDirectly(TRUE); + // Get the Versions and Copyrights, created at build time + std::string licenses_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "packages-info.txt"); + llifstream licenses_file; + licenses_file.open(licenses_path); /* Flawfinder: ignore */ + if (licenses_file.is_open()) + { + std::string license_line; + licenses_widget->clear(); + while (std::getline(licenses_file, license_line)) + { + licenses_widget->appendColoredText(license_line + "\n", FALSE, FALSE, gColors.getColor("TextFgReadOnlyColor")); + } + licenses_file.close(); + } + else + { + // this case will use the (out of date) hard coded value from the XUI + LL_INFOS("AboutInit") << "Could not read licenses file at " << licenses_path << LL_ENDL; + } + licenses_widget->setCursorPos(0); + licenses_widget->setEnabled(FALSE); + licenses_widget->setTakesFocus(TRUE); + licenses_widget->setHandleEditKeysDirectly(TRUE); + center(); sInstance = this; diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index 125a69c90..3d9ec6405 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -81,6 +81,10 @@ class ViewerManifest(LLManifest): # ... and the hunspell dictionaries self.path("dictionaries") + # include the extracted packages information (see BuildPackagesInfo.cmake) + self.path(src=os.path.join(self.args['build'],"packages-info.txt"), dst="packages-info.txt") + + self.end_prefix("app_settings") if self.prefix(src="character"): From d2190879509bd50ab698d12139821e536f96a52f Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 16:14:04 -0500 Subject: [PATCH 10/19] Remove llqtwebkit, add cef --- autobuild.xml | 32 - indra/CMakeLists.txt | 4 - indra/cmake/CEFPlugin.cmake | 40 + indra/cmake/CMakeLists.txt | 5 +- indra/cmake/FindLLQtWebkit.cmake | 62 - indra/cmake/LLQtWebkit.cmake | 11 - indra/cmake/Qt4.cmake | 12 - indra/cmake/WebKitLibPlugin.cmake | 64 - indra/llmath/llcalcparser.h | 14 +- indra/llplugin/CMakeLists.txt | 1 - indra/llplugin/llpluginclassmedia.cpp | 234 +-- indra/llplugin/llpluginclassmedia.h | 9 +- indra/llplugin/llpluginclassmediaowner.h | 39 +- indra/llqtwebkit/CMakeLists.txt | 70 - .../llembeddedbrowser/llembeddedbrowser.pro | 14 - .../tst_llembeddedbrowser.cpp | 400 ----- .../llembeddedbrowserwindow.pro | 14 - .../tst_llembeddedbrowserwindow.cpp | 1027 ------------ indra/llqtwebkit/llembeddedbrowser.cpp | 759 --------- indra/llqtwebkit/llembeddedbrowser.h | 115 -- indra/llqtwebkit/llembeddedbrowser_p.h | 90 - indra/llqtwebkit/llembeddedbrowserwindow.cpp | 1136 ------------- indra/llqtwebkit/llembeddedbrowserwindow.h | 185 --- indra/llqtwebkit/llembeddedbrowserwindow_p.h | 251 --- indra/llqtwebkit/lljsobject.cpp | 153 -- indra/llqtwebkit/lljsobject.h | 71 - indra/llqtwebkit/llnetworkaccessmanager.cpp | 247 --- indra/llqtwebkit/llnetworkaccessmanager.h | 57 - indra/llqtwebkit/llqtwebkit.cpp | 820 ---------- indra/llqtwebkit/llqtwebkit.h | 470 ------ indra/llqtwebkit/llqtwebkit.pri | 47 - indra/llqtwebkit/llqtwebkit.pro | 18 - indra/llqtwebkit/llstyle.cpp | 79 - indra/llqtwebkit/llstyle.h | 42 - indra/llqtwebkit/llwebpage.cpp | 536 ------ indra/llqtwebkit/llwebpage.h | 108 -- indra/llqtwebkit/llwebpageopenshim.cpp | 176 -- indra/llqtwebkit/llwebpageopenshim.h | 63 - indra/llqtwebkit/passworddialog.ui | 137 -- indra/llqtwebkit/pstdint.h | 728 --------- .../qtwebkit_cookiejar/CMakeLists.txt | 3 - .../qtwebkit_cookiejar/autotest/trie/trie.pro | 15 - .../autotest/trie/tst_trie.cpp | 270 --- .../benchmark/networkcookiejar/cookiejar.pro | 17 - .../benchmark/networkcookiejar/main.cpp | 159 -- .../manualtest/browser/browser.pro | 11 - .../manualtest/browser/main.cpp | 85 - .../manualtest/fuzz/fuzz.pro | 12 - .../manualtest/fuzz/main.cpp | 100 -- .../qtwebkit_cookiejar/src/CMakeLists.txt | 27 - .../src/networkcookiejar.cpp | 444 ----- .../qtwebkit_cookiejar/src/networkcookiejar.h | 61 - .../src/networkcookiejar_p.h | 66 - .../llqtwebkit/qtwebkit_cookiejar/src/src.pri | 5 - .../qtwebkit_cookiejar/src/trie_p.h | 247 --- .../src/twoleveldomains_p.h | 92 -- indra/llqtwebkit/static.pri | 18 - indra/llqtwebkit/tests/3dgl/3dgl.cpp | 269 --- indra/llqtwebkit/tests/3dgl/3dgl.pro | 38 - indra/llqtwebkit/tests/3dgl/zpr.c | 429 ----- indra/llqtwebkit/tests/3dgl/zpr.h | 88 - indra/llqtwebkit/tests/qttestapp/main.cpp | 341 ---- .../llqtwebkit/tests/qttestapp/qttestapp.pro | 38 - indra/llqtwebkit/tests/qttestapp/webpage.h | 0 indra/llqtwebkit/tests/qttestapp/window.ui | 79 - indra/llqtwebkit/tests/ssltest/ssltest.cpp | 229 --- indra/llqtwebkit/tests/ssltest/ssltest.pro | 28 - indra/llqtwebkit/tests/testgl/testgl.cpp | 1002 ------------ indra/llqtwebkit/tests/testgl/testgl.pro | 38 - indra/llqtwebkit/tests/textmode/textmode.cpp | 292 ---- indra/llqtwebkit/tests/textmode/textmode.pro | 28 - indra/llqtwebkit/win32/3p-qt-vars.bat | 6 - .../win32/Qt Command Prompt (3p-qt).lnk | Bin 2369 -> 0 bytes indra/llui/llfocusmgr.cpp | 18 + indra/llui/llfocusmgr.h | 9 + indra/llui/llview.cpp | 45 + indra/llui/llview.h | 3 + indra/llwindow/llkeyboardwin32.cpp | 2 +- indra/llwindow/llwindowwin32.cpp | 13 + indra/llwindow/llwindowwin32.h | 5 +- indra/newview/llfloaterabout.cpp | 65 +- indra/newview/llmediactrl.cpp | 62 +- indra/newview/llmediactrl.h | 5 + indra/newview/lltoolpie.cpp | 143 +- indra/newview/lltoolpie.h | 1 + indra/newview/llviewerkeyboard.cpp | 5 +- indra/newview/llviewerkeyboard.h | 1 + indra/newview/llviewermedia.cpp | 77 +- indra/newview/llviewermedia.h | 3 + indra/newview/llviewermediafocus.cpp | 23 +- indra/newview/llviewermediafocus.h | 5 + indra/newview/llviewerwindow.cpp | 55 +- indra/newview/llviewerwindow.h | 1 + .../default/xui/en-us/mime_types_mac.xml | 38 +- .../default/xui/en-us/mime_types_windows.xml | 40 +- indra/newview/viewer_manifest.py | 120 +- indra/plugins/CMakeLists.txt | 2 +- indra/plugins/cef/CMakeLists.txt | 115 ++ .../{webkit => cef}/mac_volume_catcher.cpp | 11 +- indra/plugins/cef/media_plugin_cef.cpp | 903 ++++++++++ .../plugins/{webkit => cef}/volume_catcher.h | 0 .../windows_volume_catcher.cpp | 5 +- indra/plugins/webkit/CMakeLists.txt | 132 -- indra/plugins/webkit/dummy_volume_catcher.cpp | 58 - indra/plugins/webkit/linux_volume_catcher.cpp | 483 ------ .../webkit/linux_volume_catcher_pa_syms.inc | 21 - .../linux_volume_catcher_paglib_syms.inc | 6 - indra/plugins/webkit/media_plugin_webkit.cpp | 1445 ----------------- 108 files changed, 1783 insertions(+), 15014 deletions(-) create mode 100644 indra/cmake/CEFPlugin.cmake delete mode 100644 indra/cmake/FindLLQtWebkit.cmake delete mode 100644 indra/cmake/LLQtWebkit.cmake delete mode 100644 indra/cmake/Qt4.cmake delete mode 100644 indra/cmake/WebKitLibPlugin.cmake delete mode 100644 indra/llqtwebkit/CMakeLists.txt delete mode 100644 indra/llqtwebkit/autotests/llembeddedbrowser/llembeddedbrowser.pro delete mode 100644 indra/llqtwebkit/autotests/llembeddedbrowser/tst_llembeddedbrowser.cpp delete mode 100644 indra/llqtwebkit/autotests/llembeddedbrowserwindow/llembeddedbrowserwindow.pro delete mode 100644 indra/llqtwebkit/autotests/llembeddedbrowserwindow/tst_llembeddedbrowserwindow.cpp delete mode 100644 indra/llqtwebkit/llembeddedbrowser.cpp delete mode 100644 indra/llqtwebkit/llembeddedbrowser.h delete mode 100644 indra/llqtwebkit/llembeddedbrowser_p.h delete mode 100644 indra/llqtwebkit/llembeddedbrowserwindow.cpp delete mode 100644 indra/llqtwebkit/llembeddedbrowserwindow.h delete mode 100644 indra/llqtwebkit/llembeddedbrowserwindow_p.h delete mode 100644 indra/llqtwebkit/lljsobject.cpp delete mode 100644 indra/llqtwebkit/lljsobject.h delete mode 100644 indra/llqtwebkit/llnetworkaccessmanager.cpp delete mode 100644 indra/llqtwebkit/llnetworkaccessmanager.h delete mode 100644 indra/llqtwebkit/llqtwebkit.cpp delete mode 100644 indra/llqtwebkit/llqtwebkit.h delete mode 100644 indra/llqtwebkit/llqtwebkit.pri delete mode 100644 indra/llqtwebkit/llqtwebkit.pro delete mode 100644 indra/llqtwebkit/llstyle.cpp delete mode 100644 indra/llqtwebkit/llstyle.h delete mode 100644 indra/llqtwebkit/llwebpage.cpp delete mode 100644 indra/llqtwebkit/llwebpage.h delete mode 100644 indra/llqtwebkit/llwebpageopenshim.cpp delete mode 100644 indra/llqtwebkit/llwebpageopenshim.h delete mode 100644 indra/llqtwebkit/passworddialog.ui delete mode 100644 indra/llqtwebkit/pstdint.h delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/CMakeLists.txt delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/trie.pro delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/tst_trie.cpp delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/cookiejar.pro delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/main.cpp delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/browser.pro delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/main.cpp delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/fuzz.pro delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/main.cpp delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/src/CMakeLists.txt delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.cpp delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.h delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar_p.h delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/src/src.pri delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/src/trie_p.h delete mode 100644 indra/llqtwebkit/qtwebkit_cookiejar/src/twoleveldomains_p.h delete mode 100644 indra/llqtwebkit/static.pri delete mode 100644 indra/llqtwebkit/tests/3dgl/3dgl.cpp delete mode 100644 indra/llqtwebkit/tests/3dgl/3dgl.pro delete mode 100644 indra/llqtwebkit/tests/3dgl/zpr.c delete mode 100644 indra/llqtwebkit/tests/3dgl/zpr.h delete mode 100644 indra/llqtwebkit/tests/qttestapp/main.cpp delete mode 100644 indra/llqtwebkit/tests/qttestapp/qttestapp.pro delete mode 100644 indra/llqtwebkit/tests/qttestapp/webpage.h delete mode 100644 indra/llqtwebkit/tests/qttestapp/window.ui delete mode 100644 indra/llqtwebkit/tests/ssltest/ssltest.cpp delete mode 100644 indra/llqtwebkit/tests/ssltest/ssltest.pro delete mode 100644 indra/llqtwebkit/tests/testgl/testgl.cpp delete mode 100644 indra/llqtwebkit/tests/testgl/testgl.pro delete mode 100644 indra/llqtwebkit/tests/textmode/textmode.cpp delete mode 100644 indra/llqtwebkit/tests/textmode/textmode.pro delete mode 100644 indra/llqtwebkit/win32/3p-qt-vars.bat delete mode 100644 indra/llqtwebkit/win32/Qt Command Prompt (3p-qt).lnk create mode 100644 indra/plugins/cef/CMakeLists.txt rename indra/plugins/{webkit => cef}/mac_volume_catcher.cpp (97%) create mode 100644 indra/plugins/cef/media_plugin_cef.cpp rename indra/plugins/{webkit => cef}/volume_catcher.h (100%) rename indra/plugins/{webkit => cef}/windows_volume_catcher.cpp (98%) delete mode 100644 indra/plugins/webkit/CMakeLists.txt delete mode 100644 indra/plugins/webkit/dummy_volume_catcher.cpp delete mode 100644 indra/plugins/webkit/linux_volume_catcher.cpp delete mode 100644 indra/plugins/webkit/linux_volume_catcher_pa_syms.inc delete mode 100644 indra/plugins/webkit/linux_volume_catcher_paglib_syms.inc delete mode 100644 indra/plugins/webkit/media_plugin_webkit.cpp diff --git a/autobuild.xml b/autobuild.xml index a2f0eef8c..4cbe4629e 100644 --- a/autobuild.xml +++ b/autobuild.xml @@ -1889,38 +1889,6 @@ version 1.0.298370 - llqtwebkit - - copyright - Copyright (C) 2015 The Qt Company Ltd. - description - QT cross-platform applicaiton and UI framework. - license - LGPL - license_file - LICENSES/llqtwebkit.txt - name - llqtwebkit - platforms - - windows64 - - archive - - hash - 433fb6ae8370375cf55013812e59f01d - hash_algorithm - md5 - url - http://depot.alchemyviewer.org/pub/windows64/lib-vc14/llqtwebkit-4.8.7-windows64-201512130225.tar.bz2 - - name - windows64 - - - version - 4.8.7 - mesa license diff --git a/indra/CMakeLists.txt b/indra/CMakeLists.txt index 964a37b95..fc61f3f8a 100644 --- a/indra/CMakeLists.txt +++ b/indra/CMakeLists.txt @@ -45,10 +45,6 @@ add_subdirectory(${LIBS_OPEN_PREFIX}llvfs) add_subdirectory(${LIBS_OPEN_PREFIX}llwindow) add_subdirectory(${LIBS_OPEN_PREFIX}llxml) -if(STANDALONE) - add_subdirectory(${LIBS_OPEN_PREFIX}llqtwebkit) -endif(STANDALONE) - if (WINDOWS AND EXISTS ${LIBS_CLOSED_DIR}copy_win_scripts) add_subdirectory(${LIBS_CLOSED_PREFIX}copy_win_scripts) endif (WINDOWS AND EXISTS ${LIBS_CLOSED_DIR}copy_win_scripts) diff --git a/indra/cmake/CEFPlugin.cmake b/indra/cmake/CEFPlugin.cmake new file mode 100644 index 000000000..9cfb7d14c --- /dev/null +++ b/indra/cmake/CEFPlugin.cmake @@ -0,0 +1,40 @@ +# -*- cmake -*- +include(Linking) +include(Prebuilt) + +if (USESYSTEMLIBS) + set(CEFPLUGIN OFF CACHE BOOL + "CEFPLUGIN support for the llplugin/llmedia test apps.") +else (USESYSTEMLIBS) + use_prebuilt_binary(llceflib) + set(CEFPLUGIN ON CACHE BOOL + "CEFPLUGIN support for the llplugin/llmedia test apps.") + set(CEF_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/include/cef) +endif (USESYSTEMLIBS) + +if (WINDOWS) + set(CEF_PLUGIN_LIBRARIES + libcef.lib + libcef_dll_wrapper.lib + llceflib.lib + ) +elseif (DARWIN) + FIND_LIBRARY(APPKIT_LIBRARY AppKit) + if (NOT APPKIT_LIBRARY) + message(FATAL_ERROR "AppKit not found") + endif() + + FIND_LIBRARY(CEF_LIBRARY "Chromium Embedded Framework" ${ARCH_PREBUILT_DIRS_RELEASE}) + if (NOT CEF_LIBRARY) + message(FATAL_ERROR "CEF not found") + endif() + + set(CEF_PLUGIN_LIBRARIES + ${ARCH_PREBUILT_DIRS_RELEASE}/libcef_dll_wrapper.a + ${ARCH_PREBUILT_DIRS_RELEASE}/libLLCefLib.a + ${APPKIT_LIBRARY} + ${CEF_LIBRARY} + ) + +elseif (LINUX) +endif (WINDOWS) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 3c53fade8..d146b2d86 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -16,6 +16,7 @@ set(cmake_SOURCE_FILES Boost.cmake BuildVersion.cmake CARes.cmake + CEFPlugin.cmake CMakeCopyIfDifferent.cmake CURL.cmake Colladadom.cmake @@ -39,7 +40,6 @@ set(cmake_SOURCE_FILES FindGooglePerfTools.cmake FindHunSpell.cmake FindJsonCpp.cmake - FindLLQtWebkit.cmake FindNDOF.cmake FindOpenJPEG.cmake FindTut.cmake @@ -69,7 +69,6 @@ set(cmake_SOURCE_FILES LLPrimitive.cmake LLPhysicsExtensions.cmake LLSharedLibs.cmake - LLQtWebkit.cmake LLRender.cmake LLSharedLibs.cmake LLUI.cmake @@ -90,7 +89,6 @@ set(cmake_SOURCE_FILES Prebuilt.cmake PulseAudio.cmake Python.cmake - Qt4.cmake QuickTimePlugin.cmake RunBuildTest.cmake StateMachine.cmake @@ -100,7 +98,6 @@ set(cmake_SOURCE_FILES UnixInstall.cmake Variables.cmake ViewerMiscLibs.cmake - WebKitLibPlugin.cmake XmlRpcEpi.cmake ZLIB.cmake ) diff --git a/indra/cmake/FindLLQtWebkit.cmake b/indra/cmake/FindLLQtWebkit.cmake deleted file mode 100644 index 731ae67d7..000000000 --- a/indra/cmake/FindLLQtWebkit.cmake +++ /dev/null @@ -1,62 +0,0 @@ -# -*- cmake -*- - -# - Find llqtwebkit -# Find the llqtwebkit includes and library -# This module defines -# LLQTWEBKIT_INCLUDE_DIR, where to find llqtwebkit.h, etc. -# LLQTWEBKIT_LIBRARY, the llqtwebkit library with full path. -# LLQTWEBKIT_FOUND, If false, do not try to use llqtwebkit. -# also defined, but not for general use are -# LLQTWEBKIT_LIBRARIES, the libraries needed to use llqtwebkit. -# LLQTWEBKIT_LIBRARY_DIRS, where to find the llqtwebkit library. -# LLQTWEBKIT_DEFINITIONS - You should add_definitions(${LLQTWEBKIT_DEFINITIONS}) -# before compiling code that includes llqtwebkit library files. - -# Try to use pkg-config first. -# This allows to have two different libllqtwebkit packages installed: -# one for viewer 2.x and one for viewer 1.x. -include(FindPkgConfig) -if (PKG_CONFIG_FOUND) - if (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) - set(_PACKAGE_ARGS libllqtwebkit>=${LLQtWebkit_FIND_VERSION} REQUIRED) - else (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) - set(_PACKAGE_ARGS libllqtwebkit) - endif (LLQtWebkit_FIND_REQUIRED AND LLQtWebkit_FIND_VERSION) - if (NOT "${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" VERSION_LESS "2.8") - # As virtually nobody will have a pkg-config file for this, do this check always quiet. - # Unfortunately cmake 2.8 or higher is required for pkg_check_modules to have a 'QUIET'. - set(_PACKAGE_ARGS ${_PACKAGE_ARGS} QUIET) - endif () - pkg_check_modules(LLQTWEBKIT ${_PACKAGE_ARGS}) -endif (PKG_CONFIG_FOUND) -set(LLQTWEBKIT_DEFINITIONS ${LLQTWEBKIT_CFLAGS_OTHER}) - -find_path(LLQTWEBKIT_INCLUDE_DIR llqtwebkit.h NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_INCLUDE_DIRS}) - -find_library(LLQTWEBKIT_LIBRARY NAMES llqtwebkit NO_SYSTEM_ENVIRONMENT_PATH HINTS ${LLQTWEBKIT_LIBRARY_DIRS}) - -if (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND) # If pkg-config couldn't find it, pretend we don't have pkg-config. - set(LLQTWEBKIT_LIBRARIES llqtwebkit) - get_filename_component(LLQTWEBKIT_LIBRARY_DIRS ${LLQTWEBKIT_LIBRARY} PATH) -endif (NOT PKG_CONFIG_FOUND OR NOT LLQTWEBKIT_FOUND) - -# Handle the QUIETLY and REQUIRED arguments and set LLQTWEBKIT_FOUND -# to TRUE if all listed variables are TRUE. -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args( - LLQTWEBKIT - DEFAULT_MSG - LLQTWEBKIT_LIBRARY - LLQTWEBKIT_INCLUDE_DIR - LLQTWEBKIT_LIBRARIES - LLQTWEBKIT_LIBRARY_DIRS - ) - -mark_as_advanced( - LLQTWEBKIT_LIBRARY - LLQTWEBKIT_INCLUDE_DIR - LLQTWEBKIT_LIBRARIES - LLQTWEBKIT_LIBRARY_DIRS - LLQTWEBKIT_DEFINITIONS - ) - diff --git a/indra/cmake/LLQtWebkit.cmake b/indra/cmake/LLQtWebkit.cmake deleted file mode 100644 index cec7e22e9..000000000 --- a/indra/cmake/LLQtWebkit.cmake +++ /dev/null @@ -1,11 +0,0 @@ -# -*- cmake -*- - -if (STANDALONE) - set(LLQTWEBKIT_INCLUDE_DIR - ${LIBS_OPEN_DIR}/llqtwebkit - ) - - set(LLQTWEBKIT_LIBRARY - llqtwebkit - ) -endif (STANDALONE) diff --git a/indra/cmake/Qt4.cmake b/indra/cmake/Qt4.cmake deleted file mode 100644 index 37d2799a2..000000000 --- a/indra/cmake/Qt4.cmake +++ /dev/null @@ -1,12 +0,0 @@ -# -*- cmake -*- -include(Prebuilt) - -if (STANDALONE) - set(Qt4_FIND_REQUIRED ON) - - include(FindQt4) - - find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtNetwork QtOpenGL QtWebKit REQUIRED) - include(${QT_USE_FILE}) - add_definitions(${QT_DEFINITIONS}) -endif (STANDALONE) diff --git a/indra/cmake/WebKitLibPlugin.cmake b/indra/cmake/WebKitLibPlugin.cmake deleted file mode 100644 index 8551aa163..000000000 --- a/indra/cmake/WebKitLibPlugin.cmake +++ /dev/null @@ -1,64 +0,0 @@ -# -*- cmake -*- -include(Linking) -include(Prebuilt) -include(LLQtWebkit) -include(Qt4) - -if (STANDALONE) - set(WEBKITLIBPLUGIN OFF CACHE BOOL - "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.") -else (STANDALONE) - use_prebuilt_binary(llqtwebkit) - set(WEBKITLIBPLUGIN ON CACHE BOOL - "WEBKITLIBPLUGIN support for the llplugin/llmedia test apps.") -endif (STANDALONE) - -if (WINDOWS) - set(WEBKIT_PLUGIN_LIBRARIES - debug llqtwebkitd - debug QtWebKitd4 - debug QtOpenGLd4 - debug QtNetworkd4 - debug QtGuid4 - debug QtCored4 - debug qtmaind - optimized llqtwebkit - optimized QtWebKit4 - optimized QtOpenGL4 - optimized QtNetwork4 - optimized QtGui4 - optimized QtCore4 - optimized qtmain - ) -elseif (DARWIN) - set(WEBKIT_PLUGIN_LIBRARIES - debug libllqtwebkit.dylib - optimized libllqtwebkit.dylib - ) -elseif (LINUX) - if (STANDALONE) - set(WEBKIT_PLUGIN_LIBRARIES ${LLQTWEBKIT_LIBRARY} ${QT_LIBRARIES} ${QT_PLUGIN_LIBRARIES}) - else (STANDALONE) - set(WEBKIT_PLUGIN_LIBRARIES - llqtwebkit - QtWebKit - QtOpenGL - QtNetwork - QtGui - QtCore - crypto - ssl -# qgif -# qjpeg - jpeg - fontconfig - X11 - Xrender - Xext - GL - ) - if (CMAKE_SIZEOF_VOID_P EQUAL 4) # Singu TODO: update webkit - set(WEBKIT_PLUGIN_LIBRARIES ${WEBKIT_PLUGIN_LIBRARIES} jscore) - endif (CMAKE_SIZEOF_VOID_P EQUAL 4) - endif (STANDALONE) -endif (WINDOWS) diff --git a/indra/llmath/llcalcparser.h b/indra/llmath/llcalcparser.h index 19fec1776..0fbf358a1 100644 --- a/indra/llmath/llcalcparser.h +++ b/indra/llmath/llcalcparser.h @@ -34,19 +34,19 @@ // Add this in if we want boost math constants. #include - -#if defined(LL_WINDOWS) -#pragma warning(push) -// warning C4348: 'boost::spirit::terminal<...>::result_helper': redefinition of default parameter: parameter 3, 4 -#pragma warning(disable: 4348) + +#if defined(LL_WINDOWS) +#pragma warning(push) +// warning C4348: 'boost::spirit::terminal<...>::result_helper': redefinition of default parameter: parameter 3, 4 +#pragma warning(disable: 4348) #endif //#include #include #include -#if defined(LL_WINDOWS) -#pragma warning(pop) +#if defined(LL_WINDOWS) +#pragma warning(pop) #endif namespace expression { diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt index ba3efefbd..3c76f7a50 100644 --- a/indra/llplugin/CMakeLists.txt +++ b/indra/llplugin/CMakeLists.txt @@ -13,7 +13,6 @@ include_directories( ${LLMATH_INCLUDE_DIRS} ${LLMESSAGE_INCLUDE_DIRS} ${LLRENDER_INCLUDE_DIRS} - ${LLQTWEBKIT_INCLUDE_DIR} ) set(llplugin_SOURCE_FILES diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp index c5ff97ef7..75de5393f 100644 --- a/indra/llplugin/llpluginclassmedia.cpp +++ b/indra/llplugin/llpluginclassmedia.cpp @@ -1,4 +1,4 @@ -/** +/** * @file llpluginclassmedia.cpp * @brief LLPluginClassMedia handles a plugin which knows about the "media" message class. * @@ -6,21 +6,21 @@ * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ * @endcond @@ -41,7 +41,7 @@ static int nextPowerOf2( int value ) { next_power_of_2 <<= 1; } - + return next_power_of_2; } @@ -104,7 +104,7 @@ void LLPluginClassMedia::reset_impl(void) mMediaName.clear(); mMediaDescription.clear(); mBackgroundColor = LLColor4(1.0f, 1.0f, 1.0f, 1.0f); - + // media_browser class mNavigateURI.clear(); mNavigateResultCode = -1; @@ -112,13 +112,13 @@ void LLPluginClassMedia::reset_impl(void) mHistoryBackAvailable = false; mHistoryForwardAvailable = false; mStatusText.clear(); - mProgressPercent = 0; + mProgressPercent = 0; mClickURL.clear(); mClickNavType.clear(); mClickTarget.clear(); mClickUUID.clear(); mStatusCode = 0; - + // media_time class mCurrentTime = 0.0f; mDuration = 0.0f; @@ -144,7 +144,7 @@ void LLPluginClassMedia::idle_impl(void) else { mRequestedTextureWidth = mRequestedMediaWidth; - + if(mPadding > 1) { // Pad up to a multiple of the specified number of bytes per row @@ -154,7 +154,7 @@ void LLPluginClassMedia::idle_impl(void) { rowbytes += mPadding - pad; } - + if(rowbytes % mRequestedTextureDepth == 0) { mRequestedTextureWidth = rowbytes / mRequestedTextureDepth; @@ -166,7 +166,7 @@ void LLPluginClassMedia::idle_impl(void) } } - + // Size change has been requested but not initiated yet. size_t newsize = mRequestedTextureWidth * mRequestedTextureHeight * mRequestedTextureDepth; @@ -181,22 +181,22 @@ void LLPluginClassMedia::idle_impl(void) mPlugin->removeSharedMemory(mTextureSharedMemoryName); mTextureSharedMemoryName.clear(); } - + mTextureSharedMemorySize = newsize; mTextureSharedMemoryName = mPlugin->addSharedMemory(mTextureSharedMemorySize); if(!mTextureSharedMemoryName.empty()) { void *addr = mPlugin->getSharedMemoryAddress(mTextureSharedMemoryName); - + // clear texture memory to avoid random screen visual fuzz from uninitialized texture data memset( addr, 0x00, newsize ); - + // We could do this to force an update, but textureValid() will still be returning false until the first roundtrip to the plugin, // so it may not be worthwhile. // mDirtyRect.setOriginAndSize(0, 0, mRequestedMediaWidth, mRequestedMediaHeight); } } - + // This is our local indicator that a change is in progress. mTextureWidth = -1; mTextureHeight = -1; @@ -205,7 +205,7 @@ void LLPluginClassMedia::idle_impl(void) // This invalidates any existing dirty rect. resetDirty(); - + // Send a size change message to the plugin { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "size_change"); @@ -219,7 +219,7 @@ void LLPluginClassMedia::idle_impl(void) message.setValueReal("background_b", mBackgroundColor.mV[VZ]); message.setValueReal("background_a", mBackgroundColor.mV[VW]); mPlugin->sendMessage(message); // DO NOT just use sendMessage() here -- we want this to jump ahead of the queue. - + LL_DEBUGS("Plugin") << "Sending size_change" << LL_ENDL; } } @@ -278,11 +278,11 @@ void LLPluginClassMedia::setSizeInternal(void) mRequestedMediaWidth = mDefaultMediaWidth; mRequestedMediaHeight = mDefaultMediaHeight; } - + // Save these for size/interest calculations mFullMediaWidth = mRequestedMediaWidth; mFullMediaHeight = mRequestedMediaHeight; - + if(mAllowDownsample) { switch(mPriority) @@ -296,19 +296,19 @@ void LLPluginClassMedia::setSizeInternal(void) mRequestedMediaHeight /= 2; } break; - + default: // Don't adjust texture size break; } } - + if(mAutoScaleMedia) { mRequestedMediaWidth = nextPowerOf2(mRequestedMediaWidth); mRequestedMediaHeight = nextPowerOf2(mRequestedMediaHeight); } - + if(mRequestedMediaWidth > 2048) mRequestedMediaWidth = 2048; @@ -336,9 +336,9 @@ bool LLPluginClassMedia::textureValid(void) mRequestedMediaWidth != mMediaWidth || mRequestedMediaHeight != mMediaHeight || getBitsData() == NULL - ) + ) return false; - + return true; } @@ -362,8 +362,8 @@ void LLPluginClassMedia::resetDirty(void) std::string LLPluginClassMedia::translateModifiers(MASK modifiers) { std::string result; - - + + if(modifiers & MASK_CONTROL) { result += "control|"; @@ -386,7 +386,7 @@ std::string LLPluginClassMedia::translateModifiers(MASK modifiers) { result += "meta|"; } -*/ +*/ return result; } @@ -494,11 +494,11 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int // Don't spam unnecessary mouse move events. return; } - + mLastMouseX = x; mLastMouseY = y; } - + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "mouse_event"); std::string temp; switch(type) @@ -513,7 +513,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int message.setValueS32("button", button); message.setValueS32("x", x); - + // Incoming coordinates are OpenGL-style ((0,0) = lower left), so flip them here if the plugin has requested it. if(!mRequestedTextureCoordsOpenGL) { @@ -523,42 +523,42 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int message.setValueS32("y", y); message.setValue("modifiers", translateModifiers(modifiers)); - + sendMessage(message); } bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data) { bool result = true; - + // FIXME: // HACK: we don't have an easy way to tell if the plugin is going to handle a particular keycode. // For now, return false for the ones the webkit plugin won't handle properly. - + switch(key_code) { - case KEY_BACKSPACE: - case KEY_TAB: - case KEY_RETURN: - case KEY_PAD_RETURN: - case KEY_SHIFT: - case KEY_CONTROL: - case KEY_ALT: - case KEY_CAPSLOCK: - case KEY_ESCAPE: - case KEY_PAGE_UP: - case KEY_PAGE_DOWN: - case KEY_END: - case KEY_HOME: - case KEY_LEFT: - case KEY_UP: - case KEY_RIGHT: - case KEY_DOWN: - case KEY_INSERT: + case KEY_BACKSPACE: + case KEY_TAB: + case KEY_RETURN: + case KEY_PAD_RETURN: + case KEY_SHIFT: + case KEY_CONTROL: + case KEY_ALT: + case KEY_CAPSLOCK: + case KEY_ESCAPE: + case KEY_PAGE_UP: + case KEY_PAGE_DOWN: + case KEY_END: + case KEY_HOME: + case KEY_LEFT: + case KEY_UP: + case KEY_RIGHT: + case KEY_DOWN: + case KEY_INSERT: case KEY_DELETE: - // These will be handled + // These will be handled break; - + default: // regular ASCII characters will also be handled if(key_code >= KEY_SPECIAL) @@ -569,7 +569,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie break; } -#if LL_DARWIN +#if LL_DARWIN if(modifiers & MASK_ALT) { // Option-key modified characters should be handled by the unicode input path instead of this one. @@ -588,15 +588,15 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie case KEY_EVENT_REPEAT: temp = "repeat"; break; } message.setValue("event", temp); - + message.setValueS32("key", key_code); message.setValue("modifiers", translateModifiers(modifiers)); message.setValueLLSD("native_key_data", native_key_data); - + sendMessage(message); } - + return result; } @@ -607,10 +607,10 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers) message.setValueS32("x", x); message.setValueS32("y", y); message.setValue("modifiers", translateModifiers(modifiers)); - + sendMessage(message); } - + bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event"); @@ -618,18 +618,33 @@ bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD message.setValue("text", text); message.setValue("modifiers", translateModifiers(modifiers)); message.setValueLLSD("native_key_data", native_key_data); - + sendMessage(message); - + return true; } +void LLPluginClassMedia::setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path, bool httponly, bool secure) +{ + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_cookie"); + + message.setValue("uri", uri); + message.setValue("name", name); + message.setValue("value", value); + message.setValue("domain", domain); + message.setValue("path", path); + message.setValueBoolean("httponly", httponly); + message.setValueBoolean("secure", secure); + + sendMessage(message); +} + void LLPluginClassMedia::loadURI(const std::string &uri) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "load_uri"); message.setValue("uri", uri); - + sendMessage(message); } @@ -645,6 +660,7 @@ void LLPluginClassMedia::setLowPrioritySizeLimit(int size) if(mLowPrioritySizeLimit != power) { mLowPrioritySizeLimit = power; + // This may affect the calculated size, so recalculate it here. setSizeInternal(); } @@ -653,12 +669,12 @@ void LLPluginClassMedia::setLowPrioritySizeLimit(int size) F64 LLPluginClassMedia::getCPUUsage() { F64 result = 0.0f; - + if(mPlugin) { result = mPlugin->getCPUUsage(); } - + return result; } @@ -706,10 +722,12 @@ void LLPluginClassMedia::paste() sendMessage(message); } -void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path) +void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path_cache, const std::string &user_data_path_cookies, const std::string &user_data_path_logs) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_user_data_path"); - message.setValue("path", user_data_path); + message.setValue("cache_path", user_data_path_cache); + message.setValue("cookies_path", user_data_path_cookies); + message.setValue("logs_path", user_data_path_logs); sendMessage(message); } @@ -722,14 +740,14 @@ void LLPluginClassMedia::setLanguageCode(const std::string &language_code) void LLPluginClassMedia::setPluginsEnabled(const bool enabled) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "plugins_enabled"); + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "plugins_enabled"); message.setValueBoolean("enable", enabled); sendMessage(message); } void LLPluginClassMedia::setJavascriptEnabled(const bool enabled) { - LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "javascript_enabled"); + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "javascript_enabled"); message.setValueBoolean("enable", enabled); sendMessage(message); } @@ -746,7 +764,8 @@ void LLPluginClassMedia::setTarget(const std::string &target) { mTarget = target; } -/* virtual */ + +/* virtual */ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) { std::string message_class = message.getClass(); @@ -765,21 +784,21 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mRequestedTextureFormat = message.getValueU32("format"); mRequestedTextureType = message.getValueU32("type"); mRequestedTextureSwapBytes = message.getValueBoolean("swap_bytes"); - mRequestedTextureCoordsOpenGL = message.getValueBoolean("coords_opengl"); - + mRequestedTextureCoordsOpenGL = message.getValueBoolean("coords_opengl"); + // These two are optional, and will default to 0 if they're not specified. mDefaultMediaWidth = message.getValueS32("default_width"); mDefaultMediaHeight = message.getValueS32("default_height"); - + mAllowDownsample = message.getValueBoolean("allow_downsample"); mPadding = message.getValueS32("padding"); setSizeInternal(); - + mTextureParamsReceived = true; } else if(message_name == "updated") - { + { if(message.hasValue("left")) { LLRect newDirtyRect; @@ -787,7 +806,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) newDirtyRect.mTop = message.getValueS32("top"); newDirtyRect.mRight = message.getValueS32("right"); newDirtyRect.mBottom = message.getValueS32("bottom"); - + // The plugin is likely to have top and bottom switched, due to vertical flip and OpenGL coordinate confusion. // If they're backwards, swap them. if(newDirtyRect.mTop < newDirtyRect.mBottom) @@ -796,7 +815,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) newDirtyRect.mTop = newDirtyRect.mBottom; newDirtyRect.mBottom = temp; } - + if(mDirtyRect.isEmpty()) { mDirtyRect = newDirtyRect; @@ -816,10 +835,10 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) << mDirtyRect.mRight << ", " << mDirtyRect.mBottom << ")" << LL_ENDL; - + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CONTENT_UPDATED); - } - + } + bool time_duration_updated = false; int previous_percent = mProgressPercent; @@ -839,7 +858,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) { mCurrentRate = message.getValueReal("current_rate"); } - + if(message.hasValue("loaded_duration")) { mLoadedDuration = message.getValueReal("loaded_duration"); @@ -850,7 +869,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) // If the message doesn't contain a loaded_duration param, assume it's equal to duration mLoadedDuration = mDuration; } - + // Calculate a percentage based on the loaded duration and total duration. if(mDuration != 0.0f) // Don't divide by zero. { @@ -861,7 +880,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) { mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_TIME_DURATION_UPDATED); } - + if(previous_percent != mProgressPercent) { mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PROGRESS_UPDATED); @@ -870,9 +889,9 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) else if(message_name == "media_status") { std::string status = message.getValue("status"); - + LL_DEBUGS("Plugin") << "Status changed to: " << status << LL_ENDL; - + if(status == "loading") { mStatus = LLPluginClassMediaOwner::MEDIA_LOADING; @@ -912,24 +931,24 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) // TODO: check that name matches? mNaturalMediaWidth = width; mNaturalMediaHeight = height; - + setSizeInternal(); } else if(message_name == "size_change_response") { std::string name = message.getValue("name"); - + // TODO: check that name matches? - + mTextureWidth = message.getValueS32("texture_width"); mTextureHeight = message.getValueS32("texture_height"); mMediaWidth = message.getValueS32("width"); mMediaHeight = message.getValueS32("height"); - + // This invalidates any existing dirty rect. resetDirty(); - - // TODO: should we verify that the plugin sent back the right values? + + // TODO: should we verify that the plugin sent back the right values? // Two size changes in a row may cause them to not match, due to queueing, etc. mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_SIZE_CHANGED); @@ -969,7 +988,12 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mAuthURL = message.getValue("url"); mAuthRealm = message.getValue("realm"); mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_AUTH_REQUEST); - } + } + else if (message_name == "file_download") + { + mFileDownloadFilename = message.getValue("filename"); + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_FILE_DOWNLOAD); + } else if(message_name == "debug_message") { mDebugMessageText = message.getValue("message_text"); @@ -996,7 +1020,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mNavigateResultString = message.getValue("result_string"); mHistoryBackAvailable = message.getValueBoolean("history_back_available"); mHistoryForwardAvailable = message.getValueBoolean("history_forward_available"); - + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE); } else if(message_name == "progress") @@ -1051,7 +1075,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mGeometryY = message.getValueS32("y"); mGeometryWidth = message.getValueS32("width"); mGeometryHeight = message.getValueS32("height"); - + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_GEOMETRY_CHANGE); } else if(message_name == "link_hovered") @@ -1060,7 +1084,7 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) mHoverLink = message.getValue("link"); mHoverText = message.getValue("title"); // message.getValue("text"); - + mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_LINK_HOVERED); } else @@ -1076,20 +1100,21 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message) // if(message_name == "message_name") // { // } -// else +// else { LL_WARNS("Plugin") << "Unknown " << message_class << " class message: " << message_name << LL_ENDL; } } + } -/* virtual */ +/* virtual */ void LLPluginClassMedia::pluginLaunchFailed() { mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED_LAUNCH); } -/* virtual */ +/* virtual */ void LLPluginClassMedia::pluginDied() { mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_PLUGIN_FAILED); @@ -1116,7 +1141,7 @@ void LLPluginClassMedia::focus(bool focused) LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "focus"); message.setValueBoolean("focused", focused); - + sendMessage(message); } @@ -1143,7 +1168,7 @@ void LLPluginClassMedia::clear_cookies() void LLPluginClassMedia::set_cookies(const std::string &cookies) { LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies"); - message.setValue("cookies", cookies); + message.setValue("cookies", cookies); sendMessage(message); } @@ -1176,7 +1201,7 @@ void LLPluginClassMedia::browse_reload(bool ignore_cache) LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "browse_reload"); message.setValueBoolean("ignore_cache", ignore_cache); - + sendMessage(message); } @@ -1300,7 +1325,7 @@ void LLPluginClassMedia::seek(float time) LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "seek"); message.setValueReal("time", time); - + sendMessage(message); } @@ -1318,11 +1343,11 @@ void LLPluginClassMedia::setVolume(float volume) if(volume != mRequestedVolume) { mRequestedVolume = volume; - + LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME, "set_volume"); message.setValueReal("volume", volume); - + sendMessage(message); } } @@ -1341,4 +1366,3 @@ void LLPluginClassMedia::initializeUrlHistory(const LLSD& url_history) LL_DEBUGS("Plugin") << "Sending history" << LL_ENDL; } - diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h index 8e7a40a67..c2b993488 100644 --- a/indra/llplugin/llpluginclassmedia.h +++ b/indra/llplugin/llpluginclassmedia.h @@ -122,6 +122,8 @@ public: // Text may be unicode (utf8 encoded) bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data); + void setCookie(std::string uri, std::string name, std::string value, std::string domain, std::string path, bool httponly, bool secure); + void loadURI(const std::string &uri); // Inherited from LLPluginProcessParentOwner @@ -154,7 +156,7 @@ public: bool canPaste() const { return mCanPaste; }; // These can be called before init(), and they will be queued and sent before the media init message. - void setUserDataPath(const std::string &user_data_path); + void setUserDataPath(const std::string &user_data_path_cache, const std::string &user_data_path_cookies, const std::string &user_data_path_logs); void setLanguageCode(const std::string &language_code); void setPluginsEnabled(const bool enabled); void setJavascriptEnabled(const bool enabled); @@ -234,6 +236,10 @@ public: std::string getHoverText() const { return mHoverText; }; std::string getHoverLink() const { return mHoverLink; }; + // these are valid during MEDIA_EVENT_LINK_HOVERED + std::string getFileDownloadFilename() const { return mFileDownloadFilename; } + + const std::string& getMediaName() const { return mMediaName; }; std::string getMediaDescription() const { return mMediaDescription; }; @@ -373,6 +379,7 @@ protected: std::string mAuthRealm; std::string mHoverText; std::string mHoverLink; + std::string mFileDownloadFilename; ///////////////////////////////////////// // media_time class diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h index 4a739cf86..391c23d88 100644 --- a/indra/llplugin/llpluginclassmediaowner.h +++ b/indra/llplugin/llpluginclassmediaowner.h @@ -3,33 +3,26 @@ * @brief LLPluginClassMedia handles interaction with a plugin which knows about the "media" message class. * * @cond - * $LicenseInfo:firstyear=2008&license=viewergpl$ - * - * Copyright (c) 2008-2010, Linden Research, Inc. - * + * $LicenseInfo:firstyear=2008&license=viewerlgpl$ * Second Life Viewer Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in doc/GPL-license.txt in this distribution, or - * online at http://secondlife.com/developers/opensource/gplv2 + * Copyright (C) 2010, Linden Research, Inc. * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file doc/FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlife.com/developers/opensource/flossexception + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ - * * @endcond */ @@ -71,6 +64,8 @@ public: MEDIA_EVENT_AUTH_REQUEST, // The plugin wants to display an auth dialog + MEDIA_EVENT_FILE_DOWNLOAD, // the plugin wants to download a file + MEDIA_EVENT_DEBUG_MESSAGE, // plugin sending back debug information for host to process MEDIA_EVENT_LINK_HOVERED // Got a "link hovered" event from the plugin diff --git a/indra/llqtwebkit/CMakeLists.txt b/indra/llqtwebkit/CMakeLists.txt deleted file mode 100644 index 6fbf5e960..000000000 --- a/indra/llqtwebkit/CMakeLists.txt +++ /dev/null @@ -1,70 +0,0 @@ -# -*- cmake -*- - -project(llqtwebkit) - -include(00-Common) -include(Qt4) - -if(NOT WORD_SIZE EQUAL 32) - if(WINDOWS) - add_definitions(/FIXED:NO) - else(WINDOWS) - add_definitions(-fPIC) - endif(WINDOWS) -endif(NOT WORD_SIZE EQUAL 32) - -include_directories(${QT_INCLUDES}) - -add_subdirectory(qtwebkit_cookiejar) -include_directories(qtwebkit_cookiejar/src/) - -set(llqtwebkit_SOURCE_FILES - llembeddedbrowser.cpp - llembeddedbrowserwindow.cpp - lljsobject.cpp - llnetworkaccessmanager.cpp - llqtwebkit.cpp - llstyle.cpp - llwebpage.cpp - llwebpageopenshim.cpp - ) - -set(llqtwebkit_HEADER_FILES - llembeddedbrowser.h - llembeddedbrowser_p.h - llembeddedbrowserwindow.h - llembeddedbrowserwindow_p.h - lljsobject.h - llnetworkaccessmanager.h - llqtwebkit.h - llstyle.h - llwebpage.h - llwebpageopenshim.h - pstdint.h - ) - -set(llqtwebkit_UI_FILES - passworddialog.ui - ) - -set(llqtwebkit_LINK_LIBRARIES - networkcookiejar -) - -QT4_WRAP_UI(llqtwebkit_UI_MOC ${llqtwebkit_UI_FILES}) -QT4_WRAP_CPP(llqtwebkit_HEADERS_MOC ${llqtwebkit_HEADER_FILES}) -include_directories(${CMAKE_CURRENT_BINARY_DIR}) - -add_library(llqtwebkit - ${llqtwebkit_SOURCE_FILES} - ${llqtwebkit_HEADERS_MOC} - ${llqtwebkit_UI_MOC} -) - -add_dependencies(llqtwebkit prepare) - -target_link_libraries(llqtwebkit ${llqtwebkit_LINK_LIBRARIES}) - -add_dependencies(llqtwebkit - networkcookiejar -) diff --git a/indra/llqtwebkit/autotests/llembeddedbrowser/llembeddedbrowser.pro b/indra/llqtwebkit/autotests/llembeddedbrowser/llembeddedbrowser.pro deleted file mode 100644 index 02ecce5a2..000000000 --- a/indra/llqtwebkit/autotests/llembeddedbrowser/llembeddedbrowser.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . - -CONFIG += qtestlib -QT += webkit opengl network - -include(../../llmozlib2.pri) -DEFINES += AUTOTEST - -# Input -SOURCES += tst_llembeddedbrowser.cpp - diff --git a/indra/llqtwebkit/autotests/llembeddedbrowser/tst_llembeddedbrowser.cpp b/indra/llqtwebkit/autotests/llembeddedbrowser/tst_llembeddedbrowser.cpp deleted file mode 100644 index a59cc9e19..000000000 --- a/indra/llqtwebkit/autotests/llembeddedbrowser/tst_llembeddedbrowser.cpp +++ /dev/null @@ -1,400 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include -#include - -class tst_LLEmbeddedBrowser : public QObject -{ - Q_OBJECT - -public slots: - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: - void llembeddedbrowser_data(); - void llembeddedbrowser(); - - void clearAllCookies(); - void clearCache_data(); - void clearCache(); - void clearLastError_data(); - void clearLastError(); - void createBrowserWindow_data(); - void createBrowserWindow(); - void destroyBrowserWindow(); - void enableCookies_data(); - void enableCookies(); - void enablePlugins_data(); - void enablePlugins(); - void enableProxy_data(); - void enableProxy(); - void getGREVersion_data(); - void getGREVersion(); - void getInstance(); - void getLastError_data(); - void getLastError(); - void initBrowser_data(); - void initBrowser(); //change function init as initbrowser - void reset(); - void setBrowserAgentId_data(); - void setBrowserAgentId(); - void setLastError_data(); - void setLastError(); -}; - -// Subclass that exposes the protected functions. -class SubLLEmbeddedBrowser : public LLEmbeddedBrowser -{ -public: - -}; - -// This will be called before the first test function is executed. -// It is only called once. -void tst_LLEmbeddedBrowser::initTestCase() -{ -} - -// This will be called after the last test function is executed. -// It is only called once. -void tst_LLEmbeddedBrowser::cleanupTestCase() -{ -} - -// This will be called before each test function is executed. -void tst_LLEmbeddedBrowser::init() -{ -} - -// This will be called after every test function. -void tst_LLEmbeddedBrowser::cleanup() -{ -} - -void tst_LLEmbeddedBrowser::llembeddedbrowser_data() -{ -} - -void tst_LLEmbeddedBrowser::llembeddedbrowser() -{ - SubLLEmbeddedBrowser browser; - QCOMPARE(browser.clearAllCookies(), false); - QCOMPARE(browser.clearCache(), false); - browser.clearLastError(); - QCOMPARE(browser.enableCookies(false), false); - QCOMPARE(browser.enablePlugins(false), true); - QCOMPARE(browser.enableProxy(false, std::string(""), -1), true); - QCOMPARE(browser.getGREVersion(), std::string(QT_VERSION_STR)); - QVERIFY(browser.getInstance() != NULL); - QCOMPARE(browser.getLastError(), 0); - browser.setBrowserAgentId("uBrowser"); - browser.setLastError(-1); - QCOMPARE(browser.reset(), true); - browser.destroyBrowserWindow(0); - browser.destroyBrowserWindow((LLEmbeddedBrowserWindow*)6); - QCOMPARE(browser.getWindowCount(), 0); - QCOMPARE(browser.init(std::string(""),std::string(""),std::string(""),0), true); -} - -// public bool clearAllCookies() -void tst_LLEmbeddedBrowser::clearAllCookies() -{ - SubLLEmbeddedBrowser browser; - - QCOMPARE(browser.clearAllCookies(), false); - browser.reset(); - QCOMPARE(browser.clearAllCookies(), true); -} - -void tst_LLEmbeddedBrowser::clearCache_data() -{ - QTest::addColumn("clearCache"); -#if QT_VERSION < 0x040500 - QTest::newRow("QTVersion < 4.5") << false; -#else - QTest::newRow("QTVersion > 4.5") << true; -#endif -} - -// public bool clearCache() -void tst_LLEmbeddedBrowser::clearCache() -{ - QFETCH(bool, clearCache); - - SubLLEmbeddedBrowser browser; - browser.reset(); - QCOMPARE(browser.clearCache(), clearCache); -} - -void tst_LLEmbeddedBrowser::clearLastError_data() -{ - QTest::addColumn("lastError"); - QTest::newRow("1") << 1; -} - -// public void clearLastError() -void tst_LLEmbeddedBrowser::clearLastError() -{ - SubLLEmbeddedBrowser browser; - QFETCH(int, lastError); - - browser.setLastError(lastError); - browser.clearLastError(); - QCOMPARE(browser.getLastError(), 0); -} - -void tst_LLEmbeddedBrowser::createBrowserWindow_data() -{ - QTest::addColumn("width"); - QTest::addColumn("height"); - QTest::newRow("0,0") << 0 << 0; - QTest::newRow("800,600") << 800 << 600; -} - -// public LLEmbeddedBrowserWindow* createBrowserWindow(int width, int height) -void tst_LLEmbeddedBrowser::createBrowserWindow() -{ - QFETCH(int, width); - QFETCH(int, height); - SubLLEmbeddedBrowser browser; - - LLEmbeddedBrowserWindow *window = browser.createBrowserWindow(width, height); - QVERIFY(window); - QCOMPARE(browser.getLastError(), 0); - QCOMPARE(browser.getWindowCount(), 1); - QCOMPARE(window->getBrowserWidth(), (int16_t)width); - QCOMPARE(window->getBrowserHeight(), (int16_t)height); -} - -// public bool destroyBrowserWindow(LLEmbeddedBrowserWindow* browser_window) -void tst_LLEmbeddedBrowser::destroyBrowserWindow() -{ - SubLLEmbeddedBrowser browser; - browser.reset(); - LLEmbeddedBrowserWindow* browser_window = browser.createBrowserWindow(200, 100); - if (browser_window) - { - QCOMPARE(browser.getWindowCount(), 1); - browser.destroyBrowserWindow(browser_window); - QCOMPARE(browser.getLastError(), 0); - QCOMPARE(browser.getWindowCount(), 0); - } - - browser_window = browser.createBrowserWindow(800, 600); - if (browser_window) - { - QCOMPARE(browser.getWindowCount(), 1); - browser.destroyBrowserWindow(browser_window); - QCOMPARE(browser.getLastError(), 0); - QCOMPARE(browser.getWindowCount(), 0); - } -} - -void tst_LLEmbeddedBrowser::enableCookies_data() -{ - QTest::addColumn("enabled"); - QTest::addColumn("enableCookies"); - QTest::newRow("disable") << false << false; - QTest::newRow("enable") << true << false; -} - -// public bool enableCookies(bool enabled) -void tst_LLEmbeddedBrowser::enableCookies() -{ - QFETCH(bool, enabled); - QFETCH(bool, enableCookies); - - SubLLEmbeddedBrowser browser; - browser.reset(); - QCOMPARE(browser.enableCookies(enabled), enableCookies); - // TODO check that cookies are not saved -} - -void tst_LLEmbeddedBrowser::enablePlugins_data() -{ - QTest::addColumn("enabled"); - QTest::addColumn("enablePlugins"); - QTest::newRow("disable") << false << true; - QTest::newRow("enable") << true << true; -} - -// public bool enablePlugins(bool enabled) -void tst_LLEmbeddedBrowser::enablePlugins() -{ - QFETCH(bool, enabled); - QFETCH(bool, enablePlugins); - - SubLLEmbeddedBrowser browser; - browser.reset(); - QCOMPARE(browser.enablePlugins(enabled), enablePlugins); - // TODO check that plugins work/do not work -} - -Q_DECLARE_METATYPE(std::string) -void tst_LLEmbeddedBrowser::enableProxy_data() -{ - QTest::addColumn("enabled"); - QTest::addColumn("host_name"); - QTest::addColumn("port"); - QTest::addColumn("enableProxy"); - QTest::newRow("null") << false << std::string() << 0 << true; - QTest::newRow("valid") << true << std::string("wtfsurf.com") << 80 << true; -} - -// public bool enableProxy(bool enabled, std::string host_name, int port) -void tst_LLEmbeddedBrowser::enableProxy() -{ - QFETCH(bool, enabled); - QFETCH(std::string, host_name); - QFETCH(int, port); - QFETCH(bool, enableProxy); - - SubLLEmbeddedBrowser browser; - browser.reset(); - QCOMPARE(browser.enableProxy(enabled, host_name, port), enableProxy); - // TODO need some proxy servers to test this -} - -void tst_LLEmbeddedBrowser::getGREVersion_data() -{ - QTest::addColumn("getGREVersion"); - QTest::newRow("valid") << std::string(QT_VERSION_STR); -} - -// public std::string getGREVersion() -void tst_LLEmbeddedBrowser::getGREVersion() -{ - QFETCH(std::string, getGREVersion); - - SubLLEmbeddedBrowser browser; - browser.reset(); - QCOMPARE(browser.getGREVersion(), getGREVersion); -} - -// public static LLEmbeddedBrowser* getInstance() -void tst_LLEmbeddedBrowser::getInstance() -{ - SubLLEmbeddedBrowser browser; - QVERIFY(browser.getInstance() != NULL); -} - -void tst_LLEmbeddedBrowser::getLastError_data() -{ - QTest::addColumn("error"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; - QTest::newRow("100") << 100; -} - -// public int getLastError() -void tst_LLEmbeddedBrowser::getLastError() -{ - QFETCH(int, error); - SubLLEmbeddedBrowser browser; - browser.setLastError(error); - QCOMPARE(browser.getLastError(), error); -} - -void tst_LLEmbeddedBrowser::initBrowser_data() -{ - QTest::addColumn("application_directory"); - QTest::addColumn("component_directory"); - QTest::addColumn("profile_directory"); - QTest::addColumn("native_window_handleCount"); - QTest::addColumn("init"); - QTest::newRow("null") << std::string() << std::string() << std::string() << (void *)0 << true; - QTest::newRow("valid") << std::string("/home/crystal/Settings/") << std::string() << std::string() << (void *)0 << true; -} -void tst_LLEmbeddedBrowser::initBrowser() -{ - QFETCH(std::string, application_directory); - QFETCH(std::string, component_directory); - QFETCH(std::string, profile_directory); - QFETCH(void *, native_window_handleCount); - SubLLEmbeddedBrowser browser; - browser.init(application_directory,component_directory,profile_directory,native_window_handleCount); - QCOMPARE(browser.getLastError(), 0); -} - -// public bool reset() -void tst_LLEmbeddedBrowser::reset() -{ - SubLLEmbeddedBrowser browser; - - browser.setLastError(100); - QCOMPARE(browser.getLastError(), 100); - QVERIFY(browser.reset()); - QCOMPARE(browser.getLastError(), 0); - // TODO what should reset really do? -} - -void tst_LLEmbeddedBrowser::setBrowserAgentId_data() -{ - QTest::addColumn("id"); - QTest::newRow("null") << std::string(); - QTest::newRow("valid") << std::string("uBrowser"); - -} - -// public void setBrowserAgentId(std::string id) -void tst_LLEmbeddedBrowser::setBrowserAgentId() -{ - QFETCH(std::string, id); - - SubLLEmbeddedBrowser browser; - browser.reset(); - browser.setBrowserAgentId(id); - LLEmbeddedBrowserWindow *window = browser.createBrowserWindow(0, 0); - Q_UNUSED(window); - // TODO confirm that the page is actually sending the agent ID -} - -void tst_LLEmbeddedBrowser::setLastError_data() -{ - QTest::addColumn("error_number"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; - QTest::newRow("100") << 100; -} - -// public void setLastError(int error_number) -void tst_LLEmbeddedBrowser::setLastError() -{ - QFETCH(int, error_number); - - SubLLEmbeddedBrowser browser; - - browser.setLastError(error_number); - QCOMPARE(browser.getLastError(), error_number); -} - -QTEST_MAIN(tst_LLEmbeddedBrowser) -#include "tst_llembeddedbrowser.moc" - diff --git a/indra/llqtwebkit/autotests/llembeddedbrowserwindow/llembeddedbrowserwindow.pro b/indra/llqtwebkit/autotests/llembeddedbrowserwindow/llembeddedbrowserwindow.pro deleted file mode 100644 index a89f50065..000000000 --- a/indra/llqtwebkit/autotests/llembeddedbrowserwindow/llembeddedbrowserwindow.pro +++ /dev/null @@ -1,14 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . - -CONFIG += qtestlib -QT += webkit opengl network - -include(../../llmozlib2.pri) -DEFINES += AUTOTEST - -# Input -SOURCES += tst_llembeddedbrowserwindow.cpp - diff --git a/indra/llqtwebkit/autotests/llembeddedbrowserwindow/tst_llembeddedbrowserwindow.cpp b/indra/llqtwebkit/autotests/llembeddedbrowserwindow/tst_llembeddedbrowserwindow.cpp deleted file mode 100644 index 4c365d371..000000000 --- a/indra/llqtwebkit/autotests/llembeddedbrowserwindow/tst_llembeddedbrowserwindow.cpp +++ /dev/null @@ -1,1027 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include - -#include "llembeddedbrowserwindow.h" -#include "llembeddedbrowser.h" - -#ifndef QTRY_COMPARE - -#define __TRY_TIMEOUT__ 10000 -#define __TRY_STEP__ 50 - -#define __QTRY(__expression__, __functionToCall__) \ - do { \ - int __i = 0; \ - while (!(__expression__) && __i < __TRY_TIMEOUT__) { \ - QTest::qWait(__TRY_STEP__); \ - __i += __TRY_STEP__; \ - } \ - __functionToCall__; \ - } while(0) - -#define QTRY_COMPARE(__expression__, __expected__) \ - __QTRY((__expression__ == __expected__), QCOMPARE(__expression__, __expected__)); - -#define QTRY_VERIFY(__expression__) \ - __QTRY(__expression__, QVERIFY(__expression__)); - -#endif // QTRY_COMPARE - -class tst_LLEmbeddedBrowserWindow : public QObject -{ - Q_OBJECT - -public slots: - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: - void llembeddedbrowserwindow_data(); - void llembeddedbrowserwindow(); - - void addObserver_data(); - void addObserver(); - void canNavigateBack_data(); - void canNavigateBack(); - void canNavigateForward_data(); - void canNavigateForward(); - void evaluateJavascript_data(); - void evaluateJavascript(); - void flipWindow_data(); - void flipWindow(); - void focusBrowser_data(); - void focusBrowser(); - void getBrowserDepth_data(); - void getBrowserDepth(); - void getBrowserHeight_data(); - void getBrowserHeight(); - void getBrowserRowSpan_data(); - void getBrowserRowSpan(); - void getBrowserWidth_data(); - void getBrowserWidth(); - void getClickLinkHref_data(); - void getClickLinkHref(); - void getClickLinkTarget_data(); - void getClickLinkTarget(); - void getCurrentUri_data(); - void getCurrentUri(); - void getNoFollowScheme_data(); - void getNoFollowScheme(); - void getPageBuffer_data(); - void getPageBuffer(); - void getPercentComplete_data(); - void getPercentComplete(); - void getStatusMsg_data(); - void getStatusMsg(); - void getWindowId_data(); - void getWindowId(); - void grabWindow_data(); - void grabWindow(); - void keyPress_data(); - void keyPress(); - void mouseDown_data(); - void mouseDown(); - void mouseLeftDoubleClick_data(); - void mouseLeftDoubleClick(); - void mouseMove_data(); - void mouseMove(); - void mouseUp_data(); - void mouseUp(); - void navigateBack_data(); - void navigateBack(); - void navigateForward_data(); - void navigateForward(); - void navigateReload_data(); - void navigateReload(); - void navigateStop_data(); - void navigateStop(); - void navigateTo_data(); - void navigateTo(); - void remObserver_data(); - void remObserver(); - void scrollByLines_data(); - void scrollByLines(); - void setBackgroundColor_data(); - void setBackgroundColor(); - void setCaretColor_data(); - void setCaretColor(); - void setEnabled_data(); - void setEnabled(); - void setNoFollowScheme_data(); - void setNoFollowScheme(); - void setParent_data(); - void setParent(); - void setSize_data(); - void setSize(); - void setWindowId_data(); - void setWindowId(); - void unicodeInput_data(); - void unicodeInput(); -}; - -// Subclass that exposes the protected functions. -class SubLLEmbeddedBrowserWindow : public LLEmbeddedBrowserWindow -{ -public: - -}; - -// This will be called before the first test function is executed. -// It is only called once. -void tst_LLEmbeddedBrowserWindow::initTestCase() -{ -} - -// This will be called after the last test function is executed. -// It is only called once. -void tst_LLEmbeddedBrowserWindow::cleanupTestCase() -{ -} - -// This will be called before each test function is executed. -void tst_LLEmbeddedBrowserWindow::init() -{ -} - -// This will be called after every test function. -void tst_LLEmbeddedBrowserWindow::cleanup() -{ -} - -void tst_LLEmbeddedBrowserWindow::llembeddedbrowserwindow_data() -{ -} - -void tst_LLEmbeddedBrowserWindow::llembeddedbrowserwindow() -{ - SubLLEmbeddedBrowserWindow window; - QCOMPARE(window.addObserver((LLEmbeddedBrowserWindowObserver*)0), false); - QCOMPARE(window.canNavigateBack(), false); - QCOMPARE(window.canNavigateForward(), false); - QCOMPARE(window.evaluateJavascript(std::string()), std::string()); - QCOMPARE(window.flipWindow(false), true); - window.focusBrowser(false); - QCOMPARE(window.getBrowserDepth(), (int16_t)4); - QCOMPARE(window.getBrowserHeight(), (int16_t)0); - QCOMPARE(window.getBrowserRowSpan(), (int32_t)0); - QCOMPARE(window.getBrowserWidth(), (int16_t)0); - QCOMPARE(window.getClickLinkHref(), std::string()); - QCOMPARE(window.getClickLinkTarget(), std::string()); - QCOMPARE(window.getCurrentUri(), std::string()); - QCOMPARE(window.getNoFollowScheme(), std::string("secondlife")); - QCOMPARE(window.getPageBuffer(), (unsigned char*)0); - QCOMPARE(window.getPercentComplete(), (int16_t)0); - QCOMPARE(window.getStatusMsg(), std::string()); - QCOMPARE(window.getWindowId(), -1); - QCOMPARE(window.grabWindow(-1, -1, -1, -1), (unsigned char*)0); - window.keyPress(0); - window.mouseDown(0, 0); - window.mouseLeftDoubleClick(0, 0); - window.mouseMove(0, 0); - window.mouseUp(0, 0); - window.navigateBack(); - window.navigateForward(); - window.navigateReload(); - window.navigateStop(); - QCOMPARE(window.navigateTo(std::string()), true); - QCOMPARE(window.remObserver((LLEmbeddedBrowserWindowObserver*)0), false); - window.scrollByLines(0); - window.setBackgroundColor(0, 0, 0); - window.setCaretColor(0, 0, 0); - window.setEnabled(false); - window.setNoFollowScheme(std::string()); - window.setParent((LLEmbeddedBrowser*)0); - QCOMPARE(window.setSize(0, 0), true); - window.setWindowId(-1); - window.unicodeInput((uint32_t)0); -} - -void tst_LLEmbeddedBrowserWindow::addObserver_data() -{ -#if 0 - QTest::addColumn("observerCount"); - QTest::addColumn("addObserver"); - QTest::newRow("null") << 0 << false; -#endif -} - -// public bool addObserver(LLEmbeddedBrowserWindowObserver* observer) -void tst_LLEmbeddedBrowserWindow::addObserver() -{ -#if 0 - QFETCH(int, observerCount); - QFETCH(bool, addObserver); - - SubLLEmbeddedBrowserWindow window; - - QCOMPARE(window.addObserver(observer), addObserver); -#endif - QSKIP("Test is same with remObserver.", SkipAll); -} - -void tst_LLEmbeddedBrowserWindow::canNavigateBack_data() -{ -#if 0 - QTest::addColumn("canNavigateBack"); - QTest::newRow("true") << true; - QTest::newRow("false") << false; -#endif -} - -// public bool canNavigateBack() -void tst_LLEmbeddedBrowserWindow::canNavigateBack() -{ - //QFETCH(bool, canNavigateForward); - - SubLLEmbeddedBrowserWindow window; - window.setSize(800,600); - window.setParent(new LLEmbeddedBrowser()); - QCOMPARE(window.canNavigateForward(), false); - window.navigateTo(std::string("http://www.google.com")); - QTest::qWait(__TRY_TIMEOUT__); - QCOMPARE(window.canNavigateBack(), false); - window.navigateTo(std::string("http://www.cnn.com")); - QTest::qWait(__TRY_TIMEOUT__); - QCOMPARE(window.canNavigateBack(), true); - window.navigateBack(); - QTRY_COMPARE(window.canNavigateForward(), true); - window.navigateForward(); - QTRY_COMPARE(window.canNavigateBack(), true); -} - -void tst_LLEmbeddedBrowserWindow::canNavigateForward_data() -{ -#if 0 - QTest::addColumn("canNavigateForward"); - QTest::newRow("true") << true; - QTest::newRow("false") << false; -#endif -} - -// public bool canNavigateForward() -void tst_LLEmbeddedBrowserWindow::canNavigateForward() -{ - QSKIP("Test is same with canNavigateBack().", SkipAll); -} - -Q_DECLARE_METATYPE(std::string) -void tst_LLEmbeddedBrowserWindow::evaluateJavascript_data() -{ - QTest::addColumn("script"); - QTest::addColumn("evaluateJavascript"); - QTest::newRow("null") << std::string() << std::string(); - //QTest::newRow("valid") << std::string("alert(\"hey!\")") << std::string("alert(\"hey!\")"); -} - -// public std::string evaluateJavascript(std::string script) -void tst_LLEmbeddedBrowserWindow::evaluateJavascript() -{ - QFETCH(std::string, script); - QFETCH(std::string, evaluateJavascript); - - SubLLEmbeddedBrowserWindow window; - - window.evaluateJavascript(script); -} - -void tst_LLEmbeddedBrowserWindow::flipWindow_data() -{ - QTest::addColumn("flip"); - QTest::addColumn("flipWindow"); - QTest::newRow("false") << false << true; - QTest::newRow("true") << true << true; -} - -// public bool flipWindow(bool flip) -void tst_LLEmbeddedBrowserWindow::flipWindow() -{ - QFETCH(bool, flip); - QFETCH(bool, flipWindow); - - SubLLEmbeddedBrowserWindow window; - - QCOMPARE(window.flipWindow(flip), flipWindow); -} - -void tst_LLEmbeddedBrowserWindow::focusBrowser_data() -{ - QTest::addColumn("focus_browser"); - QTest::newRow("true") << true; - QTest::newRow("false") << false; -} - -// public void focusBrowser(bool focus_browser) -void tst_LLEmbeddedBrowserWindow::focusBrowser() -{ - QFETCH(bool, focus_browser); - - SubLLEmbeddedBrowserWindow window; - window.focusBrowser(focus_browser); -} - -Q_DECLARE_METATYPE(int16_t) -void tst_LLEmbeddedBrowserWindow::getBrowserDepth_data() -{ -#if 0 - QTest::addColumn("getBrowserDepth"); - QTest::newRow("null") << int16_t(); -#endif -} - -// public int16_t getBrowserDepth() -void tst_LLEmbeddedBrowserWindow::getBrowserDepth() -{ - //QFETCH(int16_t, getBrowserDepth); - - SubLLEmbeddedBrowserWindow window; - - QCOMPARE(window.getBrowserDepth(), int16_t(4)); -} - -void tst_LLEmbeddedBrowserWindow::getBrowserHeight_data() -{ -#if 0 - QTest::addColumn("getBrowserHeight"); - QTest::newRow("null") << int16_t(); -#endif -} - -// public int16_t getBrowserHeight() -void tst_LLEmbeddedBrowserWindow::getBrowserHeight() -{ -#if 0 - QFETCH(int16_t, getBrowserHeight); - - SubLLEmbeddedBrowserWindow window; - - QCOMPARE(window.getBrowserHeight(), getBrowserHeight); -#endif - QSKIP("Test is same with setSize().", SkipAll); -} - -Q_DECLARE_METATYPE(int32_t) -void tst_LLEmbeddedBrowserWindow::getBrowserRowSpan_data() -{ -#if 0 - QTest::addColumn("getBrowserRowSpan"); - QTest::newRow("null") << int32_t(); -#endif -} - -// public int32_t getBrowserRowSpan() -void tst_LLEmbeddedBrowserWindow::getBrowserRowSpan() -{ -#if 0 - SubLLEmbeddedBrowserWindow window; - window.setSize(0, 0); - - QCOMPARE(window.getBrowserWidth(), int16_t(0)); - QCOMPARE(window.getBrowserRowSpan(), int32_t(0)); - window.setSize(100, 100); - - QCOMPARE(window.getBrowserWidth(), int16_t(100)); - QCOMPARE(window.getBrowserRowSpan(), int32_t(400)); -#endif - QSKIP("Test is same with setSize().", SkipAll); -} - -void tst_LLEmbeddedBrowserWindow::getBrowserWidth_data() -{ -#if 0 - QTest::addColumn("getBrowserWidth"); - QTest::newRow("null") << int16_t(); -#endif -} - -// public int16_t getBrowserWidth() -void tst_LLEmbeddedBrowserWindow::getBrowserWidth() -{ -#if 0 - //QFETCH(int16_t, getBrowserWidth); - - SubLLEmbeddedBrowserWindow window; - window.setSize(0, 0); - - QCOMPARE(window.getBrowserWidth(), int16_t(0)); - QCOMPARE(window.getBrowserHeight(), int16_t(0)); - window.setSize(100, 100); - - QCOMPARE(window.getBrowserWidth(), int16_t(100)); - QCOMPARE(window.getBrowserHeight(), int16_t(100)); -#endif - QSKIP("Test is same with setSize().", SkipAll); -} - -//Q_DECLARE_METATYPE(std::string const) -void tst_LLEmbeddedBrowserWindow::getClickLinkHref_data() -{ -#if 0 - QTest::addColumn("getClickLinkHref"); - QTest::newRow("null") << std::string const(); -#endif -} - -// public std::string const getClickLinkHref() -void tst_LLEmbeddedBrowserWindow::getClickLinkHref() -{ - //QFETCH(std::string const, getClickLinkHref); - - SubLLEmbeddedBrowserWindow window; - - window.getClickLinkHref(); -} - -void tst_LLEmbeddedBrowserWindow::getClickLinkTarget_data() -{ -#if 0 - QTest::addColumn("getClickLinkTarget"); - QTest::newRow("null") << std::string const(); -#endif -} - -// public std::string const getClickLinkTarget() -void tst_LLEmbeddedBrowserWindow::getClickLinkTarget() -{ - //QFETCH(std::string const, getClickLinkTarget); - - SubLLEmbeddedBrowserWindow window; - - window.getClickLinkTarget(); -} - -void tst_LLEmbeddedBrowserWindow::getCurrentUri_data() -{ -#if 0 - QTest::addColumn("getCurrentUri"); - QTest::newRow("null") << std::string const(); -#endif -} - -// public std::string const getCurrentUri() -void tst_LLEmbeddedBrowserWindow::getCurrentUri() -{ - //QFETCH(std::string const, getCurrentUri); - - SubLLEmbeddedBrowserWindow window; - window.navigateTo(std::string("http://www.google.ca/")); - QTRY_COMPARE(QString::fromStdString(window.getCurrentUri()), QString::fromStdString(std::string("http://www.google.ca/"))); -} - -void tst_LLEmbeddedBrowserWindow::getNoFollowScheme_data() -{ -#if 0 - QTest::addColumn("getNoFollowScheme"); - QTest::newRow("FTP") << std::string("FTP"); -#endif -} - -// public std::string getNoFollowScheme() -void tst_LLEmbeddedBrowserWindow::getNoFollowScheme() -{ - //QFETCH(std::string, getNoFollowScheme); - - SubLLEmbeddedBrowserWindow window; - window.setNoFollowScheme("FTP://www.google.com"); - - QCOMPARE(window.getNoFollowScheme(), std::string("FTP")); -} - -//Q_DECLARE_METATYPE(unsigned char*) -void tst_LLEmbeddedBrowserWindow::getPageBuffer_data() -{ -#if 0 - QTest::addColumn("getPageBuffer"); - QTest::newRow("null") << unsigned char*(); -#endif -} - -// public unsigned char* getPageBuffer() -void tst_LLEmbeddedBrowserWindow::getPageBuffer() -{ - //QFETCH(unsigned char*, getPageBuffer); - - SubLLEmbeddedBrowserWindow window; - window.setSize(100,100); - window.grabWindow(0, 0, 100, 100); - - QVERIFY(window.getPageBuffer() != NULL); -} - -//Q_DECLARE_METATYPE(int16_t const) -void tst_LLEmbeddedBrowserWindow::getPercentComplete_data() -{ -#if 0 - QTest::addColumn("getPercentComplete"); - QTest::newRow("null") << int16_t const(); -#endif -} - -// public int16_t const getPercentComplete() -void tst_LLEmbeddedBrowserWindow::getPercentComplete() -{ - //QFETCH(int16_t const, getPercentComplete); - SubLLEmbeddedBrowserWindow window; - window.navigateTo(std::string("http://www.google.com")); - QTest::qWait(1000); - QVERIFY(window.getPercentComplete() > 0); -} - -void tst_LLEmbeddedBrowserWindow::getStatusMsg_data() -{ -#if 0 - QTest::addColumn("getStatusMsg"); - QTest::newRow("null") << std::string const(); -#endif -} - -// public std::string const getStatusMsg() -void tst_LLEmbeddedBrowserWindow::getStatusMsg() -{ - //QFETCH(std::string const, getStatusMsg); - - SubLLEmbeddedBrowserWindow window; - window.navigateTo(std::string("http://www.google.com")); - QTest::qWait(1000); - window.navigateStop(); - window.navigateTo(std::string("http://www.yahoo.com")); - // Seems status msg will always be null during navigating. - //QTRY_VERIFY(QString::fromStdString(window.getStatusMsg())!= NULL); - QSKIP("Status msg will always be null during navigating", SkipAll); -} - -void tst_LLEmbeddedBrowserWindow::getWindowId_data() -{ -#if 0 - QTest::addColumn("getWindowId"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; -#endif -} - -// public int getWindowId() -void tst_LLEmbeddedBrowserWindow::getWindowId() -{ - //QFETCH(int, getWindowId); - - SubLLEmbeddedBrowserWindow window; - window.setWindowId(0); - QCOMPARE(window.getWindowId(), 0); - window.setWindowId(100); - QCOMPARE(window.getWindowId(), 100); -} - -void tst_LLEmbeddedBrowserWindow::grabWindow_data() -{ -#if 0 - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::addColumn("width"); - QTest::addColumn("height"); - QTest::addColumn("grabWindow"); - QTest::newRow("null") << 0 << 0 << 0 << 0 << 0; -#endif -} - -// public unsigned char* grabWindow(int x, int y, int width, int height) -void tst_LLEmbeddedBrowserWindow::grabWindow() -{ - QSKIP("Test is same with getPageBuffer().", SkipAll); -} - -void tst_LLEmbeddedBrowserWindow::keyPress_data() -{ - QTest::addColumn("key_code"); - QTest::newRow("null") << int16_t(0); - QTest::newRow("valid") << int16_t(0x0E); -} - -// public void keyPress(int16_t key_code) -void tst_LLEmbeddedBrowserWindow::keyPress() -{ - QFETCH(int16_t, key_code); - - SubLLEmbeddedBrowserWindow window; - window.keyPress(key_code); -} - -void tst_LLEmbeddedBrowserWindow::mouseDown_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::newRow("0") << int16_t(0) << int16_t(0); - QTest::newRow("bignumber") << int16_t(100000) << int16_t(100000); - QTest::newRow("valid") << int16_t(100) << int16_t(100); -} - -// public void mouseDown(int16_t x, int16_t y) -void tst_LLEmbeddedBrowserWindow::mouseDown() -{ - QFETCH(int16_t, x); - QFETCH(int16_t, y); - - SubLLEmbeddedBrowserWindow window; - window.mouseDown(x, y); -} - -void tst_LLEmbeddedBrowserWindow::mouseLeftDoubleClick_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::newRow("0") << int16_t(0) << int16_t(0); - QTest::newRow("bignumber") << int16_t(100000) << int16_t(100000); - QTest::newRow("valid") << int16_t(100) << int16_t(100); -} - -// public void mouseLeftDoubleClick(int16_t x, int16_t y) -void tst_LLEmbeddedBrowserWindow::mouseLeftDoubleClick() -{ - QFETCH(int16_t, x); - QFETCH(int16_t, y); - - SubLLEmbeddedBrowserWindow window; - window.mouseLeftDoubleClick(x, y); -} - -void tst_LLEmbeddedBrowserWindow::mouseMove_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::newRow("0") << int16_t(0) << int16_t(0); - QTest::newRow("bignumber") << int16_t(100000) << int16_t(100000); - QTest::newRow("valid") << int16_t(100) << int16_t(100); -} - -// public void mouseMove(int16_t x, int16_t y) -void tst_LLEmbeddedBrowserWindow::mouseMove() -{ - QFETCH(int16_t, x); - QFETCH(int16_t, y); - - SubLLEmbeddedBrowserWindow window; - window.mouseMove(x, y); -} - -void tst_LLEmbeddedBrowserWindow::mouseUp_data() -{ - QTest::addColumn("x"); - QTest::addColumn("y"); - QTest::newRow("0") << int16_t(0) << int16_t(0); - QTest::newRow("bignumber") << int16_t(100000) << int16_t(100000); - QTest::newRow("valid") << int16_t(100) << int16_t(100); -} - -// public void mouseUp(int16_t x, int16_t y) -void tst_LLEmbeddedBrowserWindow::mouseUp() -{ - QFETCH(int16_t, x); - QFETCH(int16_t, y); - - SubLLEmbeddedBrowserWindow window; - window.mouseUp(x, y); -} - -void tst_LLEmbeddedBrowserWindow::navigateBack_data() -{ -#if 0 - QTest::addColumn("foo"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; -#endif -} - -// public void navigateBack() -void tst_LLEmbeddedBrowserWindow::navigateBack() -{ - //QFETCH(int, foo); - - SubLLEmbeddedBrowserWindow window; - window.navigateTo(std::string("http://www.google.ca/")); - QTest::qWait(__TRY_TIMEOUT__); - QCOMPARE(window.canNavigateForward(), false); - window.navigateTo(std::string("http://www.yahoo.com/")); - QTest::qWait(__TRY_TIMEOUT__); - QCOMPARE(window.canNavigateBack(), true); - window.navigateBack(); - QTRY_COMPARE(QString::fromStdString((window.getCurrentUri())), QString("http://www.google.ca/")); - window.navigateBack(); - QTRY_COMPARE(QString::fromStdString((window.getCurrentUri())), QString("http://www.google.ca/")); -} - -void tst_LLEmbeddedBrowserWindow::navigateForward_data() -{ -#if 0 - QTest::addColumn("foo"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; -#endif -} - -// public void navigateForward() -void tst_LLEmbeddedBrowserWindow::navigateForward() -{ - // QFETCH(int, foo); - SubLLEmbeddedBrowserWindow window; - window.navigateTo(std::string("http://www.google.ca/")); - QTest::qWait(__TRY_TIMEOUT__); - QCOMPARE(window.canNavigateForward(), false); - window.navigateTo(std::string("http://www.yahoo.ca/")); - QTest::qWait(__TRY_TIMEOUT__); - QCOMPARE(window.canNavigateBack(), true); - window.navigateBack(); - QTRY_COMPARE(QString::fromStdString((window.getCurrentUri())), QString("http://www.google.ca/")); - window.navigateForward(); - QTRY_COMPARE(QString::fromStdString((window.getCurrentUri())), QString("http://ca.yahoo.com/")); - window.navigateForward(); - QTRY_COMPARE(QString::fromStdString((window.getCurrentUri())), QString("http://ca.yahoo.com/")); -} - -void tst_LLEmbeddedBrowserWindow::navigateReload_data() -{ -#if 0 - QTest::addColumn("foo"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; -#endif -} - -// public void navigateReload() -void tst_LLEmbeddedBrowserWindow::navigateReload() -{ - SubLLEmbeddedBrowserWindow window; - - window.navigateTo(std::string("http://www.google.ca/")); - QTest::qWait(__TRY_TIMEOUT__); - window.navigateReload(); - QTRY_COMPARE(QString::fromStdString((window.getCurrentUri())), QString("http://www.google.ca/")); -} - -void tst_LLEmbeddedBrowserWindow::navigateStop_data() -{ -#if 0 - QTest::addColumn("foo"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; -#endif -} - -// public void navigateStop() -void tst_LLEmbeddedBrowserWindow::navigateStop() -{ - SubLLEmbeddedBrowserWindow window; - window.navigateTo("www.google.com"); - window.navigateStop(); -} - -void tst_LLEmbeddedBrowserWindow::navigateTo_data() -{ - QTest::addColumn("uri"); - QTest::addColumn("navigateTo"); - QTest::newRow("null") << std::string() << std::string(); - QTest::newRow("valid") << std::string("http://www.google.ca/") << std::string("http://www.google.ca/"); -} - -// public bool navigateTo(std::string const uri) -void tst_LLEmbeddedBrowserWindow::navigateTo() -{ - QSKIP("Test is same with navigateBack(), navigateForward().", SkipAll); -} - -void tst_LLEmbeddedBrowserWindow::remObserver_data() -{ -#if 0 - QTest::addColumn("observerCount"); - QTest::addColumn("remObserver"); - QTest::newRow("null") << 0 << false; -#endif -} - -// public bool remObserver(LLEmbeddedBrowserWindowObserver* observer) -void tst_LLEmbeddedBrowserWindow::remObserver() -{ -// QFETCH(int, observerCount); -// QFETCH(bool, remObserver); - - SubLLEmbeddedBrowserWindow window; - LLEmbeddedBrowserWindowObserver* observer = new LLEmbeddedBrowserWindowObserver(); - window.addObserver(observer); - QCOMPARE(window.getObserverNumber(), 1); - window.remObserver(observer); - QCOMPARE(window.getObserverNumber(), 0); -} - -void tst_LLEmbeddedBrowserWindow::scrollByLines_data() -{ - QTest::addColumn("lines"); - QTest::newRow("null") << int16_t(0); - QTest::addColumn("lines"); - QTest::newRow("100") << int16_t(100); -} - -// public void scrollByLines(int16_t lines) -void tst_LLEmbeddedBrowserWindow::scrollByLines() -{ - QFETCH(int16_t, lines); - - SubLLEmbeddedBrowserWindow window; - - window.scrollByLines(lines); -} - -Q_DECLARE_METATYPE(uint8_t) -void tst_LLEmbeddedBrowserWindow::setBackgroundColor_data() -{ - QTest::addColumn("red"); - QTest::addColumn("green"); - QTest::addColumn("blue"); - QTest::newRow("black") << uint8_t(0) << uint8_t(0) << uint8_t(0); - QTest::newRow("red") << uint8_t(255) << uint8_t(0) << uint8_t(0); - QTest::newRow("green") << uint8_t(0) << uint8_t(255) << uint8_t(0); - QTest::newRow("blue") << uint8_t(0) << uint8_t(0) << uint8_t(255); -} - -// public void setBackgroundColor(uint8_t const red, uint8_t const green, uint8_t const blue) -void tst_LLEmbeddedBrowserWindow::setBackgroundColor() -{ - QFETCH(uint8_t, red); - QFETCH(uint8_t, green); - QFETCH(uint8_t, blue); - - SubLLEmbeddedBrowserWindow window; - - window.setBackgroundColor(red, green, blue); -} - -void tst_LLEmbeddedBrowserWindow::setCaretColor_data() -{ - QTest::addColumn("red"); - QTest::addColumn("green"); - QTest::addColumn("blue"); - QTest::newRow("black") << uint8_t(0) << uint8_t(0) << uint8_t(0); - QTest::newRow("red") << uint8_t(255) << uint8_t(0) << uint8_t(0); - QTest::newRow("green") << uint8_t(0) << uint8_t(255) << uint8_t(0); - QTest::newRow("blue") << uint8_t(0) << uint8_t(0) << uint8_t(255); -} - -// public void setCaretColor(uint8_t const red, uint8_t const green, uint8_t const blue) -void tst_LLEmbeddedBrowserWindow::setCaretColor() -{ - QFETCH(uint8_t, red); - QFETCH(uint8_t, green); - QFETCH(uint8_t, blue); - - SubLLEmbeddedBrowserWindow window; - - window.setCaretColor(red, green, blue); -} - -void tst_LLEmbeddedBrowserWindow::setEnabled_data() -{ - QTest::addColumn("enabledIn"); - QTest::newRow("true") << true; - QTest::newRow("false") << false; -} - -// public void setEnabled(bool enabledIn) -void tst_LLEmbeddedBrowserWindow::setEnabled() -{ - QFETCH(bool, enabledIn); - - SubLLEmbeddedBrowserWindow window; - - window.setEnabled(enabledIn); -} - -void tst_LLEmbeddedBrowserWindow::setNoFollowScheme_data() -{ - QTest::addColumn("scheme"); - QTest::addColumn("result"); - QTest::newRow("null") << std::string() << std::string(); - QTest::newRow("valid") << std::string("ftp://www.google.com") << std::string("ftp");; -} - -// public void setNoFollowScheme(std::string scheme) -void tst_LLEmbeddedBrowserWindow::setNoFollowScheme() -{ - QFETCH(std::string, scheme); - QFETCH(std::string, result); - - SubLLEmbeddedBrowserWindow window; - - window.setNoFollowScheme(scheme); - QCOMPARE(window.getNoFollowScheme(), result); -} - -void tst_LLEmbeddedBrowserWindow::setParent_data() -{ -#if 0 - QTest::addColumn("parentCount"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; -#endif -} - -// public void setParent(LLEmbeddedBrowser* parent) -void tst_LLEmbeddedBrowserWindow::setParent() -{ -#if 0 - QFETCH(int, parentCount); - - SubLLEmbeddedBrowserWindow window; - LLEmbeddedBrowser* parent = new LLEmbeddedBrowser(); - - window.setParent(parent); -#endif - QSKIP("Has been tested before.", SkipAll); -} - -void tst_LLEmbeddedBrowserWindow::setSize_data() -{ - QTest::addColumn("width"); - QTest::addColumn("height"); - QTest::addColumn("setSize"); - QTest::newRow("null") << int16_t(0) << int16_t(0) << true; - QTest::newRow("valid") << int16_t(100) << int16_t(200) << true; -} - -// public bool setSize(int16_t width, int16_t height) -void tst_LLEmbeddedBrowserWindow::setSize() -{ - QFETCH(int16_t, width); - QFETCH(int16_t, height); - QFETCH(bool, setSize); - - SubLLEmbeddedBrowserWindow window; - QCOMPARE(window.setSize(width, height), setSize); - window.grabWindow(0, 0, 800, 600); - - QCOMPARE(window.getBrowserWidth(), width); - QCOMPARE(window.getBrowserHeight(), height); - QCOMPARE(window.getBrowserRowSpan(), (int32_t)width * 4); -} - -void tst_LLEmbeddedBrowserWindow::setWindowId_data() -{ - QTest::addColumn("window_id"); - QTest::newRow("0") << 0; - QTest::newRow("-1") << -1; - QTest::newRow("100") << 100; -} - -// public void setWindowId(int window_id) -void tst_LLEmbeddedBrowserWindow::setWindowId() -{ - QFETCH(int, window_id); - - SubLLEmbeddedBrowserWindow window; - - window.setWindowId(window_id); - QCOMPARE(window.getWindowId(), window_id); -} - -Q_DECLARE_METATYPE(uint32_t) -void tst_LLEmbeddedBrowserWindow::unicodeInput_data() -{ - QTest::addColumn("unicode_char"); - QTest::newRow("null") << uint32_t(); - QTest::newRow("valid") << uint32_t(54); -} - -// public void unicodeInput(uint32_t unicode_char) -void tst_LLEmbeddedBrowserWindow::unicodeInput() -{ - QFETCH(uint32_t, unicode_char); - - SubLLEmbeddedBrowserWindow window; - - window.unicodeInput(unicode_char); -} - -QTEST_MAIN(tst_LLEmbeddedBrowserWindow) -#include "tst_llembeddedbrowserwindow.moc" - diff --git a/indra/llqtwebkit/llembeddedbrowser.cpp b/indra/llqtwebkit/llembeddedbrowser.cpp deleted file mode 100644 index f38019b9b..000000000 --- a/indra/llqtwebkit/llembeddedbrowser.cpp +++ /dev/null @@ -1,759 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "llembeddedbrowser.h" - -#include "llembeddedbrowser_p.h" -#include "llembeddedbrowserwindow.h" -#include "llnetworkaccessmanager.h" -#include "llstyle.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// singleton pattern - initialization -LLEmbeddedBrowser* LLEmbeddedBrowser::sInstance = 0; - -LLEmbeddedBrowserPrivate::LLEmbeddedBrowserPrivate() - : mErrorNum(0) - , mNativeWindowHandle(0) - , mNetworkAccessManager(0) - , mApplication(0) -#if QT_VERSION >= 0x040500 - , mDiskCache(0) -#endif - , mNetworkCookieJar(0) - , mHostLanguage( "en" ) - , mIgnoreSSLCertErrors(false) -{ - if (!qApp) - { - static int argc = 0; - static const char* argv[] = {""}; - QApplication::setAttribute(Qt::AA_MacPluginApplication); - QApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); - - mApplication = new QApplication(argc, (char **)argv); - mApplication->addLibraryPath(qApp->applicationDirPath()); - } - qApp->setStyle(new LLStyle()); - mNetworkAccessManager = new LLNetworkAccessManager(this); -#if LL_DARWIN - // HACK: Qt installs CarbonEvent handlers that steal events from our main event loop. - // This uninstalls them. - // It's not clear whether calling this internal function is really a good idea. It's probably not. - // It does, however, seem to fix at least one problem ( https://jira.secondlife.com/browse/MOZ-12 ). - extern void qt_release_app_proc_handler(); - qt_release_app_proc_handler(); - - // This is defined and exported from qwidget_mac.mm. - // Calling it with false should prevent qwidget from bringing its process to the foreground, such as when bringing up a popup menu. - extern void qt_mac_set_raise_process(bool b); - qt_mac_set_raise_process(false); -#endif -} - -LLEmbeddedBrowserPrivate::~LLEmbeddedBrowserPrivate() -{ - delete mApplication; - delete mNetworkAccessManager; - delete mNetworkCookieJar; -} - - - -LLEmbeddedBrowser::LLEmbeddedBrowser() - : d(new LLEmbeddedBrowserPrivate) - , mPluginsEnabled( false ) - , mJavaScriptEnabled( false ) - , mCookiesEnabled( false ) -{ -} - -LLEmbeddedBrowser::~LLEmbeddedBrowser() -{ - if(d->mNetworkCookieJar) - { - d->mNetworkCookieJar->mBrowser = NULL; - } - - delete d; -} - -LLEmbeddedBrowser* LLEmbeddedBrowser::getInstance() -{ - if (!sInstance) - sInstance = new LLEmbeddedBrowser; - return sInstance; -} - -void LLEmbeddedBrowser::setLastError(int error_number) -{ - d->mErrorNum = error_number; -} - -void LLEmbeddedBrowser::clearLastError() -{ - d->mErrorNum = 0x0000; -} - -int LLEmbeddedBrowser::getLastError() -{ - return d->mErrorNum; -} - -std::string LLEmbeddedBrowser::getGREVersion() -{ - // take the string directly from Qt - return std::string(QT_VERSION_STR); -} - -bool LLEmbeddedBrowser::init(std::string application_directory, - std::string component_directory, - std::string profile_directory, - void* native_window_handle) -{ - Q_UNUSED(application_directory); - Q_UNUSED(component_directory); - Q_UNUSED(native_window_handle); - d->mStorageDirectory = QString::fromStdString(profile_directory); - QWebSettings::setIconDatabasePath(d->mStorageDirectory); - // The gif and jpeg libraries should be installed in component_directory/imageformats/ - QCoreApplication::addLibraryPath(QString::fromStdString(component_directory)); - - // turn on plugins by default - enablePlugins( true ); - - // Until QtWebkit defaults to 16 - QWebSettings::globalSettings()->setFontSize(QWebSettings::DefaultFontSize, 16); - QWebSettings::globalSettings()->setFontSize(QWebSettings::DefaultFixedFontSize, 16); - - - QWebSettings::globalSettings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); - QWebSettings::globalSettings()->setOfflineStoragePath(QDesktopServices::storageLocation(QDesktopServices::DataLocation)); - - // use default text encoding - not sure how this helps right now so commenting out until we - // understand how to use it a little better. - //QWebSettings::globalSettings()->setDefaultTextEncoding ( "" ); - - return reset(); -} - -bool LLEmbeddedBrowser::reset() -{ - foreach(LLEmbeddedBrowserWindow *window, d->windows) - delete window; - d->windows.clear(); - delete d->mNetworkAccessManager; - d->mNetworkAccessManager = new LLNetworkAccessManager(d); -#if QT_VERSION >= 0x040500 - d->mDiskCache = new QNetworkDiskCache(d->mNetworkAccessManager); - d->mDiskCache->setCacheDirectory(d->mStorageDirectory + "/cache"); - if (QLatin1String(qVersion()) != QLatin1String("4.5.1")) - d->mNetworkAccessManager->setCache(d->mDiskCache); -#endif - d->mNetworkCookieJar = new LLNetworkCookieJar(d->mNetworkAccessManager, this); - d->mNetworkAccessManager->setCookieJar(d->mNetworkCookieJar); - clearLastError(); - return true; -} - -bool LLEmbeddedBrowser::clearCache() -{ -#if QT_VERSION >= 0x040500 - if (d->mDiskCache) - { - d->mDiskCache->clear(); - return true; - } -#endif - return false; -} - -bool LLEmbeddedBrowser::enableProxy(bool enabled, std::string host_name, int port) -{ - QNetworkProxy proxy; - if (enabled) - { - proxy.setType(QNetworkProxy::HttpProxy); - QString q_host_name = QString::fromStdString(host_name); - proxy.setHostName(q_host_name); - proxy.setPort(port); - } - d->mNetworkAccessManager->setProxy(proxy); - return true; -} - -bool LLEmbeddedBrowser::clearAllCookies() -{ - if (!d->mNetworkCookieJar) - return false; - d->mNetworkCookieJar->clear(); - return true; -} - -void LLEmbeddedBrowser::setCookies(const std::string &cookies) -{ - if (d->mNetworkCookieJar) - { - d->mNetworkCookieJar->setCookiesFromRawForm(cookies); - } -} - -std::string LLEmbeddedBrowser::getAllCookies() -{ - std::string result; - - if (d->mNetworkCookieJar) - { - result = d->mNetworkCookieJar->getAllCookiesInRawForm(); - } - - return result; -} - -void LLEmbeddedBrowser::enableCookies( bool enabled ) -{ - mCookiesEnabled = enabled; - enableCookiesTransient( mCookiesEnabled ); -} - -void LLEmbeddedBrowser::enableCookiesTransient( bool enabled ) -{ - if ( d->mNetworkCookieJar ) - { - d->mNetworkCookieJar->mAllowCookies = enabled; - } -} - -bool LLEmbeddedBrowser::areCookiesEnabled() -{ - return mCookiesEnabled; -} - -void LLEmbeddedBrowser::enablePlugins( bool enabled ) -{ - mPluginsEnabled = enabled; // record state - enablePluginsTransient( mPluginsEnabled ); -} - -void LLEmbeddedBrowser::enablePluginsTransient( bool enabled ) -{ - QWebSettings* default_settings = QWebSettings::globalSettings(); - default_settings->setAttribute( QWebSettings::PluginsEnabled, enabled ); -} - -bool LLEmbeddedBrowser::arePluginsEnabled() -{ - return mPluginsEnabled; -} - -void LLEmbeddedBrowser::enableJavaScript( bool enabled ) -{ - mJavaScriptEnabled = enabled; // record state - enableJavaScriptTransient( mJavaScriptEnabled ); -} - -void LLEmbeddedBrowser::enableJavaScriptTransient( bool enabled ) -{ - QWebSettings* default_settings = QWebSettings::globalSettings(); - default_settings->setAttribute( QWebSettings::JavascriptEnabled, enabled ); - default_settings->setAttribute( QWebSettings::JavascriptCanOpenWindows, enabled ); -} - -bool LLEmbeddedBrowser::isJavaScriptEnabled() -{ - return mJavaScriptEnabled; -} - -bool LLEmbeddedBrowser::showWebInspector(bool show) -{ - QWebSettings::globalSettings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, show); - foreach (LLEmbeddedBrowserWindow* window, d->windows) - { - window->showWebInspector(show); - } - return true; -} - -/* - Sets a string that should be addded to the user agent to identify the application -*/ -void LLEmbeddedBrowser::setBrowserAgentId(std::string id) -{ - QCoreApplication::setApplicationName(QString::fromStdString(id)); -} - -// updates value of 'hostLanguage' in JavaScript 'Navigator' obect that -// embedded pages can query to see what language the host app is set to -// IMPORTANT: call this before any windows are created - only gets passed -// to LLWebPage when new window is created -void LLEmbeddedBrowser::setHostLanguage( const std::string& host_language ) -{ - d->mHostLanguage = host_language; -} - -LLEmbeddedBrowserWindow* LLEmbeddedBrowser::createBrowserWindow(int width, int height, const std::string target) -{ - LLEmbeddedBrowserWindow *newWin = new LLEmbeddedBrowserWindow(); - if (newWin) - { - newWin->setSize(width, height); - newWin->setParent(this); - newWin->setHostLanguage(d->mHostLanguage); - clearLastError(); - d->windows.append(newWin); - - if(!target.empty() && (target != "_blank")) - { - newWin->setTarget(target); - } - - return newWin; - } - return 0; -} - -bool LLEmbeddedBrowser::destroyBrowserWindow(LLEmbeddedBrowserWindow* browser_window) -{ - // check if exists in windows list - if (d->windows.removeOne(browser_window)) - { - delete browser_window; - clearLastError(); - return true; - } - return false; -} - -int LLEmbeddedBrowser::getWindowCount() const -{ - return d->windows.size(); -} - -void LLEmbeddedBrowser::pump(int max_milliseconds) -{ -#if 0 - // This USED to be necessary on the mac, but with Qt 4.6 it seems to cause trouble loading some pages, - // and using processEvents() seems to work properly now. - // Leaving this here in case these issues ever come back. - - // On the Mac, calling processEvents hangs the viewer. - // I'm not entirely sure this does everything we need, but it seems to work better, and allows things like animated gifs to work. - qApp->sendPostedEvents(); - qApp->sendPostedEvents(0, QEvent::DeferredDelete); -#else - qApp->processEvents(QEventLoop::AllEvents, max_milliseconds); -#endif -} - -void LLEmbeddedBrowser::cookieChanged(const std::string &cookie, const std::string &url, bool dead) -{ - foreach (LLEmbeddedBrowserWindow* window, d->windows) - { - window->cookieChanged(cookie, url, dead); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::setCAFile(const std::string &ca_file) -{ - bool result = false; - //qDebug() << "LLEmbeddedBrowser::" << __FUNCTION__ << "attempting to read certs from file: " << QString::fromStdString(ca_file); - - // Extract the list of certificates from the specified file - QList certs = QSslCertificate::fromPath(QString::fromStdString(ca_file)); - - if(!certs.isEmpty()) - { - //qDebug() << "LLEmbeddedBrowser::" << __FUNCTION__ << "certs read: " << certs; - - // Set the default CA cert for Qt's SSL implementation. - QSslConfiguration config = QSslConfiguration::defaultConfiguration(); - config.setCaCertificates(certs); - QSslConfiguration::setDefaultConfiguration(config); - result = true; - } - - return result; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLEmbeddedBrowser::addCAFile(const std::string &ca_file) -{ - // Enabling this can help diagnose certificate verification issues. - const bool cert_debugging_on = false; - - if ( cert_debugging_on ) - { - //qDebug() << "\n\nLLEmbeddedBrowser::" << __FUNCTION__ << " ------------------- (Before add)"; - QSslCertificate cert; - foreach(cert, QSslSocket::defaultCaCertificates()) - { - //qDebug() << cert.issuerInfo(QSslCertificate::CommonName) << " --- " << cert.subjectInfo(QSslCertificate::CommonName); - } - } - - bool result = false; - //qDebug() << "LLEmbeddedBrowser::" << __FUNCTION__ << "attempting to read certs from file: " << QString::fromStdString(ca_file); - - if ( cert_debugging_on ) - { - //qDebug() << "\n\nLLEmbeddedBrowser::" << __FUNCTION__ << " ------------------- (From CA.pem)"; - QList certs = QSslCertificate::fromPath(QString::fromStdString(ca_file)); - QSslCertificate cert; - foreach(cert, certs) - { - //qDebug() << cert.issuerInfo(QSslCertificate::CommonName) << " --- " << cert.subjectInfo(QSslCertificate::CommonName); - } - } - - result = QSslSocket::addDefaultCaCertificates(QString::fromStdString(ca_file)); - - if ( cert_debugging_on ) - { - //qDebug() << "\n\nLLEmbeddedBrowser::" << __FUNCTION__ << " ------------------- (After add)"; - QSslCertificate cert; - foreach(cert, QSslSocket::defaultCaCertificates()) - { - //qDebug() << cert.issuerInfo(QSslCertificate::CommonName) << " --- " << cert.subjectInfo(QSslCertificate::CommonName); - } - } - - return result; -} - -void LLEmbeddedBrowser::setIgnoreSSLCertErrors(bool ignore) -{ - d->mIgnoreSSLCertErrors = ignore; -} - -bool LLEmbeddedBrowser::getIgnoreSSLCertErrors() -{ - return d->mIgnoreSSLCertErrors; -} - -const std::vector< std::string > LLEmbeddedBrowser::getInstalledCertsList() -{ - std::vector< std::string > cert_list; - - QSslCertificate cert; - foreach(cert, QSslSocket::defaultCaCertificates()) - { - QString cert_info=""; - - QString issuer_info=""; - issuer_info+="C="; - issuer_info+=cert.issuerInfo(QSslCertificate::CountryName); - issuer_info+=", ST="; - issuer_info+=cert.issuerInfo(QSslCertificate::StateOrProvinceName); - issuer_info+=", L="; - issuer_info+=cert.issuerInfo(QSslCertificate::LocalityName); - issuer_info+=", O="; - issuer_info+=cert.issuerInfo(QSslCertificate::Organization); - issuer_info+=", OU="; - issuer_info+=cert.issuerInfo(QSslCertificate::OrganizationalUnitName); - issuer_info+=", CN="; - issuer_info+=cert.issuerInfo(QSslCertificate::CommonName); - cert_info+=issuer_info; - cert_info+="\n"; - - QString subject_info=""; - subject_info+="C="; - subject_info+=cert.subjectInfo(QSslCertificate::CountryName); - subject_info+=", ST="; - subject_info+=cert.subjectInfo(QSslCertificate::StateOrProvinceName); - subject_info+=", L="; - subject_info+=cert.subjectInfo(QSslCertificate::LocalityName); - subject_info+=", O="; - subject_info+=cert.subjectInfo(QSslCertificate::Organization); - subject_info+=", OU="; - subject_info+=cert.subjectInfo(QSslCertificate::OrganizationalUnitName); - subject_info+=", CN="; - subject_info+=cert.subjectInfo(QSslCertificate::CommonName); - cert_info+=subject_info; - cert_info+="\n"; - - cert_info+="Not valid before: "; - cert_info+=cert.effectiveDate().toString(); - cert_info+="\n"; - cert_info+="Not valid after: "; - cert_info+=cert.expiryDate().toString(); - cert_info+="\n"; - - cert_list.push_back( llToStdString(cert_info) ); - } - return cert_list; -} - -// Second Life viewer specific functions -void LLEmbeddedBrowser::setSLObjectEnabled( bool enabled ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setSLObjectEnabled( enabled ); - } -} - -void LLEmbeddedBrowser::setAgentLanguage( const std::string& agent_language ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setAgentLanguage( agent_language ); - } -} - -void LLEmbeddedBrowser::setAgentRegion( const std::string& agent_region ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setAgentRegion( agent_region ); - } -} - -void LLEmbeddedBrowser::setAgentLocation( double x, double y, double z ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setAgentLocation( x, y, z ); - } -} - -void LLEmbeddedBrowser::setAgentGlobalLocation( double x, double y, double z ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setAgentGlobalLocation( x, y, z ); - } -} - -void LLEmbeddedBrowser::setAgentOrientation( double angle ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setAgentOrientation( angle ); - } -} - -void LLEmbeddedBrowser::setAgentMaturity( const std::string& agent_maturity ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setAgentMaturity( agent_maturity ); - } -} - -void LLEmbeddedBrowser::emitLocation() -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->emitLocation(); - } -} - -void LLEmbeddedBrowser::emitMaturity() -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->emitMaturity(); - } -} - -void LLEmbeddedBrowser::emitLanguage() -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->emitLanguage(); - } -} - -void LLEmbeddedBrowser::setPageZoomFactor( double factor ) -{ - foreach ( LLEmbeddedBrowserWindow* window, d->windows ) - { - window->setPageZoomFactor( factor ); - } -} - -void LLEmbeddedBrowser::qtMessageHandler(QtMsgType type, const char *msg) -{ - std::string msg_type(""); - switch (type) - { - case QtDebugMsg: - msg_type="Debug"; - break; - case QtWarningMsg: - msg_type="Warning"; - break; - case QtCriticalMsg: - msg_type="Critical"; - break; - case QtFatalMsg: - msg_type="Fatal"; - break; - }; - - foreach ( LLEmbeddedBrowserWindow* window, sInstance->d->windows ) - { - - window->onQtDebugMessage( std::string( msg ), msg_type); - } -} - -void LLEmbeddedBrowser::enableQtMessageHandler( bool enable ) -{ - if ( enable ) - { - qInstallMsgHandler( qtMessageHandler ); - } - else - { - // remove handler - qInstallMsgHandler(0); - }; -} - -LLNetworkCookieJar::LLNetworkCookieJar(QObject* parent, LLEmbeddedBrowser *browser) - : NetworkCookieJar(parent) - , mAllowCookies(true) - , mBrowser(browser) -{ -} - -LLNetworkCookieJar::~LLNetworkCookieJar() -{ -} - -QList LLNetworkCookieJar::cookiesForUrl(const QUrl& url) const -{ - if (!mAllowCookies) - return QList(); - return NetworkCookieJar::cookiesForUrl(url); -} - -bool LLNetworkCookieJar::setCookiesFromUrl(const QList &cookie_list, const QUrl& url) -{ - if (!mAllowCookies) - return false; - return NetworkCookieJar::setCookiesFromUrl(cookie_list, url); -} - -void LLNetworkCookieJar::onCookieSetFromURL(const QNetworkCookie &cookie, const QUrl &url, bool already_dead) -{ -// qDebug() << "LLNetworkCookieJar::" << __FUNCTION__ << (already_dead?"set dead cookie":"set cookie ") << cookie; - - if(mBrowser) - { - QByteArray cookie_bytes = cookie.toRawForm(QNetworkCookie::Full); - std::string cookie_string(cookie_bytes.data(), cookie_bytes.size()); - std::string url_string = llToStdString(url); - mBrowser->cookieChanged(cookie_string, url_string, already_dead); - } -} - -void LLNetworkCookieJar::clear() -{ - clearCookies(); -} - -void LLNetworkCookieJar::setCookiesFromRawForm(const std::string &cookie_string) -{ - QByteArray cookie_bytearray(cookie_string.data(), cookie_string.size()); - QList cookie_list = QNetworkCookie::parseCookies(cookie_bytearray); - setCookies(cookie_list); -} - -std::string LLNetworkCookieJar::getAllCookiesInRawForm() -{ - std::string result; - - QList cookie_list = allCookies(); - - foreach (const QNetworkCookie &cookie, cookie_list) - { - QByteArray raw_form = cookie.toRawForm(QNetworkCookie::Full); - result.append(raw_form.data(), raw_form.size()); - result.append("\n"); - } - - return result; -} - -#include "llembeddedbrowserwindow_p.h" -#include - -QGraphicsWebView *LLEmbeddedBrowserPrivate::findView(QNetworkReply *reply) -{ - for (int i = 0; i < windows.count(); ++i) - if (windows[i]->d->mView->url() == reply->url()) - return windows[i]->d->mView; - return windows[0]->d->mView; -} - -bool LLEmbeddedBrowserPrivate::authRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password) -{ - bool result = false; - -// qDebug() << "LLEmbeddedBrowser::" << __FUNCTION__ << "requesting auth for url " << QString::fromStdString(in_url) << ", realm " << QString::fromStdString(in_realm); -// -// qDebug() << "LLEmbeddedBrowser::" << __FUNCTION__ << "window count is " << windows.count(); - - if(windows.count() > 1) - { - qDebug() << "LLEmbeddedBrowser::" << __FUNCTION__ << "WARNING: authRequest called with more than one window, using the first one"; - } - - LLEmbeddedBrowserWindow* window = windows.first(); - - if(window) - { - result = window->authRequest(in_url, in_realm, out_username, out_password); - } - - return result; -} - -bool LLEmbeddedBrowserPrivate::certError(const std::string &in_url, const std::string &in_msg) -{ - bool result = false; - - LLEmbeddedBrowserWindow* window = windows.first(); - if(window) - { - result = window->certError(in_url, in_msg); - } - - return result; -} diff --git a/indra/llqtwebkit/llembeddedbrowser.h b/indra/llqtwebkit/llembeddedbrowser.h deleted file mode 100644 index c21a6b063..000000000 --- a/indra/llqtwebkit/llembeddedbrowser.h +++ /dev/null @@ -1,115 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLEMBEDDEDBROWSER_H -#define LLEMBEDDEDBROWSER_H - -#include -#include -#include -#include - -class LLEmbeddedBrowserWindow; -class LLEmbeddedBrowserWindowObserver; - -class LLEmbeddedBrowserPrivate; -class LLEmbeddedBrowser -{ - public: - LLEmbeddedBrowser(); - virtual ~LLEmbeddedBrowser(); - - static LLEmbeddedBrowser* getInstance(); - - bool init(std::string application_directory, - std::string component_directory, - std::string profile_directory, - void* native_window_handle); - bool reset(); - bool clearCache(); - bool enableProxy(bool enabled, std::string host_name, int port); - bool clearAllCookies(); - void setCookies(const std::string &cookies); - std::string getAllCookies(); - - void enableCookies( bool enabled ); - void enableCookiesTransient( bool enabled ); - bool areCookiesEnabled(); - void enablePlugins( bool enabled ); - void enablePluginsTransient( bool enabled ); - bool arePluginsEnabled(); - void enableJavaScript( bool enabled ); - void enableJavaScriptTransient( bool enabled ); - bool isJavaScriptEnabled(); - - bool showWebInspector(bool show); - std::string getGREVersion(); - void setBrowserAgentId(std::string id); - void setHostLanguage( const std::string& host_language ); - LLEmbeddedBrowserWindow* createBrowserWindow(int width, int height, const std::string target); - bool destroyBrowserWindow(LLEmbeddedBrowserWindow* browser_window); - void setLastError(int error_number); - void clearLastError(); - int getLastError(); - int getWindowCount() const; - void pump(int max_milliseconds); - void cookieChanged(const std::string &cookie, const std::string &url, bool dead); - bool setCAFile(const std::string &ca_file); - bool addCAFile(const std::string &ca_file); - void setIgnoreSSLCertErrors(bool ignore); - bool getIgnoreSSLCertErrors(); - const std::vector< std::string > getInstalledCertsList(); - - void enableQtMessageHandler( bool enable ); - - void setPageZoomFactor( double factor ); - - // Second Life specific functions - void setSLObjectEnabled( bool enabled ); - void setAgentLanguage( const std::string& agent_language ); - void setAgentRegion( const std::string& agent_region ); - void setAgentLocation( double x, double y, double z ); - void setAgentGlobalLocation( double x, double y, double z ); - void setAgentOrientation( double angle ); - void setAgentMaturity( const std::string& agent_maturity ); - void emitLocation(); - void emitMaturity(); - void emitLanguage(); - - private: - friend class LLEmbeddedBrowserWindow; - friend class LLEmbeddedBrowserWindowPrivate; - LLEmbeddedBrowserPrivate *d; - bool mPluginsEnabled; - bool mJavaScriptEnabled; - bool mCookiesEnabled; - - static void qtMessageHandler(QtMsgType type, const char *msg); - - static LLEmbeddedBrowser* sInstance; -}; - -#endif // LLEMBEDDEDBROWSER_H - diff --git a/indra/llqtwebkit/llembeddedbrowser_p.h b/indra/llqtwebkit/llembeddedbrowser_p.h deleted file mode 100644 index 9f9f9cd02..000000000 --- a/indra/llqtwebkit/llembeddedbrowser_p.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLEMBEDDEDBROWSER_P_H -#define LLEMBEDDEDBROWSER_P_H - -#include -#include -#if QT_VERSION >= 0x040500 -#include -#endif - -#include "networkcookiejar.h" -#include "llembeddedbrowser.h" - -#include - -class LLEmbeddedBrowser; -class LLNetworkCookieJar : public NetworkCookieJar -{ -public: - LLNetworkCookieJar(QObject *parent, LLEmbeddedBrowser *browser); - ~LLNetworkCookieJar(); - - QList cookiesForUrl(const QUrl& url) const; - bool setCookiesFromUrl(const QList &cookie_list, const QUrl& url); - - /*virtual*/ void onCookieSetFromURL(const QNetworkCookie &cookie, const QUrl &url, bool already_dead); - - void clear(); - - void setCookiesFromRawForm(const std::string &cookie_string); - std::string getAllCookiesInRawForm(); - - bool mAllowCookies; - LLEmbeddedBrowser *mBrowser; -}; - -class LLNetworkAccessManager; -class LLEmbeddedBrowserPrivate -{ -public: - LLEmbeddedBrowserPrivate(); - ~LLEmbeddedBrowserPrivate(); - - bool authRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password); - bool certError(const std::string &in_url, const std::string &in_msg); - - int mErrorNum; - void* mNativeWindowHandle; - LLNetworkAccessManager *mNetworkAccessManager; - QApplication *mApplication; -#if QT_VERSION >= 0x040500 - QNetworkDiskCache *mDiskCache; -#endif - LLNetworkCookieJar *mNetworkCookieJar; - - QGraphicsWebView *findView(QNetworkReply *); - - QString mStorageDirectory; - QList windows; - - std::string mHostLanguage; - bool mIgnoreSSLCertErrors; -}; - -#endif - diff --git a/indra/llqtwebkit/llembeddedbrowserwindow.cpp b/indra/llqtwebkit/llembeddedbrowserwindow.cpp deleted file mode 100644 index c990d5567..000000000 --- a/indra/llqtwebkit/llembeddedbrowserwindow.cpp +++ /dev/null @@ -1,1136 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include "llembeddedbrowserwindow.h" -#include "llembeddedbrowserwindow_p.h" - -#include "llembeddedbrowser.h" -#include "llembeddedbrowser_p.h" -#include "llnetworkaccessmanager.h" - -#ifdef STATIC_QT - #include - // Enable gif and jpeg plugins, since web pages look pretty bleak without gifs or jpegs. - // Qt 4.7 uses the system gif and jpeg libraries by default, so this is no longer necessary. -// Q_IMPORT_PLUGIN(qgif) -// Q_IMPORT_PLUGIN(qjpeg) -#ifndef LL_LINUX - // Qt also has its own translators for CJK text encodings we need to pull in. - Q_IMPORT_PLUGIN(qcncodecs) - Q_IMPORT_PLUGIN(qjpcodecs) - Q_IMPORT_PLUGIN(qkrcodecs) - Q_IMPORT_PLUGIN(qtwcodecs) -#endif -#endif - -//#define LLEMBEDDEDBROWSER_DEBUG 1 - -#ifdef LLEMBEDDEDBROWSER_DEBUG -#include -#endif - -#if LL_DARWIN || defined(STATIC_QT) - // Don't define qt_sendSpontaneousEvent on the mac -- it causes a multiply-defined symbol. - extern bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event); -#else - #include - bool qt_sendSpontaneousEvent(QObject *receiver, QEvent *event) - { - return QCoreApplication::sendSpontaneousEvent(receiver, event); - } -#endif - -LLEmbeddedBrowserWindow::LLEmbeddedBrowserWindow() -{ - d = new LLEmbeddedBrowserWindowPrivate(); - - d->mPage = new LLWebPage; - d->mInspector = new QWebInspector; - d->mInspector->setPage(d->mPage); - d->mPage->window = this; - d->mView = new LLWebView; - d->mPage->webView = d->mView; - d->mView->window = this; - d->mView->setPage(d->mPage); - d->mGraphicsScene = new LLGraphicsScene; - d->mGraphicsScene->window = this; - d->mGraphicsView = new QGraphicsView; - d->mGraphicsScene->addItem(d->mView); - d->mGraphicsView->setScene(d->mGraphicsScene); - d->mGraphicsScene->setStickyFocus(true); - d->mGraphicsView->viewport()->setParent(0); - - mEnableLoadingOverlay = false; -} - -LLEmbeddedBrowserWindow::~LLEmbeddedBrowserWindow() -{ - delete d; -} - -void LLEmbeddedBrowserWindow::setParent(LLEmbeddedBrowser* parent) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << parent; -#endif - d->mParent = parent; - if (parent) - { - d->mPage->setNetworkAccessManager(parent->d->mNetworkAccessManager); - } else - { - d->mPage->setNetworkAccessManager(0); - } -} - -void LLEmbeddedBrowserWindow::showWebInspector(bool show) -{ - if ( d ) - { - if ( d->mInspector ) - { - d->mInspector->setVisible( show ); - } - } -} - -void LLEmbeddedBrowserWindow::enableLoadingOverlay(bool enable) -{ - mEnableLoadingOverlay = enable; -} - -// change the background color that gets used between pages (usually white) -void LLEmbeddedBrowserWindow::setBackgroundColor(const uint8_t red, const uint8_t green, const uint8_t blue) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << red << green << blue; -#endif - d->backgroundColor = QColor(red, green, blue); -} - -// -void LLEmbeddedBrowserWindow::setEnabled(bool enabled) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << enabled; -#endif - d->mEnabled = enabled; -} - -// allow consumers of this class to observe events - add themselves as an observer -bool LLEmbeddedBrowserWindow::addObserver(LLEmbeddedBrowserWindowObserver* observer) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << observer; -#endif - return d->mEventEmitter.addObserver(observer); -} - -// allow consumers of this class to observe events - remove themselves as an observer -bool LLEmbeddedBrowserWindow::remObserver(LLEmbeddedBrowserWindowObserver* observer) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << observer; -#endif - return d->mEventEmitter.remObserver(observer); -} - -int LLEmbeddedBrowserWindow::getObserverNumber() -{ - return d->mEventEmitter.getObserverNumber(); -} - -// used by observers of this class to get the current URI -std::string& LLEmbeddedBrowserWindow::getCurrentUri() -{ - d->mCurrentUri = llToStdString(d->mPage->mainFrame()->url()); - return d->mCurrentUri; -} - -// utility method that is used by observers to retrieve data after an event -int16_t LLEmbeddedBrowserWindow::getPercentComplete() -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return d->mPercentComplete; -} - -// utility method that is used by observers to retrieve data after an event -std::string& LLEmbeddedBrowserWindow::getStatusMsg() -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return d->mStatusText; -} - -// render a page into memory and grab the window -unsigned char* LLEmbeddedBrowserWindow::grabWindow(int x, int y, int width, int height) -{ -#if LLEMBEDDEDBROWSER_DEBUG > 10 - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << x << y << width << height; -#endif - // only grab the window if it's enabled - if (!d->mEnabled) - return 0; - - if (!d->mDirty) - return d->mPageBuffer; - - Q_ASSERT(d->mImage.size() == d->mView->size()); - if (!d->mPage->mainFrame()->url().isValid()) - { - d->mImage.fill(d->backgroundColor.value()); - } else - { - QPainter painter(&d->mImage); - - QRectF r(x, y, width, height); - QRect g(0, 0, d->mView->width(), d->mView->height()); - d->mGraphicsView->render(&painter, r, g); - - d->mDirty = false; - - const bool spinner_enabled = false; - if ( spinner_enabled ) - { - const time_t seconds_before_show_overlay = 1; - - if ( mEnableLoadingOverlay && - d->mShowLoadingOverlay && - time(NULL) - d->mTimeLoadStarted >= seconds_before_show_overlay ) - { - painter.setRenderHint(QPainter::Antialiasing);; - - QBrush brush; - QPen pen; - - int size = width; - if ( height < width ) - size = height; - - const int symbol_translucency = 64; // 0=fully trans, 255=opaque - const int symbol_proportion_of_sceen = 8; // (1/8) - const int symbol_diameter = size/(symbol_proportion_of_sceen); - const int symbol_start_line = symbol_diameter*2/3; - const int symbol_end_line = symbol_diameter; - const int symbol_num_segments = 20; - const int symbol_line_width = size/60; - if ( size < 4 ) size = 4; - - QColor background_color(QColor(128,128,128,symbol_translucency)); - brush.setColor(background_color); - brush.setStyle(Qt::SolidPattern); - pen.setColor(background_color); - painter.setPen(pen); - painter.setBrush(brush); - painter.drawRect(0,0,width, height); - - painter.translate(QPoint(width/2, height/2)); - - static int offset=0; - painter.rotate(((qreal)(offset++%(symbol_num_segments))/(qreal)symbol_num_segments)*360.0f); - - for ( int count=0; countmDirty = true; // force dirty so updates happen frequently during load - } - } - - painter.end(); - if (d->mFlipBitmap) - { - d->mImage = d->mImage.mirrored(); - } - d->mImage = d->mImage.rgbSwapped(); - } - - d->mPageBuffer = d->mImage.bits(); - - return d->mPageBuffer; -} - -// return the buffer that contains the rendered page -unsigned char* LLEmbeddedBrowserWindow::getPageBuffer() -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return d->mPageBuffer; -} - -int16_t LLEmbeddedBrowserWindow::getBrowserWidth() -{ -#if LLEMBEDDEDBROWSER_DEBUG > 10 - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return d->mImage.width(); -} - -int16_t LLEmbeddedBrowserWindow::getBrowserHeight() -{ -#if LLEMBEDDEDBROWSER_DEBUG > 10 - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return d->mImage.height(); -} - -int16_t LLEmbeddedBrowserWindow::getBrowserDepth() -{ -#if LLEMBEDDEDBROWSER_DEBUG > 10 - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return 4; -} - -int32_t LLEmbeddedBrowserWindow::getBrowserRowSpan() -{ -#if LLEMBEDDEDBROWSER_DEBUG > 10 - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return 4 * getBrowserWidth(); -} - -bool LLEmbeddedBrowserWindow::navigateTo(const std::string uri) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << QString::fromStdString(uri); -#endif - QUrl url = QUrl::fromUserInput(QString::fromStdString(uri)); - - d->mPage->triggerAction(QWebPage::Stop); - d->mPage->mainFrame()->setUrl(url); - d->mPage->mainFrame()->load(url); - return true; -} - -bool LLEmbeddedBrowserWindow::userAction(LLQtWebKit::EUserAction action) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << action; -#endif - bool result = true; - - switch(action) - { - case LLQtWebKit::UA_EDIT_CUT: - d->mPage->triggerAction(QWebPage::Cut); - break; - case LLQtWebKit::UA_EDIT_COPY: - d->mPage->triggerAction(QWebPage::Copy); - break; - case LLQtWebKit::UA_EDIT_PASTE: - d->mPage->triggerAction(QWebPage::Paste); - break; - case LLQtWebKit::UA_NAVIGATE_STOP: - d->mPage->triggerAction(QWebPage::Stop); - break; - case LLQtWebKit::UA_NAVIGATE_BACK: - d->mPage->triggerAction(QWebPage::Back); - break; - case LLQtWebKit::UA_NAVIGATE_FORWARD: - d->mPage->triggerAction(QWebPage::Forward); - break; - case LLQtWebKit::UA_NAVIGATE_RELOAD: - d->mPage->triggerAction(QWebPage::ReloadAndBypassCache); - break; - default: - result = false; - break; - } - - return result; -} - -bool LLEmbeddedBrowserWindow::userActionIsEnabled(LLQtWebKit::EUserAction action) -{ -#if LLEMBEDDEDBROWSER_DEBUG > 10 - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << action; -#endif - - bool result; - - switch(action) - { - case LLQtWebKit::UA_EDIT_CUT: - result = d->mPage->action(QWebPage::Cut)->isEnabled(); - break; - case LLQtWebKit::UA_EDIT_COPY: - result = d->mPage->action(QWebPage::Copy)->isEnabled(); - break; - case LLQtWebKit::UA_EDIT_PASTE: - result = d->mPage->action(QWebPage::Paste)->isEnabled(); - break; - case LLQtWebKit::UA_NAVIGATE_STOP: - result = true; - break; - case LLQtWebKit::UA_NAVIGATE_BACK: - result = d->mPage->history()->canGoBack(); - break; - case LLQtWebKit::UA_NAVIGATE_FORWARD: - result = d->mPage->history()->canGoForward(); - break; - case LLQtWebKit::UA_NAVIGATE_RELOAD: - result = true; - break; - default: - result = false; - break; - } - return result; -} - -// set the size of the browser window -bool LLEmbeddedBrowserWindow::setSize(int16_t width, int16_t height) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << width << height; -#endif - d->mPageBuffer = NULL; - d->mImage = QImage(QSize(width, height), QImage::Format_RGB32); - d->mGraphicsView->resize(width, height); - d->mView->resize(width, height); - d->mImage.fill(d->backgroundColor.rgb()); - return true; -} - -bool LLEmbeddedBrowserWindow::flipWindow(bool flip) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << flip; -#endif - d->mFlipBitmap = flip; - return true; -} - -static Qt::KeyboardModifiers convert_modifiers(LLQtWebKit::EKeyboardModifier modifiers) -{ - Qt::KeyboardModifiers result = Qt::NoModifier; - - if(modifiers & LLQtWebKit::KM_MODIFIER_SHIFT) - result |= Qt::ShiftModifier; - - if(modifiers & LLQtWebKit::KM_MODIFIER_CONTROL) - result |= Qt::ControlModifier; - - if(modifiers & LLQtWebKit::KM_MODIFIER_ALT) - result |= Qt::AltModifier; - - if(modifiers & LLQtWebKit::KM_MODIFIER_META) - result |= Qt::MetaModifier; - - return result; -} - -static Qt::MouseButton qt_button_from_button_number(int button) -{ - Qt::MouseButton result; - - switch(button) - { - default: result = Qt::NoButton; break; - case 0: result = Qt::LeftButton; break; - case 1: result = Qt::RightButton; break; - case 2: result = Qt::MidButton; break; - case 3: result = Qt::XButton1; break; - case 4: result = Qt::XButton2; break; - } - - return result; -} - -static QEvent::Type event_from_mouse_event(LLQtWebKit::EMouseEvent mouse_event) -{ - QEvent::Type result; - - switch(mouse_event) - { - default: - result = QEvent::None; - break; - - case LLQtWebKit::ME_MOUSE_MOVE: - result = QEvent::MouseMove; - break; - - case LLQtWebKit::ME_MOUSE_DOWN: - result = QEvent::MouseButtonPress; - break; - - case LLQtWebKit::ME_MOUSE_UP: - result = QEvent::MouseButtonRelease; - break; - - case LLQtWebKit::ME_MOUSE_DOUBLE_CLICK: - result = QEvent::MouseButtonDblClick; - break; - } - - return result; -} - -static QEvent::Type event_from_keyboard_event(LLQtWebKit::EKeyEvent keyboard_event) -{ - QEvent::Type result; - - switch(keyboard_event) - { - default: - result = QEvent::None; - break; - - case LLQtWebKit::KE_KEY_DOWN: - case LLQtWebKit::KE_KEY_REPEAT: - result = QEvent::KeyPress; - break; - - case LLQtWebKit::KE_KEY_UP: - result = QEvent::KeyRelease; - break; - } - - return result; -} - -void LLEmbeddedBrowserWindow::mouseEvent(LLQtWebKit::EMouseEvent mouse_event, int16_t button, int16_t x, int16_t y, LLQtWebKit::EKeyboardModifier modifiers) -{ -#if LLEMBEDDEDBROWSER_DEBUG > 10 - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << x << y; -#endif - - QEvent::Type type = event_from_mouse_event(mouse_event); - Qt::MouseButton qt_button = qt_button_from_button_number(button); - Qt::KeyboardModifiers qt_modifiers = convert_modifiers(modifiers); - - if(type == QEvent::MouseMove) - { - // Mouse move events should always use "no button". - qt_button = Qt::NoButton; - } - - // FIXME: should the current button state be updated before or after constructing the event? - switch(type) - { - case QEvent::MouseButtonPress: - case QEvent::MouseButtonDblClick: - d->mCurrentMouseButtonState |= qt_button; - break; - - case QEvent::MouseButtonRelease: - d->mCurrentMouseButtonState &= ~qt_button; - break; - - default: - break; - } - - QMouseEvent event(type, QPoint(x, y), qt_button, d->mCurrentMouseButtonState, qt_modifiers); - - qt_sendSpontaneousEvent(d->mGraphicsView->viewport(), &event); -} - -void LLEmbeddedBrowserWindow::scrollWheelEvent(int16_t x, int16_t y, int16_t scroll_x, int16_t scroll_y, LLQtWebKit::EKeyboardModifier modifiers) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << x << y; -#endif - - Qt::KeyboardModifiers qt_modifiers = convert_modifiers(modifiers); - - if(scroll_y != 0) - { - QWheelEvent event(QPoint(x, y), scroll_y, d->mCurrentMouseButtonState, qt_modifiers, Qt::Vertical); - qApp->sendEvent(d->mGraphicsView->viewport(), &event); - } - - if(scroll_x != 0) - { - QWheelEvent event(QPoint(x, y), scroll_x, d->mCurrentMouseButtonState, qt_modifiers, Qt::Horizontal); - qApp->sendEvent(d->mGraphicsView->viewport(), &event); - } -} - - -// utility methods to set an error message so something else can look at it -void LLEmbeddedBrowserWindow::scrollByLines(int16_t lines) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << lines; -#endif - int currentScrollValue = d->mPage->mainFrame()->scrollBarValue(Qt::Vertical); - d->mPage->mainFrame()->setScrollBarValue(Qt::Vertical, currentScrollValue + lines); -} - -// Send a keyboard event with native event data. -void LLEmbeddedBrowserWindow::keyboardEvent( - LLQtWebKit::EKeyEvent key_event, - uint32_t key_code, - const char *utf8_text, - LLQtWebKit::EKeyboardModifier modifiers, - uint32_t native_scan_code, - uint32_t native_virtual_key, - uint32_t native_modifiers) -{ - QEvent::Type type = event_from_keyboard_event(key_event); - Qt::KeyboardModifiers qt_modifiers = convert_modifiers(modifiers); - bool auto_repeat = (key_event == LLQtWebKit::KE_KEY_REPEAT); - QString text = QString::fromUtf8(utf8_text); - - Qt::Key key = Qt::Key_unknown; - - switch (key_code) - { - case LLQtWebKit::KEY_RETURN: key = Qt::Key_Return; break; - case LLQtWebKit::KEY_LEFT: key = Qt::Key_Left; break; - case LLQtWebKit::KEY_RIGHT: key = Qt::Key_Right; break; - case LLQtWebKit::KEY_UP: key = Qt::Key_Up; break; - case LLQtWebKit::KEY_DOWN: key = Qt::Key_Down; break; - case LLQtWebKit::KEY_ESCAPE: key = Qt::Key_Escape; break; - case LLQtWebKit::KEY_BACKSPACE: key = Qt::Key_Backspace; break; - case LLQtWebKit::KEY_DELETE: key = Qt::Key_Delete; break; - case LLQtWebKit::KEY_SHIFT: key = Qt::Key_Shift; break; - case LLQtWebKit::KEY_CONTROL: key = Qt::Key_Control; break; - case LLQtWebKit::KEY_ALT: key = Qt::Key_Alt; break; - case LLQtWebKit::KEY_HOME: key = Qt::Key_Home; break; - case LLQtWebKit::KEY_END: key = Qt::Key_End; break; - case LLQtWebKit::KEY_PAGE_UP: key = Qt::Key_PageUp; break; - case LLQtWebKit::KEY_PAGE_DOWN: key = Qt::Key_PageDown; break; - case LLQtWebKit::KEY_HYPHEN: key = Qt::Key_hyphen; break; - case LLQtWebKit::KEY_EQUALS: key = Qt::Key_Equal; break; - case LLQtWebKit::KEY_INSERT: key = Qt::Key_Insert; break; - case LLQtWebKit::KEY_CAPSLOCK: key = Qt::Key_CapsLock; break; - case LLQtWebKit::KEY_TAB: key = Qt::Key_Tab; break; - case LLQtWebKit::KEY_ADD: key = Qt::Key_Plus; break; - case LLQtWebKit::KEY_SUBTRACT: key = Qt::Key_Minus; break; - case LLQtWebKit::KEY_MULTIPLY: key = Qt::Key_Asterisk; break; - case LLQtWebKit::KEY_DIVIDE: key = Qt::Key_Slash; break; - case LLQtWebKit::KEY_F1: key = Qt::Key_F1; break; - case LLQtWebKit::KEY_F2: key = Qt::Key_F2; break; - case LLQtWebKit::KEY_F3: key = Qt::Key_F3; break; - case LLQtWebKit::KEY_F4: key = Qt::Key_F4; break; - case LLQtWebKit::KEY_F5: key = Qt::Key_F5; break; - case LLQtWebKit::KEY_F6: key = Qt::Key_F6; break; - case LLQtWebKit::KEY_F7: key = Qt::Key_F7; break; - case LLQtWebKit::KEY_F8: key = Qt::Key_F8; break; - case LLQtWebKit::KEY_F9: key = Qt::Key_F9; break; - case LLQtWebKit::KEY_F10: key = Qt::Key_F10; break; - case LLQtWebKit::KEY_F11: key = Qt::Key_F11; break; - case LLQtWebKit::KEY_F12: key = Qt::Key_F12; break; - - case LLQtWebKit::KEY_PAD_UP: key = Qt::Key_Up; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_DOWN: key = Qt::Key_Down; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_LEFT: key = Qt::Key_Left; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_RIGHT: key = Qt::Key_Right; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_HOME: key = Qt::Key_Home; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_END: key = Qt::Key_End; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_PGUP: key = Qt::Key_PageUp; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_PGDN: key = Qt::Key_PageDown; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_CENTER: key = Qt::Key_5; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_INS: key = Qt::Key_Insert; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_DEL: key = Qt::Key_Delete; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_RETURN: key = Qt::Key_Enter; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_ADD: key = Qt::Key_Plus; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_SUBTRACT: key = Qt::Key_Minus; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_MULTIPLY: key = Qt::Key_Asterisk; qt_modifiers |= Qt::KeypadModifier; break; - case LLQtWebKit::KEY_PAD_DIVIDE: key = Qt::Key_Slash; qt_modifiers |= Qt::KeypadModifier; break; - - case LLQtWebKit::KEY_NONE: key = Qt::Key_unknown; break; - - default: - key = (Qt::Key)toupper(key_code); - break; - } - - - QKeyEvent *event = - QKeyEvent::createExtendedKeyEvent( - type, - key, - qt_modifiers, - native_scan_code, - native_virtual_key, - native_modifiers, - text, - auto_repeat, - text.count()); - - qApp->sendEvent(d->mGraphicsScene, event); - - delete event; -} - - -// give focus to the browser so that input keyboard events work -void LLEmbeddedBrowserWindow::focusBrowser(bool focus_browser) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << focus_browser; -#endif - QEvent ev(QEvent::WindowActivate); - qApp->sendEvent(d->mGraphicsScene, &ev); - - QEvent ev2(QEvent::ActivationChange); - qApp->sendEvent(d->mGraphicsScene, &ev2); - - QFocusEvent event(focus_browser ? QEvent::FocusIn : QEvent::FocusOut, Qt::ActiveWindowFocusReason); - qApp->sendEvent(d->mPage, &event); -} - -void LLEmbeddedBrowserWindow::setWindowId(int window_id) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << window_id; -#endif - d->mWindowId = window_id; -} - -int LLEmbeddedBrowserWindow::getWindowId() -{ - return d->mWindowId; -} - -void LLEmbeddedBrowserWindow::proxyWindowOpened(const std::string target, const std::string uuid) -{ - LLWebPageOpenShim *shim = findShim(uuid); - if(!shim) - { - // We don't already have a shim with this uuid -- create one. - shim = new LLWebPageOpenShim(this, d->mPage); - d->mProxyPages.push_back(shim); - -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow::proxyWindowOpened: page list size is " << d->mProxyPages.size(); -#endif - } - - shim->setProxy(target, uuid); -} - -void LLEmbeddedBrowserWindow::proxyWindowClosed(const std::string uuid) -{ - LLWebPageOpenShim *shim = findShim(uuid); - if(shim) - { - deleteShim(shim); - } -} - -std::string LLEmbeddedBrowserWindow::evaluateJavaScript(std::string script) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << QString::fromStdString(script); -#endif - QString q_script = QString::fromStdString(script); - QString result = d->mPage->mainFrame()->evaluateJavaScript(q_script).toString(); - return llToStdString(result); -} - -void LLEmbeddedBrowserWindow::setHostLanguage(const std::string host_language) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << QString::fromStdString(host_language); -#endif - if ( d ) - if ( d->mPage ) - d->mPage->setHostLanguage( host_language ); -} - -void LLEmbeddedBrowserWindow::navigateErrorPage( int http_status_code ) -{ - LLEmbeddedBrowserWindowEvent event(getWindowId()); - event.setIntValue( http_status_code ); - - d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onNavigateErrorPage, event); -} - -void LLEmbeddedBrowserWindow::setNoFollowScheme(std::string scheme) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__ << QString::fromStdString(scheme); -#endif - d->mNoFollowScheme = QString::fromStdString(scheme); - // The scheme part of the url is what is before '://' - d->mNoFollowScheme = d->mNoFollowScheme.mid(0, d->mNoFollowScheme.indexOf("://")); -} - -std::string LLEmbeddedBrowserWindow::getNoFollowScheme() -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow" << __FUNCTION__; -#endif - return llToStdString(d->mNoFollowScheme); -} - -void LLEmbeddedBrowserWindow::prependHistoryUrl(std::string url) -{ -#ifdef WEBHISTORYPATCH - // *HACK: we only have a URL here, we set a "" title and "current time" as - // last visited time. - d->mPage->history()->prependItem(QString::fromStdString(url), - QString::fromAscii(""), - QDateTime::currentDateTime()); -#else - Q_UNUSED(url); -#endif -} - -void LLEmbeddedBrowserWindow::clearHistory() -{ - d->mPage->history()->clear(); -} - -std::string LLEmbeddedBrowserWindow::dumpHistory() -{ - std::ostringstream oss; - const QList &items = d->mPage->history()->backItems(9999); - oss << "cur: " << d->mPage->history()->currentItemIndex() << ":" - << d->mPage->history()->currentItem().url().toString().toAscii().data() << "\n"; - for (int i=0; i< items.count(); i++) { - oss << items[i].url().toString().toAscii().data() << "\n"; - } - return oss.str(); -} - -void LLEmbeddedBrowserWindow::cookieChanged(const std::string &cookie, const std::string &url, bool dead) -{ - LLEmbeddedBrowserWindowEvent event(getWindowId()); - event.setEventUri(url); - event.setStringValue(cookie); - event.setIntValue((int)dead); - - d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onCookieChanged, event); -} - -QWebPage *LLEmbeddedBrowserWindow::createWindow() -{ - QWebPage *result = NULL; - if(d->mOpeningSelf) - { - // Special case: opening self to set target, etc. -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow::createWindow: opening self to set target name. "; -#endif - result = d->mPage; - d->mOpeningSelf = false; - } - else - { - LLWebPageOpenShim *shim = new LLWebPageOpenShim(this, d->mPage); - d->mProxyPages.push_back(shim); - result = shim; - -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow::createWindow: page list size is " << d->mProxyPages.size(); -#endif - } - - return result; -} - -LLWebPageOpenShim *LLEmbeddedBrowserWindow::findShim(const std::string &uuid) -{ - LLEmbeddedBrowserWindowPrivate::ProxyList::iterator iter; - for(iter = d->mProxyPages.begin(); iter != d->mProxyPages.end(); iter++) - { - if((*iter)->matchesUUID(uuid)) - return *iter; - } - - return NULL; -} - -void LLEmbeddedBrowserWindow::deleteShim(LLWebPageOpenShim *shim) -{ - shim->window = 0; - shim->deleteLater(); - d->mProxyPages.remove(shim); - -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow::deleteShim: page list size is " << d->mProxyPages.size(); -#endif -} - -void LLEmbeddedBrowserWindow::setTarget(const std::string &target) -{ -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow::setTarget: setting target to " << QString::fromStdString(target); -#endif - - d->mOpeningSelf = true; - - std::stringstream s; - s << "window.open(\"\",\"" << target << "\");"; - - evaluateJavaScript(s.str()); -} - -std::string LLEmbeddedBrowserWindow::requestFilePicker() -{ - std::string filename_chosen; - - LLEmbeddedBrowserWindowEvent event(getWindowId()); - event.setEventUri(getCurrentUri()); - event.setStringValue("*.png;*.jpg"); - - // If there's at least one observer registered, call it with the event. - LLEmbeddedBrowserWindowPrivate::Emitter::iterator i = d->mEventEmitter.begin(); - if(i != d->mEventEmitter.end()) - { - filename_chosen = (*i)->onRequestFilePicker(event); - } - - return filename_chosen; -} - -bool LLEmbeddedBrowserWindow::authRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password) -{ - bool result = false; - -#ifdef LLEMBEDDEDBROWSER_DEBUG - qDebug() << "LLEmbeddedBrowserWindow::authRequest: requesting auth for url " << QString::fromStdString(in_url) << ", realm " << QString::fromStdString(in_realm); -#endif - - // If there's at least one observer registered, send it the auth request. - LLEmbeddedBrowserWindowPrivate::Emitter::iterator i = d->mEventEmitter.begin(); - if(i != d->mEventEmitter.end()) - { - result = (*i)->onAuthRequest(in_url, in_realm, out_username, out_password); - } - - return result; -} - -bool LLEmbeddedBrowserWindow::certError(const std::string &in_url, const std::string &in_msg) -{ - bool result = false; - - // If there's at least one observer registered, send it the auth request. - LLEmbeddedBrowserWindowPrivate::Emitter::iterator i = d->mEventEmitter.begin(); - if(i != d->mEventEmitter.end()) - { - result = (*i)->onCertError(in_url, in_msg); - } - - return result; -} - -void LLEmbeddedBrowserWindow::onQtDebugMessage( const std::string& msg, const std::string& msg_type) -{ - // If there's at least one observer registered, send it the auth request. - LLEmbeddedBrowserWindowPrivate::Emitter::iterator i = d->mEventEmitter.begin(); - if(i != d->mEventEmitter.end()) - { - (*i)->onQtDebugMessage(msg, msg_type); - } -} - -void LLEmbeddedBrowserWindow::setWhiteListRegex( const std::string& regex ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setWhiteListRegex( regex ); -} - -// Second Life viewer specific functions -void LLEmbeddedBrowserWindow::setSLObjectEnabled( bool enabled ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setSLObjectEnabled( enabled ); -} - -void LLEmbeddedBrowserWindow::setAgentLanguage( const std::string& agent_language ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setAgentLanguage( agent_language ); -} - -void LLEmbeddedBrowserWindow::setAgentRegion( const std::string& agent_region ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setAgentRegion( agent_region ); -} - -void LLEmbeddedBrowserWindow::setAgentLocation( double x, double y, double z ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setAgentLocation( x, y, z ); -} - -void LLEmbeddedBrowserWindow::setAgentGlobalLocation( double x, double y, double z ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setAgentGlobalLocation( x, y, z ); -} - -void LLEmbeddedBrowserWindow::setAgentOrientation( double angle ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setAgentOrientation( angle ); -} - -void LLEmbeddedBrowserWindow::setAgentMaturity( const std::string& agent_maturity ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setAgentMaturity( agent_maturity ); -} - -void LLEmbeddedBrowserWindow::emitLocation() -{ - if ( d ) - if ( d->mPage ) - d->mPage->emitLocation(); -} - -void LLEmbeddedBrowserWindow::emitMaturity() -{ - if ( d ) - if ( d->mPage ) - d->mPage->emitMaturity(); -} - -void LLEmbeddedBrowserWindow::emitLanguage() -{ - if ( d ) - if ( d->mPage ) - d->mPage->emitLanguage(); -} - -void LLEmbeddedBrowserWindow::setPageZoomFactor( double factor ) -{ - if ( d ) - if ( d->mPage ) - d->mPage->setPageZoomFactor( factor ); -} - -LLGraphicsScene::LLGraphicsScene() - : QGraphicsScene() - , window(0) -{ - connect(this, SIGNAL(changed(const QList &)), - this, SLOT(repaintRequestedSlot(const QList &))); -} - -void LLGraphicsScene::repaintRequestedSlot(const QList ®ions) -{ - if (!window) - return; - window->d->mDirty = true; - for (int i = 0; i < regions.count(); ++i) - { - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - event.setRectValue(regions[i].x(), regions[i].y(), regions[i].width(), regions[i].height()); - - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onPageChanged, event); - } -} - -#include -#include -LLWebView::LLWebView(QGraphicsItem *parent) - : QGraphicsWebView(parent) - , window(0) -{ -} - -bool LLWebView::event(QEvent* event) -{ - if (window && event->type() == QEvent::CursorChange) { - QCursor cursor = this->cursor(); - if (currentShape != cursor.shape()) { - currentShape = cursor.shape(); - LLQtWebKit::ECursor llcursor; - switch(currentShape) - { - case Qt::ArrowCursor: - llcursor = LLQtWebKit::C_ARROW; - break; - case Qt::PointingHandCursor: - llcursor = LLQtWebKit::C_POINTINGHAND; - break; - case Qt::IBeamCursor: - llcursor = LLQtWebKit::C_IBEAM; - break; - case Qt::SplitVCursor: - llcursor = LLQtWebKit::C_SPLITV; - break; - case Qt::SplitHCursor: - llcursor = LLQtWebKit::C_SPLITH; - break; - default: - qWarning() << "Unhandled cursor shape:" << currentShape; - llcursor = LLQtWebKit::C_ARROW; - } - - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - event.setIntValue((int)llcursor); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onCursorChanged, event); - } - - return true; - } - return QGraphicsWebView::event(event); -} - - -std::string llToStdString(const QString &s) -{ - return llToStdString(s.toUtf8()); -} - -std::string llToStdString(const QByteArray &bytes) -{ - return std::string(bytes.constData(), bytes.size()); -} - -std::string llToStdString(const QUrl &url) -{ - return llToStdString(url.toEncoded()); -} diff --git a/indra/llqtwebkit/llembeddedbrowserwindow.h b/indra/llqtwebkit/llembeddedbrowserwindow.h deleted file mode 100644 index 0c8080c15..000000000 --- a/indra/llqtwebkit/llembeddedbrowserwindow.h +++ /dev/null @@ -1,185 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLEMBEDDEDBROWSERWINDOW_H -#define LLEMBEDDEDBROWSERWINDOW_H - -#include -#include -#include -#if defined _MSC_VER && _MSC_VER < 1600 -#include "pstdint.h" -#else -#include // Use the C99 official header -#endif - -#include "llqtwebkit.h" - -class LLEmbeddedBrowser; -class LLWebPageOpenShim; -class QWebPage; - -//////////////////////////////////////////////////////////////////////////////// -// class for a "window" that holds a browser - there can be lots of these -class LLEmbeddedBrowserWindowPrivate; -class LLEmbeddedBrowserWindow -{ -public: - LLEmbeddedBrowserWindow(); - virtual ~LLEmbeddedBrowserWindow(); - - // housekeeping - void setParent(LLEmbeddedBrowser* parent); - bool setSize(int16_t width, int16_t height); - void focusBrowser(bool focus_browser); - void scrollByLines(int16_t lines); - void setWindowId(int window_id); - int getWindowId(); - void proxyWindowOpened(const std::string target, const std::string uuid); - void proxyWindowClosed(const std::string uuid); - - // random accessors - int16_t getPercentComplete(); - std::string& getStatusMsg(); - std::string& getCurrentUri(); - - // memory buffer management - unsigned char* grabWindow(int x, int y, int width, int height); - bool flipWindow(bool flip); - unsigned char* getPageBuffer(); - int16_t getBrowserWidth(); - int16_t getBrowserHeight(); - int16_t getBrowserDepth(); - int32_t getBrowserRowSpan(); - - // set background color that you see in between pages - default is white but sometimes useful to change - void setBackgroundColor(const uint8_t red, const uint8_t green, const uint8_t blue); - - // can turn off updates to a page - e.g. when it's hidden by your windowing system - void setEnabled(bool enabledIn); - - // navigation - bool userAction(LLQtWebKit::EUserAction action); - bool userActionIsEnabled(LLQtWebKit::EUserAction action); - bool navigateTo(const std::string uri); - - // javascript access/control - std::string evaluateJavaScript(std::string script); - - // redirection when you hit an error page - void navigateErrorPage( int http_status_code ); - - // host language setting - void setHostLanguage(const std::string host_language); - - // mouse & keyboard events - void mouseEvent(LLQtWebKit::EMouseEvent mouse_event, int16_t button, int16_t x, int16_t y, LLQtWebKit::EKeyboardModifier modifiers); - void scrollWheelEvent(int16_t x, int16_t y, int16_t scroll_x, int16_t scroll_y, LLQtWebKit::EKeyboardModifier modifiers); - void keyboardEvent( - LLQtWebKit::EKeyEvent key_event, - uint32_t key_code, - const char *utf8_text, - LLQtWebKit::EKeyboardModifier modifiers, - uint32_t native_scan_code, - uint32_t native_virtual_key, - uint32_t native_modifiers); - - // allow consumers of this class and to observe browser events - bool addObserver(LLEmbeddedBrowserWindowObserver* observer); - bool remObserver(LLEmbeddedBrowserWindowObserver* observer); - int getObserverNumber(); - - // accessor/mutator for scheme that browser doesn't follow - e.g. secondlife.com:// - void setNoFollowScheme(std::string scheme); - std::string getNoFollowScheme(); - - // prepend the current history with the given url - void prependHistoryUrl(std::string url); - // clear the URL history - void clearHistory(); - std::string dumpHistory(); - - void cookieChanged(const std::string &cookie, const std::string &url, bool dead); - - QWebPage *createWindow(); - - LLWebPageOpenShim *findShim(const std::string &uuid); - void deleteShim(LLWebPageOpenShim *shim); - void setTarget(const std::string &target); - - std::string requestFilePicker(); - - void showWebInspector(bool enabled); - - bool authRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password); - bool certError(const std::string &in_url, const std::string &in_msg); - - void onQtDebugMessage( const std::string& msg, const std::string& msg_type); - - void enableLoadingOverlay(bool enable); - - void setWhiteListRegex( const std::string& regex ); - - void setPageZoomFactor( double factor ); - - // Second Life specific functions - void setSLObjectEnabled( bool enabled ); - void setAgentLanguage( const std::string& agent_language ); - void setAgentRegion( const std::string& agent_region ); - void setAgentLocation( double x, double y, double z ); - void setAgentGlobalLocation( double x, double y, double z ); - void setAgentOrientation( double angle ); - void setAgentMaturity( const std::string& agent_maturity ); - void emitLocation(); - void emitMaturity(); - void emitLanguage(); - -private: - friend class LLWebPage; - friend class LLWebPageOpenShim; - friend class LLGraphicsScene; - friend class LLWebView; - friend class LLEmbeddedBrowserPrivate; - LLEmbeddedBrowserWindowPrivate *d; - bool mEnableLoadingOverlay; - -}; - - -// QString::toStdString converts to ascii, not utf8. Define our own versions that do utf8. - -#ifdef QSTRING_H -std::string llToStdString(const QString &s); -#endif - -#ifdef QBYTEARRAY_H -std::string llToStdString(const QByteArray &bytes); -#endif - -#ifdef QURL_H -std::string llToStdString(const QUrl &url); -#endif - -#endif // LLEMBEDEDDBROWSERWINDOW_H diff --git a/indra/llqtwebkit/llembeddedbrowserwindow_p.h b/indra/llqtwebkit/llembeddedbrowserwindow_p.h deleted file mode 100644 index 27b36d947..000000000 --- a/indra/llqtwebkit/llembeddedbrowserwindow_p.h +++ /dev/null @@ -1,251 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLEMBEDDEDBROWSERWINDOW_P_H -#define LLEMBEDDEDBROWSERWINDOW_P_H - -#include "llwebpage.h" -#include "llwebpageopenshim.h" - -#include -#include -#include -#include -#include - -/////////////////////////////////////////////////////////////////////////////// -// manages the process of storing and emitting events that the consumer -// of the embedding class can observe -template< class T > -class LLEmbeddedBrowserWindowEmitter -{ - public: - LLEmbeddedBrowserWindowEmitter() { }; - ~LLEmbeddedBrowserWindowEmitter() { }; - - typedef typename T::EventType EventType; - typedef std::list< T* > ObserverContainer; - typedef typename ObserverContainer::iterator iterator; - typedef void(T::*observerMethod)(const EventType&); - - /////////////////////////////////////////////////////////////////////////////// - // - bool addObserver(T* observer) - { - if (! observer) - return false; - - if (std::find(observers.begin(), observers.end(), observer) != observers.end()) - return false; - - observers.push_back(observer); - - return true; - } - - /////////////////////////////////////////////////////////////////////////////// - // - bool remObserver(T* observer) - { - if (! observer) - return false; - - observers.remove(observer); - - return true; - } - - /////////////////////////////////////////////////////////////////////////////// - // - void update(observerMethod method, const EventType& msg) - { - typename std::list< T* >::iterator iter = observers.begin(); - - while(iter != observers.end()) - { - ((*iter)->*method)(msg); - ++iter; - } - } - - int getObserverNumber() - { - return observers.size(); - } - - iterator begin() - { - return observers.begin(); - } - - iterator end() - { - return observers.end(); - } - - protected: - ObserverContainer observers; -}; - -#include "llqtwebkit.h" -#include "llembeddedbrowserwindow.h" -#include -#include - -class LLGraphicsScene : public QGraphicsScene -{ - Q_OBJECT - -public: - LLGraphicsScene(); - LLEmbeddedBrowserWindow *window; - - void mouseMoveEvent(QGraphicsSceneMouseEvent *mouseEvent) { - QGraphicsScene::mouseMoveEvent(mouseEvent); - mouseEvent->setAccepted(true); - mouseEvent->setButtons(Qt::LeftButton); - } - -private slots: - void repaintRequestedSlot(const QList &); - friend class LLEmbeddedBrowserWindow; -}; - - -class LLWebView : public QGraphicsWebView -{ - Q_OBJECT - -public: - LLWebView(QGraphicsItem *parent = 0); - LLEmbeddedBrowserWindow *window; - - static QUrl guessUrlFromString(const QString &string); - - int width() const { return boundingRect().width(); } - int height() const { return boundingRect().height(); } - -protected: - bool event(QEvent *event); - - Qt::CursorShape currentShape; -}; - -class LLEmbeddedBrowserWindowPrivate -{ - public: - LLEmbeddedBrowserWindowPrivate() - : mParent(0) - , mPage(0) - , mView(0) - , mGraphicsScene(0) - , mGraphicsView(0) - , mInspector(0) - , mCurrentMouseButtonState(Qt::NoButton) - , mPercentComplete(0) - , mShowLoadingOverlay(false) - , mTimeLoadStarted(0) - , mStatusText("") - , mTitle("") - , mCurrentUri("") - , mNoFollowScheme("secondlife") - , mWindowId(-1) - , mEnabled(true) - , mFlipBitmap(false) - , mPageBuffer(NULL) - , mDirty(false) - , mOpeningSelf(false) - { - } - - ~LLEmbeddedBrowserWindowPrivate() - { - while(!mProxyPages.empty()) - { - ProxyList::iterator iter = mProxyPages.begin(); - (*iter)->window = 0; - (*iter)->deleteLater(); - } - - if(mGraphicsScene) - { - mGraphicsScene->window = 0; - } - if(mPage) - { - mPage->window = 0; - } - if(mView) - { - mView->deleteLater(); - } - if(mGraphicsScene) - { - mGraphicsScene->deleteLater(); - } - if(mGraphicsView) - { - mGraphicsView->viewport()->setParent(mGraphicsView); - mGraphicsView->deleteLater(); - } - if(mInspector) - { - mInspector->deleteLater(); - } - } - - typedef LLEmbeddedBrowserWindowEmitter< LLEmbeddedBrowserWindowObserver> Emitter; - Emitter mEventEmitter; - QImage mImage; - LLEmbeddedBrowser *mParent; - LLWebPage *mPage; - typedef std::list ProxyList; - ProxyList mProxyPages; - - LLWebView *mView; - QWebInspector* mInspector; - LLGraphicsScene *mGraphicsScene; - QGraphicsView *mGraphicsView; - Qt::MouseButtons mCurrentMouseButtonState; - - int16_t mPercentComplete; - bool mShowLoadingOverlay; - time_t mTimeLoadStarted; - std::string mStatusText; - std::string mTitle; - std::string mCurrentUri; - QString mNoFollowScheme; - int mWindowId; - bool mEnabled; - bool mFlipBitmap; - unsigned char* mPageBuffer; - QColor backgroundColor; - bool mDirty; - bool mOpeningSelf; -}; - - -#endif - diff --git a/indra/llqtwebkit/lljsobject.cpp b/indra/llqtwebkit/lljsobject.cpp deleted file mode 100644 index f5abfa702..000000000 --- a/indra/llqtwebkit/lljsobject.cpp +++ /dev/null @@ -1,153 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include "lljsobject.h" - -LLJsObject::LLJsObject( QObject* parent ) : - QObject( parent ) -{ - mEnabled = false; - - mAgentLanguage = QString(); - mAgentMaturity = QString(); - mAgentRegion = QString(); - - mAgentLocation[ "x" ] = 0.0; - mAgentLocation[ "y" ] = 0.0; - mAgentLocation[ "z" ] = 0.0; - - mAgentGlobalLocation[ "x" ] = 0.0; - mAgentGlobalLocation[ "y" ] = 0.0; - mAgentGlobalLocation[ "z" ] = 0.0; -} - -void LLJsObject::setSLObjectEnabled( bool enabled ) -{ - mEnabled = enabled; -} - -bool LLJsObject::getSLObjectEnabled() -{ - return mEnabled; -} - -void LLJsObject::setAgentLanguage( const QString& agent_language ) -{ - if ( mEnabled ) - { - mAgentLanguage = agent_language; - } - else - { - mAgentLanguage = QString(); - } -} - -void LLJsObject::setAgentRegion( const QString& agent_region ) -{ - if ( mEnabled ) - { - mAgentRegion = agent_region; - } - else - { - mAgentRegion = QString(); - } -} - -void LLJsObject::setAgentMaturity( const QString& agent_maturity ) -{ - if ( mEnabled ) - { - mAgentMaturity = agent_maturity; - } - else - { - mAgentMaturity = QString(); - } -} - -void LLJsObject::setAgentLocation( const QVariantMap agent_location ) -{ - if ( mEnabled ) - { - mAgentLocation = agent_location; - } - else - { - mAgentLocation[ "x" ] = 0.0; - mAgentLocation[ "y" ] = 0.0; - mAgentLocation[ "z" ] = 0.0; - } -} - -void LLJsObject::setAgentGlobalLocation( const QVariantMap agent_global_location ) -{ - if ( mEnabled ) - { - mAgentGlobalLocation = agent_global_location; - } - else - { - mAgentGlobalLocation[ "x" ] = 0.0; - mAgentGlobalLocation[ "y" ] = 0.0; - mAgentGlobalLocation[ "z" ] = 0.0; - } -} - -void LLJsObject::setAgentOrientation( const double angle ) -{ - if ( mEnabled ) - { - mAgentOrientation = angle; - } - else - { - mAgentOrientation = 0.0; - } -} - -void LLJsObject::emitLocation() -{ - QVariantMap agent_location; - - agent_location[ "region" ] = mAgentRegion; - agent_location[ "location" ] = mAgentLocation; - agent_location[ "orientation" ] = mAgentOrientation; - agent_location[ "globalLocation" ] = mAgentGlobalLocation; - - emit getLocation( agent_location ); -} - -void LLJsObject::emitMaturity() -{ - emit getMaturity( mAgentMaturity ); -} - -void LLJsObject::emitLanguage() -{ - emit getLanguage( mAgentLanguage ); -} diff --git a/indra/llqtwebkit/lljsobject.h b/indra/llqtwebkit/lljsobject.h deleted file mode 100644 index 806a8a8a1..000000000 --- a/indra/llqtwebkit/lljsobject.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLJSOBJECT_H -#define LLJSOBJECT_H - -#include -#include -#include - -class LLJsObject : - public QObject -{ - Q_OBJECT - - public: - LLJsObject( QObject* parent = 0 ); - - void setSLObjectEnabled( bool enabled ); - bool getSLObjectEnabled(); - - void setAgentLanguage( const QString& agent_language ); - void setAgentRegion( const QString& agent_region ); - void setAgentMaturity( const QString& agent_maturity ); - void setAgentLocation( const QVariantMap agent_location ); - void setAgentGlobalLocation( const QVariantMap agent_global_location ); - void setAgentOrientation( const double angle ); - - void emitLocation(); - void emitMaturity(); - void emitLanguage(); - - signals: - void getLocation( const QVariantMap agent_location ); - void getMaturity( const QString agent_maturity ); - void getLanguage( const QString agent_language ); - - private: - bool mEnabled; - - QString mAgentLanguage; - QString mAgentMaturity; - QString mAgentRegion; - QVariantMap mAgentLocation; - QVariantMap mAgentGlobalLocation; - double mAgentOrientation; -}; - -#endif // LLJSOBJECT_H diff --git a/indra/llqtwebkit/llnetworkaccessmanager.cpp b/indra/llqtwebkit/llnetworkaccessmanager.cpp deleted file mode 100644 index 2a51f1340..000000000 --- a/indra/llqtwebkit/llnetworkaccessmanager.cpp +++ /dev/null @@ -1,247 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include "llnetworkaccessmanager.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "llembeddedbrowserwindow.h" -#include "llembeddedbrowser_p.h" - -#include "ui_passworddialog.h" - - -LLNetworkAccessManager::LLNetworkAccessManager(LLEmbeddedBrowserPrivate* browser,QObject* parent) - : QNetworkAccessManager(parent) - , mBrowser(browser) -{ - connect(this, SIGNAL(finished(QNetworkReply*)), - this, SLOT(finishLoading(QNetworkReply*))); - connect(this, SIGNAL(authenticationRequired(QNetworkReply*, QAuthenticator*)), - this, SLOT(authenticationRequiredSlot(QNetworkReply*, QAuthenticator*))); - connect(this, SIGNAL(sslErrors( QNetworkReply *, const QList &)), - this, SLOT(sslErrorsSlot( QNetworkReply *, const QList & ))); -} - -QNetworkReply *LLNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, - QIODevice *outgoingData) -{ - - // Create a local copy of the request we can modify. - QNetworkRequest mutable_request(request); - - // Set an Accept-Language header in the request, based on what the host has set through setHostLanguage. - mutable_request.setRawHeader(QByteArray("Accept-Language"), QByteArray(mBrowser->mHostLanguage.c_str())); - - // this is undefine'd in 4.7.1 and leads to caching issues - setting it here explicitly - mutable_request.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork); - - if(op == GetOperation) - { - // GET requests should not have a Content-Type header, but it seems somebody somewhere is adding one. - // This removes it. - mutable_request.setRawHeader("Content-Type", QByteArray()); - } - -// qDebug() << "headers for request:" << mutable_request.rawHeaderList(); - - // and pass this through to the parent implementation - return QNetworkAccessManager::createRequest(op, mutable_request, outgoingData); -} - -void LLNetworkAccessManager::sslErrorsSlot(QNetworkReply* reply, const QList& errors) -{ - // Enabling this can help diagnose certificate verification issues. - const bool ssl_debugging_on = false; - - // flag that indicates if the error that brought us here is one we care about or not - bool valid_ssl_error = false; - - foreach( const QSslError &error, errors ) - { - if ( ssl_debugging_on ) - { - qDebug() << "SSL error details are (" << (int)(error.error()) << ") - " << error.error(); - } - - // SSL "error" codes we don't care about - if we get one of these, we want to continue - if ( error.error() != QSslError::NoError - // many more in src/network/ssl/qsslerror.h - ) - { - if ( ssl_debugging_on ) - { - qDebug() << "Found valid SSL error - will not ignore"; - } - - valid_ssl_error = true; - } - else - { - if ( ssl_debugging_on ) - { - qDebug() << "Found invalid SSL error - will ignore and continue"; - } - } - } - - if ( ssl_debugging_on ) - { - qDebug() << "LLNetworkAccessManager" << __FUNCTION__ << "errors: " << errors - << ", peer certificate chain: "; - - QSslCertificate cert; - foreach(cert, reply->sslConfiguration().peerCertificateChain()) - { - qDebug() << " cert: " << cert - << ", issuer = " << cert.issuerInfo(QSslCertificate::CommonName) - << ", subject = " << cert.subjectInfo(QSslCertificate::CommonName); - } - } - - if ( valid_ssl_error ) - { - std::string url = llToStdString(reply->url()); - QString err_msg=""; - foreach( const QSslError &error, errors ) - { - err_msg+=error.errorString(); - err_msg+="\n"; - - QSslCertificate cert = error.certificate(); - - QString issuer_info=""; - issuer_info+="C="; - issuer_info+=cert.issuerInfo(QSslCertificate::CountryName); - issuer_info+=", ST="; - issuer_info+=cert.issuerInfo(QSslCertificate::StateOrProvinceName); - issuer_info+=", L="; - issuer_info+=cert.issuerInfo(QSslCertificate::LocalityName); - issuer_info+=", O="; - issuer_info+=cert.issuerInfo(QSslCertificate::Organization); - issuer_info+=", OU="; - issuer_info+=cert.issuerInfo(QSslCertificate::OrganizationalUnitName); - issuer_info+=", CN="; - issuer_info+=cert.issuerInfo(QSslCertificate::CommonName); - err_msg+=issuer_info; - err_msg+="\n"; - - QString subject_info=""; - subject_info+="C="; - subject_info+=cert.subjectInfo(QSslCertificate::CountryName); - subject_info+=", ST="; - subject_info+=cert.subjectInfo(QSslCertificate::StateOrProvinceName); - subject_info+=", L="; - subject_info+=cert.subjectInfo(QSslCertificate::LocalityName); - subject_info+=", O="; - subject_info+=cert.subjectInfo(QSslCertificate::Organization); - subject_info+=", OU="; - subject_info+=cert.subjectInfo(QSslCertificate::OrganizationalUnitName); - subject_info+=", CN="; - subject_info+=cert.subjectInfo(QSslCertificate::CommonName); - err_msg+=subject_info; - err_msg+="\n"; - - err_msg+="Not valid before: "; - err_msg+=cert.effectiveDate().toString(); - err_msg+="\n"; - err_msg+="Not valid after: "; - err_msg+=cert.expiryDate().toString(); - err_msg+="\n"; - err_msg+="----------\n"; - } - - if(mBrowser->certError(url, llToStdString(err_msg))) - { - // signal we should ignore and continue processing - reply->ignoreSslErrors(); - } - else - { - // The user canceled, don't return yet so we can test ignore variable - } - } - - // we the SSL error is invalid (in our opinion) or we explicitly ignore all SSL errors - if ( valid_ssl_error == false || ( mBrowser && mBrowser->mIgnoreSSLCertErrors ) ) - { - // signal we should ignore and continue processing - reply->ignoreSslErrors(); - }; -} - -void LLNetworkAccessManager::finishLoading(QNetworkReply* reply) -{ - QVariant val = reply->attribute( QNetworkRequest::HttpStatusCodeAttribute ); - int http_status_code = val.toInt(); - if ( http_status_code >=400 && http_status_code <=499 ) - { - if (mBrowser) - { - std::string current_url = llToStdString(reply->url()); - foreach (LLEmbeddedBrowserWindow *window, mBrowser->windows) - { - if (window->getCurrentUri() == current_url) - { - window->navigateErrorPage( http_status_code ); - } - } - } - } - - // tests if navigation request resulted in a cache hit - useful for testing so leaving here for the moment. - //QVariant from_cache = reply->attribute( QNetworkRequest::SourceIsFromCacheAttribute ); - //QString url = QString(reply->url().toEncoded()); - //qDebug() << url << " --- from cache?" << fromCache.toBool() << "\n"; -} - -void LLNetworkAccessManager:: authenticationRequiredSlot(QNetworkReply *reply, QAuthenticator *authenticator) -{ - std::string username; - std::string password; - std::string url = llToStdString(reply->url()); - std::string realm = llToStdString(authenticator->realm()); - - if(mBrowser->authRequest(url, realm, username, password)) - { - // Got credentials to try, attempt auth with them. - authenticator->setUser(QString::fromStdString(username)); - authenticator->setPassword(QString::fromStdString(password)); - } - else - { - // The user cancelled, don't attempt auth. - } -} - diff --git a/indra/llqtwebkit/llnetworkaccessmanager.h b/indra/llqtwebkit/llnetworkaccessmanager.h deleted file mode 100644 index 478b679aa..000000000 --- a/indra/llqtwebkit/llnetworkaccessmanager.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLNETWORKACCESSMANAGER_H -#define LLNETWORKACCESSMANAGER_H - -#include -#include - -#include "ui_passworddialog.h" - -class QGraphicsProxyWidget; - -class LLEmbeddedBrowserPrivate; -class LLNetworkAccessManager: public QNetworkAccessManager -{ - Q_OBJECT -public: - LLNetworkAccessManager(LLEmbeddedBrowserPrivate* browser, QObject* parent = 0); - -protected: - virtual QNetworkReply *createRequest(Operation op, const QNetworkRequest &request, - QIODevice *outgoingData = 0); -private slots: - void finishLoading(QNetworkReply* reply); - void authenticationRequiredSlot(QNetworkReply *reply, QAuthenticator *authenticator); - void sslErrorsSlot(QNetworkReply* reply, const QList& errors); - -private: - LLEmbeddedBrowserPrivate* mBrowser; - -}; - -#endif // LLNETWORKACCESSMANAGER_H - diff --git a/indra/llqtwebkit/llqtwebkit.cpp b/indra/llqtwebkit/llqtwebkit.cpp deleted file mode 100644 index 2be066d11..000000000 --- a/indra/llqtwebkit/llqtwebkit.cpp +++ /dev/null @@ -1,820 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include -#include -#include - -#include "llqtwebkit.h" - -#include "llembeddedbrowser.h" -#include "llembeddedbrowserwindow.h" - -LLQtWebKit* LLQtWebKit::sInstance = 0; - -//////////////////////////////////////////////////////////////////////////////// -// -LLQtWebKit::LLQtWebKit() : - mMaxBrowserWindows(16) -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLQtWebKit* LLQtWebKit::getInstance() -{ - if (! sInstance) - { - sInstance = new LLQtWebKit; - } - - return sInstance; -} - -//////////////////////////////////////////////////////////////////////////////// -// -LLQtWebKit::~LLQtWebKit() -{ -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::init(std::string application_directory, - std::string component_directory, - std::string profile_directory, - void* native_window_handle) -{ - return LLEmbeddedBrowser::getInstance()->init(application_directory, - component_directory, - profile_directory, - native_window_handle); -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLQtWebKit::getLastError() -{ - return LLEmbeddedBrowser::getInstance()->getLastError(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::reset() -{ - mBrowserWindowMap.clear(); - return LLEmbeddedBrowser::getInstance()->reset(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::clearCache() -{ - return LLEmbeddedBrowser::getInstance()->clearCache(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLQtWebKit::getVersion() -{ - const int majorVersion = 2; - const int minorVersion = 2; - - // number of hours since "time began" for this library - used to identify builds of same version - const int magicNumber = static_cast< int >((time(NULL) / 3600L) - (321190L)); - - // return as a string for now - don't think we need to expose actual version numbers - std::ostringstream codec; - codec << std::setw(1) << std::setfill('0'); - codec << majorVersion << "."; - codec << std::setw(2) << std::setfill('0'); - codec << minorVersion << "."; - codec << std::setw(5) << std::setfill('0'); - codec << magicNumber; - codec << " (QtWebKit version "; - codec << LLEmbeddedBrowser::getInstance()->getGREVersion(); - codec << ")"; - - return codec.str(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::setBrowserAgentId(std::string id) -{ - LLEmbeddedBrowser::getInstance()->setBrowserAgentId(id); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::enableProxy(bool enabled, std::string host_name, int port) -{ - return LLEmbeddedBrowser::getInstance()->enableProxy(enabled, host_name, port); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::setHostLanguage(const std::string& host_language ) -{ - LLEmbeddedBrowser::getInstance()->setHostLanguage(host_language); -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLQtWebKit::createBrowserWindow(int width, int height, const std::string target) -{ - LLEmbeddedBrowserWindow* browser_window = LLEmbeddedBrowser::getInstance()->createBrowserWindow(width, height, target); - - if (browser_window) - { - // arbitrary limit so we don't exhaust system resources - int id(0); - while (++id < mMaxBrowserWindows) - { - std::pair< BrowserWindowMapIter, bool > result = mBrowserWindowMap.insert(std::make_pair(id, browser_window)); - - // find first place the insert succeeds and use that index as the id - if (result.second) - { - browser_window->setWindowId(id); - return id; - } - } - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::proxyWindowOpened(int browser_window_id, const std::string target, const std::string uuid) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->proxyWindowOpened(target, uuid); - } -} -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::proxyWindowClosed(int browser_window_id, const std::string uuid) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->proxyWindowClosed(uuid); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::destroyBrowserWindow(int browser_window_id) -{ - // don't use the utility method here since we need the iteratorator to remove the entry from the map - BrowserWindowMapIter iterator = mBrowserWindowMap.find(browser_window_id); - LLEmbeddedBrowserWindow* browser_window = (*iterator).second; - - if (browser_window) - { - LLEmbeddedBrowser::getInstance()->destroyBrowserWindow(browser_window); - } - - mBrowserWindowMap.erase(iterator); - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::setBackgroundColor(int browser_window_id, const int red, const int green, const int blue) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->setBackgroundColor(red, green, blue); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::setEnabled(int browser_window_id, bool enabled) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->setEnabled(enabled); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::setSize(int browser_window_id, int width, int height) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->setSize(width, height); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::scrollByLines(int browser_window_id, int lines) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->scrollByLines(lines); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::addObserver(int browser_window_id, LLEmbeddedBrowserWindowObserver* subject) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->addObserver(subject); - } - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::remObserver(int browser_window_id, LLEmbeddedBrowserWindowObserver* subject) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->remObserver(subject); - } - - return true; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::navigateTo(int browser_window_id, const std::string uri) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->navigateTo(uri) ? true : false; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::userAction(int browser_window_id, EUserAction action) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->userAction(action); - } - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::userActionIsEnabled(int browser_window_id, EUserAction action) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->userActionIsEnabled(action); - } - return false; -} - -/////////////////////////////////////////////////////////////////////////////// -// -const unsigned char* LLQtWebKit::grabBrowserWindow(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->grabWindow(0, 0, browser_window->getBrowserWidth(), browser_window->getBrowserHeight()); - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -const unsigned char* LLQtWebKit::getBrowserWindowPixels(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->getPageBuffer(); - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::flipWindow(int browser_window_id, bool flip) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->flipWindow(flip); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLQtWebKit::getBrowserWidth(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->getBrowserWidth(); - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLQtWebKit::getBrowserHeight(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->getBrowserHeight(); - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLQtWebKit::getBrowserDepth(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->getBrowserDepth(); - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -int LLQtWebKit::getBrowserRowSpan(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->getBrowserRowSpan(); - } - - return 0; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::mouseEvent(int browser_window_id, EMouseEvent mouse_event, int button, int x, int y, EKeyboardModifier modifiers) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->mouseEvent(mouse_event, button, x, y, modifiers); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::scrollWheelEvent(int browser_window_id, int x, int y, int scroll_x, int scroll_y, EKeyboardModifier modifiers) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->scrollWheelEvent(x, y, scroll_x, scroll_y, modifiers); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::keyboardEvent( - int browser_window_id, - EKeyEvent key_event, - uint32_t key_code, - const char *utf8_text, - EKeyboardModifier modifiers, - uint32_t native_scan_code, - uint32_t native_virtual_key, - uint32_t native_modifiers) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->keyboardEvent(key_event, key_code, utf8_text, modifiers, native_scan_code, native_virtual_key, native_modifiers); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::focusBrowser(int browser_window_id, bool focus_browser) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->focusBrowser(focus_browser); - return true; - } - - return false; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::setNoFollowScheme(int browser_window_id, std::string scheme) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->setNoFollowScheme(scheme); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLQtWebKit::getNoFollowScheme(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->getNoFollowScheme(); - } - - return (""); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::pump(int max_milliseconds) -{ - LLEmbeddedBrowser::getInstance()->pump(max_milliseconds); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::enableCookies(bool enabled) -{ - LLEmbeddedBrowser::getInstance()->enableCookies( enabled ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::clearAllCookies() -{ - return LLEmbeddedBrowser::getInstance()->clearAllCookies(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::setCookies(const std::string &cookies) -{ - return LLEmbeddedBrowser::getInstance()->setCookies(cookies); -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLQtWebKit::getAllCookies() -{ - return LLEmbeddedBrowser::getInstance()->getAllCookies(); -} - - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::enablePlugins(bool enabled) -{ - LLEmbeddedBrowser::getInstance()->enablePlugins(enabled); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::enableJavaScript(bool enabled) -{ - LLEmbeddedBrowser::getInstance()->enableJavaScript(enabled); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::showWebInspector(bool show) -{ - return LLEmbeddedBrowser::getInstance()->showWebInspector(show); -} - -//////////////////////////////////////////////////////////////////////////////// -// -std::string LLQtWebKit::evaluateJavaScript(int browser_window_id, const std::string script) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->evaluateJavaScript(script); - } - - return ""; -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::prependHistoryUrl(int browser_window_id, std::string url) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->prependHistoryUrl(url); - } -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::clearHistory(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->clearHistory(); - } -} - -std::string LLQtWebKit::dumpHistory(int browser_window_id) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - return browser_window->dumpHistory(); - } - - return NULL; -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::setCAFile(const std::string &ca_file) -{ - return LLEmbeddedBrowser::getInstance()->setCAFile(ca_file); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::addCAFile(const std::string &ca_file) -{ - return LLEmbeddedBrowser::getInstance()->addCAFile(ca_file); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void LLQtWebKit::setIgnoreSSLCertErrors(bool ignore) -{ - LLEmbeddedBrowser::getInstance()->setIgnoreSSLCertErrors(ignore); -} - -//////////////////////////////////////////////////////////////////////////////// -// -bool LLQtWebKit::getIgnoreSSLCertErrors() -{ - return LLEmbeddedBrowser::getInstance()-> getIgnoreSSLCertErrors(); -} - -//////////////////////////////////////////////////////////////////////////////// -// -const std::vector< std::string > LLQtWebKit::getInstalledCertsList() -{ - return LLEmbeddedBrowser::getInstance()->getInstalledCertsList(); -} - -//////////////////////////////////////////////////////////////////////////////// -// utility method to get an LLEmbeddedBrowserWindow* from a window id (int) -LLEmbeddedBrowserWindow* LLQtWebKit::getBrowserWindowFromWindowId(int browser_window_id) -{ - BrowserWindowMapIter iterator = mBrowserWindowMap.find(browser_window_id); - - if (iterator != mBrowserWindowMap.end()) - return (*iterator).second; - else - return 0; -} - -LLEmbeddedBrowserWindowObserver::~LLEmbeddedBrowserWindowObserver() -{ -} - -void LLEmbeddedBrowserWindowObserver::onCursorChanged(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onPageChanged(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onNavigateBegin(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onNavigateComplete(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onUpdateProgress(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onStatusTextChange(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onTitleChange(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onLocationChange(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onNavigateErrorPage(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onClickLinkHref(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onClickLinkNoFollow(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onCookieChanged(const EventType&) -{ -} - -std::string LLEmbeddedBrowserWindowObserver::onRequestFilePicker(const EventType&) -{ - return std::string(); -} - -void LLEmbeddedBrowserWindowObserver::onWindowCloseRequested(const EventType&) -{ -} - -void LLEmbeddedBrowserWindowObserver::onWindowGeometryChangeRequested(const EventType&) -{ -} - -bool LLEmbeddedBrowserWindowObserver::onAuthRequest(const std::string &, const std::string &, std::string &, std::string &) -{ - return false; -} - -bool LLEmbeddedBrowserWindowObserver::onCertError(const std::string &, const std::string &) -{ - return false; // cancel and abort after cert error -} - -void LLEmbeddedBrowserWindowObserver::onQtDebugMessage( const std::string &, const std::string &) -{ -} - -void LLEmbeddedBrowserWindowObserver::onLinkHovered(const EventType&) -{ -} - -// set the regex used to determine if a page is trusted or not -void LLQtWebKit::setWhiteListRegex( int browser_window_id, const std::string& regex ) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->setWhiteListRegex(regex); - } -} - -// Second Life viewer specific functions -void LLQtWebKit::setSLObjectEnabled( bool enabled ) -{ - LLEmbeddedBrowser::getInstance()->setSLObjectEnabled( enabled ); -} - -void LLQtWebKit::setAgentLanguage( const std::string& agent_language ) -{ - LLEmbeddedBrowser::getInstance()->setAgentLanguage( agent_language ); -} - -void LLQtWebKit::setAgentRegion( const std::string& agent_region ) -{ - LLEmbeddedBrowser::getInstance()->setAgentRegion( agent_region ); -} - -void LLQtWebKit::setAgentLocation( double x, double y, double z ) -{ - LLEmbeddedBrowser::getInstance()->setAgentLocation( x, y, z ); -} - -void LLQtWebKit::setAgentGlobalLocation( double x, double y, double z ) -{ - LLEmbeddedBrowser::getInstance()->setAgentGlobalLocation( x, y, z ); -} - -void LLQtWebKit::setAgentOrientation( double angle ) -{ - LLEmbeddedBrowser::getInstance()->setAgentOrientation( angle ); -} - - -void LLQtWebKit::setAgentMaturity( const std::string& agent_maturity ) -{ - LLEmbeddedBrowser::getInstance()->setAgentMaturity( agent_maturity ); -} - -void LLQtWebKit::emitLocation() -{ - LLEmbeddedBrowser::getInstance()->emitLocation(); -} - -void LLQtWebKit::emitMaturity() -{ - LLEmbeddedBrowser::getInstance()->emitMaturity(); -} - -void LLQtWebKit::emitLanguage() -{ - LLEmbeddedBrowser::getInstance()->emitLanguage(); -} - -void LLQtWebKit::enableQtMessageHandler( bool enable ) -{ - LLEmbeddedBrowser::getInstance()->enableQtMessageHandler( enable ); -} - -void LLQtWebKit::enableLoadingOverlay( int browser_window_id, bool enable) -{ - LLEmbeddedBrowserWindow* browser_window = getBrowserWindowFromWindowId(browser_window_id); - if (browser_window) - { - browser_window->enableLoadingOverlay( enable ); - } -} - -void LLQtWebKit::setPageZoomFactor( double factor ) -{ - LLEmbeddedBrowser::getInstance()->setPageZoomFactor( factor ); -} diff --git a/indra/llqtwebkit/llqtwebkit.h b/indra/llqtwebkit/llqtwebkit.h deleted file mode 100644 index 8e7ebd390..000000000 --- a/indra/llqtwebkit/llqtwebkit.h +++ /dev/null @@ -1,470 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLQTWEBKIT_H -#define LLQTWEBKIT_H - -#if defined _MSC_VER && _MSC_VER < 1600 -// no pstdint.h in the client where this header is used -typedef unsigned long uint32_t; -#else -#include // Use the C99 official header -#endif - -#include -#include -#include - -class LLEmbeddedBrowser; -class LLEmbeddedBrowserWindow; - -// Use this to conditionalize code that depends on particular changes to the llqtwebkit API. -// This can be useful for times when we're waiting for a rebuild on one platform or another. -// When you bump this number, please note what the changes were in a comment below the #define, -// and keep the existing comments as history. -#define LLQTWEBKIT_API_VERSION 16 -// version 16: - // Added LLQtWebKit::enableLoadingOverlay() -// version 15: - // Added LLQtWebKit::setPageZoomFactor() -// version 14: - // Added LLEmbeddedBrowserWindowObserver::onQtDebugMessage -// version 13: - // Added LLEmbeddedBrowserWindowObserver::onCertError -// version 12: - // Pass over value to indicate if host for current URL is trusted as per whitelist regex or not -// version 11: - // Added initial support for url/host whitelist via a regex -// version 10: - // Added initial support for creating and displaying the Qt Web Inspector -// version 9: - // Added initial support for exposing certain Second Life viewer/agent variables to JavaScript -// version 8: - // Removed calls to set/clear 404 redirects and made the API now emit an event that the - // consumer can catch and decide what to do when an HTTP status code after navigate is 400-499 -// version 7: - // Added LLEmbeddedBrowserWindowEvent::setNavigationType() && LLEmbeddedBrowserWindowEvent::getNavigationType() - // Used to pass (and retrieve) the type of navigation event that caused a link to be activated. -// version 6: - // Added LLQtWebKit::addCAFile() -// version 5: - // Added LLEmbeddedBrowserWindowObserver::onLinkHovered -// version 4: - // Added LLEmbeddedBrowserWindowObserver::onAuthRequest -// version 3: - // Added setIgnoreSSLCertErrors and getIgnoreSSLCertErrors -// version 2: - // Changed the usage of the event parameters in onClickLinkHref and onClickLinkNoFollow events slightly. - // The clicked URI for both should now be retrieved with getEventUri() instead of getStringValue(). - // The "target" string in onClickLinkHref is now retrieved with getStringValue() instead of getStringValue2(). - // The contents of getStringValue2() in the onClickLinkHref event is now a unique ID for the window proxy the click targets. - // Removed the "link target type" concept, since it doesn't really belong here. - // Removed most of the construtor variants in LLEmbeddedBrowserWindowEvent and added setters in their place. - // Removed setCaretColor, since it's done nothing for some time now. - // Added LLEmbeddedBrowserWindowObserver::onWindowGeometryChangeRequested - // Added -// version 1: - // Added the LLQTWEBKIT_API_VERSION define. - // Added LLEmbeddedBrowserWindowObserver::onWindowCloseRequested - -//////////////////////////////////////////////////////////////////////////////// -// data class that is passed with an event -class LLEmbeddedBrowserWindowEvent -{ - public: - LLEmbeddedBrowserWindowEvent(int window_id) : - mEventWindowId(window_id) - { - }; - - virtual ~LLEmbeddedBrowserWindowEvent() {} - - void setEventUri(const std::string &uri) { mEventUri = uri; } - void setNavigationType(const std::string &type) { mNavigationType = type; } - void setTrustedHost(const bool trusted) { mTrustedHost = trusted; } - void setIntValue(int val) { mIntVal = val; } - void setStringValue(const std::string &val) { mStringVal = val; } - void setStringValue2(const std::string &val) { mStringVal2 = val; } - void setRectValue(int x, int y, int width, int height) - { - mXVal = x; - mYVal = y; - mWidthVal = width; - mHeightVal = height; - } - - int getEventWindowId() const { return mEventWindowId; } - std::string getEventUri() const { return mEventUri; } - std::string getNavigationType() const { return mNavigationType; } - bool getTrustedHost() const { return mTrustedHost; } - int getIntValue() const { return mIntVal; }; - std::string getStringValue() const { return mStringVal; } - std::string getStringValue2() const { return mStringVal2; } - void getRectValue(int& x, int& y, int& width, int& height) const - { - x = mXVal; - y = mYVal; - width = mWidthVal; - height = mHeightVal; - }; - - private: - int mEventWindowId; - std::string mEventUri; - std::string mNavigationType; - bool mTrustedHost; - int mIntVal; - std::string mStringVal; - std::string mStringVal2; - int mXVal; - int mYVal; - int mWidthVal; - int mHeightVal; -}; - -//////////////////////////////////////////////////////////////////////////////// -// derrive from this class and override these methods to observe these events -#ifdef __GNUC__ -#pragma GCC visibility push(default) -#endif -class LLEmbeddedBrowserWindowObserver -{ - public: - virtual ~LLEmbeddedBrowserWindowObserver(); - typedef LLEmbeddedBrowserWindowEvent EventType; - - virtual void onCursorChanged(const EventType& event); - virtual void onPageChanged(const EventType& event); - virtual void onNavigateBegin(const EventType& event); - virtual void onNavigateComplete(const EventType& event); - virtual void onNavigateErrorPage(const EventType& event); - virtual void onUpdateProgress(const EventType& event); - virtual void onStatusTextChange(const EventType& event); - virtual void onTitleChange(const EventType& event); - virtual void onLocationChange(const EventType& event); - virtual void onClickLinkHref(const EventType& event); - virtual void onClickLinkNoFollow(const EventType& event); - virtual void onCookieChanged(const EventType& event); - // mStringVal will be the cookie in RFC 2109 string format - // mEventUri will be the url that caused the cookie change - // mIntVal will be true if the cookie is dead (i.e. being deleted), false otherwise - virtual std::string onRequestFilePicker(const EventType& event); - virtual void onWindowCloseRequested(const EventType& event); - virtual void onWindowGeometryChangeRequested(const EventType& event); - - // This should return true to attempt auth, or false to cancel. - virtual bool onAuthRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password); - - // This should return true to continue after cert error, or false to cancel and abort. - virtual bool onCertError(const std::string &in_url, const std::string &in_msg); - - virtual void onLinkHovered(const EventType& event); - // mEventURI will be the link - // mStringVal will be the title - // mStringVal2 will be the text - - // catch qDebug() messages from Qt and pipe them back to host application - virtual void onQtDebugMessage( const std::string& msg, const std::string& msg_type); -}; -#ifdef __GNUC__ -#pragma GCC visibility pop -#endif - -//////////////////////////////////////////////////////////////////////////////// -// main library class - -#ifdef __GNUC__ -#pragma GCC visibility push(default) -#endif -class LLQtWebKit -{ - public: - typedef enum e_cursor - { - C_ARROW, - C_IBEAM, - C_SPLITV, - C_SPLITH, - C_POINTINGHAND - } ECursor; - - typedef enum e_user_action - { - UA_EDIT_CUT, - UA_EDIT_COPY, - UA_EDIT_PASTE, - UA_NAVIGATE_STOP, - UA_NAVIGATE_BACK, - UA_NAVIGATE_FORWARD, - UA_NAVIGATE_RELOAD - } EUserAction; - - typedef enum e_key_event - { - KE_KEY_DOWN, - KE_KEY_REPEAT, - KE_KEY_UP - }EKeyEvent; - - typedef enum e_mouse_event - { - ME_MOUSE_MOVE, - ME_MOUSE_DOWN, - ME_MOUSE_UP, - ME_MOUSE_DOUBLE_CLICK - }EMouseEvent; - - typedef enum e_mouse_button - { - MB_MOUSE_BUTTON_LEFT, - MB_MOUSE_BUTTON_RIGHT, - MB_MOUSE_BUTTON_MIDDLE, - MB_MOUSE_BUTTON_EXTRA_1, - MB_MOUSE_BUTTON_EXTRA_2, - }EMouseButton; - - typedef enum e_keyboard_modifier - { - KM_MODIFIER_NONE = 0x00, - KM_MODIFIER_SHIFT = 0x01, - KM_MODIFIER_CONTROL = 0x02, - KM_MODIFIER_ALT = 0x04, - KM_MODIFIER_META = 0x08 - }EKeyboardModifier; - - virtual ~LLQtWebKit(); - - // singleton access - static LLQtWebKit* getInstance(); - - // housekeeping - bool init(std::string application_directory, - std::string component_directory, - std::string profile_directory, - void* native_window_handle); - bool reset(); - bool clearCache(); - int getLastError(); - std::string getVersion(); - void setBrowserAgentId(std::string id); - bool enableProxy(bool enabled, std::string host_name, int port); - - void enableCookies(bool enabled); - bool clearAllCookies(); - - // The following two functions accept and return cookies in the same format that's used for the Set-Cookie: HTTP header - // as defined in RFC 2109 ( http://www.ietf.org/rfc/rfc2109.txt ). The string should not contain the literal "Set-Cookie:", - // just the cookie itself. - // Multiple cookies within the string are separated by a newline character ('\n') - void setCookies(const std::string &cookies); - std::string getAllCookies(); - - void enablePlugins(bool enabled); - void enableJavaScript(bool enabled); - - // Web inspector - Firebug-esque debugger - bool showWebInspector(bool show); - - // updates value of 'hostLanguage' in JavaScript 'Navigator' obect that - // embedded pages can query to see what language the host app is set to - void setHostLanguage(const std::string& host_language); - - // browser window - creation/deletion, mutation etc. - int createBrowserWindow(int width, int height, const std::string target = std::string("")); - void proxyWindowOpened(int browser_window_id, const std::string target, const std::string uuid); - void proxyWindowClosed(int browser_window_id, const std::string uuid); - bool destroyBrowserWindow(int browser_window_id); - bool setSize(int browser_window_id, int width, int height); - bool scrollByLines(int browser_window_id, int lines); - bool setBackgroundColor(int browser_window_id, const int red, const int green, const int blue); - bool setEnabled(int browser_window_id, bool enabled); - - // add/remove yourself as an observer on browser events - see LLEmbeddedBrowserWindowObserver declaration - bool addObserver(int browser_window_id, LLEmbeddedBrowserWindowObserver* subject); - bool remObserver(int browser_window_id, LLEmbeddedBrowserWindowObserver* subject); - - // navigation - self explanatory - bool navigateTo(int browser_window_id, const std::string uri); - bool userAction(int browser_window_id, EUserAction action); - bool userActionIsEnabled(int browser_window_id, EUserAction action); - - // javascript access/control - std::string evaluateJavaScript(int browser_window_id, const std::string script); - - // set/clear URL to redirect to when a 404 page is reached - bool set404RedirectUrl(int browser_window_in, std::string redirect_url); - bool clr404RedirectUrl(int browser_window_in); - - // access to rendered bitmap data - const unsigned char* grabBrowserWindow(int browser_window_id); // renders page to memory and returns pixels - const unsigned char* getBrowserWindowPixels(int browser_window_id); // just returns pixels - no render - bool flipWindow(int browser_window_id, bool flip); // optionally flip window (pixels) you get back - int getBrowserWidth(int browser_window_id); // current browser width (can vary slightly after page is rendered) - int getBrowserHeight(int browser_window_id); // current height - int getBrowserDepth(int browser_window_id); // depth in bytes - int getBrowserRowSpan(int browser_window_id); // width in pixels * depth in bytes - - // mouse/keyboard interaction - bool mouseEvent(int browser_window_id, EMouseEvent mouse_event, int button, int x, int y, EKeyboardModifier modifiers); // send a mouse event to a browser window at given XY in browser space - bool scrollWheelEvent(int browser_window_id, int x, int y, int scroll_x, int scroll_y, EKeyboardModifier modifiers); - bool keyboardEvent( - int browser_window_id, - EKeyEvent key_event, - uint32_t key_code, - const char *utf8_text, - EKeyboardModifier modifiers, - uint32_t native_scan_code = 0, - uint32_t native_virtual_key = 0, - uint32_t native_modifiers = 0); - - bool focusBrowser(int browser_window_id, bool focus_browser); // set/remove focus to given browser window - - // accessor/mutator for scheme that browser doesn't follow - e.g. secondlife.com:// - void setNoFollowScheme(int browser_window_id, std::string scheme); - std::string getNoFollowScheme(int browser_window_id); - - void pump(int max_milliseconds); - - void prependHistoryUrl(int browser_window_id, std::string url); - void clearHistory(int browser_window_id); - std::string dumpHistory(int browser_window_id); - - // Specify a path to a .pem file containing a list of CA certificates the browser should trust. - // NOTE that this will replace the default list of root certs (not add to it). - // If the file isn't found or doesn't contain any certs in the correct format, this call will have no effect and will return false. - // NOTE: Using this function causes strange cert verification issues on the Mac. - // Using addCAFile() instead seems to work better. - bool setCAFile(const std::string &ca_file); - - // This behaves similarly, but instead of replacing the entire list it appends additional trusted root certs to the current list. - bool addCAFile(const std::string &ca_file); - - // Set a flag causing all SSL cert errors to be ignored. - // NOTE: this should only be used for testing, as it negates the security model of https. - void setIgnoreSSLCertErrors(bool ignore); - bool getIgnoreSSLCertErrors(); - - const std::vector< std::string > getInstalledCertsList(); - - void enableQtMessageHandler( bool enable ); - - void enableLoadingOverlay( int browser_window_id, bool enable); - - // Copied from indra_constants.h. - // The key_code argument to keyboardEvent should either be one of these or a 7-bit ascii character. - enum keyCodes - { - // Leading zeroes ensure that these won't sign-extend when assigned to a larger type. - KEY_RETURN = 0x0081, - KEY_LEFT = 0x0082, - KEY_RIGHT = 0x0083, - KEY_UP = 0x0084, - KEY_DOWN = 0x0085, - KEY_ESCAPE = 0x0086, - KEY_BACKSPACE = 0x0087, - KEY_DELETE = 0x0088, - KEY_SHIFT = 0x0089, - KEY_CONTROL = 0x008A, - KEY_ALT = 0x008B, - KEY_HOME = 0x008C, - KEY_END = 0x008D, - KEY_PAGE_UP = 0x008E, - KEY_PAGE_DOWN = 0x008F, - KEY_HYPHEN = 0x0090, - KEY_EQUALS = 0x0091, - KEY_INSERT = 0x0092, - KEY_CAPSLOCK = 0x0093, - KEY_TAB = 0x0094, - KEY_ADD = 0x0095, - KEY_SUBTRACT = 0x0096, - KEY_MULTIPLY = 0x0097, - KEY_DIVIDE = 0x0098, - KEY_F1 = 0x00A1, - KEY_F2 = 0x00A2, - KEY_F3 = 0x00A3, - KEY_F4 = 0x00A4, - KEY_F5 = 0x00A5, - KEY_F6 = 0x00A6, - KEY_F7 = 0x00A7, - KEY_F8 = 0x00A8, - KEY_F9 = 0x00A9, - KEY_F10 = 0x00AA, - KEY_F11 = 0x00AB, - KEY_F12 = 0x00AC, - - KEY_PAD_UP = 0x00C0, - KEY_PAD_DOWN = 0x00C1, - KEY_PAD_LEFT = 0x00C2, - KEY_PAD_RIGHT = 0x00C3, - KEY_PAD_HOME = 0x00C4, - KEY_PAD_END = 0x00C5, - KEY_PAD_PGUP = 0x00C6, - KEY_PAD_PGDN = 0x00C7, - KEY_PAD_CENTER = 0x00C8, // the 5 in the middle - KEY_PAD_INS = 0x00C9, - KEY_PAD_DEL = 0x00CA, - KEY_PAD_RETURN = 0x00CB, - KEY_PAD_ADD = 0x00CC, - KEY_PAD_SUBTRACT = 0x00CD, - KEY_PAD_MULTIPLY = 0x00CE, - KEY_PAD_DIVIDE = 0x00CF, - - KEY_NONE = 0x00FF // not sent from keyboard. For internal use only. - }; - - // set the regex used to determine if a page is trusted or not - void setWhiteListRegex( int browser_window_id, const std::string& regex ); - - // Second Life specific functions - // (Note, this is a departure from the generic nature of this library) - void setSLObjectEnabled( bool enabled ); // enable or disaable feature - void setAgentLanguage( const std::string& agent_language ); // viewer language selected by agent - void setAgentRegion( const std::string& agent_region ); // name of region where agent is located - void setAgentLocation( double x, double y, double z ); // agent's x,y,z location within a region - void setAgentGlobalLocation( double x, double y, double z ); // agent's x,y,z location within the current grid - void setAgentOrientation( double angle ); // direction (0..359) agent is facing - void setAgentMaturity( const std::string& agent_maturity ); // selected maturity level of agent - void emitLocation(); - void emitMaturity(); - void emitLanguage(); - - // set the zoom factor for web pages ( can be less than 0.0) - void setPageZoomFactor( double factor ); - - private: - LLQtWebKit(); - LLEmbeddedBrowserWindow* getBrowserWindowFromWindowId(int browser_window_id); - static LLQtWebKit* sInstance; - const int mMaxBrowserWindows; - typedef std::map< int, LLEmbeddedBrowserWindow* > BrowserWindowMap; - typedef std::map< int, LLEmbeddedBrowserWindow* >::iterator BrowserWindowMapIter; - BrowserWindowMap mBrowserWindowMap; -}; - -#ifdef __GNUC__ -#pragma GCC visibility pop -#endif - -#endif // LLQTWEBKIT_H diff --git a/indra/llqtwebkit/llqtwebkit.pri b/indra/llqtwebkit/llqtwebkit.pri deleted file mode 100644 index 4f85aa423..000000000 --- a/indra/llqtwebkit/llqtwebkit.pri +++ /dev/null @@ -1,47 +0,0 @@ -DEPENDPATH += $$PWD -INCLUDEPATH += $$PWD - -!mac { -unix { - DEFINES += LL_LINUX -} -} - -mac { - DEFINES += LL_OSX -} - -win32{ - DEFINES += _WINDOWS -} - -# Input -HEADERS += llembeddedbrowser.h \ - llembeddedbrowser_p.h \ - llembeddedbrowserwindow.h \ - llembeddedbrowserwindow_p.h \ - llnetworkaccessmanager.h \ - llqtwebkit.h \ - llwebpage.h \ - llwebpageopenshim.h \ - llstyle.h \ - lljsobject.h - -SOURCES += llembeddedbrowser.cpp \ - llembeddedbrowserwindow.cpp \ - llnetworkaccessmanager.cpp \ - llqtwebkit.cpp \ - llwebpage.cpp \ - llwebpageopenshim.cpp \ - llstyle.cpp \ - lljsobject.cpp - -FORMS += passworddialog.ui - -RCC_DIR = .rcc -UI_DIR = .ui -MOC_DIR = .moc -OBJECTS_DIR = .obj - -include(static.pri) -include(qtwebkit_cookiejar/src/src.pri) diff --git a/indra/llqtwebkit/llqtwebkit.pro b/indra/llqtwebkit/llqtwebkit.pro deleted file mode 100644 index b6ff077bd..000000000 --- a/indra/llqtwebkit/llqtwebkit.pro +++ /dev/null @@ -1,18 +0,0 @@ -TEMPLATE = lib -CONFIG += static staticlib # we always build as static lib whether Qt is static or not -TARGET = -DEPENDPATH += . -INCLUDEPATH += . - -include(llqtwebkit.pri) - -QT += webkit opengl network gui - -win32:CONFIG(debug,debug|release) { - TARGET = llqtwebkitd -} - -RCC_DIR = $$PWD/.rcc -UI_DIR = $$PWD/.ui -MOC_DIR = $$PWD/.moc -OBJECTS_DIR = $$PWD/.obj diff --git a/indra/llqtwebkit/llstyle.cpp b/indra/llqtwebkit/llstyle.cpp deleted file mode 100644 index 8822d481a..000000000 --- a/indra/llqtwebkit/llstyle.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "llstyle.h" - -#include "llembeddedbrowserwindow_p.h" -#include -#include -#include - -LLStyle::LLStyle() - : QPlastiqueStyle() -{ -} - -void LLStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const -{ -#ifdef Q_WS_MAC - if (control == QStyle::CC_ScrollBar) { - QStyleOptionSlider* opt = (QStyleOptionSlider*)option; - const QPoint topLeft = opt->rect.topLeft(); - painter->translate(topLeft); - opt->rect.moveTo(QPoint(0, 0)); - painter->fillRect(opt->rect, opt->palette.background()); - } -#endif - QPlastiqueStyle::drawComplexControl(control, option, painter, widget); -} - -void LLStyle::drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const -{ - switch(element) - { - case CE_ScrollBarAddLine: - case CE_ScrollBarSubLine: - // This fixes the "scrollbar arrows pointing the wrong way" bug. - if (const QStyleOptionSlider *scrollBar = qstyleoption_cast(option)) - { - // Make the State_Horizontal bit in the option's state field match its orientation field. - QStyleOptionSlider localOption(*scrollBar); - if(localOption.orientation == Qt::Horizontal) - { - localOption.state |= State_Horizontal; - } - else - { - localOption.state &= ~State_Horizontal; - } - QPlastiqueStyle::drawControl(element, &localOption, painter, widget); - return; - } - default: - break; - } - - QPlastiqueStyle::drawControl(element, option, painter, widget); -} diff --git a/indra/llqtwebkit/llstyle.h b/indra/llqtwebkit/llstyle.h deleted file mode 100644 index 77c09b3bb..000000000 --- a/indra/llqtwebkit/llstyle.h +++ /dev/null @@ -1,42 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLSTYLE_H -#define LLSTYLE_H - -#include - -class LLStyle : public QPlastiqueStyle -{ - -public: - explicit LLStyle(); - void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const; - void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const; - -}; - -#endif - diff --git a/indra/llqtwebkit/llwebpage.cpp b/indra/llqtwebkit/llwebpage.cpp deleted file mode 100644 index 113c0c186..000000000 --- a/indra/llqtwebkit/llwebpage.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "llwebpage.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "llqtwebkit.h" -#include "llembeddedbrowser.h" -#include "llembeddedbrowserwindow.h" -#include "llembeddedbrowserwindow_p.h" -#include "lljsobject.h" - -LLWebPage::LLWebPage(QObject *parent) - : QWebPage(parent) - , window(0) - , mHostLanguage( "en" ) - , mWhiteListRegex( "" ) -{ - mJsObject = new LLJsObject( parent ); - - connect(this, SIGNAL(loadProgress(int)), - this, SLOT(loadProgressSlot(int))); - connect(this, SIGNAL(linkHovered(const QString &, const QString &, const QString &)), - this, SLOT(linkHoveredSlot(const QString &, const QString &, const QString &))); - connect(this, SIGNAL(statusBarMessage(const QString &)), - this, SLOT(statusBarMessageSlot(const QString &))); - connect(mainFrame(), SIGNAL(urlChanged(const QUrl&)), - this, SLOT(urlChangedSlot(const QUrl&))); - connect(this, SIGNAL(loadStarted()), - this, SLOT(loadStarted())); - connect(this, SIGNAL(loadFinished(bool)), - this, SLOT(loadFinished(bool))); - connect(this, SIGNAL(windowCloseRequested()), - this, SLOT(windowCloseRequested())); - connect(this, SIGNAL(geometryChangeRequested(const QRect&)), - this, SLOT(geometryChangeRequested(const QRect&))); - connect(mainFrame(), SIGNAL(titleChanged(const QString&)), - this, SLOT(titleChangedSlot(const QString&))); - connect(mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), - this, SLOT(extendNavigatorObject())); -} - -LLWebPage::~LLWebPage() -{ - delete mJsObject; -} - -void LLWebPage::loadProgressSlot(int progress) -{ - if (!window) - return; - window->d->mPercentComplete = progress; - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - event.setIntValue(progress); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onUpdateProgress, event); - - if ( progress >= 100 ) - window->d->mShowLoadingOverlay = false; - - window->d->mDirty = true; - window->grabWindow(0,0,webView->boundingRect().width(),webView->boundingRect().height()); - - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onPageChanged, event); -} - -void LLWebPage::linkHoveredSlot(const QString &link, const QString &title, const QString &textContent) -{ - if (!window) - return; - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(llToStdString(link)); - event.setStringValue(llToStdString(title)); - event.setStringValue2(llToStdString(textContent)); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onLinkHovered, event); -} - -void LLWebPage::statusBarMessageSlot(const QString& text) -{ - if (!window) - return; - window->d->mStatusText = llToStdString(text); - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - event.setStringValue(window->d->mStatusText); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onStatusTextChange, event); -} - -void LLWebPage::titleChangedSlot(const QString& text) -{ - if (!window) - return; - window->d->mTitle = llToStdString(text); - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - event.setStringValue(window->d->mTitle); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onTitleChange, event); -} - -// set the regex used to determine if a page is trusted or not -void LLWebPage::setWhiteListRegex( const std::string& regex ) -{ - mWhiteListRegex = regex; -} - -void LLWebPage::configureTrustedPage( bool is_trusted ) -{ - // action happens in browser window parent - LLEmbeddedBrowser* parent_browser = 0; - if ( window && window->d && window->d->mParent ) - { - parent_browser = window->d->mParent; - if ( parent_browser ) - { - if ( is_trusted ) - { - //qDebug() << "Whitelist passed - turning on"; - - // trusted so turn everything on - parent_browser->enableJavaScriptTransient( true ); - parent_browser->enableCookiesTransient( true ); - parent_browser->enablePluginsTransient( true ); - } - else - { - //qDebug() << "Whitelist failed - reverting to default state"; - - // restore default state set by client - parent_browser->enableJavaScript( parent_browser->isJavaScriptEnabled() ); - parent_browser->enableCookies( parent_browser->areCookiesEnabled() ); - parent_browser->enablePlugins( parent_browser->arePluginsEnabled() ); - } - } - } -} - -bool LLWebPage::checkRegex( const QUrl& url ) -{ - QRegExp reg_exp( QString::fromStdString( mWhiteListRegex ) ); - reg_exp.setCaseSensitivity( Qt::CaseInsensitive ); - reg_exp.setMinimal( true ); - - if ( reg_exp.exactMatch( url.host() ) ) - { - return true; - } - else - { - return false; - } -} - -void LLWebPage::checkWhiteList( const QUrl& url ) -{ - if ( mWhiteListRegex.length() ) - { - if ( checkRegex( url ) ) - { - configureTrustedPage( true ); // page is "trusted" - go ahead and configure it as such - } - else - { - configureTrustedPage( false ); // page is "NOT trusted" - go ahead and configure it as such - } - } - else - // no regex specified, don't do anything (i.e. don't change trust state) - { - } -} - -void LLWebPage::urlChangedSlot(const QUrl& url) -{ - if (!window) - return; - - checkWhiteList( url ); - - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onLocationChange, event); -} - -bool LLWebPage::event(QEvent *event) -{ - bool result = QWebPage::event(event); - - if (event->type() == QEvent::GraphicsSceneMousePress) - currentPoint = ((QGraphicsSceneMouseEvent*)event)->pos().toPoint(); - else if(event->type() == QEvent::GraphicsSceneMouseRelease) - currentPoint = QPoint(); - - return result; -} - -bool LLWebPage::acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest& request, NavigationType type) -{ - Q_UNUSED( frame ); - - if (!window) - return false; - - if (request.url().scheme() == window->d->mNoFollowScheme) - { - QString encodedUrl = request.url().toEncoded(); - // QUrl is turning foo:///home/bar into foo:/home/bar for some reason while Firefox does not - // http://bugs.webkit.org/show_bug.cgi?id=24695 - if (!encodedUrl.startsWith(window->d->mNoFollowScheme + "://")) { - encodedUrl = encodedUrl.mid(window->d->mNoFollowScheme.length() + 1); - encodedUrl = window->d->mNoFollowScheme + "://" + encodedUrl; - } - std::string rawUri = llToStdString(encodedUrl); - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(rawUri); - - // pass over the navigation type as per this page: http://apidocs.meego.com/1.1/core/html/qt4/qwebpage.html#NavigationType-enum - // pass as strings because telling everyone who needs to know about enums is too invasive. - std::string nav_type("unknown"); - if (type == QWebPage::NavigationTypeLinkClicked) nav_type="clicked"; - else - if (type == QWebPage::NavigationTypeFormSubmitted) nav_type="form_submited"; - else - if (type == QWebPage::NavigationTypeBackOrForward) nav_type="back_forward"; - else - if (type == QWebPage::NavigationTypeReload) nav_type="reloaded"; - else - if (type == QWebPage::NavigationTypeFormResubmitted) nav_type="form_resubmited"; - event.setNavigationType(nav_type); - - if ( mWhiteListRegex.length() ) - { - if ( frame ) - { - if ( checkRegex( frame->url() ) ) - { - event.setTrustedHost( true ); - } - else - { - event.setTrustedHost( false ); - } - } - else - // no frame - no trust (TODO: when can this happen?) - { - event.setTrustedHost( false ); - } - } - else - // no regex is like switching it off and indicating everything is trusted - { - event.setTrustedHost( true ); - } - - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onClickLinkNoFollow, event); - - //qDebug() << "LLWebPage::acceptNavigationRequest: sending onClickLinkNoFollow, NavigationType is " << type << ", url is " << QString::fromStdString(rawUri) ; - return false; - } - - - return true; -} - - -void LLWebPage::loadStarted() -{ - if (!window) - return; - - QUrl url( QString::fromStdString( window->getCurrentUri() ) ); - checkWhiteList( url ); - - window->d->mShowLoadingOverlay = true; - - window->d->mTimeLoadStarted=time(NULL); - - window->d->mDirty = true; - window->grabWindow(0,0,webView->boundingRect().width(),webView->boundingRect().height()); - - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onNavigateBegin, event); -} - -void LLWebPage::loadFinished(bool) -{ - if (!window) - return; - - window->d->mShowLoadingOverlay = false; - - window->d->mDirty = true; - window->grabWindow(0,0,webView->boundingRect().width(),webView->boundingRect().height()); - - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setEventUri(window->getCurrentUri()); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onPageChanged, event); - - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onNavigateComplete, event); -} - -void LLWebPage::windowCloseRequested() -{ - if (!window) - return; - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onWindowCloseRequested, event); -} - -void LLWebPage::geometryChangeRequested(const QRect& geom) -{ - if (!window) - return; - - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - // empty UUID indicates this is targeting the main window -// event.setStringValue(window->getUUID()); - event.setRectValue(geom.x(), geom.y(), geom.width(), geom.height()); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onWindowGeometryChangeRequested, event); -} - -QString LLWebPage::chooseFile(QWebFrame* parentFrame, const QString& suggestedFile) -{ - Q_UNUSED(parentFrame); - Q_UNUSED(suggestedFile); - - return QString::fromStdString( window->requestFilePicker() ); -} - -void LLWebPage::javaScriptAlert(QWebFrame* frame, const QString& msg) -{ - Q_UNUSED(frame); - QMessageBox *msgBox = new QMessageBox; - msgBox->setWindowTitle(tr("JavaScript Alert - %1").arg(mainFrame()->url().host())); - msgBox->setText(msg); - msgBox->addButton(QMessageBox::Ok); - - QGraphicsProxyWidget *proxy = webView->scene()->addWidget(msgBox); - proxy->setWindowFlags(Qt::Window); // this makes the item a panel (and will make it get a window 'frame') - proxy->setPanelModality(QGraphicsItem::SceneModal); - proxy->setPos((webView->boundingRect().width() - msgBox->sizeHint().width())/2, - (webView->boundingRect().height() - msgBox->sizeHint().height())/2); - proxy->setActive(true); // make it the active item - - connect(msgBox, SIGNAL(finished(int)), proxy, SLOT(deleteLater())); - msgBox->show(); - - webView->scene()->setFocusItem(proxy); -} - -bool LLWebPage::javaScriptConfirm(QWebFrame* frame, const QString& msg) -{ - Q_UNUSED(frame); - Q_UNUSED(msg); - qWarning() << "LLWebPage::" << __FUNCTION__ << "not implemented" << msg << "returning true"; - return true; -} - -bool LLWebPage::javaScriptPrompt(QWebFrame* frame, const QString& msg, const QString& defaultValue, QString* result) -{ - Q_UNUSED(frame); - Q_UNUSED(msg); - Q_UNUSED(defaultValue); - Q_UNUSED(result); - qWarning() << "LLWebPage::" << __FUNCTION__ << "not implemented" << msg << defaultValue << "returning false"; - return false; -} - -void LLWebPage::extendNavigatorObject() -{ - // legacy - will go away in the future - QString q_host_language = QString::fromStdString( mHostLanguage ); - mainFrame()->evaluateJavaScript(QString("navigator.hostLanguage=\"%1\"").arg( q_host_language )); - - // the new way - if ( mJsObject ) - { - bool enabled = mJsObject->getSLObjectEnabled(); - if ( enabled ) - { - mainFrame()->addToJavaScriptWindowObject("slviewer", mJsObject ); - }; - }; -} - -QWebPage *LLWebPage::createWindow(WebWindowType type) -{ - Q_UNUSED(type); - QWebPage *result = NULL; - - if(window) - { - result = window->createWindow(); - } - - return result; -} - -void LLWebPage::setHostLanguage(const std::string& host_language) -{ - mHostLanguage = host_language; -} - -bool LLWebPage::supportsExtension(QWebPage::Extension extension) const -{ - if (extension == QWebPage::ErrorPageExtension) - return true; - return false; -} - -bool LLWebPage::extension(Extension, const ExtensionOption* option, ExtensionReturn* output) -{ - const QWebPage::ErrorPageExtensionOption* info = static_cast(option); - QWebPage::ErrorPageExtensionReturn* errorPage = static_cast(output); - - errorPage->content = QString("Failed loading page

%1

") - .arg(info->errorString).toUtf8(); - - return true; -} - -// Second Life viewer specific functions -void LLWebPage::setSLObjectEnabled( bool enabled ) -{ - if ( mJsObject ) - mJsObject->setSLObjectEnabled( enabled ); -} - -void LLWebPage::setAgentLanguage( const std::string& agent_language ) -{ - if ( mJsObject ) - mJsObject->setAgentLanguage( QString::fromStdString( agent_language ) ); -} - -void LLWebPage::setAgentRegion( const std::string& agent_region ) -{ - if ( mJsObject ) - mJsObject->setAgentRegion( QString::fromStdString( agent_region ) ); -} - -void LLWebPage::setAgentLocation( double x, double y, double z ) -{ - if ( mJsObject ) - { - QVariantMap location; - location["x"] = x; - location["y"] = y; - location["z"] = z; - mJsObject->setAgentLocation( location ); - } -} - -void LLWebPage::setAgentGlobalLocation( double x, double y, double z ) -{ - if ( mJsObject ) - { - QVariantMap global_location; - global_location["x"] = x; - global_location["y"] = y; - global_location["z"] = z; - mJsObject->setAgentGlobalLocation( global_location ); - } -} - -void LLWebPage::setAgentOrientation( double angle ) -{ - if ( mJsObject ) - { - mJsObject->setAgentOrientation( angle ); - } -} - -void LLWebPage::setAgentMaturity( const std::string& agent_maturity ) -{ - if ( mJsObject ) - mJsObject->setAgentMaturity( QString::fromStdString( agent_maturity ) ); -} - -void LLWebPage::emitLocation() -{ - if ( mJsObject ) - mJsObject->emitLocation(); -} - -void LLWebPage::emitMaturity() -{ - if ( mJsObject ) - mJsObject->emitMaturity(); -} - -void LLWebPage::emitLanguage() -{ - if ( mJsObject ) - mJsObject->emitLanguage(); -} - -void LLWebPage::setPageZoomFactor( double factor ) -{ - if ( webView ) - { - webView->setZoomFactor( factor ); - } -} \ No newline at end of file diff --git a/indra/llqtwebkit/llwebpage.h b/indra/llqtwebkit/llwebpage.h deleted file mode 100644 index 1a882254f..000000000 --- a/indra/llqtwebkit/llwebpage.h +++ /dev/null @@ -1,108 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLWEBPAGE_H -#define LLWEBPAGE_H - -class QGraphicsWebView; -#include -#include "llqtwebkit.h" - -class LLEmbeddedBrowserWindow; -class LLJsObject; - -class LLWebPage : public QWebPage -{ - Q_OBJECT - - public: - LLWebPage(QObject *parent = 0); - ~LLWebPage(); - - LLEmbeddedBrowserWindow *window; - bool event(QEvent *event); - - QGraphicsWebView *webView; - - void setHostLanguage(const std::string& host_language); - virtual bool supportsExtension(QWebPage::Extension extension) const; - virtual bool extension(Extension extension, const ExtensionOption* option, ExtensionReturn* output); - - // set the regex used to determine if a page is trusted or not - void setWhiteListRegex( const std::string& regex ); - - // check the whitelist and update browser config as appropriate - void checkWhiteList( const QUrl& url ); - - // code to change settings if page is known to be trusted goes here - void configureTrustedPage( bool is_trusted ); - - // Second Life specific functions - void setAgentRegion( const std::string& agent_region ); - void setAgentLocation( double x, double y, double z ); - void setAgentGlobalLocation( double x, double y, double z ); - void setAgentOrientation( double angle ); - void setSLObjectEnabled( bool enabled ); - void setAgentLanguage( const std::string& agent_language ); - void setAgentMaturity( const std::string& agent_maturity ); - void emitLocation(); - void emitMaturity(); - void emitLanguage(); - - void setPageZoomFactor( double factor ); - - protected: - bool acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest& request, NavigationType type); - - public slots: - void loadProgressSlot(int progress); - void linkHoveredSlot(const QString &link, const QString &title, const QString &textContent); - void statusBarMessageSlot(const QString &); - void titleChangedSlot(const QString &); - void urlChangedSlot(const QUrl& url); - void loadStarted(); - void loadFinished(bool ok); - void windowCloseRequested(); - void geometryChangeRequested(const QRect& geom); - - private slots: - void extendNavigatorObject(); - - protected: - QString chooseFile(QWebFrame* parentFrame, const QString& suggestedFile); - void javaScriptAlert(QWebFrame* frame, const QString& msg); - bool javaScriptConfirm(QWebFrame* frame, const QString& msg); - bool javaScriptPrompt(QWebFrame* frame, const QString& msg, const QString& defaultValue, QString* result); - QWebPage *createWindow(WebWindowType type); - - private: - bool checkRegex( const QUrl& url ); - QPoint currentPoint; - std::string mHostLanguage; - std::string mWhiteListRegex; - LLJsObject* mJsObject; -}; - -#endif diff --git a/indra/llqtwebkit/llwebpageopenshim.cpp b/indra/llqtwebkit/llwebpageopenshim.cpp deleted file mode 100644 index af9627907..000000000 --- a/indra/llqtwebkit/llwebpageopenshim.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "llwebpageopenshim.h" - -#include -#include -#include -#include - -#include "llqtwebkit.h" -#include "llembeddedbrowserwindow.h" -#include "llembeddedbrowserwindow_p.h" - -LLWebPageOpenShim::LLWebPageOpenShim(LLEmbeddedBrowserWindow *in_window, QObject *parent) - : QWebPage(parent) - , window(in_window) - , mOpeningSelf(false) - , mGeometryChangeRequested(false) - , mHasSentUUID(false) -{ -// qDebug() << "LLWebPageOpenShim created"; - - connect(this, SIGNAL(windowCloseRequested()), - this, SLOT(windowCloseRequested())); - connect(this, SIGNAL(geometryChangeRequested(const QRect&)), - this, SLOT(geometryChangeRequested(const QRect&))); - - // Create a unique UUID for this proxy - mUUID = llToStdString(QUuid::createUuid().toString()); - - // mTarget starts out as the empty string, which is what we want. -} - -LLWebPageOpenShim::~LLWebPageOpenShim() -{ -// qDebug() << "LLWebPageOpenShim destroyed"; -} - -void LLWebPageOpenShim::windowCloseRequested() -{ -// qDebug() << "LLWebPageOpenShim::windowCloseRequested"; - if(window) - { - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setStringValue(mUUID); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onWindowCloseRequested, event); - } -} - -void LLWebPageOpenShim::geometryChangeRequested(const QRect& geom) -{ -// qDebug() << "LLWebPageOpenShim::geometryChangeRequested: " << geom ; - - // This seems to happen before acceptNavigationRequest is called. If this is the case, delay sending the message until afterwards. - - if(window && mHasSentUUID) - { - LLEmbeddedBrowserWindowEvent event(window->getWindowId()); - event.setStringValue(mUUID); - event.setRectValue(geom.x(), geom.y(), geom.width(), geom.height()); - window->d->mEventEmitter.update(&LLEmbeddedBrowserWindowObserver::onWindowGeometryChangeRequested, event); - } - else - { - mGeometry = geom; - mGeometryChangeRequested = true; - } - -} - -bool LLWebPageOpenShim::matchesTarget(const std::string target) -{ - return (target == mTarget); -} - -bool LLWebPageOpenShim::matchesUUID(const std::string uuid) -{ - return (uuid == mUUID); -} - -void LLWebPageOpenShim::setProxy(const std::string &target, const std::string &uuid) -{ - mTarget = target; - mUUID = uuid; - - mHasSentUUID = false; - - mOpeningSelf = true; - - mainFrame()->evaluateJavaScript(QString("window.open("", \"%1\");").arg( QString::fromStdString(target) )); -} - -bool LLWebPageOpenShim::acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest& request, NavigationType type) -{ - Q_UNUSED(type); - if (!window) - { - return false; - } - - if(mOpeningSelf) - { - qDebug() << "LLWebPageOpenShim::acceptNavigationRequest: reopening self to set target name."; - return true; - } - -#if 0 - qDebug() << "LLWebPageOpenShim::acceptNavigationRequest called, NavigationType is " << type - << ", web frame is " << frame - << ", frame->page is " << frame->page() - << ", url is " << request.url() - << ", frame name is " << frame->frameName() - ; -#endif - - if (request.url().scheme() == QString("file")) - { - // For some reason, I'm seeing a spurious call to this function with a file:/// URL that points to the current working directory. - // Ignoring file:/// URLs here isn't a perfect solution (since it could potentially break content in local HTML files), - // but it's the best I could come up with for now. - - return false; - } - - // The name of the incoming frame has been set to the link target that was used when opening this window. - std::string click_href = llToStdString(request.url()); - mTarget = llToStdString(frame->frameName()); - - // build event based on the data we have and emit it - LLEmbeddedBrowserWindowEvent event( window->getWindowId()); - event.setEventUri(click_href); - event.setStringValue(mTarget); - event.setStringValue2(mUUID); - - window->d->mEventEmitter.update( &LLEmbeddedBrowserWindowObserver::onClickLinkHref, event ); - - mHasSentUUID = true; - - if(mGeometryChangeRequested) - { - geometryChangeRequested(mGeometry); - mGeometryChangeRequested = false; - } - - return false; -} - -QWebPage *LLWebPageOpenShim::createWindow(WebWindowType type) -{ - Q_UNUSED(type); - - return this; -} diff --git a/indra/llqtwebkit/llwebpageopenshim.h b/indra/llqtwebkit/llwebpageopenshim.h deleted file mode 100644 index 322f832ce..000000000 --- a/indra/llqtwebkit/llwebpageopenshim.h +++ /dev/null @@ -1,63 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef LLWEBPAGEOPENSHIM_H -#define LLWEBPAGEOPENSHIM_H - -#include - -class LLEmbeddedBrowserWindow; -class LLWebPageOpenShim : public QWebPage -{ - Q_OBJECT - - public: - LLWebPageOpenShim(LLEmbeddedBrowserWindow *in_window, QObject *parent = 0); - ~LLWebPageOpenShim(); - LLEmbeddedBrowserWindow *window; - bool matchesTarget(const std::string target); - bool matchesUUID(const std::string uuid); - void setProxy(const std::string &target, const std::string &uuid); - - public slots: - void windowCloseRequested(); - void geometryChangeRequested(const QRect& geom); - - protected: - bool acceptNavigationRequest(QWebFrame* frame, const QNetworkRequest& request, NavigationType type); - QWebPage *createWindow(WebWindowType type); - - private: - std::string mUUID; - std::string mTarget; - bool mOpeningSelf; - bool mGeometryChangeRequested; - bool mHasSentUUID; - QRect mGeometry; - -}; - -#endif - diff --git a/indra/llqtwebkit/passworddialog.ui b/indra/llqtwebkit/passworddialog.ui deleted file mode 100644 index 033514eff..000000000 --- a/indra/llqtwebkit/passworddialog.ui +++ /dev/null @@ -1,137 +0,0 @@ - - - PasswordDialog - - - - 0 - 0 - 394 - 183 - - - - Dialog - - - - - - Qt::Vertical - - - - 20 - 12 - - - - - - - - - - - true - - - - - - - - 32 - 32 - - - - icon - - - - - - - Qt::Vertical - - - - 20 - 13 - - - - - - - - User name: - - - - - - - - - - Password: - - - - - - - QLineEdit::Password - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - PasswordDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - PasswordDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/indra/llqtwebkit/pstdint.h b/indra/llqtwebkit/pstdint.h deleted file mode 100644 index b36f63db3..000000000 --- a/indra/llqtwebkit/pstdint.h +++ /dev/null @@ -1,728 +0,0 @@ -/* A portable stdint.h - **************************************************************************** - * BSD License: - **************************************************************************** - * - * Copyright (c) 2005-2007 Paul Hsieh - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - **************************************************************************** - * - * Version 0.1.10 - * - * The ANSI C standard committee, for the C99 standard, specified the - * inclusion of a new standard include file called stdint.h. This is - * a very useful and long desired include file which contains several - * very precise definitions for integer scalar types that is - * critically important for making portable several classes of - * applications including cryptography, hashing, variable length - * integer libraries and so on. But for most developers its likely - * useful just for programming sanity. - * - * The problem is that most compiler vendors have decided not to - * implement the C99 standard, and the next C++ language standard - * (which has a lot more mindshare these days) will be a long time in - * coming and its unknown whether or not it will include stdint.h or - * how much adoption it will have. Either way, it will be a long time - * before all compilers come with a stdint.h and it also does nothing - * for the extremely large number of compilers available today which - * do not include this file, or anything comparable to it. - * - * So that's what this file is all about. Its an attempt to build a - * single universal include file that works on as many platforms as - * possible to deliver what stdint.h is supposed to. A few things - * that should be noted about this file: - * - * 1) It is not guaranteed to be portable and/or present an identical - * interface on all platforms. The extreme variability of the - * ANSI C standard makes this an impossibility right from the - * very get go. Its really only meant to be useful for the vast - * majority of platforms that possess the capability of - * implementing usefully and precisely defined, standard sized - * integer scalars. Systems which are not intrinsically 2s - * complement may produce invalid constants. - * - * 2) There is an unavoidable use of non-reserved symbols. - * - * 3) Other standard include files are invoked. - * - * 4) This file may come in conflict with future platforms that do - * include stdint.h. The hope is that one or the other can be - * used with no real difference. - * - * 5) In the current verison, if your platform can't represent - * int32_t, int16_t and int8_t, it just dumps out with a compiler - * error. - * - * 6) 64 bit integers may or may not be defined. Test for their - * presence with the test: #ifdef INT64_MAX or #ifdef UINT64_MAX. - * Note that this is different from the C99 specification which - * requires the existence of 64 bit support in the compiler. If - * this is not defined for your platform, yet it is capable of - * dealing with 64 bits then it is because this file has not yet - * been extended to cover all of your system's capabilities. - * - * 7) (u)intptr_t may or may not be defined. Test for its presence - * with the test: #ifdef PTRDIFF_MAX. If this is not defined - * for your platform, then it is because this file has not yet - * been extended to cover all of your system's capabilities, not - * because its optional. - * - * 8) The following might not been defined even if your platform is - * capable of defining it: - * - * WCHAR_MIN - * WCHAR_MAX - * (u)int64_t - * PTRDIFF_MIN - * PTRDIFF_MAX - * (u)intptr_t - * - * 9) The following have not been defined: - * - * WINT_MIN - * WINT_MAX - * - * 10) The criteria for defining (u)int_least(*)_t isn't clear, - * except for systems which don't have a type that precisely - * defined 8, 16, or 32 bit types (which this include file does - * not support anyways). Default definitions have been given. - * - * 11) The criteria for defining (u)int_fast(*)_t isn't something I - * would trust to any particular compiler vendor or the ANSI C - * committee. It is well known that "compatible systems" are - * commonly created that have very different performance - * characteristics from the systems they are compatible with, - * especially those whose vendors make both the compiler and the - * system. Default definitions have been given, but its strongly - * recommended that users never use these definitions for any - * reason (they do *NOT* deliver any serious guarantee of - * improved performance -- not in this file, nor any vendor's - * stdint.h). - * - * 12) The following macros: - * - * PRINTF_INTMAX_MODIFIER - * PRINTF_INT64_MODIFIER - * PRINTF_INT32_MODIFIER - * PRINTF_INT16_MODIFIER - * PRINTF_LEAST64_MODIFIER - * PRINTF_LEAST32_MODIFIER - * PRINTF_LEAST16_MODIFIER - * PRINTF_INTPTR_MODIFIER - * - * are strings which have been defined as the modifiers required - * for the "d", "u" and "x" printf formats to correctly output - * (u)intmax_t, (u)int64_t, (u)int32_t, (u)int16_t, (u)least64_t, - * (u)least32_t, (u)least16_t and (u)intptr_t types respectively. - * PRINTF_INTPTR_MODIFIER is not defined for some systems which - * provide their own stdint.h. PRINTF_INT64_MODIFIER is not - * defined if INT64_MAX is not defined. These are an extension - * beyond what C99 specifies must be in stdint.h. - * - * In addition, the following macros are defined: - * - * PRINTF_INTMAX_HEX_WIDTH - * PRINTF_INT64_HEX_WIDTH - * PRINTF_INT32_HEX_WIDTH - * PRINTF_INT16_HEX_WIDTH - * PRINTF_INT8_HEX_WIDTH - * PRINTF_INTMAX_DEC_WIDTH - * PRINTF_INT64_DEC_WIDTH - * PRINTF_INT32_DEC_WIDTH - * PRINTF_INT16_DEC_WIDTH - * PRINTF_INT8_DEC_WIDTH - * - * Which specifies the maximum number of characters required to - * print the number of that type in either hexadecimal or decimal. - * These are an extension beyond what C99 specifies must be in - * stdint.h. - * - * Compilers tested (all with 0 warnings at their highest respective - * settings): Borland Turbo C 2.0, WATCOM C/C++ 11.0 (16 bits and 32 - * bits), Microsoft Visual C++ 6.0 (32 bit), Microsoft Visual Studio - * .net (VC7), Intel C++ 4.0, GNU gcc v3.3.3 - * - * This file should be considered a work in progress. Suggestions for - * improvements, especially those which increase coverage are strongly - * encouraged. - * - * Acknowledgements - * - * The following people have made significant contributions to the - * development and testing of this file: - * - * Chris Howie - * John Steele Scott - * Dave Thorup - * - */ - -#include -#include -#include - -/* - * For gcc with _STDINT_H, fill in the PRINTF_INT*_MODIFIER macros, and - * do nothing else. On the Mac OS X version of gcc this is _STDINT_H_. - */ - -#if ((defined(__STDC__) && __STDC__ && __STDC_VERSION__ >= 199901L) || (defined (__WATCOMC__) && (defined (_STDINT_H_INCLUDED) || __WATCOMC__ >= 1250)) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) )) && !defined (_PSTDINT_H_INCLUDED) -#include -#define _PSTDINT_H_INCLUDED -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "l" -# endif -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "h" -# endif -# ifndef PRINTF_INTMAX_MODIFIER -# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER -# endif -# ifndef PRINTF_INT64_HEX_WIDTH -# define PRINTF_INT64_HEX_WIDTH "16" -# endif -# ifndef PRINTF_INT32_HEX_WIDTH -# define PRINTF_INT32_HEX_WIDTH "8" -# endif -# ifndef PRINTF_INT16_HEX_WIDTH -# define PRINTF_INT16_HEX_WIDTH "4" -# endif -# ifndef PRINTF_INT8_HEX_WIDTH -# define PRINTF_INT8_HEX_WIDTH "2" -# endif -# ifndef PRINTF_INT64_DEC_WIDTH -# define PRINTF_INT64_DEC_WIDTH "20" -# endif -# ifndef PRINTF_INT32_DEC_WIDTH -# define PRINTF_INT32_DEC_WIDTH "10" -# endif -# ifndef PRINTF_INT16_DEC_WIDTH -# define PRINTF_INT16_DEC_WIDTH "5" -# endif -# ifndef PRINTF_INT8_DEC_WIDTH -# define PRINTF_INT8_DEC_WIDTH "3" -# endif -# ifndef PRINTF_INTMAX_HEX_WIDTH -# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH -# endif -# ifndef PRINTF_INTMAX_DEC_WIDTH -# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH -# endif - -/* - * Something really weird is going on with Open Watcom. Just pull some of - * these duplicated definitions from Open Watcom's stdint.h file for now. - */ - -# if defined (__WATCOMC__) && __WATCOMC__ >= 1250 -# if !defined (INT64_C) -# define INT64_C(x) (x + (INT64_MAX - INT64_MAX)) -# endif -# if !defined (UINT64_C) -# define UINT64_C(x) (x + (UINT64_MAX - UINT64_MAX)) -# endif -# if !defined (INT32_C) -# define INT32_C(x) (x + (INT32_MAX - INT32_MAX)) -# endif -# if !defined (UINT32_C) -# define UINT32_C(x) (x + (UINT32_MAX - UINT32_MAX)) -# endif -# if !defined (INT16_C) -# define INT16_C(x) (x) -# endif -# if !defined (UINT16_C) -# define UINT16_C(x) (x) -# endif -# if !defined (INT8_C) -# define INT8_C(x) (x) -# endif -# if !defined (UINT8_C) -# define UINT8_C(x) (x) -# endif -# if !defined (UINT64_MAX) -# define UINT64_MAX 18446744073709551615ULL -# endif -# if !defined (INT64_MAX) -# define INT64_MAX 9223372036854775807LL -# endif -# if !defined (UINT32_MAX) -# define UINT32_MAX 4294967295UL -# endif -# if !defined (INT32_MAX) -# define INT32_MAX 2147483647L -# endif -# if !defined (INTMAX_MAX) -# define INTMAX_MAX INT64_MAX -# endif -# if !defined (INTMAX_MIN) -# define INTMAX_MIN INT64_MIN -# endif -# endif -#endif - -#ifndef _PSTDINT_H_INCLUDED -#define _PSTDINT_H_INCLUDED - -#ifndef SIZE_MAX -# define SIZE_MAX (~(size_t)0) -#endif - -/* - * Deduce the type assignments from limits.h under the assumption that - * integer sizes in bits are powers of 2, and follow the ANSI - * definitions. - */ - -#ifndef UINT8_MAX -# define UINT8_MAX 0xff -#endif -#ifndef uint8_t -# if (UCHAR_MAX == UINT8_MAX) || defined (S_SPLINT_S) - typedef unsigned char uint8_t; -# define UINT8_C(v) ((uint8_t) v) -# else -# error "Platform not supported" -# endif -#endif - -#ifndef INT8_MAX -# define INT8_MAX 0x7f -#endif -#ifndef INT8_MIN -# define INT8_MIN INT8_C(0x80) -#endif -#ifndef int8_t -# if (SCHAR_MAX == INT8_MAX) || defined (S_SPLINT_S) - typedef signed char int8_t; -# define INT8_C(v) ((int8_t) v) -# else -# error "Platform not supported" -# endif -#endif - -#ifndef UINT16_MAX -# define UINT16_MAX 0xffff -#endif -#ifndef uint16_t -#if (UINT_MAX == UINT16_MAX) || defined (S_SPLINT_S) - typedef unsigned int uint16_t; -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "" -# endif -# define UINT16_C(v) ((uint16_t) (v)) -#elif (USHRT_MAX == UINT16_MAX) - typedef unsigned short uint16_t; -# define UINT16_C(v) ((uint16_t) (v)) -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "h" -# endif -#else -#error "Platform not supported" -#endif -#endif - -#ifndef INT16_MAX -# define INT16_MAX 0x7fff -#endif -#ifndef INT16_MIN -# define INT16_MIN INT16_C(0x8000) -#endif -#ifndef int16_t -#if (INT_MAX == INT16_MAX) || defined (S_SPLINT_S) - typedef signed int int16_t; -# define INT16_C(v) ((int16_t) (v)) -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "" -# endif -#elif (SHRT_MAX == INT16_MAX) - typedef signed short int16_t; -# define INT16_C(v) ((int16_t) (v)) -# ifndef PRINTF_INT16_MODIFIER -# define PRINTF_INT16_MODIFIER "h" -# endif -#else -#error "Platform not supported" -#endif -#endif - -#ifndef UINT32_MAX -# define UINT32_MAX (0xffffffffUL) -#endif -#ifndef uint32_t -#if (ULONG_MAX == UINT32_MAX) || defined (S_SPLINT_S) - typedef unsigned long uint32_t; -# define UINT32_C(v) v ## UL -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "l" -# endif -#elif (UINT_MAX == UINT32_MAX) - typedef unsigned int uint32_t; -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -# define UINT32_C(v) v ## U -#elif (USHRT_MAX == UINT32_MAX) - typedef unsigned short uint32_t; -# define UINT32_C(v) ((unsigned short) (v)) -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -#else -#error "Platform not supported" -#endif -#endif - -#ifndef INT32_MAX -# define INT32_MAX (0x7fffffffL) -#endif -#ifndef INT32_MIN -# define INT32_MIN INT32_C(0x80000000) -#endif -#ifndef int32_t -#if (LONG_MAX == INT32_MAX) || defined (S_SPLINT_S) - typedef signed long int32_t; -# define INT32_C(v) v ## L -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "l" -# endif -#elif (INT_MAX == INT32_MAX) - typedef signed int int32_t; -# define INT32_C(v) v -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -#elif (SHRT_MAX == INT32_MAX) - typedef signed short int32_t; -# define INT32_C(v) ((short) (v)) -# ifndef PRINTF_INT32_MODIFIER -# define PRINTF_INT32_MODIFIER "" -# endif -#else -#error "Platform not supported" -#endif -#endif - -/* - * The macro stdint_int64_defined is temporarily used to record - * whether or not 64 integer support is available. It must be - * defined for any 64 integer extensions for new platforms that are - * added. - */ - -#undef stdint_int64_defined -#if (defined(__STDC__) && defined(__STDC_VERSION__)) || defined (S_SPLINT_S) -# if (__STDC__ && __STDC_VERSION >= 199901L) || defined (S_SPLINT_S) -# define stdint_int64_defined - typedef long long int64_t; - typedef unsigned long long uint64_t; -# define UINT64_C(v) v ## ULL -# define INT64_C(v) v ## LL -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# endif -#endif - -#if !defined (stdint_int64_defined) -# if defined(__GNUC__) -# define stdint_int64_defined - __extension__ typedef long long int64_t; - __extension__ typedef unsigned long long uint64_t; -# define UINT64_C(v) v ## ULL -# define INT64_C(v) v ## LL -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# elif defined(__MWERKS__) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || defined (__APPLE_CC__) || defined (_LONG_LONG) || defined (_CRAYC) || defined (S_SPLINT_S) -# define stdint_int64_defined - typedef long long int64_t; - typedef unsigned long long uint64_t; -# define UINT64_C(v) v ## ULL -# define INT64_C(v) v ## LL -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "ll" -# endif -# elif (defined(__WATCOMC__) && defined(__WATCOM_INT64__)) || (defined(_MSC_VER) && _INTEGRAL_MAX_BITS >= 64) || (defined (__BORLANDC__) && __BORLANDC__ > 0x460) || defined (__alpha) || defined (__DECC) -# define stdint_int64_defined - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; -# define UINT64_C(v) v ## UI64 -# define INT64_C(v) v ## I64 -# ifndef PRINTF_INT64_MODIFIER -# define PRINTF_INT64_MODIFIER "I64" -# endif -# endif -#endif - -#if !defined (LONG_LONG_MAX) && defined (INT64_C) -# define LONG_LONG_MAX INT64_C (9223372036854775807) -#endif -#ifndef ULONG_LONG_MAX -# define ULONG_LONG_MAX UINT64_C (18446744073709551615) -#endif - -#if !defined (INT64_MAX) && defined (INT64_C) -# define INT64_MAX INT64_C (9223372036854775807) -#endif -#if !defined (INT64_MIN) && defined (INT64_C) -# define INT64_MIN INT64_C (-9223372036854775808) -#endif -#if !defined (UINT64_MAX) && defined (INT64_C) -# define UINT64_MAX UINT64_C (18446744073709551615) -#endif - -/* - * Width of hexadecimal for number field. - */ - -#ifndef PRINTF_INT64_HEX_WIDTH -# define PRINTF_INT64_HEX_WIDTH "16" -#endif -#ifndef PRINTF_INT32_HEX_WIDTH -# define PRINTF_INT32_HEX_WIDTH "8" -#endif -#ifndef PRINTF_INT16_HEX_WIDTH -# define PRINTF_INT16_HEX_WIDTH "4" -#endif -#ifndef PRINTF_INT8_HEX_WIDTH -# define PRINTF_INT8_HEX_WIDTH "2" -#endif - -#ifndef PRINTF_INT64_DEC_WIDTH -# define PRINTF_INT64_DEC_WIDTH "20" -#endif -#ifndef PRINTF_INT32_DEC_WIDTH -# define PRINTF_INT32_DEC_WIDTH "10" -#endif -#ifndef PRINTF_INT16_DEC_WIDTH -# define PRINTF_INT16_DEC_WIDTH "5" -#endif -#ifndef PRINTF_INT8_DEC_WIDTH -# define PRINTF_INT8_DEC_WIDTH "3" -#endif - -/* - * Ok, lets not worry about 128 bit integers for now. Moore's law says - * we don't need to worry about that until about 2040 at which point - * we'll have bigger things to worry about. - */ - -#ifdef stdint_int64_defined - typedef int64_t intmax_t; - typedef uint64_t uintmax_t; -# define INTMAX_MAX INT64_MAX -# define INTMAX_MIN INT64_MIN -# define UINTMAX_MAX UINT64_MAX -# define UINTMAX_C(v) UINT64_C(v) -# define INTMAX_C(v) INT64_C(v) -# ifndef PRINTF_INTMAX_MODIFIER -# define PRINTF_INTMAX_MODIFIER PRINTF_INT64_MODIFIER -# endif -# ifndef PRINTF_INTMAX_HEX_WIDTH -# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT64_HEX_WIDTH -# endif -# ifndef PRINTF_INTMAX_DEC_WIDTH -# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT64_DEC_WIDTH -# endif -#else - typedef int32_t intmax_t; - typedef uint32_t uintmax_t; -# define INTMAX_MAX INT32_MAX -# define UINTMAX_MAX UINT32_MAX -# define UINTMAX_C(v) UINT32_C(v) -# define INTMAX_C(v) INT32_C(v) -# ifndef PRINTF_INTMAX_MODIFIER -# define PRINTF_INTMAX_MODIFIER PRINTF_INT32_MODIFIER -# endif -# ifndef PRINTF_INTMAX_HEX_WIDTH -# define PRINTF_INTMAX_HEX_WIDTH PRINTF_INT32_HEX_WIDTH -# endif -# ifndef PRINTF_INTMAX_DEC_WIDTH -# define PRINTF_INTMAX_DEC_WIDTH PRINTF_INT32_DEC_WIDTH -# endif -#endif - -/* - * Because this file currently only supports platforms which have - * precise powers of 2 as bit sizes for the default integers, the - * least definitions are all trivial. Its possible that a future - * version of this file could have different definitions. - */ - -#ifndef stdint_least_defined - typedef int8_t int_least8_t; - typedef uint8_t uint_least8_t; - typedef int16_t int_least16_t; - typedef uint16_t uint_least16_t; - typedef int32_t int_least32_t; - typedef uint32_t uint_least32_t; -# define PRINTF_LEAST32_MODIFIER PRINTF_INT32_MODIFIER -# define PRINTF_LEAST16_MODIFIER PRINTF_INT16_MODIFIER -# define UINT_LEAST8_MAX UINT8_MAX -# define INT_LEAST8_MAX INT8_MAX -# define UINT_LEAST16_MAX UINT16_MAX -# define INT_LEAST16_MAX INT16_MAX -# define UINT_LEAST32_MAX UINT32_MAX -# define INT_LEAST32_MAX INT32_MAX -# define INT_LEAST8_MIN INT8_MIN -# define INT_LEAST16_MIN INT16_MIN -# define INT_LEAST32_MIN INT32_MIN -# ifdef stdint_int64_defined - typedef int64_t int_least64_t; - typedef uint64_t uint_least64_t; -# define PRINTF_LEAST64_MODIFIER PRINTF_INT64_MODIFIER -# define UINT_LEAST64_MAX UINT64_MAX -# define INT_LEAST64_MAX INT64_MAX -# define INT_LEAST64_MIN INT64_MIN -# endif -#endif -#undef stdint_least_defined - -/* - * The ANSI C committee pretending to know or specify anything about - * performance is the epitome of misguided arrogance. The mandate of - * this file is to *ONLY* ever support that absolute minimum - * definition of the fast integer types, for compatibility purposes. - * No extensions, and no attempt to suggest what may or may not be a - * faster integer type will ever be made in this file. Developers are - * warned to stay away from these types when using this or any other - * stdint.h. - */ - -typedef int_least8_t int_fast8_t; -typedef uint_least8_t uint_fast8_t; -typedef int_least16_t int_fast16_t; -typedef uint_least16_t uint_fast16_t; -typedef int_least32_t int_fast32_t; -typedef uint_least32_t uint_fast32_t; -#define UINT_FAST8_MAX UINT_LEAST8_MAX -#define INT_FAST8_MAX INT_LEAST8_MAX -#define UINT_FAST16_MAX UINT_LEAST16_MAX -#define INT_FAST16_MAX INT_LEAST16_MAX -#define UINT_FAST32_MAX UINT_LEAST32_MAX -#define INT_FAST32_MAX INT_LEAST32_MAX -#define INT_FAST8_MIN INT_LEAST8_MIN -#define INT_FAST16_MIN INT_LEAST16_MIN -#define INT_FAST32_MIN INT_LEAST32_MIN -#ifdef stdint_int64_defined - typedef int_least64_t int_fast64_t; - typedef uint_least64_t uint_fast64_t; -# define UINT_FAST64_MAX UINT_LEAST64_MAX -# define INT_FAST64_MAX INT_LEAST64_MAX -# define INT_FAST64_MIN INT_LEAST64_MIN -#endif - -#undef stdint_int64_defined - -/* - * Whatever piecemeal, per compiler thing we can do about the wchar_t - * type limits. - */ - -#if defined(__WATCOMC__) || defined(_MSC_VER) || defined (__GNUC__) -# include -# ifndef WCHAR_MIN -# define WCHAR_MIN 0 -# endif -# ifndef WCHAR_MAX -# define WCHAR_MAX ((wchar_t)-1) -# endif -#endif - -/* - * Whatever piecemeal, per compiler/platform thing we can do about the - * (u)intptr_t types and limits. - */ - -#if defined (_MSC_VER) && defined (_UINTPTR_T_DEFINED) -# define STDINT_H_UINTPTR_T_DEFINED -#endif - -#ifndef STDINT_H_UINTPTR_T_DEFINED -# if defined (__alpha__) || defined (__ia64__) || defined (__x86_64__) || defined (_WIN64) -# define stdint_intptr_bits 64 -# elif defined (__WATCOMC__) || defined (__TURBOC__) -# if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__) -# define stdint_intptr_bits 16 -# else -# define stdint_intptr_bits 32 -# endif -# elif defined (__i386__) || defined (_WIN32) || defined (WIN32) -# define stdint_intptr_bits 32 -# elif defined (__INTEL_COMPILER) -/* TODO -- what will Intel do about x86-64? */ -# endif - -# ifdef stdint_intptr_bits -# define stdint_intptr_glue3_i(a,b,c) a##b##c -# define stdint_intptr_glue3(a,b,c) stdint_intptr_glue3_i(a,b,c) -# ifndef PRINTF_INTPTR_MODIFIER -# define PRINTF_INTPTR_MODIFIER stdint_intptr_glue3(PRINTF_INT,stdint_intptr_bits,_MODIFIER) -# endif -# ifndef PTRDIFF_MAX -# define PTRDIFF_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) -# endif -# ifndef PTRDIFF_MIN -# define PTRDIFF_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) -# endif -# ifndef UINTPTR_MAX -# define UINTPTR_MAX stdint_intptr_glue3(UINT,stdint_intptr_bits,_MAX) -# endif -# ifndef INTPTR_MAX -# define INTPTR_MAX stdint_intptr_glue3(INT,stdint_intptr_bits,_MAX) -# endif -# ifndef INTPTR_MIN -# define INTPTR_MIN stdint_intptr_glue3(INT,stdint_intptr_bits,_MIN) -# endif -# ifndef INTPTR_C -# define INTPTR_C(x) stdint_intptr_glue3(INT,stdint_intptr_bits,_C)(x) -# endif -# ifndef UINTPTR_C -# define UINTPTR_C(x) stdint_intptr_glue3(UINT,stdint_intptr_bits,_C)(x) -# endif - typedef stdint_intptr_glue3(uint,stdint_intptr_bits,_t) uintptr_t; - typedef stdint_intptr_glue3( int,stdint_intptr_bits,_t) intptr_t; -# else -/* TODO -- This following is likely wrong for some platforms, and does - nothing for the definition of uintptr_t. */ - typedef ptrdiff_t intptr_t; -# endif -# define STDINT_H_UINTPTR_T_DEFINED -#endif - -/* - * Assumes sig_atomic_t is signed and we have a 2s complement machine. - */ - -#ifndef SIG_ATOMIC_MAX -# define SIG_ATOMIC_MAX ((((sig_atomic_t) 1) << (sizeof (sig_atomic_t)*CHAR_BIT-1)) - 1) -#endif - -#endif diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/CMakeLists.txt b/indra/llqtwebkit/qtwebkit_cookiejar/CMakeLists.txt deleted file mode 100644 index 635765c83..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ -# -*- cmake -*- - -add_subdirectory(src) diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/trie.pro b/indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/trie.pro deleted file mode 100644 index c031e1971..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/trie.pro +++ /dev/null @@ -1,15 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . - -win32: CONFIG += console -mac:CONFIG -= app_bundle - -CONFIG += qtestlib - -include(../../src/src.pri) - -# Input -SOURCES += tst_trie.cpp -HEADERS += diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/tst_trie.cpp b/indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/tst_trie.cpp deleted file mode 100644 index e4bdc6d4e..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/autotest/trie/tst_trie.cpp +++ /dev/null @@ -1,270 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include - -class tst_Trie : public QObject -{ - Q_OBJECT - -public slots: - void initTestCase(); - void cleanupTestCase(); - void init(); - void cleanup(); - -private slots: - void trie_data(); - void trie(); - - void insert_data(); - void insert(); - void clear(); - void find_data(); - void find(); - void remove_data(); - void remove(); - void all(); -}; - -// Subclass that exposes the protected functions. -class SubTrie : public Trie -{ -public: - -}; - -// This will be called before the first test function is executed. -// It is only called once. -void tst_Trie::initTestCase() -{ -} - -// This will be called after the last test function is executed. -// It is only called once. -void tst_Trie::cleanupTestCase() -{ -} - -// This will be called before each test function is executed. -void tst_Trie::init() -{ -} - -// This will be called after every test function. -void tst_Trie::cleanup() -{ -} - -void tst_Trie::trie_data() -{ -} - -void tst_Trie::trie() -{ - SubTrie t; - t.clear(); - QCOMPARE(t.find(QStringList()), QList()); - QCOMPARE(t.remove(QStringList(), -1), false); - QCOMPARE(t.all(), QList()); - t.insert(QStringList(), -1); -} - -void tst_Trie::insert_data() -{ -#if 0 - QTest::addColumn("key"); - QTest::addColumn("value"); - QTest::newRow("null") << QStringList() << T(); -#endif -} - -// public void insert(QStringList const& key, T value) -void tst_Trie::insert() -{ -#if 0 - QFETCH(QStringList, key); - QFETCH(T, value); - - SubTrie t>; - - t>.insert(key, value); -#endif - QSKIP("Test is not implemented.", SkipAll); -} - -// public void clear() -void tst_Trie::clear() -{ - SubTrie t; - t.insert(QStringList(), 0); - t.clear(); - QCOMPARE(t.find(QStringList()), QList()); - QCOMPARE(t.all(), QList()); -} - -Q_DECLARE_METATYPE(QStringList) -typedef QList IntList; -Q_DECLARE_METATYPE(IntList) -void tst_Trie::find_data() -{ - QTest::addColumn("keys"); - QTest::addColumn("values"); - QTest::addColumn("find"); - QTest::addColumn("found"); - - QTest::newRow("null") << QStringList() << IntList() << QStringList() << IntList(); - - QStringList wiki = (QStringList() << "t,e,a" << "i" << "t,e,n" << "i,n" << "i,n,n" << "t,o"); - IntList wikiNum = (IntList() << 3 << 11 << 12 << 5 << 9 << 7); - - QTest::newRow("wikipedia-0") - << wiki - << wikiNum - << (QStringList() << "t") - << (IntList()); - - QTest::newRow("wikipedia-1") - << wiki - << wikiNum - << (QStringList() << "t" << "o") - << (IntList() << 7); - - QTest::newRow("wikipedia-2") - << (wiki << "t,o") - << (wikiNum << 4) - << (QStringList() << "t" << "o") - << (IntList() << 7 << 4); - - QTest::newRow("wikipedia-3") - << wiki - << wikiNum - << (QStringList() << "i" << "n" << "n") - << (IntList() << 9); - -} - -// public QList const find(QStringList const& key) -void tst_Trie::find() -{ - QFETCH(QStringList, keys); - QFETCH(IntList, values); - QFETCH(QStringList, find); - QFETCH(IntList, found); - - SubTrie t; - for (int i = 0; i < keys.count(); ++i) - t.insert(keys[i].split(","), values[i]); - QCOMPARE(t.all(), values); - QCOMPARE(t.find(find), found); -} - -void tst_Trie::remove_data() -{ - QTest::addColumn("keys"); - QTest::addColumn("values"); - QTest::addColumn("removeKey"); - QTest::addColumn("removeValue"); - QTest::addColumn("removed"); - - QTest::newRow("null") << QStringList() << IntList() << QStringList() << -1 << false; - - QStringList wiki = (QStringList() << "t,e,a" << "i" << "t,e,n" << "i,n" << "i,n,n" << "t,o"); - IntList wikiNum = (IntList() << 3 << 11 << 12 << 5 << 9 << 7); - - QTest::newRow("valid key-0") - << wiki - << wikiNum - << (QStringList() << "t") - << -1 - << false; - - QTest::newRow("valid key-1") - << wiki - << wikiNum - << (QStringList() << "t" << "o") - << -1 - << false; - - QTest::newRow("valid key-2") - << wiki - << wikiNum - << (QStringList() << "t" << "o" << "w") - << 2 - << false; - - QTest::newRow("valid key-3") - << wiki - << wikiNum - << (QStringList() << "t" << "o") - << 7 - << true; - - QTest::newRow("valid key-4") - << wiki - << wikiNum - << (QStringList() << "i" << "n") - << 3 - << false; - - QTest::newRow("valid key-5") - << wiki - << wikiNum - << (QStringList() << "i" << "n") - << 5 - << true; - -} - -// public bool remove(QStringList const& key, T value) -void tst_Trie::remove() -{ - QFETCH(QStringList, keys); - QFETCH(IntList, values); - QFETCH(QStringList, removeKey); - QFETCH(int, removeValue); - QFETCH(bool, removed); - - SubTrie t; - for (int i = 0; i < keys.count(); ++i) - t.insert(keys[i].split(","), values[i]); - QCOMPARE(t.all(), values); - QCOMPARE(t.remove(removeKey, removeValue), removed); - if (removed) - values.removeOne(removeValue); - QCOMPARE(t.all(), values); -} - -void tst_Trie::all() -{ - SubTrie t; - // hmm everyone else tests this it seems - QSKIP("Test is not implemented.", SkipAll); -} - -QTEST_MAIN(tst_Trie) -#include "tst_trie.moc" - diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/cookiejar.pro b/indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/cookiejar.pro deleted file mode 100644 index 350fbc0f6..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/cookiejar.pro +++ /dev/null @@ -1,17 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . - -win32: CONFIG += console -mac:CONFIG -= app_bundle - -CONFIG += qtestlib - -include(../../src/src.pri) -#include(../../../dev/code/webweaver/src/iris.pri) -#include(../../../dev/arora/src/src.pri) - -# Input -SOURCES += main.cpp -HEADERS += diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/main.cpp b/indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/main.cpp deleted file mode 100644 index 863d6b0be..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/benchmark/networkcookiejar/main.cpp +++ /dev/null @@ -1,159 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include -#include - -class CookieJarBenchmark: public QObject { - Q_OBJECT - -private slots: - void setCookiesFromUrl(); - void cookiesForUrl(); - void player(); - -private: - QNetworkCookieJar *getJar(bool populate = true); - QList generateCookies(int size); -}; - -QNetworkCookieJar *CookieJarBenchmark::getJar(bool populate) -{ - QNetworkCookieJar *jar; - if (qgetenv("JAR") == "CookieJar") { - jar = new NetworkCookieJar(this); - } else { - jar = new QNetworkCookieJar(this); - } - if (!populate) - return jar; - - // pre populate - for (int i = 0; i < 500; ++i) { - QList cookies = generateCookies(1); - QUrl url = QUrl(QString("http://%1").arg(cookies[0].domain())); - jar->setCookiesFromUrl(cookies, url); - } - - return jar; -} - -QList CookieJarBenchmark::generateCookies(int size) -{ - QList cookies; - for (int i = 0; i < size; ++i) { - QNetworkCookie cookie; - - QString tld; - int c = qrand() % 3; - if (c == 0) tld = "com"; - if (c == 1) tld = "net"; - if (c == 2) tld = "org"; - - QString mid; - int size = qrand() % 6 + 3; - while (mid.count() < size) - mid += QString(QChar::fromAscii(qrand() % 26 + 65)); - - QString sub; - c = qrand() % 3; - if (c == 0) sub = "."; - if (c == 1) sub = ".www."; - if (c == 2) sub = ".foo"; - - cookie.setDomain(QString("%1%2.%3").arg(sub).arg(mid).arg(tld)); - cookie.setName("a"); - cookie.setValue("b"); - cookie.setPath("/"); - cookies.append(cookie); - } - return cookies; -} - -void CookieJarBenchmark::setCookiesFromUrl() -{ - QNetworkCookieJar *jar = getJar(); - QList cookies = generateCookies(1); - QUrl url = QUrl(QString("http://%1").arg(cookies[0].domain())); - QBENCHMARK { - jar->setCookiesFromUrl(cookies, url); - } - delete jar; -} - -void CookieJarBenchmark::cookiesForUrl() -{ - QNetworkCookieJar *jar = getJar(); - QList cookies = generateCookies(1); - cookies[0].setDomain("www.foo.tld"); - QUrl url = QUrl("http://www.foo.tld"); - //QUrl url = QUrl(QString("http://foo%1/").arg(cookies[0].domain())); - jar->setCookiesFromUrl(cookies, url); - //qDebug() << cookies << url; - int c = 0; - QBENCHMARK { - c += jar->cookiesForUrl(url).count(); - } - delete jar; -} - -// Grab the cookie.log file from the manualtest/browser directory -void CookieJarBenchmark::player() -{ - QBENCHMARK { - QFile file("cookie.log"); - file.open(QFile::ReadOnly); - QDataStream stream(&file); - QNetworkCookieJar *jar = getJar(false); - while (!stream.atEnd()) { - QString command; - QUrl url; - stream >> command; - stream >> url; - //qDebug() << command << url; - if (command == "cookiesForUrl") { - jar->cookiesForUrl(url); - } - if (command == "setCookiesFromUrl") { - QByteArray data; - stream >> data; - QDataStream dstream(&data, QIODevice::ReadWrite); - qint32 c; - dstream >> c; - QList cookies; - for (int i = 0; i < c; ++i) { - QByteArray text; - dstream >> text; - cookies += QNetworkCookie::parseCookies(text); - } - jar->setCookiesFromUrl(cookies, url); - } - } - } -} - -QTEST_MAIN(CookieJarBenchmark) -#include "main.moc" diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/browser.pro b/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/browser.pro deleted file mode 100644 index a363bbefc..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/browser.pro +++ /dev/null @@ -1,11 +0,0 @@ -###################################################################### -# Automatically generated by qmake (2.01a) Wed Jan 7 13:19:00 2009 -###################################################################### - -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -include(../../src/src.pri) -# Input -SOURCES += main.cpp diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/main.cpp b/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/main.cpp deleted file mode 100644 index 6d21759fc..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/browser/main.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include -#include -#include - -QFile file; -QDataStream stream; - -class CookieLog : public NetworkCookieJar { - - Q_OBJECT - -public: - CookieLog(QObject *parent = 0) : NetworkCookieJar(parent) - { - file.setFileName("cookie.log"); - file.open(QFile::WriteOnly); - stream.setDevice(&file); - }; - - virtual QList cookiesForUrl(const QUrl & url) const - { - stream << QString("cookiesForUrl") << url; - QList cookies = NetworkCookieJar::cookiesForUrl(url); - //stream << "#" << cookies; - file.flush(); - return cookies; - } - - virtual bool setCookiesFromUrl(const QList &cookieList, const QUrl &url) - { - QByteArray data; - QDataStream dstream(&data, QIODevice::ReadWrite); - qint32 c = cookieList.count(); - dstream << c; - qDebug() << cookieList.count(); - for (int i = 0; i < c; ++i) - dstream << cookieList[i].toRawForm(); - dstream.device()->close(); - stream << QString("setCookiesFromUrl") << url << data;// << cookieList; - bool set = NetworkCookieJar::setCookiesFromUrl(cookieList, url); - file.flush(); - return set; - } - -}; - -int main(int argc, char**argv) { - QApplication application(argc, argv); - QWebView view; - QString url = "http://www.google.com"; - if (argc > 1) - url = argv[1]; - view.load(QUrl(url)); - view.page()->networkAccessManager()->setCookieJar(new CookieLog()); - view.show(); - return application.exec(); -} - -#include "main.moc" diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/fuzz.pro b/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/fuzz.pro deleted file mode 100644 index 0ad65f1bf..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/fuzz.pro +++ /dev/null @@ -1,12 +0,0 @@ -###################################################################### -# Automatically generated by qmake (2.01a) Wed Jan 7 13:19:00 2009 -###################################################################### - -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -include(../../src/src.pri) -DEFINES += QT_NO_CAST_FROM_ASCII QT_STRICT_ITERATOR -# Input -SOURCES += main.cpp diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/main.cpp b/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/main.cpp deleted file mode 100644 index 28c79a1c2..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/manualtest/fuzz/main.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include - -QStringList generateKey() { - QStringList key; - int size = qrand() % 20 + 3; - while (key.count() < size) - key += QString(QChar::fromAscii(qrand() % 26 + 64)); - return key; -} - -void basicCheck() { - QStringList list; - list << QLatin1String("to") << QLatin1String("tea") << QLatin1String("ten") << QLatin1String("i") << QLatin1String("in") << QLatin1String("inn"); - Trie trie; - for (int i = 0; i < list.count(); ++i) { - QString key = list[i]; - QStringList keyList; - for (int j = 0; j < key.count(); ++j) - keyList.append(QString(key[j])); - trie.insert(keyList, i); - } - QByteArray data; - { - QDataStream stream(&data, QIODevice::ReadWrite); - stream << trie; - } - Trie trie2; - { - QDataStream stream(&data, QIODevice::ReadOnly); - stream >> trie2; - } - for (int i = 0; i < list.count(); ++i) { - QString key = list[i]; - QStringList keyList; - for (int j = 0; j < key.count(); ++j) - keyList.append(QString(key[j])); - QList x = trie2.find(keyList); - qDebug() << x.count() << i << x[0] << i; - qDebug() << trie2.remove(keyList, i); - qDebug() << trie2.find(keyList).count(); - } -} - -int main(int argc, char **argv) { - Q_UNUSED(argc); - Q_UNUSED(argv); - - basicCheck(); - - QHash hash; - Trie t; - while (hash.count() < 500) { - qDebug() << hash.count(); - QStringList key = generateKey(); - int value = qrand() % 50000; - hash[key.join(QLatin1String(","))] = value; - t.insert(key, value); - - QHashIterator i(hash); - while (i.hasNext()) { - i.next(); - if (t.find(i.key().split(QLatin1Char(','))).count() == 0) - qDebug() << i.key(); - Q_ASSERT(t.find(i.key().split(QLatin1Char(','))).count() > 0); - if (qrand() % 500 == 0) { - t.remove(i.key().split(QLatin1Char(',')), i.value()); - hash.remove(i.key()); - } - //cout << i.key() << ": " << i.value() << endl; - } - } - return 0; -} - diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/src/CMakeLists.txt b/indra/llqtwebkit/qtwebkit_cookiejar/src/CMakeLists.txt deleted file mode 100644 index 20bacf3eb..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/src/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -# -*- cmake -*- - -project(networkcookiejar) - -set(networkcookiejar_SOURCE_FILES - networkcookiejar.cpp - ) - -set(networkcookiejar_HEADER_FILES - networkcookiejar.h - networkcookiejar_p.h - trie_p.h - twoleveldomains_p.h - - ) - -QT4_WRAP_CPP(networkcookiejar_HEADERS_MOC ${networkcookiejar_HEADER_FILES}) - -add_library(networkcookiejar - ${networkcookiejar_SOURCE_FILES} - ${networkcookiejar_HEADERS_MOC} - ${networkcookiejar_UI_MOC} -) - -add_dependencies(networkcookiejar prepare) - -target_link_libraries(networkcookiejar) \ No newline at end of file diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.cpp b/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.cpp deleted file mode 100644 index 274d9e1c1..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.cpp +++ /dev/null @@ -1,444 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include "networkcookiejar.h" -#include "networkcookiejar_p.h" -#include "twoleveldomains_p.h" - -//#define NETWORKCOOKIEJAR_DEBUG - -#ifndef QT_NO_DEBUG -// ^ Prevent being left on in a released product by accident -// qDebug any cookies that are rejected for further inspection -#define NETWORKCOOKIEJAR_LOGREJECTEDCOOKIES -#include -#endif - -#include -#include - -#if defined(NETWORKCOOKIEJAR_DEBUG) -#include -#endif - - -NetworkCookieJar::NetworkCookieJar(QObject *parent) - : QNetworkCookieJar(parent) -{ - d = new NetworkCookieJarPrivate; -} - -NetworkCookieJar::~NetworkCookieJar() -{ - delete d; -} - -static QStringList splitHost(const QString &host) { - QStringList parts = host.split(QLatin1Char('.'), QString::KeepEmptyParts); - // Remove empty components that are on the start and end - while (!parts.isEmpty() && parts.last().isEmpty()) - parts.removeLast(); - while (!parts.isEmpty() && parts.first().isEmpty()) - parts.removeFirst(); - return parts; -} - -inline static bool shorterPaths(const QNetworkCookie &c1, const QNetworkCookie &c2) -{ - return c2.path().length() < c1.path().length(); -} - -QList NetworkCookieJar::cookiesForUrl(const QUrl &url) const -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << url; -#endif - // Generate split host - QString host = url.host(); - if (url.scheme().toLower() == QLatin1String("file")) - host = QLatin1String("localhost"); - QStringList urlHost = splitHost(host); - - // Get all the cookies for url - QList cookies = d->tree.find(urlHost); - if (urlHost.count() > 2) { - int top = 2; - if (d->matchesBlacklist(urlHost.last())) - top = 3; - - urlHost.removeFirst(); - while (urlHost.count() >= top) { - cookies += d->tree.find(urlHost); - urlHost.removeFirst(); - } - } - - // Prevent doing anything expensive in the common case where - // there are no cookies to check - if (cookies.isEmpty()) - return cookies; - - QDateTime now = QDateTime::currentDateTime().toTimeSpec(Qt::UTC); - const QString urlPath = d->urlPath(url); - const bool isSecure = url.scheme().toLower() == QLatin1String("https"); - QList::iterator i = cookies.begin(); - for (; i != cookies.end();) { - if (!d->matchingPath(*i, urlPath)) { -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << __FUNCTION__ << "Ignoring cookie, path does not match" << *i << urlPath; -#endif - i = cookies.erase(i); - continue; - } - if (!isSecure && i->isSecure()) { - i = cookies.erase(i); -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << __FUNCTION__ << "Ignoring cookie, security mismatch" - << *i << !isSecure; -#endif - continue; - } - if (!i->isSessionCookie() && now > i->expirationDate()) { - // remove now (expensive short term) because there will - // probably be many more cookiesForUrl calls for this host - d->tree.remove(splitHost(i->domain()), *i); -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << __FUNCTION__ << "Ignoring cookie, expiration issue" - << *i << now; -#endif - i = cookies.erase(i); - continue; - } - ++i; - } - - // shorter paths should go first - qSort(cookies.begin(), cookies.end(), shorterPaths); -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << "returning" << cookies.count(); - qDebug() << cookies; -#endif - return cookies; -} - -static const qint32 NetworkCookieJarMagic = 0xae; - -QByteArray NetworkCookieJar::saveState () const -{ - int version = 1; - QByteArray data; - QDataStream stream(&data, QIODevice::WriteOnly); - - stream << qint32(NetworkCookieJarMagic); - stream << qint32(version); - stream << d->tree; - return data; -} - -bool NetworkCookieJar::restoreState(const QByteArray &state) -{ - int version = 1; - QByteArray sd = state; - QDataStream stream(&sd, QIODevice::ReadOnly); - if (stream.atEnd()) - return false; - qint32 marker; - qint32 v; - stream >> marker; - stream >> v; - if (marker != NetworkCookieJarMagic || v != version) - return false; - stream >> d->tree; - if (stream.status() != QDataStream::Ok) { - d->tree.clear(); - return false; - } - return true; -} - -/*! - Remove any session cookies or cookies that have expired. - */ -void NetworkCookieJar::endSession() -{ - const QList cookies = d->tree.all(); - QDateTime now = QDateTime::currentDateTime().toTimeSpec(Qt::UTC); - QList::const_iterator i = cookies.constBegin(); - for (; i != cookies.constEnd();) { - if (i->isSessionCookie() - || (!i->isSessionCookie() && now > i->expirationDate())) { - d->tree.remove(splitHost(i->domain()), *i); - } - ++i; - } -} - -static const int maxCookiePathLength = 1024; - -bool NetworkCookieJar::setCookiesFromUrl(const QList &cookieList, const QUrl &url) -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << url; - qDebug() << cookieList; -#endif - QDateTime now = QDateTime::currentDateTime().toTimeSpec(Qt::UTC); - bool changed = false; - QString fullUrlPath = url.path(); - QString defaultPath = fullUrlPath.mid(0, fullUrlPath.lastIndexOf(QLatin1Char('/')) + 1); - if (defaultPath.isEmpty()) - defaultPath = QLatin1Char('/'); - - QString urlPath = d->urlPath(url); - foreach (QNetworkCookie cookie, cookieList) { - if (cookie.path().length() > maxCookiePathLength) - continue; - - bool alreadyDead = !cookie.isSessionCookie() && cookie.expirationDate() < now; - - if (cookie.path().isEmpty()) { - cookie.setPath(defaultPath); - } - // Matching the behavior of Firefox, no path checking is done when setting cookies - // Safari does something even odder, when that paths don't match it keeps - // the cookie, but changes the paths to the default path -#if 0 - else if (!d->matchingPath(cookie, urlPath)) { -#ifdef NETWORKCOOKIEJAR_LOGREJECTEDCOOKIES - qDebug() << "NetworkCookieJar::" << __FUNCTION__ - << "Blocked cookie because: path doesn't match: " << cookie << url; -#endif - continue; - } -#endif - - if (cookie.domain().isEmpty()) { - QString host = url.host().toLower(); - if (host.isEmpty()) - continue; - cookie.setDomain(host); - } else if (!d->matchingDomain(cookie, url)) { -#ifdef NETWORKCOOKIEJAR_LOGREJECTEDCOOKIES - qDebug() << "NetworkCookieJar::" << __FUNCTION__ - << "Blocked cookie because: domain doesn't match: " << cookie << url; -#endif - continue; - } - - // replace/remove existing cookies - removeCookie(cookie); - - // Notify derived class - onCookieSetFromURL(cookie, url, alreadyDead); - - if (alreadyDead) - continue; - - changed = true; - d->tree.insert(splitHost(cookie.domain()), cookie); - } - - return changed; -} - -QList NetworkCookieJar::allCookies() const -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__; -#endif - return d->tree.all(); -} - -void NetworkCookieJar::clearCookies() -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__; -#endif - d->tree.clear(); -} - -void NetworkCookieJar::setCookies(const QList &cookieList) -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << cookieList.count(); -#endif - - QDateTime now = QDateTime::currentDateTime().toTimeSpec(Qt::UTC); - - foreach (const QNetworkCookie &cookie, cookieList) - { - // If a matching cookie is already in the list, remove it. - removeCookie(cookie); - - if(!cookie.isSessionCookie() && cookie.expirationDate() < now) - { -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << "removing cookie: " << cookie; -#endif - // This cookie has expired -- don't re-add it - } - else - { -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << "adding cookie: " << cookie; -#endif - // this cookie has not expired -- save it - d->tree.insert(splitHost(cookie.domain()), cookie); - } - - } -} - -void NetworkCookieJar::setAllCookies(const QList &cookieList) -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << cookieList.count(); -#endif - clearCookies(); - setCookies(cookieList); -} - -void NetworkCookieJar::removeCookie(const QNetworkCookie &cookie) -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << "removing cookie: " << cookie; -#endif - - // If a cookie with the matching domain, path, and name exists in the cookiejar, remove it. - QString domain = cookie.domain(); - Q_ASSERT(!domain.isEmpty()); - QStringList urlHost = splitHost(domain); - - QList cookies = d->tree.find(urlHost); - QList::const_iterator it = cookies.constBegin(); - for (; it != cookies.constEnd(); ++it) - { - if (cookie.name() == it->name() && - domain == it->domain() && - cookie.path() == it->path()) - { -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << "found matching cookie: " << *it; -#endif - d->tree.remove(urlHost, *it); - break; - } - } -} - -void NetworkCookieJar::dump() -{ -#if defined(NETWORKCOOKIEJAR_DEBUG) - qDebug() << "NetworkCookieJar::" << __FUNCTION__ << "dumping all cookies: "; - QList cookies = allCookies(); - foreach (const QNetworkCookie &cookie, cookies) - { - qDebug() << " " << cookie; - } -#endif -} - -QString NetworkCookieJarPrivate::urlPath(const QUrl &url) const -{ - QString urlPath = url.path(); - if (!urlPath.endsWith(QLatin1Char('/'))) - urlPath += QLatin1Char('/'); - return urlPath; -} - -bool NetworkCookieJarPrivate::matchingPath(const QNetworkCookie &cookie, const QString &urlPath) const -{ - QString cookiePath = cookie.path(); - if (!cookiePath.endsWith(QLatin1Char('/'))) - cookiePath += QLatin1Char('/'); - - return urlPath.startsWith(cookiePath); -} - -bool NetworkCookieJarPrivate::matchesBlacklist(const QString &string) const -{ - if (!setSecondLevelDomain) { - // Alternatively to save a little bit of ram we could just - // use bsearch on twoLevelDomains in place - for (int j = 0; twoLevelDomains[j]; ++j) - secondLevelDomains += QLatin1String(twoLevelDomains[j]); - setSecondLevelDomain = true; - } - QStringList::const_iterator i = - qBinaryFind(secondLevelDomains.constBegin(), secondLevelDomains.constEnd(), string); - return (i != secondLevelDomains.constEnd()); -} - -bool NetworkCookieJarPrivate::matchingDomain(const QNetworkCookie &cookie, const QUrl &url) const -{ - QString domain = cookie.domain().simplified().toLower(); - domain.remove(QLatin1Char(' ')); - QStringList parts = splitHost(domain); - if (parts.isEmpty()) - return false; - - // When there is only one part only file://localhost/ is accepted - if (parts.count() == 1) { - QString s = parts.first(); - if (parts.first() != QLatin1String("localhost")) - return false; - if (url.scheme().toLower() == QLatin1String("file")) - return true; - } - - // Check for blacklist - if (parts.count() == 2 && matchesBlacklist(parts.last())) - return false; - - QStringList urlParts = url.host().toLower().split(QLatin1Char('.'), QString::SkipEmptyParts); - if (urlParts.isEmpty()) - return false; - while (urlParts.count() > parts.count()) - urlParts.removeFirst(); - - for (int j = 0; j < urlParts.count(); ++j) { - if (urlParts.at(j) != parts.at(j)) { - return false; - } - } - - return true; -} - -void NetworkCookieJar::setSecondLevelDomains(const QStringList &secondLevelDomains) -{ - d->setSecondLevelDomain = true; - d->secondLevelDomains = secondLevelDomains; - qSort(d->secondLevelDomains); -} - - -void NetworkCookieJar::onCookieSetFromURL(const QNetworkCookie &cookie, const QUrl &url, bool already_dead) -{ - Q_UNUSED(cookie); - Q_UNUSED(url); - Q_UNUSED(already_dead); - - // Derived classes can use this to track cookie changes. -} diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.h b/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.h deleted file mode 100644 index 86b14fa16..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar.h +++ /dev/null @@ -1,61 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef NETWORKCOOKIEJAR_H -#define NETWORKCOOKIEJAR_H - -#include - -class NetworkCookieJarPrivate; -class NetworkCookieJar : public QNetworkCookieJar { - Q_OBJECT -public: - NetworkCookieJar(QObject *parent = 0); - ~NetworkCookieJar(); - - virtual QList cookiesForUrl(const QUrl & url) const; - virtual bool setCookiesFromUrl(const QList &cookieList, const QUrl &url); - -protected: - QByteArray saveState() const; - bool restoreState(const QByteArray &state); - void endSession(); - - QList allCookies() const; - void clearCookies(); - void setCookies(const QList &cookieList); - void setAllCookies(const QList &cookieList); - void removeCookie(const QNetworkCookie &cookie); - void dump(); - void setSecondLevelDomains(const QStringList &secondLevelDomains); - - virtual void onCookieSetFromURL(const QNetworkCookie &cookie, const QUrl &url, bool already_dead); - -private: - NetworkCookieJarPrivate *d; -}; - -#endif - diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar_p.h b/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar_p.h deleted file mode 100644 index d8f22cfce..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/src/networkcookiejar_p.h +++ /dev/null @@ -1,66 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef NETWORKCOOKIEJARPRIVATE_H -#define NETWORKCOOKIEJARPRIVATE_H - -#include "trie_p.h" - -QT_BEGIN_NAMESPACE -QDataStream &operator<<(QDataStream &stream, const QNetworkCookie &cookie) -{ - stream << cookie.toRawForm(); - return stream; -} - -QDataStream &operator>>(QDataStream &stream, QNetworkCookie &cookie) -{ - QByteArray value; - stream >> value; - QList newCookies = QNetworkCookie::parseCookies(value); - if (!newCookies.isEmpty()) - cookie = newCookies.first(); - return stream; -} -QT_END_NAMESPACE - -class NetworkCookieJarPrivate { -public: - NetworkCookieJarPrivate() - : setSecondLevelDomain(false) - {} - - Trie tree; - mutable bool setSecondLevelDomain; - mutable QStringList secondLevelDomains; - - bool matchesBlacklist(const QString &string) const; - bool matchingDomain(const QNetworkCookie &cookie, const QUrl &url) const; - QString urlPath(const QUrl &url) const; - bool matchingPath(const QNetworkCookie &cookie, const QString &urlPath) const; -}; - -#endif - diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/src/src.pri b/indra/llqtwebkit/qtwebkit_cookiejar/src/src.pri deleted file mode 100644 index 78ac273a1..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/src/src.pri +++ /dev/null @@ -1,5 +0,0 @@ -INCLUDEPATH += $$PWD -DEPENDPATH += $$PWD - -HEADERS += trie_p.h networkcookiejar.h twoleveldomains_p.h networkcookiejar_p.h -SOURCES += networkcookiejar.cpp diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/src/trie_p.h b/indra/llqtwebkit/qtwebkit_cookiejar/src/trie_p.h deleted file mode 100644 index a4959a198..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/src/trie_p.h +++ /dev/null @@ -1,247 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef TRIE_H -#define TRIE_H - -//#define TRIE_DEBUG - -#include - -#if defined(TRIE_DEBUG) -#include -#endif - -/* - A Trie tree (prefix tree) where the lookup takes m in the worst case. - - The key is stored in *reverse* order - - Example: - Keys: x,a y,a - - Trie: - a - | \ - x y -*/ - -template -class Trie { -public: - Trie(); - ~Trie(); - - void clear(); - void insert(const QStringList &key, const T &value); - bool remove(const QStringList &key, const T &value); - QList find(const QStringList &key) const; - QList all() const; - - inline bool contains(const QStringList &key) const; - inline bool isEmpty() const { return children.isEmpty() && values.isEmpty(); } - -private: - const Trie* walkTo(const QStringList &key) const; - Trie* walkTo(const QStringList &key, bool create = false); - - template friend QDataStream &operator<<(QDataStream &, const Trie&); - template friend QDataStream &operator>>(QDataStream &, Trie&); - - QList values; - QStringList childrenKeys; - QList > children; -}; - -template -Trie::Trie() { -} - -template -Trie::~Trie() { -} - -template -void Trie::clear() { -#if defined(TRIE_DEBUG) - qDebug() << "Trie::" << __FUNCTION__; -#endif - values.clear(); - childrenKeys.clear(); - children.clear(); -} - -template -bool Trie::contains(const QStringList &key) const { - return walkTo(key); -} - -template -void Trie::insert(const QStringList &key, const T &value) { -#if defined(TRIE_DEBUG) - qDebug() << "Trie::" << __FUNCTION__ << key << value; -#endif - Trie *node = walkTo(key, true); - if (node) - node->values.append(value); -} - -template -bool Trie::remove(const QStringList &key, const T &value) { -#if defined(TRIE_DEBUG) - qDebug() << "Trie::" << __FUNCTION__ << key << value; -#endif - Trie *node = walkTo(key, true); - if (node) { - bool removed = node->values.removeOne(value); - if (!removed) - return false; - - // A faster implementation of removing nodes up the tree - // can be created if profile shows this to be slow - QStringList subKey = key; - while (node->values.isEmpty() - && node->children.isEmpty() - && !subKey.isEmpty()) { - QString currentLevelKey = subKey.first(); - QStringList parentKey = subKey.mid(1); - Trie *parent = walkTo(parentKey, false); - Q_ASSERT(parent); - QStringList::iterator iterator; - iterator = qBinaryFind(parent->childrenKeys.begin(), - parent->childrenKeys.end(), - currentLevelKey); - Q_ASSERT(iterator != parent->childrenKeys.end()); - int index = iterator - parent->childrenKeys.begin(); - parent->children.removeAt(index); - parent->childrenKeys.removeAt(index); - - node = parent; - subKey = parentKey; - } - return removed; - } - return false; -} - -template -QList Trie::find(const QStringList &key) const { -#if defined(TRIE_DEBUG) - qDebug() << "Trie::" << __FUNCTION__ << key; -#endif - const Trie *node = walkTo(key); - if (node) - return node->values; - return QList(); -} - -template -QList Trie::all() const { -#if defined(TRIE_DEBUG) - qDebug() << "Trie::" << __FUNCTION__; -#endif - QList all = values; - for (int i = 0; i < children.count(); ++i) - all += children[i].all(); - return all; -} - -template -QDataStream &operator<<(QDataStream &out, const Trie&trie) { - out << trie.values; - out << trie.childrenKeys; - out << trie.children; - Q_ASSERT(trie.childrenKeys.count() == trie.children.count()); - return out; -} - -template -QDataStream &operator>>(QDataStream &in, Trie &trie) { - trie.clear(); - if (in.status() != QDataStream::Ok) - return in; - in >> trie.values; - in >> trie.childrenKeys; - in >> trie.children; - //Q_ASSERT(trie.childrenKeys.count() == trie.children.count()); - if (trie.childrenKeys.count() != trie.children.count()) - in.setStatus(QDataStream::ReadCorruptData); - return in; -} - -// Very fast const walk -template -const Trie* Trie::walkTo(const QStringList &key) const { - const Trie *node = this; - QStringList::const_iterator childIterator; - QStringList::const_iterator begin, end; - - int depth = key.count() - 1; - while (depth >= 0) { - const QString currentLevelKey = key.at(depth--); - begin = node->childrenKeys.constBegin(); - end = node->childrenKeys.constEnd(); - childIterator = qBinaryFind(begin, end, currentLevelKey); - if (childIterator == end) - return 0; - node = &node->children.at(childIterator - begin); - } - return node; -} - -template -Trie* Trie::walkTo(const QStringList &key, bool create) { - QStringList::iterator iterator; - Trie *node = this; - QStringList::iterator begin, end; - int depth = key.count() - 1; - while (depth >= 0) { - const QString currentLevelKey = key.at(depth--); - begin = node->childrenKeys.begin(); - end = node->childrenKeys.end(); - iterator = qBinaryFind(begin, end, currentLevelKey); -#if defined(TRIE_DEBUG) - qDebug() << "\t" << node << key << currentLevelKey << node->childrenKeys; -#endif - int index = -1; - if (iterator == end) { - if (!create) - return 0; - iterator = qLowerBound(begin, - end, - currentLevelKey); - index = iterator - begin; - node->childrenKeys.insert(iterator, currentLevelKey); - node->children.insert(index, Trie()); - } else { - index = iterator - begin; - } - Q_ASSERT(index >= 0 && index < node->children.count()); - node = &node->children[index]; - } - return node; -} - -#endif diff --git a/indra/llqtwebkit/qtwebkit_cookiejar/src/twoleveldomains_p.h b/indra/llqtwebkit/qtwebkit_cookiejar/src/twoleveldomains_p.h deleted file mode 100644 index e4c046cb6..000000000 --- a/indra/llqtwebkit/qtwebkit_cookiejar/src/twoleveldomains_p.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -// Updated from https://wiki.mozilla.org/TLD_List#External_Links -// To set a custom list use NetworkCookieJar::setSecondLevelDomains() -static const char *const twoLevelDomains[] = { - "ao", - "ar", - "arpa", - "bd", - "bn", - "br", - "co", - "cr", - "cy", - "do", - "eg", - "et", - "fj", - "fk", - "gh", - "gn", - "gu", - "id", - "il", - "jm", - "ke", - "kh", - "ki", - "kw", - "kz", - "lb", - "lc", - "lr", - "ls", - "ml", - "mm", - "mv", - "mw", - "mx", - "my", - "ng", - "ni", - "np", - "nz", - "om", - "pa", - "pe", - "pg", - "pw", - "py", - "qa", - "sa", - "sb", - "sv", - "sy", - "th", - "tn", - "tz", - "uk", - "uy", - "va", - "ve", - "ye", - "yu", - "za", - "zm", - "zw", - 0 -}; diff --git a/indra/llqtwebkit/static.pri b/indra/llqtwebkit/static.pri deleted file mode 100644 index 8c282347d..000000000 --- a/indra/llqtwebkit/static.pri +++ /dev/null @@ -1,18 +0,0 @@ -# Detect if Qt is static or shared -CONFIG(debug, debug|release) { - win32:PRL = $$[QT_INSTALL_LIBS] QtGui.prl -} else { - win32:PRL = $$[QT_INSTALL_LIBS] QtGuid.prl -} - -unix:!mac: PRL = $$[QT_INSTALL_LIBS] libQtGui.prl -mac: PRL = $$[QT_INSTALL_LIBS] QtGui.framework/QtGui.prl -include($$join(PRL, "/")) - -contains(QMAKE_PRL_CONFIG, static) { - DEFINES += STATIC_QT - QTPLUGIN += qgif -} else { - DEFINES += SHARED_QT -} - diff --git a/indra/llqtwebkit/tests/3dgl/3dgl.cpp b/indra/llqtwebkit/tests/3dgl/3dgl.cpp deleted file mode 100644 index c07c5d89c..000000000 --- a/indra/llqtwebkit/tests/3dgl/3dgl.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ -#define FREEGLUT_STATIC - -#include "zpr.h" -#include "llqtwebkit.h" - -#include -#include -#include -#include - -bool gDebugMode = false; -int gBrowserWindowId=-1; -GLuint gBrowserTexture=-1; -GLuint gCheckerTexture=-1; - -// manually make part of the browser texture transparent - for testing - LLQtWebKit will handle this eventually -void alphaize_browser_texture(unsigned char* texture_pixels) -{ - const int texture_depth=4; - - int texture_width = LLQtWebKit::getInstance()->getBrowserWidth(gBrowserWindowId); - int texture_height = LLQtWebKit::getInstance()->getBrowserHeight(gBrowserWindowId); - - const int num_squares=16; - int sqr1_alpha=0xff; - int sqr2_alpha=0x00; - - for(int y1=0;y1pump(200); - LLQtWebKit::getInstance()->grabBrowserWindow( gBrowserWindowId ); - glutPostRedisplay(); - }; -} - -void display(void) -{ - glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); - - glPushMatrix(); - - glBindTexture(GL_TEXTURE_2D, gCheckerTexture); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glBegin(GL_QUADS); - glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.8f, -0.8f, -0.8f); - glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.8f, 0.8f, -0.8f); - glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.8f, 0.8f, -0.8f); - glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.8f, -0.8f, -0.8f); - glEnd(); - - glBindTexture(GL_TEXTURE_2D, gBrowserTexture); - if(!gDebugMode) - { - const unsigned char* browser_pixels=LLQtWebKit::getInstance()->getBrowserWindowPixels(gBrowserWindowId); - if(browser_pixels) - { - int texture_width = LLQtWebKit::getInstance()->getBrowserWidth(gBrowserWindowId); - int texture_height = LLQtWebKit::getInstance()->getBrowserHeight(gBrowserWindowId); - int texture_depth = 4; - - unsigned char* texture_pixels = new unsigned char[texture_width*texture_height*texture_depth]; - memcpy(texture_pixels, browser_pixels, texture_width*texture_height*texture_depth); - alphaize_browser_texture(texture_pixels); - - glTexSubImage2D(GL_TEXTURE_2D, 0, - 0, 0, - texture_width, texture_height, - GL_RGBA, - GL_UNSIGNED_BYTE, - texture_pixels); - - delete [] texture_pixels; - }; - }; - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glBegin(GL_QUADS); - glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.8f, -0.8f, 0.8f); - glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.8f, -0.8f, 0.8f); - glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.8f, 0.8f, 0.8f); - glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.8f, 0.8f, 0.8f); - glEnd(); - - glPopMatrix(); - - glutSwapBuffers(); -} - -GLuint make_rgba_texture(int texture_width, int texture_height) -{ - const int texture_depth=4; - - unsigned char* texture_pixels = new unsigned char[texture_width*texture_height*texture_depth]; - - const int num_squares=rand()%10+10; - int sqr1_r=rand()%0xa0+0x20; - int sqr1_g=rand()%0xa0+0x20; - int sqr1_b=rand()%0xa0+0x20; - int sqr1_alpha=0xff; - - int sqr2_r=rand()%0xa0+0x20; - int sqr2_g=rand()%0xa0+0x20; - int sqr2_b=rand()%0xa0+0x20; - int sqr2_alpha=0x00; - - for(int y1=0;y1init(std::string(), app_dir, profile_dir, GetDesktopWindow()); - - LLQtWebKit::getInstance()->enableJavaScript(true); - LLQtWebKit::getInstance()->enableCookies(true); - LLQtWebKit::getInstance()->enablePlugins(true); - - const std::string start_url("http://news.google.com"); - //const std::string start_url("http://www.youtube.com/watch?v=4Z3r9X8OahA&feature=rbl_entertainment"); - gBrowserWindowId=LLQtWebKit::getInstance()->createBrowserWindow(browser_width, browser_height); - LLQtWebKit::getInstance()->setSize(gBrowserWindowId, browser_width, browser_height); - LLQtWebKit::getInstance()->flipWindow(gBrowserWindowId, true); - LLQtWebKit::getInstance()->navigateTo(gBrowserWindowId, start_url); - } - - gCheckerTexture = make_rgba_texture( browser_width, browser_height); - - glutMainLoop(); - - return 0; -} diff --git a/indra/llqtwebkit/tests/3dgl/3dgl.pro b/indra/llqtwebkit/tests/3dgl/3dgl.pro deleted file mode 100644 index 6285128ef..000000000 --- a/indra/llqtwebkit/tests/3dgl/3dgl.pro +++ /dev/null @@ -1,38 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ../../ -CONFIG -= app_bundle - -QT += webkit opengl network - -!mac { -unix { - DEFINES += LL_LINUX - LIBS += -lglui -lglut - LIBS += $$PWD/../../libllqtwebkit.a -} -} - -mac { - DEFINES += LL_OSX - LIBS += -framework GLUT -framework OpenGL - LIBS += $$PWD/libllqtwebkit.dylib -} - -win32 { - DEFINES += _WINDOWS - INCLUDEPATH += ../ - INCLUDEPATH += $$PWD/../../stage/packages/include - DESTDIR=../build - release { - LIBS += $$PWD/../../Release/llqtwebkit.lib - LIBS += $$PWD/../build/freeglut_static.lib - LIBS += comdlg32.lib - } -} - -include(../../static.pri) - -SOURCES += 3dgl.cpp zpr.c diff --git a/indra/llqtwebkit/tests/3dgl/zpr.c b/indra/llqtwebkit/tests/3dgl/zpr.c deleted file mode 100644 index 65373efc5..000000000 --- a/indra/llqtwebkit/tests/3dgl/zpr.c +++ /dev/null @@ -1,429 +0,0 @@ -#include -#include -#include -#include - -#include "zpr.h" - -/* This code was originally C++ :-) */ - -#define bool int -#define true 1 -#define false 0 - -static double _left = 0.0; -static double _right = 0.0; -static double _bottom = 0.0; -static double _top = 0.0; -static double _zNear = -10.0; -static double _zFar = 10.0; - -static int _mouseX = 0; -static int _mouseY = 0; -static bool _mouseLeft = false; -static bool _mouseMiddle = false; -static bool _mouseRight = false; - -static double _dragPosX = 0.0; -static double _dragPosY = 0.0; -static double _dragPosZ = 0.0; - -static double _matrix[16]; -static double _matrixInverse[16]; - -static double vlen(double x,double y,double z); -static void pos(double *px,double *py,double *pz,const int x,const int y,const int *viewport); -static void getMatrix(); -static void invertMatrix(const GLdouble *m, GLdouble *out ); - -static void zprReshape(int w,int h); -static void zprMouse(int button, int state, int x, int y); -static void zprMotion(int x, int y); - -static void zprPick(GLdouble x, GLdouble y,GLdouble delX, GLdouble delY); - -/* Configurable center point for zooming and rotation */ - -GLfloat zprReferencePoint[4] = { 0,0,0,0 }; - -void -zprInit() -{ - getMatrix(); - - glutReshapeFunc(zprReshape); - glutMouseFunc(zprMouse); - glutMotionFunc(zprMotion); -} - -static void -zprReshape(int w,int h) -{ - glViewport(0,0,w,h); - - _top = 1.0; - _bottom = -1.0; - _left = -(double)w/(double)h; - _right = -_left; - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(_left,_right,_bottom,_top,_zNear,_zFar); - - glMatrixMode(GL_MODELVIEW); -} - -static void -zprMouse(int button, int state, int x, int y) -{ - GLint viewport[4]; - - /* Do picking */ - if (state==GLUT_DOWN) - zprPick(x,glutGet(GLUT_WINDOW_HEIGHT)-1-y,3,3); - - _mouseX = x; - _mouseY = y; - - if (state==GLUT_UP) - switch (button) - { - case GLUT_LEFT_BUTTON: _mouseLeft = false; break; - case GLUT_MIDDLE_BUTTON: _mouseMiddle = false; break; - case GLUT_RIGHT_BUTTON: _mouseRight = false; break; - } - else - switch (button) - { - case GLUT_LEFT_BUTTON: _mouseLeft = true; break; - case GLUT_MIDDLE_BUTTON: _mouseMiddle = true; break; - case GLUT_RIGHT_BUTTON: _mouseRight = true; break; - } - - glGetIntegerv(GL_VIEWPORT,viewport); - pos(&_dragPosX,&_dragPosY,&_dragPosZ,x,y,viewport); - glutPostRedisplay(); -} - -static void -zprMotion(int x, int y) -{ - bool changed = false; - - const int dx = x - _mouseX; - const int dy = y - _mouseY; - - GLint viewport[4]; - glGetIntegerv(GL_VIEWPORT,viewport); - - if (dx==0 && dy==0) - return; - - if (_mouseMiddle || (_mouseLeft && _mouseRight)) - { - double s = exp((double)dy*0.01); - - glTranslatef( zprReferencePoint[0], zprReferencePoint[1], zprReferencePoint[2]); - glScalef(s,s,s); - glTranslatef(-zprReferencePoint[0],-zprReferencePoint[1],-zprReferencePoint[2]); - - changed = true; - } - else - if (_mouseLeft) - { - double ax,ay,az; - double bx,by,bz; - double angle; - - ax = dy; - ay = dx; - az = 0.0; - angle = vlen(ax,ay,az)/(double)(viewport[2]+1)*180.0; - - /* Use inverse matrix to determine local axis of rotation */ - - bx = _matrixInverse[0]*ax + _matrixInverse[4]*ay + _matrixInverse[8] *az; - by = _matrixInverse[1]*ax + _matrixInverse[5]*ay + _matrixInverse[9] *az; - bz = _matrixInverse[2]*ax + _matrixInverse[6]*ay + _matrixInverse[10]*az; - - glTranslatef( zprReferencePoint[0], zprReferencePoint[1], zprReferencePoint[2]); - glRotatef(angle,bx,by,bz); - glTranslatef(-zprReferencePoint[0],-zprReferencePoint[1],-zprReferencePoint[2]); - - changed = true; - } - else - if (_mouseRight) - { - double px,py,pz; - - pos(&px,&py,&pz,x,y,viewport); - - glLoadIdentity(); - glTranslatef(px-_dragPosX,py-_dragPosY,pz-_dragPosZ); - glMultMatrixd(_matrix); - - _dragPosX = px; - _dragPosY = py; - _dragPosZ = pz; - - changed = true; - } - - _mouseX = x; - _mouseY = y; - - if (changed) - { - getMatrix(); - glutPostRedisplay(); - } -} - -/***************************************************************** - * Utility functions - *****************************************************************/ - -static double -vlen(double x,double y,double z) -{ - return sqrt(x*x+y*y+z*z); -} - -static void -pos(double *px,double *py,double *pz,const int x,const int y,const int *viewport) -{ - /* - Use the ortho projection and viewport information - to map from mouse co-ordinates back into world - co-ordinates - */ - - *px = (double)(x-viewport[0])/(double)(viewport[2]); - *py = (double)(y-viewport[1])/(double)(viewport[3]); - - *px = _left + (*px)*(_right-_left); - *py = _top + (*py)*(_bottom-_top); - *pz = _zNear; -} - -static void -getMatrix() -{ - glGetDoublev(GL_MODELVIEW_MATRIX,_matrix); - invertMatrix(_matrix,_matrixInverse); -} - -/* - * From Mesa-2.2\src\glu\project.c - * - * Compute the inverse of a 4x4 matrix. Contributed by scotter@lafn.org - */ - -static void -invertMatrix(const GLdouble *m, GLdouble *out ) -{ - -/* NB. OpenGL Matrices are COLUMN major. */ -#define MAT(m,r,c) (m)[(c)*4+(r)] - -/* Here's some shorthand converting standard (row,column) to index. */ -#define m11 MAT(m,0,0) -#define m12 MAT(m,0,1) -#define m13 MAT(m,0,2) -#define m14 MAT(m,0,3) -#define m21 MAT(m,1,0) -#define m22 MAT(m,1,1) -#define m23 MAT(m,1,2) -#define m24 MAT(m,1,3) -#define m31 MAT(m,2,0) -#define m32 MAT(m,2,1) -#define m33 MAT(m,2,2) -#define m34 MAT(m,2,3) -#define m41 MAT(m,3,0) -#define m42 MAT(m,3,1) -#define m43 MAT(m,3,2) -#define m44 MAT(m,3,3) - - GLdouble det; - GLdouble d12, d13, d23, d24, d34, d41; - GLdouble tmp[16]; /* Allow out == in. */ - - /* Inverse = adjoint / det. (See linear algebra texts.)*/ - - /* pre-compute 2x2 dets for last two rows when computing */ - /* cofactors of first two rows. */ - d12 = (m31*m42-m41*m32); - d13 = (m31*m43-m41*m33); - d23 = (m32*m43-m42*m33); - d24 = (m32*m44-m42*m34); - d34 = (m33*m44-m43*m34); - d41 = (m34*m41-m44*m31); - - tmp[0] = (m22 * d34 - m23 * d24 + m24 * d23); - tmp[1] = -(m21 * d34 + m23 * d41 + m24 * d13); - tmp[2] = (m21 * d24 + m22 * d41 + m24 * d12); - tmp[3] = -(m21 * d23 - m22 * d13 + m23 * d12); - - /* Compute determinant as early as possible using these cofactors. */ - det = m11 * tmp[0] + m12 * tmp[1] + m13 * tmp[2] + m14 * tmp[3]; - - /* Run singularity test. */ - if (det == 0.0) { - /* printf("invert_matrix: Warning: Singular matrix.\n"); */ -/* memcpy(out,_identity,16*sizeof(double)); */ - } - else { - GLdouble invDet = 1.0 / det; - /* Compute rest of inverse. */ - tmp[0] *= invDet; - tmp[1] *= invDet; - tmp[2] *= invDet; - tmp[3] *= invDet; - - tmp[4] = -(m12 * d34 - m13 * d24 + m14 * d23) * invDet; - tmp[5] = (m11 * d34 + m13 * d41 + m14 * d13) * invDet; - tmp[6] = -(m11 * d24 + m12 * d41 + m14 * d12) * invDet; - tmp[7] = (m11 * d23 - m12 * d13 + m13 * d12) * invDet; - - /* Pre-compute 2x2 dets for first two rows when computing */ - /* cofactors of last two rows. */ - d12 = m11*m22-m21*m12; - d13 = m11*m23-m21*m13; - d23 = m12*m23-m22*m13; - d24 = m12*m24-m22*m14; - d34 = m13*m24-m23*m14; - d41 = m14*m21-m24*m11; - - tmp[8] = (m42 * d34 - m43 * d24 + m44 * d23) * invDet; - tmp[9] = -(m41 * d34 + m43 * d41 + m44 * d13) * invDet; - tmp[10] = (m41 * d24 + m42 * d41 + m44 * d12) * invDet; - tmp[11] = -(m41 * d23 - m42 * d13 + m43 * d12) * invDet; - tmp[12] = -(m32 * d34 - m33 * d24 + m34 * d23) * invDet; - tmp[13] = (m31 * d34 + m33 * d41 + m34 * d13) * invDet; - tmp[14] = -(m31 * d24 + m32 * d41 + m34 * d12) * invDet; - tmp[15] = (m31 * d23 - m32 * d13 + m33 * d12) * invDet; - - memcpy(out, tmp, 16*sizeof(GLdouble)); - } - -#undef m11 -#undef m12 -#undef m13 -#undef m14 -#undef m21 -#undef m22 -#undef m23 -#undef m24 -#undef m31 -#undef m32 -#undef m33 -#undef m34 -#undef m41 -#undef m42 -#undef m43 -#undef m44 -#undef MAT -} - -/***************************************** Picking ****************************************************/ - -static void (*selection)(void) = NULL; -static void (*pick)(GLint name) = NULL; - -void zprSelectionFunc(void (*f)(void)) -{ - selection = f; -} - -void zprPickFunc(void (*f)(GLint name)) -{ - pick = f; -} - -/* Draw in selection mode */ - -static void -zprPick(GLdouble x, GLdouble y,GLdouble delX, GLdouble delY) -{ - GLuint buffer[1024]; - const int bufferSize = sizeof(buffer)/sizeof(GLuint); - - GLint viewport[4]; - GLdouble projection[16]; - - GLint hits; - GLint i,j,k; - - GLint min = -1; - GLuint minZ = -1; - - glSelectBuffer(bufferSize,buffer); /* Selection buffer for hit records */ - glRenderMode(GL_SELECT); /* OpenGL selection mode */ - glInitNames(); /* Clear OpenGL name stack */ - - glMatrixMode(GL_PROJECTION); - glPushMatrix(); /* Push current projection matrix */ - glGetIntegerv(GL_VIEWPORT,viewport); /* Get the current viewport size */ - glGetDoublev(GL_PROJECTION_MATRIX,projection); /* Get the projection matrix */ - glLoadIdentity(); /* Reset the projection matrix */ - gluPickMatrix(x,y,delX,delY,viewport); /* Set the picking matrix */ - glMultMatrixd(projection); /* Apply projection matrix */ - - glMatrixMode(GL_MODELVIEW); - - if (selection) - selection(); /* Draw the scene in selection mode */ - - hits = glRenderMode(GL_RENDER); /* Return to normal rendering mode */ - - /* Diagnostic output to stdout */ - - #ifndef NDEBUG - if (hits!=0) - { - printf("hits = %d\n",hits); - - for (i=0,j=0; i rotate - * Middle button -> zoom - * Right button -> pan - * - * Picking is also provided via two configurable callbacks: - * - * void zprSelectionFunc(void (*f)(void)) - * - * The draw function to be called in OpenGL selection - * mode in response to a mouse-down button event. - * - * void zprPickFunc(void (*f)(GLint name)) - * - * The callback function which will receive the - * top-most item of the name stack of the closest selection - * hit. If there is no selection hit, -1 - * - * Limitations - * ----------- - * - * Works best with zprReferencePoint appropriately configured. - * Works best with ortho projection. - * You may need to use glEnable(GL_NORMALIZATION) for correct lighting. - * Near and far clip planes are hard-coded. - * Zooming and rotation is centered on the origin. - * Only one window can use the callbacks at one time. - * - */ - -#ifdef WIN32 -#include -#endif - -#define FREEGLUT_STATIC - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* - * - */ - -/* Mouse Manipulation API */ - -void zprInit(); - -extern GLfloat zprReferencePoint[4]; - -/* Picking API (Optional) */ - -extern void zprSelectionFunc(void (*f)(void)); /* Selection-mode draw function */ -extern void zprPickFunc(void (*f)(GLint name)); /* Pick event handling function */ - -/* - * - */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/indra/llqtwebkit/tests/qttestapp/main.cpp b/indra/llqtwebkit/tests/qttestapp/main.cpp deleted file mode 100644 index 3ab3a9c17..000000000 --- a/indra/llqtwebkit/tests/qttestapp/main.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#include -#include - -class WebPage : public QWidget, LLEmbeddedBrowserWindowObserver -{ - Q_OBJECT - -signals: - void locationChanged(const QString &); - void canGoBack(bool); - void canGoForward(bool); - -public: - WebPage(QWidget *parent = 0); - ~WebPage(); - - void onCursorChanged(const EventType& event); - void onPageChanged(const EventType& event); - void onNavigateBegin(const EventType& event); - void onNavigateComplete(const EventType& event); - void onUpdateProgress(const EventType& event); - void onStatusTextChange(const EventType& event); - void onLocationChange(const EventType& event); - void onClickLinkHref(const EventType& event); - void onClickLinkNoFollow(const EventType& event); - -public slots: - void goBack(); - void goForward(); - void reload(); - void loadUrl(const QString &); - -protected: - void resizeEvent(QResizeEvent *event); - void paintEvent(QPaintEvent *event); - void mouseDoubleClickEvent(QMouseEvent *event); - void mouseMoveEvent(QMouseEvent *event); - void mousePressEvent(QMouseEvent *event); - void mouseReleaseEvent(QMouseEvent *event); - void keyPressEvent(QKeyEvent *event); - void keyReleaseEvent(QKeyEvent *event); -private: - void updateSLvariables(); - int mBrowserWindowId; -}; - -WebPage::WebPage(QWidget *parent) - : QWidget(parent) -{ - setMouseTracking(true); - std::string applicationDir = std::string(); - std::string componentDir = applicationDir; - std::string profileDir = applicationDir + "\\" + "testGL_profile"; - LLQtWebKit::getInstance()->init(applicationDir, componentDir, profileDir, 0); - - mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow(width(), height()); - - // observer events that LLQtWebKit emits - LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this ); - - // append details to agent string - LLQtWebKit::getInstance()->setBrowserAgentId("testqtapp"); - - // don't flip bitmap - LLQtWebKit::getInstance()->flipWindow(mBrowserWindowId, false); - - // test Second Life viewer specific functions - LLQtWebKit::getInstance()->setSLObjectEnabled( true ); // true means feature is turned on - LLQtWebKit::getInstance()->setAgentLanguage( "tst-en" ); // viewer language selected by agent - LLQtWebKit::getInstance()->setAgentRegion( "QtTestAppRegion" ); // name of region where agent is located - LLQtWebKit::getInstance()->setAgentLocation( 9.8, 7.6, 5.4 ); // agent's x,y,z location within a region - LLQtWebKit::getInstance()->setAgentGlobalLocation( 119.8, 227.6, 335.4 ); // agent's x,y,z location within the grid - LLQtWebKit::getInstance()->setAgentMaturity( "Very immature" ); // selected maturity level of agent - LLQtWebKit::getInstance()->setAgentOrientation( (rand()%36000)/100.0f ); // direction avatar is facing - LLQtWebKit::getInstance()->emitLocation(); - LLQtWebKit::getInstance()->emitLanguage(); - LLQtWebKit::getInstance()->emitMaturity(); - - // go to the "home page" - LLQtWebKit::getInstance()->navigateTo(mBrowserWindowId, "http://callum-linden.s3.amazonaws.com/browsertest.html"); -} - -WebPage::~WebPage() -{ - // unhook observer - LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this ); - - // clean up - LLQtWebKit::getInstance()->reset(); -} - -void WebPage::updateSLvariables() -{ - // randomly update SL values to test - LLQtWebKit::getInstance()->setAgentOrientation( (rand()%36000)/100.0f ); - LLQtWebKit::getInstance()->setAgentLocation( (rand()%25600)/100.0f, (rand()%25600)/100.0f, (rand()%25600)/100.0f ); - LLQtWebKit::getInstance()->setAgentGlobalLocation( (rand()%25600)/100.0f, (rand()%25600)/100.0f, (rand()%25600)/100.0f ); - - if ( rand() % 2 ) - LLQtWebKit::getInstance()->setAgentLanguage( "One language" ); - else - LLQtWebKit::getInstance()->setAgentLanguage( "Another language" ); - - if ( rand() % 2 ) - LLQtWebKit::getInstance()->setAgentRegion( "Region Wibble" ); - else - LLQtWebKit::getInstance()->setAgentRegion( "Region Flasm" ); - - if ( rand() % 2 ) - LLQtWebKit::getInstance()->setAgentMaturity( "Adults only" ); - else - LLQtWebKit::getInstance()->setAgentMaturity( "Children only" ); - - LLQtWebKit::getInstance()->emitLocation(); - LLQtWebKit::getInstance()->emitLanguage(); - LLQtWebKit::getInstance()->emitMaturity(); -} - -void WebPage::onCursorChanged(const EventType& event) -{ - //qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri()); - switch (event.getIntValue()) { - case LLQtWebKit::C_ARROW: setCursor(QCursor(Qt::ArrowCursor)); break; - case LLQtWebKit::C_IBEAM: setCursor(QCursor(Qt::IBeamCursor)); break; - case LLQtWebKit::C_SPLITV: setCursor(QCursor(Qt::SplitHCursor)); break; - case LLQtWebKit::C_SPLITH: setCursor(QCursor(Qt::SplitVCursor)); break; - case LLQtWebKit::C_POINTINGHAND: setCursor(QCursor(Qt::PointingHandCursor)); break; - default: break; - } -} - -void WebPage::onPageChanged(const EventType& event) -{ - Q_UNUSED(event); - LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId ); - //qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri()); - update(); -} - -void WebPage::onNavigateBegin(const EventType& event) -{ - Q_UNUSED(event); - //qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri()); -} - -void WebPage::onNavigateComplete(const EventType& event) -{ - Q_UNUSED(event); - //qDebug() << __FUNCTION__ << QString::fromStdString(event.getEventUri()); -} - -void WebPage::onUpdateProgress(const EventType& event) -{ - Q_UNUSED(event); -} - -void WebPage::onStatusTextChange(const EventType& event) -{ - Q_UNUSED(event); -} - -void WebPage::onLocationChange(const EventType& event) -{ - //qDebug() << __FUNCTION__; - emit locationChanged(QString::fromStdString(event.getEventUri())); - //void canGoBack(bool); - //void canGoForward(bool); -} - -void WebPage::onClickLinkHref(const EventType& event) -{ - Q_UNUSED(event); -} - -void WebPage::onClickLinkNoFollow(const EventType& event) -{ - Q_UNUSED(event); -} - -void WebPage::resizeEvent(QResizeEvent *event) -{ - LLQtWebKit::getInstance()->setSize(mBrowserWindowId, event->size().width(), event->size().height()); - QWidget::resizeEvent(event); -} - -void WebPage::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - - int width = LLQtWebKit::getInstance()->getBrowserWidth(mBrowserWindowId); - int height = LLQtWebKit::getInstance()->getBrowserHeight(mBrowserWindowId); - const unsigned char* pixels = LLQtWebKit::getInstance()->getBrowserWindowPixels(mBrowserWindowId); - QImage image(pixels, width, height, QImage::Format_RGB32); - image = image.rgbSwapped(); - QPainter painter(this); - painter.drawImage(QPoint(0, 0), image); -} - -void WebPage::mouseDoubleClickEvent(QMouseEvent *event) -{ - LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, - LLQtWebKit::ME_MOUSE_DOUBLE_CLICK, - LLQtWebKit::MB_MOUSE_BUTTON_LEFT, - event->x(), event->y(), - LLQtWebKit::KM_MODIFIER_NONE ); -} - -void WebPage::mouseMoveEvent(QMouseEvent *event) -{ - updateSLvariables(); - - LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, - LLQtWebKit::ME_MOUSE_MOVE, - LLQtWebKit::MB_MOUSE_BUTTON_LEFT, - event->x(), event->y(), - LLQtWebKit::KM_MODIFIER_NONE ); -} - -void WebPage::mousePressEvent(QMouseEvent *event) -{ - LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, - LLQtWebKit::ME_MOUSE_DOWN, - LLQtWebKit::MB_MOUSE_BUTTON_LEFT, - event->x(), event->y(), - LLQtWebKit::KM_MODIFIER_NONE ); -} - -void WebPage::mouseReleaseEvent(QMouseEvent *event) -{ - LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, - LLQtWebKit::ME_MOUSE_UP, - LLQtWebKit::MB_MOUSE_BUTTON_LEFT, - event->x(), event->y(), - LLQtWebKit::KM_MODIFIER_NONE ); - - LLQtWebKit::getInstance()->focusBrowser(mBrowserWindowId, true); -} - -void WebPage::keyPressEvent(QKeyEvent *event) -{ - Q_UNUSED(event); -} - -void WebPage::keyReleaseEvent(QKeyEvent *event) -{ - Q_UNUSED(event); - //LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, event->text().at(0).unicode(),LLQtWebKit::KM_MODIFIER_NONE); -} - -void WebPage::goBack() -{ - LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK); -} - -void WebPage::goForward() -{ - LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD); -} - -void WebPage::reload() -{ - LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_RELOAD); -} - -void WebPage::loadUrl(const QString &url) -{ - LLQtWebKit::getInstance()->navigateTo(mBrowserWindowId, url.toStdString()); -} - -#include "ui_window.h" - -class Window : public QDialog, public Ui_Dialog -{ - Q_OBJECT -public: - Window(QWidget *parent = 0); - -public slots: - void loadUrl(); -}; - -Window::Window(QWidget *parent) - : QDialog(parent) -{ - setupUi(this); - connect(webpage, SIGNAL(locationChanged(const QString &)), - location, SLOT(setText(const QString &))); - connect(webpage, SIGNAL(canGoBack(bool)), - backButton, SLOT(setEnabled(bool))); - connect(webpage, SIGNAL(canGoForward(bool)), - forwardButton, SLOT(setEnabled(bool))); - connect(backButton, SIGNAL(clicked()), - webpage, SLOT(goBack())); - connect(forwardButton, SIGNAL(clicked()), - webpage, SLOT(goForward())); - connect(reloadButton, SIGNAL(clicked()), - webpage, SLOT(reload())); - connect(location, SIGNAL(returnPressed()), - this, SLOT(loadUrl())); -} - -void Window::loadUrl() -{ - webpage->loadUrl(location->text()); -} - - -int main(int argc, char **argv) -{ - QApplication application(argc, argv); - Window window; - window.show(); - return application.exec(); -} - -#include "main.moc" diff --git a/indra/llqtwebkit/tests/qttestapp/qttestapp.pro b/indra/llqtwebkit/tests/qttestapp/qttestapp.pro deleted file mode 100644 index 5a0ca33cf..000000000 --- a/indra/llqtwebkit/tests/qttestapp/qttestapp.pro +++ /dev/null @@ -1,38 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ../../ -CONFIG -= app_bundle - -include(../../static.pri) - -QT += webkit opengl network - -unix { - LIBS += $$PWD/../../libllqtwebkit.a -} - -!mac { -unix { - DEFINES += LL_LINUX -} -} - -mac { - DEFINES += LL_OSX -} - - -win32{ - DEFINES += _WINDOWS - INCLUDEPATH += ../ - DESTDIR=../build - release { - LIBS += $$PWD/../../Release/llqtwebkit.lib - } -} - -# Input -SOURCES += main.cpp -FORMS += window.ui diff --git a/indra/llqtwebkit/tests/qttestapp/webpage.h b/indra/llqtwebkit/tests/qttestapp/webpage.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/indra/llqtwebkit/tests/qttestapp/window.ui b/indra/llqtwebkit/tests/qttestapp/window.ui deleted file mode 100644 index 6125821cc..000000000 --- a/indra/llqtwebkit/tests/qttestapp/window.ui +++ /dev/null @@ -1,79 +0,0 @@ - - - Dialog - - - - 0 - 0 - 766 - 613 - - - - Dialog - - - - 0 - - - - - 6 - - - 6 - - - 6 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 - 0 - - - - - - - - - WebPage - QWidget -
webpage.h
- 1 -
-
- - -
diff --git a/indra/llqtwebkit/tests/ssltest/ssltest.cpp b/indra/llqtwebkit/tests/ssltest/ssltest.cpp deleted file mode 100644 index fcbf80314..000000000 --- a/indra/llqtwebkit/tests/ssltest/ssltest.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef _WINDOWS -extern "C" { -#include -} -#endif - -#ifdef _WINDOWS -#include -#include -#endif - -#include -#include -#include - -#ifdef LL_OSX -// I'm not sure why STATIC_QT is getting defined, but the Q_IMPORT_PLUGIN thing doesn't seem to be necessary on the mac. -#undef STATIC_QT -#endif - -#ifdef STATIC_QT -#include -Q_IMPORT_PLUGIN(qgif) -#endif - -#include "llqtwebkit.h" - -class sslTest : - public LLEmbeddedBrowserWindowObserver -{ - public: - sslTest( std::string url, bool ignore_ca_file, bool ignore_ssl_errors ) : - mBrowserWindowWidth( 512 ), - mBrowserWindowHeight( 512 ), - mBrowserWindowHandle( 0 ), - mNavigateInProgress( true ) - { -#ifdef _WINDOWS - std::string cwd = std::string( _getcwd( NULL, 1024) ); - std::string profile_dir = cwd + "\\" + "ssltest_profile"; - void* native_window_handle = (void*)GetDesktopWindow(); - std::string ca_file_loc = cwd + "\\" + "CA.pem"; -#else - std::string cwd = std::string( getcwd( NULL, 1024) ); - std::string profile_dir = cwd + "/" + "ssltest_profile"; - void* native_window_handle = 0; - std::string ca_file_loc = cwd + "/" + "CA.pem"; -#endif - std::cout << "ssltest> === begin ===" << std::endl; - std::cout << "ssltest> current working dir is " << cwd << std::endl; - std::cout << "ssltest> profiles dir location is " << profile_dir << std::endl; - - LLQtWebKit::getInstance()->init( cwd, cwd, profile_dir, native_window_handle ); - - LLQtWebKit::getInstance()->enableJavaScript( true ); - LLQtWebKit::getInstance()->enablePlugins( true ); - - mBrowserWindowHandle = LLQtWebKit::getInstance()->createBrowserWindow( mBrowserWindowWidth, mBrowserWindowHeight ); - LLQtWebKit::getInstance()->setSize( mBrowserWindowHandle, mBrowserWindowWidth, mBrowserWindowHeight ); - - LLQtWebKit::getInstance()->addObserver( mBrowserWindowHandle, this ); - - if ( ! ignore_ca_file ) - { - std::cout << "ssltest> Expected certificate authority file location is " << ca_file_loc << std::endl; - LLQtWebKit::getInstance()->setCAFile( ca_file_loc.c_str() ); - } - else - { - std::cout << "ssltest> Not loading certificate authority file" << std::endl; - }; - - if ( ignore_ssl_errors ) - { - LLQtWebKit::getInstance()->setIgnoreSSLCertErrors( true ); - std::cout << "ssltest> Ignoring SSL errors " << std::endl; - } - else - { - std::cout << "ssltest> Not ignoring SSL errors " << std::endl; - }; - - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowHandle, url ); - - std::cout << "ssltest> navigating to " << url << std::endl; - }; - - bool idle( void ) - { - LLQtWebKit::getInstance()->pump( 100 ); - -#if _WINDOWS - MSG msg; - while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - GetMessage( &msg, NULL, 0, 0 ); - TranslateMessage( &msg ); - DispatchMessage( &msg ); - }; -#endif - return mNavigateInProgress; - }; - - ~sslTest() - { - LLQtWebKit::getInstance()->remObserver( mBrowserWindowHandle, this ); - LLQtWebKit::getInstance()->reset(); - std::cout << "ssltest> === end ===" << std::endl; - }; - - void onNavigateBegin( const EventType& eventIn ) - { - mNavigateInProgress = true; - std::cout << "ssltest> Event: begin navigation to " << eventIn.getEventUri() << std::endl; - }; - - void onNavigateComplete( const EventType& eventIn ) - { - std::cout << "ssltest> Event: end navigation to " << eventIn.getEventUri() << std::endl; - mNavigateInProgress = false; - }; - - void onUpdateProgress( const EventType& eventIn ) - { - std::cout << "ssltest> Event: progress value updated to " << eventIn.getIntValue() << std::endl; - }; - - void onStatusTextChange( const EventType& eventIn ) - { - std::cout << "ssltest> Event: status updated to " << eventIn.getStringValue() << std::endl; - }; - - void onTitleChange( const EventType& eventIn ) - { - std::cout << "ssltest> Event: title changed to " << eventIn.getStringValue() << std::endl; - }; - - void onLocationChange( const EventType& eventIn ) - { - std::cout << "ssltest> Event: location changed to " << eventIn.getStringValue() << std::endl; - }; - - bool onCertError(const std::string &in_url, const std::string &in_msg) - { - std::cout << "ssltest> Cert error triggered\n" << in_url << "\n" << in_msg << std::endl; - return true; - } - - private: - int mBrowserWindowWidth; - int mBrowserWindowHeight; - int mBrowserWindowHandle; - bool mNavigateInProgress; -}; - -int main( int argc, char* argv[] ) -{ - bool ingore_ssl_errors = false; - bool ignore_ca_file = false; - - for( int i = 1; i < argc; ++i ) - { - if ( std::string( argv[ i ] ) == "--help" ) - { - std::cout << std::endl << "ssltest [--ignoresslerrors] [--ignorecafile]" << std::endl; - std::cout << "Looks for cert file CA.pem in the current working directory"; - - exit( 0 ); - }; - - if ( std::string( argv[ i ] ) == "--ignoresslerrors" ) - ingore_ssl_errors = true; - - if ( std::string( argv[ i ] ) == "--ignorecafile" ) - ignore_ca_file = true; - }; - - std::string url ( "https://my.secondlife.com/callum.linden" ); - for( int i = 1; i < argc; ++i ) - { - if ( std::string( argv[ i ] ).substr( 0, 2 ) != "--" ) - { - url = std::string( argv[ i ] ); - break; - }; - }; - - std::cout << std::endl << " --------- sslTest application starting --------- " << std::endl; - std::cout << "ssltest> URL specified is " << url << std::endl; - - sslTest* app = new sslTest( url, ignore_ca_file, ingore_ssl_errors ); - - bool result = app->idle(); - while( result ) - { - result = app->idle(); - }; - - delete app; - - std::cout << " --------- sslTest application ending --------- " << std::endl; - - return 0; -} diff --git a/indra/llqtwebkit/tests/ssltest/ssltest.pro b/indra/llqtwebkit/tests/ssltest/ssltest.pro deleted file mode 100644 index 981e35211..000000000 --- a/indra/llqtwebkit/tests/ssltest/ssltest.pro +++ /dev/null @@ -1,28 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ../../ -CONFIG -= app_bundle -CONFIG += console - -QT += webkit network - -mac { - DEFINES += LL_OSX - LIBS += $$PWD/libllqtwebkit.dylib -} - -win32 { - DEFINES += _WINDOWS - INCLUDEPATH += ../ - DESTDIR=../build - LIBS += user32.lib - release { - LIBS += $$PWD/../../Release/llqtwebkit.lib - } -} - -include(../../static.pri) - -SOURCES += ssltest.cpp diff --git a/indra/llqtwebkit/tests/testgl/testgl.cpp b/indra/llqtwebkit/tests/testgl/testgl.cpp deleted file mode 100644 index 6dfb11a72..000000000 --- a/indra/llqtwebkit/tests/testgl/testgl.cpp +++ /dev/null @@ -1,1002 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef _WINDOWS -extern "C" { -#include -} -#endif - -#ifdef _WINDOWS -#include -#include // file choser dialog -#include // for local file access -#endif - -#include -#include -#include -#include -#include - -#ifdef LL_OSX -// I'm not sure why STATIC_QT is getting defined, but the Q_IMPORT_PLUGIN thing doesn't seem to be necessary on the mac. -#undef STATIC_QT -#endif - -#ifdef STATIC_QT -#include -Q_IMPORT_PLUGIN(qgif) -#endif - -#ifdef LL_OSX -#include -#include -#else -#define FREEGLUT_STATIC -#include "GL/glut.h" -#endif -#include "llqtwebkit.h" - -#ifdef _WINDOWS - #define PATH_SEPARATOR "\\" -#else - #define PATH_SEPARATOR "/" -#endif - - -//////////////////////////////////////////////////////////////////////////////// -// -std::string chooseFileName() -{ -#ifdef _WINDOWS - OPENFILENAMEA ofn ; - static char szFile[_MAX_PATH] ; - - ZeroMemory( &ofn , sizeof( ofn) ); - ofn.lStructSize = sizeof ( ofn ); - ofn.hwndOwner = NULL ; - ofn.lpstrFile = szFile ; - ofn.lpstrFile[0] = '\0'; - ofn.nMaxFile = sizeof( szFile ); - ofn.lpstrFilter = "All\0*.*\0Images\0*.jpg;*.png\0"; - ofn.nFilterIndex =1; - ofn.lpstrFileTitle = NULL ; - ofn.nMaxFileTitle = 0 ; - ofn.lpstrInitialDir=NULL ; - ofn.Flags = OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST ; - - GetOpenFileNameA( &ofn ); - - return ofn.lpstrFile; -#else - return ""; -#endif -} - -//////////////////////////////////////////////////////////////////////////////// -// Implementation of the test app - implemented as a class and derrives from -// the observer so we can catch events emitted by LLQtWebKit -// -class testGL : - public LLEmbeddedBrowserWindowObserver -{ - public: - testGL() : - mAppWindowWidth( 800 ), // dimensions of the app window - can be anything - mAppWindowHeight( 900 ), - mBrowserWindowWidth( mAppWindowWidth ), // dimensions of the embedded browser - can be anything - mBrowserWindowHeight( mAppWindowHeight ), // but looks best when it's the same as the app window - mAppTextureWidth( -1 ), // dimensions of the texture that the browser is rendered into - mAppTextureHeight( -1 ), // calculated at initialization - mAppTexture( 0 ), - mBrowserWindowId( 0 ), - mAppWindowName( "testGL" ), - mCwd(), - mHomeUrl(), - mNeedsUpdate( true ) // flag to indicate if browser texture needs an update - { -#ifdef _WINDOWS // to remove warning on Windows - mCwd = _getcwd(NULL, 1024); -#else - mCwd = getcwd(NULL, 1024); -#endif - mHomeUrl = "http://callum-linden.s3.amazonaws.com/browsertest.html"; - std::cout << "LLQtWebKit version: " << LLQtWebKit::getInstance()->getVersion() << std::endl; - - std::cout << "Current working directory is " << mCwd << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void init( const std::string argv0, const std::string argv1 ) - { - // OpenGL initialization - glClearColor( 0.0f, 0.0f, 0.0f, 0.5f); - glEnable( GL_COLOR_MATERIAL ); - glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE ); - glEnable( GL_TEXTURE_2D ); - glPixelStorei( GL_UNPACK_ALIGNMENT, 1 ); - glEnable( GL_CULL_FACE ); - - // calculate texture size required (next power of two above browser window size - for ( mAppTextureWidth = 1; mAppTextureWidth < mBrowserWindowWidth; mAppTextureWidth <<= 1 ) - { - }; - - for ( mAppTextureHeight = 1; mAppTextureHeight < mBrowserWindowHeight; mAppTextureHeight <<= 1 ) - { - }; - - // create the texture used to display the browser data - glGenTextures( 1, &mAppTexture ); - glBindTexture( GL_TEXTURE_2D, mAppTexture ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); - glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); - glTexImage2D( GL_TEXTURE_2D, 0, - GL_RGB, - mAppTextureWidth, mAppTextureHeight, - 0, GL_RGB, GL_UNSIGNED_BYTE, 0 ); - - // create a single browser window and set things up. - mProfileDir = mCwd + PATH_SEPARATOR + "testGL_profile"; - std::cout << "Profiles dir location is " << mProfileDir << std::endl; - - mCookiePath = mProfileDir + PATH_SEPARATOR + "cookies.txt"; - std::cout << "Cookies.txt file location is " << mCookiePath << std::endl; - - LLQtWebKit::getInstance()->init( mApplicationDir, mApplicationDir, mProfileDir, getNativeWindowHandle() ); - - LLQtWebKit::getInstance()->enableQtMessageHandler( false ); - - // set host language test (in reality, string will be language code passed into client) - // IMPORTANT: must be called before createBrowserWindow(...) - LLQtWebKit::getInstance()->setHostLanguage( "EN-AB-CD-EF" ); - - // set up features - LLQtWebKit::getInstance()->enableJavaScript( true ); - LLQtWebKit::getInstance()->enableCookies( true ); - LLQtWebKit::getInstance()->enablePlugins( true ); - - // make a browser window - mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mBrowserWindowWidth, mBrowserWindowHeight ); - - // tell LLQtWebKit about the size of the browser window - LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mBrowserWindowWidth, mBrowserWindowHeight ); - - // observer events that LLQtWebKit emits - LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this ); - - // append details to agent string - LLQtWebKit::getInstance()->setBrowserAgentId( mAppWindowName ); - - // don't flip bitmap - LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, false ); - - // only "trust" pages whose host match this regex - LLQtWebKit::getInstance()->setWhiteListRegex( mBrowserWindowId, "^([^.]+\\.)*amazonaws\\.com$" ); - - LLQtWebKit::getInstance()->enableLoadingOverlay( mBrowserWindowId, true ); - - // Attempt to read cookies from the cookie file and send them to llqtwebkit. - { - std::ifstream cookie_file(mCookiePath.c_str(), std::ios_base::in); - std::string cookies; - - while(cookie_file.good() && !cookie_file.eof()) - { - std::string tmp; - std::getline(cookie_file, tmp); - cookies += tmp; - cookies += "\n"; - } - - if(!cookies.empty()) - { - LLQtWebKit::getInstance()->setCookies(cookies); - } - } - - #if 0 - const std::vector before=LLQtWebKit::getInstance()->getInstalledCertsList(); - std::cout << "Certs before CA.pem load: " << before.size() << " items" << std::endl; - for(int i=0;isetCAFile( ca_pem_file_loc.c_str() ); - std::cout << "Expected CA.pem file location is " << ca_pem_file_loc << std::endl; - - #if 0 - const std::vector after=LLQtWebKit::getInstance()->getInstalledCertsList(); - std::cout << "Certs after CA.pem load: " << after.size() << " items" << std::endl; - for(int i=0;isetSLObjectEnabled( true ); // true means the feature is turned on - LLQtWebKit::getInstance()->setAgentLanguage( "tst-en" ); // viewer language selected by agent - LLQtWebKit::getInstance()->setAgentRegion( "TestGL region" ); // name of region where agent is located - LLQtWebKit::getInstance()->setAgentLocation( 9.8, 7.6, 5.4 ); // agent's x,y,z location within a region - LLQtWebKit::getInstance()->setAgentGlobalLocation( 1234.5, 6789.0, 3456.7 ); // agent's x,y,z location within a region - LLQtWebKit::getInstance()->setAgentOrientation( 175.69 ); // direction (0..359) agent is facing - LLQtWebKit::getInstance()->setAgentMaturity( "Very immature" ); // selected maturity level of agent - - // go to the "home page" or URL passed in via command line - if ( ! argv1.empty() ) - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, argv1 ); - else - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mHomeUrl ); - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void reset( void ) - { - // Get cookies from this instance - std::string cookies = LLQtWebKit::getInstance()->getAllCookies(); - - // Dump cookies to stdout -// std::cout << "Cookies:" << std::endl; -// std::cout << cookies; - - // and save them to cookies.txt in the profile directory - { - std::ofstream cookie_file(mCookiePath.c_str(), std::ios_base::out|std::ios_base::trunc); - - if(cookie_file.good()) - { - cookie_file << cookies; - } - - cookie_file.close(); - } - - // unhook observer - LLQtWebKit::getInstance()->remObserver( mBrowserWindowId, this ); - - // clean up - LLQtWebKit::getInstance()->reset(); - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void reshape( int widthIn, int heightIn ) - { - if ( heightIn == 0 ) - heightIn = 1; - - LLQtWebKit::getInstance()->setSize(mBrowserWindowId, widthIn, heightIn ); - mNeedsUpdate = true; - - glMatrixMode( GL_PROJECTION ); - glLoadIdentity(); - - glViewport( 0, 0, widthIn, heightIn ); - glOrtho( 0.0f, widthIn, heightIn, 0.0f, -1.0f, 1.0f ); - - // we use these elsewhere so save - mAppWindowWidth = widthIn; - mAppWindowHeight = heightIn; - mBrowserWindowWidth = widthIn; - mBrowserWindowHeight = heightIn; - - glMatrixMode( GL_MODELVIEW ); - glLoadIdentity(); - - mNeedsUpdate = true; - idle(); - - glutPostRedisplay(); - }; - - void updateSLvariables() - { - if ( rand() % 2 ) - LLQtWebKit::getInstance()->setAgentRegion( "Region Wibble" ); - else - LLQtWebKit::getInstance()->setAgentRegion( "Region Flasm" ); - LLQtWebKit::getInstance()->setAgentLocation( (rand()%25600)/100.0f, (rand()%25600)/100.0f, (rand()%25600)/100.0f ); - LLQtWebKit::getInstance()->setAgentGlobalLocation( (rand()%25600)/10.0f, (rand()%25600)/10.0f, (rand()%25600)/10.0f ); - LLQtWebKit::getInstance()->setAgentOrientation( (rand()%3600)/10.0f ); - LLQtWebKit::getInstance()->emitLocation(); - - if ( rand() % 2 ) - LLQtWebKit::getInstance()->setAgentLanguage( "One language" ); - else - LLQtWebKit::getInstance()->setAgentLanguage( "Another language" ); - LLQtWebKit::getInstance()->emitLanguage(); - - if ( rand() % 2 ) - LLQtWebKit::getInstance()->setAgentMaturity( "Adults only" ); - else - LLQtWebKit::getInstance()->setAgentMaturity( "Children only" ); - LLQtWebKit::getInstance()->emitMaturity(); - } - - //////////////////////////////////////////////////////////////////////////////// - // - void idle() - { - static time_t starttime = time( NULL ); - if ( time( NULL ) - starttime ) - { - updateSLvariables(); - time( &starttime ); - }; - - LLQtWebKit::getInstance()->pump(100); - - // onPageChanged event sets this - if ( mNeedsUpdate ) - // grab a page but don't reset 'needs update' flag until we've written it to the texture in display() - LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId ); - - // lots of updates for smooth motion - glutPostRedisplay(); - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void display() - { - // clear screen - glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); - - glLoadIdentity(); - - // use the browser texture - glBindTexture( GL_TEXTURE_2D, mAppTexture ); - - // valid window ? - if ( mBrowserWindowId ) - { - // needs to be updated? - if ( mNeedsUpdate ) - { - // grab the page - const unsigned char* pixels = LLQtWebKit::getInstance()->getBrowserWindowPixels( mBrowserWindowId ); - if ( pixels ) - { - // write them into the texture - glTexSubImage2D( GL_TEXTURE_2D, 0, - 0, 0, - // because sometimes the rowspan != width * bytes per pixel (mBrowserWindowWidth) - LLQtWebKit::getInstance()->getBrowserRowSpan( mBrowserWindowId ) / LLQtWebKit::getInstance()->getBrowserDepth( mBrowserWindowId ), - mBrowserWindowHeight, -#ifdef _WINDOWS - LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId ) == 3 ? GL_RGBA : GL_RGBA, -#elif defined(__APPLE__) - GL_RGBA, -#elif defined(LL_LINUX) - GL_RGBA, -#endif - GL_UNSIGNED_BYTE, - pixels ); - }; - - // flag as already updated - mNeedsUpdate = false; - }; - }; - - // scale the texture so that it fits the screen - GLfloat textureScaleX = ( GLfloat )mBrowserWindowWidth / ( GLfloat )mAppTextureWidth; - GLfloat textureScaleY = ( GLfloat )mBrowserWindowHeight / ( GLfloat )mAppTextureHeight; - - // draw the single quad full screen (orthographic) - glMatrixMode( GL_TEXTURE ); - glPushMatrix(); - glScalef( textureScaleX, textureScaleY, 1.0f ); - - glEnable( GL_TEXTURE_2D ); - glColor3f( 1.0f, 1.0f, 1.0f ); - glBegin( GL_QUADS ); - glTexCoord2f( 1.0f, 0.0f ); - glVertex2d( mAppWindowWidth, 0 ); - - glTexCoord2f( 0.0f, 0.0f ); - glVertex2d( 0, 0 ); - - glTexCoord2f( 0.0f, 1.0f ); - glVertex2d( 0, mAppWindowHeight ); - - glTexCoord2f( 1.0f, 1.0f ); - glVertex2d( mAppWindowWidth, mAppWindowHeight ); - glEnd(); - - glMatrixMode( GL_TEXTURE ); - glPopMatrix(); - - glutSwapBuffers(); - }; - - //////////////////////////////////////////////////////////////////////////////// - // convert a GLUT keyboard modifier to an LLQtWebKit one - // (only valid in mouse and keyboard callbacks - LLQtWebKit::EKeyboardModifier getLLQtWebKitKeyboardModifierCode() - { - int result = LLQtWebKit::KM_MODIFIER_NONE; - - int modifiers = glutGetModifiers(); - - if ( GLUT_ACTIVE_SHIFT & modifiers ) - { - result |= LLQtWebKit::KM_MODIFIER_SHIFT; - } - - if ( GLUT_ACTIVE_CTRL & modifiers ) - result |= LLQtWebKit::KM_MODIFIER_CONTROL; - - if ( GLUT_ACTIVE_ALT & modifiers ) - result |= LLQtWebKit::KM_MODIFIER_ALT; - - return (LLQtWebKit::EKeyboardModifier)result; - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void mouseButton( int button, int state, int xIn, int yIn ) - { - // texture is scaled to fit the screen so we scale mouse coords in the same way - xIn = ( xIn * mBrowserWindowWidth ) / mAppWindowWidth; - yIn = ( yIn * mBrowserWindowHeight ) / mAppWindowHeight; - - if ( button == GLUT_LEFT_BUTTON ) - { - if ( state == GLUT_DOWN ) - { - // send event to LLQtWebKit - LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, - LLQtWebKit::ME_MOUSE_DOWN, - LLQtWebKit::MB_MOUSE_BUTTON_LEFT, - xIn, yIn, - getLLQtWebKitKeyboardModifierCode() ); - } - else - if ( state == GLUT_UP ) - { - // send event to LLQtWebKit - LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, - LLQtWebKit::ME_MOUSE_UP, - LLQtWebKit::MB_MOUSE_BUTTON_LEFT, - xIn, yIn, - getLLQtWebKitKeyboardModifierCode() ); - - - // this seems better than sending focus on mouse down (still need to improve this) - LLQtWebKit::getInstance()->focusBrowser( mBrowserWindowId, true ); - }; - }; - - // force a GLUT update - glutPostRedisplay(); - } - - //////////////////////////////////////////////////////////////////////////////// - // - void mouseMove( int xIn , int yIn ) - { - // texture is scaled to fit the screen so we scale mouse coords in the same way - xIn = ( xIn * mBrowserWindowWidth ) / mAppWindowWidth; - yIn = ( yIn * mBrowserWindowHeight ) / mAppWindowHeight; - - // send event to LLQtWebKit - LLQtWebKit::getInstance()->mouseEvent( mBrowserWindowId, - LLQtWebKit::ME_MOUSE_MOVE, - LLQtWebKit::MB_MOUSE_BUTTON_LEFT, - xIn, yIn, - LLQtWebKit::KM_MODIFIER_NONE ); - - - // force a GLUT update - glutPostRedisplay(); - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void keyboard( unsigned char keyIn, bool isDown) - { - // ESC key exits - if ( keyIn == 27 ) - { - reset(); - - exit( 0 ); - }; - - // Translate some keys - switch(keyIn) - { - case 127: - // Turn delete char into backspace - keyIn = LLQtWebKit::KEY_BACKSPACE; - break; - case '\r': - case '\n': - // Turn CR and NL into enter key - keyIn = LLQtWebKit::KEY_RETURN; - break; - - case '\t': - keyIn = LLQtWebKit::KEY_TAB; - break; - - default: - break; - } - - // control-H goes home - if ( keyIn == 8 ) - { - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, mHomeUrl ); - } - // control-B navigates back - else if ( keyIn == 2 ) - { - LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_BACK); - } - // control-F navigates forward - else if ( keyIn == 6 ) - { - LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_FORWARD); - } - // control-R reloads - else if ( keyIn == 18 ) - { - LLQtWebKit::getInstance()->userAction(mBrowserWindowId, LLQtWebKit::UA_NAVIGATE_RELOAD ); - } - // control-I toggles inspector - else if ( keyIn == 23 ) - { - LLQtWebKit::getInstance()->showWebInspector( true ); - } - else if ( keyIn == '1' ) - { - if ( getLLQtWebKitKeyboardModifierCode() == LLQtWebKit::KM_MODIFIER_CONTROL ) - { - LLQtWebKit::getInstance()->setPageZoomFactor( 1.0 ); - } - } - else if ( keyIn == '2' ) - { - if ( getLLQtWebKitKeyboardModifierCode() == LLQtWebKit::KM_MODIFIER_CONTROL ) - { - LLQtWebKit::getInstance()->setPageZoomFactor( 2.0 ); - } - } - - char text[2]; - if(keyIn < 0x80) - { - text[0] = (char)keyIn; - } - else - { - text[0] = 0; - } - - text[1] = 0; - - std::cerr << "key " << (isDown?"down ":"up ") << (int)keyIn << ", modifiers = " << (int)getLLQtWebKitKeyboardModifierCode() << std::endl; - - // send event to LLQtWebKit - LLQtWebKit::getInstance()->keyboardEvent(mBrowserWindowId, isDown?LLQtWebKit::KE_KEY_DOWN:LLQtWebKit::KE_KEY_UP, keyIn, text, getLLQtWebKitKeyboardModifierCode() ); - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void keyboardSpecial( int specialIn, bool isDown) - { - uint32_t key = LLQtWebKit::KEY_NONE; - - switch(specialIn) - { - case GLUT_KEY_F1: key = LLQtWebKit::KEY_F1; break; - case GLUT_KEY_F2: key = LLQtWebKit::KEY_F2; break; - case GLUT_KEY_F3: key = LLQtWebKit::KEY_F3; break; - case GLUT_KEY_F4: key = LLQtWebKit::KEY_F4; break; - case GLUT_KEY_F5: key = LLQtWebKit::KEY_F5; break; - case GLUT_KEY_F6: key = LLQtWebKit::KEY_F6; break; - case GLUT_KEY_F7: key = LLQtWebKit::KEY_F7; break; - case GLUT_KEY_F8: key = LLQtWebKit::KEY_F8; break; - case GLUT_KEY_F9: key = LLQtWebKit::KEY_F9; break; - case GLUT_KEY_F10: key = LLQtWebKit::KEY_F10; break; - case GLUT_KEY_F11: key = LLQtWebKit::KEY_F11; break; - case GLUT_KEY_F12: key = LLQtWebKit::KEY_F12; break; - case GLUT_KEY_LEFT: key = LLQtWebKit::KEY_LEFT; break; - case GLUT_KEY_UP: key = LLQtWebKit::KEY_UP; break; - case GLUT_KEY_RIGHT: key = LLQtWebKit::KEY_RIGHT; break; - case GLUT_KEY_DOWN: key = LLQtWebKit::KEY_DOWN; break; - case GLUT_KEY_PAGE_UP: key = LLQtWebKit::KEY_PAGE_UP; break; - case GLUT_KEY_PAGE_DOWN: key = LLQtWebKit::KEY_PAGE_DOWN;break; - case GLUT_KEY_HOME: key = LLQtWebKit::KEY_HOME; break; - case GLUT_KEY_END: key = LLQtWebKit::KEY_END; break; - case GLUT_KEY_INSERT: key = LLQtWebKit::KEY_INSERT; break; - - default: - break; - } - - if(key != LLQtWebKit::KEY_NONE) - { - keyboard(key, isDown); - } - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onPageChanged( const EventType& /*eventIn*/ ) - { - // flag that an update is required - page grab happens in idle() so we don't stall - mNeedsUpdate = true; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onNavigateBegin( const EventType& eventIn ) - { - std::cout << "Event: begin navigation to " << eventIn.getEventUri() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onNavigateComplete( const EventType& eventIn ) - { - std::cout << "Event: end navigation to " << eventIn.getEventUri() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onUpdateProgress( const EventType& eventIn ) - { - std::cout << "Event: progress value updated to " << eventIn.getIntValue() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onStatusTextChange( const EventType& eventIn ) - { - std::cout << "Event: status updated to " << eventIn.getStringValue() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onTitleChange( const EventType& eventIn ) - { - std::cout << "Event: title changed to " << eventIn.getStringValue() << std::endl; - glutSetWindowTitle( eventIn.getStringValue().c_str() ); - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onLocationChange( const EventType& eventIn ) - { - std::cout << "Event: location changed to " << eventIn.getStringValue() << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onClickLinkHref( const EventType& eventIn ) - { - std::string uuid = eventIn.getStringValue2(); - - std::cout << "Event: clicked on link:" << std::endl; - std::cout << " URL:" << eventIn.getEventUri() << std::endl; - std::cout << " target:" << eventIn.getStringValue() << std::endl; - std::cout << " UUID:" << uuid << std::endl; - std::cout << std::endl; - - // Since we never actually open the window, send a "proxy window closed" back to webkit to keep it from leaking. - LLQtWebKit::getInstance()->proxyWindowClosed(mBrowserWindowId, uuid); - }; - - // virtual - void onClickLinkNoFollow(const EventType& eventIn) - { - std::cout << "Clink link no-follow --" << std::endl; - std::cout << " URL:" << eventIn.getEventUri() << std::endl; - std::cout << " type:" << eventIn.getNavigationType() << std::endl; - std::cout << " trusted:" << eventIn.getTrustedHost() << std::endl; - } - - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onCookieChanged( const EventType& eventIn ) - { - int dead = eventIn.getIntValue(); - std::cout << (dead?"deleting cookie: ":"setting cookie: ") << eventIn.getStringValue() << std::endl; - } - - //////////////////////////////////////////////////////////////////////////////// - // virtual - std::string onRequestFilePicker( const EventType& ) - { - std::string fn = chooseFileName(); - return fn; - } - - //////////////////////////////////////////////////////////////////////////////// - // virtual - bool onAuthRequest(const std::string &in_url, const std::string &in_realm, std::string &out_username, std::string &out_password) - { - std::cout << "Auth request, url = " << in_url << ", realm = " << in_realm << std::endl; - out_username = ""; // replace these temporarily with site username/password as required. - out_password = ""; - return false; - } - - //////////////////////////////////////////////////////////////////////////////// - // virtual - bool onCertError(const std::string &in_url, const std::string &in_msg) - { - std::cout << "Cert error, url = " << in_url << ", message = " << in_msg << std::endl; - return false; // cancel (return true to ignore errors and continue) - } - - virtual void onQtDebugMessage( const std::string& msg, const std::string& msg_type) - { - std::cout << "QtDebugMsg [" << msg_type << "]> " << msg << std::endl; - } - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onLinkHovered( const EventType& eventIn ) - { - std::cout - << "Link hovered, link = " << eventIn.getEventUri() - << ", title = " << eventIn.getStringValue() - << ", text = " << eventIn.getStringValue2() - << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onWindowCloseRequested( const EventType& ) - { - std::cout << "Event: window close requested" << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onNavigateErrorPage( const EventType& event ) - { - std::cout << "Error page hit with code of " << event.getIntValue() << " - navigating to another URL" << std::endl; - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "http://bestbuy.com" ); - }; - - //////////////////////////////////////////////////////////////////////////////// - // virtual - void onWindowGeometryChangeRequested( const EventType& eventIn) - { - int x, y, width, height; - eventIn.getRectValue(x, y, width, height); - - std::cout << "Event: window geometry change requested" << std::endl; - std::cout << " uuid: " << eventIn.getStringValue() << std::endl; - std::cout << " location: (" << x << ", " << y << ")" << std::endl; - std::cout << " size: (" << width << ", " << height << ")" << std::endl; - }; - - //////////////////////////////////////////////////////////////////////////////// - // - int getAppWindowWidth() - { - return mAppWindowWidth; - }; - - //////////////////////////////////////////////////////////////////////////////// - // - int getAppWindowHeight() - { - return mAppWindowHeight; - }; - - //////////////////////////////////////////////////////////////////////////////// - // - std::string getAppWindowName() - { - return mAppWindowName; - }; - - //////////////////////////////////////////////////////////////////////////////// - // - void* getNativeWindowHandle() - { - // My implementation of the embedded browser needs a native window handle - // Can't get this via GLUT so had to use this hack - #ifdef _WINDOWS - return FindWindow( NULL, (LPCWSTR)mAppWindowName.c_str() ); - #else - #ifdef LL_OSX - // not needed on osx - return 0; - #else - //#error "You will need an implementation of this method" - return 0; - #endif - #endif - }; - - private: - int mAppWindowWidth; - int mAppWindowHeight; - int mBrowserWindowWidth; - int mBrowserWindowHeight; - int mAppTextureWidth; - int mAppTextureHeight; - GLuint mAppTexture; - int mBrowserWindowId; - std::string mAppWindowName; - std::string mHomeUrl; - std::string mCwd; - bool mNeedsUpdate; - std::string mApplicationDir; - std::string mProfileDir; - std::string mCookiePath; -}; - -testGL* theApp; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutReshape( int widthIn, int heightIn ) -{ - if ( theApp ) - theApp->reshape( widthIn, heightIn ); -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutDisplay() -{ - if ( theApp ) - theApp->display(); -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutIdle() -{ - if ( theApp ) - theApp->idle(); -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutKeyboard( unsigned char keyIn, int /*xIn*/, int /*yIn*/ ) -{ - if ( theApp ) - { - theApp->keyboard( keyIn, true ); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutKeyboardUp( unsigned char keyIn, int /*xIn*/, int /*yIn*/ ) -{ - if ( theApp ) - { - theApp->keyboard( keyIn, false ); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutSpecial( int specialIn, int /*xIn*/, int /*yIn*/ ) -{ - if ( theApp ) - { - theApp->keyboardSpecial( specialIn, true ); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutSpecialUp( int specialIn, int /*xIn*/, int /*yIn*/ ) -{ - if ( theApp ) - { - theApp->keyboardSpecial( specialIn, false ); - } -}; - -//////////////////////////////////////////////////////////////////////////////// -// -void glutMouseMove( int xIn , int yIn ) -{ - if ( theApp ) - theApp->mouseMove( xIn, yIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -void glutMouseButton( int buttonIn, int stateIn, int xIn, int yIn ) -{ - if ( theApp ) - theApp->mouseButton( buttonIn, stateIn, xIn, yIn ); -} - -//////////////////////////////////////////////////////////////////////////////// -// -int main( int argc, char* argv[] ) -{ - glutInit( &argc, argv ); - glutInitDisplayMode( GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB ); - - // implementation in a class so we can observer events - // means we need this painful GLUT <--> class shim... - theApp = new testGL; - - if ( theApp ) - { - glutInitWindowPosition( 80, 0 ); - glutInitWindowSize( theApp->getAppWindowWidth(), theApp->getAppWindowHeight() ); - - glutCreateWindow( theApp->getAppWindowName().c_str() ); - - std::string url = ""; - if ( 2 == argc ) - url = std::string( argv[ 1 ] ); - - theApp->init( std::string( argv[ 0 ] ), url ); - - glutKeyboardFunc( glutKeyboard ); - glutKeyboardUpFunc( glutKeyboardUp ); - glutSpecialFunc( glutSpecial ); - glutSpecialUpFunc( glutSpecialUp ); - - glutMouseFunc( glutMouseButton ); - glutPassiveMotionFunc( glutMouseMove ); - glutMotionFunc( glutMouseMove ); - - glutDisplayFunc( glutDisplay ); - glutReshapeFunc( glutReshape ); - - glutIdleFunc( glutIdle ); - - glutMainLoop(); - - std::cout << "glutMainLoop returned" << std::endl; - - delete theApp; - }; - - return 0; -} diff --git a/indra/llqtwebkit/tests/testgl/testgl.pro b/indra/llqtwebkit/tests/testgl/testgl.pro deleted file mode 100644 index 42692d68d..000000000 --- a/indra/llqtwebkit/tests/testgl/testgl.pro +++ /dev/null @@ -1,38 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ../../ -CONFIG -= app_bundle - -QT += webkit opengl network - -!mac { -unix { - DEFINES += LL_LINUX - LIBS += -lglui -lglut - LIBS += $$PWD/../../libllqtwebkit.a -} -} - -mac { - DEFINES += LL_OSX - LIBS += -framework GLUT -framework OpenGL - LIBS += $$PWD/libllqtwebkit.dylib -} - -win32 { - DEFINES += _WINDOWS - INCLUDEPATH += ../ - INCLUDEPATH += $$PWD/../../stage/packages/include - DESTDIR=../build - release { - LIBS += $$PWD/../../Release/llqtwebkit.lib - LIBS += $$PWD/../build/freeglut_static.lib - LIBS += comdlg32.lib - } -} - -include(../../static.pri) - -SOURCES += testgl.cpp diff --git a/indra/llqtwebkit/tests/textmode/textmode.cpp b/indra/llqtwebkit/tests/textmode/textmode.cpp deleted file mode 100644 index 019fba902..000000000 --- a/indra/llqtwebkit/tests/textmode/textmode.cpp +++ /dev/null @@ -1,292 +0,0 @@ -/* Copyright (c) 2006-2010, Linden Research, Inc. - * - * LLQtWebKit Source Code - * The source code in this file ("Source Code") is provided by Linden Lab - * to you under the terms of the GNU General Public License, version 2.0 - * ("GPL"), unless you have obtained a separate licensing agreement - * ("Other License"), formally executed by you and Linden Lab. Terms of - * the GPL can be found in GPL-license.txt in this distribution, or online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/gplv2 - * - * There are special exceptions to the terms and conditions of the GPL as - * it is applied to this Source Code. View the full text of the exception - * in the file FLOSS-exception.txt in this software distribution, or - * online at - * http://secondlifegrid.net/technology-programs/license-virtual-world/viewerlicensing/flossexception - * - * By copying, modifying or distributing this software, you acknowledge - * that you have read and understood your obligations described above, - * and agree to abide by those obligations. - * - * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO - * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY, - * COMPLETENESS OR PERFORMANCE. - */ - -#ifndef _WINDOWS -extern "C" { -#include -} -#endif - -#ifdef _WINDOWS -#include -#include -#endif - -#include -#include -#include -#include -#include -#include - -#ifdef LL_OSX -// I'm not sure why STATIC_QT is getting defined, but the Q_IMPORT_PLUGIN thing doesn't seem to be necessary on the mac. -#undef STATIC_QT -#endif - -#ifdef STATIC_QT -#include -Q_IMPORT_PLUGIN(qgif) -#endif - -#include "llqtwebkit.h" - -class textMode : - public LLEmbeddedBrowserWindowObserver -{ - public: - textMode( std::string url, bool ignore_ca_file, bool ignore_ssl_errors ) : - mBrowserWindowWidth( 512 ), - mBrowserWindowHeight( 512 ), - mBrowserWindowHandle( 0 ), - mNavigateInProgress( true ), - mLogLine( "" ) - { - -#ifdef _WINDOWS - std::string cwd = std::string( _getcwd( NULL, 1024) ); - std::string profile_dir = cwd + "\\" + "textmode_profile"; - void* native_window_handle = (void*)GetDesktopWindow(); - std::string ca_file_loc = cwd + "\\" + "CA.pem"; -#else - std::string cwd = std::string( getcwd( NULL, 1024) ); - std::string profile_dir = cwd + "/" + "textmode_profile"; - void* native_window_handle = 0; - std::string ca_file_loc = cwd + "/" + "CA.pem"; -#endif - mLogLine << "Current working dir is " << cwd << std::endl; - mLogLine << "Profiles dir is " << profile_dir; - writeLine( mLogLine.str() ); - - LLQtWebKit::getInstance()->init( cwd, cwd, profile_dir, native_window_handle ); - - LLQtWebKit::getInstance()->enableQtMessageHandler( true ); - - LLQtWebKit::getInstance()->enableJavaScript( true ); - LLQtWebKit::getInstance()->enablePlugins( true ); - - mBrowserWindowHandle = LLQtWebKit::getInstance()->createBrowserWindow( mBrowserWindowWidth, mBrowserWindowHeight ); - LLQtWebKit::getInstance()->setSize( mBrowserWindowHandle, mBrowserWindowWidth, mBrowserWindowHeight ); - - LLQtWebKit::getInstance()->addObserver( mBrowserWindowHandle, this ); - - if ( ! ignore_ca_file ) - { - mLogLine.str(""); - mLogLine << "Expected certificate authority file location is " << ca_file_loc; - writeLine( mLogLine.str() ); - LLQtWebKit::getInstance()->setCAFile( ca_file_loc.c_str() ); - } - else - { - mLogLine.str(""); - mLogLine << "Not loading certificate authority file"; - writeLine( mLogLine.str() ); - }; - - if ( ignore_ssl_errors ) - { - LLQtWebKit::getInstance()->setIgnoreSSLCertErrors( true ); - mLogLine.str(""); - mLogLine << "Ignoring SSL errors"; - writeLine( mLogLine.str() ); - } - else - { - mLogLine.str(""); - mLogLine << "Not ignoring SSL errors"; - writeLine( mLogLine.str() ); - }; - - mLogLine.str(""); - mLogLine << "Navigating to " << url; - writeLine( mLogLine.str() ); - - LLQtWebKit::getInstance()->navigateTo( mBrowserWindowHandle, url ); - }; - - bool idle( void ) - { - LLQtWebKit::getInstance()->pump( 100 ); - -#if _WINDOWS - MSG msg; - while ( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) - { - GetMessage( &msg, NULL, 0, 0 ); - TranslateMessage( &msg ); - DispatchMessage( &msg ); - }; -#endif - return mNavigateInProgress; - }; - - ~textMode() - { - LLQtWebKit::getInstance()->remObserver( mBrowserWindowHandle, this ); - LLQtWebKit::getInstance()->reset(); - }; - - void onNavigateBegin( const EventType& eventIn ) - { - mNavigateInProgress = true; - mLogLine.str(""); - mLogLine << "Event: Begin navigation to " << eventIn.getEventUri(); - writeLine( mLogLine.str() ); - }; - - void onNavigateComplete( const EventType& eventIn ) - { - mLogLine.str(""); - mLogLine << "Event: End navigation to " << eventIn.getEventUri(); - writeLine( mLogLine.str() ); - mNavigateInProgress = false; - }; - - void onUpdateProgress( const EventType& eventIn ) - { - mLogLine.str(""); - mLogLine << "Event: progress value updated to " << eventIn.getIntValue(); - writeLine( mLogLine.str() ); - }; - - void onStatusTextChange( const EventType& eventIn ) - { - mLogLine.str(""); - mLogLine << "Event: status updated to " << eventIn.getStringValue(); - writeLine( mLogLine.str() ); - }; - - void onTitleChange( const EventType& eventIn ) - { - mLogLine.str(""); - mLogLine << "Event: title change to " << eventIn.getStringValue(); - writeLine( mLogLine.str() ); - }; - - void onLocationChange( const EventType& eventIn ) - { - mLogLine.str(""); - mLogLine << "Event: location changed to " << eventIn.getStringValue(); - writeLine( mLogLine.str() ); - }; - - bool onCertError(const std::string &in_url, const std::string &in_msg) - { - mLogLine.str(""); - mLogLine << "Cert error triggered: " << std::endl << in_url << "\n" << in_msg; - writeLine( mLogLine.str() ); - return true; - } - - void onCookieChanged(const EventType& event) - { - std::string url = event.getEventUri(); - std::string cookie = event.getStringValue(); - int dead = event.getIntValue(); - mLogLine.str(""); - if ( ! dead ) - mLogLine << "Cookie added:" << cookie; - else - mLogLine << "Cookie deleted:" << cookie; - writeLine( mLogLine.str() ); - } - - virtual void onQtDebugMessage( const std::string& msg, const std::string& msg_type) - { - mLogLine.str(""); - mLogLine << "QtDebugMsg (" << msg_type << "): " << msg.substr(msg.length() - 1); - writeLine( mLogLine.str() ); - } - - void writeLine( std::string line ) - { - double elapsed_seconds = (double)clock() / (double)CLOCKS_PER_SEC; - - std::cout << "[" << std::setprecision(7) << std::setw(3) << std::setfill('0') << elapsed_seconds << "] "; - const int max_len = 140; - if ( line.length() > max_len ) - { - std::cout << line.substr(0, max_len); - std::cout << "...."; - } - else - { - std::cout << line; - } - std::cout << std::endl; - //std::cout << std::endl; - } - - private: - int mBrowserWindowWidth; - int mBrowserWindowHeight; - int mBrowserWindowHandle; - bool mNavigateInProgress; - std::ostringstream mLogLine; -}; - -int main( int argc, char* argv[] ) -{ - bool ingore_ssl_errors = false; - bool ignore_ca_file = false; - - for( int i = 1; i < argc; ++i ) - { - if ( std::string( argv[ i ] ) == "--help" ) - { - std::cout << std::endl << "textmode " << std::endl; - exit( 0 ); - }; - - if ( std::string( argv[ i ] ) == "--ignoresslerrors" ) - ingore_ssl_errors = true; - - if ( std::string( argv[ i ] ) == "--ignorecafile" ) - ignore_ca_file = true; - }; - - std::string url ( "https://my.secondlife.com/callum.linden" ); - for( int i = 1; i < argc; ++i ) - { - if ( std::string( argv[ i ] ).substr( 0, 2 ) != "--" ) - { - url = std::string( argv[ i ] ); - break; - }; - }; - - textMode* app = new textMode( url, ignore_ca_file, ingore_ssl_errors ); - - bool result = app->idle(); - while( result ) - { - result = app->idle(); - }; - - delete app; - - return 0; -} diff --git a/indra/llqtwebkit/tests/textmode/textmode.pro b/indra/llqtwebkit/tests/textmode/textmode.pro deleted file mode 100644 index d41e1ea68..000000000 --- a/indra/llqtwebkit/tests/textmode/textmode.pro +++ /dev/null @@ -1,28 +0,0 @@ -TEMPLATE = app -TARGET = -DEPENDPATH += . -INCLUDEPATH += . -INCLUDEPATH += ../../ -CONFIG -= app_bundle -CONFIG += console - -QT += webkit network - -mac { - DEFINES += LL_OSX - LIBS += $$PWD/libllqtwebkit.dylib -} - -win32 { - DEFINES += _WINDOWS - INCLUDEPATH += ../ - DESTDIR=../build - LIBS += user32.lib - release { - LIBS += $$PWD/../../Release/llqtwebkit.lib - } -} - -include(../../static.pri) - -SOURCES += textmode.cpp diff --git a/indra/llqtwebkit/win32/3p-qt-vars.bat b/indra/llqtwebkit/win32/3p-qt-vars.bat deleted file mode 100644 index 5ea118848..000000000 --- a/indra/llqtwebkit/win32/3p-qt-vars.bat +++ /dev/null @@ -1,6 +0,0 @@ -@echo off -echo Setting up a Qt environment using 3p-qt HG repository -set QTDIR=C:\Work\3p-llqtwebkit\stage -set PATH=C:\Work\3p-llqtwebkit\stage\bin;%PATH% -set QMAKESPEC=win32-msvc2010 -call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat" diff --git a/indra/llqtwebkit/win32/Qt Command Prompt (3p-qt).lnk b/indra/llqtwebkit/win32/Qt Command Prompt (3p-qt).lnk deleted file mode 100644 index 460a9e9cf126aa1725435f3759d4ba768a4a9730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2369 zcmeHITS(JU82@b=cY{v!!P>$J8kQVt>~J zH#*@&7kuz?R0j5h5HD0BQ3u;eZ;#7UTm)1`FwbO5pI~Ms$j@UjZ8%A+9=PB^F*p^O zXcWmM_f({`>*4S?jjj`}h@Yn_pCt+j=1gupc?xN6aS+Q1BQZ~q#7|%cDTgHg7g

zvYjOJ<48-d4o~YS!SIEmV-K&%9(DtHL^i@6#iJu*N9?NXi1sNR7L*gCiLpG2c521w zrcWKLM;Hws{XRsyn|d+UQPU&;ALiIqOqtFBY(Vj#?E=lrfbXoyc(IzQT4OmRMg?Xi$H`C3ba?jno)19=Z zla`UNSy)_~dUwPqlT@!{;IO__l+CKuTBTkj>ZeKK>;+;_|DM z`)}Z{f0sGFo%ZE2K!9a0!iqu!BO!xC0k? z_AKgjc*#3>TI7xIB$t+iBUlb#iBkGAJ_eMMuJwt$(KdNJOBsTUaH`0eR>vXK271+p f-d@p2tW^AdKc!d#xDq%FXJ3Gtv{handleKeyUp(key, mask, FALSE); + } + return handled; +} + // Called from handleKey() // Handles key in this object. Checking parents and children happens in handleKey() BOOL LLView::handleKeyHere(KEY key, MASK mask) @@ -970,6 +1002,13 @@ BOOL LLView::handleKeyHere(KEY key, MASK mask) return FALSE; } +// Called from handleKey() +// Handles key in this object. Checking parents and children happens in handleKey() +BOOL LLView::handleKeyUpHere(KEY key, MASK mask) +{ + return FALSE; +} + BOOL LLView::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) { BOOL handled = FALSE; @@ -1095,6 +1134,12 @@ LLView* LLView::childrenHandleKey(KEY key, MASK mask) return childrenHandleCharEvent("Key", &LLView::handleKey, key, mask); } +// Called during downward traversal +LLView* LLView::childrenHandleKeyUp(KEY key, MASK mask) +{ + return childrenHandleCharEvent("Key Up", &LLView::handleKeyUp, key, mask); +} + // Called during downward traversal LLView* LLView::childrenHandleUnicodeChar(llwchar uni_char) { diff --git a/indra/llui/llview.h b/indra/llui/llview.h index 89d2fc33c..9a3f477ea 100644 --- a/indra/llui/llview.h +++ b/indra/llui/llview.h @@ -452,6 +452,7 @@ public: // inherited from LLFocusableElement /* virtual */ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); + /* virtual */ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent); /* virtual */ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent); virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, @@ -657,6 +658,7 @@ public: virtual void handleReshape(const LLRect& rect, bool by_user); virtual BOOL handleKeyHere(KEY key, MASK mask); + virtual BOOL handleKeyUpHere(KEY key, MASK mask); virtual BOOL handleUnicodeCharHere(llwchar uni_char); @@ -681,6 +683,7 @@ protected: void logMouseEvent(); LLView* childrenHandleKey(KEY key, MASK mask); + LLView* childrenHandleKeyUp(KEY key, MASK mask); LLView* childrenHandleUnicodeChar(llwchar uni_char); LLView* childrenHandleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, diff --git a/indra/llwindow/llkeyboardwin32.cpp b/indra/llwindow/llkeyboardwin32.cpp index 2740fce59..a06d5ec1d 100644 --- a/indra/llwindow/llkeyboardwin32.cpp +++ b/indra/llwindow/llkeyboardwin32.cpp @@ -261,7 +261,7 @@ void LLKeyboardWin32::scanKeyboard() // *TODO: I KNOW there must be a better way of // interrogating the key state than this, using async key // state can cause ALL kinds of bugs - Doug - if (key < KEY_BUTTON0) + if ((key < KEY_BUTTON0) && ((key < '0') || (key > '9'))) { // ...under windows make sure the key actually still is down. // ...translate back to windows key diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp index fab15ea71..6c505028c 100644 --- a/indra/llwindow/llwindowwin32.cpp +++ b/indra/llwindow/llwindowwin32.cpp @@ -42,6 +42,7 @@ #include "llgl.h" #include "llstring.h" #include "lldir.h" +#include "llsdutil.h" #include "llglslshader.h" // System includes @@ -2105,6 +2106,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ window_imp->mKeyCharCode = 0; // don't know until wm_char comes in next window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff; window_imp->mKeyVirtualKey = w_param; + window_imp->mRawMsg = u_msg; + window_imp->mRawWParam = w_param; + window_imp->mRawLParam = l_param; window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYDOWN"); { @@ -2127,6 +2131,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ { window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff; window_imp->mKeyVirtualKey = w_param; + window_imp->mRawMsg = u_msg; + window_imp->mRawWParam = w_param; + window_imp->mRawLParam = l_param; window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYUP"); LLFastTimer t2(FTM_KEYHANDLER); @@ -2214,6 +2221,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_ case WM_CHAR: window_imp->mKeyCharCode = w_param; + window_imp->mRawMsg = u_msg; + window_imp->mRawWParam = w_param; + window_imp->mRawLParam = l_param; // Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need // to figure out how that works. - Doug @@ -3310,6 +3320,9 @@ LLSD LLWindowWin32::getNativeKeyData() result["scan_code"] = (S32)mKeyScanCode; result["virtual_key"] = (S32)mKeyVirtualKey; + result["msg"] = ll_sd_from_U32(mRawMsg); + result["w_param"] = ll_sd_from_U32(mRawWParam); + result["l_param"] = ll_sd_from_U32(mRawLParam); return result; } diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h index 9ef2b206e..3412dcd9a 100644 --- a/indra/llwindow/llwindowwin32.h +++ b/indra/llwindow/llwindowwin32.h @@ -132,7 +132,7 @@ protected: HCURSOR loadColorCursor(LPCTSTR name); BOOL isValid(); void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size); - LLSD getNativeKeyData(); + virtual LLSD getNativeKeyData(); // Changes display resolution. Returns true if successful BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh); @@ -215,6 +215,9 @@ protected: U32 mKeyCharCode; U32 mKeyScanCode; U32 mKeyVirtualKey; + U32 mRawMsg; + U32 mRawWParam; + U32 mRawLParam; friend class LLWindowManager; }; diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp index 4fe064959..14823bf31 100644 --- a/indra/newview/llfloaterabout.cpp +++ b/indra/newview/llfloaterabout.cpp @@ -70,6 +70,8 @@ #include "lldxhardware.h" #endif +#include "cef/llceflib.h" + extern LLMemoryInfo gSysMemory; extern U32 gPacketsIn; @@ -112,7 +114,7 @@ LLFloaterAbout::LLFloaterAbout() LLViewerTextEditor *credits_widget = getChild("credits_editor", true); - LLViewerTextEditor *licenses_widget = + LLViewerTextEditor *licenses_widget = getChild("licenses_editor", true); childSetAction("copy_btn", onAboutClickCopyToClipboard, this); @@ -271,17 +273,6 @@ LLFloaterAbout::LLFloaterAbout() // [/RLVa:KB] support.append("\n\n"); - support.append("Viewer SSE Version: "); -#if _M_IX86_FP > 0 //Windows - support.append(llformat("SSE%i\n", _M_IX86_FP )); -#elif defined(__SSE2__) //GCC - support.append("SSE2\n"); -#elif defined(__SSE__) //GCC - support.append("SSE\n"); -#else - support.append("None\n"); -#endif - support.append("libcurl Version: "); support.append( LLCurl::getVersionString() ); support.append("\n"); @@ -296,16 +287,8 @@ LLFloaterAbout::LLFloaterAbout() support.append("\n"); // TODO: Implement media plugin version query - - support.append("Qt Webkit Version: "); - support.append( -#if LL_LINUX && defined(__x86_64__) - "4.8.6" -#else - "4.7.1" -#endif - ); - support.append(" (version number hard-coded)"); + support.append("LLCEFLib/CEF Version: "); + support.append(LLCEFLIB_VERSION); support.append("\n"); if (gPacketsIn > 0) @@ -331,25 +314,25 @@ LLFloaterAbout::LLFloaterAbout() credits_widget->setTakesFocus(TRUE); credits_widget->setHandleEditKeysDirectly(TRUE); - // Get the Versions and Copyrights, created at build time - std::string licenses_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "packages-info.txt"); - llifstream licenses_file; - licenses_file.open(licenses_path); /* Flawfinder: ignore */ - if (licenses_file.is_open()) - { - std::string license_line; - licenses_widget->clear(); - while (std::getline(licenses_file, license_line)) - { - licenses_widget->appendColoredText(license_line + "\n", FALSE, FALSE, gColors.getColor("TextFgReadOnlyColor")); - } - licenses_file.close(); - } - else - { - // this case will use the (out of date) hard coded value from the XUI - LL_INFOS("AboutInit") << "Could not read licenses file at " << licenses_path << LL_ENDL; - } + // Get the Versions and Copyrights, created at build time + std::string licenses_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "packages-info.txt"); + llifstream licenses_file; + licenses_file.open(licenses_path); /* Flawfinder: ignore */ + if (licenses_file.is_open()) + { + std::string license_line; + licenses_widget->clear(); + while (std::getline(licenses_file, license_line)) + { + licenses_widget->appendColoredText(license_line + "\n", FALSE, FALSE, gColors.getColor("TextFgReadOnlyColor")); + } + licenses_file.close(); + } + else + { + // this case will use the (out of date) hard coded value from the XUI + LL_INFOS("AboutInit") << "Could not read licenses file at " << licenses_path << LL_ENDL; + } licenses_widget->setCursorPos(0); licenses_widget->setEnabled(FALSE); licenses_widget->setTakesFocus(TRUE); diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index ef98d11dc..f4d4d877a 100644 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -412,6 +412,23 @@ BOOL LLMediaCtrl::handleKeyHere( KEY key, MASK mask ) return result; } +//////////////////////////////////////////////////////////////////////////////// +// +BOOL LLMediaCtrl::handleKeyUpHere(KEY key, MASK mask) +{ + BOOL result = FALSE; + + if (mMediaSource) + { + result = mMediaSource->handleKeyUpHere(key, mask); + } + + if (!result) + result = LLPanel::handleKeyUpHere(key, mask); + + return result; +} + //////////////////////////////////////////////////////////////////////////////// // void LLMediaCtrl::handleVisibilityChange ( BOOL new_visibility ) @@ -940,7 +957,7 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CURSOR_CHANGED, new cursor is " << self->getCursorName() << LL_ENDL; } break; - + case MEDIA_EVENT_NAVIGATE_BEGIN: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_NAVIGATE_BEGIN, url is " << self->getNavigateURI() << LL_ENDL; @@ -995,21 +1012,23 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) std::string target = self->getClickTarget(); std::string uuid = self->getClickUUID(); - LLNotification::Params notify_params("PopupAttempt"); - notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", mMediaTextureID); - notify_params.functor(boost::bind(&LLMediaCtrl::onPopup, this, _1, _2)); + LLWeb::loadURL(url, target, std::string()); - if (mTrusted) - { - LLNotifications::instance().forceResponse(notify_params, 0); - } - else - { - LLNotifications::instance().add(notify_params); - } + //LLNotification::Params notify_params("PopupAttempt"); + //notify_params.payload = LLSD().with("target", target).with("url", url).with("uuid", uuid).with("media_id", mMediaTextureID); + //notify_params.functor(boost::bind(&LLMediaCtrl::onPopup, this, _1, _2)); + + //if (mTrusted) + //{ + // LLNotifications::instance().forceResponse(notify_params, 0); + //} + //else + //{ + // LLNotifications::instance().add(notify_params); + //} break; }; - + case MEDIA_EVENT_CLICK_LINK_NOFOLLOW: { LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << LL_ENDL; @@ -1076,6 +1095,13 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) }; break; + case MEDIA_EVENT_FILE_DOWNLOAD: + { + //llinfos << "Media event - file download requested - filename is " << self->getFileDownloadFilename() << llendl; + //LLNotificationsUtil::add("MediaFileDownloadUnsupported"); + }; + break; + case MEDIA_EVENT_DEBUG_MESSAGE: { LL_INFOS("media") << self->getDebugMessageText() << LL_ENDL; @@ -1142,6 +1168,16 @@ void LLMediaCtrl::setTrustedContent(bool trusted) } } +bool LLMediaCtrl::wantsKeyUpKeyDown() const +{ + return true; +} + +bool LLMediaCtrl::wantsReturnKey() const +{ + return true; +} + // virtual LLXMLNodePtr LLMediaCtrl::getXML(bool save_children) const { diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index 306d68650..02f4558d0 100644 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -160,6 +160,7 @@ public: // over-rides virtual BOOL handleKeyHere( KEY key, MASK mask); + virtual BOOL handleKeyUpHere(KEY key, MASK mask); virtual void handleVisibilityChange ( BOOL new_visibility ); virtual BOOL handleUnicodeCharHere(llwchar uni_char); virtual void reshape( S32 width, S32 height, BOOL called_from_parent = TRUE); @@ -178,6 +179,10 @@ public: LLUUID getTextureID() {return mMediaTextureID;} + // The Browser windows want keyup and keydown events. Overridden from LLFocusableElement to return true. + virtual bool wantsKeyUpKeyDown() const; + virtual bool wantsReturnKey() const; + protected: void convertInputCoords(S32& x, S32& y); diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 750e9786b..5f2d4b403 100644 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -749,6 +749,11 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask) LL_INFOS() << "LLToolPie handleDoubleClick (becoming mouseDown)" << LL_ENDL; } + if (handleMediaDblClick(mPick)) + { + return TRUE; + } + if (gSavedSettings.getBOOL("DoubleClickAutoPilot")) { if ((mPick.mPickType == LLPickInfo::PICK_LAND && !mPick.mPosGlobal.isExactlyZero()) || @@ -879,56 +884,110 @@ static void handle_click_action_play() bool LLToolPie::handleMediaClick(const LLPickInfo& pick) { - //FIXME: how do we handle object in different parcel than us? - LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); - LLPointer objectp = pick.getObject(); + //FIXME: how do we handle object in different parcel than us? + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + LLPointer objectp = pick.getObject(); - if (!parcel || - objectp.isNull() || - pick.mObjectFace < 0 || - pick.mObjectFace >= objectp->getNumTEs()) - { - LLViewerMediaFocus::getInstance()->clearFocus(); + if (!parcel || + objectp.isNull() || + pick.mObjectFace < 0 || + pick.mObjectFace >= objectp->getNumTEs()) + { + LLViewerMediaFocus::getInstance()->clearFocus(); - return false; - } + return false; + } - // Does this face have media? - const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace); - if(!tep) - return false; + // Does this face have media? + const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace); + if (!tep) + return false; - LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL; - if(!mep) - return false; - - viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); + LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL; + if (!mep) + return false; - if (gSavedSettings.getBOOL("MediaOnAPrimUI")) - { - if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull()) - { - // It's okay to give this a null impl - LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal); - } - else - { - // Make sure keyboard focus is set to the media focus object. - gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); - LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); - - media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE)); - mMediaMouseCaptureID = mep->getMediaID(); - setMouseCapture(TRUE); // This object will send a mouse-up to the media when it loses capture. - } + viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); - return true; - } + if (gSavedSettings.getBOOL("MediaOnAPrimUI")) + { + if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull()) + { + // It's okay to give this a null impl + LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal); + } + else + { + // Make sure keyboard focus is set to the media focus object. + gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); + LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); - LLViewerMediaFocus::getInstance()->clearFocus(); + media_impl->mouseDown(pick.mUVCoords, gKeyboard->currentMask(TRUE)); + mMediaMouseCaptureID = mep->getMediaID(); + setMouseCapture(TRUE); // This object will send a mouse-up to the media when it loses capture. + } - return false; + return true; + } + + LLViewerMediaFocus::getInstance()->clearFocus(); + + return false; +} + +bool LLToolPie::handleMediaDblClick(const LLPickInfo& pick) +{ + //FIXME: how do we handle object in different parcel than us? + LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel(); + LLPointer objectp = pick.getObject(); + + + if (!parcel || + objectp.isNull() || + pick.mObjectFace < 0 || + pick.mObjectFace >= objectp->getNumTEs()) + { + LLViewerMediaFocus::getInstance()->clearFocus(); + + return false; + } + + // Does this face have media? + const LLTextureEntry* tep = objectp->getTE(pick.mObjectFace); + if (!tep) + return false; + + LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL; + if (!mep) + return false; + + viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()); + + if (gSavedSettings.getBOOL("MediaOnAPrimUI")) + { + if (!LLViewerMediaFocus::getInstance()->isFocusedOnFace(pick.getObject(), pick.mObjectFace) || media_impl.isNull()) + { + // It's okay to give this a null impl + LLViewerMediaFocus::getInstance()->setFocusFace(pick.getObject(), pick.mObjectFace, media_impl, pick.mNormal); + } + else + { + // Make sure keyboard focus is set to the media focus object. + gFocusMgr.setKeyboardFocus(LLViewerMediaFocus::getInstance()); + LLEditMenuHandler::gEditMenuHandler = LLViewerMediaFocus::instance().getFocusedMediaImpl(); + + media_impl->mouseDoubleClick(pick.mUVCoords, gKeyboard->currentMask(TRUE)); + mMediaMouseCaptureID = mep->getMediaID(); + setMouseCapture(TRUE); // This object will send a mouse-up to the media when it loses capture. + } + + return true; + } + + LLViewerMediaFocus::getInstance()->clearFocus(); + + return false; } bool LLToolPie::handleMediaHover(const LLPickInfo& pick) @@ -939,7 +998,7 @@ bool LLToolPie::handleMediaHover(const LLPickInfo& pick) LLPointer objectp = pick.getObject(); - // Early out cases. Must clear media hover. + // Early out cases. Must clear media hover. // did not hit an object or did not hit a valid face if ( objectp.isNull() || pick.mObjectFace < 0 || diff --git a/indra/newview/lltoolpie.h b/indra/newview/lltoolpie.h index 5f3c75c3b..ffae5b945 100644 --- a/indra/newview/lltoolpie.h +++ b/indra/newview/lltoolpie.h @@ -89,6 +89,7 @@ private: ECursorType cursorFromObject(LLViewerObject* object); bool handleMediaClick(const LLPickInfo& info); + bool handleMediaDblClick(const LLPickInfo& info); bool handleMediaHover(const LLPickInfo& info); bool handleMediaMouseUp(); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 89b52d8b5..864dff39e 100644 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -706,7 +706,10 @@ BOOL LLViewerKeyboard::handleKey(KEY translated_key, MASK translated_mask, BOOL return mKeyHandledByUI[translated_key]; } - +BOOL LLViewerKeyboard::handleKeyUp(KEY translated_key, MASK translated_mask) +{ + return gViewerWindow->handleKeyUp(translated_key, translated_mask); +} BOOL LLViewerKeyboard::bindKey(const S32 mode, const KEY key, const MASK mask, const std::string& function_name) { diff --git a/indra/newview/llviewerkeyboard.h b/indra/newview/llviewerkeyboard.h index 29fff6f98..bcc937f49 100644 --- a/indra/newview/llviewerkeyboard.h +++ b/indra/newview/llviewerkeyboard.h @@ -89,6 +89,7 @@ public: LLViewerKeyboard(); BOOL handleKey(KEY key, MASK mask, BOOL repeated); + BOOL handleKeyUp(KEY key, MASK mask); S32 loadBindings(const std::string& filename); // returns number bound, 0 on error S32 loadBindingsXML(const std::string& filename); // returns number bound, 0 on error diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp index 1d137f161..15c3723af 100644 --- a/indra/newview/llviewermedia.cpp +++ b/indra/newview/llviewermedia.cpp @@ -1832,7 +1832,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ // HACK: we always try to keep a spare running webkit plugin around to improve launch times. // If a spare was already created before PluginAttachDebuggerToPlugins was set, don't use it. - if((plugin_basename == "media_plugin_webkit") && + if ((plugin_basename == "media_plugin_cef") && !gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")) { media_source = LLViewerMedia::getSpareBrowserMediaSource(); @@ -1853,20 +1853,26 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ { std::string launcher_name = gDirUtilp->getLLPluginLauncher(); std::string plugin_name = gDirUtilp->getLLPluginFilename(plugin_basename); - std::string user_data_path = gDirUtilp->getOSUserAppDir(); - user_data_path += gDirUtilp->getDirDelimiter(); + + std::string user_data_path_cache = gDirUtilp->getCacheDir(false); + user_data_path_cache += gDirUtilp->getDirDelimiter(); + + std::string user_data_path_cookies = gDirUtilp->getOSUserAppDir(); + user_data_path_cookies += gDirUtilp->getDirDelimiter(); + + std::string user_data_path_logs = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, ""); // Fix for EXT-5960 - make browser profile specific to user (cache, cookies etc.) // If the linden username returned is blank, that can only mean we are // at the login page displaying login Web page or Web browser test via Develop menu. // In this case we just use whatever gDirUtilp->getOSUserAppDir() gives us (this // is what we always used before this change) - std::string linden_user_dir = gDirUtilp->getLindenUserDir(true); + std::string linden_user_dir = gDirUtilp->getLindenUserDir(); if ( ! linden_user_dir.empty() ) { // gDirUtilp->getLindenUserDir() is whole path, not just Linden name - user_data_path = linden_user_dir; - user_data_path += gDirUtilp->getDirDelimiter(); + user_data_path_cookies = linden_user_dir; + user_data_path_cookies += gDirUtilp->getDirDelimiter(); }; // See if the plugin executable exists @@ -1883,7 +1889,7 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ { media_source = new LLPluginClassMedia(owner); media_source->setSize(default_width, default_height); - media_source->setUserDataPath(user_data_path); + media_source->setUserDataPath(user_data_path_cache, user_data_path_cookies, user_data_path_logs); media_source->setLanguageCode(LLUI::getLanguage()); // collect 'cookies enabled' setting from prefs and send to embedded browser @@ -1901,6 +1907,9 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_ bool media_plugin_debugging_enabled = gSavedSettings.getBOOL("MediaPluginDebugging"); media_source->enableMediaPluginDebugging( media_plugin_debugging_enabled ); + // need to set agent string here before instance created + media_source->setBrowserUserAgent(LLViewerMedia::getCurrentUserAgent()); + media_source->setTarget(target); const std::string plugin_dir = gDirUtilp->getLLPluginDir(); @@ -2426,6 +2435,18 @@ void LLViewerMediaImpl::mouseMove(const LLVector2& texture_coords, MASK mask) } } +void LLViewerMediaImpl::mouseDoubleClick(const LLVector2& texture_coords, MASK mask) +{ + LLPluginClassMedia* mMediaSource = getMediaPlugin(); + if (mMediaSource) + { + S32 x, y; + scaleTextureCoords(texture_coords, &x, &y); + + mouseDoubleClick(x, y, mask); + } +} + ////////////////////////////////////////////////////////////////////////////////////////// void LLViewerMediaImpl::mouseDoubleClick(S32 x, S32 y, MASK mask, S32 button) { @@ -2779,7 +2800,7 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask) { // FIXME: THIS IS SO WRONG. // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it... - if( MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) + if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) { result = true; } @@ -2810,18 +2831,38 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask) if(!result) { - LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); - - result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data); - // Since the viewer internal event dispatching doesn't give us key-up events, simulate one here. - (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data); + result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN, key, mask, native_key_data); } } return result; } +////////////////////////////////////////////////////////////////////////////////////////// +bool LLViewerMediaImpl::handleKeyUpHere(KEY key, MASK mask) +{ + bool result = false; + LLPluginClassMedia* mMediaSource = getMediaPlugin(); + + if (mMediaSource) + { + // FIXME: THIS IS SO WRONG. + // Menu keys should be handled by the menu system and not passed to UI elements, but this is how LLTextEditor and LLLineEditor do it... + if (MASK_CONTROL & mask && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END) + { + result = true; + } + + if (!result) + { + LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData(); + result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP, key, mask, native_key_data); + } + } + + return result; +} ////////////////////////////////////////////////////////////////////////////////////////// bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char) { @@ -3221,13 +3262,13 @@ bool LLViewerMediaImpl::isForcedUnloaded() const { return true; } - + // If this media's class is not supposed to be shown, unload if (!shouldShowBasedOnClass()) { return true; } - + return false; } @@ -3240,19 +3281,19 @@ bool LLViewerMediaImpl::isPlayable() const // All of the forced-unloaded criteria also imply not playable. return false; } - + if(hasMedia()) { // Anything that's already playing is, by definition, playable. return true; } - + if(!mMediaURL.empty()) { // If something has navigated the instance, it's ready to be played. return true; } - + return false; } diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h index 4dff5cde5..0a3485ccf 100644 --- a/indra/newview/llviewermedia.h +++ b/indra/newview/llviewermedia.h @@ -234,6 +234,7 @@ public: void mouseDown(const LLVector2& texture_coords, MASK mask, S32 button = 0); void mouseUp(const LLVector2& texture_coords, MASK mask, S32 button = 0); void mouseMove(const LLVector2& texture_coords, MASK mask); + void mouseDoubleClick(const LLVector2& texture_coords, MASK mask); void mouseDoubleClick(S32 x,S32 y, MASK mask, S32 button = 0); void scrollWheel(S32 x, S32 y, MASK mask); void mouseCapture(); @@ -247,6 +248,7 @@ public: void navigateInternal(); void navigateStop(); bool handleKeyHere(KEY key, MASK mask); + bool handleKeyUpHere(KEY key, MASK mask); bool handleUnicodeCharHere(llwchar uni_char); bool canNavigateForward(); bool canNavigateBack(); @@ -257,6 +259,7 @@ public: void setHomeURL(const std::string& home_url, const std::string& mime_type = LLStringUtil::null) { mHomeURL = home_url; mHomeMimeType = mime_type;}; void clearCache(); void setPageZoomFactor( double factor ); + double getPageZoomFactor() {return mZoomFactor;} std::string getMimeType() { return mMimeType; } void scaleMouse(S32 *mouse_x, S32 *mouse_y); void scaleTextureCoords(const LLVector2& texture_coords, S32 *x, S32 *y); diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp index d99a57cd8..f7f579e94 100644 --- a/indra/newview/llviewermediafocus.cpp +++ b/indra/newview/llviewermediafocus.cpp @@ -351,6 +351,18 @@ BOOL LLViewerMediaFocus::handleKey(KEY key, MASK mask, BOOL called_from_parent) return true; } +BOOL LLViewerMediaFocus::handleKeyUp(KEY key, MASK mask, BOOL called_from_parent) +{ + LLViewerMediaImpl* media_impl = getFocusedMediaImpl(); + if (media_impl) + { + media_impl->handleKeyUpHere(key, mask); + } + return true; +} + + + BOOL LLViewerMediaFocus::handleUnicodeChar(llwchar uni_char, BOOL called_from_parent) { LLViewerMediaImpl* media_impl = getFocusedMediaImpl(); @@ -434,7 +446,6 @@ void LLViewerMediaFocus::update() { mMediaControls.get()->setMediaFace(NULL, 0, NULL); } - } } @@ -603,3 +614,13 @@ LLUUID LLViewerMediaFocus::getControlsMediaID() return LLUUID::null; } + +bool LLViewerMediaFocus::wantsKeyUpKeyDown() const +{ + return true; +} + +bool LLViewerMediaFocus::wantsReturnKey() const +{ + return true; +} diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h index f03dd8751..0b2a64868 100644 --- a/indra/newview/llviewermediafocus.h +++ b/indra/newview/llviewermediafocus.h @@ -56,6 +56,7 @@ public: /*virtual*/ bool getFocus(); /*virtual*/ BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent); + /*virtual*/ BOOL handleKeyUp(KEY key, MASK mask, BOOL called_from_parent); /*virtual*/ BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent); BOOL handleScrollWheel(S32 x, S32 y, S32 clicks); @@ -87,6 +88,10 @@ public: // Return the ID of the media instance the controls are currently attached to (either focus or hover). LLUUID getControlsMediaID(); + // The MoaP object wants keyup and keydown events. Overridden to return true. + virtual bool wantsKeyUpKeyDown() const; + virtual bool wantsReturnKey() const; + protected: /*virtual*/ void onFocusReceived(); /*virtual*/ void onFocusLost(); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4a896285f..1b753104e 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1362,7 +1362,11 @@ BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated) // it's all entered/processed. if (key == KEY_RETURN && mask == MASK_NONE) { - return FALSE; + // RIDER: although, at times some of the controlls (in particular the CEF viewer + // would like to know about the KEYDOWN for an enter key... so ask and pass it along. + LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); + if (keyboard_focus && !keyboard_focus->wantsReturnKey()) + return FALSE; } return gViewerKeyboard.handleKey(key, mask, repeated); @@ -1380,10 +1384,9 @@ BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask) tool_inspectp->keyUp(key, mask); } - return FALSE; + return gViewerKeyboard.handleKeyUp(key, mask); } - void LLViewerWindow::handleScanKey(KEY key, BOOL key_down, BOOL key_up, BOOL key_level) { LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true); @@ -2681,6 +2684,46 @@ void LLViewerWindow::draw() #endif } +// Takes a single keyup event, usually when UI is visible +BOOL LLViewerWindow::handleKeyUp(KEY key, MASK mask) +{ + LLFocusableElement* keyboard_focus = gFocusMgr.getKeyboardFocus(); + + if (keyboard_focus + && !(mask & (MASK_CONTROL | MASK_ALT)) + && !gFocusMgr.getKeystrokesOnly()) + { + // We have keyboard focus, and it's not an accelerator + if (keyboard_focus && keyboard_focus->wantsKeyUpKeyDown()) + { + return keyboard_focus->handleKeyUp(key, mask, FALSE); + } + else if (key < 0x80) + { + // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first. + return (gFocusMgr.getKeyboardFocus() != NULL); + } + } + + if (keyboard_focus) + { + if (keyboard_focus->handleKeyUp(key, mask, FALSE)) + { + LL_DEBUGS() << "LLviewerWindow::handleKeyUp - in 'traverse up' - no loops seen... just called keyboard_focus->handleKeyUp an it returned true" << LL_ENDL; + //LLViewerEventRecorder::instance().logKeyEvent(key, mask); + return TRUE; + } + else { + LL_DEBUGS() << "LLviewerWindow::handleKeyUp - in 'traverse up' - no loops seen... just called keyboard_focus->handleKeyUp an it returned FALSE" << LL_ENDL; + } + } + + // don't pass keys on to world when something in ui has focus + return gFocusMgr.childHasKeyboardFocus(mRootView) + || LLMenuGL::getKeyboardMode() + || (gMenuBarView && gMenuBarView->getHighlightedItem() && gMenuBarView->getHighlightedItem()->isActive()); +} + // Takes a single keydown event, usually when UI is visible BOOL LLViewerWindow::handleKey(KEY key, MASK mask) { @@ -2699,7 +2742,11 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask) && !gFocusMgr.getKeystrokesOnly()) { // We have keyboard focus, and it's not an accelerator - if (key < 0x80) + if (gFocusMgr.getKeyboardFocus() && gFocusMgr.getKeyboardFocus()->wantsKeyUpKeyDown()) + { + return gFocusMgr.getKeyboardFocus()->handleKey(key, mask, FALSE ); + } + else if (key < 0x80) { // Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first. return (gFocusMgr.getKeyboardFocus() != NULL); diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h index 7e47a1a1b..437dd874b 100644 --- a/indra/newview/llviewerwindow.h +++ b/indra/newview/llviewerwindow.h @@ -292,6 +292,7 @@ public: void updateKeyboardFocus(); BOOL handleKey(KEY key, MASK mask); + BOOL handleKeyUp(KEY key, MASK mask); void handleScrollWheel (S32 clicks); // Hide normal UI when a logon fails, re-show everything when logon is attempted again diff --git a/indra/newview/skins/default/xui/en-us/mime_types_mac.xml b/indra/newview/skins/default/xui/en-us/mime_types_mac.xml index 7931e55c0..47a6bf086 100644 --- a/indra/newview/skins/default/xui/en-us/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/en-us/mime_types_mac.xml @@ -7,7 +7,7 @@ none - media_plugin_webkit + media_plugin_cef

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 BBW?fy literal 0 HcmV?d00001 diff --git a/indra/newview/lluserauth.cpp b/indra/newview/lluserauth.cpp index d7d7b0ce8..a2f0ea9e0 100644 --- a/indra/newview/lluserauth.cpp +++ b/indra/newview/lluserauth.cpp @@ -222,10 +222,6 @@ void LLUserAuth::authenticate( // * We append "64" to channel name on 64-bit for systems for the LL stats system to be able to produce independent // crash statistics depending on the architecture std::string chan(LLVersionInfo::getChannel()); - if (chan == "Singularity") - { - chan += " Release"; - } #if defined(_WIN64) || defined(__x86_64__) chan += " 64"; #endif diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc index 4f02238a9..bf112c35e 100644 --- a/indra/newview/res/viewerRes.rc +++ b/indra/newview/res/viewerRes.rc @@ -60,8 +60,8 @@ END // Icon with lowest ID value placed first to ensure application icon // remains consistent on all systems. -IDI_LL_ICON ICON "singularity_icon.ico" -IDI_LCD_LL_ICON ICON "singularity_icon.ico" +IDI_LL_ICON ICON "viewer_icon.ico" +IDI_LCD_LL_ICON ICON "viewer_icon.ico" ///////////////////////////////////////////////////////////////////////////// // diff --git a/indra/newview/singularity_icon.icns b/indra/newview/singularity_icon.icns deleted file mode 100644 index 062da4a330f60473908529aa2dcf4890a4b8a794..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62417 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 0: + suffix = "_"+ ("_".join(suffix.split())) + # the additional_packages mechanism adds more to the installer name (but not to the app name itself) + if 'channel_suffix' in self.args and self.args['channel_suffix']: + suffix+='_'+("_".join(self.args['channel_suffix'].split())) + return suffix + + def installer_base_name(self): + global CHANNEL_VENDOR_BASE + # a standard map of strings for replacing in the templates + substitution_strings = { + 'channel_vendor_base' : '_'.join(CHANNEL_VENDOR_BASE.split()), + 'channel_variant_underscores':self.channel_variant_app_suffix(), + 'version_underscores' : '_'.join(self.args['version']), + 'arch':self.args['arch'] + } + return "%(channel_vendor_base)s%(channel_variant_underscores)s_%(version_underscores)s_%(arch)s" % substitution_strings + + def app_name(self): + global CHANNEL_VENDOR_BASE + channel_type=self.channel_type() + if channel_type == 'release': + app_suffix='Viewer' else: - setting_flags = '--settings settings_%s_%s.xml'\ - % (self.grid(), self.channel_lowerword()) + app_suffix=self.channel_variant() + return CHANNEL_VENDOR_BASE + ' ' + app_suffix - return " ".join((channel_flags, grid_flags, setting_flags)).strip() + def app_name_oneword(self): + return ''.join(self.app_name().split()) def icon_path(self): - return "../../indra/newview/res/" + return "icons/default" - def path_optional(self, src, dst=None): - """ - For a number of our self.path() calls, not only do we want - to deal with the absence of src, we also want to remember - which were present. Return either an empty list (absent) - or a list containing dst (present). Concatenate these - return values to get a list of all libs that are present. - """ - found_files = [] + def extract_names(self,src): try: - found_files = self.path(src, dst) - except RuntimeError, err: - pass - if not found_files: - print "Skipping %s" % dst - return found_files + contrib_file = open(src,'r') + except IOError: + print "Failed to open '%s'" % src + raise + lines = contrib_file.readlines() + contrib_file.close() - def add_extra_libraries(self): - found_libs = [] - config_arg = self.args['configuration'].lower() - if(config_arg == '.'): - config_arg = self.buildtype().lower() - if 'extra_libraries' in self.args and self.args['extra_libraries'] != '': - try: - path_list = self.args['extra_libraries'].strip('"').split('|') - except: - return None - for cur_path in path_list: - if cur_path is None or cur_path == '': - continue - try: - config, file = cur_path.split(' ', 1) - except: - config, file = (None, None) - if(config == 'optimized'): - if(config_arg != 'release' and config_arg != 'relwithdebinfo' and config_arg != 'universal'): - continue - cur_path = file - if(config == 'debug'): - if(config_arg != 'debug'): - continue - cur_path = file - if(cur_path != ''): - if sys.platform == "linux" or sys.platform == "linux2": - found_libs += self.path_optional(cur_path+"*") - else: - found_libs += self.path_optional(cur_path) - return found_libs + # All lines up to and including the first blank line are the file header; skip them + lines.reverse() # so that pop will pull from first to last line + while not re.match("\s*$", lines.pop()) : + pass # do nothing + + # A line that starts with a non-whitespace character is a name; all others describe contributions, so collect the names + names = [] + for line in lines : + if re.match("\S", line) : + names.append(line.rstrip()) + # It's not fair to always put the same people at the head of the list + random.shuffle(names) + return ', '.join(names) class WindowsManifest(ViewerManifest): def is_win64(self): return self.args.get('arch') == "x86_64" - + def final_exe(self): - return self.channel_oneword() + 'Viewer.exe' + return self.app_name_oneword()+".exe" def construct(self): super(WindowsManifest, self).construct() - # the final exe is complicated because we're not sure where it's coming from, - # nor do we have a fixed name for the executable - self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) + + pkgdir = os.path.join(self.args['build'], os.pardir, 'packages') + relpkgdir = os.path.join(pkgdir, "lib", "release") + debpkgdir = os.path.join(pkgdir, "lib", "debug") + + if self.is_packaging_viewer(): + # Find secondlife-bin.exe in the 'configuration' dir, then rename it to the result of final_exe. + self.path(src='%s/secondlife-bin.exe' % self.args['configuration'], dst=self.final_exe()) # Plugin host application self.path2basename(os.path.join(os.pardir, 'llplugin', 'slplugin', self.args['configuration']), "SLplugin.exe") + # Get shared libs from the shared libs staging directory + if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), + dst=""): - # Get llcommon and deps. If missing assume static linkage and continue. - if self.prefix(src=self.args['configuration'], dst=""): + # Get llcommon and deps. If missing assume static linkage and continue. try: self.path('llcommon.dll') + self.path('libapr-1.dll') + self.path('libaprutil-1.dll') + self.path('libapriconv-1.dll') + except RuntimeError, err: print err.message print "Skipping llcommon.dll (assuming llcommon was linked statically)" + # Mesh 3rd party libs needed for auto LOD and collada reading try: - self.path('libapr-1.dll') - self.path('libaprutil-1.dll') - self.path('libapriconv-1.dll') + self.path("glod.dll") except RuntimeError, err: - pass - - # For mesh upload - if not self.is_win64(): - self.path("libcollada14dom22.dll") - - self.path("glod.dll") - - self.add_extra_libraries() - - if(self.prefix(src="..", dst="")): - found_files = self.path("msvc*.dll") - self.end_prefix() - if(not found_files): - try: - if self.prefix(src="msvcrt", dst=""): - self.path("*.dll") - self.path("*.manifest") - self.end_prefix() - except: - pass + print err.message + print "Skipping GLOD library (assumming linked statically)" # Vivox runtimes self.path("SLVoice.exe") @@ -296,15 +290,18 @@ class WindowsManifest(ViewerManifest): self.path("ssleay32.dll") self.path("libeay32.dll") - # For spellchecking + # Hunspell self.path("libhunspell.dll") # For google-perftools tcmalloc allocator. - if not self.is_win64(): - try: + try: + if self.args['configuration'].lower() == 'debug': + self.path('libtcmalloc_minimal-debug.dll') + else: self.path('libtcmalloc_minimal.dll') - except: - print "Skipping libtcmalloc_minimal.dll" + except: + print "Skipping libtcmalloc_minimal.dll" + self.end_prefix() self.path(src="licenses-win32.txt", dst="licenses.txt") @@ -361,7 +358,8 @@ class WindowsManifest(ViewerManifest): self.end_prefix() - self.package_file = 'none' + if not self.is_packaging_viewer(): + self.package_file = "copied_deps" def nsi_file_commands(self, install=True): def wpath(path): @@ -372,7 +370,6 @@ class WindowsManifest(ViewerManifest): result = "" dest_files = [pair[1] for pair in self.file_list if pair[0] and os.path.isfile(pair[1])] - dest_files = list(set(dest_files)) # remove duplicates # sort deepest hierarchy first dest_files.sort(lambda a,b: cmp(a.count(os.path.sep),b.count(os.path.sep)) or cmp(a,b)) dest_files.reverse() @@ -380,15 +377,15 @@ class WindowsManifest(ViewerManifest): for pkg_file in dest_files: rel_file = os.path.normpath(pkg_file.replace(self.get_dst_prefix()+os.path.sep,'')) installed_dir = wpath(os.path.join('$INSTDIR', os.path.dirname(rel_file))) - pkg_file = wpath(os.path.join(os.pardir,os.path.normpath(pkg_file))) + pkg_file = wpath(os.path.normpath(pkg_file)) if installed_dir != out_path: if install: out_path = installed_dir - result += 'SetOutPath "' + out_path + '"\n' + result += 'SetOutPath ' + out_path + '\n' if install: - result += 'File "' + pkg_file + '"\n' + result += 'File ' + pkg_file + '\n' else: - result += 'Delete "' + wpath(os.path.join('$INSTDIR', rel_file)) + '"\n' + result += 'Delete ' + wpath(os.path.join('$INSTDIR', rel_file)) + '\n' # at the end of a delete, just rmdir all the directories if not install: @@ -407,28 +404,6 @@ class WindowsManifest(ViewerManifest): prev = d return result - - def installer_file(self): - if self.is_win64(): - mask = "%s_%s_x86-64_Setup.exe" - else: - mask = "%s_%s_Setup.exe" - return mask % (self.channel_oneword(), '-'.join(self.args['version'])) - - def sign_command(self, *argv): - return [ - "signtool.exe", - "sign", "/v", - "/f",os.environ['VIEWER_SIGNING_KEY'], - "/p",os.environ['VIEWER_SIGNING_PASSWORD'], - "/d","%s" % self.channel(), - "/du",os.environ['VIEWER_SIGNING_URL'], - "/t","http://timestamp.comodoca.com/authenticode" - ] + list(argv) - - - def sign(self, *argv): - subprocess.check_call(self.sign_command(*argv)) def package_finish(self): # a standard map of strings for replacing in the templates @@ -437,66 +412,43 @@ class WindowsManifest(ViewerManifest): 'version_short' : '.'.join(self.args['version'][:-1]), 'version_dashes' : '-'.join(self.args['version']), 'final_exe' : self.final_exe(), - 'grid':self.args['grid'], - 'grid_caps':self.args['grid'].upper(), - # escape quotes becase NSIS doesn't handle them well - 'flags':self.flags_list().replace('"', '$\\"'), - 'channel':self.channel(), - 'channel_oneword':self.channel_oneword(), - 'channel_unique':self.channel_unique(), - 'inst_name':self.channel_oneword() + ' (64 bit)' if self.is_win64() else self.channel_oneword(), - 'installer_file':self.installer_file(), - 'viewer_name': "%s%s" % (self.channel(), " (64 bit)" if self.is_win64() else "" ), - 'install_icon': "install_icon_%s.ico" % self.viewer_branding_id(), - 'uninstall_icon': "uninstall_icon_%s.ico" % self.viewer_branding_id(), + 'flags':'', + 'app_name':self.app_name(), + 'app_name_oneword':self.app_name_oneword() } + installer_file = self.installer_base_name() + '_Setup.exe' + substitution_strings['installer_file'] = installer_file + version_vars = """ !define INSTEXE "%(final_exe)s" !define VERSION "%(version_short)s" !define VERSION_LONG "%(version)s" !define VERSION_DASHES "%(version_dashes)s" """ % substitution_strings - installer_file = "%(installer_file)s" - grid_vars_template = """ - OutFile "%(installer_file)s" - !define VIEWERNAME "%(viewer_name)s" - !define INSTFLAGS "%(flags)s" - !define INSTNAME "%(inst_name)s" - !define SHORTCUT "%(viewer_name)s Viewer" - !define URLNAME "secondlife" - !define INSTALL_ICON "%(install_icon)s" - !define UNINSTALL_ICON "%(uninstall_icon)s" - !define AUTHOR "Linden Research, Inc." #TODO: Hook this up to cmake et al for easier branding. - Caption "${VIEWERNAME} ${VERSION_LONG}" - """ - if 'installer_name' in self.args: - installer_file = self.args['installer_name'] - else: - installer_file = installer_file % substitution_strings - substitution_strings['installer_file'] = installer_file - # Sign the binaries - if 'VIEWER_SIGNING_PASSWORD' in os.environ: - try: - self.sign(self.args['configuration']+"\\"+self.final_exe()) - self.sign(self.args['configuration']+"\\SLPlugin.exe") - self.sign(self.args['configuration']+"\\SLVoice.exe") - except Exception, e: - print "Couldn't sign binaries. Tried to sign %s" % self.args['configuration'] + "\\" + self.final_exe() + "\nException: %s" % e + if self.channel_type() == 'release': + substitution_strings['caption'] = CHANNEL_VENDOR_BASE + else: + substitution_strings['caption'] = self.app_name() + ' ${VERSION}' + + inst_vars_template = """ + OutFile "%(installer_file)s" + !define INSTNAME "%(app_name_oneword)s" + !define SHORTCUT "%(app_name)s" + !define URLNAME "secondlife" + Caption "%(caption)s" + """ tempfile = "secondlife_setup_tmp.nsi" # the following replaces strings in the nsi template # it also does python-style % substitution self.replace_in("installers/windows/installer_template.nsi", tempfile, { "%%VERSION%%":version_vars, - "%%SOURCE%%":os.path.abspath(self.get_src_prefix()), - "%%GRID_VARS%%":grid_vars_template % substitution_strings, + "%%SOURCE%%":self.get_src_prefix(), + "%%INST_VARS%%":inst_vars_template % substitution_strings, "%%INSTALL_FILES%%":self.nsi_file_commands(True), - "%%DELETE_FILES%%":self.nsi_file_commands(False), - "%%INSTALLDIR%%":"%s\\%s" % ('$PROGRAMFILES64' if self.is_win64() else '$PROGRAMFILES', self.channel_oneword()), - "%%WIN64_BIN_BUILD%%":"!define WIN64_BIN_BUILD 1" if self.is_win64() else "", - }) + "%%DELETE_FILES%%":self.nsi_file_commands(False)}) # We use the Unicode version of NSIS, available from # http://www.scratchpaper.com/ @@ -511,29 +463,63 @@ class WindowsManifest(ViewerManifest): except: NSIS_path = os.environ['ProgramFiles(X86)'] + '\\NSIS\\Unicode\\makensis.exe' self.run_command([proper_windows_path(NSIS_path),self.dst_path_of(tempfile)]) + + # self.remove(self.dst_path_of(tempfile)) - - # Sign the installer - # We're probably not on a build machine, but maybe we want to sign - if 'VIEWER_SIGNING_PASSWORD' in os.environ: - try: - self.sign(self.args['configuration'] + "\\" + substitution_strings['installer_file']) - except Exception, e: - print "Couldn't sign windows installer. Tried to sign %s" % self.args['configuration'] + "\\" + substitution_strings['installer_file'] + "\nException: %s" % e + # If we're on a build machine, sign the code using our Authenticode certificate. JC + sign_py = os.path.expandvars("${SIGN}") + if not sign_py or sign_py == "${SIGN}": + sign_py = 'C:\\buildscripts\\code-signing\\sign.py' else: - # If we're on a build machine, sign the code using our Authenticode certificate. JC - sign_py = os.path.expandvars("{SIGN_PY}") - if sign_py == "" or sign_py == "{SIGN_PY}": - sign_py = 'C:\\buildscripts\\code-signing\\sign.py' - if os.path.exists(sign_py): - self.run_command('python ' + sign_py + ' ' + self.dst_path_of(installer_file)) - else: - print "Skipping code signing,", sign_py, "does not exist" - + sign_py = sign_py.replace('\\', '\\\\\\\\') + python = os.path.expandvars("${PYTHON}") + if not python or python == "${PYTHON}": + python = 'python' + if os.path.exists(sign_py): + self.run_command("%s %s %s" % (python, sign_py, self.dst_path_of(installer_file).replace('\\', '\\\\\\\\'))) + else: + print "Skipping code signing,", sign_py, "does not exist" self.created_path(self.dst_path_of(installer_file)) self.package_file = installer_file +class Windows_i686_Manifest(WindowsManifest): + def construct(self): + super(Windows_i686_Manifest, self).construct() + + # Get shared libs from the shared libs staging directory + if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), + dst=""): + + # Get fmod studio dll, continue if missing + try: + if self.args['configuration'].lower() == 'debug': + self.path("fmodL.dll") + else: + self.path("fmod.dll") + except: + print "Skipping fmodstudio audio library(assuming other audio engine)" + self.end_prefix() + + +class Windows_x86_64_Manifest(WindowsManifest): + def construct(self): + super(Windows_x86_64_Manifest, self).construct() + + # Get shared libs from the shared libs staging directory + if self.prefix(src=os.path.join(os.pardir, 'sharedlibs', self.args['configuration']), + dst=""): + + # Get fmodstudio dll, continue if missing + try: + if self.args['configuration'].lower() == 'debug': + self.path("fmodL64.dll") + else: + self.path("fmod64.dll") + except: + print "Skipping fmodstudio audio library(assuming other audio engine)" + self.end_prefix() + class DarwinManifest(ViewerManifest): def construct(self): # copy over the build result (this is a no-op if run within the xcode script) @@ -906,9 +892,9 @@ class LinuxManifest(ViewerManifest): self.run_command("find %(d)r/bin %(d)r/lib* -type f | xargs -d '\n' --no-run-if-empty strip --strip-unneeded" % {'d': self.get_dst_prefix()} ) self.run_command("find %(d)r/bin %(d)r/lib* -type f -not -name \\*.so | xargs -d '\n' --no-run-if-empty strip -s" % {'d': self.get_dst_prefix()} ) -class Linux_i686Manifest(LinuxManifest): +class Linux_i686_Manifest(LinuxManifest): def construct(self): - super(Linux_i686Manifest, self).construct() + super(Linux_i686_Manifest, self).construct() # llcommon if not self.path("../llcommon/libllcommon.so", "lib/libllcommon.so"): @@ -964,9 +950,9 @@ class Linux_i686Manifest(LinuxManifest): self.path("libvivoxsdk.so") self.end_prefix("lib") -class Linux_x86_64Manifest(LinuxManifest): +class Linux_x86_64_Manifest(LinuxManifest): def construct(self): - super(Linux_x86_64Manifest, self).construct() + super(Linux_x86_64_Manifest, self).construct() # llcommon if not self.path("../llcommon/libllcommon.so", "lib64/libllcommon.so"): From f36d4eb03a0cc9d68bf792435e2f96210dffbd2d Mon Sep 17 00:00:00 2001 From: Drake Arconis Date: Sat, 16 Jan 2016 12:49:25 -0500 Subject: [PATCH 05/19] Installer rework WIP --- indra/cmake/Copy3rdPartyLibs.cmake | 4 +- indra/newview/CMakeLists.txt | 4 +- indra/newview/gpu_table.txt | 2 + .../windows/FILES_ARE_UNICODE_UTF-16LE.txt | 6 - .../installers/windows/install_icon.ico | Bin 25214 -> 142520 bytes .../windows/install_icon_singularity.BMP | Bin 262198 -> 0 bytes .../windows/install_icon_singularity.ico | Bin 142520 -> 0 bytes .../windows/install_icon_snowglobe.BMP | Bin 262198 -> 0 bytes .../windows/install_icon_snowglobe.ico | Bin 138241 -> 0 bytes .../installers/windows/install_welcome.bmp | Bin 0 -> 52576 bytes .../installers/windows/installer_template.nsi | 1278 +++++++---------- indra/newview/installers/windows/lang_da.nsi | 56 + indra/newview/installers/windows/lang_de.nsi | Bin 8260 -> 3899 bytes .../newview/installers/windows/lang_en-us.nsi | Bin 7954 -> 3688 bytes indra/newview/installers/windows/lang_es.nsi | Bin 7846 -> 3945 bytes indra/newview/installers/windows/lang_fr.nsi | Bin 8114 -> 4080 bytes indra/newview/installers/windows/lang_it.nsi | Bin 7438 -> 3762 bytes indra/newview/installers/windows/lang_ja.nsi | Bin 6302 -> 4306 bytes indra/newview/installers/windows/lang_pl.nsi | 56 + .../newview/installers/windows/lang_pt-br.nsi | Bin 7832 -> 3953 bytes indra/newview/installers/windows/lang_ru.nsi | 56 + indra/newview/installers/windows/lang_tr.nsi | 56 + indra/newview/installers/windows/lang_zh.nsi | Bin 5554 -> 3758 bytes .../installers/windows/uninstall_icon.BMP | Bin 262198 -> 260154 bytes .../installers/windows/uninstall_icon.ico | Bin 25214 -> 367994 bytes .../windows/uninstall_icon_singularity.BMP | Bin 260154 -> 0 bytes .../windows/uninstall_icon_singularity.ico | Bin 367994 -> 0 bytes .../windows/uninstall_icon_snowglobe.BMP | Bin 260154 -> 0 bytes .../windows/uninstall_icon_snowglobe.ico | Bin 367994 -> 0 bytes .../installers/windows/uninstall_welcome.bmp | Bin 0 -> 52576 bytes indra/newview/viewer_manifest.py | 60 +- 31 files changed, 797 insertions(+), 781 deletions(-) delete mode 100644 indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt delete mode 100644 indra/newview/installers/windows/install_icon_singularity.BMP delete mode 100644 indra/newview/installers/windows/install_icon_singularity.ico delete mode 100644 indra/newview/installers/windows/install_icon_snowglobe.BMP delete mode 100644 indra/newview/installers/windows/install_icon_snowglobe.ico create mode 100644 indra/newview/installers/windows/install_welcome.bmp create mode 100644 indra/newview/installers/windows/lang_da.nsi create mode 100644 indra/newview/installers/windows/lang_pl.nsi create mode 100644 indra/newview/installers/windows/lang_ru.nsi create mode 100644 indra/newview/installers/windows/lang_tr.nsi delete mode 100644 indra/newview/installers/windows/uninstall_icon_singularity.BMP delete mode 100644 indra/newview/installers/windows/uninstall_icon_singularity.ico delete mode 100644 indra/newview/installers/windows/uninstall_icon_snowglobe.BMP delete mode 100644 indra/newview/installers/windows/uninstall_icon_snowglobe.ico create mode 100644 indra/newview/installers/windows/uninstall_welcome.bmp diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake index 3632d51bf..3ec8b7847 100644 --- a/indra/cmake/Copy3rdPartyLibs.cmake +++ b/indra/cmake/Copy3rdPartyLibs.cmake @@ -54,10 +54,10 @@ if(WINDOWS) libhunspell.dll ) - if(USE_TCMALLOC) + if(NOT DISABLE_TCMALLOC) set(debug_files ${debug_files} libtcmalloc_minimal-debug.dll) set(release_files ${release_files} libtcmalloc_minimal.dll) - endif(USE_TCMALLOC) + endif(NOT DISABLE_TCMALLOC) if (FMODSTUDIO) if(WORD_SIZE STREQUAL 64) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 3297819c6..5d43cfa2d 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -1461,7 +1461,7 @@ if (WINDOWS) # In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py # and have the build deps get tracked *please* tell me about it. - if(USE_TCMALLOC) + if(NOT DISABLE_TCMALLOC) # Configure a var for tcmalloc location, if used. # Note the need to specify multiple names explicitly. set(GOOGLE_PERF_TOOLS_SOURCE @@ -1469,7 +1469,7 @@ if (WINDOWS) ${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll ${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll ) - endif(USE_TCMALLOC) + endif(NOT DISABLE_TCMALLOC) set(COPY_INPUT_DEPENDENCIES # The following commented dependencies are determined at variably at build time. Can't do this here. diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt index 45beb85a5..32450b609 100644 --- a/indra/newview/gpu_table.txt +++ b/indra/newview/gpu_table.txt @@ -433,6 +433,8 @@ NVIDIA GTX 750 .*NVIDIA .*GTX *75.* 3 1 NVIDIA GTX 760 .*NVIDIA .*GTX *76.* 3 1 NVIDIA GTX 770 .*NVIDIA .*GTX *77.* 3 1 NVIDIA GTX 780 .*NVIDIA .*GTX *78.* 3 1 +NVIDIA GTX 970 .*NVIDIA .*GTX *97.* 3 1 +NVIDIA GTX 980 .*NVIDIA .*GTX *98.* 3 1 NVIDIA GTX TITAN .*NVIDIA .*GTX *TITAN.* 3 1 NVIDIA GT 7xxM .*NVIDIA .*GT *7.* 3 1 NVIDIA C51 .*NVIDIA .*C51.* 0 1 diff --git a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt b/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt deleted file mode 100644 index 30f934911..000000000 --- a/indra/newview/installers/windows/FILES_ARE_UNICODE_UTF-16LE.txt +++ /dev/null @@ -1,6 +0,0 @@ -The language files in this directory are Unicode (Little-Endian) format, also known as UTF-16 LE. - -This is the format required for NSIS Unicode. See http://www.scratchpaper.com/ for details. - -James Cook -September 2008 diff --git a/indra/newview/installers/windows/install_icon.ico b/indra/newview/installers/windows/install_icon.ico index 1e00530c9016b16548de6890ab5562bbe2cbbe1d..84a455a22655edbe11babe34be1057c31ff7b550 100644 GIT binary patch literal 142520 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 DP*RSk literal 25214 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%0AucO0?&25DhCpIehpvSUoPC+#eHcn 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 diff --git a/indra/newview/installers/windows/install_icon_singularity.ico b/indra/newview/installers/windows/install_icon_singularity.ico deleted file mode 100644 index 84a455a22655edbe11babe34be1057c31ff7b550..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142520 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 DP*RSk diff --git a/indra/newview/installers/windows/install_icon_snowglobe.BMP b/indra/newview/installers/windows/install_icon_snowglobe.BMP deleted file mode 100644 index 86817c541187e2574b02a217d27170eb6675253b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262198 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