summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.qmake.conf2
-rw-r--r--config.tests/common/avx512/avx512.cpp97
-rw-r--r--config.tests/common/avx512/avx512.pro12
-rw-r--r--config.tests/common/xlocalescanprint/qglobal.h (renamed from config.tests/x11/xinput/xinput.cpp)18
-rw-r--r--config.tests/common/xlocalescanprint/xlocalescanprint.cpp (renamed from config.tests/x11/xvideo/xvideo.cpp)28
-rw-r--r--config.tests/common/xlocalescanprint/xlocalescanprint.pro3
-rwxr-xr-xconfig.tests/unix/arch.test6
-rwxr-xr-xconfig.tests/unix/compile.test11
-rw-r--r--config.tests/unix/doubleconversion/doubleconversion.cpp (renamed from config.tests/x11/xinerama/xinerama.cpp)8
-rw-r--r--config.tests/unix/doubleconversion/doubleconversion.pro4
-rw-r--r--config.tests/x11/xinerama/xinerama.pro4
-rw-r--r--config.tests/x11/xinput/xinput.pro6
-rw-r--r--config.tests/x11/xvideo/xvideo.pro4
-rwxr-xr-xconfigure326
-rw-r--r--examples/network/network.pro16
-rw-r--r--examples/widgets/mac/qmaccocoaviewcontainer/main.mm2
-rw-r--r--examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro2
-rw-r--r--examples/widgets/mac/qmacnativewidget/main.mm2
-rw-r--r--examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro2
-rw-r--r--examples/widgets/mainwindows/mainwindow/colorswatch.cpp2
-rw-r--r--examples/widgets/mainwindows/mainwindow/colorswatch.h2
-rw-r--r--examples/widgets/mainwindows/menus/mainwindow.cpp2
-rw-r--r--examples/widgets/mainwindows/menus/mainwindow.h2
-rw-r--r--examples/widgets/tools/tools.pro8
-rw-r--r--lib/fonts/DejaVuSans-Bold.ttfbin466696 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSans-BoldOblique.ttfbin441736 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSans-Oblique.ttfbin434576 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSans.ttfbin493564 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono-Bold.ttfbin229460 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono-BoldOblique.ttfbin177780 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono-Oblique.ttfbin184896 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSansMono.ttfbin237788 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif-Bold.ttfbin201516 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif-BoldOblique.ttfbin180948 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif-Oblique.ttfbin179872 -> 0 bytes
-rw-r--r--lib/fonts/DejaVuSerif.ttfbin210416 -> 0 bytes
-rw-r--r--lib/fonts/README21
-rw-r--r--lib/fonts/UTBI____.pfa1172
-rw-r--r--lib/fonts/UTB_____.pfa1134
-rw-r--r--lib/fonts/UTI_____.pfa1165
-rw-r--r--lib/fonts/UTRG____.pfa1126
-rw-r--r--lib/fonts/Vera.ttfbin65932 -> 0 bytes
-rw-r--r--lib/fonts/VeraBI.ttfbin63208 -> 0 bytes
-rw-r--r--lib/fonts/VeraBd.ttfbin58716 -> 0 bytes
-rw-r--r--lib/fonts/VeraIt.ttfbin63684 -> 0 bytes
-rw-r--r--lib/fonts/VeraMoBI.ttfbin55032 -> 0 bytes
-rw-r--r--lib/fonts/VeraMoBd.ttfbin49052 -> 0 bytes
-rw-r--r--lib/fonts/VeraMoIt.ttfbin54508 -> 0 bytes
-rw-r--r--lib/fonts/VeraMono.ttfbin49224 -> 0 bytes
-rw-r--r--lib/fonts/VeraSe.ttfbin60280 -> 0 bytes
-rw-r--r--lib/fonts/VeraSeBd.ttfbin58736 -> 0 bytes
-rw-r--r--lib/fonts/c0419bt_.pfbbin40766 -> 0 bytes
-rw-r--r--lib/fonts/c0582bt_.pfbbin39511 -> 0 bytes
-rw-r--r--lib/fonts/c0583bt_.pfbbin40008 -> 0 bytes
-rw-r--r--lib/fonts/c0611bt_.pfbbin39871 -> 0 bytes
-rw-r--r--lib/fonts/c0632bt_.pfbbin33799 -> 0 bytes
-rw-r--r--lib/fonts/c0633bt_.pfbbin35229 -> 0 bytes
-rw-r--r--lib/fonts/c0648bt_.pfbbin34869 -> 0 bytes
-rw-r--r--lib/fonts/c0649bt_.pfbbin35118 -> 0 bytes
-rw-r--r--lib/fonts/cour.pfa1954
-rw-r--r--lib/fonts/courb.pfa1966
-rw-r--r--lib/fonts/courbi.pfa1940
-rw-r--r--lib/fonts/couri.pfa1893
-rw-r--r--lib/fonts/cursor.pfa954
-rw-r--r--lib/fonts/dejavu_sans_11_50.qpf2bin405944 -> 0 bytes
-rw-r--r--lib/fonts/fixed_120_50.qpfbin3109 -> 0 bytes
-rw-r--r--lib/fonts/fixed_70_50.qpfbin2567 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_50.qpfbin3046 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_50i.qpfbin3052 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_75.qpfbin3040 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_100_75i.qpfbin3081 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_50.qpfbin3301 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_50i.qpfbin3560 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_75.qpfbin3326 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_120_75i.qpfbin3759 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_50.qpfbin3860 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_50i.qpfbin4208 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_75.qpfbin4035 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_140_75i.qpfbin4498 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_50.qpfbin5179 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_50i.qpfbin5778 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_75.qpfbin5712 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_180_75i.qpfbin5977 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_50.qpfbin7691 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_50i.qpfbin8333 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_75.qpfbin7912 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_240_75i.qpfbin8588 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_50.qpfbin2735 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_50i.qpfbin2742 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_75.qpfbin2745 -> 0 bytes
-rw-r--r--lib/fonts/helvetica_80_75i.qpfbin2750 -> 0 bytes
-rw-r--r--lib/fonts/japanese_230_50.qpfbin263331 -> 0 bytes
-rw-r--r--lib/fonts/l047013t.pfa1346
-rw-r--r--lib/fonts/l047016t.pfa1356
-rw-r--r--lib/fonts/l047033t.pfa1353
-rw-r--r--lib/fonts/l047036t.pfa1361
-rw-r--r--lib/fonts/l048013t.pfa1233
-rw-r--r--lib/fonts/l048016t.pfa1269
-rw-r--r--lib/fonts/l048033t.pfa1267
-rw-r--r--lib/fonts/l048036t.pfa1260
-rw-r--r--lib/fonts/l049013t.pfa1598
-rw-r--r--lib/fonts/l049016t.pfa1582
-rw-r--r--lib/fonts/l049033t.pfa1735
-rw-r--r--lib/fonts/l049036t.pfa1613
-rw-r--r--lib/fonts/micro_40_50.qpfbin1602 -> 0 bytes
-rw-r--r--lib/fonts/unifont_160_50.qpfbin1215089 -> 0 bytes
-rw-r--r--mkspecs/common/g++-base.conf4
-rw-r--r--mkspecs/common/gcc-base.conf9
-rw-r--r--mkspecs/common/qcc-base-qnx.conf2
-rw-r--r--mkspecs/devices/linux-imx53qsb-g++/qmake.conf2
-rw-r--r--mkspecs/features/configure.prf4
-rw-r--r--mkspecs/features/device_config.prf15
-rw-r--r--mkspecs/features/qt_module_headers.prf2
-rw-r--r--mkspecs/features/qt_tool.prf56
-rw-r--r--mkspecs/features/resources.prf12
-rw-r--r--mkspecs/features/simd.prf41
-rw-r--r--mkspecs/linux-icc/qmake.conf11
-rw-r--r--mkspecs/macx-icc/qmake.conf7
-rw-r--r--mkspecs/win32-g++/qmake.conf4
-rw-r--r--mkspecs/win32-icc/qmake.conf7
-rw-r--r--qmake/Makefile.win322
-rw-r--r--qmake/doc/src/qmake-manual.qdoc2
-rw-r--r--qmake/library/qmakeevaluator.cpp2
-rw-r--r--qmake/library/qmakeglobals.cpp7
-rw-r--r--qmake/library/qmakeglobals.h1
-rw-r--r--qmake/option.cpp3
-rw-r--r--qmake/qmake-aux.pro11
-rw-r--r--qmake/qmake-docs.pro2
-rw-r--r--qtbase.pro11
-rw-r--r--src/3rdparty/double-conversion/LICENSE26
-rw-r--r--src/3rdparty/double-conversion/README8
-rw-r--r--src/3rdparty/double-conversion/bignum-dtoa.cc641
-rw-r--r--src/3rdparty/double-conversion/bignum-dtoa.h84
-rw-r--r--src/3rdparty/double-conversion/bignum.cc766
-rw-r--r--src/3rdparty/double-conversion/bignum.h145
-rw-r--r--src/3rdparty/double-conversion/cached-powers.cc178
-rw-r--r--src/3rdparty/double-conversion/cached-powers.h64
-rw-r--r--src/3rdparty/double-conversion/diy-fp.cc57
-rw-r--r--src/3rdparty/double-conversion/diy-fp.h118
-rw-r--r--src/3rdparty/double-conversion/double-conversion.cc975
-rw-r--r--src/3rdparty/double-conversion/double-conversion.pri24
-rw-r--r--src/3rdparty/double-conversion/fast-dtoa.cc665
-rw-r--r--src/3rdparty/double-conversion/fast-dtoa.h88
-rw-r--r--src/3rdparty/double-conversion/fixed-dtoa.cc404
-rw-r--r--src/3rdparty/double-conversion/fixed-dtoa.h56
-rw-r--r--src/3rdparty/double-conversion/ieee.h402
-rw-r--r--src/3rdparty/double-conversion/include/double-conversion/double-conversion.h543
-rw-r--r--src/3rdparty/double-conversion/include/double-conversion/utils.h330
-rw-r--r--src/3rdparty/double-conversion/strtod.cc555
-rw-r--r--src/3rdparty/double-conversion/strtod.h45
-rw-r--r--src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch33
-rw-r--r--src/3rdparty/sqlite/sqlite3.c4
-rw-r--r--src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java17
-rw-r--r--src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java3
-rw-r--r--src/corelib/global/qcompilerdetection.h31
-rw-r--r--src/corelib/global/qendian.h8
-rw-r--r--src/corelib/global/qglobal.cpp23
-rw-r--r--src/corelib/global/qhooks.cpp11
-rw-r--r--src/corelib/global/qhooks_p.h1
-rw-r--r--src/corelib/global/qlogging.cpp8
-rw-r--r--src/corelib/global/qnamespace.h4
-rw-r--r--src/corelib/global/qnamespace.qdoc23
-rw-r--r--src/corelib/global/qnumeric_p.h111
-rw-r--r--src/corelib/global/qsystemdetection.h65
-rw-r--r--src/corelib/global/qtypeinfo.h14
-rw-r--r--src/corelib/io/io.pri10
-rw-r--r--src/corelib/io/qdatastream.cpp1
-rw-r--r--src/corelib/io/qdatastream.h5
-rw-r--r--src/corelib/io/qiodevice.cpp2
-rw-r--r--src/corelib/io/qprocess.cpp2
-rw-r--r--src/corelib/io/qprocess_unix.cpp25
-rw-r--r--src/corelib/io/qsettings.cpp26
-rw-r--r--src/corelib/io/qsettings.h5
-rw-r--r--src/corelib/io/qsettings_win.cpp120
-rw-r--r--src/corelib/io/qstandardpaths.cpp16
-rw-r--r--src/corelib/io/qstandardpaths_ios.mm133
-rw-r--r--src/corelib/io/qstandardpaths_mac.mm204
-rw-r--r--src/corelib/kernel/qcoreapplication.cpp6
-rw-r--r--src/corelib/kernel/qcoreevent.h2
-rw-r--r--src/corelib/kernel/qmetaobjectbuilder.cpp402
-rw-r--r--src/corelib/plugin/qfactoryloader.cpp106
-rw-r--r--src/corelib/plugin/qfactoryloader_p.h21
-rw-r--r--src/corelib/plugin/qlibrary.cpp4
-rw-r--r--src/corelib/plugin/qlibrary_p.h25
-rw-r--r--src/corelib/plugin/qpluginloader.cpp15
-rw-r--r--src/corelib/plugin/qpluginloader.h15
-rw-r--r--src/corelib/tools/qbytearray.cpp55
-rw-r--r--src/corelib/tools/qbytearray.h23
-rw-r--r--src/corelib/tools/qdoublescanprint_p.h150
-rw-r--r--src/corelib/tools/qlocale.cpp161
-rw-r--r--src/corelib/tools/qlocale_p.h11
-rw-r--r--src/corelib/tools/qlocale_tools.cpp2705
-rw-r--r--src/corelib/tools/qlocale_tools_p.h7
-rw-r--r--src/corelib/tools/qregexp.h5
-rw-r--r--src/corelib/tools/qringbuffer.cpp89
-rw-r--r--src/corelib/tools/qringbuffer_p.h11
-rw-r--r--src/corelib/tools/qsharedpointer.cpp11
-rw-r--r--src/corelib/tools/qsharedpointer.h2
-rw-r--r--src/corelib/tools/qsharedpointer_impl.h42
-rw-r--r--src/corelib/tools/qsimd_p.h1
-rw-r--r--src/corelib/tools/qstring.h20
-rw-r--r--src/corelib/tools/qversionnumber.h2
-rw-r--r--src/corelib/tools/tools.pri9
-rw-r--r--src/dbus/qdbusconnection.cpp4
-rw-r--r--src/dbus/qdbusconnectioninterface.cpp8
-rw-r--r--src/dbus/qdbusintegrator.cpp12
-rw-r--r--src/gui/accessible/accessible.pri6
-rw-r--r--src/gui/gui.pro2
-rw-r--r--src/gui/image/qicon.cpp50
-rw-r--r--src/gui/image/qicon.h3
-rw-r--r--src/gui/image/qiconengine.cpp17
-rw-r--r--src/gui/image/qiconengine.h3
-rw-r--r--src/gui/image/qiconloader.cpp168
-rw-r--r--src/gui/image/qiconloader_p.h5
-rw-r--r--src/gui/image/qimage.h4
-rw-r--r--src/gui/image/qpixmapcache.cpp10
-rw-r--r--src/gui/image/qpixmapcache.h1
-rw-r--r--src/gui/kernel/qdrag.cpp19
-rw-r--r--src/gui/kernel/qdrag.h2
-rw-r--r--src/gui/kernel/qevent.cpp3
-rw-r--r--src/gui/kernel/qevent.h9
-rw-r--r--src/gui/kernel/qgenericplugin.cpp4
-rw-r--r--src/gui/kernel/qgenericplugin.h5
-rw-r--r--src/gui/kernel/qguiapplication.cpp32
-rw-r--r--src/gui/kernel/qguiapplication.h4
-rw-r--r--src/gui/kernel/qguiapplication_p.h1
-rw-r--r--src/gui/kernel/qinputdevicemanager_p.h3
-rw-r--r--src/gui/kernel/qplatformdrag.cpp14
-rw-r--r--src/gui/kernel/qplatformdrag.h1
-rw-r--r--src/gui/kernel/qplatformintegration.cpp10
-rw-r--r--src/gui/kernel/qplatformintegrationfactory.cpp14
-rw-r--r--src/gui/kernel/qplatformtheme.cpp35
-rw-r--r--src/gui/kernel/qplatformtheme.h1
-rw-r--r--src/gui/kernel/qsimpledrag.cpp8
-rw-r--r--src/gui/kernel/qsimpledrag_p.h1
-rw-r--r--src/gui/kernel/qwindow.cpp66
-rw-r--r--src/gui/opengl/qtriangulator_p.h11
-rw-r--r--src/gui/text/qrawfont.cpp1
-rw-r--r--src/gui/text/qtexthtmlparser.cpp3
-rw-r--r--src/gui/text/qtextimagehandler.cpp1
-rw-r--r--src/gui/util/qvalidator.cpp7
-rw-r--r--src/network/access/access.pri2
-rw-r--r--src/network/access/qnetworkreplyhttpimpl.cpp2
-rw-r--r--src/network/access/qnetworkreplyimpl.cpp2
-rw-r--r--src/network/kernel/qnetworkinterface.cpp46
-rw-r--r--src/network/kernel/qnetworkinterface.h2
-rw-r--r--src/network/kernel/qnetworkinterface_p.h3
-rw-r--r--src/network/kernel/qnetworkinterface_unix.cpp58
-rw-r--r--src/network/kernel/qnetworkinterface_win.cpp43
-rw-r--r--src/network/kernel/qnetworkinterface_winrt.cpp14
-rw-r--r--src/network/socket/qabstractsocket.cpp70
-rw-r--r--src/network/socket/qabstractsocket.h2
-rw-r--r--src/network/socket/qabstractsocket_p.h2
-rw-r--r--src/network/socket/qnativesocketengine_p.h4
-rw-r--r--src/network/socket/qnativesocketengine_unix.cpp26
-rw-r--r--src/network/socket/qnativesocketengine_win.cpp6
-rw-r--r--src/network/ssl/qsslsocket_mac.cpp7
-rw-r--r--src/platformsupport/cglconvenience/cglconvenience.mm2
-rw-r--r--src/platformsupport/cglconvenience/cglconvenience.pri4
-rw-r--r--src/platformsupport/clipboard/qmacmime.mm7
-rw-r--r--src/platformsupport/devicediscovery/qdevicediscovery_static.cpp98
-rw-r--r--src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp6
-rw-r--r--src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp1
-rw-r--r--src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm4
-rw-r--r--src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp1
-rw-r--r--src/platformsupport/input/evdevtablet/evdevtablet.pri6
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtablethandler.cpp (renamed from src/platformsupport/input/evdevtablet/qevdevtablet.cpp)203
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h (renamed from src/platformsupport/input/evdevtablet/qevdevtablet_p.h)19
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp122
-rw-r--r--src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h (renamed from src/widgets/styles/qgtkglobal_p.h)54
-rw-r--r--src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp1
-rw-r--r--src/platformsupport/themes/genericunix/qgenericunixthemes.cpp2
-rw-r--r--src/plugins/generic/evdevtablet/main.cpp12
-rw-r--r--src/plugins/generic/tuiotouch/qtuiohandler.cpp1
-rw-r--r--src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp2
-rw-r--r--src/plugins/platforms/cocoa/cocoa.pro2
-rw-r--r--src/plugins/platforms/cocoa/main.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibility.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibility.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplication.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoabackingstore.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoacursor.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoadrag.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaglcontext.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoahelpers.mm40
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoakeymapper.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenubar.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm4
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuloader.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoanativeinterface.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoaservices.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.mm2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.h2
-rw-r--r--src/plugins/platforms/cocoa/qcocoawindow.mm16
-rw-r--r--src/plugins/platforms/cocoa/qmacclipboard.h2
-rw-r--r--src/plugins/platforms/cocoa/qmacdefines_mac.h2
-rw-r--r--src/plugins/platforms/cocoa/qmultitouch_mac_p.h2
-rw-r--r--src/plugins/platforms/cocoa/qnsview.h2
-rw-r--r--src/plugins/platforms/cocoa/qnswindowdelegate.h2
-rw-r--r--src/plugins/platforms/cocoa/qt_mac_p.h4
-rw-r--r--src/plugins/platforms/eglfs/qeglfscursor.cpp1
-rw-r--r--src/plugins/platforms/ios/qiosmenu.h3
-rw-r--r--src/plugins/platforms/ios/qiosmenu.mm38
-rw-r--r--src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp1
-rw-r--r--src/plugins/platforms/mirclient/qmirclientglcontext.cpp10
-rw-r--r--src/plugins/platforms/windows/qwindowsdrag.cpp11
-rw-r--r--src/plugins/platforms/windows/qwindowsdrag.h4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase.cpp1
-rw-r--r--src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp4
-rw-r--r--src/plugins/platforms/windows/qwindowsfontengine.cpp1
-rw-r--r--src/plugins/platforms/windows/qwindowsintegration.cpp9
-rw-r--r--src/plugins/platforms/windows/qwindowsmousehandler.cpp1
-rw-r--r--src/plugins/platforms/xcb/qxcbkeyboard.cpp2
-rw-r--r--src/plugins/platforms/xcb/qxcbscreen.cpp2
-rw-r--r--src/plugins/printsupport/cocoa/cocoa.pro2
-rw-r--r--src/printsupport/dialogs/dialogs.pri4
-rw-r--r--src/printsupport/dialogs/qpagesetupdialog_mac.mm2
-rw-r--r--src/printsupport/dialogs/qprintdialog_mac.mm2
-rw-r--r--src/testlib/qplaintestlogger.cpp9
-rw-r--r--src/testlib/qtestblacklist.cpp7
-rw-r--r--src/tools/moc/preprocessor.cpp5
-rw-r--r--src/widgets/dialogs/qfilesystemmodel.cpp15
-rw-r--r--src/widgets/dialogs/qfilesystemmodel.h1
-rw-r--r--src/widgets/dialogs/qmessagebox.cpp6
-rw-r--r--src/widgets/doc/images/gtk-calendarwidget.pngbin16761 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-checkbox.pngbin2323 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-combobox.pngbin2730 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-dateedit.pngbin2163 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-datetimeedit.pngbin2923 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-dial.pngbin7221 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-doublespinbox.pngbin2325 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-fontcombobox.pngbin3022 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-frame.pngbin2340 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-groupbox.pngbin6650 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-horizontalscrollbar.pngbin1701 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-label.pngbin1582 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-lcdnumber.pngbin1193 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-lineedit.pngbin2528 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-listview.pngbin8493 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-progressbar.pngbin2228 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-pushbutton.pngbin2153 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-radiobutton.pngbin3142 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-slider.pngbin1359 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-spinbox.pngbin2078 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-tableview.pngbin8364 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-tabwidget.pngbin8179 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-textedit.pngbin12641 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-timeedit.pngbin2621 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-toolbox.pngbin4240 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-toolbutton.pngbin2260 -> 0 bytes
-rw-r--r--src/widgets/doc/images/gtk-treeview.pngbin9722 -> 0 bytes
-rw-r--r--src/widgets/doc/snippets/code/doc_src_stylesheet.cpp4
-rw-r--r--src/widgets/doc/snippets/macmainwindow.mm2
-rw-r--r--src/widgets/doc/snippets/qmacnativewidget/main.mm2
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc142
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/gallery.qdoc4
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/styles.qdoc2
-rw-r--r--src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc22
-rw-r--r--src/widgets/graphicsview/qgraphicsscene.cpp1
-rw-r--r--src/widgets/itemviews/qfileiconprovider.cpp13
-rw-r--r--src/widgets/itemviews/qitemeditorfactory.cpp3
-rw-r--r--src/widgets/kernel/mac.pri4
-rw-r--r--src/widgets/kernel/qapplication.cpp1
-rw-r--r--src/widgets/kernel/qgesturemanager.cpp2
-rw-r--r--src/widgets/kernel/qwidget.cpp35
-rw-r--r--src/widgets/kernel/qwidgetwindow.cpp8
-rw-r--r--src/widgets/styles/qgtk2painter.cpp699
-rw-r--r--src/widgets/styles/qgtk2painter_p.h100
-rw-r--r--src/widgets/styles/qgtkpainter.cpp76
-rw-r--r--src/widgets/styles/qgtkpainter_p.h119
-rw-r--r--src/widgets/styles/qgtkstyle.cpp4257
-rw-r--r--src/widgets/styles/qgtkstyle_p.cpp891
-rw-r--r--src/widgets/styles/qgtkstyle_p.h123
-rw-r--r--src/widgets/styles/qgtkstyle_p_p.h449
-rw-r--r--src/widgets/styles/qmacstyle_mac.mm69
-rw-r--r--src/widgets/styles/qmacstyle_mac_p_p.h3
-rw-r--r--src/widgets/styles/qstyle.h18
-rw-r--r--src/widgets/styles/qstylefactory.cpp14
-rw-r--r--src/widgets/styles/qstylesheetstyle.cpp121
-rw-r--r--src/widgets/styles/qstylesheetstyle_default.cpp3
-rw-r--r--src/widgets/styles/qstylesheetstyle_p.h7
-rw-r--r--src/widgets/styles/styles.pri20
-rw-r--r--src/widgets/util/qflickgesture.cpp1
-rw-r--r--src/widgets/util/qscroller_mac.mm2
-rw-r--r--src/widgets/util/qsystemtrayicon_x11.cpp4
-rw-r--r--src/widgets/widgets/qcalendarwidget.cpp126
-rw-r--r--src/widgets/widgets/qcombobox.cpp2
-rw-r--r--src/widgets/widgets/qcombobox.h2
-rw-r--r--src/widgets/widgets/qgroupbox.cpp4
-rw-r--r--src/widgets/widgets/qlabel.cpp6
-rw-r--r--src/widgets/widgets/qlabel.h2
-rw-r--r--src/widgets/widgets/qmaccocoaviewcontainer_mac.mm2
-rw-r--r--src/widgets/widgets/qmacnativewidget_mac.mm2
-rw-r--r--src/widgets/widgets/qmdiarea.cpp4
-rw-r--r--src/widgets/widgets/qmdisubwindow.cpp6
-rw-r--r--src/widgets/widgets/qmenu_mac.mm2
-rw-r--r--src/widgets/widgets/qtextedit.cpp2
-rw-r--r--tests/auto/auto.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro2
-rw-r--r--tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro2
-rw-r--r--tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro3
-rw-r--r--tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro3
-rw-r--r--tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro2
-rw-r--r--tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp2
-rw-r--r--tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro2
-rw-r--r--tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp96
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro2
-rw-r--r--tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp3
-rw-r--r--tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro3
-rw-r--r--tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp6
-rw-r--r--tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro3
-rw-r--r--tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp4
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/echo/echo.pro1
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/test/test.pro2
-rw-r--r--tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp8
-rw-r--r--tests/auto/corelib/codecs/utf8/utf8.pro2
-rw-r--r--tests/auto/corelib/global/q_func_info/q_func_info.pro3
-rw-r--r--tests/auto/corelib/global/qflags/qflags.pro3
-rw-r--r--tests/auto/corelib/global/qgetputenv/qgetputenv.pro3
-rw-r--r--tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp2
-rw-r--r--tests/auto/corelib/global/qglobal/qglobal.pro3
-rw-r--r--tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro1
-rw-r--r--tests/auto/corelib/global/qhooks/qhooks.pro2
-rw-r--r--tests/auto/corelib/global/qhooks/tst_qhooks.cpp2
-rw-r--r--tests/auto/corelib/global/qlogging/app/app.pro1
-rw-r--r--tests/auto/corelib/global/qlogging/test/test.pro2
-rw-r--r--tests/auto/corelib/global/qlogging/tst_qlogging.cpp2
-rw-r--r--tests/auto/corelib/global/qnumeric/qnumeric.pro3
-rw-r--r--tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp12
-rw-r--r--tests/auto/corelib/global/qrand/qrand.pro3
-rw-r--r--tests/auto/corelib/global/qtendian/qtendian.pro3
-rw-r--r--tests/auto/corelib/io/largefile/largefile.pro1
-rw-r--r--tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro1
-rw-r--r--tests/auto/corelib/io/qbuffer/qbuffer.pro3
-rw-r--r--tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp2
-rw-r--r--tests/auto/corelib/io/qdatastream/qdatastream.pro1
-rw-r--r--tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp100
-rw-r--r--tests/auto/corelib/io/qdataurl/qdataurl.pro3
-rw-r--r--tests/auto/corelib/io/qdebug/qdebug.pro3
-rw-r--r--tests/auto/corelib/io/qdir/qdir.pro1
-rw-r--r--tests/auto/corelib/io/qdir/tst_qdir.cpp20
-rw-r--r--tests/auto/corelib/io/qdiriterator/qdiriterator.pro1
-rw-r--r--tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp2
-rw-r--r--tests/auto/corelib/io/qfile/qfile.pro1
-rw-r--r--tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro1
-rw-r--r--tests/auto/corelib/io/qfile/test/test.pro2
-rw-r--r--tests/auto/corelib/io/qfile/tst_qfile.cpp32
-rw-r--r--tests/auto/corelib/io/qfileinfo/qfileinfo.pro1
-rw-r--r--tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp4
-rw-r--r--tests/auto/corelib/io/qfileselector/qfileselector.pro1
-rw-r--r--tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro3
-rw-r--r--tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro3
-rw-r--r--tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp5
-rw-r--r--tests/auto/corelib/io/qiodevice/qiodevice.pro1
-rw-r--r--tests/auto/corelib/io/qipaddress/qipaddress.pro3
-rw-r--r--tests/auto/corelib/io/qnodebug/qnodebug.pro3
-rw-r--r--tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp5
-rw-r--r--tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/test/test.pro2
-rw-r--r--tests/auto/corelib/io/qprocess/testDetached/testDetached.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro1
-rw-r--r--tests/auto/corelib/io/qprocess/tst_qprocess.cpp27
-rw-r--r--tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro3
-rw-r--r--tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp14
-rw-r--r--tests/auto/corelib/io/qresourceengine/qresourceengine.pro3
-rw-r--r--tests/auto/corelib/io/qsavefile/qsavefile.pro2
-rw-r--r--tests/auto/corelib/io/qsettings/tst_qsettings.cpp149
-rw-r--r--tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro1
-rw-r--r--tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp20
-rw-r--r--tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro1
-rw-r--r--tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro2
-rw-r--r--tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp2
-rw-r--r--tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro1
-rw-r--r--tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro1
-rw-r--r--tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro1
-rw-r--r--tests/auto/corelib/io/qtextstream/test/test.pro2
-rw-r--r--tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp18
-rw-r--r--tests/auto/corelib/io/qurl/qurl.pro3
-rw-r--r--tests/auto/corelib/io/qurl/tst_qurl.cpp26
-rw-r--r--tests/auto/corelib/io/qurlinternal/qurlinternal.pro2
-rw-r--r--tests/auto/corelib/io/qurlquery/qurlquery.pro3
-rw-r--r--tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp38
-rw-r--r--tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro1
-rw-r--r--tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp4
-rw-r--r--tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro1
-rw-r--r--tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp41
-rw-r--r--tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro1
-rw-r--r--tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp2
-rw-r--r--tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro2
-rw-r--r--tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp72
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp13
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro1
-rw-r--r--tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp6
-rw-r--r--tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro2
-rw-r--r--tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp65
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro2
-rw-r--r--tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp86
-rw-r--r--tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro2
-rw-r--r--tests/auto/corelib/json/json.pro2
-rw-r--r--tests/auto/corelib/json/tst_qtjson.cpp102
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro2
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp8
-rw-r--r--tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h2
-rw-r--r--tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro1
-rw-r--r--tests/auto/corelib/kernel/qeventloop/qeventloop.pro2
-rw-r--r--tests/auto/corelib/kernel/qmath/qmath.pro3
-rw-r--r--tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro1
-rw-r--r--tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp4
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp4
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro3
-rw-r--r--tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp108
-rw-r--r--tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetatype/qmetatype.pro2
-rw-r--r--tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp9
-rw-r--r--tests/auto/corelib/kernel/qmimedata/qmimedata.pro2
-rw-r--r--tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp2
-rw-r--r--tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro1
-rw-r--r--tests/auto/corelib/kernel/qobject/test/test.pro1
-rw-r--r--tests/auto/corelib/kernel/qobject/tst_qobject.cpp48
-rw-r--r--tests/auto/corelib/kernel/qpointer/qpointer.pro2
-rw-r--r--tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp26
-rw-r--r--tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro2
-rw-r--r--tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro2
-rw-r--r--tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp10
-rw-r--r--tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro2
-rw-r--r--tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp8
-rw-r--r--tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp4
-rw-r--r--tests/auto/corelib/kernel/qtimer/qtimer.pro3
-rw-r--r--tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp2
-rw-r--r--tests/auto/corelib/kernel/qtranslator/qtranslator.pro2
-rw-r--r--tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp26
-rw-r--r--tests/auto/corelib/kernel/qvariant/qvariant.pro1
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp44
-rw-r--r--tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro3
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro1
-rw-r--r--tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro3
-rw-r--r--tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro3
-rw-r--r--tests/auto/corelib/plugin/plugin.pro9
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro1
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro1
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro1
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/test/test.pro7
-rw-r--r--tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp8
-rw-r--r--tests/auto/corelib/plugin/qlibrary/lib/lib.pro1
-rw-r--r--tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro1
-rw-r--r--tests/auto/corelib/plugin/qlibrary/qlibrary.pro1
-rw-r--r--tests/auto/corelib/plugin/qlibrary/tst/tst.pro2
-rw-r--r--tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp2
-rw-r--r--tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qplugin/qplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qplugin/tst_qplugin.pro2
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/lib/lib.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro1
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/tst/tst.pro2
-rw-r--r--tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp6
-rw-r--r--tests/auto/corelib/plugin/quuid/quuid.pro1
-rw-r--r--tests/auto/corelib/plugin/quuid/test/test.pro2
-rw-r--r--tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro1
-rw-r--r--tests/auto/corelib/plugin/quuid/tst_quuid.cpp4
-rw-r--r--tests/auto/corelib/statemachine/qstate/qstate.pro3
-rw-r--r--tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro2
-rw-r--r--tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp14
-rw-r--r--tests/auto/corelib/thread/qatomicint/qatomicint.pro3
-rw-r--r--tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri2
-rw-r--r--tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro3
-rw-r--r--tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp88
-rw-r--r--tests/auto/corelib/thread/qfuture/qfuture.pro3
-rw-r--r--tests/auto/corelib/thread/qfuture/tst_qfuture.cpp46
-rw-r--r--tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro3
-rw-r--r--tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro3
-rw-r--r--tests/auto/corelib/thread/qmutex/qmutex.pro2
-rw-r--r--tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro3
-rw-r--r--tests/auto/corelib/thread/qreadlocker/qreadlocker.pro3
-rw-r--r--tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro3
-rw-r--r--tests/auto/corelib/thread/qresultstore/qresultstore.pro3
-rw-r--r--tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp14
-rw-r--r--tests/auto/corelib/thread/qsemaphore/qsemaphore.pro1
-rw-r--r--tests/auto/corelib/thread/qthread/qthread.pro3
-rw-r--r--tests/auto/corelib/thread/qthreadonce/qthreadonce.pro3
-rw-r--r--tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp2
-rw-r--r--tests/auto/corelib/thread/qthreadpool/qthreadpool.pro3
-rw-r--r--tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro1
-rw-r--r--tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro2
-rw-r--r--tests/auto/corelib/thread/qthreadstorage/test/test.pro1
-rw-r--r--tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro3
-rw-r--r--tests/auto/corelib/thread/qwritelocker/qwritelocker.pro3
-rw-r--r--tests/auto/corelib/tools/collections/collections.pro2
-rw-r--r--tests/auto/corelib/tools/collections/tst_collections.cpp136
-rw-r--r--tests/auto/corelib/tools/qalgorithms/qalgorithms.pro2
-rw-r--r--tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp20
-rw-r--r--tests/auto/corelib/tools/qarraydata/qarraydata.pro3
-rw-r--r--tests/auto/corelib/tools/qbitarray/qbitarray.pro3
-rw-r--r--tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp4
-rw-r--r--tests/auto/corelib/tools/qbytearray/qbytearray.pro3
-rw-r--r--tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp51
-rw-r--r--tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro2
-rw-r--r--tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro3
-rw-r--r--tests/auto/corelib/tools/qcache/qcache.pro3
-rw-r--r--tests/auto/corelib/tools/qchar/qchar.pro3
-rw-r--r--tests/auto/corelib/tools/qchar/tst_qchar.cpp46
-rw-r--r--tests/auto/corelib/tools/qcollator/qcollator.pro3
-rw-r--r--tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro2
-rw-r--r--tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro3
-rw-r--r--tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro3
-rw-r--r--tests/auto/corelib/tools/qdate/qdate.pro3
-rw-r--r--tests/auto/corelib/tools/qdate/tst_qdate.cpp2
-rw-r--r--tests/auto/corelib/tools/qdatetime/qdatetime.pro3
-rw-r--r--tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp14
-rw-r--r--tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro3
-rw-r--r--tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro3
-rw-r--r--tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro3
-rw-r--r--tests/auto/corelib/tools/qfreelist/qfreelist.pro2
-rw-r--r--tests/auto/corelib/tools/qhash/qhash.pro3
-rw-r--r--tests/auto/corelib/tools/qhash/tst_qhash.cpp30
-rw-r--r--tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro3
-rw-r--r--tests/auto/corelib/tools/qline/qline.pro3
-rw-r--r--tests/auto/corelib/tools/qline/tst_qline.cpp6
-rw-r--r--tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro3
-rw-r--r--tests/auto/corelib/tools/qlist/qlist.pro2
-rw-r--r--tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro1
-rw-r--r--tests/auto/corelib/tools/qlocale/test/test.pro2
-rw-r--r--tests/auto/corelib/tools/qlocale/tst_qlocale.cpp155
-rw-r--r--tests/auto/corelib/tools/qmap/qmap.pro3
-rw-r--r--tests/auto/corelib/tools/qmap/tst_qmap.cpp70
-rw-r--r--tests/auto/corelib/tools/qmargins/qmargins.pro3
-rw-r--r--tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro3
-rw-r--r--tests/auto/corelib/tools/qpair/qpair.pro3
-rw-r--r--tests/auto/corelib/tools/qpoint/qpoint.pro3
-rw-r--r--tests/auto/corelib/tools/qpointf/qpointf.pro3
-rw-r--r--tests/auto/corelib/tools/qqueue/qqueue.pro3
-rw-r--r--tests/auto/corelib/tools/qrect/qrect.pro3
-rw-r--r--tests/auto/corelib/tools/qregexp/qregexp.pro3
-rw-r--r--tests/auto/corelib/tools/qregexp/tst_qregexp.cpp14
-rw-r--r--tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro3
-rw-r--r--tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro3
-rw-r--r--tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro2
-rw-r--r--tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp12
-rw-r--r--tests/auto/corelib/tools/qringbuffer/qringbuffer.pro3
-rw-r--r--tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp31
-rw-r--r--tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro3
-rw-r--r--tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro3
-rw-r--r--tests/auto/corelib/tools/qset/qset.pro3
-rw-r--r--tests/auto/corelib/tools/qset/tst_qset.cpp2
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro1
-rw-r--r--tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp61
-rw-r--r--tests/auto/corelib/tools/qsize/qsize.pro3
-rw-r--r--tests/auto/corelib/tools/qsizef/qsizef.pro3
-rw-r--r--tests/auto/corelib/tools/qstl/qstl.pro3
-rw-r--r--tests/auto/corelib/tools/qstring/qstring.pro6
-rw-r--r--tests/auto/corelib/tools/qstring/tst_qstring.cpp408
-rw-r--r--tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro3
-rw-r--r--tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro3
-rw-r--r--tests/auto/corelib/tools/qstringiterator/qstringiterator.pro2
-rw-r--r--tests/auto/corelib/tools/qstringlist/qstringlist.pro3
-rw-r--r--tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro3
-rw-r--r--tests/auto/corelib/tools/qstringref/qstringref.pro3
-rw-r--r--tests/auto/corelib/tools/qstringref/tst_qstringref.cpp16
-rw-r--r--tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro3
-rw-r--r--tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp4
-rw-r--r--tests/auto/corelib/tools/qtime/qtime.pro3
-rw-r--r--tests/auto/corelib/tools/qtimeline/qtimeline.pro3
-rw-r--r--tests/auto/corelib/tools/qtimezone/qtimezone.pro3
-rw-r--r--tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro3
-rw-r--r--tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp12
-rw-r--r--tests/auto/corelib/tools/qvector/qvector.pro3
-rw-r--r--tests/auto/corelib/tools/qvector/tst_qvector.cpp4
-rw-r--r--tests/auto/corelib/tools/qversionnumber/qversionnumber.pro2
-rw-r--r--tests/auto/corelib/xml/qxmlstream/qxmlstream.pro2
-rw-r--r--tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp95
-rw-r--r--tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp6
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro1
-rw-r--r--tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp36
-rw-r--r--tests/auto/dbus/qdbusconnection/qdbusconnection.pro1
-rw-r--r--tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp10
-rw-r--r--tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro1
-rw-r--r--tests/auto/dbus/qdbuscontext/qdbuscontext.pro1
-rw-r--r--tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro1
-rw-r--r--tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro1
-rw-r--r--tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp6
-rw-r--r--tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro1
-rw-r--r--tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro1
-rw-r--r--tests/auto/dbus/qdbusmarshall/qpong/qpong.pro1
-rw-r--r--tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro1
-rw-r--r--tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro1
-rw-r--r--tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro1
-rw-r--r--tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp6
-rw-r--r--tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro1
-rw-r--r--tests/auto/dbus/qdbusreply/qdbusreply.pro1
-rw-r--r--tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro1
-rw-r--r--tests/auto/dbus/qdbusthreading/qdbusthreading.pro1
-rw-r--r--tests/auto/dbus/qdbustype/qdbustype.pro1
-rw-r--r--tests/auto/dbus/qdbustype/tst_qdbustype.cpp4
-rw-r--r--tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro1
-rw-r--r--tests/auto/gui/image/qicoimageformat/qicoimageformat.pro1
-rw-r--r--tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp14
-rw-r--r--tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cachebin0 -> 280 bytes
-rw-r--r--tests/auto/gui/image/qicon/qicon.pro1
-rw-r--r--tests/auto/gui/image/qicon/tst_qicon.cpp64
-rw-r--r--tests/auto/gui/image/qicon/tst_qicon.qrc1
-rw-r--r--tests/auto/gui/image/qimage/qimage.pro1
-rw-r--r--tests/auto/gui/image/qimage/tst_qimage.cpp47
-rw-r--r--tests/auto/gui/image/qimageiohandler/qimageiohandler.pro1
-rw-r--r--tests/auto/gui/image/qimagereader/tst_qimagereader.cpp8
-rw-r--r--tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp6
-rw-r--r--tests/auto/gui/image/qmovie/qmovie.pro1
-rw-r--r--tests/auto/gui/image/qpicture/qpicture.pro1
-rw-r--r--tests/auto/gui/image/qpixmap/tst_qpixmap.cpp13
-rw-r--r--tests/auto/gui/image/qpixmapcache/qpixmapcache.pro1
-rw-r--r--tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp12
-rw-r--r--tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro1
-rw-r--r--tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp13
-rw-r--r--tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro1
-rw-r--r--tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp73
-rw-r--r--tests/auto/gui/kernel/qdrag/qdrag.pro1
-rw-r--r--tests/auto/gui/kernel/qevent/qevent.pro1
-rw-r--r--tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp16
-rw-r--r--tests/auto/gui/kernel/qguimetatype/qguimetatype.pro1
-rw-r--r--tests/auto/gui/kernel/qguitimer/qguitimer.pro1
-rw-r--r--tests/auto/gui/kernel/qguivariant/no_application/no_application.pro1
-rw-r--r--tests/auto/gui/kernel/qguivariant/test/test.pro1
-rw-r--r--tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp2
-rw-r--r--tests/auto/gui/kernel/qkeysequence/qkeysequence.pro2
-rw-r--r--tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp4
-rw-r--r--tests/auto/gui/kernel/qpalette/qpalette.pro1
-rw-r--r--tests/auto/gui/kernel/qscreen/qscreen.pro1
-rw-r--r--tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro1
-rw-r--r--tests/auto/gui/kernel/qwindow/tst_qwindow.cpp190
-rw-r--r--tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro1
-rw-r--r--tests/auto/gui/math3d/qquaternion/qquaternion.pro1
-rw-r--r--tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp12
-rw-r--r--tests/auto/gui/math3d/qvectornd/qvectornd.pro1
-rw-r--r--tests/auto/gui/painting/qbrush/qbrush.pro1
-rw-r--r--tests/auto/gui/painting/qcolor/qcolor.pro1
-rw-r--r--tests/auto/gui/painting/qpagelayout/qpagelayout.pro2
-rw-r--r--tests/auto/gui/painting/qpagesize/qpagesize.pro2
-rw-r--r--tests/auto/gui/painting/qpaintengine/qpaintengine.pro1
-rw-r--r--tests/auto/gui/painting/qpainter/qpainter.pro2
-rw-r--r--tests/auto/gui/painting/qpainter/tst_qpainter.cpp59
-rw-r--r--tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp8
-rw-r--r--tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro1
-rw-r--r--tests/auto/gui/painting/qpathclipper/qpathclipper.pro1
-rw-r--r--tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro2
-rw-r--r--tests/auto/gui/painting/qpen/qpen.pro1
-rw-r--r--tests/auto/gui/painting/qpolygon/qpolygon.pro1
-rw-r--r--tests/auto/gui/painting/qregion/qregion.pro1
-rw-r--r--tests/auto/gui/painting/qtransform/qtransform.pro1
-rw-r--r--tests/auto/gui/painting/qwmatrix/qwmatrix.pro1
-rw-r--r--tests/auto/gui/qopengl/qopengl.pro1
-rw-r--r--tests/auto/gui/qopenglconfig/qopenglconfig.pro1
-rw-r--r--tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro1
-rw-r--r--tests/auto/gui/text/qcssparser/qcssparser.pro1
-rw-r--r--tests/auto/gui/text/qcssparser/tst_qcssparser.cpp41
-rw-r--r--tests/auto/gui/text/qfont/qfont.pro4
-rw-r--r--tests/auto/gui/text/qfont/tst_qfont.cpp6
-rw-r--r--tests/auto/gui/text/qfontcache/qfontcache.pro1
-rw-r--r--tests/auto/gui/text/qfontdatabase/qfontdatabase.pro1
-rw-r--r--tests/auto/gui/text/qfontmetrics/qfontmetrics.pro1
-rw-r--r--tests/auto/gui/text/qglyphrun/qglyphrun.pro1
-rw-r--r--tests/auto/gui/text/qrawfont/qrawfont.pro1
-rw-r--r--tests/auto/gui/text/qstatictext/qstatictext.pro1
-rw-r--r--tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro1
-rw-r--r--tests/auto/gui/text/qtextblock/qtextblock.pro1
-rw-r--r--tests/auto/gui/text/qtextcursor/qtextcursor.pro1
-rw-r--r--tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp4
-rw-r--r--tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp6
-rw-r--r--tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp6
-rw-r--r--tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro1
-rw-r--r--tests/auto/gui/text/qtextformat/qtextformat.pro1
-rw-r--r--tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp4
-rw-r--r--tests/auto/gui/text/qtextlist/qtextlist.pro1
-rw-r--r--tests/auto/gui/text/qtextobject/qtextobject.pro1
-rw-r--r--tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp2
-rw-r--r--tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro1
-rw-r--r--tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp2
-rw-r--r--tests/auto/gui/text/qtexttable/qtexttable.pro1
-rw-r--r--tests/auto/gui/util/qdesktopservices/qdesktopservices.pro1
-rw-r--r--tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro1
-rw-r--r--tests/auto/gui/util/qintvalidator/qintvalidator.pro1
-rw-r--r--tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro1
-rw-r--r--tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro2
-rw-r--r--tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro1
-rw-r--r--tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp2
-rw-r--r--tests/auto/network/access/qftp/tst_qftp.cpp24
-rw-r--r--tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro1
-rw-r--r--tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro1
-rw-r--r--tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro1
-rw-r--r--tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro1
-rw-r--r--tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro1
-rw-r--r--tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp8
-rw-r--r--tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro1
-rw-r--r--tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp7
-rw-r--r--tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro1
-rw-r--r--tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp7
-rw-r--r--tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp72
-rw-r--r--tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro1
-rw-r--r--tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp8
-rw-r--r--tests/auto/network/access/spdy/spdy.pro2
-rw-r--r--tests/auto/network/bearer/qnetworksession/lackey/main.cpp5
-rw-r--r--tests/auto/network/kernel/qdnslookup/qdnslookup.pro1
-rw-r--r--tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp10
-rw-r--r--tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro1
-rw-r--r--tests/auto/network/kernel/qhostaddress/qhostaddress.pro1
-rw-r--r--tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro1
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro1
-rw-r--r--tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp7
-rw-r--r--tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro1
-rw-r--r--tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp11
-rw-r--r--tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp12
-rw-r--r--tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp34
-rw-r--r--tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp33
-rw-r--r--tests/auto/network/ssl/qasn1element/qasn1element.pro1
-rw-r--r--tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro1
-rw-r--r--tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp14
-rw-r--r--tests/auto/network/ssl/qsslcipher/qsslcipher.pro1
-rw-r--r--tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro1
-rw-r--r--tests/auto/network/ssl/qsslerror/qsslerror.pro1
-rw-r--r--tests/auto/network/ssl/qsslkey/qsslkey.pro1
-rw-r--r--tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp14
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro1
-rw-r--r--tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro1
-rw-r--r--tests/auto/opengl/qgl/qgl.pro1
-rw-r--r--tests/auto/opengl/qglbuffer/qglbuffer.pro2
-rw-r--r--tests/auto/opengl/qglfunctions/qglfunctions.pro2
-rw-r--r--tests/auto/opengl/qglthreads/qglthreads.pro3
-rw-r--r--tests/auto/opengl/qglthreads/tst_qglthreads.cpp9
-rw-r--r--tests/auto/other/atwrapper/atWrapper.cpp33
-rw-r--r--tests/auto/other/compiler/compiler.pro1
-rw-r--r--tests/auto/other/gestures/gestures.pro1
-rw-r--r--tests/auto/other/gestures/tst_gestures.cpp1
-rw-r--r--tests/auto/other/lancelot/lancelot.pro2
-rw-r--r--tests/auto/other/lancelot/paintcommands.cpp19
-rw-r--r--tests/auto/other/languagechange/languagechange.pro2
-rw-r--r--tests/auto/other/languagechange/tst_languagechange.cpp2
-rw-r--r--tests/auto/other/macgui/macgui.pro1
-rw-r--r--tests/auto/other/macnativeevents/qnativeevents.cpp24
-rw-r--r--tests/auto/other/macplist/app/app.pro1
-rw-r--r--tests/auto/other/macplist/test/test.pro1
-rw-r--r--tests/auto/other/modeltest/dynamictreemodel.cpp3
-rw-r--r--tests/auto/other/modeltest/modeltest.pro4
-rw-r--r--tests/auto/other/networkselftest/networkselftest.pro2
-rw-r--r--tests/auto/other/networkselftest/tst_networkselftest.cpp4
-rw-r--r--tests/auto/other/qaccessibility/qaccessibility.pro1
-rw-r--r--tests/auto/other/qaccessibility/tst_qaccessibility.cpp32
-rw-r--r--tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro1
-rw-r--r--tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm2
-rw-r--r--tests/auto/other/qcomplextext/qcomplextext.pro2
-rw-r--r--tests/auto/other/qfocusevent/qfocusevent.pro1
-rw-r--r--tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro2
-rw-r--r--tests/auto/other/qobjectperformance/qobjectperformance.pro1
-rw-r--r--tests/auto/other/qobjectrace/qobjectrace.pro3
-rw-r--r--tests/auto/other/qprocess_and_guieventloop/test.pro1
-rw-r--r--tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro2
-rw-r--r--tests/auto/other/qtokenautomaton/qtokenautomaton.pro2
-rw-r--r--tests/auto/other/qvariant_common/tst_qvariant_common.h2
-rw-r--r--tests/auto/other/toolsupport/toolsupport.pro2
-rw-r--r--tests/auto/other/toolsupport/tst_toolsupport.cpp10
-rw-r--r--tests/auto/other/windowsmobile/test/test.pro2
-rw-r--r--tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro1
-rw-r--r--tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro2
-rw-r--r--tests/auto/printsupport/kernel/qprinter/qprinter.pro1
-rw-r--r--tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro2
-rw-r--r--tests/auto/sql/kernel/qsql/qsql.pro1
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_databases.h14
-rw-r--r--tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp2
-rw-r--r--tests/auto/sql/kernel/qsqldriver/qsqldriver.pro1
-rw-r--r--tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp2
-rw-r--r--tests/auto/sql/kernel/qsqlerror/qsqlerror.pro1
-rw-r--r--tests/auto/sql/kernel/qsqlfield/qsqlfield.pro1
-rw-r--r--tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp16
-rw-r--r--tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp20
-rw-r--r--tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro1
-rw-r--r--tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp4
-rw-r--r--tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro1
-rw-r--r--tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro1
-rw-r--r--tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp16
-rw-r--r--tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro1
-rw-r--r--tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp2
-rw-r--r--tests/auto/testlib/qsignalspy/qsignalspy.pro1
-rw-r--r--tests/auto/testlib/selftests/selftests.pro1
-rw-r--r--tests/auto/testlib/selftests/test/test.pro1
-rw-r--r--tests/auto/testlib/selftests/tst_selftests.cpp4
-rw-r--r--tests/auto/tools/moc/moc.pro2
-rw-r--r--tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro1
-rw-r--r--tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro1
-rw-r--r--tests/auto/tools/qmake/qmake.pro1
-rw-r--r--tests/auto/tools/qmake/testcompiler.cpp2
-rw-r--r--tests/auto/tools/qmakelib/qmakelib.pro1
-rw-r--r--tests/auto/tools/rcc/rcc.pro1
-rw-r--r--tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro1
-rw-r--r--tests/auto/widgets/dialogs/qdialog/qdialog.pro1
-rw-r--r--tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro1
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp4
-rw-r--r--tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp6
-rw-r--r--tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp21
-rw-r--r--tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro5
-rw-r--r--tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp8
-rw-r--r--tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro1
-rw-r--r--tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp2
-rw-r--r--tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro1
-rw-r--r--tests/auto/widgets/dialogs/qsidebar/qsidebar.pro2
-rw-r--r--tests/auto/widgets/dialogs/qwizard/qwizard.pro1
-rw-r--r--tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp17
-rw-r--r--tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro1
-rw-r--r--tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp4
-rw-r--r--tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp8
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp8
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp239
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp47
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp38
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp256
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro2
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp15
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro1
-rw-r--r--tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp16
-rw-r--r--tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp12
-rw-r--r--tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp10
-rw-r--r--tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro1
-rw-r--r--tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp4
-rw-r--r--tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp10
-rw-r--r--tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro1
-rw-r--r--tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp27
-rw-r--r--tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro1
-rw-r--r--tests/auto/widgets/itemviews/qitemview/qitemview.pro1
-rw-r--r--tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp4
-rw-r--r--tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp73
-rw-r--r--tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp36
-rw-r--r--tests/auto/widgets/itemviews/qtableview/qtableview.pro2
-rw-r--r--tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp21
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro1
-rw-r--r--tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp2
-rw-r--r--tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp65
-rw-r--r--tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp54
-rw-r--r--tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro1
-rw-r--r--tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp49
-rw-r--r--tests/auto/widgets/kernel/qaction/tst_qaction.cpp4
-rw-r--r--tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro1
-rw-r--r--tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp17
-rw-r--r--tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro1
-rw-r--r--tests/auto/widgets/kernel/qformlayout/qformlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp6
-rw-r--r--tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp10
-rw-r--r--tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp2
-rw-r--r--tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp7
-rw-r--r--tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro1
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp2
-rw-r--r--tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm2
-rw-r--r--tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro1
-rw-r--r--tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro1
-rw-r--r--tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro1
-rw-r--r--tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro1
-rw-r--r--tests/auto/widgets/styles/qstyle/qstyle.pro2
-rw-r--r--tests/auto/widgets/styles/qstyleoption/qstyleoption.pro1
-rw-r--r--tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp237
-rw-r--r--tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp14
-rw-r--r--tests/auto/widgets/util/qscroller/qscroller.pro1
-rw-r--r--tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro1
-rw-r--r--tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro1
-rw-r--r--tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro1
-rw-r--r--tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro1
-rw-r--r--tests/auto/widgets/widgets/qcombobox/qcombobox.pro1
-rw-r--r--tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp58
-rw-r--r--tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro1
-rw-r--r--tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp2
-rw-r--r--tests/auto/widgets/widgets/qdial/qdial.pro1
-rw-r--r--tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro1
-rw-r--r--tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro1
-rw-r--r--tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp7
-rw-r--r--tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro1
-rw-r--r--tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro1
-rw-r--r--tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp2
-rw-r--r--tests/auto/widgets/widgets/qframe/tst_qframe.cpp25
-rw-r--r--tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp111
-rw-r--r--tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro1
-rw-r--r--tests/auto/widgets/widgets/qlabel/qlabel.pro1
-rw-r--r--tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro1
-rw-r--r--tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp27
-rw-r--r--tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro1
-rw-r--r--tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp2
-rw-r--r--tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp21
-rw-r--r--tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp31
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp6
-rw-r--r--tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm2
-rw-r--r--tests/auto/widgets/widgets/qopenglwidget/BLACKLIST12
-rw-r--r--tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro3
-rw-r--r--tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp3
-rw-r--r--tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro1
-rw-r--r--tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro1
-rw-r--r--tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro1
-rw-r--r--tests/auto/widgets/widgets/qslider/qslider.pro1
-rw-r--r--tests/auto/widgets/widgets/qsplitter/qsplitter.pro1
-rw-r--r--tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp6
-rw-r--r--tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp2
-rw-r--r--tests/auto/widgets/widgets/qtabbar/qtabbar.pro1
-rw-r--r--tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp2
-rw-r--r--tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro1
-rw-r--r--tests/auto/xml/sax/qxml/qxml.pro1
-rw-r--r--tests/baselineserver/src/baselineserver.cpp2
-rw-r--r--tests/baselineserver/src/report.cpp6
-rw-r--r--tests/benchmarks/corelib/codecs/qtextcodec/main.cpp6
-rw-r--r--tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro1
-rw-r--r--tests/benchmarks/corelib/io/qdir/10000/10000.pro1
-rw-r--r--tests/benchmarks/corelib/io/qdir/tree/tree.pro1
-rw-r--r--tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro1
-rw-r--r--tests/benchmarks/corelib/io/qfile/main.cpp8
-rw-r--r--tests/benchmarks/corelib/io/qfile/qfile.pro1
-rw-r--r--tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro1
-rw-r--r--tests/benchmarks/corelib/io/qiodevice/qiodevice.pro2
-rw-r--r--tests/benchmarks/corelib/io/qprocess/test/test.pro1
-rw-r--r--tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro1
-rw-r--r--tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro1
-rw-r--r--tests/benchmarks/corelib/io/qtextstream/qtextstream.pro1
-rw-r--r--tests/benchmarks/corelib/io/qurl/qurl.pro1
-rw-r--r--tests/benchmarks/corelib/json/json.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/events/events.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qobject/qobject.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro1
-rw-r--r--tests/benchmarks/corelib/kernel/qvariant/qvariant.pro1
-rw-r--r--tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro1
-rw-r--r--tests/benchmarks/corelib/plugin/quuid/quuid.pro1
-rw-r--r--tests/benchmarks/corelib/thread/qmutex/qmutex.pro1
-rw-r--r--tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro1
-rw-r--r--tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro1
-rw-r--r--tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro1
-rw-r--r--tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qchar/qchar.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qhash/qhash.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qlist/qlist.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qlocale/qlocale.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qmap/qmap.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qrect/qrect.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qregexp/qregexp.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qstring/qstring.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro1
-rw-r--r--tests/benchmarks/corelib/tools/qvector/qvector.pro1
-rw-r--r--tests/benchmarks/dbus/qdbusperformance/server/server.pro1
-rw-r--r--tests/benchmarks/dbus/qdbusperformance/test/test.pro1
-rw-r--r--tests/benchmarks/dbus/qdbustype/qdbustype.pro1
-rw-r--r--tests/benchmarks/gui/animation/qanimation/qanimation.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp2
-rw-r--r--tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp3
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp14
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp8
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp2
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro1
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp11
-rw-r--r--tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro1
-rw-r--r--tests/benchmarks/gui/image/blendbench/blendbench.pro1
-rw-r--r--tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro1
-rw-r--r--tests/benchmarks/gui/image/qimagereader/qimagereader.pro1
-rw-r--r--tests/benchmarks/gui/image/qpixmap/qpixmap.pro1
-rw-r--r--tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro1
-rw-r--r--tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro1
-rw-r--r--tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp2
-rw-r--r--tests/benchmarks/gui/itemviews/qtableview/qtableview.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qapplication/qapplication.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qwidget/qwidget.pro1
-rw-r--r--tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp2
-rw-r--r--tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro1
-rw-r--r--tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro1
-rw-r--r--tests/benchmarks/gui/painting/qpainter/qpainter.pro1
-rw-r--r--tests/benchmarks/gui/painting/qregion/qregion.pro1
-rw-r--r--tests/benchmarks/gui/painting/qtbench/qtbench.pro2
-rw-r--r--tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp2
-rw-r--r--tests/benchmarks/gui/painting/qtransform/qtransform.pro1
-rw-r--r--tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp2
-rw-r--r--tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro1
-rw-r--r--tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro1
-rw-r--r--tests/benchmarks/gui/text/qtext/qtext.pro1
-rw-r--r--tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro1
-rw-r--r--tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro1
-rw-r--r--tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro1
-rw-r--r--tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro1
-rw-r--r--tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro1
-rw-r--r--tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro1
-rw-r--r--tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro1
-rw-r--r--tests/benchmarks/sql/kernel/qsqlquery/main.cpp2
-rw-r--r--tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro1
-rw-r--r--tests/manual/bearerex/bearerex.cpp24
-rw-r--r--tests/manual/bearerex/bearerex.pro1
-rw-r--r--tests/manual/cocoa/menus/menus.pro1
-rw-r--r--tests/manual/cocoa/nativewidgets/nativewigets.pro1
-rw-r--r--tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h2
-rw-r--r--tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro2
-rw-r--r--tests/manual/cocoa/qt_on_cocoa/main.mm2
-rw-r--r--tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro2
-rw-r--r--tests/manual/cocoa/wheelevent/wheelevent.pro1
-rw-r--r--tests/manual/diaglib/README.txt5
-rw-r--r--tests/manual/diaglib/debugproxystyle.cpp161
-rw-r--r--tests/manual/diaglib/debugproxystyle.h63
-rw-r--r--tests/manual/diaglib/diaglib.pri4
-rw-r--r--tests/manual/gestures/graphicsview/graphicsview.pro1
-rw-r--r--tests/manual/gestures/graphicsview/main.cpp2
-rw-r--r--tests/manual/gestures/scrollarea/scrollarea.pro1
-rw-r--r--tests/manual/highdpi/dragwidget.cpp2
-rw-r--r--tests/manual/highdpi/main.cpp6
-rw-r--r--tests/manual/inputmethodhints/inputmethodhints.pro1
-rw-r--r--tests/manual/keypadnavigation/keypadnavigation.pro1
-rw-r--r--tests/manual/lance/lance.pro1
-rw-r--r--tests/manual/lance/main.cpp2
-rw-r--r--tests/manual/network_remote_stresstest/network_remote_stresstest.pro1
-rw-r--r--tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp19
-rw-r--r--tests/manual/network_stresstest/minihttpserver.cpp2
-rw-r--r--tests/manual/qcursor/allcursors/allcursors.pro1
-rw-r--r--tests/manual/qcursor/grab_override/grab_override.pro1
-rw-r--r--tests/manual/qdesktopwidget/qdesktopwidget.pro1
-rw-r--r--tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro1
-rw-r--r--tests/manual/qgraphicslayout/flicker/flicker.pro1
-rw-r--r--tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro1
-rw-r--r--tests/manual/qimagereader/qimagereader.pro1
-rw-r--r--tests/manual/qlocale/qlocale.pro1
-rw-r--r--tests/manual/qnetworkaccessmanager/qget/qget.cpp2
-rw-r--r--tests/manual/qnetworkaccessmanager/qget/qget.pro1
-rw-r--r--tests/manual/qnetworkaccessmanager/qget/transferitem.cpp4
-rw-r--r--tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro1
-rw-r--r--tests/manual/qnetworkreply/qnetworkreply.pro1
-rw-r--r--tests/manual/qscreen/propertyfield.cpp2
-rw-r--r--tests/manual/qssloptions/qssloptions.pro1
-rw-r--r--tests/manual/qtabletevent/device_information/device_information.pro1
-rw-r--r--tests/manual/qtabletevent/device_information/tabletwidget.cpp4
-rw-r--r--tests/manual/qtabletevent/event_compression/event_compression.pro1
-rw-r--r--tests/manual/qtabletevent/regular_widgets/regular_widgets.pro1
-rw-r--r--tests/manual/qtbug-8933/qtbug-8933.pro1
-rw-r--r--tests/manual/qtouchevent/qtouchevent.pro1
-rw-r--r--tests/manual/qwidget_zorder/qwidget_zorder.pro1
-rw-r--r--tests/manual/repaint/mainwindow/mainwindow.pro1
-rw-r--r--tests/manual/repaint/scrollarea/scrollarea.pro1
-rw-r--r--tests/manual/repaint/splitter/splitter.pro1
-rw-r--r--tests/manual/repaint/tableview/tableview.pro1
-rw-r--r--tests/manual/repaint/task141091/task141091.pro1
-rw-r--r--tests/manual/repaint/toplevel/toplevel.pro1
-rw-r--r--tests/manual/repaint/widget/widget.pro1
-rw-r--r--tests/manual/socketengine/socketengine.pro1
-rw-r--r--tests/manual/textrendering/glyphshaping/glyphshaping.pro1
-rw-r--r--tests/manual/textrendering/textperformance/textperformance.pro1
-rw-r--r--tests/manual/unc/main.cpp2
-rw-r--r--tests/manual/widgetgrab/widgetgrab.pro1
-rw-r--r--tests/manual/widgets/itemviews/delegate/delegate.pro1
-rw-r--r--tests/manual/widgets/itemviews/qheaderview/qheaderview.pro1
-rw-r--r--tests/manual/widgets/itemviews/qtreeview/qtreeview.pro1
-rw-r--r--tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro1
-rw-r--r--tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro1
-rw-r--r--tests/manual/windowflags/windowflags.pro1
-rw-r--r--tests/manual/windowgeometry/windowgeometry.pro1
-rw-r--r--tests/manual/windowmodality/windowmodality.pro1
-rw-r--r--tools/configure/Makefile.win322
-rw-r--r--tools/configure/configureapp.cpp133
-rw-r--r--tools/configure/configureapp.h1
-rw-r--r--tools/configure/environment.cpp21
1223 files changed, 13582 insertions, 44471 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 732b5da262..7121ac2008 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -5,4 +5,4 @@ CONFIG += warning_clean
QT_SOURCE_TREE = $$PWD
QT_BUILD_TREE = $$shadowed($$PWD)
-MODULE_VERSION = 5.6.0
+MODULE_VERSION = 5.7.0
diff --git a/config.tests/common/avx512/avx512.cpp b/config.tests/common/avx512/avx512.cpp
new file mode 100644
index 0000000000..d0c55a09b5
--- /dev/null
+++ b/config.tests/common/avx512/avx512.cpp
@@ -0,0 +1,97 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Intel Corporation.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the configuration of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <immintrin.h>
+
+#ifndef AVX512WANT
+# error ".pro file must define AVX512WANT macro to the AVX-512 feature to be tested"
+#endif
+
+// The following checks if __AVXx__ is defined, where x is the value in
+// AVX512WANT
+#define HAS2(x) __AVX512 ## x ## __
+#define HAS(x) HAS2(x)
+#if !HAS(AVX512WANT)
+# error "Feature not supported"
+#endif
+
+int main(int, char**argv)
+{
+ /* AVX512 Foundation */
+ __m512i i;
+ __m512d d;
+ __m512 f;
+ __mmask16 m = ~1;
+ i = _mm512_maskz_loadu_epi32(0, argv);
+ d = _mm512_loadu_pd((double *)argv + 64);
+ f = _mm512_loadu_ps((float *)argv + 128);
+
+#ifdef __AVX512ER__
+ /* AVX512 Exponential and Reciprocal */
+ f = _mm512_exp2a23_round_ps(f, 8);
+#endif
+#ifdef __AVX512CD__
+ /* AVX512 Conflict Detection */
+ i = _mm512_maskz_conflict_epi32(m, i);
+#endif
+#ifdef __AVX512PF__
+ /* AVX512 Prefetch */
+ _mm512_mask_prefetch_i64scatter_pd(argv, 0xf, i, 2, 2);
+#endif
+#ifdef __AVX512DQ__
+ /* AVX512 Doubleword and Quadword support */
+ m = _mm512_movepi32_mask(i);
+#endif
+#ifdef __AVX512BW__
+ /* AVX512 Byte and Word support */
+ i = _mm512_mask_loadu_epi8(i, m, argv - 8);
+#endif
+#ifdef __AVX512VL__
+ /* AVX512 Vector Length */
+ __m256i i2 = _mm256_maskz_loadu_epi32(0, argv);
+ _mm256_mask_storeu_epi32(argv + 1, m, i2);
+#endif
+#ifdef __AVX512IFMA__
+ /* AVX512 Integer Fused Multiply-Add */
+ i = _mm512_madd52lo_epu64(i, i, i);
+#endif
+#ifdef __AVX512VBMI__
+ /* AVX512 Vector Byte Manipulation Instructions */
+ i = _mm512_permutexvar_epi8(i, i);
+#endif
+
+ _mm512_mask_storeu_epi64(argv, m, i);
+ _mm512_mask_storeu_ps(argv + 64, m, f);
+ _mm512_mask_storeu_pd(argv + 128, m, d);
+ return 0;
+}
diff --git a/config.tests/common/avx512/avx512.pro b/config.tests/common/avx512/avx512.pro
new file mode 100644
index 0000000000..37cfb2ea54
--- /dev/null
+++ b/config.tests/common/avx512/avx512.pro
@@ -0,0 +1,12 @@
+SOURCES = avx512.cpp
+CONFIG -= qt dylib release debug_and_release
+CONFIG += debug console
+
+isEmpty(AVX512): error("You must set the AVX512 variable!")
+
+varname = QMAKE_CFLAGS_AVX512$$AVX512
+value = $$eval($$varname)
+isEmpty($$varname): error("This compiler does not support AVX512")
+
+QMAKE_CXXFLAGS += $$value
+DEFINES += AVX512WANT=$$AVX512
diff --git a/config.tests/x11/xinput/xinput.cpp b/config.tests/common/xlocalescanprint/qglobal.h
index 1d717c0125..09b48af480 100644
--- a/config.tests/x11/xinput/xinput.cpp
+++ b/config.tests/common/xlocalescanprint/qglobal.h
@@ -31,21 +31,7 @@
**
****************************************************************************/
-#ifdef Q_OS_SOLARIS
-#error "Not supported."
-#else
+#ifndef QGLOBAL_H
+#define QGLOBAL_H
-#include <X11/Xlib.h>
-#include <X11/extensions/XInput.h>
-
-#ifdef Q_OS_IRIX
-# include <wacom.h>
-#endif
-
-int main(int, char **)
-{
- XDeviceButtonEvent *event;
- event = 0;
- return 0;
-}
#endif
diff --git a/config.tests/x11/xvideo/xvideo.cpp b/config.tests/common/xlocalescanprint/xlocalescanprint.cpp
index 087e42530e..4c84404a43 100644
--- a/config.tests/x11/xvideo/xvideo.cpp
+++ b/config.tests/common/xlocalescanprint/xlocalescanprint.cpp
@@ -3,7 +3,7 @@
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the FOO module of the Qt Toolkit.
+** This file is part of the config.tests of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,14 +31,26 @@
**
****************************************************************************/
-#include <X11/Xlib.h>
-#include <X11/extensions/Xv.h>
-#include <X11/extensions/Xvlib.h>
+#define QT_BEGIN_NAMESPACE
+#define QT_END_NAMESPACE
-int main(int argc, char** argv)
+#ifdef _MSVC_VER
+#define Q_CC_MSVC _MSVC_VER
+#endif
+
+#define QT_NO_DOUBLECONVERSION
+
+#include "../../../src/corelib/tools/qdoublescanprint_p.h"
+
+int main(int argc, char **argv)
{
- unsigned int count = 0;
- XvAdaptorInfo *adaptors = 0;
- XvQueryAdaptors(0, 0, &count, &adaptors);
+#ifdef _MSVC_VER
+ _locale_t invalidLocale = NULL;
+#else
+ locale_t invalidLocale = NULL;
+#endif
+ double a = 3.4;
+ qDoubleSnprintf(argv[0], 1, invalidLocale, "invalid format", a);
+ qDoubleSscanf(argv[0], invalidLocale, "invalid format", &a, &argc);
return 0;
}
diff --git a/config.tests/common/xlocalescanprint/xlocalescanprint.pro b/config.tests/common/xlocalescanprint/xlocalescanprint.pro
new file mode 100644
index 0000000000..a37a01f227
--- /dev/null
+++ b/config.tests/common/xlocalescanprint/xlocalescanprint.pro
@@ -0,0 +1,3 @@
+SOURCES = xlocalescanprint.cpp
+CONFIG -= qt
+CONFIG += console
diff --git a/config.tests/unix/arch.test b/config.tests/unix/arch.test
index c50bd8b30a..cfb47def4f 100755
--- a/config.tests/unix/arch.test
+++ b/config.tests/unix/arch.test
@@ -6,7 +6,9 @@ SRCDIR=$3
OUTDIR=$4
RESULTFILE=$5
TARGET=$6
-shift 6
+QMAKE=$7
+QTCONF=$8
+shift 8
if [ "$TARGET" = "host" ]; then
VARPREFIX="CFG_HOST"
@@ -44,7 +46,7 @@ done
test -d "$OUTDIR/config.tests/arch" || mkdir -p "$OUTDIR/config.tests/arch"
cd "$OUTDIR/config.tests/arch"
[ -f Makefile ] && $MAKE distclean >/dev/null 2>&1
-OUTDIR=$OUTDIR "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "INCLUDEPATH+=$INCLUDEPATH" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
+OUTDIR=$OUTDIR "$QMAKE" -qtconf "$QTCONF" -nocache -spec "$QMKSPEC" "LIBS+=$LFLAGS" "QMAKE_CXXFLAGS+=$CXXFLAGS" "INCLUDEPATH+=$INCLUDEPATH" "CONFIG-=app_bundle" "$SRCDIR/config.tests/arch/arch$PROSUFFIX.pro" >/dev/null 2>&1 || echo "qmake is broken" >&2
ARCH=""
diff --git a/config.tests/unix/compile.test b/config.tests/unix/compile.test
index 103321e451..9c0a7cb845 100755
--- a/config.tests/unix/compile.test
+++ b/config.tests/unix/compile.test
@@ -10,12 +10,15 @@ OUTDIR=$5
TEST=$6
EXE=`basename "$6"`
DESCRIPTION=$7
-shift 7
+QMAKE=$8
+QTCONF=$9
+shift 9
LFLAGS="$SYSROOT_FLAG"
INCLUDEPATH=""
CXXFLAGS="$SYSROOT_FLAG"
MAC_ARCH_CXXFLAGS=""
MAC_ARCH_LFLAGS=""
+QMAKE_ARGS=
while [ "$#" -gt 0 ]; do
PARAM=$1
case $PARAM in
@@ -51,7 +54,9 @@ while [ "$#" -gt 0 ]; do
CXXFLAGS="$CXXFLAGS $PARAM \"$2\""
shift
;;
- *) ;;
+ *)
+ QMAKE_ARGS="$QMAKE_ARGS $PARAM"
+ ;;
esac
shift
done
@@ -67,7 +72,7 @@ test -r Makefile && $MAKE distclean >/dev/null 2>&1
# Make sure output from possible previous tests is gone
rm -f "$EXE" "${EXE}.exe"
-set -- "$OUTDIR/bin/qmake" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG+=android_app" "CONFIG-=debug_and_release app_bundle lib_bundle" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
+set -- "$QMAKE" -qtconf "$QTCONF" -nocache -spec "$QMKSPEC" "CONFIG+=$QMAKE_CONFIG" "CONFIG+=android_app" "CONFIG-=debug_and_release app_bundle lib_bundle" "LIBS*=$LFLAGS" "LIBS+=$MAC_ARCH_LFLAGS" "INCLUDEPATH*=$INCLUDEPATH" "QMAKE_CXXFLAGS*=$CXXFLAGS" "QMAKE_CXXFLAGS+=$MAC_ARCH_CXXFLAGS" $QMAKE_ARGS "$SRCDIR/$TEST/$EXE.pro" -o "$OUTDIR/$TEST/Makefile"
if [ "$VERBOSE" = "yes" ]; then
OUTDIR=$OUTDIR "$@" && $MAKE && SUCCESS=yes
else
diff --git a/config.tests/x11/xinerama/xinerama.cpp b/config.tests/unix/doubleconversion/doubleconversion.cpp
index c795791806..4bf14a5b36 100644
--- a/config.tests/x11/xinerama/xinerama.cpp
+++ b/config.tests/unix/doubleconversion/doubleconversion.cpp
@@ -31,12 +31,10 @@
**
****************************************************************************/
-#include <X11/Xlib.h>
-#include <X11/extensions/Xinerama.h>
+#include <double-conversion/double-conversion.h>
int main(int, char **)
{
- XineramaScreenInfo *info;
- info = 0;
- return 0;
+ int flags = double_conversion::StringToDoubleConverter::NO_FLAGS;
+ return flags;
}
diff --git a/config.tests/unix/doubleconversion/doubleconversion.pro b/config.tests/unix/doubleconversion/doubleconversion.pro
new file mode 100644
index 0000000000..ae435b9293
--- /dev/null
+++ b/config.tests/unix/doubleconversion/doubleconversion.pro
@@ -0,0 +1,4 @@
+SOURCES = doubleconversion.cpp
+CONFIG -= qt
+CONFIG += console
+LIBS += -ldouble-conversion
diff --git a/config.tests/x11/xinerama/xinerama.pro b/config.tests/x11/xinerama/xinerama.pro
deleted file mode 100644
index 54d1af031b..0000000000
--- a/config.tests/x11/xinerama/xinerama.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-SOURCES = xinerama.cpp
-CONFIG += x11
-CONFIG -= qt
-LIBS += -lXinerama
diff --git a/config.tests/x11/xinput/xinput.pro b/config.tests/x11/xinput/xinput.pro
deleted file mode 100644
index 8acaede355..0000000000
--- a/config.tests/x11/xinput/xinput.pro
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES = xinput.cpp
-CONFIG += x11
-CONFIG -= qt
-LIBS += -lXi
-irix-*:DEFINES+=Q_OS_IRIX
-solaris-*:DEFINES+=Q_OS_SOLARIS
diff --git a/config.tests/x11/xvideo/xvideo.pro b/config.tests/x11/xvideo/xvideo.pro
deleted file mode 100644
index d4c63a0158..0000000000
--- a/config.tests/x11/xvideo/xvideo.pro
+++ /dev/null
@@ -1,4 +0,0 @@
-CONFIG += x11
-CONFIG -= qt
-SOURCES = xvideo.cpp
-LIBS += -lXv
diff --git a/configure b/configure
index 8f4aa8206d..2a5d0e32c5 100755
--- a/configure
+++ b/configure
@@ -104,9 +104,11 @@ QT_CONFIG=
SUPPORTED=
QMAKE_VARS_FILE=.qmake.vars
DEVICE_VARS_FILE=.device.vars
+HOST_VARS_FILE=.host.vars
:> "$QMAKE_VARS_FILE"
:> "$DEVICE_VARS_FILE"
+:> "$HOST_VARS_FILE"
#-------------------------------------------------------------------------------
# utility functions
@@ -195,15 +197,15 @@ expandQMakeConf()
echo "WARNING: Unable to find file $conf_file" >&2
continue
fi
- expandQMakeConf "$conf_file"
+ expandQMakeConf "$conf_file" "$2"
;;
*load\(device_config\)*)
- conf_file="$DEVICE_VARS_FILE"
+ conf_file="$2"
if [ ! -f "$conf_file" ]; then
echo "WARNING: Unable to find file $conf_file" >&2
continue
fi
- expandQMakeConf "$conf_file"
+ expandQMakeConf "$conf_file" "$2"
;;
*)
echo "$line"
@@ -336,7 +338,7 @@ macSDKify()
getQMakeConf()
{
if [ -z "$specvals" ]; then
- specvals=`expandQMakeConf "$QMAKESPEC/qmake.conf" | extractQMakeVariables "host_build"`
+ specvals=`expandQMakeConf "$QMAKESPEC/qmake.conf" "$HOST_VARS_FILE" | extractQMakeVariables "host_build"`
if [ "$BUILD_ON_MAC" = "yes" ]; then specvals=$(macSDKify "$specvals"); fi
fi
getSingleQMakeVariable "$1" "$specvals"
@@ -345,7 +347,7 @@ getQMakeConf()
getXQMakeConf()
{
if [ -z "$xspecvals" ]; then
- xspecvals=`expandQMakeConf "$XQMAKESPEC/qmake.conf" | extractQMakeVariables "!host_build"`
+ xspecvals=`expandQMakeConf "$XQMAKESPEC/qmake.conf" "$DEVICE_VARS_FILE" | extractQMakeVariables "!host_build"`
if [ "$XPLATFORM_MAC" = "yes" ]; then xspecvals=$(macSDKify "$xspecvals"); fi
fi
getSingleQMakeVariable "$1" "$xspecvals"
@@ -478,6 +480,23 @@ resolveDeviceMkspec()
}
#-------------------------------------------------------------------------------
+# Host options
+#-------------------------------------------------------------------------------
+HostVar()
+{
+ case "$1" in
+ set)
+ eq="="
+ ;;
+ *)
+ echo >&2 "BUG: wrong command to QMakeVar: $1"
+ ;;
+ esac
+
+ echo "$2" "$eq" "$3" >> "$HOST_VARS_FILE"
+}
+
+#-------------------------------------------------------------------------------
# operating system detection
#-------------------------------------------------------------------------------
@@ -502,12 +521,10 @@ BUILD_ON_MAC=no
if [ -d /System/Library/Frameworks/Carbon.framework ]; then
BUILD_ON_MAC=yes
fi
-BUILD_ON_MSYS=no
HOST_DIRLIST_SEP=":"
DEV_NULL=/dev/null
if [ "$OSTYPE" = "msys" ]; then
HOST_DIRLIST_SEP=";"
- BUILD_ON_MSYS=yes
DEV_NULL=/tmp/empty-file
echo "" > $DEV_NULL
relpath=`(cd "$relpath"; pwd -W)`
@@ -608,8 +625,6 @@ CFG_SHARED=yes
CFG_SM=auto
CFG_XSHAPE=auto
CFG_XSYNC=auto
-CFG_XVIDEO=auto
-CFG_XINERAMA=runtime
CFG_XFIXES=runtime
CFG_ZLIB=auto
CFG_MTDEV=auto
@@ -632,6 +647,7 @@ CFG_OPENVG_SHIVA=auto
CFG_OPENVG_ON_OPENGL=auto
CFG_EGL=auto
CFG_EGL_X=auto
+CFG_DOUBLECONVERSION=auto
CFG_FONTCONFIG=auto
CFG_FREETYPE=auto
CFG_HARFBUZZ=qt
@@ -668,7 +684,6 @@ OPT_OBSOLETE_HOST_ARG=no
CFG_USE_GNUMAKE=no
CFG_XINPUT2=auto
-CFG_XINPUT=runtime
CFG_XKB=auto
CFG_XKBCOMMON=yes
CFG_XKBCOMMON_EVDEV=auto
@@ -697,7 +712,7 @@ CFG_CUPS=auto
CFG_ICONV=auto
CFG_DBUS=auto
CFG_GLIB=auto
-CFG_QGTKSTYLE=auto
+CFG_GTK=auto
CFG_LARGEFILE=auto
CFG_OPENSSL=auto
CFG_LIBPROXY=auto
@@ -713,6 +728,7 @@ CFG_SSE4_1=auto
CFG_SSE4_2=auto
CFG_AVX=auto
CFG_AVX2=auto
+CFG_AVX512=auto
CFG_REDUCE_RELOCATIONS=auto
CFG_ACCESSIBILITY=auto
CFG_ACCESSIBILITY_ATSPI_BRIDGE=no # will be enabled depending on dbus and accessibility being enabled
@@ -922,6 +938,7 @@ while [ "$#" -gt 0 ]; do
-hostlibdir| \
-extprefix| \
-sysroot| \
+ -external-hostbindir| \
-depths| \
-make| \
-nomake| \
@@ -930,6 +947,7 @@ while [ "$#" -gt 0 ]; do
-xplatform| \
-device| \
-device-option| \
+ -host-option| \
-sdk| \
-arch| \
-host-arch| \
@@ -1249,6 +1267,10 @@ while [ "$#" -gt 0 ]; do
gcc-sysroot)
CFG_GCC_SYSROOT="$VAL"
;;
+ external-hostbindir)
+ CFG_HOST_QT_TOOLS_PATH="$VAL"
+ HostVar set HOST_QT_TOOLS "$VAL"
+ ;;
bindir)
QT_INSTALL_BINS="$VAL"
;;
@@ -1423,6 +1445,11 @@ while [ "$#" -gt 0 ]; do
DEV_VAL=`echo $VAL | cut -d '=' -f 2-`
DeviceVar set $DEV_VAR "$DEV_VAL"
;;
+ host-option)
+ HOST_VAR=`echo $VAL | cut -d '=' -f 1`
+ HOST_VAL=`echo $VAL | cut -d '=' -f 2-`
+ HostVar set $HOST_VAR "$HOST_VAL"
+ ;;
qpa)
QT_QPA_DEFAULT_PLATFORM="$VAL"
;;
@@ -1517,13 +1544,6 @@ while [ "$#" -gt 0 ]; do
fi
;;
- xinerama)
- if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ] || [ "$VAL" = "runtime" ]; then
- CFG_XINERAMA="$VAL"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
xshape)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_XSHAPE="$VAL"
@@ -1531,13 +1551,6 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- xvideo)
- if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
- CFG_XVIDEO="$VAL"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
xsync)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_XSYNC="$VAL"
@@ -1552,13 +1565,6 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- xinput)
- if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ] || [ "$VAL" = "runtime" ]; then
- CFG_XINPUT="$VAL"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
egl)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_EGL="$VAL"
@@ -1644,6 +1650,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ avx512)
+ if [ "$VAL" = "no" ]; then
+ CFG_AVX512=""
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
mips_dsp)
if [ "$VAL" = "no" ]; then
CFG_MIPS_DSP="$VAL"
@@ -1761,6 +1774,13 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
+ doubleconversion)
+ if [ "$VAL" = "qt" ] || [ "$VAL" = "no" ] || [ "$VAL" = "system" ]; then
+ CFG_DOUBLECONVERSION="$VAL"
+ else
+ UNKNOWN_OPT=yes
+ fi
+ ;;
fontconfig)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
CFG_FONTCONFIG="$VAL"
@@ -1959,9 +1979,9 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- gtkstyle)
+ gtk)
if [ "$VAL" = "yes" ] || [ "$VAL" = "no" ]; then
- CFG_QGTKSTYLE="$VAL"
+ CFG_GTK="$VAL"
else
UNKNOWN_OPT=yes
fi
@@ -2242,28 +2262,19 @@ while [ "$#" -gt 0 ]; do
UNKNOWN_OPT=yes
fi
;;
- c++11)
- if [ "$VAL" = "yes" ]; then
- CFG_STDCXX="c++11"
- elif [ "$VAL" = "no" ]; then
- CFG_STDCXX="c++98"
- else
- UNKNOWN_OPT=yes
- fi
- ;;
c++std)
case "$VAL" in
- c++98|c++11|c++14|c++1z|auto)
+ c++11|c++14|c++1z|auto)
CFG_STDCXX="$VAL"
;;
- 98|11|14|1z)
+ 11|14|1z)
CFG_STDCXX="c++$VAL"
;;
1y|c++1y)
CFG_STDCXX="c++14"
;;
*)
- echo >&2 "Invalid C++ edition: $VAL; valid options are: c++98 c++11 c++14 c++1z auto"
+ echo >&2 "Invalid C++ edition: $VAL; valid options are: c++11 c++14 c++1z auto"
ERROR=yes
;;
esac
@@ -2439,7 +2450,7 @@ Configure options:
-confirm-license ... Automatically acknowledge the license (use with
either -opensource or -commercial)
- -c++std <edition> .. Compile Qt with C++ standard edition (c++98, c++11, c++14, c++1z)
+ -c++std <edition> .. Compile Qt with C++ standard edition (c++11, c++14, c++1z)
Default: highest supported
* -shared ............ Create and use shared Qt libraries.
@@ -2482,6 +2493,7 @@ Configure options:
-no-sse4.2 ......... Do not compile with use of SSE4.2 instructions.
-no-avx ............ Do not compile with use of AVX instructions.
-no-avx2 ........... Do not compile with use of AVX2 instructions.
+ -no-avx512 ......... Do not compile with use of AVX512 instructions.
-no-mips_dsp ....... Do not compile with use of MIPS DSP instructions.
-no-mips_dspr2 ..... Do not compile with use of MIPS DSP rev2 instructions.
@@ -2531,6 +2543,11 @@ Third Party Libraries:
+ -system-libjpeg ..... Use libjpeg from the operating system.
See http://www.ijg.org
+ -no-doubleconversion ..... Use sscanf_l and snprintf_l for (imprecise) double conversion.
+ -qt-doubleconversion ..... Use the libdouble-conversion bundled with Qt.
+ + -system-doubleconversion . Use the libdouble-conversion provided by the system.
+ See https://github.com/google/double-conversion
+
-no-freetype ........ Do not compile in Freetype2 support.
-qt-freetype ........ Use the libfreetype bundled with Qt.
+ -system-freetype..... Use the libfreetype provided by the system (enabled if -fontconfig is active).
@@ -2581,8 +2598,8 @@ Third Party Libraries:
-no-alsa ............ Do not compile ALSA support.
+ -alsa ............... Compile ALSA support.
- -no-gtkstyle ........ Do not compile GTK theme support.
- + -gtkstyle ........... Compile GTK theme support.
+ -no-gtk ............. Do not compile GTK platform theme support.
+ + -gtk ................ Compile GTK platform theme support.
Additional options:
@@ -2671,6 +2688,8 @@ Additional options:
-device-option <key=value> ... Add device specific options for the device mkspec
(experimental)
+ -host-option <key=value> ..... Add host specific options for the host mkspec
+
* -no-separate-debug-info . Do not store debug information in a separate file.
-separate-debug-info .... Strip debug information into a separate file.
@@ -2702,6 +2721,9 @@ Additional options:
-sysroot <dir> ...... Sets <dir> as the target compiler's and qmake's sysroot and also sets pkg-config paths.
-no-gcc-sysroot ..... When using -sysroot, it disables the passing of --sysroot to the compiler
+ -external-hostbindir <path> .. Path to Qt tools built for this machine. Use this when -platform
+ does not match the current system, i.e., to make a Canadian Cross Build.
+
-no-feature-<feature> Do not compile in <feature>.
-feature-<feature> .. Compile in <feature>. The available features
are described in src/corelib/global/qfeatures.txt
@@ -3409,7 +3431,7 @@ fi
# disable XCB and GTK support auto-detection on Mac
if [ "$XPLATFORM_MAC" = "yes" ]; then
[ "$CFG_XCB" = "auto" ] && CFG_XCB=no
- [ "$CFG_QGTKSTYLE" = "auto" ] && CFG_QGTKSTYLE=no
+ [ "$CFG_GTK" = "auto" ] && CFG_GTK=no
fi
QMAKE_CONF_COMPILER=`getXQMakeConf QMAKE_CXX`
@@ -3633,10 +3655,9 @@ END {
print "DEFAULT_LIBDIRS=\"/lib\n/usr/lib\"\n";
}'
-unset tty
-[ "$OPT_VERBOSE" = "yes" ] && tty=/dev/stderr
-eval "`LC_ALL=C $TEST_COMPILER $SYSROOT_FLAG $TEST_COMPILER_CXXFLAGS -xc++ -E -v - < /dev/null 2>&1 > /dev/null | $AWK "$awkprog" | tee $tty`"
-unset tty
+awkprog_result=`LC_ALL=C $TEST_COMPILER $SYSROOT_FLAG $TEST_COMPILER_CXXFLAGS -xc++ -E -v - < /dev/null 2>&1 > /dev/null | $AWK "$awkprog"`
+eval "$awkprog_result"
+[ "$OPT_VERBOSE" = "yes" ] && echo "$awkprog_result"
echo "Done running configuration tests."
@@ -4000,7 +4021,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
EXTRA_OBJS=
EXTRA_SRCS=
EXTRA_CFLAGS="\$(QMAKE_CFLAGS) \$(QMAKE_CFLAGS_SPLIT_SECTIONS)"
- EXTRA_CXXFLAGS="\$(QMAKE_CXXFLAGS) \$(QMAKE_CXXFLAGS_SPLIT_SECTIONS)"
+ EXTRA_CXXFLAGS="\$(QMAKE_CXXFLAGS) \$(QMAKE_CXXFLAGS_CXX11) \$(QMAKE_CXXFLAGS_SPLIT_SECTIONS)"
EXTRA_LFLAGS="\$(QMAKE_LFLAGS) \$(QMAKE_LFLAGS_GCSECTIONS)"
if [ "$PLATFORM" = "irix-cc" ] || [ "$PLATFORM" = "irix-cc-64" ]; then
@@ -4013,6 +4034,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
setBootstrapVariable QMAKE_CFLAGS
setBootstrapVariable QMAKE_CFLAGS_SPLIT_SECTIONS
setBootstrapVariable QMAKE_CXXFLAGS
+ setBootstrapVariable QMAKE_CXXFLAGS_CXX11
setBootstrapVariable QMAKE_CXXFLAGS_SPLIT_SECTIONS
setBootstrapVariable QMAKE_LFLAGS
setBootstrapVariable QMAKE_LFLAGS_GCSECTIONS
@@ -4035,7 +4057,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
EXTRA_LFLAGS="\$(QMAKE_LFLAGS_RPATH)\"$rpath\" $EXTRA_LFLAGS"
done
fi
- if [ "$BUILD_ON_MSYS" = "yes" ]; then
+ case `basename "$PLATFORM"` in
+ win32-g++*)
EXTRA_CFLAGS="-DUNICODE"
EXTRA_CXXFLAGS="-DUNICODE"
EXTRA_OBJS="qfilesystemengine_win.o \
@@ -4054,7 +4077,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
\"\$(SOURCE_PATH)/tools/shared/windows/registry.cpp\""
EXTRA_LFLAGS="-static -s -lole32 -luuid -ladvapi32 -lkernel32"
EXEEXT=".exe"
- else
+ ;;
+ *)
EXTRA_OBJS="qfilesystemengine_unix.o \
qfilesystemiterator_unix.o \
qfsfileengine_unix.o \
@@ -4064,7 +4088,8 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
\"\$(SOURCE_PATH)/src/corelib/io/qfsfileengine_unix.cpp\" \
\"\$(SOURCE_PATH)/src/corelib/tools/qlocale_unix.cpp\""
EXEEXT=
- fi
+ ;;
+ esac
if [ "$BUILD_ON_MAC" = "yes" ]; then
echo "COCOA_LFLAGS =-framework Foundation -framework CoreServices" >>"$mkfile"
echo "CARBON_LFLAGS =-framework ApplicationServices" >>"$mkfile"
@@ -4085,6 +4110,7 @@ if true; then ###[ '!' -f "$outpath/bin/qmake" ];
if [ '!' -z "$D_FLAGS" ]; then
EXTRA_CFLAGS="$EXTRA_CFLAGS $D_FLAGS"
fi
+
echo >>"$mkfile"
adjrelpath=`echo "$relpath" | sed 's/ /\\\\\\\\ /g'`
adjoutpath=`echo "$outpath" | sed 's/ /\\\\\\\\ /g'`
@@ -4154,7 +4180,16 @@ QTCONFFILE="$outpath/bin/qt.conf"
cat > "$QTCONFFILE" <<EOF
[EffectivePaths]
Prefix=..
+[Paths]
+Prefix=$QT_EXT_PREFIX
+TargetSpec=$XQMAKESPEC
+HostSpec=$QMAKESPEC
EOF
+if [ -n "$CFG_SYSROOT" ]; then
+ cat >> "$QTCONFFILE" <<EOF
+Sysroot=$CFG_SYSROOT
+EOF
+fi
if [ x"$relpath" != x"$outpath" ]; then
cat >> "$QTCONFFILE" <<EOF
[EffectiveSourcePaths]
@@ -4162,6 +4197,9 @@ Prefix=$relpath
EOF
fi
+[ -z "$CFG_HOST_QT_TOOLS_PATH" ] && CFG_HOST_QT_TOOLS_PATH="$outpath/bin"
+CFG_QMAKE_PATH="$CFG_HOST_QT_TOOLS_PATH/qmake"
+
#-------------------------------------------------------------------------------
# write out device config before we run the test.
#-------------------------------------------------------------------------------
@@ -4174,9 +4212,20 @@ else
fi
#-------------------------------------------------------------------------------
+# write out host config.
+#-------------------------------------------------------------------------------
+HOST_VARS_OUTFILE="$outpath/mkspecs/qhost.pri"
+if cmp -s "$HOST_VARS_FILE" "$HOST_VARS_OUTFILE"; then
+ rm -f "$HOST_VARS_FILE"
+else
+ mv -f $HOST_VARS_FILE "$HOST_VARS_OUTFILE"
+ HOST_VARS_FILE="$HOST_VARS_OUTFILE"
+fi
+
+#-------------------------------------------------------------------------------
# Verify makespec
#-------------------------------------------------------------------------------
-QMAKE_OUTPUT=`"$outpath/bin/qmake" -E -nocache -spec "$XQMAKESPEC" "QT=" $DEV_NULL 2>&1`
+QMAKE_OUTPUT=`"$CFG_QMAKE_PATH" -qtconf "$QTCONFFILE" -E -nocache -spec "$XQMAKESPEC" "QT=" $DEV_NULL 2>&1`
if [ $? != "0" ]; then
echo "Failed to process makespec for platform '$XPLATFORM'"
if [ "$OPT_VERBOSE" = "yes" ]; then
@@ -4192,7 +4241,7 @@ fi
#-------------------------------------------------------------------------------
if [ -z "$PKG_CONFIG" ]; then
# See if PKG_CONFIG is set in the mkspec:
- PKG_CONFIG="`"$outpath/bin/qmake" -E -nocache -spec "$XQMAKESPEC" "CONFIG=" $DEV_NULL 2>&1 | sed -n -e 's,^PKG_CONFIG = \(.*\),\1,p'`"
+ PKG_CONFIG="`"$CFG_QMAKE_PATH" -qtconf "$QTCONFFILE" -E -nocache -spec "$XQMAKESPEC" "CONFIG=" $DEV_NULL 2>&1 | sed -n -e 's,^PKG_CONFIG = \(.*\),\1,p'`"
[ -n "$PKG_CONFIG" ] && [ "$OPT_VERBOSE" = "yes" ] && echo "Found pkg-config from mkspec: $PKG_CONFIG"
fi
if [ -z "$PKG_CONFIG" ]; then
@@ -4267,7 +4316,7 @@ compileTest()
if [ "$CFG_SHARED" = "no" ]; then
test_config="$QMAKE_CONFIG static"
fi
- "$unixtests/compile.test" "$XQMAKESPEC" "$test_config" $OPT_VERBOSE "$relpath" "$outpath" "$path" "$name" $I_FLAGS $D_FLAGS $L_FLAGS "$@"
+ "$unixtests/compile.test" "$XQMAKESPEC" "$test_config" $OPT_VERBOSE "$relpath" "$outpath" "$path" "$name" "$CFG_QMAKE_PATH" "$QTCONFFILE" $I_FLAGS $D_FLAGS $L_FLAGS "$@"
}
compileTestWithPkgConfig()
@@ -4316,7 +4365,7 @@ compileTestWithPkgConfig()
# Use config.tests/arch/arch.pro to have the compiler tell us what the target architecture is
OUTFILE=$outpath/arch.result
-"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" $I_FLAGS $D_FLAGS $L_FLAGS
+"$unixtests/arch.test" "$XQMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "target" $CFG_QMAKE_PATH $QTCONFFILE $I_FLAGS $D_FLAGS $L_FLAGS
if [ $? -eq 0 ]; then
eval `cat "$OUTFILE"`
else
@@ -4329,7 +4378,7 @@ rm -f "$OUTFILE" 2>/dev/null
if [ "$QMAKESPEC" != "$XQMAKESPEC" ]; then
# Do the same test again, using the host compiler
- SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" $I_FLAGS $D_FLAGS $L_FLAGS
+ SYSROOT_FLAG= "$unixtests/arch.test" "$QMAKESPEC" $OPT_VERBOSE "$relpath" "$outpath" "$OUTFILE" "host" $CFG_QMAKE_PATH $QTCONFFILE $I_FLAGS $D_FLAGS $L_FLAGS
if [ $? -eq 0 ]; then
eval `cat "$OUTFILE"`
else
@@ -4365,20 +4414,11 @@ if [ "$CFG_SEPARATE_DEBUG_INFO" = "yes" ]; then
fi
# Detect C++11 & up support
-# Configure detects compiler features based on cross compiler, so we need
-# to explicitly disable C++11 on Mac to avoid breaking builds where the
-# host compiler does not support it.
stdcxx_error=false
-if [ "$BUILD_ON_MAC" = "yes" ] && [ "$XPLATFORM_ANDROID" = "yes" ]; then
- CFG_STDCXX="c++98"
-elif [ "$CFG_STDCXX" = "c++98" ]; then
- : # CFG_STDCXX is correct
-elif ! compileTest common/c++11 "C++11"; then
- if [ "$CFG_STDCXX" != "auto" ]; then
- stdcxx_error=true
- else
- CFG_STDCXX="c++98"
- fi
+if ! compileTest common/c++11 "C++11"; then
+ echo "ERROR: Qt requires a C++11 compiler and yours does not seem to be that."
+ echo "Please upgrade."
+ exit 1
elif [ "$CFG_STDCXX" = "c++11" ]; then
: # CFG_STDCXX is correct
elif ! compileTest common/c++14 "C++14"; then
@@ -4432,9 +4472,11 @@ else
fi
# detect sse2 support
+CFG_SSE_LIST=
if [ "${CFG_SSE2}" = "auto" ]; then
if compileTest common/sse2 "sse2"; then
CFG_SSE2=yes
+ CFG_SSE_LIST=SSE2
else
CFG_SSE2=no
fi
@@ -4447,6 +4489,7 @@ fi
if [ "${CFG_SSE3}" = "auto" ]; then
if compileTest common/sse3 "sse3"; then
CFG_SSE3=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSE3"
else
CFG_SSE3=no
fi
@@ -4459,6 +4502,7 @@ fi
if [ "${CFG_SSSE3}" = "auto" ]; then
if compileTest common/ssse3 "ssse3"; then
CFG_SSSE3=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSSE3"
else
CFG_SSSE3=no
fi
@@ -4471,6 +4515,7 @@ fi
if [ "${CFG_SSE4_1}" = "auto" ]; then
if compileTest common/sse4_1 "sse4_1"; then
CFG_SSE4_1=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSE4.1"
else
CFG_SSE4_1=no
fi
@@ -4483,12 +4528,14 @@ fi
if [ "${CFG_SSE4_2}" = "auto" ]; then
if compileTest common/sse4_2 "sse4_2"; then
CFG_SSE4_2=yes
+ CFG_SSE_LIST="$CFG_SSE_LIST SSE4.2"
else
CFG_SSE4_2=no
fi
fi
# detect avx support
+CFG_AVX_LIST=
if [ "${CFG_SSE4_2}" = "no" ]; then
CFG_AVX=no
fi
@@ -4506,11 +4553,13 @@ if [ "${CFG_AVX}" = "auto" ]; then
;;
*)
CFG_AVX=yes
+ CFG_AVX_LIST=AVX
;;
esac
;;
*)
CFG_AVX=yes
+ CFG_AVX_LIST=AVX
;;
esac
else
@@ -4525,11 +4574,37 @@ fi
if [ "${CFG_AVX2}" = "auto" ]; then
if compileTest common/avx2 "avx2"; then
CFG_AVX2=yes
+ CFG_AVX_LIST="$CFG_AVX_LIST AVX2"
else
CFG_AVX2=no
fi
fi
+# detect avx512 support
+if [ "${CFG_AVX512}" = "auto" ]; then
+ # First, test for AVX-512 Foundation
+ if compileTest common/avx512 "avx512f" AVX512=F; then
+ # Test for the sub-features
+ CFG_AVX512=f
+ CFG_AVX512_UPPER=AVX512F
+ for feature in er cd pf dq bw vl ifma vbmi; do
+ if [ -n "$BASH_VERSION" ] && [ "${BASH_VERSION%%.*}" -gt 3 ]; then
+ upper=${feature^^*}
+ elif [ -n "$ZSH_VERSION" ]; then
+ upper=${(U)feature}
+ else
+ upper=`echo $feature | tr a-z A-Z`
+ fi
+ if compileTest common/avx512 "avx512$feature" AVX512=$upper; then
+ CFG_AVX512="$CFG_AVX512 $feature"
+ CFG_AVX512_UPPER="$CFG_AVX512_UPPER AVX512$upper"
+ fi
+ done
+ else
+ CFG_AVX512=
+ fi
+fi
+
# check Neon support
if [ "$CFG_NEON" = "auto" ]; then
# no compile test, just check what the compiler has
@@ -4545,7 +4620,7 @@ fi
# detect mips_dsp support
if [ "$CFG_ARCH" = "mips" ] && [ "${CFG_MIPS_DSP}" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dsp "mips_dsp" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dsp "mips_dsp" "$CFG_QMAKE_PATH" "$QTCONFFILE" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
CFG_MIPS_DSP=yes
else
CFG_MIPS_DSP=no
@@ -4556,7 +4631,7 @@ fi
# detect mips_dspr2 support
if [ "$CFG_ARCH" = "mips" ] && [ "${CFG_MIPS_DSPR2}" = "auto" ]; then
- if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dspr2 "mips_dspr2" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
+ if "$unixtests/compile.test" "$XQMAKESPEC" "$QMAKE_CONFIG" $OPT_VERBOSE "$relpath" "$outpath" config.tests/unix/mips_dspr2 "mips_dspr2" "$CFG_QMAKE_PATH" "$QTCONFFILE" $L_FLAGS $I_FLAGS $D_FLAGS $l_FLAGS; then
CFG_MIPS_DSPR2=yes
else
CFG_MIPS_DSPR2=no
@@ -5127,33 +5202,31 @@ if [ "$CFG_GLIB" != "no" ]; then
fi
# auto-detect GTK style support
-if [ "$CFG_GLIB" = "yes" -a "$CFG_QGTKSTYLE" != "no" ]; then
+if [ "$CFG_GLIB" = "yes" -a "$CFG_GTK" != "no" ]; then
if [ -n "$PKG_CONFIG" ]; then
QT_CFLAGS_QGTK2=`$PKG_CONFIG --cflags gtk+-2.0 ">=" 2.18 atk 2>/dev/null`
QT_LIBS_QGTK2=`$PKG_CONFIG --libs gtk+-2.0 2>/dev/null`
QT_LIBS_QGOBJECT=`$PKG_CONFIG --libs gobject-2.0 2>/dev/null`
fi
if [ -n "$QT_CFLAGS_QGTK2" ] ; then
- CFG_QGTKSTYLE=yes
- QT_CONFIG="$QT_CONFIG gtk2 gtkstyle"
- QMakeVar set QT_CFLAGS_QGTKSTYLE "$QT_CFLAGS_QGTK2"
- QMakeVar set QT_LIBS_QGTKSTYLE "$QT_LIBS_QGOBJECT"
+ CFG_GTK=yes
+ QT_CONFIG="$QT_CONFIG gtk2"
QMakeVar set QT_CFLAGS_QGTK2 "$QT_CFLAGS_QGTK2"
QMakeVar set QT_LIBS_QGTK2 "$QT_LIBS_QGTK2"
else
- if [ "$CFG_QGTKSTYLE" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
+ if [ "$CFG_GTK" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "GTK theme support cannot be enabled due to functionality tests!"
[ -z "$PKG_CONFIG" ] && echo " Use of pkg-config is not enabled, maybe you want to pass -pkg-config?"
- echo " Turn on verbose messaging (-v) to $0 to see the fin al report."
+ echo " Turn on verbose messaging (-v) to $0 to see the final report."
echo " If you believe this message is in error you may use the continue"
echo " switch (-continue) to $0 to continue."
exit 101
else
- CFG_QGTKSTYLE=no
+ CFG_GTK=no
fi
fi
elif [ "$CFG_GLIB" = "no" ]; then
- CFG_QGTKSTYLE=no
+ CFG_GTK=no
fi
# auto-detect libicu support
@@ -5502,7 +5575,6 @@ if [ "$CFG_XINPUT2" != "no" ]; then
QMakeVar set QMAKE_LIBXI_VERSION_PATCH "$QMAKE_LIBXI_VERSION_PATCH"
fi
CFG_XINPUT2=yes
- CFG_XINPUT=no
else
if [ "$CFG_XINPUT2" = "yes" ] && [ "$CFG_CONFIGURE_EXIT_ON_ERROR" = "yes" ]; then
echo "XInput2 support cannot be enabled due to functionality tests!"
@@ -5871,6 +5943,24 @@ if [ "$XPLATFORM_MAC" = "no" ] && [ "$XPLATFORM_MINGW" = "no" ] && [ "$XPLATFORM
fi
fi
+# double-conversion support
+if [ "$CFG_DOUBLECONVERSION" = "no" ]; then
+ if ! compileTest common/xlocalescanprint "XLocaleScanPrint"; then
+ echo "Your C library does not provide sscanf_l or snprintf_l."
+ echo "You need to use libdouble-conversion for double/string conversion."
+ exit 1
+ fi
+elif [ "$CFG_DOUBLECONVERSION" != "qt" ]; then
+ if compileTest unix/doubleconversion "DoubleConversion"; then
+ CFG_DOUBLECONVERSION=system
+ elif [ "$CFG_DOUBLECONVERSION" = "system" ]; then
+ echo "No system libdouble-conversion found."
+ exit 1
+ else
+ CFG_DOUBLECONVERSION=qt
+ fi
+fi
+
# freetype support
[ "$XPLATFORM_MINGW" = "yes" ] && [ "$CFG_FREETYPE" = "auto" ] && CFG_FREETYPE=no
if [ "$CFG_FREETYPE" = "auto" ]; then
@@ -6176,13 +6266,12 @@ fi
# ask for all that hasn't been auto-detected or specified in the arguments
#-------------------------------------------------------------------------------
-if [ "$CFG_STDCXX" != "c++98" ]; then
- QT_CONFIG="$QT_CONFIG c++11"
- if [ "$CFG_STDCXX" != "c++11" ]; then
- QT_CONFIG="$QT_CONFIG c++14"
- if [ "$CFG_STDCXX" != "c++14" ]; then
- QT_CONFIG="$QT_CONFIG c++1z"
- fi
+# Set "c++11" unconditionally, as lots of code does contains(QT_CONFIG, c++11)
+QT_CONFIG="$QT_CONFIG c++11"
+if [ "$CFG_STDCXX" != "c++11" ]; then
+ QT_CONFIG="$QT_CONFIG c++14"
+ if [ "$CFG_STDCXX" != "c++14" ]; then
+ QT_CONFIG="$QT_CONFIG c++1z"
fi
fi
@@ -6309,6 +6398,9 @@ fi
[ "$CFG_SSE4_2" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG sse4_2"
[ "$CFG_AVX" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG avx"
[ "$CFG_AVX2" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG avx2"
+for feature in $CFG_AVX512; do
+ QMAKE_CONFIG="$QMAKE_CONFIG avx512$feature"
+done
[ "$CFG_NEON" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG neon"
if [ "$CFG_ARCH" = "mips" ]; then
[ "$CFG_MIPS_DSP" = "yes" ] && QMAKE_CONFIG="$QMAKE_CONFIG mips_dsp"
@@ -6370,6 +6462,13 @@ if [ "$CFG_GIF" = "no" ]; then
elif [ "$CFG_GIF" = "yes" ]; then
QT_CONFIG="$QT_CONFIG gif"
fi
+if [ "$CFG_DOUBLECONVERSION" = "no" ]; then
+ QT_CONFIG="$QT_CONFIG no-doubleconversion"
+elif [ "$CFG_DOUBLECONVERSION" = "system" ]; then
+ QT_CONFIG="$QT_CONFIG system-doubleconversion"
+else
+ QT_CONFIG="$QT_CONFIG doubleconversion"
+fi
if [ "$CFG_FREETYPE" = "no" ]; then
QT_CONFIG="$QT_CONFIG no-freetype"
QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_FREETYPE"
@@ -6784,6 +6883,9 @@ for SUBARCH in SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AVX AVX2 \
;;
esac
done
+for feature in $CFG_AVX512_UPPER; do
+ echo "#define QT_COMPILER_SUPPORTS_$feature 1"
+done
echo ""
@@ -6825,7 +6927,6 @@ QMakeVar set sql-plugins "$SQL_PLUGINS"
[ "$CFG_ICONV" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_ICONV"
[ "$CFG_EVDEV" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_EVDEV"
[ "$CFG_GLIB" != "yes" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_GLIB"
-[ "$CFG_QGTKSTYLE" != "yes" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_STYLE_GTK"
[ "$CFG_CLOCK_MONOTONIC" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_CLOCK_MONOTONIC"
[ "$CFG_POSIX_FALLOCATE" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_POSIX_FALLOCATE"
[ "$CFG_MREMAP" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_MREMAP"
@@ -6846,21 +6947,16 @@ QMakeVar set sql-plugins "$SQL_PLUGINS"
[ "$CFG_XCURSOR" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XCURSOR"
[ "$CFG_XFIXES" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XFIXES"
[ "$CFG_FONTCONFIG" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_FONTCONFIG"
-[ "$CFG_XINERAMA" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XINERAMA"
[ "$CFG_XKB" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XKB"
[ "$CFG_XRANDR" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XRANDR"
[ "$CFG_XRENDER" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XRENDER"
[ "$CFG_MITSHM" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_MITSHM"
[ "$CFG_XSHAPE" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_SHAPE"
-[ "$CFG_XVIDEO" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XVIDEO"
[ "$CFG_XSYNC" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XSYNC"
-[ "$CFG_XINPUT" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_XINPUT QT_NO_TABLET"
[ "$CFG_XCURSOR" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XCURSOR"
-[ "$CFG_XINERAMA" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XINERAMA"
[ "$CFG_XFIXES" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XFIXES"
[ "$CFG_XRANDR" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XRANDR"
-[ "$CFG_XINPUT" = "runtime" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_RUNTIME_XINPUT"
[ "$CFG_ALSA" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_ALSA"
[ "$CFG_PULSEAUDIO" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_PULSEAUDIO"
[ "$CFG_COREWLAN" = "no" ] && QCONFIG_FLAGS="$QCONFIG_FLAGS QT_NO_COREWLAN"
@@ -7250,9 +7346,9 @@ echo " Using PCH .............. $CFG_PRECOMPILE"
echo " Using LTCG ............. $CFG_LTCG"
echo " Target compiler supports:"
if [ "$CFG_ARCH" = "i386" -o "$CFG_ARCH" = "x86_64" ]; then
- echo " SSE2/SSE3/SSSE3 ...... ${CFG_SSE2}/${CFG_SSE3}/${CFG_SSSE3}"
- echo " SSE4.1/SSE4.2 ........ ${CFG_SSE4_1}/${CFG_SSE4_2}"
- echo " AVX/AVX2 ............. ${CFG_AVX}/${CFG_AVX2}"
+ echo " SSE .................. ${CFG_SSE_LIST:-<none>}"
+ echo " AVX .................. ${CFG_AVX_LIST:-<none>}"
+ echo " AVX512 ............... ${CFG_AVX512_UPPER:-<none>}"
elif [ "$CFG_ARCH" = "arm" ]; then
echo " Neon ................. ${CFG_NEON}"
elif [ "$CFG_ARCH" = "mips" ]; then
@@ -7280,12 +7376,13 @@ report_support " ALSA ..................." "$CFG_ALSA"
report_support " CUPS ..................." "$CFG_CUPS"
[ "$XPLATFORM_MINGW" = "yes" ] && \
report_support " DirectWrite ............" "$CFG_DIRECTWRITE"
+report_support " DoubleConversion........" "$CFG_DOUBLECONVERSION" no "libc" system "system library" qt "bundled copy"
report_support " Evdev .................." "$CFG_EVDEV"
report_support " FontConfig ............." "$CFG_FONTCONFIG"
report_support " FreeType ..............." "$CFG_FREETYPE" system "system library" yes "bundled copy"
report_support " Glib ..................." "$CFG_GLIB"
report_support " GStreamer .............." "$CFG_GSTREAMER" yes "$CFG_GSTREAMER_VERSION"
-report_support " GTK theme .............." "$CFG_QGTKSTYLE"
+report_support " GTK platformtheme ......" "$CFG_GTK"
report_support " HarfBuzz ..............." "$CFG_HARFBUZZ" system "system library" qt "bundled copy"
report_support " Iconv .................." "$CFG_ICONV"
report_support " ICU ...................." "$CFG_ICU"
@@ -7340,15 +7437,12 @@ if [ "$CFG_XCB" != "no" ]; then
report_support " Xcb-Xlib ..........." "$CFG_XCB_XLIB"
report_support " Xcursor ............" "$CFG_XCURSOR" runtime "loaded at runtime"
report_support " Xfixes ............." "$CFG_XFIXES" runtime "loaded at runtime"
- report_support " Xi ................." "$CFG_XINPUT" runtime "loaded at runtime"
report_support " Xi2 ................" "$CFG_XINPUT2" runtime "loaded at runtime"
- report_support " Xinerama ..........." "$CFG_XINERAMA" runtime "loaded at runtime"
report_support " Xrandr ............." "$CFG_XRANDR" runtime "loaded at runtime"
report_support " Xrender ............" "$CFG_XRENDER"
report_support " XKB ................" "$CFG_XKB"
report_support " XShape ............." "$CFG_XSHAPE"
report_support " XSync .............." "$CFG_XSYNC"
- report_support " XVideo ............." "$CFG_XVIDEO"
fi
report_support " Session management ....." "$CFG_SM"
if [ "$XPLATFORM_QNX" = "yes" ]; then
@@ -7436,7 +7530,7 @@ rm -f "$QMAKE_VARS_FILE" 2>/dev/null
cd ..
fi
- "$outpath/bin/qmake" "$relpathMangled"
+ "$CFG_QMAKE_PATH" -qtconf "$QTCONFFILE" "$relpathMangled"
) || exit
@@ -7511,20 +7605,6 @@ EOF
fi
#-------------------------------------------------------------------------------
-# check if the user passed the deprecated -no-c++11 / --c++-level=c++98 option
-#-------------------------------------------------------------------------------
-if [ "$CFG_STDCXX" = "c++98" ]; then
-cat <<EOF
-
- NOTICE: The -no-c++11 / --c++-level=c++98 option is deprecated.
-
- Qt 5.7 will require C++11 support. The options are in effect for this
- Qt 5.6 build, but you should update your build scripts to remove the
- option and, if necessary, upgrade your compiler.
-EOF
-fi
-
-#-------------------------------------------------------------------------------
# finally save the executed command to another script
#-------------------------------------------------------------------------------
if [ `basename $0` != "config.status" ]; then
diff --git a/examples/network/network.pro b/examples/network/network.pro
index 8ed72315e2..92003950a7 100644
--- a/examples/network/network.pro
+++ b/examples/network/network.pro
@@ -11,19 +11,25 @@ qtHaveModule(widgets) {
blockingfortuneclient \
broadcastreceiver \
broadcastsender \
- fortuneclient \
- fortuneserver \
http \
loopback \
threadedfortuneserver \
googlesuggest \
torrent \
- bearermonitor \
multicastreceiver \
multicastsender
- # no QProcess
- !vxworks:!qnx:!winrt:SUBDIRS += network-chat
+ load(qfeatures)
+ !contains(QT_DISABLED_FEATURES, bearermanagement) {
+ # no QProcess
+ !vxworks:!qnx:!winrt:SUBDIRS += network-chat
+
+ SUBDIRS += \
+ bearermonitor \
+ fortuneclient \
+ fortuneserver
+
+ }
contains(QT_CONFIG, openssl):SUBDIRS += securesocketclient
contains(QT_CONFIG, openssl-linked):SUBDIRS += securesocketclient
diff --git a/examples/widgets/mac/qmaccocoaviewcontainer/main.mm b/examples/widgets/mac/qmaccocoaviewcontainer/main.mm
index 870ab65ff7..8ef8a50254 100644
--- a/examples/widgets/mac/qmaccocoaviewcontainer/main.mm
+++ b/examples/widgets/mac/qmaccocoaviewcontainer/main.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtWidgets>
#include <QMacCocoaViewContainer>
diff --git a/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro b/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
index c8c2195cb8..9dea65bf9f 100644
--- a/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
+++ b/examples/widgets/mac/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
OBJECTIVE_SOURCES += main.mm
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
QT += widgets
diff --git a/examples/widgets/mac/qmacnativewidget/main.mm b/examples/widgets/mac/qmacnativewidget/main.mm
index b01db8051b..436be55675 100644
--- a/examples/widgets/mac/qmacnativewidget/main.mm
+++ b/examples/widgets/mac/qmacnativewidget/main.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QApplication>
#include <QDebug>
diff --git a/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro b/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro
index cafff9f035..9da91c7be0 100644
--- a/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro
+++ b/examples/widgets/mac/qmacnativewidget/qmacnativewidget.pro
@@ -1,7 +1,7 @@
TEMPLATE = app
OBJECTIVE_SOURCES += main.mm
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
QT += widgets
#QT += widgets-private gui-private core-private
diff --git a/examples/widgets/mainwindows/mainwindow/colorswatch.cpp b/examples/widgets/mainwindows/mainwindow/colorswatch.cpp
index d746bbe8d3..cd0543ecd9 100644
--- a/examples/widgets/mainwindows/mainwindow/colorswatch.cpp
+++ b/examples/widgets/mainwindows/mainwindow/colorswatch.cpp
@@ -468,11 +468,13 @@ void ColorSwatch::tabInto(QAction *action)
mainWindow->tabifyDockWidget(target, this);
}
+#ifndef QT_NO_CONTEXTMENU
void ColorSwatch::contextMenuEvent(QContextMenuEvent *event)
{
event->accept();
menu->exec(event->globalPos());
}
+#endif // QT_NO_CONTEXTMENU
void ColorSwatch::resizeEvent(QResizeEvent *e)
{
diff --git a/examples/widgets/mainwindows/mainwindow/colorswatch.h b/examples/widgets/mainwindows/mainwindow/colorswatch.h
index 8827a7dca7..251807d60f 100644
--- a/examples/widgets/mainwindows/mainwindow/colorswatch.h
+++ b/examples/widgets/mainwindows/mainwindow/colorswatch.h
@@ -51,7 +51,9 @@ public:
QMenu *colorSwatchMenu() const { return menu; }
protected:
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *event) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
void resizeEvent(QResizeEvent *e) Q_DECL_OVERRIDE;
private slots:
diff --git a/examples/widgets/mainwindows/menus/mainwindow.cpp b/examples/widgets/mainwindows/menus/mainwindow.cpp
index d487e3a277..fb06bc8ad0 100644
--- a/examples/widgets/mainwindows/menus/mainwindow.cpp
+++ b/examples/widgets/mainwindows/menus/mainwindow.cpp
@@ -83,6 +83,7 @@ MainWindow::MainWindow()
//! [2]
//! [3]
+#ifndef QT_NO_CONTEXTMENU
void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu(this);
@@ -91,6 +92,7 @@ void MainWindow::contextMenuEvent(QContextMenuEvent *event)
menu.addAction(pasteAct);
menu.exec(event->globalPos());
}
+#endif // QT_NO_CONTEXTMENU
//! [3]
void MainWindow::newFile()
diff --git a/examples/widgets/mainwindows/menus/mainwindow.h b/examples/widgets/mainwindows/menus/mainwindow.h
index 9710580819..57dd036767 100644
--- a/examples/widgets/mainwindows/menus/mainwindow.h
+++ b/examples/widgets/mainwindows/menus/mainwindow.h
@@ -59,7 +59,9 @@ public:
MainWindow();
protected:
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *event) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
//! [0]
//! [1]
diff --git a/examples/widgets/tools/tools.pro b/examples/widgets/tools/tools.pro
index 282f8dedea..503efa8403 100644
--- a/examples/widgets/tools/tools.pro
+++ b/examples/widgets/tools/tools.pro
@@ -18,3 +18,11 @@ SUBDIRS = \
contains(DEFINES, QT_NO_TRANSLATION): SUBDIRS -= i18n
plugandpaint.depends = plugandpaintplugins
+
+load(qfeatures)
+contains(QT_DISABLED_FEATURES, library) {
+ SUBDIRS -= \
+ echoplugin \
+ plugandpaintplugins \
+ plugandpaint
+}
diff --git a/lib/fonts/DejaVuSans-Bold.ttf b/lib/fonts/DejaVuSans-Bold.ttf
deleted file mode 100644
index 040bb9d317..0000000000
--- a/lib/fonts/DejaVuSans-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSans-BoldOblique.ttf b/lib/fonts/DejaVuSans-BoldOblique.ttf
deleted file mode 100644
index d0fc12f08c..0000000000
--- a/lib/fonts/DejaVuSans-BoldOblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSans-Oblique.ttf b/lib/fonts/DejaVuSans-Oblique.ttf
deleted file mode 100644
index 19f9f749b9..0000000000
--- a/lib/fonts/DejaVuSans-Oblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSans.ttf b/lib/fonts/DejaVuSans.ttf
deleted file mode 100644
index 7e411a71be..0000000000
--- a/lib/fonts/DejaVuSans.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono-Bold.ttf b/lib/fonts/DejaVuSansMono-Bold.ttf
deleted file mode 100644
index 86f9722627..0000000000
--- a/lib/fonts/DejaVuSansMono-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono-BoldOblique.ttf b/lib/fonts/DejaVuSansMono-BoldOblique.ttf
deleted file mode 100644
index b1439380af..0000000000
--- a/lib/fonts/DejaVuSansMono-BoldOblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono-Oblique.ttf b/lib/fonts/DejaVuSansMono-Oblique.ttf
deleted file mode 100644
index 81208a6cfd..0000000000
--- a/lib/fonts/DejaVuSansMono-Oblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSansMono.ttf b/lib/fonts/DejaVuSansMono.ttf
deleted file mode 100644
index 029fcac35f..0000000000
--- a/lib/fonts/DejaVuSansMono.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif-Bold.ttf b/lib/fonts/DejaVuSerif-Bold.ttf
deleted file mode 100644
index e7aeb9e851..0000000000
--- a/lib/fonts/DejaVuSerif-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif-BoldOblique.ttf b/lib/fonts/DejaVuSerif-BoldOblique.ttf
deleted file mode 100644
index a457fd82fb..0000000000
--- a/lib/fonts/DejaVuSerif-BoldOblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif-Oblique.ttf b/lib/fonts/DejaVuSerif-Oblique.ttf
deleted file mode 100644
index 887939c0e6..0000000000
--- a/lib/fonts/DejaVuSerif-Oblique.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/DejaVuSerif.ttf b/lib/fonts/DejaVuSerif.ttf
deleted file mode 100644
index 5d096d14a3..0000000000
--- a/lib/fonts/DejaVuSerif.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/README b/lib/fonts/README
deleted file mode 100644
index 076fc9c294..0000000000
--- a/lib/fonts/README
+++ /dev/null
@@ -1,21 +0,0 @@
-Copyright statements and the source of the qpf fonts are located in ../../src/3rdparty/fonts
-
-The fonts here are in various formats:
-
- *.ttf - TrueType fonts, requires QT_FEATURE_TRUETYPE
- *.pfa - PostScript fonts, used as source material for some QPF fonts
- *.qpf - Qt prerendered fonts (QPF format) rendered from above fonts.
-
-QPF is the portable, endian-independent format used by Qt/Embedded 2.x and 3.x.
-
-The prerendered fonts are generated from various sources:
-
- fixed* - Fixed font.
- helvetica* - Helvetica BDF format font distributed with X11
- - Latin-1 characters (about 250 characters).
- japanese* - Helvetica BDF format font distributed with X11
- - ISO 10646-1 encoding.
- micro* - Micro font (see micro.bdf).
- unifont* - Unifont (see unifont.bdf)
- - full unicode range (about 50000 characters).
-
diff --git a/lib/fonts/UTBI____.pfa b/lib/fonts/UTBI____.pfa
deleted file mode 100644
index a4fda2e997..0000000000
--- a/lib/fonts/UTBI____.pfa
+++ /dev/null
@@ -1,1172 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-BoldItalic 001.001
-%%CreationDate: Wed Oct 2 18:45:57 1991
-%%VMusage: 34429 41321
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Bold Italic) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -13 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-BoldItalic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36546 def
-/FontBBox{-141 -250 1297 916}readonly def
-currentdict end
-currentfile eexec
-f9d13ed4c538ee56ca0c8979e615439db5863a5292e578086555752cf04323b5
-761364ec433e576f108b1bff6c56d0f56331bc1243c31feb9985de983b0b3300
-e35eaa63cb5ef5a522d2e2731f37eef0cc62a540af58c4780559b4a0499bd168
-7642677ef167669aa264d68a8ef6da7425b771d48260108ab87a077560b2ebc7
-dafcace10cee472c35746fc11d5304e441fa0678decc0652588a56cef7c28ba5
-5cbd94a7acac9a06942a82d6abc1ed45ef21f4f3f5f61d0002340725ba15b9b3
-0b9992741770f020ec318f514874b6abdb27c3f0dee979cce17199b9f3ecb0f0
-709736e55bc48c55ebc8f7259d9e0ba13b46c2983c6e8265633d11358057019a
-9bc40f9ef8830b5cf7022bc19c01160d17df4ab51d113cd49bde4d1e3b5f8ba2
-7d179464b8fa28e12092267d5c70cc341eb3ed0eec08b343175d5458311a7404
-a9463d728eda1642be73366ec57a705501aa054b60b04983e30b9987bdbd1c69
-95ef18d327beb2f2086a2245602495ccb7851bcc5eb302b980ada64a262c562f
-6b2748b8f7dc4a0a06c69a7231fd40568bb236b33f33ac04f1d2f91573f60470
-599ca51abce802711c7fbd95247ec33fba3a393195a5cd54622434e668d1e63a
-a39a51699962bfcc4774228ebdb0b01f29b430434d8023331bd1b6b2c76e43df
-b3c68753c55075856e9ea0f5c7d60f510bc115bb70e0a8eb9998d3f32a0b72d3
-ab524841ef36b198e3ae58129ca64e005f776a0676dcef57e7961dd2b948c2da
-f392cba950f1101a7bba99952251c82ab5d0eb5ecd8af07973eeafcb3e0b5f2a
-3b6c8852ea072b9787fb945cb7cc7a2acebe92a5458e7dab5ea2551a61a55068
-d7023b6193c750e32502fe1e1d8e8d497453fff493caaed83c410eef050c30c6
-e38339831517101b07fc15d5f63470a9863bbfee0c0002695669900aa70a18f7
-a87f1b0b83494c39c3c90a8313060204d19553e2d66419e7b002b25108ba00ff
-a7e60c68b73c53f306e112ecba3b64d35caf59f11a41ae76aa2fb4882ffffb96
-400c2b6b0051c90d7279ffd0df3a6ba63daf802888bb6b98db281b89734b6e2c
-9ebd473352b36e11b5c3f3c7ecb22095b7aae220fbc89cf6036fa963530b8a01
-1cb06875ceaa143eacdbf1015631e8858bfe5917e01737ec6c840fa7097a42f1
-15884772664b9665e5575dc3003914643d34f329b9cd12b1012e93133a27d139
-ebcf7f9b68dc21575f3ef070ef94d4f3f9ea0d3ab4a75e6ec849a4630f4f13f5
-0883dd86a9903613ecf36ed6ab7294afdc167e0eda4b1944870a2f99ae8a22c8
-1b711d1eeefd489009b86f08078f4510c6846b17ae72c87dc51d0433ed9cb40f
-197db7e3c2ef41f077481b3d194aa3284d5400681001e0531348b91cb957c396
-5611aab14b92dbb110db950073dcaf69d6454588bf63c477112c38ac578b0ddb
-18fbf7f0d44138c4721743fc05cbef7cc3c684328df7c4bbc17afd9084bafec9
-99b4b8304cfd2d604e31d96c466466cebb6ef3a2236498e31b3c8dd8f15c1ec1
-c67d2b6472c3dce8f613c8a206e5dbca88b03ea931fdbb7e2d19625d4aa0d800
-b2eb953de5ae22b2478432710ad8efc57558171c332f6b27a2cac9145badf751
-9cf4987b853ed30d3a726039a83158c03a0f457dfc9a81e78d909f070e8d47e0
-252b72d03d049ed6349c752a01b92072a2c8f6c50ae85d6a5469eedab2e0a5f2
-6e502cf72a76706ecaaf7a590105feb6f0c1f52a820369fe3b903b08ec602ab6
-882e1ea21007443e2460e29de7fc07fa72bf89c145b04be55df48c0ae5ba1bcc
-c84bbf0a2de650ded51dbb240dadc2faf3a2fd0fa8749f0b1e372c579f905148
-706e910cd5578d06c8018e3ff8b88af6002c549b87a9fe2b1f804e95921ef83a
-2810e015e315d55496eec2bd16e0b71e4d7004dfbaab8a5d651c4446e343e382
-8204f6e7b4cababa6aed624942902c65899615d858ca24fe6c91a41d087fd647
-e50c52850049c81a5dd9447761b3a308df7403fa4f8669df366d3e114628858d
-17ba68a92fed47c199d1f7d415c8315d30b394177b161fa487225c38e0b9d9c7
-ab236e90e926614f9fbdb3bc081e948319ec3871fd37193f0889ecf2c47841c0
-666b272328bbd281f719181b4e509c01ce80afe08f6244ecbfc136f8edaccf79
-36399e63e5982d27fbdaffab086e1e064c84cd97d4eef959aa3a452e065618f6
-b549e3fe7207bcdf85ec1917612c098236b9124d6f1c037bd0656777dfee995d
-5d125d678fa7ac5c995515e952194f9620579316eb0f0ad55930ac82fa773159
-c1ac7f4b072f06baef03ee07c23fcb4ad8072503469a8e4eda4cf143c7a68d27
-bbf01668c0abf4950277c195fa1cba7297a2e863299e195c6684f2a076427e5a
-a2f308fcfb1dc11d14bcc8a4a59611eb8bfcbfcd73e963d69c82fcd95e989ff5
-ed486f9809d3f9e1a0ddfb573b37d1d3d57e0fa4594f66ac56fe16168a472552
-eca179c7ad26be24e9afb1a759b73de53e9f7075b7ce0ab8bc8e30ec6d68aa42
-a84b36f2c4e4afa9e59c6dfa9af97a93b2cbd9ba786fff8d8b60305b608bfc36
-83c2c94dac72000fa51ff15739975e9ec0185f3b7cd805e67b5ff91fabfa648d
-81e0beddecb47dbbad28a99acc3074f1c248b2231be3fb01b331e90a1bc723e2
-8a0b2e99f2defe00a0b33c13f0a6a37717089fb28b7c58daf478e877e4bcb73d
-54b358c509a630d73938bca5126547c94f88c97cedd1c65a3d514b3ab86a489c
-317554f67e1aecc75e3c71cd37f268999f17fb649cc52ce4ada26d2d4ff1c248
-e9e4f6f5ccb85aa64e90f371cb94da1ecf5b995ded0fa6771e3f874ef449186b
-4b78c298d5c24e5127532b67c9479f70c3703ab7800ba8ecbca511703d6a1733
-7f2edbaa61171f00f01debc6eba2094465e248cc8262bd35cab622443a1be5c2
-8e6318e4f3b7131045b8f676e2086f0432f51983c74fea25cd5aad0797a4cb5c
-6503695292d798c755170f0ae137674d25759bbd89cf4fe0917e32999b4a04a3
-655ea871b30e22b0ee39f29f7915fa3dbac0d01c55a454728869501335f97e3d
-24b17ab7ea28784b6f8c9e0b72b38f64e0fdb578eecaa5590c20a1d17ebd4ec4
-1632b40553aa80fced6d88079eee8097a410a29b549a0bb3b6fec526caa745a7
-202eabbe2cf3f1262db3e6e309e0afc3d9c808fced17b05c320945fdf0a05459
-ea7ba64fc4112fa68eb4887bc845e63a598e2d31df0ab0d64155e631e3ab4621
-744da7c3da19a2e66ed2bf759505e0cfb47a76a81ed7242cc29c7383989afc30
-df86c4b38be0a5c8b360f586f463e53d6684584a3a5fc75495200fc707cd1981
-1a0fbcc0fa784b02140158ef0913170979c4fe96f3fdeb414cad01b38d2b5934
-0b21cf14a28c24a583472ae3cd667ab094e56744c6b35ab7870ee5b0aa22a70d
-dc68afd34b44e45275ca8d12747dc6fef76b826f1dcd70a5a30537e096935f7d
-ba37414aa1f0111cf7a1844c5e2b3f63764458ce9e113d06cc844bead4d22109
-069b5174e0ba5aabef78dea7e384369de2e4142bfe6521efadfe67aa41fd7bf5
-52ff016ad8d6314b4285e129ebbdbfd3c6e3383906248f0ce045ad370b0f90f2
-a832944cbd59bc7cf15a9c17ee0fa0bbe12f2304fd6a9f56cbd65e7cc91ed860
-7d09e58934079a74d02c1b25b958567133657dc028148e9f13a0ff6db812422b
-6c7cfe064a171b4fc5e1764000d4a761d1c476aeb59a45f7b64ba1c8623b1423
-91d79d124b8506eaf94ef8fd28b5fa6ca6aa5677ffe979dd3d75f540d577ea8f
-9cc95f5b41942294df812c4d4aa4ee701f654be2c00440ba575c5512bb5c196b
-3ad24366514f2b4ea4ab0c35927517bfe166c261c0c7f9b73ab0c52ed0da3696
-628a1f230e48cdaf2ae53000dbb2ee3fe17b9785faf74baec7caadb23fe6e329
-b2b908bae996af74097cdb6e280b5d5c2783b33ba106d6f458179822af89ee24
-f99514605cb4e232b62d92014636841a991b3790ae7478d020d6513e70244034
-dec5f2106a1820acac4b7e091dce521896f25dcfaf58a521ecb5d26ae3b8bed6
-c61c3c25d09d159d5ef58e253dc0f9817fbb469e44eed683ffecb08689e66108
-ce6f93327a5ade948640d0e9347b113d846846fae982687d95b66d6a75ffe876
-a2c50ce60e3f7953d9dd5a9f5d65b1105a7849d734336804de32576e81abd201
-4aff1a36aae15c725df295daaf26238b21c6d288450aa4d94e26ce6a1de7f096
-5838c195a97ddeb019500e8fb95e8b48190b020cbf0582a99df66b7192b67448
-c1695882808efb39a3c54fa42c183f65492f9d0cccd832b5590a6c4cf18e8d2a
-e9f50100f197818f192c39d4204b6dab711c2f8cb53e5ef002719755cfee11e4
-f1ca77783034901fa2da7f82254d1184f2f724e36be731fe923c99d444407539
-3000ceb19548d5c11d7aab1e13917ea4391ac626e02bd7a1960bcdf24e048f46
-76fc3cb4031811d94f83a0c23b309cc9a537b599c174dc862429bba8b94e7e56
-56682c13bc4deb402af2334993c66d6ef48cebcf6dcc924a2a1615ee92edb7bd
-221fd3204d9dfc6b2abe84d5b47a9d03227a4c015204af7dc5f937adc8c60de9
-feb1c1c722a911b2a5f186478ad7540ff28f7cbc82d85e461c740e8aa51c16d8
-8f939075b78f8a097f647de080dadd87dd5a4107ae7cbc25a7964e5e8e0aff10
-1f17185e95a7c432c76f5fba2138ee76b7ec76c691df228099c0de7107aa0f5b
-523209576c023ed23e9ea9047d1def8175e515bd1ee133167f0f92fc87732091
-4be8e6a04a796e5affd91f2e0bfb1b47d960228b970cae0824b32f602504cb12
-9f29f933e538a01fc231eedadd0bea5523ce4acd3ca5d512aeffd4bd91adc088
-47e520f07aa173dc6d1dcda5c7a20a1cbb399d7a11694bd2c959d2546d5cd1b9
-b7afba473e7c9f0492c2d4b4ed1204d6f633a431d83b813b5ec5ecbe41b6c8ac
-003fbe65fee1581fb80c2f4c691f9e8a33630940b198deba7491d83421017409
-6dd46e914bf82841e2377e57cf81c0f03db26133519f638d0b6422585af7f7f2
-589aed2dfd15c02f83bb6fbac42b4fe85e14256c5b5f6e7a287953a4f96a0c6c
-562b87ff8a8ddf922571aedf6898faf7f9327f92a6f736546c5699aefc4cd1ba
-b403a43f8464b215993ef53d2d9186ab1218f7e1f2ccf589ee0a52096a153ac5
-e328654465f3f734fb590ed232399f9f6dcfdfe7f702b4ed829e444ad685b1e0
-d0764217ae144e4af82554faf6d013be83816ab94a6b175905916bea3c053fdf
-8d033e48ce7e6a7338fdebdf9cd047624cfcf3be1aa133690eed083e28939707
-778274ae874e906f972080d9dd453ff5039cd351776a1ed52d3e4a8fbc749f9c
-588478826593e0e8625b013ff1469bf76aef8ae06a63ebbda3176d517a7cc32d
-ad93a096258b227102b2b748359ff2e70a438709eb5f1b60be92f7a6c8f92372
-c3b9a58ee0934083f2300c6423250c00ecc2cfc67a6be83450eeaeca993fd695
-939e47e7c7d28f9db30e2a82ad4895092a1a5a734f1727b4734a14743ee1c9dc
-851c9463451042f28a519e8c532e16c6a7f65a11286b85d48ee3bd6f09caf327
-cd87df6f40cc9ed5784744408da6a2e65cdbc6838812b2da414fcf7a33ebe676
-d381f7cb0bc1d84273b03240fd3eacfab2693d04abe2a89f6d884fc1ba2c0c6b
-183916096f98f062bbe990f87a9d74d275f18d5d97e9eff897b99fd5e5f2353e
-16fe417e644364017a1f014cd0ea62ad0a684fcb1f7a4969bb2d0119d3021ea6
-91ad90564b7cd59c03662d4809943ac3c0316c45b3e6576a9cac3f549f04a9cf
-b21aa641eeced2af9c0e9944bcd355444f1ef2dd626d94d65c1e00b208f06fd7
-526f73917bfebde0538984edc704fb56a92f429f2b3ccd2324926605ffb9e06c
-e3f9435778a9972bc1d9511b1c9e013c9232cfa8fa03b8076de78144e24583da
-ce13c107390a4b4a66fcf41d02c7ea3889fcf648bd9b202a77ee0debb98745c9
-b424aa89f8028129fea8293f44efdfea96ca75d1462715087baceb18506124ad
-843bf5b5eb3044665921c1e711ae61d7ea772773f99f7aee6de71fcd8c5c2c9a
-4e5d5a1f02ba9ad0e31ac0673594882b491d8dcc9b7c4d8bf806845cb7e7b054
-e073b9379f6f7b756786174fdf25b080adf0cb4645dd8fe1b4cb5377195bbbc8
-88e09bf98c82e523794bc350fa0fa12413dbffc006a66c47c402b78164fd9234
-b9fae67432f7a9423ee7569d3e6bb293cc0a095f3c5a0abb6a2c52a0c4dccddf
-54dccede5914afbb9bce717409060d5772bf6c19ec65700c6395884b3da5bd6c
-d81daba48977e3af9653875148fe7ddab905a0cf6c5352a468c36ad2bd09d897
-2d54f62bf9af9688c1454b67f24b5cbe39e9c069d6b5429ab9e8b2117c0b09eb
-7f877d667af2af4c06339230c2e2d082f389d7006f8bacf00bcef8b652a8f1a7
-e210e7facbe69f8b0cebc21b6cb559ce9f6d8e1b0546870d773f6335426b6978
-60bfe9e2c6cfd1206ff1fa27cadbdd58c4c2368e95e17bda712c4feb1e89c63c
-45c0cc72dac845d10847408dfc7dd390ea0c50fbf3012939372707be42c88a8b
-025a77150be73e08e73fa1e15fb39d985d5e6666d2a4f77f947eb1b2228ef0e4
-bdb7f767621b7edf5b863d44c09a02b08a41a3feeb239ec9e022d0d8c2fbe939
-fc242a923b082a3035a23c0ae48dae76b4c2147a7f8126ab66dfbb8c892d858a
-48f8b65eb85d3216b8c156ee4005045697a11f0f349d05620b1c0d41575c11bd
-e8165d443d4e836d4b4b2fc028e3ee7eb995115de8bb5b58d7575a260c8ebb93
-cc5d43766f56ce454dff93669f41be40953c42ffcc98a89e9f6ab320f7688083
-32a48d4ff8eb88c84c7e0cbb9e031ac71c53873da074cd4112dc30b4f27c163c
-0d6371b35d0571dbc1b80f5101c90d4745e978091c4c8b2bfe8aa23db4979a9f
-143dba6c041772bfdda2077985fe5da829d9de5d8c5c9d02175f65e23495756e
-2ba67a1f46d862bb76a4f330c66adc2df5303b34ca0e705f28a97e2782105359
-3ade715c3f7eea39e401af757229bd314b886dda55f418b3a67657d199cdc8b4
-d05a5b7aaf37b53e1c5707fe5454d512c954b6887731d2626499cccd6e80b1cf
-9b3116814c0f7705d53b402fc4e9b6307b22941daa12d9c66849165e8de01e0b
-20c33b1b503c6ac7995d4bda83da72dee3b177389d500061e16c6decd05bd391
-1e2d1727b5436aa550e1bd505e91ce0efcea62d9fcaebc098880180caa252f6a
-667c75a3185f62caa0c28763104f57e93fba3a396d7015b3a55161401970668c
-7e6ed168f6e0f1029216c27c33544cc77111b2ef2b1538f1e89397a2e78f0319
-28e948640198d7d2b5684f9566b5e70988c2516a81623a6fba82c1554f3a8a85
-98c1efd626eea0ea586cea3b1f6b62f97b1ea416332ae107f0f174ebde1f84b7
-4af56a9495913e0e84ed0d8702ebe1c699f8e8f056de6e7728023e6fe0dc68cc
-aa76c3e2aac6eb5f5ee502c1098db8033c4432fd0c6f62aadb989954d81e4247
-6efe3ddfef52cb066d3da1811e1bf13a9da68d77b3d88ae4b5e0ec252a992b2b
-dd6b487458694df4bb1f300f88f6891f2033dfd4ed6eb147315ea84efef20c16
-3b2acdbd1a6812ebfa51f69413d1750c60d374839d46400b9563daea410e4bb6
-4231cc49a6db6f9acad1bd930faa27bc25e636deef091d07ee8c405eacf00d37
-a67027a49443231fb38cf74b4afe723353838866c9d56c2218507344cfe23e85
-264ec426283982e0e299b8557f37010c921d4b1e92b1997498426d3690408685
-5e0ab86ffb4c74192269197dad437aafdfc98809cc865a72f397901a02e22f97
-f035deb4063864798cbbdca6adfdd2e1f644c299d5acaa8b0ebf0102cdc1e478
-77179fd1e5c69595485ce83dd18e3a154e8f6bf6aad3752f209ad3e561cb2400
-0959f964e853ec9cde9deea9278c5988db3f026a6120e0020438f44066d270f4
-af05c4d6568fa3b288c0443be3cc406b6ea555ba97b9fae56c2b7e75263397c4
-f247bee72066fc445c158297eab5151852dc2c32306794b7be0a5f23c22f76f8
-4c80909a303d6d29d808a606b8c0739e69d715778ae843c033bcc8065ce83795
-f3d5b1a403aecd1ce8db79b148946d9f96673b51840fe073065a7da8cf8a8e98
-0e70984d88ef691e21a7f3b52c2a455286d80e3831ef4b7119459970a77e2bfb
-1b2e12a6e2cd4e02d80cdf90fc00a1fbcb42817660487d5fadefde0278d4fcad
-98fe39b3827b681d4427fe992adae296946720129777c73d954e1f91dfe80130
-362fd97c8a7f693b73ebe45155434eb078fc66adde8f9217583680f5e0c9f80e
-c413226de65a1e06fd6bb4a4870e8702d2d77eeafc0ea5634272f19f31a6ea21
-b51de45449e89807b18588c9a43524713c31f27be41941c32da7c5cb636c5e1d
-0ef69e2ef2c18ab0746cb2d19980fbdcf9691c1d74606830522219310193b32e
-f886e8f200135b55e178d832f0416de4b86e2fb4eb8731337efccf833c044446
-1ab477118d9b6d53ebf5c42e46ed8e5d0181eef7a15145d5a51d7a1b8f82189a
-f6ccde81e2f1da5a0e419838b90adc945a7e74a2132aa57807fe6107caff8296
-aca45bdc7366cf3b738cf402674c2c2ef0954ccdf7c7df0377641e9ffa12a165
-725cc7bca1a0d38dbabd6982b2f1c432454919fb58876f7854ec713ebf05e0e7
-01d1135f89b31ffa94413f30f72527de872418559c07c8a87556fb558bbd7726
-aa9cfb99d41a7ddbc8d5e4f8aaf20619b2dfdc18ed319b958b5812867e5f4442
-fc670f55f78be8ec1c3ed00fa36cbd52c5c15d45a5c77746de5aaadbce70eb29
-05c3972ddd7e2c220ba4137a5a6aa178af65fd65f225393a08197057d5dd407e
-9c238702425991496f7c7c91754399ff3be95c95704f26de0cf99aabc5786994
-9b727f5cd72f4428908b95f1b879c2366ebc061ad4ef68ccd4f957cc76594d88
-dbea7f48b814a94be79e2cebf4de7d2f6b2fa680baab5196b132c5970d035801
-e021704e10823478c68b4f791e63cf7d9725088a6fc2279e1d09a68b04f31901
-7bfdf33caf58ef856a1aaa0793d327c91a2224e7239c211f1210ab11cab44b93
-0ac2b75868db9a0faca784a130fdf9f47cc09d44f9bc9f697f698d2da440441c
-1adf05c77b768535ec2dd30b9897c52b1e28d081f1dde26d5e8438c405277c2c
-2291b1911cbd914a714159a957e0b436583b1d90cd36c7ba1b6e1041c8eb3996
-dd2715fc01e9a82bd1590cb4ad8fbbdac9410beda818b81260a3a8742c137f6d
-175fa8bf26d648c991fe684e0e1469900ed0a53b7d44e35e63c7e1fd0b5aacbf
-5e9b854f302f3ee9c7620f5c9e2a5446f7653446f0bdc192a34e23654830e5d1
-52bf36fc02c220ac72569f80795ee9271fa89b438a8fa4de0a3fef6de60310e0
-77bb99f86ae3e0824c593cb2d0387faf97b3612131a2b0edbbc79a4444acd77a
-53ec23d447610ad92120f7702df3c0955e5870e1ede213b5edcfe5c0405538bd
-6d1a06aa55a8afa73fb82a29c6eba9adb721473d0756c31e77a4012d10dab6e5
-80c90caae60c3ea5a846f74536079bd790979059936c7e879eb79905e3b67b3f
-ace6bd0a20a8afbf1034dff455f130347f54b6f7862a772f0afd46f3601349e8
-9d1caf04d0598df4cdb164190614aaa872036855c02c3c92374a3baf5453baec
-0c0d2d89d79fd0452babb562e925422d17e888a9350fa50d9b34bd119618a1a3
-50f9059f36ffc5adb1f29923af100fadb5d32aa948ae738d53ba04c44c3afb82
-e935f0ccf3a7903ee5f939f10d3668c672b75e90777354d1429453010e4f72ac
-23bb5cd7ddb1712a6851c033bfc10470f8ae87308777dc1d69a1b95e0ab1a655
-e46f843d3c4bbf2714177d4c83747f918884d366dad7705e4668087eb0d13548
-2d3c35939ad5402b94d3fd7f2bdceb0ec55ec0fde7fe7a555ab921dac698917a
-fc4bd079834d26e0b1d4020bb50588e961658935079e8b542f927ec7a7e0ccfc
-d03a7bff24ddedd6d7df33c3507c449067e548b0db1a42baa9e3b1d0528298ce
-981f8e35b10b00f69c92390e4aa06d2b3374e868b4ee0cf0ee5f59f1c734550f
-640bd5eeeddf30a340558a831b9e39bff15b35649a22b23b8f39d0d473a07be8
-0c757d16f7738a0190178de0e5509ad9fe624499d7464c43833515c9a5841c1b
-e704c88e2df4508101dbb7330ab3dd863f544294887e6ad56bdf15800ae7a0d8
-e523cc1bd1f9424576492b11b41ccbdf5daaf31e3278b3d1c9160c9310f604be
-1e869ce18ea776bd3ad33ad41dbc5b3a0acce72033b37aaa5fd6854d0f2faf59
-d2e674cf97ed09c3ec2f7a02657bc036f78c29e25284c7caa6e480beec4772ff
-09b02feed2cf374a02b43f653c1d095d21cccefd30d2049c50327fc38bf44e61
-1e5afc9d29d37fc5c22f62b927fd2c5720a8025194734d8d361bd63745781d3c
-996f448dd51f345442f1738ef8915a69bced678b6dc75ce6d77c44464d4e3c23
-0f90600074b5d31a870ccb24ccca94e8597177d51f85f9079d3de3ea0978a8fe
-f94346f14cc5dca7c6476dd60ee8a7f402e498d91f4c3b8071f5238bf16e8909
-0c0d2b246fd6ac9bdff3ec3633c6d90dc5ae76e353293823b20abdaae12a66f5
-19637c1e69ddfd24df8a76807c441732f3bc7d334bdf5cd5eca5b3ef88798b59
-6f0eee2d147dd35f57c4a776a9c89eb781acc56491e6adf40b94df9e8953df54
-ebff8faa7bc3128a375ee91a17ef4e6ac5fbd17f84db3bcb2ac0468efcf8575f
-b51865ed827e1dae4a3b601239519fc552e9959875285d9f688b1f4da4a62ffb
-b166645fcc7e587fa82d02f8ea43049f9c589a3b570c16aa3d37f34f999c4f13
-ef852c19789834269ecdc91433b6351f1936b24fda2c6614a467855679c50162
-fb62daa72b9b971511e81c8dc7305e90cfad4950bc2dcfee8f1ad6f30c2133cf
-c117dacb41836efe6d5ddb09b6948475c21a7c7e0b843820564b7f4375b43c09
-a07632390ba4fb796e2ff6b45a0584f763873e6a36768ef958c306fdb23607ba
-73cfc5d53a282585b9c7c97e8b59ceeb43360107efd16c2d54f825fc77e4eeed
-50c040e210a2be8034648a0cd886e2720b8d939ef7c94df36bec7ceb983e7157
-5d8c7d688fdbea4c23b8bdca5e5719ad6bbd1384032235ab03d05af8e86b2e01
-2f6ba96703f6d2e4a014c3de80067fd3fd665ed1c64c3362f254e3c7fba06800
-389cbf12c7b229b66b2df82a823765b41235e31a1e348cf57da0e304fca82b44
-0b2af48040f04750d7df18ebf95da0101b418c3820e161be149a3459e1c39758
-e8063dd0fce331702e9f7be3d10da99033bf2c90a1a24ebc48cc276d78f61cc2
-a6721f3ec1d48d86b54f8eb88b9ef248ee50896901be472b8196f52289869d9a
-a656932d4872bab54cfde6eb67537c70078bb808bdd52f4d4b99f4d3a3d7fa4a
-ee72b2b5202983641496ab3cd44434d44062db39d6c3e8b60ac6f73ab9b101a3
-2d687ab24b84e27043126bf4eee162f2cbea040586f49fd91b5d4069704bb9d6
-9ea28a6c20643c3f92f648b38273abb8bd944e7edabfd4e3085056f4b29fbe1f
-ff5ec131de60fa61812a8ab0d3673272309e36f6a1bd1552a3c41af2a2228f85
-f3809d222aec8eedcb4baf373f37d2a5de8ecc62ea37b335b81005f8e92f27fa
-6b2397952bbbe44fe9a3213c33e368d9dc37465e84f538d969f97d55b31956ae
-7d8522a5ee6d6fdcef2cb6ecb636de6ee1b2e7b44530166f7b2eb278a0892504
-30cd9e39ad1d38748ccef3f201330fc43f12f6581162775064b6275c6959ad21
-b5486b450d8581de96291f870ed3768da5833520cc36c14b31a90232d1d1cb03
-de7f8f0a506c979b765205d82b518a8ddf6e3e494b4217e47c5dd770c51e47f8
-106f23e7e9c0c4c9b2bdbba64bef04c5acbcf437db53d1c47fcde3bf88d58f23
-fa8a8c482b5d45c78985e7e850b676d773a4ad42bea32e3090403c01c1532a7f
-ec6e008ca9911f15319bb2708a57499e19b3482537ac0bcfe8a2dd398b0ad1a3
-a4f9812a66e9b82b095da83a9925c4e9128ad159dfb674cef7090c06626853c9
-0f5d64f662ce69cb135a4ed6eab6f69df2f376f1e3ea47a1903d066441d157f8
-858848b89aa4634011799b26842adc6981686381638e9d7e2c6c8ca22e8cb9ba
-d86986aa0300a224d2d0bc6fd227fd557de7da66c301e4cac1aae538c62697b0
-b2258394e0af0333ef56007b98b436dde0d40937923c9c72ad3e3fc7b39d1c70
-2851b4dde84e697f7983d5f71089c3f94abe8ea47392800d7300f4576e9498a4
-20b537ff69231fe3643209c59c485471b2cfa89aec05e50b2ab081eefc80e1f2
-b08f772631c8c649497745610363246af135e2c3231b64be0d5db3789aa6a000
-f27ede24cbc19346557465818d4bf4c4286e08840f030dddf30bb175e81482a6
-bdbdd5c83a361a28b8ea5654a9066b5c8cfc8f5d4380cae506d6a61cf0ad481e
-832e08f17bd9bf87749ef53d858b2a9eeab8d7be7e259bf110c4e3313d6ea87c
-1ae3664089e4af8160d334fb3c3005de0d5037211f888ac0d959dad0a586b61c
-0dddb0be9c5110479f5b0674d00f0e54ca7f642b62b32593779591b4dc119a25
-1e8fb9c40b68ecc9e5a08e63bae86aa52235dea3902f3c355fc1ae6b8c79644c
-01a54c68fcbcf46ebfdf0a54eedeafd5d1120bf228ef499913b4426ba7dba017
-75d6e240dcb7d41352b5cb624bafd11fa37fde8b4d4fed2c106a34d8325fc31a
-b86701cc72fc1e8db68a1508337947352c46d46d4393384cfef2c9e9e9d6d877
-f13780441ed70e86aee02516ee87bf567857f6af21aeb625ac3e30fb1b873bb2
-862a5ba6c7a6f30dba14fea378a41d38116214c999ab4666e48ce091751ce700
-62bd9e47351e9458e355e08bdf9f38ce3f52993df8d6893bdfa29813fafcefd2
-217b481c1100b8db69b9f3a2169c2a66300af2099a9acecbc542f140ad5d3a64
-6a1d818b0cfad8cd8b4b8a3f8e8ffddc03ba62a624e72df170b65fafed325883
-feb1bd45e3865043bb008d3055c08a3e4c95734db50f983f3ce6b6fb9367104e
-c44b96c80b2fff43285967667a3edfd341ce587b212e12b2fcf156f03b0848b9
-3545bf50fe4ba75c13529ee16857d317ae98a934a369b83db5f6039b72bc09be
-6d14c88a6e2c77543796939789252b70f51fa37a69b08551be5416fe8c785110
-30264f52592909c8e7f81f54f1b37c2b488f088e85994336c7a075779b168464
-fb37e8f7085f8fbeee68fb68ca9fb2986a53878454d72a3ead0b5b2ed507528a
-ff6aa53b238380d6f0e59e991f4092d68e2001c0e6d945b810141d3d1bbb7405
-46d378af9ba3fefd4d44f6caf78b74450a0e230431a5c46e79c222c3767c4132
-90cb9f75baea5d1bbd25a718e8cbbe551441b642f10173e90aaa9b2cd6301332
-0ced79e66e38e8dd290bf36fe33244548216916fad18f20da7b73e31838930c7
-f4a9c44b3207eeb6c103f633f3fc8b2b74fb04a072fbc156089ee3f7351ef196
-f365dd43088f4d4a280be7e81fe73293912000e3e5f493dc4bfc275b5b8a8796
-bdbd266090733ba17e45239f7c0dfb4153be451a8560de6551202f700efafa6d
-2bdaac1ba9c8f6e084e4b273fb8c501f336b005cab01ffd38cb6d27941096f75
-db1721eeaec315842dc7938dfa1b9e530b285604ec2c6982389e6c22fbb126c1
-e6a21916e06ee778b51fd72db2dcc11d878f21276a00bae3cf3ad0999c64d007
-f909d0ee79251810c64c4d05a2a759ef0837cf5563a8765817003dac3aa1bd1e
-7e3b868307e2d1ccc93b1a5a0a4cc32b4eb6961f71750644fde26dc7b01a66dc
-667005b396bb597d1eaeaa55b46506d447449497d29872485b31207e460df2b8
-c5b181459bc68b686182f1b6e164a825199c3ee24c1bd6a1dca450ca1a3fde70
-2d2e89bf6d8b98e4c4f25284b667cec77677be9046ede444a1b93b3b03db6aea
-f89aa0759cc8aa7f10a2c4b36f63487f59bfd6e3a2025f26c346847fc257741b
-629a3f662e3bda8c3c010c5dc1838afd26f875a56fd6042aebe1dbf119cfd387
-477d713cdda669f61ec1070705382520548a94749711144d8311df5db319ec0a
-033f2d5c4c639b5af42549b1bcfd95afa55994389ca8a66b64c28520f821c808
-4ae9dcc9d6020aa6b1f93de064318e5e464e8808bdf0ac519653752e612c9149
-6e3c8e61434d012a5e4537465cb678b6e9a9005f5039e415dd2872ff0985439d
-12d524a4f34c520aeecdc4d96383e1edd0059943d59d47880f51729e54a68a98
-a03fd6ba4ecb567c47422e04966c4655f9bb6f74f2b82d4d3ded42a42e90157c
-6639f18ecae1cdc636bd616b60218d1b6f8294ecd09a88fc5928c37c9304d7b9
-5bc609286a3524fcfb9e406f636bf1b40573225e658543c29be863964556b622
-da308dcbb6516c88155f6d9b8ae4fe34b17374d46dc560809fccb19e87f7fede
-beaece1ec0f41102b99ba6c4de9dd105dc5d90b6d3b392040273e0703b204d26
-89d1a340d0d32d6e201b91244e07ebbaae8b4c877a213ceb2f1b1d3ca07880ec
-3f4817c00d48a06102352ef4de3440699cfd69ffaddfd1b90edb42034e5b8e3b
-c42fa37c38d563554f8d5b96956879b63866e552fb931c6462b934dd0454dd9f
-965055bb3e969b0063dfd2bc299df5552d8edb68b6530673fc08f3a0bb96557f
-13b068d62dd8b42060e67d2584b4e6fb97e9dc7439f5c1d23c6a324e72062395
-6305ab4be3a430141d8e615b9f59c3a3eb2b1267ede3987cefcc1419a9f6de7d
-d73ff35749b44018da9e79aadebafd0495ee9e29ae4fc7e420d86572f735134a
-f54e8f853b764c6e0319f720e8350110c1b300290c8bf8fa4cd3be47533482d1
-53553691ebcdfb46c6879347e3573c318195bc13ea1c732d8d0e7567eb655b22
-1960e8476188532af8af85f7ed7d399ce2ced204894be3a592ffbccbd831f027
-7ae604851702b50c4ef6482c78c77c7959869e83001f7f8f93bb3b8be70d587d
-9e5cae3aeccfb455463adef4038ccb6eb8447a7e1992929f5ff7f8e6f37d4a11
-d5815c2ae35f90d3708f3e2a166953d9823846d87d2e7a7419abc47f4044c8bb
-a9129cbda3c7fef7725b481fbfab1ec2b3700b3b3780ce5e711663557e873531
-72c3bf0ea8ba03a66c5033602f12cd8aeb3c5cd0e0abd65c936cd7d973e8d3d7
-c5d09bec259f41005187115317afe5f6ef895eac769459c0ad7ab039febed7c1
-dadaf14d015a7a3356982c242713e27eccc7c4d7237052b004e8e5f15008a826
-ed515dd699e6bf60e3a2aba08c07b8c8d9df393094069e781c7d75b090445c7b
-1741949aeddd01691102b001781598b87f493ed956b500b2d813d50ba749ea1e
-bdceede30f45e0fac0aae683ae087a635ca344411c26a2dcd04a084b5d1774fe
-c1f77079af1f9d8c75f383b3755f3ea120e2bef4375dccdd221e1811b4b775a4
-f45b142ae17f1654a53a938eab4c2b2e71293cdc8e2d18ebb8b502af594de4f5
-00795c3712a58bb65b8287aadf183e508d907290cdb9ad20e578ee485ca6aedd
-432f01a550980bf7ffdd0a61834748fa4ddd4d2f561b9aabab279e8c131f4d32
-68d89b5f8f542d881286b3c8913a0a71036058755e2f47994157f645ff086729
-67ae4c8461191607b1cd8c4c83298a4bcb397fa5eeef83c5955b301fa270c293
-88d0fa7d58b00f5f79cdb0326172364a0f4f91e189101a2bbbbd448b576c275e
-ae6b320f61d6536649b0b0f9340d25ed5ef2746f385bec9526a2d989271e9a38
-302c84169518891d336882d85871ab751c147d1c8563e2d7bf5c3a660c0b0ae4
-9c0981e96dcd4ec45c166f7a34270018a852d5108219486b706f84ebbe9ede96
-6dabe61fcaa62658db716919af23f384948b4ed54ed369dd3e6e9a4f0422f35c
-afac114819e7b1b9a09bfd1b985e18e6dde975e610f48d752eebea00ede16f3a
-0b090103100000d0c213c4425a5b0ff3193941e27eeb978c7a42dc6927bf301d
-1f0f366a5d0ed75b8a969ba68c8106466db17cdf5b516a0ab63f3772dc7ffcf0
-4ff5a952d0798b68273dcefc30c3324ab824690821875bb8580543ada7b15b50
-aa04cefb22aedd548ca17e0c334493245c2eb4fa7549fbf0833f142967753111
-96dfd986a2536834b4dbee2945c2ed76205a05b9fdef35c9b4e41a808220e6d6
-e0349659c3ac8c3f86462866807ee5179d6994dca75b8d162763e8af6107b272
-bb10c72d297aa93c0055125a426ca0ef9a2c79a4b73060ff6b45719c3dfe2924
-8ee4430acc1c9c28f8b93f554f668cf14f39a728d7b2cf00523248d5877c718d
-28aa6d2b25e1b0ef7fbca7bd87a1bba4ea760b7db91c7d8f0811840654860fcb
-ef679163d03dab048f05194924b68433b76330a6ac806034e954b80b5a7c8652
-719aa83b70fd434ede624963a0ffe25bb1f72b71f3351164d1124712d58a79f2
-5c60a3fdecccb25a5658ad50961a756880b81698c2f2915d13f02ec6cbd28edf
-587457d825544af042a800e4387e004d0701b12b8281bdc76197de64309c5a33
-463bb7d317e7646ea2e7bdf7c0a38e82b0142d51a055bb90689f11bfb8cc5065
-b98cb98bcac7c740d9b1676a103af5a3501e6949ebd9705131b7f30f10323ac8
-0e69159b8da52acc1bbcccb8096d378536ecb498900fcf1d21a92dfcadcca90f
-cceeb56d38916c2fb64a9c9df5ceada68553e18d5c5d184c8c23ec78dd5fbc1e
-f685737e77767afdf33fc585e5d4e9fa1d85446b1b209ed0f18e529dc1487bef
-57c45e10759705297476b4d9b323b45c9d7b364df726b9108f4efdf1c080c151
-5d379adb369724746185abfb9567978b090f9159317be68fefd735a62d686ff5
-0b08e19c87f668aebde88f66fbba5c614415c7ba4085b35b3b086662064ad401
-abe40b7c4d0541d69b745f7e4a9ff3657e74c797ee656e721088409226aeee8a
-be944ef94ccc9d0d7f4f059eeba35ad008e961a252119950277e7f1028305b7c
-a09a5f4c99a3620001d53d8df889589c9aca04f525a39a67fe2f776fc650b3f2
-ec5a895911171356df2bef1fb6302d4e9ec698af4e2c4320821f37533e1cae94
-a5e14eb18f98a127c498ea7e70b1c8599d4ca425272bca3aad3f499130c386a3
-ec3632c8ce2d714d309b52a90ae662ffd310e335a3690bdd831f52ac88279a31
-c3441d8e0c6a741f615c78ef08502af34d81cb1ebd03af02a3fcc76b6648efa4
-d8e550d995bbfa02d5a1d08d0625432267ed55aa34fecd3078c75e1d8e4185f0
-390abfacbf6dc83e8e6bd75094a54a28ac5c44ba886c3b586759e192beaa88ad
-b1f1e7b59703ccc55d0c4383875f8d9fc1e24d7574828f8db01ed10919e3abdf
-f062f0350da3414719c765b600a281ac245f4f7a33efdaf6ea3cefcf081158e3
-1451b8bef0e8ac74d0ecd0ea1958e171fe2a1f23b8557556927b4db67a09a077
-fca48bfd110420bd160c931c07799fddc47df1d5a7050bf1221bf3c5335f994e
-c002a6621068cf4630fc508cfbb7a89ed86593370fe36d559e4fad3853aa596f
-50a4d4fa7c28ddb348986fd5e41c12aa6612e1b8ae69723decfecf062e7108d9
-f0b6f92c3d9251d7d061911fa6d35ed466763f82f669b3ff5dc1cdc5ecd21b23
-6424453dc9fd542578983cecdccd279cd52a2461499ff3709ca9b52e7d8ca177
-b59ebb7aac2e5a65dad9f3d07694e4f161b6c78c37f85cb9d21f2a4908c523e6
-5faf1a391066e68344a9f15467991f809d421af2cbdb9692e4ad9e64d0175f59
-729db92384af1d1c9d058b4c5c9808404e72db14c434929a2ee56772a623811c
-4bd21e254fc99e23ed1f8b2997ab725f809b5b4a6a9019d61e82b151a3a03c24
-4189ad819e0c0852ece01cdb4829fdb205a3f704480c57235cef0b9960134ab7
-4b3bdc8ed7376980e75d48829dfa6b1f6b3300e2ed170771b9c450ff104ea759
-666461d62a16674950d54d804ae25dbe2540896e7a9fe57006efa21a6efc9630
-4836db559319fe389cf960f041a4d9a0366121a1ead35032afd4b699db7e6252
-abc9a67d9bbd956f5e99de22a0ca48ae978d2c8e018bff87406a9f0c437eb552
-e19d2455b56d4ef37b47577d009d14b2ce56b87966b8d2de7a7c423f89a22ca2
-60c837d76b2ba0d5c4817e9f67ea9348d65975fa356851a9e56c19bce0ef8aaf
-3905b73c16eae90cbcd8c1eb4c8e9d840cb7158f145120e3dd6398e3a2034fd9
-95f34006745ccac381cf8c36a13bad6cc4a5420ebe75ee9aa608437fa831d5d3
-3113083cad048dc0730667388bdbed24b33d2c39f67f501f948fd810b8111903
-63e2fe20f823845f9a876e679120f93ba686cf408bd7d69237538e3751c20e84
-4b48e15f86188b8b1002be79cbbc75f226bdf458193c024629aa680f650cc8c8
-71f4a6983ae5a1598821f3f4d8a53aeca3fb8b3bb4266c4aca496110962a8de4
-bf4d133bef58ce2dda36222249d0532cb935804e1ab3fa15066bd90ce643ef8f
-4446bf23d64a9212f5386f4cec60ac632c0e9d7404eb70303f35c50b3ec8dd5a
-99d309b6b7364cdf5fbc1ef653b661442b260764c902e8f4cf6f2ff2252472b7
-53fdea2300d5d6e1f77e46494d6dc0533a77fc007e723591769fea95906c9a0a
-c65f04a8fab8fae134b1227406bb3e44fa20a8379c91318d21315f730b208763
-654d279af7d123b98f2ae67bd5b2f7920187ca936b45b7e3d1da116953f1416c
-46a41d922df8d5941e1a860879c052020ee0ebb78eab5e0936b1c8d02eb4061c
-11c2cd1098e566a180e63cbc8ccf70a0298f45adbfd0db942abb2470bc1b9c3c
-98f61b3ca787d0f823c90231439ac4c5f8ffc7057469b2955b9bea13dcd9835d
-8d020f593e21b87cc8becab62522a1b1dcde669760e830be5c3bb7b12decca2d
-785e1eafc5d6bb3ddb447c2e69215f7647d4e725a2c647746b7bc7f5df9d3189
-d6239ee2a2bfded2745418befb8def463433405f4b4c278295c8c2ad9ee43917
-11353ecb9ae9685f17550f208bb3eb7179a1fa69882ee2691d280ead58e93f37
-70ca26ac429ee5b8e0dbbb7dc1876f11ebe6f1a0dc330cdbb24b9cd1439b3044
-8cb62e50b33ff18099602c620af45674a3ec0c93fde12ebde8b1543c1f9c5d0e
-0a12916ed048ea3244f07060235145cd2a366581ea658b85272d59cd429fc509
-8f62c9937dfa11d29ef22c74e5115f6383d5aea6b2de0ca4c5366800a2bd802f
-162c3e3774b12b016914e4c4e008d81b0278c336d764dad0cbbda4652abd4a8c
-213c7da9c9fd6ff7270575c6c15bf622b6f6f4802ff6f7991d371a7f06755ff3
-cc7b344749f239036a68803d367d121a24241a559e8d64b6658a8363371cd9e9
-b79231afa2f6284a1ba5b99f18bded77db058469932ebe7d405cc7fad3224536
-fa5fa3f7c643637960e88b0e50014a391c65f22424f7edada3a7dd72a3bbe5cf
-47a7dbc05a7955d77fd115db666f4858df46260425575b8ad8ad44912540ff7d
-1cc336c3f9056df50f5a0a2c34f12830f81a332b982db204d218593b804661df
-5adf14c6ff71504cf9a6faf948601e3e1319c806301ba2915fcb59208ca378e7
-afb5adee01e4167cac25e8a1da13034162c5b1d648bf608174a38205ef838067
-c4943118642ac1d5723eccb0d5e365226ff4c34ab97cec6c9ccb7b73c01ca8c5
-85ec906334753fe353bdee090a79bd56905deeb8e4314620e509a83867ea1c19
-a16599dcf0f2d2f3eae58d8bcd8da926a1af99b4057ce29d6ffdec24a7db1a14
-4ed9feaedaa325b6eb583ed87901c43f9f31bb97563afe8630df00acced9d95d
-4b8c1d0f47e02a76730b960e95fb78a4a11284923e9c91a2a5804c14ffb3e352
-943cefbcb1dc6ac888c3a332528a89ffe36fd2824c48eaca69919838665a3367
-7d528ce020fbf68a32d10f0e0708e16611e734a0b20d18aa6dcbf8c450e2b5b5
-f09d32c94c115e9ea5e1a634a163cec01c3a2f3c7826ef7e9d5e8d19d4c4866c
-84666db73ec62d9c5b2508b05145522c3da50a31871ef2b6ea0f48187c191e06
-e0d8160390c05376f0eb931bc07007fb313af86bc0934bcab824073d6b30aed6
-5bcb843f80cfd4c3ca11926c604512bb9c14ddc64bed2eeb5522a4ff3120fa47
-d454352891efe9fac5fa88660011a8c0ec0570e0430b19b698160d4ddebf7051
-079809d76d8aecd01ead398d4e2fb15423fb38a6dbec48fbad2098a9ed738f81
-f6330165622f646fdb5b148ae89168c3a1fbadedd5d316246ae37e45bc896d9b
-aee9dff0f5de45b6121e9a092ac8b4c69eb61138505ec66b367f59b0c6f18fec
-c0010864ccc7a0dfb650115242f1664ec78b1861b93a82a793ad55f1d27d646e
-90cb1534ffc6b9f5e982db9070fc65c9559b67285696acb8c7d680e7f109890f
-4df338c15cc2359fdc3d52bf64c5f1f04d2507e80b4f3c51e68c2fc099e56fcb
-89d0d3bc15657fce79a2633352e4b6ef022f23f17c9b99006de8f42b6c09f5c2
-c82d88b0bf013d7500e10a838d34098b657ce411d22916acfa09121a3a84fce2
-a6ebf229b12763e2f5777c99234ec8a966a7858330ef3330a3e3d0fed0c8969c
-1d5099164cc9f1dc0e398cd9d30bcaf6a4b02b148705de166306633ae538f9cc
-e791641864e73441382828e68f406a673cae2853224428921ffec808630e495c
-64ab4c0754cd85327bfd7fc9ef957642a6d30258b4b9d29bc059392b7e3fd339
-5a6e5a0eb060f9dbd09d110fadbd8a061b1ee8880c61e01fce52c661e1d1b5f7
-cc45b9efab2880a9bea2bd64e8ec183632b1a7a996baa7eff23b18ccaac6c88b
-1835eb751974d2930c1f354f5173c9266918872eb7c70d90f64113f12b86e6f2
-eca0e29c4d4c20fa26df487b9be3323ef6de8dfad3f81c7a23a4930fd3a1c6ff
-ae0a952f8e074f0f034d4dc16e0f3c11463a57ce0c14fba845733568ae0e8f46
-1a00d55508e00a80be53d818d38acc4f7212c628cb2047f18bcaef075e7fb3d9
-6d090ea9a95a21ca3e7f797aa2934653176bd7ae0e72c52dc19196142e571338
-572a939790b6fab6592f56f8a876c99bc0f9d04afb37da897e2dd8a3818f9134
-ff6dfc66c7142738167ac5688b4da11dbbf343aeab2fddc82631fc7f5e3e5bae
-c857ff3757de3c01f097db34436e6d9ce0736734acc91c447277baf1df07c5ab
-ae7bed411bb203043f0c16155e38f62da67dff78f94bff4e8ee86e0261628487
-0290e8b302f9941c60a04973aaebd7ff2c4fd0c5fad6e85625921e641b73bd91
-8ab85ecc505552442e1d1802460024a9d3f523fde2d1139733fe54e74dc1322c
-0d67261490354ed262e2601098689d583f0feabd9b90fe030812442be5645817
-5fcb9cc603f45146004f4f06d3b6325adb329b6c0686403678ee2901165cd44a
-f85d7977c6e3c84a0c5f5d7ac40be097e91259eb0928f84166b2bea549d82ffb
-e2187555d160a406a8f273d18778b42f37ec7045734e579b9a7141f48559d8a1
-2a491e774eb885449bf57ed3737c42ebfeff262bff74eed2d0a2a8915006950d
-24b1f2ed4bccaaa7a37f126759e52034dc7264eedad951a69dfaa509af59549a
-f2de1eb4a74f18abd83d7e8bf00ebc4755ca342836ecfdd0c11221aa26c187ea
-95700568592036fa3a03b7378633984b7340e8080f82355c2a572579c06d2c86
-b3602943102236aa99d971cd3fab42db95dcedf44d04c8f05a2a1381c6e9c58a
-a526db2ab99b4033ba0d339ab2e1d93b57e691e66efbb79e627f2d0eba005080
-7ed4a60011be87ceae68fade61f969daec01accbaa640cca88a550c7de3b13c0
-ee86bcc1b3d11cb069bb2c205c205b35da97c554e0eac66dd8585bbfcb18c8a0
-cb3941d9eef3a493a2f7dc187a480d21a7b4e5285de82b81e04d6e239f7807a6
-6a334b6c7bf6fafe27c1a81c3957ac1590de2f5d74a0c9b8a990e2dfbde91298
-30c494a28e29557f3cb2ae8a6637fa3d83eb11331f8a3554a1419d8c5e84c1e3
-35f4325506a08bc8ae49a113a5c3a10f6d4b5446fca9a287d02d8db0bd53d706
-00137e83ed703f3e72e6f5f3f2fb14b6dc3e61c1bf7d910f03610666f5579a81
-644c5eca8ba56df6790561ecc91db4fbb7872fa49d2b7f10ba2aa28fb9ac85a3
-4d571ad54e98993f94b7c551e237b314536681cf8e42a26144ea39d9f9a9b295
-9aff80e5b965d2b3127d89e27ab1c8804c68ff4a1ab678ad2f1bfd5b2df38985
-bce719099c9c7a128e29ca4ba9187ef9462d4059034d7379a04aba778756f48a
-2373c32c4b29b769c6e9fb458bacc4bf10bf25320d757b76bacf1745c0593e2c
-fd20432e32bade5a213d53c77d56d34d67f436c1566395e6143c36c16796cb27
-bdbdad5cfe3dd3eae67b9474edd492c85879169324cd9fdef636d5b9c3abaf36
-edbb4ac14a98893e36dfbe7316c3b9dd3c072327b0bee8bf09fed0a0262f0e5c
-08bb6dc0474ac2b428a4c1ee5b624bb1833be8b2f4b14c254d7129a2162308e6
-48035a579d1a7c236ec5bf6255630be94bf6129b96989b933f9ce2745f69140a
-515da1fdf975588afbd4c39201ab3ae8b016635c2bbbe6aa27bdca6215617e2e
-b9d4c0e1fdcffa313d847929c37ac7b07f96b0180fbbb67f46e9b6cfcae1a66d
-4be0afa99fa7787e7f8be5a04e723d4f30abd5a25f080f51de36130b7862b025
-eb56872f2744686fe5959fd51b40e6d11876f61bd9e3eaecd57b40441b5bf86b
-378c83c4deaddddb6ea17f6997549eccdcee9a7a48a24466d9c55ed17d7733fb
-f323871fd7bcb8414609729c27575ba9fd429553e3d63ecdf78851b72dabe4eb
-9ac67e961a4dc4cabf70946cfecc144a87dbd9c73259455199412faeeaa3644c
-2022489a3136253e1497bb3458be497afd4c9049c4a615a102829c85e9a4576e
-350e14d837372b4b1663d415cbae6a3a954880114b13a1c214b61ea6594127e5
-742b98849778893631b67469aef59b15919872a7cfd255910f17c53576f03571
-0819d59e2c1a46d0dea64fa7e03a63256a8e65047a1ffe4fe36497d2281b6aa8
-9ce1ec831cce61de63c1da6c8a5672c25e5a5a7bf20a7f933bfdc45cf7bbe921
-42d8625b3aac773bafdcc614425fadc62699de088714b72691a1447506e9a37a
-093a960287e418f2e530c537c08a3e19ec7becfa4ca9320b05f27974d4c22ddf
-61a0ccb6b866d8961f04f9f9b85809bc57d358cd918dfdc9603b32fcbea81d3b
-e193034bc458941b7a413947a1594e46b4ac9bdfe9416c275807a4302694f7b9
-2a226b8c96361a389a9bf92a47b28e501a06d91d6cd54fd2d2707ce52af2c279
-24c6e95948a936b4e0cea35c6bc62edb1f545a28ab762ebc3c2ab4c4c3a670fd
-14cd631fb5fbc26cb51ded32461d69a2b82c586c40cd1841fa3ba780dbad789a
-cca61d286389dae51295141ed27217db047eea3247388390c153c22f949642b8
-5f87f9193421abdcb6d4d3882578f9e70b28ad6238d1fc25877f42e3899ed0eb
-4cd9f13eb898e67a053d41ec485931655c9575370aa8f4ff30e8d3e7a26bf27e
-f32f2ad0bd244272f84af019bcb2bc6332142b4d0bb50fcfe13b9c4e9883f0cd
-c4773686b3ebc08b1dbd2ee12fc3f18a28be0610c4bea2df1543ae37dabd861e
-2c1a65515d8bddd314f8949b5941aca77220073b541c9ee457e24c862781f8b7
-56fa69719cfcea364a0d983989ced39ba2c910fcc25a00601b0340d8d6083f54
-73d54c577012ff8895d006922198cbd4718e32d5fdfc56143818901a670d67e1
-0971b6754390848db25f059764a99801ecb89fd0f38d46c8da9e01011bcd32ef
-c3c445769122d22409c8492bd716782f411aef4b4e0f1234a936e71b9e8a6237
-9b18088464e5e2934c748c64d69b3f2a92d81a1e0ff81a3150013c3764ca0194
-110f7691c3a2b8809900ab262825cef744812fd2f5566894ba1f8d2250d98b89
-a8683f736d4b5a59f51f2e332c8ed0751089e9c51b91b1c54d9b260e312959f0
-c692d4a760932264214ed92c3ded8f45ed1f40dbde9f20fa7a658b6a36e121dd
-cd1bde6e0b8942715b5080fc04a7e6db224faedd8c5778219966177e476de4a5
-a22be484107a0c11d6eaded4ebb020651777add24537d83b6d61b407df0f60cd
-34ee532a9343f5b4231937839a5b330df795293ffb2b27521d142065edeeefc4
-8fc9f90558cae326dc18fa6b759e4d0db1decbe33bf3c1fae3e3ab33c9392d62
-429506196d1050a0e2da447161f2e323103da806d05c40618288fbeff828d053
-d3c6e0b0718f5c9afd1581f0098eb9b97c35aad2cd590e97f4a139733cfcc7dc
-acaa5814d3b63efee7c764c0d0a8ef392e3dc3f02c8e89f64fae8ee4ca05f115
-4314eb98e6a0e032886fdf29692dfed62802e84b48e4705cc0c158eaccf4d7db
-dc47b91aa3c5a49ab600679c13a2177c145759d8bdd337e35c77717a15c55caa
-45339aadbda46e71a8a018d7782b9299a2681c927888408328699da5b8cbc45a
-b2705038b818fc0bdca4d52896057e105c8b859a52676735022208a76abe3f53
-3b012a22daadacfdf29aefd86f67ca840a1473dcd650f03c315f23bc6ed8285a
-9d1796862a88051a4ec70fab8697b54c53260eb12edcb9e533eba6f9c1668f5c
-9709dc308f35b927c974fb1d0c58757086770e1774485e757f1b777db15a6857
-1c084f48b3da6102cc7b38dc89f7a8e33411d7e35434750ebc98dab8439fce99
-37f7b35ebdef734e2b44faf3dc68fd5d36e8fa82face91146ca6bfe1b1710cfa
-60a6178c88ef1137074956c67cf81e0052d7109debf10409d752e3f770933111
-a069a639005c0e043d42f622e96fab8a4a203857a788b32d3b2b5867c7fcc075
-9236e5dea77a574f4cf964d0cc2cc786c6f0068049f20015dda844a3f409b4dd
-bc95f22266529f58e88eb9568ba44cc414535075b383937d1b33135f77c87a92
-9e77f95cdb0d71a1807f1193ef20ecc1c497df8e08732505288fd2ccc73b77dc
-cd88fa4db43b9410af1524b03864642f44ded44466b5caf39429e2c18e634834
-11bda54bfb6787cdf3810a3f2e15141d7dbf09aec5b80675d65aec2c66e80177
-4bd3e428b6d111e50d6f2e6b5d4d9140689598d147473b57a71ab08080d37d2a
-7f2b89ae2f5948eb11f3808542b8af7ca2173bd33eb513c67f28bbeb87627ad0
-09fff3b7ab0c2deb1668fb922649bec4bde78448bf7070e07b101055584d002e
-93826a781916f1e2ac7d272f1a31611835737d54671d9fe6e5b9460b15e39fa9
-af198819f2073d6dae3b3763abc240732d719b0b1c8a37e5f9f76103e770c0fc
-9343289d8cf3cb969bb4053cd377413a610084e68c255a6faed405bed1e4437f
-f93b34eae37559b78cac42761c985e280b92c57c0641c244f3c480bf57fdbf6f
-8749fa7a45d44a40f690d7cbf8b6d9d014a533b8fc62717eac7e069cbe6e3a2d
-62e0472bdd23f0edf4202a643c8fe7dcf37f4401d94abf44c749ccd26c2d8fd7
-1ebf9ecfcf534280e759959c243f3592622d799747efa7d5b75964090e0a3dbe
-dd08b6106631bdfcc890bd5eac60e6fe316e1780b0073eb4a25dd38ea62793c2
-e3e73f9c4ec3d85693dfe038e322c2c383193b789d13c4be802852b7c877cf29
-4b58bf6ab55f9d6669bae41771d926ca28aa6a58c2601f13fd1aa9b0d7b481f6
-2be12d72c3ee24851851bbaca53045b24823e02581988e4432a8ec843866efbe
-5f4511418efec41146309c7a57d665d8ff4d97dd85578dece104a6589ab5de28
-c7d3e653f01ca8492ae98a2dc7381be07abdbb5ca3ef9241ad0e74561f9f5a15
-2ae8cd680fe804aeb1f73eba506da5aab780d3fb24f617957f7835c406c2f017
-1bcedf43715e7f01450f3bdd30c91d91c64e55ea52a8fe5423d54965aebf4574
-b1e9c8e46c78b76fb87df3491440a7bedc74af6a963a2d34486b81daabdf4ff0
-37529951e2bac3dc85ae2aa8a2a0543a0093d2ad7a872369458db38188a346bf
-43d572f9e2bc2f780ec70a5b65d94aad411f888b5592894da1e4486a0d800895
-c08accb0c9b8e0f18c0ded81be332ce12989c95f451c661496fae73ed7f0eced
-8a9a8754bf7778ff0b4cb4ba16c67c9a905e781ddbe16bfa57462ccb6044d891
-83d761ce58941024a403ab718764a1855d0673d39975a286ac8b32f043176f85
-f2efab1f0a0fa4e32ff159be4f53292d5e393262e9f6404b6ed6349ee4ebb62a
-53dfe5dbd2f6b63960cb2bbbfa89d7c66a44b2cf5969ee98854cea3e04b27c19
-f4c79157311318bc975bdcac70548ace6dcce4d71e506e4fcf2eb115309a4444
-f76b6c271017a02953d0ea0a2448aa832e89ab0895bcccc314fb02968cf754ed
-3307f1c59306eb773d7f63f7b853f0ae71093da716b6c0b8ab469c2371c26c85
-193ef171b6c1f48c559146d1989af1700d9d08e3d60ffdf548d5cf7a8712c75d
-24ad4dc445f310b625c4a00e0879b95a2699189cbf88fa7d2c3fd191c963164b
-d363998c215e8121fc3c44a6fd4e428b244a8f2c08b3b058220bd3a83ecc4b12
-24b192d8972430693d9692a045df6f8cc8e04829a1ad2a690cb876c8c72ef8b7
-d04a119430d9882aa7b4994581ea9d846970e80f29c4e4386e95cc74e60d1aa0
-e0eb8d5a9b018dcb3bdb9fca1605efebb39bab3abdeed7585fb989f8149db2b1
-22bff8090404c44bf2da1492a697454804b85f7f282f78ed0df62d59d911107d
-524f6db56e00f897c58015f399bc82d4340a62025c7867c38f7063dc4012a795
-016ee4d90f14c9568d5e324e73f6b7c57ee5f5375907bc403584eb44a4e33c4a
-88435a399d72307c46d232ae24b3ffd31514ad891b7af711263d5778f1412db7
-4b8302b179fa8810340f07fc9b0acc27c06c915f1b45dd1d4d238e00796d937b
-4539a8386a42d6d73f66bea6d8719d057d54cfcaa282c4f06336c05285f53667
-8feeae08253eb094aa8290c40ad00bcb7e1ec20cc99a0ceb80f08f8f356657da
-ba56829d869fde7c4645559f9349d3371efa44f58bc36aa493d9a0624b5ed4fa
-935703ee695de66e687f27e1f88228261eb8c5a42a6c9b30eb45227874f42fa6
-aeb66ec01d1b140af535b1e28d625b1849d2914cba6545727125f739bcd1da1b
-7d1fa4b2b0e6db67c549e0e2e52953cd3a240d3eacbf623043d28b119193923c
-94a15f4773e0c3c974325f608d0ac0015cd450c02118fef94cd39341b8b1144d
-9ed9f3764f3c7796bae60881f6d9d84e76fc18ed060cc82a1beba6123f05ea92
-9a3f3eb82e2ac1eb99e5c6ec65a9cf2a4e0b3c9d55816779edf45c429b49f553
-f0ef1f1c49966a822920230d1a4dd6c05e2c676780ad7a6cd325422d3fb97cfb
-1594f9a31f0730c1c811cd0533671940b3dca7a70fe1c1a79cb4d22194a7eb83
-20323cea558fa1ab48573b4d56fadc9ffc911c8e94680985b0f527be4d218233
-890a06787f21b60b459b8a712eda9797f9dfefea8bdadd077e56ae6035fd5ce1
-a405b543538c790b0bac9c7586d9677feb4518aa590e4b4499902f8afba48386
-908d301b8ed6b87ee1f1ddfe80c37eb0affdc1406617d37613b9a3e82694f7b1
-60b2d43483a09811ea5f50cb559022034d9726c0f9f80b5efbbae8d1dff34e34
-ad6a03f4fe2396b50560fb8a9e9edb2c33f359728f2ff393da760f9a50a04320
-916a583228be053cf17a11246d97e2adf68891b73cf607a1c2705f9066408137
-39c09fe101bbf9d6f0be4fea0b469c47ce6bc2ab1df3c5123f3693ecd1e29ce4
-20f76b77f99d428254f8bc54f0cb95ec02872f83677bdb3aa42e6ac247df1a65
-9c53f63c779b4a2d8a720818033395d47798594ae67a5d84c4505697991830a1
-b244d86dbdcb1b57499332ce0c7c2b69275d043e5be094d835ed3058fef037d1
-2771c26dcbb2da45f3cbf68f219f102b5926200726ae55a214c5267b0ea374de
-41c46376cfb6bc7c005fc5cc803822982133c604261f3a53c7f100fb43638195
-5f4d544d99e3296fec2d65b9f3c40636cbf6f6225e62498320a0148dea171546
-6ec4a4a6626c2d69ade49abc9856a5df5d5854aeec16070750dd7de29b8b6a30
-63aeb9bd772f232e80080f9eec514e8578ff7a51f2d7c083695c50c679130a83
-9708e9e7111c6d8abeb055502ab14e0e4310676140a79bc88a0cd652eaf497df
-e92d43ac0bc724892d7b44926852030ba229527177d42f648f829a77942f1181
-2aa4688d4953c18b231b0e016441022450b6a4efa08a10b550734c2e7794bf06
-567fec60c62d0c159025dec3805ee2ff0e85280442f9cb14b5e6d2cbf2035153
-b49ba7836a372a2c4a4173e2b63fa839a368ac7896cfe0e3c8b131cc4385377c
-b4ce47bb4fc50e84a24af35342cd3356b1299d421ef7d172679816d7bc8ec23e
-e778c76e59cff801a01bacea63f46568ce5fdb81e5fd21f9f43661a9f8815df2
-58e2e9de4b22fb8b2588cdb3037b5725ebdd76a50ebf6afe36eaaa072aabbebd
-0c6adb74468395b34b84567cfa423b19deb4bc67dcfc86345cda9a9f511ee834
-a17ea4349584ece87b4fb9ea12718c600a1122c1096326e06e193da1b32f9945
-3a40f5f8b37245c99e5225c6b75e1bf9af0fb5d0b522fad58eeb2d6dd9d63ec3
-d9dc272a5a80ee7626651f9181ce39fd8717c870dd9e84ce9e942e1713c11c6c
-87acd1b3415c15ac0b34c24dcdfc59acdfa56d5980efbeba111a4e5693c341f8
-613d83b3a0828d48ea00487e55a27ee4be7b93c30bee530ebd2bd0c41e280f60
-eaf6ea444894e24af55e04c7892dc8860d19dbd60f157537e2808d2f561bf869
-143efcd8a7e3e52911c58f2148fc2485e3b37ddb23e933b074638c6459c09e2c
-29244a49f8e7fc86546210e7bd68b966e67333b2b527ae20180f8af858a1e2d9
-8f21bda6e98e02f310ad7960411eb89bdd97e79751ce5cad665ecd7e7995cc6b
-18969d13e902252b163eb346857d6b091c1f8e5f7ac76284be6eec4748e92c68
-4e31a333726ff7d5c1fe6d9867814781ccbdcbd1d270cc2bf014d8d1cce6a8dc
-b184f18651a2cc94975385906e22128aadf419672cc862aafe5110fd9cb4a028
-4f7413e4e244638660a20968a81ad923eaf27bcbb2aae3106ebc5050a69a92d3
-483e3ce8e5ce69f06edfe2c6a1ead8522184f4beff28313a8109731fda4228ff
-e3ca429f4cfd68035d2f73667bf0510135d968fff85cf8c516a09cf60bddecea
-8f889b3e63bbb6ebd2ef7ccb0db00ef5a92794b162c82846f7fcf3e69bc6956c
-5e63776482c6043bf73c986f1f18c6abe32c71f1a4a74f29e9fddada315f5ec7
-e4b38e1225ae92ba3dfd4746ce74c1004a7c2007bc3a95d0bca6eedaacc05078
-ec3a6e32fe37b6b3edc1ba46da5eb8bb981867b64404805dcc91b4b5e0b527b0
-be53e79596a7db573edd7f8f913082e0ba15e74d44ba59f89b0c9d46fb34c2f1
-25ce2d967c903debbdf67040af8bdae68ee0b1e0e89d79e9bec185394ce531ec
-8ff639e1ad00caefc9fab3880fccf55dce1e3937860b25a47aab8fbe4376f854
-f0c983ae950bfa5b53ac225557d28dbef67a89ea7571ddc8a710756833bdb5c4
-30ce1ddcb86623a82cb4e1be4ffe6b777a0a8409813580b75a89f6a8c65e81c0
-168dc486916be4f40cafa4cc6b1e22d553963b2449e00796e459c57b94e34ed9
-5bd4f1eb9798dac04521d031bb8eef565c6b0740dbe50f0b23fb1d799fdc2f61
-3f46ccdd6ff1ae778909d8998598fb796e9921069e4766ed35a4422782f62338
-a03acbc0a8f42c0dbba5917d7fd0bd2481e1835c660ceb5f2334acd57d4427d1
-97a82e44b0b172ee769b69666776597e018d05db7161e3662e42e0a1d5906c96
-607ae2ed6447cf857ce0e58984d8c363a3a6516bf4713c3b23246232b5e512d3
-9d2c3e32c33408c03262cbf5c517772ace92982b59db582ff69a3ff6c0497405
-8dac147089c03c44bff3ac70e685939ed4c1097a0cb6bb9fb399c5c0950f6689
-5dd9f05c7d262061813eca80e87e2c15a266f5be420796d1493ff3547db70f66
-26543b1ae2d6fa431c5623191327118c5eb8b331ccaa0f198f062c51cfbb981a
-dbc442937f63c8a0c179c2c42d572564bb872a2e6dde8e7d680372b157e840f6
-6fef984b009c671bbec94d3446e85579806b11586cdfefd7e2bffce117f15e11
-f9f47bcc9e390595b06f7207f6457cf1f775f781af79b5b825dbbc98e3858056
-aec61f1d9210769e2761f216f01038b24422e67b5c2386182a4e9382d1f345c2
-c6ee6299e4e3a784a4166183be9c2628afcc27c45ca0391975591961cdd718a4
-3c3d1b85b793b5f3a8b6d7590daa27eb6e73ed7726d9719b43aa13e05ea7ade5
-ccef5bf1333eb7880311869e055391412a9f09b676ec67c994783d0be74cca70
-76424bad7f2c80f031c2dcfefb6f2c8e352d2f41e010dff7d37dd6b03cfd207c
-6308d43432d33a1ffc94b74248b5db43f044764a865cf2a6671bb1f99a7e0df9
-5ac614da6c4a8d2f8fafef2fb5358abeb8cf307e0a710a4d3670de75e0f19410
-3062037291a143c03375e6c1fcca2711de12aafacdd5c071adf22c86dc240ce2
-d5182701ade04a8a1c73144012e2b88d4d5621e76a26dd5418f171f8edcd1dee
-3bbe3d6a357b75a217a40e79545113fa2ee15ac0ea2a94b8abdc82e7645596b0
-d8de0966693b23183fc34324b6b7c3d58dcd3b9a6fee2df7b599ec03fddc0aac
-632305776c092c7d45c8e64d9f4c4d9342fa55f9777ebe941ac71abcbaa94a0f
-91ecd9ba159dbaa6ab418c1bdc3580728705e782b6259478a036df71d56cd481
-1e5679ec3fe59432d6491749a9653ea2f22a16cb93a0762e7f2aae8fcfdfb43c
-fee053fd488746b2af285ac480e7830a0707adc87161595a5cc5a81feeaae5e7
-64a73af7c1d7e8c1dcca93374c6dcd57d0d31c479b3e89ff4135e66352290dac
-86d663c53d9b2f4479662c8a335b00ff194e0a29931552a641510bb9b08dc991
-78a63331f41b7a813ac7640ba77d7a82d9f9823f75c01175d49d2d357b2be420
-b8137c3821f260f3dac79818a7d0b4d86d257af7bec5fed35f157024f89795fb
-6723d13bdc0f41a1d16cb2a232d457376acc0e332fbe5b36344fbdb22ca8d7e5
-660a86f3902f04ad8e1685998888baa9b4e0a2c064d2b63cbbde79914f3d8f52
-059ba32a5f541fed91ab69b69ad53d045755270345d3ce9916488f75bc83e7ce
-041b96eded251aaf6abc9b68b16da135f86c74556394cf9042b54cb38784c548
-6491c83043598564ca6c64ac7e11fa09a3c3887fe20d9314c21ad36136e6bc05
-561c0c1e9be70079846939b84eafbb0030f4a9b0cb303cbcfcf16ddbf44cf977
-7f8cfd027bad28fb461b29ec10abf2655341f0dd3950a508026ad4031f3b139c
-1e16220521c36ed2f7a0e11780dd8982747af44a62bf13bba9eec406077238b6
-a03acfc88709d33589cbf6341eb2d1f3b096e515efbca9b6c1328d97cd840dec
-e341741bac9d0ac07f5608652af7caec833adff0e09eb728588a6da3e3fa8038
-b8c1f4105a5fd50dabc7609007ed1ae39a0b75f11772a452ca7d0bf856e0c9f4
-fa0e98d21df2f47924528b6edaf372b937d3fc9e418b6e5c18058f93d5bb0e28
-a2b59dfb5b5924cb20ba6aa4a5e5a1239e864c9de629aa43543ac2eacf89f6fc
-cac316215a3295ff05f42bc41cd8504f33326a3f1596c63f15272c2484386544
-9ce9e479d5df3214c91b9ee0fa94da29036912a6b1f2b8e240a9123a6854d84a
-08f647bad14829aeb65a3a6fc8b7cc53723b992db9a94d8057c33c369b401ad7
-1ddbf2078bd8ab303b399002600d5eea4dc469535562e1e6e50366728441fd2d
-35cd771495ffa169ed4cdac01f988e7ce5c7d28f9dd0093bb95aa97ffb30bc6e
-dbe2f71fd3e70aa1e2de7cdbe96181e92326d26a7558b1c1fd0edb58c63c51f8
-b1d741513d98e06d3769d64e1a11fae44088583ee7584e867b9492e66e9c7114
-3e165b672204d444aad59893d4212860f074d1c6079a261f6b3e7383c57ef17a
-bb600552eb518698dff54a48ef83ac82ad43534c07dce6e9e32078b5d60240f8
-b10d07d496f7b7de76fda6a20db434f88428dda2c5320a38836ab84de94645f1
-c511080a50d8254c0cfb67bc3ac2101c401541a34959107898bfacc611bb2962
-f4b3d1ba8006c28103c2a55286bcdba75a3537f81e7cd0d02a9a3f574cb6389f
-332983f4cce98c6d53089588532402a4b8a1d1427d550c7015e5ef584272160f
-a044a92664299ddfc990ab0c885666c09b6f2d6240db9f7dd3f1a53a6e312a80
-963080a78e62169cfc1a1a7a329ea2998568d9be427b7c69a504e56a7920246b
-1d12fc87e7f797798b01aa76fb34594749fca31041373c2a3e1bdf066c839925
-fd89b479bc991372dedcd1c4588f1edc25ba46b7f48c93d13ee470727c9f9f27
-dc942e55051d4f73af8ff183bcd232980fa907def8f9192c3397552070d0792a
-0e13f3dce6f14c904992940dc66abcf4de5d31be037a8d913fbf6f0a71c8a9b3
-ae5962d0e70397aef6d42d2959bf2f4058f4aa2226afdaf9a24f326e37d3757c
-56d590dfc41a5a2313ef3a460932e71c16229a152a36bfda828d9d68a411d64b
-24e4854cf677d412d22db866c7f70ce1514684a9a09203572a0b5088ce3d2652
-b014a181389279bc373f982b2db5d6cd9e6f17af6dc1ffa3b05787c50ff2b9c5
-21509b9ff68384217c6c8027b93478e31083e71b91ac4e8de22352ac08aff22f
-e7821600af0d1a269bc56a658bf7650187545a1ff2b85d73c969199277a76dbc
-5f1246a6a7066720b62310321411be865fabd80cba515d52a7767fd70d3bd0c3
-7512150200b4d5e8d92548bd3f392c1f16a55ae1a110fa2bc6ebacc5276e6983
-7dedca629ff9d85218522e59566991ac22a584af50b6155873012e623e64c0dd
-9b029546c73368bd1a91a1365a3082b715738d2d470b4c9cc0798a9d09756157
-74b8b5fe0fd88864260e3af1b2cb01f3cb6123834a468fcf1de1f1ecf945b6fb
-6e2eac258b0e67cbae19250eb2ec927bacde291d4424d8a5537bafdc2bea300e
-3fb2eb614a952717fa35749dc90a683359dc426d901b4f407710ca529f6d100a
-143cc3264586dcf7aeb6ae1e0a38ce7efa0bcc2eaba937bc1d924c61fc4e1214
-f421cab4a51d223cb75fb13258fe0cf3001760df8081e5d8796e329b2219c773
-4ba75cd625e873f19d07dca484886174c089c1a50482edce0b33e297980eca19
-7e80f95612562f655958510bee41fc43eb6f3a6dcfac20af5492449994016664
-9f17f649844b0061a2c7bdfdc3d2d8bbc0decf248382e29b34ec934c3be95aa4
-4d7ad210d2f47c986bb74b162a8b646246e7399dbf42e744dda2aa4814f184be
-9e5b40762dc25102e036833f22f02ac701bcd27adfd7233ecf8178c4406372a9
-44b2afe64739bec4f3fb782643245a7c76a541997da6ab9273d73b506775db1c
-d1009aab2289e1bec86bbb3079e20b0814a0dc046c557d8d5d9a04fcd8deb4ac
-76bc3daaeaa95012770da4d96120e153595c2cfde91499ec1d3371e4f662cd2b
-4b3becdaf3d3cef3c93e786bead46fc8b7dcafddf067e43571cfac08e2c2a94b
-33c824176159bd0612cbad0ab9c87e86ecc7e6fce0e09ac6b42aa81cf1d216ca
-5fa78b5e5df6ea279a8466822c15e9c570c782dbedfd2a2b472dd555551d7e06
-6c582844169e4ff992f0632f3a5d84d0ad97e5e0c87471714f87fd02f7470af0
-f64820292af14a29e600293cd53e9a0d3c2e4a10386913a08d3aeb81830745be
-be651d33c4dc3f9a362b295a9feeaed0a2691659f86846dbf96fa73d14c69fb6
-2934e3e881ed6ac09db98bc4d485ce9b190d1aab30e1bb2c6fac242505c68e89
-d796cafde8195ca0922fe315295e9644d4aed6b4f2a0219784b3933b7814ef25
-5e37a309edb100a6a9484778f195f1b89620e7a46a719953fbf11ea504575842
-9deed1c4d9d9eeffc4988e1db72107ae09873586256168e00f74efc803245f90
-7191058b70b823f06a5728d4bb2cc329b16b1622efe45898da9c3eeb82a0faaa
-ceb67820fc60ed2f8673e089ede97024fd7e7a4c34fe53882f09aaa8fa14d5a8
-ae172b4a20774dba7e98bcd626b6f45ff15742fbb2586c581a44ec7197019e2a
-2a53038e15af2acd5e33fea4f76617d0bdfa83fb7a8ce070abbf357a394c166b
-7991ccfb463e4178d4d4e92629e993639b9f2e80d90d0e040e12c60b563426cf
-0c5444224aee42c44f7dedc06aa93cee86fe7407f2f8cb11d1ecd71852eabc6c
-bf25ce66d4776da60f4daeebfcafa240620e9b261b922ffb670d53007ad659ad
-f25e33c2635201b15afa6ccd81b225d9d59ef78e6f809d03f39b6b968deaf8e3
-b52bcc1c9dc6ff4de50d039d98d0b36773cc230153fa438f8fb4de8fe1f0a3d9
-548ef3078abac9aa74bb499fb06fecc78db02bfe48dc441510a393f6805613f5
-a762368142cc9b1de1163bee652ff1427f0b81836d42bc0d50e70d29846115f7
-3299bec648eaa5afa960b13740716767c92e4217eeabf4f42f7773cf08eede70
-c092e17c4be3e18a0a18bed80c2538f53dbc7410e9cb346df72070dceea70d68
-fcf91f821da4fac781a50ace3f2fa9a4d1f843e07d24b906ac9eee025ba98f5c
-29de05050c88a0c5e645bb6abb68ac9b6e1b376e32d0e6e312bf8115479bdc62
-c34a9d7dbd3b7232e96e326352c6957e316c4b68befaaec0d8c72835a4833ee4
-e745985eacb33c712ac6639f86959c11d6d22c562de124dc83613e86e9359c07
-a1517830eadd1286aa48f699258e9d85678cfeb425680f630c5090d9528ee401
-26b02bac723e01b5613ef12dc9dc22f5c3061f5c39a3948bbb46c20fe86f48c2
-408bfc9d8b8d6bbe00b14bb86070df73dd49d24db3e54a11c87aae6741ea6419
-bd9a370f71f23a42d2ab67d8a7b01967416dfec9220c40ec6203e0739034e29d
-ea00e150ad58da630bb057036216c811a26fd1dc945babf9af676f1bc6f67a7a
-f4ff3f67e34677c5c5012de714c8c0fb6ad2cebbccc73f82b0cc4b52eb992756
-51dbf27622056839bb491674f7632c55a7ef67b249e3d695a883d6fc0cdde6b3
-79cdecea565d186d798bbf65b2a420896dd075df38bd54236a93e968b5d9fd75
-cb178a7da86634231332d0382a0e58c800f453e1fc1a83e19d17115037466395
-71987f6a57092bb46e0ae10110f84d1d959c567b67b9603d22b4e5cacdc827e1
-85e5559fed3b702e3f79577c4b4b3ad26fc8e14a326a94e776f4ada16ad544e9
-0b3a19012f9d6e0d3583f2e814648e86c01561fed1bddcf9b3cde825d0a7eec9
-bc7aeb705c5d1476ecb00ae4b8b8a021bf03aed4e7c9c5c6753f04fd87bb1322
-350e6db3ed8da517dd938dec6befce20a854567d0fcf1a339149369235889a1d
-70f31bad6c47c4e52f6b2e785a0eb141359d76a05a37bd1c566e36d262780140
-65a4fd366723c4841bec798e4ce07f542183a01ef9d7f8f1979539e84ec241d6
-6aa2339275f588352fbe3b05bbae7b7bef3485b05641ebb8c8e3a619c48f93a6
-dd301f0b108ae77b36302af00e580cae0174eb6d30813e9ffad6058e7e850338
-1e53adb9f1f03d8524c4aad05c98ab3862d6d7cbbdcd7d2d7bd921a4069392b0
-bc8a531ae000b67c7e8bebd6b94c2c79f5303c53b045a47be451a3f10afafc76
-a28360374d5fda8895b79d1f94555c30966e5ad8a5f58d54b2dc4c4c39e47b1e
-b3b2a57c8f7aed2ae776fdf4f839cb77f1b2be2d23aa4cb8b8d205152fe3f9b0
-d9002b58fdda551caac65569880995267003437b20cd3a72c3ab3166e593f3e2
-c5399da8ee17843e224b01cbe2c1548d1054a8c21304085b93b95caed462679a
-fa228b98a458e5f08435bcc981e58e4cdc310f57c85478e56b186a65cb8ed185
-4e8a1b30ac414152cabcf2773a2a6c296f89fda5f0cb3634288291022eb1e608
-d7d0a8a46f84aaf58929f8dd7097ca83443ce71f56455092d27b22816379eb04
-4930c56449c419e37978806f3b42e97e1279e9e897a3a709dacdd5d87d0d774b
-e14672a4ef12ba4b49915c76d4d574d44f3e94a20d911db728d973356e91604b
-45e6eb25bc0dd3d285311bd2b01a22559f1e14387c996d531898d5fafceba4ba
-0c6b87aaf5f8e82afc71c04d634c782ae7288f397e50ca0cace18eaa1c17cea0
-cf388e326c7ea4ba925331fefbda0606aec1defbee547666002d478a69538c99
-28106f509a53bdc2167903c9e1d54c41b3696e25106a6062c10d945602e341c9
-b50f1df6630a886c8c6f27383f29817e1b2aa326cc85e43afb136fa58ec24dd7
-03c43b4694b403a1471053cff14fbf9b34567b4eaa0b96adea3a5d428bdf8b9f
-c0159e4acb57deac8d87597b4ee450e93f682bca0712f2136f8216945ea482ec
-8ca99a112e447aab44850a576b69a254a9cfaf86d7cd1c130dc6c1181515b79a
-d703f0903faea4c8e76375951b03b924c1079df5ac55802b53cb34113ffdc513
-8201c1fb93767ede80e76cfbea2f07ac0f95f250697ff0267c206bb7048a862b
-7715741877e4c27b7a88bae1414be335d97ddc235deb4b95a5c51089f50996d6
-a812c4e9cefbcbdfe18388e75df88d04df66eb53cf3e7eac5fea15ff041ac3c8
-834356278f31517ef1d30d53e0dbadab04bd70f2ac190c35e7273d45a0259363
-40dc1e0b0017a7ef36c4c8669f29f21591e43541f149c4a3b1412a5057c5348d
-33b8aee4f452db49b54d4faac7ec9c4eff03bc3c783d901a896fb7533b51097b
-81783a016b20dacb75f52bf78dde107172803db8d3a24300aaff61863ac87c27
-f62e44bafd260a687a8cb47daddc2bdb6570669fd3b63b9609c57caad4fc29b2
-01082b752a679423dde1a8c86836c44dba5d1e3ab96676707df07bb47f730363
-cf78ceff36ff2ca976c969cb74abb3f72f693396518e9f1ec0fab6b53fa334ec
-741b043045e31ace728698c097d458dc733fa74a63d61f53fd4f45b9ac1880d0
-ade4bad2e774af7ee6549e2824168f0aadebcc069efea4a90d4f2d327a242042
-9557284971dc1f1ecef59b92550929dcc42a3168d7f5df5d18e53837ca6bd01e
-003a02c3700842fac98946f6d516ef503be66d4897cf2f138286ee3aa79f771b
-4af8541855c21d583f747c294bf1d1016d3e4313b5df8fd2c3172820bdf19792
-428072fae237ea94b4e28daf257d41cbcbbf9c56dc2d964ad26aab3df4f912db
-71546ec1fb9dbaef67a4a8771f859e0e78a9f6972724df27f79ded61b92ff3df
-4de0f497c50f569891279b968d0567d17c99cacf6c07da376b986299423adc90
-84d4f8e93dead2970857b2c562244f898a59995b5ba464087cb3e2318eff4975
-5079a9ec897cc4dd5bed02e820619bc1edcb56385e0fde4c2ba27fb51a3e80be
-9a2116bf27a5a42e2a70487177d1ab878bfd89347513c54eb92abbc87d50ce70
-3e2d237187cc8abeda00f686bca95cfb404053b6261d4795e558f3886c523282
-06adbea3cb36212dd839d26755ac16632a723754890ac8d9a6599d6f2663f2c9
-b920d92da7c773aecbe0cc7b950e619ba5eb1abc667cd354d417995d6eee1b0e
-e43f5bc9061b897e0779b023eaf9aed24ea5cec2082050c92e0f30e23ba713f6
-2fe14d9957dace391f05e8370b9551423dd76bb50dc218d7fddbbf235753e1fd
-f35e73d4b81e2f8bce061451a2c53e95015a7be71df27847b628bf8d3b682b4f
-0ea381f5635fdd2b8e49e534a9c4d50e2e3991a7d5d418c9922774246f8e9e62
-9096c4c4bbbdb0b7fa78877883fe2f47f4570b4188d540163bfbd5d10975a80e
-c4a21c1ecd43e211ecfbcdc391869a27b06a47bc1540a708a4e58c2fce67bdde
-94fbf0310a60fc2baab83cd16b1c0c3b05a6fe84367b3e46f93a409633ce202b
-fef120b0c791a48d376e3707689a186c73135f034ec6bc28870ff0f9ca5c2dab
-2412d8292fdca20113abfff496ca34eb7829f43d6e1b51eb79ec9d331d6aad28
-2046c1eac346953e6db62225770dda2d02150601fc66f53f94e9d58b4d3499ff
-22494b4ce45de3739f3ed286e421febeaf9e125168babd9b705b51ea733e31f1
-ce295f4d144d86a26bc8aabcd042a4953ac9d61b90e2d4feabab18648ba16ea3
-ae99f53b971f48ce1985c0a02703f1c609b7cc77d551fca1a6dbae9ad7d2dc7b
-a61a5e6f8b729bd7623d9c73d33fe9ae249a3b776634e10dd49222cbc4705af6
-4e262a75bf5e60b249acf6d40358f5ead7fc3096342ea25de703909be907e364
-0a1315a1589df358b7eadf394d4b355571809b1e860d96f4d1386b9d8276b85d
-6ff051e2883e2fb05c809d189e66bce5465fbe830282a23f1bdf0fe3bbf77780
-8b2c93fe7b69d6156f6ec93cae83bbe9c54638bba8d6df08da9bafcb3d080d3c
-775c0347a472a23da6a22ca855ace9385893fa7d851cace8768fda1b2716e6cb
-fe875530ed94c49e8c67922ee003911c08f2165d97d8a18f62d040e64b35b544
-d740bd40d8715005dd5469d106a4bd8040fa53cef750287560433965c6656508
-9cdc19875262c227b8ca384cd97047d279224e13bc8cb280f18e163d1aceaadf
-d4986a6db5a6bdad04d188a927b6b7a8c21bd67bdd4210eca16dfdef107c8228
-0d722d8a3bb5102c0dceba5e75a5d8834e8f253bc5b9938d5099873e1848b0d2
-76040a020d677b2b5b4f7e029df54650b0d1408bb81824f003232c5e8fa4cc52
-8da2f15b4cfa2fd8770e0ef75a7a82d92fe20af3d5132d00c136a8740d88b7bd
-5004d69fc459d373672b2b72f3ca1fbe58a3c2dbe5708b57bb3c2489f28a9e3a
-81d61c0a661b8b039b1b7677438906399a6b8fabedf9b25dc024a038574d7719
-cc4686a43725c624d07a0760aac63f477123f7f4af8caf41874046fb963eaf4d
-eb027b0651dfe68f224a5631eec6342258f71bae4053cb491c6c37bd9c4c0915
-2a643ca05150b84e2342205415be8556ce7b2f22ebceea680873da60f1a1efe6
-97e3e9e43c1756a243d3a9757f1219ae739579d393d46d747bf36bbea11dc549
-df94f5b12386c770d6927ca29b80eb728d68b7c20438ba3932429e5e7cb190e0
-3213cfe74fe392ba93dedd3b1779fc44c85d9ad678d92bc25827807b607aacc2
-414b2d0d59147ab8e0be0d32f76b95b27fddb2ff275c870a5c441612faa47330
-5ff3ea6caa6cfd284c2349ac9e5d185beb1eedbbe07b8c2a3ad4766142c02434
-042568172b0d3781bfe703b149eaa84fd09e8d488b99aa38eb577f7b21c740e4
-6088dbc4e17d9333a3e387531f97b4ca1ea179952eb33878bcaa465333e1de7c
-83616e413ee6e4c5bcc1fde1987a0cc78d279468b9b1511081f6e3bc802e8d6d
-78b19dc59990579eddcfaad310e0f360632da25ed5f6f16d560ae7d0175e7b2b
-01c3dbd8c98f55f494bfc52b49f3227ce12dc4f458de34b2ad36b3b00168ac80
-85e35caa9ffb7ff60098e5027e32be43790a0dbdeeb8223b692aedb3d6c6130b
-b6089c764fa7897b9a36207c9fbf50ac0c481a37096a57da8beadd05bd16deeb
-d93fd56fe54a6097c61c1d647f2f52553609c3f936831f4f981862526139cb29
-48a02146d1815d3d078bc3dbd7c32f2167a70edc28b30025ef761cd43bcecf7a
-a8ea6619cecdeb83147467c3970c772db2989301cc8337350be1f55c8566d14d
-8d963234133bc7ad37397be014950d325d2b67d70232a50fc6a4a064dab0a970
-e7d4e1949f7a0e50ea970934a621330fd477107843bcc7713dd08075127c19d1
-5497f2a13f917c3b7a8917a5e7be2009dba70ea513b405b8926631562a0a8ffb
-4bee56250fd7c147f5b515a8f1032564b6baf2569e913e7660098d72eaf586a0
-078af231d4595d67cc0c73faaf4463fe6ca8f94a8aa8f9132106da58d45bbfb8
-3e574f76201cd5ef05d47daa02001a89452b5a8bcef2cdb714b0bf5c36c76557
-7e2eb7aa71d085de5a4f5fefd4b22e25854c21a8e9e8460a2686da7f4dd2926d
-3533f3fd3ef0d7cf276fabccf0c1dd01eaf32d788aa6e01d810713bf2d236a83
-4c67f4c69fa9281451c98307d7e69afafe851f8502421c4276061bd6c3790029
-5f72f1ac5d78564cc221302cd97889400b3238c65a2cb820bf23006208c65d23
-9b428ba1a5f9696665bfdf9057d645615993d7f572c6646d710482b9ed62f0cd
-4dd6515b31ddc3a154beac3d89c81c8628daf456ac62abbe9de7a5b6062cf650
-4060c23ae920cc4967798b6eefbc752e3baf2492d8327d295f710814eb11b167
-629c496c555117f76309ea311c03ed7fc7f248f7d1492587d0cd5c5ae5e037a9
-57e68d48f4b8128c31dd014ad5230ea69ce33ba6c0c4e6aa1e1a7b3eb2245445
-979a59d7796a059f54c3a1332e06906cd565d21c0acef799d9d8aadfa6f5aa2a
-309b296c1bd84c1fe08bae310f5f22e60c9ec7096490bbee14ca80cafee768f5
-7ca0d7a51894b2d52ffe875b3762d20f0a1500adda6a401dfc1adace27677890
-ec2794c07529ee08ff575ebcce496c16e6b36f9a9beb924f95c4566ac092be59
-1694ca2a76062112ac62b1360cccda1c5020fcb4f400de7e87b26391d4177341
-c91c4633b878ff121715bdf6eaef905841cb096f66547d03aea8d8c66dc7b603
-9b354bf14f3bdb74184393f00dd5840e23b08653d045f18155098fcaefaaf8b6
-2c548f4a756994f8427598ac8f68d7304ee37107738c74c0b1c911396c7de26a
-3f33dc50809c971c394d2846208999bdb9bbe252ce67cd7df343a4f0e108623a
-837a18e3f19a9689b823ede76f782b46d3635d60e4fb66d7a672b973d3d14262
-dc6e05092fc79544b2d82b03a089e8314c4ad8a64498f1bc699f58983c1c5087
-98aa563860b833bcc7c490b0eb852d2ec7ee9d9a02c91ae1e94a4f5a94688492
-05bc1df3e49c6368463303c81ebd9ec0742a8374ddbc39da1ba8e51d1e074e05
-1b3311fab5daab09de62bc9580ba9dd337f8c72fe557ae91caf5bb3c1932b544
-04eb6a55d79892f70331e72acb7093b38e7327c336fb6b4a6e6cfaf17ea978f0
-04b58b0c8a04b0c8806741abd1684835fd5a1a7c0345d5a2387f22ddd0b93269
-8559f7a4b1170e98ca957fc9c903cffd18fe9b92b4b32c508e53efb68883e042
-7f8b646afc1d1c597942e79111d571be9cec5221383f5f6b03193e0c8eeedd50
-261b9f57e594b795c3c7f493296e9a8ba1f4506f868b8502649d7784503fd253
-c5e99f3041f2b4cd9db715728f1e692ae507e234e0e8a3a8f6c732413b90176d
-48e910abc918ccfd30a33c872f9efe34a8944f692f5f770c027da9bad3f65866
-2abeeb55a57dc13c71bfb71cef2886453b43d9961172723556639642ae281980
-50fb7ee850651738a68be6420eefae78d1a20817ed96dff413656bb4a968a70c
-b9fdd1e9bdb2c0e1dd5d32ea1b50cc487de1f55407eadbf2b3fb9c03b64c15c9
-5aeb67cbb5ecba0889ea4708141e82d2ace7a841896c77ab00dfdbccfafa1f64
-61abe7803872d15961c1c31a6b1ad50f120d555471579bf02399f815988958ff
-97d0132e6429769ecfe39b270a07ffd1469246229cbc1450251e71b1beb00886
-35399527233576ead74ef01d7bd7bad02d951e93b2e71dd1a82c523abba753e0
-95af0c249ad1f5d59f5c95da00d4eafeede3a093e4cb6e108469c6cc80fdb8b4
-5116c29b0a9a02a48f6f77115649b583ba4474900f69e9472ff178e41a33842e
-78b476a924c14814191a61620e398ee3b48ebaff1b3635edb48ad16d497b3362
-ca9fe38284e1261344b34dfa8d46e43324b3d3b21f31146ef95c2c7c08029e20
-776474fa622d5f145ee66aef74e4d42b40e981fd5ca36c6697c2655b2183c655
-9901a8f632beaee841515da5956eb82b341d4683c37050ce998df19480662d7e
-2d09b430b0d79441295b2d599bcb59a3ccbbf3333745e509903400c74b30dfc7
-7da9616b21b268b07f65a4a32d878feca9852a78d43e341e893238a2b2c0cf1e
-3dfd75592bb9f15c4e8653dd6e8aee0b772961a9e54696a266506ae7146947f0
-ea378bd1ed22b391795bbe5737994bf9756ca3019f42a032435f9429eedf2d41
-5ff27dfa5aac62a418667843ad3995684018c1b1de4ea68848e3762818e5b80e
-0d5bbd9dd866753537ed7ba8ec145d49df30fc8d293d69e3083209754a4b425b
-99e39da47bf27152049231f60dc3a849ad6a21b86771e945877cb2ecf7451261
-b5943f02252618cc734cd0ddcdb312ab729f35826c89fa9420fb1ad70647a74b
-70474ddd8ae200fca9317e1c50f9cb68de8379399bfa7424e66311c9d7574746
-e19d44413a0c6149f28a340062946288f9f78b1c2b6f5233885e6a19cacb78f2
-31534202b24aa659211adc6420b95b17b20226e74e9ebe01948582b8ea2d3ab1
-78d5b4ed4c778041fc17d11157d5262c90571ff706099c5b06130412490833b9
-c5267a7163ff7e1d45c89050d6497d097826f5b26be150ddf1ee486d232e687e
-453116f0b6b7c93064207213540cbbd88d549b74dbea59176bb6d7f7712dd598
-5256a9273aa32d1701a6b2faa0da6d21356be95968dfc03221b0ac65b2b22287
-90c3cb64ab2a65909824dbee9b5399b0c651bf5efd603621b94feae2fde41963
-c266e40755ca4266496ece2fe93c4397d907cf8d413a230701e7045cb9da1d17
-f1a00e00ea64b45dbca755a454a9fb232a8b4b80d6032650231b9fde78ad9664
-71232d9076520306940852e529fc46d83fee4d6fea15056cf42fafba1e8482db
-6870f41187c0906484e8996738b52a946aa34dae017d19faa08c86845a85a543
-20dad4f4002f6625b84a1b4b80467d102c678823b676df24c9ca802d568ccccd
-615858fe6517ae56d631eba96da6b71e0e0e7b71ad9a9483c61574e23c47bfc9
-a0394b4bd85fe41c3a8bb60ee8c6f788017ea90ede0a70cf82f14056b24a6c3f
-58849d613f08ec3ee21d990dc4fe661dcf4b3afc8ed34ec2ddd279cfc2cee1b7
-f1929ecb72d10752ea012342923450110ec1868292babcf755d0b393768de27f
-702fb68daf1154e8855a89bc32bc378580ad405a05cd12b35826a9d88a3cfb65
-987f364b89c30340a2b1e25ca29cec4988afd940c1321d12cbd50eb411a29a65
-657b2e7fe642bd8c90cce146b9d216b7f87aa135ffb9ccf0fc8da1146bb6f03c
-1cea3f7d532fb572bae2db81b7f15c14de973f6bacaadde5cd0333e71a9a539a
-8356038f876ece85f7e6b2d057ee8d48626483ba054f8a662991cd52fc317738
-2d029b04dc44da269de8be9b025f7929a34ccb6efeef271232894ba8c837698a
-fe6cefeb4c1ca0180215c2adb029986953af902ba21c7531850ca7ef798ce22b
-3496988dd07347e36f26cd55db9caaa73c5ac260256432c9e0f6e3bdcebd81a6
-59e822ba4188ef395f10c448c4c09270daa19a856c34f5cf0f91a74ea962b4a9
-5459408633966d6730b85c54e2de6ae317409287414079072d9422ff38db6c93
-d37994e7ef1a0e65c88019e729528b51ad23bffad9ec9954de8678f03a307c43
-0c498a7c16b3b348947e25a896bdab2168bf3119b296a327c2378904045e322b
-9cb321d23d74f470fafc828404612288252f1701df6c743de571e2e876cc2672
-23f2aff00d26f1155d6d41a3b08322cf8eab002fe47f5265bfb67a405d4ed77e
-89cbb4a61b54e796b8f3cdf388d5418b96615c1312ab7d4e7deb1aba8984e3a6
-76dccad1bb953569931f8c26f7af460c5689412648cdb7803f1c93dd452a8ec1
-6c8e3e6190d558919b855b7b5db34bc42b992ea155615cab202009a96fe13363
-4f649e77e4268cf651a74b8c8c645aae6dff800ad17b194c0b883867151c6230
-dddfaf596c2639a46e6746fc3ccd1593d432063ba27bf2476bb3ee610fd7d92c
-c09b70c657a8255cbe2d8ac281892280d5f19fc27b5f0e912eed9c38007e748b
-079ce05131c3956dd078c0846963268fb4dfb5eda5ee8894a89920088f721d1e
-b725870aa43e92c565d10d5d796cc04a114b5c32e90c9c7f5a9b5d03d894f96b
-9ef0b123b9f90d1692be30515757e54c2f9e073c16c04587363c1e9bd4f834df
-4134a10fffc0b5960a83c4f75979a14bbbbd52d4d4b5eb75901fd20a36613826
-0d39c035f3144381fb6d4eaa99953736614d1a46fc05f800ee66ca63b1c6ef10
-673e4faec2288afbf5cae62b7f6ab8c80e96c8cbc7b666ebe78e68d184d85c4c
-d8b92adb253aef17ada1dcb3eb1895047b93163050a6f3c1a69a7935a12244ba
-cc164a780f44dba4c432f913f5b649529721b123f4d6816ac8f1029bba12f442
-935e1b03a434297d33e03357e0a4a56a10f0fc2c16dcd060cf858b58f3cdb5b3
-4f571ca4ef8a7a22bf7b54c35b38aeaa6548be8a70027994834ba2d55b4893a3
-c70d9d44cdf6cb9d1d6b92af027a0fa802f207d34c10f8c4aa3a2cb64f8817b5
-78408cd8f98466905ec58a8df6cf060d6ba17235dc6591e2ebf061f5a7f1bf9a
-7690df303dffc583b98e8765977c887e776814899b45feb0f0cac642912d4b81
-e51c5ae48c0cdf9024cb96f421d1b7ae45b5ce9d41d9d35c2b00416c8b9c032f
-b27680c1f8c1e55d9973a698180a786b92fe97c1b0a9017e37b51cab3f388b2f
-42329ec38e452fceaef2152d36471573caa830a5c80eb0ea73c1c7161f7b21b4
-cb7d3e55f29e36dfaa09c8b3592fd8afbb64adde44d8665143ebf1f3afa1a5eb
-a16860b8e8f52eda1a6793be62ee8a682a1dd30b6482a3188b5e6b8dcad4c688
-98e39892691434d85c42922a035c752827474e01cfa507d0c434f746993ed746
-3d32f530ea324bbe0ff4a38581296788fa2dde0db5dec9666d8af2deb947f200
-b617a83e84114e684442fe3360e0a66880f3a87f1030dead88eba805cdceb8fa
-4b110dcd71f720d93de7c0e8122a09081b9cd1152dbba5f0411728ed87028a21
-9cc36c72bccd73e3cd517b9a7210cf1f3c719e7e23511b0f0c272de69951e0cc
-c264387948b95b3fd7d7d849947117e1f14bec10d2d718374eb09734709ca60e
-c7037c7c3c5d1b9797b9e4c539733fb69fe61cc569f76b269780fe9abd497f54
-4d728bea738a4ec3e17aae0ffc36c2bce74cd24bb8a2758b9c8554d92a64413b
-ad5f35aafdb387b28f1ca329a32d8d99db75121207109e6fba304fc86e027bab
-b631f93526be28022f06af5126cf0a69c7de8aec8043aff5a47f6397097b8dd8
-8538bb33987fbdd064558e7634612b8b2c22390f35b8096fb0674fd62084d7fd
-15d98b22fab5dd19f9d222a2c4d2573badb76db8383c74b4996cb068ad4856b3
-a01a8f42bda0501aa7c317c275e050a133df090b6274f9beb1af87f8b48f7b03
-64bb4e937369972839448dc459dbb463e8df91e0fc7fb909f5a423ea9aeb2f23
-0d24b27dbe955c4b6c3a9d22603b42c6c5ebcfd67c74f915a47ed1b762e10738
-b7f181feb8e6a3b2b764336966c6acff5a2e2fe237a4dcd64b7dc7b7dd33669d
-8dea06bc3c1ad351e2305335036b8f109fece9e30cde9ae2f472907780dc1667
-e34cc399da1ae24fb728529cf610c6592df901ec9a7a1d0c52ef3840a99861da
-b28412b3751b07206391aa61c33ca87d4164876b92bd6d27de24d6abe4af0119
-aed63c73e43a696bebc21252a6c39d5ecdf45042d230a583e177b1e41167ff25
-1e633941dd1808f8a4436e663197fd2442e085c596d3fc12b654f94f05453599
-e7957e70a965c87132bdebab6eb857a450c23d36538da886be9785a15ed6a2d1
-64dcce81504e271f58101d36257f8cb1d146c5dca3d00963d245634ab074b95d
-d490b8a999b83ad4e4fba3573858fda34ef4735ece350868c4ab772298e22b6e
-d78e9faa6af70f400df8c6777d27a205fc1b40b26e9ebd72e37a18948d447dd6
-021aefcbc2ab7939928daa51eb03d66172d0d4df7e01b032de40c3ff156e46be
-28fad368241ae811d6914a3cc4ecb640531adc026496999ffa429093a40615db
-81b63de704aeb0ae6363559a0b70d55940bfa22415edb9239b27bc5ef0e4fdf6
-3a91764ca5dbc491df84e07875da4814bcae9b715d3e4dccc55cd83fcfd63696
-c30648600c986bdf4b1f00c1334b1403670a56d0cc8bae15187e1f4dc8082eb6
-7d85d9413fa5bd3215c6af814cdb8c1b7dc579c6f8f2bb11836a5760021c0fe5
-e715080339b24aa017ce4aae8bafa417f889c5d27a285004429383bf4cb8f65a
-6bb72bcb975d903020bc27752c7e40a2d00ea67609a04b125da0ae443cba553e
-d3d7bed8408f3cf9d22176f96382fe832a85fcdc995663c777ba80b9750000a7
-921d3fb174ffc454547a90a74289c2a5b49029b3e7798f5587e9c646ac23f2b9
-254b151cfbab3472eff67ded7ce08db90c0a9a858b3d58e7b185212a0c45c1d2
-ba5d5527e23860ff4a9c985f74efa6c70a749206addbd93278965d3b6ade68ca
-8e2e9ad4974a836fb78836fb95e4fb7dd7d6c2b5423334aed2644b09259367ab
-8a06c57a99803b547e3becb7ccdbba446a7061d624a8ed0ab1f86740351ffa61
-2f55ad009fe1486418119f3b9932014cc92ed1f13ec433c62c3a004f9fa207a8
-da0dc1d5adc59d2268866b143868feabd83a7a27aa68c1d2d31b5a3c5b2dc1b5
-6f65f46b5a3e33c9d2202d901c9eb2b100667903493999f0a23bff58c6dafedb
-7f2914f65e1654579b4a7df69ee950a223b679161f4455cde3d275edb6e8977b
-5067a80d040e349655f4a3a60adffa2a9e56a4c0a3b1d4475c29dbcb177b18bc
-2c755214570988ebdcce1d8f54c59fca0b0e19116e6a2bf951ee7d00b3feca8c
-bbfe7c9914ff0eca51ac6273ce6e8f5915eae72bb2e3b8c67635da114e783e91
-57f1ea86d828fc1aa506e0fd7843bb036aea75714c5638793076f0b87de3f6d8
-8527a8b3adfb5171c076ad8fc47b68f186af94a0de3b7badfa167cf09c7909dc
-d9649484238f6be5c2cea6b58f37e55e6aa1e331d2bfd64e5103841ebd324f3a
-f9b9d7ff7dd9934a1eca605ba4a38c926c654d0c9ed2ef59506fd93f25ee09f9
-ef6383481ff4f29d33098d0b1c3675a256d924c8a344590fde46880cf9c12128
-dbe09c32735b56de14dbab2957fae3ba143a07de4b48c25b399b0e77d537da00
-f0fe4d154f1e9a09b9c4bb74f62ae698fbfe43bd06f038089e8b1876eb07e249
-533f9aca9fe1eba0d89e0bc4a0f98488462a11f95f6d77ee6ff20508293d8e71
-cc81d9bc80450c2c6e6a0fd46b8a24aa263acd703217ff2e19e7c61d7d1200aa
-b8c6234e397ae8f474f7afd9dabb65cb6de25212987a8530dd5ee78aeea4226b
-56fbc58fc736c7fe3eaa7a842907cb4f4589814479ad2a09bd1e3bb0bf575d15
-f0aa886a56e30b5991f7064d4b298c4eeb2c6a33a7307014315e3dae2ff72581
-283e0a607a7d8c62766a23f42c8722590a784b34f5e97b9707bd45fbe3b08630
-1df111d0aba815c03369f7caf6aa950498bcd6bd02736bf70970525b70c023eb
-11ef2901a01abc672153ddeb66264d59a7eca681c602e1b4a362bd4fe09ec788
-2e739d4c3aa9ac9446b2cb7da376c4617cdf9fe436aab026d2e23c755be7ba9c
-fb61013c90dd986c2f90ab7444661c16ac4db3a8402b03450173aba644a61e98
-99d1cafa06a27e428ecd6307ae89b1747de0609ba95f4d882986a904f1c1f3bb
-da550327d637a29fb1b4b23f5e08772889d27bf3cb461144d0f01db6699b2cc4
-8c2a7cb91090432d70fa673b7ade79f862e9b79a94f06405c44c2b0de8f233b4
-8080e440921cfabc9133916a0419613528f04b00275b140d691f4057c5420d49
-a1e53fde0e926a60613d1168d886ba0e2d5de629e212cb9b8b4e2253a7c7b531
-8287a0fa5438528bd414e679d20b92d0ae2ed58d2c6874354ece38b933a1da35
-508e5c4e63e62437a77a443a2a9ad7044d63f36c23b5f3a2ab443c717219e02f
-dcb6a4286f765477eaae1a18bb63c3375fcd109a953a644e168f2ac0e1d85f91
-3d62b34dc51e3a134aa30bfccfd6178cbe7dfde088a435ecd7b310f5f10a5b8d
-9387ad196d7e1b37047670c8ef0397cd1f380415de77419a20ea5349ce908027
-a8f8d1498f5bffa712690e4ccca077a452c902fc4a9b7c7882ad7b9db0d626c6
-7def29713c25d7ca466958350d56aeb8dcd0987ac05fce2205081d301cd3e601
-f386f99eef9857fabc6bf49a32ec3d4a921ed57063e5366cfe51adbcc48b3fc1
-ea1e40205c7fccec4fbe6dc0bcc7af55984f6e49a8a466e144b7e1bbf63506c5
-f60caa2320f9ec1732e9767ff4c9effc5b2f9ba6a9dad549dd30771c53f9a4dd
-24adfd39cc5be74851d51b4fb038b22fb65eca6cecf6c7e902e9391c89b1587c
-509bf28a987cb1c8ad74ebe7557792a9ddad7dbdb1a367c633a8eacb91e3131f
-02000b5d06213700a011011cc1cfc3abe1bac54878cf32145d9b18eea7b59b9e
-19f551170b92472f8922c0838f5d7ab5421d59a325c05372fe2c4c37184361a3
-71572d378c3d0de308e2c1cf3dd7f2c3dfe703de9df84e569dbe2e8cf00c54f5
-15db602bb2d44d1f99cf2aaaf78953b4e838fc1532e2ef4de4f0268b2e6e2c2b
-cdd46138aac78f9f34d6911ae387008d594291c7a57d693386170e7e6d377cf8
-11966b59bfa3cf47fae49324348a91f80399e29991d659b32e0fb0af79763ad0
-93630b21d061cd935351fad564039a2fac55b025a04e9668771118e86f9216bc
-55c4cc8ac588333bbc1b8fbf6b76a08bc14e1f83a683aefed0e20c7bacd2ee51
-96d723daf15279d8e2ebb993847b43d63e4960ad2f4150b07fd081517de48a9f
-6f4ab09802181a2e4e44cb0204200fc112fd99ee2e09cbaa3c6d3cbf97f95bdc
-a4f6d06ad415ebe00d6a78c3ac0ce6cd4dbc06d2829749b7e410e6fbd6f8390a
-b958ce73414a8766576c3b642916778c22cfcaa498afd93aaa19cd506e231a81
-f9994006f5e948a2b20912d70132e6a0382666f35fcf21b6edd947d1e497f66e
-da9cb07d716cabfdb6535e5ebffff6196b495327fa4e5c60778f76b40d46d4f2
-769ea09961f24b8110be2c59f426f16928866233066135ff9e1f15379ed5b11e
-de442dae3895e438ac05889c683687242a4758f1a234ef144510bbcc89e20954
-93272fa2dd7373c6b7cf9170287f4dbe3022b20bfc08e27c3232514c813e93b1
-cb37193b2eb17a832c1833ece9666aa24c12424d6c157d4f279e1950d45b4940
-2c54e2bee3f3eb017af95881e32f009764f5e67b93eeb2172023b510a874a159
-4975ed54f35268d3df9c2cfb65c6316b8178d1945abae3c5566b9da3c8681b4d
-acee486d5084d66e88620af120a44b5e35ab55591ea5283b4a69a31a9f5b212f
-96456ccee559dd42c58b6da34dc181a0ec0a5be41a9b3e0958f399d083fba072
-686a38da9b05355fd47c3f59708c7b7d4c31de833a87a4d8da6abb4b9d2ef519
-7575de9dc5b012e2e3aa51c407afe407001a0714d7ef1184b33afe085754edeb
-3ae4472f53011049af4ce4e0ef299720cf8c10911dc0bcb0f9f81a8caec00855
-91b750dcae4e3b0e0f507c25c1ca59cc38e366f27ea5f13427f2bf6809fcff29
-5d513e03c98272a0a822592dc9682a49d9324dc1c07f5b8b933ea9232ada0108
-27eba8837797d8782f46dadf53cb7404cb6612e71820478bf37f88615ada4989
-00f10078a2385cb83c8e41aa5464148bd90f7f2a18fd0b3f41a78b10471bc33e
-0b2815ed757515a331a6dbf861844ffcbf6b37ef7f348d7d918fefa2248d82d5
-56580cbbc3ff9c079d04b9ab4fccf1682c0b66358cff6840a9808d91374319b3
-09fb2f795569eab9c00e850a50afeb42248a251473156bf4d220f220e8acd814
-2554128f83693005694e19707d0630ddf56bb55f47f21f87c37286015677685d
-d6763e4a3e28de9d9f7292f659ac307ef3e83d84529389f7eb0639c02239861b
-86df711f11038176d9a70b04aad94f14285bd7ba4b264696c383bdb6cde76ea2
-c3870ada2dbd7fa7c70e3fbf92ee9baebf07e97da553aec0c90ea3feb38ff428
-7625706fd41f54aa6d85124920c33c48228cdfb0e426eefbc3732e12813bd368
-01698802e58db4eed2aa7fda4c1e439ce2012457c55115d69eedb9f587e46b5d
-35abf7e7372203b01ffecff24226de4e428217c5313a2e8bb58efd0f465cc612
-c143ccae5d8b6dfe04583b1168259f15c363bd4a7db272642b0816c7e0e5ba0c
-b2bb4690aed8e0455b878e139c15ffa403828e30c079b3c3a26278050ba66ba6
-fce91bad29dc2d980c06678131d961e47363f11856b72f5ca039fc991ba248fc
-f838d935789da19681db4d9119cf55bd29847d2536ef4f69327163c3e262cf63
-695d42a83ab0553b4c72c5eebb9e71c358c5fdbc209ada006f885f262e3d077f
-b9966e8f53ce61e144d5a2d096a2ba15af75790609218bcbf7097a0342e1dacd
-4eecf33fe3c4c7dff8b4c1f501007957f8aaba2e7176a707064c266cb723ba18
-6139e0bd697b37528fbd3a4bc8be5f7c6a50aa6fc65a0a52fd310140e750176c
-698a919512867a1ae998b32043c0e11106f81154aad48fa3f6acc98bb2b38493
-863b2ab05aa77dc16e5b01b328d10dd7af79ec3a5fd38eb7712e9624cfa2a620
-74988bbd4014a7816a4826319490594c0abba1643e85e961870e7125de720ed9
-db31febdcb739b3f8f0a5a2803819f9f7f3fb3ac983e3b6743c7cb3feeebe578
-0b0456f15047a76ade4d764e56093b19ae91d52cd93ca61bab22095711e2dd56
-cdb2db4cb0a1120dba8939720c84f2faadbda3b0cab8ffd83bd77580e0dd59da
-67cebf38ac126e54f6b70b55e7940c6b44d459757958c13f1c6f248eefb5af86
-48d752e91788945fda3da668a887f657de389b123260e3ef4f1b93393c1f484f
-7268e84e78585c0a3695ce84bf217637f8326c98407c1060a00ef8950e498d0b
-79ce31264ab755493d4ec00babe341e431d34c8b7228d0c5297bb776992586c5
-ae9ceaed8020f3ed8c0ff4bb963b9c488f8ca6c667c851861e8410973373fbf7
-56b0355b1a0dea5adf037ccf59bd1d4957c116187c99c558d5827d609dd27cd3
-b2fcede2d281ad3c33c5f9d55cce22bb1b8e9b14d9b6dc140620733a10389574
-eed9fa2caffd5591b8091c8533cc29d600b4a75b738f8dd2951983f06da5cb54
-26c1b1039bdb3550ec6cba9be971034a125f58e74152bf38e59b6365e7c6be2a
-8d5decd0397e0edeb638238e8320f0425c5ba6f18ed9bb32693dfe1b079ffaa0
-3bef302dad880b1b4625865d2e8794793e1e63fdd5b0acc91d1f83d12238427b
-47dc31e3b218ddef4813ba2e15d872b0e6b640905e261405d148de380b062b9b
-a73f115b4f5ef94d4023bbad60fe61939b5c6cfcfacbd85110cc027a194d92b6
-f64b2b2bd0c5648e744da3048486e5d9b77b45f0360aed982351fadce42a42fe
-f2151ec97e2e546940a7d9154cef3b2b8dc94aa1076369d9b1fc54e22d65b6c3
-bdbbc16f315b52e31933acb14929e23f0a1806d7bef12578a6
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/UTB_____.pfa b/lib/fonts/UTB_____.pfa
deleted file mode 100644
index 36ef339558..0000000000
--- a/lib/fonts/UTB_____.pfa
+++ /dev/null
@@ -1,1134 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-Bold 001.001
-%%CreationDate: Wed Oct 2 18:24:56 1991
-%%VMusage: 33079 39971
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Bold) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-Bold def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36543 def
-/FontBBox{-155 -250 1249 916}readonly def
-currentdict end
-currentfile eexec
-f9cd86fd4821715265f16a614e3770ef80561e77ba6ecbb4ef4232445eef2839
-94e93e3c8c9b09c09d71542241821e07888ceb54e8cacc8a45802f50c0afeeca
-5e3d9114c1860bcb2ba5fd2a879a0d79953e30c90d8347513f4ca5f05b2e231b
-4973bd1e9db66a39d846a8b3d9e48da72e2de8743ba2e104893167c235719245
-87b43ed3b6552cd85e4bbdeb9f46bd813298d531c74be81995a52ceaad4112c7
-f65773b088bffbc9874f615371c5e7b50ae99d5b6acf9c80d87057bf3a424377
-f4284b7232096b6ea623dacd1c925ce09cfa6515f675aacf815c38e984b4ba40
-0d409bb62cd4ebac75201c8e782e68fd73e8622c46b696b1ba37ca9621400041
-d95b948a6bbc089fe6b230b39bd358228af9b3e68418166a9adc4e7665341088
-c47c074aa4b21b0949fef9929e1a32ffddd2d02145cdb256863cf6067d27ed9a
-f0aba85b1e0cfcbab7e74880e9693b5626ad31e6b5c2d208087d86c116513212
-710c9d6ca50e1503f8d4c2863fa378f8184189af0cf109f4affe7cb74563d513
-2104fb9dc6f3f5992e075633a0baebda8ebe9a07c3ec4b25fef015d9915a26b1
-d401a6722015090672714181580350560caf79bccd6040c0c1651d917c73107c
-2d46aad5d4a370b55e896ce1eed127b6f0aabaf7c4ca62e89003032abb2c95ba
-58c4a0eb0bb1a59a439a6a0c2082e50725b9e8139324af06ff03b4269a697342
-8fab0c1fabd320f1452d9c435e48037eb8cf6df4233cd9c05691604146cc813f
-7ea131f21e9863b7bd1b087a583af14675b9bd31fd364d5dbddbc9b533a6ac38
-c4bdeb28a1ae3d2b374da72405acf67b1b3a83d80726301b3677c067c748d857
-ae1da4f723d4365647de10f90e96dd7e9ab9ef5c7e6866a13b807fd3f78136d5
-72950a10bb0165e61f12c60a813c7e35eeb9a0500725dd912ca2deebb238538e
-790af851b14643f40e5eea13660e57b5c407735079a292a7c162dd11d0a3d342
-67290f1c9261fa5de6b92ca1e7daeb7cb970c766b3e0396ec0ce55dffbef0bdc
-b437fbb4d63634b9abcf5844e76f9313ab2182e1fb3c47a705a1d97b79e93dbc
-5e48ac19b45f9be4b9225e5a7e1d3679dd21001eca3c08d6febd35fa5453290e
-1269c1d195e45338c10aa60fb8ab9e5a5aaf08c82e737f082bb6216d7cc1d5d8
-8906c8b05c4432d04561377438447eb5fade652af84c1ced99551365cf9e6f99
-03d1593de0e450003fb0d5b5588330d6527fdd0c8193fc0cd2293012310a425e
-0ea0f8b901b991648ebbc894cfb7d95da6d35fb7c947e887bd3b6599e673b921
-c96f2a033e30b341a14066076ff0abd5fe77f393b548a15ea2185f99a3545b01
-dada854fce1ddd3448a9aa42ba260a4f85a0d1bdcf08b3de2ff8b6411adff446
-4a2929193ade35f4e26006cfdc45929250bb76ef007043d739d798a4973f350f
-52fa1690423381539e3a4cc458600fed91fa8e16b5ae0aca710dbf318d16e3d9
-16a082a093b59f35ff92a1b235d5621e87ab471310ca26a07a9ecdd3cbdc9bdc
-7506ff13b886b26eda6d4ccc52a312593a0f2845a4a30aef829109e6b76bfcbd
-2f2fe267d9376acc0686c9b1df3a25fc41d9e5390a90249cc26c502e4bcf582e
-ca5054d96b6ebb2bec79ae23125b4c2a13a97570153b83dfcc4d9dec9717679a
-ba8c37c02697d8f47269b9ddb983bd4dc029968d0d1729bcb9f94c899906af40
-0df490eaad13acd5a893663fc90a850533263cf6657632e8e4df31e6e6636521
-78dac783feb9616172d7651e3e4092b409383ccfcf8aa04b330119c334d6c8ab
-bdf97d97fb475c25331044413a117dee0f15d6560cac5ca6c01c1c98b56d2971
-724c135de3c624fb7a1994a8267ead0628af72d5af1dc0ae3177c3b678dc15cf
-9dcf100dd9de9bb71f568661293515002220681b0afd9775464be2f66df08c5c
-7d3995a57ffd2af299564dd57614e3273d8555f705ce2a2cb095cd662acb8163
-dc5c587747e27fbfab667dd449228e7b2f40cea584c997d2b98e78a063edd327
-9e23947ba2577035ff349019293b13953ceea11b49b230e2a29d295b032ebbe1
-dacf823e3587184182d0b910794a1d784f0bdc21c74a65d12b5875cdf0c1cddd
-5995a6e56c9a95dfff55167f82b3de41a2eb653b0d1eb61e9c48654424ce13ec
-8671211b2b8a78839a4569b3cefae520e91c538f09d96f98ebbe905b01ddb080
-f7f6ff00d2f662e02bbe7dc3044b66723956559669000810f706f4ad544b9a29
-b384f554816696eb7b59540b407d438efb6c8bfdcf05324cdb65e9ffb8864a9a
-05adaa3678a341983aac1f6bed28040df2f0e18d27300cab0930958704d900fc
-5e194b149740b089814d1050e11a9d885bb1d835a7cc092ada9f08858e1ac5b1
-84b6fdfdea41d4b1241ae64fa3c47f125f48cc05c5dd8e2c896bb88b0a846379
-4477252f0d7abd31d4bd5703b9f280b09a59bfaec0663dcb2ccce2821e0e382f
-837f4a4fdf0e57d531383155f4fd633bc4b7315e54425a0395bd91f050783685
-eb0b85e15e331166795acc5dcb2ea1239209f8296c2c4cd1eb15b37e3ddfd2ba
-33a25c3761da66c0c08635101534607ca02990447c210689d31e49376d152161
-7696160aa2da75f993535e6cfbce229c657578620d7c8de8cf720f21ccc22ed1
-2be5c92bf7e26cb750f707fa7e2348a04a642ff319cda45fb9884caacb562df1
-365992416084a4d40da9831865b02246bda402f4354e8882e98215c37d3eb3c4
-d2f9ba2b93f190005da1bbb506a5d39e2a24be0ddc50e1bc5235d221a151698b
-803f0f0414bc085a395fbada62a73a9a3d4c66415ff1704226f8437e9bc470cc
-63011be0e1f3dbe6e6ad3ff35541961f6dfaae1425b2020349486880fe7fae78
-5a2db27a586f0daddab8ca62887db0a18462a9a3d821f31923c583bb731d7299
-f051b8db5f33fcf53c37c1e4ac7fa0275dd39ab9abc97cedd1c65a3d514d96df
-8b7a49217fe1af15b5c738e927028d1ec523e8e8575f018e7bb3f7e9afc81ff9
-3de7a4969ba59f7093772e5696bc4f2d6616419b43ff26f2a9da0e183f7bd542
-b31f175724d2e8f18a61ccd010d8c18394f640f905b6832fcfe7d3e9c02e3e03
-911dff14d0a1c73129ba85e2179372aff3c028388f30621d1f8aac757660079c
-63c22cfec96ad9ee4846c0854ec912abbf3f934e293e0f1211786455019a7f7f
-38f9e877f4186a9440c75a4babf3a9fbad1c5fc484082e1be4084ca3018b676f
-0e037cfaa4195a18948d8bb46a6d00b68213c09d5e69673ed4e00155fba9d840
-9e08ca2dffafc93110751b59ebc2b6ed4bf5f535ac9d73c9399d9081eb6b2ba0
-a13aabde56a7f9200749c9e866cac735bc6e2f7859cbda912f0c26e85d3f7b25
-3185ec64546cfeb89d3992b12815e70a548299615c6889379218c0e7dd1cffaa
-ff4ccaf3c35c77b09513b5f9b0d501322a862af4f6df0af50b62e4e1c1b3067a
-f5b24a44190c41e96b659f62921dd6075609f7d7db532298a425c675e4537952
-bf06fa9b1295e32068740c361048301f6ba6386602b8cb54bf8f38fd77669f5d
-791a7b1854b7f3effa193e9e5a435694b1c8578ec78426134c9c56e6c9f08951
-2469a5137bb452be5ec3b3d27c3cbf6e6fee0d58d73dd3d277bb0c1540ad102c
-50b746093832be65d05c102ddc982b08c7ec1fba629dbe27d4604c1476d91392
-801f91ff781aeabec88132162e021741f8f31f06db82b29d17fe66ee04e9c200
-5240d68ba82373c7a567ba33bad4aed1d6b5c570d03c5c394c09e5c5eb9e924d
-9e1c2f161a9d52cbafdad75dd674327ec81ce286cf1abfb5ddd8606de9265784
-5c950413caeca8ef80303793826c3ac4b58d9fd4b02fab612fdbf71c2a1698f9
-048769235eb9dd35823536662ccccc128c74818c8ae48edbe9a4624ece9d1ff5
-39795c7b4808520a08d611af58eec60bfc8d272a944201096c45749bc97f32ce
-a52618a1d6d53267ab4fde671ef1a47b03687a59e47a8e277c02a618af09b78c
-f5be89f5da433ea9d31cb8319bbd220099a8d7d2f879abd99b4a96b06ae3f8ab
-4cb89e72fea1355a010405cd72dedc7bd35b3ae32fac3d40642fe88e7a938579
-f4c10f751174cf042331e7274eeeaa28e5829f0e6e866783412a45e8ce8ce127
-5438c3fedf8cfbc9078e2b6dc439d9a513fb2a74a672b496e19af3c092342811
-983b1a3d6c60981db5aaf03b1fcd375f4ad64a10b57d378f52f29cb89dc77814
-1dd5106934bae98eee32b779eddc6cb5fd13d38ee5b39d4513338af4feafcece
-dda1f3d9b6f0b5cae4e7efa14921578cf07ad6e1eb7e0a3bf7d52bb7e2fc9656
-32c5c642a6ab07c108d79699d56727db2da956cb576b97648ade80eab2ae12bb
-2dedab0672ae666115758614c91108c9e4a4da0bd49f15379cf6716a303accbf
-477ae6756d18a0f6e3801f72eaff179849888104e38e69fb722a385a630e06ad
-e71c5553a14c5955f6189e08f8cce45ba8fbb5c5b6b0bac8ca48d11c0656f21a
-9b9286c4f958db61b111ffd40b3c8d69720b6e2eeac5452ba0837fd6806464f1
-0cf5bd73423b9f065b6ff58954a9090a53e31a16fa9703700fba14f8b6666ee7
-4b6a7bec61fdce1fc10245e2e90e31463bb7d326857e389d87834ddffa9ca581
-5a5abc54a958bd3738753e38b255cb1012cadb7278f8e84d9c649a4a659a8385
-19e128ddbd0985505fc613d9c577fc10c429648ad18771b0da1087ef584c2628
-b91d33da27c403c0214e0b7f984a9bfe6c2c574883f446e4dc1a563c32898bff
-ca2433f1161168565e063ecf045408d619f2a3215ee881cbd13a7751b14189bd
-a0cfafee7ce4d9600fdf993ceddd965c4a608129c89b52b5b59419ed079a6f57
-9efc222187cf25f848d47bf3bdca06ec2573fa8fe20624cfeec3f9ead6ded709
-75cae667bf025ad867944faef14fa9d6617b74cee3804d5edb688d9ed4a0c2bf
-1aede05eaca61e297f03026864c738014d8afd79294e062e04e5fce1a784d850
-b00e58fdf6fb5182d6ff08bcd05d2c7860dde223a37ce53131c09cba9c52e9e5
-76cf7e58bb99f045c8b23d67c43449c6c3f6acdb5b5f35be96d17fb0f8d42685
-cc79fbd421fdbed2fbfbdbac976736a6fb34c62eded4a12ad456d94aea2a2bf5
-f1fe4e1519361177998c8272866d26cc0e1af48fcc5a399edb8550046f3e8b31
-baf20c0ba1210fa2487cc2982e3d39e6a630d11813801bfdf4cc3695384410e6
-067d10d37aed54394448427032c9cce4d00f89418f10a45fda8aa392db636c06
-a26c0b39b25f128f7e5ad81a548f643eb1802117172d9be1fccaa3f1a73b7c1f
-1cb21f7f8f71fd8d063ebf41cf2f3eba32392f0303affcb36e113a7e46e5406d
-20e6c47a9be1e8f8085a8c49b04d219e13082d344c91dda69384c0b16d3fd7e5
-e46f213b789603c5d89257d6510ab618f24df56b1ded2029779af220b40eb86b
-cb9ecc32f2b1b713132ba229c3bfa888b014e12ccc1cc902b28bd5a9d5263ac2
-a47b38f37f0c9b279418b1bb81b288d0312667dfeb0aff86b8072c2bbdc79835
-f6a04d34c0825caef54293348bd6c672ba2ace4d7d3fa604faacba1a42dfe02c
-0150abaf33d0a6582071af6b15929a4857cd57048c9e32b04237ba047a2e2837
-a23da6917bf5912e2b1abaab68fa65891788a6c3b30ced2fb907e603a7654c27
-976d2fffbad1538395c05cf876bb3b64198e0a1b94f40d748c03373736018466
-6a9a9e53e0a159ac7a5890bcc18cab7172dedf4b8fdea3544184b0032edee0f4
-6429cd0451949277013d89dc6bbb23566cb158489d168a341271aa99618de261
-9580e6ebc094ebc5d7122fac0cc95021df41feffbf34ed59dee7556ecad36d75
-12b96ace5f81203e47d9e3b9698163a175767762fe2278648d0823b7a41e8730
-16fea5eaf17effef6b2c537b2727de3ab71987b49f9bed16fd8aaa06e5580643
-c2514bda11e7fb68f310bdded37ff6e6fd67b04c83fb8ef288da520954f0c2e4
-ee463de5ce7bcbdfa5403a4de7c64a7d9807dc7fc21678fcbee60d8b2bfa59bb
-c8303d7f060c0a2182f6779a386fd82b9b44550a03d98cfc0095524a7308cf6a
-e0c2c366b8bba56ccc354f3319a888e1483595b28f38868231631d25f50743f5
-07d08da61232da0353fe9fef9bee08c93e66b4cde93369efa538d03dcae19d88
-1fffcbd05c767b97fdf225685d18d7076b2b9b788404b79715b18655bf816f57
-2d96ea5f0d6ec848b399d0629c5775e5edde2a79a3dc6bb189506fcf65ff104b
-389ccf9387a3d6d243e4c83a5d78e9ee659b8e47b54559c80e15e1d9b3fdf838
-565e0ec14404dbfb5da05ebd0c3cc925f2a0be3ba741b9dfdc0531c2d35985ff
-89268541bbc6e4ecc13a50d937cead6b3a9863f85a8c1870838f4abd35494e28
-92248f65c7d3c452f6f743a345087661c3f5e8f09cc6854e7f2d6b5c9461c0f8
-3170337fb694d91478be1ccefe270f28e1c8ce48ffd25ed2dc83c070289405ce
-533af0bd4aa922d8d3b9220edc5b2fe6fadeeb81dfd270ee469b434f44622223
-307e041823e65f762048d028c2b66c306422102c19e3eb113b6f613759b68d15
-9ed5665ab83a1fd1e8d45f0de9c187db9f0f7d145c3bc457b5ac065a0bf447d4
-2f92b61a915f4dc8c03757eaf6cc115c87cf2aba456e01834a0e283347d487b5
-0e9bf1ef39ff7ce6505d1be0e20f425943cbbb4c188a359348d67c0247da0c3e
-3116f9a961e616894a704f192f550ed25503bf14c828ab8bf3211ce02689ba55
-49b2237fb5861f7fd2003d4c82a15ac10f5e1325928aeff9169fcf585334f62c
-571057f3e5d5bf3ebbbac63110353fcb05a533af4199d0abf922653efecb2177
-5fe358df229a5daac3ebede23bb469173a33ada03cb2afbe309195dbcfe08cf5
-472f9979956828289448a9781ff3b8a4a3f375a57ccc6d1ed120ac150b1b4ad0
-5d76760c330d85616e88801050c93c9e44dde990a8d1867ecdcea7700b6ad389
-010a5f0b846c2fbc7e4c4b2daaf0fc6443004d6993fbf3990f78d69350bdec37
-66b9f8d3659fb44cc7917208072d1cdc3618044e0706804aadbfd6e6823e197e
-e8dcbeac8f6ae996260f5d75279b3d1508ba47b61759dbc1dfe41cc229ff0f5a
-a3ff10b0e1ab34e1b29fc95f245b69d61f8ccd5835937b8cf2afda032bd85635
-9448b70d736946734ecacdfc0652cd5fc7653b3fd367c4c5d9c7f7ae1be27671
-8bf62030e55fed95b073eb8b805088eda02d726e2f9416eb02ef7ed5ee19b57f
-f196b0ce036cee614680585d911a289a4953b5288dbadd44e2e6c1e406836a6f
-cab530c36ddfcef4a58922f96cdb00a41929cc98dc77c52dc6c7e9d83b188a88
-1c8a16de3557f9bd5b23e03d5c9cd00f921a1e7f7c520b6c55205ab0dfc8caa7
-6f6d7aa1e2c4819e4d19af8bd07aebb63e716d0a4fefbd0c9600e5c5a9857ff8
-a637e2da191cc7bb8b1a09f4f4d1ebad7549b7b2d41d74cc991cb0ef99fc1bd7
-b3575dc3003914643d277f88131facc8b58b3bdcc55dcbc372de6e3104a92609
-09d9fe9c16e18ddb44a481438ca22330c7d6b7a4eedda79f01bf19c266ec672f
-99fd1f26d55faa7c485af35609a799918dce99225bc28a60256f5d393d488bc8
-660af7a2651391bfb765a8e7993a8701dec9254c983682fbcd136b4774ee2c41
-bb2e1c64a6371db80c433e8b0c14658ce0ae511bef8da3ab0d10d4aec7d9545b
-90881504302bcb086528834bee3a0c744092067de2205a7d773a5b1882d6094b
-9f32b36d94033259881aaf60c7ea2eb496ff2bf705aeb576a41170461fd95e2c
-0c4a65ba15357e7ef123f8a749b89583e037e1e9e2ea2d8f435bce1627cbe529
-7183f4634de4d321d6b63d939abd38085a1d1ecd916fceb8dccac6798b358449
-ae06c3f7dc948b9f32346a3f492db2b894605f0d33bf2ad98445afcb05b6be5c
-2f38338c78b40cc533b4d7dea2b9760f48a5822ce3776e87a8748f81c84ee7d3
-d43971f8d572904da8b6e1f2f20f95bb2c31a4febdf195973dbb2b8399883d9d
-7edd05e710d4161fa96e30244dea9c2dae7ed30e36058bf077f060067c3c6331
-b26d7e358cf3efbd5dd8820d0f383071fd7c8f29886e7fa098a9521eeb557af5
-d275f95ccd75f593e97aa2a1d7463ed69ca8b87e3ca8359861cdf24ff3a01955
-befe00289476891a2db20b0c808ccd590598c4486d00a53ae66acea05e921f91
-b6b8410bb4708bf580998f9e08df92798f3da75b1ba7e380d4e3a5efac7424a1
-83bd2adcfd45d84a0495cb2cf6f647ed38042d03ebc57cc7fb01c9b6eb809815
-aaff355c0048fd1456bb3b666d69b61e62e5f8764d8fb8cbe568ffab07b2b20a
-dd75e6e8afc57cdd6a368b35903177c16db14c14f861eb4318e158caa7615743
-c847e066be616524248056f1f1323cb75f976f3c45db703df818eb011499049a
-3795c81add7bdb60c942fc7dc78cc0644a6cbffee86744af3127d021b0db7cad
-29745fed8dcc7c814da5085ffb6537dc87b2b10c0d739ec72037060d77d03479
-80b7c1c66f33594dcb8fab64cb6a7595bf4321074e177b613d8ff0d6b3165734
-ef7ba807198398cbfa82b5c22268966bf1c6efcb763bda2771370fe353d5f74e
-39b97d0007c8f07cd4ec408d5fd8e0b91898da51c5995f1bf401201f3d990741
-a413a1873c0630b02461dbe7eefc315718b935819245a3e4ed6f7245205b0260
-2ba4e3fbd10e9e9a6d795b7e5faeeb4bb327f8e2bf6288afa17b33febc30da26
-339646fde4bc2052156bb105b6495ebb1f109772fc0cf4e74d04fc343e59455d
-f66e127b01af76306f1eefb66cdde33513c9cd8cfde5191a30a611fc740c7778
-a8ec6ed6ab7294afdc13c647b5beb50d055f1713d94f8f4c34198de9e7d69140
-4a6ac35aee04add4622ee052dc6e5ac069ca16f44699d6dd1135b167daef2640
-6354b17dd0065b0667167a32152e0a1bfabcc906d6a83f57322b6aaeb665739b
-0a129704c95439feae80813d4e016707e58501284f589bcfefb24f2d4f4a64f6
-8f498156b4b33739c6d709353b297803d5e2be86d22a8537ecd6f22eae4a9a08
-8675186ed6b6f04bf4ebf656f62c93b707b488177b56c671218c0ecfc7c331e5
-ebf4d7d19e24e3874722d2ec41850586bed01c51501cdafb58f62da3bacf1e5f
-fbe991ae47504f4cff536cd07c27ea98c7874d0332184e8e9ec489a8b88cf4da
-3aab2cbf5fce08fce1aac46f7be72bfd13b2e68247c6dbc126e94b6c223b65b8
-e10e023b083a73ba7116097cc30b32619e0337e0234231d125c615edab87a076
-11dedf515e1015422838455580e1ee2332f79b66e0b187045fc80b02a42b5864
-ca8f5ec65bcd6740cac58c1bef50462dab2b0148c1f38ece89fbdc8fa08aa8c2
-6bb7f7c2760f88e4b56e3ead341f6696544fc6735122c136ebab68afa8dadb4f
-54c6fc0166bf56990d9b28d0fa8d843f1c971029a46665c1e5b7bcd2b9d794cd
-ef19e52d4a154e0d537d14c4bf0feb4ee4f289cae0c86cc82fbac3b43102c28c
-b5f6a82948da4c51fcf85d95a91a5a60806815f04c7175f695e1af5270f961ca
-bf7ca7376887489e598d4014b2bcfb9f4a745a14f577ccb2f402be279fda4d02
-3f464004998682716083496d4112ed9ec7351d81bd4729511a96f001d119e714
-7641307abad87eef8cb42bb7ddd62f61eee2a3944a834039a5456d3324c53c4e
-7b44016242baa784eba34a2ca7556dedad425bdefc04f11aab77263b508ac9b4
-4f372af561266420f852b0f288c5a8d08cb682b47bcd0f8c738370c48ff9dc51
-17e8551a946b9b0d0b441e8353e15214cb669f5a696b50a23a4092b65d3fdec6
-f174fd8b2d51b22cefac51cd5fc7653b3fd367dbf0aad2f94172a50a1bc5c236
-103d08e2aca1b465cdbd6441a8b9f05b2e998d330ae453cb4d2ecebd069ea9ea
-10a0652dc518141e6bf674282bd3ac1aaf7361513a945163bbfd249effeba765
-38c41e708a6e765fe6b7fde08d192ae7e1e4a12e61ced834f873f89bd13934db
-828fe9925e412e687fd5b99ce4f0fadd5d20a2d5d2c083b98d7e85655df6dcb7
-f488d3bafc7e1cf88a8ddac3e33b3f38c1da0bca42f052f379bf663f7ddd047f
-227dc4461713cf88d27780480ef4154c1cda2c40ef944a86aa053375d9504107
-4149481e9f6d061b6cf70d533ea7f4df16075c1cb2d84fe52ea967b85adee81d
-976e3b5cc75fa41286cefd804fd3b471c74e973e3961346a3b6473390660492f
-1e602e7f27c38f282c7d398013f133812a6e8d2d20c45f8c31c8dd26e53ac22c
-5581ab149190010f6e3213f77da2662dbe1919d79a23aa976d23183074171102
-9dc5311c96a7dcd36bf4e60780ba68f44292b23c6301bfe39defe3f420306b6f
-c94a224e43638aaa1d3ddcaf6d4976dc33831d413f691ad7867feebf53ff31e9
-05a6f084f525873c6e1a7eaf956f8c1f9728f88303c6cb14b6f79fd730febac7
-1552d5a8e5f4b8e0bcb10efbf8a49ca6f470ef4ba8fc2b5b05d0e2077ff12202
-bf480f21c47ef74592b6f8a25ed1bdec3a87a3afca117fd40ce5fd5700cc0b62
-5f29828d7dc95812d142e1967b748961b343cb96408146a6aee63d8cb82e0984
-1073d3085e5db40b230814bf4a2fe816891d33003db3cd0a585c1dd306042423
-a212af55353f1e915436137cb6ef0823dc1f14746d0de7425e036cfb6722a890
-3e5260dec6a7dafd44c995c215d6a917075a3c8220884be62c0660b833b658a8
-74f9af8d280d67bcaa96429d4882427c81b38570c66d0e309628d8d7cc28c442
-2511210838a12cde39af4eca0423e5b040c52124b5c549774e207401ffe8a771
-08192fcbbfb5a127c24241c8d3e0bd8a70456ae850725fc1dc1b2d5c2d1acb49
-71fcdcd33e027a562c0ab202e73bb3e701d4f675fc4e301a710bfcef00da6ff0
-926112665593322dfac72485b8eddfaf4cc449154c53c4403eed5332f38c7498
-9851e9e056c6b8cf9fb7079b48420f04cd54cc12d505f13f111df1a51672447a
-71defa3128cbd7ccd50afa388170bc80162228c1ab8b8b98ab9bcfb0d49686f9
-2fef95de610905562e92665992fc6fc31c2a0e9ec7fc06bd22addc740e02bb02
-d08cff9cdd111cf41b91a7e4d8f38d88d8cbb7dcd4120fbb76f69a24a773f32e
-a1f63f906a92a16861db77523c55cfbfee0e96b00e1f93dd20d154343ee774e0
-1fdb1be91c43a7d690a557dcd5f75fc2bb0e3e18286dd8e1e23412fd61fd79ad
-602259e90d0e5a2894a29eda1c096289766160e356931015f1ccda0a56f3f2a9
-d9c2e495157514e1b03768d8190619e0bd113afcf91f67de3ec80a09281107b6
-b2af3e22a970ddc8a28c61140b102d990392c923a50e55971f6751287aef256e
-f1c4540af2b1d7754b16fec88e3ecaedb6b713ba39fe835b27cd7fc8c132a740
-46702a4b9737dc04b12310ba7f30ad94de90c4cc2c0e174c5a119d14ba6488a6
-a1134a68ec0ea009c0caef6c0b1edbfcac670162a1b3235757ad4dc4b0ef153e
-a4c396a809c8ad3945607752dc6ecd49348d9100c3029da91cdd15852d80cff2
-dddce3e7e2818294a4113ce0bb2e4d930b1069156c346c2eef80e8441084fa66
-7ed142e5f9414f02a362992ad52055fb82d627dd481405966836efb51f858f8b
-6104fe5d335427b528c2a83512fc056de5f0590945e84d9da75012e2382cc99d
-cd957c861f43582d982411c74d62c0ba1320d0e069cdf1ad193a4afdae8b0b3e
-8bc1179ed8b02e0acf0591edd39971dc36698a884f750694b57bcd28ffa1848b
-621f22b1a5c9b85498caa13e82aa9573695d3e1ddd2c408123494d46e671b50f
-5314e92a073fc52522f6492de090208493f1581017e05d7f8bcda9cd8cb62cf8
-2cfa57390a3e27ea3a15014a00c9b6189bc82996f2823b1f7b6c932ae9d44cd2
-351af96c918294e743f054f1cd71f1287e7d0dd8908e573c3113734c091cd343
-95647aea885cd9df1211028b13f99591f653f69df2bc629297ec1c273ff6c446
-a7d6bc6579118915705baad148ce2d8d0f032ab0ce4608d3f2c19ec255df6b86
-c88700d11dfc2953b60391c5c4eafab97fb6fc87c467f25db92c05ac2aec8ab9
-f4f624b08f92522739d920f7e07eb4d32807990a1f03dd323c5b5d2b4b5af128
-c18cf5270e0cfbb3744fbe8041d7ffebbaea8bbc7b851f6e34e7abe48cfa8b72
-00ba0034a95bec468ca2f49f7f34fb3a441936128fe1d842380aee63867b2ec7
-38963bd51781d14bb5971e156e6fb64b2ac5fd5fb3c1c1569a6081ba0f98d8c7
-7736a52aa2313dece258c0b9e2cc3c8547fcdf0ecaf7c704cb646eb9b00b0d29
-4ff444b03c4d041667206d44adf45890b1672eed8cd460c32b8cb37e21be14c6
-0852be32de9002618df604770ffadf5cfc05857966bccb01edd59906bbf4faca
-52a14c2e1f0857cf039a4a82474f03dafd54b8c163882ba77436820fec657082
-45bb02be9e7fcad3cc9ffbd119ab53982acb49e7c74fa8fcd92b2b0dee92eb87
-fc7f8bde3000b42656b338078c2ae8f58eb616fdf447c06ca70048b2f5ae25c5
-123655dd45b546277bd35b63a1308ca47cf4d8917c4bbde2b8a07855a0628c7e
-eb5bef472819729b3878168096a81bf7dcdd59df236fabfcb0c95c86ad80800f
-c2f69fc835544ea36403ff2cf0f3bc8127bc2eb5abacaee987b76e202c8de7d9
-954fdfb49cad1a5e9dd6e5b943d9b3477acb63cc884168cdda0961b483c20b73
-2f7012e980d1c6a353134e2ab65b8f93b6c6929ba78287c215daf08f480b786c
-45b5ee6df0b2b030fa7a27e39268c1526759aa0e095606d2de48f0e7ead25596
-09eae59437b3621716a4892a241d8fa957bb65db783ce120cbd1e6bd83b8a26f
-579f062654e17f8e35159212f7b1b7788934279c0315b9a603b3008cfb1393d0
-edd53889e22df7108a6cb6e2732f9edb9ea792e00469f192a288ca6fe995c7f9
-e3b321efa32329d3b1f0d467e49aa584000810c5b547149295a7676ff1e4cd89
-d8d6da7e117e8cfd0877e8d7ad0869b15e69da45fe038ba3d62ae756bec8802e
-e27ead377a333d62377718b523658dce2f8669a67a70585fc50549b52ec5289d
-22dd47a8892152cde34423e671a3820089f4f3b4007759dd686bbce52c7c9fde
-61585a41e1e74d33d72e052708b3163d62ca2e89fd981b595b3840c94afc7b5a
-3148be452208a894dab2becf9820d8e7769ec43d9635aa867edc4453e7d03b4d
-f0e4b89b4b6a3297cfbcdb97b158e46503f38c9543c49d81a41665228c07c28c
-33965bb4fbdf8fe213bba119605114bf07c4de83aca1eeaddea3345caec6ef41
-ea7bc93bab21a2948eb3808f467090058fd08f00510ff600658fa971d1f66e54
-7ad1965a174786e4d92e059fb6769e965b1147f4048648fe82ec51b13bc56c71
-229b19829abcc1ffa85a051c413245bacfe48d720fbf8d4496c05d7b5f45572e
-6190fdc37301f6cbdc44031c1e97cf47f9c5b9ebec8f79c8bf8157c5fd861ca6
-4a5d258d12a8e48f7c9ed901fdc289b53641d5cd5e63310a8be495b1104a96ea
-664da883db4d8b8dd8ab1dfcdc10d771d37562edaa793cc9019389d060709efd
-18d78bcb6d3719a0ee0a5316f9f40fa503d9707a6d6abd1cced61dbfccb06be6
-714985a9ca63809cbba77857712c2381c569207cf9db2699dc0aa6b7f5565043
-816bdeb09e29be611cc336c31e84302245c9ed37231a7b92d711742c640d06ce
-e484024b5335dbd0387548b2b71655e83cad37abc1496e1cf9d8fe792fde96a3
-bb684ca9fed1bd75d9bf50b06d58bc2929de047f96f003302fa2872ad8be3e0b
-68873f143abdfa4a73702f481ec4e32018581f19ff862c93fdba310f5914a242
-30a24df9f56ee75d274c9d5cdeeecd61618c14a3c2d36ae5167b04312e7a7797
-0267e2df6837256f0cad7af1b5e29386fb384a8ec2a3a116e026bd2e48fdbc5a
-90d503e2f3c5919c715724b234b71349ccc9dbee51808884d39a8b1ffa448488
-504b67e245eb403221348735723197708a564298581b5d75384b13ba92a7e25a
-5c40792e86d3401f9fab4a41762d95982365f6408f9683877402ce4e98e4a00c
-c3178e104c0857719ac4cfd53d07c219eb60e66d463708e3ed65cb4280285c2e
-723673836995e18aef5a9a503d7e89aa2ce4e17c33a1214df21ef551d68c3066
-64583dfd9664e09acecee772d6a70a23f3840ecdf6a671dd7870e1fa9f261e79
-6048168a73a20c53a971656d47a0ecdf7e7c5cad76073335ccdc14477746c675
-e2628951ee83c402f7a0b581af8ee6a594923a375d18c98a2dd01d3d5eb8f71e
-657bd49e5b0c4f4cc0a62ffbe13f10cbca8bc2b631d21b43827a5c3ee7548ed2
-baee96c94af70cadccd81dd3a48c7190b0630a0c7ce48249b91d92a1bfd06ba3
-123f97326e31c195fd1771fe71abf66fe3fcea8b285d6a1d4cb55b9de4699b0e
-c55bf2f5d6c245f41cd933a4ce3eda258cb90e401c6075a02757e36717c8f547
-4b4e9f3a8c2d172b5d380dbb9e5cf8dbbd8b2d8cfd014a5011b9069cc00b7dba
-21b4d17f44a55ef1e5c49ae01d91ab509c3313f2b0a8461194bb89fec131a396
-4e58fceb5677baa816bfb9e15a5121b3f0649562f920ddc302a949268741a677
-4e8c2fcd11288f6705250232d4de4caa56a8e8219dcb805ed08722a674d94491
-ee9f530d2eb8e07173f86912f0e585e0051cdb190e4d0040f9da037f29890068
-4e4d5577f67a9359e6f86b690ed5e6d3e772f7817edc2867dcd6d11dbd59b9ed
-904a57f2c5dbaedc298dc4f2bffd42a93e77925e00b4d74460c68196f0326f39
-f1ba9059cdee88c8a5377b623fe791c7eaaaf6ee2454ec3f681bf42600a97acf
-bba69df07157f26b64a642849a3da66f0e458fa885255699024771c0e448e620
-c3a2607b32cedb6e0b72a5a5dddb10981c3cefe08ed3921c4d0ff87c18cea04c
-16bde8148e530979c140973c68ae56da99048448c6041f1e15d162163c46f7f0
-5f9bd3ec2c7b2012d6f3c29eb76abfb56641774cf6b6bf17ba63b7dc94efd7f0
-c5412d1448ae3a093cce169908469e6ce06971d89a547f25d5479fbce1b89278
-2440339e904500a9446ed22e000a9213858c097896a83f008b180d942e397804
-a669da5d731b2b29c3af90d009e4d5fc9885e9a446a8e4c7d1e4f2e64629d829
-444da50342173a10deee11630aa33d865c532f39cad6326674ec49a348a02da9
-966cf4f77692ec51253f5dbc8650e28992673c97a8bb57ae2b2a1331644d3de2
-0236f8cf1c3f071fa6bb2bbda641410c39585a57895988e5d653daa8558d797a
-87d8ad98fdd07477a82c09076c6d5b8c2b6da0c3f4b916149bfae6ab3e47b977
-9c00f9e01cefe0e56a3dc2820a78bac7ce577e4e3e9b30724ca1ae980bf5320a
-41f38e2fea835dd1b7f8f252ec7052793b34314e0faa27ab4edc58ce25feaef4
-011cda00461160b772ac3dbb072cb3bb02b27f33ac2b9873a8131954a4abcffe
-1ff1b3acbb237877ef0faebe4ba87e886a217d62a86fff64119cb68a54ea16e4
-6042eb0ac3194be279f6662a3bc1f6d46aad795274df8c5810832a8a7b442a4b
-acdef42384bd3c25765321fa46f000e330d01a4d63cd71f11bf2cccecbc0916d
-3a78816f519b6ab5e58cae3543236eea83678c61c3bf8da0db91f4f9553565a1
-ef7cada3a2eaf42bdad0fb7702dbf84ccaee6e01b97b2acec60a47cf19f42871
-c4255eae175c0265ce822ba301bbf495104a995014cd9456e73d2ec34d417402
-38c08c6c296cca1ca3b6591e3bb34ed9aa0061b1309444c29f544bdc8b22083e
-f8a1975c3b20d6d5ca9c351c26334eea4dd8b8a94f33e6195c1a80d6e37bd2e8
-4122ec755d4c52614af9dd42d9741e365b019654bfadfc69a90e2ef9b84957fc
-6d546f6d8d8f75f7dcf53ac4f597cb302ff298fd67a72ec5fd2d2e480e239060
-d6c242f3101f449fb1c394a0e5aab4e2c045506d3839f811d173c0564fcd1657
-f668ba835451a95dee465ae2ea790afe0e9538a6da482e3c9dfd134366ebe8ef
-d446d7daa9c05da01815985a2a5f2c3ec1f0a7a929717d234e3e2eb26a5552dc
-3577e7aa7bb1ca1ca6c3b36503d08f079892a2e797a54def5681eee1f9a3577c
-40e7ca2fc5dea406e54890bab23732e6384a647926d8e072de0bd636f1c75e51
-952c8aa250389079d6b04490e372b4218613ab658ac1c77ea9a1ab429277b778
-6ea8dde78ffb71bc0bc4dfd9ff7e1a6b2ef19a12276f3ce7d4a5b281401af046
-f8b6c6548bda69192ca355cf43bf1175b033f01e1bf61ef403053a79288671ba
-85dfda331ad1fdcd203e875047c740c42bb12304c4a18a407bc99a2c13a87c60
-645b158b0513a90049845a03cf574e1496acd0f2fb0f914e011b103533e61aa0
-1ac25bcfadd456f33b64000440c1e935fc1681e9fb6685786b72c909055e4f40
-b70afc227ac5f2dc1e3e58363547223cd835d369351f36cf698120403c53e4e5
-a16b756600bf0a37d1965a2ea457df75e07f3021023072b12aa7f3d9e8dd010b
-2dfa92b24d7375b7ba1290060b5b5c9f1537dd0969cf9a7701fda9f9a96359c6
-ccc15f736f5d2479824e8488f6aba11b3d25187a9337effa41ae611da4e35763
-f60ab26fc896697bddca64b70300f09a104d041ea41c4dff6f33861b8ce4f45d
-98fe08b1626cd9e60a4453597e2fc3287d9790296da5087c25ae7b85be898583
-ba29d25a59c776bc93fef8f3059e77827449056c2e55a4772385354bfdd19284
-7a02b8d0d5ab6b34ad9968d68c1641a4ccb2c03e5253f1aac444c1afcca8c94b
-934806c61442f810a7c53f06db5b23d0b017a72afb5be70287eedd1e0289ad87
-43965dae9770a18faa7944cad4c638eb8d918558aec3a0a695765172d5c834c2
-13e680fc79d9566fc3b47601c706c2609892dc9d1650465703ee6c2f7eeadf92
-809cd4831e47a0188c633102019b6425cb76403f967af48976a2737504060649
-954c118f616bae1de9cb94ed75f6a3dff1ce4954dd298ce8b5007d1e182a7e6c
-e0c6873f582d21cbc2f0638d4a7b2679ae58bb54c7f8a1bc1c3e9eafbbe909c6
-40ac2bba74aeed432242720e473163091cf6fbfec4d44095434600789d7d795b
-e5ae5500584e8e637daf9a7ac458532f3e44320be7ce7aa1f106b6420e67a96f
-459c23b7b02404c1b7620742766142545551de23fa8ca655c1579fb2c0a10e93
-1c220e584e9fc86eca3aab882f3881c530ff92dae83340193d5aa93bc857671d
-ca3fb1f03534ef6ab4cab64e29c02a5c37e19d1274618211f2e7493a4a7045b5
-3d39adcc8de68bc7f2265914218d2d69abd7c49bc9237535b4d364cd67bbbe35
-f13f71b88e83e3bd6f09caf327c629cbc2b8ee728daa1626795c2995c7919a2a
-e966108bc76de252e4df625e95338332b6aba850f0fe97fdf247e85db1fa4a8f
-3d307543c80426061ff86b4ef8d26997baaed5679cf430bc88ce20e31cf510e6
-987be01e58a170bfc8a6259f113cdd3541fac41467a862acb3de36fb60f72de3
-e0cb8a02e17ea8cd2eea27aba315fc34795ab06dcabf5ffd1b83e2308b2a21c7
-72cb356f98a7d2d0f0cfcf69d672aaf7fbe6198344aadd2ec28f593c7332b0f6
-1809ef49d7c19bcb6c065ec2d890d4c8a172e061f47ef2cc392e974d1874278e
-250453cfbbe55c77a0715475a7cb383a287cb83f5a14fd027c332f79a09cfcfb
-2c7546c8aa601d925ef6b72a2f1ac1df26505bcc8229a4aa0c7167b9d7c56508
-901efdc77754cdc396482d17a6e9fcd200a0cf35f67948d11beec6d38794a826
-7c48da337fd191705e26eed2981df5ac1e8f4bb23952b9eb6f92cef4139e1884
-bff9f37257cced07790b6ec333d66a6800d8c8befb1d6362786b3ed00ccd233d
-80e8c4fbec37dc7dcde3e5ff2b8a81596dd10b714d9697419ecc542a661be66e
-a5082e50ab273dbae50d60ba68273be1adc6f750ba2115af58ce22e8e10443e7
-2048d5b248294cf81e9e1995dffa731795817c556133b714d4970b379b310698
-d4f690f2d799153b8890e74dfb72a5a50c476be90cd65157b82fe6b42c5f1be4
-3d5cb0c00ccc62f270ba879311467dcfe9fb62aec22c5d4872f6b02b8a8442d9
-d309722c4d30047232cd0c97049695a2cd80478ef3845f6d1005f36730c41429
-0576753e869c83d458f0dc3f42f68264e020270889c63218df8e1a8ee73488f6
-49ff10926847ac73be9e89879157cf78af203a66ac491eb93ba365b8891dbb8a
-bf8a4403b36e0334beea6749cc202ab18dcd07028f2f6b29b0eb5865a3748aaa
-c60575212f532b4cd4c9dfdf00aedf6cfe6703ec89b63950a1011785f6dc9c78
-d09280ba67eb5a78f9bfb797add8d7b705ac5ac61a16fbdedfc1ae720f9a4ca3
-4cd9828c287b680c24f11bad00b644beb9f6196dbaec8ba231de2d065bd7f42c
-d731e09725adc7213bb1f5e675bc11aadaa56da37f62ede33a390d43f42a795a
-0a5df034adca9ecd0e3132453aba99fdf4ae8cc2a7600e4aa10db1db113674f5
-10b2427b1dcb424623a259cca49ed14c97f0613edeb93f459fe9b9cb75b4f308
-15f5c65f839208a6f25652c8f63196ebc83c081c4739a692bf14ee8ee54ec4ce
-72a35bf84d5f4e6c0015a4443e7f799b7bc6828e30a97687a0e5b8b722fc69ab
-5baa477d07bbe2ef09a4fb7f05db2e02923bc8582f27693a5ce2b473ca02a815
-9c0789ef683ad4c7d8708dd28c408a21e358fa2c30cc598bc36c5651917da2e0
-593e472b57d70c0d6854fa5422e8b3825a9e39b0a54b0634190c2aebff4913a9
-7534bc70e3e9b3458f272d24087e74a538764b43168e74108da00351ea558e3c
-34bc8bdac1e1bc9061a688723bd54f0bd4ed7c165f32dec016b056b7cc566a4b
-1c873e36ffdb7e29fb088782ce60524e2d75cacd23fc274e307dd1d2b07558a2
-7f64c4742eb3ba451c8ef3b6591d193d4a55a42fddc17f12ec3aaf51de8056d2
-80f09997bb31a07d6112a855dbf7062218dbe89a6844a006f23899f98624ff6c
-6c364bf079c4b3c2f92cd79534f89925cfc55016218192a98cdf6cf4fe1b5fc6
-9540ea49643891db45a7a71cbb85f41035f507dbc6b161f7f1eada70e7905aea
-0b1983f7909d5575e3e7e8095bf0f4978217b23f329f057f1152ffc14b9bad8e
-cd6fff8598542a6adabc992ab3563f424d108d95abffe9977f09630ef4c6ba01
-90828d34098bb40bd230685153e7282671478138e578f608873d64b00eaf1339
-6dbfa02de3fa983735d90fe2d0cf7d28bd9f35a475a6f55017124a58988d00c8
-713745c7c999ea746bc969d31aa62eb0d722cab1e57cb0ee97cb969d1c3c1b41
-cced2d7ad87df16215f908e02a358b725eb5b234fd620f7f54d70f764eafe8a5
-de65e3e171c885eb012b3db1707c76724b62bb0c1a51be0b67179f96a46ea538
-17bd480e774c31fa131141e017ecd4c1864f62636127a4c7e9bdd05679462314
-042f0858441e3d261ded65833d91d80a6ce303de41060312e60527a3dd45404f
-55c93a9535c3a393f1748609b002be9511d87af20c7bb2c4cfffe466df21b100
-e20172c8215855aec00e3680c7efc58128a95820085cbe598b9603c70638e128
-bf0c2ab7113eb95b62fd40fef845b1eb5414737cd94ac65970a4d6dc2726d2ed
-2ba7567155154ad30301ee997a3bd52738dd17030860d3a479426c652cdc22b6
-2c70f185d812543f836c7d0253ebf8788cd6148ffc163699f72a85bd2600cd2a
-72104cfae46c836939c5a8a6584a58022d0ffbbc1d1f035d959fe58013611cd5
-be08db068630e5a4c5fe915e20e5652bcdcc44f0ce93221ae09c55fd565c2523
-79189a85ccb93f2d6162402f2209df604f140799d7e0b34639149eb5e54c33c4
-05389d46c775ef19519f1ad4a6f63a62435c090d8e3bdcd6423f5b7dab32d263
-165c93dbfb1af542af08aa5ea25595b3d8ef053e19a16e5a1b13f437fcd2586e
-4534aafbbfe1e76906e832c6d1d47a3c5c868e65afa7af2e21e54ce233170b0d
-e44bf290c512ff3acc84f0e492c73a0d827d701bc9766abc4c08d12fee986020
-d06762d4a0163a976031bb13e7e86fdd3101b8d5155046ad9d82fc26496661d8
-8cc516350229461d6c11114c35a0d13a1c6ffcb96fdd56105d67bc5666512de9
-6aa15713998ad53064b7023f64dcbec8ecfee625ef76f5a024c92330585cd17f
-1c3f82bbcb509d4d31b535cd5853d803ab7cf1862e8a87cc3d6557aeb7567ac7
-9ee04bfc8a445169afdd1b1375274fbb78ce431ffb9c6fd61a99a0bf1b41c19e
-1ccd5dff38a45647d51fb014099c74ebb11c5a07050078507d45a1ff1fa2e178
-567f745448157bad850f1fdcf9a37afc8968120892ebc0f85f5dfce9116a7108
-b5cc34c5d85a91a65d18b9093fd27e9778ce26bd93644e4c20ffad131503b509
-850f4fb260edb6d8cd0bdcca4beb8a25ec1fa44eb5b31e9213d11d0a42d1aac0
-650e1ad3880d59d2256a2720081fa2a7482e3bf1e4f4afa59ec16b810c0c1cf3
-2cfc726205b285ad7cb21d7a59fbe526a844a5d75ab5d61a801701c2984b48f4
-ff020607f2ce9b468df2f74e04812262943d8932d2e3c0478afd42a8a04eb7eb
-44f9dd70b1da28153f4f366df0fd25e89f942aef374fb9bd31d9575803c03e57
-50e5e75975f108b6c7bb770d824e5eb88d67dac4526d6e4df1c6fca0a5fce033
-84b06624e906912a26412b36cb177fa2dd18279591a0db289d18b1754461b97d
-076631b5d598cb2741652bcbcb9804e1d01a8502b03739981b42e4754e21287f
-ae2adecc9ab60a3ba753bf94d1b586c0f689309cddf12131eb442180c1c25b75
-05bae86b985d6975d1048d3da9ccac02bac3e6d8a2748082e252167809ec7b81
-7cd72fd364f27f9aa276cd5e70edf56cd5a0b9cd00b815411c766b67dfa424a5
-1d9a9c7e27cf57e513965379e180f1bb94b174bf827dcbdc89ffef77f5e2ffe3
-9f1dafdb747f003723dfdfc91af3c6c23619237e4f661de027809a510242ea85
-d9b93733b9276e37c01da481bf86fd040b2a21df21b3aebd8cb974925ac339cc
-110b604531af29325b8d844305196e5e1366edbd5e6196ddfcfafb27e28b1adb
-6c2a3fd16d904a1ffb4a998a4614cacc85157d8463f7cda5363f5f03b9141bbf
-4788f8e92de9680f3fdea66415c9ce8295c8a1276fbb9b57e97f899caa8ccd60
-275e20ef7c0ea888cd60bae018ab8d59d4b9b0e9a19d71cdaa96392893a7284f
-6d94291130edefb156dd9a7d172c89b881aa5dd8d1a4d9177640bcc8d308a801
-547a4fe7b75f04f99d529c854dc059641c7652132291dcd0deca5ae1044880d0
-4a82600f293dbce78d2dd503a4b20ea39f25633c216021b78cdeedf51fd73c9f
-ff3b4e7b637e90de3838f8aa7e1703cbb6b5c74e1f0ef474c9ecfedd79d0b8a6
-1559407b87435fad2ca5ec36b170391fea7cde5824286f66bb0f2b14431d2481
-0fe6b2a6905c2ef0908bdd4b05a16c01c00b2eae7bf294251633e806ba08d21c
-3e1823e8c0e9b6ff171c19f2d4b27f070389606d90ddbe0303133f565644c8ec
-d9dac4daeeeb490b2dd2ffecc57d69daf3fd4ac8666adc318c245e14f5e67d44
-d8941a967696da623d22c077d7484bb1c9029bcf536aa060626df3d5593bd4b7
-af56296934d03d03c682426f00542ad5d3f9f8631e97eba46416979b6b2fd5f4
-4f19b0cc18d28d551fec3b3fc5440f3dd5a0d79fff8df917dd515f68eea2ed9b
-73fe68e395c7fa2cfcbbffbb4a7cef13b875b96f5e805dd45a7c8d3e2eaae5a1
-34e00e26988281b159cd8f9d31a2f15246efd8d927e881a173487df644cc7656
-b847682c04542f35de33a7d638b5a2187a74f036ac693e4ad95142e8fd852899
-b8ffd2405f5d79af6fa919f2613c2f6f4fb729f5d6c3fc8ae921eb23a0827667
-11432b8e7ea4c6c823b57acb073fc00ae93223a0f893bb8e3ddcde28de69cec6
-5c0ab65d48799ab8d1c269ce7ce346d40256992947b609cf9d3da1d758ceb593
-1d6f05acddafc290e2b59a93bd94507be8a4d4d675dccca80891ee13846be24b
-8cc4f7052c5de700c953319b29aa4b87ac3c85377ad31a14584ed6970928e850
-5819d527dfdb85e330a5cd47a60932ac93b359bc0921ca40703f8abea6ad6d63
-83f8d2660f8c8571c5a13d889437d12d6a41552d9c4afcdf2fbc2bde8055d681
-3b7be320d48247a34cbe1b84791d2c8e9c417777bab9869cafea2c522c59b12f
-23cd59779cb58f047e0b81fe4d42d1f4433dae0ad691b9c26e8f82b5ab867ea6
-fcb2d7f2c0718610130ecb7ce93d1ec2eddd2cedf1458412dfed5f7f067c473e
-aa0235862bac6f8c8408c0f61d978312fc1a671c292620bc863537d286a60a22
-03a2d5dbbb772b365b925b9a616ec398359425e3b935c7e833e572ca8ecddf98
-121a7bbbef3f8e262d4c08cab12d97f15776e7e202f493e2e12b87f2e421e5b7
-6e3db0ebae2f1e62239072e98391135f5ce4141cea6d7e7a19ec1236b81d1ea8
-0fde0b0f2fb4aad1fdde1a004ac235c896a8a5cb15a4806401727e7dbd148ec5
-8bbdadd754e31592c37a7207a82989e5405a7ac58067f07932acadb77de65c56
-92caff85e5c183181cfde88b045e596cfbca6b4e0d37e6b881bd3f081ccc4a04
-a6d576b41e277b1eccff69feeb5253bbd9a8e11b554e496a16f714ad3bd963f6
-b8425f07ca5de122de2717d09917f19ec3238fe557c44782caca0e4e52f38b5f
-7c207b180b498a8fa04e66f6abee7d7e79fae9e54cf566803a885db7488506e3
-8727b5bd772198624051c64da3945da5e904788ec969dbb890f264e54e2c661a
-9574347d34634550d5b1a1355f35140adbc07be4d5ca5c791cc8cc01c4b26875
-26d8937cfea55684de8165b792f7740044e50ba4c19677a30bd453419a7b8d46
-437f44d206dd8a871269c903d78bfaa35c4d1a054d0935afc44f048da40cdfdb
-5c15cfe9c8f19cf87cb93a6594cd394c7f64fe21cb599985a69836ddbaf80410
-4848eb7252b523563b1c24e57d4966d1eb261e4c9c5ecdb8547e936506175440
-381020593bd8cbce659a7a345a4c05a9790df98ef2bddc9fe45f6968c49373d2
-d55cbdb4de22c4f7d53f8263843f8690baa842f6f1bc7cc1545f3e0a169633a4
-01e5656f08a48b17a69d7babea61d476ec62fe1395d1c01988926fb0e69326da
-c69b5e5347167c0541f226d4d2d8ed2b4828ba74f3939a4b77dea31d881c7b70
-18e1c1b646c10a935807e6d3a9e6674aee575023f941a098d2df22af754b5296
-360777bd1a5b1a8fbb29ec9ad201dbe0170850ecde219ad290af01017f26b777
-56c14a5d3ebe7ab8560ddf0140924131cb0a693433437d4a17f33bb22e92503a
-337de079b27ceea348d9218278870e1404f7733200e31de980e38ffc55268921
-200bb4a6bf116ffc94e5d68015c7b0957254589bbcfd6b0d7318e1983d18bb22
-982e598484b2c7c7ca5b08482cc0f23f74d1ca4baa5bc61d1fd9094b860edffc
-44c5bba1d314b46d6c45a5a1ad97706893733a9eaab22bec79f4437a5917beed
-f24271040da4386867c830621ffd6744ddfb078caf5cf59e7e7fa456eac5abba
-dfea921d226d36cc6d03c73716badab60c4021630643824a81ae62a731d7d647
-69749ec4f34068330b11d2f9664f56ab8b8a91864a3a2d2680717a6f7ebf8785
-a18fababe5abf9b1e759573dad33c4a968505e887c7b0f9bdf65db75bc04c8e3
-f397740b94b07dd154a5523b19b87879f8f0466d8fc9f3acfee32fba47661417
-a6a97aa66eb83ab06a8347a76890bc83e6bbb6de46f007e7ddf4c316e904244c
-214382939b4507a69a29fa3a60ad96e420d6873f0f28c8283fe85c59f9a5ec11
-0001740aad1de7f7bb72ab2b699492b5b6855c1bb78562caf497ef78ce8ac3fe
-b5f05639785318ce1b7e9ece0f28d560dbda6d134ba8222d94fc98e1910eabb5
-b8ac30c4d0f2574f2e83f309293c3530ffa08d140c4b568e1868c7b5b3edc79d
-716a5597bc45616e2f11b4caa3e248fb96d9e84afc205280fcd76842b913fdb0
-d22a1c741274af30fe94c29a2c690e4e32292220e58e31e815000aadd624fee2
-4d72625d57ebd75a24ead23e75889bf3fb35738516b3b77a6fddb6590ce59804
-6bc39e4e9ae32ecdccb0bf9490ce9c8cd23e997a63bbef088fdedfd9ea40f21c
-4d89f264329c674689a8536d83e395b5c17e6714cb48fc72a4879e525a954048
-595ef80d4b03d92f12664b841e00220e3a2c7abd65457f95d1d6b53ac96e545c
-25b8ac77d8549bf343fbd27700f1d5b344e965aed917c82211f723410c8260e5
-ec603111b03673922f118f1b41f1b436dc347909355467db3bf0dee4a7844c27
-5b15c9ffcdcf334ccde89fb61c58e42848582bd44e2833619b0ad907fdfaa8b6
-97a09f114e9e204db7e2319a41a5866eccc8665ef6d94a9abaf54a71760bcae3
-f253f7079fde5e138dfa210368707b963f0c4ad772d30e1b56b969d911192482
-e1c3484f52bcc8751b4c4a20430316d90adb8114ac02e8fa845dc66978cdf313
-4f1c58be8a9c2990a1dbf0c1151996d1eed8dbc6f35d4a0a5f44c22515575d32
-6772a70d00dd938360ef9940beec9ac9a9aa2143cc02c3c030fc6288ae783bf9
-e6c6a04cc0549e2e0108807b31acc0def31458a8b32096d5ec0ea1e9871db2b6
-35dba89e4b0cb6b965c48be61d891a0faeedc6ce4ff743bf826f524d4f313414
-9368b2da65c9c14546084d955e937ac3ebeb5823d90670e2480b29402d0db8c4
-31e12164912a5214b439d8546711a39648e652d68cddb4c4e28aec95cacdf5d5
-73a7141e0963422cd82cb1d4568ff99cd8cfc938614f13a5948add5d8914dc57
-ac6b916f4fc5fa6b0a42f35e7c2120b623c61a6b95e35ee2c6040654623d2e78
-f2009bc55a897e0373ec35427787370450bf03ee788482396b09dbe8e2ca8d19
-dbbd3d71115978044e3568b63fe15d56cc5b08767f5a72861b85262e8b194db3
-5e2bd58275c19de4a46f45b3ac0c297a9e1d8238cacdad6b8728fc1c3c7c980e
-49e05424f7cb02991dafd70e277388591e3e34923415c383d62cb366dec6f2f5
-da863baefbece4000fc620227cd325071aef5e62dc3e4bfdbd4915c03e686d17
-371c75ae25ac8cbc6683a378f9f617d19725057d84531c89cb0bb686bf9e66e4
-844fc8d6ac46b4c309cc74a1a948bffdd1d5d663672ccd358c9ed2e21e72767c
-16a968605b3c403d99b8bc2bd8d9fc41a1f30a692a1302943db69e5b9c69076c
-51233bd6963cfa363b280b8499331c172abef2000c09ef43f04db75fd5502a77
-b0c1027c3fb29456f60b56d7e9983e8574b1e75032b8605a27a713be6e0106f5
-fc61ff596c600275a27a13140056fca17426d235e71cb6c4eaede2cac9529d0e
-e0bbe303ef02bd6e4cf0446fc21d90079f91eab4484a9251bd956483113c5eab
-36e7b8c94cd0dcd6c5c82a082d335665b37effc612bcb5793e7db4a831b51ba3
-2b44f1f9a10027a92cd92634c93167e88b0564498af080eb0e1f92bac9672986
-ceda766c4d674cf74a1124f9aba60cf8074b493bb28cc379485fc6d11f050dd0
-80a6fb444933008df47b50a0214bc210090f9a0cadff94f254e58af23ed76340
-34eba92a70693c7288a79477d7e9a6afbe342867ccbf6b44ee7c9adebde42793
-e4a59ef5953d031f33fe4f12652f26a74b958fe4ced8e6025289027340bb27aa
-946ae6445d6c3f79147c67393cf739061c2417cf81c75f85be80c99c8f37331a
-e6526df9d46a11c3c1fd15886f07ca08112fe60ee83cea46016d15f68e64bb48
-167cfce032d138f6c124ac0281f297439995583cb9825547be0017918dde64c0
-1d78776bee428f7534f80a3bac7005aaeb2ab9abc0b534be7563cb582d298390
-f47c2e5a6f0376e7312d6d0093bf017f64f6697b18b9ef831b2a29ac630f80dd
-1d6cee9eba526f2eab63cd1a53d842f52e58df2815f07f166e7960a410726b4e
-b4437978696e134d4cbc80a465744b872bbf340155d9789194a06e891d1a1f88
-7a74da8de0065d6bfe492d1326910624cc8f50405bd9510c27dab17e281b462f
-7decb40932108ec5ad173e146a3258d88c43c9f30be963eefc7bfe130beaafd4
-98e339cafccb138f954576ad1a38c0f149aa852cb3f0354fde3c7949de59dcbd
-a42a73f39348a8fa776c27b5e23dcb6d90adf52289f3c84d49c185fd5394f712
-0d2c35f112a99197484795467b3215ecc0d51a807fc77d76264c305cb61377b4
-97a0f1dbaf69c35529584a46de46f516fd4d1a8172360bb1e1d0d0c44e158511
-87b471d543e4884c6ae7cb6f5618cc584d1e978f744b3bee0269bbae4dd4718c
-ba02513e332a6170d0ea4015dc74aec1ff63a35b13b2bb91233026504a8a328f
-ac1e11c82fe34d6d24bd5753caf5f0d8b83c945add3e7b36cd0aed086bcd0e47
-3996dd6f821236d36324e3d387ca7bf1707e7de378286a5065e050dcbfad91d3
-5c82b436b4fdf3736b422c00c6728583539527b554ef64b1c2e6a9c1d17e35b1
-3c58226254ac2a47dd1223193b4e1649095013734c40aeaffbd7160679f8e801
-f18376260ee6e393deec9e0693b4e6b728e35de36b1f40a6683f7e34e6e086cc
-9805432b4ccda429b0136dcb4115c56cb01fc85f333204e534fa17558f7fe48c
-ad9a89128ca6c821b01864bbb67062d5286283ebc1c559e5668e11f469bc7e33
-ef69003732d1bd8f0b3f153bc22e8b99a3ca9669ebc50526461fe3baca5cfa6b
-5f7962fbc8cf0372cc716062f29dc7728499c9861424ee92b094227303046fbf
-54aa62766e8c9eec066901a8a54f395beadf01af8620298cff08f20a455416e2
-2247b637c6597a272f7b0a28d616a82e234e49b0ada3999073e77b58f11fd0aa
-ef941d49f73e962e9ae57574d57fc46a6b3ba2547dfc9e9667c08ebc05c98fbf
-02e2e43bffc8a244136206f481f0d584fba9db1ba41ef8a2e4c10227633aadb0
-846c79c5d7049648f50528b5ad34e449540418ae28b53c3e34ae0d8867ac3902
-9746aca8629d847851a6a13b21e2cd95acac4abca1ccbf5f955e6749656314d4
-5bfa890e77a9fcee0d7d67b9a34cb2a140954678555ee64f95aecb843d32b4a2
-281ea103839fd3860ac5de0de726d02341bbec556d8626fe39e3df189c3269a6
-b73d27881d4bc81c125a1cc26b0c6f28811d4f74bc8a757785053162f64ec819
-4b9bb8300b7184699ac7edaeb491f1f7bf236ce695a5ff56bf5c1f4390fb3c68
-68fbe2d542005635927e401e338b6bf6bfc12702ff8fc951a22fdab1d720faab
-e66f16d85889d6a15586b2f53edbc5f907179169c2a8a22e747a12d1bba358e0
-b0fc014a1c42990e01d76268d311e05e4ce5948c42bfba4ce63f0b86e0cfde4b
-4be316bb2cebd0e73e26f446ca8478bebc132a064ed117f1a02affff29dafafa
-c4ecd8e8e32bf8128a62aae5e7f2d84e6b63435cf6d2bfdb918a5d28ef147547
-f9e569b09b50dbee423c1a7ee40355a1cbece709a13273cba0da2e3825c8a970
-8037c94de0e67d5ada84c0bfbf5b96c0741fa043868c402079df2ffe8b8eb03e
-2492ea5a6338a5deb290315e26eaf43086655014ba9ffe48f4d19e172f9bedd1
-218e1164730a81bbc1391615488c5b66d2f4c66bf1bfb54e226df3893a4b5a48
-2f540f19560d9f7d3b32757582782aeaf607567e8f4f0a0a30f976dca0ba5206
-02488b0b7f41861a28247eaa84af240a91ee8a4292454f7c3c05ead6f814bcb7
-84b96a394e834cf5ef4dbef50ca3d287409b060f767758d95114a26b1613266b
-6debb528e85d77deb7f3bcb8a572ea917bf39aca584c4f841ca622e6e06ff8f9
-e8970dd1c9510c1618d01e1af0baec26c3882b6eb80a7e8f945ad9abd60911e2
-6bcb6aaa5f0ce78068400f9eea67fcaccc763770ccdcf7477f32dcc49abb5566
-4e75f91acaea2a9141436861ecbc358628590b2adc5ac76f1971818a49383737
-9fd6fe8d74e76a367abb6f7b624568fc7a4e2132513fdb1e66e06b9f81067e91
-3d6d1e5d95e052d569e75164830c1cad1bc168213da1cd06de144f4c714b0e42
-34ad2f8037115ec2c1a8fa611ee4094accd1ac585bf7235b1f07b6e2b14111a7
-409fe76c1abfaca8a35436eec605e4b43760883b31c6ef176342f834647de59b
-b54c16ffe522bb5d71f432a253b966587dbc5bdf85472472d9111b8a23c49285
-391771f0e037bcb24a5803b323a27f6f0aa96b46f1c23dd91cf899bb59b2beaf
-6ba551cacfed10663e3e7c6e7dd856ee8a3aef30b0dbbc22aecf3b3a8ee10fe9
-873892898ceab62300309a4cbe779873fb3bc7784a159e02ecb484f2016af7c6
-bff8798c7f00bdf847a6fe0e317465343b4c1585d03f83f2aa56904148de6d90
-65999bb74ec61877d74bb895b7dbb977d88e55fde157d4e0176416b03044e895
-655fcd0d98ea455342ce0e27a1c71c9178fbecd2eb6c35666763a6558d297fa9
-9983a24384848911542f0fb3956c7c6761b7e2b8588354eeaac4aa145203dbc6
-2d3b319538af1da0602ec260085ce3256b9a0ce6be0208920dc49eb2954ad6cc
-912846d093aa398ae77075faf578d0c86650318fd8bfb82341281507691449d2
-b498947c9ac0c46f7676e0ec94a1a7aeab00dafbe8b1a464bdc9b41137e0219e
-9eeb5a8c72795c7bc34600c7325efac4f2cbf55aa9b4a996c42dbbfc0329a694
-7f9dd261330856fbc0819043b357343eaa1d3fcf362fbd0af9a99ad57c5cc4fd
-a10dd10097941bec739ba978da465599d16b6be018bf7fa1ee3ffff04d35db7c
-a7f6acf148a663f999280b36e51bd77763d6a6ef6ff28950a8d4b04590d8b51a
-dcb555cc47d92b21ad032d31cd54ff911516f356127e38f2fa9108aff32d2e5b
-1f1452901c38cccfc8f23122f4680bc316785e012f61d2ddb468cfa55ac91998
-93a8ee273eec61e760ac5097167994cb9f52e62182fa0845b2fa6779c914047b
-41d1a35ff4c499474ac5c277aedc0ee957400fb6643a0437f7f6eace0f512ed9
-3a33686f28bbc8ec68aca9a2bdeb407e975a8524ec3c068bc0a63ac6779cd84e
-1d46c983fac8c89073669d02af734fbfddec35e195c1444c4ca678835a54b0f3
-f8a0aba3f3b5db7cefb364f491cd80110b6333f061613b5bcb834a3ceb20d95e
-8119457df0838105bc9998b41067b9ce9612825cdf10a56c7b3af464fc4bd133
-a9d9b14bbad06ac3598419ce3537fcb383ce9f650bcec756592bee0205e0ab71
-77b172fc8c15425359e43af5aa75959561e3b0e6ed08ded9da737f3181218d1a
-1be1044211e9d9fc86f23f48ea8dabeae2de9ee4ebca14a734dfffe643c55875
-e934dc377f170ef8fd4e83b1ea53026cf1343dfff18fdf667bfdcf21f82a5a3d
-d40d34e7c3090e76c1dfc01aa0194721d9a0a3783dda58edcdd65a497718a66f
-658a3c0dc104bc44b36a4372794702baadb0f7cb1594598414d5eaf0369405e8
-9726efdc14ce04bfea94bb1935c4d07587400eaa1d565714a33891f3e64c1d25
-fa527eea2ef14dad353c11733d6b0189dbf7c910601528d5bae1f98c01c6a347
-47b9c484e09e03e10e13b5be1d22ab7b8906c5e41a0b2ebacbf640e187468ce8
-af86b096de62d206bbc54492431b8728c55249aa887c01a82219e62e17b62eac
-82a7e09b484eca291295f575593607af6373ad85c692e7130a4b652ae5a706f1
-2457875d6098e477354eb52010424e6ecb1b69447261fd1b1f93e72de04e3f31
-7dd7313d7bcd5afcfff4e0f02f7e2dafe2f476810450fa2cf4daae1f85150f6b
-df4e5e7ca6533523dbe78054c7bdf73b04c4b562fc75fd6f6e2f9285410fb08c
-7bade37df9910ded1d21f0543b24ccf0c1c984a4d7811b8dab97ea56a14e9028
-999c9f71c8ee8fbcf78da616194678da5311ad63acafee762fc268fc2bf79881
-60f1a3a61ec3467956f15085c1808c8187ac5c5cc91b9165bbd978dd45d2c100
-de3fd8533581beb1864ad04e7dd74a016dd77520d2739a1d3e9524c8498bdf6a
-d7e9e0571c5108c7c7870dd240ca2a53e30353d7bf39bf075d3839681c1f8eb4
-b289720980a1d3ee6c5bc7349bfc37345b1ad0d770bb12819d72834cbe2670a2
-7129cb9f51973694153d80309e5a4f6f3a0476025074c15b091989d0976b5e15
-858a83818105b144f5097087f3219bcb26b446b033510a955c891a501983b25a
-d72cbfe682ad3b64c90853163504c4d2872a88ff8db26c3a62ac564d49eaae00
-c7f92cba1712464281b4100725792f62d16981ec1b1ca7a7c82ae9687c326ee6
-36ff55fd3211461deaaff7dff6bc94b248ea50f86a39d5edc51572afecb891d4
-c893dfd74fa47ebbacfb0d4490b5a8c012db8a6aa5f4531250869150c1c25fd9
-2769ee82670d8ea963329d3119005d280dfae888d29494533edb026fe0f11018
-3bf246ec4bd9f5c0de7dd158895ff40b7c2fe9f8cc537d23771cddd1bfdc171b
-72d58e2fe9de17cee61af288318932a6137f976d3804e2fbfcfdbf66bc31f435
-ee1e0dacc8599ef22ec48010d4c79707118da59588bd89557142af786ca66ed0
-a5a2bd6424d137c2352a0fe3ffca8db62656d143093f205c18e8dc761448fec5
-510fd026493991ee9ce12f4b2cecdc157f3bb6bf46509abbdabeaf66703a6a2e
-616d5d15f1145ef8654f810b2e30158cc883f04d31798672421afe80979630da
-fa9c444aa6e4b242c28df13c80d8799b8916c9dad6eeeca41ca24cbe3741de73
-193674f95269bfb2f832513d434c34704365a3aa76d3f6fae51b8d75f4460df2
-95b64bf0668fe311f78177bb0f560dab089ab5a6fd11ee9bd6faac3e6c5ee08f
-79c94b34fe82b1a2561000fde54d3b8fc1fbc7d82392690b2216982e8d9b09cd
-1151a8aae36231d9606f2d737dbf282f4f685698e48698815664d0a4eac63dea
-f0d58ea4edc1ef27ee2f4995e0231c246aaa5e212bad9a4f133f1752140cd8bd
-7e203b235b3f54a74a8c2d8a4106ce38d558d3e9061c34cbbcb5d133820cd5ec
-fc7ad5c83bb1b22781bf049a9381bd3743c6ff79bf98a25fbd361dfb8a7facc1
-708d075739668598c9d0b597a9417849de1e8169df8ba2f2dc6fd57d7d07ed4c
-bf6f64734a56795c6480216208026a24e0272e871a44752e850892e9fe72b22c
-15d83271bc1613cccdf6616838668fa293c564f8dbfabfea0305b7497286fde3
-411e00adaf00fe89f1625c57ac1121927000bf28cf712e55b2a717a4f5d2db33
-c2921df3f6449bfea10d566ffc096450e78807f7611e281693e30463d32b2135
-4d94b8a6d32f158f1053513eea31213d73dedbd3db635e0497bf3ff4876049d2
-922e0bf8a8da35e25d19b6b0ce73eb7da1402b73627e90ba89877bfc16f3166c
-5a458aca38c58e7c652926c6547d018e109c4fc5c9961aefb4607e48b0c89cc5
-b373ad46dacdea10a1d503a7496ada54d41c342c36dfeee1dbbe8e7fc3664460
-6860622ae1c90d5045e3a6eba40df23d4eb867693a5c3d25ea2e1c31d8d9e630
-b22140e1078d577df6cc81b92bebafd700562ed45772247a7edd7fb4b99db8df
-6aa8ab82b059d995474744b7a7bc637a449cd4175d19116cd1e122beda56868b
-f904ab38fe601ee18ac0d56afaca712d10c09763cd21df0b222405160cba40f7
-a1828fae4db2edd32a8e2c5c173434348271dce53562d1c7f96264023f4e54da
-63035f84596d3a2a028b4692ef98b3362258c59996c07b04e83b66d7e5ce103d
-2352d8404e32c8408a5b05cf150f151484d3cd493f2429ca170b555d7d2be9da
-96212b3b60936fa14a71b72359b03bc93d72f9018aab793ea640582b24109e63
-5bae72061eb66bdc9f28a9c6ba27caf470e05e41dee81b43ef660d5baea7463b
-d36c47bf900b78f8053cdc842fa4c642c5e313fefa82c1aed58038df06201027
-79450a5b69923a4057d090544c8b343d45be71ecb3564b5ae59e18685679c804
-3ca2680a60ffb8dea818085870c75b54014fb031764e95b666d6ed70b3711b9a
-012479e72d988d5cd8f8a95c3d923b9ea9717eb15c47885c7cc5ce411d4adbf0
-8cd49e76553efefb04888f85f17e6000c0d1c3a875b54ff0aa1a85bf1ca4dedf
-d0adf53da875eefa66319d47b8b7af2e641dafe9466a8a1ee3f81458359780f8
-4037e4c647a86cc2630a6cb49675ffc1dc97667a589df4e77e3cc5c41215c16d
-43691a68f62e779eb70af689ba7770ce5c2f6e060b35c7289e3fe5369ea79179
-8bc466d7c415a0c68fdccdf5af35776cfc5074a92a8f131b5c2423cdd13315ad
-a0e4969330ca8b505c0d86efcd3cadb7f5c77c2666dd9e89b9b03023e1db13b6
-34d442bcf0e3df94c239e06e9519c70632788c64bc9f4c0d92be238be009cd8f
-c8765e62d5702bd31435c9eaf5f2a04d3e2cff1406337338821096da07740689
-68e4918bd0e5e26d0404e4a8b0169ab68b2980d2eb8a5c1ce0a8c751f5db447a
-b0cb1f731aa4c912ed0e07c3fee570ccc6653b649e6ce447bf2fa355ac39f692
-b54d744d5a6c1c03249e03b298301941d89bf065a2b30a0c3aa993ad18eed0b9
-cd70955aa7aff8003711178da2eadac58cefc9c1e0e4fe7ec10ced8be8e1b40e
-56effc97fcd8c1e68230a111da8d36806ff8c9bac32c879fc461c4cce809c49a
-5c489b352f86456032a19b6bed07c13089bf948d32831f2ed25c587a477f21b8
-ff3bc437460438312fad6141cac9311bf29dd9f221b7a0cf442b48ef64c810db
-82a097530a129f2e087cc45cb96d8e7a9b3e761d3f3ff61f8f84ae47d6a2407c
-c653914a9c1dd0139f299c84f5f964e6266edfeeacabc4f5fb89b9189b119ce5
-7c8ba8709b3f3b73e9e152de57d9be8c3a339ee8ca40c1bedff6008c158d777a
-611b1f2a7e8ab0b52d211d7a8998f6cf2e59d5b6ed0f0ba65985353d2734f025
-11d235720b0860e35cb63b65657f2c002fa54d6ba8054cd94cb450559bf18ff8
-41f886d991d1298cec09ab4bff98440cbc4977521f74c2c1024eb76c6c827b20
-64af83474d982ef71b5b4d10ff5e99f69943d9ac4cad444fe5aef239e51d0bd9
-2bf89b9aa0462413961b459b1d7fe25672cfba44da5d787590db7cf6f41bf8ff
-f568147f252935fe642f45be670a1f5ae82a53d6e850e6a0d7a37efe8b6c3384
-7df10e6dad855b05d8cc56db3d5b457cb44ba2061ed18bcd714b6ae4cfeab6c1
-f44a983d3b09fdbdbcf49ab4d4328aa83bf6d35136cbfbd7d9efb9387bb43859
-82761e4dd9a2e8af77f8f975b08f158dcec98b861a7da0da7b72c54fc7f32ded
-961d8a402150fa9936415195a5d45da466d90bcf96269b77a549c615291b4aa1
-9387d40c6fc1befd017e98de8f8353e8eedd53e13f858f5b428d8d481d43b23a
-34cc07b024e84e56ba46df541baf7ae5444de3aa77a387d27d5149ba0d83a910
-44f1f3692324fb3a7cc2adb22d5063e5bda1979b7cf64e264da24a21c636699f
-57b75385698366c7a44d025c4d96735ea99cc446bb20371b234bbe531aa36e4e
-2d2aadb8e6282fbee95b8b4b71f90f2d7d6d38c9030428b0ff301c8e6620375c
-13828b08801a6099924f114fd3fb26afdba9100caa7796f312e5b98b9057a932
-e5789fd8f710032d29b526c9df47af7023d4acaf512e4b7f4f2d13827e235821
-3c4a8e0224939013a38fc7d73fd599b1a7f2fc9e314118864621981243462328
-61e1c62f8ce1d4ce8473d8dff76600b670e7649fbf8422d09dd79b80526a6284
-e74b3d04f1ffcb2a31bca539a25b64754f893b9ad03d965b5fdab567cd967320
-8a1511b9442f896f0d5d5094649b6296279549ad3699f348796aed2316194404
-e0ddb0d0f89682de1648f4675c2d8db63b68cc653d390fe2333ea0829eedd9c1
-b6f6a945aeb5ae4d7973756eb8297231c9ce5213446345bc133ce5b1470c6b79
-063c8877442e16dbda8de7c5365a9c8a91a8c9c99767d15acbcc2b82e54c8784
-7c93f7a51f91c2dbaf550130ad4dad6896d9c1d905aa7746d7af81b7f22e4e9b
-18db615cf7e7bc813159f5b125fea93787fa42db2b4602432c487bfb49f29d3a
-71ce1ffd9c30206b294f8281f58fbd27218317587316c308ff6f719cc347dca6
-49536a86205c1273edfda12610b212f375b91a841657a3e9b9a359d398edaa43
-f21041a76f2b2249e0f07925a996b24d56bf902cd2e6a2ea2b21c1840c0c1a2f
-85c98789b1438292bc27dca7dfe417258144d267c15b53532e49023d620b4471
-da5f47f99ba092cda984a7b9bd308b65fb0dda4c92cb84fca3e5086df0100ff0
-7a031a99e1b432fdecbdb2136e29faac53425c65cadb7ec198da5cb63f6e652e
-c84866add1b4f754c639ed962928edbfeef1325fb2bd80f8624ebc1465fcd609
-0931ffbedbef0aab40593c54a51d44ad7491e07d443ee0ca86167233de12657a
-34a84d7a96e9b73698356f5b7010eedfd0190287810dfe3bf4b75dd58e98ce98
-d10b180f754b686e8ab4c621e4684b34680d062bb6e93c5676f9637d72520771
-82e1f2d39e889b03785b28928291fb0997a2a859c7e732b27cd15ad1b70fd13f
-9200246496651f4d5580c0372a946a6a272c7eae3b071afca478e5f23e95f950
-f58ac0bdf7dc5e4ef0616bfd8e2b51fd5d2ff5ac5a816c4f79efa4a4435ff54a
-bc65250ec3ba0671ec26fd1179edcbf4198b5dc25434170efae9f03b5e6da69c
-f9d7c08f7aecfb5da7e493708e51339a7ede11d3de96e97300f97b550f84fc78
-175fa0d6ec79c2b29cabba67356f91f43bbc1bb659dac336d54a39eacb36038e
-29f8c412a4b8ba0272c2e0bda184577d41e3e257194925643c04ced8484e7f3a
-899b12a5d50b058f62578cffb5fdd06eaeb05def00d246c2a7233629efe00e24
-1d5a9e8bdb053c506cf1ed8d8305d4ad7bc7575d84fa8cd1c135a6e69ac8da9d
-09b0115a6110c6df36f7bd530e6f01beb2730acffa423c64537f419bfc76e56d
-099a956ee260ec7848be76d4ee19d16eed24b8f0a3d8ce3df142125dd863d00d
-8ec3a0b843378fb2c3ea865cae64914acc78f8951503547690233b4541f3f07f
-a38bfb69c3747cec408346d846d9a94b5e259b51833e258f78b8d56562190a80
-1e649a8ba76fcb180b6c93925e26d258c7c407262739e0252e1c41f4404d4e85
-458d6c0c821b6b5f099628edd92ed5e49ec2e72c3429ab2f3e5745d42d2e2d5a
-8f110fad66cdc39fa4a5cbf520130e2bdc9cae5b182e4d06d4e14caa48f035ea
-f9661ce17cc29d4c91c57d757ee5586400ee768b901c4fa51ce00bcfcfcfc5ce
-1b2c8a7dc2eaa4e4acce7692f00ee06e6f9ecc8be980cbedeeefa1de4571dbf0
-2ce7bd33eda192d31d31befeb2af77c43795fcc79b8d8f6cb0c693d3aa6cf49e
-0f3925aaa9f1173ef04f03d98e712334039fdbdc37308ffce34b411448bdca7d
-cbc32d6da5087c881d55e98f66f4679955b7a93c02f6b2960052319bb62c4063
-865b82366471478fd4f07b44d6443e308f8b2296068e4a32301cffa189a2a287
-74ee405234755f042addeee91b058edc49d37f438bb8693b5c8ec0dc84719b27
-c578b0586ee86290d38c1122da90e89102be47e53ac93f3be3fa55132dda885f
-4bccd87bdc334c32bdeb08933d4a5e6d85fd678f3858cf91f2338207c490c475
-7ce9d56960d5043b8c6b373bee6c0e173e6b3af58578fe6b36679793f07aaf5b
-388c7727d8e04a6f0076eaf9095a3ac2ca87eed2bd7a5c35fb9ef360158b0f64
-48ff114f281f2e8844d0ac1eaf0d3436c5310e6ae25b11e3740cd03ec49fdaab
-a40732a5bbc101b84d70449cb1c8880b0723e07bb2ef63bcc66b95aaaa03ad7e
-c163bb5e98ba3452d5373fc320fb774b13861b72624b46f92178c2d6212fb3e9
-abb7827037747261fbc93521cf1ba38a47a44efdbd6223a0f3f929309cd4e160
-83588b4ac6a9b874aea87a69a8081c5b6fc2f2f70a6b5a086493b644e5ab1d01
-31041fbd60c970f675b13a311e48b86425a83f68087dfe05a6aa22d6238e3e76
-d31d029915bd11d27dfaab5a3ae95e04ca156d2a600166616ebed20132690873
-8fd58eb219a91830624f6c1556436d82ceba3293b1c742f29fc5896fce7d9e54
-e1fa81bbe5b0ab391b73172c7ce9b1bee7b0784cf4495bc6fcb755092a5f2327
-c164e6d783be38ce46375f27afff4ed0878f8eb46634b8f0d84df58a54226d5e
-e4d25edb042bf51bde2ab6c83852c628bc95fb10ffb4cba46678b30f7b108ff9
-3adffe98f6adc255bf4b0d323dbf68fd559caaa55166dfc4f1987508ec46d6c6
-f1db251152af4b9366b559382a3741e8fb0383eea8deeb6b4ee9ac5c9cdad65f
-5996ed7dcc672c41852e9891d25ff257dd49989ed6eda6b3e5f762c930fe6d39
-75b412254c0279ddcd9fc664b9cfebbf06c884986340fdc76c8e4eb560300943
-3d2d96a10f09e80ae7b2eb1f74d82bcc9e16fd11617663768f5f51dc464355ce
-f33d0c912abc567c2d327b0bf95aac49f503927236814663541abb7c689365ce
-75587190537231e16c0d049332d3ce07562cea63b3dc191d68e86824b43887da
-4dbeec79ea7b0089f9bf2e61248ad3d27bb881b704b827e303c21cab98d23447
-dc20818fe8a249bdc03d772aa548f6c75925c74287ca9100e91ac1693d029f7d
-73027e8ae734e354f2828f18a8e87b13d803fa68e6d7c4a79333b21d177c61cc
-6097ca7ccbf700a75ca3b340472daacac6e39be45dd201f4517b22fc0acfd06e
-8920c858542ded1c95590a1b5814103c700c13ac904e7ca36aaea572110080e4
-0057ad118b690e48cb8545bd2eb99b06003c1387354fe3947eb5fbe0244e9350
-e7fa6e8da13b62b862b22fe5a28fb5f933d0d97d0e54d2ea8811762ad02488f6
-163c146a53f8ee78478ffab1b9e123872ee7f50e7f8b124765f3bad9c43b588e
-27c75b8e7ac979e20edfdd2cf68b506baade781facd7c00fe6c967d84c2a8758
-3a44c786038aaac152a10f82d5fcad2fb609f62c24fad60bbe5e8e0d3c3396f6
-3b00be25467570f5595f6dc9e53bd5a437fb7388acef7cfcbc22689149c386e0
-97f429be6c7ba8d70d8548e796192921b764deed94f5d4de9365d3535901aa91
-6081b7b548c3b7555f8936e343eeb062a2596b3065ed42f1489fe03ed0441236
-eda3796353e768a256f7eb8f6f9c05d9f8449bbe0a1d7e99519b7e119ca452ef
-46600b666c010d1f9a2eb21a66cff233852e8fcd21cd475423d32a5ed8f1df40
-e18b1290ffce0fb278066132598133f094b52988a9e3ceff74297f4bd6f8b8dd
-cc069cc7ef14ba3033ac19413afb7676de9a07a2ba70df9c96bd135564e7ffdd
-6ef470d939c5164eebd1d3824401c6e75b1b5695fbff0ecf5056142cc8afe527
-e260e93ce22b5e0098fb54ca8cb1ccb24ba0c4c8ed9ebc172dbb1b5755d34b29
-d175b739f71d3befbd43edd58f0b3b560466348628aeb205a6db30a05da09ed0
-a2a99eb5126257cd30c90758af231106871da538b340e7d6ce24fb0c43397f2c
-9dbc10f18c1839cc15c0e331deec3fceb468a9c6f60c233df45b0c53840dc659
-6a776c43976449b2cbe76e0939f060263cd00b837d21c32e1dd78d1b974fce3b
-e8df3ade9b4be5ee8c02bf10fc08f0148177e4b50bf6f1c98589092d8d9c52f8
-2ed71c6009abfefb3a2976e40e700a02b2d5ea69f59dc6598d46ff6b7e3050b2
-983a3e12acc618b4a2d369151b49cb89ca2bd0b150d6faa0ac681c932a7fef1b
-e77349f948e67596893acf953df11844fa2b074fcc8ef0b37e5d43a9282f3f82
-92436c0508cadf1b59b4e03f778dec524fd6465467ebe7b064ab2ec7f1e24a7d
-20ae5843b6919e1f4bd0215d91ab1ef346fd97fc9e4871ba30f83b06cdfd5180
-79d2926690101525f2361a54983ca427b4a7937b550aa9d3fa3409f6d4087cc3
-3507a7dcc6b5769a8023cc0b790e149494e0b4a62474fcf199f0522d0c0edfd2
-68a3b5b86d600177616323dec75753f4462239d88eb6c44827119de33665e57a
-a7a1f133819dab77d51b264df8b9028651050598ee266a645cf34719989a059b
-5493aa548ac308eb673f9c5edd38fac3997c4f7249f28883d763a6dbe8faaa9f
-ba42981773763490fd6ea356aabc5178f8e97387390910b3310bf74d879a02df
-15ce08929c489e7ab1b7fd5dba4b31f4d10a4d5d860b354549b948179339d08f
-09459bf54e119824e5a856cd287ee1066a69f78e0846fef677dcbe223357861c
-80e5b7f08bff3a08b1d3c18e0fbf66b43adbd1a91e0d609d92636ddc654afd83
-d490b7909b780c130d5ce89818169700a3ea8de81df1ace8a8443b4c365531e6
-ff35353f0923afa95c1c3fd19cdf0b9327ca8708ef9c891c5d5c96ea695d9047
-0ef9b222757d150824fe741bc0f9afa6ff11a882da853c1ef45a7f6936fbb2f6
-6efd8fcb33650ded480ee0d3857581fee0623dcd0207e6e708b19b0b93822994
-0151e373c3d60366d6a1b61f42ad9dafb751e557a7d4488ab09acda685610bdb
-4122e2ae576196f50c38a26a757b2b6e6ebb332a62b98c801fb67bc10a97df07
-f5b6ee43ba7a1c4583439a69b90f160a46f3cd05ee9d58774ccb8f11f8a1bf9f
-736579cf2d3b1ecde9546d86aac7e5a9602bc9cf2cb68dd3264a6b12f5d185bd
-10d2cff08d2ee240c3b2d4ae0d5f93e2dac55b8d3adf1166473119c3ea90cc51
-bb7f28012b48a63ee7acab3e774f043a008666af6d0efe9460c40ad82ff85ab3
-cbc09e4cd5867a52e25b1a72e678ae7cc06f6d8f913ac783749f30dee5feb866
-5ee18012b1c596918a5869a2eca7539063f16bbc2631f4ea99f041fc64b0be69
-82d3761638d1dea2ef828388c0629e3d953ba41816bb171d65e4b99cdb003281
-cd6c9b350577d2a922144402e90d8b2ede231304f055f7db115536c6fccda5ca
-a5f182bfbcb454c4d45dc9754d04a0e881fd03fed5383d8b30e8397fcef19169
-df94e71ba1689f4cf42e60fed255e8f49ab1c90a7148ac377807e088bf4a9110
-afb3a02181f44a7caa8fdc61d2fd78fc18883ef6bf006126737d5889dcba8e99
-7223053cf17a110798b1a1c5f319317ae63f9a6ad23eb6d47d61b34c596e37b9
-c1e107ba5eee08c98af96261458d758b9077c3874a4b7ad2cf2bf1d3a8f7abd2
-9533934e5f6adab0b87b68d953fb98e219f956ceb8f172f03286cb84384e9288
-6166b2b49da6e5696f042bb6006d942e34589984e970c2641b97fa88bc536d40
-5155f236de881c851a52ab869969a377433cafade08178b1d1133891e9df4b21
-f8348e0bba155ed17ed3c26fbbc282aa8c3f27192e1cba91e2c461dfb5a52977
-71874292019b743cbdbf11dd1a6bd6b7c1695f774a34f37748d49aa32b5ecf5a
-8a1a30e329e2ea9eef8f90bfffa68641bd11d749f5ba343cfdb0181a92ac9702
-97725b3968c8cd20a0af360e9b740bcec8644e4e1bab4cd7a3dd1876f09b6af7
-a90fa670a465949784201096eea610fcf2d5c15f57d39642bf0d3b246da6fcf7
-d01da8ce59b4d349ee76e8ae72fe26a170b2b320eb5d0a7d816488e248cc016c
-d9f4af759126fed20f54f6176b44203b3f1c248d9cc0e3c6ce05aeeb2d127183
-e1f89aad8ab25e5660ae88852b0465f2bf00f234aeff78a82abf21b3bd807172
-94760e71a0472d14f9d3445c24b38d72df442b8f78640c55412f21d6b42f7645
-277caed0dd19ffd5941e1a325aad194512d13e144259ae01fea735580c28c4c1
-48ce5ee289d8bc05bbe1323019076da77187d90a35fcc1d0b52e921ebef447c3
-fd0e445d5fc62c809df85bc141fe677098b65d78c29d9f279cab0e7b452d4490
-e93e6c3ce30c84ce73e2c419c91a304d0e265df004b549f73f69995347e3a654
-7e6a0ad2862de39e182bc4e880bf717643165a90b094ab19207369bd92fc3cab
-e1b71c496698044f2f1d2d30248eb0de57281ada534155d6991921fc3442c8e9
-0c77c1b1811bb3ab2bf9045afa0ef9f74f8577e48580eb9840354602b222e9a6
-cc9dc2c70f7c7e7ff18687a420c3f2a46680007c14d75fb701e5b8981f4e4175
-fc81d4286920db1080ad6c8d066ed15881d710952e5bc28c444448aad1df885a
-634ee6bc8ddb52470854ad55958e179f05e61f8151a6fc6311bba2419dd9a122
-93d6e5cf69411520f281b8ea2908ad8f4d774e777a633a8e9aafab363f426b65
-cd8889d109f0c0ef516da05063d1d3256250eed899d6ecbb587c7b2ea943127b
-f76453e581002ac170d6764cf3ef98ca600f07c75e2d124e3faff95fb28e23b2
-3969ed2b48b2be9b9c388660cbef5dd96ca0249dd307bd2044a5acc598aa0bc5
-73a97be07ccf5b6bec78d99b0e97238e550e4c56da12ec2657b6dcc9d9687795
-8411cf3d159f8796f6e9b8ee98daef301c4cd44bdf9da4c6aa6e50ff517dbfc9
-7be31ee0955a1440fe1cf27b6a708022104a9131d6ad031f87143394c7d21655
-2a540ddd9eb2cc438c06c9e38caa404ae87726a1edd9aaefa7e6b269cc543224
-35319eb5556497653b293197f1a5fee96c0c8fd7cefab51a34022eb008dad5ef
-e010fbea98e316dce7b94a9a766c121907be64f3759dee51413669aa882b454d
-51fb13a4b428d61b3506c20d551a6e96c1b538d6f10098abdc6fb8dd739cfe69
-512dce4336bd31eb5a626457ff6c1495200056c716a10c4c8e6cbf24e5a89a91
-a78d31db4b1dd71d65bb978edae1b0821bd3ba879a646c4e41ace1fb44d08e61
-1a9d945397ac69d01e8eb8e75fd60ca662ae1649346031ac32c3cfb352d84419
-52190ff0f58283bbd1bf4cda15bbd219f22e738d2c0a114e3d50f66f9fa5214a
-34dffca2cf6c88883b0e416196e49e45a513994ce8f1abe93591c2b6d67a151c
-820f1c7f4ec6a0531d2d13056f35c2c625044abce5111e3f625c09fa566c52c3
-615e8f83b28506f21ec2a9f0d93fbcccd3a2362ca0612bb8ca2123300786581f
-88f1632c5aa76dcaac69c8f0140b45bb46871caa9ff1c221dcebca18e506ea12
-c8ca217029dce549a4d34a58c3a5333e90286ce87919665657acec87d268c255
-36837e5b6cb6d46367faa2951dfdab709b2d2932f44561f73545c82e85599f5a
-8cd72bad593341e0de99b41b34f3e5f8c1ae749cc7e551f465da293ba7af4973
-35bf4d08a68e7abb0bff04ce36b4571b4212e6b98539da495ed516f0438baf8a
-ce13dcb57eeb473bec625cb3c5bc70ae22067e6f9a8b0f4b4fd231110aaf84c4
-a48559e8303e7016c0d02125d73c690abb75c178855eb2cfe2ededb11e76b06e
-6942a101a031fc5b110576389fbade6619ab0e05e20b8d750af2241619ff8224
-fd1396f44683f3735c0b83f93da04d435aabba9073a7985040bbc0ce5094ab39
-7579d5bf618b518ca8b1c4f9a8856c711aec8ca0609d7d338fc6edeb27fbb400
-db045314795a74317812652d0c1ffb1fcf453d5d769df6b38831c3914aa0d5b9
-ad41e0b7b9da3074043926028a84d1b09f52b619703814911710cd915e3ba310
-d17cd6d1e5bd4b7a9e7e3fa2f9d0dd50f88b50c895f3c7cea1077242cae145b6
-b6311f96996d437e369ee8e46d6680affb65c151541ce5e2eab2c851b693cf8f
-2b304d62d428fee0c99841d4518fe2f67ffd0a26934bc70b2d970e0dcc13892f
-d3b725ef5a946c273da4714ad1b2f4f54f1c257511770cb2bd0c010c3c8b03f6
-3190f52f50bb4db5aa56eacbc174e40452fec845b974920633f2185bb09beb6f
-f7f1be65ec2fef9d10313e6830db245c9c976784acd842f22c9a12d51fa47759
-d9c0db2858e0ac424e923a48e89eb55b4d8ec738caf394d3b4761a1370fa496b
-6d318f951299eccfd3de0b94ac27a952911e165ef590fd2729cc2cd86e0362ff
-f5b51dac1c08519ea8fd5cabcc45d1672f3f04d1e463acf0bf4125434e72cc76
-e900f78a48609069187cc80acb13d0f177b56280d468737cdfc77501bd9b4036
-fb146ec5319f7a3d828d5523ea007c9cd545ca043bc48f174f72bdbbc984b40f
-f6d51401d414fea2bb1ed31761cd919dd49199c0e0d0f1ed1f00e8c3b59659ed
-55a1bcbc97ad9195e1104af67d4ca355c0c37ee8fb6ed7be5f5ff6a68cc2ddec
-49cbbb71871262c4a1a7cfaa39aa6c86002050d91f7cc507715fd6b2d3777d2a
-3b9074928121dca38c6934019d4fb8401c4c2484dd0c0145950067025edaac4c
-67a0d18a77005bf9c9f953e9e55344f449278cd75a65a3b79071f4c3f0431c82
-f9fc739fc4f3e54611bfb7fca635a02492dadaccd7c85d8a4465aeb5285620be
-fc6180d39c44795748f3fa23b9de86a548feb40bd8658b4adaf79ba705edbe4d
-1e5c36ec57d22a9c8d64bbc765b504658c167ca8829e60526239ca6af7624781
-2c3d3b0d06f4a51cc6d8c8edb841bc0a5ed2f1ac4b9fe64e09fa32417817304e
-bc2ab036447956eaf189ec62f0e415f7020da9264ce26c5dbadb6dab9166fdcf
-56e1e323947513da6e14e111996db6f92e93c429cc62d4744f9ea96cc7c55cc8
-f1859730327991842fcc7c2f2fc74895ec3974ae60a1b3345edd7929761b6338
-5450c2927d83993844e156ecf5266e8bc5613bae81fda0a628954e111db74915
-285e808bb8a4660c098b60f251ce38512910d17628131476de7f1ac985ae1fbc
-a382688cad091dde470d6407a0967cdcd26328fa9a28952ba14fc49af8a908ef
-82cd09ef940c6f66076bf67250e40b19a1e9e4f164246f6d1324c702a59c143f
-53a829d967d83e905f49fa3a64a2b72689d35213f3ac78f80ae21fa415f2440c
-4bcaceb6ba89836679103b22bc93a425606d83c43fef202e4d6f20530da1ce81
-2963064da571136d79edefe79ee876a4e01fd64a5466315ecb61832fddcff2c0
-73e6aaed9940bd8d28eb78f75a04dca7235f8794074ccb5b2b8e5099124b91c2
-047aeeb70e8fc5dc8bec6e18376fb7d5546edc7bf20671931dac014c6fdcdb35
-43d15211873ee65f793aeb3291f3e88a603367f5beaa7ee59e862f54add1a819
-1c4b38065adcf525170842879e91529f35bc5f7f78e58f17f870dde83938c149
-b9d15b3e8996fbc2429993e05683a4c7e64f7bbd5a7efc2c9ddee24ba3f329cb
-0a7b32180e73cc1eb891104bc8b0a294816011bee7039c6fcec289e625c725c1
-546ac9b505162aa68156bfbf40720498408809e5312b4fcb1505e42effe3d3a5
-04d792517c2b85388280567a1554181855fa60e250dd91af20b44bc17931fc52
-a88f9a9eb5b8c1823ae73f4a7bffcdbef86288b38efb87dcd76ba02bacbc8349
-3613b0938cd5e98c4f3966339748854ee61bc5592ec209de1759a50663bb3360
-831bbcbe02f72cd061ad784137e2480fe026a9c1130a5a557062d72808530bd4
-0b470f97a025ec3b2789b6274ef44b92f5d7a7f138683cc6dfe03e0cd78f9df6
-5fc8eb68eec6f8528ae8a469cf0521062ab95a4c7997f38969541cdfecc7f89e
-3263cd46c25cf6b7cc64fd20e741017b89d0298e2c55e9b582e6afcdfa1edc1d
-fc65f458a91007254db8a33c38db16db0fb35352d54d9c88d602caca571af64c
-b0ce3b21689d64fa4561dd65be69b6e8fb81d3b2e32f7aba81353cb0f583f90e
-57df42cfe601d5c05df071b49d4bc7a45df5ca2eb8a1b547d8767a1c0263b93b
-e41caa3561b425093e8c8a44034d9553d96fd11e72be93b81b975533b30530f6
-fb7c44a81fc33028d1474d6d04ea1e8863403a4f27da27dbdb37f2af7eaba079
-ac68f395e8237597cd822fed413d10e4bc700e8e3409729b51ec700b17732149
-742fc60c9f5b26b11aaf47d3e80d4c671e5bc0511f8bd6e7dbd28790e622a32d
-15e9cfb4739f4c6d67c8dbee302232a3fc9cda721102dcdda24447202601daf9
-f6c374b9b5d687d06c0755df942e51d5522b896292211705cae907523b9e872a
-04f49baf43d89c3a4a37cddba1d3f20301666f7bc970b72f5cba25029bcbda99
-9afcb5df7a9fca9e11239902bb4b2e4609fc6fed679f9324c16216e4fdce2f3a
-50057b1e73344eb5a8b739788b30d3c4e3ed6336c95c84a2237525c33e59dcd8
-4a08ca60d031829e9bdf9a3ab6dfc6f8bec79e40cac1e69ff6d5d2ccc9c65a38
-bddcc8526320d847d7c6543f29f6f50959efaff66812939136bb69233f36d376
-c01c368e7fc20fe2afd1192229305000ab8c2068d8d2158878144b545c2ae572
-20700483bce6259efaf2cef4706059847bd721da53a0f842011e6ccf8c2c3ff8
-97a477bf6dc659a256cc73f4f3b02f541bffd23439b12520e45e1f731e06af12
-0c93c3b21993d1cfee5ca71eb495e705a830eaab201d4ed332d65661cd38e493
-039f250a3ddaf8c3a88231fb9a92c72e02d50159faeb9aea556c89017a8703f4
-f2bfc73d0a40182597a260cfb29c7cc946780548fa1fbf28d35a93a2393a0793
-1c789d864ef906249c1d36ee78a62512e29a9a3f970f7a1be3e7e566206d07b5
-15135f143706e0b713591524dd318f1b10210cda652d5a6cd43e4e4a1bb0e855
-26157e515df835a962e7fbebc7f51a74d5224d20b5e0472ffb65913d8da5900b
-31d90ca409446da57450fafdda1b5975d898b4ad2cd43b9d0660aa81417d2847
-d4d0cf0c9d73ec645e61f16b80e1506a2d2ab8f87a1ae7617d7fe8e5caba611e
-ba028b2036b33721f78dd420557254b02c071c99fe068be1430a1fc3a29ac15e
-37097bfd6ba1d7f095e98874ba909a6a58a419f82545c65aa70f5f2418fea14b
-1dc7efcb3144c4cf060e6bcf0bb68c3830e09d069e83f830e6e4cabda75e9cb8
-cdbe388b0a7c23f7e62a4990c705ef96fa6d95ecfd38b2575b0be70d0872509d
-d66bf4e2951121cae49c0b21a13685782a2a83a1ec70bc987bb9a0fa8f41b273
-e071a94a9fa55c8cfce83d1c7d9b0549c6227b8f8c0ed03760f5ca091c29a663
-749627d4038021a7c90bedadb4fa40b8548126986369e04f62c1b9c31624ff89
-debef79c9ca9b8ee82c6db65d8a67fd9c6fb4463e956a1d7120a5bf735902327
-6cd611fae157909073a41db7f5586666efea0c0ee7216a8a5699102ecc251f18
-f26c6630cf5273bfc9c1a27e6abc5156231d8879c0d1d767f6c86e7bb09829fb
-6b1434eef852c1c72751010e25f689adadc0e0ec47fb9e4515ee95bb75a77271
-0b13290ca72e10d1ee9ee35e9aecc6f32c83f2b2eb30aaf52d6948bbadef1b58
-7092fede63953a88925df565bbe37456e085bc3c22c2b340d07106ad7b699614
-f7e74dcf82bbba467ee87152378a4ffb6192fedbb103b9abe1d6af8e0b84143f
-f2da81b8bd16f4b9c110602129530d051a23df6d993e5f0251429a9dd8bac65e
-e13e0ad97335e389f3bfff17b562ed1526ed4ba8f1e52450de53dd275acfd050
-dfb13f167c1f18ca022c2b6a74cf496999b02ffc072a6aa998e386cb1418dbbd
-c30ab9ee4cd0ee2f0b4eb816f7cfff1916d0cc8cf278cc8a1ff0501f48a46b6e
-8dea7d7242efa272bc744d96dd89c2814c27417ab2d6ed7b765c02d8b9a1403e
-3ec34f94e6c198994da83a17ebfaff5e310140b44f9496caffedb1640d85d8b5
-d3e2b2b5ce786f6d910da398db88738498eda315c4c84acd1e3534f6612b1c41
-a27fef1368c001a24ec8b5ee18a9e0d84c6d79671cc362b0c89217158b930cbc
-c852b3ba003143a4a945aafa7d9c060c911722bf05018898840e8f72f459ed72
-13d17972624f593de7d4574a1a9c7e2590cf1d17c5e284021472e4c16fe656ff
-e0cca210ea8ef7a64190c489ecc098c09ce5d0fc6700ab2b4ff0d6dab59f37aa
-8962226106bcb7a416c48170e107f5bea3fc9fe680ad4a7858be6f1184bf8521
-4eb16a7549cabdd7fc6dc23c62f3164728dfbadeb65487fd0b979d3ddadfae17
-06cc49f9e781de915ff8d88ae280986549fd6e8e228940aff26e1263879af4d7
-228c6b84de15ce2b2a5ea3d3771bf8e95c04afa2e922582f3b7b4aae3bf322ff
-30a6464cf8c3dbb95a21a4f724c4e59d581a01bd6be1ec8948f82365125cc16f
-3caaecb92d36829d781ecb3b6cc69c70b28912a75010ef84402c6245a9013d0f
-7f24bce18f8d73b5c2ac9e9d91337bdde61801fde21bc848876817d2cdbd500b
-f745bdff95fe3e4e3751b157a590e88ca7cc089ef91d55757792019742bb9cf9
-000b47a1f0d14a1fbb71b8875f7069f246ce622727e771363475a132909f2723
-9d4782bf2bcb24db445a975d7b84c0c0668b0dd8dd990583788bfb5f6a4c853c
-32bfe6ca6718801b712e3eadccbb086a9245fe255413893f64a6a4083586f476
-c66112c90d7f9572e2ad81853e8157af2bdeb4d0945c02c046a1f0309ca2c93c
-fae5dde45a34e2d6e27f28af0a606c854eea86bc0ffdf96c77df1b89b39dcb75
-a49c09b7047689abe355ea5c2db4f5ec9c67451a4a3b7b92ba4a202b96b1f314
-ba8935ee7497f1d4375fe761841bbed442591f8154a5e9a62cc7091d594688f8
-70f11412ae503e594e26b3a55d6ec4f24b4c3697343f22ef816bd8fe8d13acc2
-c7544368358b2dc55ec9312ec58c536793ad6488e7a410427ea80bee493881e5
-273efb06078b999d66884513052db33f5304aa8a5e35f2881c3d7a3400fb6302
-9997a24ae45d0a092bc78d0d005da85969615da06213333c212cc42f4ac43902
-750caf338f4cb0c590c4d5fbc21d676c5b5c39e1cf9139ac9b66272abf97f0c5
-863f4a4be9c213b2b1bd67aa45b917d919ff99748ac72fa997a52d5b5958b38c
-40b3b89322dacb31b2ff49b98c2c6a5bcc5d2e26ecd69659bdb88ffa1e226a74
-d4810d6f0a7602d79992067908c058016b9d0d71c6dbf7bd1d13a2cf2280b7d1
-c5e53ae86e6480fe7fb57efc26de2df4cfb7afbf0a0f6fa6060f0b2a3d1c64c3
-cb9367e1f54d49cb808c1adcfbef9b278095cbbd2d3720f5ded47187106ae1bf
-becc86c6676c98a95eda58cad196e2da2bfbb8f11681ba95207df27dda96d8d4
-9943d4554ab623396c271b4a087a3693cae43f944a00bedc65e2c724cc3eef22
-0289695379b2bbfc594837e20963dfd0cf5dca06d8b2452be1fb37fdec2229bc
-e6928948e26596437978defafaf1020386c1523f047ac699802cd674359b35fe
-9bb4dcd3e2b60b54c70a28a5bb780baeb2a12c5e333fa7315b38eda4d03af438
-ed35fecb6f50f5cdd3b9fc770fb3bd6e3564b49737dfb730fce448a1ab008366
-2ed9113051be9589966ec890c750df83b89f07e95a8d34b9970503336941c35a
-fe2f09432285cedc586d70ce35ef5b6b678c2f20b5011e92d285421272c052e5
-4bac78ffdbfa89d1407572c8595e274244973fc29f3c1e3a85fb63ac3ee099c1
-5cae84c945970fbe4f8513055d5803139b8207687d2aaf9eae9f87f459422bce
-6fa9ac1b6b7cf09b8529b93b31abdd91a44278ee39faf29974f34ee4d787ecd0
-e689b5076c9113e4242c5e62c01a847825e402376465ba14d12477a241779bbe
-659eea57ef267d35ca3c88d34326028bd24747ac2cb6fd04e556a99f0bc44d8c
-35137b165465764bc92c9ccb13f77462fdae83fb68a2b36d70719346f56e79ce
-5271fb10bddd68982938c5a4be1601b16b32af11586fac8299a76d37ed286643
-18c06a87721cbfa8c5507b6b40458afd111e0945077f145cbbd2137ceeeac951
-5295ee98c1747f3209f8ce643017911a30a0d184889104fbfb01f9f1062af6e4
-b05b489302bfb2c8ce55839f7d6186b081e9ace3799cb323894e9d9bb59aaa91
-a7d78afca8aa91952fa5cdd1c76f602c95c31d5f83470c62e4fd90fc59f72b92
-2fb22b1f4414753875674e00ec274551d88a5a15341a2f98ab8bd6555edac3fe
-c5415609051a1c0174e69929fb164223b6cc9171758da0a676a5a95986229dd7
-bbc4f2e3685bad35de0cfe6e42dbc304bd763d8f1fb6557de226e00ce34b6f26
-2f7e621342a34409b3390c4b81c50d1de3ca485e1c56a61d6d13127be952cbb4
-617a079b3137af9e35bf8a65634b212199e232775d98f937d6a8bdf4c8aa233d
-5e598dacab2e87363acf2748ca7670fedb4c7f5ce9dd007a0b786e4619a82cfd
-350ba74410e49e93a15f1046b34c2014022ea2a44c31ca910e7105138c60a289
-a1327aef09a7e4dcd4b63ac29038cf2c57c5440a355446fbae9c90686493f055
-81a1fe20b5a1d9c657ed6c3a0ce0d363c86c5d9bf5a608e148d2e512b9234aad
-295ee956dff7ba58bbb2e2b62bf4d86099c6daceed8859c8f666f758e5533dc9
-63a98e679be18626d5cd0e04f2d92922fd0b1657c57bdd39e85adf80019953f7
-bb5f5c4b7d7b3df072a764e6f1e41ad3ad10d23386ab594cfd17d330c9341e39
-e67ff6cfecd3d7e2d4ba48ffac38572b61bef1f6ee7d631967a357b6299159b9
-a20dfdd3aa5b2b7edb1e686fc8081106912a5524b234b740a627741751ccc556
-ddd0424f5491a7a9101cbb197b99e3e9833790f8a7e65b4086e3f6014f0aa6d1
-424e405a5f75a55bc7d55374fcb4c1f50153f6c3bbae87b0f3af8261bc42f7e2
-48ae94a660db17d3db51527264501e8a5ffd8ce7582c71a0c220573a86181d12
-7346b4c7218a87f9578fba642b365d57cda7aa59a770f402f0c8ee2334360193
-1d519df5ac2e9cba36be0cad1a3817ece63b75eec256d0678799ad0a56f3b56c
-db021b6e8431f840e1a2aa9c898c5ee73cec569a8110878612c459e0356d51e5
-8d132726b2c4ca26209156b91950bd344628d7e6aeb7628ae4154ec8cd1cd6e8
-f77d9ae90930427d682fdf44239c52f43d93a5649ab1a94c8691622057946600
-23767f3b2ac73390eda83db23e6d1f0a3b58f09f7d82221d6ef5835a15644a5f
-6359a98de0acf1b8c06ec0de6d3c91804bb86280e11a982f4f238651e1d42335
-eac6301249802389fd8b45c30056fc29add3c4ec7cb007097799549267a45495
-9b83099d6409ef78d725cff9e13a0d5b13b59cf4f6d6a3b2402a1f80c1e35c19
-c448bc004cdc88cb76867b97b0156b0988a152eecf47b30d473f731df755c8cd
-8693cc86e9f0a1a0dd9dcfbbbc724f521dc300ac50bcd78e181113dcfeb74710
-a70d6e6c9920256d613c6b28b46ab08f82b5af67a4f216ccb31d3cda24d91782
-0e7f45b0a135c50e03fc75e622819aa54c02339474366c07129a5c42f4d8f2a0
-e23a38c34d47cddb09a417f2fb90923cbc508655de01235df27c7eb511aa56c2
-4fcd572512586843ac6a80816816e6dc852a36223bef2299c6a478155776e16b
-90031f71d6b7ae2b7227c5d8bbe57d1af693ccdb8ff883730cade61fde996bc0
-6566259af76a91b9b123665686d660ad9de6b292c5bc47eea9d2ea19a2adb49a
-7a1cb138d99e4473cf1a2c52579ddd41c04d302a9214c5ad7ac412be4794fef4
-15a5e11eeb5a84ec3a2e68811820e084a0256dd625e6f6a61241f8904bfefae0
-899891ffcc05cb11519da935e3b9e692ff22927da8c03efccd2aa9311e014ca7
-548db11e8e8c8c6aa5aa6507c70ffaf846a571e76fe421661dbd503141431262
-fd436c79108d8c7ca8c5eec44fd9eebf54181beed85aeff4e1b6ef6a9769e2f4
-ae97060298f4c7fede54865740cda6cbaf52ceb0c963e935fc894318b997add1
-977b0229fd0eb7d13ddabe457b7aa8a2d05b2b99421e01b4d775cdbcc820b1a8
-3ff39d8a7c4d6e4d96125ae2ad688f997e5f221b6ecc4134ce16f9613881f4d9
-049e171462845117cff0bb70669a62570e7361c5efb8aa5b6b858d8aed27c149
-70155e3406acdc035b1b9d1e49664a75c8d52b2e8777fe77aaa8ced567bbc904
-a44305a7b550
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/UTI_____.pfa b/lib/fonts/UTI_____.pfa
deleted file mode 100644
index de07ce5d4a..0000000000
--- a/lib/fonts/UTI_____.pfa
+++ /dev/null
@@ -1,1165 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-Italic 001.001
-%%CreationDate: Wed Oct 2 18:58:18 1991
-%%VMusage: 34122 41014
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Italic) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -13 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-Italic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36549 def
-/FontBBox{-166 -250 1205 890}readonly def
-currentdict end
-currentfile eexec
-a9994c496574b9cb23f8cbcd64a4a16861c70f0f2da82f0c7b06ceacd6521bb0
-cc26f1cf47836cbab75757d7a81793f43e56cc8f22f926da04d715ab6ff2e257
-5a135dabbaaa58f31f548cbe8a76c69e2402589b9e5e46e757f06bf2eddbbe6e
-e48a624cbe1c4840a338e90f7efbe9f2194aee1c869bc4cd76e2f1937d78e207
-d8149c05b50ef0bb361f5905977c40be7d4dad07b54e087896acda5aa70ab803
-9dfc55a73134c7f1c9be9028d3ec6ccb0fbb8fda52bba4d7551a8124e68481d0
-775ed7f8ec68d8073bfdd3b67f72ec68634ffc57727e16b9aba841546ae54d99
-b60e227682315510edda09bd6ead4d1652f449d737592c44bb178689a3840169
-53d899636686efc6f838b19f966be5f833f5e7d41af38a899df96fdce1ebc116
-9b0ec87c930d9fdcbab7e74880e9693a24de9c67dbb0dd75b3dbd113b079c490
-60018433ccc06ac1df33fc090c4642fd5225fa0a188c131974ca8820319704dd
-14b1719b958779d1475d92e712322eb2e6a79d652c4e3f5833aca3091675fef3
-fde103446e565428267b009d87bb7d6bc40f46b498b19bf1223aba33079e41ba
-a9561254a9df97a48d71015b6a24cf952539f664f172d565f39a55e063154d80
-a960cd56c34011fe26e8849c6677427b2c7e728cd16272363d76661b3ab8bb2c
-85c20b747519a4431421d4c83783feb896c45688ff7f824381cff5654a1bfc68
-6f4894e1d265455fc00064d08c37dc3a47b59a5b2d14dd893a2b871492b07c4a
-591695c8df012ef46a750d6cb7fd86696e7ead280648bd737e9ea490140f3b1b
-1dffab2ff8e085a8b1c78e4b9ae9cee277a29233cec5ab2588d1cdaf4bbb6512
-e1b1476c68fd3db18ecc2536968ebebf4333c2c3709ca354f21fffc38c3858c0
-561378a701158ed0201a3b236ca9cb7f7528d1e5e07a9bfab04f8d0fa3d12405
-5ba2fa9dff76f41b980bfb36e8db1300f7172c902dcb9f5f0bba3cb9c212bf31
-76cb802ddebe556f4610021fa3700d476a2be2a66ae6c658fd0a95bc1b9629ad
-03fe4e775ffdfa9f87a274fd904c0db5beae258f9af213f257db2be0265b964a
-681fc4d2855f5356fc87576d847db274fed9ca5bb4961ffcf53f28b673f50e31
-c3c634604e70fd0895af711c9fa302572eede069f65502f68884a90d9f1ed7f1
-cdd95fc73ca6ae925cce4e01e49934539739f082f0ff1398deafda84c3d9b1e0
-cafdefe5bf321670bfa286078bc066bb1895b1a3f0253abc079b753c8f020fae
-ceb70acca52c4fd011825ba3ab32ce9c7ec263b4828d979b57588c48de210085
-e56eeb002dcecc967c95f219728511ccc6c51817125e1afdd3e4a9b35c8e5551
-06a026900808425393fa10ea4b6f4513f0af047d326d80462d36c2c7d033125c
-ab05bd0d3058b69f11a1d16f23345b3c97e444ffcfb4b3496743d9f6abca53e1
-b702a359cedda4d78e1a771989290f86ceee70502c574d6582a64045acbc33ed
-436871e9beaaefb12174806003037e8616b5f12ff470cc6e08b0af6789b9614e
-6ce98441b72e79b0c613e4a01835cb4d61c9cdecde9a66184af5876f0c6bea8d
-8280472a4c6a2f38fa95b7c475ce75f8acd6850e8e82dcbbbb96e7b389612cfb
-082c280fc4babf5da29e26f1f163d5ce353c9eb61122a10634ca3224261089f5
-e999b1d591d92216afe16a409f7735043885cd0218b4bb7289fb4547fdca93a1
-30280807d3c5fe5abf6d6ce88af04beb42ee031be89efad865f05daadc0ec4f7
-871c1a8d78e51a453a8c4b0ea780268639009c2ed6741fef8c598248ea9a2c5d
-f3ab0401a05b0fc35f66bcd6c812087ac03be6cee22ff97df7152681279de3bc
-be0a5c3574240a561f667c87a9fd065b788c9bf4e38dce8abc94f29acfef1933
-6568527336b48570be215a8ed6c54642ff28aa5edebe0228873c55a65430ff76
-8502e836e97ae8f2f6ac4dc5eee76beba71cb16389399a34535296a0175974a8
-c44918f7c668fcb07a72c0771fa8c49ab7d238611d8c2eb17a2a6f7bdce45b45
-2616dd51ec465225f83e886237b273488f4ec220d1837272df8a504273fdd95d
-ad88d197a3a6e92519eef80d7c18b31df15b9530d96f9982c1f7f870a95272c1
-325b394ec41c9e7fd2f13ce4adda1cc0cca0ad9b068e4d1c92e17d1ebbd4e365
-f7f4a9c547a81470f3ea6386dae456937b302a2e6f9c4553a39ea280895ad232
-57b00bf0b1c9c38746dd5438067ea5ba365b1a4509a29bf938f3c028cd2d0dbe
-441c1e881135b7abd353f1b14f225001812697df59ae92b11a92eb68b41a6e62
-637f097d4b079e266a81e6bc30a69d5741ebc518a6bab96ee0f79b9cdebb1d35
-04f88ac6a46db5e7be43a3c290399f00e2f78da44d348c66d7d12ce239b30dc0
-8f916c875e3e54cef7f5f1b966f606d8fa3e072d4a417b3cbd43bd3b644b2928
-626f29f4d369502b63ff43c7be25193bf11216db04ddc2f39faf825a559576be
-427bdb147daa9d9dc8a9839daba32fbfbc8d9fe41bae9d7b15d8106ae01e2cf0
-d59c6f8c2cf498fe7518fa7b84f38c6f4be7cfcfd0e75908650f52a107ab7d7d
-2bbb6361d5378232b80edb45dfc91750eadad74c9b42a19339d0227d83caaba1
-72a43d3e5c64129284a50ecbc669f29a4d4caf634369d069118fd7a3fe12bfdf
-e202f3376727ae5f1a9340d824dd8b76a517da44eacd882063c8243e121769d2
-809ff04b1e23d34d9ce5f496c7f1926cf1b0930466df9076dcd5b82c97fe1b45
-d1579437aa0820561298a96e22c94befa09929f74c067706594eb37375c136e1
-a9491f80c7a0a0fd447f078898778428309ad92d89cae7f48727d8912deba5f0
-d7b49674111a6033b67c19bb92129b7127d4ce80bce642b1880628df772a87ee
-5b48f395b55aee658c50ab2c81ab7de66eaa52382fadcc60957581a4e09ee989
-331ca245586217a7e6b0f746455c59552906d8a525f5ba5a07cc1df0c45b6ed0
-95230142ee05ec75e12531f65374f78173615c913532a330659b9beaa653eaed
-c0895b65d1a44304e09765cc9e070f61820249b6236194d952103f17799b68e0
-8b447986aea15ecfb780f7717986537516a6ae928648b16a51895f33adc17310
-f0813e7c715368bce559bab6c2292b42198f7f28a2ef66661f70aaad4e5ff132
-07de7de9f1691d5d1235d1e77a71403c2ce61c8f8960c262ea5fdf4e93fe87e3
-b4d7a400080f90a71a8805257c24318563575bedff7ecf2ee53a6ca8a24f8ac6
-e26c70b028f87a1806e63784542067b3d9deb6c96122c644e4052624a9f5e2fd
-c04d4c1d02d39b438097040027c0b7131dd5febaa0f09b767cce35c4e4447387
-567dc3887cbe792114a9a0bbcd01c3aeeb167b5ea4e08f2e04eeb67783669fc5
-16e91b1fd880efd3b1e9c1553a2900b5f1ef5f7b6ac7d3574456eb2fb6494511
-cdf324639998efce019716334e92407673b4ce1d19dd9ff89d301a7954e95b4b
-11e33d64682ee3a8e215ecbb482532e9f0dfa9859b014711a1789d97b8aa0809
-a1338f2de4e58a9c3d727b6efb754806c2cb3698d01ffda6ff4baf277aa570d6
-524ddf0898a02c508bc6684ae45ced430993828c8193cdf0091b2dfd7d811424
-364490b8e607aa52cf695a4179703ca2ea9d0b595770729228f912fd9228360b
-359e298a8845c00bb1fb2aca1abdfc1c570b044bcded5e35986c484f0c84cf37
-6fcccd6374804a3d380b48a6b50506b0f52c51dfa6d49c83c9a2a8bc366137cf
-3840355310b16356606f84b5da7783d2f6d6f46284f63f1ca4bd7672e114eb49
-9a2d80bf132de70d992d326f70a272c64f6264b68aa7722e7a0e400eee21e634
-8fc2524eed6e4df4ae7da2667dca0cc4d79eb78dc7db496a7f54564931434aba
-a06e085a1d1ecd916fca69e8cfbda338b6f873c90f3440ff8c442646dbf337dc
-9631f88f60d4efe91d35df767fa8a0e3c1db3d0053cb419e78453c595d6cb05f
-a4205d1b3334183c34b5bc80a898ed9ab1cc015c65189fd0efebe5aea9c71196
-ae040a0598a301c4aeeef4864e4789b1124dfe3f8e1aaf66a3a510705f6a21a0
-cf0de7e2f9a2b89179cdd4b009b33935b87765f3bab41ab667e39b74c3774edb
-443c772d06d80f7248bb6366d64b1a408044b55f61f641793436d23b35fd55db
-3a8f7d0e99953a6e74338c1d20083b579e534e887994c2080731ef4f9c6cba7d
-5ed6975b583022715232c005033ffb24995ccdffcb1f8655de53044fc3a46950
-694b82f991cdacaef5879fbbbc1ba7de04cab076fdc76b7e75aeb177c61143f2
-4ea610269642f4b1c765063418ebdb6e0fd220f6005ce8223f956d6755b7d145
-e734a947ffebea2904bad11b0fe43beb9baaa38108e475ff79e8ac33bc9d7138
-3feb6e6e7083fed7a31f178ba5b930f47f4c197fe5217f9ae5b64c3ee13ce1ea
-5db10538f5e54aff7b81aaeee741713bd60bffc2c8d3f7361ceacfdcca39882c
-6b0e2217bfe1990908c1c79c59939a2344174f73d069d0bf1279aa30f722691d
-faedace1bdbe056026c8c7970def57b68fb8fc30e7a86d461a2210998c103c6b
-835238192c02ceb0144f2e035fc89f160fb9f14f3a6772b5dcf908244629ef82
-30fd14e830fec7280100b5eda94d83208463e7358028f83fe2605e7dedb85355
-50384276f3b72f5895a6bd4170abd2bf25d6a6d8c165b2ac5620a3417927744c
-2a9798576343f472e6edd840b3082a22cc0efef8f53787167273e0cf926ebee7
-868803e55a266e761dc6ab8f7722efc301fa93ee781e081f4f58e6b6ebad140f
-ab33411eca49b23928a425e4348cf705a1e0f4fdd320025f3c315cf0da1170fe
-1a13ae53d45b712a3370f2e68051c1381311cd34da1096e7cc8d2c8e018bff87
-45621d8452fd40edaadb9e5d4f89d92b51f8ed170dbea911ecd14ac32be75dce
-dac5e26c212d389c94cd67126b98cdfab76600fdd7f36fb51813987daa38bab0
-974d2ff8e114b529a87d187e5d6e782e8f4f5e01342a5d8c95131a799149e496
-9549a3cd70a85c5e69894ea8b544c3df17e4f25d704b96e1ab28aa76babe5b74
-e39b799c88ba47826dd52f55d7840a32481524a5067c247389bd392e80318ae6
-cca790fbfd0d7c6ed9ed7523b80390e2a67d5e11d03cede53ca91580a4f90e83
-17fe325ce9f63b99ba9874c84cf44fd1b87d593bea28b5b674a643753758f9fd
-27aa8213e088f885272f0cdb0792cf315ba0b03ede938756d26a025ce9f682fe
-2c6cfd369314eecb40063f24f365edbeee61d41370bbec9b08665e43857ec274
-6516dc151c4fb114da529efafe44ba73a2675d1d19b1dd9e696c380379df7682
-42de54a93033c757441b7fdfa404678109b0034c4b4777ff05f4badda38c5b88
-d6c1ce1d281521ed0077f1bafd0426e63b522c3ef1eeeec9df67f3bae4bc48e5
-15ba02efc3be471c0ddb42372553ebcb4863d6625245dbb6c0eebb15efdf7e37
-27335a4e3ad99e4f70e57e218e749f30bf9c9a20f172c40f0532dd17d93eaff0
-911ffbee62309b59cc549faf8048f56afbd6936cf686514b16bca3113d17671e
-15731aa12b2ea9c46f887180c3885878a4b59f965f15e1af4cfa20f1d9fd84bf
-7d21d8488356d638867f2ce794c2d1b836bd471bd561daf63e1b427ea3e3c371
-1acd9f55e8fd1d53c279f5c93a2da8a8aa80857f1312d2e9e418ae4440a7c4ad
-6216861f66844f4ff36f5ccf37e96f76706f8dcf7d2a8b6e76a8bdd30d66abe8
-6846fa3b8d5e8c9b516457aec4036b402bffd6913d24cce8714449de2ba50848
-6d3f3fcfc5f81e9f85c99e20cd7551f1f0b63a04b5d8d9734fbbcaf55b44897d
-621b90bb0f3039ef877c04ea5d7c747cdbc9c25b98df15c1ae3946453ba2b8ea
-733dddb19f5a1f3ddcbd8d0c6bfa2e4b914249156d26e0e0bf16a088a9eaa107
-60fcbf45dd8e9d8bd7a837c3e4f840e1d747ec1bd31a82172152819011c53c1c
-7f2ddeecfa67ae102bcd5b12532bf43d6e1b515b27918c89c32d4df49c3afb6e
-3b719f37cf1cc9bd04c45129bde8b221f88e10cef81a75e890543f0a65afb387
-7df9dffbbc8a0bf424628a26a48448e17f180c4dca4c25daab5f4b5fecba8ec6
-24d80359767b2bb4dcc58163295031ff07ffe7b73bd22928f63c62c2e556c419
-c3aa968ba13b7bb559197339835490f2c15d7617578787ceb25e01cf3c7e031b
-607a2397a682db4b4ae408247d00136abd2e631c85653f45c833948b48aac4b9
-ce421dfc528d49cfe98ad6f5bf332ea672288b85520b13efdd67bd326a10e118
-6b9e7026afe8f70aa21888e25b6e28ceea8dbca35e168f23aeb233a18d291a34
-05cf105b4bb6966acf3a2ea3395cf406dc6271a358c3cf51ee3f63949e738c69
-3a2622ee7dd92ed867a3c279aa260499e75ce46503f33c62a85404c6715ee35b
-861357f1e5ad91e1779f474165b3c61b3f5cadb6e38af59fec5eb9fb81773bf9
-83e923c4a9d7aac4c64a4490d575030e5d1d2c788de808e626968374fddb4977
-954430d7513b84f74d7c16755027fe46e5b9ec95cc3913dcc28f8963e90cb00e
-ed7d1af4c8c05c52f4f799aa42dff81ce677d750aeed905ddce7ed886f1e7ca7
-ad587245d7c74f4b9272860b36a76701b184705e7e0225ab64ccdf3aa20f102c
-82ba6d86254808c33fd7205f340622360844e19a937645702c923faa2dbd1218
-ee5a8eafe6e66913d3a895ba65dd825c7dc1b579b0b8f6d4bd47de45e5f922a8
-25b20041f7b8a1a55281f0fc44b149f0e346e0f3e1e8fdf5634eed22537df9eb
-40d8c8bd63d844ba24798ca2060786679aaaf1753f2350f12c3a984628362db7
-f4df3e4ff03f14be6ca123bf8d4bf43817df72c92dcbd6234c0fee3b8bae81b8
-5d7495a6acdff5033bbc102016c267ba56013a739c9ac62dfe9fdafe427d22a7
-1fa02c29744c713dce48b9e52be12797084cc12dc805dda41fd60578a10a9f2f
-0a51b5efa3feb126888d0430649e858dcb9c59a17872602334edce0a92336f99
-250406dedea2e1b1d3f8031b2eca7ae2e96973b852c90b59878faf06286e8dba
-f7b1ff75a5454235035d1d68158585cb5f08aa68b4c5971ff0499f0a3f491d41
-8e2ed07b0cdfba8001740ae437674704ab6378f650d84b6b562bf346d5b3a338
-e21fbe69d330a12d69703a6625fc77e4eeed50c3eed7db53553e1183258cb374
-25c209961144262d9145735df60c1e3cee6c21ea9667d328aa6424dc1d0d4c31
-bdfb91c001b3b9c30e6343bc3e6af5148ef219e48e9c49e2d9f8818b86e13ec1
-ef1ba0e04c9a93b509972038925babe2964cc034d5947c9f8232fa9a40999fbc
-b26adb0ad1a69e25c896c97307ff214ff08b76427f982d0eb9eedd8cf2126219
-9758b2b07735c086e9a6dd43b4094d320379b3ef0c20bb9fcb691a6fb40b9c25
-9612905890f8fbbe837b1edac168764ae7721a97d9e0ef67424d2fd6166951f8
-00097747f5db43cd16c8f0a5e2041366bbfec05cf950876f7e4462c4231f83f4
-3f14e61553b99ebfa7ad033f51ecf10ad964d71c18b90e360e208ee79f86b722
-d6f062498e4294ec0991b318d18270374de5212418f54a5a1700a19b23a31dc7
-b1c4bf77bb4c4fb26d219d87c7c0ac10a88f65bf5cbb122cc250035499ebd3be
-7b839f311cb67349e68cacdefcaf9970b1e22a120ba90bdec02374a7fb96b232
-08619b8a9cb59e86fffb65f1f0cb64579de0cc5b4a1d428c0c4f4b46ce3ea0c0
-3a4c815b2d210e3ee18f1c5cef74ec07c3415f2dee72c7511cb479e78d3a0d96
-aa7f15360ae7455210f4528a18d74863516b1c688ce1e539306e260fcc203e9b
-5af0c06c3c04fade53ed1009672d75ddbf3358396868c2225e9460590590a37a
-d9b361c5872562a91042a635d8531a62088d1341f9519903f98e339a196c4e2c
-8e6ed843cd24fdbeb101f09bc4516a7cfc4554320a9318f10448fb9d10c45939
-050a55114e979f4cd9473af6254311e3f50d619d9f304df427ad53ffddfad0c2
-f849b4ea37eaf66005afa5269d435d1b3362553043e98eb631d8b4e820e9571f
-88ac251d767e3e92666f3c0aad0f5a5901dd5f0a72a44ca5f957b40bc29541ef
-5c28f10e36b8102e5038c96ca8a7cac9698d6f8fcbb82bc413d364e3bedde064
-a77e2347719c840ee53489d836646e8fd4ac6019d00a045157bf223f32f0e68d
-379965445dc50bb7b2c223f2aa12fffb8858197093319a10d3203038f4e16c04
-c62294d51a206da6ce0ba74e5b204656bc172c22cc2404f882e91ad157bf4dcb
-dd619aeb837e0bf53c4328e57e5be92943a9dc6f2c5664255d7872c976386c42
-5235e3ee2671789c3c32b7d5e7fee0262a43cde4d3bb98d2aab133429ae002f3
-b71c2b3688d9297cef802a2330b12b1e03989fc8b9d1dbc91a7bdaba94703525
-4efd991952a2be03e1147e9b5ca770638a5778a7a141a705ae4ce474000033f9
-e1ba21d948c4b016162cfff6bca97a7f8f81cc2c22f8011b0cb74e4c7c92ac80
-c7c53ee9c0520d2c7a5dc97a78fe15cee47994362c65210336de52f9841b8d09
-4be1aaa04e39d7f66d0c4d01eaf270e26eb38e09c8b303816c34ffb8cfda9f41
-c03d95d95688a154c087930ede2dfa63ed8f228e3917dcc8722d1f8636305073
-31d43ea9b53230b0d0797013e7604b528215f1a128cdbb26b0cc3fa43e3fe25c
-b57c9bf8f8e290586e27924cd20025c54d6d8792b4fa52450684c8d0e131aa49
-2ab0a4fec2d0f91f4b81d74153b5e2e9bcca216c1b49bcff347c57a727202068
-0e040eb5d5e2479209d7e085760a7604544f0e1b541bbc73431ebd722806cc24
-505dbef65e4ca3457d0587c4d4fccaf7f14c31b5cf62ae5f0c08661c9f5cb386
-ec057c82dedeedd54c8f380320831f2d6d9094a5d0075a0c5c203be292231353
-3aab44061f0c75483c8c90ddfe2de61eebaa5c23f3c1e14bead51e741963e5c9
-393e8c906adce443244f5fd6ad7ab164ee9a217e609fcf90e5b8157d27623d62
-a803207d9839752a19da399e82082ded26d15088bc3623923fe5d5bcdc2bec1c
-639e190dcf9181e90ddd7a07c773e6a0511f1e268acf8d1a0d985abab4c95363
-c88093bb9f111cd66e7b7d8cd8eca3407fdd45d01d566944abbfb99bbcd5602b
-dc8e250247dd7a37f4389e94c1342b5e6ccd99ac4d62595b91b15462dbad20b6
-5bf5fd83a8d8864cc9e75f018caba8d7feb8dbe58766dc0a06405ba89e39a6dc
-a302161f88b641a7427aa926d438cff5b5e463309a6cd2abfea827a512d03128
-ec1f323c8a92929a4a6f63c798fe0b73fe59ebcbb1e4614c2d3ea0ce81cf5cc8
-8a6d82334df23cc978d9a97930cee6f567067f7c3877cd46b672d116805b1543
-4a019e47fea549f9942732bd1537c24fdc2f1b0780f7c9b3ef7e846906abd277
-82e21a4a8456cd0a880174efbec65e6eb267a94a9e0bb6bdb6c1c4998d7523ff
-eca5ed22cd608abad4f8570d80ff8cb65bca81b09536ae22a0925ec620cfb875
-70ac3a8e19abf258af93113ffc08aa07f0ef6d751440d874b3631f8a4bbd7721
-9a796911b9dbc0b2e1fc5768d40cb8dbcd38ee9f970c35bbef52deec4582d18e
-17a184203a891ef39fc8d56c29ed3b9010bf9092c8afc63f072c6ae93eeb9342
-6647475cb38c7a634dae53b14995468e4e39464ad9829b48c97e78c580ac32ae
-b2f5631d37bda7f69936d4cfe342279eddc7ce5262969c87e74ec6c4728c82bb
-eff94703031bb14d7743d97690d7a2ff863904ebcd94d1a2fd7270343f38355b
-ad318250da6b388c644a9f62bf59482d7a7161f5d3b65ad5b41005bcced2c16b
-c60f81fb3b013544a32c81c2f455f34cdc12e195fb29631b613d0db8fe3b4957
-a49b3e0382b3ca954a0c135e19cb83b7e29c7904b5852641bb08cee1bdba5a09
-f1f03521a866d99a6b5e670351b73cfb453263adf92a8677de8067ff52ee5a63
-e9ba822e8a11dcbbfa745caf433ef673fbd0e6c7d28f9d3260e2b2d75b888181
-3662efea0548a4f4c2ea1031376182e12b36987f2afbdf205af3229b7e87b20b
-6b334fe8615d13b3c640d25b5c822a2270111d964e4cff01f36d2df200f41872
-29389c1482c576422c158fbf2405e3dc0d87d76237f6666e6e89c46b83289a9a
-718686fe767577688e8524474e522ba5fe3f6222ae659a12855b295d408b7da0
-042c02087ffab03b422ba9b4bac8c39d08605624026e355fe62328d4df8c5d9a
-63e3118bdd69a142412d43f20d23d990ccb50ef669a76a9fc3924a64fbd9bb39
-fda7015bd5b56d3402151be6c4240dd647138bce226f7ebb9b723b3b3e6b3b27
-4da0d1245dfe453bd9ea5fcd36eed1c09e800b20eb206e3f1782d70c67a82d88
-10451c2cdf052ef603a41d50b90dfa15a5e967c6ae7b505b1136fabc9898c004
-5c1043754b8bd712703233855db0895697dbfcec02ef25092d073f37f8f86fd5
-e647c80b0af65453bdd645f92209412ffdf14cb48b7daa02781bc981d89e075b
-39c7e8251d2d384835691f495b3d5a43557f1dff58b935246c2c0b715b40d4b7
-ed7386bcdf5be2beecdbb223dbf57c9a06864f399d4748c11b89760579f1e420
-a4e8c67241a8348ef3bd04634b9e69d5dc5015f89b10f7580a008e5dd424ffed
-60f14a39a759a0c05e4bc3b1e344feaf613be4e1007f5535a7850832760b84d7
-3391a60001d472449b3e4920f46186d0fb8c8a1b96165e2f463e39e289274985
-e4062504ce4ce8b24764d050c371e6545c3aaad645242e39876fa2d8c8fa931f
-73d56e5206d47649cbeae14ef3187d43f6a3bf48bad527f6c01c8b1287edefa1
-1016690d1f50d310d463f9636d6f8514a60337fce30e6d72ddd2f381bf2bbecd
-d416f7ad7338fd928296aeb8c58c33e08737974840b690f1e8d6c46928fddf4d
-65c07eb4cde5f6b5dedab807a67ee995fdef7e7fcb285ea981e0877da1b8bc42
-fc201fe269c44a48be11a5ee8a365b50760c477e51005db9fde781c080f8ab14
-44181e4a0bc80741530370fc987e7eed25cd1b2de3bd5c53e0cffd67f24f9e2a
-82fc866abac0d9e690a0075cb623a625ec6154da7bc0c36431f20fe0a8df2fe0
-50cdb6c3d767b5f640833e7ff56016665ab4d42f28853f5bc2726de5a7372ed4
-8666c51df290f796fb129d441bff05f661a123dad14e5b8bd3839f0de22e44ad
-77cc296603290f731b23a695b45f5b930a8d6d3c6783466226fa0a20ff0ac7c9
-f63eea109a17da0ddf5e1356e23c37528776ebda66b0a5ab37b7aaac291eae01
-aadf7c555a4fb77722c0a527b5a711188e28944494ac58f58c6dab6df90971f9
-9ed636c4eba0dbcad659aafc776c3efff28a7d28da972a8bc5d8eeef3b7bdcbb
-8de66ae1d2fa6ec3eb33c37e632118bbc8dda3bfa80da3b7a2770908fc4575ff
-de9b1db2fa31637a13f8b97e73a55f7a975fc836eead6dad2453aa31d00447d5
-6350145197d430f8e6af1246a7d605e7df7a5ff4fb58e8241469481bf48b8436
-31acf36fd14a7de24d3a90d681246d5bd65d31dcb7795f2c9f6dd3f04ad330ab
-37636fb9da5f27693b7613cb6268d36cbe13f628cbbd5257f2644b9be91b69f7
-2403f914beb707992fcc653b96fe7b23eacc1f46c325bf02427894a28ea28e74
-482a2585f57f4cca2a49fc473b73b2cc47ebe014e78f9dd868dd4c63923f660a
-0d465c1053e7a6dd9138ddead25cdfe5f3a211d6f06e2c19453b405173a814a7
-5017f34fb8504208864db35ea2406c19d989e65e5417105ddd09fe62ddce224a
-daffb81a19999b0459da464d3d10492b62c12d085f4381fb91b597f218b7fc1e
-c0418a9292c6d2fb2cca2786b1b9a5cbd5edef092b5a3afa05d09e6e59a70f02
-1346ef208122d8c8f6bd2da33609aee5917f0c92fbc0941dff2cb3df9feef235
-4efa7155231d3403ce8211ca2786915280811d9dc9275456e491331899265c69
-8b3698810effb9e6e6fc2f5b1daa88e0740f8195cc8de64711be512f43128d28
-58f130156cc2bf774075a2b0bd3a0fec0729494003d58fdde93a2fddb529803c
-76834d20a2f0654a56d1cb58ec344aeac5bb976c694fbb328a3cf9c355a5ccfa
-3de62645b792d17c86e64a14465c5d29686a03037abb8eddebf2c55c94e4d984
-713982f983d942b390674695a46485ee6eac26cf864348762b018ce478fcf5e1
-c434b8a26187f6707c6963a933c1e7e5addb9dca4d5e9f5ea43a40c43d068b87
-f3d8bd0324f2d10f52d92da826ad20917b039076bafd236881654a5abbae112c
-7fcb2bd027c96d69fa1224a8108d1b7caa4d4b03f813d461157a7b5956be1296
-d929e3e3e5249cded2fe79950e619b47b99cfcf0ce26e6c5135ef0d5a05662d9
-24d57e0be99056aea4094b3894b644585ecc7a6f016df96ce3fc1ae75635ec2a
-2761bf9402fa697a76e326afb8d7ae5f7d375d260ce60143a38913a4e085381f
-ae19ced0d207c80cfd0da23b999fa947408f31c00ed5046f48187ffa4a9dc8ee
-1e410719a9e1fa29f15ab776e8013158bef0615e6960273646af89da0fa935c1
-8a7a1b67df2b0fd72b42cf02c5e916b0761e89550303ff45560bcb350b7e9ac8
-0422c68d1e34211212999f5a99800c7b103afdd7c8c5e32ce86d906031418297
-415ecd921c44e3d65759bfbecdc688167896374b5cd91a64cf08e3c224b9f22b
-06d26bd1bb52679fb75e2489027a7cf868ce7fec588def5493f6570d2340a2d7
-61a6272402e9d29d02546929d02ec741a4f54c94a25ac1dc87b8f2087e4d9275
-32d6afc9597fa33166e593112001404b15e1691f002afaa8a4fe0fd803adaab4
-ba64ffbefea2acdb3059dd040b2305997fe7a6fd78db6e47e385af2cfa834af9
-3cff1bd3773d6b6d2f303ef4950825d6c3768532ba44a111af37f8b632cca18e
-7325171953b66ec7ad79eff3b69219cb31201f5bdd8da70a8bac1df11ca37519
-5658f07151fdecba4c1e14c375de60affcee4998a0a377587f54271bedd8b226
-ab3c9b3638b4e1f4b633120aef8e4a2989e2925cc84c7281674e7089b71bcd8f
-da8d1a26cc2181ba716d80be532578d6798584c364f9220f1725670c78007454
-0ece6487869cecd8e66f8adfefcf23cfc5fb8f1ce23a5e1e7159493a78742f05
-660bb55526f65f17eb255e84cf0a5c0b6b98f1d54d7fd00c1f8236c60c596f6c
-28c7adc584b38671839b5847e37a7017f4f7857e31c3108cac29640fe9cc2ddc
-9165273404769a556bd04c3bf5f9d76627603543947cf885de71f44c65760076
-a889b5b2d3511219936476ffd38e2d5e86fdeafaa17dd36436ea3dd6914e812f
-b1d5d0333a7ebbcf6e908d334ec8dd335357546e241e6f3064251323b2fd746e
-54d67d5e2d5b425cbdf89105b0c19ab4cea931a557f2d7d488009fa8685a1c78
-57f58bf6f62a8c71eae1b8944d78df9897dde68b628df2706d7aadbeb2d4a4b7
-561810d4f7e1988262f7460684575b38f13c4680c3dc254c7ad5bf5bf200950d
-857556ee412c33b42820f740ad368a8392ad0605f16692e2c06b78ed542729e6
-d399a052823686f83e8c3f0e0befd2e7405c52e1d083c13e9283b50b4a834249
-6214238f65e52491566c183d5ff36711e6a99eb49f5518efdae0743467dcc32e
-4d4c92ff8de5f8c649152d48106228117f5c160fc8bd2c69b1dd365337722742
-2c59cd0589bf70287b487799df5e698698f4ff13bf4618c63c2b0e000e57aad3
-dae45bdae9bbb459fd55584839dd185f48a75687a8192f3a63d2280648e9322b
-02b9625144e67c6080f0eebb7c741968736caaafc151c4a9a1c1395f31b61ca9
-004eb39a789a9ffc247a249991106df6e1c52e40e4533f0fb6087a59080bf55b
-f197ae35804870900129d9a941004273ca0065c42ecec8cb517609d01405ef3d
-b500f09d410e230f680e12e5cd607cc0d1edc63e1845fd1bf3d9ba07e1b7a5c2
-eb0accd178e1c0178ef55eceba43a30599a0477fa4f8ca397b69ae64f6b6310d
-9fdb875a00545daa9f0dfc0ff9fa355a9ad4b08d08ca7bece29a5d3a325c1463
-8f38dfe12ccd5c942a5aca6414a7b04c698c9adae4d8d43732e41dc0f04da349
-8bdf6b9f3a58296957d88f217d5c46f45c7c3a433ff9c355a5ccfa3de6553bae
-ddc411e40b9f5e95cd6e9f62dae79353c5e1b874f6677bc593d2a2a07b1c3b20
-9596abb07ee8f71212674a53b3a604f5af5449dbcef830433acdcf845e44d879
-fc619fe992d5f6ea9b0cddfc24fe223e7a357cb0d5771cbd12bf50851f400b49
-9e55a3efcdae3b6d6cfb72ca9e96f9355234ea284bf70abc81d29bfc928dac80
-5eaca5ca15e3b8303bd3710a1eba32e3c13ef7641c7637afb5cef5dc59902e6b
-aff4c7ce9fae89977d96691d306dfb9a54bd8b9cb8484ae4b50f7e2ae5ade3a2
-9076c21e036a78c3d78918c529b3eafbcffa7c842dc917f162fe68179bb45b4a
-75ccb684f7c4b5a6d5db3cc876537e4b643e447dc64bb76d9e74a3d378517880
-9896262b00893cd7474bb605994df0ee028f4a703b4ac00ec95dc3ccb3342835
-418a5a158b4e6072a657a7e3d2728c0f64242be6fbcdf27d5093139fd7bc95d9
-89320f2ac958c06cec8fdcf56596bbb45b18abf2c6b5b891236063441ba7331d
-613c0f1de49f50a839bceeee1f2ea065fa879f50918c6a3280bd7bbf1e366e27
-4d5e9e0a6bda5a8768f72b811252f40704a1190b5887bc5c586b1704ff1f7d4b
-a8ea68ab335a506771a681f80dde3b8aa04ee1bd6cf881217b829942d0282c3b
-e262314736557d8a43e8686f3280d4c9aeb9fd78262834ea5569a233d459abf4
-5e50d17d666d3e9caefe4f8d74710aaf2497a405d73fca9e107a922d0a9eea59
-6de7f71ef541a0a5b141f786dfdd1861f81651f540f82505b3fe83aa32067db1
-13812fa761a7f3b28342bf1ef531746b033232fbd06a12a0b80a9e23571fc1d2
-184a850fcceb331ff7076d3a03e8ed50991837925efc91e1ca33491b36cb1aff
-2c1c58338fccc4a9f0e298e781afb718990cb9eb141c6ebbebc79e437b52a17b
-0b4a8cfd0da2f9401ce9370a1ef04986793a67fea0fc96d8eb325cf73ae51c14
-c5030d9a8340b8b33986ccc325f93903c0928af3fb3766c8428fa690cda94c97
-939fd8df41abc0652e0ca8e82e048b133aba600278e3a227c4eaf8b557856ff9
-e6d2fb6671ba75b779e90f2bee7e349ec394ac76e16c73509b5e99d44fa10636
-ac63f8d546d5eba3c6bca7b738d4338134d2b79dd8436932d6ee22e2183a5c07
-a72f4742edfc2ed11145fcf8a9bb54313894709b28d214fffcc4b917e0c389b2
-590ef307e3ebbf0e42570de893328dcfe81e7edebf72b88ff1a557e2f038ef1f
-8c25c68dd7c037226f7dbab36cf73ee00b92ba6efdbf9a9e0f4a7a91853394b2
-a02077209350a2b61d4771f338e739c5382c07e18386e398b2946ade4c3f0a44
-ff6f333d550ea7db004654aad32542571febf3c31271cc5d167976c6407c7570
-115bfb3f838701b58b320496c39c59553b33fdd7fcf135bf4d849b130fa58739
-6a983a93344bfd37afdb01b18232af9f65d5e3f5131bdc40063d7916a2b67ade
-09e2fed7968e96c6ffdb6b41b0a7bb6b8e93c2ac4f1b466f16e219321c9ad83a
-8027101b3d007ed0e43594efafac9dc0e4764477f6328ef0936444bbb4fd20e4
-2ae35cc3090ea9ea8ffc5a85236a4597f661568964f6a839650470f79eac69ab
-e1794cc369c4183f66715746b9abff4c151ab6f06be72ae63f41f5f806b3fa05
-eee4f22990464b7e4950f5654b36b7e3158a7b4ecd4fc7d5600c831ea7521df8
-e61c5f5a3942eeb82e06477461ddbbbc9551ed095d78309f0dc9465f88e70fdd
-7cf599e493318efbb07aef45a81f2d36111838a736b422891c562c933005dc2f
-99a44557c978e4d9da41d3e2c3820e4a40fe28a8c268cb593960058f0fec18bd
-c23102a74807835b1244daf8bb9a7553961977ea5a7d0e8a59f58b868c9daf82
-5c4cca4d84f4f37484b6bf8c1da54c5e089d3cb47377a99eba19e3e81a13d2f0
-59c22952aad0fa4f3a4d82478a06a1913b8f2dd141e776fdd43d76fc9d28fb93
-d198f84310f271baaae7e44752a4f8fd1ab089d3555f9d7083999bdedafca730
-50598a2b85541f071716d335c793b55b007392a1f757469aae1436de65d00f07
-66e196c47010731b77aa457876cb8994b97e20991af4e7b47bdf752f59c7e6c1
-27f3043e2b06dead3d6fd024aeb2413d1dc2ac897aec8c2a97c848d09b102982
-06f2dc08f0f0ea755c68a0aa8062521d34f16beaf87d359db9cc79faabc3d256
-3cae31022f3d4ae7dbda58194866a7a29dd34f17a4d9b7f7987e01a6db74bf0c
-5e0c53bd07af310a2756f22c1cb9bf2a0e1a57aba6753d037887c4b65a661f70
-b2d10fad50c5ffd365d3778295d880f498ff4950257e5ce855161796989611b3
-e793c99f4e12e947b51643fa80b129c6664b283c100b5694d2d8bf60a3213157
-a17b72080842b4ee055d0860a801d930d63e5354f599854b5a142f11f6b78717
-8897d66f3f6a3ff20029ed1870d538076c1d4fa4ece214b0075ada5cbd5f4087
-8975b21a79d8a67be6d73f8777ba26c18ae3b8613387b25f43beda7a2c9f6692
-667015b80847d0759ccf2ef45aeb00a02d63f630dc6823d5f61e91b410fcbba3
-677470b440063d43bf734b16ab45a42b698037ca3cc5b460b563467d9b6f9453
-d31b47822f6fc7fa1604e77d00ab1f172bf8f4cd9bde3635703a4166293494b4
-37f032570a165604cf5b8b153da54077095196e55252dfccd90a8ebc09bb7f45
-ada3560fd014a844b2d9bae654a533733ca8ae359bd7537c60b52997e10ef2e6
-f9a2210dc484431af83a956af66f06646d918d2832ecd425ff9cd8e9268557c9
-efc84868728aff4d8174e6f85135c11a6968b13f7d8346334dba97a1a3f0990c
-d1d2bac3aa8a5c294e4d0d67e893a609189383a24cd3bf86c22720d320d59a6b
-5e543b799bb5d45fa9826b832a809026d104293f363200780278d973c9c63492
-8576754d19d28c0e4058684cd1a71a919e5814346bd40fc15eeca1591e0a709f
-f083b86841f04cdf8aadaedd95f26fb807bd09886a011443d410466fc6bbc56f
-95468646ababaf39887f25e485776892c89a6cb7bf5d20b6c4e8a0bd65c5de90
-7a988a3e2e39aa721dd03ca69608d59cc1e8a1d2ea706b0426622e4dc6c94013
-3f979e5d141f06fd2051a54d84fdd4c7170a44f81ac786d258f98893bb4559c6
-ac59332f599dbf644367e28fcf01da3e8f33b14f8f83052d9c0af2061465b059
-5a923f4567274cefb60341ba793ec77e5d8c7f96bb88b63591d8cbeda48642dd
-c631a115cba7694f64506c787271a8c9cee064d9af1ab39cd121f7a1ff1c812c
-903aed1a0d13791c051ae21ba92b5db47e72e7d6001fb31535a385202edd815a
-40bcb9937ef719f7cd20e30fda23fd356476d22ed6c206f15cb2a78fdb45389b
-6cfa3cc388cddb82886b8eedbd9447a48844921a51d4cb19921c3d42e58c0173
-5189ba388aa32ac9b75b5ab43e428b20957bf253a117efbdc6d9dc0931099af7
-eb10790dbb14844be86d80c5e1ae17d0fa0f73703f180effa98dc52c5a8a9740
-869fa97d0bce9fb59b36a960315cc1d7264f5fe730a397c6ee121021a3c82cf4
-bcd40e844b78f99ac28c27d9c4f4c90cfe0062736be1bd39d45592020daf0b9d
-91efd616232a6aed299c9a01388e0460b46ec288d4e1cc5b08769ac88002094c
-9b680abb4d3e0823b0832d0d60d08dd7e1a27531803b26f74966f6f4fa2f4117
-2048782c3e3ea7744dc52e7113d3e290d309881514fb40773b1ec9bd7932f7b7
-42c3a3dd44ad5207b89125d7a11aed1a249863a6e537c887b00161ffae6817d6
-269d93d4752375c48ad0a598d2486f1a173bc55562bc889eee0afac3a4b12fd5
-cc2a57080eb6e3880e1e2930fbbf7e6629c428a1025966b47ddba3d48874e8b4
-ac01d33158f31760d82a88ee60be24a62fb5ad9f24254e2198d968255d79e4df
-206d37d52891300c669855a59e666dbb4676c4ec6fa988d6378ce4d00892c711
-3fec62c89dac139cc2b77a954f6fe953064c52a9345df309d8baabbeb1cb7910
-5aecc2f99b451c1b028a81d62927e2c932805d38cc8ab7aff70fc84f944d3fe5
-12694fe2dc46e548177bb78e4a51ad574c30f29145be59a24faadf91d34e9750
-1b1bba9cd1563e7e339e9d8795a3cf887053f1ee7062fe98bbc2257e8a6a964c
-d8542df1129217515f38beee762ca45f9ac85c4497afc6b7200c540287d85c40
-7dd6cac0ae86a4d324d1b3fd2f249d3613772ab3362840a78ee8633b3f89b46e
-b6749c008a46eca09c3ac738011772215d2e61e59e2b35b0d9bd012378c2e8f9
-7a58b7febc683901bf086f32282a9e539f2816acd16d5b5a0d7c26372e1b7ecd
-d64464cbc518da0ab436329afd5f6e12d0ada7cb9bd84cd2b6eeadc4b966e2d1
-33dbfa0ebef84b45019f47c668325dd037f85dbca5fbcc54ef9aa710d998f3cc
-df1e64c0809bcf0386de718201cb3c474fb5ce9cb8054ad3394bb6626f7eef64
-f60626142f6939666fcefbc920932d389770acb70180dae25a1e06fd6be4f45a
-07e382d0c055447a99dd7e0952f24e89401a1c15a277d02dfb6d31f41ebcb754
-2f4f608640ef289ce4147dc1cab77ce02b1823a87bd46f0c00cefe0191d68573
-6af019569e89ab388d3d770af3f61546fe350adac3337713bbc091318cf92de1
-7b61ccda6e28c314cd2d6a27e758e48dd6038fb55c6841dcede725a1a30d5fda
-87a37ce7461be94135e94dc72c976fc326a32194046979c351a53fb544d1ea5c
-dc87382f3e020e019e03ab3ae26eaa4e64256cd32aa1eac38539d04ae425e1cd
-e4548d0c352b680b4922b6b407856f1ebf6f3ea6ae68eb941d914d50642dbf74
-fa2a8df6b682e0d53f3b21ffa7225b105e359f49488183dc94cdaf1d7aa849d8
-88849fbd3bf680dd02198a557e768668eb2fbbfa23cf3af7bcd76940e1329b04
-bea1e1da8d71850e11eed811616410e2f7db0557aad2d531e1d3af851329a38e
-96b192d5ab246fb72788f99e07d22f9bf6c35bd15036db0fe66364654ca2c34d
-4aa14542eab8d979311725ae045f9af9790b26f13d0e447b3f58a8b817eaf26e
-f9ac8938054c130583237c616a5f3be196c9252a0621cd35183ffa748b0c4e23
-869a58dc345282066b213b441823389934fea2e40aba453edbb936ef4695b6ca
-5734f49bf4c21f0c66287df7cd723cd1d0e6d1ef02514a89a0360d6630f41781
-e06d5d12f793d64c257de894f58a074c06e4e18a5991b46af372e7c1065a9132
-f88a83fdb08a4a54b50d4218785e15b6a86d90b7ed621302558b510c0c205100
-44c2ff47efed6ff373b46f1b1188f96da0b38b0a9430e571d4dad21eae98dcd2
-8d36affac5ee640128374d182d451b3aed3f2e2080a1531a2723ef40b496ae2d
-f0ba56582870fe7ddd397548d59042d981da2c5b15c2d3cf8ac934d91679067f
-e601409c220b8a6647414d0b73afe5e96fd5106f9e5c9883132953083730f75e
-2947bb0a0ad58d73cf0b0ff80481d2a152262e1b024df4ee74d22e9933f1f222
-f389b8367ec1d5200c70f7f48079fc559a6610e483fd55df95a8621c4e42774a
-0e978ad53ca8466cdfc66e1eae6ea5df41dce8369b40c6aebe585f4e9b3b23eb
-19139f371c9565ee85a2d8eec6e0c48ac857ee2660ce13eb5cb81616649953e5
-53e23fc2fcfbf98a83cf202cf6ec7f3816e9d70a4f86391e51327e047315f653
-906b49384b9c069fbdb27c84521aaaee74e53055897cdbd167a7b5d33b8feb24
-aff3e22b5d9da4966788ced11943e209ddd32f3085aa28f2b631e56693a390a1
-74b5cc902bd67a2c3959dcd84a08f8ff2dcfbfff5f75e2ef01c9fb619117fd97
-f8682a84f0e718362659df2d082fa8d9428010a76268380f525c4a3292cdaa9c
-475554ed161cd2c43355af9350c3fbc654993a3f8901391308af9bbb1fce0813
-7592a1a4b271cd98d094d77ba038314ea68a4e64d68b0165bb593b873b24fe3b
-8a59f22ea3714023825140e0658fb050e8c4e32d85e92cc0d2eeeeaff00c353c
-c00483ad71627438a50b4dade6b0aa1caac73ce846581b858910486820ad2190
-33a9a108a502fa6ea60b8c85d1ec5c816a325dc802f213ba6bfcbfc65306d07c
-3202f0d42fdbb7b62fc6eeace31837cc024965695c529e274ea638ea2a24847a
-db9eabb31283bb13944309c17e3615256c7b95d8f99f86feddc2c7a566e4dc87
-bb060d88c661f589080fae039f4fa4b5b611caa6c65455dcd4bff9ff89b63f60
-5dbbdb21c07404e02688b7f92a8373ee1a6a891bf6c315b793a9fe81079c1ef2
-804238c72039924ea63039020363282f24f969f6a1aa10ef2d9e7cbcaf53c9cc
-1f0925637190af45c7aa731e7dac0f091dd22e5ddab9a8dea87a0269d5343ef9
-f8297d133a037679c6834beb8741396754f2dc5a89a1621c13722289eded1880
-c9859ce2a9739d003bb874f747abe3ab28d79930680ca53ceba6db84aa3eb869
-0830eff19972d32f37eb6eab0723478f881127a84536374025a782a7cb24f90e
-892bf7b8b9a44a237779c4cdbe5325d3e67cd11ff1a58b9d69ce962a659486ba
-6649708daa2f7a0cb144f6b11161501464b7c7b20659f6e5ab21231aceb813fb
-b30f9d6c6afd24d638ece5dac5259af8eeaa46abfc1d6f29383188b4ef4d8e08
-fc13a8cb07f61f55727619cde4f86944b879e23dda590ecc57f312c9d6d6fbc6
-8c875291b617f8040f4494323cb93e84f2100092b5a0527dbf02fe55175a1b8f
-7b8b130de1ee8d39589b7489f2d087e6f865cb536b595c552534475f1bae5981
-807cfd89532d91a6316154dedc1b8fb3f8fa0270651107c5ab24ad8310303d98
-39b801b2f0158aca98833b79846369993bb4a3a715afb6eba5a2237652b17d60
-2dbc21281bbecab7df65812e9ba59b78f6e3f6248d5cbebfedde90149d823635
-0ad0a8cda735b701534eb682dd2261883e19355d6e31d980265351f1895cd212
-a8a006a6953dff2ff7ba40d5263b6547b6cd5a5317bd77c08364987424033bf5
-bd9dd20c0ba69bb3d25df2ef5fc06092981c2f57ac3d38b93976eced658544a7
-942cb27ef9cc649835863b2e14a4390fc3e5bc2c0be8fe2a67f1ecb3d4734636
-6b29b60d7261a743583915fba3c8f832c4c41bc1dff13178f2d61832fdd13853
-db2135b4d92b1628b80f3baca26481a48a9e0d0847e4c53427e5066816b474f1
-052fdbf71f550738c13f1c3ab27d1fa12a11194c145d90f61e4ef2a1fae0d25e
-6974f191d3e1106c406ce4fba266c952faa505954f6ddf00068422eb0cd4baa5
-34b06c1805468d7fc0b88a491b48a393c55726d4941ea7d869b239a69565a892
-82e020721bc7ed828c88681584e0c49452fa8f2bb88914491074cf0ffcb5fdb3
-628b292a0f2fbb488e96767aeeb4b5b738ddd65d50e143aeb6e37fd6110e0dda
-5e2120fbd267c00b1b90626ede7eb1fd37636e7f3b01ffc6f7216b396bc1a5a6
-04db15b065c9a030d08127a538f69779a5bd73a6d6f55d2da851afb9da60bbba
-d782ffc339762792fbf66b2d139b11e76a28e8b483aa5d858ad779e905456574
-8c2f59a94010ed153e90a961b45a225cd9a131315d2691f6fcce8b321078deea
-6582997e824705703029a8aecbfce61d427d476b559145f5ee40364c49ae13ee
-bd940e7104a70a5501f5c0a632ca1902b75598d3ae606319d0ff4f0bdae32c70
-b1e4d5065157499c15fae5349fd68e77acedeb296cda2c912562546b9d1a966b
-e7959a20045af835d9e7348b5b33614005f05fa26f45c3de3397e5ef9cf02036
-37b89a5085099eedcc025785eb5fc2130988a19570a1661772be2497d4c8ebdb
-fde6619b3af0fb42f4d4c3516db21d44941a62f62f087ae3731735beab50f7c5
-27856884c3c4c01b83a40af32613638be95390c4c66f71672651df6bb4c4a0bc
-a9533884c477f6ae268cf7c21fb12678c54e4b3fd8ef032d3e3c2d3651bd905c
-562e643f42d81fbbdf819a28c81c9874100a65e70466226d90662ade31127e95
-c7f5052cf24df0a04d14d1d8a5d5d9b89d212272860db459e07731b3a6537c6a
-83c352d2d1f09389fd4da36da0cc25a57f402976cf3a473ff27b6554faf254c2
-ec8e52fe59d346baf8b1fa0afb13289b6ab06c8d25afaf4f218ba88565cd3acd
-f1fbe77f5209e6d5dc361c18d9152ea6a5267116769c987b89dece4fabec70de
-3adbac8e5e7cffa82f4b7e2ac41696dfe89443c64d8fc50c5699117d094ce852
-c2d7dc91ca9f1e764bd117ea7cdcf98ecb87648e82c64d93f58daee619f531c3
-615ce9df8abd7a63b2957eaa3cdb10e48c379a96334f8510a1f04a7c433f3756
-81c565d30f7c7d9e05f4d6f249d203b286c45eaf851190ac74822c5a6caf4f04
-94520c329c09cc8e0f5ac803219b76c8be672d5eeb878eee0c1116ca9942b133
-0734efd931c8e5d54bf9f22d194475e14eb923a453c9b7f4ebba83c80b4d36e0
-617ba6de745ac02953a63a9d73bc2e07c52a6fb3182e001c021916ca4993647f
-8be57505636b75e2013b781c2ee65591694009f1aecc0195349d48d780db2da2
-dc8c60410235e5c3c7b4542873c609f921a62953760759d81b718500fa45b09c
-504f9cff973ce3e32a35b426c6f3fb2cbc366d980e133fee86f961dff6a21602
-d8e14529e91e10105afe9f88c9f65052db9b32cc2d88c7bbd1248d4448706d3a
-defe4dd13ed573d1e8d31bfaa9fdec9fb1dd2ecba1ec8cffb0601523d86b8187
-e1a1526c20166314bb65cfc266d01bbd562c79f00c390ff40c42e424976ba541
-ee3860910e852c72b4c8de0cbc50679ea9434f4f21940480f148365bcb9f8889
-9c6e39c309a84f63a0b01896d4165395618198fc9ce773a874074a2667120e7f
-3bd73ba915a657c161c04ed2ad2a25d81c286f5ef0e0fdf91f6c0a1da5da4d13
-56a4df2f14c4cc408165ad0fe1c60373909ce04828b2c333569b78f35c6594cf
-11becc7df1fe0d9980cbfc9b083e6ff52fdc26cd74e64b22196586f4b21768d5
-2fa9107d541384b53737b872b0d7b0f931eb1525e118a45764bb1945fa8b91cd
-944fbf3b63be737baad604e8e93d08521e00f8cc93052e4692f1de842505c39f
-054d49d7bc49a836c724d887c0905d218fec71b710fb0a5fd2dd736354c6b43a
-4bf4cca989e6deb360b45e8a353b712c2745da57934d5629923523686d471c60
-6e09b539c13f1c803dd11cdc41a41e8427a513e4808dd4f787114870b3bf8ece
-f68fcdc6820e82b4d537534cb2a7c81f4e6878bd0cf435cf5845fb8402aeb47a
-8be7f8658575e7fbcce387587b6563eac02d806aae5a83c185627d9e8857edea
-2fa37ab90a1aa2cacdacdcca8a23a2be13b1016b2716ff29c2a660d49d4d2400
-dbd73edf65aa2981dd46641d15f2b5bfd40768309c570d5b5bad657915ae022f
-7fd0805df33437b8ed5d961a0c65b33a6ac36a9ddbfe78169d4a6d2cfaa5672d
-9354964e4c756a20b65f1550064e435dc5b0b8a53732a97ae91c337bbfba8e1e
-87d2ce72b4577c8474a0ef36cd33a3dde20e650eba05a242065b8d1fe3c702df
-ce2f7ed86080bf5e0efd27e162ebc4471770197c13ab838945cc2df10daee14d
-901fe063ba909462ade61c130d7911c73be3d448f36455ed30c21bbc2527d0f2
-5bacfb066c0c45300752906845190fb3e76db5fa537fde62a1e7dea1af35898c
-3edf2d9e6bc359439e38d363fbc37f89001e3dec0a7b6a4a7b112cd687e7c5e8
-4b0fa42d52b534b2d16ee3ac26b4dc3fec6272d1867a390ff9fe074d449b6cfc
-93129a45a6624d91800c7e638c32c057c99673e7b57c5fa81e60e1b7a0604424
-458e1bdf2f7f77d1fd1275512e3f6d5411cfc20cb8571ef52c16adc6073a9542
-da94754c931e74704ac639fb69b227ec66d4446231bb566792321da24cc3510d
-89b59bff3d647ef55be28555e93318d9eb888e32abfb2b0276ad9483ae8bd4b6
-5f2a3876c094f8e22056b9a26dbda1b09b0ce8cdfa085c8803151de9187d5c63
-406d87c00f3ce085b9bec794b99b2365504e7274aff81c5032db910e31c8f2f7
-c647a598171a4e8b19d05b5a77f1073ca0d5f58ebef2be11c6f390af9c835f90
-9b726589c9e75687dd9ba33beb8a42b5bb63076a5cd2cbfbbd43498934b67f6d
-35556aaf2341c4d3121ace6338238cf67a76ad99ce7be30040484133b44d08f6
-e0d6acf93cbb3d7b3b860e620efafbb0c644fbf90228a339e9a5e99632238e99
-b1644b65c08859787d58988cb9b6b792aa43981c2eba7136fe17c9fa4a671864
-d39bc4ce208357e4e178a4c0ece034f01955199d38dad2b9e9f3c47ce7c652a1
-29476742bb9219514553a1bf9aba5af84a3530746f5d24795f7d79a1927f1266
-4e9e31e2d86be65a64463db3077fbb4d8ba24f577ad99d58220c09d15d7478ae
-7360e3f048ce8bc4e7c171f86d2055c61cb4e32c8e28e52d3e8a87109f5b9c43
-b3948f9e62356c4f55797f5c349ee40bdd6e6d98406e361af69bca61870057a6
-63c08cd95a45c1d49e5ded4ca719b675f8fecbbf6cae5bf666352afee85c48da
-e728a4672cfd6a669015d51c96e74ef3d42233fa3e5271134aac9354d289e7e6
-4d5d7be4433a62bbe54900fea32c6bb7863dde80c914a4d50e11db676af24cbc
-6161712ed2e4ae8f0d7407c83889a3e52486a3d7b1e4ff2676a80039d4217eae
-febc054ff700f06cbc565353cb08267b50276528e5da421aca6d458c8d381645
-3d524f1b7d143791c3939bb177dedd8000a364a4fcf6d27912cd57f8b1aae2e1
-2f012bd0049675d4b47fab974f28d57b151bb0cf1290aff5fa25e4219aa3e1d0
-e6007552aa41b3446b5624135d748405749cc1db00a6575685b8f78856607a3d
-db56c0232cec6d31608342c785fcf455898832088ae4e608d6fb63c57ef4b2c1
-055ba60b0945c580292adeb56bded15de6311695fc74c35f311ebf99702b54d8
-77a677ac6df01ce3fdc54c527c543d3bfd19265fc579c4fb688ba9f1b7233e29
-ae0355e5a94f2a25fffb4a8fbd74f6798c863a2f318b4ce0c826f738614f5726
-2a2dccf3d5b00fc8140b153f360dfcadc36873b124a035781afb7ed41fd3d546
-79598d5030a8661603465eb2ac7a615c3537ff96556dde086f16040935e04a1d
-32fca9256ce570eaa1ba42b53032bea880447949fe73fe1633a552346c930fea
-020e94d8f22f115b195d0d8ebab7a07cda81497b824bd9961b660836709e0c9a
-a7e61662b0684e925e4dd74fc97b675b79674aa3f6d16e96a1c86fdd2c6cc712
-1b00906b4d70c2b27390ad840962c2aea555822be94c6a46dd5a09d0ef16d346
-32e6e2d9563d10762b2606ed532d652b7949ab11efe383cd0afd2a92804998e0
-7559a8140c01ae4b4fb4eae2c147464cc71403bbfb42cf1bfb2e009327d29ed8
-65feaf33fe93c081568949c382806f465e178142d956b250a827bfa2c39f462f
-5fa069853ba2e2d18ef99bb53878c78ae61d3ca268e5123ce3706d0aa11c336e
-f5d8cc7036c9ff0e73c16bf7fba5d692847cf0016535be27b2119efef09c8890
-ea845adc88dae8bc41a11a861d31e86ffc64ea135aa53c1823a4e1d4aa8ba507
-9e5df4efce318b6d3f486b385377ebe65bc916f13609cea424f9c42e8921f757
-50a6c10c6c13ac5f8a5b629fdb16ce10200ea8f825280a115dd641cdf1763f47
-acad9790c90657ef835ee1d02f3d2e241b7d6749c9e4371216931887778de4b4
-60d0ce386aa03cad70c7e8a133ac4ed3ccf31d91dd0986caa5962c6312679d01
-359dff0b5a357fee803d61922367be5e97abb50f4048aaf6c76b6c65410a57eb
-77bbdaaa596833dabaedf537786063320d766fc6e6826be6fed511babaaee583
-7b0643306d7cdd12f02e183d46350bb7c25b94b7d4166666c556d2f3adaed6af
-fb36837cd861192b7a36e91b295cd832a67094197972348f44d0ce3870a0891e
-0ec2fdd4413f67060f412a3cd31a509028d6361353a5e50058fe4ea46a6732c9
-98900dec7fd4b20e6d6fec5a30fe1f4d743d0deca667b5fe871a7c68143acc21
-ed2512990fd94b7ae6fe738dd326258f6cd6060f243df995a3af97687a78eed4
-271f3dc4f79ed18dea9a84694cb969ef7221be2485c8ce9101e9b1dc59af6222
-02a8ff7225ea661d01d5370b535c33ea4202b6f1a3ec6525a56e1ea71611491f
-47bd21ca86ce6d8c924f28c8d5e5f66b9222827382dad72df22ea440726154c4
-19aa0517d06423294bcbc7c6f64940c999d9fe1c6f514c73cdf05acc4105bd2a
-764b69f7d17204e9291a1d13be111261c53b5aa1fc255a44acfbd6a3e27d20ba
-0c2d9fc7cb0fd2bf3a9cbfbb53eb0b03c6ab2cd636bac90076e486ce9ee10b8f
-e69b03cf6aff7b5a3fec75294bdf32f198d65680f6779a9c6ef6b8edd936ce66
-e9cca6bbdcf4cd0808f33175d40c3f2ab76a02d0051ab512e32adbc595014767
-1ff6c57a77b8303e50e7bf024c8af22a2c7d5adcb9ba42ee6565ffff73212f22
-5f69eec749413749bd663976da9e39c7f2120fc475427a64d578e332cc5d2ec2
-84307c30b92e8ec05500c8635a069294902bf4f2969dad5068bac49cac00a307
-0e5203b294f7a42c2db51b4bf3e80bbecb780b0adac425db4e167f893ef4d257
-8aca20afe2773ef6fdc6e07c20ed0b0b4620ff0d5dc28edb59f39ed3e976c510
-e339c4a0fc9f56524df0aaebc9d985fb6781da97e651df018635096cac944d58
-ab8634a3b02cf1376b1c5fad86ab57c5ce85435ace10216a9eb3bd3deb8ee5b9
-acd93838e9c5b26f6f02f5541ecf8e94ff33839b93e16b740beba88c19410250
-301614938b4a69ba7b9cd47d79d9f58649225ec073b8c86503ef606afcbcc79c
-287c9315cad03844d0a465ace3e83ed75182fa6de0166ed492659d8e872e5f32
-c3043b055e44b91ee3bee18777b28169dadc7375fd25ea67288c8a7919fb6b90
-e5a805a38a40f1ebd4bebbf6e26b5d5ef18e381970be0753c35de24b6253f9d2
-4a77ed4532f5eb2f464e946babea6cfb2450543655fdd5ba1d46894538dcaf49
-d824b3dcf5484ca5098cdcd138997398a60b711568f26ad6eb964de44038fc32
-07c85ae853ccf6406906bd00b9af16f3eb2246d3ae95f6944ff39b64453b5a99
-5592ab75507ebdd4a7f5ed567eef5aa2697e973e95b512549da9190dafa3f3bd
-abb118f5a81cda2103aac289be4ad5dcfa566bc51d8ba2d5b19b7bb31a484cd1
-8a84c5dce3c7e50429d637c22b29d8f750b60e65e2fe3a7316d458557c1e87c9
-c6f8105537aa3b5bc789cd7c370b741477d21af453ea2781d5ce29d20f2176c9
-9418ea8db195cdc57bc982e91ef665411741fda4f9fbfe4bb3966ac00b76e517
-c7c0988339bb8848e616a134f95078a0a5c1a295bee68499d1428ada2d995633
-39d92748fe4016a88f9d534b35c766c9f970903c0b466bf4867cf914c570ee9d
-f4ebc45e058759a851b8aa472d14c305f6410fc4d05acc1b11b431fa438490e1
-816475c1a6316c7635226b49399563b3dda5efa5b38d1a32efde767ba4a0fb3f
-3d93da113a8e3e32a33b5fabf64917251122ec6dc8165f26af07005b2da6aacb
-b7c8e299cd7cac6e3251bb812a600ffb1a028d36ce351b3216a7d23a195a9afe
-e3461a40159201f1a89b8ad3da7fccf08906310fd84eab1ae0a76589d69e13be
-ee3ba496b5c3f34757363c4f5623f975ec58c115901ddd9cf4b8e135f1d996e9
-1a438123b50d453656a44088b62fa37f575da53a2a42bc659540bc759ca7f24b
-d7290430dbd53edd3c602f2decc5d5c2e305e8c9ce56626fe5591ae3f6fc9b50
-62fb69b77e75d7e0808f984b7a062383d2514b0d682ee525b39fbad9b84663fc
-3b74f5ff1adee4775b8060b227c1df3c3b2fba8bd36cb216a5717ae6d6629a06
-c099300377b741877ef1db03047a531dffbf8dc6aca4ce0097b9e623717eef1f
-b40465ba5b56d6d618aa3e837cb2791736223243621b3c0f36e8cf3c5fa3b815
-36815d1a277411b9026a9eb2b1d1591aacbfc92b49babeb49269eecdc24efcbc
-7b0871150cb009a229b3d1665d05a796f84dea63d9c2e23af3a999f11f53aede
-953dedb336ff92e7839bc7023f8f4b868b5171e03857ac0ad870c8dc42c6ebdb
-cc7d51d1484f93106fbc79a677e97db44190ca4478f1c6e3ed2dd57eb8098798
-f3f163280a6ed0a87e57581fd663917674328cd2d1c6f720ba8c01f8ab79d4fa
-7c08f1417a9a9eedfdbc6d7c84bb796f3be629e476565a34885dfb7c4164e821
-529be9d79022b6e1268cf6517a0fc2864e4b718f4018744984a2376a822dff4c
-0344668df1caf06b38c229dabc5a8f51ba120b53ff9291b99340e46786c809f1
-912c2d910700252081efab3d5e1d96d8933b6709ec5198b27fe6c511209d84e3
-cb1aeaf13f364a8dc62bc37803dd71c663f7cceaee35e5b39f87bc7affc1dc97
-16f93f931ccb3164490787b1432be66246f8e8d2d01232ad3ecb7962b9ff256b
-886ca9f86af2956dd082491d015635e02d867a199c481d51f8751c6c9a3efc2c
-7de4970992cb00d45e1d71522ae651b177c2a5afa2ea22a1c083eec3fa104296
-b5b9b74464f293e394fe8ec2d4bb82b7a27b7b4878eb9ca6d8fda476b76c872f
-5f030a803c7b1f1c0483a96c6fbd43a97302e17b5e0e28eacca87be1015d91f7
-0ebb16c26c51a8d7efcf50cdaa4d7c3449b1134c30d181932ccd93ec16b44993
-329b44a6c3638b23521eefdd79e7200228425465b0c3df07868818cdf53d9945
-a740ccd2413b8d53b52f3f6b435f960173b0b4cff2e52cea7bf54e5002d254ed
-c7ed8f69fbe4fa8de61973454ca0a0c9ab2c2a9882f346d5ae456b074f367547
-54e4995e568d48065f9421f039c6b36d2b4baee80bec636374611123995da79d
-54a8e318f034d9245cc5f2fcb4096743366a1b6ea840461f45a74129ef2be0d1
-ab028681ab144f68f02aa84cd5bf824f06d7ebe88d55ce185e9defa29b55592f
-3896f917281ff282a252bc9e725ffafe2db8374c7c34820944991671ebc16393
-cdf712bb663640cfe1e700bed129c5b3b37cdc5b725396e471534e75acc23657
-12cb452bb410347fa3de8f13d2ae52de9e4a0291cff3f45bd1387e0b0717b0ab
-c7998d15558b3c80adc7f8d1dc3d3565a506050f3bb187f49ee8019da0b49917
-124e925bc05e633da732acaf407477b47dd9329dcaae0c3af728c577b5402521
-887d20bfefa2028e1ee7ebe6f5092cbf0493e4256dfb59d62b9f26ebbf5e3b96
-5be553da8a9e3ffa7ce4de7e428d8e02795ff5d7fe6dc2ccfde9c708233201cc
-b433e0fabcbc498b649af575066ec7a198ebd6d6bde12a1a5fba108bb34d316c
-03ff8b0368fef25689c95d3f1a1dbfdc891cedd92dbe22a037a2f3054897eeb4
-ddf01d1bda48d1eba76f5441354c342963da0b9b3f86b0738a8c58f4e798fdcd
-04882c1a3f18075e31b33c78529f4ee2fa66f09ff4c3975df960c6ba32ae0532
-3719cbbb5702844f3a84478c7e234341a02d44cc60e4390f335629b692832ffc
-ea98f9ccfcad11ea232a22998660ffd04320d94dc276af68dda0050406307287
-5e1af46fcc2859f6e91190b15e68e7aa56cf02593dc4e76631c3dcb7fc9ddd64
-6c7ab907941ec4348ff95fe5dba5d6233696b3ed777eaab40c4eaea7766f4856
-3679565c66ca57b9bf714be5504191337b4c9ac40f87b0255e22d24e4adce456
-3502c29ac30988ded18faafc96bd0ff8a268b0bf5830a6ff11cddda5929659fc
-ed4cee41b07eee3229d1241f8b0a3b9b1757e1a6cd2b53b29d245c0409321e53
-7f2c66df8356115857782d74dccbd69190852001b7bd6612511ca1c458c0459b
-1b1afc2dea548cd9984cb34af196b08d5147ab49aba60c0014077442e5b39170
-2c6c265b25a215fc6bb84931dc00156975908b76cf1fb54996cd798ea06d1840
-937c7e1caf0f5c595bc038d3689e7d4af6c15a3943bd3d5fa645bdc0fe0c7fa4
-a100b71d2b60cfe9ffc65d2503372bd5d7713cbbb0dd9481c19e5b24f987ab34
-861beac180f61c7e8ee68846db98c9c88aad992d8875d7b44b5de8e8c780722f
-4849ebaf90244b14d141264fceb58ea3ecffd9ca893f44a1d5104c6c9c4e63b1
-ced9e015b9f415690d526fff0be7ed7a93535c5f823ac753dc074d9cacd4a3fd
-c03879f8216a892924cc696b1d256f0d7f8f24850db602ddb9591126aa067343
-d61163475489a8ce2a4643c5e3db6a9608c1c506cfa2439991d807b8a3d89a5e
-711969217daca3bbee9289e474a0de12e6ccff0984f10aa965e6a38725f99f0d
-881053165dfe7f8a1bab8b24b9bfb7a382298cb7e9b625b78e53b731de5e5938
-24f1d53d970622a380d913c0db2b4f156033aa2c3a4423c5ba3be0261808c000
-a42bda95a6768ada32b929234e4c3a9d0c212f0b197615695f84c9a12cf77a02
-d446971dc5ffd7cbe68775d948fd9c9aca5d93438b7b2f77e83cca3d3c3cf885
-badbc9166d3eeff0473edbef598a9ddc5e5d50637fe9cec73e695d38e413fae5
-7f11aa2c1453c9c56d3a92fc33ad60e0f79e3da79b49c8cc77c40e4c82f2e9e9
-3f7eed0a0b488dcec44f8846f8a58a970dd88c12114ea58e1cdd105c656c4c34
-3d01f7bb5a35e18d730c3967c5b0e711009f14574d947ef626b4ed333baa9537
-ad0ad7d4bb5daed5af9903990bef203a529e310e5fee72aa629cfbaede5bde1b
-7a53c7cbf91a177fd3a40fff8a1eb215aa5ac9ecba228b853d55d54e5205d0d3
-2d68813164ff61cb3ed67387de44ee9d93ab2a082b50aa39050f11cb7c894914
-3850b334dc7db907ad6b5e7f3f89bacad3771604f0f1eb2843a1a5df85dc6d23
-bdfbaf5665edf79e652006a822f6b9dc0692af54a51860be74678b1c57f16240
-8c18a8efb515987fc1ef7522224dcd42450dd4a195c43117885d66850aa1f701
-54af834ee208ff22b3d49667cd64b18aab0c528ddb3363c1fc375f1f6c133f1a
-5e5ca1e83aa6cde513b11d0d80ce36bf7562a35643266996e4502fdc85ba05d3
-c1a7e39f62276ff85deaa199c3e357757f547d77467886ef66af72968e363221
-25b228b05df472afdf38d64dd4b846df73cbbf2ce1030d8ae964b330e8d7a3ce
-52eb0aa4f164d44d8683a6270e952f984dfc78a720775be462cbd41bc8d56ccb
-383daf0007b58e6fde73ad44e701c23750fb4a2afc174905b2554d8d95aff499
-713856cbb4cbd369455ba97b123ecde74a928afc03e2e11235b0c7373293bcbe
-6193a86693f5db6c6aa905dd539c19a5e953222e1c68007068f5d6b7e232fec9
-4ba203a44ec7318ef6a0db9d255585b7589f0d3e08e420f8ef7b612637a8ef0a
-2692f52d9b094d32e8c197d8c3aa8c671529a4012453bf23e7ae1def8600f056
-e715dbebf72bb7eeaee282c926f4ae871c495282c6dc98f191d03380337c8881
-07e6113ff0fbf360a225f354f0ed4ddf9c97d30fe5d4dd03dd929ee799714ce7
-6182e399f53969cf4c8cc2df7332a9de56dbd19a8704661d842997f06f3589ba
-f63999f94b4c00cf23d1b540818fe68ffe739b1773d8ac1746e51d8606e06400
-4eaed25d729b5168e8f4bef2c59eb953fcb9956d3f3e733591a3978700510553
-8f9c1721aa7cf7552188c2ee521116b1cdf4852ef70b0d2066a2b2e5dc194fe4
-c14503d57f7d7802014079f915f3af34d0fa4b3fd4a0be01952933c8e939eb95
-dba63306dfa0f2ecefa6f8a868e9b513f5ae04d8fa9715e04daef3225ff5dc69
-b6e455f4c8e8670f7b4c27f62f0c9c3083945d538b46edd1c20cca764e370178
-fd0e0753664691abf1be81c197fc26aef772e4cd6e3b3c08b092e84b80946788
-1a00df4bc03890f5464d453a683d59eef81734570e635e4c2ddfa34b41a6736c
-b740641e676556182d98b7e50c56f8bd57020f515d73867fe1a24e098a656833
-38039c76da859391f701e404a0218adb77abb649687e685821f0f32691a82b07
-15ab96d0bdb3baab325089911ea11f6112b69c1e877cd8f2b8dcfe55108f0fd2
-12efbd4f7954149e64e1aa1bd0d0b709f13d032d1ffd5c68bd4fb14fbd7721d7
-a9f9355767875dd2dbf55d85ff6f0378d60e81b3e37ff6bcb6031668ffaa0ecc
-cf414fe67e9261eb0f791a092f7c97dc98f9fdfd212a363bf7473fc107ee5fac
-0790704f6fb87246143e0a53472593157180617772180173d0b0ea6949dcc49a
-3f8ffc3f033bd306ef4b6a9001d34d05e7a8a200016afaaf6a69b5a10e6fc316
-5d9341b62bbc709ab8424b84d25965834f27750afae63468b791cba8dfcc32b4
-158cec29e8112e70bd237c1a180d078070c6feaabb7d35f5167447e54ce4c6f6
-0f55d9f97ce8f1a157af6b49567a16bbe23233e68bfadba699b69b22d70b94b3
-bb551113de57d25e2cc22a3096eae40bea7e353034231ec33554fba3920e3f80
-3611e4dc2d2bb7580869d0bf7cd3a0b24ba6a2cee9210164bf0e14e76642cea9
-bed0b279b01007826296ff79b3fdc11c24beac7857667139a80f0243b16b153d
-a927925575ae6315fba5e54d5f9958004e31a4acdb315b78d08188accf9a0099
-e8e706553f926d14afbd8c39cd805eff90b3993c96405990aa9d189fd66acbd3
-123e94f66d3d1a5f4061b0ae1a032ed9eb5010307a368c1c6104767bab95bc46
-86ddea0248d2eb0a886115e22304e81deafce6e1dfca09a8a8c93e7a44b6baee
-d222d3cdcc5a8b1661b9a874c1bd871a4cce7f9666d0ae94735fa3535a44920d
-6740d5e6dd0372733bebbc603d89cac8450df40be169d9bb90e3480f3659f28f
-5b2de56f7c596b3d3c2b80dd82c1f01196c301855d6217b99bfffa93b9d40e43
-1a22f7a9ab31462d3f14b5dfb0795ca0675cceddb8e7eb010b1521406689b491
-9d264bc1f084564e6a564a76437c6bd4317fcfedb47653f191d6c6b649270aaf
-d083771031afca63850e7a552dc8cde90b1c6556d49c09bcd3284956ff555e57
-77365a2ab6d7e265a1a4f29de8203a2a15756ae595a48e11b958c6ebc478ecec
-29e0ba3a7cdba448c7abc3bb6e21d21bedc9e49e730a5872082e9b2ce588956d
-b35eacbc2f3f41485b0b0403029b7a5405ed1a40d6d0a7a802c0bc4a0b1fa6c3
-32450dc5b1cc97378a2edba812918155e84e78267ec5e73f2c0bbdc96604294b
-3f840dd3d7159999fe24b2c6f297adff2074ae10a9087e2222af7bfa938a2058
-4dce0e6185a493b9c177b8238af099bd737ee30fc40381833e6a08176f3cb0a0
-504270ae6e7701a47a721d70ca5099a2c55e9558320285e4584e64d639560d37
-50993e0757a1419eeeee61f8186f8493034da3997e6000354bf0e07d948afd88
-ed9fb679b76b39b0b4b444bca762ffe47103bf812b63a2b7c26e56ae4b8c73c5
-58d0f7d6971cde60c257de6688d38bcda59d35ccda430df05fb25f2a3c75d377
-d88b1f22eb46731b7b36f8d9ecfdacd3f11f9fbbc1b4587141c4b3b9b0d0a9d9
-bac41cf6c67a995491d52d695aa14aedbbe48d49126e55b2ae43d0545d031e05
-1d52602401c68d41fd21e4faef1cc86a15dcd17c1975b2d841556017a8f39f26
-b6c0c9cf80e7b5d9488f9d4b08564c8ff25c52c16c3d11ee55e18dd3462f9436
-ce1e4bb7eb090929b4816aea6150fea2659389445800576aac75dd801524bc6b
-3f8852f9a999c05c7b29820afd544071e9432ef5cdea3610acb574cca130ddff
-aca7b6ac5a6d86758edcc686be2a61b6f5f2a3405faf7a9b06edc40df07b74b7
-409e2a172430b1d504b041a5c7b0a4107bf60581e1fd5e43a5732ad62a2301d0
-07c3a3489e8ed7c963cb5ea2bb5f4befeddce251c8fa914c424764311d16c7d4
-1e855f4b2fc2d4237ab0457b3a1752971bccd0e321dea65684d0e44a73023a19
-4a9823950a620ea838eb5d98f9959992f48d5ad23be313438385a6ffb29362ea
-a69f16b642066ffabd919bbccf49db54550299476a7143d3d89a6c1a18e94db0
-656a51dc9d77dbb58568b3365ccdd85d0e98097342559bace953b33cde10d826
-8a3839a28d7c218bb4b0a31d105c5d5464c2fa0ae31f69994057717892369191
-3b67d16584ae555dfe1aa32d4b40d144cdb9584cc5777d1e30429f09e0fc25ad
-c87af39d21328dca6c31be361d2382b2c20435e255c6f3014f052e8f4d305a06
-7b3866bfed5eb9b9434909f117bb602c1b743496c9ea13dfe4558b443c347a96
-6665d7e5c06125a8aa4e906f7cc0bc04118a26e9129fc23a63fb0eaa010deb73
-76fcce5d4a3d4ae626517d2d77550c50f7a45b4ade74018b746f5aed001cef52
-fec5e73534a2de1256ada58aa26e5bc0d9d848c8d0a7f42dbd7ecab47d6be1df
-71b7632ba5fdfc28fad09fab97fcdf3ba729973d39a5cffdcec0d1173be7e7d0
-85a59a4504617981421dc9600b2b65fc122d34ee2fab5640893e34ed50f53037
-102330d718f7c2bb7b9f50d18643e04af5c860215f7211271fb2075e0152d85e
-c440a933a87d20a0677ea2717baec45e8578a077805615c7d492db713259949f
-0392cd91480059059dff830b24e2e6e5c715efb4aced3dc637f88cf3ce57ca45
-2e96edc986edce66a831ee92e6e284c72b1307ce4ac479e57014d5114a9054f9
-cf9fba1ae66b0f83e173f31378fa74e8b087490bca05f77da7842d7167d8964d
-c59089eb222f1a33963622a9a17c3542d9940baf4d1b8d68cd4d51f16acf31f2
-91570def9261b67da9222acbeba21a6f3fa905e081be29befe3152b326902afb
-bc6a57c110bdfda8a5c4ce8e272eabdca671be16f4eb7953d1df46e250acc0b0
-674deed452de3b04f258e081110c5ba20a934fa9180abc09806e257abb22041b
-836ab3b73f5ea8dd1dd8cd56216d1bfee9a8ba78d83e2cf0935586c0cd7340cc
-5980e5ca4989174cd46fdadb86398bbcca75c9580310422f692812bbd8a91602
-4f28a49d35ca1c80d5c6c7b879f14d037ce98c0be18eefbca8acccec2fb01923
-69154709b772b7a13d2a9737652a1bea28da5be3815867a952fbdbdb8c45c347
-afb7d7de74620d97b52a6bb27d2b25fc3d0515129eb92be62f7efcadaeba61ef
-88d82df3daf2d1b0a117493075b501ad84ff1650bd7196a1e481c393de324dcc
-c50ed36647ad32f2c8c1820aee9190126c1e622d1f686c71855f8a50062abab5
-54fbc041de1cb0f6163df274e0b148cc24ff66aa16590447b5018474e5bc20eb
-77a870366b3ba577a6f484ef97c606cf71f15470905be27bac6fa4375629f80c
-b8aef8957b856abe4f885c47acd94a7a32b2d81cb5ccea65a52328820404f5bb
-512ae315f257f6196effbbb484ae7c877ca278a1f086e771092915d375667811
-f874c618cc6a117310287382fecd5fad1bf3656f9d41c6b798cc1f6e6f7f789c
-8eab2b1634cc255f999a72ea0e3e201a4335558e1dfc26a8b02a8a1fa55cfbca
-d1bc49f81b8f7837a29d7af533d9fdca050cbc2809ad4cb54699131364977a03
-775148adc0957ecf2d7317ee6b582592baea2f25d926a1738df65b37a519ab95
-a99bab4dc07e56df6e4ebfa0a8e4d8f90693f8de9d1cba77b3f11dbf7b1eb907
-a381fa256e2e943d68e773459c7ae4e7ff969b43d5693b5b612fbbcccc4c5411
-49a3dd6f01ba7bb3d11a331cfe3734ba2b9e1f8a353be0f7a6a0567e1f0acccc
-0e5f27eb18fd60d809ddea01e8d6d1e8c5f59b9554910206ec9c56e7c483478a
-1e4a4cbe7bfc97c7c96f119726e45d23b337e547667281022269e8b66dbf241b
-d74d3cb856da025944794c90cd5196bc8f3a57869c9f9647a0faf133263e96d1
-78ee01be0f6b67db214b2e9c3f10aefa22e7e0dc1ff6d463a2cf77d66218fc1d
-9a0f754c3681591d66f8c455a85e3e7d396fa1cecc04b218a892da24ea8dedf6
-2084965bb34be5e897a6a6c7818f0cc42be52edd5cd7c45cbcfaf89c94569343
-de0c4bfff1f6120684fed8652a071b6587f37aa970b5be3e8574918b97cba372
-81ec8e16a93fd111d796dc5833b76f3f3254a1c126fe28e103ce61a0eb89ef8c
-9202f06e04949602431a5cf57a940c059876b3724e461b7cba19a398427e0d07
-8a88c2eb0f9d12b608d777cc1558522e5f0e96362ee59cf1ee03b1ba9b864bc1
-d186152f24e7e28b92e3a799b23c2416afc0820ecb57a0fc36f44b73aaf6ea3e
-3b952de790af21f21a273a5c0f86ea671ed2ab467469a0ebba738b6257ad34ff
-499b8e21a77a5685dc1de5f21f8ae20d85c6c921f1ca434b67e876e9d3bc0136
-dce9e8d97c769e07e7535ede8bcc169bd38b5f3881f94fc7526ffa91b7870255
-f62e423e2ea2946faa96353152b56ae03010a42f15cea95dd27c89a4614605d3
-636f44785350a920f63f0cbc5566aa9fdfdaf29c109dc83169b3a64ffb0a7c58
-084a88d385ade5c3273c02f809e3dac76dbad71e76462d909348c609dc0bc7f5
-0cbe05994df34bd38feb8b5876cf5a50989a44792c36f0a989084acd73cb700b
-64103a290df126dadf1449a45c713a71353969d41bdda892871644f895fef631
-15b63299dc61de72c7201d8392dd3f10b819b792ef91f1bcddf9f04bf3b94c25
-ce81c6edced5ac26c9cc0e304683656c9ef456b1b666bedb3fac1c597bff1d9e
-932d05de433889db501bfa1abf7158b428b24a0d49b467b3a38f916601c9d36e
-22374c7c96dbb04a5de8ee1013ec7d8515a9eba05c41def2b8af7bae6691abad
-51b58b489b3b20f3276878bd520e6e70a9005ee6cd9651199e71269a9dc9e1b4
-cd24d01d37448b25ea34d6e0ec921c4c1904b7c4deb93a5c6a0c736a501ce7b3
-5e386a065c1f5df136c8bb89103febc7b9b3de8f74e0504fbd7ff702c5c7250b
-881e83499ecb6d80b3f9d9d17aed8414a6e723603c8762a3409f6766be726bc2
-79f70435a56a0e096209231f5b0c134bdb7aa6cb3db9895720cd02b9dc0476ca
-90c7a9ed37ff0b380348f66d85037e9abc95499cf6a3006a40c3874fbbc4efbc
-93b261cde619c9f86a4203dcb642e59c59709dfcad0d15235264fc7923227094
-ca105019b1bd20e4bfe5f3ea8edbc33a7bcb6ebc523533228ff682e8a1150aca
-fbee38b10517877329be50b45bd87df864b02c6c8cb5125b01e79c64048ddd3b
-7bc817f3998adc78819febb2d81c7cbfd179908cd36b7e5169218b449cfd1a1d
-d0979eee4aa2c2f664b9532775113f6d528c0e7c1ddf7f92738b1ec1c903710f
-9543712c0133b208a9bbafaca0a5ec4a087a1e5de118fda50b4b79a658e73a04
-ea556ee2b9891278e414984da3dc6d739ce951cf058e2bd79d671877c4d5680c
-2a757744cfe0cf31bf587043af1acf031fe82e85f1199c1e606232edd4501949
-dc70516a3c30b356f35c2b4e14fdc62abc3cef6b7703937a1c5561694b2e2022
-457603ec1210cfe44401a8ef8e43ab2c2244428c4f8138828f2a7646a8482b49
-00a7fca8dbfc30cf7dacbcb003d06c36644d61e901114cc5348ebf805af2f70f
-84398891f59cc49846e23463d89ba78dcadb3efe0f1f00f4b45c40bc0d2f3cd7
-63c231487557e68ebbb01cc9f96f246e9c2634cecff4a381dd27814e07cf1eef
-75a68378e92e56ff486dafb1bba124ccb1f2e9dfdf43c5fabc0336d8f237f9c8
-c0a656c7691c674c0031ec4531b6e7adffa69d634c9af413fe014cb6464b4ba8
-649cf7bf0b6ef90126d312c361fbf4618957798879d967496ae34ecdd53985be
-1bcea07ff99f19a7bf3dad5bc31e1941161e60b98a7f78316b95db862315bd25
-c46474a7e5cbe24c54f54fa23b299901cc2488480d258db25713dc97ab0e4b5a
-d66bc1131efb7296f2edbf6d27734cd45603cf5c1e0915dee25996df850dfa31
-13e23c722aef49ad2be71db794c86926c13ad66f17d8b8de2a4b66d9191afc44
-2b4e95d2cd04cf23374f172a183ba3d6adf8b2f919f14b4ab794f53531aa0da7
-fa0d5ea6f4c30e24db53640d51248cf1001e7330286c1668a7250d3a0d34f84a
-7acecf297caec2198b56eb1b9263ba531658d06a3d9902c3c96034cf79f4038a
-2859c9e47088ed6025d59a69abe6c86ffb467b4d8b44028fcd099729e37bf8f9
-5584763055731e7d7ac8b76765955c5c73c00bdbd426950f69ac97f55f9f9f2f
-bc217e166c442e627ee893965fbc7200396403b1f52693f6079886eac12d3553
-a02944981ead829e3bef62ce5d9274e039e305c48b23c604a86e6d816b649faa
-ecdff4777472f32094796aae48960b0f3d74e40fd1e4e72bb37e54322c126341
-039c3b3fc15a137fbee162877a2b1a27dbc2cb91b9b8cecad345cb00d519c051
-f46df1f96224e95646e02d4af7739638c5a261e36e46be731e3425d8f62d25ce
-5a7f1e72abf75237bc7109d0f6503b684c728a888ce8a67d622a298fc09d08a0
-39b7508db67d1fad998be17d49438696e9c402bf6ca7e5ad7ca7a1450e04d17c
-2b0fa2feb0b9d5af5dfa5367faab7b3e2f104dffb5da896d00b890764b83543f
-70d04bf1fb56fdf0a5873edc4124e42b1546dcd43f4896a2b313617c5675e84c
-1fb558d1b944084e431c29a8b1b1ea67f22bca2ea0e503c422f13d3d18c16dc2
-2f8215c71346762875d4864e20c107f50d9b42963aa2185db553e60af6c6a6a9
-886ed38b48052b0cce1e5b3f2f5d96975849eef01399553443d2722f1fbe8266
-aab7b8c1d69ee6926c1f916c62dce7a293589e10141173e30b5790f18763f1d8
-e1168cac05882de798bf361b1ec201c9f5fc970e5bba72515ecf3ddfcb14a6d6
-2f38cec6004fca8ec75d0b2ae1fc8bc94d4bac124c97b770759987d4322ae181
-55c7a1d7c0d3005385eeae58b8a07c556dd439b676b496682931327031d68f43
-daa631dff340b8531a8f1cddc1f7061dafd88109b78958d52acbf458dd3ee2a1
-fce78a3e5a8ad9a5314464a53699701ce17dfba2e176e9ac0f34e1692224926b
-61782f6ffad4c6278a32b1bdb73cf6b8b2f5646dbea6de31b2078cad5a87dcd9
-04ea4e60601f7547c1544b863ba383ee95ceb4a42ce89e815740e0abf8d3087c
-637a29e0645de6f2edd027cdd56e8b558dbd26e9582186bd5b4792500926f8b2
-5d0dd38c7af1ce0e2d99942b0099757140f9dfbd514c38e3d15e502dbbc34c0f
-61e3262e48f80bc3b6f93ac5aaab909cac3b776094c2a101b0ef5c891e28ce69
-9ecbbb70fa9a71bab19a9a4ae49f9316b7dbdfd63b43db9aa064df4092cee544
-7507275807a430358ff0df98f2fbaf716785742ba18888994a8e2b54aa0f6fdc
-07feee88c4c98951495943bd42b395b92b545cce05be3db4a0ffc43ca064ac4a
-9baad9d402c97fb79b8f70184e011f78d8e96538f4ef66d45950a80d186f3b96
-56ce530f019a1269ecd2249f6514a6b77e486198ed8e4c28760a6482b1d3bd8e
-8104a8c964154d8d23fb33f0028960d92c5bd3dfa6bb390f6dc708a9f4fec7a3
-7327a97723acf7b62070cd7dffb6aaa77505a05fb292c54baaf428f9b81e5ded
-8c92353e46081e4fc0edf39c53ad0e64a29e34aed73d18e25d0fb73134ca03fb
-382c1f2d703e241986e9bcb36f4a9a45bf183e5898364d95369febc1c8867d7a
-77b76f92c3668ace60e180b685698d403b86e27cb9725405955fecf496aaf327
-e4f5e75ff5123402b23b0e8c5f7cf7ccf1364fbc8d9bcb94f0f3f018a2902f61
-ce2e4992a5dd21e2432a6f412e77b13cc968355f9298c0fda7bef338086560a6
-7c774e05aa3e6d1f0a3b61bc1ea89cbe39423ab0c3bccf10e091a76563ff8b09
-c509f9f69409b7bbe8ccfb574ea7a80cb1ff7502388b4969f91f319e0c609bb5
-c3ab477330dc67d7d900f2cae9890caf14312ba25c8722f73ab0d9b0c884aafb
-b548a565b92af0ff6940d36d40442671cd9513f93d19107cca2462d5432696d0
-97f56f580721b0cc583aee69922f3d0209989ed6e6bf55e70e293c0c3e89f0a7
-caa0d50b519ffe06b5e86068deb84ae448d5041d20e03955b5bbf0d78ae45bbe
-2e548c64687229f1033fe264d1eddd5437e2519aaf8d1f7f2b8acff36cd650a6
-3cac39cb7c215c7b34e29b58fbf5d8493cc1bbc9e4dc92d8df9cbc28cb3884a9
-b5031e13c12ea77e63e74504fb6609b446ea85900cd8351853e71bbaad97ef8c
-14c8691ea4a1b39c94b7ffd97605796e7125ea5a6ef7cb631ed1d7805155f6dc
-d64e6773ab236b4c9eeabdae300229d4710af35c88f3a61fb3934dfcf4756533
-bf1a27c68f82bba998f2abd86aab3b741fa09837a3f32cfb5f0a35732c7df553
-1277c984e1c32777107cfbe7962971b6bc352ef17179d94a3accaa0730f3d360
-ccc9e41a9d019759443990c8ad253b2726872bb53a3e6217b3ecc57242068b70
-1116465f90b58a16e703ad75c3da86b2ca6f6e2f88ce00a60175843321e6e6d1
-8e1fb76455d729634c196a8048ba1d7e399b7e5529e312610cd6e38e11de0500
-47bf6d8e7fc899e90a40f639ab3ed83e4f8614245ae7929da6a8872a15b3b6d8
-c0769d8468fa9911fda9fe875c7f4532d2cd641d8024b1b43de1d9fc0cf0dd55
-0337769be1a0da6afa42b12c8b3d21ea450df447196ed23071ecc65385cf7111
-d025b3d4d396fc2ff5f814fc7b249b88c012765d66402a3cf926e3769522c650
-62336560b22fd0865350c75541ddece29da646b137d467aea2b14e0c8a9d004d
-c914e1e36247f010d5acdfc06a5a86477392e6b5df8bfa0201bd160c16edd42a
-1611d8569db8d294d64cd76f9132970e961a57cbc9478fa37507f44197d73490
-3a6aa1706d0e0b4115e3c6bddbd4cf4be087fe8cdde3a8d764b299fcaefbf13a
-2f480e9385aa9db1d4358cecb9958ef760f6dd14459f2a93bd2d49e354b7a672
-8e6bd45f17e2c6d86512f24234f1e8df4e5ebfab6c094504041adaaea0139028
-5b4223e9cefe6e67c7a055c9b56402202fc3964989ae3d435ab73b071c022aa4
-6c2226809e1c38f8436f42d3ac3a262c94cd71383b50dca30ca2d275ec463405
-e7de48bbfcf53a152083382b8426ce804c958b9aae95a13f2575658991c91988
-e3af9fc6d24986700798775ed0edfe717510f248d3fd68a5e229c9862f7e5850
-1527886041988bcb5fb8e76b80a5292e982f25d51a97a594c4bc30a0cf3739e5
-6381ee320c7a2908da6732b29184ba5312b24e0935fdea476a5aeaa75df407fa
-4ebf181d5a15a5ad7d0561ebf0a4e55c220a9beccae6fd830c0fda764583cc5f
-f59dd84c9c2486afd7039eb22a657ebcb48c5ca9053f9c6671cc6cb448897f01
-a33036fc2438c9afec583261506e1ce938894644af8d14b5af8b020f0061502c
-685d2919d5babfcbb1658002a2b5b6f5fe8636f4addbf97dc7c28eb93dde4f93
-831cb9aec8d2d3f6173f16d4c31ae3871e4bfad4b652c0f5e11af2270c983cf7
-47e3d8ef4619c2d76db67ffac11988cf3e7f6a2976305532a2a2174656a926fc
-1e9dbc981c19937c1fbfd11871ab3b96599182227ba0f840f29bf8533d33e4c0
-052e60cc0a266a97857f7c6bdb412ea779b4094a5ca237960957dd0fa2a37c66
-97db26e03b892bbf9ea9b6e39d131f8ceeaced68e12b7f2ce9ac64dfc61009a6
-a4959924651f7158dc9c25f3e603629c979aac5c308fb57a460f4229ec663d88
-51e6947cc40678dfc56e8472f021d3264c06a3b76cf1f77f4b4d0b1886039d3f
-e166d739bafe7cbfd72331c343fdd7395cb8cda3a85c735bb35a286090b6055b
-62808bd999289763d9e433d22573fa3f069f40aa45df44cd9e17e843e9841828
-d18b10f2325aafb6c872e26486f9c059476a50a4a3654ea8ae9e7f6fb7496a4a
-887054819293cfe78eb82ce32bdaf4c291faee9b01a04ca557cb09e614d0568b
-4fd1eb0cadaa3014aeb0325eb68606f07885a5234e54e76ef6d9769b80e640c1
-8b21a8f0d80f7029228c704ac5d747edc455493f33e844a3b450f36141417a52
-0677fad5d7812b65640113f8daf1c45aac012f587719d26e84e8f98cdbc9e3cd
-a9e148ec08d03ebbc9e875b21ae8a3456a032d39fb1e726effa0b5039871cd72
-6faf210bc4927de53fffa0d987c2232bf27dcecda650bb7d7ebadaa7036079c8
-0f067aa09ade73b0f22f92ca57ab4a1873ed901c7eb934fef1524824604092ff
-6f255608a2ad18636b7f69d842764c672d3392b35b7e12ddc355aaec9023f8c2
-730ddc4e7b49e754e7550c70a21b5bdd7acd0bde562b34faa2ecbbded4956cc6
-45747aaf479ddf5269180428781e96f3589ab47bf5d772b0a6a01eda4dbf27f1
-49cc8d9fc57e95245f9da122f1e3b6a31ca21d7bce9e846b3484bc32310902ff
-acbc3b5e1191ce9a65878695678a3ea186d03fa6cd13b1743f327ab65a848d30
-1dd0abd9aac5b38e9f727365120dd5024f3da20c5cd4f6105490e3e45df85ac1
-300a041e5a5ea1d8d882bbb1afd4cd7156f19a48f43ac58cbab60674b4daaf45
-7528e5c201d32ca7e06ff8719b79b94d6c571a99221e5ef00c8bcd7d82ce818a
-e2c4f8b426438788ba84c02e7c9395b00f9780b7770facde25094236e106c405
-14913fcd39c2d2b0d084931cb5b4ebdda3d91d8a25ecdef23154779b30a277c9
-509902c229d32557328bfb32b20561dc38e88fa16a9ebcd74377ee96dae69167
-87481289a5d322e9c34dce09c833d7e479200afdd9998669b16a30264e72ca70
-f34e79f2c544ab96c323dadda4c9900737121d68aef6978feac182fe1214b1e5
-e2f3321680eb5f0e6fa1f2bee600b07db3d9546954fb6137443956de879d58ad
-cb7d8a870f12a58c5475ab59790565de421f59b39e643ab54f38a94336cc0f6e
-c5c54c6fe6f61d6c6121aad3b9b1d66350061d1679e795c252dc429647c83d29
-c684a07d0b41c72a62be91564cccf41edc5b079b2f06e6a9236addad84d0fc4a
-b5d3403b42c9dbe80d119de3855e1b17498a9c2e827f4a8b85736371e39bc01f
-7d7d14421219d136d182783f5d6f8aadad83109f5bbe65ce504735367ca9b26c
-40e10288fbdea5d46532331eeaabcdd5ea937f1537796f43c7a3ff713ea2c86a
-2f325acf06ef921222eaaa928a4dbc95a9a720bdcab273737e7753294e42a8ab
-3a27daddd130ef705f2702702f39c84de8e5de998f507bc54a69de88621f1968
-bc135bd14c3ce226befa65d8e117c7dad682ce6dd839c443e5368b1dfcbb8cb1
-7357d126b021a47bc4b3eb4967183f4a5ad66bb4ced909993a13f365604432ab
-42bbda92d93d132d4194a64717c65d6bdfad697e3e2c1b2962382d43cfdb20c5
-ed6a61484b3322140ae300953acaff45077505701f7c161f108b902734803f93
-b6e89a2cb7640388248e2c263135f0dcf9d6945f8b648c89ffa5d39911bf196d
-24dd049e561cf823988605fb0b3b2b960be8448dafe7cb335dfd8870f2fed3a5
-ad8784ec4c5835f2aaac6a5f7fdf8f15e1bb5f28296f6af7f8fece5ba290030b
-885e30d245ed99db82c0d669ac135390af59032d6b44b34cf43df8b7e3434bec
-eb8794acf138dbe43d028c6bfb9b27f2690324f201352eaa4f3ae5601cfd4802
-81180cb05c6bb3a90948f261ae1e31edd7b34dd8f1dd2451eff15bc7b881e47e
-98183454b03554d5aaf541f087bf56ad3087681521bf3c7b84c8047d3c23b02f
-b80a55f6a26ea426feb545f7075a84d903e1ee6386e8bf13deef625de5ebef1e
-5d693c8fde15c264113394b035931bfd00308cb7fe9b84d4b18df639a65f454a
-9136598ad3f5fe4a71e2d7ee28ac54ab4735957cd1aeaf5b91247426a706415b
-1f974db500682c188fecb8ec291a81647d09c3326e05a671e6f406140d94a86c
-edccd20538009a2867c3fd9d8b8a703de2f9e2dda4a495f6c8adf2d8da8e06ef
-9f21cc11807dfa35a9732f9fe8bdb8f2406552ab3d67621d23bf5f425b4dbdca
-79a2796dd74cab6305c5a8459e54f5cd6d8ed1768676386d19e483f257b9fcee
-1c8d9a0ad09997343314ad22fd713a49b8a7da1e2302ab57360ac15abf917f4a
-930dece02b588a0564271e207746e4e7c330889a3f272e85120c7d1348379a95
-80f40a595b1a0f939aa46b7eb17d07981136851acc677e78e8715639357668fe
-fb162d0bf9e7b58eb0a0a8e3040de3cc5d6ba9236cfe5a921dc2342167ec9d9b
-1a6ed1b7da0da8474ffed17740221cfeb7de9aad199e58bbddce88ba826a14aa
-9b11abcc6f897453ddca5565a096a79125a192cfebe71ed37b5810f13fa07e1b
-286bca46d8f8c1e76c7ea100c2dcc5501653c7cf156582152bb6aa34ae041580
-6292f09c7c3ccf7581a1d1828a99866f5148de42ab060932d1366c2bd8104053
-f5d3744c9d825171812dbce8ef600b937ec0430f4a6129d69fefbefbd94aeaa5
-12673d7ab07f05528c529d4552ed20f00e8bfe54721cd959ccbca7f5c1850168
-5d5ab669a3aabbf6d431a429696274df399f3cf3760a4ac9453d407b211b2bd1
-b8416c1c23b3e68343ec28cc5e520fc2dacff7d41274aeb8f77beb6174560e35
-fcbf7fc20042393bf52b5278402ac5cd9f2e1ecd5a9dba963b9acf08d78cc5ec
-33bf5c620b6f5520cb781a48f247158899cb347b977cd62c54cad66c7e6cfade
-433e5be9ff8af602bdccec15daaa4316c8289921d19f809c20e68fca2b71db82
-df2bf6f0ab9d90b9830d399d838547fecad841b07fc429abdf02d544b41d5e31
-7655829d65c3c4eceb08dedbc1b2db023ad5e524ac9cfba00bbfc2bb2df14d60
-954d55560fa6e2ff31786acf9277e5e2018ea2f839873e3a4cff611d83a1cf8b
-7ea655c6bd34c7904818fd857cfcf4a9b39e5fd5cc551655dd75602a432a077e
-653d3096ebdfe93e0c7c7fdb0e52ac0145a5857d5bc46daccc9d9bc048cd6e56
-1ac2f5cac16d537abcf20dfe3c6aba54f400573da27a781dcbcee2bae55db664
-18f8f003aba535662a2c891070ae99839b4e0fcdf5ff9b7201ff83bbc9a5d39e
-bb61de440b63d08fe86bbb51e251a65501f8ace59ec1907c1268c639012974f0
-d8c09babdaad610d2c065174687fa1d783dad6567f1bc9056b4e7f90796ae034
-529735bb2c26f89166b67385c0b3ea8befaf0d3c5d2021c5e95f332659f57c20
-7b74c058fe712f9f6f7bba2afa24d922819590e2fdaa7b44e2b7a401fad4d28f
-05ab33026864f395ec60b658d42784533883b1cf6d5c32baf24262d835be78f1
-eb7b30ab043abc420085fc13622e1eea3438d9736c4ea328912fe1f587d4252d
-bac29ae8f47e156b7183c1b79034bbda31e08619fc106ff4ab743bf8b9d8bfcf
-a8ab6b810c1e1f862201010a3e3da3ebb9457071f5bfc811869fdfa0ea873a0f
-fc47d86b663bb3309bce467a81d6f757f62a195f7c6962a729794666635c8703
-db1e2d71ae67d5dcbae3cbf5b948eaae1e7e7ee478a0e4584ed70a019449b463
-9f812dea0ca7e191c9698c48defd784c76b4692337749365039b13055ad9114b
-1a456477c879893ec3bdd4d34184ae5f3e7bbd8b8ac1abeb315540673a792b21
-6473e225bf2b925d77276d0741cc50fb9ffdd34459642d337c044cb4d58c123d
-652dffe4dc9fb7df87bef364cd7d62d8fe7046cdcf4b387798754c409fea2867
-c3c3e9603e79d53c02465ed8b57b752f76477dbbd1c8945522901478aacf4871
-c3dc4aa90b10c08351d608a02d168a5978fba8eebb48ec93653a8e178d44daba
-e42ec334aea08544a01dd57943e050e87fdf8200d2cc475c02dff5ab8f90e58b
-d3efce06d49ea472df3f149b629059dd9e839536fe014503ebd1e6acc1c35637
-bee2f01138614af7521c7a9b0ad46187f168e387a095d795c067660f71b43521
-7132c561f442b12f84e183d1f5dc887b3e38f904dfa73777e7bd7d3ab6e91fe8
-fed58db8f42e4b65856d633c75e5c9f27fa20a7c352f30d2ceda868f61fc0548
-f2ef8ebcaa18fcbb4439ad597a2f2d89ecba33181e770d5e8b89d95ac0c9b137
-a8cabedafbb3a2071a0484c54dc24ba3b00314555dd3268690308c839cb0f0e0
-410116d5bdea76dc4e37d89e5262df1a2d5214bdc3287a67e7657cf5b5f66892
-0e5b549eb0929093bc809afe32a60894d7d5dbcc546b0664cdea07442c75ad9d
-8bcd96bc17af39925125ccad1a305829e9054454ae7db205fdb3c459836ae540
-ce773785b55b103bbb400a6472c14b125d85426138c06d67c5944cd0cb27b224
-e1dba5ac9631e37b2a3ef25adfb0271f729f6c4b9402771e0dac6068e12a0df7
-7dfe8ff7eabc22211bdc35062527e1ef26da58a905331a5062c66abafb46feb5
-05aa06ae1a4d7e88143666dc8a7add3f049fdede30f7785f968dbb0ea2de8bf0
-a08da2f0c9473885963b710f96fed7751c4ce01b4f954e486325488951d4bf83
-01662f9bb15f48623f8b61c7bf7dd47fc35e73669f03286ac8b1d714dfb24415
-7083b0340c5535e329f6a114070d01df96675ca34d6a0280ae26e81a64ce055a
-8261cf5db776cfae5cf1fdc3f8bee14efdd08b832ac93ed7094b7e57a02b86c1
-574ed345d13e9f9ee91bc99fff620fba401de9c6265a1ab696a581e15a3e5d56
-dc74fc5c276b7d1136c94e1816aa95c0f3207ee25769b17948d9a4aa60f7968b
-e033c5e124780bc4f532ec96f64e542a0851a75664b073dd16034e76adc06931
-5f5f2492fb97859d59cf2f6fa3a6053caf4013c4f47469b9bb1636e7017a0c3f
-5d90c8d94894613b51895a11f37e9f31fd98a37bbf4cc1e01e5420556160dcc1
-25bd769c66ebe645bfdd4eaa9c53d414ab9757c860861eac507a612a9309e5fe
-e75c85868fc360a41846a8fc79b60a175606bce995b584b5d645f9223b7b3a3c
-e4e249600921f783ec8f13abf5aaa3b5008389c46da5721dc304f56d7ed99f40
-264d7c378d96a6d1a960cc2e412a85fc3a2c47c6f70edf2cedede7cf39d8512b
-9679bb345fbc28716239bd95246b59d21a9d8378897e9c7607af76ce59e66ca9
-d07928d73ca7744dc5cddfbdac11468497cfc89dfa1a24b120753229598af48d
-0d2e6332a73189656cd1f584496e6f3b1552b04cdd6e51a8388dcaee3dcf8c88
-072651ee9cd44e3cf938172570ebb994bb821bc04e1a7723e16ea720bd8cceb8
-af7ddbb6ac14a58e144ebc37819ce9f2e78c0b8e5f68ed48a5529e47b2d9a7d5
-b381bbbf863a318d719ac4e678cc1092f721b5ca28430dd1b597004390ca2a34
-a54e73d1d8a556c14c4f04eddb0adfa43ce6ec57c8fd98ef7abc2cefbe991786
-a58ff65ee2bcc0ac940a0f07e367c032f0a306375948b54546c7379053ce25a5
-707d9c54aaeabe39fadadd74e1710f617d751f7751d396c5d054d28f93314ea1
-0e6803b627f3e1a1b2a2c4f14a8e9f9da3a032f7bfd872f86470b2f50e7247f8
-97ac03b1a4fc9ae5fe6dd088171746706b39432cacff853edf1b2fe87208a44b
-c1304b88b88f70b2c7596cf5ea33d9d11317da7dd2b8497aac6100ca08551dd2
-a57ce4efd1522a62f292caf6e273878073c82f48a6c9f10c42be92c439cf49aa
-8d4302a85a9f6f313ffeeef59e54aac64b7dbaa8265613f46e62d9a93b3e5740
-9eed68eea907fc84a6ad170b8e1ca16b62e46b1067f28eb6b35756c71443e0e7
-f0ea70df14dba384368a68baef33b7b2105085d179980d6622db47c1dd4f027c
-0fb25e8b1ed04be113f6961107c235eec39afa4db672fccd5c11737b22ca2a50
-af750d838462311c1111d31211fc41b76a96197ed5f62505bd627efc44c98cbb
-12d82f9969735d8f4f36e097ef1cc66629b901cd7d530d74521decc86ccc0707
-07e8a5208fd26e0fca9dc03e4b5b5bb6ee8d899d439457f139f7d2eaa4dc6676
-a411a40412cf8808cd1e9ece8df377dd30af8dcb28e8635c0596c9f68728a877
-671ff5872c81635145e98e055dbf7eff602a4cd98986e49a26c3754b8a264b99
-b53dde3ac4448ba76a550df75661094484ae263c8bc0613152890d17b1a09774
-a16fec15c779257a9038a6b81ce29162050e1fcdfb9aa0c88dad199a74470938
-21b4585d40e628823c42a45bad0c67427ae3dea6367b69d76820550cf3b9820b
-043f6c646cf42d20f1241d0ce8196b2c652e9e10278545cd289bcf37c813fe83
-1a437c6e4991750aa4c7970e200b86ec8e26657deaf058e633011946e8569c27
-fa7da592b78df95c94607eb1779393c5c2b4de50c425384431505a93cef43c13
-e042c12a57eeaa2c48d002369aceedda1b7866c865c8f043bc4e50d824d2e312
-04bd8c1a4d01a688bb2133a4ef37b858fe1de27fdf8e5382e4a3f323e016e151
-8b1da5df2706b1d76b72db59fd5753e23b41306070650d6990cc2e7ba3014d2f
-fde0d8e36ddc3de6917bf3ef03c84f8eafdbfa7dce1c3007bb57c3860f65e991
-13cbca57852b97ed21a7a55ea9f0803d13accab45fac1e4009be81d3da217dae
-45b421d6a76150d7997de83c0aec3d7c09d5e0cacc5678f2834e21c22aeb8ab7
-aa20ed2112bf7d3583cb287740f2e6f828f9d07385eafed61527d19055cdb129
-e1e5f1326edb56d107250346184e4580fe83bf44e2343cac0f366e04dc9aba72
-0261224f33ea17f779ca8532400edad7ac6a5868a0251b030360b1ec93aad4dd
-04caa52edd01246e2e275f007849b317394f9ef09064dfa18fd3c0b32ab4073c
-855cd08ffd407d937292f54b0857c281b0d7dc4ded8070d8616e92faac8fdecc
-710a60c61f88319733d888795c8b45ed895fd29863943b6632336aa49c2fe365
-752b6463cefbc1fcec8e8ace944ba4d35a4dbd87a519eb5ce02348e106c3eb9f
-a57577ba58e7d357e55259f182f72c426eb9e12daa1cee7210f75cd7519fa1bf
-80b5b2f3bb7eef8348e39c270336f4c96a4e458f71699be5eb94f26d0c7ae5a1
-b815789c4c038cdc8285c6394b442ae05dd2322f5aa943badddad4449606020b
-f0f63647645d0c1cefe0a0e4964c2f2c9df5754c5d671182d8e15774752e06e4
-f9bc5cb91fc5d31fe4fe2f9bfcb53b920c22ce8d0c244851c9433f2d8f9d00be
-47a03a8d4246ed7a9a9bf27235f7537d071a6208b6eaca1b2b6c7c43e4354a23
-b97ba4ecaa7d93fbb73a4bda88c406a9a1fbd9861252f03b2385c3517c321411
-2f968c018db6e3e3de8246c05da9f4dfa2b5d0f2cd2fc3ccc8005486b9c1d1be
-e1e8c14ffa77b18c024a98dc5a38b6b0e057d80111e7d2296414e87276c13da0
-e550c489381ec3da91eb4dcca6affcec210ecee0c8911fd338b9dc590d17896c
-9f96dd780503bb15e0638db81ce3f26b1857c3705fed78959c83ba079e49fd0e
-08b3a60d8641ff061398f779498633441313aaad5d54e4b3fdef4e0ce6013b20
-f17c6b7b1bcf14289c52cd55b0c456a69960f32fc06077819f32bade75c69b23
-bc97b0dc78532580f9fcb1a7d13b2dca90785a7e958b579d397a5df187d4b0b5
-f76282b4b00e94c92cc3653a047ea5a003a72f2fa4053e3e9098f82944131394
-8c471657767911fafb254abb22cb50693c8c644096a922069e2e2498d230bd19
-4d2cfb8086eff1761fa2b13a0ea61d6ee0923c7c4d31897eebeb1d73982e21d9
-66f303ae3ec4dc108f8ff4da3bb381be3f4050d101d37042b11b314535a1c370
-1b3dd8305868241efaeb394ea2d3efbfbbf3cadaad79416bcd47f8c19cec479d
-19bc73567bfe6d55713ad85a42337200752777a1af0bdfe46bd53534c4fee290
-c23aa58863bc3d0f1afc9622c886244c3da73f429f8a130510505b554f1688b7
-709b0282c94e36468a0af39d04fe42825369197784a82d13011cb3d193bc40d5
-5ca5393d2b32c57abbed3a0bdcf6f5dc0bf26c97aa46daa4269d6e2e104a78a5
-c96a39b4b121958a0e643244f646480b348563e417335e5703c368081c178054
-293bd69b1d6de52d140ac2dba03cf45c83dcadcddc046526b004373d8aa9d2fc
-bd3b354ea1136b0161a7de8ba06051f3cc22b028a2f76b6780f74c5509c49268
-0ac5e71a1578e344dfa147d4136d57a579bbae76a482d742b44ca381a96ee349
-613690f1a6f8bb1e8af1df6b2555681485122512162894c2e85b2b9a3bf5628c
-2a7d925e263edcf66eda45022c012d0ae52faced11324543ce842b5c6349a832
-d91999d162fdeea3451b87671f83bfe321726a6244d6f948088c0392d140d0d5
-5931ea72d9f6ef32bfbddc2fc6ed0c50decba208beefbe2da0f1b6d918f55ecd
-be29f3017d358dcc4a3daad96fbd6edce1a0144dcd3bac07d163935f8580040b
-426a9434da7a234354e273f62500f88237cba7771d4ca0f50a506f07b7eced7a
-6704154a7eb342bf879fc79f7bc6c488a155fadb56df553ac0b5546cdf3a167c
-528b6ea5f65f0e02c863a738ffba4c4a0fb67a788609bcea6e504547c6e66cd4
-45ac2c76dcde706679ef2d509f7f45624afc984e0a3f2bb2e1d1364b038d214c
-11260ea09afb681a4fdea1df8aa130bfe08ecb071e7fdc72c90dc1b114d81935
-92e0b7a609fe06b2c805730195748a02b1879ee6e350c7837c109063628d1f76
-e39e0b4fd212b2da075c82e052a9f66be9446c306a956f412a39fa903e430eba
-d831d86c7f66765f92137a8cf309cefde84580726dd922a4defc48604b992684
-a793c7a25a21438dc7eed60e0a0c82007888457ff63cbab3184d5009ebc30428
-b5c1359c3fd71ae27bccf2be4eeabd9ad709ac34bc6afeb60c3afecc39358bdc
-5b56f65b2768111635621d7797882dd1db755d26bb2e0f03b1a8d80f902c3960
-396dfc9aeca6ff7d42e7f6b4f83d1f217a68f3affb54e7e9aa1d0524e1bab538
-3843852ddf61b2ad706af3d609a8d1f841f9e9d12b1b0f92f3b47b0dd0bc5f04
-866528c0f63db3feab76645cde31f0283fb8c711fc34504697fa0cfb8cd7b150
-172cfc93d64ab6a1da1bc96d501d49ac87cc6a04db1635c167a1fdb58eb9e3cb
-94c90d2f9046890700513232d5bf1678651012e2f817114f46a1019e72220d7e
-d216d12712bb8ae73140aeeb48a3339dc1d5a6efac1e8f50c92b58e32725424e
-ba86033bb1bba686695cedd75be66d54275c8ddecbdcbbdda44f595e6b686af6
-f6117bcef51df5e3c98e90171952a23f445c2bca9b8626400905fdce9e0464b1
-c1d241ae619844513e9cc3a58a6f978089d209bd775438d7b87108a342c76b62
-8c3a6a28b9d0c42e696f3d5908cb2c70d8d3ead811ef4dd19023faf86ee053c3
-014ff20983774efe8e26646abda4954ead06c80c7670
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/UTRG____.pfa b/lib/fonts/UTRG____.pfa
deleted file mode 100644
index d9fa0e782d..0000000000
--- a/lib/fonts/UTRG____.pfa
+++ /dev/null
@@ -1,1126 +0,0 @@
-%!PS-AdobeFont-1.0: Utopia-Regular 001.001
-%%CreationDate: Wed Oct 2 19:10:38 1991
-%%VMusage: 32987 39879
-%% Utopia is a registered trademark of Adobe Systems Incorporated.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 1989, 1991 Adobe Systems Incorporated. All Rights Reserved.Utopia is a registered trademark of Adobe Systems Incorporated.) readonly def
-/FullName (Utopia Regular) readonly def
-/FamilyName (Utopia) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Utopia-Regular def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 36552 def
-/FontBBox{-158 -250 1158 890}readonly def
-currentdict end
-currentfile eexec
-fa444f2716d92b815f58ca9049c815358e22e32e73a3e6a653c538ee56873363
-67713b8cab082730570f5b5efcf34c2cdfb6f8dd2b7905a37c1924a2424c16e8
-711db76501f564506b0f45fef10d83c3e3c6df2dc0af7802e7f42c81b4243697
-ca09088b868d983e79e4b2c3e17321993cc8837921fd4ff7b92a1294c5ba33e6
-8fd40e63df624b51865721e034f71bf57bee0e0c2a9c169c7a626496540d45db
-585d2bc93f83e6829eacb859a194d7a57904cfae75e6188c7121003ae40153f0
-0fe6fb52f339e72d4aef38469328465a3bf0ca1ef58dfb447612eef4ada248e3
-ca525b0884971b85099d73538152affcad51d03eb4060a5c580f453ee78e5c4b
-991f77c6e9600c135395d56335a7c3a75c0341979d6b404ee496214a5d20ae06
-e17d80d37bd3540b8fe913bae1674afe37d0c41e3d9836a7b5147be32f9ba01a
-df1a73b89d30bb595a4b279032e37c8230b6d4933065947c3e9150d2c7c4d439
-d60197eb69991ef059edf886ec0bdd28158a71a2df96dcb67fc0bf81c34cf27e
-12d6ec950a75993af99fbb040af595134198151e7361672d8538cfadb4716785
-dbd48da442ccc911ae9157b14e433559dba1a1c5619e99b57274d6998eeca3a4
-7e804d8fe3a664f39f33237831385949a230a21e52a2dda733f2f89b02ef4ce2
-5d603c9bd2f8e4c0443070940f0380dd1ac60ff462a9a71965a79d787e0711df
-0a69bd86a4846965ac6c77f2e1699c4620c1bd9f5b2263e13a2213631c55f7ab
-cf60d2e63a7830d5011d9b9934bcee2103f4a5d56942ce0f590a15dab480e5e5
-723afc8e1d8d96f3e0d8629b88ee477ea6cb8121b0adddf20405f8a32756004a
-8a59b2cf922a6dc0747bc15e99079aa12ac0d9fabf8b47c5a61ca5268e01317e
-1f0a38c468ffea597a392ae3399daf7c03126987750258b5e077d703cdbe05b9
-a5fc4d80e8551c2c06a2c579272877fd462fac6569a7a9f964797df79628ba7f
-f77447fc2aefb25089ce946e0aa5c5ff21370f0cf84d8e2affa8b30891081b16
-6fb86fdfe65e7e02ee551c6b3e2e324cf7e18664883dc538018ec8cadf7093f4
-a13708013d6ca2afdf644c0155342917c2725598fcafddaf8807200682fcf04a
-4efd5919c21ed2ec2f7951c2db953ed292a54783f5c541bca68d305b05df5c5c
-f17b9af31035dd8a77ed8b54d4de7d684f54c58a28f0dc55e7c692cfe444216b
-18751c24ec1c8a00a5cbd458a0ad54e7c13f26b4c4257fd992fbd1338845fc69
-6b97a2ee6a4d4f03fd387e745eeb8e97eb67e40bacbdf1d6c08e9fa2e317d30a
-c4234559096affd5b2e65602ad9c4868e24d7f1d35e8b6679e436a010be5ebd1
-52666a26ba7f7b68a693add1d21138ad64425e9202a043cec98ebc182c152b93
-9f88cb8c89069b72f3c264e2bea7cea9aedf1a8736beb55cc77b02e3989e7013
-b4fdec2767194fa85b1aba185aa01fc8902209068fadfd1d282a59f8b1d7e30e
-3829383779fb9a28404759c595b986deb7c59d315023e542b461327e8645f440
-3d1b571403e30d988d5d17b09590d644cdaa885cf36881602f220a7891130e31
-2ed47ee703368c5beb240427e1b30446dae522143ffeac91f3bd6a3ea5c57a63
-f81919870daf71d9b522529438d5e51173973f612b3afa5e4c5c042c8a8a4ed8
-27d00b1f5a102ba8a11ee7d942e1954cf35b875abb184df026b1f600b27aca0e
-4dfea33866de9d8b6b8829c128876a2b882b1aa1518285d87de3c39bd74863aa
-229a0108f3070908664f4f77a62f0e67923d844c9ef91a6affb8a72606f5085d
-88c35fb9e8eeeb663742369e6b0ab87c82e3eec3dec4adb2098cb25a35d543a9
-70025ebe038e7057a8d0e8f7b2eb86418dc39b494884bee8c92c87f1af4cfc44
-c14a177f200389c0a23c24ef1c59e9a143756c1ac0ae50a12a82228faecf86c3
-4f7ba61f010a0d285063676097c7c3fad3b19479c8c50d712b48ab99e4858096
-a1799936df4bfc4169e5544adddf343c7fcb63e83e2b2b6eb68c8a33edf201c6
-5d89e5b0c3d21d1aad02bb07fd463f763c09dcbbf7c216b1554a9402a8eeb5cc
-9de4edf0753d8882ad183a9d14e2de51fd81daee2ddf53745a076dbbb790cdda
-4b25bcea0f98d832886f26bc15fdae9ebfe42f0a95b7d02c0f65ebb1fa0d730d
-a1f6d63c3da03f9ee0961f5e93cf943915e0dae3147e4c100fc97859f1db0e39
-a85a06f140305e9cad70247718385e9151a091aa9a09552c199e3ab164f28270
-fc60a08b30ce11e5d115577e54b57c73b2008fe0f9679cb7d60c3c80b8e63cc1
-046a093b0838c832125c9084c9d3691fdf6236f1e4b2cbbb4ce8d898d4c27a97
-5f4eb9ee7e3c2d1a694465a632356ac7c06abb42f89eb2791ecd146d29fae767
-2f132e065ae5f5432a5705414049f68b871b55c409ac3f02cddb56deb21c8d4b
-202b93e8a5f22d09b287fde695e9beab9fb790fadf1250dedfc8188b0a3975be
-db8973fd1ee42841b2bf6ae539bd46d0339dee6804a92a0c32ca204ec9897f76
-95d04cd16c3e09f37306109da8b55b5c69660682e8328724655f88a08f11f9b0
-6d3f1629240662f0a0ca024f16265503390d9adf8b521d971d419a4cbc15d322
-1eaa0b79e4a45d2f0bfc9bcbf135e44b937e4bed0a4ea896da90e40bd793ff7a
-d0bf85fed6224690f801cd8c0100c4a79be124833774b86ead4d58bfd2598e52
-6bb5d08264df1c4ccd29a918bb27d7c75d0fea288e066a74236de1828a0c9fe9
-6b1de344a4f57ff0997707f9e83c25cc5639ffcf2cd01152d9f676a80c637a69
-5cba153263f8c1d93bfc03642796263c3b460b1fb22fd4f63e742064a337d1cb
-c12ad7b5c36cfb0a62341c849e97ed8a6b5e3e93911dfbe3795f9debeb3cf7bd
-6311ccabcd1d80c76d608e0366e23725b4c27210c788f25726bcb13149c781b1
-3e77341630a99a22cd95717254844bfd4221df25ab740978011a301861c4f0cd
-cbf77e1b69b90ecd4aba88d2c0298bf525c4f6f0be9d34d74371517e485eda6b
-d38374ebc2ec4abd9b7969b426b40c356982b735289f80583b377ebca2c14068
-77d7a6516135878a18deefa530a88685cf0bb9ba03c45d283510a68b17853cbf
-c1c16428a598e078564a8d50bb1171771ff483ee395ed074d7f524eb8af23061
-5b30a01122d440365c7787ff477ce068ad1c8e4f9a409199138cf49a435326f3
-645d5e093179b96831b7dfc926ad11a2b9bf2ed3a5f4ad135278dceabe5f8aaf
-298bcf406c9c11cfb55400fcae95910ea7c09e607a1c2447ee82ce7e3faedbdc
-2b1827ec539eae6ae25927a35be1aa6b7951073746e5f684f758fcabea3cac25
-f608e033b3c92cb05b7c9738d3a6d2cd5e0c2d29b968ed7c7bb43d7fe734a959
-7636ca80ee97f6d88550c39d36db458997a98e8bef087c1000add77f8c6d24dd
-2e0f6f4772ef61c5bd5148c3d67dbe77df27a300e5d8c9e4b325a6d8cbbe8675
-15ad15966b130bf4499ea1923bef7a9047eb1b0d35acbf0b8303fa08b26c706b
-7368332adefb42b66dd9ccf61fdfba00b5aee231c2232e8d752703b0af6ae850
-ab8274563f8fead4bbe9fe860dfd95a6a7e0cfa3d8f6ebd0e066cdfd396d8c57
-f8f17bce0c5678649034a62418dd2463b8f963b43ca02d011a9a1ac4aef9c9fe
-151ef8c726e376158dacf1131f0ee855156d95730d3626003e51983624b417ad
-c258164ed5b2bd3d4e562f16da8a0b69871787cd9142d297ea3fadad3c2c6dfe
-3491c8313c2608cfb1d6a6b21d9569049031b0cfc1d9e96a7186164e04d713a3
-2f1350ab08811688619335e7f331cbf390039502cfa7f68ebcbd75937862add8
-f0c7f498d6695e9d48c4d3e07753062a992675f1eea3cbae77c7bf35433bf424
-45aeaae7876749942982520abcbe95a7ceeaff412a02f6922a1e6c05e9a94d82
-11db8144984dcec1d1fd6418934a57338e070b19ce6d45c0f861e429b3828c9a
-c98821dc4ec4d5b7f64cfef16380c478bc5a0ea0c4b82d94e3e01067b3027c73
-e93899ee5f37db55e0be88844dc7c5a538e43510a65716320dac3e01e164fe26
-3406de45c19c250cd2a9c3bb3bb7cd5fafe16d9eb7e00d012b65668104a68eff
-bd0c11b55497378896ac50abb47a6daa32f7c21cd34b19f3f797d883fc8745c7
-db21a910abd7e9733239c6751f71b126bd8e26f7cb16bcbe5a066cda9fce63e0
-a9d40a9527bdca47211648ec231d0aad9f4659cad640181b76d6b02309365348
-4e7e328bb1f7280ed4f8fb571d05a7a55842ad1dd294cc46cda410160f2f7c09
-4a34dbb0aca809a6271c8fc97f4103bd83b701f2f474e0bd1e7f37fb7d898e16
-6612f9b03e25bffde2a8d6ae1dac8b7c28b67c371ceaf8020ffc9e1e35973dee
-63cfb07a6e3eee03799b4841d195eba565c03e10998fb80fb279fa123c2e8dae
-94644927b473c414c1fd0fa0b359a279310e23fe44104f0988de3345d9aab3e1
-e64dd94ec8a6c20556d785e7e4f4bec46c0de73185fdf9a84c6f46ffe7c52c1d
-c7d62ad792987dccc225abddbb6fed504864476f1e8d0e2ae009de5f4c50bc6d
-8d3902c6c169cc0c2008dafeade6308daa473bc4f8af398ad4a8300f6b989271
-dd59f6d52ee210bab4028b4160979401ed9f626526e43b2362ff92b208a29b04
-8110c2801db3a59f1cbb89139c80bf025d45d61b2bbb6fed4456089976a94d82
-a094aa8201027413899a402050ddc0421afe5d357a8d8e0ab398e01da601a0e5
-1c6bdb86ca2d064b2d8af3ab7a8d39a564d2c2cfbb74f62aebe4c9cdb668909f
-2d83bf84894edf23a3db2d3b4ed77d091f21ff313c67a0abab68e57a541942f8
-58ebe5334687a8dfa0bc1eccfcb1b793d5aff3d7479a72ef70b3490f7ef3dbcc
-1beef6d171dc7cf8acb25d04181009407b2d61dfb7de55cc433272a46e86a74f
-a8a5bc69419e54c39220b7b3b716c5c4cac5313e4d8e1389a2217de9ebc0a4eb
-f72dd28b7b2e7481457123167f2a138a2a9ab099706c81b83e3a02a9f9e2e321
-c9658c611fba436a649d72ab9be1707e3711d20e15d778bfeeba66b09286be38
-2f903ec637a8ea274ef8a8c488c5cfeaaf616fa0e090ca2c7a767048b6086dc0
-ea0e3bbc8ef9d01a74cb264b3ca824f0d6ad786127c61d0d8ad13c31e5a25555
-ef5e64e1d19d150d24d1459e8da3ad799fa554dc7877a417f51dd1a3a02e7341
-51b6cd7a2c6915127017f748942865f30fe048b7e749bcba0e015761c0a9e1cd
-e1cbae4bb1807245d7547f062a05c1f13a753eb6fc3473caf620347338bae987
-1d2bf08764c309b32b0c915b4735481e25259f53c53c144b8ea3e8c2a4dc2725
-85e197f684936c0690e497653a46a7b86c7e57b8f4c890319279034cedc18bfc
-ebe1828d23cae6d1fa854149d1cde376470869f9383e83ccab2af11c2d35eb8f
-1bc9273cd399c7e8478ecf742c2db209479460e310f8013f1a64a385209d2e30
-000d71f5fcf62f251989a3d852b9c36e57273a60d565aa387236f61162e46821
-9f755ec5501247ae6bd14644106c04f36662afe7c3cf741664c6a4789f3f8ce5
-baf6e347f6564be8d6fd92ba9bf04ef31c9fd60a2650b1086f9a244a113d85e9
-405dcf23e29d7b46281baf01728b7355b8a1e50febf4443c2d1a2560cd47d652
-cfec6f5cbe060f8c1b20fd4720ed00186609c40771ec8db4e7e4434eff8aec89
-007816aa98863f8f8fd3ca454bc228bcf4d2522d948ab346b5137f1cb52b5a52
-3877acaca92215b9fba427112786c2fac9e5b57879d28249d2d71040aba21fc0
-f73498c856cbc6c5a5f25bbcf19ec97768b8ee9aad3436536a9ff8f22ff72206
-8555d0356ab16b1fce02b79220323bfee1ebbf156308bed2d91febd3f3a13927
-be4d619c75ed738dc1913971fab9a76bf697c6ce9db692d0495abb1034fe31c7
-23eea2feaee80aa07117c16008a7b5e00a13fe2dba4c4e3174762c28da98a191
-0d15eeef183cb994c829de35324614301a6e98311d9f5f282d28da1b485997ec
-41eab629352822a5583d307d6d417b869f6dfeb158523a581557f6acf91c4f28
-ba0af9e428099b152946769932a190410319fa3cf1274c6745ab16df56afc3eb
-4e67f521dd52f3e3b38e41d0055a8bb6f957817850d693f76c2237f78ef9e660
-9ba5ec79bb0cbb08f461991a7baf70e3f8c8d619c0ec7d3d7aeb964f2e8b7113
-8e9868c98d8fa3a5769147fb72bb82ae844c1331ab285dda9df924cf36f2200c
-b0c4b28f19aca7c4591413c8e89ce410d469a7844af4ad00b6089d1efa64de2d
-49069a4094f2af0552b68fbe03655686cd845e46a319cebb984fa717b7fc2565
-4cc9843d079512d8ad6d58d55332a962c7b20514d1b53818b47d028b59ec1176
-43d3571e690531d6980c0bbf2150f5afadf3198dfc48995afc745a8fd0b40b7b
-d48c00010ebce60dcf13ad056bb53ad3e7a3d0984dc28b8b4aa109ed4d62bbf9
-9f7be92fccdaab5c52cda9fdc972e55a933b2c4c1d2c54ed5d88ec8132d0241a
-91fda05af2a736547dbc1da85588b04ac56602cd9335d9a31bcbc50a5e13626f
-f86b9cf6bf32d2a5b6c4a3754f9447e2eefdb2207e1c277794bfa5defc88cc63
-1ff2093a0100c2db33baeb231846754a10eafd8640674dc03d737446a345eda9
-fa03143bcd01de7aa1486de001ff31f1f7e67681017a32dc46f8a9aec6cc0573
-4a0253dab3476519de29344ad7b0eee93d0e4438bc852f4ff4d018a690781924
-1730a369bd2312732816efa8000f0b30e8d19b8551857eba645f76f38257d96e
-4088b20e11f5485dafce80ab03820127a291acd4ddfadd039c03962078aee0fa
-6429e748bd3ea0290ac67f1c14eb8f63cd5b7f4a3e61b91f3428a73509151784
-3ec501946e468e8b68374ff8b0560cdd38f2eeb263106ddedaf7d54ff1ed7c65
-c9910de2993171eb6f5d9a4f0fc3368d6f6b5e57e280fd9c5c1969cc814d46ae
-81c2ab001f03e1aaff8017b6d7e84cdf0e3a747daa3d2e1d674cc49c8049e8f5
-8914f54313f1084396beb5defd89dfd0d73ff6ba76ece9939b988bc5353f221b
-e4bb40b79c19612319d196938935747e96030a5df12caadc7afe24878a2d6e82
-5230548f931259546b44b4460eded3188fd76d06a2d0392e2371036401e9ba72
-a14e50d6aac474d148a40872f222d3d3ea322c37aed0d04cbe2551e513e40943
-04b30dfb33710c66f3df8e24296604bb84e3e498200d942bf52c452f79b855f7
-bfc47420a44f80ea16be3f8e0716695d20ba1d28739ae88c04ed2848b70d7369
-46734ecac041a14ce87397706f1ddc57144b7a61231a1d0e458d3d6d014ce66a
-b6e37b46774a7a9c74d6a5b636303d3002151be679abfbb7399a0dcae5bcb5d8
-7c84bbc66fa03df92d4f5ae78e85313acd62522caf4fafd187c553302e692133
-f7971b24b92b9e0321f93e7b747bd6ae5f51cdbb247d36255740752549bcf8a0
-09e774a01bead6ad931c11453a179e0ae2d23c09acb7b2bdcb16fbecf07515da
-0ac8a4b2728b3d5c8945aaf10fcf770008a0aafd33c402b7304f6b203d0d6a7a
-be7a27608b10f9d67c39f5fa2c09ba5900f0a6e6c6bcea1a0ca14411ada0a36c
-d19c25ddd2d29ab25d4cb7dc3afaa0f5aad7e22761863cfb427fc4fb8c991251
-31cd3376c227747a6d3afedd341a4e6474ba273e687640eec85bae3bc83d762c
-3380159c2af1dc118fa1bd2382d339c5d213bcb89e89fc8241707e9bff40ec4f
-85a889421643ce7a87953bab67fda678da5111da8a95f29290ef70d672f0ef5d
-ce90ee85275392766ca752cb7a2bb9eb416ffce5166a955bcd54fa2082d942c2
-89a0fbac57b9cde759be0b98d0e6f5b51c7dbd6331730a15635edf1a3287c679
-61c0a248578b53559a3d040f8847813ad1d76480c43f4b674bc0659bebf9f1f7
-e8cd4acdc0e0fc27104601abbf25304f8d5aa221e02e73c37868baea6106e069
-88a7b580b091e6c4ef56e0b52bf9055039d2c3de83c3a6d4f8186646a6e1ec4b
-5ee53764f122509d63e339c51b15fdfdade4cba2880c66bd607977684ad01aa6
-d405553066de3d2bde7eb27b332d5bd0371881eb0a9d2c2b7728f827444a13d5
-758591eacaee4121c2a00c05b58357d8053d2223490b5124fa646965a0ddfcde
-0f99b41916f8f80d81970753daa6079aa0014e800c54052e01d0861a7d3add7c
-2b542695ad2a3d6c56190a170d23bb34829b049e2c02c69e79d597fb5d2f9ce2
-713d681f072435c8e3740fb61127f5d3bf4cf1adae5e99e66a0c472076f476c6
-171660a613a35eae2d353cf78a06dbe7dc227dff30a501a547241c6cfe8123ae
-053293e9ed0c1bca42ceddc775a9200420a37ef81552b721c077c005afcee2fd
-fb2e9088451e0260fef0be7dcaf9d0e4eeb3557241bbe429583e4fb813fe1992
-1ffec808630e4b3e64cdf9d2e664802f3f0846f0216b8422245a0363a2a6ccc7
-3f7d8b39438246611428c6c32584976b10375003469fe0efd968e21319e382f7
-50c386b57d7b7e8e4b5dd8dbdb8d816ce712bb7ec4d3a2ccb6fc5784c066f79d
-f9fab8f575b42bb18f22a7f2919364c61e81cd47d0b121bc0352247ad8d83ec9
-36891e106f85e8fe25efaf00582095dc7f16dc48b3cfbc34234aedfdd357643f
-79cea8fb1fa81b91b49f8c063fecaf8b8bf0fddd8f2063eaf6464de3e963acb4
-33a3afa3944fdcdf61597fc7d6caa8e7538a784024ed4cfd497ac35c6796fb14
-65aefd0498b994fca5c74c003c6ea1d6c8f935df6ef5cebc5ae7024986be09a1
-3a368d9da9061aa8ed1015a60778e63640addc44dcf2e32bb1d017f10a319f44
-fc8aaad5cb149ebfafc0dfcd665b07f6387f4e3fa9273815a7c0e87390b89964
-18fe077d8330190a04f348648e1eb790cc3cdb5005afa7dbeda6e102d848e725
-ce4d4a9a9e7dc16a9035892a73bfbbe130b8d059e0282693ba7f062ee031cd38
-edbf41556bdc7c34c6f2547797f2b4b202fcea7d6c1f6d6a890dc850549e2d9f
-d4fed66e6a66f93ac27cfbfe938832d17c171729fb0eedb5befd2d07fee6db06
-ee7d2e5302904d0ca4b21b40e3ed346e6976024f6ddf05ab1b7a339c42d2989b
-8afb7447b2b772f3cae03abfd55b1d14f412109e7e99057c66ed1fc1c842e336
-8f8ad95e67626219b6d538fa55e6146f7c4d2819b6ab69628d3f918d5c21ba65
-6101700f2f9b5d5399a1209e0fe5cf62cd4dd8b065abbb2024b7766478b78d89
-3ea80e633d445a240e27c7671018dbb01e4b38beb85ff02de34a4c06a092467b
-2409c7a6f7d94461d55073a87ced3a6048ee3b688042bcdaf6d4ddbde6edced1
-7c0b7a2317e60410453cba8646e00976bbf1542aa0614f93a6a323de99774176
-bb2babb068c8c29bd4e4cb7f8b3646ceaddcdb611215a5ee9e61bad78d8bd5ff
-f66177e2069d7b4f87c6fb13a61f2772e8632f158b4f1cadb8e3daf55e5df78e
-9d50a27bdece942f579490f570d3eb34cb69203627abe7bbb6c5b2323fd8fa7c
-1a9271f36f727ae3bd9bf660514a052c86625b1245e190fc91df37b7e6960fb5
-1396405a4f2de27f7146ad45f9e5e14755985c189cda794fa21d336354bedd98
-14ccc92cdecbef77ee962b78d053752a22f5ef66879af4d77cc798b2d6579d54
-9077dafbf4dcbe07c70ff56070ffcd869bbf2d96271e461c5432aacb7935ac07
-fd239929e5d27e34c91a785fdcc479b84a99dd3db6711f1026a613d24a6f5de9
-00e4a410ea22a81b1106f6e11edcf83a3a9f3adba5b22b129e3d8f30807303ed
-fe50943d68951bc743e7391d7aa1672fe0dda7fc8a6c2e87aec891a6d8ecc050
-03fbb9bc38114416c4e330c5b7b43ace475f0c8edc9abdf5fc137c9e07f1f8ea
-bb13365b3f7e3dbce2afc9388e9279136ec6e0edb289beeaed74370bcb453884
-3ce1b3afed75a47bfb50b7bf4d267b014f2480cff2d9e21685a64b5a6fad8963
-1d5ccae56079f4871aa6b9b6a7ec8982f266b6eadc060087f2f7af187dadf05f
-c31a47b30f2a250fb501f4faf7e18c3aebff55fa08c74ef27d96aae869a26b2c
-45ba8c84b958db1a7679ad0e6bd09c498543e6d20691b072d84c6760c70e8e90
-ec179e6d00f684e6c2d070f894b98d495cf2d2978b96ea13cebf5c8b9ccfbf05
-72a00358a8faa812b00c06f2ad40237839f0e2ecff57d359a2c2055a1361768e
-f816ffec8254c512e3d57ebb23da610fdfd5e1e16b97e1fe97e10a279a203e6b
-b52f0be0ae9742d1a7faf2a0d5d6e1560d6a3e8e1596fc57a3288fac6a541646
-5ad8c50485e42cb5214d4dcbb82a16c2a15d406698ddefbb5fa3dab291c4020d
-52b76c9f0c91b5516143d99d82611eeded385015cb53e07a30bab7f27f22ac73
-95210586bd245bc0d2366952c1d85ecea90e68e189fc313823433321d6ff1785
-0d8eb6f1e4f2f6153d84b4b0bf198ecca9c87a80dfc33977a9b06e994bd86800
-4ab2f317727243b9c9704fbd88a0e6fb5ab8c94f38c7e20daa078edaa9878c8f
-3509b2c135e9801c79500327adc9537318d0f6b700fe99166d4e7c8f6a41bd45
-6bda6719e0ea158b8aa25e73731e02d215294d91f44985ba21d4045b1f8dcd99
-69a0b36e07b3c7534e9401960683ac1696459b2a45e0a4133d630e5bc81024f0
-b1ed05e19a6991bcab03482ad446a1d542249cc9e1f13e091508eeab9f744a67
-85e3d64fa0c7c79275292a4284f62754d46c0835e432c3a1776396feab389c20
-775f2f94aaec26813eaffc4d1e6b4df16f7b25ad9cd3e8645dff53a354718283
-e6da4a788dca6de2521295f51bd4b41d7b1f06c02f9cf60ad1136425c7996c55
-a00798c6f180ee8bdf52c71c01b48b3798eff89600b2281d68fb2e8567d61d22
-9b31ddd64b49fd662131d12bb500ba609e2f298c237b90c17c4a29e1c4e75ad5
-c1631c7058f7aa486b9c19c760b2bbae67167472490d537d14c9c70437d8a964
-fa40effa6af2862db37b5ba62da47685971093e11103228b85a6a0acc3168486
-cb4d94f0b1b01bb35ff617b5b36a120f82f783752079b66cfbfe2088290ba9c0
-cf8255443a6230274299b82c7e0078a9435c2a48ab298954043521391cdb627a
-efc038208a97a62fefbc2284290e83c78fce56f1f6aa31428092800897d6adc8
-ba2c0bdb767e9b684dd51cb44dafbdd3f084b3ded0fa1af187bedd1e7271ba2d
-9b040ce2d98fd7a56f82191756bb8f582cb83ff0188350d8d5451671a2bb3478
-97ee71a4621d366d810945c790ec3bf4126eee53265a2ddf2bfdb8cb8d78352d
-8032e0b87fb87323d4defe5c5c974db8cf06203d0cfd1470aeb474dc0fa2d32d
-e1ac57cf43f5dc2d2751c84e10a5055ce00c594a0dea8c1f65268de077f06ff5
-c8e083d70fac84a5605eb80c81bdeb92a65fcda58979a93566b29c935b3ad83c
-a1303afe4eef046c2ed3646c0ced2e1066d4eb7f5db11f171b2440a0ca362253
-20098d9388aac930db7be1cffe5d6eb05dca2a6355df026393b99ef5e3cd70c7
-c82ee1fe5cd113766bf011bba63e78b2ddf4d86519aa68bd991d782713ccd2c1
-3f2eea70dc273576aafa2a0d2ed22e35f246e92d88c907425ad6843abbfd75e5
-78e1cbd1e59969cddfd6d26f89e617005718492b51442c55fe617da67d8ebe5f
-bef9bf22357a125d611e04d9e5e28d5178c83e2c3b073c205d7e3a792d4d0232
-c70e596680b5947e6504a7aa48c67795a15160d49d40174fea72dcce9f97edc4
-75d030d02347961b7d725b78c7024f98aa0d4fe953807b39632f0d4531c6c1f3
-7062320fb655447c355e55dac7faed0643d33f14cced8ff7398ec85fd93bef6d
-e6032c7689658a96cb9ddd856fb6c0a4be0fb15bb46c068673374bae1fa73bbc
-20dcaa9398b526128991d68eadf0b90bdfcfd097b2f858363d819fc6ca7fbb47
-6aa237cf38daa9653b5877aa322e3039f86bf54ca078c55a35301fdcad322d14
-8e65067a0e48cd62cecb0d7f50faf272b51c6d0a22c402f0df1373ddef2d3c2f
-25f3c636f9f5f8710bdb1f5998f2040b7bc4bf6dee428357a695e5f177feedc2
-be6ca3d7456f4fb7b97803df6de76aa4bd622cf080800628d35841a838371511
-04623706136658fa3cfacfc116a30542f8825d80532454675cd5c9ef6640dc79
-aeb9c37a0691d14bd260f58995b7ef2cbb236da7a93c042450d940df347494ca
-6d5df95bd04d3077b47926e34610583984253fa1cbaf4b0d544e71d5f7405e49
-41445c23b0a1c3c6882254602d0ae6582f64dddd079f2d112b0dbd31ca685bf3
-dfea6d3f310bea2b2f4cf4154cd37fb19016f703a1f9a045c7e21cc994c0f23c
-5e4a49d0ff47deee398d478302cd0c90380885ab4a59b6f3d50bfaf00d9e7f3f
-0b97562161091b4eb201c7bcd4d1cd239b00df09d03836a63e8a9419cc9dae0b
-493aca2a7fdafe0ff81b6a9896c7e57faf1355fce5f3d54afe62c018a5211fae
-935f1f9795d1606cf77673b699829c9a136c6534438ff817759f8684d5345417
-70f6554539184ad886156fd610f331532d0ed22685d56ed02fa51e265ff34a1e
-fc8cb40b749148ef80016f71cb0647e1232b7450237f686828c36dffba04aa6b
-46a526e693da4fc9e2c84d7245b76ee7dbeb360b2f92b112de8e5feb3e433321
-eb67e59f3a41c7c91e5fc51e811b2ea7a70a9562bcd8fd854d761ef290ca50c8
-16f3c58d8e48d13edc3ba242c35ca241fa15e6243aab8f4b5441cc0cffc1c9e2
-7729da8ba3fe1837504d73bb13ba53ee7029aa5a1b137244be2d16ff3ae6cd71
-8151c53d223def6463c124acf3c37bd5a42e4ccfe3db5d3a22f249d0a5cf59ed
-ab67a3a6cee4f7838314e9e167d3ac722539c6a60e5961cca947c8b9d818802e
-54162eed974283ead7dd09fc33bcefe33a78ae540a98fc6710011f0cd96300bf
-e5b9acc91af99c6b38d005481771655d1b89bf8fc5fa8d682ac36a54753a106d
-6cee95baa71b131786a76f6ca7cd143270f679c91635822a4a2285d6aa44699f
-38603c3af88b82d5658531bf36ff97bb959c44345f51ad2c990347d7f803c2d8
-3345ba5554ec0af247e7ff00f483ea94a3a6407a2d0ccc9fe5a530139336190a
-166575049e84f3964141e64f9f9fbe2feff15930340b49adc782b7ec9c2c24c7
-816b7cf5e7aa3c194b3f50af218aa2b1a69e9772a74cc661a96100f9607fec9f
-0e6a34b6d3b9b6df0d0cdef014c6e3ac43491883a33304b464c3219b883a1f2c
-9a1f882449ce7c0814be53e0a26aedb003f25f8ed3f9506efadba4b8133db373
-d66c0fb02ea5d1db6484418398a374bc43f624dc1dbcb70f9b6b97691d297b4f
-50b0b7aec4de5732ac5db32e488e8131d763ea2234a8b6ba67acc6ba688c3f09
-b1da0f7074b2ec71ef2778dc1dfdfa2b27d74756a43fdf2fb8be3fdc9189166f
-5747a30bfdd73b8507e6d41bff9607a770cd6d30a8b476cb972c896b90f15057
-f3b5095adf44ef4347da078dce7b6a41f01c29abb94e2c70e3b3a24f4169f80a
-7eff7a9b53909f97160964eedcc0862697c872a164be415d28661702c33f4edf
-bc8c172fdcd3e70d3db0341ef1ff453232617b89935a9249bef30cfb7115addc
-c06bac8b37d4363710731a69e3975c983b96bc5b8033cf0c17c4a6dee8e45f61
-53c1683d296a937f733c332fa08bc9f4c5455e308733567fb7b51300c3dd4665
-15a2d90c58d2155270e64f2a555f45084bc75cc2fcc2dd5ed0582943a7a5359a
-4fab1a5310c083343ccab56c224f114e46c8e6f8233e9fb01a352048144592ee
-fbffbe37b26c257f91220d792dd0f08da33f10baa54d92044f24646f9b998283
-1bb052d3873debe609ab925b8cab12a80067e52adaa1bc0f469b0406c975a17a
-c99594a7a8c7ff29754319338e16508989ecf307e9ea3680ee18cee760a02b76
-90e09970a402bf91895df85dde19f9f125c75558ec5002cabc1d4ff0ca1dd979
-ac53b2d742f45d787eebe0c983e12740ac3b74eaeb8ddb0a058030e2b5aaabe7
-3acc75052330fdce054d0df654b4dc7cce4b07b9e48abaa918a2c45b0675a360
-8f9aa1f307b1d93c13075a57903935978e764ef45628f219ea21740a2c720dc1
-4037ee1edec2082462f882bba13fe63a335eb8c18d95c420da75b152b5791200
-2dea7d6f2eae40f84a622f33376da36234c4baec46bcddc2a7874ba2f1f57b19
-b47a7f3a4f834b5780eefc08516d223b42a4e201194f03cc94aad45cc49cb238
-2f6af71dfd8abee459fe9f9e19f1d52659d6dd9d378c4f06c39552012e17e541
-f40704a1190b5887bd0cb07fdf4a3a3adf04639c237242cba12758e371dfb2f5
-5871567815806e74fe8cafda5031354aeecf88feaa172bf8f4cd9bde36362120
-2938fff3f84180ab0d5e2ca492631ff71835add3434bc1aca1589cf50ba27fee
-f0d86e6de410c00c5a40188a91c01d944d3b941ab249ce3de0dc988482ac835e
-ba5e0a045a6dee34f7c92ea4a1dba8c403d614dfdf3bbecafc61ee5762ae4f3e
-11511eaf682fbd245d75530476c2151c4ff6aa7959c5dd0c2f54c483ea556c95
-8774853ea5f841577eb57e89aeab3ed00e79902cf36fba0a18e460c849f4e5b3
-db02888493dc249f1c1f44bc7d7011ae65184280f5f4cb19793b3bb002a439a6
-5518fae1d5848e10ccc01e75a77fb1db966111754111044e6bd282ebf00b3731
-7227ee6f76a51e1921b2ba047a5f1f09f21f13e1cf44b3582af9c2d26df159b5
-04738c1d27acd2c898ef8148f9058dcdd4ce885927ef51c36b43fafdb08dc186
-180df681f94cb9b84c298bf7804280162f58f62fedfd7bc0e9b8214992f4063f
-7685d655f248ba694252e5ca13623f12062c4872b5989e13d9c162773f976144
-cc8fcc96013595b498562ae4261e7a1efede4b79efbe7ed5e4398d1d9e66b253
-a0f99f969c15fbdac089a5ccabbbad21402852801736f0dcc64b0d4d7cfcad33
-ee75b328427178082a96435c3c9f40e9cad04d223ab295eda1ffb193abb5718b
-f5efa9db4ae428bcfb422ef2ecb16225c67def9ef76ad21cf8626f46854ccedf
-885709053e56e6e758824ee80b0c8e4d67cab4e5d6d9e92fdd9b99912c709ff4
-57d0ae3c258229551c93fbd68e47b00bd643872e5ae53f292866e566f2f9787c
-1edd81b005745b10fafc9911644c5fee21e092fde448155c9f69ee2f55c023b1
-2eff9b86a86f8786b26069ff3f2a5f7112070db4f4bf93f40ce24d1a5c4bc5a2
-b577d39f069f506f197be8c590c73bb5f44ffd6994e2eb11786004c71d349521
-2efcba99561ba4cfd479ffe07ae4c45f5ec38c164db89b192d0dd7c07228bf2c
-0ca8374f377c4b8ae58a265cee76e71e952accb01a9cf1676faa4f49dc456c9d
-c020521a2e88d2e5c3904157d3e68158ca53371c73be43bfbe2cb78e3e1a9a15
-f29359be03fe111b87b252b060c453fe8bb0ce288a37907e7648352fbe66792e
-e4060dca4506ad6a7a8806951df8d3d29d0347fc5f4f408472edf2c4abdb7418
-28dd1afa26e6e8f84e09308bb68de881a61d106757c09840e49993551dae5915
-a28a25ee7949c3a00b7f33d3b2ac252f1b8d0896d3116396e2a7fe57c028308d
-d7864d81cabe4824bf15cb5778b941a6b5e9e46539a8206f8bdab18e92bc0aff
-2f7640dcdbc2b04f7cf5781345ea8513d00c7a22dd5f1e43b60ba05acfe45572
-76ff2374e36f5132b884ed8dacaf72d5926bdaf62a16715486bfcbe4758ae053
-687031d0fdba9199fb4221ffc9b12844c4d2e94e393f6f4ff2d6842abea45372
-12128d3234738783ae23850090718bef9adb55d26bf606dc4736e8be6ab5c079
-d5a6dcf0a6f1b1df6f33ea9c1cb5e916aac2b80395522382a1801e15b44e97bf
-c32017aa2eb223c188e63a7f5e093b7354bb25071eee2c3a545763dc93e44e35
-96b9dbd7c4b4818fe8237ee258a2032153fbae62f5dc4afc16bcad79d2550a1e
-2221482e072b9ff488bee9730aec44740b55a35d9454a4afd2542ca9e992d781
-6fb6ab598ec696cd7d58db737ea1e72cc4e4ee39e1d50cf8af3d94636239bb87
-2d4532e783ea90cb1c8278a9541e90aa0b6cb5a6522617b406b495cd2f9af263
-6d9e9453174251786b4c449aa9ae25f9f48d6eb00234003a421570f08b3081cd
-62e4de0418033395b45f559ade69a75075f363a13add803d20d13f54f0f6fa6e
-4061f653d4021f3eab7808ef212a5565de8ff35e46e8bb02660326fe6bf92cda
-02f4990e9c9653d2ec5687662b965468505f26d772499e649c3a0d69e118247a
-72077084bbf6828daca78ac4524c599df56a05ffcf11d073465fff2c52b8200f
-2ab7de3212d573455e4be882a31e3f3b92b79a9fd621c5dce0c70f09df800df4
-8a594435652f454905ac19fc7aa3d43a5a5f360778e85e0b6b82d126136f4858
-3796833f454bee0f16c40dd79fe440b263d9a354ce8e7dda6947ac89828f0a0b
-4ea40d62a651421c15fbc2d271cc47116df9ffb388093efe6a3bd4a6d21150b4
-286cb50aee34371b13083fc5cb8ce57ade9ddef9bc4a77f5ba71e9c71d159199
-b29203c64c53041e38b413b901e90bbc9c67378734c049e497cc67bff03fcac3
-684c5f18857fb8a0d941660e9b04b55209241226cab4684ed71dc9a212d2a7d8
-75d0090ebc27e3ea81cfe4daa0c3277f91544d134cec4b5da927a8b9c0727ffa
-9db44a2d6d9e34a8673903879b041462708af18ec1c658f83d4f65d3df623fc5
-db60e9ca57db545ba05c10a9a68e94f85b4c2a42a686de90a50f482cf150ca6b
-f1758078bf655b04bb9cb71336c96ed9b1a217d9a0619a747cbf82c4421f5520
-3ccb5cac0067f83d17b6e57264856491bc1220aa9b628ce4252a9932aaf5fd6a
-cba6cbc11a5cf2d34bd21c77f3963a49ca746d4f1661cbdf2803ecab28f50aae
-66d2c2dfb81f0aea5fc3ff710a5e35edadc08792b69c4af174fed9cdfb2e0c43
-b5cc87adf3fc71121b1cdfed660ae99d8d036c4896362463da11a7d7ca08c7c3
-49ca8733021acad25f152e797a946d1b4010deb8c6dbb9432979556e0cb80a89
-493d58cc933e173cbd48118605bf7de3e8a909519b1f7d58c4b9811e7d3b50c7
-297270d1c1edbcbe0f4c3e93143ca44dc128eb5b17d1cdb1cd8b8233387b6270
-d2a8215407cc1df046713aed6d1495150bbea29bebfd0c08fc1124a4624b7cd1
-fec7f156f95321825fdee4c0ea668e2fe1b0d92d6aced305ff511f13ca92afd2
-e99535de55a09a3b3e0355645df6b4547a50c2c29a2536cba3909bca6b761b91
-caf5d4ab8e9eb5cadf71eee71f0433b9b9d9ce0394b5c87d38193498f3961673
-7a748fdea2248f936dadf0d8952c33a4ce3eda258cb902f87e4f623c77151eb9
-18e6e4fdc9537fbf03b743693187dae6c9a749b5c7c07c325b9b27b025c38b48
-c5ece2d82a1b982b9d058dc49b33aa425e7eb79827b5a62a4bd7c5bd4488099f
-f7c8d9aa169ad961e17a946b4e65599e268a2a96d53a9c0147da713517f0bffd
-cd992a1ab06f6057e17eede9c7f9077fa60bf4f11e885810564c0f40b29ffd2f
-b6e9a8051c661dfa341ef0ca3c630e4df019eb057bce4c1407f9185a8ab4f882
-81d175eedd45086905342282d26ae4df524b713ef2088451f1073a59acc3a1f2
-4004418469561682e72d20f59cb9ad4ee5232aeefc996ccb77fb3beb9a635900
-06fe6d2bb606293d40410919e31db52063c87c17584854d108f711af8112eefb
-890429a772e77bd03e50db3a2a1ef371268ea9cac1bf7bb15a7746790d67cc0d
-a592fec74f0000f2d1073985fd1053537a455548d43a12bd556063a6fafb0127
-e8c1190f11b992a0fd26a3ca823cce5fcfd5742afcdc02a790a25fa57dc9359d
-ff8fb3550da075e3eb3582ef454c92493e1578788f966db39d0038d2cd7811ff
-da49bfeba9cfe0654b68fc512616439226b08264533f295ae94108168eaf284f
-290d61a62e8c8247b66a64289303ac847dee0f651c1b4575115d79a9abb9e71f
-8cf7dc4b3db7c835f2abb42c37456fe3202ed6ce061841723bb2cb759bfc78c9
-07c51737b52469f1f2dafa7ece85cc798050dc1bb63436c94ed1af3a0e6628f9
-dbb10bc24d2a6d94000b2d142f654a924911de0779ee7ca12d82e04bca01b3f0
-bf6d1679d8a4210bd58933be71e5bdd9e22ae192637c90e7b8905586d8312945
-4d68274af56c5d9636dd4976c0c8574e7804bd8fac44fef418eaa7f5a0410be5
-a4c592bf762ef8e66132f71378c37ce7c1fb485d5be0a27628125cd768ca1427
-790fb8c160a7f94b80188dbb55184ea6d657178f30c055596a370c9f40dd64c4
-f7246bba74679a347e03d7037a4994f348c8c4874df31358f02157132f98ddd2
-322231a9271018a49672897625fa0041550c99ca2cac35cee4281ed9db5cbb0a
-229fecf98aa5facfb951a1b116ed5c58cf4015a9bf03a0b1505132a46ca6b3cc
-02002c40f040e0b97303ed8c42d9f62a95610de3506c7a628546f9e4d6e9973f
-2a77cff929c7a41603a99363dd7f87f3c076990546e7814ba3150d70ce635943
-88152a0bb6d23bb4b0ad0c7edda0e5fd83842a6c2db044330119c3557ece70ef
-8297d1d86334958ed8037d6fb57ef20bcdfaefa66d2f02cf9a074dac8097469a
-b35a644035a7a0f91a813aedb3d9ec6fe2ded7c9d5a414cf394dc646df0510ba
-f27f501fb2627834376f9776d4f00869bc8b0189ce88008503bb16bbc588eaa1
-edbedee5e41b81774054df5b31c4323c4f2d2289f018a3d07dee4397b69470b8
-b1d64a694f1333130b5310763054870b88d2d017fbd62f3a2d042ddbc4cf68f8
-e1aa1f790bf2c7f598ddf275f11899e46d18d9ce4645671b14617cbee762a485
-95bf927abd6aa985c1bf117d82727432b8cc573197cd87a096daf130de5c101b
-ded264c14969b04f8f55299ff35cb77b033a1752ff04c96a4dd43e9e66fba118
-9dad547bf90c89bdbd77200042172c6243d1c465751dc96f5101eee86c76e4d5
-435d1f1fa667e7b575760681d8ef3b97f01f58e2406d3aa084552ebcf985ebed
-06baf00f2098f01976db0d4a36f39221b08c00b680ee425a9fa22b5baeb571d9
-31c9009a03a88501ca1cc8da7a3afaaceb87a92835161c3f4c84970ee219dab7
-ee9f5542d108b9326d5fc58cadc39d10527d481d303cc11cc424398756932aaa
-b06d5600e4d24a0d7dc36da7e8b32871fe36e59e1049cb9ae8c361c3c3ebb365
-5ee4a2facda18377394b68f046655d679ff8122da647ca64df6a7b99a3bae5b9
-da56fbfdce787f9f8263eae5e16f348c22aecb06398d714a69dce1a932f2b50d
-4964641ded3143548e33c879b8c03206f6feb025268f61f9cae4642e6009c804
-3adf0e4a1b5ce27a812559bbbecb7402ac2a580c6d8471dcdb02e6960fb51396
-4058ead51e6b121158c9e3d0dda75439e6eb47293c642c60a70bd9307ef337f5
-ef4601dc0eddaf6d675d17e37350ac6bf3cffb442a602054b52a5ec600f883d4
-cce1ff0d70304522df3d2cacb5bcb2cb37d453b76f7d4d915663e19c6e1335ef
-6fad8e7b76fab514abe26d837565908135cf8518819916bc9f0db07fe3b6439d
-c42de0dec1f5110b8fa5ef40289834953438a7bf83a6261dc80cfef8405eac76
-32815aef696c5b86d2cdec5d3588bb8fc5e9dc61d97d2a5869115c8260f31f06
-986110dfe2c477f80bbf6b3d9f59a6dd573eff782887c9b84bed766b63fdaf13
-dc4ac55b7a127be7c2555bfdfb63ddae8346cd6ccb6c77ac057bdb1c51372603
-8cbb594119970a50f42acae2b9d69784c5f621f53292fac082bf8a78c197af6a
-8b56466e9b14f825e45a9d8f554db27cafcae033831219f6bfb6e3568c7532c0
-ddb22ed77cfd1f46bb98480d1cea4800e3d2b8f623051da01bde6c8bfd1aac33
-240f6f89d49c824e4b5d8bfed9b536fd1773a3ea254d2e56725861a1289de1f7
-8960dd096d6ba285716881f26795345504bf0685127d91c893b57122f858e1f1
-93ce8270796fb9b0fd7246445d484005689948c40376a8e612fb8827965ba50b
-565748c8afb55247f32feb36a4245f136d6cabd1f491b753eca2104199bb3f1f
-461d1be91c8ebbe6379b2ff0eef8a6fdb5fa98029d7cf458e17e15631c2b63d1
-72264f66e45a8c108460e3e353997d9ee098f83537a22b5cef20fde0ee260b85
-c98befd03e86abce66eb6551625f8dfe379a07f53c32888e9e4c04817d6d5abc
-f02ca074a8d11754f4c6fafd3c0751886de2fac502bd1d3d9ec6b56b4d5d5c01
-90aef863969d280220e45f9bc52a18784cafa7e9bd0aba47832cd22e6c0cedb6
-28cf6a1eea4e519495c60be2f0657a43f311cf331e83e9e8109b6ca5235097e6
-d116373c76e9dce208bbd9573c7b815e33e3e39f8eda3d1d07be9ade9f74181d
-c5b9214372c93275865d0d4f3902c5dafd4fb246808dc253d15626549fd97102
-1be3384bdbeb3e70f5b846a85088dc8c4a9a411ef04cb3ee0399e2f92e889ec2
-800faedbebe32208a0f81f4fb33b97bbc9daa92a3b3a53d1f7a1a957cfcda2ba
-76ec22331c2ded3de9ccb0f51e7ca924ff8d4f0f541bba1a62da701fd2a05c02
-204ea9debffce3adeb99995087932d5963d2a6c39f715225d7662873624158b0
-a3fb470af5036028a3f04600f9e86ad203fe14dcb5360aa9cfe4e225b5abee97
-e21237ae6d76aecc97470950ee7a2d6b2c5d6ec7a88578ccd349aab544d151c9
-67d693f7de7005e4d92c5dc7b14b6979b1636092fd75b52ab6e83d7de079b2e3
-f5187467a0a6b3fb4e001ac42c3ca4ba743536d9e9a8f0a37b23a5509fd88ef8
-bbeda576aa8440eb7c76ed2c1b2309120478e5a35e071d75c16ef0086eb07ce0
-4e7242a68c801dc3c68663444db00efd46649bd00616b5a346955ba95b881e7d
-82733c8f7b563ef8a124d7312fcd0ce0dd57a26e6e104a080ae51b9b80b48960
-f1ac9f15f7ad23fdae73b7e93edb14823fadf09afe275d1503a0bbbbd57efc66
-e7b4f6468369718601a36e3b163be29fbefda393416a86f976d631b80ec34755
-9a0b2e328ffdb6a1ed1ede49ea6749d7d55b04342e40804f030b04daca04b43f
-f04d2e71c3686d9a3509086cc247524725cd7ac89fba7bd37212754fa0afa635
-317f846959f2a4ddd0dcfd1b1e5cb66bad528e47f850941d7ce69a967118f490
-95a8f8978254def9e7c5e91d736a70cc3ac70d1aad33d1195256020a9ccada88
-76c0ea39dabeebf3182b0fd89fe5be65661cdc62afd9a3ced45628adc41a1a3b
-d681dbb4c941020ce8b8478cacb0e4fceb5b6c16ed9ba14f1c3704c89114c5b0
-80d1a7115d69e6f932096eb9059a6252cd63531e9a72a36bab438a17686c41b1
-5a7616d857eebeb60c66d3b2a991fc2eb3f0b93df445b370cbfbc1754051d1bb
-b2997b93b66ecf29d6e7d3c552e0538fa41e0896d05c10684e280d683e48379e
-164b356e916afb48f42fb90acb10223b54e74a2a821787322e628f6eb02be9d0
-55f46574342907e69038ed2258dd96cfe873c6fd5ecc7d460252762e7fc4af9a
-608b65b1abd49db62324c1efb0742c2ac7453012840729e4798fb62bf15a2db5
-13fa7ddf79c204efe0d4b7cb7978aa3eb36a2c53c8d2c913ebf3debb9df9c52d
-c5ec37eed5d8924adee4ab8313467f3f0afb3bf9b424749f73715cabd5b86ec8
-7264cdcbb8c111a4bab2fbc568b65a081a8e7e18fa0d04462720baac968cb6a9
-445cdf029ab4adb8786f35a8d2e02459401b5be2ba6522a7a90b46d8333c35ba
-38437539b4b994e1c1ac8f6ec84a301b764b284ceff5ffa842f298d9c2f3c197
-54809e99550cec6ec73cc66b94d6e2980c54f17506e7c67902631704f51252cc
-1596405bf72ec7243687fc7a0de9b8c2f4b311dc8ec7fee6bc31645e4322efb2
-a59483c1734df0ab32ee58b6a156ca6b9507797706894aa412b9903203fb506f
-345be538c0e253dedcbef172cb9365f99e55b740b45a091848f8ce635f54f499
-43afe4697285361f718b6de2b79f98e0e3adae0509bf571370c425d1aa795cb4
-a1b10ced0d43b59bea690990313afe7ba7eba130f7e5639bf12c6b7dbbc1a17b
-4e0fdd4b02e7fe481ea5ca3cf45337d47488bfc09a0312b0258596771ec1e26b
-c7803227bd4a5bdfa0495c227a454a579dcab23fd4ae8034458fb61b7d89de7d
-4524d7bbdfb4e00a6b4275691be8f77a490e768309d6174379f52ddce411b55d
-80843074dc394e4e88b7311918985a58e5012c6eb8007f22903f3ee0cfa1aa61
-3128fd7b6dda6e93a6cafbc6a7f3f277868dc34939542072fa746c228745319e
-c0aeb14792d9d266b2d58c804d7f4094d5cae77bfe150debdc47f2f23b0b37c3
-b19e19cf0ebaaf50d64df8f624048c3cae65e0c5770792d6a6cb97202174b003
-a4deb8a3758a83283dc162cc88526a3d037d8ab1f823eff5115da7d2373d1d11
-56b883d419931f7956024a22312130659a8d2a946dc9cb721599fe7d5d28dd66
-12977032a94bf26215af645d8659ce53528b367e30368fe0db4b194487a4890c
-26230fd2bce623a12bc09b437df3a3faeee49571df114d6492b0c1e3ef4adb7f
-8ec807c39c3ac56aa82b2a8e7b4bce3777ce3104d3a62e8bba72608649f12b04
-e5908b5f9d167d865c9cbdc94e3e8c99e06693fd43283c58cde48e5295b327dc
-176b0ca861033c1f183a41a7002e9ebecced00584c5c1fccfeb630c20666d91f
-0eda19c9a59ef508260f6bea436b351af6518cb4e009865fea06d4fd3b2ba970
-c3632c4556861e54a6441f7398d420a99624fe52cbfb68b8c1ce2a27038809c0
-424bcb7e54c5781be2be39e52bcc1df2b74ce7828056cf8e3f5a56df1e54e7db
-d281570e270dc818aae4581789c7494baf7b1ac9cf3dcb9cbae77da67c39c6ba
-db606df4098d341e81cd5a24d1abe2dea05ea064cda4017526b956cdb79540bf
-7f1324f9e256d555ba4945767f2c72db5597abcabdc81e3015660232c67e0949
-0ba4b7a04074154e8083a8c883c8b884a1681cc2525f6cf45330d8818cf92906
-049da3a2455d2041a0cf9aeaa2ca7fd0f4e5d15580e5bae137d39baab9c400be
-0ff27d17d87970db423398e931f58afbc415758b1b1a8312facde8c4451dc91a
-09cdfa481770f0e445d35b98460b6a7b3e93f2b3d5f0b49b967a3819c13ff6b0
-4b3e665d95d8760fc380ba7f7d400154684e081ce7e2000c6e3a02322d3f3835
-4e49daf3c8bbb58422d64e73e0a491d3edfdb599614ef55b603b00d8e1aa200a
-225f39bc76f58506ee900c2db1d8fd16872998017927c4a561b83b6167a34ca9
-4407b21a2607d96846a9bb7b543382980e39fc1a9dd9f47c562de35e18a341b0
-63878dc89f993080a1d995ef07991d52ea00c6372863b56b744344541feddbf2
-75b432e36368e85161e1ad0ceeb772939ace8a7db790c66d5b821a90d1cccf7d
-ec5b2970a04efcc3060b0c163594d7b4f0215cc30b01e71b97f382e11f27b871
-922ce013ba8fc3bb678bd64630936f29f853e1379760bde9562f8708f8905a59
-6df302ff8f289896a7a38809246e2ece8e99e96b6b471916c883bb7c948e8fac
-6588e2b30bfed55f074fdb0989b85fdfd023f15f1ff89c2f29f4f5381c5ef9ff
-8e702aa40c1c6dc7aa48430c564ed5712ebb99af607df5860af30e1b4ec1a492
-6b9ddf2aac1352f4b15613cf6e86708c73bf73728f3bba7eb6b0d30c427454b3
-c8e882eeeaa998e9f02d10a787f6017a5c0a55027d2ea1da1485ab60a397f449
-4f2fab1106c23e3ed97dd268a6f5a9abb2f0cb470e1ee6411b27708b1f2cc7f6
-9efde016cf7c122903ac89dc47aa11d0c45414b8264bebce5850b39884195860
-39a7cb52c877e5ea6a0bbcbfbf3a104c0a66af928f6aaaf062b8da0fdb290f51
-9b26b6b2cf2fa49ff36e7435b86f720c06036f2a322c3fd0fb37ea7b850ea80c
-6cd6b4224e8eddd5adcf97f69d9c80102ae4f6f6e5663d0e47ccf992e11233db
-5f37e9efeb51f8cb754b919a80c0f0999311d1784221347d746be1590d077f8f
-c8a98ec3ba007a04866bf3e1e24bbdbe7839bb7adedb55c3584ce2e2b85a631a
-5bee6015589a877604e67121ede937afca89af6e186d10d3fa057c9703b17f26
-30025f6332087e97b1ce60c7e26e48d546ae484dbc604a1b33528b5dc41bc2b1
-1b9d717dcef2d469f7b5f0b3047876c578f3dcb15425678136229a7387966c00
-593c6e96e603f222d4bf10880978e1d0f2e246176e6daed0ecf75e30430ed2a1
-8907963577026bf6689b4a4c420c5a622602f2390ef9fbd5f6c716c8550acf50
-3180e80c95e8d4db4a8fa3eaccd85672b2fb2c0f7b0f8deb4955bd625f131904
-289166003bb3451c1d82b19c461b21f9523681468ea247f28d6e8eae788cf06f
-3148ea2d53810077c14b98b5aa1bb2294b202885808854bc6107f4667ebaec53
-6dca8dac30a933b183f5465bdb24ac02a6fe61d7c440e068d5c1b2511599971d
-09ca25be37e1baa6580850a7656ef4875ac5dca306ae04090496932140464a48
-2b60cf202b4e308a97d4f75123e655e4d210b6f2f285ff921a9906028e331aba
-6542a742fd93bbb77167d04267e3b7fa862437c37c2a8cbb1e4085ce24887ad9
-b00155d04414e5e8d35903c4b2f842b43a333442d17a0545681a20188e6f58ea
-bee8d954f42963533dead29cfeb41dc6cb8e70c122948be88afec65d315d3a1e
-8440ec98d8191c891affca48a8fcb5feba24cdb0716466840bdcec527520aa6e
-2fc538993766cd018effd726855a2759a0b90c12995b475d6e4703a8fb39a59f
-1499ca0079d2a25ab06e0c8772889354840c25e10cc6706e9108b62ae8e545dd
-1be37905f8adb05fa0265b736c55ffd4ccfd8b0e4ae6b558c1debdf02a836d0a
-bee910df3e245d668cd878f528b6d9d16f4a0fa5540623182028ca199a0a8386
-ae47cda55b8c71081a78efdda2d709d973d69ef1b8f27db52ebb298bdf2fb718
-afff5377c78edbc3a58fa3d56a3b811bf5873a8f787897c62ce1a281141df5af
-be323c10e74c8ce430dd192dccde81adc639fef9e5fbfecee5be9d0da1547211
-6d6961617b07b6d8a8e184969da1cecc18745012ced3834fa40dce5a0e93a673
-8f51f43afb5ad5ae0939f4d3cae2b1e386fbefd8c840e2685b156c4d2f2cb563
-511bfd502ea44f80eab5a58ea38a682e863e13b07a442864c1d8215db4e824c5
-bd5abb55ed959042b65bb7d1272c0e4d429024cb101d8d340e3c9b918661a55a
-d29cbd42b25000959044f9d5f9256410d5dbdc9619a54229a1ca1a96f939cd04
-7fb87288db04a3a105e61b967467123d186ace108abef8ea741a4f3aa45738cd
-37b9af8a997c9f6a4cf1b335e3248000dcad05d7565aa99dc144076bb70721b9
-eafa34f716ca82830e8981c4368559f859ebe5a89ef467193a08a3ce62822321
-4637619f8ec9595107d156be7153b6433bedf24d330968dd9153bb90a09f0a91
-43c851d4a5de88c60b0a5d8e3fd2ce90617d14c2ad91a3b9e54b5447bc0fc905
-d27e961b1888ae18d5455fd5878cd43849dcbc2b01a1cfd2543ef89aa4ac0a07
-e4b3bc437520361daada75f76668e37daf5c2f21133653ea1855851a3fac8a3c
-a8bcfc449febdcb4566b0ade704fb68e8715eb37461750897b802d099af47ba5
-3efd1f74f9d13ee62aa163174cf38d8e75f793f763f9ab03fafd8d52bef23f5f
-86f4da2b1cfbea8233805b9d9e47e7c4232631a56360dea075491e410ce10b33
-8e9bb61387fda4dee805d038c67ef2c9cf36ef4f2d7705ec90002afa3ee52059
-d4412a1ace2939ec8753653aab214344cc65b2c2e2a0fca95fe6144953c4b2f0
-8dd8b6d0bb097ee5d333e4f9c0c7a54687c3f2745a5ca79dc3238ab554ced0f6
-29707805440078bbbaedc13a2ebf81fe9d5686b9ea7aff8d6d98cefb0f453fbc
-441e9d82023541d3dcdb8d255e16a7b48832bfbabf7802161c7b164bd7fa7035
-8cb6f75c1dd4838277a5baabb00276394b7d3af5dd1ec4db34c33e73c6be810e
-d1e1c0f07b397c466ca035edadc839ccc6c3b7b07ec1f669ed0798d1296b191e
-31551b05356c2fed9fe7680e0b5e1ebc1dd117730554c57fa82854729f3e4c6b
-2428a8de3d3555ffe2220259ba377772616f367966c983a3ac18b04471506e6d
-07fce9847e39bd3a845bb894f7b0e04daea1f10f8a23d030a0054659db2b8949
-a79ff3d3df5e76e7bc5a0163e1d108e30d47c01a0d17780736a36b664372f6fd
-71f65fda05da8fa900c3f9e6f78c2e3a83e97cbf56aba6e4d6be0faa5ec5d7e0
-bb97e659c6c1a778354907ed74bd12d79d7a0b4fa78b2a157c3fafb6814b4759
-3db04c2a8b16f3635efb2d03525be6d6372560bc4c96e489e971559e49960bfa
-a5be48071bc009df1482b6c9b452dd558cf537ed3263a10b278ec050492728d0
-4f335c50b2ff81c70a78f8d8d3f2e3f9efe9efcc2c5f4e52e00b97ead7d11295
-912b35bd0dab31c9c3e661db42eb98b86e090e55db806b16035848de4b60bc07
-f6b7d9ba8841a73471692dcaf020cda34343fb71a18910aa400927d4359c535d
-773d3e4b7b95fc2b10292a38660f0aeee380148ab062142399c767c4add99367
-f28c35d5b8aea728aded4ae367b41d43b6adb2032410d70dd875828fdcc5c976
-e221f05c764c5042d2a7ab671a234a4baaef58054064a3265d6e5c92dc532663
-87c81c142f1b94ed0f5a16eb83fa9811c475aa0dc93f9ccf237970904d983cae
-a7914a8e481400e58f431701bf0cb884c1e5c1f52d592ad3caa7d8a37d1c9568
-acc90fde3c96fca19bede3d8d92114d4702e1d38e9526fb918c2b8b8a80fe52e
-5545fdc287108a435029613684952b6d9f5b14ecd5b02d607a311b90b84d68df
-ef5dc37f2c55ac5aba975bbe16f1f18b2f17b4a9fb96754fa1228a848fbc6fb1
-c874307680c9c58f46e69bd27ca7e55e7cdd7cff4271341dcb34ee5b300e8dd4
-bdec4fee74bc74cdbbd0ecacfc1a4ac7f4714b4bc308ce6d88438920fca53ece
-8367968559eaf9df11a0d3bb80e650e4d836ca854dc1556b5ef36b9e64bf60fe
-650125a292b63ef6982b7fc80de9903cfc18ad9a1a14dc03d32e9ee15adcacc5
-a9b11139757d948bf23e547769f4d9e897ba15ef4a495735af47de7bdaa63765
-40d035a6ae198f03ef371a49fa624478fee97359bdbab730e4750a79e4ecaa3d
-182c6bcf9af7f132392b5e0940c10d8cbb27a58f84001a951c356706ad2463b7
-24baaf3a13bb4aabd80f4c1d32d48a0a5a5be34b03fb140c638de3cfb14c4c1b
-ca45d82c270692d193f0aa4286cfa414beaa7be6908e4d1208b5c2ed29407091
-c6fd5e78400d148a9ae24dc6589dca89ada0ddf0126203229b33de78f409c247
-90ec215d8889e450b6041406aeb5732dea90891059e6f03edba61e003ef6eac6
-925e213b1b4cb51fec8578d36527de080e9b6a2f2a8cc08dd888b705e580f4a0
-5dfac8b6c05b297368fe786caf8730fb703b28ff3fb63c5183f4f8f97719e4ee
-d65d13043f1b28b01a2b555ce07acaaf98e47d034e6a3e271122935f6224a167
-5b4cd9fa85ee51deb3b132b36fccd473d1ec278c87a6e4c2976ea93c5348cd6b
-9eb4dddf8f3c9fd6d5b7a746756762f641adc4e1bce84423d589cd4d66d521b4
-a99ea4c0766e9de460ba8f32d580383884a9c5e4907d7469752ee7d68d04372e
-db9579b6b20fdc55c9bc29b227248252f595272fd12639d0f2179f27754adc25
-334f39f6205ba259f5544c39dada5d7ff050d80afeac0c552fd467b10023e530
-f791ad4b12d04665a9f9e04f7fa19f74c73890f6bffd42a7da2947ae70dd13d5
-8ab82e2c44a7bf38c6bce43d7026441418f12fa7a2a7cb81b7e4d4d0652d13b2
-2d6b130dbf0b6433db47ebd76cf0ee4f2aca9a4d8c9b3339c03087f871793105
-d25f5f4591a8c6af03c42ad8bc129437b5698a6c67fb36ef68ca0e9291a3eedd
-1e5fbe6e97a8a56482c0c2f99919648a24e4067c6180a35f37e066af4134abd4
-e366adf29467371a14c80002b5afc5003db922fa92af13306de6ad27edc0ff47
-ad4da4af9771c76ef2c77b54fe2a67719478718989abf9beefbd962b449ad634
-9ae7fce4e6f425e752460dbad42163fe5e9f8eeb93375fb3f46990445ef2e59b
-de0045c70a03300752482f1ddc1755806babc181224471af546b31584d50ab56
-9ff247586ef4e52363df927b8810a5975152d92915572e13c92a65e5444a8ca0
-46fcd260cc88761a3ec8834e169af050408655605c793f9298edb5f657fd9e0e
-0142cbcc53e74a5b00c3d0c77222b4b5df610ece643275968122e36135d86ada
-7fbea4d22e1b51017274365069d75851b50e8401c1c34a228c23c10cbe330dc6
-4ed9b9aca8f3069f636e286bba6cad0159321d5c27718f410b39f99f4724aaec
-1afc7f6ff415a8fc73d5e26be4cd6e93b5464b764b7cac70827d48a3fa61c7a0
-f1943551599bb6216bb70b19a1a0b763e2f6b1c4babd95094bb87c222fdaf5cf
-9eb0467a5c93a6c42f4ad9be37d0137a057aeee887f9ced56ee8ccd85bb8c5c7
-7de9bcbcb7200c063735150ae6f2fa20cf3cd920d5198483ecb81c0eda832843
-27e0c1828a244ff1106323d4ddef2c71430b4c4de536abbb28f87e5ff93c3a23
-7697a73cd0653bca405e167aa727b132e98092629971184405e342bd802d5b72
-f1a61d42152936472892786973ef23a6f4254b3c3a42531fe34af9569c466373
-8bb88d96f27a8478a732fe405840e685aa416052a8a86beb62fad458e6b90c17
-a45b1ded2eb9a31e2c2f7ae2832c34326dba870eb3fe7439fc69d6f26d5572c6
-ce9b77a07d977392f52594c4610d5c1974378d2626a79d7f084ece540d32ed18
-5ef252ad0b4be2fc499cc708cccb88a80ae59a31e3038fef230dd0c101781d95
-b754338c0286917d565feda78b54e9a46f929fe351c74b649d05e014f4b9f941
-14d84223a0f3b11f6985fac073e2e6a3124b664883a92a0efb9b1d017f823525
-fac9bc150808a58caad6b7c0f4892e0285d86e79d587686d0a52284572ccde01
-7a9eb12d4559e1793e09f92a84e99a0ca40e00024a9d80ecfafe6a4a0afd607b
-ef3c195148ca0699a363057b98be0ff2981bb9413fae9891d8ce9fa723c278f8
-828be8479cc8f1a792d5cc074bb7ec4c3e65c1e2ef34c14241fd0b6c097ad945
-479e7a932aa4654f34705cabc11d8fae6f4aebed345c325f907bfb04b41b35f2
-4d261885880bfb5b1f98b138ef31e3a7b96e439232e4d0d9bb84139f41f48561
-d828648a60ed3ae4f092b86bcd6789015b085506fe1f266cc02ff5c5f3ad7280
-4456b4ef8ad3c1eb2f4fb956f726dcfe2d49a73d7e9f7abca13cde848550cde8
-7e083b85084000f39d390d707a017c63b44a9563547648c48f3d3e5c577a9e15
-a7e663c19b7d82aaa700229bb541d7dc95d83c3a953670c6aa4ba8a95e2119f8
-ed8b056d8dc936c4fea8e8b298819a56cf089c0be99820bf2eb51455e3482f57
-62acb88c1baa53ac2dbae3030043e8992ebe1a7863e47d9e106a60fbb83355f3
-b98fb2744652df95ce801cc169936cb12c211aff9d77ae43dc7fbef2112e2d44
-a3ecd9a8c2cd6fc94b4ecc6d1f5b2fdacdfd153e11d8c936d822306ce7cd6d7a
-2172d8f72ecff7f8a4d1eab8247c1261f8df09ad23e5893f900e1e414d13c25a
-1f235af5fff7743baac23af56c8d8baa12e095ace339a4541e87eed758ae490d
-04da6c27bdfae6c59e263c3143caf2febad0f61a618a372052f3f550e80f6a25
-3109a9d2cd667ba408e019fb67f8360d5590850e1ac72160f57ff00cb8e766c1
-dfd23f82fb24b407dbe5cd232641880da9054ce3934475db0ecbfca3cf56eb3b
-5d5f9d5b69a847eb7bae3f80f5d96e49cc11251cd4e3ec235b211a75551d3df6
-8c9bf13c5cb2191f42a92d9ef1419a0b31996a53a1b13235b6dedf6719ae00af
-af731d1bdeb99eafdb8ac4007e4a689aaffe5afa456ef93cb02b4a6842d60ce1
-cd0b0d9ec8c90fc47779fc2494dbc683b6db5360887f367ad6f5cc2986d21cff
-622f47f4dd116d5e0300b0d1d5ac15ff4162435c7a10ed614359d63d230132c7
-bab8dbc07d28aa915a91c5bee6f3073f6de313d561c0ef9c8746ce87cee5d42b
-74a9bb276cb8797f1715136b8a181a7ce12c85f5b9e288ca852617add6b72ab6
-07eace83bf400342f5273f2670212358c22192bd0ad7a5905074e42081df0fe4
-de698f14471fb3162a847f5dfb83a84f93f8ee6b6519ea588e0d4baff3953bf8
-81b78049dcbd4b84ce45bdc45499e3a5776b8e4e9063137d4e2556aa2e62b2a9
-eb5ce11735ed65ed5cd49135bba4b6d5f184eed7933f698157525da9793c8b10
-41d1bdf92d244fe701d30ace06cc28dc4afbc99ac05f2b8ece0bd19771c7337d
-d7470206c9e4f9ce5241ba4f038c02a8db27f75218875cf8334ed4bdb739a13c
-9d1469d58033f821c98b3684b51731451d3b05dcb1a7a691d3f0e2fe44a82688
-cc91e3711114d2997e159c81408665b2050c89e10a045ebbec019bb9e7567d95
-9176ee0cd69104974a26c6c7da1f690b6503a75cfaeed44e9e37be1a9454b7bb
-921f7922c213b175abd329b680f5def8130c911c25f4ba34fb2bf49c65ce74bb
-223904c11d7860ee74ce7aa113fc40a64fa702db89517b0fd444d0166cff31f7
-da476a7415e5c308ed98b09cb41adad1807694c1a39a20d3ffe0f33211e36d54
-395061b0df33dda283e1d7f5a9399bc144ccb6863611e7aac1817fd2b95182dc
-92755c6bac1b4074dcf43e556641616541284d5eb13fb49a4b375c31df13db9f
-ed989c06f374582862caad3b745fec8145649dcc6b23adf6b4852b6021394dd6
-a19ce0cbfe5b041afdad277df48db2955de8cda9a54379ed246370442196dd80
-0875fb8a65e3300e3e4b97ee6cb4134aaa59ee3517e285982a4e65ce966836f3
-0465e0a7d4bd636870dab95869fbe7b7b9cf28db23839a964612322be21c4f0c
-3cab665c4dd6f40150542c3ac64d147c09e5cc969642154a35edcae9c119bdac
-2b82e582e2ff515e1c88f91f474e03381368417b4084f6788a8e19519c9f771d
-92133700a7ffbf3e82ae50fb19f59a7a385d169d1393c150b88e5156c41e28fd
-055eeeac7fee07c6a3be5a8587be73b77826274bd3d35574e2ad12bd1551be0d
-d4ff959077cdff691b265cb353ade31f77ecf60057c0eba5c51a7bdd69739633
-b45c312f9b77b0d87ec77fdac0049645c979663dc0314c8f101681e0e47aeeff
-fc8f7d39a57009ae49735d6c386262bd09cad0f52d862b60832ead3b3cbd3efc
-bb992f901443f78f45f9112a8b79d83888b412803e5621e70dc7b2eb475a7a3e
-0d07c36ab6dd2eb352738536c879ca83b31906ebc89c7304dd1cf95559cf7bae
-eecc29a5d0f839b64c0a24b6b9135dd0fef4bbfa01b7d6a86d407abeda8775a2
-6e20bdc6d2189cd7055b39d30315b9ba68f717840c10f27b88e22075a7288c8c
-3db83c27b55d6032a2b71f326469af86bc7342f43c4c95c8b13bf295ad130cb7
-421ce98e16cb34afd5342289819a8927447c0df7c98e9a965ee83269056a7c91
-961efa627927d007bf3836ff5eab5b6241ec8debc29dba3055d38101d1032307
-86644c8ae82f2c516028f780853be93fb7a220d71e60dafc26e582065444bda3
-5afe0470dfc2f2faa9d2af52eb11f048b16ebc88f23f33944085e1d9b1e85870
-18029b166b6a6eaf36f2507415fc1a58ad4b403c89994910896bd32acb360703
-17534352e8b001ea7a79e81c07e740c3dfae6f247579f957fac2c71cc792f7f0
-1c5d51b81f5029866f454fefc4c15fbc369d0b5f45633fe46a0fb141ad869770
-91af47762fb7c2291a413e51f9d697864c8a7018818a03203bda7d356382fe40
-b271118745973af3455e9021cffffc9c429273404e0813699841332ae86aa519
-608e948ba76806963b3656c44263a1c5df864e8634cecc6f8dc053ffedfcf030
-fb3c759daf5376152d39ad6e724f2a09a06e77bc1eb78fac830149954261f8cb
-765d2aaef1847073e6a5ed1d965ee9d3ef47650fc131a229bd68a22aa3bab374
-b0ca5b3ae476fd880957cc7c08f8729185aed5de06dc4ac1727ca7942ca50e7d
-8bd0c697d43c70cc1992205c9b914312b4a91344d47be4a9ba955da671977af9
-a92f0102e56705575bbb13106995f75de702f0eef35474ac55608c72bd513cb6
-e6ad69f1dd84869c03cf13d22550471c04cc72a5664d3154d56886fca7cd18fb
-e7e172dd975923c6e6a34dd59653260a28d90bd16e5ef7ed6a76a55345b08015
-b5e1e209e9db3471b9d0008174922d1e120f00620519d526e85a80fbdd658357
-56428f1549147e1adcf069508723625f929ceacdcfbcb0eac8337b3de3276894
-1298a952cc3fb5f55589aca8bb44111dd1023305f8a1d2b70d1da6fd510efddf
-a55a18dfb4cc9a1b4378f9dba73e29d16daed328d3b915821159b0bfb6872240
-acd1a3fbda983af9d64188be5412b15a03b52982bb60a7748f06897c63d97775
-3e60bda00e6cb10c4fd1c14a49a9ba5383f025393f79efffe774ad9cb66bdb11
-e3feae202ac9ab6dc25eb347b967b9a9af308368cd0702dbdd5f8ca2744eaad8
-0f0a9093c127b1b01bc718e7979c40d2c3c130dc3e9eaeed82e44f12872ff753
-ab30138a8b8ffa23123abf35e67a20a44fce65e6f7d20abaf919f8e1dae23d04
-5e3c5ff827a3ae677e0ec586f828a0f2a60e61eb82019ac0e1798af174de34f4
-d65c27344cd9f575de52695e1564d76b3bcd81d02fcb1ad4b12499fdd6ebfba7
-c1c55c98c7418936fcab4606dc7203dbca8471df5828ba2a8d6ca99d4aeaeb7c
-bef1d59a6daa5d0e7ec0a82fd392790b8e17d25f51cdf802784931d9f10b824d
-ab7026fe65d2832d166cfb9b108a75b02ac5b74c7726cb5f178784f68d478ca7
-e29097b39014e81f10828dd37e22889551489ba2f6a2f53c72e831c75d2c36fc
-e19cbb452652673c10a79b0eb2cd2bc4360a464a8bed2e369cf49660c9ece723
-7d8cbec3c3d7fe2b223b469a0feaccea1451d1cb931ecc6c307132d89a281fa5
-85626cd2ab00279137c326061a1f3165b68d04ce49bf0d308a21168d54f4a3f0
-7d8b8984b41248a4b5ba90c1b88403e69c920179c41c83a5e2dca301dc67bc54
-7171f622980e28f452568ea30e9dfb145d06afff9e28f43b04535ac63250cd37
-22ffda3ddc5049cc71ff4592766a786190c7fe9c7e87331b3bf1c8c25e289e00
-e9aa9e8ac24a978998366cb808f1dd3bf204af1adf8b6c3fcc93482510c720af
-03e18d7f6820935881c4732bc2bd68b1663260581ac200be9b0dacb1e6a910ee
-d5186437c5bdb966b939edaacabc104c3db19553117de2371839e6034f0f9f9b
-878626fb6de546c64224475d416418a1fffd40341edf45f4d91df8571000b6c4
-e7e890ee4ca95e65f18bd0ac230b98d2487a59af084feb16e4aa48cdcd150549
-f93a03156ff8b76913decf03fb5ca3213b14686b664daab69d9d6f056cc6d372
-31122a599b78080a0ef40e75b9d61b17612c0982690bab7a8dff6265189ea5cb
-4d8607b8a3447e2de6463f97e35c40efd806d021d47f01568ad586ea33fcdd4b
-37680417b08ed5fd7bb1cf72b3751fd861e0f5170d6cb02a803c908420482226
-e009240ba80b0275b1402f6536da71325bd6c88e2d0642d60f964ed85acfc28d
-d0fbcc7ebc3d462cb97fc41b8c4bf8352a09d71ccf318db3f2ef5e16d6711c37
-93bd1ab7f7c73db89c93b7843c2c2f2deb720a2e840fda79d3220ac62c280628
-0062d213b27010e5332a1bfff9ae17063c4aac27a190a5559933cffe1fb01db3
-b048fbb50add93b115ff5370ca33678389a703bb381841ef19d8cd1b930c2c3e
-0f1211744ea18b15e6b29d8fb3fee9f5416718e1da724b7b3a1e82a28ee059fe
-463640a5fa80025208ecdd98c0bab3ba2cbbcd80b730686ca27b14240fb1e9a5
-c751f88f42687a2901c489c8e7e428616ae0553d503d093729b64edf3937434a
-390e6c6e1094848d10511feedeaf239a1afeecb5981ff1f6d042914f02f17847
-4ceb12269438aa42a0f9bde00db8783c01383be5c3a45941f8afd0177055870f
-484eca20fe4288a96ba1d7a341b3c48cd24ba4dcb14e703db1389a5659e86ee6
-e4884fa3363238f8532d950d5b1566dc7f68eb0a31a0aa314deefdec9a87a7a6
-e7fbdf52e14cf413fd6029a77aeb5f0806ba51f9e63063185c926ad04df113e9
-265be0f9fc4e71d2b18680bbd314dae429c9eb2d84789bb85064468c26c04215
-321132cd4eac9046092f1979e2833d2d5d1a724d10629a0d4e9c7e03a9d3b2b6
-3c07d9f4cfed06a476ccd1941a071679df08f38154c2936fa47177986edac8a7
-925814c83814c705994bb0c9546a1fbce22111adaad613960c0a95d98d9452b8
-7441c3666b539950a27ce6d892c2d65b412fc58547ab21a6d02f1209cd304235
-ec32f4349fda2d1a6d9299c9ad560781dcd011e1d2d7cf91ecb6f5193bf9a33e
-9f73a66b5184f9266afc4183131e7854f949d4114c48cc079cb892e8cae078c9
-c88223e65723bbdd78e23843515712bff13f4544d43a144fd180639c00e0f6e3
-9f871f8c056d8e774fd3d05175e8b411038483f333e18f169048ff21000fe84b
-2541309205f6635a05de58dd71efacb7182f3972ea4aa2c5a6483ac9e38ddb1d
-008e5a2f4940fcf820987e2bb7b73fa38f8441806ac0de93736109af54048a1d
-e95cab99b1f3c5e104af17c67f0e0a99a0dd9c7cac7d917a8a0032abae8c577b
-f6a647f505fca2e854998057387da13f8189a3f9bde597d66a1d87388d840f09
-8a9e712c6e3485eb1b8005e3e3224d959b925a237e167e10965f6aed03941a4f
-90354b6bc6dcab1a2079d0fec8afb174b57d339252bc36a554682cf59773fca0
-36230a8bfe5538f7770e126ebd9dd87d800663c14f5f8a4d4bb935fe7d05d2e2
-11b720bfb754d323a8a252919a048db606eac7c590ad68115d052a78d8f0f7b4
-89e048372b293ae6a44169ea795cf46d25637c7252bc7a0062896f546624e151
-891ca2e70dac19e06a3fd3c67de2ff19c3d3838413f82a38369c5f2166ccd869
-5d4dbd9856755ab9f7c94810488bbc713b1aba7f66c07155138ce859a79f023e
-8954decac00adaa02e38cdfb927460cf42cd34caaaa62acb7ad369f917bdabef
-9e2103e0117f6f99b1e9dd73edae4b8c353f6961c8f078327d7256b5ca6a5996
-bcaf0cf21718f574f6f2b501dc8a3b115d4af7af8062e17a9f43ef05c1103ed1
-b406b350ad72f31ed50de231536a0ca1db4373b3641b39471774426a87d5731b
-7aebab1f6a9cc832f7a8e542abe1b8815d20addf94c143f4824ad09d702acca5
-f80bc581e0c848248613f5d86a006ed509a5a55591852200aa9a3534e90ae0fe
-95098ccb45bc63a4d86e2e1883db0bd1e293360158a5403467b96c1b9e11f082
-ac3d3a5ca47a04b7605ba54c8f9b34abe2fbeade06c3f3d32d667b6a0074eeb8
-84a40571a4e5f2c31483accf78230043c5a17f8da13b1bc9fa92d1db17724bac
-73e48427410b582352164389f95357f53902454e167ab86c5a5c404b648c4c37
-aaced6c49af4479405fb9d32f6cd78e2114b820cc03877c29cf4707642c942c7
-3874aa52f3f2955ca7832a12545f745cfb8768b1d24354f9bf721d55bd9d0722
-acd1fbbea4b1f26128902892bfafc8c9b1c5860f33321edc5afe7009f6ee10e8
-d5cd98fa521b3f45869b41f8ca4032e8f814ed3eb0dac7828893cc1ef2649390
-e70cef649f6c469c830a2820ac2b19bce71b76e2c7fb653093b9fcf65477ea03
-0e09e3de1306a2131a1792a616755b670e91a002166433e03a221310b633f96f
-7c4671b45b9e5933f67019ce6992ce8575efb90d4691680a02a4acb8978ce207
-817505cd7f01e027a965f79e6d698d6de13f56ce427a7ff627ed78237f99a702
-efb328304bfb288641d8685cbf43e96e85e2d6aedfe97e8bec0bd5f9622b98aa
-316450a090f406879c74985decdc96962a50b5de3a5848f92492037011d0f4e7
-dd0fdc25d578a0f86f80a8ae25b9975fbac71fbef5c04810ea0a19b89facc0cc
-aa73cd34b809854296cbdf532f9593332114e100ee289cd181bd3b3aa05c4fe7
-b3f323638087a2b97157b23505f9a653cee29017a39666e3680df121aaf641e5
-f971007acf53e8065a0fe536bb72e2fddb8bc51701f5d069faabd6c101e786c8
-ef8d299eee8fc6f7f97c1d9c09bc82f8204c9231083394ce840312344d592d98
-f652724515c99539d2c463fabd42c8360e0f0f5aa9739e3d2e484d3d39f2ce73
-f522a79dbc46266aa36518f0278432bb380904ebb6f30ea6edc835e33b81be18
-21b6e0d803f31e8be97a261b3b1426281b00b8b6baa6ddb76ced67d802415006
-1dbb011d04048481d815ea0db0dbccb20044fec53da88ec8cadc39bd57a2dcd0
-fd36197e8075729a1bd4517751dbae89bd44e2ca7cbed060e3e6e6b124b88ae3
-02f90a2388bce72b3ce9ef9e1bc8392246271d4cd5fa6067ce5eb426b2692836
-6f00ffbd94493239104a7d71adb54f3f1d74447676511fdcb82674cc89ed6b67
-7e6a24a5dd5d29f76eff3bcfbed6b5e81ff42a04b42b9c30763e501b1bd830e4
-4c9890fbe3b039eed303f064e63b7bf7291c58f2b45aa511b6e6fd2b169d6ce5
-3c9d4331ba7029bb94b7b5265da7c0cbab1afeeb6368ad410552a8b23c4838f5
-eb07bdafc3d60458649ac2c8fc787bbafb1b17128e82359c89a20075bfdb63e6
-d9be78d619689ca0f8c2e9c38a5e8b5eb42b4d07a9a3542cf835a423cb65bedb
-ba210e7b2073919ef7d76471d17b165d6aedef70651f46d22bb1b6d3a8b3898d
-e9370aaa67830689c4773e20e0264978655ee01d30e42f8a6ea3ce955c657970
-23129accb969cf84005341b24f92e23b4b3962834ed91ed40c6866f6aae07219
-f49f0d260d329c287d4bf91c504dbb44d13da65a96b522673b7912dde6fe5e76
-2ee0d89ed7fd96886e761c4f262c88db3e212c603e8981298e4520428c058480
-2f5fe0fb223f697f946330d97f6275c100e5d15f36867a7e9de9338d654cf267
-5bb52e5ee6c925faa522780519c15b655ae54ff19203a3465582e7b40e904716
-45152728ad912b05d25eff9cdf03b762507d6980908e22ba5399b2fc2cdddb10
-47d8d3b6d502ae49527a62ca8968a2c8b6c814ee0cf1a7618a8ea8d7e7c5f61a
-50515dba6ed6187394d8051121b685be8d029d97449c85c95b4d68da2a31278c
-dc7f39c44039a3a363d243910bd26c882ba1ef5be080d0f8b8eef954d9b7c186
-ea5e664aa4141f9ffea443d59124e25899d0d18dced06702499ab54e72894285
-fa1ce9a831ab914be5711a225ced342a9de51a7178a4e5c4491a3aff1a606aea
-4b91188a20a63747374aeb9014cb11cd6f52bbf906af5aa6b5ac2cfe27e75efb
-c554648f01f12eccccd3d94ad3b3271ec690e9a874284fd22587a58a4d78680f
-20bdaa27a59c0fe1eda28b86834234d291682efce38bcc93bf85ebb7b493066a
-40ecb74eb37dd1d018d3af16977ca7b539e5d9e68312d255b930cf1a859625f9
-bf81aec791a6fa63f578a4ecf972e1f61ef9258eff34f91ad002ea7a5c3b29ee
-2ab6d77ac6c14c71ad07895206b0a68ed4c21e197851ad6944d4f61f3d089c06
-d0589e1dc7494f3e4ebab1f56666b2290679a7656cf84ffa3f1a58c1fed9a62f
-3c1b0de1496a711f5b8e074712c3b44f49bffe341ed6e5926368388d0ff7882f
-ff24a63273155908d94e78ed8252603dd8eebe7d19e588b029e5136840a26664
-9918867370b5f8d3942127044ec81cc46d1e88fe88e47b8af625b6826f2c9ee3
-5f8a6afd319d66812d80a171a13316c2a4c73900686d4616126aa83d635c4f9d
-27fae14feef992bddddc1bd7c890e67cc544c31ac9d05541d7af116724081cb3
-8517dca6cc490a02295fbeed7e147b1e45033c70afbfd711a2d41248cba6b56c
-94e1b2c1a12409ca6e529f82e0f23bd91da21fbba01f22968a8cac2a231362e3
-61523dd5ebee42c524cfdf2eaf818650db8da4e382cc519214a7b4fb3f90e82b
-315db75c77b7ca98f2f21258a68417326cdb55cf6c2b31f197872a8d9d65e17c
-dd64e130ae2d6d2a16a717de89257bca08f5bca777b3021ce17d5b1a07aef098
-88fc1e420c9e08ae3ebd4ecd38d4417191658035a623a3dcc20257c0e1c4d1d7
-d7e0e54defa4d27fb4f815ddb2604103030e95f27871c7b0e9a4c4610948fa16
-012c4b30cc2e6c03a7ccad7f0643b9a1cc1eec9c7a2681ed802ddbe7d8eb18f0
-2770b022d4f2aba40045ffd23a888e04b800735f917f0abea17b934e4a7e4d06
-aaad3add44cca6826070ec12bc89e716dc416bcefe0725c086e7804ab8b7fd91
-6b1e1e3b289afbcb202d7074de5c61f2819f13735639aaeb50e7dc9aef89209a
-eca7316bb46f7f03ee99f56817d385102faaee63ca8eda61bc7b905ee48a9625
-69dc8122ebd8bfabcb8de515b7dae09542db46e0e6036611762442e8d3943d90
-a89024e8cf46bab577380287f30284717c433f304119762b276fe84fb0d0f075
-3d6591879886da5fc0e179a7fef454699e159e8a2d35dd1f678c8a5825febc07
-6b2d56fc48370317c9fd3cc71a4cf3772bc6a9f202a736e863ddb4cebe059958
-1ee4c17ea43b964cbc2add4d2e2ac013b43d11d1c1471565b90d1bb0da9b914c
-44810b030e137b37ef8942dbf6b041d9f7f90305afa411ad92527177f894c2ce
-835b8942eed694b6e7503851d5dc49bd40e05056841fdd21d6c29012161cff37
-8e213657bb2db9f3655cc1d18b8c6a4d31b2d37036b1be5f51d1277cee26c758
-685b9b2bb9b9f9e88f9146ba4ab794f535358fb49fc0d40ffa41ad402644120d
-0ea676f3d5588683683b79520de05a35c0f394f0f5ec6d13ac6b1df71e030dc6
-9d51c242324df025c96c5429f19c7190c77666731a46f8143c37252db87120e7
-8bf1c9f22b7a80dc4b999baa805d9f1eb5ac4e28a70d0fbd6c7dfdd7c1fbb560
-26073cc5cae5a1cdf5f8471585165ee0191d353ccdcd05f2117cdae9cce71d72
-9d0f61304f1d29eb2c5b6ec18290a9b27baceae80a405afb5664ba513ab26596
-bbaf87266ef51dbd35112eac5576b04b650031528738edfb937dec3f9b0caedf
-2447aeeffec2129814289b09842d3dd90b86300f1a035849b87fc2dc2e4292eb
-568ecf43a518512f9dd5287988e688c5f040a442150d447196bc5216df070c0a
-551928a0629cf3c7e430baab504b2315156cc367f55f090dc1f6ad0214353780
-f1cc7f4a9b262debe551a5de29cf1cdf08117de2df62f164fa91d166eaa72758
-9b862a3dfdbff31b404c11e411f0c642ca06962c18304403db2eb93cfadd392a
-c7a030971f2f897017317054572a4b5fe8fda9dfbad4c079b0c9c3e3336aae94
-b11baa3d0257a88a1919be409db0e1ea7f2f55fbafd3b4a8b5f55581aab8fb31
-a233d2081374327616cfc745b3c7039dd295a0b5068560fb68eb67c567c589f6
-08a45a312ca25accb1775badfd7b2eb0f4bc948b62362b3bcf40766b987622b7
-da7d9b68a7909104056fd5e0709a5928a0c314d407745c9b5f4c9a65483a7bd2
-3f550b7030671bba32d959442573fe4e6cbeb995b2fbc273b6894f70701fd2fc
-3f6ed6fe95cd521e83862350df167894510c93b44032187f171773b42f483e61
-2048daacd1f4be69c9ef5e6c1f63c72b759651047cd9ce71199dcbab1c36c1e7
-da6dd872b1a4c03d7145e4dca72064e2ffca5e43fd66a7c532feda1000904032
-843fcb1e24d99146dd27fc507cfba1a63b0843af0ebc0a336aafee4eb27d8796
-c0c1298a23874928f35c7cdd27145835742eab898c2d04e7ebd5c0fabf4806c4
-d44ba374cb1ff5052be5066d3a52e1f2ba4841fe35ae6c097cdd1c8b04883764
-efb0f51f646cccd0321ecab07647066dcff2bae0916983248b080730e45b8aaa
-df9fc1805e6c5fb1b536c598ad35c0f69f561dd949ed142ba7fde6778620e8d6
-ac443fdfdde254bf1475ef95bbd54d1ec0d9b531d1cf690cfea6ea9dd4d732e3
-e5bcdec23e92eeefd411298360effa920d3ceefe61858b9a356023766a181bf2
-aedd269b7d4c610fcc03cd8fda705186b3c842bc6d7299abf6f704b419bd2b2a
-a3f75c8b0ebdeab45eff8f1b9bbb9b187b03a0735b28813860d2916f7279fc8b
-e6df8e6f5155c3dba782aecff52b1be8710747c51e9a76d2574fcca699b9fdc5
-48043c2fb363a596f6b3b371657bdc2be900c9707a78fbfcbd1c0bf881468e2d
-f7adefd8bf30dee1b2347aecde496c012f0cbfe3816068ff31f3b3adf56b612a
-632703d469de017d29769ed5d55aa1f37651c11f0739ebb4c3af0a3c62c4523f
-05081ee09ae3076d361ca40f8b13d4a631b9f24a5366f4e678481abe3993ce9b
-ab8813c00b4b95be15086c69a55e65ae908fc071f0b3c59daa9719321edff148
-62fa6efdd42bd192d0138f6bbf5890f78a9c38d147ae00157f4307dc3095432f
-5bbe889da9a5bee8669c6651e758ed5ad38856433fb9702d70c12aa29cea4424
-8e50e17ce514b8ef3131a972b8db0b0be78c93831806e98916572e7959b8317c
-54149e5372718963eb74983316ba7a0418a921433d759e73cdacb1bb6ac69df6
-7961040ac80e5459f3120ca3c8eaea02497b64ef871030f1501ad79dc405019a
-00e355ae3b7c48ed22873196a98637ba2b25bf8b946ce509da8bd25456373c29
-dbf08751baf2bbb23ed57b32d3abe306c29eba95e3a404c3a15b172a8313932a
-c5ae1588a0227de80156713ea8239110c31e0452a2e2cf376cfcf90a41f68bdf
-c08018786b166a5e9326b1beff6a4ed7fa44f523911d1819cb6aa1ea58fc52cb
-51a74b886466964dba973726352554470d5c35353b60b68830bfcc8f14cbdf00
-f8974ab1914694025375901d71324ba933b2ba61204c4ba5f6429077f429f17e
-8f1f95c2308b2900bca909945f96f33d73a7a2186e28d4132db91aa6d8751e47
-fc1665361bbeaebdcf6bae29423c6fadb892bab7cc872ee4cf3490d2956907ff
-baeb199c2ccde45a2649aa2e4d8dc65142df9b332691d9b154dc072ea33d1710
-e64eea0969e54a54fcc812d6c8ce00c790d71ddd67c6b8d4ca7baa6575cfcee5
-8af7c205f455c24ede135b653875780f54c98e3159ed284139f4fb00f64ec8c1
-1191c0b484b9fd15fa6f0fb5b6999de6358741a0a48abeee116a44cbc015c0b4
-5584b76b7e73d6d3148bcd17cdfecbefd83aa402162367bc40e7835fb64a4b04
-dc4827158e4b8f193bc470c9bc0c46047b4cc4d797ea9ed7f35868331517fc43
-15b9a080d5171104dce9c6b8d9105b0031f4b1f9ce7d8e2b7d08c5d633290fa8
-8356b073770339203622f09407cd263412ecec6c7f58f8d8f5be935ccdebc64d
-5f0a0287fdcabae9ffd00c24e7cfaeddf9fae5f60d4864e8268885f71a8a941e
-facc6eca987d76f1ca3ff9795045b4b9057a7ecee50a04d09b859207ee869750
-282bc24be3dd0d84e33963c4c1a484de057541399cfe79a5bded1bb90833d8ef
-4bb6f36b7b9f236ff00bcf441ea1e1ea04bec9f3402e7993be2d024a5d06c653
-6c2c090d51187ad3eafd64bb0389da839cde99222868ce4ad6e03d6fad5411b0
-9826c410db9179d22db159ff72b0c9246c690b527bbaae566d145284f3e7bf24
-20c2a7bc2ee6607ced1e89c558f3a4bf132f23ddf53b240284de7c4839ef3b53
-6532a60c9df1cbd3470d44c7c0d26136cf4955951fdc3f0b85ff4d4057f47a6b
-8648c3640059f4543316ba9007c0e784f79c79156b04f60b030cb98b4fd47577
-dccc5c223e0f1211744ea18b7c0e676bfc5ca9592a7d9e7c13b93bbe2bc62251
-71d0a4c44950754ddc2ccd486d2b702f4188987595bf8988130b0c059b279418
-ee3d0e21a1a8e2b1852ba7e01e9cf19746131e126bf5eedb08e6c635d700b0b8
-caaf2de2c01f82ed911278abf80a8a47aebe6330e0d1bc308f00a9fb8944052b
-4cf11ec1f73f3dbac7a9124c6fd2009944732d672c3d4cd2d387b4235fec275b
-907d25342890dc44dd670020814e4155463f6bc4804f68efab0501388a3ef816
-e2ed8b83840782e22be4a0b562a6b0361b8129872c5ca1c0055940378bae85f8
-2a39e182e758f970c22aaead53ee5f934dfe39abfd55bdd3275b65b0b71eca9e
-467dd786fba4f8c7084db6069703dd97b05f80013cd99dea6698ad3ab5f09f11
-5a00e47fbfcd13caaa7e82191d1881b3992b69c6cfa15307d6ae8370252145b0
-97709d56b69ecb253757ae7b1a11cd9a8c2210af5c91fe93bc2147681b19c75e
-a360636446935d85470b0c28d927b07afcf63809a53c0a8baee76632982e9fa3
-1cd9b8f117a7b41689c83a23043550a3f165bfe81f0e0e224a6568e60e28c466
-28b633d66fc7370f65fd2ac5694e7c9a616bb88298cc7a7bdf9a39f1ffc1aefb
-16de11a575a58fb8f65c47aaab60b465d3e8eef5240a9773874bb658d7356723
-f449270f0eaa74cda1a6d5f732bffebf4415e77d3a566d48e47d7629fa6b8a21
-6e8032e7ceedbd8ead4e922685d6be6448a14fc839ae4a74f6a5a59c01375a4f
-d57555f569d036d0337351c7305c49217103adfe4b6ddc8376f134eeb11ca705
-92d1e2e80c423ae05a0822375e0d3f059cbe839b07a290a6b421c7d513f1961b
-27c632269a8c35eed49010c561b580412b9363aa0e9c76e210b6a86a55016da9
-e04e8f7a5c525ad3ef4edd7550b6e2f6669508051973e36e435579c178d2d39f
-3e27bde7de754bbc68da87698aada323575cca997a1cc75f706634834d1dac10
-7103b40c71a1e59358ede2d1ee87082235e808481f456968bd649a268e566680
-3a8471be291dea8358c52ad22508da5762fb1e1f6128b34e32bb68039237a400
-c1afe9e07c69d8b486281a9ec09067d09b0c8bc16c0960771066aca2f4c18907
-4e2ab98be4da38b2ef92f3a922a1fa3afa66ccb7dc5c59cd06f7b6dfe00eb86b
-8abc28551decbfcab8ae483839cbedd2cfd6e7c8f6348444ee0e67e943e88444
-f9f871e9291a5eae7d63522caf0396c4cb477d2df5377c39c46b14125e100ad2
-4f15e1aa3dc33b356f6a6d9e1404efa7f05b6208948b01acbfb8a1079181872b
-f06cdcd561a855b1884008e605d67e653ef3357b9c6d5af90228c6b4676644fc
-cabbab905c7e9164a901ba7fd1c4742d454784887907b7e1a9b2d1c844ca2f03
-3991fd9fdd19fb4af35738bb380bb940b03e9fddaac1f64afc6e3c99ee1d7dc5
-5ce48afb651c9595e41c894a8d75af382c709720a2e94f03fa45ec2cfbf7d3e7
-6fc0dba65ae93bad352e1b14aa0f3c39cb8766c106a1fc656401e4ff5c4584ab
-974e93b2bc7f16209d80bb566ed5b67acbc84635bfea38f1e87c39027a0d1ccb
-1a93049e936116e1847fb3123585096edccbfd0aa63e623b8503a0d4760aae40
-0a88a7e87400875eac6f14fb7a7a8682560de6cbb43fcdf303758e182c4d12d3
-87ed4533d7c9f2b8e13489130d6ae5fe066f4ad856b167725e4ca2e7b842dd7f
-599de83285aa617d5ead39c7ac6ab77e42f5e1153250803103f7769cf35430f4
-fc5b91642a1b798ef39d359f7196d3f7b0f864e016da2e43ea1a2b8e8334e8ba
-c0af735eeec83a2e344ac6a62461cc1dbfacfafe1cc1db2ab1655ba0a7d64eb2
-4f165b64608fb31dddf15f708f052adcb6ce974d807e6ad8f7b94979ac09fd65
-163a3699cb80a8a32d49efcafad68856da3be30b616873ee511e361963983106
-f700c080555e719697b0de489286e397f5f81af94632216e357f1020dacd270e
-c7d9bb4235aa738a8dca7f23680c377a643b0b59e6a7fb83507c8cfbd1df3758
-3a565760689d25526f064e961d0c3d2071054eed80850bb10ee9e73f27654d20
-32bc2a750714ece1a4ede7b7c4be79f4e0c3d7a6b433f44774d6cc6a93f6dd1a
-29b855b805788ff4436794d2aa348da5ab69ce698e7d5b1956d1a7888607d7bb
-a6b59226b144dc8589e4787c8ab0342c8a085e12fe9ddad5fe1c185099e207ac
-f4308371fa4afbdf90eb5d08a0076d70615a4d17264baa2e712063032c188877
-fcec4971f2c7f4a9012fbf3fe15b76adf4f35e5c0f337862584b12d04bfbf85e
-8b3e8eeb64bc0fea31faa7a697b34be4a8c3fcae69ebd8c25fba58f3d101c9cc
-7d6cb4a6835a5262a28f9304dae690bfaf6eaeef09d44a0418b78e2a4d381047
-35a4523e8341a74509eef699744865f10168cbe739d4eed29e6542cb0dbad470
-d9dd0ddfb8164959ec59a632863920e18ab5c001845ece330868dff7b7ed51a8
-c50a11861df524d4dd80c7b370886921b9f6b28015a83412cdc4fab786791bd6
-37081dff54753214e35477c847ea13286c28fdefe690fef446f4cad67ac3ba20
-958743af664767e8d8ef8a389ec1c138128aaff1b7557b52eb59dee75db67cbb
-60d9b08b3a443b10bc84417aac4aa89973c8d8932af5b91b82b7569cac09d69c
-0cae12b7411269a1c550c94dce68d60ef418f21ab29ab552eca48a4ee94a4b27
-5d174ae06ce469bd5110d23678269b244cd596650ab74f024460c84b564cfc31
-f10b7d0a15166acbc8e9a70668aecd4fda96ec72af4d438f3e9c42e068bb2504
-66e725c097f17e533d6ddb0223a8c018e6445a468e5afed7d7d93ca5e8807f6b
-cabc59e9d7eb20de335ee9328a6726bab86e2bbcb847e18e2be079bda3c1a380
-2d338cc33a35b0bb17b37188cbcd54c760cfb17d5da0c66197da9123942a8789
-6bf0e622dc9e93457e1b73b7f5b96c894eb76af290e1f9dc439e36e972b3f865
-187781130941b3596aa9dc699a6a586c1acfba7e1d7b340312856ba9caf63662
-02f6f303f92f15726dd083b1555263d2e3bd50baaf7c0bcca4ca774f5e35cd0c
-85caca2366e06fb942b482bbfb1926fe47b1d95a83a5143ba801efbc7d62c003
-2f915672ee8ae1b235096c8f62635bc5c42a03d6be518e9c4a68ee0d8e48d1e2
-2de2828cfc76efb4a12ba5c3a3a08175545256dfdf53edf0c91bdff981f5b9b3
-fb8b9ffabb007646755e76a278cb1752b8081ebe91dc77177aeca8ca90ce2077
-f90d35e6f7aa90b1505e472ae5f09bb05f2a37b5e2cea2e1a3e5fe0e367a07c0
-f31f855d7f1c7b4272ea37398bec83f7b79fbf86129799e2ca9e07b2a01213aa
-2d73499beb7ff978dafb22518227532efae2a60cae34347ad352a00c0adfea43
-e3f95208c6f5c21e1fb3c0b07a1d143d5a8b55cac717fda2b72ff0c3fdbabf56
-34cf4c2051dbc59ec4c00b6e1cfe454cdbd9fda033cda90a2b66fad3e8271e17
-fafa42139467358062f2a1c244c48d52a9fbf5c1f360bfa45d0b03ec7ec4805f
-3e7f67e258936a690090abd309b2b93424efeb8d5d7deabee5eaf0db5d56c33b
-3a728c08624ea5d0c85f77beac600c5fb8c184ac63b3fcc5344f22dd878abe96
-4320ad7ad8803c28b4753b071213851247f35a2f90a59072312059373cad6276
-2a17bb449602f8424ac583843810a1c6db922a87bbddf800bea24f6ebb071d2f
-3a82053bc5ddf3eb11c3c32f551a81deb3000e57282552fc0b8ee17ad909bb2d
-b851793f65123af449d07279de0999aa5208cc293593eb9ef607c7e20e873e64
-6097ff18507152a8d111e24e419c148a5a1fbd339428f184bb3c5ce3a36af6a6
-9b211cee9150c40506c1e990d19ba8b4f0b5c01e7c19a05904cb63d127118908
-5ab937a91b2dc3b59ac6bd1971c084e2c156c10661b2c7a3d170bde0fa3e682b
-abbbf187ff39304d6e5ae80eabce1c54a0bfe09f22d97133e94afa9981e837cc
-0a80b34b29899474b65ebc6df73e5abc2f2300226c4e96e7c32b3f80a26fadc1
-e503fed433b7cfaf681e6cb33057a915ec53112e76cd9602ff64a75543eeb82d
-e6f45aecf9620a5a3bae1f4459b9ae6162e472e93eb2e0daceec8f0608721072
-e456972d5fa6bc4a45afe5a8a5694e538e659107ff4cd6a8ee3d38544e397ffc
-26a98e8771a5e07c99402b1722b09cc959f9d25126a82c7820de21a9855eda2a
-1b7e4d0145ec7017caa0349bd13177070509276241a0aa7dfae14f1e2d1805ee
-58714e9f2a647fcede216c7b3297910df45f91d8e0c9ec279f16a744930f3b77
-0b80d299b44b478377ef237341ecc5d9a59b333cfbbc229be944d368559988c4
-940209b2a4fe6d55713acce94181339a1d70589e96a54a952163b072e116f5ae
-4e672556501ac126d0dc91531894b69d5c8c6bc531db69a961cd517d4bc07375
-5683fa7cd9a77fc56c6ae62cdf6bb0857e8906f835035e78d3f7ad14375b6f21
-fd0436e6c914c3b8d6e543df1ee4b992c024e9d9fd316dfba3ba9809a089cc99
-8f34466ac94d689350a5075998d7240efcda132f3b8f2ccc0fc78f5d77a313e4
-09d5ae9f2839b9ba67cb79e1a0e7ff8f77e766aae4e1931a51890b3f0e3b39bd
-5412ab04baeeae007ef88984afdd56b7f81f403fc6eae6993367ac9071b396b7
-f690f613193c638b9c6b10350d0170696db08055fc583cb04c3c66cb71d354a6
-6c02a9c33e312dd36d23c37836795088375e42241d176d2168dcea614a14850f
-d283c962ddd274d58fcbba7668fc6987cb0d204cc4db70ad44c53ab5da5e15fb
-55c5c53b85d0468b1798bffc105d55973d081db5cf801d98525597cfab8be326
-f6723c6c5060c6001ff9da8d01855933f68d88ea8c403e6dc8aa446e5eabd57a
-4d8c080ab4c164e3a97c1c6e87b3e279b97e99127fbbf1126099928ea8c0af7f
-3e592175164f46dd15ce60c6087d1893dd388b7a8eb65d0c38c56fa3fbbf88cf
-314e3ca2b710ff61f610ba945f7405c373c2b4147713206be618b238ba3e367b
-9d158dbbbe4dfc0aaede3f9457893910f3a83bf6baa3688fb1176c93132e24a9
-bdbecae4b53fd2cd971091dc99359d11af0aa3e94264538203459faf0cc36410
-def19e919a2714e2ce1895ceeb1f26ce613e5f1bee352ef3a63f94fc343fe7c3
-4f831ab892db8e438144821d5a701cb71d36526ac44a9354f3440f74e9e1fda7
-723f0120f75059513bd52cb2781a08b52142e53d0a4a23d7d003cae26b838552
-a1376832da4a1b8cc20cfa9f72fe3a9380a282bbb73a9ac07972677045589c0f
-e08cd002c80e0064a732a3dbb6dc83393d470f826fecdba4f1d2e4be76a5a433
-9a5e25b1f2b734d4f1469b84d977e3ccbe5951c768c9274d0423fe5d740ac8a4
-e3affe4fa68dd8cab058ebb21962d72dcfeaaa47e541a2ff3e6ecdacf0484ec3
-7151b6b1fa6109a0113e3bef3145b53d05c62e0391e266393ba1a4b39a806a12
-f2fe6562dff2fc97eff531ded8dc6e0ed359b2bf16d00031e9e0753bb32c156e
-ea81b7db813752506558d39f967450fa05390368950c456f106211dfc0621e52
-66c14e1ebc6a9f3de3165500218fd683fa0dd2b4fcb937f14f7d3fb85faf556e
-3f53ad74a4bcd96872b46716e0bd737dbf5d3115ce382ffb8243c499503283c4
-274a0e51c9d41b302fd57c648a4e1769dcab4668ee624f3b9c84f296ba9ca925
-056358d1e7f5a56ce13333e53b5676d5e9ccfa4cf68f18f28aee890b1bfad737
-03b64dcd7c5f34387f4522f421045adb7cb8b552d5145b83e24667d4f80cf636
-45f80b863f0293b1d494ed65532c3963b69fe1a858850799155ed2450d836d30
-d28dbfc50c7a58fd713346961d7f0e5513394b29c06c52b786b48a2f13b95b9d
-56d6aca8250f3b716f055275af003304d36713f14228b5ec40de7c3ba9ae32cd
-eb91f8110bafcf7c92ea383bd9ca4d4fd0f6ccb0902b07841a4cbee2cbe21c4a
-8124a11ef70c32d89e4b86d0e84294412f305ec186afd600ef7d72634e931f60
-a75a22b03abbb87b4a163044b96d43cb1a8eac9484df8955edd18bb298612f6d
-a9ab0fe3153be8def9616e883e5ca081c79f607d7439ce5a28ceb6b17f51f0f0
-9affc2a8a766dcbc19e1dafdb34bab555934bc8b3bf2255e4aab837de34079d7
-3b310d8d82d2abe249a28e1fc6f65e529c301933849883e86fd7b7b44271da63
-15913982ad40ffb9c796f3b519f84d15ba2fb42fdd632e042b7d9f94b28f5b81
-5139956c9d4e3521d59777d3c34a07e4ab2d92ce1e64c02c612023bd84153d02
-ac1b86b34937b82522277d5c11a7a3daa95e63e4d122e626d9167a5a17b4d041
-8d5aaf88b8a59de837362e48c9fd7123c3c30d906cc081ff9a0a1ce3b168b9e1
-ce50fb45fcaa3061d7dd0fce1c7051ea3c032fa52fa63442629461bbf742df11
-e6a548e7f73cd0441032ffb059fb81b468380c5eafb679d5ae2f384fca2236da
-5d5d878a6e29e282d045a419488daa5d3500bab9ddbb6123112949548b37cd85
-46e466baf1c18d05475029cf8b06206338df4d287541137ee8d509ae9e3716df
-32627c0e28eb8edcc62bcc37536bf8a36b8a545d539f2754fc39eb8da84fef99
-02a3733603379181d07b780b1f0dab6b69ab3268adeba5cac438510e80b96eb0
-79ccdf7e76b2f88a37beb1b83e4b3529ab0b6b1a35d5b7add114578ce3783582
-fc23f6c5df43330e9397c71e984817b908dddb6a02e6da93c87f623b3dcacbb7
-5c7b032d24a5e516bfe910b1569ef48975b8b7448f2469a41b4ab69f419f9f39
-2d3ca7b9bc768151274aaf55b06c3e399cb19b6e0f15ec8868c6e668e524aed3
-ec176ffb6a8accdc068a22eff5d79498a00a99562e490c7cff7e59e7d3b3b1f5
-8e48e1ef5e08391391c7e9ccebcce6376480909156717c07de203306e8c7c7db
-0b8737da43a6a8e9218133af777bcc505e5f5375a3fe8411cb5a317619e9d259
-07cbec0088f2610250754acf52e22dfd59a160aace94a7392f2f3a578980b1bd
-6d1dedb930b6948583f7d978fbde76276822ffa4014cfae2ac22913621b0f778
-d50edfe8517092759af5bdd038316d1b08f2b31550d1fe1fab8b62e79419010d
-6a59355a2e73cb08443700ceab7ee437401683f20cc5e9a21f056866f2b67dfb
-4e1e8df8ddcf2c5823e7fef6f91ebd1fa571ce77ba080c0f604a263379ec4e2f
-f5694975fa6adb5a646ad327db787c204f9b5ff9f9228a3337c111d32cbd6f8b
-1da885425af61709e40d4352a1be6d8e2775372a3f7717e9aa9b951f79d2bfb8
-399d1f915e26836d454d286655657b72378551cf133bfcaaaa2a45e98f840bca
-522311100c7c92f46661aa1a75fb44cb28a1a7f0cbeebc2008c5fe882108e2ee
-1e0c683320c084d1e5ff7c0657de7942b0daad28494b24649b271d82c10b7373
-f02be60741104e31bc70a2fc2ceb7db132f272caaf093993de5cc3d139d559b8
-ddfd287fb1705ca461eb03a4e039428ad0ea3baf3b29f824fc8c8edfffed4803
-e5d0af7bef8aac625a184911bb28809661eb2631a078fb9a244f043adb379476
-d0dcdabb21be4f1cee1b21d775a53dc6a1bfc4a8
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/Vera.ttf b/lib/fonts/Vera.ttf
deleted file mode 100644
index 58cd6b5e61..0000000000
--- a/lib/fonts/Vera.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraBI.ttf b/lib/fonts/VeraBI.ttf
deleted file mode 100644
index b55eee397e..0000000000
--- a/lib/fonts/VeraBI.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraBd.ttf b/lib/fonts/VeraBd.ttf
deleted file mode 100644
index 51d6111d72..0000000000
--- a/lib/fonts/VeraBd.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraIt.ttf b/lib/fonts/VeraIt.ttf
deleted file mode 100644
index cc23c9efd2..0000000000
--- a/lib/fonts/VeraIt.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMoBI.ttf b/lib/fonts/VeraMoBI.ttf
deleted file mode 100644
index 8624542ed2..0000000000
--- a/lib/fonts/VeraMoBI.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMoBd.ttf b/lib/fonts/VeraMoBd.ttf
deleted file mode 100644
index 9be6547ed6..0000000000
--- a/lib/fonts/VeraMoBd.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMoIt.ttf b/lib/fonts/VeraMoIt.ttf
deleted file mode 100644
index 2404924856..0000000000
--- a/lib/fonts/VeraMoIt.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraMono.ttf b/lib/fonts/VeraMono.ttf
deleted file mode 100644
index 139f0b4311..0000000000
--- a/lib/fonts/VeraMono.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraSe.ttf b/lib/fonts/VeraSe.ttf
deleted file mode 100644
index 4b4ecc6667..0000000000
--- a/lib/fonts/VeraSe.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/VeraSeBd.ttf b/lib/fonts/VeraSeBd.ttf
deleted file mode 100644
index 672bf761fe..0000000000
--- a/lib/fonts/VeraSeBd.ttf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0419bt_.pfb b/lib/fonts/c0419bt_.pfb
deleted file mode 100644
index 4a49dd591b..0000000000
--- a/lib/fonts/c0419bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0582bt_.pfb b/lib/fonts/c0582bt_.pfb
deleted file mode 100644
index 9baa1da24c..0000000000
--- a/lib/fonts/c0582bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0583bt_.pfb b/lib/fonts/c0583bt_.pfb
deleted file mode 100644
index 08f6871c22..0000000000
--- a/lib/fonts/c0583bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0611bt_.pfb b/lib/fonts/c0611bt_.pfb
deleted file mode 100644
index ec6ed0607e..0000000000
--- a/lib/fonts/c0611bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0632bt_.pfb b/lib/fonts/c0632bt_.pfb
deleted file mode 100644
index 0701172896..0000000000
--- a/lib/fonts/c0632bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0633bt_.pfb b/lib/fonts/c0633bt_.pfb
deleted file mode 100644
index d68f639bb0..0000000000
--- a/lib/fonts/c0633bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0648bt_.pfb b/lib/fonts/c0648bt_.pfb
deleted file mode 100644
index 72a1606b4b..0000000000
--- a/lib/fonts/c0648bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/c0649bt_.pfb b/lib/fonts/c0649bt_.pfb
deleted file mode 100644
index b5d4ded6b2..0000000000
--- a/lib/fonts/c0649bt_.pfb
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/cour.pfa b/lib/fonts/cour.pfa
deleted file mode 100644
index b8c097b068..0000000000
--- a/lib/fonts/cour.pfa
+++ /dev/null
@@ -1,1954 +0,0 @@
-%!PS-AdobeFont-1.0: Courier 001.003
-%%CreationDate: Tue Sep 17 16:16:38 1991
-%%VMusage: 57844 76768
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263786 def
-/FontBBox{-48 -288 684 841}readonly def
-currentdict end
-currentfile eexec
-b2de7b9b2a2783a9a81f7a04e7605e0bcc84ad7a981f9d6b201c5fc6acdad3ec
-d09a8a1907296b7bf5510822bd65c174d41912f5e2bdc23ec621dd28cb4f8b62
-5882cca862ca3c8bbed56696f8e17809439151596792163977eddcdae7b5c346
-e93a0756e7da36a403e30b34b70eb809ec5a5e6dd43dfc5d482e2424a93fd4d2
-d0e648621eb8f9339f10ba2db9312ae5c071e20946278b5d54f7858a41f0a1b6
-b2cecd201fe0cc773a733fd892bc4352fd2c68554ad49658bfececa5de0a4178
-07560879485b17f950018e00fb441ca6e0face6fa6acc95daea5b530a954419f
-a15ff97de6a7ab23540344e0193d5356ebdb99f60fce74a4c1828a36b3de4ec4
-92551fa4f0cc7ed791d897ed75bc5d034f85f7326b59e16a9e9d20d7c7072a4d
-311fff4cd4635852ab3e098236a1eb05be8e5d3e4ced8ea930076fb27ae7b5f3
-a135b8e3cfa19b4144c0672503b51641ecdb779eaaaaec164216beb4de034575
-66b93918a02aea1730b7f138623f2df763d6ccadea312d4059487851ad39fa5d
-6ae273d56563eb3788c4d9aefb2bd85feff2c8f6a0c383f653ddca8d4072a397
-26bc47616d936e336d1502b65cec60baa4f7c423c290d9a8e067b433ad52790a
-b3de64436aeb25a5b8e18a91e616b9c310d8bda5546cb5f46e8d74adb8f970d4
-88a1602e8ed3390cbb9f1e4564f70b2141cb8262cf4dfefbbeff3d15f49afa29
-da9deb04f1e004399a20f57f770b838059aa75ffb5da99581f2fc90dd7b7f4bc
-3d3d32a8b2df7a3b9ca0311f5a555e6f05babae4c577b02379370e5a364dcbb3
-1962317eded89394dd26e5e37e5f776a9ce97ffef9429f9e89773a6db3d642cf
-319957b03a0434f4f81e782121d8fccd08de4e54e29b1a25b1436d859db45cd3
-c254fb02b22288d080139bf20c4fa130f98e83fde39963c3068c7aafa1c6afb8
-2ff6753842d6dab630e63fd8f7853e9358bc6c074f0acbfe9d56d3b93eb7eb9a
-901ed2bbed92737fcae60b95e7186ca800ae2db1570ca4b0ed9ea9fed82ad73d
-ed3977472c257b253773de2ca37eccce4faf68f1eb5cdc827dd5bc8e3c03bbfa
-e9bd30bcb3cc1d35660637a882f0f4a037bd07fba1c6f5c0e8a88088ecf853dc
-b2dc41ee4ed1f75640a93e9208fe5cdc7366cf3b738cf4177df4f922d8081006
-8f8f2b0143a44caed520141238781111a1331e7a6afaedb2019cf0eb438177ba
-68fb0d443989e67d21f49cb8a52711507792c45bbf0c25f634cf7c1323d6146f
-7c778eff204c71778e5e9723e662106caeccb514b9be0936aa409567ea40b9af
-b5852cf3c9cce25acbfdee0097f828d90d21cfcfd46ea083ead540877e565883
-3234b8609a3f376ad94098ec1a1685323be81a64a6174851b6e8e80d3d8cd6f2
-41e2492bc07c052dfd66c7fa12ea0ca90a15f49194b0dbbd6f80aa49cc52e0ab
-134571c2883f5adf6b57a036dcadd18f7e397b87fa80be532ac7aac3673796f6
-f20f5341984695dc99359d6e923a79441b64b85d405d53f89edf79d76278604a
-4001ccbcf3e10ca83f71202d6f0a2f26db5114515f8eb58a2eedfc6c9f1f9a3f
-c40205c32ca33771d7497307b4f67618bf46d3ecadd0d5b6f21d298784f9e22f
-e8a97443e951a141e79a2cd6e500653fbb8e34613e57c270301dbad7b89d35b6
-b7f6cfc81e5e9f58508bfdd6c50c8b4d9114f9d9d0764232abf8c84b8c8d5284
-f78138778565991ffefaa9b63d205e74146229c2656d126e3664870c9800b9cf
-ee76f078dbb1064aa5609c6c553b2c660a4054e46fffd645e8eb8864d1e15c33
-e20d690b90b6a5b9a7213bdde4856236d9f00d882d8d8cff4b27fbad85503029
-b9a4a75da575bcf29ae444f0714b5580aca0bad9460fbe2c847cd770825c8b0d
-72fc684ae45ced430997d41467889fc1969702a44fb77e8de557851d4eb34433
-631c225a516281ac5e0ee6c0dafbc40855c315fd60559e53b5f33d9ef0fd1d04
-31be569d13f6dbd52bed9eff8e7eb514fb469daf3f9f31c7b8d31411692a72f8
-fc3907df11992b3aa76ca73c82710c4901b4eed793d4909a451f5f09f73db0e2
-0c32146422d4d5f83a4e2e92cbd9297944c8bb7205aa2adfc88dc6dcb4e82ff6
-07e4278885300463775ad999e2393ac0f67cd635d955f4ca5a9f57662c7e76a7
-26e7c4256827f0c03cec6855174fff2b78f1870ec2366a59a4e9983ce00941bf
-17dc97b59104d05746ffcc1f7bbfd007fbb0eeb36d42f959c90382e49737352a
-f582a0c76c1d86a1323af83fdfd653373a3c3b7460c839858f6fcc885f3d47d1
-902001ff877043ce9d13b1f8d1e819320f6374975e740aa77886063741e378c0
-ea28694a1bdcb89c1e2d5e8cb9fd5ab6d20be8cb0a2a74ee73d5f4c32b26c067
-0e7608a372b6e0cdc1819879ca3eb1870c22ee21b8d42780d9ca1489a4abaec2
-7dcc2fe096c55b528baf52e468bac2ee1db1c6e1609740828ad1f4faac82b9da
-066b8472b15faaab3109dfbb85667a7def1794ff158cbd6fdaf9987567d8a6c6
-f86ce77b9aa3fed671f7c74a345812c978fead18ac776f7cc2957540a1720941
-5b9cc4bbd5d8aef5997110b41daf2c3d41adf834aa24862f052446ff8a1747f6
-5dadef8451aa72f9c367f21a98e1cb18b2010fc17637a673959e5790df9abb82
-9314ba4785b7bbb5e68cc6da2e021cc4345f4e6f5c6488d481947454148db9f7
-c289ce25764ab1d810268a6db157520ce871f1dff95396f03780bba8202d430b
-f76046c04e1f0ef462afbf3650327876b5ce19d87ff9a6ec2e3c294976778c66
-9bf548ec241a295db3cf4139936b6127009f9807f48f09cd54e920474fc1ee65
-8dc69c4afb90f7a737df582b406c98801e77b02a02212a0d924ed58ead539b7d
-18f4940a717b46ad908d521b7d07237aa25b4969239fc4968f5cd9827ab24272
-3d29ffec1926011161405f8a9a5c9e1bdc9a9152af563fbeb44d5e4ae05405bc
-6a92b23e71cbb866366389fe0d91bcacd5b98a2ed4dcb9976ef9eb6c7cf06d9c
-185ef69af37163d441b756f08060fa733b3ebff43160d0ccf5befefeeae06468
-0d18f7c38748d1cec437e170ef4bb6d85eead3105b2a354de80a6396c185caa9
-1d57966cc000bff2880e068d61f2ba670f7f9a2fad0ac5d1f205c1e1fa0a1d3c
-110e184837018af730878a978ab3d08581e8b222307d00f86909c39c12d40bd6
-c7299dec0867f7417de60edd1897bd627767b29cea62593542c642f1089242d8
-53f2db5f45b7b21fa906851b2f28437933bd4229e32d093eda4d448641380da1
-9696d7a77fda761865d9a4a8ff48de5aa6550b2f80c7e7fef54f5dc709a9b2fc
-120b03223ad9ae5d06298699ff21ea2f71bd34afb79799e67cd496a57e417f1d
-87bcf2bb0c5f9fe9067af267e5740c26d6f3a256330d68f138c81883d7c07eb4
-cde5f6b5d82cbf5dd32e0c27c393cbb77cad6dbb058fb1c6653a5cd1a78f0577
-87c9dd5b1a5f83a13226571d38d367f2a4e369b4651a77789aa785f4a6561c92
-e0e82f217b2597d8a180ebe4547aa1500b0f814d309b5b1fe9dc53282c914407
-0fc79d82b5d5ae8bd272b022b35e66cd260c046d102eea1a1a4c0d376daa9b2f
-e0dcb3a7254130d5787191998d88d4872834f331c75485d09799d467bfb62465
-5ea38fd84edff90fbcae880820fda0f2a3bd5cab972b4d22f1c649f970e05549
-f33e95a6d0af69653ae918872958bf100a04a7c61b8fe7433697a92b451ea444
-4670e38e33893e59ecb4a621ecd68e76308ec0eb2716fc7427ffd64fe309a635
-71c7b86839add49634114c0aeed57a2afb2a46afb303fed2ca4a7b3cce180595
-49bccef00e92339805dbe1b0c05ace5cd5a9c6d8931cdf62ce4f5406f8ceba6b
-29b696b0e0ccbe8b9f9e1afdcec58064e3daa54676f493af1ebc8a2c26ccca62
-9418f0015d84e5931f620207d2c8b193113c8e6af5a0738f7085930e735227e3
-7bf703da80016e492cdffedd077be121b35093b031c35d369298f78134093147
-363062d031233a26726d549b16ccafe56eb0324ddeeb4ca8904da4fb9016fb5c
-46b60e873074c2e0c78364bdbd05e0246fb44e77dffbed7fb94364a0ec0970d3
-29ac31712d356bdaaefa99865561391247a78c8ff19f6086b4d8cc464d0b3b41
-7fbe5f6b3e68de6ece2242224dba66940dd25a412c337e4c19c3305e4e1699e4
-53bfa096d66bae0ddf3a3f6d84cbc7478a00f2ff606f86913b768a18f5adafbc
-8b18e653351cf8d251ecd0f0d3002862223e3488701c0a5647bfa63b55b5e162
-335533f701659833fed17ee4ef0281032344faf499ae8e33a25f97d5839fe077
-1ad9bfd9e2c1a863e0eb7ce72cc615f4ff19a8ebfe2f44aa6a636bf3197ec107
-37b3ab19482250c61d1a1bf7fc4f325056fc30554f92b88e6c8bc8ea8e5954dd
-e367a169447091d9d01b79265cb1054ff7000df3b659208c6166cae1973f3559
-6f4f9645361ecdb125b87b6b9096b8c1894e5e1cbada10134d54ece4bc0a73d0
-7a93de3a3b943697cd3be33ddfa0696663524a7b6e246984620dd268ff65291d
-e84855ec9192f88540c57826f6e6f25fbcb4c4e39f6b7fa2a3defd578c08c8ad
-f66fe2cc07a3317b3697ac9e5ee19a9e225edd3d52323982d83d4cfa156eb858
-681dca6e77ad60dd946c8a1be74a8bb83fedf6dab14f5a2a5d1cb08ad95f2a93
-c16c39cf8672fc59bf40400920265c7e06ed02b2a788aa23425b45dba3b35a53
-098d3ca23c0bb5a9e16ffd99cb4846121c6f5656bcb8d34d29e3eb078bb39fce
-be3b98fd375ba941c515c88cca36f7c55d325d3ff0932244f9c8359831981a10
-67c57e4b0ca5e2db14a9c2e24b10fddf7e037d4cddabae2e5b0443c3387eece2
-04af27ae3befdda5e88267ddcd3eebd90560de14c8f2817b6e6055e53e40b35b
-93d64234e4e749cc875d9cfd48032e1059f2d2ea0e7861f3f525c81fe1863640
-c851079cd35118f98d53ecf08b86add9fa65016797fb13f20fa4f9fa0c5644e2
-86e4f6427a278a0715ad34c88b103c6fb8c09d6500886c93f399d56dc0444a53
-f64649f39e423e9b8c5bd7e8711a4455b9bc82282ac372524bcab6140921f9b7
-10f75c662901c3ae885424b03f12a4c9f589ac693c7df6e188913b64a7b1f70f
-0c315dbef339b801d0f228c5d82d08c00a9c9b1d825559b47b00e98e58204a11
-257dfd1e7cfb5db205b0dc4c3211374459a58a3d23713068bff43c8b73fa51ce
-bf259e69f45b37f30869f44bf3898ef27d9f3b4710b28579538ead0240f72be6
-15eeef499d8d2f0a7aa72a6fffc68a0947dafa98f52e94aa14da157cc2c71aed
-17f3c2661ed84e058555d0354770c155c54a03186b815440cf8c7e37f9117e94
-67a5d50281ecea2188537254696c4b50c3aedbd3eba04b543dac970a7193bc79
-bc707725c13b8a747ad5df929cc8365da27c028745fcc82dde3b297258ee413c
-d84d17166ae6dad65489dc8d98a4c760c08dd0de05754b408a39434b17773f32
-a3519b27d51781c807a352880f5d667dc8cbe54f2132200db7971b0be03eb42f
-aea467cc7a1bdef783ce5d710772da9b71db45c7ba4f3c22ae9a9bdf1f26c29d
-811037a170868a8f6644b0092e7cc538fd5c13568ca262ba0fe244f7307727d9
-318a281f38b607c172e64134edb76d6535abbeb9689840a297accf5c15150f2b
-29e8cfee85d099297d0c6d50720d686cdd849751966c88e3aa8998c0c5c17665
-69029750afce844147abc710780af405d2a4163d272186ac4d486fc32c1770c8
-37a0656b6a0563e5b38a080f614ae9d49bafb92c96e2bfd140a88c4989952edf
-2c835503abd01565e2cafa4373b790376483d4762a99adabdfa0d7a7eaf9da29
-530f626e330c8cc65113b1b7ddf5b01249b9651ce4c47111a5c6590755ff0744
-5ea2a3afa851de664cae6706bf0b640f80ec4a178e518bf6b41c793995934999
-0ccc3cb8f1864b6f20b1160c9ea3f1f8e658e88c81fcb7a28280fb37acfc06d4
-5d5c93509db13e88349ccb959dd1f23c6d5a574b9489fefbca90f8c24982bd5f
-8fcc0ee7e13ec573153b51a760f47811a50c1b1e981ed0007e952d15de9fc00a
-64966a945ab7cbe49e6bf90062cd8f6fd438428b14612085dd18ecd59924242e
-e5c9038abee84cd94acba6c96e805305bacde3a0390a456e19dacc83f8767c5e
-a9fef61dc22613e3048cac14ed6a75fa28c06d348e240019aa36faae66d21853
-b43a4c05372b0a958d3d26cd22186f95057ee646602ba13e1974758307085b23
-6ff8b0f2194a00258a76b18dfda0d5049bc9780289dd54194800554a086b80ea
-65d97b1d6d03ef0ad22356fd31c90485c34a1cd00837c419c7295b712a9a9258
-b7f0452165473af73b7e21cef53ce54be278298053937f89d0d3bc15657fcc9f
-3246261de1a1443c26cca0bf28d291f451d3ce279eec77ab32d5463f7f5ccc69
-5f6fc60739a5ff55dee8232b2b868fbf60a2137d8371422c1fd08fc21468bb4e
-6addec19fb2def9aed1599fedacc1e5a38670011bd19ca8415af3d94010a50ac
-69e8d2f36cbad97548090d37e081824c5bff928e0a767e0947c8c4f00388e4a9
-5e992a705ca0e7037000e4c191a898b40a74808db0c15c9669d2009ea5c7a391
-dec4f2f4685dfc63fd94703f948d758f11efdd2e0a634e2d4274da9bd84ccea5
-8fb6f41e617ba30fa2114deb639b7b579e2ba187bec24145664921599b6b0559
-d742b3ddaaa4f91ef05cd15db7cb7fa2400f66fd9db3d207cc5728d65b866295
-10b2b6a1cd2a33424a9006a26e8bfa8b3571a59e5cee066cc10bf301269621d7
-4f1c492a02220c551560eab04213b3e8be62fbe2d7af013072ef82f1dbba5b3c
-be1974b35ad6e92e6d15c2609c17706422beb22f12d3c4c0a748426dbe65cea3
-a0ff0b208a66460ce8d359b09333e208ef39fc7fefa453cdcb028b195e70c577
-260962e2e8900a286e628bc5b0eac0328c2c6f64f0229ad0fc7872f48fed6d1b
-bc490da985c19f622bc07b388a4e70e79bbe40e75d928670eecf2911075dcd05
-6f0010a492dba50abc966411d49f39515b27aa1e16e7b6104b16c6b52b428ab4
-9a6e98ecdb65aca5377819de9d99db481a2d0ccb90a1663cfa6eb6456d101609
-a1958aee3c8f2fa4396038dc4aec5dfd472273900e50bcf3cf5e5711055b90a9
-dd6845b57fcb0d9c6cae3ed0180c7a4c554a1b05298518f4d7de4107993f2715
-4b90a115a8d1a3f074a4f34b67ca5d733d59630a5b0ed10fd6459f4f9e3d17e5
-352ef13aed05ed7a17a44068884977c653628d8bb5d185f5783d041db9644d0d
-69bff8433e2d00c9f6a8837a414270c66d0249e414ce0e56d5051ed7aff463c0
-5d6cd8ea3b09e1a3fa4c1a866ef3238fda1b43606f29cffafd8f91ae673bcc38
-804f91178c0d596e109b65d5a462a103a4a29d995567ec16f0263a03bac4132d
-e2573eab9dc7349b6b1fdce50dc21125e38d17a3f6ef66b3212de5e0b74c3dd3
-7541e341be122bbedb6ebc2db96dd991f71011aa719c1784e24479deb65f5d05
-3bc429785d4aad99de7b5b5c03e5ce4443dbc7bf483ef1be808c8e508e6000f5
-1dd9d907b07db3d9f6566e5023a8ab0eed23857b30a6ffda86dd1aa3b98eb1b7
-bca8ce298ec3cbe5049272ea33fdca7a8a5e701e27e07cb3da0d395d258a1dbb
-8714d83f3ccbbdaa9fe08900475ea6ec759f425bde968014214728d08ddd7358
-1408d3974773001d9bf782dc9cbb5209a5d3027aca7bc277b5dde20b991e8535
-1889d8d498d5e8ad712cd499727f61aa3953be4eb62133bcc578381ba3acddbd
-bbd5de324e4195cdc594baa48782031b9df8aad86ebd62218b119123e213615c
-cd6894853bfd77d26740d044f58e602733ee307442ab929222edb68527550414
-9ca05eced3d317f03715b8799ad1ef2ede2e3e0fb5aaa71931e70c33f7557128
-cdf1022264f9c9b5dd2d9b548a76ec92ecf9ec2029158b376c89a27c4f738009
-b555618b66865c2f98af0733208d65b1822c734d3a5a2a0d359a32dd566648db
-eee996fc085b7025b47b0f8f4df03a5f9a3168b722351088a1eadecb90456a05
-ba74d908d4804034a3b9a915cff7a3b2d467f9a6adbf12c2995b75c03db7b23e
-b224cdd2b64a0ea942ee4c07af8eea6587a8d3781ad7a6528d821bfd7028a2fc
-5478b6460aa696ee868319dec5e1bcaea69f007b1dc80c47701adacf722b5458
-60158e090398d30a9f049adf3274a492fe891fb7b2bf76b78bad2fb05bf43bf6
-b14095b00eadf94491eb50d75fcdd95025dd329127e4746c2b433cd4793deffe
-5015755a330b821f93f96ab10b508e71363ddb55cf4c6f9092201715cf26d859
-784c49b636c639caf84e044dbe3c14bf6d64e9c259af1f24ec73c9d30fc0fac3
-1f9eaf2ca8f49d0d5c18e6a12dc8acdb9f3d8ed49f607258c94967989cc31a21
-5020a9fc65815c230e8da7751552a895b0064c2a1cff3f18f9ceb908540a92a1
-06c7d46c596ecda2e25d331ab85f534313b214ed307dea03d4113ed6fa2ef1e1
-db3adb7861fa48ced61f10ab89faeb82caceda7fb1e9ca240e38611acb421be1
-119683647413c0c063c1468f1376a099f08351bffdfabdfce352ca87c125c021
-2301c6793146014d87d22727aa014d56c375945f7539863eff029d046197d65c
-6a7474feaf44f7c07b0ba500752ba29f5f165d4abef0ec13c625ecf722fc9ee4
-6958a291ca5b1f385c6a5c6ed4fb0036cfa6fbfc46f1622a59f019983d1a2f2b
-6662970ba2ffa63322b5bac4d58adac06e2ac789e0deda106a28a860e87ccf66
-39ed41fd29be8e218733d486633b763d0c226c18f264a632767957662400393f
-4ccbfeec54acd358dbd43e71fd59096150e9db5a2aa6b01bdf8549dc0c9170a0
-05a2e18275d6d74b6815f0205a6990862a083edf44b4052f83ead884c2d891a0
-698a2cdda09d43d67fef477eb0181246a8ea49d8407ca5e24691dc83c45bafb4
-4e555c33e59bb6a17f2bc3501217502c545082e1de1e43a3fbea39ef67644fec
-e36492edde144cd3aab6778cc0a4be0fb15bb46f95e86f7b4de290e66cc69f66
-5b20522987d2d0ed0ace9e250ec6c0c4793a2eab0f8f9a00d76d624cfed7399e
-d1e766b6c2dac1c46c6a8c3f291ffc03eb71dc220eba0573225e74c9df93e3c3
-d31f4bf8b79a0eae363eebc0d4547d61d0d54c42dd66fabc8befeead4fdc6bb2
-0586a0a47f373849b0b6ddf42a21c6be6e1c9ddb2f78c71a334f855173f681d7
-253a9084447b363872c750476365ac690bb27460e4bbf22ecf0e4d2481bf3b0b
-afa54d4295efa2d38cc6490324b12dc991060dede02e8e29156ffe3f9116067f
-0478f9b5928e44075e847e0864e06191c88f6ef0408124499b970c5c5acc28f0
-6f15eb4fcda631fbbeb199ec847fed052710c5d3e1f1598f7a279110dfb67e87
-8a0caa27ab4efcc03a6953e28aa9d660999624cb29ab8904942b5df81d67a462
-615111d743ca174075f3cfa6d239741a4e6bddf182de776addf3810047c24c44
-e453a67241e96bb3ed0ca17cd928b8f67585a228176d85ef4b7fc0374123987d
-2bc1a0fcb9c5a5be1749e684270f9b77c5cf4ae8d360c14ca596efe21302d343
-3f7881e8a25a88ca999a9f31a2467fb739511a42913b98d56671c74683f2b8de
-6cb20b8b9fb3d1b51b9a9a43b8afcee655a3f7217f5a952093f7a7ad84593aab
-fe0767f6879cc2ec7e9ab5b59bd82f48d06c9adc0fa218bcf9e1f63e9000eedf
-ed014a091dc952e3e0f07eb8e7dd1dfe0cc0e6af9072a53fc95199f9233a66f2
-d04c65bad02d00c3c5ba1f5af4d33a94e8eb5ef8b21ed1637b1c3e3522cff141
-77cbf28628d468249a154e900a9deac70f0be7b7d7efe43b9243eeeea068b03d
-0122feac859438fe96eba107d3ebaa99817816652b53944df5bde7b78eae04dc
-d2a179fa5c3002457ccce48def5739cd02a8bebc5d65a626bb50e4857a592d46
-52d7696129b176e5ca95c9c3491858d341deb70a0e2d57b811eaef78e52ca362
-9e9dee7e39259100ea60488aabcc05ae2c6f751f41bcb2c690161e8813fb4e7f
-d734f2c6fdb37ceee6f7bcbc29b2819e904e61f892fbaee59c4581e2f171f9f3
-60452fa11a872267d49f62df732dee74c8074370bb37d33d939e4a933758487b
-280b1d83cb23df036ea8304a2531465a647f81e63dde4734c49a51ad26401384
-0793737f31f69413e5f5152e30309701ea8e96357cbc6bd39053135647519300
-70836262da78a79f8ef1d9a17458e02d8040629b6dc7a7dc114d05a4bb01f90e
-01480ca86f291747c4c1b226b2ea6c15a38b6d7078f2f51b264eb125891db1bf
-a669525940531976089a9a63fda1c89fbbcf9e5a8ef413f837bb541b1fd6f825
-b7db4d1c1f3fa3eef70eb4df0e962393060034581ae4609479013a72d16803fc
-a455f9722c2bba278a1ba5bcf1b8d1a5139f5ae71ff532481524acef4fdee7ef
-14d343a1f0e3fe847d9c9e5878bf1e5530820de3e6d438e1e66f20baec033b4f
-92d055105ed98345bde4fbb5612dc76b7f51cb9d66150d153a10427c027ee838
-38faa910e77fcd45a41bdc6081b0826206b56c08232984a85a5251a8a8362cc0
-c4b4f4dce651519c55777e6ca349bc060f9523c421b264d1b30895da4abfc4ab
-9ecc4fe0b4a1ca8310f453de21a1e73e8bb587ebefa3f4555b5a332499cb2f1f
-49b7d122ed4f470711f436d05695fc1f275b93ceade6d04fb2108517d670949a
-4bdba8b6cddb62b1c9cc92ed63a8890d1e287e0051e7c8bc47b4a7fec9c7c33b
-f668abf07c2ce4e080c8c4e9503b61940db11c5f17c54d09b8b8c5ce3985b422
-1ed39a00c39e87166c7ba0ef441d352259022b609513a2b134e13f48065c7acb
-4b101230ba98195e8b49d570347fb95443269e9fcf9fd03c7aba76e7a1b13e18
-7d344d41907fcbdf19f616daa51df3b1b1be673f95c4ef1a271a908548cffd0c
-5f70521eec3119ca5588b4b7e04954df14b0589f1448eaa347734e92128f4d51
-28243b9e8d1d64fa12f0c89c604ef7ec03587ba0858739ff07b07dda99390b74
-a1ff879e4219a459c6ecca54896449c3bdf93582f0890bdd0bd6cf8d5168053b
-9a33cb7746f62a84af705b6135ad2bf04803e34abb34185acfde007901cfaa43
-64c992303e28a71bdda153858d252d7fd2da0d8dc618fda68f3d26c03641019d
-7dd2050beecbf38dd29039ef1923fdb29576b7e3f10671d1cfd93a2e5dbff204
-effcdf0035eea6912163e8a3d995ef07170e0d74f88762a3cdd080d6cb7cbb60
-3adf3cf1e8079a2642cf23f40277b1d0fa687adc1ce2e22ca28d2715d58cf727
-a9bc686734ec03602ac69fe7ee9c08a1a38ce9871e9038cc624c1e423f34539e
-4c1dd622e6a2d30e06e2095e30b6c545dfba323e78413ac65afc1be958369d64
-f21405f98fe5b5e58e9ee85dac85dc318349e91e64c839e9c94ce019c32c6cb8
-5ed016f2e6069a4b374e37155400beb75dc3fbdfa829980698b9d725996db955
-e4702b4ab9c406991b30154e150ad128f2bcc1d6aac5383acd6a9ce148ef92c8
-70931f701e867f254c7c82aa34f8d55b28f546e9b7f80437e5a258f22d55ff60
-916a502103299649fa9b14e5dcb9d2beea401e2a3a12bec2315fd88f23fa8a9d
-f60511057ad5ab55a602688c5d9b215355bd24cfa4dcbc9959d1facadd693a32
-0bd8737235896ff92faef4135e208e0b52fee9ff7f101a4957c241cb836ef31a
-4368603d687ebc95ed844fce7c18983c888ef7309fa051593913ad1d767e142a
-d6e6993375d0abce782bd9a6ce804fbf4634a65c063344c1d8469684c09a9d41
-d64736dd3c7dac43b546866d7182336b6a73a4335b8696a43116f9d4a83518ff
-1ef7be60d5a243461737ccdf00093ebc76627a1e24d3ac2a60cc8eb39b7ddd3c
-205d80bfdc89dc0571abc93def1998bf1c9c4128be86b52c362446f2ac2695d8
-8ad1626b27d6110b8d130fc7189266c5bb05f193e826a98e86374c57ee9af55a
-2ebcccf8497a068d6f60769d2c6a22bfb9685fe12e239b4b7c70f13d3ceb0dd5
-9eb53809883cffd0d5ec27e0b66b7a41e642ec1d989ce0ced2f386ee381ea1ef
-0c659556abc7dac2d458f816f04e0fcceec190d561c0683f4d579807554ef59d
-71762374f6bde146e18ed9944e053f99688ec4d84cb8ed2cff8f7aa3a9b624bc
-0bfcb231c35f93dff1382e9568db2499df08dd1f8f8b49ebadbbc2df3943d11f
-3a18992b25c7562a7f1faf0e6e653a678942ef689200eaada357e28f2610f9d2
-0f5fa45e81142d264e1e1a54a327ad4ed915749e9f27dd8a36af0b61c4440c6d
-9703e5d375f449d352148cfa26c266ef7afb0c3b598e6458d82780dc8d262fb4
-57a136e4107749b0efce94a6ac6c9d49d725d3ae79a217a38b238e4b766edaee
-64d0d9dd1e571f16ba46307838319adf6a0d1e7495cc545b7f1ea4911c21c8fc
-b88075446a45baa28a9ef33e0b3f3b8db25c57c3a85e34ab0c0fb1b18e7be01b
-cc2629fdc69e64825a845fdd7bae1cca2666dcd8a7f846521f4eaa2ab5eb1b51
-af7002dccab0a9a7389c2d3129175d8ce87cc4d73c6d46fcbc10018ea1538fae
-45d1b02efd79b908cea0b20d186dfbd0ab05ae06084c5b338d1f60111f5dcdc9
-e2818773fe82b7e0a621678987b93e37946bb24b181a4fb4cba56e3ef726c158
-b0e878ab6469ea8fc0de95a17742141c1ac2b765be853343cf3c935be5b14b37
-203788f32c418aa6206e80edc58a9af1b9547a5bbbce6cc95b56bca4994b32e7
-6bb19593d6da2bb4db58c0b0d1bd0f94149aad4b85a30131f56931a145a65f1c
-ccab13dd4b4f3f233d6eab4daf44f42b89da53d2df61dd7e1fa0575f27504b1b
-74f843847454fca0e5264fc642a28541d6f1d1caedf7db860ed45d9965121b53
-5611a3fdc881cd1366ebdfb490085ccf11f94905ede6442391bcd93b1d44bcd4
-a7b2f17c7b0ab3bf04d07787451e43b3f25d5e864fc6abbcee5297a293c02937
-b374d8578b71b911556f9c0e71dee07042bb46706f5523f72dda2156e364dce9
-644756987a5dac995c0c86c4df48c1cca629126a0b67b59d50c4e34635c04cdd
-165d5607a353568ead3949838d4e5ca7a8e7a9f88540508a122ecd371a77cddb
-588e6392fc187c1a210dc63e42491795c21f9f50421bcbb5f2b58fe1db5be2e9
-bb7938f70f3f12aabdb6cd26559d18fd1e7e6757c5470fc2dc7f8fcc6564fe95
-c2164fac044b3243c72f3fd8ca843f111df1a51672447e49070f6ee4c3adc8e2
-5754e8fac50535bd2b164987dc02452a9de63973203ede40ebdc6d0cee93160c
-05aa3aca73dc14bb9b8b01b94e8dbace5e937e7f0f09834f266d71d71bc4e06e
-885356033cee9a7f346c8609fabffebe003a54704a4035abd55b26fe6819805a
-cd33b6425a3b61dd8f3db2b7b9551318d8048b24ffa4b40861614765716d5e67
-a9b1799a48b69864e90476f693cbd8ec106c20e94502ea2ee452c200dfbf45ad
-273ced950370c316ecac58f3dd67b523261a30fbcef78d51d427d414619e812e
-72afbdfe5946e0e5ff7029808e6fbeb849fbd716ca435bcecfaedfffb8a2c48d
-3bf406a132e7a3fc2a9f52c28763e7575bbc2f22f4029bd90c19d9c816205b48
-2b03f88fa36332d72e5f0df82134760d26ffbc3c5867556120f26d10bf19a25f
-b52baf6a8f98f0a6322b2735e9c7cf5e152d0b7b01d97c5ee45438a287ff2172
-b164791b1b60b29e88f3b4eb5fcaf195f5d53910c8f00517a82c650621a83ea9
-94cc63f4788c98d56676ae219fef3e446356fba4b49a24c3e0a8c7413c8ac1be
-4d0a063d6dee027e9fc4ca54943cefbc760615b6ab16091114003b158b019e10
-5f8c488dba09b70db0ab77ea949f889c1498faf8883d63c36caaf1d3a198e2c7
-6a2c97a0a14e5c3dcfb7034ad7357b3be8cbf95d93131d778758c29887f5cf4b
-493044e28e29903a3763fd76b3d69aeb4ae6f95b160fd9519af1a8c90aeb2977
-6f438f1313feab076ccd14323a237ba5bf76faeb29d0ecef23adb8cbefcd6df7
-6741644d51076cf66f92b52d852c8994b9c763dd08099897b11adcf00e9dfcfe
-fb6c876b4f076f7923fc3975af92e9606475c78b98d53f60f656b5ff23fc4b60
-32de05f8077319f6b35e97c43dfa17b4de3cf2a3cc799f8bce3aa8c9d1b83a4a
-bc42a89abd121d46c1a0235aa761af492e2e2136221ac34039136c291e877912
-d3946118d5afb7f44a7bc0abb2b066606c7d4cb5fc0c8133a84721d8cc7ecafb
-fb6b15b6ad5adac50a7c3a3b8beaf70054601140cb8cc08b6372ff8fafb5bd0d
-f04364633edc41fa1c4522402313b35550fd3515b9feb6a17c4a5b197e694a07
-477cbd4a46999edf0f0a500ee4c701f55f00d5751c65d08a621cb3f41c298c6e
-4ddfe05703b6ec04c25de3e0e7ad4f11dc918e011c5fbb236e5bef784b2ffeb8
-d79be24f9c1c394d5bb839142c1193bb7f224acd259d1a90d2d237addfcec05e
-fa0c387d984ce73e67169dc36eebcf137fc9829e4bbddbcbd5f61c2f3155b72e
-8f427a15b099c2561ce8b9871feb7c1cfcc24a639e0f2d051ecfab89797d1b1c
-0bbb7b374df1d3df75e16998dd4198358e2829f7bd40f50a449b968813949115
-db90a7c403a2832454be362c71875df7476c7651f3414c0d4f497ad1b67b2952
-d41641c740028167677c48374b3151a9021fd3b9c21ca8a8efbd86b11d998813
-f01c3fcc990c60fba08f67d3ab4a302b62ec0f04b9063e01a8c6178f3806935f
-638c972686fef41baa1cf372b735fb19bc389af9d7ddbc7d31acb7e915d4b418
-d7a5ab181ce663314278cf8881ac4430ebd3ee131a7a2aade1de7731da96303d
-ff212e8fa851cefeafa4969d11b0c4a74e23654821ba2458961cc2b1361bad81
-a8fcbb99475b003c29f738ef40e4f9b1d89cadcef391db7cd117be434d085636
-3af49df9d46a0cfbff5af6e5e4d192a4d13050f5ce3e30471e489d57330853d2
-728007ffe1b7ce41375dbc823b84812a6794b58e38de43b2e22d0d059db64238
-5d32f79fe0d2b8482f61a0e1c2155dd69d2dbd2636bc0f07efb9f6f13c4e61ad
-16bc525b35930de9dd5ef4e5e91146acc78987a2e9578475522b3c87d2f5c5ec
-ac8e55de0399eb852551148047019fa08fcae9bb7831454ee0d5c36e3744d7a3
-4eed0cb0cc8e82810a673c1098986b7d3ca984597f37f695df8aa168a70d0ae9
-6f526f09ec75fd2c0d2fa0055c519459adc3e7c61816d57ca3bd36f78a06dbe7
-dc22505a4ca8af1b284d887b12b7f161fe27b6f1ed063fb4f7a37b5af0d1231e
-9ed802879896ecfad70260c1065ae88e593c75b6d0ce546440c482f5503467c8
-54758fdc1c95cdcb7d5663a0e1ac98d0a518894aa3c6f4e4adeaa8ac81d8952d
-585c2b70d5ad861b13f6b48616332c765d1fdd8a97e8b15d38097afa88cd7bb6
-b7c82dc031da0e5e919b3a8cce89da12b8548a7c45fe1ac418eeb8b2318c9516
-59a30e56f4f166a6fcf2473c213449f46cfb906df3ff8ac703020e8cbc71bf21
-6518a3c76265e644f62be4b2c17ce1c8fee549fd14d1cb94b646ecb1d14cfdb5
-cc422d8dae5a86550d4862acca62644fece36492edde670bc9ce80b0ffdaeff6
-82bde3dbf0c403b882882af7572a42b4f49f6bdb5a8aef91159546d90238ec37
-0ba7e2b0cf8bc7505d8a2936e88836d097f48d57aff9b04d08e9fe8f3f35d046
-47d6ae41ab09af7bc1335369407a9558436be878be6e8b7f4cf88cf09a6792af
-911ffc61653653d1c6c8da705377941c7d4c1a6cfa6f47c2984436ef697052f8
-8dc07c91414283515bec6bf581c046306800b755c301e5c5e2509c8717d7a450
-1666d78c7a63c74279dd218840526d5c64da4cd356d24ee7382a471e511aa7fb
-94dcc208f1d79e5b878bb110d5df78d7a25facd252ba729213bc5b60093c115f
-61d72b91eba38d54600893f12f41c59b26752d3efec1336d8a1bdc0e9a33b9c9
-cfb1946d4a60836b1dddddcab7c18a1db24bffe3df0aafce0c145f5c27b8bfef
-908fbff18d2f398b914a5803d2337b95bc7d0520bcd60d3730189af04c8417d6
-e12c20626580881bcbf4c7f6a6a5f43e7792de58f7ada1d8784f6a7b4e6f96ce
-73c7629a1b3f78b821629b8027e85eb5241d8723f1632145263b0457985be78a
-4709401ecb03f96444d94f3369b30b41ae1a16a7671d2a6ab6ecbdad3753fcbb
-0edb46887cca933f5909694344f7282cc7bfeff1c3e19e7668db02447082f8d1
-72111d8526c17a4458326bccf6aac24088a3f6dcdc42d5c5587e05ddc8ccfd07
-38e7f9185281192a15d248f7a7c7f013508024e4f2386df48f076b2674e5a720
-c8e5d5db8b7ea56c349a963ed8441501c23b7334c245069978b1d13aae19581a
-c8d6bd5bfd27b3083652678c15ea96ac0a901508d2dd0d4d89a772c740ac408b
-b9b61c28d5fd3f46463888a3ff49ee43721a0d03907f2d20f9c953c6c1db8bd4
-32afa377913b374443bd560f68d11611b017c876d7cd1a2bed5789a0e5bb2756
-60a68957b69249f0fa1822e3deb8c8c879287fb81344aa625a772093c6ba1517
-11232715b0d53725ab50343c5b1917e2d2575340d003db8adf03b3835475f098
-25e541e87a326369ac59d4b9a71b2d5485f01cfd40313d14492e828a47fef188
-57aad991e624ab1d3d8d696a55d34e3a3689dfb64c5c33fed34fb0c8293da01c
-83c58943509507870979b2c51f74ef700bc52509da2802c0f0c1f4516807c3dc
-fdcb32c4b5ed6a87231e58f5896c85687edc3e7872206b3c19be99a863a40ff1
-5776e396918ae1ddae9acd9a3c654133aa17294a9e57ba5287db3c71dc1c0d12
-d9d6a6b85f5d1cb487b51e8c1329204815962b6937a22375d5db47c4bde26ed9
-3ea18c82839f55a28f62a508958bc7fdffdfabad5757e5a4e891efdfe9421686
-7dfd4e36a3a394fc1451e38907b58d16fb110d8b18e99945c9d1a215f6c906dc
-5c2a8b98ba49c225c437068ed7120c3e591f754bbeb880fa51868ebe4735b7d5
-7c1107652525b3b844183f4cf351ba35d655bd5e66527cdc311a4f0db5412956
-9dabd87a4e45081b4cf219a75432c6c628b596afd87b39b68f600611b3ab3d83
-61b8b056e3aa2b403f6550b72019be02a27b7cd023c45f72ebafca0315f4fea9
-d490254d0adfd8702b6ee29af2e47be8350196e470d622bfd3febf223d7358a6
-a00f042f7d168507d7e69adaca8cdd219cca5ac0a1d28ec684467d9a16152c9c
-a31478464b5a35cbb18f064af9de5a5044ae920b9897d6eda7bdad45a2ce8196
-d918a6c98eafdb088df5e11e3eca1b860fee77e4a7a68e21edf484532e24246f
-345bc0136909dcdeb2d637b215f1087a3b14a74ce614e00dd9b52795f32dc03d
-f2b5fe1c2b19d76b3ec5bb517b0623faa536c0752c796b2179ca76a40c0171fa
-99c78e06bf1151c9384a0ecf7e384bc11248d954b21c9de2bf6df4229df208fe
-a16848c893f1f25b80020ea691d92d47d82504eebbab22c4fabb9aa29ebc2aab
-197d861b9a7949fd86f201a90ee2a453bfa2f49be46e87935cf365b21f946b88
-a3e8647fb2330928c1e5fde0a807c23fcb55b4e2008d5e3add8df3a74e5239b7
-aaec108ea92033cc581aebcf23116ae19f25b8d31eba90ce20388fe73b79cc93
-3fdd183ae909e3122384f79d2fe53cc07cea9151bb3ec076de154e672b580ae3
-42763452c9fd521e7be2ebd9f2a410e989ff4c5beb38346e37d6bc91108939f4
-3edba27cc6d69a60eca3cb41ddec11536719e3cadbfbbbfc877d39021aaaf578
-7b986a01db572a62b492c38466110e1f484fabf38054d0fd6acecc367fcda35c
-f928707a3e15a0cbd3f0a6d555e1625582dcf088b8fa6859b01357a3fa460e7e
-5cc1a3330318b3fada86b2c55f904d77675ef57f137e8d3852e1cf505029dd33
-153640e04fec2575888cae0258b22f309c93e9042d567ba4a0ffc57cb9e9caa5
-14ecba866518648f968390586f1cb0ac986ddddcdaab912a09c397d12a9973dd
-c5abc02b82c7b3c1caac0f1da96154677b7112bfdd1c349dfdb5c4bce5d7146c
-8475e3cf71ab9034abacae8182826bcc8836a6c0cbef7b64b67f874a11535956
-2c9a996748958e7238777f23511b0f2c18848599beb4979e22b98eb5d579611c
-86d917d84c50b23d55e5975a2cc934a1265c0731c9510c003930cd829e40a4b5
-7690c4b63595f1735d8c2ea162db038f58bf18f3155d0d6c5982d43e0bbcb187
-2eff929a6e4788611c2527175460fc9a8a8bc2b2b3acbeebd6c53779a1156257
-0f53eee2be859bdd702d4e983b2877f1f3ae6e4893cab50d607c42cc9dbd13fa
-64f20956338528553e7f0fd6db1fe98257c7acece718e79e6c3ea3588fac6ef5
-a280f937f89e570796220fc2b939832fbb6f34a9cff554269121ef6aa6c3b331
-4f2e22f5e597a4ff253fca5f757fe152e4fb5e6019766336e6288c352042fc2b
-e780c7e555f03b991bc44a7456762fd05c9c2e997c626379d447dc056d66332f
-fc2a137fc9c2dfa584b127429914c40bc3a8a0ea5e7d6cd3a86844cb8f1ed4b7
-63af17e80a0b808dcc5c70b38c1378c9cbf77601879d0019a8b2ad2d458c17da
-932639d69cef730623acd1243b062ccddb62116655812d396686ddc1c8938edb
-bafbfe0ccd33221070a60888c8397ca3924e55c5820f4eb29ff35bc501347a74
-6e3704fd2051a50c4c4c1c09c74c9e6ceecad42d37ddbc410485f90a0fea0752
-1d6508208d4d86ae19e2446d21902441b44739849abcbb2adcfa2fb353e6838a
-0444fc13839ca5edad7b5638d76537257187eb5dc89a1f412c35ee4d8bc661bc
-e25d809bf5e3b082051090b20b6b83225581b547421138abe92a2c3c554651c2
-604f7e79b48a1fe0e630a4caf13fc15fca552dc094be6f359736a68fb4791db2
-9b16edb6e06d3ddfd451b111a06bce53b70b7ef5858905663629e780d0a79fb8
-6c239fd3da4d2fc79a2b7619a3612490f147a44fb5a9a5a8826c7e6f70d9ac90
-41e33c39108c8b963f692c8719187246e9d34f34d5d6053ef759da18ee8251b4
-df0bbca723f7ad791c3dfb0f1db37b01cddda2ce698b3bf679d2cc1ce8685ce0
-c872c2f89c6a6897f8c203ed61aad3f8cc5e0371710f5c4c86343ac388770c56
-f7d1c14b15ca0434218f86befc24136ec73cca2ab768faa087ef70b3d5fb7f20
-0a68082ff38e522eab0ac5c74309807eb4597d8ede958790885aa18c792e6953
-74dd77595a94f74fb896587c5caf286f43223bbfdda9e89be778dffabde05823
-909db8ed5b5310ade1e80da1ef16805f5f8aa900be2ae91c54aa61d40a0cbf91
-4dcec7a0dfb650d6323855a5eb0adf481a2189f7b2736106c56e30a50c27578b
-b7b21db20bf5496e50df4e50c834624fc1275dc25375db000aed74ec1a1a6445
-4f041db66cba8a7c7455b4b55eef149414ee08bfad9bab1693f197efd3bd22fc
-8368d39b706cc7982ce7179cb85b9eb073fade8bacbb9af70f7101eb114a773b
-f5fb3b4231bb9f5e439bffc1464f50ee94b499b3d84d879fac0012433cd406bf
-b7420354879ea2220ef28c07df24dcb079fd0dc2a63f9cc9c709dd122b658f95
-e5211c61795a791544e9c21ffdab0acf64bd60644146153f02822f1518d0f6c7
-e3ca9a4096ff4c424516835c7f6607dafe23c0b70c8f8990eff7b8ae724a07b7
-13297d9d7c83d87a6b19eb98c48c6e9422dada99113c8540f48c1ca03058f052
-712c1a46f17a23b45135c443c1128563fd6a66fe9e3c07ba27511b4cf0ff68d7
-792f6fb1589fd22a2cf5051ed798976fb83d3b23b6981f169b44a3e3cc47af92
-9ba4716c51ef979a3ff7e4266899a457a875c0bb296ebeb8384586aa380f9eef
-9d52ef6c952e848923ab3f564e776dce58f21b6ded7960f326f4e925ab2cbdfa
-863e9c79453e338d7d61b387c193a862fa9e6c456b7652a791a91b0bf01a799d
-cbade03850b816ea002185f7740c8e5b7c32b003ff7a8c78911be015f2996455
-586fba449ae8f9b27940cc97d25d77d60b0aa847f586dc6672e0c0f6d2cb636b
-51aa401ba97d84da2774cb84912e47c9dade61de470b61994b83b75207af9abe
-5e10e5e8cfa8fdb8131bbc68a63886e7fdeed53ad867b6d3284f4e957322274a
-3b7b1846d860c446b0c5bbcc3c6241a56d2de295173c3d64103955b1bb8716ff
-c0dc492fd348cdd46707637eba91fa455d53b9f528d2245682997bb43cbcbc5e
-8ea3e9e2a2bd19202f67d7c16a42c602efe8254c3b2fe935c1f5bdd67d21d270
-35814763f60ab26fc8966849352d3fbdb628486cf74c5224f5d8965c5932f80e
-0d8be4b9716e5747ebd84bf452312042fe88d07e57a42a8049fff714e690ae0f
-5f7d54fde33112198294c3c6f546b09c76ecb3c414a5ed2a2f93e94c895a6010
-e6bcd4e883d2c7d7e826c14c9ee12f474948664138963a96f83ba7906736e893
-118be766df46767c4464623be7c3697be8fbfd662ef959e03b688d73d2a2d1f7
-4e9982faf31d21830d338bd8bcd83ac92127f9d48bd2660432e97bb6887e869a
-9e1871fa2c1eb361bf3916f571d9c7ff2b864658ac152431b931ec6c4f1d48f0
-665a90054febb824b428c2a997b404813e861723fb6c9e2c4bfcd04e8a4d2b26
-2cdce120e24912d32fc6cdd7d7235ac5f3d7840eaff18bd818b715afc03eba17
-7a8c3c3066e95c8840f291521c8429841e8b39d7dec80c3eb56b49a21a02ac90
-0e7a2b67e67732298f4e324825f7c823b7611fad2a8b7eb6bc44c3dc0705b4d2
-58fc26fab5d9c20a786188f593d010a843a9b6fd47f5a71cfd728c48279abd0e
-0a26dedb870faa7e19fffb970bcbfc6a61a487a19c56bc4e8d2e3ef093df0b55
-5a928a3b8f8f26c3e8cd4e1fbdb913d3235dabe2fa3b66c832bc9533c12fe5a5
-d6a004efde58f949bfc8bd48c44f8dc5f55d94ce79aa7d71ad14a4f7517ad7c1
-f17cab05e7a745220c32913f3c8f06cf02bacf882d8c293c8290740eb05c22ff
-c32c4cb2012c3d7dbd643ef84cd928ef8aaee42797d010e0fca4ed02a1edbe1e
-1d7861eb0a741cf976ca07bc02c22930776cb0a36b46b1a4aca00fd2d77f685d
-8ba3c1e24c522e43f198fed209ed810b0a7214faf8d583ea9146b26e9ebd52fe
-30826222af5fe432bd82d840d0a22b8ba2a7635de4c7fea5aacd8f946df99c0f
-cbb84e5194aeb9fbba94a33ccdb34b44a309954dfe2decc1c3f5056bda9456ec
-5a6e0bd801218083ac309c737f10e9a42e69b5bf74d0278fba6a691b934d748c
-ed7644dfd2f5c5ecac8e55df3b5a225e3d5ba7706fe4e50b7d9d53df98880cff
-01aa1a5936513db38de449dd1b1bcb6cf199752df7e2161857fa86cab9d1b645
-95da5a17bc0f305f9023bd265e341558f73a22bd4a01fed1867179986ed99822
-f6eb5eae2fcb74be99f34604fb47cba6c3a0f0cd388ed13dd07337175ffc9fb3
-3befc49a742d6f667af2a4476d6e8e0bb61a002b29ba069a4a78ee1bbd00fda9
-ac18a33cde76217e48b0444e7c90788e60ff3c820ffceda02891d12333d6788c
-8028507fa8b9c59d6d6d476c349c1e3646640fe504893b23587c0fef7c278fd7
-e1fc0c12de081c4bc55ee7bf65c9be4c6168abc5281429f3d39bd0bbf771d574
-8b321d993df752b5fecc462ff8306ff73ced8c946f61087ae9606699c2e85261
-c50715085f967542e98f92d89bd22d1b96c1bbf45e11958ce4f31ea3bc994ea8
-e9d0b7cf4ba9ef66b8b6005d6b2960e68dd0c0af4dd9957a253e2d4c47d46a09
-cec1580c02d05bd3720daf7e8fd3d2144b8e5b3414fe89b2b95f8cd153b326e4
-25b4733ddb2b4e1f02000dcc806252311c1e313a1ebbb4a9c445350609cb8bd7
-25e67f6fb760765b01ac474780faa7078d0d0a0973cf6a475087b720de8c5200
-e953eee885e5510b83a16014a6a255bd8273610fd698b773a0e2911690b1d5e0
-517fa1e2909905419d539b7d91f06fcfbe4c05041a06cb8a35bbb51b563e425d
-0e65eb7b086acab5475bfe889397b2326cde5d4f7b30da851c55c630805a0548
-eacaec8b20bc10ba9925d13990ffcdb569782c39032bc5c6834eefc519747cef
-23e1413ba5c6a03a399e7adc118dab0e5a1a8ddfeb5888a6855ad7ca9b8c5c96
-b33538ca373d4934a879387f55ce65390d313d93e4cc7ec7e0f67c483c3cba57
-f5625699cedee9da8622f0553d19231f626404329268f440398ac131190cb74e
-4cecd5be8cdb1a01bc980b993cd8b3ea77eca9642da8e185a363e7df2441b2b8
-d991a14e5a5fea3014aa375197fdbc0b1472b321d5b0d8a543cd958ac036208d
-6b33858d4f5a454fda0443a5976a1008da84749552fed657df42290ea9e0bf14
-49b2f609c3b69b8b2618a73e5839fa69cdac52a68932ffd4b9eac9a96aefd44f
-d7475a9cdcaf91cbf86e81758426068aad6dccbe6e874248d86bf55aca000641
-4e21877854e95f7b76b3994424bd597f3fbfe58461dc5eb0c03df892baaf83b7
-e5b743b0fec309198e019cb64047d127e47ecda08a6398a46621ee521d05ce94
-be413888a3ffbf5039563b15d39659a57a9044e6caac763d25aefa6ae3315fe2
-a2ee1f6fa44554bddd7150b8d852515988753ea49ead18885ae5d2c876335be4
-c4e022ab6fd7ccf70ebd8afb12c741f8a6b559aca8b7c8c71f2c7c2b046f5922
-4d15b2a85fb38fb2c15623bd669b4da58c1862a69e3d01dd5098887472bddb34
-8f37053c8a9022d23cceb6106487e1d9b3128ac1dc75cff1cbbeb778ecded89d
-47e4e96d97b8df40e2b1b21fc062a353ccda5e734d9ed9b1800a27f3f100764c
-5f568fa7668cbd8c9cec6ad262c36cac701239b6f462ac4936ba7593ce53e49b
-ff228411d4f133a019c029ccb7b973c8ed2239e18c207bfbf148019d088d2dee
-c58a1c243f368d42a7123f976cdd4bb47a754e112a27939bbae57c1335f365f3
-20d1e89079e71d3b8f7c2a4a4cda6961489a6f884d75d7493296e2dda3ee5bda
-4ec01a82354be5ca793904fa722bf37d85e7fec21b4e98c225fd66e819ff11df
-368257087feb4355932627f3f6b9c288afd80ce4533967f42b89da53d2df67f5
-77a03ad16d54cafcbb249565325b7609e419bce2f136756adb46f2bb37010fa4
-211f58e74d0931c6ce66474089df52b9401ea0e26c19714dbfec4f138d6a0acc
-f4cab67c1aac582a768819f6eb7f1591bb471640e8a262d8d6be3f935229a8fd
-e0c762f89935c88b847d7e7e6b15b2956ac4bc9095edf740c615c9018579fb81
-064a1d68f6982c0cbb0a33cf9a8bfc6e094c3f87bde2ac70fe526cbc63672520
-e6b35070550449599914f3be35eaa1e326bb251d9c9ef42a9244ca8ee79fab1a
-dae983f83af2a712f9bf9a2ef74b288a23ca7e958ce8c24ba0c4ad0683306da9
-51071e3ee96c25cd8123e87ecb93cf760360ca98727a7ca23f1273ef4a26eb14
-8e00c231bf56a66f74feafe07322ee921c5de6979821441201c46d7e6cfcbc31
-3edaabe7adaaef5f7f2d7d297de18b504ccb3c0b0d77f03bc9fe79394441267e
-5418523ae7f91bfd7389d20f77115a4a9129c33531cfd99a2ca3f7d3f39635cd
-0ec256f7bb65b980a9353e9692bc936d8ab18bea370933ff01e8eac03bc98f76
-87e754593e3e06bee184bec18b126f7bf3fd083f87cdfc2c1074ed007432a6d7
-97182114ab1c8e763f8f37c705584da16b4bee27a6b9b24746df9e9b71729bda
-630abb697f3348adac537b97ae350f64c8c8b05c82a49f8bdf4a2843c33be4f1
-3a201c7ca5b41823923c9d510ad2741b171e8506b0b79d3f18c8c363f3f04384
-1940e1be692b06b13774d4405ac2ff62876fdbf10d1a87456293c7f4cbbf8a7d
-8a0c5ad8da6698efd998f58929c2919d2f8b4c52a904b618a61d4a3936ceeecc
-fd97cecd156c2a5979b7321cc4f1b8cb84b00bfd6eb32e12febc812f0115b57e
-b60b4cb41d6c109d9d4c4684cc2e46f7a8012aeaa0d7effccf5057cd4efffb16
-79f3b1e8bcab177a67427e3643105ddd8a6d292681cc9114c008febdc659ee93
-70aa08e8bafd8607a45721df8f66d072ba67b863797c96053df935e1950a7ccb
-e9f22ee34e2e3607f1cf4bba18eb34480ee49898f7dfe120a3523646c7693b6e
-809eeb360ff12283e6c67f84517cc4794c580810df85b855e394d7f1a35c8905
-d61252c16ed95e1b8b64062d122ea621777678d13d7924cd71666c191599921d
-f18bbf96addce54db9ee2dd1d4083eb31593b706542e8cfd5438668747dd9234
-afee940b0c9ea6cf1470a700aaff7c1ef56751ba9b10fc5772dfa61f471890c6
-911d9b68bca77b2fc6021d86d68b032f1ba6774830f123e21b4656380efe06e7
-0a6755d5b599dd09e4b1e45c1dd74f7523f447c5fb468a871db7fd074305fde5
-ec49a348a02da990b1fc5cb991a715fa79f49b4d32f601f102618731d98a10b3
-05625db0c0e0eeb02a4fb69a39e4b716993caf7222e329d83cb7e60ea78ced15
-844f3079f7821a44c27c237873b9729c0d690c31e52f3b93349522c6a1da789c
-75cc0d1059a2d1339a463acb7da3399414b623751485e9ccb0523a5d0d42ddf2
-e89dfcae5e6a7b743f7e247d171deed57bd133eee43dcf5c95eeffe36b3440fa
-2276ec0e4f99715067736ff688c881396724214099c6e2f821721ebdfc68f16f
-936a7ca1cc3745ee9b127fca1d9a338cb602b03655e8de2111ea1371808381dd
-3190a5ab16fa563e4a71d2499e095eec2749e67e532583d7bb28c595bc45c665
-f14d206480ac3d562c7db8f3314cf070eb696fc952dd964704f7705c58351736
-2364b2b1017c71623027fa35e90a24d7f5172b16fe9a88bf97e05576e582edb0
-8893b5e2465c61ca3157432a1ffee7512e94e63060b4a5c43d8205da43c6f75c
-065dbdbfefcadf13177c2b77011e121c1f5d19b6bf1fa1de2a141c4b6210ec1f
-05dc8f30bb9feb6d9c22d6aef88aef4ce2c3c9563f0b0eb391cfe00df55e2e68
-1ea1707b2f0371d7095f718ae3bca6c483598937251cc43209701e55a0fec0ca
-2a84abe42e58b16b19a8cc1875463649b037bd08e0f3af1dd70348450784e46e
-23aed8305e833a81740513e494ec2f1083038404b3a79b679e530d8e1cc833f8
-4fd29391aea36d2b37d2ffeea00e90d50d52fa2d9cbe5224bd19a4bfebfd6d36
-04c250544cc529026dd473b7e906cac0bfd8b106953e4801768dd2f21a12b674
-3dc8e9ea6e662ef88cf8bce0e34f7a88d2401a80ce26d44b0897339dac523c85
-3953cb6a3794963e5cdf296b979a20fb69a20884894c05e38da4d3097da18417
-8185f72ca9e34e0b842662d9f51c59c0d61579414e44f294be31831e7f806b48
-a9c60ccd6ee051d4d29e406c6092f867ea3563fdcdbde1925fecc354ce0ec01e
-281d1b4360f3ebdbcdafd217081557869c8618ce923ded375425b9ce0a1f4a33
-eaee378ad6a1177df9432a2f140d5131bf576271a0db8d1e74ebdb78cde4c193
-a7f2fd5e1783013db6401acb51b108f4a71b16c9cf57ef903998163e5201a02a
-137992528337a595d9c17828074609b7380f9ea731edb55d4f31c542b522b6c6
-ea2e25c8c562d392317318150d4869c0417be8f5ee48600dee3bad8076d86109
-8a2a3b62bd512b4bcd48916497dbb3c90935321ffc39b457220cc32348a2d2a8
-02547d1f4b4d4bafa402b8a7a7afafbfbd3207b046a576e3f039643b325d8474
-1d1d156f026f664f2cad54fc268f41fb9ded61b9ab9dcda646b42c9070f40635
-a46dfe209b72eadd40049867e8b15bb0a927b1c51c31ea74ca99c4b06322dbc7
-1da693dde3e686c7494d7b49701e8f2b8cd754c30476cf9bd5e0d5af5c6d99a4
-bd87f1b73c25858ede3d1d82710e3bce544fc397a91cda4604e5db7ad2d6460a
-31bb35c9ba6df033a70ec0c6f601873d4c6a3d14ea9fc616786920f468c2cd0e
-ec9d63e8d085d0be593d8344d989bcaecd6f770f7763e0f8f8938a1a26afda38
-a79a1a0780ca251ab2d9b11e33e394e4ab7bb1f459e9695ad88ad71331277094
-5d3d6bbf673d418761ac787ef5159f9fed9103b28f0d5d86c4aaf4ee462228aa
-24bd59026dba7831062dfbc34276c5bde5eed1f7091a216d155ea9f4d9e1e4fc
-850ef02f31cf85eb5c9eb8d4f5c55ff4147242cce03827a0c60abf2a727981b9
-9891e361364bbe822a4a5a88f52328ab182a459e5856ef9edf6c835111e2b91a
-04d83ea913210e40015d3be601c0b43e2e677d5c9cda5a3d2c405b67095f3fdc
-f973bdbb333d13693924369c36f5ae1117bc90d9624016b22a3d6f23a80577b7
-5562f3d48655db8a537bf3409b92d2bd3b02b1aea544636a6b2856d0a1a8debc
-43bcf2023a54a3cd885fd9ee3fda7f3435a911c9103f101a39b5a3b5166eaa66
-6a348648ccdc9116fd0167dfa044e6f3f73539fa3444faea7a34b37e49c34ccb
-3851f03148c78ce454712f42044b159167701fddd5b664196666bfcbcb7b0b26
-1fdd85134d0a46fe319cf381a545b577d523894b7492f632c944848ea6901adf
-9deff2feacd94bc30f6db00a591cefe205390e32974b78f82a6ffa0c1e746ed0
-430f333fb242cc438e0e107faa0ca1a4073224fbdb3af21f6926b6c327f14bb3
-680282dd37e809b2180b112a1d686ed5beadcb5a230b890a30ba2832c1d08aa5
-9a6e9321c362edd0042c1483bdba5ff764a474e6254c16904f76642009c316a1
-41e3c824949a766c5e7067f9eb168a2f152bed22acc112bfdb3162a697698f8d
-7eebdf52bcbb14ff206de000beb437783d141f93daf468b1a6a62ca6422e0d3f
-c51fe03209132e719c3a7dc6a1aa36aade44c9f9b867afa34f3c26129cb619b5
-01ba4224c7ff90ef8b69650045c57d58d37ab9268abe8bb62459917aad27d939
-69e9c089cc4f417a679bdd99de84a400fcd4e388f4f156fefb6466039fbe72bb
-3d05549bcb90a7ec0c2c3565801b3a7a437615337c8dca761d83a7644b04d4da
-e67e00edbf2b3139c40dc3d470f8d476728119e9ab31d46b3ff3d6e34bbf6532
-62ecd23a9ecb93ac3d2498f63193ef72d192f98b05aa779b5015b6cad18fd29b
-421a17e01cb394d588e37ab7f986e20e204a0f5fe06224f53accc121f112d58a
-79f25c60a550a1b325bf33f568d69ca9a4cfb249096b8efe3b43cd703db80fa2
-0bfdfd3e01433f2f69913d13c1d14031545db4877ac7fe4f562322dbd2572cf9
-94b7eb300f26c3b53e75b02b5889cb0420f378a55c9a9b6bba64ce698ceef061
-349f8eee5b3a486870c6a11e9e3ff3fa00e3480610a449c9ea48bee511dda6cd
-9ea3e4653dbefb8224bc55a02f77bf16e7b9879bd9ac48788e2fb2e237dba707
-fa90cdb918e02cb6c3e49925b60e2a05a71546d49d1bb161ea5ce6d303fc1876
-dc17e24f47344fdf6029f63d8fe1cc789a7753e492f5421c8b7ec7b777ec3497
-4575b63e74fc255ec95f3a1e93c4d752b42fbc1b1b7dc52b3bd4e33102046fc1
-e16b7ee6fd0411727965c75de86e547608807e51cdc1e51b76b8f9ae0484488a
-7d21cf0f3b7ee73f691fa048309c990db12036ec5c299a4eae7411759dfc574a
-c321c443af71421b7ec71550348ea60512975b17d6ad6a22463aabdd94befd38
-88ccf264e94a723bad53e4ee0a32245aea16837b570ba36eb70a0414695eed42
-e02948c308e22fcc6d2e1bf714ca662f615aa7cf0b71941fe08fd416db23e1a2
-307575f66fb214814bdf38383587cb14f5096241a544edd522f12bfb4864f0bd
-989068be6e80b36c06d4a3609f45a3f249353225d7b0360c438ff0e862a2f29f
-77842f954c289477f1654aa13250611733e6c7c531ac69fcedbf29c1e6de2d5c
-edebb77f51a6ea25a3fea286986232a2410240b9b7f31ba31a59c40a5882f794
-832097dc9cb0e806db71677341efd5244c8c23a520c8267213204ff5f13e4bd9
-ce3e44c9387c17161ecc5d9c9f40b8dc4e6a16d93f833f07277e976ffb09be89
-d1fe74c1c6e1cf5e21724f8b83e70fd0d4ae72eb2bcd30eacb81710ac3a308f7
-e138c921577a06c8ec7293ac443fad6fd7a6a1873c09011b29e0469e411358e7
-f5d274a072ab9f84f3c5c74c7dd8121084019d89479d44bf25b47c248d4859e9
-c46d6f0acc65a9e1403ae66e84ef3141d688fcf71290cfc65eadab3f43474c2c
-c8ae995be0f19d7c0f8a3e2d3e40e2ecdba5efdd8f07981db3fdc34b3d014039
-3d2cb0bfb72e821d01bb22f461cd8f0ca7254cb8937f9f228f1b356c0eb3f522
-8a9337aa9e0b24d3bcdf37b2e2255a8df12b1b343f8df33908e6bed58d5ff638
-584c0c4bfe04e43a4237cefa6cdfaee5507428543ff220a987e68c769d0440a9
-d4a33739e9072bcdd885c601dd30771d731a7c57713bd4b8ccc0c3c188edd8ac
-1145ceaee80b1bd2ca85d582f05799bccd97b8547cccd71d10892b1409f2d672
-dabd6f0be7864de89fc66f758f120ca8a7983688e0b05283b5371ef01f2a68b2
-68d9fb855d7d7238b971371a8ab5f9d80e151c132a377d48704342146f9744ec
-d7ab4453d258a8719b8455ebe73d35a9f70dab2fdd5d41d2fae8cf56146215ba
-3fba4abf8f98765c6ed70b6ca8ab6e28c61611741eceb33e6c2958db40202f25
-8d78853a789ff3ec7afc19e5348d8422f6a28d65f2566d046d7b74973685473e
-5cc0ebeba1c944630042e7296d81ac8caa96238bbc09f3067a7d3bbc45b27431
-1abb8e4c580de95be79dd7cda3903094a88fde6a8cfe77633e0481b2e67ca61e
-2dcf7872318e63a4134c0f98a472813d4fcf98dffd30736ecbb4facb9c6fd915
-2461f90b736211e0ab68d5cb662be0b511a1e60132f7969dda9b229091286f87
-ec576661a94f818b99dd27ff65a4c2a3c500ff9cdb4b7df109db016ecb5a239a
-4cbef1d443c48703f62905ea599b82f76be0fcb01263eef1ef411c72875dd0a7
-a5157265ca3cad3d27f9f9c20577a552e59910187a9d04f4002e07e92d8f5929
-fff98442ffd6d3f8eed65f2c2be666aa6220ec4e18ffe0d2f3daa680d4f27044
-0c3ec7971da783bf7928f77cd7dd11ab8528a390318fc0572f13a5a2b20e5ebb
-1daa9df821c0cf3a34258dc56f872175f1d5d8bdf14478a19b53e278cb4fe83c
-527bf56a42eacdf193c6ee25337cc2215016a7014f1532df6711d9b637a3d500
-3849a0881c778c74e8e5a47204bae5374afcd1bb8e901bf2a703c5cda6df6915
-c9a93eb94d553d50d3f178eab2f8d6338416539f225964b688bb649f4f148737
-410ff38f25e56ecf583f62f09985f94ec048b8b460de00e58f4f238570b689a7
-ab307b7113814d5f3ff6cf280262acdf7b46aafbc234ec32a931399bab9f2ab8
-b6c05b23fa2152c10888ea6d4e44b44e65721ca646ecae52a79a532565371f14
-1940d81923ad84adc5c6a9f2d1d1efce1e53b5907122edf3df1b69e2d9a87acb
-303667cebf95dac21b053fbd39511df938b33032db098fa64fc7bc6407d11be9
-8402713b6bbd9027ba62baa364ea172aba41d3cdb8c6ffafc5468f51644b1576
-84bb51f49fb04a8a56a6cdff871b78b413d8b7bc595bc8e81e453c36087db7c0
-92ccee99d0d3f8ead6877edc5e28210a35dcf3cd49c594171e2531da1536f451
-0e0d51ef1760ec7b1fe195bcb5785c3f26d3c3cac4989c66f6f75a675ed97990
-5621f8b814be502c4c8a940bb6d825e27ca6633eecdc0f1bf725448950a37bef
-6abbe0bcd5620ef0a66a736b7eddfaffdf62796577a1f482ec4bdab07024afe3
-18e92459fd61a4277b5e885c50a825e94ec3e8aaf4292ae4bc9499a00ff14c6d
-4f742615f0f63a62f273218da051f35a1a429e1b79be5926c10c5a2ac38ea8a8
-6b055407faf2cd0fd6a6b16f847d9ec7e911e436d1d597e012cec5a08d98056d
-63ff4d16365a9033251e8dba1ee34f7359fb1115ee681f78a0d9840fd88cde7e
-e4791044bc3618b646af915e316d64bfbeac1f6c50cdbed248261813749e1c0c
-f998383bc6454d6b384ad69f9a8833860df4d66f750fd45e36f9aa1da976e55b
-0b06477f3bafe5feca828fde3a373dae7c2c029f2b2c4992d71ae4fc1804301b
-35ca5e73dd0a354b53d1c74531a4c860ca8946c9c05c93483c0f315caa8d791a
-afa03fcae03ee7f6378c9ae14cdaf68f002c3f306682777ffc83abccf992c787
-425f604253359ccc2d30361ced2137d2f825eab125a9f4411453292afa0a5228
-e5b6b4b6cdded786c3623f8d02bae3733a72bc1d1c5d8e6ad59a371a1769512e
-c26ebbb115291652182bc46ab673d016ec0f25487607fc04adfc072cd084e66a
-2d4ef87343c42a4d94cb9bef449af70bac826c0688e26fb2978bc71dcd25fae8
-c3e2d96e8812f882fbe9e0962e1bca90ce38a0da87c42579b1cc21c117ae7533
-1016b8827a466609f215fd6b6b4217beca5e741118e7f77600e1ec593fb3ce2f
-cd61c7083a4c5c9b4dc9babc7e573710341d678c527068533bd6d38d9d9c17c6
-51ab8db46418ab6a794d330c7d0c2c5f4d8e6e198b47ad4410fe1e3dbf9ce038
-0d82be729e3cbe262d2bb7f05f269022fcf6c89b204288de95aeb246bdecb355
-341eb2e622215e967abe6b6814e4f76f6dbe972688d7c2ceedbe858b96742122
-8cf1718747cc0b5ace901b98f4a99d7fbc8e5c675d78f0e822fea12e8100b88d
-5f8d86c5e048d4d33942bfe125d27f2a4cf26ade4b16d4986ce4e8464f7fd90a
-20a162991146ec48522d334120d140e31bc5dbc0c038f3ecb63ff9a2ed0efc3d
-a2d7c96b19d6ed49cc04a54f33d365737297ba328e3d646cd0390ec55747bba5
-248d44e594fa8389c72aa738a99dc4dde351d381d010a0f5fe48aade17f62958
-773d1d8500819db54d5f7a21a507f767f2ca63c5ac7c08fdf71e65aea255b971
-f5c2d65dd53d9f62d85be99c8ee05bd698cc7abb7e596ff0d11c51d0534dbb49
-2b219763fc99ba557da54c10bef24935e45364d8cb1ca2471bacacd1d67a77ac
-ea885796af2cad89cc2075f3b8bed21f9b56d11d21561e5752289352227e944a
-76f5fd44513b79a03f3639bbf8d2c7f4b8fef335a20482b0a3b401923458a4f9
-63f1e52f94ead00d13a5f0fbeaab7826cc8408635b28378899a05e4e390490f8
-d92a93eb8a105a4116a86611ac89f27d946e52ce39eaf255fce513d2b2042e66
-618cc2bc91e8c0128e8315624acb66f2d48cfe637bbf27cee5d0fbaa4b9f99a0
-ebb9f9d8093c08bd4e067abed9308ae286ecc5b0cedd695bb863da43eef448ad
-6ab3c9278955e9c1be2a059ba2524352a720c49e5db9eb8d06a09af38b957f78
-c686bfef9f881d906e5caa32e496939359397693aed22c868b2a0872ffd968f9
-53b7c508ae04f706876bc1e165c26abf7ad0cdbb6a0176df1564d7f7cff2359b
-cc151a058c48d429db6bd161b8410082d3ac53331c4b57a527d18847ef744ab8
-af983f3d22e35b8724dc460d0484f6e7470316dc9554906769faf9e1e070ea2c
-816a9c681e3e00be2a1ab9cbddc6a43a96aca4f4e7359c1535e1e88e4f360569
-13d587efe19e00d48137804dcf153719e8b7b80ff47c0c007d80a1c6a1327d17
-bdf5d8c0c72626ac7e5f569e12ef87a2e142ee2261634e8210f72d92f64e34a2
-c15f7f588e78865b3d6a62b0c3f5a3be15c0754e400d62e7e2618ec5a93417b9
-1a079de49906243fde354491603335b4bf6daa0798b51ca307e41f41baf0bf79
-490f892cf47f2fc51560023dd15049526e134d67f48181f3751305c34ee200db
-772cc0dd679264b45a99f5d30c7e893faeb3906d243a037e9baeea613596f222
-172033b01edd18c94df6641f049102ced150c535c70d1c4c66805c5626b52bf0
-9a97e5b539778a096b79166a592e0d5bb8950f7d28ff143f99495cc7c0778405
-fc7fdd349cf53686572f89219faddd5de8f3ddfd828f333edc15f3614f326975
-c9fe749a6a2730670919b4276eaf9b482ca96a0ca64af391696a78a377fd1010
-74a90f73d9895c89d4008683f0759813a61714269f67b10c082843a92fa97b55
-d2f9a40b8e4156f3aebc7fcba0773e00e781b80b07004e5b20f8c9fe14e7df67
-12a64ba22cb262799c84746e45f3f41c4776314c3f4a0b9d7eb83feffbeef166
-0d4590a43a9373c08942f46daaae287a420749f7046742e7b6e15ab3a04d2b97
-2ae73510f57de8d24e555c438d0953e1c41db9d6f6c12d2ae784af55f696efa0
-24b5aaf5b3e20cd6aeabb356f33b6b93ba8cdf2537f4570332c0dd0fce1cf8e2
-ff3cc038ff272b1df339cafe3659ac4541f2204e934a555ad9f1e9ba83148113
-8a8947bc49b9062e71c202631cd8c856e87cf08278f9fd047325dc4be74ede82
-42f483fed616aae2d6a5dad1e1e83f124dec374d57b81da43a0983daa34af7ec
-ddec60dbed7ecac68409956a0eaecc110145ceb8d99bda1a766c2ade43326b29
-cd6bfa4416d9e0f2153f4f9a969b033087e152ad9bb85a40479fbac509196c99
-a4f0841449eca6dcac1b9f9d7b26fdd6f7fbcb3cdd32b75091c5f96b3bf114f9
-610343ed284f5658752aac710270945c0a41bc3ddf3bb0b21448311e9331cd27
-06364e3090a1265a17b1b424d03b1e950c824645e11ab766503b0ce70415d410
-afaa5b33eba7b498d80302fe982d9778e4845f3659254ea382964e395d4d0341
-a9feeda8f963739e10ccc58baef8dd49a1361a0cf95083559ba32a8e5426c981
-42ec2e925e4b382d5a531912627eb2a0d98a25fcd540cd5fc6df156d4a5eb1e4
-14dd84c16fb9c6945e7920179130036b5f05f6e283ed715306cea7ecea13e281
-fd69e9a93b2bdac310088ca3153323138d52bb2db9d272b6ff67eb59f3db66f0
-8d1f6ce77c4519977721aa8f532006be856b00b33369fba6b980c420e34ad5b7
-810122ec90aad038dacd3db88ce061e05d12ffe44066c1671738aa913836edc9
-3ab7e596024fb3498a29e5bb543a67ed3e14b9eb13dba247325e70cb0e1fdc5e
-b3784da0415cff2b1a089779fab42debd53920ae48556e4f906f92abdcb35cf8
-d53e938b1ad434904aaaccc9463d608bd4dddcbb781f44b864e1703813fae91c
-c0b148445b88e4749cb9f52e8a6b8f598d754be58c22aa33d00597d22502a71d
-c207d7ebc4efab16f0a9c3bcf6f888698b443779236c33358ac4fc59c2f5ecab
-3ed32277fd98ba68be767aacc6abaddc7755b15c62b458a66086dfb464f6c7cd
-adad1017b7f4f14d98ef09f0c709ab6c529d19afbbac325ccd80d57ddc19ac69
-57f50212f6500e4adddb800bff909d6117961e6a1bd8580fae0e33103618d4d0
-ed7af5d04ebc3388821c121ba2067e10816fd1dc7a75dfc98106c6e9105f01b5
-99e845e0236258628b904df5441abd12772594645537c75b20460c48b5f21fd0
-2f73460068ec2574fe6829d86d6958a91a588ff609f3c9bcc2bfd3d2220e4550
-3d0e5a0fc0a837f73351be9752a659fee027ebcb926f5ede378f0bd10cc567da
-8a829b235b48eb7735919563136fa1a79f99591d431c768b5867a8d2e69e05ad
-4f5ff1e34e6971eb4413328c45f3267cfff49e498c870cdb50680ab42bcbc34f
-c836c1efcc10e50a43b648c88a7cc7d703389dae2b835cbd5510e1b26d4d436e
-5f5ff8f7527c1519bcdc7bd5fe20a390f484db9ed9b91ae7c4f03dfb68b1f204
-5118f5e814af4ae832444f60827aab48a9dd05ecd39dfc943775463889604a74
-58c324cd27782d8bf4b3017821759d70a344eb605bba453527aa7de48be86d71
-c3477d99f41360c647d103666648a5ca008af3e1d5cfa3b40ac10dd1e79b302b
-eff96c18bf92a086103a9aaa81e55d1af9fc36931952a736bdf7dc57354afcd6
-a964933bdb66423ea58edbf68618cd5ae35ec562f343c5915df0551e54888e29
-5c86cf31506cd44e8b3224db4aa472bd23bf94e1384078713baf280093460a52
-fd49cec5c2c29d91bf98064e53137575260c5867e73dd117e814a1b2aff8c497
-406a5dc5ded79cbe50fd30846c34d7841a850bd3fe132bebd9852d9b2f1d7726
-559e1cdd292bdac58eed6ae15d3f17b4ad0cdde87b584b190675d27b5fe5d0d4
-71f3040390f6d65937c6d83dc34ada9dcb8b2b401cb1e5396505d0af8c33f113
-518912b0b959f3c2e8d208e1ff28951f403400ad78ac0e4e1456fe9af63303da
-adb9fbc8e99ed0a02d960e54c39b3c27e58198d01e358b2336a4be0eb99ec566
-73d45d79e6706c7304c6982d64c00432335da50233fdd28d4dd03851cb8aee4f
-523bc43b61f26affdac9bbd7305d389f508b35072c30be43147727dad9199881
-c7044b0abecc5c64d7d3f13aad67177d34237ab9f8cd77893758e13619efbb0b
-67315237f63312eab8e1ee1e5a594ed963326bd2c6d54c50b8ee10538b4fec25
-16d138109d2d48849e015934d7e32a192ce4abe5156402c3ee8a3a5d502ce829
-d40b9c801b78c024fae15b5fb88c7ac33028235330da644482c0a22ad5444ed1
-0f69b227de49da59eac7aefcb4ee7dc0b5d1d1aeb6394ae1e0d9e130c1b1cafc
-10787eb5aeebc4e7235e6f5b1a991ee9a4cf0c0439025eafb59959c32604a640
-e9007f46f9136026d058b594b796e6747ac3cb6b14eb61a1d03dcf87f05f4edf
-e1c6c0dbf6c0618f2ba9d1a690cc811c28033815c699441ac4055e7cdd9d2b91
-b631f7c3ef32648d2ca927186872cf2fa646630d4eca09162ae9fbb00d1ce3c6
-585e4cdaa971d4b7d4ae0d5f8db5da74ad58fcc9e3378e7b2d4ca0036fb50611
-c98fcd020027cbe5faf311ac7a05af6039843af9fc3b830e0a2cea945eea5396
-a5dc74a465a0b6560b6663ac69e867925fb1a69cb553aef3dbc53d8a631e87b0
-0d48619e77de39aaed7dcb68a7a4108ce2225010964fc08660d54d73064d7cc9
-c7c6a2d12d7f5898280324a90128e4d0730ff35e7b93bbd350669297a6214df5
-6a775a5b7e73be6a972896e05d423f9e9798622b632d215812e911a93bdb0ad1
-3c5f628c4ac5704cddf78d3272fb1225bd4e12713557a403da937ea52d193726
-dc8178766f4e739d2e95f14939270b6507f35d83e1fad6c821ea1dcb5eb2a3cd
-be3870ece243b7f406cd6b5cb1caddb1b98c32ecdaabe8672dabb042cdecc286
-9e895eb6fe13df2abd25e66acdf07d402998dc54815386a3956cf36458234147
-c90a39e7101e4bf2186153c63ce96f3f34499ae1e1c234a3357ca2ce163106d7
-94083eb36aaa93e85e1676cd94259e173fb6ac65d133b16bd1314b259315c462
-56f294e37c763c5f16af239738efcedc3a6bdf8dd79b34775709ba54296899fb
-e9a316485274ed8363da0329ad0f41c62cdf48d7a25ed45ac95b5e6a4e1bbac5
-6da304edcf14c008e3f0d306c7f845b87ba80db258ba7881695209352f41d78d
-316017371a32fcd84bf788b511afe571f71e217c0dce3e04ab749d4596d0d340
-87540d4730c013796215caa073a1b99733cb7121a44e22e4fc2b1c052798acae
-0f086dba8eae791662949a26eb35613cba94ac58e47f4b7b953ef9913dd2c535
-37da9c1cce1474632288903c95bf7bab47f056b62d11401abc85b20b66d0ce72
-545566f9bf44f5cfa099b66ca02a728afb9877021ddf05c1245849dc6b6816ea
-b3cce3e604f604cc7cad40b2c919df5c92b356e0b81f6738a8dd7469a1015a4d
-6c5c6decb0c3eae39b7b3fcfd482d53ce5c171c73e23aa44ad41c062e8c7857d
-e8b56561cdcad550c6453c755e3e081273763f4e68233213a4059f6363f55741
-973356725ead4dc6398d1d6409ca8d49cc901f6e9958974a7ee5c02f9c426f11
-f29b54c316daa3f1d66e0c9ef73624aa70d23c0f15448cd295589bc2915a6a6d
-616d77134382687be88b7c1b9c63c0e695de5487a5a5162411b8218b1174f035
-216716b67f01661902287ae5b384b916d2c1682e2a0664600ce5e494f13ee820
-4b267bf8e863072bc11bb5e4506167ede7aba31f58e468d3f60cf5bd5a2a8721
-018ff213e5c84f672f6f2e651c4708a4f24c0302dcce4614233ac6f540ead177
-7a1155534ea0b6acf7dfebc0c6dc49fc9692951f587cb8c1cf3293328df7655a
-d82a144d193cf8b9a274d27c22dde2358ddaf79400a7977a1917fa10f445eaa6
-260ea56720e322abeeb790731031a345c323b9e2e220e9e9fd0d121475c6a7f2
-464252ed44f00d02181f1a5814d682f28c692f969db1d834227cd4b539539ffa
-46be32ad1ca3c9b4b337c64d3e61fa5a6d7dc29345a44d0470e564ad61cece8b
-37595d7eb3c0933457be8f73758d8d6f38b3e843c8d049103f5193b0e855d5c2
-df1092085c80154c50fa825254dc1b8a895e0bf3f681c2575bbb2b49e64a3c3e
-77794024051769ca5903cbb11fd3333656c4eb07d1d366d656467df392bdb9b9
-373e38deb2d83a9eddcb2699116e15b9d0da679aae82655eb917986e768788c6
-279d5559bb5b104b829164cce27896027913105aedc252cd0bc68032feb026c4
-1792df669bdb1d4bd94aea620cfef970e8756b258fa82a9eb86af25b6de4e5e4
-8b0bab5d552326d8c0e6c57783935d7f0cd66c078722682bde80af3645d4a9a7
-ef9aab474929c1749186c309347db0a5020865337542550397b2020dc666b333
-9ba495f358ab8d0adafcc5a3cf7014ac94b635e2ba1779bd0c44aac60cf3fa4f
-ecafdc876bbb528cafaf4f577266ed00509dfdc52aef8ece25912c04b8283f6d
-a8cbf712d5df4bed83702a76ab73d0adc789924a600c1b00761b986bd668b6db
-3de4008316053ec633300ee2e3ef9d0ccd3e2e5ed6a829ca814c8d127dc6f618
-d6165639c5ceadc8ff161f081a019def0f888ec6ccf12b69502a4ac2e802546e
-52600c91d51e70bd891c5ba957ed3951d84aa76f6d2a1a7198965409f1ee699c
-08694d9852f4a97839956d8060dd6004b0df827d6daf19325ffacf8773f5a14d
-b92eeb033282a681b443b54f242016dac22ca7388fb8d00dead2af7f39fd58b6
-f109bcbf96c58e46982148c86ca3bdbf8b61e8164b08f992744c67c636164fd6
-2d68c25016e9c672edbd444e058d3cd9154ae39993f1d5f319d58991f9bcb03b
-34910a12bbb597c3f871244561495f5d94b92f3c6b5e1ea0254c7f989e033eb0
-de0beae9676efb0d75ca0ec0fd07757bae8caff29bf2e1c0098e6d0843a2bfa3
-1031b383ebf4d12c07f1e3caee0397f7528ce5eb04c595358875d2872f19cd45
-7b41ac5dafcaecf120b2b11c0f3e927366e7a73bb033845eddabc9c62e373117
-de6a7e7d6895b6e6972d6c36634d46d55e0070e82f96ec375ffebce8a4e09818
-11328206eb0f4b66e0a8087d0145c1d10c49710c3fce4a5239df90d0ac21a0b1
-04d2505f7b5243dc96d4912c9dee3be9dcbfd9f7c2a9c8886dee4c41c58e9ad4
-71836d2e48f5ea7b0fb04ff6d2ba7b8e78ae70c765b11939aab939ec9b9a025c
-f27923c7bd0455bb858ac6f74baae573b066943598c3eeafc7f1bfa1b0e5fdad
-cc763c0badde7dd314d186b413216fc35ace73311dcf84d0faec0dfb9483eec8
-895fb678dd36d56618c3b125f7ff3b20f7bb8dbd86f52ebb08bad2a73ed6c940
-44706ff7ff263b0dae915e78cb36345989ccf84063ce6047e93a2acbaa983182
-db3ba114d80fecaabd2816ebefcaf0dc6eb42fb47b3d2318fd557cf96eb5201b
-b0b265bbb77da6922fbf9184afe896b88738ab3f9ec78e711e418275b101f8da
-be795d094d3b2c5f1c5e01da37b4e5976cdfb56fb459c8611ab2cc9081863e48
-eb4515035709f715f99fd62abc2e495cc8d4f8a1becb35d2126ffb08594ff4af
-bb82f793854d96a50ff37c24d198f533c348f657ec4726ffb648522893cc36df
-d25665df44ff0d6465ab46691fd9445cd3290cf2455618cc3a52d8056f179be5
-649a1b17bf25108f9b5b5a3eeeb22d970d968e25e20c5d4e503ece7bebbbe696
-465191dac3046b7dcd8c3824836bc6ace208dd60982451731e82aa0e85b2c6b0
-af9b9b14848146b09c64abbd9625f7a3bd7b5ee015c8f5edb3755b6356c37301
-18bd9f49bf060984259ae5d7fc6f3ba6f3ca2223e0782444bcbf911885a0dc77
-65d705146b91ebbe0cab032ca8336ce9133136ebe740d0a126f12f43b76fbd35
-4c09f5a66e3bd1c295a6034187e0ba7f916670b840f146d4681d43e9ce18387d
-70f44aee7ae7bfebcf588759213263a8a7c4c3fb7c31e890f285f502c5e88963
-964556caeac1f31b8975a9537e40c010380042359200b4a951a9effbaf6fcb28
-1fedcd940e10ceee8f3428f1e00eb8b1626ddc9c6554a8a7ef2e87319f3c532e
-afba30b322cc358c2ede14a5aff1ff1f835963929a3f396361b714f352133a81
-406515004549a91a192127406bb9f7a61536f16b6e2b51dfddcf0f31ea338259
-a0ba5126d1459dab06c8ea7d88816b2a750b4e4c6c45109cc8f0944f4a42371f
-383a585be96f72ad5884e8337582329971407ac1e6fa94d7faf980550004be9d
-a86af226e74b6b87ce02bc9949e3edddcfe0eaaedf502e649122829a4b5a0a96
-baf1aeecb528b092ba289cbe641e2775bd74434cd3915082c4a36a898d2a0347
-6a639cb3665b8621c9ca4b633e7b5e7fb699c39d2fa9583aaa000b1b3520661f
-398e43ff8ac75221bb92a5a19ba43def0c89b9ac73f936babf0c930cf3f22eae
-373a4c86e6356973490e17ce7163ae33583588d7b7d7e9d3ce84d68ef9c0b524
-8f14be69001dbf85b887e902b37813eaed85fd1b8610e2e964455bd3525f1e99
-c8bec17ae486775dcc124b4a3f2acbf05d6a73146ff4bd922a07022d09cbde83
-5c4dc2588db5720f6d73829b6fe92e592679efd487ec842be2a87a503d88d397
-36bef70dab7684f29558b85bc5ec75db196967063d4ea3942d18b6bb4842202e
-2ec18bff6a32a85a82f16342f1c8c2ad3e0cb12d4e61c7ac250f481725256c8c
-c7b29e35caabe5a130fe0c917b568453805ce48c7822f8323b7b6bde5450065e
-a4a1a6c2c11adc940d1dd15fbadab619b677fa1710eb86cf4d7d7b0c543bd182
-5cf7a30310c18c874c8040e10addd57de7c326253c2a9f550bce08565de02526
-e0f014a504529dec9086aa674b94c1e0786982849905fda956a2f85fe487163c
-c68a363c2d44a3300c0364d66824f31dd0f11ef7fa7553cc42fd8961baeecaa0
-edbd70d3f34363147328b558f8247baad15c994d33fa696af72ac2a0c8347179
-b041645dc46262a64d3983c46a3b460295b6afd8bb2de931bdb27a2e94f23553
-f1f87c2d47b88755575e09f50499d1cd6387c16c11399a6b4bac761e80b97370
-0d4d8e3d599119446c9de410e33aa6d5925e8c4947533bb2709b9b1d4d0b96e7
-4012b9cb27a8e1391ef72870058850227748afbbc55a03a79390b98aafc2869b
-fbc9ad0d171ab701befe311c559b3865fc0c1055b3e8e881a69fa630efc7a431
-75af2b55c9dee9bff2beae961861e45773e9e37735859983b9603008de8d569f
-a9a19016c9d9f101f64c345a4ed17113dc187584c1ac1cb7577927847793c8f7
-0c544d329a753aaf47aaeb5e6550777080224c57fa44a44ce4b16f7ab6a3fe74
-368f6c2d0f8df4f3ce6b762e43645ab0996894b358861c4927c45fc1cfffb7a7
-52cf9ba3966f53f00a3b26a394bf92094d579552f79ef2531e375876e52a88dd
-8222317318357ffe48d43a58229a93e7d6113dd47043efb48c85714ac19da484
-08000c866b7675813786229a16e5789f73c1c16b876a790913dd2cfcf92f9c5c
-31a33eaad8f368d6531c06ce189e07e9f1cd61aaaa3f8291a61311481e5ebf9b
-a45feebff7bd242fe2f018aafb62a4188435c46fe68a7ab09aa8c16b2fca9892
-0b9a2d7148603cb336fbd6b08eaaddb6eeeaf325d25c50f726379d9de1618c36
-d2a1034a29fa981b94220d711e6ba5dcb5ce7ea16d7ea03cbeefba5dc585e5f8
-bc032ff17febb2879e61c079f9b90d0a0b6eb537480000352a63ed828370467a
-c526f861c5cfc6e53e9a83077509573239c1d5a349fd53638689132f831ba29d
-9963a7497c2bbe933fb653110aabad3629e31a7cb3d6d3875b45b7bb8f62d740
-5a6ecde413d365ed05e7de1d2c95d46783a8be9d1b61f24191a1119078283800
-deb44a0cd447d47581972001497fd5d9972541b6ba2ca719a8177feef3a19097
-20f082c42a5de8a071e16e1bc181e34ad5018131127fbbcda2a9ce8b9f5eb83c
-c59c96bf0562e6916be9d99779d8d5294a04aa19d8dc839caa42f48f770f60e9
-18c593242436bd1dceebcd354f77e462fc249037b0fff2ee093a799010800ea4
-8da10c23b02dc20f3c3682b32bce8d7073c13f20ac232a6a42a4a0b5e995b197
-1fdf05dbe37aacc0ef62364c466817274496cbc8686650d480054a10c8105ee4
-47e2347c5cca657dc944fecdec1616cfb16ba4442d08d7f6b8cc69b38fa05211
-3213e8ba2990bbe7e3836c167d2c8fb126fb7cfbbbb28d33058c595cc6a16d6f
-e84babe05ccb4bce0b62193e337e8da5320f29f752f03a92cd843a99bc7a1e8e
-b449b0c95dca19b9ed1861812c7ed1f2ac7294d227358a5da798d7dd314a601a
-3bbed33797c6d571e9cef4a29fc421d2b7db70a7e92ebf91ee50f0ecf2ff63c7
-38a713d1b6d1c542d5c6d95fa4e9fd16f4d219ca943317baab091d2021ebff72
-0a5a81cdcbf5f3bfa3a633d16f4560cd3cf9bc1df7ea6504a3e3b9377e9869e3
-e149ab6fea0f80287c4fb26cc5ca6927f5219a8379c58450b7525bf017d72f4c
-b5611169c7d001fb816109b334060b0f2913bdeaea69ff36286c8fee4bf2cc7c
-83505fc4b7dcb29ac97b3682c48525e038e5d1274a069858e5505dc932c5634e
-fd115e02d0343b75907fe80d7d8d421ce40ca292140e0c0f3d79161c618981cb
-ccc0f9c4545942dfa182bdd45dbc71b8ea1d79f1ef51fa88d64247d4d2d3fb02
-f4d908ffd1a763d1383f7f54606269c4a0a6c8c82a01f8a40951dd141e4833d9
-7142aaa9b0a7e1c28dc578faaf9926cefdafaf084d50573395633ee6097b2c8a
-e70a16f3191405adb7cda9ab344d0872482f6db9969cda14b7e70821b16b0393
-a0431332b925e11f44882286eead545c0854cd41be75391e2a537f12c1826bee
-fb1e13a9e40995e2c20c3e330c993fc40df42e4c8d9f09dbe4f5f4476bc6addd
-0377ff3cd6a5f1fd26b5c23744555720cd7902f34407fc6f57fb83cb095a8703
-c9d70c96c50fb522affda15ac3ed668a70be3e1038125f57edb83c4a8e520747
-370b6131f6446eed8f68177b4d3a06333544969d04bc2ef75b891b943a89e011
-e078d01940caa9e1d4010670dfb80b1847bcf9578a6b6bfad675b65b31f8b075
-08ae31e6d3a26680b9cf228bf61514496fc2c7a2cf0a635be96383466226faf7
-a8c3570b3c55a009aa091fa99f71f8a4e82833428ae5cf0c5a585da9dac86a3e
-faf1c6c31fc7fbe4395a58b193311f67bbe598f88ad884a5381f82498aa3a2f9
-448f50a604d9db2c1f88b47aa783a82d6d0d45b2334b4ff48c8dc810751fe68d
-b2f04324562caa35c19a80ff56911399f5abeb971b982745efbd7b10edce63b5
-e490925781673def91f3329107936028e85f1f633791181217e239a2d4dfca97
-171812d2614131d19115eaac6550184f973d439d723f2c6b80a5678efd9fe5fb
-2526505ae8968700b352599b1bd964ef8391b3380e90e8febad06e4545c01017
-14bb2784abd7bd7ed8fff02a028767a781a57e1ff6543e996da730610fd00026
-3ea263f3c46d9844f4ea67c39701fc39e54b9f7316af609b22171c743e7e2fd2
-aac70ffaf84692b1d25735e95e45699a5e15a86a7ce7bfb7c51468c09d239a51
-45802559023de368135b52f4f299a4a3272c3969de888202bc1e99d1990d2aa3
-96a0e2230c6d2494e02ad04e8697e61e0b9420cc90bc0fb687aa27f85929fbcc
-f6484d047c785284c777bc07f1c7f558fdc170fb0495d1fc65a50a33a06a061d
-718391e14deb33fd37e7d27e47b8f3c9dde4bfe43866450e86105746d10cdfb1
-1e1714a0b78158517aad1eaa5847b37208dff3bf319d87184b82a18ed20d07b0
-ec25a1d278bc3840614953c1219add7c21998a6be45126eb61d87bfd5d1aef28
-7ff4b2724025db64ab552c28f0cddd89a04beb667988cfd5adc8f7b1ee091086
-c2b31a30a9bf56b671c81fe10db4214fe93f3d80bc6b0e90410e123b17fa0d41
-e5cbd5355c41bb9579e1ec93177d3f6ae798df9f70f9dcc6b541d5f4b3c6bd69
-83cc692c4448f91a730bae1f278d700c45a5ac32c6d5bda96aea73c95ba417a5
-5ad76fbb2c2a47c9896efd54cb4f178fda187dffaf47c89d5541c6ec74bb505c
-38c34cfe95faafb26eb9d1bcfcda8fc0617da52939ed4dc5b7616691a7188585
-8de6b6cb6f6f742b4a61836d6ccf60775aa0c5ef3bbf7b007f4e2053b4cab7f2
-23c96418426367fc5a833fd2b1a388f3352c8b390ce596b9caa79b9d77ca2020
-41550303c76625b527b29f0446e1e18b93abd527d537d927b9eb1f403c306b9c
-c3003ce36eca033b7655eac10b1c2ac5fe0774574d3bb4718039e498dfb06e92
-2e3ca571282388bade3e55cbd711c20a93fe24bfb1ebe38f0cf7e1627cf8fd3c
-d0be08d8cb4ad52bdc53587bbdb53362d31e8b0cec96c7f0bada54a0bee96c1c
-40b1d8506913e7edc80983683481e8a3e7b049fd9549f422945ccd41b63953c0
-6702215dd8a1e466ff3e2e9b97f7a96df89d3078d5ad49af9480fc84bafd02d0
-6b61dd88963e9ac75b42dc9b255a1c20594ce1265ad4df4c485b3f73cc59a4ca
-767b5f026acb27a0c71bb2e92e1761744882dc892d4e53297921a27510f23873
-91bbc37710eb2589dd6ca1784043f4e5dc2f08a3e1b9dff5747f69b3a6bc2e14
-2257f3de54ef93c57001539dd6779fb97029e17b9ed9672ccdd7b0286a3339f4
-30b78bd1de5730f6c46faa5b7b4b6213c3bc8671839ba50da8ad0e47890ec3ba
-78d1bc128cfdbfd11d59d3292b277e65ff1bfb343f84becf9130107326e4043e
-514a01e05be59423c44cd4366268650173cf594316bd18f0081f10f72a665f6e
-0020b773a90493b5ddaca8adbfb488d5854d1591170347cb16eb4a426dbb7cac
-8576f074017d3d34d98c5d82e84d52071c910929e417412dc64d0f5ce06535fc
-94c62b61337c5b27f4ca50b4f516775ed8ccada4c3203917af8014d0e01f9f5c
-568fa7668c26ea9e085fbc736b2e7c607db5c0e983107283fcd701d025d4eb2e
-1efef45b9d2cf08827d53568598104724fd6f025c50c97d182218e939b92fbc9
-42fe6460ab63ce07f43189dd38745a93a9179dba460173bb3715b145b74680a9
-aaf104ab04b6b8c8f5803bc03458fbc3ac036bf4f48894248048f6a81dbd403f
-12c31ea4736d0dbca37d0f45a264af161accaa64e645d20fd10856b063f83b8d
-079863f4984840b937efacb021d47bc94b1cfb9dc183247d25397ce41fb861e0
-0c95fc77407d98932d08c42f2393c8b37ef6357fefd4d196c4bd6fbc414e18c4
-aaaf1e54feb3d81f6d5644eb5759ef5440207410464efabf54645132e798dc10
-b068258a3be66fdebf1c1d428d3381aea736336fec6e86b56f5a6143f74e8bdb
-62e0f9dc7b80323b3eabbec05d1bbd6676de2e2543cd37d6055e88074c4bebbe
-53ce30241b46f82f635a1833f41888af3771414bb943353ff865da76e25be7ec
-2bcea61a15f180552f98af07333fc03749598ae8f3d37916c33deb106a2c15f2
-1989350f1dc372c831fdd25d104e82f05b7a102256d9f8008e23942e3f9aabf8
-9d723bb624d0f60cf559cef6379e552911ba014f422801b50b15ab9fdf4b3311
-a2d79df0a820e262ee4140bef47ed964b1dc7fd55b81e00368fffbc63814e3c1
-46cf77833cce07d69c7f1dc7189171484ce5051817ae7bc7b980eae9a2b05022
-60b19176564e2d1ceb79cee1666ee85f29331554d11037c8a79a7d53948a300e
-b7344a824338cfe73480989a0318ff63a0428c8134a2c754e1f5394ec300bc62
-989d2c9fd52e76124ebbaa3576a735ea45a87d8442782a617e765ec3d3b48076
-a97a3127effd10e46accd9947728a362fb83f8718b98331f9b84df8c270f7efd
-f2758c8660c1c0f7c570d86fe15bdec1d91cf8c1a417c9386e09c548bb401ec4
-db99ef40ca62cfd7a0e09fe111c4c72674254b5ae6e778dea51ac7e298ed7072
-7d0b85c0fe154538a90c7ecb7e1bebcae32f2db9016a00a6e3bf5a103efdb3fe
-8b0212049f9d79f95ed645ad3d53658f1e0ad84237d3fef48579cd86a76bae26
-eedc5dfdc3ed94c434903a6aa1706dc18b91e782b0f31dbd64358d6ae7edb7e8
-39dc973ca173c564c92ff13e56dc206415198dea13dcf9cb8a67af542efac923
-369061a76351da95da7e2e95fe0e245ad0671dbda13efca30a654c37320b4d2e
-7cc9699c634d129622df340923b7eca09e7b5961bb33ecb62c85591365a70b93
-ceaed2c7cc0339799783c1047df648349d9c800bae1443589f423ea385798b3c
-7bcc72cebcfd2bf1731a488365e50280ed9603b4c51931f91920df1a96bf62c4
-8282e4046baeced383604f06e310d9cea008ad5765d374f854fb5fc4ba116d73
-2439b37d8e391db3f4cfb4980fd6747d3e86aa425a5b4ede03674f404026a74b
-61940470546d80f7aefa98482cac4d8880aaa329129aae1831c26f91989901f6
-72b414ea6dc7d8468d112521f57ca320dc8cd56c9023c496cfef9588778d66b3
-79c1ae217e9b4706be2c7bc85ce7e98c7c58189f994450ac8ed2d2b153aec4ec
-ef5e8c68866d27e2e77b7760c8911753cbce4994eb7ce82e6b73e3e3567e2ca4
-4fe75a109a4276a6e7abb0dbd00b48318bbbdca6a7d7dea749995868aba5a1fe
-50ba244cd047fab144d67378e0b21a5f39231e7cc4ab9cf010432ac20ee61599
-34fa8142a2166266d0d192a502790ae0af11ecf3c94c17ecd26182d6a2a45bf7
-85e3abc677487bc20d52eaa378ac3088706d9b19d7a52efb495e34e605c00597
-faa503dabff584127c2a479075f89497cd7a2d54d02329b81d01c900d18f80ba
-46d4f7e8a464cbe141ad02a64951a2927c8fe8f155cd6fa4ff3a44412a59db72
-b74499d0b52486f55672f075ca1944073cff76df0ea2bf64f534bd3ea581e956
-e102bca1029ea246b1f08731ec931f1c0737cb931279bd51e31f83094d47ac55
-d969f50def8c9a2bdb3e340710c2c1337986beb1e032fb9bebf692a5a42dec22
-24befc772b8641e0de28e4fd6271decdb95156908b4a53e92f732888ccca9650
-a5496641ba0673f9a10c2e8c544e76d33e84d1d2cdcaa23fd55bcc7e2969ec01
-c009f0f7f834796bccd863b7f1528c13ff1c499e6dd8bb4ba671dec515fc9ec0
-81bdfd97a96311893af9e102a1ae63a96bc22a2e8a2acdcf082bcba6482285e0
-bb744c99a227a18179e661f63be26e242b3e0b0fd2ffa982a1c4e7f051a66204
-c13a59e66833ce590439c9f26356c74765bc0cf209c1d89e2893f017bae39ff7
-f01d79ed9a99a43a3f6259abc9822bb01ba93eaf77d03cbdc5075860ed4bcea4
-378285716de824c71cbf033015522ab3e741aec821747bd635bada9dc243e58c
-f4d8010383774f9f3a8d75bd5b9b8adb3ba2ae89772743fbb4713c46c30168bd
-aecbeff476e0c2e6ba174f9301df9b295bb213d3a733e4b5d82d24fe579dd73d
-87d647aa7cc0bb6ad46e4ff01d1bd6b8a8eaa59855e73a6e6a0a9a800842f7fd
-86748489e1b52a597f23220e6b1da30a92df4eeeed744f56b5ed811292d9c831
-1863ccccd7672ccf160851630b01f805c77893ddd70307d3cadf4e259d25dc37
-5c0f89cb28b082f9ed1b8d61e52f01b7f66e401d318db7a93943c78e47886af2
-56611c91c11e628f9aa71f7553370a97d2766baad7f9e74a1457fba25b6a2ed0
-750694da50f77e4b3dfbf38af5983499046732bce1cb3f435626de6a7b8e46b5
-04a80d1ef0ebd4ed0780b0ebfd8c792cea07d2f1b7e2a63a104088b87da1e620
-29c2741c5de63cfd9d12b4c5212ed7022b5eccb7df7faf85e1d5c4b82ec55795
-de8fa1e4654b594b83069e0692fc4954e6d0d3fe94cb574fac65ce4ed497386b
-16304392ea2defd78c6a96bb53bbac50ef7ac097ac45a902b39cc3be09d98f61
-2897ad7d1325af2ae4cc80716ba062243ac48dd0d90d86de3c88b16b4281d009
-08be72525f69b7b286fe28253c4be746976cec1de175b3aae41f3e56af915a04
-7dd0cdc064623e453db8123d652ceee41b60ee7db30d96ed641ccbdd70570c54
-82a169f1b9eac1e410b693301c0dd765afce2af327825cac271aeb79a9ff4691
-830517e26d4682dc30b60ab2555b39471ccb6f38ae631e7e1ef89fcd1847a242
-06592ff50bfc47c434142997a4b682da77300bd19d65af7d2b83dbda5b95903f
-220d1a2d90a19819607c481fecb5921de9099a60150a1ceb1a7723ce8b182897
-14c1c181343ec220b929336bb2f35056706dc481164f581bfb8b9492b4a93a76
-f4227de34613379b40d8682d58f56419b7b4fcebb75e58d4d17bc1bdcc114b9e
-9aa0ce37136b2d92312a40643559a8c8a2de53af09cf1bf9f978aea6ca80547e
-dc97a08a8677bdb27a599dc6027bcb2060274f5034af37c15d737307bed56099
-8df21be030b0e57c4d03e2cb2e3de42daa26ba760ea7279815e6175a6e98e496
-618cb4bcc6c071dc2cd94774b5dbc0f912a7aa808e8f4e92585d0a1bebf22596
-82257ec17a792283dfaafe2e93bd4bdd75c1bc2190454b2da333a335cdd0dcec
-6561b83cf0ccc9ac09e3b0b1e2e108f14b500358f8fba4a4c3fc05deeffdd4f8
-bf2d0cadd592f37933aeefb253c717ede98b3c870464382f1d97043a039e6202
-4ceb9e25a50834e1134b4c553442b5d4e763b2f833d494ff6f4f5fedd022066a
-c62c41d32bac09cc0faa9f00cea1ad21ffd7b62580d6e4973ef82a0a88a94ba3
-481cfc5541b1ac68e633e53823abe38df4bc11da9e41b6bfa4671082cd0fa20d
-d5aea26151a947f7345c69bdad50c344ebd7d52c13f0abb42669724bd7dcace8
-01a3727f02b2a9c7452c890425f74ec7a473b2f6cddb89fc02063349096616f0
-975b3f1360ffa5162b577d556c21c1465b997795313db5ad01a059d074d5186e
-5a039181aeb9281717d9fc71f2ae7c423303317f66d2c145a432d40ea79b0cb5
-eb426a4dbc2548439630bd49c09c3ac56aa8c857658bbe3c345cdbe60786dc1b
-aaeea1e8134c053bff0239c3b22d9f9811f0f986d34b10ebad0603b099e61a27
-f5da9d88b88c435ed87c4906de206849f5b4427ee0439ce2c99b3e52eb634ab5
-287abb15154d08932c6c360d85030a92bf8dcecad523c123c7d992f742823af4
-95a83c4fb38407e87946bedfc719cc3998d3487589d773ac6da3078b06cd5ecf
-77ffb84a96cd2cca241b84a0d35b0b340dff221b9190c1aa2d6ada767a0cfe14
-7e3428cad1c93da6f3a01f821c6a410cf69fd03a2e46f17a31df33af3fe25492
-c6ee8dfe79ffb29561f92f50c69b6fb2ee2841ff6e3723e18f86fa65ceb3bc0d
-61e2f19e9962320aa05e82ba9ec7fa6dda9edb2eadee478c2da6951a226ebef7
-b2fdfdea854e541a449db75700f057179623c32027ca181b1c8dd6d83ebb8bda
-521d637b32d7bb0900135f61d72bfc97aad5cd3a2aff218547cb96386023d3fb
-9a0b86d9ab93acdae4f4eb855735357b77a24ec5ed31811feaaa2f93d6e4ce51
-2c9fe4830743bd3082f52ba17e2a4cceb5bfd2c31099d852bc1d1d1d4ce92c95
-b1868a8fd559e2950a55a8dd30adb1f0aa7b40c900642e56c958764b81334ad2
-5386c2b94732865805b994b5e9949b7b59fa4e9e27cde175106e944d0466fdb0
-85a73fc4d329efc235f368515bf6a5e9460c9e997ccde7bb4691aa903911e9a4
-14fc8fea294185f8d8d80a2a1359f9707121661201a72e571810f9cdcf792c05
-ab01ae9c0916be2070c264b0baf34f63d78df7cefd0abefca77639bf25c32fbc
-143a000e2cb1fba326deca8b32671af989df004e1f355b4faf7323da6cdedd69
-1c73f44cd381644c8d6987161b3a5ed5a36cb698f94970a472a32da1ebc8074d
-e29a2d9967f7f3e656db600eb06daa0778478ab53b653d19cbc096e39945331e
-0d325d2667226e85f7d5e3442e70ab51c294b8eb95edb631cccf964fb8fdb8f2
-83d6dc2150b8c1c31f7a6b2990cff2dad2cce88d8982c4f01da6f41b271f4d43
-4ecea79d6a7c3408d986dad00d2173d387277e35095513a67dff237c7d92b745
-f0ecf708b72515cb9b695e73b321247a08834d084600b3eb7707b9f42cff1205
-814c1d788e3ba40d49b97f15df97173f17918d3e4da33485081791990389e2ee
-7350ec14e7d2311d7eaa03718035babf963053ec12e427a0e503f8d0aaef29af
-ab22a7ba4410cd40626c21d29eee1b4c5b632d68859d314670891f87f097e293
-80a0a248dd3c0d940f119bab3a42a4d5d62990a03d2dee622e14de8ed1939658
-4db30c49e896782cf4e451269bfcc00f5525b1ad733c068798f41579ca6a6ccd
-3aebe7de7bbc0739b45cd693227933d8f36ffdebb558894780fdd8c2f58dec0a
-d78ed417b05e089bf1c3c9fc389787a1f510b7c8f103b2ff8fcfa06aaa41cb22
-68939a1649976475b1b3c90d2a69d30ef7d1b800c8fe250fb605f04fba577776
-0cdff81066d7a7703574b0407eb78953dc8a21ea0864324e65c75060fc889f0a
-a8d26a6342364972e530cb822ab91393e298075263a6f2f31c2cced33c217aa4
-1b15e0acab0f88706b40b1bc490d9304f588c2df3331b47af241d0136216a1fd
-8869ee2ca67aa0b9f3e0920f815ed5f91bfb5b3701402ccdf990d0111254cd40
-00edc94f1960d511583f82f28f71c30eb44e1366f83f98b8ce38bc0a620b07b4
-9a0776d358f6e3d3ef6f145dff0158fd839583401753fff11cc7752ca1813ce2
-8d9266aa71bc27a6cdb2c3ea9bf486e4ce62a112c65f44649d7bd68d8b1d182b
-1b7d25cbee30bb6c56bf8fe290fb44946c5c7c5561d6c24e97137e915449ca81
-ade634ff781cb95ac4c43ee88c6c8bb0a5fdff6d0bbbfcd5801885b1bb4f4276
-1b6f2c117bb90058466bebc36ba78a4d229352347715965ade47fdc175bdacf3
-1de2d37ea1106e0ef279da2d566e42f98fe6e5fde8e3a292da9b327541b7cfd5
-d60538874042da03b15ce640ee2d940ddfff12ef13580efd2efcac2e779b9eac
-3964ba7e6ca66e05cf3673c49a18e35df6c69f9c4ce16ead461bc5b09e9fc35d
-0d66dd4fb6d33066c8b15d6704a9890435742271ea33fb6ac8e5261c2d3db0d8
-84d4ed885d5d4635a4e4898be0eeffebfc0ba8a90bd92bee924078802ff82ff9
-afee85f3a4676be2300906b95000516056165942ccda64e891325dacd9b73750
-5039d2520897cc43d9d404c299a9ee3884704408417d64512d9a6a2afdabacf5
-6ba334c51a72fc247dc3a079e3133517055b607adc13703fee0dca0f3f8ddd59
-8656337980bf58f3ae667b81458d7d539bbea00ee1f0fbe756a22cf51817e7b0
-8a7e28d2acd83b912365aa69ec031c135a5160fcc55a5f9ef4d023c92c2f4598
-8899b1abbc1c8e957c2a416b1be6eb1bedc273b3cc91b1a220bc40b96463def9
-58bbe5b6e685b472e81a125263816fe2e4165960b7851ea8f65cf61aaaf130c1
-04ab6c86ef0493d806386e889630fbf6ad9614041d92d35b5f788b63ee458ee2
-c6e3c06c60cd1f884ad3b1455043757e32e0a35d910c2fa33ac3abefeab3616c
-3023179fd264c8d3155dc6c73901a109abc353d664fc19a09ba716398118c94b
-5cbdc6c23364cbfeec6410ad2712edaa9932769f4c369877a832359d078559d1
-be39204ad8b6324806ae945e18fe20f6a757a0470a2667bb7284a9fbf1b343e7
-26df689bf6d69574c6e63572e9532fb1e38bd046936d340c55eb8e14fe2e80b3
-a06d4b911c6b3e8333c36b676ae8986469295cde55929a1d1d767476cd47557e
-d438bec525de2d4b3f55ae52a6ff18d00d5a1e1abca167a7d8b6dd2c6bf23fb4
-ca20701c9869cb5e930156da33d3b2fcb70404c0df725d664deb78814e175035
-02639a8935dfe80b8809086195a7cc4c354bfcddf7798edab74522bf447f2d47
-52532fe58da8b5aa1c4484b50ce37678f001a6aa77edbc7f0e2ab2b65e9a4635
-92dddbf932a5141e9ca9f108abd76de7c6f73269fd00eb8211f3ce32b92b788c
-85933381308f912476ab352462ce1e1d98fb6eea4f690e0e036f3deca9cf1435
-1e24a41320b229df0600c764b7e09984e96501c18eeb9d8b9b6636bf3b6e7068
-581bcdd1def63429afb5aed8edd44646a6dfc56b4f82f49d5819cdef9a6f08c0
-6c559f07d3f09c2b5956acc01544800a24d0c22b00cbb1c06b119521b967cb62
-2981313c666afab4c96817c230807850620fe00bf98be25defb29670cbc61440
-90be418d8263c478d879bb5ef72eede7207cc7b2dea21957e9c476608abcbdee
-d50e7d58160952ebd4e840d604d28d68292c556dd79340bae75c318a9f0b2f64
-f3616c680235bd7d4470b7e440bc8b37f351780aac3d311ba51d56cb5267fa2c
-0c45354d73fd084635552bf78898e2be90f5d7daaf9353f58920a0fe0de56eed
-fdea94349d207f4a5fff48c14c6bfe03eb9b051d28bc950574fde10e2e5e7cc7
-b4d9282e005a2174c09c62adda2e15f87360d8c02030de0b16af093feed4c409
-b908426705ddae110aa3ed8b1093702d8a50c08c2358b932e9b98b0b6e7cbd13
-7b6b2aa51ca68df71980ef797fd483f8dea3e44357451e2b834dd0df380ad9eb
-e1a974f1dafde3620fffed6385b1132df572cb35c705614556bd07129c02909c
-2bcc8c5aa450e94eef375efd8f77c0a8750c45f45379af43a12f288ede4a0935
-8c67eccb2733446f2a7cd0adbc989b21d5afb11fccb57bb350a39c13b3970e90
-17ec4f1e0c2ab7fe6310a4345d1934fca54b386305f015ec87cc15910c323450
-e1cb60b5a8e0dab68412dafc511811d7fb2ca08d9338a85bfc050e171dda308d
-4e58c9695cc8cd6ae5b14e1e5c47fc30e2f38d11c6f4964fd16934a8ffea5726
-8e489a334d073fac76196db7b3c8c6d4eb1b21171ba9d711433dfeef3b7bc0a9
-a50751154d77ef7f6c6be0e35fd0d983a5c03bbb35b7afdf952a9a883500a80b
-da5f65cd7aaa71e5abef7260a089bb730a5dbdde0a86c1e1a8acaf76f998eb17
-55a0edfe1207c5692c992741e653480788accb3d8fea8ffafb73650ac8a8c349
-664e92a2a8de84125c75d6155bb6165aee20a0a8ac09ede3a1fb800f6fdf0b4b
-4214fa222a5cc6c41f7f7763891f5d578b6d989ee6fa56d8e0f77fb09acf241a
-88f5a24d4c08f569c4a305162247216455c4bf6e529128081b10f5cb09f748b8
-e264ed4adc3a950c5ffac368799c4c031ca888d31ce9386986222dc3688f1c22
-82dd221f7463ec3cfdde846512774cc9ee1b1a6a2091355b09a33d4ca8538237
-8e5babc5eb20b1883bbb71a6987aa178aa4dc2378a344b5c6c3e214314c9ff3b
-dad4563fbe133fd2faadc70b5e36ec6de0f2d757d49b51c623d42f148f31d730
-a0cf5953840e388b8c6f750e3dae0677a00f78cd81ec1a76dcf0833dab08f3f0
-17b60777617649f85149c20fd9b13dae3efe3e8f1c7b801c5ec0a4e2ece7cc00
-9453c80674657d535bf0dbd60e31a2e9361671ebbd8591034fc5d77951ca9abd
-342d1b3ef381ccd243f083b3ca5cd79053a4b1efe8a668b73e9295cb78a9ca0b
-6e90f22fdf826ed2561f5b4bd0e6d1acb2fccddbde5db08e82d9113eacb6260c
-fbe7af67407eb89e4f29b5669f0172c6e4b1cfb81fd7d28ff5167111b16ee4a3
-49d5ab9408be98a51aa4d17412f0d23f7678238bee914506ae72b470fb581a89
-8969eb6bb0137f9b38873cb5ecb0501e49dd3704719743a5ba4ec9bf5c7d3973
-557888428d30d2fd228127ed32b484096edb0c8adfcf6ffe8cd030f3d5410e62
-2fe54d615272a7bf503ac89d0ef3ace83754978673f9db3e005807e470ea5b55
-3649f61148d42e9e6fd19e4145980c7ecff2bbd8ef84b435e6562a920e88698f
-7d1105af11926cd6180d6179eeb68823d99392dc95a948e48f3533ff1c4b2026
-b5ea505db22a265d56441ab455024f4263c9ad36c3e25ce067a1937303f9f216
-186ac443d0909a4ae76915584bbef1f884c321fb823b724c58757e619ffaf201
-17e5d826afb62d2fb7a1e115429191c80aedecf84cc71ac9e7eceed3aaa33838
-861d5699440962f38db466528bcd883ad8385e5b8b9ae1fc891152ffede5c2b1
-39b1445e0da532a4c9d19662c7b9af3a158ed868f5b11d284d19c850ad79bfdc
-fc4b44ba68537b205420140e803a16eb78111fdbf1d89cd1efd2663e3e306245
-84a5e70d413f73cc1f9392610d0c4a9a0a3e4e32906a058d8bba062c94fcf4e1
-e402024efb1b7ff8379500d16fdd85b556002de62f78c827de10fc2550bf000d
-fe81b29747882b8cab4cd04acbd92f009ae3f79956996cdd6cf5006e200caf32
-e014fa4b4e67ec87f6b76741006fa43e17f11e0aba57592f481bfb8655bc3499
-2e8bc3d57ad02b4744e1cdbfa0a76c543bf214cb6c637eaf4a958b337665baf1
-b286b40fafd6d833d45b4feddf163bea2716d90ddb483f8978b5d92d8f78d13e
-9c24b1044543b289efe180f0dc7fffb90cb99f928458d36dfcaa18145b130d7b
-6b57be3f81244f6064b61f630af5e876c8847ac278dc25aa942b9b90b25916a2
-ce48a2f2546056f7d3c9e0f637b52eac424c3c7b838b279e9cd310a520be41ab
-8c7bde64af685340f44d0d5e4bf793da6d7fa368e9ccec9c933251e56bbecd77
-b0a3a4566dc074e2bd55ec1adead11e4ec91937c8924b7fa593b24ef32db66fe
-8b27d795c12db95404b2c66945a9c3124cacb24311fca2567b10ceec21e22667
-8925a85067442df6e02e21e10d6ac641da354c318ab4f244c1c2dee6af49732d
-3f390fe6ba7c84e415b35e390ee2037026c01e2fa69d1348871b867a37ac2bcb
-df84ebed1024ee8fed087491c8978051c47fc1ab12a4deacfa17797ded28d929
-e212172d3d8efc3b04f5d074ca57271e604ef5d0b9893a6dadf516fd75cb84f1
-237ec510567264b2f20ac77c21e0a623ca2e05f50bdc856d7352bb03dfde6a0d
-b16e1afe6d3b6cee4e695d985b7fba36d64365c231ffcbb8be40948810e8147d
-591bcf096bbf5d2b545c9945612f60869abcafb92fde6616b5f863e55568c7de
-c6b413edc7473bb35c6907607ab5fbc91ad25f4c38707f57d22902f2519f9a76
-338a0c3630d101e49f14089aefb0e8d6c735493560900542402938b467e8437a
-1089d9460027ca5851a788767167589784e55718d98528883657b4fa709f5451
-00d0cb2ea4213a44a337afd552b19c10e3f6dbd866444735570db480f037ef4d
-18edcefd8f6b14cdba58e3fbf75b469364d0e69c92b8ba3895207d8217c72fb2
-6238e3c231451712babcf6e08c08c637d319867554b4426341e315217fb93c65
-bac24552f95e6890b9dbe1bf7530d720e48e1df460eed718b0fadd1960eec4f2
-f72742a1b8fa8846c10f1201b22c0d79b8c77350226476d4ced87e7b67649c9e
-661066879ab9dea79eed6bb0fe1300a73fb3578c0628255273ae4cd379231e9c
-aef0f8b72bf778bf14731c68ee50c2a2f31e848447190c3e42b5889f1623e196
-bffc1d8dd1323067e075fe70b4c762ce5fd8aff0e4013f47c2e2ddfd06ad78f1
-63da5f4065a272d91f296e2665b219d6e88c094523116ac9440ec2f9b25ade7c
-5852659ddb699fd030656733c6d232a49e75d776a235c1a56ee2f8901707a40f
-5b36ac3c98fe021bd1f28dfa10327cdefa5f06b471e8967eac5172dbeff6ef9e
-bfe7d129e8f99830e4a12c100d6c5bef79114757ce26d8f0d67b95d9865c7a5d
-c91c7d542a2a908b2227ef0b78c7a2bd562a8d73f9c20728917082a2c8dcb321
-de1c8f89588908cfe1a5833bf444f8944088e8742635774796d8d4a0040bcd9c
-64ddab4db438402813b59edfa79dfe26afdc6a87093baeabae0c10305f70cea6
-5803702798df945f6f45ed221fc9c2537151d086e2df720b8c689c4df331edc3
-2abf9d322cad08e3c2c06921f3a2c9f7a13a4f51b184cb77a4e7aef35613740b
-2bff9401d1488fc671828fef4ee8ac4fdd247d6b778e5df06179b5bbb462f2a2
-e2976cb8794041897a65bc5a9e1c561dcc34c98db07947a416c302b8f20a8614
-572639459e1ea1e510a8f8432b78bc5d1e294d8f57dfc956ef227584d236d0f0
-70a2aea00d94e48110decd629db3727e5015bb0c99a794106d1145fd9fa8f407
-bf279f7b1762421b1f3a1437018efc9704121176e2185065901df20159eece5b
-808b749e7847b6ae9ea268f561b90f8f47abdb6528a21a714b749377a3350761
-08e9506decc618e42dfa4ee0abe77d1f771cdde50143913f0407023e19fa0cc7
-464e53218da799ffe7a232241f3debfc6f68bcdc45a73e264b675e3af587042e
-1e35b346de4c76875c656aafe366c9097edd12df958335cedf7e25a72755a888
-78fb21bde7a863797c2f0adf73d3dcd928971e1543c594cb1a3a5c364840f0b5
-780b764655fcf831285671b076f7eee0f1c6245e47917124a832ac008ef60825
-0c5220af5e833b6aae1038e9f7dc3c793c7c1aceca66b3c6b0377a4acf9e5aa9
-8fd729ae8ee375e831f507cee9975b130402b78d84a9d685625ad309d078bc2b
-645c48ec8503b02569bccf978689a6ad2e2e06c1978f10bdb20d2f828237df91
-cdce385991a328c94e0b556f4cb8987de3a2698c78eb2f2fef4e047292fe9832
-dfc6252ef732568e87aca6b40f113e45852b213bf6e3d1e822b61a34344b65b9
-c68246f682588eaa0dce7c1d1e6a3d3491c34f7df5b0a55da9a33f4d59b5ee49
-beae9267a4542c4bcf7d650e0b533db67074f7a889568dc8d55da631cfe65d1c
-305c2c49574e2358bbab65e298b46eecac4caf9c79c918ae18626cb6ea3ea5ab
-afd51c88faf8309e2cc5ea3bf72fa7931475882da87a9249cb713bd25ddd0f66
-c98e58dc0eece6bfc1d537f887887e3bf5f52aaa42254ceb85481732f4f22ad0
-c326321139e35d2066b859faf9179d497da1bccc88614d1482cbf349474dd848
-7cfa8ae04a47cc440f9c08b7916727fb9a48325d84de181acd84db1f8450c727
-92f4d2472826883094a0bd330e79d8e79aa7f0fb363d6f6432cf6b191877315f
-13b0bd9c5e0dac052685f04b7314f1578e14042e777ef6c7e49b4b1c4510d8a1
-e97ca72c77a81b757ad555437123f371534851fb922fb8ae6eb861d4cd4f14a0
-7cd933d97c711e58704ed2cc1313f4a899b401d7354709fcb8c5204a5144e100
-fd49513bc03eb616b83fcb488905bcfc751efe672ce1911cd55c48dc34e5922c
-1e300e2be75c97aafb6d2c7d8b2a27dfcbb59a512e6498af827fdcb3a7a3b572
-2ffd35467d2f4e23a1bc2af72efc4ed8d0e86e983e5e822f5d7479203e7032bd
-1ae7a3a7930850325a42b803552a3b00753eb9031c57185c5ee5b8a2c448555a
-91cb4522b8688d2a42c15eb2e1931fd963b2e10d09cbef03e4ebf90ff61976be
-720e07614b853195dee2ededf3f30c750deaeeebdaf86cdc35cf6bc8f05d7e9f
-35eef1e212b9c6ed696bb4673cd837a8fe736c883f042b0dd9f14beca6a1128b
-204c2b57cd58e90f046d8ce6ea694e1b71ba8baf7cf6c3346cf0dd5642676b4f
-f8b45cacdb4975d45edeade19a7d1970ad567e03cd0fa17222f638b873f60c0c
-085b714c18c6ec4ac1213946824452fca1d2e85febb6c071bc80cd3728cbd8b3
-8a85376914273c134b8b8327fd591c5960a0ccf823512e936452df7302d19275
-fd19ee696eac93d10b3bcfec333e1fdb77439eee7f7ba673be0edfa26c52b258
-4f6a61bd87fc89f3cf7b662fa8760e30a800aa7d85e94e57749dc6ed26927ae5
-4e1f84ede593601063711a345afc9ad2daefb924ad66c9cf7ef4d7613cffb79d
-e86fc6b5e378a0eea2c69df8bd80d3b34f5e126dafbc5030bf408fd0963e0949
-a537002f59dbc2180085f46bcf7fca9356dd630328b7eef27b7577ce3c168281
-3c4df17f86a68ca27e8309ecc6e6d580df9d6073704008714381148da19acb91
-ce6fd2afa781a092b881b1e75c4525e668ac8450949eb5b4e49ff38806574657
-d45062a294972c441f8c354413102002790c9d27fcccd3f98503d6cac0f9a41c
-4966a3899636a40dc223f07568ec42822a05afd80e10795b86b05529faca9c05
-f956766457dfaf48992084889d76195cf5e72e3f689a85fadede52d52fde8385
-0ded200b05377ff550e9a26ee3e976d275c25b536bf429efbbe8084c8908ced2
-7091434606e6f8f76b7407bebadb2bfeb03bbac919875c308ea1c32bd56c30a1
-f61bbd705a87d63f4709d39100257c05a0fe66cdfdd0234cfcb67fd999f88f87
-c13dabfe1e7e91db67b83a4a7f5033bcca4d9e3ad4979b1091ba749e595729ae
-ad79ccbe02adef217c049c29e05508a09cc4eefcc004610acd3f45849c631697
-68253242095addad40ec80726101b6d25a4e52e746a9f956906c32f2cb316777
-bfdf3a470df987b5228620332983f68625e7e32a9ca809f61e3c25983fe95987
-a2b032cba145d2a9a31236d26e4bd86d71ea16a0fd85b393f7e3e1ff5b6e418a
-25b54766aee0d8272bb2d3c85401e788cb75bd8d676acb121198afc3179dbcdc
-8281c914295fc4dee61d150bd8623011b495ab2350e0047dcbdf9a9db40a87c1
-fe9464ff6e95562572c61346b1a00f37c3f0333c81753cf4c5911e5e370c70ed
-bbb4626b53f9716a3b83d201957059546ed22831f5ba5ddf5eda421b3167e5c5
-8e4a5ab8437540334a3b3285c1a94a5e2c87fce09d00ef5db6ee78400f1f9c4f
-4cdaf7bb85e56677c02dd2b46281c64522aeb1bb1fc83907b4fedd6678ec11ee
-46dacfa31b048910cc6c9463bbcebf80ae98304ff2ee9d5c05418c667ce54354
-d66d0c61ad5c8825941523ce6800c2fd3cc05a9bab764f79369599d055085e00
-8d36906da59a1fe6d137605dd7707ad144285bcf31a6047978146b61a4dfdd01
-ed38e1888896f8b02f0bd89a57402a92107e626383323a5fb2e943316575bbfe
-b707007cecb0edf4afc52419fa8ac4f6076e1dea9cce97c3f1e60b2212c239de
-b4e71711ce691ad89c42074ad4c9b9917b40119dac1f9fbd5cb3e241e5aaa2cb
-ba248028a4ab8389fecf0ecbbbd9d0ab8450535f2f7c85c02db8c287f24ec8ee
-f67baa4a0eb50a8bbbaf0841f4a24558044a0e41b7fb390b6512aef6d7795222
-5f7bc00e6a6b3e5314fac779a9eb11b38d36facb40ec14e0d875640c90d9e856
-a5a88a273886288f14d44d0d9a8d4144827d587ee2cefed089d6979793051660
-c322890d382117f38e35e643808fd66e48b521a6eacc926b748c7070b6f3cbad
-f2a3dfe4e2706dbca9439ffaebf1522e180bc2876cf7f736698fa955fe1f036d
-145e3216487fb904045d5533e1b2c3be21e1a64e96bb132581bf0180b8e370ff
-a32192305d1075352f404f4e8e338ef2926e71118383a9b328f8e55a5a938c73
-7b7b771d6ef4f4d62d96d5bd1c64190fc6932ac6a91c92f267c502d3c1539b48
-c6e0c511e83b687c80a8d290702c26ed02a355ec420667a8f1ab2e201b814b51
-da7700c5fcbbf06c1de4b4feea2562d1cbaf47c4015b72aa22a9b6490e775d60
-f7b5fe4e7362c765a398b0c39b047cfc5ada1d8abd3efd2894221d1676f04e24
-fd10f66a7a185403caae0a233896a2ae721c0c74798ea526db2a13a419f60883
-d4524d068379bfa6effa715d8907e4729a99acf06d7e2348ec9277c295dcbf30
-879c2a7e7aed3bf984bd8a3b73cd518f8a4f612a179ad16b5c8e6fb0c8f21692
-c764a39fbe7421d2584c7542f9f3e2e76b1a8d81f57df2276e098df6f9a2bcaa
-f783708d5d966883d2bafd88416177a159c304091202f2518f31e512e24f467c
-67bc619bcfd5b889b0d83229b76ccc9db033745ca4aa2b7fa65e12421c95364b
-bec1082d2828ac196ed6340d9c90bb5f102678640d3481397c077ea83cdc3ee0
-927dc768113d2f4deafc9a6a982e129c5000ee2f5051829969719fbe96bb73ea
-c332ac4c81c52ba840c1be9cbe9c735639bd9cde6da5f0cc484b20ab18cd8235
-fd2d8eab0cd5a9fe4c276ad9af585aa519de92be8aaec2c7ba6185d7703c02c8
-2a829b02d2cfa16188f5e3ab80aaa4526dc74bf173abafd7104c6c8351f5f362
-84a3db9c28acd707fca8a97979607f4d6dae5b23e111639271f8ea152a6d56db
-dd6a6c33c962020393e13a23101899e3d2d3b1be77f23dfe1bc8bb2c56fe0f8a
-4ca063369a0efc593be649feeb516b5bfc6994ab38a75beab00afa4c406c2ef9
-a7f2533b5f766bf115a05ae0dd8bd4a0436cf2abb04354d54c82e3e706587cc9
-32f95a254041b036b14d249d49d7390593231facb2c2d80848e94b7700b06527
-4b833e2a22722ff90731aa0f47166fd4fd286d5315e01cbedef249c9b740278d
-2a4e183d1148433cc20cd3479d7ee981b0bde4f7f46470d9ee2b6cedc48b0d15
-81849271ebb8536f55b6712a7bed80f2550298b1f81f3aa70d39261a187d7e6f
-2097660de875cea28e5583f475fa4e26950853bf6fd5e9b9cee59c1371780054
-b2238f9e6c3c9f3b4a1411fbb89fa1fbcd3052d1893332063add912ca1489077
-9b988149bb9d4da1436a18891fc7f229c2f900fb6b272d55ba55e581f8d0630d
-8bb6c022d366dbe8b4238058873514e0df31d73920a720f6dca145fbef4d15c9
-411f5e0322cc61990a48f98a63f23793318c22d178734fbeacc04988901481e1
-ff62d5a8c7aec831ab49c4b5721f68f693e442cbb62d13017ded5011eaa71f41
-7707b7915b92e280d0a7fa0063d90ced947c82ffb0a01b962d2b1aecdfb1839d
-d0e8335124fe352593c9938b4f4ec21a4d04bba3a46826df0972c5d8401f6871
-5c7b4906a37608dbd3f630d8f3bb64247d8e198cdf8ab8f891e00aeddbd48263
-17227225811fe52a9de08976cefdb7d5e76db46941b9576e87dd6b400c64a256
-a134755011e3d4d27cb90eded548f91e1acd8ce08b7adc929c1a02b22d65f10b
-bed695d8fb1337f715c792b04d103632223040eecf2703e597fdf30a8c42d448
-82e73b2a1c0a73919df7a5cddf25b32afb51f2d24dc4dac2a747cba641fc6fe7
-ec4ecfdfe98bca936ec2819ff6016a17bdfb1c91d893ff861a67fb1ba168c5ef
-59f774d859741c6606d680b68b67563b965ef7cb98e162f307504fb77ba9b3c3
-4eba8e45e161f8977fcc6fc2f4c2a677d8caef269e49c9f2f9ff6a309b2c21e5
-c810df536db392cd1b7018dca670f0d484cb7b6ee50ea1bd158af5547dd96166
-da10d10acadeaa04eb9d144a0d13d7a8f80b3e505177b3cf9893396cab022350
-bc705ba65811a2c60fc9f0e6f044206dcf524323b5cbf547d13d54ee0e87f00a
-d5a4f507757cef3b458e792cdfbcc25339d8bf388ca94bfc341d76ab42cad16c
-3f37cb51c85fe91e387f8c1d84a03da897a699fb80b5de32c0573014ea558d71
-a0eb713c0499438120b4702176b39a69bbf930309a555173d8558e7df642a40d
-d506f2498136a5cb19bbdec74d7b436af3ae2fef171244fef9711a9ae983e452
-20f3154be125816f948bb0d93b9853ae68c77ab71a8df0d5df10e4d6b7cdff22
-c3be071f0e5dc4b82293025a27c4ff3cb5209ced6295fa9303b624737e0f3e8c
-b8ef7e39762c82c89627cf2e430aa0c339eee58b684ca7fa818dd90aeda2f85e
-0844963d933da431ff54348d7d9bd3159549650fa956e1395abd116aeed54518
-649290b0b1f54950529f83b0d8d9620176d7a91b803edc637642c83a761cfc82
-1b21787f83920decfb906a5260def040e62e38135944df33f2c4ad7eab631f22
-6afcf035ff68b4b709311d9d713ac6cad9e7fceec73ae0abeb5fbeafce209148
-1a0e537bd666719b41028283cb1658f4aa7f4512fc61c7631fc4eda8d678e7fd
-e9db0fe0f89cf941fe65c32fc88f490226acbcbc93e5ba23dfc83ac4a289870e
-5ed31f2b5cf50a93525f381bd56d01bf11299258dc387694fc0cfd877eae3247
-8d6933340343ae8d2fd1740beb0eee04c44614f9c1d45beea74fd4c2d3f49d62
-4388241c96bb392add3896e74b93f670dd8a5c415631b2834b3b8135b49caaca
-007feaeca5fb75d9c4423f2f04ef576eaa87b69ff1033a70409cd5ecc93155c2
-18d154bb152491f87a8a49a77c1b6b6bd09982a55c33601547db6c8344c0ba64
-007c9487105cfd10a7bc342309d1aeba097d21d9c1da6e1ad1b1f05b2364678c
-e5e496c2e2056dcac7b5c90bc5dd0b0853e30d01800f91597206dc2a1bb5f0fa
-d8735dae0e61eb82138284fc4174b009d8dcb57c96b2897dce69785a571549d6
-67f539640bb0092d7d130ce57428b10a985a48576d7f6ea6c4207a53bb62c485
-5275cc7334b6fcb89bb496f3889377c1b0b5719254c3b9b19d041fad4a399e67
-1ba4b04b4a62b1879dd7b04f3b93fe31a3c544eaf70855d695eb3112a05b0537
-4c2196780e52fb906deab5add98ad9a075a1dc44a5e6b5ba6ca0f8d2a634491d
-eaca8a763311e9544556b65082f93074e5e4457956783c11dd6b1be5749fe952
-d2f642e8bf267e5426a0ec324af7d2e990254de48c505b1fb742652ac86f38bc
-cc59509737401620910489d3a4aae6e84f7b7001bcd617b0f09b5002ad00122f
-b1dc4c7db88585c31e637095d3d0dc7fac2337eb79f02fa62d13af0d4b76d43e
-69179bca2b3685d635c6f2e1e26bf1a9a609853d1510fa03f78f0b7fb384586f
-3e9c1ee38da709fd02ea0ff4d5ce512f8352aa15b232cb91411d1e95965f485d
-7ab5421d700af653b90839773fab6d37538ae3d61d9cdef3bd4ff94ec113e9da
-9a65f75abcdfac298717436af9c1a1667e7fe80339e1383bd3d45b94f76dd91e
-f1ba70a8bc50b51d6b51766722802205c0fc5e8ea0514fdfa5d5b18482694e65
-6ff5d21dc785b278f11b386e5812d42f0b4505f896d7f22b4ba42f4cff11dbe5
-07a53031462b3e29263851e0c91ceaa0573b49a2a6cbcc3c3c1a9c59c556dc2b
-12d1a9f6bcc751151ce62c3f30a0ef50eae7a56ab9eb35f93975fd3ad2e21459
-52d709f052197a64afbee9fa03ea2bb9201506c0b6441c9ef7250d73444e01d8
-7ee3dd07ca8cdd5549f62d1726c8d69833e0c9d2ff5af11b1fee0596853fb75b
-1387bfe18c4c747f83619a6096371fc6f444877ffaaff4a8f412847409be666d
-6f96f3a2a6bdfd20f0bd08afdd3506facd35e4b62c58b4a4645e732a9b1acd6a
-cc71f018c9e0622a1705ca635f96c7315f9d876afb459641315bf4ca0c4f7930
-1c0e30a8eeb441218c91d12647d5bdfe2512f2321bc51968c257fd339a24b1b4
-203ba90691564a9c83aae4ff68664d03b1a95da707bfb90033444ecf3deb43e6
-412fdea0ae772206a398de11c52b652ac04499968e2cdd4345fee97a40b86567
-2ed4711234d27ccae5f151d1825af76e8624c0ebe4a5bec34b6998040c3b8292
-76200fc70a6bff7a15cebb81e8b52221a45196fda4087bb32d5a260d077677b6
-6e070d33ad1868a51f7201924825b04335bc192bfefb74e496dab3d54ac4553c
-f959ec0dbfdee94289a4a2c166909c26c130ac3ad182057644c8c2dca84a3044
-4e86e891fe1b07729531642e7374c9a272cec66bc04a36db2d0b74a622028adc
-d6702773d0c9b6750c28a08902fcdc9f8a290c80c0360ba8019799d33fa42361
-c66575ac108946c97f3aa027ff95d2a6753f9dcf5949df046cbaea6333f19716
-9c0593db17459534deda9863a74b496a837c1d667df9afdaf54320664d0319bb
-3bd41ef9a54b4594e6be5dc416c275a73a26af17e493f77ca7ffbeb2f7abb317
-035c249b4b5a33757bf9601b4def56a6207ebfce6e073fc9427f95e4cc3799e5
-5eee6d0422a26449f713a74f0c114d3ea2e9b2e183dd857cf21bb3a53480b0a6
-9c7d8fde6da71863f2b21eb407345e4d72c5667137f83610cd2c391218478c14
-1f1f34be21dd6fdd444ab1c4b0a59439617cd0d04ed9fc568b0c70ab8222f17e
-e10c0934f9b567dbb26ee612929ef36036727e4b787015c76e78bef4aee02049
-4896893ffa23af70b4c6363f7b20db155f496ed5a8609be1e5173ce968cdff5b
-2fc5a3bc23894ec6f26b71a2ac555a5cac33aa9f71c184b8f9569d286978c586
-0c4d0be59e267ad86edac17b787cbb93dafab3ab4406d83af0fdc7a29b0a0b8b
-478d2717fbbc87b305b3f3020c69c358232b5b052d4376db297eef247ed2dd25
-6437c1139017556f879427b786a15bda065a1c70c6dc959f8e0cf727bd50924a
-b82a8c56c225fb35f49c6937495f2b6c7a80d6ecd28b0088b52558cb45b238a7
-dd65fc5f16ea69febdb60167d4de4785b1ed69c9f40495cf1aca058ae2795fee
-4812b5ae9a88ec6f37f8fc2a964e0170025fc558a7d5e093a498b018390064da
-45f6d3c9abcc3af22fb37946cc10ae42bd651e213d7e26570b1eed493c374260
-6e3861f1fa365824d012b5ba6b6bde3d198e0fe078c7c17b045109f6fa5700f4
-86e7fa8b9c1a5aa9a14955877f9c7ce8997cf709ce97211dae33e406979e83e6
-6ed2386c06b400c36404ac371ec3bf27dea61b15d3db5a2eaf68b5e5366112d6
-a18aeb880bf2df3f4c151cb23ed00afd1f41edb073022ea746336ccc2eeff94b
-0c896643f9d44d67ca2600eaba8db2a75a18edfdbeef3e55aae36d93c115835a
-a41cdcb41d00721efa83cf094a623c356cd01f9f3e61b52336e039f3ecccbcbb
-c3db862117281a50bdecc0057520b748a4beabb24b8a5f2d915eae78b359c012
-43b351570dae60fe822219d20aa73d0d2eebfd64a13fb0f05512f1c25eb8cfdb
-1f85aefe9cdbc6d213db2396580aee22e7f39ce8fcdd343c9a65f86263613ef5
-c8b1d3d2ce31961170db7f3a930aacc827643fddfebbf77d5a402be5d1000db4
-c80c05b38cb971bb260fb31f8a42750519ff7ca45076a75d3490b51cbcf8b47e
-9c43f349db24dedd1c41e013de99f4a02d7afbe73517241dd78d1bb77fb815e0
-23ec47e41c4f1f8cc34b6fa12cfb9837e7428a0eaa9769e786818556955407ba
-5079607225977b9d1329e9837fa6ade7df59a7a5c3c6a9de0791655b3a9c88a4
-b9d643f79acbc20eb60019d7afc63f30c5430f0dfdb0750a899347eb1d9cf604
-7bdb596275613295aea793d76f6c1c012385a29721cca1d4a49c666cd91e578b
-4cb177c7f24bb53b2a096e7abfd475d8fdbd0bad06ac17be32807dbef46afef6
-743bfe9c65d9f41691f698027dade394fb03a862d3c8aadd957f2e3d22af692e
-fa918ace6fce92a690b5481d88638747ebefaa504873781d51bbe392c8de01b5
-ae4efd418cddfb846ae695ca0c4f4bb18da6b54ac6deaf533c552d8dc157a233
-6382159f28a121c9f2f486f9ad00d487fdcee4459470a5f8e3d3ee056b7cf51c
-860ee6e54886aeac337f26d1ffc297b6903ef5756f964318d3aeaf9bab264111
-ef2ad05e4666ca98a320e0c30bdecb5d0bb00447c26e72a74cb5067c4734854e
-f85a9efea96a40705a62b9fe6ce93fdc47df59fde42c957fc276c86696a70d3f
-3503a4ce8c480c2f8abb6b86d4c0b689db26d606dbbfb1ba22960631d355bd6d
-f77ba316866036141960bea735580e6b306b30232485f662b05284775da99aac
-580a53dc696dcc027a4b008c7f55c8224e7c59eb86227bd3ab0f45f4080f2728
-3721ce2c92b117ef4ec8540bf86ab9aac4d142c87c483764691656f7b95d4c49
-69eb8403eb6e52effc8ce15cb9826fa477dabe136c2915d5f9e03b80e83b7158
-013b8ef2817b1020dacd0b8f8c80e00450cdb8e1d794cbf23596d25116a6eb71
-6186870e761f3b024ef87136d248af0077422381ddc0d997c10677e5c51c87c5
-873b5354c2f429661b9adb4b9c7ca76ccc878daa248857ea3746db53b3a5cb7e
-9b239744383e4652d32b75b75a4d678a4adbabe8e640f4e0a80fab602e09c81b
-4c563db440fc714dcd23d3a7e4aafa655d569b7f6e4a3e02233027d740b6950f
-349d0caf99ad47e7b40f3f9b88e1e6b32dce22027029ef7a470678ccb8651509
-bd9278055958c6c8802ace0c1655fe5e52a9840513b7925150d092a1f7ced5cc
-9938244b0bd766dec4954ac6cdd1db1304ae781383d253f65bd24ed05875eb50
-ad99d1bce15be48a6a363ce8f7d1d89b37ca7bc55dd84fb7a925ddacb6134a13
-13ec21412cf11b1182c1e88be892863fb487c57918a111d4857d3a4740603097
-8456c2ad7efd34d949111de4a616362f218528474dacc220f86814f2543f5038
-5f80cb9d39fbc70ae1f66855dcc1ef7982b3488f719683aa5296e955d72a3ed5
-6259fc3f9bc41b0e42514740d750a7c2987ac132eef1f7546a7ee8b073dcb7cb
-3077493e4cc2d0b8313968730bd2b0ab3d94258a840e25a52b96025704462c9f
-93c3cd3c2f3c66fc7e954dbcd5ffcffa622c797544121f91db0cb7793112dc48
-6996c71221bd8318a1439007735826533bdcf1fac581e5b3b8dd3356e4a578c8
-7d73026ef076fcec3124917ccafe0bf56f934dd8b57e2dbda712020b1c4a7b79
-19d9d7bcb7d5f850104e668f597d1c6945aba72f2ac3fdd00fcfd4f3aa871eda
-fa706e53c1fa0d376d1985655cf33ed3dc1791517e9414860e0ea2505d280db0
-864b7b02b80f72f10b5e92a7b79c71c656a14ce57f096ee937fbc8ccae999900
-bf31a9eecf2689584976cc5d9d20f84c3796a4c9c200775c03da8fd51644f372
-0ef4a6354fda3c562a001a95217b009a6b6f1adf1eda0ba99a5ae28faf22594f
-d80d09ea4bc02bd5d63f4e0116ad29ceba0b961f2d0530ddaafe3d3b3df8ffab
-804c7b7855117d0c0cd591b0828539c954e7b6c05bee6e8002f9453caec5cd25
-ab4397c807b2af43c2b2a883d87fddaf6051f8b2bd6d8c9beb43ea821e48de0d
-83ce6e93ac6959d8c7e4088b12240ecfd6a02e0a8a452161f878f024dc8a0786
-35ec88e6a33dc633147b9a2a1ef575e86048b9471713e0c8cc202d56c7ba584b
-9edcbfd980a069a994084180291a695144ca4e0ad3ca947180f6fbe8a709a3e5
-401e96b74f2009344d43723b1215d2a145d0e1e91985375efd8e340f01f825a5
-a0d457eb5c5b7da3551bd7edafedc14c3b6b9bfe7eabcb38bcec9f1f94439145
-a32ffc10032228b5d1154d2e22d2efed471a0651c3b9fb04c1910052d08649c6
-3d5b987ef316a90b2c1bdbcca3cbb12f1f426bdeedc8107c9f2538bb506c7524
-983e3147012dd9dbc0dafc96c65478bcf8eed378fee8a20dc9dcb0f229088a1a
-67336bbbb67e68efa61fc6a5750c7b29b868eb5c050c493b97ad7dfaef8f75c2
-8a8092c5be3c1fe73d519c1625670c78c373765b2803b932dab26c54664699ae
-d14e20aeed56b0a70516517a62473369e6541d759522598a0be737cfc0f4b74b
-17d63a72fa6798b867a1cb133cbe5ea48401fd4646773d5c377628a2560dd870
-283ecba942f65f660a909811a5332596b84ac3e6b583a24c7c5ce30ed978ebd6
-e0ea5b8f534d586b97b3d8f3d9511cf39b0ac45a21cb831c81e8b78b7824b0d9
-211b916b64a0efd2fb710b6777a93874dd625311bbb74a04c734bc3c8298b660
-9cf371f8a04b6e13bb4c5cf308a042e4346959cc5e7209f5d7e2ac25911f4f2b
-b14eb97582f80998b77714e872260ca785293e0f67aba0a232d677515c3e5611
-3bf6cc8c1b0d13219db4ec3d600392cfba7c3c7602d29ee0583baa53c1601433
-76d3f84601e562b73e389ec97a1863bd0063c5b2edbb5dbf35208a9a19291f25
-3913cc05c4ea5fe74c591893b53bd8bebbed59f13bbeada69cb75d3b8fa31afe
-3172b85cc8863f52b594621f80eb005e0d038adb6802e1ad80492867eaf8ea04
-6b391ac713a3fc24c0e036066c8c1143491e8854a4e8d3a6eac1c063bf1cc60c
-3333732f67b43bf55b43631eb2931a9519af5b44127b432871b99b3621236172
-d0ec4edcc0be44702893c0e749d7ffd81ae042be89442ed0d0f45fdfd2a34cff
-d26e692dac3f81ccfb7a7676444b48a5ee7df7b37da76b1c7c50654cf9df7f47
-da61082b64748c038e8b6fb6dcc2d82446064d826fc2406c3398b5d24fc41ef1
-ea4b833f9c9818a78864daafff9bfeac577964ea167734f4a4e4fd85516a68dc
-bc0a64b1d406651c9ec70e97bc15f4d0fc43e96bd31174dd4d0d228897a01bad
-1530f486e86bde3b7fe8203fe79f3904cc70f3fe5b70a52cdc3ac40812974ee4
-3ee335e05a5aad251c22b83bb027f8fd6a695a85eed610205c395f7ebba3a6cf
-27dec1048355636242f23e74b70640c1affa52309879376c911b07074bf35f5d
-d74e2a963209ef85f1902784898da3d4f43af02744afe6679890b7ac96f3176f
-e1cebe8d534617401e5342ecc07e115fa5cd1d77998d30c28da15b763f1e9412
-d314c535a574d0584a257487052c4f088066ed99e434bc8cc0f975436473f9c4
-17588ecc0c37bf0901211aeb658dd4d1b30a8155ec7ce8940f059935cf6ddb00
-e47d4da7428dce12920cdd864ed00fed8a18c39d32556a2a1befece0443beb0f
-690fc9552f851aba3862083d820da90009c546c0f8d974644c3f2033a81bc38e
-9432837e0469329715ad7c6d910a8506a4135fb4fd6951dedc46231de609f65d
-c86d66af10eeff7a899f92ef897410d56ab4193039c558325c7240ffe9172847
-42076b218220db2011c9dc6938f41d08634c9e07a81e91753f595a2fbb72752e
-0e2eb941101c30a26cb976cdd181a4d8fb0187092773e56b47acb7d6bc7c878a
-00bf69eafe8c2fd1665c3fe1b6358e3b6fc761bb19d8fdb16b77272f28c0ddcf
-db4c7afd48f12daf1ccee639e8cce5234f7e60905f7ef178b39cd17a5f5819af
-bd6523b008e1e3fcb7ebf0a85e328b9845788b9743ba205ff3809cdff74c8f83
-ac937ab9b041f32e9ce0209b62d8021c5d05809fe51d277a31f531f8e62d2e0d
-143125b599d06c714b6220981f5e8b20e64bfc4be032393b308cd99d1cda5433
-aee558820c95db7f5ed52e60baf77cd27a60db1d6ff7c907280b024e3c1d6726
-3f3eba29035bb5d70090c199ec5682ef5fd7ce0563c453eca594ab0349fa32a9
-707df207e19461c79c33b3e6ff2dc5700cba1b297d9d215dbc3647f7920b82b3
-1e7d22319352e83376b373197e03c4c42137754961ec274a241c492daafb078d
-8f0b2c1127e57f13de96d2bc9be9b5120e063757fe6b05d4e5bd7566b22d79cb
-78c01deeacd07d86e961d0cb9db376d61d1beada56b1a629a93f83405c7c10c1
-eca67a71aa87d7c0d28e295a01fddf038bad9b0de720718eae09d7edbf128a7d
-da8d786ee0b16d4d21b3564133476ff42ae7d8a5347749ec2a2a4642e87e7b64
-e6166032aacb00247f1ed8f552c94f3506f9939418ea62ff14d3ff98158eee04
-24bd5e3fa77c2562cd5bc6c7f0ffa1838653713e87b1da2e1a4d202f04e60dd2
-66d6d48653caea42cfc43d05894d1173cee0ff773fcf9803c2e5c150385f0c8d
-b67532b4012fd89c5558b045c3026017fa4cb17cece11712ab0d617631b1a509
-6677062be9a1289736fb1abfd9630274e40393cc9988d2589f22612bcba6b339
-c961e5a4e1fbf411a7e719959a322dbb622c8a9cf51d6f405ebebac19e6051ca
-5b750d7506ec8a03cdcc8e62c6d7af9f6a32b0b585f66b26ca61e290e39e341f
-0b2d3784d104f82872ba0e1ed967a064f708aacfe052002972006fe14cd4963e
-1b34ef38b99be8a7a83ede48c85d5c71d69e0e4ae72d7b6b1a46bd26cc636dae
-815786e9e0eee89493bfebb89037f3bac832781c8b1630e31542ef7cd6a483c9
-004ab161038ac6aeb38b48b8293ad11bf441db1fef2a168b77d69c4a79f921d7
-ab9f1cba257605d81928fc46c43a4f93d39b01b07ffd0006d38366393cc64b18
-d8b18fa2899b9178c40f008044fa0d1a41e879573171478c147cf71731075421
-650fbb856eca3b36a741e2077245845e074dbdd2fcfbbc4581a2766f1830fcf3
-3255695d54307eac8196cbb693d536795388233829cb670ea78b793c4c9aeb73
-f7e7de4860712a5fbc17ce5ad07ca98d70eb3c94a79383338199a56951a45a76
-6fee0d58788e22740f2568e515aa495edc80da6a84a2797c198cc1f3d6fbb2eb
-893f79f9f54ac81b39b6dac070a763cc81959bab607569423d423fc8fe5f98e1
-4bcf769ea77c0d11e5dbe2fb539ce15e09b68349a925949afcbe381192be5146
-d28382fed48e03ee3221bec2aa8c7270f43c948320a3cd0b831e529aa585a7c8
-66f2edbc5b569d4d95e3ec52c8a7d35381cafac5c301508672352d9b0f582a73
-9564b6cca37b517019c7633561f33198dd54a886408080671e1e77c0d2e5023f
-489305ca314ef082008d37da60896f6c4094451ccc52f7ac0d72286febd7c852
-5ed8f36974b846d64bdad643db37d8ea837387e100432131b11d5c42e5ec117a
-d17b2bcceb463d68ae7aad5b877b076f34609146884f216716186f4cdf7134c0
-f72d36ef9696d2b53ec3a3149a5b17f45bad371cbd72f2699cd52636151546e3
-d22c085349f42ba0c21d90524a94b37168ff489efe6de3ce97679298b18eca37
-bee071ba1f93d7d2fb811987973864dfad11bb5c645ce0a435f1db7bf20671b3
-caaa89df0478215fb76ea26f00682f4656e63c358f3b0bc84c64c17c3471dee3
-c97400d051617c205d5815ba63ff38bf46f06a8fbac182a4ca27038b0c8ee103
-6a9a449cc5a9ac774dcb04bc9f48503a3f4a085114e2f190e57859724a8f1e36
-cf97cfcc15d196ef82aa6d2964dbd886c39c4e72e15d869df1dbce4169171f27
-68cac43be9c95e344bcf7f0af27b45d386ab6248608416be5f432d582338d3fa
-c77b80e9874d5b65658698e21bd2d4ba153f97d21223e488d4c5c2c8a7520e95
-f6ff8b1a19d4cc920de4621166a4eaea5774219ab3efd4dc9202c5225d4e6505
-91c475337f68a2d870375bb8def9f4319aaec852b76049401c121568f16b9be4
-ed27ff64c810b325bca29b5642438e259135f361419e8b5b23f6aab03ac0b22a
-348478b32e93fc448502b81b0626489f4a358702e7067b1bbde9448c4af59d24
-a72c83e0042ac510c6a91e5a9ae0a69d2be865505238e396006527756734e924
-4e883e05abfe0dc62f9bfd0e8025172704111627916379044c3cfe0bd1d7e2c1
-05adfc871ff2db60351210af676444b37ce21aa14f1879ae06efe7b4338eb55f
-0aa768ac12df6bd8b87feac0f48fdd26f6d2de4ad88e898499608cb770f754d5
-3571822bdb5de28107b378f4b1bc67c0106a24e9d1785336bc80d1da9636a5f6
-d25dc355a88023f7189533e4a2416755821a03a069681f4b0554ab826d2819f2
-a4cc0726412e1d2a0001a3ca49709dc21e7032eccab2f58d80a8163cc8129684
-b4277d3ad896600f610b1883cc973f8a975e328cf4b069b44e4d5207ce889bcc
-49684bb2f1eebd711c8adfd4607abced0fba91b6958bcd5874b01e8370c7264b
-9cfe66d1298374288f3d3f399700fda41a7b193411d1873d321e846b089a2e51
-0426782a79990da94d6182c912fe9752a93d6de0d37eee602f0907b8cd2f46dc
-ed1179536bf9a3b74c0fbfe8974173a2c630c7360bd90f9c697b1d5068478814
-7806f05c70da8a11ef065cea507de043415f855f595aebd10ad001a0b68cd5a2
-ea7858041a9f40f05485b0385bdf08007f4213ab76c70b463e7427b79f826ea7
-ebf94bc420f700a50a2bbf291c867d5b181b8738738bbb76d93503e7c603a7f8
-354772c516443fbd33382b7913840785e5ae794fe571eb3fc65070eac273f00f
-d12bc28451ff8be0dde26dc63bedb66acc6570fb166a583d796fe9493793baf9
-6a13bce0e7952fee6c6700a9180f5ba2d0cfb2963e0cc8606d48b9be7bc99c9b
-efb1a2dea357ba87d790c52f7a90a2db476bdfb93f48910ae8cb5e91d1d146fc
-04736b13a017ee2216f286ed57965d2017adea323978d3fdaecf864b51fc9aff
-cc24902e266b084d518f1f063a2d0bc625ad9b108e322019d1ffe9a26aea6423
-69edd0537d1097bbd66dad8d859e7f02bfb3a77762907f989cb8579a352a0719
-969abd926a2caaeb9db6852b1494277fcfef88795af85f0750856b9a764f94a6
-5a120b04e33aab0d36907b89bee7586021221b27ca23559ae68a208fca16703a
-2fd2f1d8ceff5274e64c441befc0ef7901e5ec1be2faabb271b3801c485713bb
-8846c95c6ac596046cb941fe5a5ef828ead0808f0dbe808e96b5c48253cdc9ec
-a0f946a3877a9a0d61c0ad150f50b186f841125a311d606cde70d36f7c03ae8d
-027f88c6b92fa0f2d2b69f15a1563d5c76a3db13f43eeff40c9da317e8e0c93f
-ead28d0fefb5a253a9e998ae1cff676dfd88f6d005b148948b7407cb24285302
-35313ae2eb809b59813c15ddc621a69cb03e022a71dc1212627141a77c2441c4
-39202c7f4b0937828648544b05288337535cd3d4d2b80a0b3241169c8898e4a5
-db36b8230e8e56e3d0cdb214df9ab611003063037bace671454a70c801aba2af
-35048afeb620dc4fea9975bba58857ce16d2439633989d9306914bb002b376cf
-00be076bead119370763b131621c4daccf9ee58226a014d05c428c70e28bfc1c
-e9fbe10d94828d9510c22a7155bd28d6abdfb16e486322236b678978bc49eb1e
-8572abc47de533c8cb98d80b4a529b7d05fff2302fa2b099efbe64f56186f14d
-56771ff9802f23c1302732931a28bbccf8016aa68241da46b03c352237bf0182
-90f3afae514d05552932233857697a0aa8fe291d8ccfb8d85c5790157afce28c
-a0d50875e4107cdc0179afe2290120c6ef96ee34bebfccfdc2d47de8cc301c14
-959a4f14717e9bd54454f382394d0c9d653357c683d65857be45c662e8468bb4
-8f916c8baf08d028e339e64803d910196d19335a65f83230a9e6c2be9baeb01f
-9776b81d665f0bddd9a1a0ca31a0fb126b1aed8ffcc297786bd29cca18794fb7
-04231664a4cbedb3b41ec2d9066e6ca9d1b694a8d7be8973e9ccb799f79ed2fb
-e63e114daf8c937e361d4b7e0fc4caac2b87f0c9406820e9448ea9ff98d053ce
-9d5a7db9118707bfdda8f701bf6bae1021ca34b924185aab0526b046ea4fa65c
-d4412f43cfcda0628f0f5790976cd501621f5ba7937e6c04dd6700f9b35f3a52
-62640ee4be7db358b971c2aa5df1dd7d090195fb4fe96c8908d24529228e7f7f
-bfbe6138f00143a76b3c09e29f8eda3d5c630aed311c3fc3c9c57b48bd070b18
-b44aa15009176d0ce7ec488c945c51b26950d522bf80226251fde456d1c8399d
-7fb77759130de5e1620a47f6e8eabbc2ad48129f32e97974657c8aa6cb2e7ee0
-959ff4d70bb8b307d2b6fabbc887c04a6e95a986ce189927fc97d8ca7db8febe
-e699d3d193545b1937082373e930af3db6ec7e4eb8c8e1d6e5615b93177b9a2b
-ce0d7616642da91de69b7ddb922a4f47eda748a71eb4662d7476ac5b15184acc
-7bd92e2542f853d72f1259020f66b782f83727224470405099fdd181dd4210f9
-6e8e28b257b8444fc35053a7da19361b01bbc3bfe0f8600e582620d1afbc3803
-56359cf6e9f1964635e0e734d7bb9a1e4c7d704426b8d2a0700411c226e13818
-f739cfc023921809d6b1c8639eae19f014a519d6b71133c3e12451d21aa36cae
-16f002286b5aee0bc46d5dc92ae3779d957212fb276d86cd0c6cec26c2bc2dfd
-cc2c9fac9ebd5b4c7324352806a0d9894a1e809d8c9c2b1a4b56780cdcb7a548
-fbc3faa955088fa50746598b134f64f4d88e8599cc48a5d5f86f05f898f5c270
-18d50d256d761964c12aaab06befc98a84307547b80839f8fb1b7e6553d7e522
-c641db4ebd8faba0f24af058c6de88f1ddf478641c513423513002bfcba37ff8
-2336a6ab4ce3d926ca060a4084f3beb0073bce8b91271a3b2614bc0aa19013ec
-694afdeca7eead2a6527acd348d00458649ac2e475e8349d186ffaa64f2f058f
-a8c94e7202a8141f64ca347dfc8a7ce7ce3c9402072e188c77290563b766223f
-deebc865fd7ffd4507e74a972bdc5ba05f1595c4603627e07871268392522a65
-93d3035b5f05e8cac3d90e3b6a8c8563baa8f13d4d8a878445d230f71c257ca4
-90d72b7697719b66b62055fb8581037905a422baa45aaf39efd0c40fbcc7109f
-dc2eb4bd0f4ac59bedd12f12deb947f2008088321be00902d555e22391a9921d
-eda8691ddaecb8be07ce75f459c1a5e9ce7c57386e8629bcfbbccc796d3b0551
-e207f6e0fa063e926f6c663d576b8d6069c022a51f9f9c21147c7afbaae7f697
-762db69c73cfc80afa498024870e3b7af96203caddb5520bc20db4b7da0f3624
-4b20a8110e753d6129c9dbba86fb5581dd9be7a021fb027f5f0ddb40bb111af0
-a019900edecabaf3d5cdf84981fe2a659cf9f95a7f1d5146a566cff83ec3523e
-919d4a6ae54ac444e1e7f0a56746850186d8461721656b54bb784960b5251702
-33d92e8c89680f0c71ecdcba4b15152f2c933908449052c4b4ce617fea02a74b
-b715828d499d2208d85ef7e45c08858bb344144802c885d102364e217253a739
-2f6442170b29f8e70b4b24bfa97c434038364a0c52084c204a09ea5d48873d0c
-dbdc712312c582f9a8cb516a5aad8e30b591566389be57d444ee22bf80a06f76
-8530bb9cff7cba7b8374f091fa17ff0c1755d6917b073a2e167a82e381793592
-cfebf89561f0fdb63044f7636424bd0e406d622f957c740e6f0d3884702badd1
-2cfbb07a20558193c10e5cf372010a7955adf5d7e16e66c732ba52e3983026f0
-002b39b62b628dbbd44d467904e8726e79d79987812f07ef14465cbedaa19476
-5692fa39d503daf1f3f0a3ae881cfbf7c6a0e4ec54d7d0572d810f8861dcac41
-e4efe176c5219721911c8ad2b3985328d49e4cc4380892a6f108c62d711a8d9a
-c44c46936b90e4d1e6fc9cb7d01a6812d11a5bb0eabf497d0d3b1eb09c2cbe15
-823ed1791d2199481c08c1f284bf72d428650319b881fcf79934c5ee86885b40
-cc6240cb1f8d80b0c8f221d8ca58c228d6da93de005b11c15fecd9450293e3cd
-5005cf191803a161dca15fc2d187f22ecee8335d58f21f69d15fbbe3c1aa3d59
-5a142f8c3dcb7fa934830423f072b0d7d5613c148a28806085bb7c18a8c53c6e
-43821aa5cff8497822b48cb09ab2eca0fff054299726499124f7b25973cb9c80
-936aece707b66985d7bc56f2980444cf3b1ce6a462a5b78ec05a036ba12e479b
-cfad5953786ced3f29d5f6e5b33ed9d46901de314e87b831c376a21ff4c8385d
-175aa0568b1ebc5f890a213483cd218194e15bdc61d51feac0401432859b5dcd
-253395df487a1ffaa708a64ce045ebf6c6dbb4c9acc91db63a3bc1680a697538
-f342ae8b6e022b1a4d77293f596365503d5aa34712345d613e92a3b214cccec2
-a40d0e3a80e85caea6fa0145a6489e65a252ce407fb0a3e1f6ce12d4ff4737ab
-514065a7a791f8d33df8d52849ff5d97bfc8dba6568fb51667cd3f0179ec89c1
-0d656aa50b2ff5305168af18f77a28ac8573d8cbd277f8bc08482cc0f23bbfc3
-c62c400c5f064143fc73b04fe2ea7d48f823dd9631968048820d81e97f2d6046
-992d89770073b795682fe2fa6a9356ef89cddbd94e66c7a61bc6d3a3fc629643
-2d576a90d30cd1fbcf3d511e03374ca758a245fb43ef5dd1dba49072a627e35c
-10f831569b3b1d57f8857aa5c7eb7c0a9767bdc44d734d3f0794716b23f64831
-0af49c83e5aeb12dedf627af214c7c48f325f1102545981025d38fa0bb579388
-cc5c94144f5643dcb8986714082941d358d35d2c8d8b3e5f731a9c7940e81a03
-e3407b740234a2e20f1a7ce7f32b57d5f25b1788bc242f732540f0344950a6bb
-6bd5bfe7d1d62b1596c7ac5796ad727a47864aa730e4fe4b0b36154badca57a8
-3651d37f4344a6520c67b41b3ef31444399933ef13f053627d361d7b3e5bd1d4
-b94fee21034ca389bb4a6cd73c26021b23784bfa0bb621a17a13217d3cda2b68
-284f41b869b70ee24a3acf909a67686eb95805c8e7ef912d0dbd5c3eafd377f6
-7f94b76bd18f35684f9c4fefaef7829534900b301a0eb3557a73fac07a977f81
-b55ac50a1386c7d6a4019a8c3bec9bac1d1d54e68e53e15bc58348207fa58bd9
-89a20e2f3396354723aa3c823a957a133286080fbc124a11a42f416207ae673c
-0773c54007f9420f92c6bce228f5c93248e4bf7bcb85bb79fc6694ed1bb7e43e
-219b996905f6501948d0575358667e52445ee9665035904804d45cf926d91828
-8f1398b668941950ac0bb6fe53bcfc9fda2945245aedcbd07cf07f85a7981b4c
-e9e84139a46ddac48b8421fe99aeb64ea97f954b758175433e584d60cffacafc
-915b856e26dd41e000c1162f76d185f469d3271887505811e12e1558d1ecc456
-2de5bf7aa4c26cab047001afae3c5d3ec9cee9dd0b5edebeacc765924ba00624
-ec49223ca7be92cac4583509aff3016bcc446e14b5dd7d9a39007b5d222f70b0
-a977e0192e6080160412b520a8e72f7bc93737e344f1c99acb3630aeac72d60d
-344d5ca010e962de47cda71d704587d266d0e584e17917cf528623677da03619
-813bcbd6d360d945068e74f8eedb6aebf69c6e2d2158b050dc402d55fddf451a
-d0c1a407154b04a5904b6987662af27231cf49118603a4e5de4d0b5ab40c7ccc
-71847ea1f330b2a54ce9cf1abdd13208a6494d36c3fad5cbedf46d423bb07e72
-8188f9bf937e0db8d8566efd8e056acdc3f5689c8e19a27be166a0edb07bba64
-3ea6b53c4632ae33e0616222a54391b8cca32d7889f95f0039152b8dcce8ffaf
-c0ccd4310fc6dca19b0bb994ee62e8085f3989737619c8c516f7a6a25f9e9887
-fd60a30ccea017e50ebd5a2c32c553d0188cfa26796ab530acbb3eb090f88401
-12f6a52f0ca684d55ca2d414a36228d88a20b2eec02d182392f0924987cf72ac
-92897708af33bdcdb18c7437d103fe4a96dceef7788284878b4876333de5af76
-4617fcdd491c5c8095d19cd920dd3ad8b5b71a375f49520bbb6355eac3a188d4
-fbdcd55619ec3b6305f50d818f6ee5b5ae92dfe5a7f4f209e9f3ccbedcdeb78a
-e0d055c3729429e9ed3787b52545d480b5380e839374983b6224dfc56bc8bed1
-47c1a8e7dfcb285aa1db7716164cb63bdab011797c1a9bc76e73ab86958f325a
-7b7e15e987e90622824f2a12a220893f47737fe5b5496696e7772e50a8cada3b
-8c826724115a236c082389390fbd27b6c3bb10684cc720dcd875595b39a47196
-058b06758e80443175359c3402e4e84ab850e42415516a19f6d10ba52369884b
-e3fa91eb9a38d3aa07b0aa9294b7301faca79b4a601e92428026c70a7c6300d3
-ec7256768b257ffebb593eb497cde45d9acb4b44cfdc6452ac1f9f612af2c5c0
-be0952971025e5919fe3836a145be9e264a8c7c36c658f2ccd1acc9bb96a87f3
-a84acaad0a05f932907451ef8d050bef2f693726396152031b1f796103ee26c7
-0551f75a9334d8fcad954997d05e932c9f1f3a96e74c44e04fd18714a03d486f
-1cf8ba0688599fc8e6524e4d9beb6816a4e2030d8ea06a3fc50183abad196668
-f15bfa80281fdcca6436b04ca4312e7feee8ce08ccbf90b1638b9fb57db07975
-5115f9fbc599449bb101a7709fdfba691318060f52ba610b818a849d50d2b11f
-bb0d8b5f859ec9ed3ece36411d3d58d58f14827b14cd5c2a0ec4dce72a73c452
-0e1dab33aa33ca4cd3dfdb103c5579bdf0506853a7d08821ce69d4614d1a7c67
-9e9e9294526b50cc284adf3eb0cac4f6df491756f1216105e5c25d898c70edac
-dfe0ade3d98daa6c07f6b2f04d3cb19d108d63b432ba6db41e68121250e5ebea
-3d85b413afc8d87b934d14a663a62b4b18841b78f5965eb483631b4232cdf87f
-c3159b354b6f70c2b595f46f43fca2a19667b0f91f5ec7a31972b10462a6e83d
-5affa53f7c8e4b30436f7da31b6c41b831b30f9d98034708f1c5c3e34c451bc3
-9aaff97ae2c477748c7f96afdca8655c9dbd84f30bc1b568c3f9b6f495f17e18
-8ce2286696cce2367abcdb42e4000dbae8bed2d6d187b7e9fd616a17df7bb16d
-ddad03b29d51489c5092e032b6ec2f365774810771e2b03ce94f5b97cec5a896
-086909f0dd481c8028a720977fc8fbf5aa62f6cfd91a798210fdf28b3df8f4f3
-937e7306048dda7c69aa5f4912e7c6192e72b1e9700a3fe380b3c9b63fb3153d
-48787b1da476fd22e986874e123e30e532167bb3f17323094fc84143ccb8d7c8
-b5ef54126bd9d5e3eac00459b3636803a6dd2b3673ee865b1fc2828ae38b74fd
-8c0e3fdac44f7c5111d6ba2661dbc47a0d13e751b10de1e1346633efa2607a7a
-d1db1a062202c4facd05e829e37661014675f2df3775d88fe44e7ddbb3aea3ec
-27d7b4bf413d54ddbe1957cff63a267bcb8ef99c27280879f5aed3b55c288e31
-2d3bf0c631894b30e0c3c8179f277cc63a395d98b66f99a87351550545dfa98c
-ae027ee68d26c098d586537a2b3f0ae3de112aad1ea133adb4bbf5fec1f1472a
-b941aa2db1318cf1dabfa8ee0a184398f9dbb7e6d29229830fe091b487f04d8f
-f7d1daee5253cb84fbe492a4d1e117bbd9107f9ec521d924f115441f3abe6644
-6a1d4ced84caffd29e221c1e42c7379ff700abe131de0f363226a90abfb0401e
-970dd4a2727eadb374f5e933ee1a11e9e85a9740e0b9a850f3eda6e904770f69
-bc3edbd52ffacc16513d4eeaaa948e533a8d693d184660dd89ff3f945ccd2d5f
-602cc243ab739b4d488e2577e58648d78716fad157fbb814e0c7991764a3e0bf
-9d6da3925e634a1fb3d6de50b563d90dc8ae3be33c6369a1a96ba6fb8c16f2a0
-db154373adff4e920c0b32ec6aee55887d4670a2c2340a12556e5b9d688fc299
-283e19469a14a8068efa9b489522e2f44c293278d138c732129aa7d97a8ee41c
-30d2f40e8a7e241ce4d1596e6a1cd065e90167a52aedd2635e7465144df866e9
-9dac70f78425c9e68340ea5d19ad3d0fa0f944d2ad489911eb5abebd7b48bb95
-6e8ac0948aa564552395de41aa2a72646fb369ae9d08958f759afc10185bab4b
-34349c12294abc6802bb1ebe3357f3b0c0ca227067f3768e57dbca68c2d1955f
-5d18a7be0b9805fc2bc4b3287ef1a9d16350e5997f642ed6a9bbf46a68aa0ba0
-80102f020e5a331fdf8217fc1bf0da21ea7f20e9be95c1b59fbb458e4a5cb47d
-b38fb3a3c0ceac39788794e47ecdd42b81c5f8dc6b6e9af7349babc8fa79fc77
-df3b5b303aa5dd5a2949ceac2fd202423a918f8355253f20cd86d49d8ac956b0
-2993c270fe41c6c7c4fba75b10a777191f33618e4158dd046c5ba0b145a0b04e
-18a5f4ca5a7662bf6b913975d6fa9b4d1e6b71f0eca1029ed9440c91edb1d246
-7657d9ecfd8981eacd537757a8baa5318631c688d1d865d9645b4e52ccb9db3d
-6549a792a1f207df608b6278dec2956a2b00aa3783630f6c516d448daccf72c5
-3557436ae09b66e0ef1f1156945afa125eae9ced158b8301f19efb2daa86a71a
-fce1b319f87f0955fb113973adeb7f175590020beaa16db43bb361fec1dcf3c4
-d21a58d9d01f40b86f5059c437ecf83367ea8acb91baf187e03fc51cbf4c07a6
-74c5f63e7c7f8400c171f93ac7d3de26d141938cfbd6163240565995f44a6254
-c840c1b4bd66f05c2c08b55747540d267deeb6673f1ed54ac99ba83d15d6354b
-1df05680bb93b9237883261a3a475b138373c573efef4011f042102289a50dc3
-1eac543df910695b1971d03c256f258ca48878e6c1f3170017e3ee97b9b705ad
-2241ac927a86b4a44f05f37d260f451c0fb10daed031d67872764fa273a95c18
-3e9be8497c3f68236f32027f8c01fd707d2cbdd339b07dfaef35f9efa1d43a24
-5aba59558c3c0b172e30c3a64ed18c9eb7141a00f8862583cc9ab16b9184e099
-10ff30eaf0638988cf54d6e40e2a0ff8e5832cef7dc239ee90fd1eb079d0345d
-cdce0a6d9ec621dc6ea7aec3eee09eaa05cb6505865b90274fa890bb64d19d74
-a618a951e3b6e74ae3c65c84cb5d48ffe4ecb86c859cce068c1665c7aa9d982b
-951b95e10c6ec1dff747ebb981b380056d9ec5125ce14266bf81036a581aa8f2
-3d76432c7e846bc7d737ef0f3b91262e7cbba277966545940c67cf4feb14682b
-f557e45e6f44b120c90862f3f1da74e9b0b35571cca2c2860168821289d2f836
-897569d072774cecefb2ceb1f55460ea5aeb252a2a9f653c8b646dabb7d1dd53
-1e1da1c098cc5e5e41893944ebc6da81ce44d8096813f4323e97badbf6c2a118
-942e44874e63004f7b925d6f5b3a15a42c6808062eed0880a8893c816dedf674
-96f49c25ca5f2bb1f1f49b178490c1ec6aec6bb3590005f40f339c7efaac56a8
-8f132f9943edabb2fd1f3b8b1ca97c90d376f5f62c5ec6b3aa6c88ea7bb28eb8
-687e8d24498ce4c7cc7c2dc4c60beadab36d50f0705606c4777be8f391b78560
-56c87740ed507a3c4aec3c115f837de4a620b2b8a028e9ce52213f3e7c425e0c
-a2756efdfd243e55e094020fc74b820530051c414a32129cea783402238efa46
-b98348ad5cbf27b1137ba5d7ac1ea2d6e8df85908325f75bfc130bbf0b1056f0
-f1815bda877bf922f7f71488cd63f22107ab224da5af9f0bd07526df7b78ea18
-223eea608cb614bd38228782a8f6dd42d559a894b814f08f9120ba314fc85d80
-0b6909c98735b0bea839012811ecda1b5ac66974262a232eb06daf952b70e07b
-b417767fd420961262fc68c7f9c4084fc324d1b7c9550db0c3aa665cccdf684e
-f077cf33dc707a148e325dd3fcefb13b3d531849202f83a7909406c1f2190623
-658c0f9e483b8ec4379f43360f31c1c259f4a8dd369405affa2fd4ff1fc6bf7c
-57be200df6f16d82fe62f9daa00d10bfb79fe0351c7d5044bb6e6ef64914651e
-c046e9a6e9544e7fb5a983007a59dc78efacd8bac06dc49148d0df947b24db81
-551c6e8d05a75dbad023f1c600f6455eb1783aee8e2841b63659c57bc309605f
-e21524b5b59865ec7eaf6df1cac0032b10b9736da197620b86125db8a97f6d7e
-8e305f92b4912641b692bfd1b98193967d2847edf3c7e1efcee96b1239cdd35f
-f4c843564827f9f5adc858ba2b911637205a9fa8312675d021b259f56342e9b3
-95d3ebf837e945c7f08494fc2960b92f7f6bba9bc2f5455b5582fd670e6500dd
-ce38653d5dec5497726c15f3ddf885302a430f9b7946bb9ab2d9efb3c3f81ad0
-2394aa54141e3849b5ed816a717044bab44eac003a8095bc03e6b6b11cdec77e
-979fecf2e780afa121e03278fc99d25c0bd241c657558ad88128f0ba7fa7482e
-e6f643bceee670e0bdd932290624086df2198ca3bcdbb976379edc7204607f8d
-b0f6457b3bcac7eba6513e9b8dcf6a47c075e7418b0cade13c43180970d4ba6e
-fcf574c4f9da83b289a7a6d2a495b6ff32316b905f878579ed5565f7509437fa
-02a28c87083fda09105649beeee44fd1a80b0092f064f7600d3bea4c549e914a
-d8d595d8a278aeb78b5751eb2feb3b8099ae0495eceedbd747361df15659a9c6
-4718304f7780a881472317605a38a9c3f7a39e03fb7169390a5282acdac387d8
-88fa9ac46d3885e65be61519c131016d65f85bd2d1d6b321ed9bdb5f7210c4f3
-62254ceb44ce75e79d8aebb96654a28e96be766c19439e26ffef7f185bf62856
-b0fde276533cc68618b17221426f86406a5b0c999f7468d764dd92a632bc5998
-ce34724e7ddebb53e9c125a2be5b2712d029afdba0ff9826583fd261c85a7951
-7e0c89058d87e2105ddd8ba7e277e9bcb1cea56d64f2ddb3a3e92751d718e18a
-e8eb8d55d1a35edaff938c5f6d95ec089c727953c3ff6de24f7fcdb38cf73ab4
-1ebe06a67ad901ba536ee1d5b208b86e692498215075abc3af597dbf93aa87b5
-84876a167d593c5fc0c487235b6cd349d3edaab4265da66f7c4ee4967768fd89
-c7c28a64c97e20c3a34973b9142314a1511a6fc6deb13dd451ef69710513f18d
-d1c960e712d73b1db1e8e534096c255c63987ab4d32e1a8bfe145777fd1ca548
-762f7b4f7447d03a61e770c12ace3860c6189b3d0e41f0551cf722cb3dc09073
-f0567d0be9f39e8bfb0f338d6efd8e1279cbd43f6c4a063819aca553c54aa234
-6eb9d433c5426bcb9b81ce88b557a2d59bc7863397a9994dd6bfd6c7c7faac38
-0b128642a86241bbf8a4ffe9887758f94a153d6b2c138442c5ae670fb50218d1
-fd57d841af8f328b33173e4b8ac9b6db3006741eb323a502045702eede107dfc
-bd4081770e3d07dcf9cfccb7e56e3f0c7da3767ac373a12f3164f81b493f12d5
-49ac50605430dafcbd4a9f49edca82b594ff829ed3bae596a825a618d49a96a1
-6b61f8e8b0e5b3fa032561747b96fa1935d74d0130ae01accb3da668a887f6d0
-9741836de17dabb950d84738dc5ff722838b507dfa7f4a88de4d9aab12ff9a34
-1db27abb24fb8686161443341a975cc810ad1a7e352037dafc33682a5556e6fe
-46bcd08277461c74caf2ec1ca2db253d82dc72ffcf5cd471900b7c0f2390aaa4
-eb6196020e305edce04643a2faaa4fa9df91d3e21121da099ce25975d4c950df
-f59f5e4ca3f426af7b33b958ed1ff3e1d1970eea0b97da7212e8a42124372638
-cffdb6c5dac17629c3d04ff2344df5cb39f6f156b6b8a4bf38c77d421a26ed40
-eb2e4e1d274ce7b5934c69506c1705ad076c58ccc5e27c580ec2dd978dd1074d
-286163d79baf91e3ff30a507cf1c1691f60e28c780b8f2b2cd7a66e18413094d
-d4381a15cc3a2b8ca189320df07dd3a25580dcdf91a2b33b3d8fc89ce71cc087
-8c0d5d4fd12545bdc7fe4af1b9cba1652dc8c076df6dd029ad8b09d75631b4de
-63b3ee38b3d133d0d3b7d6c991cbae09a8aca77ad4e0351ad54d2a4a1a2c84b6
-2a8dc9646ea4cfd1b66af0707eb5fcffa78223898c0f377ad55e5657661bc1de
-e331cbd9fec4677181d3577978ec08dbda4c684cd0266ce6d1e487cfac64ef84
-62873d034ad7d22518a7e767ba80e8514317710a71a228f76a66ad59b345c4db
-f03e056eb6c9b2c444f2199c8488c037c37934d449f0049e14c588523d9acc78
-50538da9ea98e537418f811afb492818c285bdb80a31987b41a1671a77ab530e
-be57d8b71b6f9c95f7474faec60705c2132010887ad668b1d7d53e26b480590c
-28367553ef4cd87ee973a99346fbd55a2ab67635dbf2df12d4ced638b733a921
-4da2b898cbd41632807b34fafda648b3c1f53d0e5c835b0cd3803ccb34a447b7
-6a5bca240cb0b1db849d40dce5fc8f2e3f711ff47e7b0e1a71cabbcb4c42e265
-1f482c194c301b4ffde9f787f9ac37c620ad634e7d1bee6bf1dc92acb38c1e6f
-fc4f531f5e8959e55c5d6a97daf9b11841ee4b14c4ba58e7f0dc9aff440e2a5e
-61b046b0d47d4ed606b4055077bfc0d7c033b3e4fb817a02be0891fa360b6205
-8cfabfa60198f426bb7ca31877e4273912547e1738446c2816ccc6b796898310
-ce86f1f01654cf02b7e6f647e9a884041655a76d9d646e2e0098b15123de9ece
-8580c5e8b36946f2aecbd1922d21d15092617486d2a7da0419c430ff83a76428
-d183c15d0520b821c22e0aa806eaedd6df9392b6dd93db8f22072044883f7102
-dc2abf3ab094b1cff83bfafdbc0f115d1ca965885356039bd90c76a78bff2b7f
-931ec1a762b750146183f4080b7161d9e313c90a3d0ba031dca89f5155ef2c77
-d1e9949d07a2a318ed5bb9f43ea2df854dd15c45c09595450b0cc355db139f6a
-15792d516ffbf05d2ffde2ccb492bc5f8582c88695eb42ff075f1393d04e19e0
-5bbb51e286f578ee126792068106db3960ca7e7da8838c52381d1853e731f46a
-fc759825cdfd1c50cca5e63e1a24a9d3eb21a032cd4333648ab4b6725ef7ee64
-4bc1c07206312e241ae8c4206f8d211752ac7cb76f2569e2213c113a3d4f2277
-2fb6c2df9461da1b36a0860cf2dd52ceba0cb8fa5134d94438458dc4ef566166
-0931f0a13a88452fabba8805471b38d776fcfc616c602f91ad0072b92a13da58
-08f716287712de4f6acc57630b3c4343c37c5156fb610f2455795cc9e6804de0
-c7b6b16da5b274460bdfaa1a5249a3219caa1dbda045ce35c3b34d628d0a6e04
-3935f09635d6063592dfee4e8713fb04a74e0bbf8bdd6efddd86d6eab693df65
-d7e71b96d3ab69d78763f6c06b6ee1fc2b8bfc274d33e58f7c13e46f884f64cd
-2ff2091d63d8d0d2305704d42a18c353b55956f11057a920dc00a5c78ee5c61e
-0ab73272866a3b5c6a46683cd4f761f267fc8e98a5ee0e55a9d8cba48cde5215
-c96d0fb18f757705697c13055d7f2af893a097b594fc5200a1fff0d231487f94
-c6217ad21609874754afb8de70a84f92eb3999ad348ee6baefb476097ff1cb8b
-dafce224290bfaa04d3184d02ea2c8525232b1f62d8a3ebc5ed8d2aa1f7b009c
-83d427e281551583ff6d1690692648d7e65e7c98b67c8d181ce0736f1518f150
-9c2b13ef0135118fadb78e58fb01f90fd846fd9e7fdea4a8cc481333305b1e95
-4d0037fdfb31d34bdaff1e1c0ad0f30683bfcb8510c30eca21008147a17589e7
-2a8b2971c2c6e8d45259be84e4884fa79791f7bc3abfd138b8b4556bb75e4f68
-bb934676f740e015396c5ddcd224834f53dcc17fb33bc79e15374249c1d06a1b
-f20f3b29858ddb1cfd470449e098195aa1a64c187fbfe6488b89db49851bab87
-c77b617543570e105c27e7ac73583f02d0541afd6139ae5ebd8382464456731b
-6779788412dfc026575e27a197c5295e3a261864c9aa91442ed12d3024db79cd
-1025564f9cbf5686244000bf2caa92df14db97bd2a10535891ff3a84008209d9
-cad7566b8800ee7287ede867d79ecada749aa5e7ad22b01a9f211ab18e5f755e
-6736bb2fdb47e4152aaf887aff350a7a74eb69430287afc58d46e2c171aba4cc
-a01792b0dd4b0a67624d82b71b19c331e355a909eac5bb94802233e6e3310f97
-da3c5d40ea74ed3ce0d283233d1c5907fe29dad678a9c3309402167881d3daa7
-4e3fe4255ac1a73f15f90ddb601d827332115538f1bf93811a35b441e4442327
-d7fa2dd901f3d66b7e79e09f83f9bef5f5fe1c01fee76381ad3394861155cd08
-fdf2ec5778e4cba57acdefe6a35191c613cf12c946ad8b2b40b6026b5bd4b9cd
-909d1779782f4af32d295b2e8f881a18d2cb0570104768449ee2e960f082921b
-e9ad82731065b3c3ef18aba3f9beee050545d766b4bb012cb05e36c98916000b
-22f7dd0d60090fd5812d9c7e0b7f109eeb4c225c9b6260f687a39429e4ee4dcb
-2b1c5f8cfae108e005887b30a949df06bcfc34700b69a5103330e400e4666a1d
-5c758b6d5c2ad8a733882ac3cf1e6a1395534c3a9300371d3992436227635313
-531d453ae6142bc47f086f805faae0543b21d52962343b25f64bd46ca8f63f25
-bec767324d38576447056a6f508efb68e491af661b46f7ba81da215fe797a16e
-f03cfa53db0b51e39a7c71897ac5ba31d902964aaf3b148e7ada10fb7603d4c9
-b1585312db95625d45a286228dbe2217d6bba65c9a7dcbbdb7bacb5beefa3c8a
-43f848f473d9bf37abe92a2ca91d26707ac230f577f7a1618a02d2dca08bb84b
-3343f9175ebb3e89b36a46eb75b83b62df50b0108d6118f790dabbde765d53b2
-7cac6abe7b5440325adee21be51b9367eb9cdf8fed87a081679e7ae6aefbb6e6
-589cc42556fd865f312b54cff53284cdf8b442c4b3326eeb8d39abb1e0d2e95b
-316e87b7615b0c37e908d4391f1ad9d2715e94bf8de57a1c624512c23fba4d51
-9150b26a4f13be2e9ced538d80ef807612d561dc8d3f5b602f4886b8c9f2466c
-5c948ec6dae5b87d00c03caff6c7c241f4b965a6c6368a30013ee2ad5e1e5000
-94308aecc238f659e736965842b290ade6f05b5152a27fbde7a90fd97cd59509
-f5f05fab13461bd7374399bc6da554acd718e4f67d8696718facf56d5ac10468
-cac7833ba92c74bf186ec50fdbb043223974986e2012c1d18df40f5a9c52fd39
-97df5f9e5f3a827d50b6ebd6909e7a0de29fb97920a03e32422cd71d66bf5c52
-357a8d8eb241c6c8be42b67cfac2c3777a0fa43d2838db8250e2b5b8efd3c367
-80b19339332f67d477cd3600b04c05b87b7a41d0def6bf82fada771804a5a756
-bec34265b6fc9e11790f8d1306d36c0514f6bcc76e93b584bdf86384ac22a96e
-31549eec68909fd34bfcc467cc742dfa628b15abb7aa6a181dc3ac0fd08a2097
-9480abc06fcfbd81e7d4ea358839db58c30c3a7eb5d698cca371f7630939149e
-b897b24f6d957c084cf0e2932331fb5c0b501068b4551812a9b9abd4ec27df7c
-e824d672ffe6e5971ecf816f447482130819902d26039390f84fb513d2d89662
-defd5725eb153a074c84dab1d4d666d6e1a4ae2b078ac16f80caa6314a1f63fb
-6d7eb530ccd833ee1f4946790344ca86668cb3de69c3013c73c971d7bf583095
-539dbe02e8f18e2da3bf9fde9cc5a5e859f9e5bac8721e36a1d50192140ed21f
-a6fcc212ed167a50e940b38a0ab78d3053507500d768d1ea9c7bcc7b3100a05d
-1db9350ee33c7a492f4543b45e25740aa99a76a1dc7940b8b52883974b07a407
-df7560cdf1b103c75746fcfc418580816597424c0aa36e0dd38eaf524e593512
-174a0ebcac0488958b01c1199d786f93ccefc14d219b2dbabd5b50c57ac6c195
-fe51a6fac81db1fae5052f21b3af4ce8280bdeb5f27e15f069ece57b0b628858
-947ebcf41c69d0c023d67cd21b9e0db1366ba5abebfb9c98752a6c63cf1c8333
-d7185403199b82e9e5fa15d33e646e63459352f829fc039ef185e004cc63fe21
-bfbeee4c8102cef70f56aab4e35c4a7ad51c85d985f42d54e4cf5678ba7ef4bb
-3c768056fd223fbd6ae0a390e0e7489f5582d4ad805a6ed2e5cc0502be6f58ce
-b1e3de8cd4425a053f84ff85ca7a1b9c679b9b57457f91c441d9289469255452
-34c45d58ae796a7f21b960c8dd3195854ff59e6914dcca262af6e5db7f150976
-b91527a1f0f00caa0953e082f5dfea46c0029bed4eff22be6a32a9bb591334b1
-68da599128f4b31034e20c0efd5e532b9ded85e5633ae8631e83ec1d6069ff76
-aa302b99f88e0e4070e4b93e1cfe528123928ae67733bf6fe6068c22328f16ae
-3fa5b130d9651b531ea4e197ae3d3c16948503f1842d967eb3c5504e13986933
-cc0a3228269139d68aaf3480875149e25acd6aa8e14f5c21fd12096e274a1cb1
-223159ae0b531804c1a8f8dbb9101d3d0e435292f0452990ac4a646058651025
-3ed58cc6fc71eea6ea99c6f96f029b65f1c24cf911a35076564cef64dbbf82f8
-7de0c4f2faf3e56a1659d2b56dda42a3f63e277645b9bcd5c92c05c8b05adf75
-35b3aa4c341358c7c7927b8e9937c087e5e142b14dbe5e5f709634ae97bc9f2a
-a82a2f3c3dc16b1abbd1e3f33559f8670e1dc70a9e3b0b717ea458518357740b
-75a9b2b9cb076e81bb95d786d4720dd59120200dfe860b6e40f2c723dadb84ba
-e83a80a7c874b9d36a1843d3ab1dc330eb986d25d6e036940f89670cd41d7ff2
-0a9e19ee36a1c334c779093950bea2854369f4ef24dde7b17e4581c9c2f5e5d7
-49bfc7a6a9433ef9dc465362bb2b252d7505369b40ab4ed1280c690599765d3f
-6c395d4f3955dc9e7adcacd0f85b34e33c1d5b0da79e54132e115002728fbcc9
-def9ad99c3c72ef5fb77d883f47e417bd26cc8a13824297bbe6102cf7f60013b
-3410e61d06f4d9afe6d9eafc92b97459a0433a8928fd24240f6f3e388373efac
-1bedcb5dad56b55d248dfa546329ce77f4f94c388362e836195638066d636a1e
-9de34a86088831a498a52821e2843d704bc01d386e7f268855af107ab35982b5
-9a474a271c205b19ef717c66cdcfff8e53e207c2c1fbfb8129f045f0c150a053
-33787d5dd2d7322b3ec6f9193a891c3c1b414f27fea3635a1c1d88c21c18cdc9
-1805f3214e8536500b67ac22ee4fc1aaf6a12be4f8fe82e021a734937f0a05eb
-3de81d728121fa862a4993320c1fafb719ef1851929ac2efbe7c1e8d2a3e35b2
-5dbe28dac5ddce834663b196e17be78fef40be1ff3885293dc9b6db2a7973408
-0730556c0b64d66176078983b062cb073d32000e12e8cce47ff23f877078b5a4
-2207a050c62e39733bcdf87f6b71e39758f531cf55a874fe76548ccf8ecd227d
-9c0d76da8f0ea5b1971e71559203f2c731bf31f9563a58d6d110ea507bb7734d
-3baa443805c67207f3337ffe88e0a052eab7b73296e7011fbebc3984abf53382
-1f38a1483b88eed29606b25619acf5e21e6764dfac4559e8ab2e8b987c05cb3f
-23f7a9b18fc54c10e59b1dce3e3bee7299f9e98cb58df0fb48aa79c6b87476e4
-bcb73de1eb9603cef10b6ff191174e23741cfc9711ee68311a8e739dc52a1b69
-b6bd1afd81df4f6b1ae5df916faf6c6fa778f9330059fb88b5e97ba8b864e485
-b2747a1a7cf32e259ab7737530e55b2fe980ccc088c3f5e2815e960beaa9ecad
-530436a2c0b86f3c3aef098a8dd927ad13f9ff34b87a1a9f07f455b913cf1147
-270acc6db471e53dc3715cff25ac42d6786c3e9d90ea77873b301cab084b1472
-71c0cdd6e088bf710114ac00e1d6d215e5445605034b771390d0ff76d2f7dc34
-1a065f905f258d223b
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/courb.pfa b/lib/fonts/courb.pfa
deleted file mode 100644
index 795ec5cea0..0000000000
--- a/lib/fonts/courb.pfa
+++ /dev/null
@@ -1,1966 +0,0 @@
-%!PS-AdobeFont-1.0: Courier-Bold 001.003
-%%CreationDate: Tue Sep 17 16:48:30 1991
-%%VMusage: 58156 77080
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier Bold) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier-Bold def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263788 def
-/FontBBox{-48 -288 746 847}readonly def
-currentdict end
-currentfile eexec
-f0e992e2abe69f26883d6a2f691cc4ffeaadae4ed96950027b000a0e04f88bf3
-07a055997fc4400b46368da1c0f572a6e1e58371f4770d8e09ba6f39d5948f18
-de1038883553c352f8e6add2a9df060927fcda05454a5bce5badc6153a92a950
-b91e671de818c860c77eb6b93cabe55b175ae8265971df2c78d5dc3bb7a23a3b
-5eb80699e4f540d2aa0774262097e2f171f03b3f8143143f7f192c7c3ea4b3b0
-d0bfe6893744a6ef8f3fe2071efdd77eb2ed6a1f8365d33ea9a2e3baccbf0886
-890dbe8fd6ec2d9db9b8a11d6f0c2a5ee4b84b2ed02498706a8c6fda02e1ac8a
-e43fe22852111c257d9da8a8d69c9fa405341c435bb91cf627e7ced2e96614bc
-ff826d0ceae4942a5c8ca794b11bd2bd48dea7cea631afa4f7c52cc775c70f17
-4c36dd977c5cf62ef80ae874fe87bf798674a7b32d84da7c9557f87c4c8b7b6a
-a061b8d1f83190fb4df552d2742fd99986e3e33a9a4c578d90637f42d84cd9ff
-0e866d419216ac5de7308e8b98bf17ff95383454d45ccf07e90cb1a0ce3b51a9
-dd88c2e2b3dd662cc745bb5b4ec33418a1e4cf6c9a528e6c283c34b24da3eb52
-4431c4da3cb34a43339c606956778e666815be262bd069b1b5103abcb91f1524
-5bf33428d6cc1d3e146f0c711336b471bbfaaddb4e1951c8325801c2898c6dbe
-b5d96418513226315c9c8bcee2f3ebc1117d5e136d8119839aefb2c76d8c8a37
-cea1d23467717a8398f2437f1e61a2dde224f07e835e67950bab0542fa635ca9
-9c457e420ecfd17797a5ac7d63b003e4bf6851400b5a9431d9e4746525107c4e
-4529224ad6f666c7b4e8419a3630ffddc5eabfc0e3f1c089004b79b6ffc45d19
-7087ce92f5691dcaae4223416a9bb4836b5e4d3963dba28445d81ffa93d59c14
-96a8bebb0dd93230a8fe36bd1a4e31d3be4818c99815e7ae26023e5c68fbd21b
-334b178ad4989c333c37de8f821bfbbacabeaaf49a38e875a6fd13ea6fe45235
-c96be719db5725ec6e507e1a64daa56bafd017460730b9befe29bb27115968b7
-241f56bbe5e1c787f3ffb590da9c3965c184cc5f94aeff1ea7b0a013caab3bd1
-c4d41e2f61ab5e2eaf1e9c075ca3dc040f988ffcb815622c7e0c31ed670a9aff
-3833cc7707c2887f0de43a590344a70e014cc67dee79bedee7ae796448e61c74
-02f2f7e72f5db644c2fbc093f5ff5d6a787194de10423849768a48d56103bddc
-598699a43094dabd1934e8ddeb284b9651b9ed215c9e3b5a63ac766e29e7f0cd
-2a4f010df4b1114115ce819af6706107be602a21d002e1c45cfcdb568a1c617a
-68c25f2e3e0781192c7ed85f449b56caee4ba991e1376ab43c1c556708e65797
-ad13dadd61ebfcdc57dbb59771fb0c8f0b4b829b6b4a575f17da658fdc2a261b
-87fa8d8f39540f3b9a0cf46b59341ad320f37d71a8a9811f5f24b307ca32ff6d
-e80b35ac8262334afed2567d691d0ffd933b26b977ab624d2757ef20e9ecc3f6
-8b0bb17594fad3c27fadd8487b441fd520c8feae3b22646d71073bf43ce3597e
-6063e073db9ab0ab98128b97a84482edff091bc809452f0b2a37b26e5f9963f7
-118dd4f78d097efb864a5495f0104674564227145d923fbf39d1e85c78c8f92a
-e316bd6b70231733d39c10590c070d173c7a4d10e08e63303a77206dcf01746b
-1f78cdc44e06a26191024686d64436e519ad103349fa496e4159b3a436bde5e4
-20bcfde3d3cf24f50a1a625ee6274576104a3ec62c0abfbb14bf6dd280559160
-887cda1b88edb9dc2496813cc21e7e26fd42fb6770df364096d34cb66ccf8a40
-af4530facc5dfc5a672f5c893ee33e85a88113f2f19d1a40dfdbd2c1f7e132ed
-3a2607569db81e7558b536d131dbc71f55cfcecb31137b0d807cb90b2df7eea7
-6e7790d59d7ea4fddd66247058ace1d33f6d8cbdff99be2840fca3727307ef96
-3e19cf0f08e953c85c4141bfdd8b6f6d942389ca120969c69f35c10738f5bda9
-b872253532604e5058fecc5ac4b911b3602546ea3a3b5f84dde99316fff9c1d6
-08b59bad54015883cf8cfc01f9828b9ce335aa26dcb5c6f445770d0fde2df51b
-83a128c79d7a1351e6da950c256bf97c69f73e7161692c192778d3d361149c40
-9c27e97562b7e2ca2f0a498818571fc7eb9552542bf56c93862aa9e06839d169
-ad983d0a370b0655d45260568ebd3cc272c344a3d0697e05e27641fffbcb13e1
-aabdd1cf7f24a5d550700c9129b392746103afb0ab72e0f0305ee21eec6d54ca
-bb0e5d92b7493719bce7ec85b3f683ceccee4fcfffc7d127ee6e8f76e7ab578f
-80933ae97405f4e25b793eeac86057448882c70e3497d430f8e6af1246a38a42
-0231a4f8bc095b87ebdbf6b6e5f0e9e824595835e06224fd549b55dab5d72511
-a8829822fbe050dc7b9d952a1a8274eeec665a7cd924718bdc21747e43ae8cd0
-acccb305a78f6c201916d5db4efd23a890826b74b9402f141de37d254d7656e1
-093cdce592272ab46e2c9dee9c100e7fd1f3a558ab7eae233b167b447bfb56d4
-becc14a403850a481eb75b554adddc89e1e2d0c1a5ecca30f7c2183cebae411a
-28ddbe48777e38e16bb02e1f62d1f9a090427f47a5da5bf867c04ae679617439
-b4674e92d80f659734b10d62ac5fcf1d0aec16297c11ba085eeab1c4a7017cb3
-d9653f6e8f77056074e3933e65ffa2b08acfc8b90599ed85f5d91818b80bba55
-6c05cd944be5e6d76e00f6df048992c4b293b83fe275cf4231cf0648f26a0d28
-0593ccb41a92b97c24a39de7886ba7f53924743fb66baa4c01ee21a16c66561d
-4fd8cfd7a7e7f4386cb6d818277efb779b2b219adbebdae898083d26d561e797
-14553ff7b1df6523f5c50c8d7d4bde22a4c220f77d9c3416709dd5c4c6a2baef
-71c8a7f65eec53d15ce0112e745418467e49172fc5cb0d5df2c000b3da184ddc
-9a3b24e4e4c919717c9e348a1a5665d06ee268303c11ddc16078fa8424796663
-eaa26915db69cc77126df2d80dde5beeb879b9c23ff1acea4dd0584f45ddb29f
-bca6f48dcd420b2fa5e81dfb3be958c18bccfe7c6a61016614017745a0f10a03
-ad4f56e670ce0a98a227feb9fb28b1b952c4b86bafbd9210ab745828533741b8
-4efed05f94d0aab602b37d7e9ea944138c541463621ce3ddf0ff99ae36f8b9e0
-c14ee7820eee3a45b8d69e8f65fd2288e6f1b7eec5c2a45822ef46148db12390
-e87c7a2708cf346e04f0bf81cb5623a92d17405cd0430df9d3b7cab3eb6115b1
-d18a1e8f3b56f1b93322cb091f1ad75e1e12b36f052592e6a0def7f5dd9e18fd
-2f52ec209488ca7a954a04eaf4c6c50d2175657755512d43734ffd5a545cfbc6
-f9b1e740cc0d3a171f46d0bfa29a55287aef25886ff435f9921b714c0553f566
-fb8dcf761180c167b014b57ae4428ba4ca642c0a88226aaa4dd86f822e93f19d
-3ddfa9f26b2a1079d87cd7b3c571f989b92ea58fd6661200664b36fdfb4afa4b
-5169c09ff2182a2c973b8fd3db31d1eb306957cfc99b6ffc9c060cc2c77308ba
-7f09373339b2a28eca14f263f91be194705f9b23915e2f6d68ffebdeb9b2da73
-ce80d19411dca457ca50870929f48c8d72badaf27fd8d64cbe2c1ce900cdbc35
-cab95fef9628f6c87fdb6c45e61e3c6b5bc15fb2583dcbce919786278ce3b691
-c0934f10c953d259848784fb9f325ee140f1c421d6d8a63ca4096c9c1ea6a5f8
-0476a9c4505129fde53639673371e803e60e3d337de079b2377d0bc9677734b1
-1188a98bf1d009d0e82d8e3d8817d465d568011a7c59fd2ffaae8d93379d124e
-91b182018b5e50b8b7cb0cf1f914edc6b44b38419caf14bff525a4a5790e85d0
-0b7741cab4dc8711985ae161a253f878e51a453a8c4b0a6c84f533affdd0aac4
-3e6744f1e43904c009f4bf3d8a677d66659108b526ecdc0ad8a51d16de6f8001
-4efb474aaefc49626bf733937c1d25f17f3d30abd35e074527e26056b3b4e0d1
-d1787939b0c8e14edcb4061ea004993463249de82d73912bc435c4d792fae794
-7b99b3e1ab7e5e1018fbbf1003b9fa965d43593fd0aa1b568b593d9dae2f6acc
-4a8b8d6d8b6b5d5fd2aecc392c7cb83588d250050dbed3b32df79de71ec1984c
-e841adc77597be223a79a37ec8f5ac91b45f40943932bf30b77a82a2c62d874a
-da8b86f910f1269ad594d5ff033724d3101098630d3728baf72fc281d13cde34
-fbdb8087c23d86fd0cce3ac530c5ebc086062ec32adc8fc2e5ed66f38d3b5a07
-d1f41fe240b3065bbd5f848d6c97f8b2ae149d07502166425d9285f9b9929100
-cc3b8c824c5ae124157f21d63c17d75990740c8e083540c0fdf55ab6a6128123
-894e6846d8f7098bc76ca1f696ecb31cfe5496ce20ee4859dac102bee4e9285b
-2ee0d97409fe5fd5f7dab76118d8394d3c4e91fbc3a0bbbbf314d91671ea9206
-598129e121977b36e97a9e7cc3949bd6aa7e92e58ffdbecc7bfa8712277d2b8f
-8e0f6e402e5e05b70db4d4d18b82a92dab7e712749b5632e62aaf26988f4ec20
-9755e47826073aa09c410741a8cae9ac19f0695f61db9552db60bd1d8dac78a5
-4a649f77461f7546fd35e33ae5c918d65418aca54cffedab20a86545a7d7970e
-1ab75c12d09714a37fd516613f1e9ad1887aa3566000bf8a7c9751ae22ec3be5
-5f7e8c58229da2944051ad23625ec7b1c26e65d30de52ab5fee7a5d3184cdf0d
-4acb0dd78ad3f79e2d6eecf19d8d45a18848611913336d25267ead7b1fae93a0
-c123c0dbc44f0178a8a1c31b8ca54827b34925b7b1432a029380e9571442a77a
-aed4dd342f6bd1f1b773a4f1ad1c0d4c955a1faa001e2ffdeeadc86282e09c8a
-ac6b9d886ffc443ed05966952482a7ef206e891c90b9dff910884ffee5c78de4
-ca40f6ce31bf465859c27c7b942246c43ca286dffcbb08ce12842f32175bfcb9
-21d324e0746ede76064849874534bdee62e99b2812d07314e76ea833e491b01b
-7dc009f842e10b4876bae3f132f8ae3ac04304dbfdcb2785557e7b48c45d940a
-45db8cdb374097a8c745ec7951e6e12ff3c51f0e0c8e7a82d3f77e90baa09658
-311167e0a688701bd62c3a598772e12c107deab4fc6ae3ce2b81659593e63734
-2bce989299c0cf8b815ec475e6b281e5d93725ab50f2881cd14588ba1cf800c1
-4656537f35711c98bd0d0fffd6fb6a1dbb5b8e3f3047d0ec60b902a64589594c
-904f9e4ba36837f774951fafd3b9c99b0a7e643350fa50fe0d69723493507b57
-6dfb9c9befd7dad68d2a094abb1a7c19d8b89d6b5290af2f774dec10699beb25
-9fa0bfa8d76cffe9ccdd9a56e20dbd043bebcd61b4f8d795d6f273705ef0f664
-02ca640413e2b97f721d16ffcf103a49ca746d4f166b3a241a9d35edeff5fbb0
-19af2ea1e4ac319ed01a39ebfb2623dc69470d2c7bc38e876daecda4888ae494
-28e94d9377c2634402dc988423358bc949db18d55388126c982b5965a9ad5648
-c12f46f6e5e6518e323d685011fbb99c0456c4566ba542929d767c7bd154454d
-75ddfa96c0e5a79c6bad3d0020556bda8b74e6199f327b0e17e5c3706c2adf05
-2007f91040a0f256b4d9748754638ff019afc766b12d937551b1814f28de13b9
-78344ae18668bd5f2792f7f12617043e40603d7474677f0b05967cc58a0ce610
-4c7e806f0646e6a631595384aba225d071848b176eba2a4232a2af75faef21b8
-cde74831d96c4682bc4c285ec5d4e1433b2750de64a9f42d0ee379908bccf699
-6baff1d5e115eb31e88aa4f123f4a9ab2ec71f3458001e53549a5bd512f27d50
-2f75d33db2732674738e98fd5562107aa071edf740e6fe4c3581f7f1a6bdea71
-11878ee1514d2a764770bca4a1db912ff98d26b7540915b03811844bb606fe66
-3d5de9f1b8ac6a46cb328b66151d5a7aafc5dbbef4931a94409ca6fa9b26c970
-f275431fbb91a35622d948fd939e56efb989f007b0d68b012a045ff725cde14f
-9acc5df8b491f21ea3fc8b2b435eaee1ad74572cf52f1e913d44f4aef6df048c
-00375d6734d0e829c0fed80358866c1988e3c09c7ef36f5ecfc0ed411e0b746f
-6b04d7cb5f7134921969a2751074a3e33e9a7e2e68f501e66b71d3f68f7d736f
-7c4cf241a6494045d87f7011a4a67279ac40d5ebd644e9fc56a97d5cdb31dc2f
-f047589909a0a4517d6057e668f3594fef45bcdf30c854eaba5c1baad26e647a
-097b4a0ab8538459ac97d822dda5827d96f29387b40f4b673bf3dff58b6845cd
-3fa300b8cf4acd3e6301f5a47f1370c8bfb8bc8b3a961204e2fd696fda87c16e
-30ac81f9d77634c5e8b19eeeaf9ecf43637aca16051acc7b63cf5b4fc157554d
-e510d2a8f1c65369ce48c3233c445a0e4a81df26d68a2dcbdeee609e81affc6d
-632d584b2d1e5939fb0eb3c6a7880ca593e99bb4d530445bf552e9f7fb0bb25b
-b13a151832acb776c7768ee9bfb2d320c90d746df806bd755cf8604b2b0b8786
-052c5e8d2cb2f96c7876dff63f5ed31634ced7a1098d754895ac6f7e8f5f6a01
-494770c3a22cda0fad4411cd76fbc92b0c76335a9bb5b3818259e62383f6a1e8
-df4b1ce43717a343df9f91a5d2df077af4fade7cb9af6608804c08808ee2ac9e
-dc25407c6e3ca02462b5d16e705f90b8fc64b7d8679f7d0de875b72f7c9c6a3d
-b45e96e0ee3ee6f8cbf4c85f09746745ecbcf39ac3b7d6e52f3c5e79af0962f9
-91935435880d10ff0f00dcd7cf994af8c776700df9a07b6161f44d9d803300c0
-8fc227bad040c6658beb8bc4a51bb0adf41beb908d39a7d60137a43de5f1d97e
-fa530897e71be24647b015cd2c76c0b0d1bd0f941499fe00ea4e09dd82910861
-e671f2f0c56f5d4a7f6f19999b4ed50426ce7085ff5ec9716f7393d604fb7387
-fe09bb5346a8cf2d054a7fd817e075e61961cdfcc9ff71d4651822ddc1fd05d0
-7d8a9d8d76da5391bd75ac047af65a351681baa87c9a6de0f1027cdf5266e68f
-48a290aa2197ba3c66c575082319700a8527fe308c78cbb4d1e3a2543f9796dc
-7105763fe7e57106179e22bf52aa25d472d6bffb0b906d24e788685b93211546
-0b97acf5adade19cd7cb6d9a5e7fe5012a3fa15e6e1b85648da877c1e3eadc9b
-630d2b92f60189c1fc93a8d49b13c1b97714052b1976599f98dd697b9dd91a0a
-06510ff600658fa9979cd633296db2a67a5d2d9c42fc530689167b7dce26ced0
-4d8a509f04a9cf65eba06ceac4c5e3644ca3280038626245666a2e0c19532c8c
-720afd6d43b436a7ba1181ea34b3ac852481809ecebb4ded573b688e896ba021
-8a08eedf873e331fb7d57c2fb132c53f1fe70356eb0e8bc41368f966b3cb9272
-fb1f8e44c76f0b12c3bc79d848fbf93e55cd36eed1c09e800b2b8f53ab92d8d5
-2c6ef3fcdb64195f74eb7b8e7f2052affc111c48818d1e69fbbf38aad47e59e5
-45dbecd57c7c9a42007888fddd7dc740742d3ce06aa6370d8427a3924731ceb0
-6330390afe0853ab4646e48ccb5d49286ded1b38188a881c8af0808db19d39a4
-b3525226b5cdf3aa901217bef8a5392651e4fb4e8c1ef6dcb8faa406d7ba1d77
-4d13f87ff0c0064ff0fe0e3dcca2e79c124ec86ec13762b49208fc35bc0ffb92
-9b8a38465533f260166c6f488eddfa0be4b6d15b8b1b59acb4e8827655eccb02
-559e8b90b384d0f0115f7f44c7a6247f246500aad2fe475a6aba511a10d70650
-7e8035d4f83e33adac6e14fe40ecec89b632c06996f1d68e7a1655d69ac4f6fc
-227aa5966547791a16d4416d785836b5a3724146a34324ec12a09cfd7519c05f
-d395699da7086d56e701539e0363d71fd9b279027252c8ccfa7a3d25a41a9644
-7d4d92b7fad210143afb526389342e18b790671676367c6cb41c3417d75522f7
-2187d83b605bb6db3a695d6cca090cd353e23d0512c06e8810f0fbda1b19ea83
-ebbc1ffc7f90fdfd8ef644874a7468f121564c9b259ebc94ad0b69c83cca6e20
-11f4a698aa690893a2116e502e847f9b9990b5a4d3f533bfe5ee1b5436b2f692
-f6b5f6b779b4e59697ccd5c04e8c0464009c48bd105482773f873902bed5ca6c
-b13a0d90c4ddb6ccc416b349ce7e2c8f91dc5219011ea6df871029ff22c7d10a
-fc890880b9f13669c7a6a60da0f66e5474cc30ff1e12ab765aaed416318a8405
-15ac5c30d883903bc5c04fd20ed977e22482591a46c63ff11ccf18756c080377
-b4f72c4fd3b127700dfe7353adb29431a50ba9d0ccf764a450a9a57668095392
-d9f924832309bf16b8d17c0fe2e147b9afd086c605ed6998f9873b9136575722
-ea03bfe76571ddfe0c86a1b5ee8b3c0712a81b397b5e0e6068810b0ee52bc0cf
-1ff6df62eafaca67e1f553316a7bcfeae787ac7bea86056fad39696b222e887c
-b1aee0acb9e4093068661a6564292808535ca4c7b9271165c73eb89757db9438
-47e609ef5766f00c21cc5696a5872cf39ae59e79ae9b0854dd3b6ea7763f59ab
-b4443fd1998d1c784d815b4c067c844d942f935123a0ccb76532f18572405458
-6eb065f20ca9f301fb04a0f05bbfdb167ed497dd191a06fd43c060fee5be2ffb
-b804236bfcb6c81abfb5ddd864a61dca262b97c5db8332d049287c39e0fc8532
-91bd8e2731532d461bd22f4fe65603efbbd39715f38fd06fce91a0014e80e7dd
-f80fb0f27dc96c6df12881a7c4f1c47b2c7b2cb7224960c44dc616fd8322efdf
-1905121f598b6e0aef30353763662ea6687ba0414cdb45384a729d1e903c51cc
-da599e566012592aa78c55e45808cbd9952c8c3b2f21d098370af67c2270f32e
-1dfbea8d7fc0b88a491b4a0101ce1d74a10e27c2eebe19f361b2fa384fe946b7
-c9720e9ed02b59cbe30062e902fbd01930e66400d69c274ca8ea0ff6f7580cb4
-54d3c3206477f7b0dc20cb80055d470383d137d226be0f9a15374e0a0112b04e
-f25db5ca9ee78fdf7fa7a8b3867f599a61e010d6ed3ec8b13e1439d3a231a099
-2179d4deaa4eefdbe467dd077fa49fc330f9e06a6aee7d102a3b55890e0aaad7
-e2276183ac7cd1259350ac2277e89bf452858d9418ed01a22919c9012daddc3f
-ce9bd052032c7fd79148000277ec903093c227e52f19b959a99c7edf0689f4a1
-9d004980edd98997da23cc1ed63c1cc0f1e46340d3cfac421df31a95f032f297
-0c397915c5dbb92a8596896d1d114a0964926be4dc940e857c5a53cf8fdec3da
-e2958089db083fcfcd3eb090282a7c978f3f58e93544c9173382031797bc2a44
-b5aa61adec96086af8ba5fca90dffc8d0f4d5a8a22013b2ea06675eed2641fc6
-03400edba05abcbf6a8afbd3c6319f23bde069c6721e7679610367ce47d40ff6
-9c018e23a85e2971e7136280bf42064fc33502e6c7375e328c32f03f05e1e3a7
-d35816e5862966a1efeae1eeac4a4c1a24cd89467bea5e9670da181fe333f795
-b6176f94702a496f8c4da01916dd5859f41fdca457ca50870929f49341d06392
-715d71e508f55416a59ebe5ba3c093fdadba2ac413b6238314e8eed5c7b353b8
-b09492a35309b3da82a8af47a2378c2e4ae452b5ba4d706ac27ca5107f98d4e9
-64300bcab484fdc8c9c967aedd2f351b54ae0ba150334ef42fe7d57eafbf1074
-cdafea5358e2239cfbe0abf635778065e433b9f1c17357e67f692f5e98641723
-24aa6a462c0334f2ef7bb30fef10929224ae0578fc49d68f7f48c91655371e99
-751c18e5f4c375a734404e533dff279c9a2692956957b07d11a72ce6c7ca64dc
-8c90eca4cd037dbad39a5e6393ed0ff2855711dc7bd1f33f122eaac8fb2cd4af
-ab6a00132c1300f152554b81a5e33e864f7baf93c2ae5d9feb5e2bca4f4b48f8
-c813c42accb8a9b1eea5a14f5f9795257d70d0910cb738a9d8d47146cdb5c837
-a74c0402493a3b3a849306cd997659088c8efeb0050758e1c2d8742f34350304
-8f80ca8cc9a9aedf8008579dd936b29e3f8495b61f0e416f7111124e95e9b0b4
-9c69063f46a9ef1f2ae58c57392ef498b1e0b9980f274d5d4504b47f03261e57
-2ce746715dd521d6d2d9ba1b570ec8de309778955e06f065a3d82ca42d0b8ccd
-5e635b1165478acb9ba24f02e429731c315ef0a2cdaf185a142654aa9dcb56c5
-c82e44a81a57ba271000597a99f7111e25f7a4247d40287bb78478b07f2c220b
-a4c43a1f1a87cefdd179447e9ea9cfa41aff4ad8d03eccda89819f0039637e64
-2a8f3de1b7182f4237c27429114ce1dd195f546b57ac964d59cb821b2261552b
-c8498cdc5a76879dc4de1dfaf3dc15505c0d3b4cda3ccfdc1049a9a5c48fbcd8
-8b74208e6c99826053abf4c2b0973277ddfe6505bb9f77e8a84957e144516600
-73a0e3fcad8c597bde3faa249d2511f545c051ce6461e3c01411ce7945ea829f
-d7f4ffd30ccdf757e7039df7deee4ef47a38b6f6f9f7af190b038e464ad3863d
-20c2a06954a7f29a61cb9b7daa437bf06f8b6a34426e85c94c93b037098b9aec
-5ffa37fbc51d19ecca38b26adce6704cffe57973a0090951da23385cbfcfee4e
-4c1f040273247c1f9ef76d20381ef92c9f7bfe723e90e176a34990c19df2ba53
-b2d0a21f64d48d0f2198444c945084f568a04155292361de380eb864f8e5e452
-b37db08686546417a3b87dfd34686c1dba5aeb055d5841c30b1c8c1a182eccdb
-876ec9c6a49e02e7b249d3da4061fb63a0342729a26838be79d6939fd0460f37
-fbf36c6a6a76c6a99478551b095c34df7d754a414ed5f0dd28a99519226be1b0
-da01e883e0d5b34e0f2a1a0d23ecac458f135173b7ab3f3c1d9441f8dcfb2c8a
-bffbe97cca66b4a1a3924333ab8c79151393a21fa0a215577b808f76b31f5065
-43af482160fa036f80f8ac65fe25d9cd2963ca14ab51718caf8ae7d636fb442e
-2e414ac7193fd67e408e86a034036f4a7d1a61557c11ecb9466a403e5b744427
-cf75d3be6081ad827b6db779da50626390603ca0f3adc54afac1febbdb78d6db
-776a4fc4bf7e1d0edc29b39fd107dc5974d03fb34a84403ce3b2f603fd30703f
-4d0e6c4fe5607dc36c530c88f6424c5ad080ed6b949e968be2b3d3cd9e719e62
-cce1dd547d54e39521e1028ee429689ea3bbab05e117fecdcb93ad8dcd04eddf
-f5de8dbecdfbbba43a6f66cdbf3c81f572bb1d4568311224685e691cf31d5961
-768dd919a400b000e74bbefddbc6c9b83ea18c82839f55a3bd3d8b6b900460cb
-b62526b4980837609d173a5870465d334de87bd11eedbc2f400c687e2003d74e
-605733410e790c0fb5a28c57325916a11f92ee2b9c4124001af738fcb6e6c588
-d75fd336e5b30da46d805767468fcec686284c953049f3d83dfc986fab43eb93
-bccb55c9c0304300f81602a9b9d8c2233baf519c7d72d11a55a2b7260f763437
-cdccdea198ca7cecfd9b5eb79da4772e711c74138a778d6a120fc530fa5ad085
-387a944223ad6cf9a621052e33fa3b64f60871dab95423565d806a64c00b6ed7
-375ef1aeaa10ba8f0843020e3fccdd5a830d79039544981d55b59fc6f2a799ee
-124640d4195d9db251984dcd0a0343c52f78904b9c688d2dad4260e7d4967517
-194c29b9313ee2c54939c329da64d5920d26a0c9718de120e577d92af78b8a71
-32180c1acb34d07b0846a34fd494078c06f3911a0bb4348825c3b5a0ea559449
-7ca555e36caea15dd36f778d8bace7f154f8a73535a845a9b3c97ab136eb96fc
-276bcb17ee7f191e8441dc025b272c59d4f454278a75f64925e441e40ff9435d
-a012b8f2a7686f6128346a5dda941dc2c5b7e8792ea8379aa91c38babc76bab7
-397661c8bc3162de6290736ba23fce40cb1c3827d0c65b19a9a23ce1b5b9cdfa
-60a7f0742a4ed69ee7e8d2dc8857cea1af870f7998e6fabedd3cf197130cad2e
-7c6d6bd75c1d24aede7d6e0160c67e138770e8ad4ee8822a8782cdf9e5e45424
-7ba28985a01dce99818c05f187e431d62e107b61543a83ee1f040d6e46b36a5f
-223a0a35418c9d328c5ce67bfdde69edc88c13995d52c93483abea8c80e083d5
-a384b35c8d2f87deef4048290b34bf3dec299d16f37e1baf0b620a72acaa04d5
-fe4731f88411c7bb53c4768f85ddfdfed7e7696ab17922606163852d79e8bcea
-e6c9d902108c24b4d83b5f325eef14c818bab38587b75532b9d38edee82204e8
-20f956e4f87cc7d033d68cb0017a79638e2360c4ff07a81706109beca9258c7c
-a60d52f07d102fdaf3cffb1ad14b999234d302fbbe7d3af784bd5fd9d1dacf05
-5b192654b7febf7f71d88277b3990af63a98520f27f65758bd9b2e5c1fb4f940
-b87ad3da4c96f4e1d38e5a7ace307c73e82d7b17c878fc55c33a3699fad5f841
-f9e9d17d92a4216543db45e9f92ac8f36cf01f220e295e1dae16cb50986ab0df
-cf7c6785742bc5e04086de192efe19fbb871932c8d992b763b226bf4f054ea42
-8ed3f6a580bb12a1a93e367a505ebad742ed63d4a9ef7c4da3a8f6eb55eb8cbe
-dd59afaad1e24a8b87c17f3a9c245dc4a30dfd8b0eb424d94266d61e2f47addc
-0a52fa4db7bdb7431e5f80604e95e4091aacc7bcea215e75a7eea59642ac0495
-6c08128c27c59089db3fd75f1fc8043d9636f4c0e3a29e2aa5f726d37876e6e9
-de7e578926359f3cb67ebc2e678267799cfd41f29de2cacca067715e79415fb5
-a5c06eaec36e4cd8d5c818312ffac88ccccad7fe46dafc3270ffcdd78c52f205
-04368ac9f622c1cb7ba8fc968378cf54cb42ebc9330062a9e9dcc466b674a9f7
-c455f575c1840535782c9f4106a47d5695a13f6fce147dae42e1b05784d0b66a
-a0c3a36afb3b58469be79bf5887c606490c7f9bc66aa9eb06aae67bc3f6b2c6e
-b1abafb3e128ddbd0985505adf6fdb4f85c84c6a2177e9871488885682125b3f
-d7ec6d50dc6886a867e87122502d7a5ec8101d81150b7a7c7836ebedde05b5e3
-a2b6afec021c3edbe2911bc8ec445638bae593b0443e3407e3218d59eb85a34a
-aa02d5b860324f28b7e8461cbb576fa71515af67c0f061ea0426f9b055f87066
-cfc94c2594cc55caf2be5dde04c6f36cf3261a6f9ab826134c9c56e6c9f76a9a
-c88734a060a0ea4463ac6ceb6a1c782dcc199be95860539cbb7b2ce5fc5503d7
-51f0a495337b94fc7118f7101b837651776ec0d40f1c61b57d7e7e16a0e410cf
-da4b0dff5728fee5922640e5faeed1e0d6b1e8b87c87e72feb3bd2a7ab8beef2
-c6ede873609fac5274bc1620fef65c7a9b52f8ed233fcea62d37f606d79699d5
-81bd29d2401feb3a9c32a34f15d0ff1ab299abeb05fd27cd6d26d8dbfd91fe3d
-dc8dfb290df7a58b72dacb7c24b4067dca4197f298c43ee8f9cea520c2055cd6
-0bcc95e3feabe7e6aa0abbd41dbf4a26c69bfd5c7926c5d4ce1e3c30b3165514
-5258db44055b68401326873a05ab30f645417706cc3fa6522098cf253a851e93
-92574758249035e3ec5e7b3a03f81532d871cbdf738e66261f51b094c5e3e8f9
-480f68e8f26f68348ab9afbd19a49653cce7ffffe8911ad8eb2761696a0c4eab
-39e268e261003e4cd0cb15fb36375ff4b2c39bd45710ed4396c1d89563ef8b6a
-4e86a73b8d36465b37cd5a50af5f8cf613e7c5fb9db895c6c9827a6e2b1e681f
-461dd52b5719b4d048dc63e47fa3aca8c8441376318be1358250f676bb9c4f8a
-982d971649a6e687c43b3861050bf5d846c24ce2fdda4917077b1cc4109bd764
-c650199f51dbd309877c268e750230d507e1140caeb2cdfbe1a03ee1d0f4906a
-645c9a378691eadadf8b1f291e32448f930e74133183379208b442988ae5da75
-22cfd3cc728a5dfa50dc4a708f25cb851fc94f5d82ebb37b08ea28b43a882d85
-b4d454ed11ab74d0ed50536577807e736fc6cb07a890537ca45e15b3beaf1c98
-07941b3a172e85c4fd7dc90195200036d413cd408eaaa640659e9826d9ba553e
-215ecaf8680b04cefe02fb8c0642c028f530815b2d2e4dfbc600852a7412b963
-bcfa31432a96e066ed29ff731b75dbbc801442f521ea3f4306cfe0333b4efb06
-840a81f213bc075b113050e6ecf2c18163f3329898e167e36729340f0cf89d20
-b34019ad3e8183ea5f666cb5387ec8ca8a6ad62b93f3554fd43b6b1a21dac8c1
-75299570f4aeb3c51b6bc7cc3cb80d0d2789e99625a37396aeef59bb3c661761
-47e02c3fb22c4199da98552807fc8ab9457ce81ff4ea010a36b0e319f1e98bbe
-a63056668a65b1822cb57a82551b1ab33fce67bc20cbd56e559bce3c2bdbdde3
-ef5d1f232eca045018b639b7378fa773c7486db53e1947bbd02f827a7e19883c
-078778e5bc7697a9e474804eb33c2af722dcaed37cd14e8ce92d093b83335eb1
-a25a6d99c7e286941d682ab64f098e93a252f959ba4e9c3ae26dfe3ff8a1a3e9
-b78e85efab7f67e5eb32d1f517d62d35563092598b0748b26c9567801223e93f
-adad3cc790b8029939db16ced7889de68a1767f700be22433b7494a079d6c85d
-b3816641d6ff42b5a99e575161254ce929120b78f489a76ca4f3b2f1ff4eae62
-16c08518955fe8e4e8efa4cf3dcbdbf512fc6be7329bc046d61acbc6b19540b2
-52ad79177053337ec4fc094c977cfc6eb036b5059e14b7f92782299a40c88209
-f7021f3d155b2fc306e7edcc98f9e93a6593caf8b4e5561af4088ac9c2ece955
-1b15f8b538d7f41731dc09acc707f08bd8a59d92d7d7eaf5764bdb7c5e85547a
-32743157dfeeaf3f7df8192a0da2cef45e1ff911d66cbfe005170cfb933d8bb5
-85d93708c87e51efb522944e2df9fcfac13ec7079e1af32d03e233af8ea6604d
-4d906af71dfd8abee459fdeef767a385b15d0e677b5034c1bc91f047b46f300b
-db6092c34dbff505b0897ca086377772ecb27b9ac70019cac5333d10b67b5b71
-482f241a91fda05af2a4abdb351c42672b580a25f01b79b8fede4c01051eb115
-c64485e3ba4fd9478f9172d6cd73198c318c9db59f71ad709b9d567b4e31e2c2
-8d0b93a1d24c82b50f01a070a952a079e1e7f9c2eb4bac979388d99a25577f93
-57d9179078aa0d2f7a8a65d58b8741244e3684285dda86cf3808e68b48accaa9
-5b3a91fa39542cd3c80bc5fb5d636ca5ecf506fe1e4e645705bdb10f9fc67a56
-7597dc5c9a1adc7b47c404c06ef16daa37d8fe6c952e06d056dd15008ad2e796
-15858275270c5804432e91c7adb467102e1e7ed962f04f3f6d39c6fbfcd93f21
-d11016f5e65e9945c1442ac63b535196d65cd3990d94128f3701fc32d1079668
-12749bfd5c15d965c3174221882914a1fab5495b5fd0d7a7fe3b11935c3aa6fc
-470ab52a32c9a9fd1ddbe800b60f3f24d9d9147fa86d0a0925d7140b5a04a493
-f3ad02d6c352a1f6ebf7ae326f6ee88d7701ee907c88728150e0a2c214b13f12
-e7d5d83efd62cfaabe68f02fc23332703c02daf224cab53c624dba61b5ebf164
-0205dec482b3a52443d207a11d4b4ecbef3dbcf17d48759e7e1d69108b4cd456
-d263d15d719f5230cdcabe96dc49df253b44aa047fcef75ddf931cbd6f3a2a52
-c23eeef852c1729e23e3bee93b0a5085913f64b7c3dc650432ef005301062a5c
-90c400852a7412b963bcd035e6942cc8ebba9a1e3d3353b26769ada213428979
-78a9f549a86210d53598cc1da57b8a7490ed6b8368cfff93578f979d16c8819c
-80dd050fc4aa8ccb4f7b2681245451d0d13403841da091442013a6c5609c7d68
-da409a41e4d90f36d0acd74368bdaa75e618883eac528cd6cafd20754cea601b
-33b0a58b33669ef561745830793f5a06e72c0c8718d24de9f64af17c50beb1f8
-cde6ed0ddc136eac0fa98d9f0ab9bab94d18d86a7907c2bbc50d69d07e3fa905
-68145b3c0acf303db053c8a0cf1d7619a215f6753f804c6739ca8c1017f553f6
-48d857f926d74d15812215b7fd87333b8f00e65c81fdbc856f1323a342bd0507
-be91b5c365d7f895e9c374a9b8e0d1413220403e4b5bcbfe5a5977640249a233
-fea8f1d22ac9f6e506801c4a68e9f8108af7ec2aec0ebefda8d1ea7851c0b226
-b3b8a76d93736c746a351ac265d9de903de0028a2013af8aafeafbaa8c2d1d54
-523925d4d606b13bd04f0e41fbeffae0f00d89c83366a1ee1e5bc0c18ddd134a
-ad7c32a0a25b921b33d91846fe945d785888091c558e3cbdeb761922386ca63a
-3ad37a2fae3f575e40d1223b416c798bc3732c6dff964b29a02714911858f156
-9c87d427f5087455da19f24eb75712692f3693f1d2ea5b3f40e9f9eeb0f0f8a3
-d00a0959ca4e3bfe8c4804a429ddee8d842c8de8312610e2cca9cd33c51a5145
-e7f8c8b97df06a0a023a43db46268c5bb2247df3993dd4536837eabd9c0d381d
-da84bc4ee58e730442cbd7966e070d8be71a0b24b871027bb3d586d8cc2d6fdc
-917ffb3e85d5f32acebd3093e53c83bfe41242307d774cb3ebad79ceacefd887
-57a0ed1ec8adf7cf1952411601ed59f4c4be8ddec78dd26a10c083f6f04fd83c
-705ed42a0891a5398169c528f7911cfc467cc6df8bd5c835494aa1a7c5bcb836
-40e6c78e60c19dfce997ed6e0dfc88fc01b0349e0455d4f22c06c16f7b9ed61d
-9ab3d5a4f6e2fa2ef4628431cedf579db02dcc30a54d6c10392ee4480af0998a
-b823cd0f9484c3579e90dc412967faecfa026bf654602f3bf6b7a6ec54350be1
-c836493fc0ded9384aa53b770cc0f008329765ab5bbb896c3bc12d21f37733e8
-7c7258778a68ae72133f40defc3a817a72c8cdfb2c2614bb84fdd568d51066b5
-5d9b4dfaeab9dc73b2d489cc1cd29461be050cc6e72b15bc7fdabae2b7792d34
-427ac97a386e31161bed431328c0ff34725192b95bf911814a98e09faa5620a4
-0af40530e9aa937d32facab765ab6efbded9066b7c6a031db5b0f34826719622
-ce9203e7396fea2e7d5cb567236ba11607ec8579e01d0741a5dafc86a49a3ff2
-c1898d961bedbabc3bfec4a4dc1ff565ab27805c0f27dbd4db1184ac8d13a66a
-03f3477e9303aabbe2e8f009506fa8e03e14c9cddac07b991db50356f7fb7a09
-86fa0dba919eecb006dbf46b9770c52bf38c992c1cfdf487bee675464fb41020
-70cbcd98348f290bc9f8064271899314f5d53cef33351b85a9b2782d891f4fe4
-f0dae67dd58fd46c7d2e3451ef0e7ff93c38e92685ef30660a8140aed73a239f
-1adb9547e33369457d849e1417363508961ff097241ceeb0bea7a1b8e350f680
-f5194175b51793efe0ae38a9b930473ec836c99e8c9fc220700f0f6577b77fc4
-5d69bcf32455d506629cf1b15af57f244eef2bb5b824957ced172fd621618fe4
-394a3b3f1a72836c4dceabae9190c3de48bcc34945bf21c468308590e4912896
-4f331cf48a1764a4f828cdb11fd36fbd2cf546afd8cb3ecedd7c0b9ea5bb0d82
-8bf269ecc868a9dbae49cd5173b30d568ded26e6c229b09868ccca377bb5878a
-390e48cb3d4d596e167fb5af544d01a429280fbce6caeed0df852406611e3f67
-b1e07a92c58e9887f39aa3b65df90f27a2f9ad203ef4923009a69cca234dd41a
-abaf30cca6b13d77e38626a228b59dee4c20279ddd3fb7e47f3630c69ce918eb
-0af51da83358654b2b28c0bef8ddd7a22261f873010e35adb40f63bd5f6febd3
-50e44cea34928aab9cbae1e6ef35e713eef769ea2e06f1005235b567cff130d0
-8b6dc201eb476bad95426e3c9a7df4a803ae01b5ba4a764dac131bd273f17e48
-c1b0bb228d5c9ad4c39262c4ff6d98547fecafdae4ec0cfb0c04dfe7982490ee
-82ebe0e712cac8b2ad4161c88602e87c68c7254fc019cbd98d1deeb991962910
-d44a6e8d11c2afdf94f140f4a94958b0189dec2fb7dfd7ce510210cd76a88254
-b832de6879983ebbdad0220c8c4d5f7c37a55a125ee681abae550575100e3cff
-f5ffb4e64a8d0b2e7bcd2d6d016c598c6baed2951e4e5110be8b5f4c95ec5583
-44cdbfe4d78f21b0bbf5562a9325fc8c75dda43d30c33c3902821b9a6041483d
-3f4346ab4b036e583674418db32c71d2a511103c105490b6fa774b61b7e03216
-a466960ac2db48d0826034e4eb74f2a95e735d9a2a048e4eb159e7d6702c28dd
-3a1d5a390e4d69e0da121673719173ffb31fbca5b59b86f9d65edaacd36d5e30
-bf872cb7977a3894802498d20d656d9d9ba7c997450b2a3f0ea6017ffb5c2a9e
-dd4a6a415c6c6bea9497313478da8630a9417a3a77ef6d1df9aa2ca014eaef96
-8ee377fc0b90c42a64486c4145044c72082e76fd9620d2335c27f87e169f7f9f
-b4962e06d98165ab1017436ccc68830ef42c904ff8d738ee2793526d476dcf19
-b51db620fafb84cc7b2188a293f0f7669f48e1d6ae0d12997432f67580c4e36e
-5ebd336638c50ec777965083dd485be6f550f9392441e53a78068e7057a8495f
-25406380eec1548fdbcc215d2417ed3a1a2db029f9ced3c0497c042921c72b8c
-566fb204a2f3adc54a88957260553c33301bdcec98b8797e1ed36d21a22686de
-2bde225886c16ec5d132ac0e543093e66568332aef3bb15f85cd442a8245bab7
-681458364ebeac7758c2c4b1e0f6c9e10e5c1149cbe99651944c29f042483440
-af0f3c88e181722940dc1a8a772d99f2dc495c97367126b14053de51a03a7907
-a725b1dec299588f81bb1992ebd9db972aac396c47fd229fac4becd1707ddf8e
-8733e447b03c1a671dc33557daef6c83be6fab0cccdc1eea095e9996131eae50
-cc9831922dec49ceac282b5e1c0542a01a71bfc28e91bbfbb3198d33901162d0
-4285a62e07f82b95d0e0db1cd8bd664f1a6603687705936a87269ed00616b505
-dfaa558c8be45f0425469904d42239b24d4ecba5efe9b29998a30ffa6722fa47
-5c5c63027d3349ff581f3cd71c9e948b419489485639c46ee6a62eecd082d89d
-639ca2a26d58fb3789e2dc853c4b6adaee2a45eda123a1620204ea143d2926e7
-049dfe2de7e1b4d14dcd6ad90dcf1fe26413ecda2008dea0d7b7409b5aab672c
-40c71aaf8536602406bbdf5ba17970341c90e60db0f8239f5190f0a46ba0993f
-f0ba8eaf9c45f1ceda81d521fd353072b694334473fcf3982b147d22911a76a1
-162fee53f301906e20938bf6f38e0886b9d340fd23497c52edd2b9319e9b40ce
-1e87a94353d01be656952db686e4fd9d22c0583d7c6569e46445c01d06ea3cc2
-6a564f0abaad453d006cf3e868e2bb4e23aa6a93542b0c4e06d839bccbb64470
-e689f85aae9034fe57c583a30090535a89c22fa8336ce9cae3855b6f3c80f1ca
-67db3c3d9193747dd24fe745496c12d951180e7a24bec0cf5a5ffba06b925895
-e2463e2046eafa6986b7299507002ce55df328059434a08817f76e1c0c6fe864
-c5d39048e042b01e35a86b322ccb2656474f2a0afbc1aae14543e72548dc927b
-d1fb32f689da15497868e14ab927ee6efbf2c1c16bfcf698b77b190b57ad5f48
-8734baad1e836f0348458139a4fffc8f9334552de099ee80c11e84697389c795
-93177a0e179949738c19d83b36986a769ce821736a3f2f69ec82b7e19c2f25db
-aa99e888592bd478b2cda54403af0786702badd1cb8e7af2cf44d98d142fa824
-9364b1e82c0bdfe255739c7aa1486de001ff336bd84d58d845dc77e573092b54
-9b2eb4d4309d113be1cc36c3e3a1a8fe6ba813e147c0ff6be1358865383a3b4e
-e242bdcdd2c4916d1eb595b6a6ffcc1532a60463f8e0670b96dedb7540a0233f
-a05467deac20d5544fc026e83c80fcd3b4a227598a2b320418cb2b37f132f68c
-048cc26f58904d1f6d0bcc4c668843a86e81fee25383a35514c6b18a0ecb0b81
-514d937fd90e3b70f3cb83a8d06a9bdeadad9763a34098a306a7d38da2e2a32f
-fc202db1b3cecd7a99d4d778287d34a1e5ddd3f6aeca5ddd730facc26899f838
-06dec4d2a4db94abdbdf46b10b4f2d11b3c94a8686d210c350759d479d995a9d
-33fd660b16c4ab555dbc247cb559d6072f44491b32423ae4eeb761e271f304b4
-dfcbaa03cbb1833c822085dc6d6aeeb436e24bc0639e5cd4de306a7301f3c077
-2dbd3289cc3fb7822f52b450641a345750ebbad08437bf23331bbd6ea4e210bf
-b81fefd3d410330fa1d2ce93a534b3772f4bce4bf5335881371940a8bb302e89
-6d5043f5c69babca785c3984ce2ae8128d861ad78270ff78b7dd3678f4a9ddb4
-c6d4442d0780dabd78e652c2f30bb993f28c669fe05b9eae576c44d9a17ddec5
-6f49682da228f917c955fd75194d0361a30549f677c8d4df6c215281218227dd
-b5893844ded6a908dfefa52d3c80a46f92701b8e41ccf0ce82195cb1584dfe0f
-ae4f282c2f0702f93f9f73bad96b899ab06604d48fecb0f4c7436dabd184d62f
-f3f35cea68bbaebaa8473f6278321982e1bccca10dc064c463e02a4529d9047d
-da5b65ad3fc13009db932c0ccabf8318e4309516c19375ba41440c70028f1773
-f4aec7ccfa41b60db4a624a735d27977642fd8a9061195104d8ec81f0c2a5534
-45b3775e1fe556db12e0b2785f3e55ca8b8f8bf47bbfb555d0cc2c4d2ed879f5
-4f4efff486b3f21a12f89228b2254c937a7f6b4cf97452063194ff23485bd3f4
-c106a3bcba156b42e806e6238c39a0ae0d06557ef260df0dd1bd149caa76fc4f
-b12b7f2188e627afe0890f16d8a5685d5feb9ae8f0031f165f63b5df63f65aeb
-2ef56f80362ca765f6e24056b6f0f93491f6d8dd1d90d7d4237158ce11fa3102
-b40fe936dd641afc1d60891acc80967b02ed9d83a464be8e07b2f80d65e3926b
-ed7a2075d5140f321b8dfebcc4d808d09f80311996e7822483ad59a870bf8f17
-9b376d66cb785fb5135dc1351432370fa4060345ad5b69c7ffda0f2497c8c12c
-e10396ac141575a04a9a409d4903cf36cbf6602e09d0823f9498d19fea36330e
-bfa209fb096c09b1e2fc8491c0124246be6e1d4ad452e43e91b30d938b6e7e49
-9439ae5c62f36ebae128821bb90753000bc9db92ea04ff6c7e34343348a57af7
-90fcdb72efb25a14a687df7dc3b76eef16f96c649611b79d640516a2f9e81874
-c539df496f9a9c14c1ee4012f41c37c3a3f2189d91ff8570899c8c2e07017bef
-8d2ee37c6588f896914bcfb8d551bb15fda56c856e08b830956a01a444a8d2f6
-72b6f8ebee46542bf7a9f5a6c9c84418f840a01acc612c65231ae2f4794ff8d3
-c97c4cf224c3d0c26355a424cac0f2d17a056d203b523e03c60c4ef8a715a3f9
-5d879a4f344e371af8c675ccf394957fac75e2c039ce7708a6c7f5b46ce6e34f
-4df11daafa6491a63a46b495805896acfe5034d037152c41d9997a02ba58010d
-c338b23f185b3e4e3ba1fd1c8284f904a112475a08d3b23a92213e7ce51efec6
-297850850c99b5aa0bb31c15c7fdc4aaa7564c0dd664d334a17fad333927a616
-21bd7ba42819171e14abe2410455ae42b2a0fe9db7693ed36ebdb6305da51a5c
-7cab74a7d6669bbb23da061c5d641997b3d0e55d06ac1a41d17ac326b874b450
-88881784220f0829ac2077e09bfe9579b078f08c250f94931824ad8157402a49
-45847593275ff352dbe59296c2b0fc96a2ed97dc6f79b23e3796dbb309145e1a
-aadcbe232de323bc2a55b7af043c39dd4113d560558677e8a202229b3ced466d
-e37abdb7473b21261cf96e2a2affbf7c6dbb3622de6661a90bad85825009ef2c
-ca808bddceda30a3ca8aec87f960fa7c85f215b393e11e09b48db55f01cd0a9a
-aa33a40ec2dcd70df052bba543d2c22c9e93b384bff9055b426b1cecd5f90ac9
-574dbef0f9f43d7005b2a9be95113db7b12520811d99df5e4e979a5adf762bfc
-5d0d4c3c8150715b7f319d35875a7adeb182c37521ee80d994054e902cad0489
-9176a8953d4b6e28f541d608ce5e3bde32099520fe617e9bc9496df113a43d90
-7e1b212d24535290ef66c9833a23fa7a66e7fa11462bd210456b6edbc16ccfc1
-70c322b65330f4251d6bdeea11a8a0e58b2d438d7f844b2216aa53354464eeb0
-77a06fbfb0b72f8ee1f0bab6d0c6b27f94965bbd6260c70dff6c08d4edbbc4cd
-5a8adc974b690fdb53b51ce295e6b2b40c784651c0e78ea6b33c567568d1ab87
-193d2feb76ec18f4f6394fa5508ec4d6f871101e26c122b7fe132cff7f115e1e
-22b3eabff49bd9deec3fe09317e00639fcf82f835e6ce7ca9a65e294e869e700
-1c85a71e1b3cc1a4b9716a4a2dfab2986cac085e176dcb45091a01ce61dac2ca
-b5306da956147fac8a3bc131f0d8f31953813f52748e70b4c8d94a82c17d83d1
-a8046f80956defe12693eda56512d6d29095bb1d42e36466f6fd2b7ba7c70bbf
-123d753593f2b6373bd74d40e00d59b2be8ea60438e42818821515c417e69bbe
-c457abc9204f0a8ddebb88c44be364b358e2dfd117072f125c71bee9801801e8
-ff5ba5b44b0115ffa676f3bb99aaec050641fd9f5b6bb095a682b52c64ce6a75
-bca3587e2ee13f2ee022fc905b3babe03f154684ff226990c2ca27ec57100cb7
-dfed37c5f5d52882eeaa64357be3c9ed5605380445bdf2bbe0dc4fd5af17a3ed
-784a20539621e6e1b889e75aaedcec08db740396cb01aa753130f4b0118e50a9
-dc10da6a1059f331df49a25e98103e09473304e099d8578f2387098e380ae9fc
-f91f9ea36c0d900aacf7fa9dc3ce29b984e1fab13532aa4cf1e19a37c6b4f78e
-da75b81069ba80e1ed4ef2b9b5084e5e1dcb8f01e7da8ebf491ec5924a51294b
-81019480bafb622cfe2e500739bf8f4754e7e3e85e04d4932a71cfddb8d3b6cd
-0bc90bb7b839be6d8c052d1f0d93c833811b452403874b2a5ee226631207b6e6
-6492248559db1ce609e516e659d6107378a2e6d51021473fca2f1b87dab66d98
-39f607dc5eb0c03df892baaed0345514570988eb4895e7765c5bc42d1e76fee6
-b05bf0c77abaa0d7c5d6dbf2f7e039f04f9bf3b9a71ec0ed91e3a00f725bb1f0
-c74deed454f903d2c96cf70a92a048b05bbb624c091e3181c607ddc2477ea47f
-e76824c0af0092a62aa367448a10fbb6355354c5ac0737c69a4d641fb3f2d80f
-11f64eb4366df7060b4e849261faec37ff325e7f583ba04ad4fb37d6cdfa99b3
-0d73c662d1ebb1af64a2ed168dfaf80fdc284dde297efef48134cd6483dc1bc8
-e46b1c3c45fd5d4bcef85d9772000144ec49dedb9cf161792333104e50a27b2f
-1add3398c121814015c92096fd6d3b1352cd41d2eda7f3729d45c1d288b0f560
-17059816840217f1ffeef482ae49ca6b376a5548b0edc9018cae5eb6b1c33c41
-03642f744cffbce7898e525b1e8ebdf8cdc7645516fdb1eba4cef73d18fbf4af
-3517a140b206119a0d1dcac28577aa115ac29be7de2f9ed1f679034929c48870
-a6d50c8fa1779560b1f5b760450db3b8b350ca3b2890d04d3b33f19aecedf0d1
-ac01c613d992b423891f9ed878c8840937ede7d8a1d62fee5f92826620d801ec
-3c3edfba8445cc52e5f83e01ad27abf5c205eb022ae6833c2aae6dd550da4a97
-f10a7e363afc6d53a274c0fe41b83c171785880b637434b2c8c4348615bc9259
-8d8508c412d17099971aab2bf372b96b0b14ad90670ad976714d000373380258
-4b6462644a34bfa6f5b746fc0db76690d52b2229f7c79172184fadf2b5a9983c
-573dc0f5c11aa85ba845f6e4f5836e95636c8cadafa8671b2632c84e3d94ef2b
-ac6565267518e2f747127c6f7b13b4aa888a5ee3869119ece0b2b447a5343edb
-f0996b80d9437e62546b137e22735347a684af93cfe80ec102a50516092cbc03
-b0e52d5e10b06e447c118fe2bcafd3ba6babed083ab7d423e7bc5c862cc06dde
-56801534f09260d1f246d070f094f57219407e92769952925bbd0cfa29a523b8
-fd3ab5b278b2a2f12c89e6ed1dc2bcc4ba69e6452869b246596f71a310af0867
-c9aafc6af2c88f1edea2ac2dea51e8fbd72eeb0893a18706e16ce17a8ac44545
-ac68951c0f284b0149b71d924330201362ebbf72dd8e5a8a986fbeed97e5ad11
-cc913858ede949d8f732f742b0d73ce9c8239c077ac9d24a80c03c0a7daae558
-f17d2310822d33918f75aa835b5b4f9fb61730fba8c55441218fec3c4d1f54ef
-708a05f6fcd38a51d287cfbc58d92e5f3793da39c0f55eb9fc03b658567e7474
-557de727bde7afeacb94c90d0b38b5e9f9b19a14d7c73e066eb556eb6ce393d8
-fa956f4b75f6aa4701d03360f1f354e1bcee9b167cace1605718f337dccf8cb4
-57c3ac8e3b5b730c60aee2e685a80ff8ecffbc005dfc5f11c5e338fa20ca3a43
-9154621626157e9efbc0b390b143ae736dba62723c99f5efaaa02a090b8aba16
-1b712e55d50a2a6bfc06b5eb32ddee1ddea7bda2f176f0f1c533810137262a59
-f8b14ec3b0349ec36bd0b8bae99368d21c4dc0c902e92dd73231b03a91275edd
-9250f14fff4457350c747938f2cd6170e6b8713f439ac4e116e70f00bdf5555a
-99a7162b703b45e92f8e77b50e85373f073b6907f95839c6f6dd306aede407d8
-642113e1bf2be60a5ec8a64431cb46f882d2df7eaed39c326c26327513b3a647
-9ce800635106cd90cd7f0083d2de423a5b9e5d63c49643d3e220aefb899f491d
-28a30c49abdd19ec4bf66677e8bde6e43e222a097398ed2a9e9933a1d5ca87e9
-cc6cffda1deb6d13806c2fc82c4b32dca80dda4e3945c6589e9110ac91681603
-c4bf11c9d5510fb8d4de96ce3177297b692464776d9c07a1116b6369204df7ec
-4592550563d3212b50bafad065887b3c369a7810f98bd521be06a3b4b997a6d5
-e0c5ad7ad8aae5275f400d86a6f09f1bff38d9d7220fcf688212eeebb8712f1d
-74ce4985615a59c89354c1fc0975caaff671151a561edcc2017b0de504974190
-49c53f1f17162afacce065f1300cc2571a0f9dba7d21d8488372d386c41a9fec
-bd1c7def33329827cc99c7eeb7e5b91607849173f68ce09a2aff09c94145aaa2
-76cce38832aed1a437e8206426ca41f49c9e45b6f581faa8afc3b47869d5762b
-793b8d5fb6f0ac9c391d49424528ea39f635185bb7192f87b72acad339471ebb
-decd039457a71837c2f543652284f1f40f82c38740c2ee36b45d620f004246e6
-d73f8777ba26c7a7e3a2413fae9b7dd37553169c7209790f14cc03c08d0bfa05
-6e72e0184d32cf070f685ee4507b79b21b353c6f228aa087ff469b69b1171567
-88fc37c39977e09d1c46456f1568628844a542736eb0ddf3fe3d134b7e78e87d
-b126702e8ec60839b53c363090f698c5c11643a1bb63ef2d2f159872efc68ae9
-a96666fc8ce25cc0e2b47fc82f5f25f7b6a732901cc6d4295bec66132cb3f175
-42cbb4d4ffed7156beef36446452cf2992e8d9ba3735269ed51ff32f8c915b8a
-f0050d9a1136e352d4eca8ef9ea6c1978fe689c8c563b8faaa1128625d9e91fa
-d173c8e2b7f94f520098dddf4483b12abad73e2303098ec46b603b08f34f2bc0
-8ad44e897c2ab11148728f4de8f0390ffd947bc424f0f0f1ba80a107ad2e00d0
-ff4e76ed5b305b72b72a07e43f98093e032088c52c07e3f77d4a2d417f141512
-43d996cb0867a056befb66f052e1b65b37d2eec54a802e570c8b32554b794392
-3280107fb91a91d5adb4adeaac86a422717603de317a563251073bc740f10928
-1df7669744f5fb89e3f460bf820cf006c75231e979fe162fee64786c144a19fa
-7ceb1da2096076fa0dadc7bd1522014288aa2fc96baab5078db3de94807f3af7
-854cc320e9f70da4efa02d38fa65c15801475207a09d254a1bba489b78a8214d
-cfd4da769a8ae060fb4eda4b51d780928bd6315bd293f6c6b0f3e4a593464f0c
-55ce0c1120b2099da0250d04f792b2270db2d7c606bf80e7a56062181f7da864
-a42e97863ec70187b6620559b29207c549366172c55d7f665952c8057a4f2152
-a69f772b065d414e65f57719a99cdbb57872a86de9fcca4dc7aa32b666d474e3
-d20508d06f0cf028521ad7d46e9c25a40d1390ee271d2ba5ddbaf7bf64585c3b
-a859a2f3ab88e58f72a1485a33c419187fde432b697809da526477341d7433ed
-f38e1ff4fe51920404138ec6403df7562e4443ea091c620a13603ed0388b88e3
-671f7436193eaad4cf55ace6d04b79f0389ce28a1eb223b24a9f8c92b4f5ca3c
-0bea3ec00a555756676d77de2a38e35375b82c5192001446c8517818f18be439
-6c900f7e1587969d9bf8a9fb5595bf055222951c2b0392fc387c258c8cef50be
-7696d9360b0f2d4095e52388b395a10096769586c03fc96a69615b92b9e4d3bc
-275229ea8df5c72ba0fcc67bf8c1b2708bbe298cf75d1a97d452d51743d457ad
-7d25ea5484500f4b086bdd81351f71885845fdf5e9129e8b0833259146dcd34a
-3547c21e093a4fae7469620a88a126e0d025d3e50103f66357e2e05985feeb5d
-4a9adb2db82460076845e54c083a2874aa56c5b95253a1e8cf8f1e35448577fb
-8147f62f33c968151352488feb6fa978676c9f274d6b11f7fb65fd39bcd7dcce
-7846008370dbc907341269f7d1c355d087fb176fe06836511cd9b01addccf580
-f68010958b8196f50277dd16f3039a9aa70411fd94d1b145b3ae34d5304e6c4b
-02fa4b80f3693cb6b16a70dfe06c132438e0e56c4fe504e1923196a58e04034d
-6cb67335f4218b857cdcdc928f3cc436c63f10ae872b93788b9a84b546c3f504
-7bbb0d419d7882dd1f7bfa5fe8a1d1c671ff3f56b50160cf4c23e8bd55111d03
-eaa7ff86ce5762687b6136f5728db1b9a1b914c7e2fce70c2da513594a989437
-ca8eb6792445ff806e502d238984d278a81d89b22864ddb0da2e49658657cfdc
-6214a570113a00e55812ccba870feb01f397f010a0377a34fbc8b052084e3d75
-5e0bdcffcb26045c428d8de34af04aa8b7a5031892935c16918f0ab2db811533
-545d35799195310e5b109688830bda180f096fc5dd2f2cd98801466cd44a2b50
-68e54fc80d1d80c9f875b7e75860cb406e83132f5cd0813757d75b5bca06c62a
-fdb7f0d55e94cc9a223c0f9eaa30c0a5c13ea0fb857fa703f2844d829418ae2b
-968dee2aa785c07ddf773e30bd42ee89df6618796171c58ef11f6570d21b89ad
-55e4ba58fffd7f112dbde6afb5c5cbe7d73b69b5a25003394ab6e0d5302ba575
-51ec63112e038b79f6b9632012ab775ae978f4d94ffa70e5d095a8fa0fcaae76
-18fa4fa41df5e34e7483c278d4470abafca5c110f1cbdc1e9e10fe169342a2e3
-6ea635ecf0f5ba7ac1fe1d11f661e825191ada43218eee5f5aadc42436c98789
-e7692be875ce211a94409ca6fa9b2bc1d67ee0e375b83b62feb2671b75566620
-47c9ba88ebd7f795c9c02e63cbfef0515a62db218f4e5a0c81b00bfd6ef12e8b
-7bbb8e9ab5a1be0c2773c7b5244d7a815d95644a188ce66280637dc8cbe5fb16
-f2ac4a45a8a8a3e13bce53c345f35b3ff85373a8733aa6777008ae9329c7e54b
-9fb18b1e137e253c72128820e04c7bf47189c1d1836f6df447ff9efc0adf7b0f
-09c1032853c67fe92d961a91e70add002c0b8f56a07c3423cefa2e5f65b028fa
-ddf99e24090b56e5be0173e8778b5c45fed11fc0c0ae64a824bbf77f1150b9b6
-cb4f96ba0413fc37f7590955d075120862015df7171ea3b49fe6b0f261db75e8
-5bb33fe6043a19688ce286573be42c114a0495cb2cf6f642e83674b5ab17c7a6
-191c140c1ffcc54d70e2b4d1b82fd0aa1e61583564753cd6c5c0d6d7743cfca1
-f6fecc0f51f247b081cd7fcdd498da22d5a2c8dec0b7a9f92e252f63644c50d0
-874617703ecdebf7ba8933041793391f67ef138fe0e4efdbad4fa6d7b01c1f01
-b9eb2868632c20ec8f3e34055f6793054bbc31c111686ebade4b4d44a9b69021
-54cc2fba1fcebfc1943433fb56b10b60f5edb160df0e33e7e98ff752060140c7
-8511c870920c2369a0d6d4dfb687c30541e014bf4443f665a24a5f05d5a21acf
-f99d9131495b773e42e3f1333866f45dc35ef9231a00129564d194006c447bb1
-5f341631210376632d90120ccfdaf8eb6df5e2cb1b9046cad64e34bf4e524c3a
-f786121f9136672b6bdc99baa00d412db7d5155c94796da2f490cb441786569e
-769561942b30cd8b72d01c11434b9a64a82f73be48821291df689324a361fb54
-c1760ba86b250c9a6a2c855eaf318703d4b6c23f67931b376f48dd3d87250ce5
-7614efcabb4a6b8fb9d332f121aa8e83edb6897987ee25bbf692d1c243e6b592
-1954fa91ab728b5844f0501a63abfb7f6c8a018e0f5cd409139ecda8b427754b
-089e9f71a74c55b8a0c7d3dc7ffc478e693ca78280c9b33193e82383627bdf30
-771103c535dcc00c7d9ca352f135de010a9dc95780046bf75b36e0a284d8c2a7
-f3b6096d905dac2abb33764249b1bd61e3994e96d0f3c1e8cc9959a404dce763
-31b01ba083a82d6d0d9cf9b163bbe2e84e01a9eb07bfa80ac69babca7e725fda
-43b67bedd3a23fa3926300349021c2337a5dbffa2021e05d26207958bef87ba7
-eba130cdbf56be5516c5ae4441390e999822089200aafecdccadd69169a27414
-1c0bf4ff1be4221b4e6465da6e5ed755568f79762a660653e10ae8d098471457
-9c6a90dde454ca311947f0d48749b14e04aa65a9d8c62097998b4d78e171f166
-40bfe92170c33de5ce03dee2bb50a656c2748ee8eaa15951da01771acb0a7c97
-25eb74788e6c283c6cde569ce52beaefcdb29f91dd345ec41b585f1e2dda5b29
-1e85d3a50e93ca8caa6fec04df003df18120152d0540efdc4020dd6475233f7a
-1bb0cd65e6e389a3d714455aa5341872a48c01f9f3451f0a41051340a9276afa
-50473824ebc231402f4ad6e35ee9d50cd89d2dde31cb5cb47c72cf47ad6e8538
-e1d41960475db823b56c20845107d5f2ebd3515ba63c00b73f9f069a7b2d8cd1
-862b61a9481a437aa4efa394315eff55fbd6ffcb26ed9010daf763a3806da8a7
-14a1e943547d733eaff9b1c8ff5d7ede9573851877756c99adac534773a87ba7
-e3e320ed16d4c383bb75fae51a0bdc694cf4b945a389878d38662a3d3b6287ed
-d505ff4d7947250e56c501f630ba5066f343e550de87b42ad8eeba15ac21de34
-ca8b18eed081283179a71ddd916c4efaac62f0603685530d08d499918b726311
-ebb642eae0db7fc91554fe6e77580244e6f3dc871f6bde18a80d732fa6f2f04e
-108029179f799d54c7eebbbcf6c013641657c98fc17d652a9b48d15204936752
-89f4312216dcd0605be6fac8c1994dfc7488f89fb2e777297b16c95c66e4b7c8
-5b30681029156954c59c7f4009e6e51e5a218de4722daac7b24176c9184f8da8
-150df8d26760dea0757344050a36ee320d1e71dafe9fef9bee08c93a2ec25d86
-310ccaa2c2b42c87298b238b449b8e9abbc89b9751cb1b2d86051baf9d84ed66
-e4123cc33e02b6c95f60d72dff4ec2e59c0e85370ee21c6ce7d2f2633c69f037
-00608a7d4c67e14d6eb9782762c193ce09d9700ed2207df978ac96d967f64d7c
-d1890a7992c7b1f0a6240d53bdc279a1e9809963532108114482b30325585466
-050647c568823771ea8e227bcf931321bdc7699707ce84721f3a8d9247ab7428
-2eed6d1f734244c0006db24d909c39575f3c31d67c4b06100dd37c12637e23be
-103d0fc36c3db59bdbe5c86474269c394b0d910ea9bfb4f321724e0b73ef96e7
-542bdd57d34c91b319d8ba7c692608a0c0db47d5c8164782c5f5d9a438c15afb
-80c7545832948717eeb7f6b646c59cd2d44be1fb792e9edf4a938f887304314e
-b064e64acee79563271364ccd68552bb354d1b868bb91aa38345a1f712bb191a
-44267a300c19d3ecb9c756879351f430eabfc5b596f63a6860dfc94cc6ad909f
-9815bf7d7d885b62d3aafd9624ed5eabe77acc50b5c8aeeadd4ad79e01f4fcf0
-c0bf6c0124da07e12348419aa115c90fad1d3a6b8d12a9d65cf3c7e8059eea56
-29a9a09e7d2df23e180c19734acc46356455886bd9e1981ad86ab2be96eeda66
-87654f6ea6e20c95aa61c9a50117db0a647ebc8c34c55f158ac2085ca23de1ca
-02b4ded478ca08c4686527cff76d641e0097f3cda433911682b399604ef61c89
-901c7da40dfc094df7025b1a692c159ba0a743b1550f3c548b2c5f7b33016a29
-a370407acf516e13a466e03a8a71ae6ccfa498d6ee19f53e258c3644a6e86852
-7f76d2d673ac3b07e3e23554886243d94d7712d778839a0c754a8a1217162b8d
-a3ec1006d9d36dee27d54e4c6e256f9a06db8a5a752a1f56766f0c6982df002e
-4201c9988b769c64aad5446a8190a5b5b3c1f9bc8cb6ad24c9beaab17c17441c
-4a9a8391950fcaba005782678466b3659c7eef7ade032612a9a2e238f59278da
-1deaa6dbc1a007c6fdd494eaa997ee56bbed5f797df482213f03b75da3a05a0b
-30b3d63c75b125b8ba5129e298c45d958a3c69067af3313cad7db36d928d8ec3
-dceec61f0f7ee22622434248cdd8696c5b54c8911b9d90714347f7f6b11c0bfd
-908e7f9cd6f98b97a3b8fccef61e6234332a1094b3c968eea224574947de42d7
-f8d5de799f40caeba36b4fc4bf430bb380dd217366446482f94d207c58a25e76
-2cda6f2af982916b182b477772674283254ae75a8d8d4cf121a73b3a2592ba76
-1d6d914992090c438c4a68018d474b7147beb38ae35b8d8e9229490655900c3d
-e615951797650c229683c3def25be277af6385b4f0ed240f86547a1a3742aaac
-a0d28fd8de4fbdeaaffc37a669bf709f0dcc13fe003c96e44a9d33ad16217675
-04e1f237dec054223a0a35a4ada96b0a683ea1e016c6fdde948e0a7a20f8e8a4
-a6d3bb3c09636e0373dca7746eb163f43810e2eebe8a50adb76468b8a779c371
-6c61b780626c027be20eddcaf408dcfe07cb044aa03f7805290d252ed3f30016
-9ddaac33d863e1ebcde7b8f3e0be3f906c3375e4242f64c7ea6f0f662bd9b776
-6702737841953a725113b45ab4eb8548a1c1479695ff4ff9eb8d474ff66c869b
-196aaff62849081a98ee963bd74da69ffa1dd8519b106ab22b4778cf97f1aec2
-d9b68354aab2fc0a8fd3516e2d2cf08c22ab093ba89434c57874f4f87831062f
-213a7fd7a5572d8088eea1cbf77b21ab4de8f4c7a1fa8312484dbaab9ab2a923
-d87b1fe0ba3183ab27d00fc13c624efe6ee45e62d2d328aaf9f501e64765b946
-f21d5f77d5b5436a6ccaeea7002b0fb24bae81ac550a731505287f37dc04af2d
-a4cfee3b3a1ab21781afb9222da39f72f2dcace99dab50d82bc73e73125279ff
-431a5a2bef0b78abf0bfb1b3140698456beb47261801937d55e1dcbe40403dcf
-2495b10dfa47211d9342f7676cbb498ecc5316b1dd64a74fa22cc977176d03c3
-f3b0760ec63393d846ea11b9c2aea75c5b7224dfa193a2534f0436cc90d9fe88
-1f56441906e4d5644fc33b472c28646ddbace7d8ee8fd8c78e5879e638b41b14
-eabb5715c81ab6cd2fb872370888be6f6aced19820394a42bb286adf8dc2a82b
-18b166efcf0c5c7626aebdd3abd5fda35cfd70887f695fdf82337b821c510005
-90c6f06a4e88ed6d4d0e5f2c3ae5e4865d67e144bba6f6f3ddf309c049772e56
-0d865223cd88963c6fdb573d56b8fbf67255f94c1c4e264a8a13810162f1ad7e
-b141f69b353c7a9737aa9d919d1bfdda75910dc5e841f4d52a5f58a3ebaf305a
-9075edc50f9fe0cce188ff64e09cf1769949589b221b451c0e7f2b6176f6ca5d
-680b1b4bfae4b7ae87c03049fcedfc09a33a680f96d96c1d09fb0921f3d4bbe1
-9655fd72398d8b66287357626d90d44b9f0e2973942dc06de660f7278cd0749d
-27abe4645698676a1ec645169bbf1134a573ed63fbddcf8e690fd66f943eb675
-2552768f52cdd9b8c4938e1d583cd6576611b1495b4339c86021ce6661175e68
-873991ac3c93a55d9430d510bb2d6c91dde275732c87275d2dfa3a0124b3da1e
-1fd7bed9edf509a3afe352813a8726522244d32c8bc31d01cba0e1248ae5c75d
-d25bcc26826fc61c172b5ed70c869894bf1a37369bf1b98f353caae79bc05fb9
-8c9d59c91e67e9040642e7b4c54912f603bc8f8696ac9d667c557c0e0b90679d
-9c809c82701fd2725752ffe02d243baa5d340a59d26935d520b3f0a7eed8fc8e
-fc352542627f167062b1d2657f36e518ac54d03df9a51e857a3ad589f7986513
-914d6b735e08c0f0e9925a49e08921da73050d323ef835f24565fe5b34aa55ec
-b8c41e873d766d66230b8156f06580034d61e5060f2b6c8b7bbacc2875c26c07
-ddadc43a8d13860888dd97accc083e597c99cd92180582ba9fbd03d6339efb43
-27af006d0784c3f661ba85086486f91df5dff5985c111dbd19c17b357bbee805
-6ee8afe1802988c49999f36a176aa339676f67b3a99638d6a9db1c8219636720
-a64fe07e8968c0e2d013aa3583095c15b4f6cd716dc4cf833d4595a5db580082
-66c95090df00addd1a266558da09328570fd3ebaed85e853b0c38fa90ce59417
-da533b879bba9813544f8768cd27b91275d44b3876c187c7b1866b943d01cf14
-3dc10332256dd9d603641390e9c4a5d69a2e3a5a64cf5f25f3c97fd69673cd04
-af830aac66c8c58c7d6ca5c9491776b6e0ff293a7340f55702448d1c13ced978
-a5925f0aa260461ee1c304caaf92b12f5e268ebfa0ded8cc0262bfaf51f5edca
-c304414a151d57c00c8d81018ba41f72e9f6b0ede165a4902be08de6796520f4
-84e03e723fc8fbdd5c708283d410bff715bcbb78184c9825bb93b13ff067b8b3
-8f13ee2781128cbace25fd8dc9b6cdf0094639797eedaf5cb118a2de7d53d66b
-aff54b243047c35c1fcd4adc5942757cc55792f3370059fffeb95ffa99f10e98
-adb201b57efc5ede4e03dafed763d81cd47b4c575435eb7bec1193ff84329a23
-8cf67d8414e8d1a57e41f3ed0ed3b46f1dd2edf8ef198cd857c05dbc65350dba
-a939e74d0394effef3780ac622549b301ae4539534ce23da4757a7205ca6dee2
-fdfc6608444093c046976b919204c92d985f4ee2db74678725c56348c40cc447
-8770ad251b6442630dfe076de75dd57da6a453e8ba58d0016aae4dbe05591e80
-fa2c2df3aca1de4f21d86c560a9d25280fee16d5844a5308d7922d9bc40201c1
-c648e37d929853249e572f88b21ec024bd07a8cf3dc4fce45df469c94192563e
-a695b6fed264c72b66256a3e9b0ebbba06d36a9dc18dadb4ac7bb9c33918a106
-ae23bdc5326af0b6ef663b6ed2894bdd80d334a084bd692ccc42fccc033ccb29
-5c7bd33199403d488c61a9e0c619a8e501a4f5c8034df1d2782d8286ef950513
-be7391b1543e36fc886672a4556c66c4a92c40ff9abde49024eba8e041236d3c
-f68125512f1803b8cadbdaa0926906c6a33ed1a52c75e5589dda5537ed70572b
-6f94756f25eb171372f4513377760fab4bda57d5badf1c2f81cc68f4189cf499
-bfc5002e5791bfd84a40a69983dac1b26cff33475913e7d410d65d228c695ed7
-6e896482179611844eb586a8023e6e03af4c787d991d361be5aec58fd67222bd
-a3a63f3785abfff3e90eda8f151bce01026a425587da9d8001e532fefb75db48
-ef723bb5ff12398ad736c4f329fa941b1951e171732ce74b2f569570ef9c11fe
-8e15a4746bd8c4dc3828e431329fe205584b946ac06beb7efdcc77d5bb6f299b
-265a56ea29b78903c605c1ef909dd25abe6562103084f9eccc550698ee2ba7c1
-ce69e49a7a3dafb88a155d7b6922c9efb5e1f8364728cad0b8b4761a1370f06a
-aad0d9467fe10f58cafeebeb187be257859be4d730f33c8d4dd5e1b0dffceca3
-b23434c2a25bb9cdd8c553ae92093b594ac139fe70fe9f4a607ed7d4f44fbfe7
-0abd31a1d27f550acbb627ed100b06b0a90af2c1aa9e334b54b23863693bcce4
-bc517db889fc3d8d179d670b1e282c6479d4f278a620bc61a5e3977458da98b6
-dc4ef9062ce128fc59a595f9741a7ab354a086bd1b0cfbc8830f19a0a5b7a278
-1ba1afac9e8f805f5563a954cbc48e85565b0acd3930dac4f1f4d0c0eb8b833e
-4ef339d3f5ad304e59f0958aef225767f1f992dca2d9279ed920e6b1f1d6ca66
-3814264a4455e999bde37475f3bc5ecff3622581ea9145dab6acdf95c22fe293
-272d2875a939ec35af73933e9acb08e419dde1c8296e1a5ac1006dad3bd4ff51
-f278103d486128712f55c34f4e1da744350965f2692d8d6690b67445b8d0a2d2
-6b1a18c1cac898071b9371cf39ce17153fa963d83e646486d9449d434200b912
-5bef39637f3e298c5dd1f0e817f523d68a994b3b05c8d4dab4700632f39f6410
-3417a3c7562cd8c399ab5d9b9efe99688b832d5a2dbcacb4ad5d4024ddb302f3
-38a6eb2e23e47702660dfb5327bb33347c833ac8c9ac158d2e676589def43d5d
-9bd741ff2d68859e6974891121a14afa2c9a0b591db56404b19f08adc039a6da
-0f5477677ba691e27d680068f832603cfaa10b27315e4ca8d8fb63b6a3c755a0
-aed3f49af639ca8735928670f37018e48bf3d9ccd8203017f5c52d4dcaaaeaf6
-d91371e52550e6e0bc72995965cc5a9f987e2099bb915bfa28fc0f57cbd740b2
-6630b3c1fe2f7314f66c36f3014d8940a6b99e20c2bbf66147ca17cd9d52e2dd
-3edb04670d745d9a2b33ab65cc16a68fcaf84e360ae1477d357afa62df1374f6
-1219e7ff000117ebe8dc15d58a4d2d44102d235d9788d897667cb686a61e9519
-8ffe8a7958659c0ee5e1289c8c1676ebbe71b61b20e4eb930d14927e2647ee60
-92b3a7fe0c8c02b760f75b85bbe0a429d98f021d0f4d9ae2219efd4dc06f3a44
-a1718101659bba461a904c2560f5d3e14a0b14992b489b2b524cace637aae881
-030ca980db54d8f1dd988ed0fe2da5f799c393d8d12582dd218710e0a171da2c
-25f637290d2296bcd20c593c0f4c3b05635d04b4504725442a5c038d3c3d4ca1
-9e121199a4517edfd81f9e50b9cc6a88c8c49e048a7de4dde8c77c9eb4aa36e5
-5b26a061ed03eec44693b9f5a7ef0bb70a26a147bda86981e93ded72f12a918f
-133e63ad8507daad920be5531d03b75b491f95b76e874180b434ac0795f961b0
-aed9e078966edf01ecd449afb7944080f6f09260e767f3a388c481df67d4d6a6
-3d5949ea21d07bafd52c2bb664295bacee81ad5a2b16e4e560be69e9f19fc9f0
-d5e0772784a6917d2bba7ccc8455f1572a716f1e032f5f244dd26e5e77bd6894
-829620277dee975d609c3a8d13c5dee7d05bc9842af7a84e9753420591d0f6e0
-e457111aad08fd5818b23baecaef43d6c42c423f37cde8ed09cadde44ee7e8b5
-c5699e82dd3b7d5f268907d978b58fa774dfaf90ebcc85ff390c78056806f6c8
-9ae7aae8295bfe14c499513fd2438fec5f13a9299500b0abbc17df9c39a44098
-1784299d7229e0f36748d957e5cfea65d8d2c940720ef6adafb4b40ea38bef22
-a997657aac9473469b33f7b35cf12f92a8906149fc17fd56febb5e8d728671e0
-0df089cb79e80e41de415f9e7d1b5b93a7355d9eb79bc74026afcfd0e82b53ed
-20715a06fad8a586bd1961b0cdaf91af18045107311f73f8f9fa185271ca70a9
-6242825133c68e6e480a9d96ced60694cb24a3127357b9ddbaaacb314bc76870
-8cc7dff7c1d96ec22e39930613b154a2d52f6d0ea5eaadd5429c2738b27bea90
-d05e15b53c2481406e56bd2fbcfd9c73b9bbf9ff905fa83f6359ccd92f2f6494
-69927e744de743f579b7d3c0221c8f1e644a49d33e86208d9f3940e313abf42f
-7820c38957f38908db156a4820cee64ffe0ed3637a26ae347df177abd9ea683e
-91b15018fed6071ac92cf31ed64e5152636a01ad869b09afc76a753620901110
-f317eae8a99e5bc888bfad1e435302146323d0b752d0347c9b5c40fca5393ee5
-ad16201bc6aa52b4700d790af61387f16f0ab6977291dfb25ba200ba5248bd25
-4850cd1197e0a7b289439b0442fba60a1896d5d8eccdad1f16e5824e665a249a
-2982bc9cbea19dc6a0429e192f005474e775d5dff231d5b3855a2da7040c1058
-5490126dc9c2e409bc8f4eab60b75db09b08c94c8a675efc22a0a8931c790cad
-ff09b39407c33cee4253e5c5f9e806b5bc5fa785fbfc6db334a484e8e0f023c9
-9094b1cff83bfb775af6751a4d1010416b4886b3a40213297340212604d556a6
-2c56be99d04ee8c1c0772783df3bfd97a9600c3336302155a019579b1c753b81
-93b5712637288c4c657d66aa21aad4ad0660f160c5c61c2ad73a1e1ce7518c31
-2df63067457a38a37f27e3e4224ae637c2a977a5ccae87292abb73a29b019bab
-91c4ad20b02dcb57774225183f9d386136ad0547e86b64cf5337d42efaca336c
-7bbc10cf8163aa44fee56370a74d47b6620c9c70f822b69d292e3a2379fd776c
-7540c44c8ba1f0f072336630d77e45a96b232897d32f726bc579fee33e2548f6
-3ea6c07e6b7c8a39d82905ec789c2ed837a380d354e93064a516605bcbe587e9
-99f69b562805b54604a6ed75d84f7cf08bf33bfde2cdef33efaa1a4e417d2640
-a05bb5f57cb7f96dec69cd6bd3cb909cfbd3088f60d4caea3373f31a684797cf
-0b1cdeafb76cace154d45bf7775f6441acddaceb8332ebbbf148395e08073da3
-f54f6d1a525217d554f294d9665fd12766de19fc11e23a1483cb0abc75b21bba
-9f7c2f5e21a0eb5b79585b9935b7d7f2254c4f7311d6367a6cf51fae5b228648
-8173d553701cccce508b5623bf23bb59a66356800f2513725046f115d10f3a68
-4d5aad7551797c563a6a5934cfac1c95216db928d08a8adcc4d12d855c142f41
-b663ab4755813cc4bc432147c5b9e4949d56a07c084be5bb14b74ff3a9ca0fa1
-708e861d3133c5caaa90213ac1042dca3febdc4431fe092c35cc2d60fe92eebd
-c96157af469b6e3bd124a183947cf960aa29504dd4eb9fc9c10d1bc77363644b
-6c452a8824b48ea64a3084f6219c65cdf36a1f8a4d7da515ead6f0e03d0bc2c1
-69ad00aaf8a2b1782c990f7ff40fb9bf2c00aee85eea074f4568760d8c78529f
-835e6ace945521a39af3bfe33b73b62a9c755921b29c0167190c6fc2133645d7
-6cd319525acaa82fd7727b055e212c7db32b5efda34de81160378efae97fcb51
-8fc021af9ec77692c0bff6e8ac0de9f938ad65c48d56322c5719767da14789a6
-06dd5ae421aeda6de57c968c883ae17712aade14da281fd823c99561b2c7895c
-c0ae4cd1a94e689bb579d3978ea9b2bd70bcd167f15508d1d820c8f54683cb3d
-8b302e2af9fc2474245fa9c3fcd50f57699ddbfe78c83b417f2ab301cf335284
-c7cca7e8d5225e036591bebcabec13262d1a7782f1e53e2a1d75c152c0ea6d18
-04cd294417f9cd90912181518915e6d81def1ac5957a7d59b62c5766e8ef3554
-43938d39498456ba87c424013135609c6437aa6346e59b385992b196e5bd7f8a
-0b44804854f29e194b6c2959ad55c5bc94cbc0f41f837d72c1e91e795e4d98af
-976eb1b55e01ab71a0a786032fb6a62fc6201db7c67f2340a5c504b9a9a9abb7
-3df1694ef6c098769477cefdd3b4b77ab716d240ff9fc0a1ac737877658df26a
-b6e7688c7382d170e1218cfc3be31a193f26e9a029c74da3ba2661014b58f58b
-2cc7719be663206c3cb3f8993a3400c149326651751e8e9d7902346660c4f845
-c7b0bb144ffee8e1187efc1a5e9e44fb277876d17221287c87ee6351a5c887b2
-72e0c04d45d060190dbe5b1bd8afb1de6c6d984b65362bfb0f9a4aec15979b4e
-e94307f351f30f02d8656f24a4885a5fe3bab465b7a0421f240edd8dbfd8f4a1
-fb2af2f4fdcd000d0aff4b5ad85b54b98a83c59654705ca2df9ef54b742bb3c0
-577f7f422cc7cc380e5dbdf0d4b1fcbcd418a219b88279fbbc8b5397744ff5df
-1d795570adffdf79a38a6ce62456c2601b8f09bbf18287bbc7ffec9d1b164856
-77b6f176286998b7e76698945e70510ee09966817854263354a751cb09afe9a0
-76b86ed14a837dc7c4c15ffe7a448056908deb055a02558aacbb6465481b81d1
-f42fac1b857a516852b3e7db8425d23dd0e2e80c423abcb3a5b95f1d34f28e76
-74c3e3a77431cf1f75ffc9f61efd8c9a09fe9d74681e541e4435d8443fbdd7b5
-4975b26b3c69d2e2283b0ffd5e934a480c4ee656e068aed4fd180fe5f6ef4af5
-1fc86e6f9271d0b07bc9805cfb43f06add9ec5e410a7bffaa925d84a26965fb7
-6942fec6318bc03627e112f16fa00f56ef464096aa0fb4298a98b3010c404009
-d16c2c133878b6f2988107a01cce2c7a3db4cbbaa7adc2d45083903a357d4911
-3775dbcaef8f814be6d600cb277b9af93d8ab005fef834ad50d8ce9d1dc09f95
-5b7fb930cce65c43d9cceaaf4517b8f1ad764b1c256280f19cb69373805ac79e
-a4cdefaaf9064efa1247ba74bacb09fd16122646d36980eee215f83dc9293193
-02789698f6fe0c5a0539fd7ff2b8a28746d92354bcff6d6c056171bda61e9ad1
-bad7f68caa7c81dd31d3effcd9074caa07943ccc3fa68438e9712002d7b7d5a5
-2ed1fb85a70e55a15ffd0fc5bbb64265a048ba668f0e8513f733ce257473c517
-0315715e26e0676819f8a16c22d8eb39d07846efeb177c488957a5237fd3d592
-3d10c2e5e1e6b50992649bc18fcc70c396312b350b9cad02e0af2146d9894f50
-20eb54df3eac30225deed70dfc42784e3da822f380f46b4b3036261b2e19e933
-675dc99e5bcb66381136877f0e9cb2ddf01522a66b33d559160d2f184a7ab052
-e5129afd8225900893ebd39e92830ed4da59e777ff5b0a298a2e3bcb2897a6ce
-8bec15a6522071afa21cc13ef47179c8877e6b3722180f9ce4ea63302640798b
-af1d2fc6e0132b3505d3b0e949d6fc4d9f744436c619fb0611b13a6b0a4e2372
-a21d4b034d9b4e0fcdf5f25c41e8ce94c8e417088db74d2d82a618c18111d385
-c4c66d1f37f6e64b8dfde45ad805c374cb8030fd3db32e8489ee7243c78ee4b4
-3f58f68c2f77d0917aa51ea69481d98cad76a2e6a2833f2b1cde6d15be2188e2
-40f304e95494f838630665b8c8330ea641683eb4aedef08ad22b5870e8508f4a
-098fb39f4dc7ec87bc0eb35ae1e97c29026d6c800deba720641445df76d42a8e
-6470dad8a60aebac364f773ab9e7f2a8b31af927190c4baf7f7b3d2da3becaec
-06162e878fa179de59cf84e37f0e56764963eabaf87b1fbe061917749ea18ac2
-1794eedf33f62c32de4f3db287d51373384a2cfe30bb5daf59aedf26fb1fab59
-5e8897f2328f9233d396e692cca1ba9cc4e6246968ae05fee297a5cbe1dec18c
-59d1618cce3b4bf40d4e07de3cff3b20f7bb88e7f1323f64bb8ea416700c3703
-52a06a717e69ceed80be16007079ee6d7ad3a87012eb2929312c2b68aa785214
-6a5760590785548490ee4b55bd78f179671e74268c670dc71971773683014080
-b742cdfa5f5c58173cac5dd60832c9b6ef16b85c4280472c96e264b54f158989
-386bb30d4336cc099887921049db56a41d2a6f57028a7cde2ea150e9bdc16d8e
-e0f42177a9fb423f2245a34dc8808ecad15ed373a368dce05930e4ad627da6ec
-30c03a2b9f4368ce8bea2a19405a5dfe6745c90ad99baec67cef778651e4ddcc
-e469d3978733fab41a687f7edb977653d119a9c8d33f299836f12759bd4f5abf
-ab5b1679c61b46854d8c9345a33d3338c813f5f8d0947abe01fb4846afee616b
-84f713090a8b665320c9b3be3baa1c7d1923804bb5ac590dd2f7d1cca105e7ae
-a1b880890497bdc0c965e6c355463f8a5c481fa144dedeba2b5d6e1c805096d9
-f343738b9bf2571b3675a19a2f919ad7da95cc16bfb4d7e83bbff08c5bfd5b51
-b3ac712724e9d031ec14e05979f79e2db6d1b85755c327ffe124bbfb62c93f0a
-28e5a60ca370948a3a2fbe3224849120cd74ae75aad8e4d110ea8cd3f7983cae
-e269bab03078c3ec14d9169b2ccd4c5a3173d63c7332b2ed58b622c8bdae6c31
-bbb347a18271f610c1192085b933051bf4dc83f627002b9654092bbb48a0c6d0
-e280db40562724e3284aa644e399062787a2b58e850adb5c1c3300c2731b53f0
-ea5e3d8c37ca795bfc171259877c8c3735a46beecb8e8cf9bf7a3ebf60d90a5a
-b228dea11f5b847663d97e8d43416cdab60be9641282027a152f39e953cc263a
-34e070785904b1cdc78998d53ea6a44b2edae5be3a22aef96970ced5b1a8fff7
-20e39b7214ade784dfb059d1b9ff5e8a0a1c910e0d6dd399055d7f91bd13d9ae
-2b6a651d1ac110d1bf8e2e43f1b4d98b3bf62b7aff5e7744eaa994d96d6a05c3
-cc66b18ef140d07551f83bfc4fb770f8674a6f9e844879f3f8b7bc956cfce62b
-c658bade1f84701103df87cf8ee9e5d33690839e8fb6e3fa7ede4fa9e093da77
-81d379d9b12bf2a56f968d0849311e81a72c96a421b6cbd58ebbe138ae58623f
-2208930037c3cf001134035d7e47cdf849004522de61c27263c515655618d1f8
-69784ab3f742689ee655228e1672ac9ca1806b76232fc9eb85f69b110ad6caf4
-2a054adf4e2767a95f5534c5525a5a6ac6008a10a59cb28bb70e1a41fab590b7
-3fcf80f3a989e905d344ce643aff41a74275905e9235cd33818c5bcee1994c33
-77938f2c4fd08fd052f6f59a9460d7897c139729e768cfa384df59bec67dc82f
-5cf8e2638bbd8dc769ce87857ff6e7c4580ed80e630815057a0e381a91321af2
-aaf3710f92d3bea496587cc1baf8e76a90d8406716ad85e8bb3067ee410e32cf
-9dbf16a6ba4a6993a1454a393aa1c6a4f5b85bd71dea9d09e16a82a2e64b5c98
-8d2f05107b11cce59735219b104815e38219b1dcc2a8fac862cdaed85b4e7f3a
-3f8de686cbe956d7b11ca62dd89c68754e56caa56ce6f523579e725213913d16
-987674baf3e75b9e1176845eb69121707b6d061fbf86a28ed7e3cde2c0ad5fff
-3200813651016bd240ea190b9240e682df8104baaea088c868e83924bfab865a
-99831038e67d113489df5abf11f7cf0c1ea9c24ff19a56faeeedb1b2e103e0ae
-b28b73d58224f590be7c0a7548caba79e8a312f758e48c9eeef76a012383e31c
-4f457d451bb1c3d9bbfa9dc84c016f6a34a40a5a7f61d5312abcf985a5b56bd1
-de2bfb6427053f4f73b04f545d2e7941d6aa8a465719bc818b14f388161419d6
-9a965691fb68b9a8a0d78f89ced539556ed137321ef6c35884e9485070d884da
-b5875d08200a593ae7f9398f4684d19a3a0b621496f032fb8d17a5735dd5a288
-0058b60770ef1136d78fc9dec10e5d78a7dcb4e804d199b659030aab2eff0a07
-c64aeb7b5bb2181d8a80f3c9c5bc1eaacccdef478777567c2f03d9706b4dce68
-2ee5f872e112f7a952101d859246bddac59acf9339b546fe213cfb6230bf2862
-3f0a53b0439839fdac6950f1d1ec14121a8762c94a928473e76e767931fdad0e
-c399a7b27203d2198ea577f2a518fa57c75188fbab9de2e7fae055afe6f3c7be
-80ae91ee04de86ed38fbd90fe76160e9eb222cc28c11ba39c3ec6155233f4313
-5478ddc2fcf853822921c9a5dacc1bd8a11858ce9af112e05ea6923d4f3af379
-26359d6f9fcad59dd887a7c302e868cf806c3804a997810b16d66ec54bd8993e
-ded40daf9c1326d48d649390652bc12f8df57db93013a53a340d060f8f0ea208
-51ba4eac5c3d3afce0dbdecf1b6284c3c16c5529bca906a4cbc295fbaa9b2588
-7d5c2c70f6d7e0e0b52c4c4f8fb406e03ab88787ed35f9c5d95f6abc995be12e
-9e51fd4f7771512064a1b2ecd96e89151cd5e135ed5f5ba07a16bcd4e51a1622
-75d9009dfdc4ece7a5bd9561a46099f05a8dc8f350069aad74aed48f7ccb4b96
-4cd0366b94ee152fbd623983a5fc38b9a68cc3d08914d2822e78da693b850b07
-b85a17793750802f661978504694e3eb4b5b2fea34b48eca0a8c24ef81d29ba7
-f6622d6be3305d90cb2af2d67a665c9acb1159a5b34353b0bdb0626a71efd2f2
-56188f41f6c85800ffd51866fa082561b6f19153b8afe445f88b4b7f15f8eb6f
-757743d88a687e44ede5135356e211c8b155f12ee7aab0f9abb94dbc3c4a5367
-737468e6a095481a76d16bbbf8ecf6ba56f710b1d18af7ffb4eeb8275e095d76
-743da78c7e97bb5531a71f00ae8e8f5dabe1bbfb651b076aa72fda2d8bd0a645
-b4862be4c0d789d645234b46286cfb807982101600186720180ccbf34d64b0d6
-232be45545cf2f4bf0d23dee4548208296064165c34a52e734155f56cde02134
-60c4aad2e5d9ed3b44a42dc897482d4a1f0780210decaa5fb38ee0cd00a8254d
-239b98ee8d82091f45afd8b2c825af54d78e1dafa382275da5fc8d345f643df4
-e4822123f04d053b026bbb686066674630165f5f0ac094d184cef0152242fed2
-fa7b4bde415c3f9ed71d34f37f59a132f8255706a3a4777d7af1fbd4321c86d5
-bc0fc80f4ab662c0f1e59689b6ffc36d81e9349ed7b762e10d85d7294e7d394c
-616f67dc9624951164f310307ef5c69db573794a6c0c67dfa180a6bf62df1194
-63029907d339f69af39663e8346d43ceb7433770a42c00c7ac49ae623f4773b4
-20205ef154d2bf9053a159c374021a8202b246e434164c4353e96c3055a70a08
-b890bb0bbdc381da324c1f443157880753f7dbe688640f35d012d011fdc3b84b
-530ed296eed8c3ba88ac312a5e94d23c4a6bf5639fd103c14db6fd71b6751d57
-92069f67cc142c1533e54fcd76109046f1acb94d66d3ead2ad35fb9e3e8e349e
-dea50fc8fc4506446a8ee556f8c6f3bda2bd502518bf237a7623bca8e81655a2
-22aaa7d829acdd789664f32ba972b6dda0b6d69340ac6a4840352ce04049b134
-e34187426220067f15168f593bad76800e3687a9ea99d5d79a544adf232bd90f
-205865688bcc84739eeb804f99f354dc932bedda4a54b0ccea94d3f129bb5978
-60a8d881a7b017c3ffae7c8b5ee76d09c8ab8572c81b994d49c2efaa80a5f2af
-299945e831d2335d669c596b4af8e9f5083f90d7846b9be991430e7d396efc33
-c232634fe93d5bde557879b106ac4c7a124d5cfa47250a666c2cc9ce0a158d37
-63dec10be1648ffe60b51e94e8317c71c0553ec74889f87b71c7920fd676e09f
-5f21a1fb909ac44dba922b62597681f9e9323e3599473f39e52b1348bf585cf4
-2029944d229073babc0536e8f4d73c8cb49264e660f0df5f606af0543a1137cb
-5c5d008b019d542bdfcdbb3761d8dc373a20b76ae2b4885189edfe5bfa1e0599
-8fc793a9804ec309b0024a04a3c24a1efa61b87d1bd95dfb688a6cba47fbfb94
-5ec8770e1ab19a879891ec6318981d6bb73234675a44966630f34efbea0fe1b5
-a585e5ffe8f6d58ffd7abb3a7a13b0d532fcd8cf878e57cc0dcb761f291c5536
-dd8222e8777f112bd7c5d9d16e7ea46b00bebba2fd8870fd94282339f7298c1a
-cf2f3c0eb7c203181b55043be782b79c1e33a178c53a7d09dc2ebbc3b338e5c0
-2dd813e2a456d88f4b658bb35c6ccfb1d51f83073cc5643fc3f98a6b712dab8a
-a41ee7183668913669d13c9b0cd981f1b6fae03f47961a49e349bbb0bd62f47d
-5a0d4c35a9bd80945177b33bb07ec5c92d03364649fc8683d1fc202c5ef8ffc0
-d7cf9ccb7589ebcb56f2ecbfe6a46a028b65889014748d56968746e37e9b4310
-7eaf668a9a949c851870dd5564e29be355b75f93496d997929888f451f4ff7b8
-3ec717df9865ac5769e8078669da3063645a9ae0576b5576bcfa3c1cecd8e82b
-6a6727448ab8e6d5f8a06b08c885f59fcb66e918521c32d006aac974c10323e7
-a1f97b9cf30c825c35483db7b5196744be5f286fb9814c7789ad4b1b397e00dd
-366b5b80a7e5aa28cad3856fba593cfefcbfb19bc6227b79c252936fb8f2d49a
-2315ac036c6e08766aa2b287b6e0a5d851cc66afddf1e577793209d2dc75f2b5
-d8050b0cc54efc673ee8e42a0d305812a5f89979478de4c24896489ee3df4328
-a585536232e065fde26e460fc9435bc02445058d56ba2bee0a7b54e359867ea0
-5955aabdfdac296c39ba589f11b3d2d9c5e3b7508fe43bf63fccddb5ba21bbee
-4269b218d978b5818751b2ac06871753c511d36f82557f561eb95c3b70f712dd
-fd84fb5230b503222cf3a17fe8fe2666d1485419f4ad7bcb32ff66396d929d3b
-207df2d811ee6fb1b4392f8b1a993dff3c254ac865a5217a459b24158269a889
-2a868c6c4fa9811e356371695713123d01a261af4eea0a72061137a17a93fbb2
-151979e29a11ca6914e3c6ba7990bd0ce58cac96c2e84927d1de1754a9d56ddd
-a0984576475946f63c2c454bace266de5a6f4487a03ebcd1fb0df6fb22af5434
-6938dc41bf1517b3fa99fdc97a8d09c320388fe718a843fc3d7ea5b5ecd27985
-74b38fd9f1d21f2d4a25d0688b7d311ac747b12066a7866204b91c648d51a9d1
-b67e7cdcbe4e4489948f9f70f6866be1a92b4f7931a12d134cc82fdc4782e8b0
-d42822d2fa5df15b349f8f8bb4f56125e5a578b7afa2f409565afb59cecb9952
-aa42a7bd56fc954052fd6706caa5fe3ecd54035f2dd9e10336543f4eb99e3177
-c0d3b65b64252b132e23df390875a3a612823d62959128b25e688fefd781df4c
-11a205fb7337c83b3191d7e38bcce10ccfa3c411bf6384c456e7d78bded31f8b
-eee65bf5dd748fbe4f70fea9a542f894616252d9d809deb49a9775542e613919
-fb07e86d16b3f51736e82d27dfbfed036782ee3739871239e34dd7fba8deccdc
-78aba8245f945c5b2dc53e2cd2f1354a5495d4a002878dbc7ab9ff6384d9d9e9
-131b73814ea9e5fd0b57889496763d073fdc1c5433be30acc62f3fca83326384
-5bf724e35bd947a611a7bcae04648298dc434e415b8c1236aa8bcca1be497a05
-8a0bbf35d224c77ebd7ce63a69b21163534c00499f312de6cd1d63112fad9c4b
-86d437a975b0854e35c68a0259e0f9aaff4ccaf3938a2e7711d6545d75f264d9
-a1a00d8407b8d2107183c2cade139485cc681b1127304fa3c40d377dcad69884
-86593525bab6ecb33e02c7203e75255b7e778583cad2c2bf8d5da414b37d87ce
-2c230c28ba4761ffe92ce3219d5168e54fc89ae3f1ad70cbc9b956b09ba6e3ee
-58e57de7b56d02a9cf7cb8da0d6ca2c3076cb9130165a2b65bdbcbd47c31ac3c
-382e0227ea54e52070ac8f126867360726e1124415c83ff1e64eefcdcefc0ce9
-54ff72e9a015e02e4bb8b9ca0e04592c833cb2cffa03eb0447c1cde397b2ef92
-2c95430ed3e54046921ba40bccde14d4ce5a0fbfacf25b2c7d7024545c4b51b7
-d03f662a87740abfe9248449753a9007deebb387d7e7ab76631aa062f79a434b
-35e38c577bac6a5efc56772255ac92326adf9023aebb17d8e073ed683a029ca7
-8da3d55197392554af500283b0e47611a3e2b68c852c349996113e47742ac3fa
-20e61b641e29eaadb4c90076d2734ecb674e64d25e859f6a085bccdc22d35885
-ba0960eb7bf1072bbe291f9b1d1ecd7935cb7656ec6bc15d64975b1c506180eb
-0dbb33dbb74551622ea37f0d813c71416051d0ca33dfbbd0d552863afb7061da
-a359160a493ef304656fba57239ab154af8727eebdca342b288bc07ebed351bc
-f276f5e6c1dc9cbdaa91451106df45822393a8eafaf03c3f024b20dc0bd5e4df
-43f3c6687f2019d642fa79e8ff88a42506d1d7d6b9be7feeda8e21315efe471d
-59bffa506786dbdbcace04a8fe8ae423a27b4b9c0c1b8dad3600f5bad7bf1780
-759d7cec3cba13cbf618a53df36c5c2702a38c3af55bff63829ad7f7ee534144
-13f4d5614c05b140de29a9db8135aa108757505841f855c24761c2ed71f89642
-041c855fe532013d0febf7a861bd8b019980fdebea9b245fc3059a8112559970
-a62fa095a55c638bd7a2f28fa2da186d62f130791e8c34e8d7dddd1e9cb6319b
-cf6ec3e238f5c1312e92b5dee3dac520eecf315610fc65f458f9f48b0dbc9e93
-b1343008995ac25955fbb881b051114ea5ec4a45a729fcbccee8da29c4798237
-5db572fb7eccb0ba2b41371686c237234a8866be9f1017ff5d151b931248b9a9
-d279e6faad1cee0e2c94b424be49aed7288311ea1ae5f9612bccce83e65ee68d
-00b3aa5358cd9fc62688a7694a0e4de3135cecd48721bbc4a686bde074832dce
-0f0c31099b35cfdbae50071d2f4c26b55ae51b919c4c1100a02927ca59cef516
-ab603d631abb6ac0a5bc4788bf8e53f22f83dc621cb82372ed4329f60e180c17
-e27e822de8a5ea5d3fb9e0ea0b2b96f1fa398392ac2e001721ddd7423f19b967
-4053cc18287e2ba5a3e2d0a0e80d93ab99b0b3ecb3afe71f6a384f62b938c818
-17462294d1c9b17ab3988e7ae73f3efac6ae24b3ff82df6eaa285f3ffb3248d4
-fadaa73b7217b0c1faf8f4dde2c53fe9ece617950bca9b3d66f0251536963e58
-15c6dff60754eda6427e43b0285643c0a619b14acf45da5dccf94a2332f99752
-dab07d1417ee757010e091cce4143b2053fbb276f5e1675006f3198d865b483f
-f4f9225dc95b47690742826aa2c0798e8adb97bcf983cacb4c3037d82a0afc4f
-5596547ffee1dc83e7fb94d3d14aa19e70c4d9bbe9f0cd519cfa91ab345f0e6f
-ef54525efc326d87993e8e51c9472be3b346b06d6a05b93b07e04c45779914c5
-66ae97cc9286e7218b9dcae206c48f73de2df368912f7a45602cc3071170b502
-93d8a6adc85da881ac3eca963b02849ae9889eacd3129678dba7d032d465fcf1
-bb50627f25cc2f290e35ae4897cbc9ee040e66db1cbd80025ca4188fc2d22d30
-38f7cc8e488b0a769599372fd924ae386c18bb6313b6dd7841302b8bf688ee31
-4477d11eb74b2402dd2a4dc51a6e795c141eb38a0920d6fb582abb07aba1efa7
-d28c7e6a7b0952e1ae2ed26de402f712c27a96c1c51abfb1f5d56c0b67e65cfb
-08adbb2c7f725dfc14c054c84e875746a704ef41122f0e9d496dc36d38c80861
-17341595c9c1097bd547bb1f25a5a64627def63820479beb5780cce34dc7dccd
-1d5bb7718177f49c6858c94178ab5dfe5a973f4fd9b621220c13f78aa5d2258d
-25cd8deafad8fd1dbc6778ff902e36a3c190d60547fa62f0341250ccbefe8647
-5e4b22828804d03f17f54549a66514f6458694b884a8a733ae55975249810acc
-354cc875ec55260386693c8ae60160d7af456e43e8b7a3cea517dc502a42803a
-73da983f7a78d086652d3e0add8fbdc7c9c2cea754a8305b9b79e103e65b1832
-a6a024a5b8fa8c77edcddccb5beefa3c9d1d01c37a74a08953642083851fcbe9
-4d8bce1f34b7c71b68f3247eb463e7a2fed1bda308c877e91a86d6052ef9d55d
-06d6b83b9af7600d61c36a6c460cb43af1cd5bf65113115de83bfc6081d1c0bd
-d88f19949680caaa9f48a608fc67deb98ce9577f24f1c2184530f78f788e19a1
-5f17836d2522fc9859b80d7a3c032f533bba7210e9fc43740dabd27fca4c0a84
-fb0b1849a93c4a09c58c553d0e910df0b2c5ba53e8290a3fe05680cd7c611bac
-2a82297a1d42e400df434b476be5a2f92aff2db009d26dc81043bbff997ba7be
-eebe8ebd761d56ec4e45328dc273f86f13bfc0f5139d908145acf933632b4f78
-aaf3d1917ff63904f2ec971b5b2f4ee6251c0e6500fadc45fd9aaca127967082
-a61ca2891a40763f1fa17f5c6ad3cd1643be1c088eaf4d91e328ebd670768dec
-dc895dfc6a554f7428b5423a86858aacadbc8819c0caf25ce204f98976c7f18b
-071b79f03d9be136d36b51fbab43d7b7e4a6b3792e3a0c39794c46eb4f4e27f5
-e805923bd6c4c5ea9612fac86f7ffd3b8ad343d2492b8d9f052baf864747fcb1
-b6465f1b1b7e020684c863ea38668c55ce6958eb6bdf0509834ee6fe50864116
-e3160227aa042e26fbd6629cae19d0435b19dfbc92058f319de60913fa956fd3
-26e76b5635b9f4d6adeaa45f31a32c99be06343571e5176e8a89c544f6ea4572
-964f1787df93981b88f68b4999768d382128d5316e83e74643d70a2ae288291e
-806d19b180582e19eebf8d295ed214d966b5282e93c32452d58805829d69add2
-4d9ea97d33da81df65a4fe30ebb6b5b8c9b5102ba616bc2da448eeb0f0a93762
-a40521b52f7387c535e17069ffbaf80f0dbf57b296043367237fa4229ffe30ca
-938265084c735ceb1fcaee87ee82a2aadf9efbbb4cd80168a0f975b913a236f7
-22fc543668e57e0b0cd201b099834b660b49673d12ecba4f123be5545bdd0df8
-4f1f0e00c46c679b915684b51995d80629cd4485a67fc28a18416a3639b11e34
-b40f292a620fafff9e21b31c85779e885f07fd8a400f84235b585634d233834c
-d20801ed4b4973f1e91379e451cd8d29cff2b9989ced4fc976536446fe2bbe7f
-f446c5f791ee401cc5dc916d94a2631396634be1a2bbc944da4017ebc4e3965c
-e780b758000c9928962f667300812363c761d33f868b1b8753adfc3e77666e04
-c1e468c04da304f2876d1afde4441719c3687c19e75dfaa44bfaa64bfae835cf
-501d71ff247d1dd18953e980c8c3701e1215c588ab78b27c41c35c265063c5de
-6fed78259cff1d0c848272b4991c414e94fb052043e0a7fd59df65fa27941e06
-9f1ffa2c5f0c32d0ce639ee9c4a5ffb288b749094c464c679ba3e39a11a19cad
-1f5192376ecdc9a9afabba7f4b036edcc94e472ae1d1aa64197eff0c87dc4d97
-5fc283cf7dc4944ebc13bd1e937c97e59f053633c52afdfe1495953740578168
-5d137087920373603688a3dc4ad18137b7dc38d8f94bccd6419d9d356d7596f2
-e027ff487fe91e74139ed748df7de8c3db5fbbe0e724bded756113bab6047ab1
-574e67413fd8aa1aa851d1841d7188685f0413ce23140d869c822e22ea13aced
-4ba4acbf0d9b65be4227d95e84944ff8de263775659eb52615d6ab62319d75bf
-805a6abd316794954d029491f9fb47110ed48760f7b39a8ac5b24841536c2a02
-2555eb6dc69324f9d735e5f2421c2271e6b2619d2515e035203778cf0233bf7f
-e98f23bd109cfc4ec0d01e3db3620b1b9846670bf1a8b2cbafdf7731f50601a0
-214619f59f389d6b1e0e0f5660292dbdc7f2a31a3370d54ad4b02d13f81a2f4d
-18b6487425ac00228266f1027a26e4903147213a7a5c29ba1bc748da6385d919
-dce09b00fc655251eae84d6f56ffdcadc25d8c22d5171f8c00ba8b61f151b985
-6d55137cb7008061645e8e4f2315c1553381147cbf7901c4207acf851ee2d34f
-ac0bbd28528525aa65c6321cbd68bc64694838fd81b20845de3088ec9e13a886
-801a40c656766860361e04ca6483aba7fb9ce30339df27fdfc44b34fc3db554b
-4e4ef91c3b7ba7484cdc036fbae749376229a608d1e00913c03018e247cd6346
-9769dfdf3012c2f562905d9da397bd007b2c81c47b8dd3ae61362fc8661dc620
-bcf9ef2561e3c342ad2f3962ccffe8e98e6d62c65fd9ab872783dcfa035ef347
-a2d0d61bc2ab27e4f96f609b91ca099895354ea9aa11881944c99ae187fb591c
-01cccfaae4247c6143689dc9da0224a43c2ce43b97d49c0caaa14b838bebc579
-37fe3a2aea774f1b1cb928d69b3cb31f937ce83097b12d6f76eba9be803c0a31
-b0bd8de2b22489e3da1b833bbf7524252d51ccf76088fc4125e1d0e6d6815468
-547b248d16317095d732d1e9276d063ab7665d2e684ba272af6351a737cb8751
-9c74e5c624c79a852a39bc22446a87c09bf4ca365b1d134c7d6ab23fb5069d83
-be00745f0672fee615dd8071b8ccb31a4866853d7805ba92c618d2b849ffc498
-6fdf4abc9711617d498fe7013936a85d12da318bd0b4d2a2dd715749747cad04
-ed570e583b2f33855af8a8d1437d389d6e9b3e47f9de9de4481c492a05ac49a3
-457307dde03b8a30ef2edebd60a5c556db43bff4854b255c716cce2eb9559a95
-5dfb185e18a341b0776d6c782c98675aff75d2fca752e915f58e5c9d0f192914
-88e46db6a51bae30403328930f5639ed29396895778431543578109c917e5730
-9c5cccdb2b6de16a8cbccd1bcc97556e666701659a43c5af8848fa4318cedb25
-67050ee249eb8a7fb5c210eef38be485c82d69ff77d68982222387a04b2d08e4
-48aa0d2dd0201a1d06b8bfc14169ba52d34bbe65a03715df03259656760f90d1
-043474c465b5c900b86461c5e33a5f93210871d0979fdb5b26ca1b2409c8b5a2
-9ac23b4a69053f7c63efd9c9d904472e1c387f97669a830f482bf3658403d095
-9795695185c1a677fd24f146a4c01821377e35373c2f29252f2d33bdb4c2e65b
-54f6fb2a74f4f69c8099cae259e3dda70f680d76027e951c523b33adfbae41bc
-33940df06666a88153f983ffcf016ad439a84cdbcb32117e5e597c541e7192b2
-11177afe54f0ccacd3b67c10d44ddad93e604585a513831c8ba986971b189295
-843caa12d4c3066951a9f5cb6fcaa07444e4be618b3d6de06fb7754823e62fc8
-a87aef5f867e80fd2bd0c699240cd59203136efc3a94eb3259f68a81e923a78c
-8c30c38150bc808b7a0aec0e254e623474456084331837bc16ef060780df87f2
-f74fcf280ff478a04add5a41aac7dd136afb9a4721cb04f1a54e8ad7c886cef7
-33d14d742c292a307b8c50ed8c16756a336c45e6843342a15ab362170975b429
-3986013ca616f6728ec65e0b4ef1f4b648db8f12c74e38b2164ff0a056b53aba
-a218e7ec36425b4e8dff37e420ca3e1ba16c5bf6adea301e6039b596f3ea7b29
-df568fe8c742d0bcafb24e7f561c73aeca87ae7cdf7ba2c4173a5fd76f941586
-48144781457282078513542a6ab75d2dc6976f185604e4ffc7480015d9feb000
-46bf9f6650d702058dda7e4f410de647e3ab2ac42561e4c73f96a22fea4a31d8
-f36da788f42ccd7ad66668fddac36c37b800b19bbb32721c40fdf1a523a06750
-86de6580a675fc5e254d782daf7c903bf2640aed85198ffd17f19d91ae85b526
-448d14aed5cc66dbef9b510c9edae9210dee8f44670b4ba2945dd98a92d49fdf
-b884118efc1263ba6fd2712047df194e12e107b793287007b57145b54056cde2
-e8310ccb234ea73ed35cd7a060b6088fddea99c4d93827a0adbce5d927faf657
-d3a7f8a49626f9ed40e1e3aaae8650268c4aa85e8b51f63ebe592e773306deb7
-c78f80d5c96968264d0001bda325f560e664f9be197ebc3bbcffcd0ae6fba5d2
-fa83b6da0f8a6278c84530e657e59ecdd591660a6607eae2191a0fcee0e8b8f7
-de61cc07fa55dc1b9bbb98930f93b1d9419b84e6e7b8ef2595442dc264c65746
-1bc7a160af243059e0030a31740a012b783247420967746903bbf44ff2b33aae
-487fce9e1b54b1e67fa272e64463a796201b20b6f123bdacc9f04ef881b16ff0
-b60c151419f090edc5d95ccae9773dd1909a37fee6bf39f2fa658c1da7a3ec5b
-290f183b4ea95fc6edeabb46b5f518a63d7b8a1e2e0b8c1eb35c95963ab65e55
-9720282fa5e4989ad605ddf5543f50382f539642340c26e379b5325a1262fc57
-532fc4e6a315aff2d4159a0eac7fd498e09ba2e64dde029f33402a21f54efc92
-609fbb36907d798a34c86644264e0ca3da53639e262b49be5f3d212d36086fd1
-5b68624476c0ab1f715d35907fb19dc62625f59b5e9e63cf8fcf3c3c68a6e480
-2d927018240a8fe4230922bd0a431d67664753d51d4f5ee894b5ecf678f342b8
-05b201c2d4540e452a1be93da7c0137a3852709a8362355935494b1401ab73d6
-0c4fe07b2314e63db3005a40f4b36dabd0db3eff936b0a1cc643227ca4fb7e0f
-a29ec03ab4610337bbcb63d72f42716fab0a3058dd961b2f291293beb9126000
-a8009a5ab98b0c7529c0e2c4ae27acb684bc3c07817a2d13c672dfc6cd448f2d
-9c8cd5a1f597039ff2601d88f2b3dee5980956fada5599c5c968c5cd2db83a9a
-e24e2a9eff9d3a0a488f3d7a68cd056a6f8502d6e5a61c305fb99416001a691e
-fa95afc08246bf070268f62f8ee9e4ac8b2d812a728db372c62209fb6b5f6789
-7bb1443ad5241a004b3cee1b9e1671d5de56ad5491e42ea7325cd718578a44ff
-fc73f544a6b0b1df27c39e213379a1017d60c11a5f8769022bc8fbec7405f4e2
-bef06c1962e4b4c45a1e080ae095ce911736f220831a2bc4c958a607b9c88a05
-96beb76fffcf4e469e2dcc09857bc9ea5687be77e1e392f416f681dbbd8da68b
-f378547ecf9648c1b95005bcfa1872dd1e72c5510bec48b0e411ca163c8214dc
-0efdfc1f08e925a5bfda8e6ad2f9ee106ab0a053fab30677c6ed7992899d3d1c
-30f11e59bccb1e0b329dbe5415fad4b7e420cf9c2caa8f7a032d5e9f9558c2b6
-80f5e6af2158a8ef1fb1e36554ffcff934bda7039ad926ab6e12555d30f76f0b
-e98e2e19f12d4f4e8e5ce72e4b2928c396b2e9debd44b9bf80e1df5acb4b9097
-f6fcb00e1ccedcc72e494e68d55151764795949847b513c4cf8694a759f1c5d3
-c6884ed10626bc8eef3097934426e7d45b919ec141b9ab389746b6c277469d33
-b82da2ef40123707646ca62adfeb5828706b571e160efc63d98e8e30af9a7c6a
-4046777b2a7c17d08e0cd5e1b79c261b60cd86fee6668f6a3812c6d1bbe85d1b
-53a79f0ff4e19c0bb6b2b07c3bc145727d25f9adf2f6ffa14e74e33f21827092
-1ff9d9227d08e044cc750d532bebf0962b6f65aa2d50fb238ad84646d16fa466
-3e592b1e3c21b07daa5e8978793436c50b30f31b17f3b8c3a8a9c98bebecd6b9
-2ad5f9a99cb4649d799dfcaf8860759ac26182ed3eb6a82a980232a426fb7934
-7869b8b24c966de308f669ee47f623b95abbd9f7d81e5d0e81714b6f328599f7
-5e7f9a85f92f76e3df446a7130fbd7652d17abdc021fcdc761f300cde20bb116
-e36484ea2f2ff9032bee64fffe992b4c437845edfa194bfa3388a22ce241fbd8
-fe8d0549d2bf43f0ddc6b0606e976dc36ec055c3722d7fe96a7339d15f93befc
-74b063908a089d9684f93364476f9694a9a4a4e46100a6d5d2f3ad34702ec2cb
-e64cf76d70e70fe725eb25780a3dcc619c3d3d1fab7d93ffdf695c9d2d86a007
-ac11eb3d551592ae551cda8f78ce2f4a06c798b6bce573d35f9c01a775fd3e6b
-9d6f2eca089b11c38b812b9fc497c58d96797744d9a433f0f0f545bd7b4b6ca8
-ba8011c1ecbf6ef91b1ff7d016865871a12eb9ff3f55e4052c152de96bef6d1d
-698b9918a8a68202378374097d8ee27f153aa3eff3c6d49b67d8e09cb51b9bb8
-d18eb43dfbd8647e4d2b3992810e46ac719cbff5a28be6532b39c2b462620109
-f42cf1cde4aed3b9f78ba888824dd0d32778be34ef4a7a84a785ad7920621a25
-74376e0faaa0fec39bdc769f5526fbb3f620b3926f6bc749df679115610bd29a
-fbefa357d082db7719a75b6396a01b775bfde12394c4ec0a0f75ccd92de8803f
-ec9f408861ab730860e0309b3f799eb7d99fae4989c83e46639d08a662e71ede
-60aceb5280b19a7ded32438cc1ce140487e52db031e53ffdf299d552b7f9556d
-438171ee4787bc6b445dd2bc23da420747f6e81046e715dd6f5cbd9a97f08deb
-a742feadcf5d93c7c2557e69b45a505b91ac6799e37f40a2a70f3d0c0885f85e
-cad7f5d5498c18d496f84010cc0da7fc91c4d1eca61ce021b3f204ccac60423c
-269631a05d330c8b4574754aa6019885866e0245eb7efcbd747dda328525cf9a
-3b13b29b8752df2c8c30c0bc3207b37948c30a2d037a29d1ce075b778db6ce18
-551facc66a4032c9479e5122ef759d8c58601a572b0a02d8c606e0f4df80f411
-ff5c60c06c5f263375fa7fb67b6f670a453bbda2f41e71c7da09770162f636b0
-108680424e1d6ed498acf2b997dfec6d8079b2d26103c67543fd0bfeabeb027f
-dea56c640827bcf1d5c9e353e30b46ee9d3495c9af5a6cac79703aedfce3a0c1
-d4ce1b20275ed9de111473494bec7da5d579ac5260aebe9a0cfb7c6730bd51ef
-c8b8343166a6ea72e0c25fc745b2c425d852b6cd9e8e2c0cfb16be2257bf6933
-86693e380a7eb1c9c24f193620d886921945e5043fd6b8798c1105ec40d4fb82
-56cc8ed9699a1f84d7438eb7447ff6112686403c97385442c3d34a9187eacd1d
-dcb4b5fcf4a11e90baaa10fbd457053f5270e4cab233f41f56cea906103c5b3b
-0e7e5f9b8abaf1d66572ff8b15e0979926dadd51de964dbbac8abc813c28ad71
-4b14bcc1690838b6a2a33a4045e7ae481d679178ff87b65d5e7bdab7bd59b536
-331c132115020fd681ae7705d805023ef790e163ec92f41035e28c6edebd276c
-d4de63de8141cdb8d77b6a657713bd1c38f02ef1d97dc791883e15d96b7b701a
-2f124ebb9aa3a2d90dc825470852ae8a959e10375ee5abfe70aa5a1cc6cb58cc
-df3ccec83216907b8b80ff54f35d53a2d9c679e61c2cc9d8b3271c597d1cf153
-f5dda0a71eb2d2ed289a5b0d8eba301e7a4fe05e649d53cf3c6275c802b88fd6
-5508933966a5f261c898f755a60d7d3c95223e470b0af6ca4b2a57615c3e2465
-f535753c0c3d21f6cbefc29036d3e925a4b6216290abf8ddc86ec955157ae441
-6772fb59eb3b6280a78f9183bfdca096d5b46f938058c03b38adeb1b4f4fe848
-ff24ffbbab3077bf50b1fc474688bcb05d9e07294f3871bb2c0dbd266866cda9
-a22b2f3638e7b93d6eece65df65835d6c8396e5a109bb65d9f23619ba85ca9a4
-34564b9f706f2b0b7b68518f6e0962e101d6a2a83565cb1bc4342fcedb6e7394
-4d303d4ed4f792238531bd105fff9aa61c29bccd5d6c6ee399b48ebbb5bf3932
-63de8e873dd0775fda5861d1a9c547c01fc3cbdb7f9574f14bdb1e97280c024a
-63a922657125be2d5f975e86c0e4b9b6174157126a9a06839530543f1fefb261
-143c666c42615933aace075512a988c9f2a46a449ec3b13fd118b4626e2a047e
-fc90a20772c4ebe9b23eb733fd45dcd20289ab7d801aaaf5fce13807ebc84420
-fcf927bc88e48903f17bad04fdeccb76c7e2ab93e008321fd5a83a39b8325343
-59d4cba664629d807b624ec727850bcb92043788a855a28e86aeed0fddc4f6f1
-fd11b6f00224dc2d88248abb9245112914e92c933800336c75e10550610c7569
-e09c8a3389f88d25cb30f7be1a6accc5dd17b02f141f729f1b36d32fe93b4ce9
-75865054e448fcf1ca846bf004c1c67fb3c48a4ad2bd9f1d594e4646eac106b6
-7e747f2e64fddd88d076c03b8d7fae26b53dcb1027f92fe769a8385e7cbdfff2
-e569a107b76e592fa59f8d92e9f009ebbd872a09f3fd3d9746e8a8955634858b
-4d4d967be07f8999d7fdc0ffed37e83f865469901ea075fc27e9a759a50dbf02
-a7a1d7031c78c9cd66e359459469e2896d6d4fff36b7b2b510d66761fe133053
-b2d64c8199558288054b842da2816588a898e05f2db1a5e11813ad89f1660910
-410c531faf42f728cc1b34188084de2578dd0f5458bab3c17da610b7d6afb635
-8ee66f8094436d0c4896550753f4a06cb566188ef59b536ba03ec04ee8650a3e
-3f3a932b61c940bb0eeef0ef7c1301ba52e59a904542ca2a9bb82e1e03500a04
-f818f8f747d3c431686d543e47b14b37cd1e44f021a5da657aab08bd56cbdd7f
-453c331b7041958d618d4b007f5798cb49260ab59801977df6eb49d3f1e609a9
-c862cb2a297a2acab8d2ff5263f40fffc73078e777863f7947b0419b6026b7a9
-f1c14bd344902c8837f5a5c6a7002984f40607f8dbf01e9caa04aacab39ee10c
-0509c706a04db09e08ecff57cce67da05ac8dc14f700b2ff731d0799236646ba
-68f305cf7f79020dee5c99511a37b63a693339706560635dcc6bc14d5d12ab98
-4ec26e657619d2c6d8f6490e55d3219ea28c69cc92c3f67bdc437a77fb9b320b
-ac18393b3fb793c308e92a336b174f7355710966c2cd8f1f8ee6f081f0c3031c
-58149c41849c763fc6395658dc43c86f5488404778235d7f066b3654b9e04d36
-786c1a766e2a2e10f870246bdc94e9241267d7b71c0f4acf0365d8f8dd3c1c1b
-178734bf1ccb8d202929f2e956b4f27809fb2e2677162c978fc098584f510765
-415d6254734a525d73c92050c3a2dac12e1c037eb2c1f1ea479cdb9a2da0e899
-05b9eb18eda7a314654f7ecf608531be3cc30bb8abfa03102a670b87b61eaac4
-5af4d898243ac70207fd1d5803138a78744528a47e9e371817674f2ca6b97a59
-f19fe641e8e121340daf52a2ed995658806777619a6b6dee640a04b63ea9f446
-f4dbfb071cb6f6b4d82e85b4be34c39a4d2dd417aa93e07fe3b3ee3b53644510
-4ecfef4e1caf7b89c0ec5c3ae61ba1e958f114aace905f7cafe7a2fb2cd17e91
-20275a058ac69193c471ef47490d21770792563a63d87e23d8e1e6158fee9510
-eea1d2bbccd5f8e28d63c04bcdb78b3a49d640825559634dc9e5625db3b72011
-85de810c60eea94efd5e25a04de8cef3566c0f4b6a92ed6e58700b5598fcd65d
-42c4ea8efeaed8168f36893aa2465f7f6d5d3087763b4f2a53b38ec3a61173e0
-48a4864ae6a6f6ecbfa1e92f15de678eea897b0776c7fd7ba192c7da0277699c
-a1ba6c9516f89ad044c418c24f8af15fdd129f2db45cefe186a20c6abc895c94
-241a19145c7f8652439fc92f8ee142abd14bdb4f80bd43c3a3aae6cc8c77b759
-21b42047c0e374c123d3f631e25bbf1ab42115927ff52af0c3c8a31cca288d72
-126fa5bfc2d54aec8d05488348b72e80b08cdbf483d994cee779296b9357fd9b
-addd288dc5a8ae95467e485a92409afbf3497aad25a097ef8165c40d802bf74e
-79f08b2320aa4b110076d4ebe15d073d0ee1107ed6e9d58c05286c62f4136b40
-4a89129c66c1d1726c99b8cb4ba8bbcb6b3b4e73a11cbf11354284f23a76e0f8
-aee94bbf4d661739b81e3b47d5b4ace66f695001fa09a18a9960d741a8cdcd4c
-4dc1c68c0fcc38416fa6f7877befef5aba8968621ff6653653b3c21c8bdd0c3f
-07b8eede44036cf8a0aaba353e2eb14cdc1341687bbf0ed1d1f910c6ee563179
-95bd02430a3eda60eee5d36abea5ec10e2de1dbd9e3cf96c0366b602ff976873
-3a49d5019640163949e41eb4073fee6681d61698932a4d8c613b686bee37bad6
-ee7f19ad012634c3b6aea6a4d44d1bcc018f57a72cd1b078ed3fefea13f991ae
-e6619bb1136bb64b271c96ac8b4290a34040c3d56638227676d75655abed1eb6
-d709082d70698cbd5940cde861d6dae8a7656d6772b89202d376076e6d530a2c
-c1ffca88e2aefd6c4ba2f3dea6881d835bba8d433e18a067bdb7dde867edce0e
-48d9854f21126726dfcf64cc97831883e35fc429be7c8ed512b3049b40af8114
-35477c782c676d374dd41673af8e4d3d929054f1cb3aae92a20469fcf2b0ebf3
-55e18aa050c89b1f35c8dd7ce1f26dd542d6c70af4501c7486a72cbaacf5624d
-66dda7607fe961681476fd54154705c0b0a2fb1f8adb4d50dcef80ea10b341ff
-d276e9e12bf4a41aaf9efff1b98a4223221a58eeb2c094972c4c61aa9d6b16f9
-a36fc6af6f121158c9e3d3fc47b8b716c785c0699703c91b80a0478a391ecd41
-ae7d56b313ecf34774933493d949346ed190a7a4ccb7e7fddc8da3c77324e9ae
-70af63b469cc3e8838d61784dabede694c35cfa46f1396296424ce3ad1dc7d05
-e6e94624065717493ed3dcf92620e88472118ed0981ffbaabef21fa5c708e3c0
-349c89b88fc10cba39a1807c8c74aa70829126ce906a351203e1542d43a45779
-59e9e65bfb567e9bb7929077a0a1dd08b089ab35fcccc96d3a6d5ebbe4860fd4
-3c936648b92b2d455f979d985bb1af8dca29859224b2f1e411c2cf9489d41dfb
-75dbc22658a45c16da828652dece832db5dd454783bac82eb4a33a4d3b82f62e
-a36ef09beb6683689077c8fd089efb46549515ffc875cc48aaf4152fc484782a
-4bfb4b2f38ed7ab8600d0066e27b03b7c4c21643f3e977d1a9a830e714d54b05
-04e2b7f883e9ff51f49621e53edac289052e44dc1099aba1717391973f827b08
-8b2c076e40abbc61fb9ed2582ef2484e7e07a7341defd54da7e21f16c071fa3a
-51aae26760029cb64ee948c4a54725890907e94804fd221be309b33ec2901dcb
-95be395576cee7f702a03901044054423e3aa0c508cba6f545d1faa5eeced999
-f0f9d4bfc5495c8fa65a1f18aa190bc11ea45ab16140f8ec88d309648c64eaa6
-57210b86df19d8d9ae5b98a2b74ea37b88cea4e11c44f879cab4e7510ce79079
-bf63192ad4904b92b6f622e535b538f246d802e089ef1c8b78666ac83d20f864
-681183aeeb6b4043afef1ad4cb4d5ed2d0bf8fcc4f1ee159c1291050da9a52ea
-fdbeef2e5d5b2579967b4f33aa310f8c726aab7b9a0a07523a3c17174ed67a37
-bea1fa202f75ef9dfd3c597f3d983bfb53ec3d5c0170cf5405ad3be2634315b7
-f823b857f8854bd67da9ff0a01e9950bb0699bc2a4c0fc0387f336ba33d7ed71
-84d531f2b0bf886b562c2ed2dd6fae78762d409ce0cddc96a7161b5b597fc154
-1a1abeb0954146fcd3e44c93295c709e30cfd0b7ed5eac7cc4eeb0e99dc8fb07
-9649645b8c590850ad20bc44eb2c4025a0a568ddeb503ac1c21da965ecf9fc0c
-5631cc74b3b0ef2b9826e2b4103ba3e0011ebfc2f0430afeff63ada1a3bb5568
-55bccd1ebab67ea9a04bc971ec6a055563a71e362ad3cb79d4c1ee5337ce5f87
-098a0ddada02c19cacb1002146bb3631beb166500d1fc9ae7b88949e36183f9d
-86a17a36b0acf3421162cf120180d3a436ee5f6bc937ae7cf18ffeb652c48633
-20ec0d42bf09c22daeafcc2bd681f19bae1f8ef7e15f5e09c4beb446d7578b0f
-49f2042482b785e8543acf5159a40e847b078629e632c5620b86e0e539b6b4cc
-f78da4d96f465ffe472fac5ebf8ea6e68b2310a558b9ce3ae2d16f0bd1a1caec
-e3e7ff8ef1ae81ec8fe81c6c5bb7315165e89d753987eed98ae9f2d89e3336a3
-0fc24c0f8c3f2ea135f6c306816470fdce5d48a229783f3d1f332b6f4ac565a4
-0b1ed85630e64a1ff78ca6b92d47d317064c88124331b78cd6caa7c93f5272a5
-123db565c6b798967e149307118178b1d4a0417c95b2df7d2867e15e7d5574a1
-4f2146a5377247336c09f3e4e5b45db385d7cc90a17543b86d7c1f77bf1c5182
-ef3d26e6e95b7365d12d5845301ee48f90391a8075a80306348637b56f25fb0b
-5ca4f6b8c2041a5697a182773b30208c5afcf5c9acb8902dfeadff795d998cf9
-b3a8abb77f90c91542ba110ef727c7d9a13696d858bcd567ef5d64ac43d26c20
-a9aa27606e9f5770c3cad5f8a9a527de7403ea118c8e43ea064e6a1da9af3382
-38591437dda2a87e80a9028459eb1ec3411b3f24f27630eb7e356ae3548570a5
-8bb9463d1abf3b3608ceb02aacc7c9c06ce283355e5073b2b445bd815d27708b
-4020e90cdef6bf39de645736d0730278dcb3fafd44ce088ab70287d9c767d49c
-8ad8117251fb55718cce2cbaa17d8494369b3ab37ccc50484fe7bf2d305210d7
-e011d36728405d1ef1a73f9e53e33ddc8fd38569ab2bf28cc07d0799772ab6c9
-6b8e28f396e0938dc86b896bd668768493ac290cca566e84a0aa432832df3b10
-8525cb08ca50ea7d71eb8d64e5ceff15da8a9c89849e85269cfce2e09fbcc42c
-28a3d675d9f75d7d63778deb63893b1e7676ab4408719ed6e3410b4e2b783013
-de27eaa26e7318c372ec61282404e7cb9f7b79d2a65f8077f0a7a1733538fa78
-66b32437cb5fc67eae875dd77374d3f2c3c082f2eccbb5d7887e49ae1adc0d84
-0f5171d843ea609516da88bbd906a8dbfa77cf4e68e76aeaf960cef82d8e8f9f
-7d03eea0c16aabe9501fb6c1993fe240b8b4804d92bbab0bfd58b8497e45d410
-033735eabeb4c92d17af8b9c5dd7bbf93ca4ef8010407d69c35a2b5897ca56ec
-920980a1c8f159520e6dc28f3a62d6e7d995df93447fc8e9c19215cef25dcd62
-c9a19e12862f8e3bf347561addfa34c9e85598b68490553cadff9ebebe1ebf9d
-954bb6d27608acf46322ef67b6537ee8ebf6c16b97b694641e9f2858fb9dcac6
-311e198ed43c34aa0a023c1008449186f2659beb9bf7085cf7a7ff5dd048c910
-66e704075bc9d5da90c2d26b14d7ef8e3d54fc72703186a8453b83a7bb4fb5ba
-d3f796de88910b843c9be15ef354d26bd39e1d1503385a169f3f92b16f3f20f3
-1ea9cf4642d5977fd23aa0e13ca82377ec95fa4b908eb0524e2c573e42ecf2bc
-90c51054a9a2e0cc8e93924a3f71edf177cbc656ae838f0542833b6deff1f990
-7d34eecb257585fea135ec1081a97818479c80215e8d5c4fc9ee6e9f68781682
-85e8873da0a1d6e44b3187df9a0e9cf69372d9fabbb11c9cb68b4bfeda609682
-dac5b5e18f004096c42ed39016ccbf4008fbbbb32ffbd970888247bd7d57b1d7
-11d4b5d76fd339fb769254a0833157eacf95703abbaa0936bb10a59e9149f070
-f82daa134f97f0e48f8cf9d508523e98d1e331e159a0c422866620aa859a30c3
-ea9ba48d4553ba65dd3f316bf64c103ca11839f2ace974e4e26221ad9f6741a4
-5004d4e3cd24bb296f1c58061f245792a5999a8053b246568c8c0dce7a030d95
-77824a46638ab0e07dd74ba20e76e28ddbfcfc27240998d418e9ec12cafb7dc1
-7e5916bdc46a59f31b3dca99263bc1c785aad33ac1aa0c57dbfe09d7757867a5
-67b47395f5d148c9ffdf1bb401e216c79f5ea233cd2a5a82c94e24f778c25353
-145ea4fc505c32c168cec430b3fae9e69a921daf0d5b2afbed1575fa115aaf2a
-61f1be743ecd301e63db4996958698cd1f27aaf66adfc853cbba31e0f98d8e15
-d2d643c8a3cae4d421a52adc0cd80d2ec4ec9e9de7bdb1315b52ec72d437746c
-5c91204e96e3bc839aab8833a766a7b05a223436e3a3cfb5c689425360fb7fd6
-508f6993fd4fa79dc4612ff9faaac79eddf47e0da29d6426508ec4271f1b87ac
-446f79d28e672c5c04c6b46e0d1b102cff6b9700ba8fb08b3139d9ff06fdbaf6
-a55128ea0ce3adb73fa00fbfe0450156e9183f6b91889d8e4ad6415f8438952b
-de7ebb125e4ff9c2e357a32d3707cad278b9aacc542aa83898e6a26e7f8719d2
-6088f6be110f7000a3a4b48ab264f84d1d7778629c41e0a2fc2d34e22382e1ef
-e688ca04d31119c4c120da10b9dba2708bf54e3ac3eb183d7f3b5cb8087249d5
-d4fcdfa9c4b71b036f46f720ebc0563f45199eea4cca13a5b95963a677a5b6f3
-3be08c9275fa8e66823fc04c151ae6793919c89185f65140d8d1f6772927b88c
-42c0d16d08d563f5b93e05689e7bb8ea958f90d4e5eff9bfdc7a5acbc29a4672
-f532776c79f34339983ccbaecd33a9daf6fc1672229c0022fbb13ae37f6fc27f
-1107593d8d88aa67c1a76495f5f2e08fe8d1013bad99b694c1762ee5e1bc100e
-9bb119a159392c286fc689dfc0693fb911d42d47a0e3ac59b516115b12884ce6
-6473c70272420338d03d2ccbe9f96e4fd12416939e92e52e3eddfbad15206bc7
-9fd633cff17ef63826879fd701f275b5fa06c48f462f4f5f9ff98046827c37fd
-91e254f95a14b354a0b5759d90a75eed92f126191d6437a81d538c7b55986e2e
-18523bf547845d77a3ded6c69ec5bf558094ddc40a6505c938ef395d008ef1de
-1296388919a9ce63ff38f476d01bc30445338735c7fda0359d03d58f748f4a28
-ccac2ba01879bc05a44fc21835e4aab1204b1c6b05ecf32c8247a63fb685a523
-35505e2be2b0000c7fdcb1604a6d480a1a5827919bbeb66faae78ed7d27fa8a6
-436af96fbefec3ee6e8f80cdc4ba28a65138b6b18671839bd96138795bf389bf
-2298b851db853c7906178a994223f533cf3b00680dde84aba13ef69f8191b7ca
-02f5de337081df829efd5f3f6a435d6d805272afd5b2af3eff829b14cdaacb31
-c179bbf59a3b10454d0b81e0382fdee3cd5c941a2c6e6b446cc7b08358ef4409
-c2a4e6ca109c9b3dfedae8728f60b560ed3ea8252d150e11db2b7fe19c8d5233
-1e8385afa0f792ead4c2ed5d3b0044dae4e732801724de12d360f0f47bf6d7fa
-aeddd62fc5b21f4dbea6ef739d1a005b141d4ba3ad34b9c34257ba5eed4b2e85
-4f5d8d07e0ebb4bc6b70d5a5260c7c0b4cc7bc1044c77e8703d0d59c9408f103
-6737c15b3ad668dc22066a6198967fd8653ba004737f5394445da06fb344a4b7
-43a1debd846c52687e9eefe5e06ddbe8c8126a87971a80d67f4600f442220b6f
-4c41f388645a6fc978c6dea9b31e09732f050e19ffa4b112771741c025d610b0
-6e1f8543890cd4cd2125d9238d008091ffc2e78ed57b9a6ec5113cc8044c9372
-f305f5ec1a992907464e22188c13ea10b1ac76196336222c0e052ef963a1c6ae
-df38e2fc92abc00d5a8b6d8cc608d670636a15cd41da8161e03d8361c09fe713
-dd60041cfe0c82f9df04625f3a8c01f1ff3f9f2d571e406a5775626e3dbb7d8c
-1e4aaf46df0b42e8b8f9c2abcdc7ccd0b6b6eda2fcc1602f0b777a8e494a892f
-d3cb1521199cadb66fcf60e6d9163a2ab0c2cfdb20e897a1f16555d97c2c91eb
-946d05f5905982ba85b77ff081d1c69f73d9014423795c4001af6f9bd2e484d6
-91fdc2a911be3c9185b28f89fae11ed94de19cab9b52e0f52493707e73de0e31
-f9d558e75bea05a5b02f5918e7139ab065affe31956ad54865d0097c9582514d
-99ad462d1a4de2ab2bac081e92ccead8c03318b8ea7f6d6077a779f74173794a
-59982dfb57998a0e64cb6413d774120fa51c165210b3c63678b0204d326db945
-678869868bf4abbc060d9961c03586e3603d01bcb12ecbeee7ef95e89429a2e9
-980c4c2d6165cb22670efdeeab861b9bbea1b10ab948c9e99eaaa7f0c6603c29
-c67bf2d42ea6e029bbe2ee4f48634d7c60cfac1cdab4daec98705fc8397fc656
-af7cfa465ed1f7ea9c0d1c5a86c5a33601d75c0293f9ec0b448fec40e348bfee
-4aa7a6d1293650c7773562b31cb8181535b3e5462b6b9acf3f74fbe01944512c
-feba186065cf34877600426abccae5ce76bff790dc03bf0758b64e5c95010a10
-ac1197e84514cd9df7ca150d0585a09bdbd3dfa86b6c8d328f4dc8ceae0122ea
-d7833cc21d6628c16003f7fa5e28b392d80a246483856c63dd35233cc7308ace
-0bea9a4f2c4e06e544bb2d5e412bfac62ec648f9fbbc488d65ccdb2fb7a6a3f5
-c682b805a16c6be9d03f4551387d3b19ec6f2ad0d2969041b18c0ed96ba90d74
-cf0c9e4c0812f2d98e761afc63a71e58e0eb5f4097bd7e72e7d650dc3a2b012c
-9329124c1ba2f4816275aab0d145103887770bfc9e488ab635245a5c8ac03cb7
-90aeb5eafc4e99e70e37190bb5012a6987ecc403b2b54b0a3a0bb30587e99fe7
-dd6beb3a3c8df7a50b4d5c350d7182e4497354eb5538061458af62d5a111ce95
-08a94bae4a4b9abb53f2d4395bd6fa4c1da13e97e4db15c598468d238b81a78b
-2a24530b43d81dba1f265581be36f4a19b5c51d7aeb0b4e017608656c6ce7cb4
-adcb33a8ff7cc76f7ce54354aa76fafd4958b9e1ec9936e587ecd4fa75e3dc0c
-d25ea85d744d52c8a6228bc4c9718ec43d056412b513e141a139f5c118a44060
-9827bc275c901b5ae9b6179a04513b6c4d039edf8cdb3f2c95b43316ada44146
-f9e7fa093fb2acf38891492cf93e407ca813da0ba34a3da595c346d3354c1f81
-2972d78b5fb3d09e413adcceea264a12da69451a786db4c4ee8f7ee2ebdf0854
-70f04388848dc5c782f7a91e070e1b79776b9254e27f0a0b3110c431f8fb3848
-294e724802de1e27ff3cadb8fcbeb920e7967be152c10e299eb30d632f54fe57
-823245fd26dfca5036c4cbebe443e8a4a21d1e6ef3f1dc6860613d908187ba56
-dd64f85dad9db1504e7f858cb388bdbe829e067c8dec2125c764b79607cc822c
-fabb2b2cc93b4d5dca0568057febf7cd86c72762955f2c9d7e1d734da77b0862
-60915afd088ac2b113aaf06be481ca2174fb224746e26b93175da43dbb72f4d9
-68a85dbfaa81b6802c130ae529ffdaf3dbafb39b4c55317825b3c687738f4370
-621a2e720ca0d5710f3a1d963c424a73eb88af68c3dc7ec0996a11babf14c823
-a3d52369c42e84301b47c9ebf16e33cf02d1cb1c872b0ac7ae59361d330f5fc6
-31f104cf221a3c6d23b9314dbf3190edf21331787a0ca1d55507eb76fcfcb8d6
-da4e2ba9d793d158998c06733cb34dc891a8e296a48bd0c0c4dcdf4fa27dcbc9
-0d7d1ead5f56a22336bdf4818f4f8ee4df9b82223389507725837abbb193854f
-fb0ae2c55d8259aebbabd35a4dbd3433430618462e9f23f91885d0f3ac99bcd4
-9d1424f9aeaa09887c06c6f62e07339b3e4424fc920b11bd0dd53b200c896ae0
-ede4931f85766645f04c94877b0364e6e7e2a0ace71347b8ab0323fdecf82003
-ad75a9390ae1d10ab82363ba83bbedfaf24225141a6033bca3f59d065926de8c
-efcb260f5e394ffab5e182473154b81ea98e5cbec099eff84d53b9348f4b081b
-9f120e5275d4e9490044fbc2a9d275b84a9a40b8451522e79c2fd383d5866c96
-84db0c0552cbb14e67ff321ca84793e8ab95cac35e71ae4e20958a5b274be4a3
-641cf01e9b50487a9263f4e60a7ecf6a80d4e2269303bcf8589bbc7d9306411d
-1f95e0b59d232b303dc030863cd6a5f25c769dbd49e150f56c4b0efee4c096e2
-130321e1dceac61b3f45a808fed8ea47e0354eae9578991d88c58526ba635f93
-591b3f8debb90e2c5a73050766868ab418e6bc1246f9a200c9010de827147f47
-4a9a35b39947767a2cf12774083708e7e7d1f25f75f1c27806a7e40c5f4f8456
-8bd43aefc069d7d862b78bdc488717928c0a283cbd5e57ca76efbadac172a6e6
-28009c10d8047648c549de7f26070eadecffad1e954185ccf9acf02ea2ba7bb6
-0730a1a46969fe637617e9283cf68ba3400fbc0bd9e24dd4ae4f33241451c4e4
-0f8b996eb76d3b47f0dd0ad64ac75b6e12c516f843578290079aefa03c6ab66b
-8063bfac6b2b07d8a94f636626b7803ff277e963222d738a6c4cca04592c9687
-8a9c74a4c528baafa16a2d87e6182b7a6836e901b558d4b9ac7c4258c2ef1dd4
-e70dc0e985661cae6535af3fa04de9be151d75502a65b9ce9ca88351728cddfe
-25bcd365d219ef27b7986cbef39cb7450ae28826530e0413108d08ce5c624dae
-b1906f7fcf4d83c91dc89a1165a1ea5470ea14a91634540d7e37379d358ffdb9
-38d3c40cb195be0259757ad84e0bff7271d666c62bc9d07dbdc2f463f0cdba3f
-fd33bc0b7b566934159b77ce59a431e837c913cb8a3159b4b665e0f0cf237dcd
-69c056d03b39db46d40ad75d31a1f27e28af37c0a3d95a6bb89844cdc60939a8
-a2827f7e9d64fad39befbea536b519ee61d1db59cccd0c1c62975c34fbdc4fdf
-a2c85d3122b83d27a81ee97c81d8c1e280d67fda2c89bb8ad5f9e34c4408278a
-20ce29f25391b4aebaca2bfa94855b58e53180cacd548d084cccdfe203399397
-3b34eb9758acf3335999069b05ca7784fbb467619bd48008c129ce80598cf595
-2d2263a36ba5a5b61d4ce7faf05e651d26d9a96ddf4d6e164a76caaffc7b7439
-37c2c332e496cbbe3a15e3f07c8211c9cb6f745c0b95a5bf36c55b37056f5159
-56a87691c070a5bc22adcb697165b17de566c6ae87473faa4329f9d34b84a448
-a93b1ae3c3b05dbafc8f0a9b246ab12fb5c5f21544d790a03b0772c6c07fe41e
-561c04d25290ad18bd24674c5d557dd73a1c022c4a0c3345c4e97ab872cfcd23
-93926ce1f80402e6f1e32a069e26388f85f58a6c2f8d37185f51325fbbcce7c0
-0ea9ce821951358816a3c35d9a3ae47c15a429feeb24ee9c6e91e7e4f4e4bd5e
-8e9020451b587aff54a9733beb5ddc14d478ec52011d172e308149f6f68ef4a3
-af9f56f2734989eaebb7b1bb96153429d9bcbf3ee0a6c2acca62f586b506368e
-21494002e1c972624da592c5e0e9a316482ef500dcdbded7f4d7331f7bfbcb0e
-1ecfe5e9991d59301b062abf6cd8e3543c24e948bfc730d8344e0a323efc5e4d
-b1c037b366de5ee1eaa0a0e74f39c7b1af40de37b4327e620df1bf7eed4dd9aa
-fd15a96128d8f37f1ae60b6aaffd96e806e2c0b29dd43c7c3ccd00d936f76924
-54e3234ec6529a77332b11a25c2242c53aee5e5d128f5805fa007d972eea2d9e
-fa55bb624acd378707405ab37a49e129d003fc9d561ba621eb71f2d1f0342f68
-fa3fc028a7f3ece1d94acf6c4e91eab1656cdedb6ecf4925207b9e547cab62e4
-af9cc1bb900b02d55a89ef5bfce1a8f121d0c80276d61e41bfca88674c65b4ad
-2d66dadb8223e8386d40b775d1195b6bc6207b439b2c5615bac548dcc041b7f2
-2f84d9c3d57bd7d58d95c455d74cdba0dafdf5333988d94aea34d01d93a6fa1a
-a034f7cdc3a486f0eb051a55a39379b78ea908a450c286b6f7902c1542b7054a
-be2449ecf445f56a5a4c2ef2f0994fb3b3adaa35987cbbc0c64ebccd1aa110fe
-379f36b8e590195f4409426ddc515ac37be56a6314537d839e77dca4190dcadb
-e423cc230dc717b9e7ca35647c3113fa2e27270079736680b0abd1905125275d
-18a3ca6ec043b23ba6d9f90b88a6cf51bf8aefe90c25b5c211940058962ec96a
-c03c144f18a1e1b13d5c871c8c5c7ad18b0c3045c7db5e77d6f5ed211bea4b00
-0b8bffd69c668c98bb08f4207a80247a80483fc8fe2484483177d6547bf66595
-4d7afc64a6bdefa6d8c12d8ca7a3acf95d56e6f6098345d3772369955e3ce2f0
-affea8a2475757361e2001976de029bf745d701cf0433997ca78c8cc1d6d130c
-692474ea0a9114359f645f722da96dedfb0bf6d94529326493b6b18d6abc70d0
-c7ab6f8b68a9ce6538a1d9ff6e41a151f37e96f6735d0fb76cee4d502d13e4bf
-4db0ad2c84d44596a66ab1fde477bf14cc7e673d598cffa89e8e8fcb1575890b
-4969a53570793d3cbbcb693b09bce2ea64c33f446f3f6b71a976ec1f960060d5
-b80631526110b7aa266b23eb27b1e565b8f0d9b44f4a90c57cfda6fc917f6efb
-f05630b00eda90f568c583cbe506b9b91314e31b1738cfafce12f8a17a7bb096
-631effaed2543a732fcb2e5d81689982399e1048ff6199ee677e859f36cb6070
-10ea3ab6faeb30973dfbd8b405134c96a6d40d5e278d76916ef4b66d3bfdb15b
-f0dc3f8cc169ca142ae73e778ac690e1038e8b5898f6101ce4d57faac936de06
-890b32c3768394e0d94829f51ff9bd315fc44e33a58394bd5a996ab52b1dad68
-d010935f5a0e7f118aaf9fb42dbac4e642d5b7ef61e43ec2a5b68a3584965c23
-f842dc4cab186b39650edc77dbf52068153c875bd28e4bc30f554b88436b40f3
-1500199d497958c28391846a00f83287fb4e14e508f8954b6ac61c572e634f09
-fde116d3cfb40b73573a969774883c5501d738fc67e3f31cece099996950efc8
-e431c63ff4eed98ab8caa0ed1996ac8530f315b2b62b882a6dae49e46c834b09
-c3c0d35f27be4aaf09e0abd445844c40754ad0c29dc4fc8a3569b182003b24b9
-cd79db88db16272238f9ae5f0a5f0823bd0b174bc25448d9ab253654781a2e4a
-51a23e73e22d714e45ae27dd5e8cfdd9dfbe032530765c0751ea3395fb0c1380
-414ef2cce4944f56a2a14a564e41d9409e1929956625b87a17f64ab0131e55b9
-cc1822d73b578854e8c26ae0d560d405dc8a72ff40b240ce00d52c3d8e74e30b
-57dd3f7686f6ce18805b2b7757853e49f956abce93dce1d2700915c5b2250ab3
-7ee35b1606aad163d121c4eafc2ff9d7648494db513af8aad8a3fd1ad32291eb
-901f9afbe0494a64a99230731841c455d82db72b9e577e17676f53d5f1f3a98d
-ef88460a898d5b5184e9e1f65ad43c108f679945bd7d6c777e131fb79d99c74b
-e3cafba83814d984752e99e7f86d1dce93d00615d064427f28148b37a2c49668
-974f6a2f5de659b42d04e73d0e5137204b5e68288029327ba9ad8d9124ed4560
-1344da203d7cc8a26af36454a392193657cde0fcac0ba0fd379b74481fc56c39
-63abbe29416be7ced922f0ff6ee6c2bcb032d83bc4fc0002578dc1943549ef81
-4b26f5938980e2b607ab290de624b06c31ca4eaef275212faeda9bd87aaa1b27
-3e8fc6882f298c8e503f59279f66b7b6ea576458b979ae92f3b6172a8f6b9f31
-a7fcb1a241891f044e20a29cd948ca8be18059e01381f445b75316f8fbc77b07
-cd8558b13dedf690eac3715afe7b45421f857d7df4df4229e9a5d5f81ee905e9
-6c63a6b1ea510d0a5fc7223ca5e14bc2475952beec5de9542c692f720e33b41f
-d7d1a649d788964430b605a6092fd5653edd47967fd72f8251bd9ba5b5347d25
-3f4b2329fabd0082b71b517d69afa5ae4c6a02983d07b905d4bccb1c0a249fdf
-8c6a8b12a7728270b4e90c05c1f6ff3a962ee8f67fde611fc39d95a2ca550290
-8157f91dd7a967b7b7068d1570885f763ff2ab8d57221e4780c5e8e981ea1d8d
-b703653412e13b2e99b9c6fa232077894aae6afe819068a141b876b20534d7f8
-d7e2b169dd5720f0170d3b801741797b7c775838b4b36842de3e3fe231ff2a5a
-57421433ed3bef75a860343dd31092f0bdebe47cd6a9881a63b55e675db769fe
-182a8967fc6829a1fe49d1b25bab86c04befca59b7fb9458863d779ad8df7b42
-835ac1c5a6d16c4479ca09eadc16742be17c1e59ef1ca1fb725db9e871b64db7
-8ef30f0e954be11aff43b674a527f5de267f2b52fee2e51a6681d5ad10e1d822
-c15ab0ca73f25e228f390c450621340f99c4870829a7e223b5bea167c7f6b968
-e2f7f7d3a5c3cb9bcbc45795e98aa6013bf142e2410107a410c3072b96d24e15
-4270a10457d03e9ee7425a416958e991806b139f36d2bc9971efd6bf29e06e92
-713344c9b1a6bd6ba6bd28b6404a4c4649589cc6bc917ba6af0ac4e3ee359cd4
-48a9f74b9601dabec713b8e795e942f0fb90f15f27a8491689c14a5e71e56e14
-022233bd3591a1c7aa417b22f0fa2a7b02e30fdfd56011c508513c8b4385f210
-9b0f01a69b45ad5c701436fdd05d780672ef30122e6b33aea4164664667cf0c7
-3d3bea1a4778b3d35db869c12cba4fb99c066159bb50518bfa211096ec448228
-039f96dadc9b9600ec5e60b70c475bfb024f6d7687c156aeadde8e48b0625c3c
-0aeca4fe017d4a18cfd1bbdc370ef6b1c7fe7c6463a961dd06b4329210eec8f6
-a172284470b0d933a2bf0fe7e54ae607f5fd17bf7e62be47db76210295e70f48
-3ee8d4c7f4350cac22004b68af0a1b0105efd86c72c1e6615c3d36e182cffe87
-6d4b4b2fc066d8b6de0283e1b64964cb0cf06a2bf9115d4a0451557602e9ed87
-fde4351940b3dca78d5d66db800efa7b9f0d6f4862323e541cbe078d9404696c
-42c62de5fd2fde68deaaab671313f371c2aff793fe6caf4d3529450a9310d4b2
-df00029c115ff3ac4969f454c8dd4cde13ac7f8da419fc22e985063ff6429211
-9a751f54f6402b43d01fcfb86d7ce8c18a69993d40313b419e75a419f88ab41a
-40a0052509401fb48777817a764192e55e2df39ea866b150339681a2c894106d
-daca983773e1a280a661663f5d192674d0288a303da868f93aee92743504f6e0
-271430d963093ff7172d748b14c917a99896e0b71866050aa97e8d969d111de9
-02874fa90cdee0dee39bb6fc0cce58558bbbab4a4d024157546a57eba7c1315c
-9a1c051c287b6e43b0b4195c1cfb7845df3ddac7005e22a861e82b1bdd1dcfe3
-ac9519c77e2a88b302beca597ca0cd3bcad5afd4080d38fa1155080570dab5f9
-f7f8ce9eebe14ab702d19ef0137c615f72b1b3509d3108bf7d6d0f5c7fa5a301
-42a45c30ebfd452e67b294d8ff9388aaaf3ec0572c26034b60ae088ff19e72c3
-ba186180d6f93c64202bc9591b441e303d5550c251d75ab94305979c9942b82e
-3bc053641641077a0d203d5d6036f1c918173309f04d27845249d2b92911affa
-84dcbec3baf6c61623f8a73002f9afd287dc162762a91f6698aac67bfcae3404
-db70f32c9d81e76f4145d8aae76c8a2b42557e79a3c658cb5ca8eb844cb780bb
-dec028775a380862b6d5ee1d5195dc507ce3ced0aeb8938660b4c727d40c6e89
-e60ab163b14cc1f713999906fa5fc58b8b1d10044c17c4e32fca78d99d33cd3b
-af638d37c1f396b898bd47776cebbd71fae4162012767362f833dd3f620cf5e2
-49d584ebe4eb183a253d5d4a85a65acc7ee764589234fa74a25849584bc6f9e7
-6da6323675bb14334c7d23db9f8da42d689c14691875712ac8f4263662ba9953
-76a972fa405c90a574ff35afb29038c4048085d6a61ebde090381207ee9dbb1c
-f2dccf97635796111a8886662d39d7e3b2b79c9ce048f6d769f36fc80348eed3
-f4d5999faed84c8f4e37271b29d0adeb25c980a8c388afd6fc015b7c5d182f57
-78e9317db58e2efe61a6c3a63a2a0ef9a3c6152b2dfcb81e3c0d00c6520d1a14
-2dd8d314384fa63fb33c47b3bb3e2624fb1ffeb31f673df5105e024ac697fa70
-051aacb07e671787f6f76741c69ea9204ee1216f75491e1e1011512656f48b40
-2272666adcb4fe07be5b79e39ba3aa85774dd992589aacfa7b080fc4b94d855e
-e9fa0afc3273d1ae161563c33740c5e2519ef806b6f3a4c7d832c46fa8f86f35
-8aa32b9b0c6e464e41797312d93fd25264b85fb996cce679586077df7e5fceea
-9852d4012959de6a9002b4e67317b4f87e2229c9bf89096c32b8ddb3c14855ad
-f5fffddbb24a63da28ad2b6028184a4c083f090976bda8fb60bc51d4c590dc97
-b80cce59290aff40472ee22afce117737dd804fbd43de024399081076cb701df
-bae537473ab542a08b6a5964ad5a5026f68dded04855c34144cedcf8380d4a89
-a744823b4ecec5f225d26f128912c3f3822e51b37b7e5b6b29e9f1f43fa7ce48
-9ccb6b309bbb9f879527660a6fbef9d7f11fa0104f6d27e32292ff2247668b1b
-352a4c244b53141263bf6f6842ae64f198266388aff922adf272ca3b360d8f89
-27f2aa449a42ad993382efa008c700fc74bc6c61a5348c052f247df465f63060
-49531b80c92753ae16a817af2e28182ed43f8a050ff90fd45cdd314b568b61ac
-45f575948f2da79a035ada12e83c50c24f09cfb5ce9bcc15bd9c34479ed4ea59
-21960243fa433442b345cf568d78e314b2054e2c146c7c9a8e938b9ce3c7ab4a
-2a2aba81a72caed7874134d4126ee3a3096282aa87b29949fbfdcc173e1df4d6
-a5957cec97a798e61ff9ed2d620f4e229041ddb5e9c0a787916374bdeb03d0ad
-1dbe01778b2b86c36818e89839e761b0098a7d8db58ccb0e4d67ceb9cbc04e6d
-c232c9fab1b2a63a24886b060a78e221fc964eba7f190f5c8d02e0e4711c4a46
-f6611940a8782fd1606a5975dc787fac23f15ca5bc3529af7695abd9b259484e
-90512c6667d85d78862e548984e8443511abe283b7714abf122110eb21747422
-c4fde0949df2811451d4bdafce1846156ea531a15a7f8f54b7a117f28885ef86
-5209ac012c0ec7641444fc4032e48c16d2dfbfa3bc12961d5d1ecf95cef74456
-df2efb574e4c42c80a65bb008defdea2e732b101ad7bbb9646874d2e799130b7
-208e1e174cb552d9fca89794f010525898a096c97f0cd41eb911c313efbaf01f
-8bf26d7d2820ae5937abc3994e0129d15838bb65a43203901fb3f2375231d818
-08c5ca211909db4cbeaccc21107181a5a3fd93ad6398734f86eab4bbbb5e929e
-b4062eee1cd6e18ef5a94b088cf6740b60b08ac496c6781e35d4be3c9c6c6150
-e25ffc859a51489798fa3037d7e2cd96399f663a9c3537649a88297effda3e77
-d98941953f41ee2973e7d80be32ee2d48d5c7d183f4608067c4a72f5067160ae
-aecc4b68596b7f80222771698584b1e34ca77c54a0426fa5d3e009350f0e71f1
-bcc6eccaf7001e7fa8b23c321b0335c87397d1a375d467f1783d9488dec2f269
-89590d3a23b21539cfe64752e51ad95c351033a1fa807fffeec3589efc1e8b76
-f81de863071160931055a01d94dc2b8fad30d5bccb926a1d4a9ff858d98d9178
-8c60932d50307b5993fbdd530a5e25fe381959b01e5ce66f8ba694c95b4d578f
-3c56d5cd9be8553cefe694b396407f46531c333f1dee44e8d1679133ae7163b9
-c9dcdb20ae4d2c87c7f37087e78570ff608effd4202caf7c2c64887e47617892
-de8f0b4006972fc32628aa340c05e7aba10d892a1d2523fd216534a0dfdd11d9
-db9157bf1febc5877179bd4d8c272a598b016468bb31908e1fdea32906963927
-18a303429a7e1b4240c382f2a02bc8ac9d28bd2181b576c09097c1a76866b5bc
-2af2ba8a15427f9827036d5d85d76e0a9fcffbc331d769378b610264c5a4d953
-7b44cff644c1dc209da02b6134622f26014e847e3efc68c1403447e7b3f59271
-2dfd293e0d4b86007a8d9071958d979bd36a47c9e709a0252d61a1e7ecb119f5
-5302f9ce3accafe7dfd8bb2e1708c775143f373ca805a442bef5523e82ffa034
-9f2530b9aed89a8e5c81e013a7edcab6a906173cb0cd48434ad711e89d970762
-3afe152cb282db3fe2e105575ab5b75c00c3b1ecded579cfa23e97c964bb3e9d
-48ec0ef42e4761f01ec5c12cd1411c9eba7ed00e85fd770a82266c71c841392e
-8c8f2724203b9a44f09005b3173d95a5de83f54bddf23fec70058564161da59d
-02121c675380fb0f0f7e0bdce96f656e46f15e2382f316c039826f091cc03e6b
-ac9969207117681e0f472ca8b5885355020e1848d66fd99b378542c811f63f5a
-bc79477067649055735f2d5a46a35c4133ca4191e6a75f798d6ddd8f72cdbd4e
-75de4762d2bae425796b19a65647a3971abbfb29132f35e9accae847962c218b
-4973888e3ac04631a358b57d1347e2a74544a70e219b2e6c4c0e4b9f3af2b872
-22f27ab269f3248935cc65135699eed4c1b85769da13cd156108a7d1cd894b46
-fa7e2884d180bf6962240b20812a6b89a49ea08ec6b5a5e8766adceb78cca7b5
-8b89a9c7299801939004db901e195ad16199998c821bdbfb7dabcf1a80081de4
-aa30d5653740803ec63c0f377eff0377d44e8aac6aa289b144acdd5207996dce
-96359a17dd3f6ca398b91e86af024f0533ac70b186a940f96d7464fffe38e22d
-f8e83d34c8011351ce7dac20a9e35c2460701eb62ed3c815d43dbef99828c025
-21dd0f3680e4505a5a166696d16187d6e85363023823e70f41e4fa7b796e8608
-493a3b3a53d575880f09fa117117d6c946fd8782637bf122d9a8421807105b35
-792dbe884b02a344bd235328c139bc91aa524a107197539fdb2abdc99a7113f6
-176ea649a61e4968187bc7a97475b063d4a52d085ecd3191137c4ea1579691b3
-8fe05a2d3d223c7e5a23526699054f254236b96bb3f799ae176fa86859acc325
-44e0adf45ade76a9d635ed8739c55defd14aa6b3aa86f3504e71176ca2fb51e4
-08f7a7b97ddbd73cd848390757f830abbd1e5437ccbdfe9117d73875c7241f52
-c4d8854a3ae81ac2646700268c5fbbcd03a9e6772dcb7d5b7f2e925a944f89c9
-0e7ad30925a1737a44bf80a83b5a68733ca7f30bc6f47150d337d13f8a9a33d4
-b94fe1cfd05cf1714d6e0496e21b4e6aa498cf59f4dfcb30625cba83a53f524e
-e90455af7c17310107b2abb1a287fd1c8489a6ba6195a0f4a18378392e860976
-cef9a48f00b7fbb6c04afbe796a3af0b3a7ff9ad53c448011709d4239ac523d4
-7286b3440f7f9abdf19e4062c415b5cf1e5b1c2ec79eff451643517a7cee43c5
-56f2d68440f64a2eb7f5861dd3de1175ea67b022a137bbe8d3ea80775898100b
-f29cb8e25c2f816bac1cef6d3ce5c15cbc3f449f6b5db7c901a4e0953b38f1ed
-ceedab0acb10df42e2cd6b4d231ccd752b69fe0627098a3f1bc3b547488bb1fc
-03e0e97103cec3d60635a27b41826283796db8bc2d72e0b3b8ec3285f3ef5a75
-5f69a2be9f0e0733bc32ca037df0af3c5f29af5772cf1bce273cb1dbc2143d0e
-0a0598cff5d570ed5f1821811e6c7aa8d9ca18593d178d55e45ebc2cb32a2adb
-c29f52bf976c98491a5d0a6300922a3031095820cab7baf7344541e08740df1c
-a6e661ff99a9011e6fecf6ffcdd8235824ed8f86e02be31440d93f7b65ced2d6
-d2381e370df510ed09b424193dd4202b8277c586e7398ce8e43dd2016f7e550e
-644dea807151d35e8d3b3fb66949c92191a86bb236aacb255ff8fd410ec4d884
-e41d54d1eeb2e724ce43d96aa249aee87a9c2637c8fa4b8c4f9e28c23c4af501
-f93d7120ed9b1167983c3c87c44823697113d6614ed80eeced54e2d0f3fb44f3
-4974e6135949b26f352acd7cfb4ec79e30dff73b8d75a6ee74a55e427980f946
-87aebd0edfef0769e12d199b2dbef64565a30a698c30ab05ffd06d68310e55ea
-93ccac06a08a530a7440d36f2a736af590a682a13b5a73689b8d8c00c5fb635a
-71bea3db8b8a1e5006f1f72e38ecc48e40f73c39d473b92048419be4e5825bfc
-2eb3a3130d47e541b5c714d5971497cd23d8a5abb6a93e2da1087bd4b2b0d841
-fdfdf7c17b92e47c9093ebafbaf1b9429958f74e79deef860b65c287370b4502
-26d5fdabc24c04b34f07a048db884927ed1dfbd19f5b45276b2f56ad0a5a51bd
-9578d53562766255256c985891b2fb3d1150fe772faa9537315b199788b4a596
-39572838b9deead32f579f9ec94da84971c35149fcd7780a34497879a5422546
-74172a429a6b85da115f966c34de2c00cb11a1fffa16d8cc84b86b9ea31d9af7
-9cc851fd0bb6e2397db8ef7d0f1e98edc5f302f0c9a5b33950990d4019293801
-1e06cfad4653e1a4f5ee4be3a959cffc2231be88055c6d724b9d83f5f8f5ed01
-f4863e329d3c757cac3ed3d9aa3bcfc812407c8b10a78f629d8f660b42423754
-ed23a022797e478f8b25f6a3346374b8e285986aa1e19a19c3af7a81f14e6b0e
-a595ec48a0c6a6e016c629c3f1a91043c0eab6ce5401267d5091dcc0c8e14b4a
-7062627a065c66fe9fe068267b8c434410774a97d28b76024e171deb2306eb01
-84854194c373ef3659b489e337134e5763d16d00d6a4e66afe3dbd30e0b808c2
-cf044b277485fb807d66b6d0033d0157c5aa1dca6ee774406a7d4acdbb06104d
-e582402782f0d19920b7c4c66a65a10703f07d30e5663b37688a090e7db49783
-b5b31e9478e1491c5b40325d6eaa41e35bafd45bc85c8f1be10463cd5534f110
-8369f8ea5a4895428c1dca59bde35cfead2dabb44bcabe96b27156abe4dd9a18
-cbb4dc7b5908715faf5db93a206a4f40a19060ad1c33474226482e8fa3cadd37
-197f9f8bbcf204e76e6e411e56c7b33664ffa0125cb0e8f7ff3a55647a841a28
-9589124c91519db94723a77ae008a7657949e8bf80388b5cc51585fad67bf242
-f5a081ff56ca0870dc9799fd03b5291474c63b83b771b8bee604a11a70e21d55
-3709247b92f5d26049cb3d2963ec785b68455bb485f30af7426cfd02faf10934
-d32c8d7b0909f993724bb7da23b7bc690754384fbdd366b14417e6bb59c8362b
-11b7aa76af2a21b0dba56d8c04f14cc768220acb8dc4d7c60646c85cf11eac9b
-710e60d1e02c4b9a078ee52c154abc7bbb5ed801087eaa68298014023f93af89
-bb257e37bb4ee55bdcc563b5f28959187135aeb95ee333196f6c0ad8e2fa493b
-c819e39856397cd076f6ec77c2de08517b15cd6404306bc45963aaaa8adcd1ad
-0c78bc5a53c2370870ccb3d5b781b811ddeed772b2b21d6cc2b8aefa894a8350
-48dba6afdef72f44d779dd9dc6ca91da09a9a825a12322a2bebc69cab203954d
-1fa1cd86adbc7810620475e8dd1ce2210cbc056d586e4d203ede41398ef9f106
-b58e657f3ea69f719e7ae006cc1347a31b573857446cb3fdf83afd5991993c94
-95e8fd62929149e5d83b852423a0a92d3799484464bfaddda2e3182c087cd330
-e7c077f7b37b1938e3ab954edb0b98b8f25ab428b313047b6e66e6f6ec940d2a
-8f9989ef2553993877bac51edf043efd752a82ea0a21a80f514b1ec69265d777
-e0e6f7b71bc23f53681ef43809a277799c930a1189ae11a7d30fe14c5df3dc8f
-86cf3e329c494ed6cf0f08b5ac828d16f522985effbbba364440e78c27535b77
-517b9bcf39f6a038593c6b5fa7a7df8144df223272188c8e5b672f55d3f862c5
-6747225c9f48b995c9f416d519ce7e302c22a8c568e53fca67692d0485d9c34b
-936b69c65919e2a1ebac36520c3dacd0fd0a837a8ab82964cca79590fa568eec
-936b0df2123977d9b0f4604ac160ece39eb624d285e930cd59b30e26dab47ddc
-bf1e601b39d3081be32eb3cf521ba730fbb52298732f17752d36758c331ddac9
-66478be91854a54e9b101a52f94b13f94a80e3dd73a077684192f88927224bfd
-35339070cbbcfe6e51bc583b1d6d1179edc0409c56190e3f08a67e4c59fddf24
-9f0a430f6a2093bb7a9e32eaff050ea21201febcad5514f5ea4e1c790437a3ff
-1722fbc4a51f4fd4e48653e6764bdb83195233206c6db692056e93eaad28fa16
-332517c4e2259bb6cf36fc5d9c923ccc69047f10e8bfe2f088b3e95077f4a312
-508ab431048bc2344a31a4583718c0b9e0ad8ab0ca97dd51debe6c3dde8a51ab
-01b9ed04a58e7a2e73f34f7e2e8e9ddd7b99949b5f0eda2cb61ddab64fd0dd5a
-344a20f03b6f9b3fed433329b8372eef9612608380f4916acc5292b7f5fda274
-e1b296f142ac27ac06a3bc96d5f4cd9d317a5318e69dbfba646074f2304849ea
-3c813981fc03fea55a109aa1e174556401bf37aa870778a73eca9d2c60eec4cd
-b88662527f7dde83a248475b5476dd935833d6ea8ce5cc912ca5897168bfed0b
-177d4fe4c328f55625f35d11f85ae70e360c68b5601dd64681d557ce51e724ed
-6e5cb05523f3860698b38910ef6348c9abeb14c645b34d08e42d84928a36e91e
-999d15841c9ace2276b65dd78ee6e4253c27376ff691a11e640fea8573509b70
-9b0fcf1fd6c4acbada4957ddc2e9b4bd7444cf0a658f56878da729cd2e6c340a
-3a3bf51132ceacf89a3bfbda4be6a18b0c5be6021076fbf6d2c5ffd4d35b8855
-d69f62c22621414d6dba9140f9fc62919d1f0c4b2d725cbb895bf04b874b8e42
-2619d4653d065b77f02148cf29931f52f94f0f21320e541cfa9b03612d76eaad
-48d1c2ed840c390363994f75fcbfeddb48dea5af3d5e869206f42cd37428844b
-e69d57813618c3cc6e4dfc270bad5a74023f38a379d101adc41f62173a19156c
-580d2c9870014a090bbdca4ea89aa7c0406e8f73bbfb90808956903b4908fd9f
-e439a4a7dfa4bf0cc31d89bd88c5470940a1a4dbd871b9c23518e5694950eb07
-79afe884b71caccb2f350154fd6b1f90482e2d9268fe383666365fc41c5b0c04
-6fcdaa0cc65e320103ef976f4aca093a5b41d47bb55bf58fab366d3c9088297d
-49c88fdf7eff4920faeae791887cde9a1c9b2f2fbc2e23f7bb5438f9a5c91790
-5d9666ed9a3a780a02dce5386f1af23bbed00c476cafc4734015e367cf600916
-4654d10bfc6d06af5316c45c8cc0a5f92cb4016a2b351d6484705e9f1f9056ee
-c530943ca1c9fc321a838fb02857f0709aac2009eb3cc38f81145d6ce6d44524
-da3e21e5701f972cb836afe077e6376875a953ba427b2b2483330dcfba0783df
-c371f9cc79cbde94fc5e6f968b14c56f0f7690965058f6ac266a8baf2f545336
-1b99a92db5f63cb16cf850f13e0c18a779679b03ab74f886b2357c612c0e2f38
-2c72cf7e4b979f888d772eeb5d5dd2b1d837f03f7f9ebd613663fcb8b2f7fdf8
-c761a958b41cffc4b2e2a48fb62ce80b10261b96a23b00f6084819d088cfb019
-84fbae235b2cf56b391a1973bb09fdaf180f6ba062bac913bfe0762f196d1680
-f7de26c276ecc19f6f8c84c580b8a007319ee045a04aa6e492b347004a26dd27
-fcb2590c4ac89041c481f8cce7043c2e84033e9ca3810a63e5b272e1b716993c
-48da6bd8aab1c70e28f2da5636a7757448608a7d36be50ac184c3e4a58d108aa
-e1aabad61f8773a698546f22f22df892a2ed287cdadf8858c86eece0bb566af9
-a0e48c19ae49dd2389fd38f2937ad3e02c8a8b281088affa0e1c7f7829d1b191
-9c5ef6f3ced2dd0c51f6e18de1602df35f588503b25039b79c371d4ef75e6ce6
-7514d977dec3af3de9f7dc7ab9064cb21d8b35b4a7efe21b6f4681c090c55aea
-1fd129f665053887abb1b5fcb09296c6226ceb394dee57664ca483e9d7496dbf
-10a480d97ff4af0ce136c51d90c3d8c3734536e69d0bb4c066d1bb05184fd7a2
-374328b352f4cbc93c613309d0f83387e565c8114e38677ec5972a64f701a1ae
-8ea54f1293f413123df659adc7d8e9eb0aad32ace9f2ab0f69a989b3bc58d13e
-8dae3890c928697a353da54311cf1e98719a82ff91754ca207409b6c10428228
-f78907e8e9e21f1cce47eedf402444344751d49afbfcb460b6d233ac8bc7a569
-32a3362bb06a575f686c1b68716ff9c8c93020fb6e5ac189834021d09d12d136
-529c6b5e28390a877a3daf3392e50dc60c4653f33abf9cd550371d6af3bc340c
-b5c34ef3d2ed6bda5e8e2b4e97a865525d21d43ccb1412f545e3f1a84168afb3
-378248f719bf8dee72e408caf3eee889129d389cbbd62fa285ec9eefefcdfe44
-5fc87a84d103b3fc8c349f162ed5d830b5e7ab99cb2f82cfc2a83ed146999a56
-11873298b1c8e983c539ab6acffb13be2dcde7816a7015c72ff2097de9334e76
-4fe9359d3b3f1b5dd5ae02ccb7b1175e5e5b2a5d4414af3376fb605d805446e7
-e131cfee56d1c41dfe690113b891a4950d57975b1d608a19cbd10d4d53ebd4db
-c6d78c9cf7c06be5fd47433aa18250fb896f3db663deff28f1976e93e7a36b4f
-50830f7b0b5b47e2c0ca4a08482290aaa77582887fbbd330ad0c0c412ecd3fc6
-534baf96f8739a4df7860f73b8abf2e97d3567c09c616b432235e0ea8505cefc
-26c4d7dc44f7789c338c8561a9742cf177620bdf68209254c1b6c83f26ff44e2
-74d98f45a913751919506bc3720cac860c01ced3f825d357afb098a5ae5db776
-63911f63a83b586e839d08a94715de06dc3765bcc949539394d75b0c6930eae1
-9c8772443ef8f8f1403c2a803100acd0305359b7544681097dadf07259fd7c09
-e80b28c4e0e75ed038feae6e0b3ba5d311d21f716d90fbd1aef28a60f84f8e87
-0a4d395cdc956ad485934ca58f11cf9ed829c4ecdd984dec9525a736cabd684d
-db24ab8b679218c355faa975d48e837066f017fe39cd135199616461b9c7c77a
-f3a986c56243594ab113115385bd8de3e560eaa3e468ee419f9b97d3b20dcbe8
-1a64942075d88d48a2b28c39328ad74e2b02b011331f655066b7790d1e2e68d0
-ed7298fc1040fdd407acb03e6dbf680651a9068082db7d43d1c85b56bbdf299c
-5a9b88b8608d2a21d7a9267d952d71b786f7cdcd4f63c13fce13c6dfd88f20cc
-874e1a42fe2430c0c0da698b021a7e82eb668371d7a8559ae906d7d6a0a60502
-c146f7e838822f22e4d0e1404cc853aa913087dc959b2fe1fea7131a4435938b
-2ceec71b3101fca9c4db903372b2cb6a6a0e88748dd8479cf0625a7d5159913e
-69ea97f5153b3fa681e940b0c59c1c4193fc979049b88cb38ea53e64ce6da9e9
-d77abf19140f3abd0c1b89f3690b59603abc202d4e0437431c8da5b6a2b1231f
-89723b569fcceef6a78c38843df658eef93f6414ab589c77ff88c25a1829cae3
-ea663f93db354455d10f4d40a4c075650a4e84a2468fe985ffec14548e2896e3
-b1dd0616c0a6b17681e24fabd35501bb0e446244dd55cc6a632dc018688d2b05
-18e7c16ad731096807c8c7984d9a90df59d2ca0649e1f7111f105fa3808df731
-10de360b039985e643fabe223c2836e1a992a5eb2ccd396ba1fc1be39c148e3b
-2f1414d762e9c95f1ab131aaa17d5632f6b3c3e566a1f1bc9be2ec3a89b595bf
-bf99ac8fd3963d7ab464059c643bc6de1e806d5361b55731281d2556878d1087
-10f4f9f79598e4f37a2bf74aa4a94e563cd226e50d1244f38978bc3994b1b082
-586e5fe3723cb33dfa0c48ca249ffc20283e7e3a84cdb0d8df92e540ed428fd2
-0943e502f763f7fc0c879d6a18ac22c7b9fb410761ffb5e60e2698828666450e
-aaa8e0c8d5541036badb9c7c92885462a9e7421c8923f82d978074d51483e594
-b0d24b3ab7306234079f4f52186a341a8cf7eec6485a491f558c50f86aef7c10
-6fdadeee7dbc16438b213746425c80bf19ee1ef22ab8952a6a91cf1629d027c1
-b4ec94221468a107eeae9b727e1463c690c41053c6ed0d27adec33586212cf52
-c4aa47cefa30fc2f22d1b36cd731f8818ecec6d3bcec641fcdfeb74f37f561b4
-f716913c74df2893324861227e362084ea3efa36414906bbe0ab92b8dc7360f8
-ab2dcdfca4bbc7f23ae6a6ec7eab609a6d04fc0eb78d95d63a7be15db384a098
-477c2d5b367996fe969f6b26be3d09a2ab3c3deda2f2ec4c9bb2f0646bf6124b
-23c91547ba42f72c6d4ff83478769924a09ea982092deaed2445530f7e62a64a
-6c6944f5c8a8272c7611fc494fd7c2a9f371bdd05607ba865fbf5cf8627922ed
-46d67ad28c4e8a01700634db291a8c900c37d8f7cda706184bde8dfbfda3cc1e
-e6071783a69c4fce21a094fdc2d7542d005b33850772f73a0e7ae2c6e4624ff8
-d77fb1e978e9b013c2c2810394675b76c7ec45e39f8f3dbbee1a92e43422ac76
-d9dc26e9b4163fd449f1d2442f9a17ac6034ef3cd200d50875b89843ea4ac7ad
-10c8a2cc4df2c690e68c6f1070abd2bf25d6a62dac0da009d9b949cc257b4941
-8ec05287561ab344e71aca7cb870e71fef718dd65a69c99cd4173cbfcfc8155f
-f8e67003b086437f488af5497fc9416b15fa81d22709730f32ccb984ff67e291
-355503d6d6253fcb17f072f324b3259bcb47f2ce27ef9708fe4b09449e99d575
-030ea81d86622fbaa1bd1e347105a283f2b394e5a541aeac32151b376464ed0c
-96a2282ae7812383e1434e766f240e1379dd7440b4901a124607c4463b6328f8
-25fd34dff1bc61dfc6c3fb2ffcafe3b67068711e1635becebf8c890c62f342de
-baabd191fd7f17369f6456cd3f69921466bedc81966b1055c49fb4d139f234c2
-8cd8eb0d15ceb048def05831b3e940627b2f98ed44a0cb193284c616cb77390f
-01cf62e583c01909a36b83e9dc1097f7d946b30edb637f431ae85871f33f24b0
-0f3d42e09bb3cf5b9fbeec56c2762d4c7e2571c3300058af94ed8a09ccae9e60
-420e3b78dbe9b76d2e661eeb84162d2514564d3bd76e59ec2385ea5ca8e77480
-cbac4e07de6aadf16a183fc172d5c5bf7f979a77660706f2df8fc7c49cc77f09
-e3232aea4172e2a10cea4a9753724ab2b5a31e40febcaeb284436daa7328bc3d
-48b2f8ba50495e566df032f44d23a1ea6d86557d48a71c7456c415562464c4ae
-0ea04fdc6b07680daa44a90f34b59dd67802ad85ab62ddf3790b8f8a8b8660ef
-815cfd50cb8607affc2e4fa152157101c957a422f4368aa35f9faa8b6735c27e
-7c6ad626bea86f8b66398dcf40080a2ff60fdf8431d0285ab80668d39590351c
-588cdbcb8245e5b9d5259ceb2e95f6238f0dc40b5406a15ea059751ca482b345
-10d6f256ba50792b8adbb790bcb9b52cb37cde2ba2029afa435bb4fc541735e4
-f76aaa503353a8370ef5a83bba65cae93b3bb20d727b24ac58635746de379ba9
-04bd03403cd2dd8cdbbb96282ff967bb11c89392c5510c1889dee5d2126d1e22
-c2815a7c54b10aaa07d797e0337c992bcfd5e023a0dd2603913df6fd060e40de
-ea1905d3c9da64ffebdc539bbb00792a098e0aba893cee2b2222f62f7bc33b9c
-0fe107b99feb52d76b600648b32dfad7f7edb025b143b445c2182c8278da240f
-8909e3de7456428deac22c0fc88c3ed99ef0444e762edac64c4a4afa0b97a609
-58c607172daf23b09bbebbf040b5dd5b55cba5f2bb1e765e359d1a80c6df7f76
-c703baa94076ab528d326cfd0a31156698b9c9c3ffe0f13b7711ee58276b8422
-80fa784133d0e5f5b07dee16f7fa0dbb95f7e1f5c8ba8b45ff72d64586fa334e
-0db8c968d3628ca508f945dd9189d1f7d3462897c141d080dbe946a66de8b2fc
-2f2c89df29e8ee18681c8f01a43213159b9cb09c121eb73a080047b9706d4b25
-de8b147972ae87932835a6f4f12389542de405192f0023ef363327dc02af7ab5
-f3eda2970f67ed2e5435c50c522dd8dafbe0dafcfcc58daf945657045b3bb9eb
-a9b9f8894400f2c1030c752e4ea6bb093fd5a09fb95bfd484cb326afa941e2d9
-6936453764c5828552529668257f87fee07977cc6d217b5b923808f93000a451
-d7c26a81dc47a1e7fffbae8016303157ceb3f64af87f5a2fd8c8dddd04b8ed7a
-809140824d1349bf77e19ae91f8e42d7550f4163570d87c349ed3dbf427625c4
-f18245abc4ead1ec09110a30f4fedaeee971a2fd5c4bedd0bd1c80576da035a3
-a2527d163b2198e6c483ed7b14e9882f0a4ebcc2b55b204fde963da8e5358371
-dbe833aa2c41f60e98abeaa394bcf0212743fc5a3efaebb77d3206362db106a4
-2c57562c547826a558bd82bd5dbf7d853edf511135538d554c25e94c40b3f73b
-5c79f9cfd585cc5cd1f0aecd196c019adf970563fe58627bcdeb9e2e03471e05
-d90d43ee6a20a468ab4ae304d8ac4049cbbbceb0cdce45d38975bd8f1ce5d1cb
-b20fb81cd0507a3699c888bd8127aadeafb330151049b09b3932bf301489cbf2
-b09f7c42502e6ea82041403ede92b34f1bfef5fb5f5d920d5533eb4d65445c06
-7899f0e07e081795c9ee931a34ee6a9c65e63744db3f97815ad946f41dff97cf
-7099378fbc99ce8e7f0c7f4f4e7ffb5089e970085b74988304ac99c229df5291
-9be0d25d890b071bea811aaa588d28f78e6331385c5e12d03682567e5abcd599
-1b51b54a680759f13683eeea378081c76234cdf5e3d3e5faa8363c2e74a7adc3
-92e744d370d8d466a7e1461907ebfa43f44376a7323847ac162c24ebe8ffcd9a
-3ef3f05e197604898f9dd3c737c7da17c8242b8f7a261774d48b822831ce02c4
-f9249b22cd805ac81a0b9fd24ca446594cc50137223b67b97507d18409586cdc
-aab9f58cadeb6e5a1f9a843b7cdb58adc014d4f2f7bee89cc3d207a82e6b9e7e
-65485bca7253c6668629c44632120edb18b3e4bd170b5f431c35b2b945f55f1f
-e0181e92aa60f35ee61bda2a2f25dd60afcab8962077b38db99c12efaa3e62f8
-024bf9e864953cabc76f42827360f39ca838b7b603b83f2c8acb52b4bbccb905
-953612745b0a8ee64753f5db78bf77762bbd7e48b370ae59f59a3609737ba1bd
-d08e30fff8ec11a92050a7733539758889fbb3ec25d7c287e74697f80a485653
-1453d337173bc751eb122095af020c6acd57451e9d492d87130f898073705b05
-d044c77d42bd91116dce3774460fdfdfb7942c45f3053f13e71cdc7e5ff368b6
-02adffaf5eb51099c87806cd481d923548e4a1b153f3518445c2734a5b852ef0
-7028968378a565dd0245685ed23165d93450a2fceca590410aef8ffec0747afe
-a184ac2c6ffd4252421a3fa67165c48e1c0bba8b039bf3c5f42bc031d8bde0bd
-075a3594ec943f67ea4dbe5d5ec1bedeb833af6bb8c6ae6a3974ba1241113597
-4eb0a6e3107654d209fc0f43416c71645605a70ca1f9537eb49e2b901ec67028
-63c6a6b6a142dcb22182e2cb05a6572ede50e2391943b3a589f496af92bc2053
-3f68d7ecb40d1cdacf114090014dad9b9c00f34c47263d626016bf57ee1735b8
-5944bee9cee9d46a7a78bdffce9015ba5120b062076ab7968384404bfc7912ce
-0025ae48ff3d663aa3b312ee77b669ec2b4052794e90e85a7769b500c709833c
-607a352a4e69b4fa6cf41908453d07394740bbe9cf4501c5a64c0603c6f24812
-85cc4f4d1b22fa1281084b24f73b3436d0db59f2da5a100cc70f57c033c04dea
-cc78a56999fffdc14c143e965bae844d87c7f7cd59aa05d352434cd3a70feb77
-3e878d1bb0bb9681622449483923de84737149dfc0566962808602790de465dc
-86051f569beae85236ecb0b6a8de7d2e5c62cde8c13830ba5d3a5943affce66b
-29f771f8edc3bae0df9629dcc9761b2caa07d29b92aa72564e700ec9bda0340e
-71281448fc01a5eb62516d5d921d22e69b54bd74e30f85fc52647ca24fa8d273
-4ace1a25faa68a654bb60827585a9b5dc901dccebf5bb02437b6456cdb93ee83
-3e226b7822f375d60a1b75cdcea40dc0acd32f9aaa39808d24043098d76e7367
-26e24d0602eabbc35d28509c64a4d66df7c008d32e5964de8aa2c50134a00177
-81d085806a2b2783911c89f6876c1a4964aff3e59644e05aa6fba05e970ee558
-614ced908bb4838b5fb24c1a3458ca50a1d7e51af615549d340cc334b96aeb9a
-4aa99e74f3939a4b640c653b03181a4c54d45604da621d4fae1aa04d4237b7cf
-9674a72b50e6f26c07aa85343b43e1cc4436e0b326b890440dbc6ff36202f144
-e118eee07c880f3d5121834366d6b174b9d67886b62ed002e78e592a42668cc6
-31e500ee27ab1beb2c87a7fd3b1f2274efcabc70dc189b942e55d6f3779d6bec
-67701f5aa3efea75615cae8bc8ae937cd29b9a6811f9ee11585e39b69b09176e
-e5b0e4a8cf0c6fc393fea31f0164ba03ccc6af688df68f4228868cd63a84c480
-1ae93da9c45f79f384fe3a54fe463d4c7853031870c9e14687dd9dd76b9db209
-9c21790b1523d2ff913552ffe62b3b371fdfb87919a2d961847bfcb4131a901e
-9a8cf933b2e2693a688e435ec50b1c0800ff31c63d1f5c7101fceabc9211860c
-d043f5a575ea71977c7a5065d927a4de2c7752c02a857b884910df8511eca9f3
-b81d36526a9083de5c32603649e944961781c3966fc6c8b9a7c1aefa7e08e5da
-782a9d694b8ca6d5c3887617e2bd3b5ddcfa2f965b78ed018a217ab5c4a4e538
-85ffb9485db87327232541ca112dec18d9f6d4e66256c929d8c38eb634cffe5b
-b4b3aecdd3ce66b85d9df1f87b3cabc609ca8d1c5bff49215f8c324bfc42dead
-64c43bcea81619ee6948ca0dcaa9c7e2a19f8b9e830b9febe1a59ed5cb8d650d
-51ec17b2844c9d67184557654add27c135aec9c6a6bb2068cbc4edfeb82133ef
-a5f46f0dbcb5996702b4b1b67b3cff6992ef64fcbacb316e901765a87d76b0d8
-17d389d165efd517aa40f6c75a91cf060968467c82b1294f2abbf54a35227b61
-3b3bb9d32eb143393796fca19b4812402f221c7859ab4cee3777a52f847ad8a1
-3c637ff08c83a58e5389960e44cbea061bf444fcb64e613f8f47bfb1990c5d6c
-5da42c20b4199b633f3675d91f301fd3fddb875093d565e01f45e3c22250358d
-1a7af5ce476b44245788eca65c4db73bde810290d8a63e59f30b3c83d16c5c62
-de36b6dbab5d10659924f32a5b876c1583cd8bf728afa797b33a6c3c0d85b40c
-536b2c7d1ec7ef7ee7a9df19bdb5fac451001bd1e8964a320209372646202954
-0eed46fb166faf15f8b10b8515724b409c7461a738248f60429976bf7ace5a7b
-bac4452ac45b5cd4caeaa310f154d78f101667fd22b0e69bde93ee67c68913a0
-67231e0b73377f31d3bbcb61d8819e32f0aa013fdc543ad95ea5f48cf95deb9a
-70c31b233f591549701daebb81dce7c3f6241d0a4c562bd9e267f55f017a20ca
-d232044a680e59425b8c072682dbe71e21c7ea603056d9ddc41f16f26ee5e74a
-523462e49d58fca01dc10d1ad6b6629cfdd36c556f8fb347af37886140a145fe
-4fe9e34d22e5d7804db730cc076ce074762f3849c62ac49a2d66c707455106f1
-ab854054aa54222ef6d5e628c8065228723805076993d356f0349243d9e43abb
-968eb1c9998ec26447bce6aadcd84f0b6993d4ffa5f536fec6e12943747aac99
-c253f9b24caa7db44311cba889b53ddc5664475c22526fc9e1e700b3d38b3568
-85ea0e60d4146811e80386c11b2ae0e2eb94afe92dbe3b5a82fc3b7ea5b39847
-475b707b4058e717d5ec2d599db0f27c04a3de4f85bab108f6d1463183291cc4
-75edb7b62e0c1d6e6f0c5f03e5b9862c6e5b1fdf755610ba188ca32f5994ba24
-8c6a0f6e1a6cbb2378b3f29c4543511dbff9345a6992fb19d67500372997478c
-5618920ea5a62eac4aa661291c8a3e46a26260c8658178e17605b413bb89cc6b
-fe10c7572049fd36357290dbbb19a670e1244281b4b2a3ba60e1b322182183f3
-96d486b97fa3d435987879c3ed1a4c4a5e1794f7594f05ba6a1d75138dbc76bc
-5994ccd69499f4fc7c01f0b0b04a7e2b8c2c3eb6cc39a6e61d8610d0db8bbf88
-074959d4efb3f4e638208c7935e08d34379884930d8e99c3465ea4d4213a8f41
-67e091345d5ead21e5d9cb489f2666c02a25c938cf7686a943d645feeeea7028
-7e1885a3a2b2cb9d3b3e75896058ea924009f40c8bc017c82495de1f8ff0c62d
-3245610b0e5d54908eb3d96091cb87df26ad8133c46040e168f82547a32346b5
-0175b7c37b6bde3f345b4322f9a57c25363d32d1988941be4a84403c0e4d3440
-c840be8d4697fcb6678cc2db85fc9d6ba2f59814f257f18bf17e57b436581d95
-d391e318081d75a1a9d8c1fac834819a82100b47b78424c28871ded159b5e5ba
-49a2ba27f1a0fe358661ef98a937baf3722a1b471f269e3f8cfed8f4b44ec694
-b38f4106570c9ba31a30d56a594fe4bd91178389667c3d15b54cf7590c46b9b9
-a1ce513f45ae78bdbfc81a820b2ea832f390ab3d389511add1f30d1d07f97e7d
-fef1e1f796826561873c6321e0915eceb5d141d5e8d9e664802f39be458850f1
-69990f176dc24f0b3148cada39a20c3afcbd82ce6fbbe0cec2f3cd6dfe390b96
-f9c450e3fb31fa357930ca4a2911b3441e4813db96daa79cbb6b6da2ee464055
-374194ff4d779d0ed6baf67e7c06d711fe1b5e868c1a4e6c7f3ed529fd3d3492
-ad079fdb6faa5dc0924400149ce79a9ab729283669917b2b538f05bab7596b8b
-bc9c86cb74481d0181c8fc2b0c333619b96c63b6fcd352f0564862205f685eed
-ff81f069dcb2bd3d0ea80b86952f7efd67ea8b60f3e90ca23cd176c76d73cb1d
-7c7de170a4196875e99ba42f5e53a5c3a7740bee37d08900d68e1a5836ad4c45
-2f325a1fd0d49f74e9437f2d28062ef5d2934d063f0521ef792638fbc96af2a8
-8bf23e8a33c7079d2abe21a018521acc0e14c5508e629fd83773c9f59cd37fa6
-4a121bdb1db13d1c598589b00da37e78bd59d0e9f3e6d3c99054626e9e0cfef3
-35d2dd25c138f96a3f7f62e2ff2ff12010049edb86f3645f0272f36eeae0a60e
-532cebda1c0c0f39c454e251aa6ee1ff82536c1fc1c9b7c9679fb2deae693a02
-9eb57eba3882901d2dd7d0c24d5f0ef6b799080e98ef048eeb4429ce058e05d7
-6a296e34c80467c71fee0d41a366ca38b6fa3c5eb7abcf854fa7adc4d6ec565d
-7d8c39d192fb3b06bb93518623a1b1c56cfe095354ef43fe73c1de5541a7af68
-c51ba01019d7685596d730bee70268
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/courbi.pfa b/lib/fonts/courbi.pfa
deleted file mode 100644
index 5162aa6d0d..0000000000
--- a/lib/fonts/courbi.pfa
+++ /dev/null
@@ -1,1940 +0,0 @@
-%!PS-AdobeFont-1.0: Courier-BoldItalic 001.003
-%%CreationDate: Tue Sep 17 17:04:09 1991
-%%VMusage: 57715 76639
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier Bold Italic) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -16 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier-BoldItalic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263789 def
-/FontBBox{-48 -288 860 839}readonly def
-currentdict end
-currentfile eexec
-5c03f98a9ef1056084234938772b65b659a297a60831474f7f06192b155c7867
-6e337a4b7c45b34a88552e942ea1b7667df4b71b67df89e141537fb4b1d26675
-7b98b6502e4b2246f50fcdf717d3a5cbf57a5bf92df803946d950138fb0acd1a
-c81f3f66f82ef04256e333e070972e17b42d661f50b27463cec7ab9995060f63
-ad76b5de2ee0546d9a2e43488699c40c150f6d60a9fc1dd3b5367a87d081de8b
-a232ff2c4e9e7ab38f13f20d747cec9f5cb36fb8ad1b9228a42216d93925b91e
-3643f1c2f86f0ed4286847196391768d58895b7dcd757d9f656af1125a11f291
-42e28ccf91a17be1a89d3214be746c4fb82da439d6ab53f4bb12358b2f8c6b17
-32fe22465ba0dfc22a955139b55389d1904f3f742faee44c1af9c3c9f588ac13
-3635df24815df9c92f7ee93e79555f834f18f20eabf3b2b7a815770715bd2e16
-4b1fcb206e2fa3aacaddc54d5d61dce9a8795d8f346bc180a550aeec53154733
-bba47e38c6be925bb166c8b776c4350935f15e3c6123f8a91c65506f2ff63ac5
-d79c7a7519f9d09301a6de5052913938ed21c0194306c8ae995bb8f5ab991343
-5def56faa796248a10f995ff7d6ae352111eed560620bb6ac41103ab077d7cc2
-d97a20aa0a9dfabf6063f3a600f2c12fe79d30f9967788f90f5285da7c197d4e
-58a9ed99659dc24269914e0c0582e37840b0f6ef456b0f6b445b18e6b5073f41
-8ae4fc99f4998da4fd8820393e41aa4f953ceba2edcd901d5b7ef2fd026fc8a5
-26610bde74dc20173add2c71dd98cd1b6445ea20f88684638f269801cfea8dab
-e4cae300090a10211e08e37e65b79433989f2a3d888982631301a76e4c68a604
-b9ffbd0b7bf26b12cec3ef5c6af999e72243e396f5eaf36d7a02fd686268bd85
-d66d617e51c2c7a5033d160b8ebe9b7d3c0595cd0ec31cf4b88cacb3e74e2870
-ed7e20f88905075cb6821889e85fca3fcd5a397d44e9150750b16260177280fc
-92a20e8b891abff9492a07144e9ba614d069d8afe28441d03d34eece34f89640
-1ae1c190991de2ccd321ac65b9b575661dbb7dd5336f1af355062446fe088c45
-05d9eb7fd3f0740528564f945ce3e13e5697b23e1acdafb8322f77b455e983ab
-dadbc73bb4c8b593eb357226060c4f723311d7c48435ed02bece6c61523c3c75
-5be81484919dde97279579df674527ae2844220a490187e9350e34ddcac7c82e
-e1fe5cd11259688a987d6127565904904dc3d4ab7c41035c5258a9841dd2120e
-de49dc1ae7f4c308e169098267db701bb94b4862ec87e13c4176a3b362f7ac17
-39b75de7bd9fa615fed494334254229a30da7357f1015f7d2983fecfd2cd2444
-6e697b50f2b8e409e73e46194c89844ee5e5ae5a4d646587ed37a0255b86fd7f
-9c287a61cdbebb354185d2724464a70461a29dfd3c3a98291654bd13a64598f5
-4e23fac9ad312e05d6c689e529ce5ce92e97ddc924bb5c7ca024bfaff8e2021a
-dcb6f07bc45ae0f8c80b693fbab5c1c66d5655e7de5151f48fb0d5972e2f523f
-790c7c46663b5032f62a9a510d75f7809f3c7774d2f7378a8de57a912058247e
-30e29f65e7ab0a93ca198e6dcb287d7e44f01755f849cb46ee4e8a5668f5fe25
-a4a579201bb36e45d4208fc0309d5b763cf6f5903f4c59b3527e11a1d594f9fd
-d3f6e55a9ef313faf9ee6d0f05c3948fb186cc981ae63de15e4aee46d7e3b623
-736066975cb20d00149fa393a35d8aa21637c73c396aa1706d4486bc38ccc199
-573e5c564947739431f445a8620383c17350a9f818acaa67ef7aa609afc1cdb9
-44a8a2c76f2e298b1de868a5c379f8f7fd05af8e66b55858d579e09c84100b7d
-9aed565c5b3491b2fec23390ff21231bc4d231a75576cb7382619f0480126a31
-ea8bc6b2b1535c7bf260351756ee37f53ebe18c7115a594001dc5b6d3415b88d
-8a2bd9167a5ad2949af32718aa189645a94fa2f5ee1c07b8c2a6733fcd44b21e
-8adf515da9d623d02a7a0f4d34d7969454c68fae43681a970841a4fea9da5a94
-445d4fbcf36ca7f185e8f7d085fd869203a8f3f9bb87d31c46f459c1c3ab4854
-2def58e42fbdbf28cd14d3a1bd1f7d8f4bd136ca919263dbb3c52ca2db0fca55
-110940cddc11095c5562e4338cc7b74b0ff0c6370c1cb155154f0360220c82a9
-9fdb9eae6e988e28d7fb0d44869ca4c92667ae358dc1db7601ab42668ec40f50
-14fa64b966506873d63ba425d899ce827cb7532eaa44cb8ca1e5763399387a8e
-6dafa8b3b5852f23301c441366956805ab69dfc15cb156ac11ef709c651ff3b2
-064a491521cb0ba8abb66b99119d220a197516a7ed8d4d5d223bd6c2afabbc9a
-be1daf6a4b9d6064bef32971984fa314e9f3a8eddde83b39075b3b6f9f9f0b52
-793655e96efc0cf833fafc4460565056522b189870ab1493638d6cdca563e6b1
-793516c25d149caeafa2bde531b397c4beb75b09ac16430b4219ddce0c4c6400
-1a32fdd1385372158ee82b837becd6af14ebd1cf92ba934154232cf3f5b4200c
-41e65762b0dc5120e7034e1fd4774a0da978e6395e855c8cb369e677adc49ef9
-f4dce344953fe9da428bd35a79b6d6155263c0fb306f4195a5a181c38ba432a8
-1f7039f3221d3700d584e4018469dfe590a22c3bfcbeb02c56fe0f0f5b93e6c4
-0cd8225b071022e08372ef5c5de6de6d24e22640002597d92051197a2b88a27e
-071cb9c6580212f6dddcb80185ca39a774a905b447b5b836d72ed90faee84a51
-d9f5fe37de26e4a3e5209cbcf989644acad73eedd16f028a304e0eeff26655ca
-890a74c6ce61b49b81a191e158b6f3161d6ac5def3f084d1c0e48022f111bdf6
-091916d4adb5284d062c8d71d487dfed925c4f26fb6796d36eeb818b9ef5c503
-3d4fb3bc7b4aab1f562b563bfab9a79ebf49777f6b8c0dd77af6e4dcacf81688
-caf05981536b4e91ce965abe966acde3d304d9d0f3b6433078a8ebcb02ffdc7e
-c210a35c7dab3ebf015fa81b6dba86e683fcf8962117f44d68f562b4f7c68c0b
-5df0193ae2283f35c421c6da43dba3419c63438ae46eb65fec9d8902ac784015
-398706463e99a1cf1554ecc16494477fdf68d40ca992dbb01816d410662b743d
-f0255e6c891b1482ee1353a5cc268a264e300b94d15aab2fb2f80bc1f0b714cd
-7e1546bb733ee3db28611f58fe80bc6b4bf8b637b00fee2997cbd2d2f8808944
-f428727190675e1dbe9e4ea29869af8729248ba59abc84861be3814e003ac8e7
-f8f7d7ad667df77d6b9619d5776bd048c7399f01b3688730fc94af5fea41e905
-43faeb064b8a7e8c9ed0f04631f4223730e2bd7357d6c4c114419a2d4aead49c
-d2ed2b619a15204c8fbecaa51802f3fcd8f201ca100c36281294f2cf2981d59c
-ad0d9e2ed7ebf964dfb3a5f2b1bee1b3f361806b0a5f7a74b32791644d5184e0
-2515f2122ca3e24295e4aaa1165bfcba0ebe9718243db1f4587f24cf6a52f92b
-c2229b9fdae40d1c97b6bc6eea4e16231fbd92592ef326227fad7ca81701af4f
-f47a2be563bff9d42ac841df2914b89f372283b77d62faeb611eeb870cf9b052
-dccae0c500d9ba5c86f984fca0fbd37e813fce5339e177da499e68b74965fe03
-6a4e030386eb28c668c18b04bde229c53c86941d682ab64f0ef33c47cda25acf
-91ea2c53beb3a7552d69b092a76ff6c496d84608ead8080518943a6fc57fcbcc
-15da6f2c62a6326ce45f19b403c65ccc613991bb5e493d1cdd913269816341dd
-c484abade62ee0eb0f2aadc0fb4ca2b04cebfb9989611ef65b6697fc6f0fbaac
-6745ed1a21dea33907385730bdb0cdc2fc37376ab389267ee40056eee0e6467d
-8181a77d6478b78d4c140ba7427eca7357e0f7d5f72324aa1d5e6bda674c5743
-4fceef4a522731a5092cde4ed87211ddfc4267b93655789469d47cbe3d1cfd35
-2a98cc4896b7920887378174447ae1c501c55aec394822cd4beec7ee8b9b042e
-d6255479d8e1aa7a5efe0f486417e5a5e6f6ebd019aedb0992e033a8436f4da1
-44db254c8990b3d25a7786c1250d71fbfbf6f0e45faa7661399f12089822697e
-62e4081d586ea80ae533b192cac92f9f59ad445f7ddd088b66b307041b737ab8
-cfea19ed2a9d2d35bcbe1cc4fe4487f09288e7e85b98ddcac4b097038b8a7905
-c0293c2d66739bd457cbdd9892044dff52106839c707b2e02fc433bd1d1197bd
-3cdbe6b1e55298253b09f7ce80b94cf7715f2947cfab6dfb389e045294424fdb
-6f90ec45fbcdea39cb05c6d0a4614c33769d135ed0d6a6a5a4cb25ae1d1dd408
-51aadb3b4eec2651c290a62d95a9ecf17430db06a42593ce2d06d3590e76b929
-39a2f87c2614d353d109717fcd46a7f9b6795cc840ba6b4ec37502d3271d5ff8
-09c61aee0b67bc4b8629d9ea756fdb3724b1f67ddd7b0f47b3c47c4c067885eb
-d3cfd3b7fd4f949bf87994709f5f278a699b3addcdde90196b5fce894a44f3af
-82034d0b4ad4ac692f54b6bc07b849bcef0b651d2a1b1f69460bcb62985cc661
-4da60cb063586207661c758ec6bfec68b1f03a32e9b41e8742fe7ee126411cdd
-f327812a36818f8a88f4945202863de81671c01c608f2387d1de2d7e686b5f20
-b7dae705d654112576d937efb9cb33ee65b5435ec9ea9eba518b3f9f1d30b9ba
-7f7162e86ea5082e983295e074a854f1be92f637be4e7d99a75b582ca29f968d
-3585e2f6481ef968c08ce36976ee7dc1c1577fcf9cb546130352f80e880ff81e
-3458808bad09930300f85833c920c47d61f6be8ca5a5655eb4290fea4d4847c4
-bfe69e08c0a5cb8f58455f27d360da7950118eb86df84f490efcc4969827a14d
-884551b1185831850fe284b53b661098d1b145b3f2a16ea5c7ae601756da6aca
-c141e3ce0b4079accf03fd2376db53832bf0d41b49da9063e79d63bdfd37bf7c
-94906c6cd82ee31e2184bc695f2746a01cff0373b369bff632f3753058cba0cc
-2e7339a4c85170dbd24fbf89d917aa24de7583dbb8feda459081af95940e35dc
-58c7d363511b82b95d983b6679f11bea2675775a1390bd8b1f66afbbc1295bf1
-05bf399faf1665bf04d975b31d031c6c74e3ea1489c57e4826263fe56de76639
-2698ded8780494b338640fc42a58c354a49ed70301b128f18e1c33c45ceb89eb
-39ee8c97e200dc39325571494b49851ce1b8d1d0bcf79a3120411a8b168a7758
-15c0eb119ca69ba8fb227ce5747785e4a096f4b35eb15abf3a8f45bfb50246ed
-2a3b2be2d639fc263765a00fa0047972552466f8dd6d596bb6812fe530d78ad9
-5a6c1f0c70f003d4f5d6d255e747c99c7bad63f97b51de299f7788ee41f08ebe
-f60f52904502200fc62d912560792ef032433366860a3154a16bde3204401e00
-3bd3663669d15a79596abf25c6770bcf93012334db1f1383d80e18f783b5088c
-8e03e5537396852caff77cf3a15899d21f6cfd57ca4e73aa5a6db1d7f3e7dba7
-6a31baa5d770072c9a29c06010bffb0a0e1141c7d9ccf6193cdbe7da527f4cf3
-e63298fe54b6e82d64bebb75fdba752968910cf13b2320eef043de5a140ec54c
-01942dfbc94375e12a9612cb20d117f9d3e0878ea790088bfdd237ebb2caeef1
-6e13217f0f83f508777f9df0e37843fc9216a06eb096f7d6276df5ae8cd9db39
-25a9bd2966b7c3b58214efcd2f9af2636d9e9f73b09b4da344a81f7a47dceab2
-b23238f002540d017bf200bdc87bba433c7d7ec3b55da5af20c37cbff34701c4
-35f091ab701cc51c9f0191d5028668bd6a871e4d08ba19170f8c1430f1b542b1
-7bb65c5a95924a1093c04c9af060e456ae7695ff5f6bceb846976bbe437a780a
-e7cf5650496c859eb598942e3700e7d1825e0af3bbe764369a7ee75f14dcacb5
-24be8cca7f80985d42570543532aa5302964f5d50fcbfd1e094833464c361d94
-de5ae694e605271102112615143f68365c9a626218b923b2a2ca76c4e8707810
-f1cc16d0da031df23e71591b1cba436bbd25829c3d0f0eb60e8b85d2f47e30bc
-b0abb659bca53b96cc968db4d82f0adeb1467b54315451bc89e953e1e2f47141
-174fe9a4850b451ad468afb338539e2faa9320edff3118c60a5c4a7e32a072fb
-59bce786196cf4fecadfe62c4f3a000a230169397f73388f06d9c6ab33fefeb5
-b0c93ec5c4fd02ebd912fe85eca4668d8723d9a755ec2501ae74abac9ff03238
-d8f82e1b48071f527443f2a94a1f90b6f2260ccbf51b9bc2de684a2a8563beba
-3b05379fae11d6ec2214953decdeeb994dfa50847ab7357b121abea5672498b6
-9a52b029e8c77151bff878f7f30fd0f9a40b8e1579a8b672b7c755b68e28376e
-4b5becc11fce9480bcd2c10099447b4e6b3bbcd3b7e84ed51c633290ec084571
-ba4665bc26ef665621495045e18e2be0ee391f764d94f7e631d02c3c9191637f
-e49b03f893589e3ad60281ecea2160e8171783693e04355722ba6f7c8da1db86
-b1ea3004f486f94e9ccf37749e8a0e927d15e84523402684c1fc4c514e7baf20
-d77d00506cef1e9b81fb8244f0d6095ea861c446948fdbd822d10df5d6a82c3b
-0af0caed6d1fe7521c6515665be4a5e10c8703c8e4d7db3a735119fda2bfd79f
-8f3dd3accd038fe9158e33cac57890e6fb22b41f82fa854e1b6a75cea187d2b6
-18d4bf9117bea6261aaa838ead2e50c115c997dfc996c8d00b587791c5285df6
-b5cd27b12e338a650f53a0ec9cad5bcb0f2053dc77aa57a766e2f8e290586e27
-924cd5a5c1cf0c08c48d0e7f9990e84644e9a6f5c9b49be9e3d7322b9b66de57
-2e5b0ab001a2c9e2d9782796a4a7475ae1bf45d9389a99371ea684ae896f3985
-8d17a6c734ec6fd734a64c6747a207ee39f1c9f896b6f6ccead910d8bdb9b642
-b141d1a57dc06f9f303947c61fe1d97699fc3ce4c66bf9953b6ec5ef743717cd
-831c22f49a68446b3b8a966b8659fda893a67fda0cb566c0eaf31bf88f7b480e
-1f05a59cdbc561b6c7d532252aa464fda44727d80b6581c7f8fd89caedfc3b57
-802e694b74dc15b889c838571cb6ce197439ed966d5624ba7567e60e4dc52c48
-c74e5f2c2e0282e54cb82a5214b3a97fa82e779957265a4acf064bec17700158
-8036c7b52c4c2233cb0e8b5b244de31afa11afecdf26a916cf1ac85847a51eac
-6cb46b3b35d7fff18d2041a63d853535fd09213116b0b62a115623b471aa4849
-6d4112ed9ec7351894cb36e9f9a0bc1c015cb3110201390643b2925dea3a3dc0
-7fc8d62b62ebcdc38c2d3316b8ec0055c34acdbde86473e4dfb1d5e33266943e
-9f777ceb99c757b6c6fb5c69cdebf31336d418f0698622f2a0e46bbd0094cadd
-deedd149e7ebb57664649e550a850dc994df665b57d81b571e4bc6c0d25a470f
-bb9d78ac9d2fa47c41675a11f3e5b88b567813256f4a544fcb21238a91e2e30e
-c3fe52ff997ea81e1b0d9ba23e0815ea78f46003a8463158f6077024b33de798
-ed9c1b02aa6428d1dab23df5c5b055537b44c47b4cdea9c7783ae5d534e65b2b
-4dcbc46156e6353307e0e510e4d63c2b438737671c024f29b80513335be3b4d9
-8dd586131c242b34686881b7d38deee1ea765c86e7cedee45e8f184987ef2e19
-15e668f56d7864d1a8ffee2446c74c34163d2f3b7a9c130ffe08ed50f82ef23e
-de6b14e54da94c19bf1e845d52cfe4bb5799572993d3115c4e8026d233eeea4a
-2e9aded6f4f13059a77a291a68899f823c1dc8cb477b8a63e613dc9aba760219
-e59dd6207ca3a22da2934773001d735472c921f2c2edb778c8cf892295482ba7
-6253c77b38ceab6254eda38eda2ade861ecaee566ffb7228dbbaf41cac2cecce
-53631734fc3240ac314f0c027bbfcb5706cefe4f1f975a8e2ee0956b23fee700
-92ef2de443b84ce88d513ba4def345f5804f6b88752921e636e9f3805ad16575
-88415aa0e0de5696f58ee1f5bef9053265fbd2fb59b1ae56b57976169aca1856
-e577d8ac3f8682ac5ae380031077961b4f5109f32cf14844d5bf33c230bdfa36
-7849549ec66ace781a6872b0997b3ae724ecdbcdfe1e3bea3985c4c49a301c61
-d420275f26fcd495a44e006fb0dc4466adcadc04ed4e7d5327430b63da5fcbc6
-15df77ee82f16d884b82ae2ca29fa3ed9bef89c39636c60d9b3fa3b0979daa47
-247a16e7c85d3a2eff262f02693468edcbab854de2450ad5b57549cd210aa038
-66b7ce681a264c8fe84d1e9db444dc9384613dcdc5eba9b416e45957d6781b68
-2b91c3f421c8ab3cc4c34770d92c17154e67c70dcf432c75b9eb5ba31fc1db9a
-deac4609c8cabcddebf16af760647e84cea4ca275a0172367ad1267fc4b53a93
-bda2df9bcf433ae4a97e97d2216fc97fc6471b30d717c89c070f8907a7606c63
-2d584eb26c0def8166b20e33e5801f41937240794c42b9a89cbba3d69edd7983
-702788b068646d730615f77cab05aff0d0d3d6aa954aad02b927fd16ad2e0fc6
-e867725194465abc056a13368c8ddad965d1fc158d8b2860ecf62f91254f5d22
-642493aabeddcd7936ee057c74b65c3209f97d139b4ee97d071ca97ded70b3dc
-135b4f6bb4b614b9b873d8861803e52b5c1c244041ac55002271c638d59fe5e9
-81869703cd7a6c4bf77ee3c1e874d01e42e5971584c4fe6793c9bac4ce1e4241
-22267304ee3494db762355ad4ff4f4adab137c86b075c9b8f9d550f7c064c50a
-f47e512f1249167dc28d02f21f46de36139b14c872cf9bc0c42cb876b9381cc7
-c193a46d0e7e4445af03a2b80f21c03c1bdb4c8e73a45786b4e3bbb461765baa
-57b956e0cd966d1e6df77d4a4fb5ac914cdd7c6619ba317f7c33c453ebf567e4
-e4ec75816c790bd658350a0fae0eb699c708559b4b5df253895491ae9c77da38
-8ddd56129988ff4d6fdbe7c01d890ee2689f235590f0b80de4a591e33e8196c2
-0105969df7fe558f8e2f97372ffe67adda409f12c17c979739510da4b5314ca8
-e4e64281658b232b0e3edfade545fd3c7e7fbee52adff818010270b0855df99a
-acff5c77eb34159fbbe8c6d355da82eee52b7e153c354cf3f18baf88d4cffdb3
-00c8b1cc7f30219b26efc8abc8edd998eef793c7f4cbbf8a7d8f702271740335
-ba6e596c0876e5b3437218693508f5b59a5e24e754adb4fc549faac222b31402
-a8b754b37c2cc69a69abf86cc89123c9cf654d2d37a08251bc1f119ba6b72ad1
-55d2d0155edd88f76eb739280b74e364505548ecd95887229aab96271e461c54
-32aacb7fcccfd3616ceafbc4932eedcc145aa25e9ca13fa8d9ccbc9147418793
-b86718c5fcf833e4ee24fb58fddf71a53fc5203e1fd3f8132425d9a9bf216a79
-e769958a89ff7104dee938179b316361207cbb3aedb8422ddd16a10cab1edb0d
-0077f1d83716f824236037c83a759f323cd24d057a3057e5b5cb8364528b3676
-c9bdd5eb9c47412c1a65d04a72f4fb24aeff98ac6383398760f2d593f1462aed
-705e4ff227ac6805f91d12486a7658a9015ca7fe8badd6f449a97e4a4d3912a7
-3942c9ad0eeb2d732fb5243700cf95e18712cdefa2406b5c230a495e57b46274
-e064104b8b1ade3f2e62762a9528b850e4ef45440713626eb81df73b470c2f7e
-e1df0501871f216a39cf671ecd4a289dba51123997309113785b7b73a5bfac2b
-26532b86124942c3018c02f3d904c17596d451486f488593aaf66b73490eeaeb
-f28eb3eac5f2a7659015f205fadb5c833f10375b029c1e3046a957036bf27c18
-1ac81761cd177fedf126833b3dcf3e5caf296b7b910caf9f6ea742b6a8b7503b
-3772ab82feeadcbe041fc4b959586e06aa7185ced2095c33fe11564e857bc596
-2cee40d18e59317f21efe1f27a10b32ce40d3b4a60692d5346cdef10fc6ccebd
-2a7ce79bbce9c4ff44b2f06b9a28ee1328e043cc12b42ab03317cf9bae3e84d7
-bd52b0761c1c0fb049e7aabe8b2a6bae03b2a8ee4a6543cd1f2c89d4b906997d
-5530f949c403ebc40342e9d8816a39061aab7ff76c0080185afa3153500dfc70
-587481dc9db515fbd77c0b08d86f944f71745a0a29517136c9b679a5b0bedca7
-f623fba6b954f39e14e1fa04f01b6e377ebbe90e24d069908456762c42b35010
-677308247b6343061bc0d785d78a786b1a04bec9f9dabeb86e30e64fb4ada8f1
-b9fd75c9b0d64676c4c78d635b3386e362ec7cb06bf2c85b8a22292a58f7c038
-827a1a964af9b7b9f3fbcf8472d120c5d9c0bdbbe9c13ef14d2bab51a183e3ce
-487c2c463b5b74f4b770ef9e0c60ed08a7eb54bffc1c0ab00c51163af9a1d428
-c30a5f2abb783c39e1891b93b27ba533aea8aa8b3bde4d9bdbebd0cb63554705
-5e2dbc482dfd2f70e88f9d7785b37492e6068532149a9e8fd5607911993e9dee
-e1dfff50620ab8d327e51ecbc1d9f57045cad11228d13f073b197ed7bcf23bba
-338890c5e4c89a831d3d6ec6f4938658b12656546498a6c7ea94f50c04bfee0e
-96b00e1f90bbeef51162d5122d00a62d6fa8bcc6ba2609af9ef96f2af7341ef1
-ff453232622e760c66c04a5ad7005288a1963291a82ad061105283d9c1b6054c
-5ac6087102fa0840a71d8ca55225f5ee5d9d8c5f4233f6e27992351df89150e2
-0e4c5b3707c15bcbfc0a2eef1babd8bdc8ce88410b5d21b2ad07f6a6a752346a
-9392ac16bd36af87384b3959c8ad6092acfe0bcb4b1ecd45227fb53969512f34
-a99c43d16849f0282592f199a87cdcaa47af35b93c37b341d4f9df8aa99de0d3
-9dc3ee52a87141cb9dc54ee197d01063340f0d8c34abdfdc6132bc39e0d10e4b
-094ef37bc33398c0c2eca7b7fd26205816798ccdacde7f235a70433df45909da
-178e6ba670d4ee36c0894e42fba7c6e563dc44b64c253780c586a355963c153a
-d25126232fb9a930e7e46f68289d1d1ff10cf89c2b81a82872b725d74a0067cb
-76f0c8d490a3347c1e8c514dd118ffd233fcf22eebf361b73cf6d3a2fb137276
-4adf6e62d8787f9988416118607c6128f7210327017bcd6db915b88c7233b2d6
-25840ca2473d6a9b86442963466334f743263c0d9df232d42b7b35df16d80cbd
-a08e17732d864bbc1e3f244c54f22f8fc198355440f8790aa50af33aa967eddf
-d61cd3272c0e9bc63598c50c3af58a18c649ee88c38e4404af24867e43a0fabf
-8a709eb5ba11696a044c4d287dca9328d768fc04a14c382d55dd54500cd5e601
-bf64480cc4f247a4b0c2bcea1a0c648e7e8e661f69dc09e789e12581d99464b8
-549ad6a29c2874744c42b434eaea2d2943fca61c27bdeed1a52be6e6808383e6
-a7c204ab964e78295355e2c53f021a809475ac21375c55e0e7491f4b1289b3f7
-5a2e607195f602687628ae541fa96ff05d01dfcd6c04a2ac5b6236a7b9324fff
-00b71e095442bf04ad5b8e428b18dea2e6dbbd77a9c096cf4fd591f6a563bc3b
-734b45ef6bfa0e83ccb996b9f8981e55627f790eb93947b2f01c46b7b4ccd788
-d870da4d3242541fce9968ddd6e438be5d36359d09ffdfaf2bf1ee47d9633132
-f41001b946b4879400ccae1c8a934a808fd1fa6db83cbe3d8dcf2af0d577fe8d
-f6fe30b1e0ff0a68c7c8fcf950bd9aa17c8d8a19296670eea02cd17bece759ab
-abb6a93ed4a6af531b7f8ba2e9ddc5c438eee125506816025795683f27d4df22
-d811c2646ce8830860a5d8992ea6a8c0ae01280b8fc4f27b1b31d32f826caaa9
-635a1ef2cfef6ba6c9ca9c0fe970d6e601a88ce06719578c27f33ff9f6f2d672
-dabd6f0be0235e3ed61c90bb0f304188784a018ff90156d8d04c7071f0de22f7
-d2cf7ed96707a83461ec99fa40f6d894286308858bf6f616f6c1105e7e84060d
-1e20502bbb968b61eee38f151fef5af57e92f1d0196b8eaac2bcd8ce523529d3
-e8771aad8265b7e5e9846f28c2a83512fc056de6a20f8c4b0711231304b5050f
-9510c17801de0c8e2dc22934ebd24a6167ff15e9a06c023d025f05d1f960312a
-bbfbc9eae21c4da1a6cb51ced11db6669da3e2d8530fb9c9287a4dbeca43c0ca
-936364d960f7611ab03fb143557d9545ab4fa4d407f125b8ec4e5c366c4d2a7a
-0bb9a135eb9fee265dbb5955ace3bf374a0d321c82e99329166806ec8d198adc
-af85bf2ef282c3ad477224d4a028584b6a2b5e4677690874194bc2ca665ff590
-da247aee67eec7772dca11a4897b12cd08532dadd9a217055b4840f26a8e2103
-e1563952d46a596e511ef81d1fb0d502fba1c6f5c0ea17c3e75e2b69e54eec6e
-0bbb9278f565823dd1ba4e5e850cd6f5aae2672bae4a07bf015ff08a013bebf5
-810fa3969991aaf53ce458d35a44afbb39d4c3bd166ab4cdd2389f3cb67ebc2e
-6782677b79fa51bb557c49687bf1b11f2082665b151e757e94259ad6659502f9
-0dea0e4588b706f5b9dd7e75bbd371539949a4f203b1402e5b35c06a7061f048
-8ce78957c95f4d0db1897d624e8f6f60e4f604973a89445221191f8c06f5519a
-ec6be0a1c2be7cc6e5ba73c619f2badbaef9e54fa9ff4189246fb333f4dc1f9d
-deb1120971d08567d890c29571327fed1651b073a357d71cb48a852afcfd9a32
-3e1b540aafab71f6a61e05addb80a225b4b88c4c0f484197951e3972df4b9560
-33d831653a2ff15e7083adbea09b33a35575678e145030c94b0c6e0927c9d4f9
-866b72e6b2c203508848ee893c13ab752bce6fd4f9fc6ffd91d28d14db80db61
-733849442b4979ec6dc0d37c1467a2d5381c8d33663995ce613728d6ae739370
-2f9d266a3e09aee52ae15fec98a8abb59ac09dfd740c0eef4e11b78cad38208e
-5f60d396e41cc30828df87b3e50bdab69b39af0fec8c02c324d086eb42e097ae
-4ce80ad0d2dafdc139e67391347e116bf1520ec8772b4b74e9272b4bd1d4cf18
-e808908988ab4bb2cec3db5565393461ca5af862e6a0f2183fff5d81d6508247
-05d5036599fcca825a74d487a8db33e6bee831d324f78af5910919d966ea57fb
-830f6b782d3dbb8d5f7bad8aff2ffa541b16e78e2d23180b4c21aec877254afb
-34076c578e4c40058375ac7e7cbbb7793488d7544bde5a6d29cffae9eaf0bd69
-b717eb353a7151bb06bd5ef2a38259798a5a6c9a684b377c0d72c932d52db0d2
-c9e86fd712ab9efd0eede6c36f24f2209605c401a3ca9bd28ff0959ffa480ff4
-a0eba22ff723e4fb4699beb0eb10c3f8e52022bb2ba2541941582667a784f397
-3cff0191832b3eb363c6977661032b8728ac754db575f3504749f70c8b021518
-90c8010c0da0503726f4aff60c240e8fd733fe37c74ce40a236e8c088c083dec
-dd187a2c95515e54ea4ded8226dd9e8b217e936d4b41c767eed5d20da9615b32
-2193abab5fdf0a2c3ac1b35743e5dc9df9048557982b1d87296c2f82dccaa4c2
-3293ebfff03fb7f8f252ec7052793b3e01fb17cb526814d7b73ec1abf03d9769
-a18e3fd9d4ac55bfb534481780790b76fd92d947f3adabdc10d7ca73e59406ad
-65481ce38557f64c5a23d1841b896923011af9d7c3b999772085d8da26122059
-ccd4972c484f9fb3e6319414b393d39b813ca2b603fa2f18926178f1fd33d22a
-bcb5d561159b0bf186e52cadd6114791a9cb211c285118cf6550ba24a931dcf0
-d5c7bf30dc413918ab2f6404e51d612b50094de3dd281db363d254e17fb7b889
-cb5b906db3b604789ab7c7cd9922e879b1d7a5292990a7667fc1332d71e01be8
-95be5d17f05d662243c7e3088fab828dff19c60b61f1b413e38891b5c0125648
-59db561729c92db0aaca99d8309b18f0789a09429059c57f4aaf4d39c60e4866
-a01944c0adee288eedc7a3a3abdca9275720d1b3da4233c91a4ff6f1ad4b8eb4
-ef4954da9bc9e0c48f049baa0fb35815c66d644d3bb340872928802611b73c24
-397f3fe32125811c8891a8a4c454aa2ef649d12d9c285310e0177e0400d6cead
-27bb940f9ec37b7717c3668683ea1de7e6fa950a5df69c6acc537864062cb948
-435d769f1673dfefffa71d9fc33c063c12f77ffe7a9ae14198a6623488ef0721
-93b48be6c45bfe6a1eb11d5cdf6ca9dd4bf4a2f0585365c690e57f83f7c0a80f
-2e24520d10819e81809116c0948278b9a9de9bcf87b2cd06723c0d95480e5747
-f437531f4bd6fb9ed73f5072812f66dba6fbe10eed9b19ca8d16fc023ba44cfa
-d17841f9bfd586f914e0d2b3336b4cdfe63c602fc06ff2d8dee6705955bb5b40
-7ae736aea9e77d00f679ed23049980872f1ca425b6ba0f35703f5d3d28cd7bfd
-8ed8818703308374a6a0bf0411b8de186a8b9ae2c67a37e4d2a4048dab5228dc
-53dd2bb2b269b1d220975d7ae8db6f17eefcba79d8b8d21100e528110bc6c3dc
-147e8e2ae9a38c54dd105ba79b57816991c435f412e6deafa71724f00a1d0b68
-faf771589d6de7b07f48e0cfc509726d1015233a6d79ff1d290d40d3f1ad1dd9
-19a8b41646c625c840ccd98fa5856ebb7a36f778d9b920d7ad0357c13fb3235f
-52e7e9eb1316c4fd0d692c6ef630edb722568d9eafc20ee3103ec21ec8ecc46c
-c6cae184b121be328883aa1c0ef56ebe2eb0e4b7cf40cff3d0fd5cd2ca339dff
-5560ce823f29fb7e3cd0cb47b16ed8bd72a2126f3276cf178bb0f1a2017dc12c
-8a64aac7c26bc7f940e29410d516f4543a21b07f28625bbcbde727901f157a8f
-7ee6d875847151cc685c1474012f5c92f25e8117c16b816bf3d99f3fbf844e71
-51e2f5d2b487a03399b3e263ffc722f6d4652ff11eb158327a2c94ebe007f9bd
-fa6365221e676c846423d48cf1c945612bdddbafa91e7f76cb71174a48bcbcd7
-3330040298c4b93ad3dc7f7ab689d3c68daae2693482c746f3d16ab5fb291fcd
-16c7dfc8b36b5105c35d65e23b7ae1f46fe78204f0e48dca991d94bd4cd0ff6f
-b587386211746e1814daf38866e9293a890b47cbe47d6d0241d1a05db32f3947
-dcd22aae8d26a2c92aad8041372f86ad9a518b2b40d8f9a35e5afe82770ab8b7
-b1b2a2e2e456a7895fe9b3144ecc6f3dcb4804d21a6cf11e5f48c8f7d6e69e23
-cfed3dcbc7cade5410701d7dbb19297616419fee5ed72f6c4c302d4b6928e551
-7a810b9c7cbb33096cc68d509201879f24646bb6027b541be7013fae97ec91a2
-1161e2c49a2ab5f6ecc731da083842edab4d7a029cbace3af24dab6ef566228e
-892062ec9ac9420ad0cf098f89bcd0e46f385fa52943c352c62341d5a1054e5c
-5c8976d6085a43da60468e301e19f2c10dd0084143e377fb8f53b3a4ceeb0c83
-6f88ff44e180d46bb136fe75b2b2ebccc364260bd72ce07e935d65d2beea401e
-2a3a12b6b1a9399b76b66fb16f57431e0a84813db0672d84c405bff5c06dfb1a
-7cda4ab6974e13d88c631208a06ed15794469491547056e7929d543d05ef7f14
-a51f64728e444b0c6fcc06ff89a8289620160d82e36a477342b70ca1254e4792
-b3b0b5fd349c38dfaa19a3c306124d50079295bb7224ec8b8568c9a60f8063fb
-4d49cb80175ed24bff8260e3361ac5227cf87a0d9d49f56366756991112e567e
-a80ae3e6451f90184ec37082aed7eb7ffabaf3ea4cc8e9262a4c893da2e6531a
-4fd9e46d3c448031f043b0fcb636084bd0284a20c57333c11a150ab595049323
-d0b9c535bc57dfbc7f32247a374412328f5119098c9e2a5182a47e8ea456a42a
-bd3e53b3166a525cf6722aa07efff48901d63d851666ab149439f0a53fb5a45b
-f816564244c03ff44292183533ba2251bc0b2b1048a02b270dc0d20fc731104e
-176cdbd1dc8be38245cdc422ac0f96d8cf78f43343a3be655aa8b1fecbfc67e7
-aba66493f877b7437c84aadce69d46ad9d61a9b2cc484e0f0dc9376a857a8709
-39b695d5afcdb77049cde5a4ec726022d0f92d309cdbc7f6ac5e6b5630169dab
-c70fe75da2048a6c5c6b75fa2017e8892c8cd4aa408452e0054c2a9e73d43e91
-67104adaff3f149a43da3deb46045f507b08768dad3587cb00a1ce8c185f874b
-d66f45316bf9ba7cb47ee1a1a055a91c03c3d94128a82b5a7bad7e304f7baac6
-5d3ecca28b6624e745d728af83006891bfd39cc56e28af59ae3317501b450592
-bc6bdb032e8d5f319552bf281412e033b73644912eb30cec6010c152f36462f2
-5bca347b9ff899a593a7e9b96d6ad4b3ccb20e6a972a192428d4c5bdf79cc717
-97cc5d48a22981afa791078445b7873ba9f36a47d4e9124fb063506536bcf433
-d4f898d334548332e655f1430c5fd56161e78a98f8584de372f5036b7e02d712
-c0422bd413b89b831f41ef23d94dcec5db71061cffceb7c3f920a1a63d28cddc
-fa742f11028226b3c6c9987ecbeb75e343c61837bed4597f4b2e8e130537bd60
-7eb0016b5c48efd3282e758fce1868ff5b302074cbd62af9856de3fb54996a3a
-ecd8f0c6f0b20ac3b511321dce8f97d5e67643a9a63f7af293c863bfa4ec2c0f
-a2c76aaffa828aa6643eee7f6408b6ea09e91037f30cf2c391f4c9d9cb5fc01a
-5a012008b64c7e19ab795e24ec662cd3a931a98bfbb545be4489d7d5fe732cfd
-c903cbcf2f600bcfaf858b0123a31c12f2abb98c17833876b152ee9efe354873
-b9c144acfdefcb99273276050fe43a140247a35b0994927aa2a1d7463ed69e08
-8881a303b6131e3183893e3d001f241809a990efd1c1ad7c3b419cc1644bcdb9
-a47e3a8d8fcf1f52865c4efee0079b840b82a95223193515b85b9102c7e3f0e8
-65f44580845f0fb5fbc16e339b66aa51779eb714a056e56afaf0ff6be5bce7e4
-754a553912486a7658a9015e1cd381969ffb9c6bc4aaf54ebb6b0051fc7eb362
-39941c8e0fbd44bb2fdba5dc229e9d659db1b44bf2688cc7b29eb0bc96f03f79
-fa0b953aa215ece923ef8a4030ce185073c30ed1dc8f6d6c005eace2a3642060
-b95a54b0a0b1980b1f4608b63f245b8ed7e640a9c3bffa3fc42449d9d5cad579
-e86a050e5c9aa8696c5e7c4521daf837f3213249848ad7f26da04aed56f8c543
-61b910f4e1c0e56e336894db76da6031e445f889c946e4c79c79b21c5c64cf8b
-c88d06cce7614817e26c5d522a2c3d26048b964f93008d482af4f25638e190f5
-0d2775dbb1c4a4c077e3721df3e49bed7f8f642a6016963b6f58b8efd5ca7ff1
-1367b20a7019cd66c43738f84203abdc5b12ac2c0e9c8fdd15d1eefa86b464ea
-d60127e71e62feb7394d5b99d465cca9022a4942f9e8f6bee849d655f6e52dbf
-26188ced3107e70480cdc5e7eb3766fd734dc86f86f823c3e5c0bc0afc0707a1
-33663995ce61372981903adb5cef4df34a3b891cfb8c30ec92c4627b30078643
-14b9ef98e4acfbb87a6912b3559d58dfe7288402bfe33064f126a2da07b981ee
-0dfe84cf8b2c72a67ec9c94039cba069c3ef2a24847a72d01a86145d0a97be64
-700effa830feccf46541278fdd3d35d082ce150c39d946362f3e5d23096d97a4
-76367bcccdb04e7ef9c608416adbae868f8800e645a80793bc0ce0e648a398b9
-268f697af3372197c8b33bd2760b0e75f7f38a6d94c4a52ce711c3ea21292bf3
-d48ccf0088c5781979bac62f072e2702529e43ff4bd63d94048a825882d6311d
-dcdb6f2de1c3de60cab153c6f48f5b993ddae60211b154a5ef0fc2a0c3d18c90
-eca4e35b8796fe6d99734fff908735ee111af75af45b6665b82189dd3c835ffe
-b13290cc59b25161908d29f385b517e85401222a94e1e5f139c5c00b72d5d4a0
-f4b1fc8dd6af78b00442b19ff2b9e8d87b0c33565ee49eda9a5e3d26b7c7c82a
-ed94f162930ef2bd23fe4628085a3e7c41153fdd1a335b994b9bb10f6cfe6ef4
-2cb7dc8f3ce9d8458f560fdd41c6c189acc63a0c38e38cca94560924b4de1e59
-873896edc1b8d0170c7da1af5908497d4a48158498d8c23e49bc813eea34a1e7
-3aa06342b6f1c7914d73c1618d856a995cb51c407b2f6ab72f76ee037547279e
-336fc3d223ede5cefd69b5c15d3972b2f06ffcba1dfb9a0c9f23c47f369de28b
-662cdf284d112ce70934d22e2e00b5448905591d813e0ecba462d5edcebfac9d
-415539241ac5e4f2ba785515a78b7b009b4cd20cccdfe4f5d8390f9765749f5f
-d6e529814fb9d54e906bc323b160a29c65c60bdb47083a378727009feee85acd
-ae66a691a76f7d58d031692215c3a82bfdb44cf3c52697006e8a5899a78aebea
-ddd3b4c4c8139a0fe0ed2aafd845adaff7b26ef4c318a568dfd89b5060b20c4b
-3c000b7cf8562fe82185dcbb58298decd616f6d9a0e879f1887c1605bc921f72
-d6b7eab7a44a883ba9f1687432c498eba28a7e650eb7b1d97ecc72c9fec17047
-7c62e050da13dcf5f62f26e62f4025ffeec90ea5ec51a2326f5c08bd1f7ebf97
-483279163ac37bf0795ae19865fbc560658c512240d5771ae5b8da18ebd3ef91
-e83fdf9d32e40ec1e633733ecff3ba66190f94f2b5338fb7d0be162ae41dcd46
-388bac55ae53b56e308c714a91ff676ae87f1e6a478075e259e9148d1b60774a
-a1bee100372a7e29379ab244c8c4ba555f5d77c3d98f22e80f8a255a36f1faf0
-b2fa0ae59c61d33cd9e70d0259da5d93f19bfaf6b19df1dc35fc783b3939dc8e
-d93572299348201b4549a05f316cad76edfa35467c4328df10e362b91aaa50a2
-ea7b859a5b11a9c5e9dd49a2968913619b57b8a2d6319ea4f102d8a9813d6c8c
-3dc6de3091f3a4034078f15dbee8514a59e6eefbd5559192d86c7b55761afd5a
-6e97279028aecc6d391feae0deac7cfe033e9e64339b0e581f5284bc81cf79b3
-eaf122baeee10655aca357383fd83d481291f37c90b8737d16d3416af742ba1e
-db69f6a73f16aa2f7c122a2ba21c499818774d11141e740d8848ac15d0acd7d3
-f0acebb718fef48afec1dad102e364a5f4624ba04bc3d87fad0798bd45a99923
-abed715884d93590752b7f86a3c77b14543590eacf229f8f223b8e9a22eddc3f
-a2907482fb537652ac3f6df21fa57cf44ed6b8ab79495771acbf4e99c1451507
-e949dba77ffca3820c50570d56e1d49fc4e9d89aac4824c370ce8833441f8b02
-d19753daa907205d4a7fdaa0fa130c296cb7b345916ffe0cdd15d92b7521e46c
-93d5b6ad6c39e66d5d6a254bde88dfde11fc1e0a15ab05899434396d95dbd7aa
-fbb7e1335de4a13915d33bac3f4da705d9ae891eda4d9ac185a9fe58c1ef7ebf
-bd73a418c1e43ebb42938182c0d905e79506f642ec70961d096d6fb73be25805
-4064c56284f06ceca2a7afdbecb611a0f67e2e3ea52c186384f7713691c8174f
-0bf24103dbab5900253a5f424e485c7c27723fb555d0e2c8af7660a5b914e044
-51d41fa45b17eae3f7815926098fb5346d527a7d7db1cbdba966bea36e6b963c
-2cd8a9f509319cc9ba41eb6ac29832c8be17776779f8c2d6cedeac81005b91ba
-fc8e4cba19744a4433c91319ecf73ac1a013554ca0ddb4eee09ea087fc9b2596
-5a9cade9dc4c9888ad0c9cb468b33bb95231646f016fe42b2b2749f77f6cfbb2
-d4b131c98712e2df5d1b024f9f22944fdaca133567d66fe5a87e734b958bd292
-4d97cfd2c3a13dbcac7a09abf9b153549d9b9c078813f407b9a9d8afe99711db
-00edcbfbcfbb273d767e4c4334d9a91ae12522eaa15f54f84e2f9468b8e74bf5
-e74a1fbcba022550c63a64d85c5eb33d02ca6c0fd1f5a9aa46348a953aeb3396
-86a46ce0a13686927c03fdcb24ab3d98f1a4dbd8e6b991bcac96bde4603a9f1f
-7859375319a6a850dd327d7d745fcfdbe437255a3566e9edd14af6c2e3444b1d
-d9dbbcf70cbd7fc5b947266938c04c9f63938e88ca30e4d636aa9cfb2daa861c
-3874cf2fdbc490e32bd6598ec696cd7d58da40bfcb6199d24f07b283b4a9a9cb
-9b5426be43b4d0d67dfd8d88152fa14b531d522a9fac6cc79d2617993d95dca7
-d89b8d7efddf4c29e58cb0feb70ba74400b8be82c0499833253934c7edfe9e7a
-90a004c4ee1c7e3dc31c24ad166cb1320da8e3bdd05afcda1492bc34bca43b5d
-32d540f77fcf45d879a5646d4a4604397e37fcc732001d0af721d7aaf69952dd
-ed912594fa9428a20fe0ae76e8401a9535f38e448f69d48bbd770f23ec075d69
-10bfd3604a1dc79f2a5159e8fb26b4a3eba3b50cc46e84e4ad657fdb0d254f0f
-64e37824ed4c1efea12231df670dbc1847880cb64f7f3c382b88e183de261485
-f7e917e67ea381a568ce37212f8849df5cdd75575ebbcd7522e1dc3400a1d8e3
-8e09555799cbd6d3f488633a9e3bd4a2f6f180e1d27e0aa3949590cee53cfcb3
-3a14fe287e8021ab0777baa8859de5c21ed2fd8c3b818968bc26f5f9fd712eb9
-424c83d0ad28b76d1f5ba1678ca31925d49e2786356867ecca08a150a4591523
-964ce4589563210507493b74148ad80cb3c171e22f38e73a0aa59f13c839882a
-536c00ba899d409a98480a1c7f82a44c36698d8ba5d0fb8d50771c0e91cea55b
-836a946ae06e2f0c2275db32833265402264e2f6a1c8b896d5ebfc7c1872f2c0
-b4fcaa97210160403ae0ff1380d7e68251ef7c25e0a66a312fbad992aa1311b3
-61cc5afdc82f982d7343b8b7909c6c7171f568eeac8bbf8b43dde0d928e81c86
-ba3bf4549e255adf55d6e5909a01ce0b270f53169f9807cb9c7c70f3d3a569ba
-8675d0f345f8e3a00a1c6ec27d5f83d275358830afdfd12cf23a0500e2512fb2
-faa9d333566da5a65dfae8ee515ae450ec5aaef7374ae1d598d5cbf677b85dc2
-e0394ae746b8c9554581c737d79b31048f4471d72972fd34bc2662a83bebbb32
-7d3e2c2bd7c65e68672dbd3ddc32bcc31b27812a1841c3edcecb723bbae371c6
-70f5dec75dbc9dc90e557280a836ce401105aafb64deb25e6ef6396da68183aa
-a39e207a4ed29a41d9be11cfd888c1e7c1c5f869ec0272c7be8c85703721101b
-0d41921b6ce168b781b1c745dedc1b8fb3f8fa027b0c2f63aaef59bb3c485c1b
-c773e6c0672bd48bcec83042cad9b3058b14f14051906960602293261be27514
-bbfc3b41fcfaccf05d7eaed0f50b3f9d85d8bc79288b474094ae92dbec3b7870
-d16c92d667fb2074d176928ec7bcf3939f665b774762ea69b989ee8c8334f20e
-3451189600c26df2e3a2453057dcf2562cd28a8d04b101ef004990d09afbf7bb
-f0bc3b20218d3270e0a3e3446ed7ddfbac2c37c5bf8eddc74c008b170d912bf6
-b1da8b9377005a6b6fcfbff04d0250a74b93a1437ca0a7cf497637106c239017
-160bc50eeefc55e12d6c3d65261c238e00b0bdd7a7c0cab8d1e3902ac8d22a11
-a7ed80dc0dd04ac63ccb08399b92abe56b4cb2b29b2bf5bcc4e7ed008bb99881
-c74036842e45e41debec5cd4c652d37ddfea9049fa439747e6b700f7baba635a
-ed47282e91ce7eb743571d533b7eb9d09f0c70081dfe408e503f14a0e117196e
-c1e7960f5bd60a1f5f076e31c6ca28c9ce51061d4bdcf5e35beb3622e3424529
-ddead48eebdafef6d30c02dbdd5f1b5c00bb52266a8ac0819fd60371053ba1bb
-80a8954a4eb7464618ff70369083068f1b60f059ba217291b6585d12f9046aa5
-e66dd926f9d802e694ce1dcd909ecfc14b5f3f44c4f73a0efd3e1422a747a308
-06ead9d72deb9fcc1a33617fd94ce9cf6e31b027b86937d0dc58b350a3230d24
-2596131192677c84137f034d015613e65e04fce2fad699826a666ec8e1f758c0
-f6fea6d199c6b3fdb6b81ebf80fba48ee1192e0731eb1b6f439f654fe7f419f7
-618e1e00dbcc0dfbbd1897678a9e4a6078273233229035c98b0e1fb4f4ba5102
-91d44e807c37ba07dbfac535c9714fde3de3114776dc82e28f7906c342ed5688
-44c2f06a45de22c2704f3b8c6293626fb9a018026a9bf7f688dd2c25a6f35845
-fc3bf34ada6e71c93249a8575cb6753fa9d7d8a2b10f4b0979aa234326185387
-63a8a532543e427ac650c67aec94fd5f67a697d93baeb2c8d1fcd83f04de01be
-37e4b8d966f5d91818b80bba52c34e80897521bbf46172c89247c257c77be91a
-39c8e4b4eeb5d54215def158219b0111b7f9a6c3c5b32945a5da895ce74fecd1
-c89c2a3933fdc1183edfc2042594fb11d3f2ffdae852be0443f5c37765b3aa75
-2e94fb1a0ae436a38a5178023601e903851f015d1a74d1d132366af6ab2e78ff
-5493e19ad35553ca6fe7dc51b6f5dd62f22058c35f2b0ec5755aea9722491f8e
-6a7f5d3e855f56533fb9e5775fce5aeb0ed6af76c3e7b24eabc352548bfa2550
-c66dc44b2795ac40d1223b416c798cf1c3aa90a8b404bc4926b3bbdfc2c8a995
-823857a98bc528813437a0b892530fdcd05f1fd496340f528b8bd245a7cbb8e4
-a77482da0f6c2a00e492d878a13efdc2f280015a6864657ae3226ca00477cb3d
-c5ba741aa7e4bd3a876c6d7100564be6f6a2de0613ead5f9926c2e4cf5acf5d6
-5035e2a79e286ad6fb4289ec577bec28f51a8bff37423f9f0751a79b91bee5ef
-1e18ece169ed2723c9d2103b675e335641cfe424360ce2503ef49dd8d158b8fa
-7c3d6bb8d1d0bdc607a08630a67be00625786626f6ffe698c3dd414215b56ef6
-756720a12c1c32fc363db28ae0e206181ea32fe554972e6bae5fa7bf89ea3c5f
-85f8b274b9fde63c7251e43102fcf4aa7180ec3829c55040bbe511c619de5ca6
-95765172d5c832691f6c432be0397bc401e2e54ea1b847bd63c85c5c9f62cc5b
-e1ddb4ed907938472ce6a6a3cab60495ad8d5967150732915fbb5ba40a8130f0
-5df637309f37d4249298cd57619452601dcbdb1ac7f022f6a024d7ef53c0eab2
-b00ec3212764ae73ab88d18806c1252d0ab508951bdfa2afb67b9d5a1460c11f
-c24eb5ffe80440260d212923432ad3f3f9b67b58462a66e7313e5c886a046e34
-80a23e08048ff3c918f26194066e29c36841b547aa3e374c1bdea8c9802509e0
-e787ef0aa8a9955e1824d0ff95e294dddcb644a292e91e8f00109994cdf9681d
-c84725604b266b8ad4b196791f2752662189ec0e9fd076ecd5233b3a436f39a0
-388be1ffb33d075e55a4683b9cbe917b06c1d18de8f08bc06df4a8946869355b
-dff8bc9a240ed22bde34f932d90ad2994c7b001b55957b9dc7a7931d1a87e215
-367e5b424cb74545623d8aa9539b66803581c1746e463079f3b52fdad364eb68
-58d70b9835b140cd6db9ec95e50a64e4b88e88d2a79fc3cf7ffd469801bfac17
-1373ebfb52e32486416c387c27f0a455ae5023cf1259e691cf5b5b339a2ceba0
-9a2c556ad65734baef23d18acb009564a661f59e1e93fc163dbd1c0f2fe231a5
-8aa558be68f033d219b0736b42a0611fb15916f3058b3acb9f9fd35d81d6e1ac
-665a358233c0aa23367ec3adbc777539cbd7bee88e68849bc91037670e8d9df2
-5402768f04b5fcf34fa8f2153c37ba7ef356b669b5cf4615b745d8b9968b6009
-bfa5ada490637faaa554106d24d4e755e4f9f3a9f52a1b15a61c35b8ecb983b8
-083af04f9fd3511fd8d36f2d822dbdf884c61627d81020a0acc19f5e36099daa
-53b0d6d98d0394569fcc93833b89f87e115f5cc26317196ed78210afa8a5f0b4
-9abdf7ffd38a892bffcbf30064176ff3c7fb3030da4afeb5af90610abc321319
-020412a91fb03811741e1b0ba8a8c93e59161eb5b41f82bf41a5c21694c8373f
-58e3d1dfba33a6c5665d8b73ed95c9566d67df8456b2f61c559b2e8d60c6e2d2
-f1c85d4eb1ee33dc4718a4f37e6a5b965ad32f8d16cad21d98ad189721a79aa5
-454249076a91c684fdda1a1eeff70dd07274b8c402b6a37012b89c0c6870537d
-056fcea0c6fd79efd834fb29f8ca28c25c57de5123c540750972b2bb08311835
-c11e6a5bfa0c31b18ca3f44899a8e160d97715676ae211ae8ca83cecbc6bd654
-e1422aee98c12ed1fbfc834edb3229c7a693ae4e6c759bbf3cb496672469d856
-cf7da97eab3042ebc9bd3b645c1d314d3e7b38087a2b0e7f5aad5e880a4adb50
-e2819b638eb42a2cc2c3b84a27eee2959e51811af80b3abb38900e48a8bda718
-078a5402c724cb4080bad3657b1bab969e2f0a2a088fec1ad16c2f7100370b95
-62753c659fe32401787f51e1649274294d3886e7fdeed53adfc66efa195a546b
-05bf288823b178a968a20f8af64667d75e3e8b1c492b571aef01e55623e33e9a
-f88bef36a34d620fcc742244482747708491a1c56611abd75cd8964155f602bc
-60b24f38121bf53748455bd660f17ad52eef19ef0d16eadaba48d5b4e0cb0422
-7229961f8c1d14cf17a7e88abcaefc3eb54fb656c105b2babbd90dd6ff7d44bf
-9d29c6ccb09b5c8ef13515e6184d15939fc90aeb78b4e064e21e2d376dae6dd7
-3f4fb1442ba15e9161c62cc93acafcd55aa333ca496803927d4e40371cd7b5ea
-665113de3b56993e991c966b7777e80c8e0b82dac778254d6d9b3b4c661db3d9
-f2cf96fbdc16a936912a0781cd61af375f314fd8933642fa12b970a75cb813b2
-7a2e900a742de7d1d762f780fa3d29637c1b7dbd66b7d4f7aea7a3f51a6510bd
-8dcf5c4dc4b5ef5139a7f3f0f654588a4848e9d642676ea145d5df301ee491bd
-4784e01170c4a5a4a0787f83db24931b5d9b761b1ef47302944b8e689d56316f
-80cdfe37424c484c83c02ae707803169d1547cbebac170ef5779911878988333
-1577c0f514131c9f94914d942d0b4cc6d72a9d06c250e0454810862a0973ba63
-8ab9d4b424ed51d5abe3e39f0befae042437bf1acdd364d20d76e3737956a0c7
-e666ba52a889a52385496273bdce52e307440c4db4a70e7a6da7c655469d060d
-4353f090bd41f70dbe4b30f33c00d8964f64029c41ccae18243551afdee211b8
-9744d966c63913a6714ee2b4d1b82fd0aa1e6d2b296da04b3377f9b621f2fa39
-0b23bfa275b1342f62e6dfc4e3ba85dac525ace7cc2c170157b32dd13ef9ab65
-63c62e6c44c45affa457d12f0a8fc23e1e0cabb5927e7584fc714d310d3a5c30
-71d204f98979405a0edb83f468d58f0cd82ce3d84857f928124b5d4d592c2dc9
-196a7b32a7b8ca9f3877a9d6463f1a4eebd736d02e543d2ca7675702e06a5c54
-08f5fa709feda49a9b7e202610ac9dda957eb65d5615d91c2fd66c35b88ebd5b
-ed398fade31d7ab65cff138e211f9014ac86a994e58d20183908ffdb55f64da0
-39d1a1f86f28d18f9ecbdbe7f6abebb2ac41ac88e385c64eda6fb9f73c47c6fd
-b29f0b4dd0595e5c7f76da3ec7b81da2a516031bb54ac9678eaf2c16999e5181
-1af80b3abb07354a786e339e812ab142a59004733178d3922de9a23ade1bb2d9
-23234fd2a2836d3c99f582778cb069c46ee8c14999748c93f7b5d0b607abd3ba
-cc79739ba4bc945b8cc535ec56511c8b184569c7428ec82f5ee9766acd217037
-2b72cf351729da098cb6323a724db4561045f239731661d2ec26fd014f57bd27
-07948c03ede03875bff01c4972530cbb129359826e1081c9f2fccc0d9e6098c4
-4dd980b1988c77bb4e04962c501fd7f8c5d8cbf00e97b2020d75d1d73e4d19a4
-929f282565a130474ca0777cacbcf429f995873f54031469e3095e39976a6877
-92e3db78cde4e930213f64d8ada47874900a2fb611e18c45dbb8e219d44620e3
-151fd42a61da68301334c7c8883c800e7a851ef4072aae38076c4f11418443af
-7e22c10fb99f32b8ef835156173e00f37a1457bec7c74fdf0af7f75fb1cd15ab
-a72c0eea8ff66233b2bccb79ca66860a3154a16bd31283d0ebdac5fd5f54df28
-190388468f1a102a99b733781b7674dbcd9faa280416923e7331b6f407d8ae09
-5a380d8ca81de6dc066ebbbd1341553fdebfae0e60aaa229d6a80a419991e8ac
-7585cd947f6e026f6d1abdc3ebf4280d3292948b1ad434f26b98a05fd19646d6
-88894412749bfd5c15d963696fb5b8490eb5d0eb4a72d15be972d115db0be268
-724bbc432e470a467971c3f18feddca78ec38e60c79fe265959e82fd986918c7
-ef5b7a72361ab3249272ffb6e55b5608dd6c0a4fb1b72b50430f230b2383d8ff
-bef2b686cec585676616033e1a0c66287d6803376e5d8e689980c3a5bd5a7bc1
-ce993e47ffdeea6f94d8c562d4804034a3b9a910c4d567ba82af21e4fd778bde
-ca490b1c5e4982fdebbe4ca4592da9e70d5fa99fc17ee11963b866f7f62efebf
-e30cd690813542f4fd8a14b43ca849c323c8d67569d279406b31bc066e8a99b6
-284586fd6e7f5368bfca05466560952fabe47658cf67b93207b004a9e7995a8e
-49c81472e2bbf23fdc86466a6151e797bf086f32282a9e55749f94f8977fac75
-e2aa9e4af7784c533f50c8f1eabb82f5c325f8b89604d635c05878ffd17e45c6
-5f71425cbd6df1354f76a48ccd20d009e6d7a866bfb654fa0b1f4c1003f96419
-b49b5fd675698911d745106d7bc1d14db6d182fc82602ce2ed91deed5a07e683
-36c1768e8e0a87e1e112fa37aca99b4d37768120930c71cbacf45b58f70f767b
-3db154fd31061251ab484ce619129b2d5c13a76bd15cc92d68aff8773c65e212
-399c6d54cc6a5fc0b48ebb33b23b916421dfdf26d4e8afb814619dbb9dc67a07
-951192e58ffdbecc7bf82bfa10d37cff66f5b211da9b7424fdf504139e6e733a
-b1179cb9b56cf570f63aba413cb12872ae76eeed4ae160f83c977282f7c9a692
-cafaa72a6d89a9adfbc498625cdcd53fe9fe591ee00a625b157321839eb85784
-775665453d8187cfe0aea8a671194ae185ca9db23537356c9061d934de5249f0
-2ac01055fb32f110ffba4560ba8bc94cbf657ba57ac8f524a2d01a8323326777
-b6ff3413220187834e45da6076051cd695b1d51ede7348cdf8e51b675ca293df
-dd1101fc53db5d7f8de55ece38a55e5528cfb4e8266df99d41ae7db821903111
-bedd329b1237bf7468ffcb8f8ced0d4416b36f7b2bc0231aaa331bf2474f11f1
-3657a008f9279855854ebe123ef3918acf58530ff76553394ef3e72741e9fef6
-ef6aad2e58d4ec10614f041698e78bbef2456260e6842dab488d96d609f4c77a
-02e18dd13549d77925abe02fa098e923baaa3c0565028522fd8e7c0cd85e15ab
-18f37d4ef871b91a11b2b5de8f5faa21bd9d1d312d923964c2f608708aeb6301
-e31d028eeb41c46369ea39e99d0ace2a3739e5f8db16e86615c56eec5ca95f6f
-4195b39efe02a7ea9a6e7941baf8332f224bb9ab9ecb4b0dcbfba8e084ec7279
-24a004938789150a479da66cac3b054d108019b4745b3ad8b87aba19b39d00a6
-104e04eee9b26af64e338bf34d109b12b79fe268ea224a827311479b3a3b527e
-40e7e864ae56cec78bc5a487590e0178a8b6fc25654c60404661e09c1f82003e
-eaff3a58c0c3730cb34415c85a5a1f18d71b96cbcefe4685609aad50c106edf0
-9cc002ebd9fedff5e401affb0047bad90130e144fbe267234390b70f21d8dd18
-c43340c360bbbac5e15a745ec971d3fc7a07d78d9414e37ab6a1f547d7630c8b
-a657883d45e788c499157b37410934f73002f10e6183b696b1034248e449ba93
-9178ce2ae5249d4a4db91adf295fbf3bd72d201e90750a60d9224da50e2644dd
-6904b958fee6400b27cef19671c51bdea071c494acfcd1cf8d85bafbe9b2c3a3
-f39d120303ecd5636e6ea61ebc8af0037be2789d8d885953687df1c7207589fc
-62441bcb3e7b5fb34092d8f062aaaec579a29d0ee2eec0530eacab19356a0587
-d143aa46fd5f7748859fb088646edc3778ac9f8cde1da8684d62feede0ed12ba
-3e4efd2f1f3702edbba6f881e40b91ffe0a10ffe7f52f14bf975509bb43b2516
-e05ec913fbd145e7a6efe70d770fcc43700e9585432f78e3cf0c98a8c68d738a
-dec7a4b809014ed76cfb8fd1b12eb02ee8617f94d0f3a3bd273f0675c2371410
-42201b05d1d131af293d460105f728afba25e65d4f8aa3d1959fb4e6166b6ad8
-fc2d6d41f5b1d11143a7fead000e9f46c3a6c2610f013f39205e4dfaacbe7bc9
-dc534ca456f44f95ec4e573ddc053cc124499e20ef2ea5c4989a9fc053b48a87
-aa4618e403cebc2c398af7ecd2d4aadf65363842e27bc5d20f24ea8ed8bfb829
-506d5a1d0739cc7e5716d0581618a1125b87da79e086d52d030603da88493d4c
-14d99bfe5a30e955c233d3aa98f4b447aab941f069dff47374825d012b053733
-922c16fcda14aba584899d2766f4b0dfb3b2bc505149aebbe63a9ff68df22cab
-1beb9476ec1b69d1f036f3abf79799e6fab6a7fb7fe7f61878642b5a8fcd62d9
-1218e6e52585dfc3321798d4d27b147be6dcffc1bab7c372570c5608e0236f26
-2d9e81d2c11c06e453f40f8453e3a4df34fc0dc124108a9cf176d41f7e2675aa
-030d9c9a0c3eee010e2e6b53416b07a07addc43e22aac8a78c89f687fcf10924
-2b8e323b666063e23de1fb405d213567807edc2edf7955f4ce43938afd21eba7
-0239d81517b14c34a320e62ce46f48b10e3b8f0d443cda27717a5a416dcf968e
-93ccea00568c42b31dcc857ed537d1c32d4583ccacc21efbc9efd7cfcd22a88d
-4594dc9c9cce5c6dbb68a6b6a86568712a79321a3ef48335fdfc2a3937447b89
-d43a2fb9e0ec41085c249c571af59b4822519aa496da159326458b5168d9312c
-13ff0b9879a8c96dea99cdd10966071b12f2a3f75ae6b150bbd0e032f7a2393c
-6afbc4ffc9acc38afe90606c4f9afb95b5c2aa160539126dbdb2ae9d61e5c4e0
-ce260ba60a5c289eca44c0898637888e1bbaff38a4ce83a342fb92c64ce086a8
-5e6b0048c4282631bf1d6a42dbebc647f77e63429b18cdc8e89b2d0ba8040ba2
-7fc47879bc4eec51e5ea8f4b5628929a0859483cfb2089660cc15ec5d9dc577d
-6d69a076ed24e02e80b83f1444a1aaade36129cdd98f91697f0b28d53a56418e
-ca65cd49ca8c49863a8f066ddc4ad208dedaf2e54da80f294cb0211a90340771
-aedef1185653f5a2f7925894404a9c12a50b6e8615c2e5f48de9f9270d79c70f
-61599223c0a8e822d8c60c56fa46100f85e5ab43fd7dc58b8330563495317ef5
-8219cecbea2f11d8f24ce226b52fe0ac472069eba02e29655c20c272eadcc1c8
-18ca5a0e46eae3a5fe1f050fecaa2485899f8a53f4234baec7c38343552c1577
-10c72838c76b82bc6a323f1d8dc68ac54f8d468da99c828ded907e6f7c1e38cc
-bfe55c46ed3c2676335891a0e3f0f3e660435607a996030008f28fdc34ec67da
-c93e7062c6b46c6149ebdab9d8378aa7443fad6fa5fa52d76834aa04de524148
-e5db4023e4de3ca44d245b94d6d96b503c14abb03d7c2207f28439cb338120a4
-da8d30c55cc8976c25dc4affa410e8aa3749a6a08b7d37da55d8fe73f95d0b0d
-3c6b302a09738b28b703c31c3912646b2b64bb6124ed529748dcd032b4832174
-38c51c3dd591f4651a22f9fb00c91124c84d8717c4313437c014da2e72b62f56
-22ead7a96d0daefe66dddf7cd9d4f77eb17845958bd97249a5896cfdd57c4d8f
-24e3ce5dda5629409f881ab5e8498bbd473e61dd7160a5eb6e6b5f47c2e3de09
-3bc622e2d1aa235d4eb341ad4277c1d6261c77bdd27d14e8d0f5a226957906b5
-f6e86f1a72fef7d88a90bd711cec812ef92f08cef71eed903d8924f5493aabdd
-94cce69e2d4b04f111c63557f460cff4702b46f2e49195eb4f749dd4fc67070c
-e2770be237fc41a300600e8e4363dd2d57da17ebf287fff4b3247673b662c7e1
-eb74033ddbaef52f8a00c406e7b01875a54e2e41b9149cdcf919356aacb0d2b5
-88cbf5fd0088a65b789e51d2a0ac37f1c833d62f022eb47d0580e04932cf332b
-b7c6220ef8791981944439bbdd9934007dd5fdac813cefffd522164d16727705
-7078e41788ae6450dde5753f39edc4bc21861024aef6145aafc70d0d3c7c509d
-5662ea004699eba1876f6fcfaf1757ee7f580ad9c071ccd3d02bd445a8d2155e
-8a1bf1b8663af3102b1fe47a14bf454b789ac0c5dfa3afd8a47c55a7f1590c2c
-2f520cc3046555f35bf8a847041d54ef6babd4c91fc786336ead55c3e83bd9b2
-fb4b4a0e84184f0bd7130800760ea587157e08d5a2390f84359dae2b7ff1561d
-94d8dbcb34c98db6b45d0a593e2b0cd398e1a96dfa93a7ae8e7774ad57cf2ca8
-1028349f8a5feb9652f811221368bdb34eaae8d5e2e7e16cdb6f64ce04c37ba2
-4589e43481d723051f163789334a5bc087f2796b96d58cef21d82d0372a919b7
-93d782bee7cd8e91e26166f2041e371464ed4cb6a73e08048ff3a596f4689f6a
-7b09546d8984ff5931a5ad2c772eb59ba1386af0281de907561423ebbf7fae48
-225a4261359bb445959a50a34d4f6550a582d152a83066f90cd6d99029513b9b
-ef7f182b22afc41fdc2824bbee4fe2c53afa59ed68c9c2873aceb7e4354dc0a4
-75c03dc0bfa5697b7327661cd4f1e61471c439365707afa1b73377bca188774d
-a8135ce7279ee809f94a5de196b97dd70e89a152c11c57b88ef540ea1c083bfb
-3c99faa22248c786e216dbfe8fc6d60b3f7a5e291ff0870c61485a051264e213
-58fc910521db6766bc77721fa8ee503e40efc848be05822ec37f4aef6486cebd
-e693d839b7bb902efa75ada15cff2040d1ef45feb81f6f69010ecdcac215f5e5
-f11186cf3dbf369c11275a1874d4d8cda1e17565bf6b7a4f22e5f7452071b3d4
-14a1f17bb32ad088a7751101606c6881e9d2c1d72d88e05410df086d62936262
-5bdb1fc4d48bae24abe9a8c49238a194b009bd7049914897ef28879f14366e1a
-9ddf1f3bf2d55eaee7676cdd6fb111eeed0b67dec4ab583f53030cdfaa800a71
-cdcfc5fd361dbca0ae02c754ce8de1a2dd4d19d8d91f338b4f4dade9a5f10f6e
-6a0201c2a7a11ffa5bf843881b5fed41f778111cfbaf373806c1fe279a686b32
-a8ea253b2dd83d6af13c5111e1bf990300fb337672df16d47f9b988471775229
-337151a88011d68faa093c4439185ac1d4ab96c945a363cc9b599f1ea0b9a4c6
-6a53a7e5c49cd875f0565a693a5b99b4d70046545549e32e32173d1a33660de7
-a9104dc3cbaac08b6cd22095e7492aeb5ac369cdf9a5fca87d343af87d625d46
-b465d0fde1a5e425f6e6509808a775bf65510d64ba9f1fd4cf83dc244f637c05
-e108512d9ddc088f6fd41a4f4185e664cd906fb33fa0ccc4c3c0ce1d546fde4c
-c06919304f2fdb24500aa01a61ba0c365f6ca1b57bec0795850c6bbd3eb63218
-9fd7c118689b7a17793ed9d2165a51d563a96bdd2ac062d0c25e055e13965af5
-c140014d039ee059075a208035a5e9acdaeabc61b08ea51802be6cb592cf1e8b
-c276d2ce5f4ac5d914e8f8dbae3799372d0bb33ed94f8077bae807ef69a07758
-d442ffe74d01f6f960b8938140e83f1adffdf4f0f0393e73ed41bb2bf11bab8c
-aeabd4f54fca2aa26bd5bc52dd3e4d5c598e3af226deb96c3efc96c479e0db19
-6bf1debfcc4bd8bf05cb0e3dc04be5b445881266b74eac4595198addeb53dc46
-16781a275a481f4768f607346db394fd23eefc63e946a4357e8da64ff14813af
-0a06b51e6f9180a48cfe90f3c9b9eaf82823213d605e56359ccd898414fb088f
-6a7c483928d5ecb72fd544a8cb46e832b97653efa1629c4890b90e02b9e54ab1
-ae990473adc54d7b687a9c559734574248005dc2f125d7ebe7040eb23f4927b4
-d376768793b666f7acf187b985fa099b8890cb17e211b67ebd09742f06b224ed
-96a0c969d8bddf909afb02bb05cc66ac0a5bbc9b80cf09fd19611da7af1ca69b
-87179d1def40bbce64ae68a52e41978fff34f91a2b4369f0edfcbb7749b042b0
-d9ac767cd80d57438fe5108b4536b72e6e5e504a6e5b4cf70ffadb19d502bcdb
-e7e3e566d1269d0a9631776c4f5c52ec3c98d63f41fa32ef489b5b697e2e4998
-3da756a7791a3a036c258f59bb22ac004c821ade383830f0277cf580fb1e8972
-7c75a27af24910a338df6a4fb373c6622fbf818cd71a5e891d19aa95a0255968
-619f356d84f6b430bfda80012396a2ab3bf91ace171a6b3f6295fcb701f3573c
-684f445ee96b38ca3b53db61954b4de9250c487181f548bf9b2a20d62bf61c23
-02769834fc84af37612595d6e57be1c80c38e5b757b99c3c073a490356ce8099
-ed09b5fdb9c9e1d9f9219033d200c9e5b31846f4c14ccaa679b3d7fe2fa688b3
-7229c69c984c5982933f0ef41765b1c1656e4fc98a2086ff68b910391aae365c
-1d88447411145f885044a11f3e11110296d9a81793ad31310c1041fc79c337f0
-9d2f073d28ce537934b841c41bf677b24ba9826b6db142f36886f45162ec3679
-fd46d7a7c219182cc2e2760d8d2de2c975ba4d29ef94b65ecdb2bf1a75a8459d
-5facd5dae80fef1ffa72b0824165f25e7a47b100e1aaa34192d3f017fe5f11a0
-a9bedea570c9ccf6f8d18f5ab47ec271e5dfe1d4280d24f76b471e2d1dda8313
-4e0d760ff6f5673ae87466ec2e66e7ee5aed7bbdc5ebe9c723ef0e0bb20159c0
-d41ab0a2f609a0066f627fdb132fabdc28d067a4fa8f313421d5096071b17e33
-3311d9e905a42d49d9c6c2e3a09e7afe91fecf4e1ad5e6acc6ad0c91a79d3046
-c9ce741f9b2796f2d021f8494804eccd7e256fab1a8623a014060f0b19b7154d
-2aa1e772c9ca5c68b6247987d190cb0043a9d2ca7572bcb43a69503570b2a374
-3930210d268fa1b528ba3a2260e6363df7012857c411dd5e6dadf4286ce805a3
-f03295e3c3db0f81c6e4db5faaac574ee227f7b3c98f4b738c45c9bb39eaa1bd
-17812d2cb45fcc54ac785af72420ba310e3267d97bef54c29315eff146b2867c
-d300d8f6c0b943e2f206a3d14c9d8a9ab4358cfbcc9cdcfdbb9b2bde4aa8155b
-69c929f12179006235dd1af1a906d9769978fd90e21b9e3d2369f21f4b9e78ec
-41a67909a2de30cb2bd2c10d2b9a6020acad882d6ff778c4a6223899f1832b52
-a23ed654236c8e09543e2c6afbf03f4c1a150c0ec1563db17931b1304a8248f7
-76fa88792ec90a34d39f885c95af9ea39ee8e93f84a9e66785431a7a99a52bef
-d1cfe2b871cbd391e6b3cee6461e42d6837aa46d632dc3c302f07bbf934244f9
-77ce851023a129fed5b480b3bf8321488939288de6d054a55ed01a97a9f6364f
-7fec9ef87b9b49b1edbc3fc5e192c6d9aad582d2fb1ef161bc2ca9c421ad5bbe
-33bd0828d5228cc9b4caa49632781511789186c3212437e72e4914d5fb17698c
-74978dcb5f89b066b8804efad90b3bb8b7246d4943c71d54122c2a36d9f71f87
-c3c898cf272e017ee9e2cfa8a0c224da23a460a96133b13f7821119627b325b9
-bd2fa8f30977d85c690723bcfce51694bfe89439f2c39222bca6dd0c9215cd1d
-6b9bdf9f912c470d204d2b7b5717e018e03417181fb10685d9eebe592ce5dd6b
-626094a06dec5a89b7795d789519ae31f43763828d6075eb023983ff6fce4e21
-25d516de3b380f04c1f498b846d945a32664b61bab4c28e68ba4037a8e462be6
-8e5622372c5f8d56c2b6c0cac890918ba6995e1b03a4340c9ced6ebc875be611
-1f445f705f78cb117f3396f707d2736be5d32c58d98ba4d4f72a2bf05bd45271
-5f1da83969880e4b580539a3c06d4415e89ab8f17729bec04b961929834c9c2f
-05967038a7100bb5812f618a084a8d137d8fba8c414a5a0fca217e8f4fc0e3f7
-0da232421dbe0a2fb47a0d078ee4b3b484356ad7889a942fe6b29b4dda5734c9
-70f668a614cba321a71810550a84678e71f43f845cc47b0f4b82418fdbe34234
-0a28f53cae7f2ac0bffc4a9b4a4448cbc7403594b9c1570d475837bcd6277aa7
-8983daeb3f31442d4a0cec8a41b362402b7ec3afe2cc8c4372db07cab32b44a6
-3a00389f097006b1b1f7187b745a628f60f64124e845e16a8114b1d6402d3898
-158ed0573ca935bfd23bad60da9c6fbc0b10117dd56304cb58f81de3fa0feace
-1957bacedced8e8f626752cd755f067bcabfd234d4f551c684524a711a691fa5
-3be61de5319436e86688ef0f0b23fb1a8ade3a78a1348acdb47ca5c327305555
-156c24acc760602f133116649bcc5a413bf919a083c2dba88306dafa66f73382
-50ab5e70ffd8e298883c620d3a37a1dd532c193f7976051e8e2da980d5603ef4
-8bc2518775ff39b5390cb7994be69973e3fceea2a99046cca5d72a5a2e9fce56
-d1f5f31f9d05f4e95de8349a6645e936ce02825f55785d110c3843399c726129
-d7ef56bc39b65f4fe6bdadab905206bd305f034e6e64489b7d97da2d9831c988
-8a94cfa8ad0c0130154033bf82287160ad0340938a78cfa27aa291bf4c0a4b09
-1db4f3322e3f76e556fb16afafb55d9f90c0749636e71511102d3d2cc091e8a9
-bb0ab55707cd2fedca6151d279ca75d90940b3f8ccbff65982143af38d17090f
-02f8d5b6b25e1c49ba918cb6f3f2b9befeb404f150e593162ab14e277ee0ccc8
-3fde67c7778195b795519556db688e4f76a9045e029886f60db89fecca97fc9c
-23fa3c0ca5fefb0de6a923c715e90b8360b85a51dde11776fbc01323b578ef6d
-86b76123e3c41a2e9e8470034c64783072e549ce2949d5c2bf6b0d42836a60ab
-2b51621b608b2e22c16e6fd23a3288c8f721430b22043cf3b48a1c8a74e84aa3
-7a06514ad9f9a697328571e506d49ed1a7e1cdad6e1e9f3f41a99f84ed060d85
-41f56e88cbca3267e0d496857c103fca42fa3d4118396d494c82250c0273e939
-94a09f812dafa45efaaaa6194a234ee39eee66882798bfc41d24cc303f58a445
-5733943c10c0c10f6776b663d0f59286e2a127a906e8d7b2d55654b15bf58016
-0af11f67c20968d2b13139456385cf84430a425dfc6a48066a59f6a91ef3cf15
-b3c8e068b91892ac2218add4ddd8d201579d6ccf3664294bee67d3bbd0b2804c
-5165e37d567a70de26860b8c13e90d280b0a79776ee6fe064343b1350094cf41
-a5dd65ae40fa25a4a579bd9fb74f47114cce0c04e6c7f6b044fba8509f456b57
-81142522088226d82a95cc38a8823092bd3d113a61f6439fd78f70d781b0193c
-773a4c5810cd352d2febf25ec138f5af2e5ac51b4adb09fdbe4ea683922032ce
-1b202d30876a59a3c0009139b87b6cf0c37ca07e0d585435986fe85a9bdf2743
-da27b85d5d1a37de840d7fc2e5d92609d65bab8192f88b758a6c631df196980c
-2fdd706a2d8c28011699e7498aa1c14e47a7a2cbd54312a6c5943ac0a9a3f163
-47eb0d6a10f5ad603c080d9faf3571cd2335fe4d1c92c7315adc25f639a4f0ea
-609e73035bc24bb5d44371f19a7fe7c497be059904606007ad153b59c64bcdba
-e3a613c2787010cdc081df84ad9a44495d78f6440c9a7bc7395d04d776169c7f
-1ef0b7621e2b440a8c533ee3660d35acc3b482d20b3515457173bbe7faa9751d
-f1ab67fe48753834da25917b746ee6d2e30ec6062221241283d8c34787455db4
-541a04752313bf45c844a9ad0a29ae66356f4bef8fdec5741c19c0d2d7bdc699
-ccda2af082f28202f443a789e9b40bd6491e777a49a4be285d5f985583c502b1
-b2d9568e493bcc1498a90589e5981323234426e5769180d74a5bbe4358492875
-337845eea1381ac1be58745711667874a65ef86e367bf298a27b60319179294b
-d2138bab5125b6171150ea426a6158164fd3390cb51f1fbdc930a2c1ff6dc802
-cfbfe3c6b6e34f8138a0880a098992b2824ffeb149d5b136543b326d30520063
-42f2a60e79e576769de0e65da6f65c88ce9fe8d7869b1687d0912c518d1da5e0
-5d4aae80fe32d8f25aeaaf53865e022590056983221fb8966bcf4ecabcc6df19
-8f03ef373007e80e224e1a45e03b957d39fdcbdefe916b32f9afc8a48c91b647
-6ef437aa7768588068977c97892eb1d4b5d1c9c9d49b6ed7e0573345ef971304
-119f725e0f88fc8794b0c9cc35c925e4db50726d82d4788bbf8bca83ec533f2e
-7c19d7b153bf2d4cef8d5c7f46ed2f1b1a6ebc7f547a7ca5289a1fb0c7ea14a7
-34dfffd1543702cbb4b2b67e8cca16e54f971d115aae21019cae5e9b24defff9
-a7d4b50a44aa37015d68f3064f9c3185ec444cfa3af32aaaac7f4e6b2f71f7df
-02ba34a4d51e2886a2517ce0b21ee84b1f877852b3d5932840c14d523576777a
-114d80f83c8b730eb41447bf168c3a2d259851f545fdc15c5812c58c79c8cdd3
-f8e9eca6e2a41b53557beda8f889df48884d521add83e65e7ce4025c5187419f
-cce51c7ee43dd66baf2409b4bcae3a94ad2d99227be325ab135c9b38a8a0bca6
-3bbd58e7f7b0d438e8b01e441786d8a5faa23f6b957dee7c01e2172b09c7fcdb
-cebeb62ede3a36b13a3932a81f512c6ca6f69413a83ee30efb5513d2b5a6d15a
-ed4eb95338d01879109e113515553402c994f32ec590e11f4c0845a6729bbb71
-de7d4893839da80f1d1200a2ea5ded805b3f8b8e4209fc74a16733993e910e8c
-08c3aafa543c04d9ca3947cdba12a285466ae3cfeadb0cef83286da68a806e56
-62ec73ce7913223adf0c88deabfc3c5852ebec0b67c72a00650314724cf38bf1
-eb463820e829bce660104921f069bfadfe4e3454e9d6342abd2b8c5bef56f385
-f63c2e0d095687f04a2bde230fbc1beb95a19bc3ccb0e454967260b13313ac23
-048e48979aa0e379903fc3307a97aaa6933519318a68dde5bec8370956b11b07
-46a09198235e6a5d3a21ff337be92d5f291606cd3505ff41dfecef31c4d5804d
-3f361277028148653bfe090a8a9322d797c2f7c094b7e302a7cb7d0a6aef8533
-4db7dc06c846cef50a24d5a463f461c23b24b171f964f4733c1c249401e791f5
-088b0eae5cf16bfb79d5dac5532a7814aea77e35c072e6b69e50fb18445a6130
-2b19b60969afdec3edbb0b66b914c3973d1836faf2ea01c65d75401a57bef394
-8de682b7edd50be4b7a946ade2f5221d6cfc4b00e94ac2b390067f2dc92161c1
-d73f7e580de3063d112fa8f27cd5d6d37ade4149ec5f8b8c3c9d88d13c235a7e
-bd04cf1a2fafe65da20b949322b50dc78a485119775de3e5ee70ef714d598c27
-0b82d4e73697111d0fecc9552d8f5caa3439b7a52f5f445b27bba45c3606ac01
-0666c4bc2a39af44107750ac6bf3a8005dfa3248413d98b000bf5e55c3188ade
-5287349a01041067cce0f841d6c2f828248fb96e6ffd770789c72369cf05a9dc
-831e7b1b2c01bad69d465e83af7b3c291cc74fc5ca2e69c2060eac386abac347
-5d56028547656815f50f46a251020ff63ca64dc1fbeda490493a55b285d1407f
-3cd803fb15906baf8bff8aef2eec3a738fa9c011ceb51805ec77ca1a4e8434f0
-9fb36b45e8d95afa830e6ce6ab350a4ca06c463444d4184b681df11e04e733d2
-9dffa1a3a68c502a29e05be5206c5d31c3f260f56b5f88901fb0aa8d7dfaa992
-4045686222cece6a868b664a533571b19fc3e1e69397f3d9d0a8bfa4b3df5a6d
-40a52946b8bed057167e3c3ad3ee2305d7af4a16696b00bf5463e8fb76892a34
-8618ec3d153b3878c8bd72c21ab2c90ec88993b855e19bb7ca23e454415e9977
-3def574125029a9cf24540c6f61ae73ca96739ba838f1938627499014708f2e4
-1a00d397e7c67c74436dfbab39869975b9ad748b90abdbaaef6744b796696c19
-5b8b2d0651b163bca5a1a5b6188a29024ca97449dfc87a99ffa00f05c68c3906
-b2588be6003f1f35d16d2e4f52185b87a0195f64cce629f9ae188c4f21936b48
-01a34c69b570b67b4ab176b30f23e28f40b25da9d5f8b30d147c19dfdb1c5f3d
-a8ab8fdd2c22d629fbea477afdb3c230f8488b6d24791f76a53ff2c21daf7ea9
-08ff9fccf55f0712fe16bf836032f104eb2c454cb4e2a3bc93493f40f9dc0c02
-c121cc50ec16ae11128b8f43202622a4eba117753eb656fec0e702fd1f680ce9
-1865b792896d48aef87f5bdfe71429e5963c74a77b24a036cade70ed655b4271
-2b5ba33ef9166444840df7a1e3b0f6c5675994239840ffa04dd8f4cc8b47d694
-e6d6d601d775c19bf504ee8ebacbee258841aee1dbdadb64cce7c026897a3ffd
-e77b3e0043af31eb442ef7ed53dfcc969b726eff1f8a43c13c13131c6532ae0d
-9e8703618ed8af07ca8468aefd047658ed08d6f647fa2809cbfd58519adfd791
-3f970d65a3f97f63152d9dbe9af502a2b6f012d2a81e32f8d8cffbd56e63a9b9
-e49a301b2c3699706088f94e7a3f11c7fbd215cfa8fcf44892fbe4f50062bf95
-38fbcacca34099f0370de74576d768f1f199c1457bda68473729f390543aeead
-c9be3985cb5cb4e01febbfba7021d69b9d038a326a76fbd1aa2becd26f7979e5
-bfac785b8dbcd84cdc90993b553b694449c98ae3aaa0d1fc59953dd57598fc9e
-2062cfe07d482e20f23e1b6b8f397b797656f38116853178b7b1fd8a78fb7071
-c433fbbd9ebe90897f52651aefeda189f61069f96d195ecc93692c417c9778f4
-0b23525ce5a0f6d29bdadd0abd029089b9c255201d7d829d12e138538dad4108
-1826ce5a43d78ec57f641000d191c9631106268f64ac7f4946fb8ca5599aa3a5
-017d03a837ed1c765bdfa4780f3375d95041526cb137250a0af36b9f9d055fb1
-98fa33d374baf553aa3bdccb1f4eff10f972228355144c7709a6cb45052ce6e2
-bc667623b47c220498a25caceb28dcabaee4ccfced7aa6c14b586a2e1c60a9d5
-4f4313885970d4f824c9807375d8a1b70c7b5fbc36eae7affc902c89e394a2c8
-39dc7e4d0c7faad918c768214e16a3e3b38e3a3bb382bce607968c8c970a7bd5
-91c6d5bf50341ea777a3d64538875fd65a714c881e73818c61a567d1ff2e4d78
-0b2851ec0a9abe877f26dc9b7269cea5585ee3997eb314a370724caca582830c
-f1e1cb6e517528360930a1b81735adcf20d43511249f520bbacc0d94f7449d60
-b62c90d220e1b2f9afc749b9178829b5140c5471074b074b42ec5c28e600e8c3
-b596461665b2fa699f33ab8eefbb7932d383814a402748183cc59289b27f19bc
-ac8b64cedee4bb5bdca401e1714cdfcc9c0329d35939a76229b77f629fea9551
-ce87384ab083011c4bfc8d5e3a1367b48ae5a964785b34827aa72c7b6bb4e8b0
-3c6990b6fa4060dd7bd1eca5e2b6efe3c8d9915940525d6d70ff2b2c8fe45128
-22d4cbd4490ea070ba7b8688aca9ad168394170b7169979d7c223fd1c67c02b8
-df0aca0cc03331885c384c8a573770e5ac87b01bbbb8ced847f7a4d68e5e655f
-ea4920b32bdb79d3d7099d942f07c18b7829b1ec7d68d187c550081a4831ea95
-c3333e213aea8f45dc8aa8a5b7d925e05979cd2b0da0560be2367b9d1fc368e1
-837cfd77bece8538b26b9306e054fd86cddb668e58e487a772f89138c00cf8a8
-62b913e9ef8be9fb90cec90bd6a74c4e96f55b3a73be8f223eec41958313dd0c
-b0094305eb85730ba87f6827d6a5238727030123fdf6566581105d0645454553
-0cdcb5069c9f1ced3cebb1f5944e44979f17bca52400c98932e6391d5cdfccfc
-da6df93f86b6da1832f83683fbd0ff6b47ad7f2734fa4243520ed9da9521e922
-9fd4d1961d36f1fe1f0fff958d4a12caadb6de73b54ffc64d72c089090af3fd6
-24a712e60c9d7c95c030827d1da39227d5e6537f01e149f084451c7b1799dfdd
-ec0fb4d8b3655240ee03ae14b08c1947da7a66465d5accc205e0d4c3a25ae300
-2a1f991a5efb7f592260e6576a26d168c568deb32919a5f47325044e7ea0959c
-bc65907b731957685aae01d3fef2d9f87b3ab44cbdf72f161ce92240734b3018
-ca6c963aa5b29402b5f12d539672c4ea7bc1c66ab6104625d97f41e65abbedc7
-5d3df3802f9c2101b4cd6fc7e559873b88e8dd54309c8f53dd2d6cedf292b366
-2fffd38681bdc5936dfec644cf6b7a7e415bfd7fb9de469266927e5b82ef3e7f
-011aa4d70ca53c6e71e460a7be3fa42d9307ffa701ebe91baa7875816e1901a8
-15e3ba35c3b4cb00a6c87b98eed8d8095740ec71d3c00f8b578daa88b3f33dcf
-5bb6635f1b2ea62eb9abe181dff47374824dfefcafeab400020191e74671a097
-91a6757c880d4dd5a7e3da51241876415d9f70c689c804b6e9ab5b2b87f332b7
-c0e2c3bf5b2246ef438ed81ff8f7808859632ee8fa4458eae295eeeb9cfc7b03
-0c0b906d4805f9d33a39a3dea89ff2eb56db4c254579c92ee37286385a5c67e2
-0a1399a73ad6921b46082428bd84de18cf92fc9f8058b7bb3c193a4a50b34403
-358600d3d3251a543a6bd9ad3c5db4138dc043876387bc1f55d919fb8c35cc11
-cd707aa89a7618ff67f427c74998a6e75a84f261a2030710ce94325020dd8814
-91384f4c83ea17fbb58f73630613552a6e9a905a98206c8adc56b67419f996d4
-1da159cf2d8695507ee04fb958ef554e30d482cd8f214478062d4fa026f86b13
-3dbeb81c957e43ae99142d2b9eee13712878f5ade9912228bea38b1d42a835f6
-45f056ab9b40681d736ba72a9b4b5ce2743e92931676d8556000d32d259e163f
-ac90b30944a2cf1c52a236b4d71a1b2c0c8d45fcbfe447c732b9efa9d3e103c0
-381211c00da6df127d5f57aae449b9699466cb369b996898306722d85f8c24de
-e5ec2018a7a4042b07178fd55632305cd5bcc0467dfbcd5ecdbfc9e494dd5a65
-8327ef45f0ee3d232622646f56d7764398dd5d01e92f5aa4fbb11d95cfa277d8
-1c0d5a15007cde0aebd5436103be6833beac9fca1eba100724eff0924dbf1569
-97f7c080f05ba7eb68e201f6bbea8541a94973855b800cdb7ef6079de238b758
-e465e27c2efa56dc98ed8e4c2861e2ec8df3f2e919678ba369890d15b8002fc3
-546a3ff1def38e2694941a702ae77e16fa2e55442de9248110a8739e58cf4b76
-664897bbbe30c2b6d172b2604da84c60746a7339c7971a83d516ea4302785c02
-e508a35efeec0b61a42caba94b28bec74f53e66a9a54bbef4ea1171472e34bd1
-dd2072f460b24283c8217d6bdf8ab34210c08cba89a7d761df442ca147effc4b
-4c041cac1774eca35d106b2026d71615b4279207039ecc03b0404dcaaa7d61e9
-d18ef74eb9bdc614225238ec4ba8ae417be9a6386ad0327dcefeb5a25412bf36
-e6ece299be240192d182508a51c1c1ec7ff65096f0f6219f25b8d07d67aaa3ef
-d4bb00475135483905e87aadb826a889cfe5fd3af57466b0cbcb91c397cfb9ac
-f17bf93c4bd1547c6b196cee7741726321a55aadd02e6677872f6685af9d0030
-f1c331a926b9c42ea8b6832bca8ac9c607a73b527da6c9a2fbd289d781dfb35d
-7c5a053f8f91248f1c3ffd96a1a5813ceade13599db1b3ce32f5bc57f0335693
-c8d4c405b6f9a956e704e6e99163ef2f0b6787f0bff18623dbc1158e34006608
-70434bcc19164b41d499feb2b26fbbbe4020728e4882a6a123a8d78bd1f298d0
-5249ad33d6111b4a9c6f3ed2fc7b5a552b79af79a0ff935775823729936d3083
-b7b93a0b15ddcd84581e28b75451682eb6bf9d3c8ace9b275a510cd6561058a8
-8406173d4128c3cc60170d911246294f6c6f8e71a8de8c587e84d44b78e8ee6d
-b68a4e4dcb14d73b6d3b35f2d8c3aaddcd0967e570516ed9387382f78e741c05
-1093aa322dd6b0a42cdaa10e510ae3905d0542513d348ed98c4c9e01e0505f52
-2ee0b4658e51a433252f9d10cc18232783d58f88997634ecbf89a2124a89754a
-56a4b88de81815b3a17fa42e5b229f80aae7b8559459a773d408141928619cf0
-f56cee08f05f8748a201573013e41c6f6bfbfd740759e512a1e48cc4da24da1f
-aa24672d4164234b31c631da10260e2e9e788bc2289501b083e926d63152b46e
-6821383d6065e28d61d7a6b57b7d9859289dd3a2327d3251ff65c72ba121d0bc
-81b726e38ec1a2e9f2abd4827a6ff5d19f3b58ab955a609a97f221fbf793aead
-e245e3164f2824210a5b97912b0a71694c3cafbf60e0af983b31ae30b4b9a41a
-aae396d6433db119aaa6a174e02941a4209e3a7ec58581701021c3af19b12925
-4e16cfcbc2977089ec85258501494eeee8e21a4729fdab90efb334fd2ae0300f
-ee893650e27238444c5a8c0511712d6c00afaa55b83a258a691177384a7f2d7e
-17da838132d47c18a528098888bb160762d1d93660de8de402282c4df7492ce8
-920d1ac9e9886e4d9a1302739890fe2c95eb37f9dfe73ac4fc51c4b0dcb1ef45
-d1dba50df66f32c1b2e03e2bbdf0b151424eb2a5479dc085a84ff7940ecd5651
-7480a4e7653edccf6a147d8af6da9977aa7871708f6dbc0125ed0e4eb6a2aba3
-656018e05f90831ec7d00a9fded05da231c00b95779b0cb9780d9fe96b1dbbd2
-291d7eed562204c11393602fd2d90ddc31d438b420720b5e19a7a760773107b7
-8e2c1aa72e2e1fc16ea9474e7167ae6be661e6d0f37f3beab24d3f9ccace3dad
-be68fe29e086a62b2882eed800451f432db02614da4d1b7440d2c8aead012aac
-e32f90080f444b368755d49dc24b05e0c48ef3fdf57fd112166685773c138ee2
-36cee78ae6d93130e97e8e633688ceada23fe3aef575af02d5bd3c2c5bdbfae0
-7c83cb2710fab57f4fbbf57a8be81415c1abe8b6318db53dcb71e8850511af89
-4d43b842cae1e9b4f3db6304d45d99fdb452ebf0ca76c1d7592f1c9eac61f785
-c775c0cd72c883b0088cc2cea72367337a0af42b233da8324b02b660cebe5970
-ca1858217a3d140556d5894be895249f04a2fe9a03cd39eea05ddcfa0c757fe5
-0122410c80274e6fabeeec6c0f8181718ee6e673229a0a0ac2cb4414da14c4d8
-757e44d32207fa9f01cb6a4f04a6a67c38b219d1425dede228ba157b4d1ef96b
-e16bdb889e8c9527a0fc4cdb2fd6aca296d7c06daf3f259f0ad74fd806c047ff
-0250339e1c1d650d8867ef37c6c42cf7f930fa6027445692ed00f0be90a79ada
-9de99a986f81117165404bc82cd33a64c1778eefaa123c3581454a8334ec0529
-4cee91dc0226be0dd6e8a229199a069ed36d5b76ec66fcf363d749ce886fcfad
-d6cb008f76f0298be337c8eef13a24ef7c3d774010e2e4a7acc429d8c0da7a32
-f8bb44aa9389d4f594be75a2f764f9cdab9011a3c65a3555a9509f81c27dd091
-221ea30ec6ed8449368a5d4ffd302fe809f3ce67f4738e96ad29d93e265921ce
-45622608522273b64bc36454a7a2d3ebd334aa8acf9e4d4ffa863ec25819e7ab
-2ed613933fc57a4afbd0811d4829d2bd9802885735ccfb251ef38766b436deb5
-359278fc0067aa17cb27310c52cb5ac59802aab49029ecda9dd1e02696d4fd20
-75becc63dca6908d1ff00efce86d5ee281baa70f62e3738ae4f054bc027829f0
-5a57e15b9326df9fc56ff8c040daa752a0399db4d265f221103192fca2b3c88b
-a6d90659c0d85556e58c473dcf3a1f851b4a1c96cbb48971e1cbcadbde7b6799
-ed6b2d77eac67a7776eb7c571f6dc43ce0697f4392e75978b289965920cf17a0
-d78aeec7c733c885ee89ab9061094d0d01022bef4839951faf991876c26e5e42
-9eb7e5a57de0da10b61ce825a06d33df1989ef3a93b83130219f933ce36e4b0d
-1f626265306898140b6d6f4e4a253cc3c6e27304b975767a38127a0b8d906f60
-53d097e7a588648e71fff1fd9415ac7d7141abfb33086171868fde663f6a0aec
-ac7c8f8e8cadf5827ce72fd49d319ca5985cbd50341c30967084b5428cb488c4
-859b000c3f0cd1019267d9ac317e02cfd4f7d4480309e7f6850bce35c850155e
-7cb5f93160d33fafb4383ad3924d0d665647865b5b9835519ce1ae14cd4d26a9
-c46f889407d0d984d2a3e63cf6aca920262df305ed31d3d1a965c20422fa870c
-d860c3ec7d3b5966678c238c0e4f69daaca76fc006201072facd2873aa30db95
-626cf97cd33eb47950b2b831040be0691f451765f57824ff493c3d06133744c2
-9fbea2172f3097881cf406da9cccef1b6be9ada1909886ad58edb99228972dd4
-240898cd356432c333673b8902ae243686912f45ee6bde468bd3e8b09448ec5f
-00d7a9213628fd6743f0cb028707ffe5e5b8a8a24e83c3750d68c0e465b820b6
-30d209d39da1f548eb22aa88609136aabfd98026bdc4582bcbe7cbc50deabf90
-49d4737e44f1f899062386edfecd5dded3a743db71a61ebd8a81ffda6470612f
-7cdf827924bb4e7e75e6c91dde90e698b319d6fe6fd982955eb99424e0f26aa9
-3acf642ee1c9ffcebbdcb6102f9ba206238cfc64d68036129817a65a175327fc
-f34c379fa002c5a2b9112d5b9064ecd77912987e28883259a6ec9f2c2741a84a
-03830b31693492ea5286ee18a52af05b41a6c379b6c850b5cb4d31f60a6e519e
-981c22680db193fb72d365f0260abf3389832ab1d78759c1482eb1ffae6d8c4f
-20676bac1407720c6d3cb33d0b19106c6f3059afa85f3c782918708dbf809228
-81552754d6fa2c7ab482e703d664aa495805292274adcd64e7696a5d096ee928
-9e350c8294d7a1645354674e66213f18553a72fbeb7fca3647ebb5828f5a452e
-03941d4cb822ef0839254516c2e6fa668006bee04122ab89d1e958b57b98f0e8
-ef8839dda01dd884e0bca9cecd0a9d6a037f5731c7048b488f8e972884904692
-c0a558358d736a25b7eeaf608f9c85ce45bfb13fdb0011164c50f82513f8fa5f
-0a53330cfa24ca4c59c50813974c2307480a47c25044b2bd1360df7c82f2f482
-9fdcd0581ae31fdae1e36d59ed2a6b8cdc97f005d32333e27d1dd49444176a4c
-71887d2757d1034f27dc74793ddcdb0d97806e9e16328509c760801174dced00
-316084e04d488626ca71a824c2e1f36c7b325a3f1446b21d465b8870f7a6b05c
-ec4c2a996db293a754d49a6ec448b31cbcafe353209ead320bc8d963432888ef
-1ccfc29e46c0c7c8e2849ffb6bb680f5016670b639bb411a399c63371fd36c6b
-079077160bd539d0f253eb437d3c3f8bd522a05632db51872cc2b74cf505da34
-eda8b3039e636f2b8e9dd82951380a5e5e8bc776e996e50938b8f9c5a470f366
-e26e719646a3cf2e362a95f8ff6776cf5edbda555846f284c75874399d211240
-33cc43062237e479d024a7c34c6310b81f3a299a148c0510b78ef9d01a2c0db6
-151c80d7978a93409e2c7e01417bd898fc2d091a4f258e777f5c18dfc432cff3
-7a13005c10deba3b25411d93b6426cf9c1e25d3eaed39f8f7d1c17f8ff23bc9f
-47dd0674ce0ffd60e12c1d406587cf6ecc678220fcba0ed870e0be75768362c1
-2b8158c19cc70560a058e53b83b19560ecf18d0acb4316b7061a9d9dac63fa9d
-ee3a0da5f7cbc2addf7ae5310aa833ea1f45b97e7698558f73f952baf03ec25c
-ae370256a1f81578d360814dcf29b12764f88ceb7ec3358e923f781bfa4f632f
-de9414f7b98ea0b063536770f3fb4ecec21a68caed7fc7c85b9abf613b94ea8b
-94f49a2c22e23233d65d4d16e4e6cf2c317da20e8f2307d4b4c654ca9d215479
-9cb625b53cb49947961f81ed2ca5fdb4d64f97edec759265788cfc48333de518
-fa274828bdc27394e4a0888925d2d9270716c89f82c2bc569be497f7ce930924
-b4f16ceca99254efc0965a3eabd78da5a16cd9f8d581cb7106ec2e9058b2c9b6
-7550555c837e57fcb453174208c072f26c717b88ef55bc13bc3188e8f768aa6d
-11026d3b69f0628cdca2c2155df354f24d2af4c9941b0172acd73cf9c7f973a5
-394aebd41728178dbcd55e73a998df39cfb66a287c0288e8e0e0816ce5ec98a6
-804b2d1ce83f2e31a17d32d47033ed9549b0b0119df7e2736bc89a21ff725695
-018ff19d096d87e8b310b9c0884d4f8fedfb889538c9911d4e3fd53aa570492c
-98a5f5a822886c60b8b2a72e775d33d0509a4b63e016cff3b2c767a6d39143ba
-995cdd4aa4a8c4de041c27343cd57715fbb6d48a46238c18d79ecbb2548c0374
-b9af808dcdbab805c520b63b30aa66a4cdae35e4b71b45c3a2db55c34c2aa879
-29218f60b74af83e44b1ab43906a3a54a34d85891573c594d3ae52fcb548d177
-296b52fe2253195f97c568894e8678583165010db416012acfe3083431175563
-6d1dc919105faa02f9ca5878a719aa7f0719a4ea81ce7bbc5c2af1ce73a5b403
-c12ddffcb317a401a4e12e3a3168a04ed036f04b973093605d8d4a9be6bd4cf8
-6a8b57b37633a1fe2791b281f40c018bb53ca08a467735377ddecdcedb939d8a
-38f757b77970cbf6f174b6a6c60da653e3e3366ad55890e78f61d293c4f96e4f
-f03dd48b2b23f06b3dcedce3c624eae1497e5d65eaf1723447d2f0ece09c8f60
-df0976b17c95dd43edb503237218d7a36346d08b285ed0f288fffe09ddb03cb8
-d2d76449dd1d40db1d11992055f5494f9b8137e4c918a33446a616f12f5e0683
-a4979daa9b97d3acb1fdac75242e1c3f2bad66e3dc8a9203333e48376a6ee721
-a86b34087389370ce971a7057d608e93eb4d7989f487c874418fe9a58bedad1b
-622192bd5f8e012b1d1942a6d65bff9cf5af14cd6e4cced7379a77cad8221dd4
-06adf2beaf7b32155da0b6b22a92adaa95d206ecf5a7704c4760d14d70b7c268
-4812a0ea07f20c02a797cecd44bc22e147df1c10d51c221e0c2161633616da82
-53ab9a727305515f5e287f7ec56f540f1e7e7d9142811123b84df2cfe7124789
-447d50bfafffde6ee2d7f206996b2fc896978a06628c983f5e33335b20a20fe1
-a71f01634e917ebd7996da19287755e9f9eaa0efdd7a12934da4849121e0f52b
-da07c25468a7cc24e792f5d8b37443a72e2e50c655bd80a7badd47e4fffabc67
-7d7c4190824f88b63c0606e93ec889184c70e88f92dc556e7e71239bbd733af3
-0d781cd85b03ff796bfcc24e7ace070db05149982338665b57ada0e7c2b80d27
-a64bbf46940f28865292f05f249a1b0d3891efcd184f32f85bd96a2623c5329c
-c59686103b6593dcf33a6b77e263167dca4a067874724d57efe3786f97349854
-809d3c8ddfd04d3942877f5def5aa3fb5d8be234abe999704cc133dcb3fdaf1e
-889f6d43cd4fc7fb570460f7ae4c3b2de650b6d9e8caf3c6a338394a68bae1b8
-ab46be4452b9709240803db075bcaf0a5c36008ca4d8080cbae6adf1de652b8a
-72d6f9b1bd1628eddab2c1b1f28bb144f9cf7fa7f86613b5b0e13d3f870954d7
-6e358c7841733c90d28f8ca3b045bb494392d36a1b2c9da9fa354c0909fabe20
-b9335158f0258d231301e9ae5a2217e566b520bc87583a5d67d5b1b9b0a999d3
-dbb824d88fc6510e065329ebdeeb33e7e7ee38ab4c9afcf46b089f6489287a22
-59a1137f6f31978958e1c425c2b8aa54e8808d12fda962c912c44092646d2fc3
-cee8190baaa232d539f9b453aa07d1e0527e6493d97b970017bec1413409110d
-3709d1a7faa79f1f07757be5d05718b09cf1fd0fab0a442ca9d14483d95767d8
-d8538f13c198e4072c332b3e0002a3a77c014a1682a5b113eeb65155e5a0b464
-1fb6d589313a2e56709e1be53e8acff66fb138e8f18bcc6b684457c16aca8a02
-d063a19b8b2849205dc873ff1febbccd7778f5948e8f974d85f74ee9845716b7
-d431708eb918eff9ab80be8ccae06fa58caa0c57f6c3b0c4f24fb07aaf81da87
-e12ddb61435e564ecb3b74759374e8e08d98c011bfccfc824f1a7d9df9d83fb2
-cb3a4136415297410035b6c824bcfd9b01f7d6f19f065bfba1eee8d560045dd2
-c552badbfd6b03ba6293d12b01985eb156c61033bbfd2553c4f96a77559061c5
-8e9e0d7737316fc1a1b4fadfc662ef1caf4aec6c2231d50cd7583f94af423b18
-ab4b9dbff979c200181921d84a63e4e722bcba97e42f78170f9441d0001dc280
-451cdc1104dcbb65df237553e3baeee3c69153ced25001e6fb970e6072ac27c0
-fb99138c0c63a107c9ee8e9fe1de42e534180dd9ab1a5c2d4f4a5cfd47711c73
-f55ca3cbd2e074c1ba4700ba73d237113e9f1908836c5a334c157b903113a9d3
-5ddb5608d0efcd863b973fc55017d106e68bc4fba6eb3129259854d59da2b47f
-e82b837e5c9b44ef7f279c0f6c0ffaceb7f48a72245216e5ce316a09983455a5
-089114d310a111a4b11da77a68c5e965265504cffefded03b1dcde16d3c3f940
-ebee6cea1616cf132b0658baf0bae5d3cd6043a8bb2f071df65f1e5f16eb0e7f
-84411556a2a7e5fcdf6b692c3dbb9d9fb6c063a2ff8eadde118501b4edb0e647
-324860b5a4402ebee015b663eb8ea6fcc0ea91b97eea89545ae93c5e3cd5548f
-c83f754e3ce0ca0703c2a0f35e0343d137a499aba617f83d46c7b7c0597fa84e
-1e544dd77afd9cc36558449edd033fd4e7dbeb57071cf624c109ed1ebaad04c3
-15eef5bb0b004895834dbf6b867198688c9b4117909aef484930e8a31602452f
-c799fbebacbe7b75d1ac37f6afc8c32313db3c8e4d64ee504632c76654e984a3
-882762b78b8791e6e46e974ddbf7ab4d048076aded03b6071f373aab006e89d3
-87dc28db2580559d957e2a1626b1b936a869da79be30d451f42e583f0d9feb53
-14a59195da976d1b6f42472a9cd34834e3cc6656cfed7a4f56a00f721967c384
-d664d6a48781058652094ebd87350c6a3a4692526053edc59963e0c5623d1df4
-0a0579224fccfc98730df4e1e0ba9b258bbbbe9d2b4c1db9c33e2a4311080da6
-bab0e4044ace3f56fb92c99e3cd0229c4cd9c1cc03c1f1ee32e772ba7cddeb6f
-4057a68a458414611bc2eb218d824189818cb4a95cde2fb9a6700d412b3503f9
-8ddba098f014da81df3344748d1229fbf801c1e2316d95ed9559ea16c898ce9f
-64f4e41fc35748e1efc299c26dc3b42c26123c330b9c8cb7e001da5de642e6fa
-c44c19f97b20e47ecaa5263bee98690f122326556c5cb69e9a21286c3e462332
-e10721f7747d3425cc204d4b4f514501e14840aae43fb523b89e8b2abebea979
-c6762a89e4546531afff98c36cd30a38d13fc19116873917684fd3043c3446f3
-7c6c5a36ed36eb3900bcda089778c671d6711ccb2f7a7373aa6f519b27e7ac73
-581ea404ef17adf8c92a1f8e9edeb0201b3a48866584806e667d7eabc955e19c
-2abfd1bff1f71289b2d8f694937e965bcfd6de56844f0e5fc980efc777f50f18
-9cf4b2d7c0fed84513f215845aff1bf3e4250aec7d7c19158978110a81d73f44
-92da75ed640441da004cce30d28826514e409baf6d41f7661c4668016d9fa019
-380a21444e969a6aeb6ad3cb2341d0287e2782a409675295227fa2ade601e1ee
-33dadbbaed9ea5f0715a88f5390868706ae6b5ec4473c15e65ff58e9c8117106
-c83ca1b91001e741eca076cf0cda6d9e44de4f8dc762175f422e12382dec63df
-164388ffb614abd40924ff4f6ed0e57cb451b320136c34ad9e3462ad884e4472
-7fe5f7d5c6e55997355cfcdf375f3ceb4913f23d7873731d77435e78deb10d07
-d0afc29c261ab66f2b5d1ebebf36e96b536218e85de4211b5be3bfbbf0c359ff
-3207f6d35ee4738be6233e4fab21002039fe208f10fdde73d0ed01e117a69c8e
-056a048757242b698bc4567f0684c8437d5d391fe2d95ca241f09d573654fe1c
-cf138ac60ffbdbeb15f975f8b1fa3dff83f552e27844ae3f44c4a874feb1ba98
-5237293ef7cd143d83dd6ba9cd08cd0dfd63d3cf8b5536dc9d65ea582b2b5a1e
-852778730e3a0ef6853d3126dd7ab94bc3cb8c41f60c82aac4d82223296fecfa
-e01714eee59cc4f75ca5bc0eb875f8a4c9a6d499c9a7e1cc470987404dc820bb
-c610db9470c0153995c2ac7cfdd334174b91923efcf4de1f3543d1e9971dac29
-a6a67169daf36b910780d691201638783401bd49010122d7456c7d8c1d301fc3
-243103d48e9fda5982b07f7300315a1abd3c84d7aa3088f00214f8c2b4ade1dc
-d82061a23adb2d2112efdfc648dfb995ea7da854793df6cd6b3d6ed7a1120832
-220c9e43f05ba4af43913c5bf74c1d3340d4e11ab7d68f6e4b9f785034b64321
-1a1ff2fa676fd0cc367605ee99f1c7f4e618bdb26746cd879a8670c3506707b2
-b774104efb3596ce07ee5966c7a7bd06563f7856742b284bfbda52a2664e264a
-5f781c5fd79ba767a19936fb3a0ef2072c998e1b916a2f2f663b4343afb8f168
-f2f00d3f5e1f583d20ba03f6f41a980d777c7c5fa5300d457830c48faf007548
-b642a7da2ce598799b042d03f4a1979cd0130662cd81511a5ac2866097352329
-a93cf79be94055616a889151b66b0054053822de0248141d4d3c0471f3ec95da
-cc00eafbcf9010ff26f90c186fed7adcf4383297311c3dc317c5bde2da60ced0
-e6dfcce2f0b25d00b1f16f5884981a210483a1a4d7dbabe00baa1e2ddf541a8c
-cddc9e051a54be5f4c2d0ffec3b83e931fb42456d49b12f4488627d3d3214c4f
-876ac4ca7e3a4e09a13d09c0741c7511361ee2726a8973650c7af8175fb81882
-245d94df87618d1c17632cba8bf34c37f91681670dc816afef4ed278f63a9140
-9cdcda8ca64904523eda55908972827693cf36089dc580743a9eff42e3f793f3
-100bce00a6bfb089e595c736eac8444815aafae9654d9da0accfaddddf283629
-be4a00a9f6b464bd3b84bfe069761777f71c6fd398cef5b915b7729dc2ec8cae
-b4ef063d47ec4ad9a0d8d8316a0deb5fe7982824c9f20ba43f907b56b124a2f1
-b3fe3d644e9a6f1c1979130b56a08e9a91d71de0458777c461a93fa416246373
-81d8a7b70639422ecc3841958dda5cc2ff32fb018f7127b24fc1f8b2a97f4eb8
-a5ace935d51e1f55c5ac8f2f3627efd76f052bb517560359f6e139080b19f328
-46f0bf11f1a5485f055151b5a802d3c9b042ce62e367446f59519a37dabeaf46
-9c7951ae6216be980b97c3106e1bc77516555ce6a82a25a2c348eb0078cf5a49
-ae48b25df34867cbe4318b2180a68f0d283ead9448f3a93cf5006c9fb4105c38
-e3ee2a6a0c2c68516379781abcf30bcdd3e29353c08cbfc7c71cc33080a37fdb
-5eb3054341ff059d1b0adfd213644085ec8f1ec8e0ed033db2e69e5c0c479925
-1e7996a730640b1e16ac49341478ff1b73bfeab8dfcff54c4f10dd7f10d00db0
-16d2e673fe75ca7cdf656de1aece63bc018ce97c53335c140cf8b98927b869ca
-cb5b1f6667d9df1d62544dcfcf12a15432e31efda2d8f4d96b73f6128e73d9dc
-932d2babfc3220aa8c6319c9fb435470625f259104bac932b7cf05c222dee3d1
-70ac1627567417f41f4db1c7fc7b892d18b2c53f12995344466d44be856cd953
-49f4b959b4749d390f66bdc6ba0983b377af879fabbd02f1311b6d87b3a45075
-516e347a9bf9c30f0c22573d03294fe0bf1d86490dd5e0f1800e97aa4cd34328
-325d62c753ae10fbd5098d1659687f930da4f195b9e4b8616bec2fbd0b6c941b
-09b03eaf23bba7544838473f2b5aede4a712d754a117591bf98f2a534057d7ea
-4a99ce86c87ec2b12619223c8046f9e9947fc8ec69018cbe93dec5ea5ded8ec8
-56b1d03f7b57b6ca0d8894e7a26c721956a66df5d582c397beb57c6c120ea224
-a7d5acfbc6acd556f5a08d60e5c1a725fcf062c8755df1d6f22381564656446b
-19bf6518fff2bb1e04aca06aa90cad4333f10b16f9585e5d19ee150da3931c8d
-a05618f6e4e188b44059ac3758c930c3ae763267ceb422e1b4595802b374ecf3
-2576af6afccf151af304747e2405f609f04509f38f17dfadc6383ac24d18f5ae
-f8eb5125446d4d9b0c67001c84edb4032df4bf86e8eef2c113617f3771c333fa
-c9b4e8d10be191b4f0b62a21c839a52f75ab070ad8d7b6fa6fe538be4844841a
-d1da0cf4948c018259ff3065dee62ea4a2a586fb09550b1e32ee006768065f6c
-a62e69542a84ac74349e4682988f106f944da6132c49facfe3a71e78f15fc928
-ba3a391a2599b16fbd0624504f340a0854332c12215bc1a8638275f6bf3fc328
-8c9cbe92a0196afe73ce3ffe76b146842cffb10446e80edbc2675458f3143366
-803d716bc0254178f6a3412f9978dce95ef93dbbdce9dbb2e8495780a784dcae
-7e01eb627febe7ba97e715d3439d55e3d86ed0764b2ebb4e09a1a44a4f187fb4
-dcf7edb3bdd615cf4d8a2ec78483f2c5f1480cb520f50c370ea1adaac5d105e3
-1299ddf4c84b810164d9bd90500b956ca1e9cc387ec7b697a220d124696fe475
-b963bed158dd5e6a466e0674ab8fe21413d2bfa7b890a2f75447bd75e18f582c
-7b94f812009f9e8c842e68e3f4d8545ddcbd12b522adf6bef2db3d9c9e417d19
-ead754d89c81cc8355f3e74d9e83df3a5502027be852275d5a292e84fe0f3330
-f0430353f25f954b08c7798719e59d889814d0f3da68006c3866e1ce7d4e4c6d
-1637a36b81c57f076c2a534139a3fbd06e814308f41d534a0b8efa70dd0a3334
-28b39be5842b7ba882ebcb7cf6e4e39a8ef9049304661a35067d684d4338def5
-0651c76971c635cc67118e8fc3e14b1f4593e855bdf58cab00bd96c4b9fa3fae
-06e5f2f0453b9785067720fad4fa2bce85e75f4c7627ba4c9ff60264b7e3203c
-b7ffebc5a030ddb3e9f73e43476cb14db814f6582ae10880bc2e05d2b45d6703
-fe5ff8fac1811faced4a873bce848c67f21dec481e5bfa16273b317ad724471d
-d6c000d0567054afcaa249b29fe4868d3de14f3aec71a9a516534d7bcd5f520f
-4b692be725813ad0686818ecff6583db9caca9217d917ef8e95b4f0f65b359a7
-bfad81b047489b5a27f25e9d0083f3857155bafde723af49d89d12d0ace5fc57
-55ecf06556351af4cbbfb31ced64e43741e00effd88c100126f6a9ea7059a29e
-e676d797f763662be90baf5888d003a90e1b3d2972ce2d2692905474fc3ca302
-45dab5e679b2649139d087da1c52b573f720136584590951849ff1acf3fc3a8f
-3598951f265080079accc4792c81607e426c7c94c49235defbf99c2ce7cd6f83
-f6500ba6df15e5db02a83f6fc92a707f46763f7cc3e061ed52833ea1d5e2c3a5
-e792d30003fc4442c2b2da5a7b6265ff74c554b66cd79bb3f8fe8f925be0b8b7
-5539a85ec4d8fdec57744f34ff9046971df2cb948efe784244567ba3ca7585c2
-d30e9227fc65efda488c6258472b8078e4d53cfbc75a54b2ae83ca83d25eae24
-62925ec4c6a8a71f1659c30a40c27a8002d5af1f808e305584a987659eaf20c9
-bb9149bc90071f272e1668f28d01cf753dee6184f401dedd303e41270d956b3e
-e8b162458a0b5b36f1b44730faadb167a76a906e4d515640db77355c10ce489b
-f531944e2af613ddf4e8bf63744073505c11b7a2391f3bbea1eca42415e72784
-67ac2104f88c79ef1adcdd9708241b6c666a0d9376fb23ba488b16ba96a4ac15
-828e8d286635b79c99bf768f8fce273e569f2f1c6c34be942b833a1fe05de68d
-ef04afae2e78ad7d500d16d417b517459820a3056be375cdc94d51b97bbc360e
-918e36d526c1bff1242103d6aee802457fe39deed5f80f274a4a76930ed84c41
-08eb6d4ebadad5d97f9e5226af8bffc0366b13cd443863ed1f3ac1a43656997a
-1562b520c57ba0ce60b0470c6200fbb418b567b575b76cca63a371e05b44bacb
-8fd22384616378260738256cb80100fff9d04375e79f8740923c4f87d02eb586
-40b9af5147a7f15a8278252473c6a757900ecffb061aae3ef8437bed0f443f99
-7e1d41fbd1ae69e08a4b72f3d82c0c9aa74558f2000cd23feab368fb9fe8adff
-b1edec68788c845dca9093d157db4aff2385d94b615d680dd2463cae985d94c0
-bb1e898d1ba8a26e8fd4dd75fa1ff158032b42ece876dc01ef0af5e59889c9d3
-3867a41fbfbbacb9f2b182a9e88fb57f4abf2b4af4b76b262f8b04e60f41e64b
-9b54b05972a8c8377db85c8c057c7770ef3859ba3e6d4317246b4d82efec05b1
-b06749c85bc5a915b8da1d3ebdcf13ce8f09427bd6687eacc75ea0a196d22616
-6dc5dd288539be39b3fc157e957c1ae0c61f682ffdfbecb384796e603b33e5bc
-43a3ee16f854455cc1825a2fd49931dfbc0b76acd783b8d6cf57ffd909e44e0f
-65f51296a1be58b28ab759390ffefd476cdd169ede92dfd5362137f2412f76e9
-ab8d3d7c0829a910aa7866ef6d7712fbda2223ee1c672aa42584d3e5dceb6ccb
-e16755b381dd61e83c43ef2636c33c5e1a453bdb8f30f51074ffa5ff9b427639
-4bc83edb449f5dad51984e25e77062f4ef7981b0cbcb6b8f97e938aa6e8ebb92
-2d7f2c599d714d3732caaabe65994e20e56795579f7feaf5ccb5b1448b7cf3e4
-c59366d5e5af71390116e2d7c545523fd2ffecdb8e2a59766cd2a8720b3bb898
-063b54de265f82d6cc34e88bfd5707b1ad047686dbe9d434414b73ee4cb2bf32
-8882565e93a6434d7d5e40faefffd695ce65bcf0014232760e63389558ac39fc
-23a295ed68fa43957428c359b5256c6b7cdf7f4bf4de03d6e24dab79d709a27a
-0ca54d84fd365f67d85a0c641073971e12260b03c0d9f88bc45cdffa45bcf544
-77e564efee2b7d8b8fa4af0745b8f4eefb970e6072ac27c0fbcfff9444ea7126
-c7befb2dd02476f58123cbc23da0ab4c91c8839af709a516df1db6acbfa7874f
-50f41b707e2edc5cc705a64f3d9b1cf30231d422b97acf6a37b9c5d6c0f6ba6b
-0768ae1b907aa7e986fc583178c251b36bd3bb424c13bcb9cde19644bb8b40c7
-63d2c192798218322f63e82bd1176158ed074b7293e4178e9953766f19aa08b6
-1765dda1ec557de4d4841f98e10f53985d111edbf0e132dcfe12d8118ce78632
-b67ea99982fd3cf289ec0cc186ee5993acfa41113eb12f9457c01cf3a13714f0
-f3523eaf4229da65ef3bac70e6518dc954570033bec5bb9c49f2bdd52db14a0b
-9b1dca8b489d0e9992d9c44720f9e9039b920a69b36e31a27f33f105bc700e1a
-dbf42412f827b364c91bd06a57e22097806f615ff8cf20ddfab163f32351b638
-c39bd7b05d0fb10df6ae8bbbef8a47870af4198ffa6f35859a308513bb3cd6e2
-32e50206aaae2f5e14d5bc6b8ff3f64a9497ebf7566ef04ff1394d1997ccf7b8
-31629e685294fc9cb7468a919ccecd64048c60a44e217e775fec9d31711d2ed4
-839a68a91e099d16e24b813817aac1c10e6aef41b6c616dafc4f6965eb4641ea
-db27f46ac00e4aca80488665771724dac1fe2206506f09ec75885d5fa3129bbe
-4e15f47090e9310c0d47835c5e697a634bea062a60c4dfc2d4e67bb8591149ee
-30ee8c5d284d332f4d7058b1e21826ec6df07a1b12ced9b109af752cb4aca0d3
-b2f64eed115d963fc4356953a62dca58d03c6a1574eb46c2a902ef65c2d41e15
-677eedf8e0f92d99fe465d596ce0154785f623a6f21d0b293e211402870271b0
-a7669015f8fa46740fc7f171f42b1450e001190e0dec67a83f96e24ebd79d9cd
-f8767571b35a891f9a7da04ecb6d0b0ef28bf4be1e1e6ecb634a3bcf8d48f797
-89fef27a51d3da06742a93f5367ba9dd87932d6f41fdcdebc7313673a427f172
-b142a59879ec5a115ba6e50da31c0c65cc88b2c012f14e7acdcd39aa96f58b3d
-8feef0df2d568a41874b0ba77aa07ceb12fb6113698279479d15b5798d065431
-22d252e11d1a8ad35a267b8f9699f36c87e5f9e84f931f1fea9d9226de70a6e7
-e8503681d81dfc236d06bb2599f896cfb97ed5d287f452c7bfdc04b6c25bcd40
-5624a580f4e3ceab7d7e13768cb014bf82e1988b458a1d98f1e28ca698e5e108
-7be4a8f26c3a25035c6ca7c176215877b2ba1e812d79a37eb3914f2eb5ea4414
-7c3f38cac536f3a8d5f7f9a17e6008373c54669e00c937771e8d6ba2bd833648
-8f5b9b61fca0099ab4d8acc4b5df4a5dc685fdbc90a6cbe881cd4fb561e8ec6a
-c76c3a42146a5dc2ce7f6dc221d0717138f03e7c5a93ed07cf7620975f4fc4dc
-5ae665540f85b795e42b15df5b82644f6e817c831087e2f7b1a49eedec62a9ab
-6b6fef18ff94e1e1f9f60c445ae93afbcbccf496255b1b64433e445b8eee247a
-18d7e43f90e084b0728f70744f87313ff6fb2c7ac61f207abe55d9bf4f0551fb
-12ab7d62e77d0eccee2ffae62392d6cd7f1b70d29046933384cea2e2c1428d33
-4a33ddac649ec5d4b7a65bcb483096a6ac1dd6408f48102e378cf71dd4c872cb
-772c1eb0ca9c8535a757478b30fae38098b92d38a2972e3f765b8b302b74ead0
-b41dfd21601497bd746ebf9392bc35c358ff0debb36b6800d254a10214e0196b
-eb8150a66c59e0926813c5189a777e924cb6ba0ff1c593c6405d5709e70af9aa
-e553034680e3af6afca2327983165790a6be4850b378556b29f213a78ef91560
-82201faaf9cd64884a12b176e5941f4783bdd9c4ac23cd7b33aadc49d2f2ac11
-ed6b4196e3a1546f2723fa0cf4e74d51227237e5be8dbe5b61e2860100c8a212
-ae75d5fa0f3cf636ce9db565ae8503d426f7eabe413920d7a98c3fa47414ba75
-af6580df563f70c08422873e6ce8e1282a6058f87dcd2defb30e25bb3bea88ca
-c4365dff510d9ea8e3c85967d70d39c035f3083c3624d7617bc5dac707f5b993
-78ccd3e91f5a94a67413515a21233f1b09a18acee0602287bd3a1031e169098c
-6dda3771867c4b6035ee839a1547ac0532ddca75a8b778ae07ec9c917cfab4b0
-ff9298e54fff5c54b4ddf6e5c3c44c1cdf1acd48f7b70bf36fe1a8c675f957d8
-005836caf879933b4290dc7cae52900dd58897aee9f8d6d91270aacc08065815
-3753a34da04548780f70ba1ce29c1019f16d1193d94366b0dd071c323b4b65e8
-e0f8580ab8b9c1818fdf7b2a92a5dd7d4cdd005d5b902135f0410fee82cfe1d2
-44bcd29e599d6d5f95643bc960779083159e00905cd2fb3ac66d4bc2565c4aff
-6b0ad51d1a051bf9212363f5508a98035af3c89748249af4b08253891fa1c26c
-e2e47cc4c3585450162b3e94eae6efbf5314d1567e240179d642c50096fff099
-bfea2ed1d2a1aad5164ee7554deef672219fefc240f979ab9e97e746b65927d6
-ab034d96066e955a3c53b8e3f2f2271e977e6ab006293b2b3c1fd7f615eb76ee
-faa64f082f68bbd8bd690d154cf62d48a7aac61f37d325295724dc0aad8edf92
-d24eac64a11d372d132434dbd70f34a67ecb0fb97dbdebae6d738446949de8a5
-de1f039f4b49c7d637acfeb002b56b1b97dc504ba5f00f18881454aae16f0793
-baf18badd0dfb6b218aacd7d1d878cd9c637729924184c546de16aa550e81741
-3218f217fd6fb7ea6145dc73ee00b0c0bc6a93123706333ff6bd82cc38aa848e
-b014ed145236d5b8ef7905f9be3a98fafb89e811574779f482bb9b0cd4c8fbb3
-0f12457defd87f6576c0c37f542d5ed7dc35f09b1f382718c535893fb1c2c5d1
-989a1245e44738cf6a9c49d80158796a90e98b706b03ae10da2d58a3cb79890c
-0d45d554667aaf0b110deab7535656ee3995dc28b34af6796c52dd0fd682b048
-7dc06a27282d141cc02bb880a0a87756faf56972e53257af8ae9c362121b0d93
-0b8321683cf50c57a463600936c43bfb65396235837910fcc1a0bcb79c57f721
-c3cfbfc40643583d680b3162e12794979c6c593f9c9525060cbc2b77505977c2
-a88b40bd2e25d8aba89801a09ba7aa50c401647e65c89ac200f072231039f7d1
-962b7fd0104e04636114cb84e7317310b590245703e54b37781e473265d5db82
-a19fc83b9725f1aee25ef915815b3d3399de9ece699d2c54c2a39fe2408e3f2b
-84010a6ce7dc04d192ac308a3209dc0ddaee51a502f198b2f74913c2fb6cfdf1
-b39c7051b7a2b2c374cd33463d784da35f96e0298cfd1950c4f2fd7a64050e10
-98c07c3f8d4f6631b7aa1a0456825db870ccd2b8187a48dc6aca0cc86d5c1cd9
-1c062ae412283578268bb9241946644186bb61a71cb80fec8ecdbc2c1254d4f7
-cc02660552a8c46871b574714d9bfe53e7ad6315bf022fc769eee9988e7b8a06
-64d6c44e3642b9d06632ee37449b26d733f6201d862d7a4137142d7fafe95f3c
-1f63107ef0d183f69922c2927c9b244ef4efb28c9b1648423d03039806ce157e
-ae5bd445ca51f3eecb05f104ec9eefd3bf76a37bd23494768306f143f1170177
-2ecb2abbc0ff27ee68face57b720c0724e1afb2ad4405d35ce79fa406102cb93
-d110fe7c707781904e41a48fc4ecd9819cd5cbee4e606a88932172cbc37e1d66
-2f0f2ca2379f5c5a7f554c59ab6c151209972825a4b5fd4a20c77696427ea5ec
-1d30765e4ba579742ee3c719a9d93c77908ad70394669d66321f1200679efce9
-7257b2f7c5b2a68c7d097c8fb900b415b490f386d9f6c439b3067893eaccb2a3
-c376da7e13b14bf196bc9940d0aec3d560c63b8497381bb16625ef73b1f4e71f
-30fce3196c7643c0eb9683c4f311cb41f6825d736911b294117ecd759386db0b
-97def1aa3a7e433b89a8d8c7d1ee8b89e6e6c8082d80e71bacab06ab48b188d8
-f27811d13c04c03967bee4322dde4b2eb76e58249a74397fcb632a3c69ca5021
-10aea31c1f57cc1c9ab15cc2c8e66ab3b9c59e23b06e08782c9217cf8f2c6459
-3b0cc08e7f6c75ee74701a47c9504d6bbf5d2b5468f7270783139ebc2c14de22
-661522d175e3a847aa72db59a991f005bc86622168bf57a3d28c2ae1cbc06ac1
-319c4b8195bb715501fbd26cae0827ff92058d7a228eec31fa0c6eb70554a256
-1fd9b21773a3f765255b6eb4d4379ab3f599c11479f5085cefd19bddbce533bb
-9465f89e493a7ea66cdb039c2e85a0fd0aff5d7dd8f4fa0f618e248c837567a0
-9b72aadb2bf3ff6b9d4307e88c206ba9b75e0ac844848b5fd2a08d5f7c1848b6
-6e49bf533c94346902eae08ac41aba2836bec511d8bcac30986a18a8405c72cd
-0f189c2ccbfce5dbbd09070f0f916ef76683855fed5982bf9b1760420eb45765
-994e8da3f7033a5963c244439a7ac157219fe0a7ccee82804f641591e6b66fe0
-2b0d55bf5f704a04dabc1d5bf63739e6cdff39415a5fc216a55479fa8e7e2647
-643e302eb4205dfed647b3b8b47ef2616df65784347d5677b52e9abc82c18666
-0b786335ac635e573aeffcf8224205d947b0ea67b353640237a63bd73510f828
-3816c87d8f12be5f998b727ae398e1fb4e46e7cabe627d8f6ed455edaff7d8e1
-05dc0203e7c407dc05aaf9b9df596313630f683d408400c6b41ea1b7e05c8471
-a22d583135a9df1ae41b0a2ccb4a739c2844730893585ea7586c580a0f66eb87
-7066491a6835c2b3141fc1dc23e1bb1d5427860a996ebf4efd3c092edc54710a
-ec4da96ba61f0eaf6f0d5d9680bdeba2b6c5fe6d71c3ca7a425622135634cc68
-7aab3e9ca2bbe997e074d251c1e8daa885aad2c9322e6cc85031f9e205baf648
-d257f38b320a958e202ccad9dddeda59a8c0e4939aee0ee7fe1daa0acbeed8ee
-111214437e6695f25b52f1386ed2b5904b2cfa095a8ee8f0ac2707239091fdf5
-ddada518e04bb44580ee924a8c38d681aa160378fc3c76290b21a9cc03f1850a
-6a277de7ff51614e67043cbeebfbc2a473993b91bc7b31150ac22fecdc99dccf
-eba2d8ecdf38f46dead509b780ebe45bd0879b68d9052fcd50e431f299412272
-79afa25fde7a63961c924ff02b0990b938e96683f82537c0073e42e58a49690f
-369813992dc8049111536a76e1d1db712fbe9a9d353793e4b1e31b4e6c836a96
-e542d207c6987dea794d9fb2c23ce8d1cd9d1dc6b13222963320c0f3c5053323
-37744b297e3c1eadcee45dd8a0b62bafb7f6bf33c628e20f40c4aad75f19cc91
-c5832cc45aa9978c087ee415be15681e3abba579d8bf1f33c1208068a8150bd0
-deb3ce69a7cf00852a436a71f9c5065a3b262238910bb60fe4d08a6c74873628
-697c148fe67f1a59cc1e4f9d18d862fdd6bbffe395d9ac79686ecaf001cd9068
-2f6a838feed75ebcf706f01577fee2a437cf11cb392881cd9108223d71a95edf
-ae83dea1f6bd87dd0240edeae67c7ee6ca99b569d15deb7cb52a2c768882fcd9
-846359dc48a34f9c93cf5058d60342b01feac20aaa60ec0973dc5e3af0198a84
-052c2beb9c53e6ac865ba4567e42dbdc69e888f6c1ab4eb7b547a41141578c9e
-75647ad89fdc7c31b34a9ca6aeb332b3e6942b3c41775307a59a86275289dc84
-9430fc23784b0cac2a581e4389b16d17d83d685822d09e47113c3c03c45b90a8
-5de29e346636f864801b043d1a1bedbcc0c610144a6900d28ddeafd5533b5ffa
-79058fa4ff48ce1c7c7ff32024f4e7aad75032ebf0b125466356f95158194a5f
-5750c3022797f5d91e6ba6648c62b7e754fbd6a74b82f9671234020b78689f47
-638850f2e1a57bd3441c51716b6cea8d53a422ad81d7f35014709d2c960a6697
-0d7d8c00b63d97bf188004d78ba34a6f60309bea91c077335e09f72bfb662340
-156cee8710af1551e940719cf9f22d9a0ff51a0981301c4f1435450a0c9c16e0
-de8d669b759bf6796e6653a07b305df4c93e62dfb869c5c4439c79e1011f3676
-c8b71f6c0900ec9f5acaa83b12163a912b0448ac5adb76e29dee0ba832938f52
-895f878fce7bf9d3bdb7b16e41504dc90df6abbc31f2b9f50cf7edb363998de7
-3d77e142281b2d02067bef95da5e7429d4d16f41cfd94f76b139baa0b96576dc
-08e6e8d6bef850f2c530003efa2a12fc493f1432ca635512bee93893be90dce9
-6c65ba7c3472585bf1d37e6c3eba0b9bc34a438fad5ea0799c1bdc674951fcbf
-b5635d169110a70d9034cd19be6d7ee95a06e542968c21cd5427c8ace58f52cd
-8769ad774a2e46c8e0d8ea342fc39c683072bb821fda38c1e3fe34bbb209eb21
-e4d9f44ff3b252dc0df3361cfd671749023b1504e167a3e72c2f38bf20ff58ee
-ecc0bf2ffce73d51cc8ee71a43afaa6b5b91c8b27218f3287595ef75eb8c184d
-5386918ac83903ff8eac18e55ef730abf6262f36b7e3a58a25ba0219cff270cf
-eba11d973e4ac3b3f76a1cb0f6a3cbb03a8c17c92b89087347ec273db0035838
-7398603c291847da22ea02cd85cc438a9bf69cad8e6e1d44898d927d9e10eec4
-209c642383c700e644c9240259ca6ef8eef9c9a33337ca0f866850851e3e62be
-aea1357ced843cca5d5494d30917b78454c78387b15185748a852a91f6f9a981
-c7de39732653ae16f28b7cc2d8feac6da414de43621608e2fd7b2855de0975ed
-3e7ac410e6eedf48165310e4fb817a02800b9ce0be655e035174abfc073064af
-0b999221ab0e169b1afca5642e139f482771e4fd1fca9c2c197c0262094e6a71
-a37ac0c0970d89e7220a1ef66bef84c959f444a0a7bd666935970748c0bd4670
-604614d617e8c54edcd7c0ed73912cc074629d0fdbef9fb6529b82385adc3cde
-b0107b8b2ce9ac4c8b482ad14853f78be96e7b99c8c70ad7a0ebe802bdeeff5d
-b2ed7e836651db037f2c345f63285157ddf3238fa19130790e7a603afdc693e6
-ef58cb564a063050abf1d44ab800d754d354256802068f0062ee06952e95904c
-f3e456831a6c58214f9f48c507777e847a5408e7f1a4eb890dc97503718267b1
-45125ba0e28636d20caf4baaecc17c5545f1b11c73dcf7d1627b3abf6933ca21
-8db138a9dbd295818cce7b4931751c8eacffdf7110d9a37241b12b8906b6bd69
-6a8841a83b3ee2b85752e4cf927751c6cfdf7a7138a4aa5811a1c858e4b555c4
-05833d5ec60d25920de78fb347af37b50f1c3b2f7e087d059406f81ebce8746b
-8ac13758aaac6ec1cedbac0477927a5bce0564c1517f6a20f140a868f1624e2b
-20332bbb61fa5dca68c18a20bf9d1397cc0e991747ebecf1f6305c33aed5055b
-bd1bfcf15007ecb49b61334d1e2d38e5ef24339fe6d66948846a55a88296d2cb
-12f47df17c72af4370565e1f73a449a9b0d26c39eea04125fb9192141265a122
-449ff568a1f3654585dce47622ca0bac147715cb7a1275d02c1d083aad411878
-be64dc4da6ef276ea20697436faa00de144b11d2145a0a0280041e0618ceac52
-5039839261ee468bd1ab9a22a098f195d3853155740005473b0ed526751ad4d0
-d671313593340b36dac33b54bf78cc87256c6930a765f2fd927a3582343bc8f5
-8ec18900b67abd359ce7ef7eca1f1f9411943e057872f3386357300957e9e75a
-314835045839468e1e5d41b890f7f83255c3584ecd26e2971367aeaa1d3cd22f
-22121826d56aff35e356dab010747c2f46d46629a951159b6b69117fd548614f
-ec9e7d0a917402628829460cdb6bc8ce3f93f96837c594eb29c63500866d9ddb
-fe78d09876d3d2f8327c3318f96a1327691195afe12065448493411832ca1a1f
-3b0d4a9593625d8da1b359398827da68a7824255446e6342364db03dff29c917
-e44486cef063382245d06d9fd5a36a5ef79a08f36a66409a2f63e9235a12fe2c
-bc9bca58381b4d9cc7a6d79caad7d1b00cc6520836cf3794901295935bec1975
-8f473e0147da152eb2127f1d9da2500fc70be6811dad855d3a00ec44496a4338
-f89664ef47b5ae81fd8ac944448d1908345f3f0b448a028cae01e0e6c7c12e18
-30299a40196e5de461d5184efe63a568faffcf7c4272a37b8af0fd106dc94e7a
-9a55c62a4ef9b8d29b5d85fd0e596bbb228fc20a84641700ab85b33fd420163a
-deacc45055ffae165c50473f13119d6ce2d5ee143c52ce41260a22059b106529
-b87a8cc28917a38d5aa18029a96b3e095ef78730f4332c4f59eb02e686be85e0
-ddb57200449614b8209fdadf7ca82f4e8051a7baa6501270a3d1f00d99d552b6
-316010b7a51c23709b23849156adedc38379fe4be0ee796986674e2a73e34c7b
-195eb533fd924a2cdf6e73c1a02de2b3e0ce5ff89ab08383fe39d880d4dee544
-3dbddad4fd25d3881d8d5fb4422635e72a9c237249ccca7f926e728de0d293f8
-f5fff6b9f13ff9343df8a1bc3663d7786cb6d520b2a81874a17ea112e5b8dc0a
-b3b81ad49837767e7879ee03a82e7822c57e265be60d0f6b2789a3059b673da7
-5da7157f777cfdcd9f5c004ada55d8852952d8364c696e762dd8f449783f9290
-6b8f1c9817f5b3564c1fbd5f2ce6bdba25bad8a38b29dcc26938a7285577c391
-7b972d3fa1738737089433fedc6b6c11f2d9eac832727abff83342cd4f99e14d
-25e7463585c1be15989a0a0bb377ac009fd8ca8a5172903fa64566b06e2003da
-dafdd852a6937f9522a23711964b30d4fdbcff209d824491c0d0d46e22bde4b9
-4e33758ba1c3df8429ff69142e39d447d54caedd9e65ccd5a92015e979871f0b
-9d88029dfb4c74f286d7711a1dfb1c40fc3b697f3fc8feb4ca281b0027d8988e
-841a4a6ae8660c7c54d335322587693ba4fca91e55df91006a7626cfe30d331e
-5b518d2110e317d71461d12d8a908028c0030dea4fe6ab488f213fbcb97dc979
-4a844abe241435ca55616ae41715df1eb11558fdf3a39e7b854ca99d1535bc87
-98ffe95ff41816bf1d903fd839badcc7ef963f825c7c18079fb521c2c0f2405d
-397972e2038be57a51af173480e23b8b0959573029c386fbef6c0bf83a8ecf1c
-f3d6e1f174fecc45ca6caab7c90211013b552c6f7aaf3e837a02a2c2be6b4cae
-fd267fdc0c24da26d5ce30388a69280465886121614b029130325aefb656f38f
-5b56a08c2c379a8dbaccfebdd2d3e5217f75db4d7b0cfb8952aa192248e4bad2
-545fd3cec2c0cabb48f25817a4dbb1b9a0733f0a220ce533665abddd39a39eee
-9f4784cb26411c7862c644191fe63fa81dd9c69fb2c2f32d519ff145e5ff4ab6
-88a996b4e43c5289274aa0ce8b67bb95b9bd6ca6ba4e86505dea9dfa153e58fb
-ce3acb84b1d5b156ffc84eb9ed8d86f5dd8db7ea1a44a70feff4d03541199760
-0246a0071be64ead64a82f6f370a4f9d39555622e8bc09f4360aac8442c64959
-544189deeea7d78b62953fc6c1813c23f77c72761e56ee70ecc3f07bf4b5ee44
-ed0a6a7dcd4dcebca9925d39d190cf815b0585c1dda5897842e7dbd44b9a93ca
-9afb0344416c7e12f6a69bb9ec3a0a5ccd176839b24cf375c7b5aa63fb020ef3
-86d1a5467f5be498dd3dfc7041627ffc4b9ec0ae397c001a3f7703ca4ec8d27e
-ea5c798083c4756cd0d4dbfae4eb389026f97ba04094c0ed317efca15ada576e
-5315be4d6b84e91b8fc41b4ca765c508db57265a76dfed2ba23f2005ee3e1666
-f0f0ac085e4151f698661c4a69bea8061ea0d86db942164e18f51802ba4a4cc6
-2646865602d3d5bfab3dfd4a13d9127075dada545d9254dd39cad08661ee1891
-40da958aa1d7f9ffbc5d2bc6f8c13a54a4137bee3472955875df9643c71aaf89
-cc4d0b34313ad78fb100347e9a6ba236bffda2c9120f728f7f9dc24475885a7c
-6d647b40e380ff8772532f649a0a8af8d5d577a75548cc53bd93b2d94975bd82
-6058f644a247ddb8af1bf9169b39afa10d810842992d9503e869439b08958f75
-f255cf86e4943cca9ff8190955c4bbe52a22db1d33b38a8ceb231f25fe67d7d7
-1451d378083f32232c5f1f46a654d87705fe42be37f24130ddffc294ffa72d63
-3bf863e3668310562dcf82853af99ab19d16e015a5c52f718dbf998e20316811
-988fbd4e96bb4532e180f9f76e7089f7d15ad1530ab7e3b6a833c4ff4ac9a86d
-41c91a98c6f20c27d816b5cd07924e3dc3528f7cb3922500189f429ca8568af1
-fe89130ebd9c11860be49ad45643ec0d18993fdc9b0e50a166ff04b409a9bc3d
-99215881c09d26949749cf7ca37b0b89457d3b392cb44aab689fd25ba7b5bad7
-06257de81cb1c50d2b283726b050d1ae03fa491189c8b9fc1b22b373dd70e86b
-1d40de563ed4a3a80579255ef9dcddd6853c8a757957ce2907a0cec4e94fc5a5
-9641afbd3cde23d6a31dc99bf9180c35393e8e6fa092f5e0a5e215c618a6eb9d
-421d9eb8087fc539daf2b707856d59c049b650c264105d2eaf3c5c383b8c9665
-7a53e3aca0f93395f70a078369facc3cfcc8b17367e6d88887b4297644309b12
-8f4116185b756509d9df731553beb42e51e78953a7d9fb81f5dc3a149de0adde
-c7f7f517410f474c218cda7880bb53eb0b27d0e3903e1d50d641aaf4c510e03a
-4a0862d2205572130f86502a4fac7ba66e5ded860eb07cfc0d90e908eb7c74b1
-334d1783a3111f249055e620b622a4600224a38ef5ce99fa6689aa9fdd5fa97a
-f90e3c3d0b44a0090b840404686ad0825117bf9fa688c989597039238cb3bbec
-a709d680b9277d87eeffffbc5c21e8b667f1c3830c6feec3046e70b3f46431e8
-0fd084aa78463ecb7e4dcc7b73c046236372f8701397244950dfded1274ef63a
-74b45676af1f34b40a82def94255003583bb3845e92f656d0c553155016ad73c
-21c9b41d25876b01e1592384222e6c8af08f3bce00c1785aaeaff39fac59771f
-858c044ba0a298866bcd42fa82d6e2b1d947d922597892eb38dc8bf3cea0b556
-80d643f58644c80d55b64ed144a03f6a9b2b5471c685c8656f3c19756adbe22b
-be33a8f9b37e9b3bcb84c13171abc2acfd73fe7f20a8f6ece9ad9de3c8a08e75
-670425356ddca1f26aa9afc9f31de830373c71213d2b84c29fe667ab899df5fb
-9f0b5102556158112a095ba239a299b20056c981c17f2c06614a1a0862f084bb
-f420bd958d1d458169124d68c5299d9b35464588e192386347aece5e2a48ba84
-43213219c87812647a9410d34cca55a0a62bbab770ca79b6959dead30f6b5451
-8a20a077406e39d2d126b7e13375104a1ed7239b95a9443b95dc24079d0f149b
-08123838d5c21cb3e8d9fe656c5736306bdd4bb5c88393610947253ad725952e
-7d9b776ebcb6617e74de8e9c62dae3e081078a04c492c4a35f303e0f600d7d34
-eb629dee4f5531f86916dfbbdd1fb9f6b1e385afd3dae0cb6c15f45ee49911ef
-2a8e2ddc4c5e1570f512303d94907fd941bd7f7a053a42f990e7f25fb6f8d1ed
-e7d401ea0e4d3405ef89d47416aa7d24dee907fcdd88cb2ab09ef07261f45f78
-733903e89215d7acd1df74ba26056f5c7d3d0ac61d2718d984c022179c98c658
-4405af27a3c9863f1c8278dbde150addbdd057d5e11587ca2ba42c1e6b422932
-6bd7314e190103af64a33794b3ed12d8023483e8d17ee4f8c0bbef5c9b78e2e4
-f350c487df51e966f985b5ee5da43991da55362f6326324c77ae53d320326ff6
-202a089c8d8aa68c588ad9c82768c1f889615ec5b6ac79f75d95641a500a499f
-1b57a6758c9da836b7124af1d37ee04cf01478edecc008521831381f6225f593
-f371fd87ec832bc3bd853d579a20244c3030b0eb0db3191d900b654f1067b0e2
-d2a07232d032b264aeab347be9abd0d2a07b6caf85ecd57ec87ee34ea40733e0
-94dc88246eb7fe89c751326de8c008fd1b55e2cb07f3b6a08f7a0041540c7d68
-fbc4ece7a2d0184629adc0cfa77ac198901aa5a1479f1dc97a0b3ab87458e1fa
-4704290fc5a744412454a2d3677d9d7565a97eee239a5c5f7eb94793899cfcd7
-2566835d9998e772fb3afd9673b3c74f4bbd339095f2f71c93458484bafe9741
-a1a65b3e15ca5045fbdfabec1723ebbd4e7ab85cdac37df2141af2095e0e16ec
-bad6fe620d2e1b874c4e3bdc34f656e9604c6e33cfab4438324b8958c8a7528a
-4404b2b8aec31bb0420887f4a6f3c3866e370b1466526937851f6851865b23f0
-0245a38682f68990351c12f34e63aa96d729828bab71327b29eb1a96f30c36f7
-65d4cfbe0769864f4a46f037d2798279f914b8b2ae86acf94385c79db5095b86
-d684a976dc1e662c6e02ce94e69fd20a9960c304626aba2a113766c5923dd7fd
-fccbb999567520ff855248bf8377f01ef9dbd6ed1511581b3468d11e73ec622f
-6dfc289cc17026fb10143d870b68e32e6f84d19567e177fd4a48a6f003591c1a
-83fcd03148ba9f32e6ea26fb33e2b7626620acdca5b302caf98dc6cbe8f93d09
-a877d7cca4d52d75f4f39ce9a17aba04fea7707c097f5a8c50657ade42c5adc0
-76d6ecd980b068651e8d4c630827e0226343c57b39d782faa3f9004585cba68c
-ece0430f332e4501d2ca668145020181263aec4a988db312995df391c9638619
-6ee6d1810a9731cdba8632772f844feb41e34e7d046c13f3346b1b4af62f6f8e
-da0026e5b306830c0aaea5f3b91eadc7ff9108008fc1081e0371b08fea45ad38
-ea17df8a9d1b7194f1ae2819a2c1fc1b46fd054f5b98b84e4b221a7c50ccf1ba
-c995d85664cf8646e2e5880d847f532736d4de8c9fdc2f91be71d89b062d2246
-ceeab03bfa0f8e5e3ca581e958a8ccea868216178925614309f2ccb1616c44b1
-bf772125753fae57762c8a617e6da4d716aa20a762316bd91bdd080a30cd8751
-7462a59f7a90200980e620811ae9cdb8903887effe20061f3558ab479f365a06
-2a8cb74720631f690dea945f6149a4e010e73ec5937c180fd71e68fdd9f4b101
-0ef804407a9b2a375a5d742ca4126b102496c02a6f0630a4ee91089a2beef12b
-97f7a7ccf7c2c751aee789ea80cb91291eb2dfc2855fd792bc858a9a0df22e09
-19f5158f584771d9446bfd864fba50582ed52644eb80cbc73b37fe9f8e4f8ca8
-de234351e56df85ea853fc6bd27f5b4f0c1d45cab7dc0aaba49585f3d2e1086c
-1f002a8a6585816270be2953a6e6bbe0accd129e201423582909b00d7bb2c73f
-c2296a4769da723f979915a82363a457b814d97a2315dc448d3017681175b6d9
-2184936f9784d753644575d5ce4f499047871e30c84263722460ade708d0c2ba
-e7998af8194e6d041ceccf6c7ed6d937322b860081a165bf69be1b47490453ff
-0e2aa9f0c08c1856c53015152850b8cba83cb82ac6d21730ac9e00919e78f994
-0a14c2be0065b65351a4d130612afe42c09567c277dafd4e74bfef17c252ba7a
-e0e8480f0e184c93e34552d4fffa5e427fde368d6b1583581858081613e9074b
-a2d0ebc6965254a4d5dce59ca92a857873bda1575899839af87f456faba850e9
-16d06d3df6931f04330fb719a8cc91ecd28821bed1e993863cf9ea95d9e03c7c
-b67490ae6a05e0ca47da8d6d7777ff553477a949fb16864ed0ced4613dcd5e73
-5517d0eeb3b86b5892efd3f91b7a1d9eb11ab7bb7feb32f54a1e63788f3a4854
-a4e16f8e81459838f341e5d288d25ec470c18c29f8e5d449bdd29e40244332a0
-4ad3233d92beb334520f1285aa1b11d8f844d33ffb74edeb98de1923c0ac07f1
-92b887d19a423ffdb409def765678047b774d040f771a6b7b675814b63011cf5
-0584368a865b6cfcb4b124d79d7283df63d601795bf5ef80b747d3dc23276610
-46cc26d90ecb0f3261d1750958bf19925e4962cd95d10824a47cf1406e8881ed
-1bc5dee966ebb033a5af7a74d7183117b380fb848d4d5890faf6691e9bc3d0b8
-ee3edef892a29942544e1cc7bc2017ce7642c6eef265c916a011c4dc8fe47b45
-3e338d4655572c220bb50a1a05df970834ac6d0b91a86cc416eec40de3cf50c7
-0caa0b554698fae5fc76e5073a9ef47b6d739a8ee52758b82811811e32aff60d
-d474cfeb8ddaf5cd242c7a8e7747602aaad0de7f1124194eb3e30c060d3476fb
-43d520389df0b15c44007dc97245ca41f3e5b8fe0b283a1e238b57774472b73a
-da0ad5b739c912e42864f1ca568e7f8b3c7525ab752db196b35937a509e24596
-73ebd59d66a82daefc60b87f8e21a2bc4e85a5bb2f858a5cba43eb83f54bbcf8
-d85731024babb818063e68ebb3a7e0978b45fd02b7f3734777683cda727312ac
-b54f2606bebfe66499dbd8738fcad5b26e749a8806b7116ba138442bb85f55fd
-49049434878537165f2c573241b1c1a56a0f961cfb5a269556f3eabcb41b09bf
-0966d4cb4a0f3682c212e251310347a2b6bbb258f346d71dc4de399a4bc5529a
-dabbe008d511ede8a302a407c7a4095739c505f1fa1f7a51de21b542f23d5287
-2e8ed319d7e867282a407ab35b5ebbc72d96a4cc6d6cf8322d92a82c5ce488e6
-f7a90ca6f5f9b9972e29526031f9d5ff881bf951e0aa40c6b05d8651385c7eea
-48ca375b3f06732322f3259a5f92206755336a2579040d6768c85c4ca0afc4e1
-d28eab5d5f1ddb7d5d4f1a3b3b2b01cae132f4c0731e44f103abd7cdcd0d61d0
-8fccabb2471b66249c4ffc31711013cda5de95918cc50daec85398288439c7e1
-9a2196bc68ad745adc5fd398c3189c574380df2c2e4486a40817c23a81f3f316
-26825bef951991a1208cdb551d300ed38886ae677713f4b9d4092c9e9c76e5ea
-22f1ec6be10e62200f4f9f591fa0255f249739dc710de9addaa9d34ee904641c
-9bcbe6e79a6e4484fc6d0086ec2afa5b8b1926df580af637e73bf126680f9e49
-6e5bb8c21d6a428e77521156f78430ed51dc2e33284f88d78ce909fb940ceaae
-0a07dda0d9739b8a3d2a304c2d9f8cb443d4d4d6fc3047842cda21c0b0073e0b
-b52f5e1b7ddc2048fa9f67486e2496e0fd2d09ce80730d5f7d0f7e0ed91b6bf1
-87683b6f62f263c10b36b01ffe6fb601327450cd5a4cd8ef322277f942bb2567
-0b358456c29fe2f529d334d5db6245c1e8336b29af092689764cb1a19276d9e3
-2b4b77f0a1c3313421c89801f2c2ef5f75169fc2b3a98b69519c9a7c46b40148
-d474e7a98f7fa7cdb85c471fb1171da6de14027baf64315142b75f677ce7a413
-6466f817519848f9b9aad66b34e3be10e7fafc53571da25ea3b449d7929ec079
-bb4c3f6d513b9174a49bf5500a5272fba2d95362a562339eef996944951e61b7
-38beece89882bbc5580b7622f84adcd3b460828aada98e5cf6789dae52a41ecd
-7ab5fcd2dfe6aa11cfe66d6366672c46ef3140f2e0657da447a4dc2f855895ac
-b5a79d11a9e45aa7a457c11b4df4ad291f25a925e4a01dc7a64f848c64f2a739
-bffb51c2531e6717dea38da478ce0c932a3f9f856cbd2aaa1e148a0692a92642
-9d77254e7adf8aecd46a8626b7a31442e2046b9532817d285469f59d971bd398
-b6971a38e6d44f31cc46e3f48f10722641905d7ce093f5ae90fc6a56e53ac90f
-7f1cdf1ddcac29bc60d3202de837fc9d659e30cfd707ceb5453028d1199a8a6d
-87af5bab407c0a78c571e01020560bf1c77936521405c28cf79514579b017733
-70470f68de4e7667237065ece8e2e9bfe2b5d3df69a0bfd8b17ffb8254aac5f1
-d7a8c51d3f93947f7779f368c71c343159eac60c5a671f81cbf2ba05626f91d2
-aa7887e41804f5961b341a5d06b849cb52676311c81739a96d5da0d480cab2a8
-ecdfe115dab597f553767e59cf392a536dcc9d52ce25c424a9b840fbe6413361
-ef591c196e6fd7954ddfa457e7cbb9d5fc00c45d1ea21184f29291c54c353ffe
-59d19239224f9de9f6595d5fb5279fd19278e93b366cefa22b41750cbf2e03bd
-7b8bec58170e6d3c276f8dd4ccc99885a5582ba4ed5253a17910580a7195d775
-6e10c5608e2499df08572d1fcc0ea139beb4f0bffa5e18f7c1c17ecd20a9e400
-95e2d469da5d9403dbf146aab0a04ced94b508bed89375c6253424f6fcb2afc2
-a8019b6fc866646c1b54c32858992abf31da24399f89ead105a4056526d52965
-289830fb4bac1b0cb6a629104dfccae1a688563a271da0927cf2a644274d2a3f
-f90e5c1845205ff935fce3a7633cb8f14e01167b6a0368d2a2e8f072c1bbc6a7
-d6f441ab6d23cb3111d8ca1634cd58dfb4d704c5aac7dc2df32ef43c0fc490bf
-86592326f415cb9c543563e6c2204aa0e58eb42163bd9d7209899abe51946f7e
-7505e6491711e10d5d125fad62e34fd2e08a0ed0028fb0234768f7948ba2626e
-d037619703b922ef43225732aa509b580e92bf5adb3979bd8489d5a50a132b7a
-685b271c2facb092739061b8ff4f49b2253db3e10839827fc99498d5a44a5806
-8d9962908f92343b87f44a8bb92fe1830c362d29f990e861461210113ff1ab0a
-55436ddc38db4bf16131d9d96784f3165fcd0058401dbec514749dad00b6af4f
-73afb28ba5b5ff1a023cb318fce617f5f55eeb0bab7c5bf819edf6a7f81d38a5
-d75355916dcce33cf2b8e771f9730b385c646555b1137e9416c70d5f860a6138
-7d131a9d8acdbe4663772c07722c4e4bc85451fefd08dfccaba1c8f3c251cd09
-3fa5a333877d32ff4d2ce359e6aa47dac276bce065cbb7b50c0e3add00f41c6d
-be9778dc241411d1f9e934be7934c6506686ce7c8d619490f2a3f065ca6f213d
-9b173efd5541375438e9c6e58d664e8a61aa1f646be623688b1934fbad34b627
-2e1e5614345e8e42ef1456785fd526f21078798a49b61c106e23678f1f593c0e
-1ee8c5561147fa5bf38847b982228952ca06cf4549e210ddb6e37cc2921f98dc
-162b175bcddbd5b8ad6c58d59ec66c5e118d919ea48e81cde2c17149ab133d78
-e1f45f4c5d931f09526310f2bd8f0233fed3a6a64be805d626115b35b0b5b39e
-9cda7b197fec956504ccd72b71a29e9526a544957068c9b7ed6fe04255444d01
-2ecb4f59707fb4cc4a1636c37f9b94d0eec7fc12b70a3e88c7325c5524a5fdae
-bc4307a8ee518fb10801bb3ba4e17a2931b5596155171765fcca938fffb35693
-82e0b69a88235c65631e4072e3fff4b3f00a06624db945db691e97986357a509
-5410d64bac2774999f960f332c9050bee455f229061ed099eae00dfc3fb9724d
-ac85ac49b79a19410649f06099df677b8d0b39c4c7dc52e0aeb1d35baab7319c
-f16795131e2a6d83b4f30fa42d7057ff9030c348327c91f1a780209ae58ebbe4
-188d8ef5e354491d38bfaa4626736cce69132d6b1e71f0962644dc09ad793dbb
-368a8e4cffc7a8cb1697ea1b85f5eb9a831458c968ed6b860c344b928d182afb
-677a88a431acf29e76053bd900e3fcafe19cf96146b492cb0b046fc4388c326e
-1f5ba7f4f9b738c11af96f86cab033b8212716766c1d64675a52c304be62b163
-fa483e426fa8a8066bf82180f77909029eb1063b861ff73dffe14fbf7a25cd7d
-73a33d520f6349b76459f83ba004fb60e3dc4e50b4306fdb870f29cd7044d6cb
-20d345621ec5ea26ae9ea8e66dd198087e51e8ee972f6435b82f635c83fb4d95
-585e1f88829beeca19a6ea42157c10f703ae52b0c0df309a4634314327ee3ece
-2ce41c7dd423345ee25bb7f64f5b300002e11463baf80547ecadebca51b18156
-09c7e479883cd404756e73cc8411dff1dad55e88757314f155bf1eedfa94d1c8
-7806e41cbc3d89eec743c50aee90d6b69bea9de11684c85ea5d0a64cff534085
-f180ce75bd623afe1e08ff4fc4902d88f769e1b3221831f7559867e35137fba3
-773f7bf4977cc27997b9da44e1799353cdd563c88d067b13279752179752ad5a
-68f300640de27cf42c42c5e235f5d7d8b345ccd63bee391206499bee8304ea0a
-591ff1b118171c51ba62ececf66006f78d1c56415178b9c144ac2e83457126c0
-cc7266234abbc4c1ff4ee17fc352e9bc830aba16351a937cf1304173f0aa12a9
-f79575ba5e45e6c14b93d7a34001b29df1ceb73cae7fca7f34078f99a72357a5
-c7b040f377b8dbe90bdcced28f5363526bf14f0ecf89c919d53f4c3653528b79
-8dfc4b4244f2d9747e09ce16fba69911dad746356ab3f2db59e871b21b10939e
-ec4fe4d11b49055c5cdf81f37a0484978dd312eccd5e95d5ef7ba378196396b6
-cc3b51de1e27035f62fab5d507b5a95493e2ae54a6b600d1727db436933ec9f1
-1f01d50b0c645e8dfa94f43b15c47b2348c3c387010989bc4d0f7401a024d351
-0914708a6015b66af6f255efc2b86a535806de1fa9520889f566d000bd185ee0
-9dc171fe42079ac3c342ba13607bced1ecb521827c465f83ffd8d45d50a69a34
-8b1f0d3a524776641483ece863bc262f470c3e603b380c92dc8e5e4319428fa0
-a5a8cad19c001868977d6c36c49eec7a4e3068507b075b8071ac787db8a6d3a4
-3b290f01b24b0fce5c77ada9b89704a5fd3de6f5e8eabbc2c51daf3727b9474b
-8e2f4aecd0433e0ffd20671d68f64254db38847ecaa7b118bdf0ba25de5c45c5
-1815d08c82c6ba3dee113d34a1fde725ba8aa8fc05c607487b703c1ef2ab05e5
-575602cc6558f7620e43450f7f508e029693498e2728e4b62571e36e02360964
-62a9579264eb4baf12402284f0bf498d116da62e81d6d3b11c5fd8b0231d3c5d
-009a3b0a5506f2c5ff195923a8dbf04768655e63b48d22ebeb97f8e416925e76
-3bda061a1593c0233ac9c058b5ff5b6f483cbbaa4bac15d89f3093909a4d50e8
-a1f61bb76007205d4abd546628cb3d17202cad80f851ee95567cb313e3155258
-23459f6c8b3f02f7e1cdd1499eb58c0128b83c9086eef4e1479a915e75e06905
-f08ba8678f8ba2dda7a15a5461568c2a44e100e078fb41b49bf2e34a35774c59
-cbc642f03830c29c73c8c8334f7f0b8ae263235dd2acf4325973ae353194c10b
-a4d017e0d61602715e8a7a3fc90adb659da741a39b2dedb707d5446cf0a12997
-f5df3044fffb50bc9b40c0f551ca4f7b012bfb033e6324dd071372e93cef41b3
-8e29dc94fb145e8c080ca7e606dbca4b292ae98bdee61041e733140c638de3d5
-2e49482c182b75d5d1ea2a27cd8c40926b7aec98d97d80547fe840d1ce753797
-e8f903f0c59f5390823e6a15941a55af60a6b0f82423ca76acb3b0e27bf4998c
-2d35e08c4bd4534f0b43facc2b994775ab7c84903605358015445ab8649c8213
-8b1ef913b3c9a3d46d4d9c863c07ea43ef77f04fa4c91f238a5ddbed49629e62
-a4c84190f9ff58575dcf46392c0db97a225d99dc1e7ace1376ac9f20ceae14c1
-8372673772db403747b6067992238fcd257cdc9961f30cea0bc096c77936bc96
-51e8529f52175ddbfce202f38ef4bad1e437fa76c8801b7569c347cc9497bdfb
-d693d6f46e66aeeeee2f2b0d4d1784234064ff0f63a730d0c0c80669ec5b7ad2
-3e68a361a69b4de9663426606cecfd2b13171f3e1f8d278240803a0f9aa067e7
-24170d8ad2f4850e1cbf01f0460561a2d06b32c891f15727fb139ed20fe35875
-b04b174e9292b2be4f30f2fb783c2e35f6a47e5626ec3539c0ca7c78a8c65fad
-8255c95360855297e5baa060b4d0821ba56c95db62f42d5aafe040ab927d6e6b
-a50de0a1fe6c404bc445cd13d1ef1f6f9ac1591d174687f4d5e4b80f8c57f1ee
-e2ca56e6b71ee222fc3b75d9c8275b5ae804c530bcbaf814543b53b3cc333184
-f259717a387c6517e31cdff3742506dd3fdfac9e86a00d15ab09c2f381029609
-d34f14fd5a799f1460472115d8452882d250b72325f273261ee8cbd06dccd1e9
-88aa035ba584ef6062046704f0ce3b19eebb71ec933a174be1087f7e763e13c4
-fcd95a51745025643ba2ec4ebf6e7d08cc2661b38bdd189b68d4f5057cc1afec
-bd5920178b7ec3bf3073716bbefbc0fb0fff6dd56b32995245eaab7d686d61ce
-cf8d35d7ced60e1d8583a27803cc31eac0dba9dd35ac730304c057bc81ecd5b9
-9a7eba791852d17300c6253de776cc756614eea68c940d787656887930b9c38b
-74ebcd963254a3a116f15fd5e0568deb54dd076760fefc82e43ab8caf157f2a1
-0934ab492ba04b727b4a12380d8620ecb36b234ec23ea06e1c01b0ba6172c505
-b5fdfc5e1808c9050c8a9835859d97e4c626d48a3a26e077b86970a4a4f1f924
-2e056404c1c3c750c7e6de295c6b9eee36f1ebf4b7813d335144884068f1d8e8
-adb020e3f5971f627fe12b6c4d39e56be8cfc9855ac76493ed4994e9be17c9cc
-3464585754dddb9e577dcda000fee128090977165fb6bec6e90827bf7902a887
-ae02126496ffb08eb85095cdb4e5cf63afde1a5a5948793b163feffd60cfb9f8
-428ecf3bb84679c18356122b74ae5efd381d63e496750bbd3f294c55c4306df8
-4c4c5bc4d7e7aadd52704b1cc066bdff579ad4aa3dda718db17819884ff48c16
-18a6fc03cf9954436d24005f7d0975d8aa864660aa30d3bb3ca001ace7b6a0b8
-f115b6fe459915616304ec5fbdfccb656da02cae21b5802a9dcf20ae0e06c5cd
-fe92aa4bf2be74a17f7f8f2b338d3a53600248bd394982f97239089f5b7c6c8e
-de8339b8d17adf2ce3cbefccd4e6a6daf5d4881131330c1eb4c0ade5276dd50f
-2b0b4fc97ff5b6c887fe7bf378f58e5dce3d85b98a4a9fa335438158ee3cf58a
-f17b2a4553afa66043e146652c23a69e6f6f747ea368637d4e1003b4251a43ff
-71c4b12f7e2dd6848cb84316b9ccdb4fb282615f89384717a5016a0660adfca4
-7e9545b2182f553d14660f38ea41d327250ee94d9d1a23d0b395303295a6de00
-312ff97e49ccdde1359cf3d098e7ec51df6e7487b4f9b94a69330ec7885a90a7
-b294a8e5ef7e99aaca70ef8531bb8951fa70d28f8e94216ae8c54d03d5fb5766
-b08a89c1786affcc5b771581ba4ca4040bdcb201262985482c346fb3a00b5a38
-332ba95e627431fbcd2811018044d8fd34192c775a0025868c41c34619cdc4c3
-e07c62ff21e9b53ad927b473643185eff0e0af5dbba7a79cf8b2cce506c0f18e
-a3f8e23a4eff5c581bcbc6dddf0442780c00346859988f464557207c2f3d79ae
-830f86148daa52cad0fd0e768fdfddb665f046960da31f389460790c645fc65f
-ae80feb3ac5e96c07267175b41d80b79f8bf05eb5905aa917dd65a95b3b90b62
-5e692400b6bcba9c60df3de780ea6c3d39c3702a4d0fc899e26d5466c3ce7924
-60529634d54e61a992d907923ea6a831f94b1be0a311abc904dab3e0d71e9d9e
-4d87d50e6d99e03b54501fc78c3f57de92f6c336cbdee2f4c03728cdedaae12b
-1e28a0160cc0bbe6b332e5e0442763dda2701556c351c4f81ef3059b06804a1a
-da267bd5e1e0846e23f8472740f0260c9d5c82daacdc931190e7f10011a6f718
-80218742749e3493db5f64b500e53dbb333a87926b413444c0db7b39cfeb12a2
-8d4a45e223e651ea6e6c65f5b1c89d4debbc133c226c27f7d8638a4af9803b72
-e29c308e2c4bffd6285910b9968dd1eaaedaa84f335173fdfb51593384a9d128
-3e2e49c3d722e825f67c77b9bbf2ca5e19e64bd7dc212b7f512ac8835fabe249
-89a19f724e474456b6aaf6b0cfb951d3a522510b5556fe6ac1d993f1ad0ab9ef
-1d29ab40b6bbf4b8c1eb90db2220f3944f6a70f7dab210e0d2bdda392b85522c
-079843ab8d38903c54f2354520cea0a4c1f4d60d2b6d6bf97b9b657982d5d3c8
-4a60ac668bc365240bbe4b5c17ce2c64a1f2afdb01997851f7c405139b3e4c55
-eb2d2a9aee9d4ca05b3d11066167f4bbb75ad5bf8f35813c1692fc2338f70a78
-efd212989488b031ff8239c56ab9c65f96940e45422ec9f721cee7bb73be2a08
-5921862a0a039d658534931865e17607e35372e501562f074a8d7c2366faf616
-0e47317e3667b2abbec7be0a3dc640b0bbc7336db58de5ba26f1f1e910adb1e8
-5172e182308e9fac6a50cbee3e5e22c21026bc31a8ea05577a5aaae1ca049f43
-a9f930ff5994abde44ed4c5cdc4139d1687f30f2b414e106dda8c246a54497c5
-1e9aaaa4d3e2c35a13a3350514544c4096e4ef17510d59eec945a7825f560b98
-c96f5a51e05bcb8878a6187b607f135c69f1dcd1fdf7a88c60da3116c5e46ded
-2238210eee6bf3872c8b95e0e70ba4d7194d4aa51b356e060e2ec150cc9a666f
-4942009188b80f3ed33481d8b754a3e7f69b1913ad6c7a1807bf05c5c7f06f84
-5ea967d0cfdb1ccd8cf14a02183f1e8ee7c20aec2ad2d4882028df0e165fdfa9
-c06159026bcde2f858d7358819795d5460a464cfd3fe23bda12f4096b62d2039
-4be06a2b4b08f94aed653608dd59684cc9d5585a9ed606e2aa9cfa7191badfa1
-fe20e83d01f42f06e8431ed876381326e2a31c230aa834169a18e92a9ef20b98
-0c96bf695b7771aae13d335733c96dd8541b5a6e3c7777093955f598246d135e
-ee64474ada3f017cfed068c9f3115921276f1a95a1a2162f2eefffbcef0c3aa8
-e36f8c45889f3757b51af242c64fbc3d2c04574822487e014daa342ffbb8e1c5
-f0b7c0ad1eaea5bb5dd6b9b36f661e029001b40845d011dce1a9188718384933
-c0d3ec74eb27768cb5dc08f86b7914e2fb3f2b717a1f330c29d91e89888d83d2
-2f1d6d4531109a10f3b869377422cac3d2f89c0390b940321a8d0dc7f343b56f
-a417206882526ea43ffd467c2aa969cd80a09a9eafa0a103c8f8206178749c1f
-549a3393c1deda03623924281f806d8ed881ab7135903e993baad767de650fb5
-17615ef40209ce1ac15201fe094b32dc870208c0dd032ab639d4ce4b8b1e2a76
-ff3eb9f0472ad1bac009e3e9ccad32eeadc5047c8c80aeda16a946b558a4fc83
-6f8b9a897b415920a946bf2c81e2d9421ee21cefcbcc7f9ca6a8242d47d495c2
-158531ce2831f5da195954f10fa375d24d7e4e6a92af21972e02696780333cc1
-ae4b6c6bd8f43fbf196b2f7bf2f2f277e628e959dd51bbfec1d654fe7220f252
-cee9a500071f202a8567b6137551de985d5b0beb267d044c091a2e5066a0039b
-bfb96bb94cbf04dd2fbf7700f42b68c9be0eeac34915c212d5cc6c781c89af77
-9e5acd11d425c13239fa07f0e28f2447d63109d16f909515389fdeb76c930791
-9c4d10959b0b63b39f49af938f109e45e62d2e46abb44a873f291eb4d078dcbd
-c852cbb032ab7533ac8d651cba2f1429532122ff08967da9fbab8eb8e927d718
-136da194ce2a6433d6b92b441a4a9d06577c7c8cb4cd740f5cd83ebe74fde770
-229f7f090351a048893d43330247ac80afc9b28f7729287d54ed1fec1731a198
-a0642b50adcbfc5f9fc5dc00ceac0b4ef68f16cf5c5cdfc5c047ac5cdc26c357
-d8d9a6340846bbb4dc81966b4e54a550ed425b260da1b45a4905e6cd1014f197
-495ccb262aeb75b56377dac775b5ecfdc123eaebb617c48224c1e3276e453867
-65102b0313aa262d358566c9d518ba3c67692881747954e9e87e7900629fb73f
-56537924923a4aec74cffaa5f32b4fb2fc0eb5c599d80991c02f1369721cef28
-dbb86f5c67f9ee5bd42ce86dca1872a382038926277a1b7d690ad7ff52945536
-32db74e9a632a5554221871082e4c33d36f5b0d225f0f75286d8b117e7d2d3b5
-7c334aaefca81df6d585b767004b6bc0fcdfd7296e8225b3af501a5e6ca4b3cc
-3363da4c203513fc473bcf178c48a71e9fb1feb2d86d815d0c684daa1b2cef8b
-7a17ac40531b319250803d658ee867e7beb632307701626d55460946c478ec2d
-55e7f3f71c059816372a7ac7110bb97f6e86a782ea114b0adae033b89455d3e8
-19fe495b155971f926b139f8d003b9fc9c1e612d61508ec2fd4832740b47c14f
-b1f194c3e440e9fa435494135b6af2d9aa706b7516ff853dc3f13c57862d7406
-63efe646cf15a3a54823e9302d870204e8694857f5ab8b8152f6c5332997975d
-2bbc57e321c4f328ba2158850cd40a6227a64195817575c017f5fa090ae0556b
-a7665849a46ff51b36263392d22734551a6c2a4faf5159ab2ad481825fb666d5
-653006265ee72e32c8230e733788428c7a8bbf821a8c8ec41b2b7ab77142b626
-1951cb548c93955bd2b0bbac1b460b1f490a2b6711471bc33e10d412ef004577
-49760ee95cd989440f59f188458fbadc10780dcd6b76633f3f60689ccff06f4a
-ac24d19a052d25bb5247624e1251329b9f6e9200785faf56efc7955ba7dadfc3
-4bccb712a5ec29503cc890f16f14be12c9a98d27c4ad4ae7fe0feb05aba081ba
-004391f5cd198e418654fd240d523ef4df055eec36029723b311bf07c3388116
-bf4da3aa56d5b9e3330aab618736d2a5029387a472b437947e2b9029e05b0218
-912afd8d21d5aaabb3135ab311778262455f2a559e166f48506dab27e0ca87a5
-315d30aff6499bdee67e4137347133a9edbee671d6dfa01ab4959858b2c1fac4
-5aca951a3a87f45fb859d7c7921deaf989a56f12c09a899d5e2c20746d44c380
-a88c5b06697083996c3d7690fe1c268e772a68651fc36936a36ea4ce8dc9057c
-05f0a51898a7bb4b5045e2a58cea600491f21a09161ba7866e8d7f2d59d502b8
-ee2bb74404d02a92962d3c04a05659daba8ed04d8d92f2951863d67ba045f217
-bbb3f09bdcd2676bc970c34337695d053c6bbcbed78315ae82270b4aabf8f3f5
-8826a965b7ee29e3e6c13bb4213b28b0877a91145153f09ef866dfa1831481cd
-87df5322e6464ddf257908a35d2b49a3f41a5767f14f5ca17c0be3ff13a8bedf
-d59283abf933f33d7b0db0bc4d95c903fb422fd3b82c6ae88591d6fb3eddb7ab
-3966850a8bed62c957170fb89607fe22aaefddb22414ff7a55ab50d5f151d86e
-600889da55834432fe74afccc7be5f16a6c63262d5a788b3fdcd7ae98fe4f3e0
-a3ec297ffbb9d0875ffaa52ceb8894ddfa269df08d786a0e29102bf5a8d58d90
-293ea4e6f9d50bf4e7f19c10d805dd5de75770129639be680e06f25be7d07b40
-4001eb64a6b74e701782b42eb03c689d9b9327fd7fcbd0925f95630d3336cb5b
-789388b17aee7e3616e43f935f30608c02acdfba2487664865f998c5fbbe6a2d
-ed471586c5e68d4beeb65597c9ce368b494983548ec6fa4b15c556415bc15b27
-8186864315427c9aef3c102193c013b424e6ed789dbb0d21d75ce2afd3d9d8f6
-52f158edffb99e4e38b6df1ce9421e7eb130dfd305b5f9d88a94fd645a7a5669
-a5a2f447f3f1ed95ba822bbe972e4ab9b75e03094c3f23163385fc551050b982
-9b059a5a530f4ccd5eb0d4ba98f003f95c8f90210012830b76c89792d1898b9a
-76c0308878786c3fd23199701f383b986c8f5cdd99fc86223b3d4cfb39587800
-35d33a7e56428ba3cae9283aab4d5280d952d5d028299d958dac4a23fce6ffb7
-7cca4d88a720d5d47fb2cdcd69a1829235fffc728d6a4b98dd2aae73bc163263
-ec6356d0d9a909a512735263a1ab810296026a7b0141ca44afde4632c5e31f87
-116869aeef9626d5786ed2d25ab3a1cb3adad4beb38bb5e3197f18b678e3f5b3
-8923c5405121f0433167b3f8651877974ccc784d92d9bfdef8205f6cabb2da97
-5e2871b2a0acd7c5d4998f942af4d67d84233aa6ea1d54c8570c3eedb76b0907
-e50d67404fee83fd79623f0599eccfde0fb9c7e8dbd87baecf9cf68aa07992e0
-8ca55e5acb1948f6478102ede178577b1ecf8eb4851742c25a20c39a12774513
-dac23ac5b53be148a4bb4c80d55b273b58a7279220c377b25920c4d89a6544f5
-f73204ab88bf1ed0f9fb756d28696ba1b3ca2ddb292115cefbeb71feb75b1427
-12c238c978bebbb9584c63fc9afde0b2ce3a6ec8e8818b040588187e3f03f1f7
-d01da8632a8b74347ac40b419da45c6cbb9d76c66a97caa79e44dd5803d898f4
-a3f22409aa49c0a837b47004ca324a59ab3ca4d4b8c23f8cbf99fd72ddc1ec46
-205826b8ae3313675fb819e3d62a7a356e68f5b65dca8fc54e98982d9528a279
-7fce2ccf3eed85944bf571173c63b0911f1a34a2badcd67fb385468cc9d243ee
-f66aac6e15ed9add917ec73497ab853675c7721a1a767bc75ddd2a959e95b06c
-81d92ef8773b221334525fa10ce0829551bc0713d1cf062908c439448b56cb3b
-526742103abaa9e254d573728e902bd053a9c3cf044a99e509cb73b8d14a8dba
-05492c2dd922b7f30c120fc1159e6f442cab60ae23895d0318254e5b07381e5b
-1a2eac1bd664a9cb018a0c68b407dd84b17c21457e0c2501662f434ee592c6de
-8bbe5fb8aa2b88f398b2ab790bf10431abe91de30452704ebfb4450b90a99664
-1924960ae32615374b33dfb3669569b69cc60cef0178c38151c17887e3b7708c
-e0a473b3edc9aca81506cc0962786ecfb6333d51cf3c3d01a4f4ea20cfab0b75
-408887aa9cfc740ca661a7edd6af8e0b17ab5713165286d2ce1882ba9302e5e5
-9f02527ded5011eabd72ce5ff1f12350d4e5130a990857e9676ac998dfbc4351
-800e309e314cf6dcf3750f3bb5467fb72de0b3afab584e4915ba93233c5e513f
-d2f63bee7721881aa14a331c979028d7c20889115d626772b465ea0d9fc0c775
-b5edbc3f3e27edd6b46ab8c3a76b0245e14b755a308ef25a8dad6d9cdd64b890
-e169114fb7e06afe3b91ed8071c91235b25d4969ec9f03c1452d22b1ff2137ef
-bd3d7b465154a1966f9b203e94c3f136a92faec041f74af4470cb54208ea6ab6
-c92560f542b85dd9f9b31e8ee2b5ccbe4ce674dd9be8492a161d646b77cbeb49
-aa5244cc402524caabf499c8f2192cc1a9fd5517105999a0338a3648ca03f9b1
-1b486352b68ab7a4816929d4d2706b5561e3e7c91eb5b116fd10f9ec9ea529a2
-e1ed87699193a44c174900fbf685f5cfa2639ded75b2e40fe9b0fced8da05161
-51fc5db43926292602db810b3a412c6f1ead6428aa7f45b4599e611289b31648
-8e9304e1da4d49d67d6217564a1bf74c887a2b595ed2f7a43426e1a7f1851c5e
-97f591fc95625614cd115c03d8a3e2497b99c6b48510cb1e7f556e2d56babb27
-0ce9af4d3c3a37801e1fc28cf9457368737bd90d2bdffc8aa9e03ecc0f8c4eb4
-666936e527dc0efedc81a8acbb0f925de56566dbe14d187a862b43f7c56a438a
-97331856ba272c57653a90a4276186d9f16350ea0f59def08ad5cd2d67316254
-efd0b990048bf4b88af600ec5faf2aa5369ac7c81c6caa59f8dd5c7dd29f0a03
-369037756c72ed98032589a86d9f31267c4932fd5ea2929992035781ef53788e
-f64ba08a3573ce1f4eedf19744737486475480b4afe3cbf2ed608fa651d77047
-e6b016185db1503cdd5f17c8b515f40120f4a676ce153f8bcede25e0e998f7b4
-c9091b98d0364f599a783fb5ee99c24ccddc7bf77eef513b06753e26e2ba763c
-fc67abc3f845719cad166be74e582eb74884345ccf6c265f4ff6623671358624
-5ea33fb16a4a4c4443c3d3c217b167e97c9c0eab334cf6f4f02a61a4d9c6f41b
-5695fbff38e8d4d91733ceee4b1d93b642f974b510b1407d7992f02666d26ec7
-aba5eb40cc4cd100cd964df5dab0a31d07b36fa48efa64cf8c591c04381b3a92
-31c8f11150b820871fa64be805d62634c38a7ddd0855c315e32621fb962f7baa
-44c9f56de9b712119335863b8e08652c9ec3cbf07279950b11b2eaa12ff17909
-40abccfd12674887866c008f06976d3d3aa9bfb4bf064e50bdcf3823b7ce5d6a
-66732655620ea67c93ce77cfe64cd3e121c5ce207b6cb583fb317c1704034dfa
-8d7d5ce9bc776e2e3f7cd965d3e5bcc453842f07fc539dceaddb5d2625078735
-ac550c310d989a98b4eb17ddcbab25e709cfb854880a51109be883d0703b8f33
-c64a47fbcfb7c1a336831f666b18a7ea57ab7b090e54eff27ef90c1795920917
-18ce8255e72339bc4accf7c4a0a832b3ad6d326218954b6ef1eb2b1c6e283fdd
-1a84af455f2b88feb1e445278219265e36560e12262640f0b8c39d5823ec44f8
-f7fb0b0b1396706533621e3d3f1504f526224b9234c3cdcd1623c2025675be08
-89796843913c5bf74ad911974728626e2ea150b990e11027fa99ef57c7599702
-c0c8a8f3bd0a4453abcf0ee43b9d2f8bc691c5bf000c8d39a57e3a6061c7da19
-0332b98c25b3a5eb14181baf64d1ba6e846e962a5a3ea875ede2412419533f00
-0927ae15814e4fe907e6c002aefe845e32ce23a785965f87a4433e3d9cb40146
-fcfcf5dbd1cdf4cc5b00fcdec032af3383ee52d1bb019178b5d64ffc4735f4c6
-2350cea2f0c6c844fa492a097dd45af2692aded617e8a061d2734e40dd12cfac
-51565a595b10c4c6eab692c7d1898bc887f0664ca953a4220d49585b6910d048
-bbdfcf28540d9a418881877dbba6cb7214e3adab8da4c2fbe47e395900428f6d
-4b4b2f318199e3b60476b81d65ba33486d6581a95532ef5a8c4a6182756d1a5f
-19a35a156896d16eb1cbdc3c71c34cbdb15b27fa08744257f7ab4df53312cc59
-5899050b9a1a484c6e7d7d2b8156c1adc9e65fd3a0afffbf77880e596dd4fe88
-70160f117e7f994f1d44d82b290b3412c05094227d953cd8d936253e70bcc45b
-e679f3c37cd829e2210262691d4b4fd2715d235ed932fa7a4f3d6a51cd2c1c2d
-98bfdcab79d94ae5a0c763b5ecf82beaa0346c55591333a2fe74ddde412b5113
-4ecf85c4f33f16870585929ff3a43ca183880c3b342de71d0b50e0caec8ac96f
-84d6c65126ec6e15b475536b0cc310ac9f4b2e878f82c989f85aefb499cf31e7
-617300e920b4fc4c08a75760000fd68dcf357301c58a7d85d259456c19822a33
-33df916e8dab10ed7533e4a5cac1b999c30fa597da3fb3634b8c2d3f911ffa10
-c77152e36ddc54eb66be93aec9d38b41040fbcad8582789037c2752b45b95d89
-748fef565f2a0db42b2a5811388302fd3f66854ee861d3941f833051563adbc2
-ca1447923350863fbcd08df7b2014a1fc656bcc14549abff4345a697e7971457
-2fe7f47f74f6fb110ec6c19a820b9b8b250629ba3e1c5875e05b4f3337fb4964
-a4a4ccb5e2b3022070fbc8d443415baef77dc51cd2fc0e563a60ff115872eda2
-386b73b755eb353d84589804462783d6f2e47c88ac22149f64e5cbf873c41174
-7da691f652905e230e04457643f56a0693083c3ab6cd488d25b2ae3d4d093744
-4e7434e673578a3bf51005f94abbf2e2cec0c49bb157d6230c1166f890e7d888
-af0eefbdeb7a8c8e2c329736fb1abfd1c28a236f48bf45ad3f9800208e2c8941
-d7c2646791a2c6a9f77ff6b14d7a4cb1561ef7d5a1a4cddfa41490ef06be0dfa
-4dddb8323a2ea2db2acf4abf56bf4f0cc6f667d1ffe303fbea1022063007e244
-03bb1e90bb071aad2256fa48458390f293b11cd33588cc1360df26cf9d91d9c1
-f5b300a063059ee65641c58fe08b5ed6fccb1f67e54cfe0076b02ca362a45f97
-245ed407e9f1931206addd15ef3784dad8d867746dbbe36bb2ce156744a87b3b
-a15af3e3cb363c364563a81cdfcde7cf4161ac8896427d02328b951359a912d8
-1875b42c28813384ec0c949a6bc976f6742593e3c9a99448636568639dac3c53
-9a21cdc09cd7bfbc86cb8eda122ab9d6eda9fc0e4eb323431d002c6a8cb29983
-be023d9d52f147d73773c1f1380900e0072662ddde03b7c9d2e4db6368372608
-e0496a71c64ef37b03aaa37b039bb034e6a62ab9847c99bf3f9099a6ac828649
-32a248d723f9382cc93c76dcb0ec3db065bd6ffde538058914c02439a92aec80
-a66aed7b67ba8d5b75eb76e277c198f1f1c2f71565bc0c23d25d6437a7c69017
-c72c73f0fba4bfa80a5a046dfd0ca7a783d708a338ae2eae71790312ecf250ce
-a7fb1b69c6c52f955bf1b7333972d48f6f479e96f8fcbf0ab105b92ea72d0613
-7505068b025f00b576831cd180cdfc27494245d75802ed8220d1dab513e5927b
-083eaaae23ecc085b27d6ef444ec9fd98782e35f45b0347b55499af1e7a55526
-9ecd6b6b0b0aa2b711e5d3032ace6fee06d5542c686215133cb7f158c65184be
-e20041a7d55c838e396b3e50030d4ac5c5831dd6cf3be395aff8d416a1cf29c5
-88149b83c31cb8bc45a3f900ba4daef0564564dc006c44009a8c5967f87ee50e
-3fb7b500da32f03ab2abc380fddde8c875c19701d1b9ed54777f2a33030f1aa8
-def1ca0b3720e9859c189fa70462a3eb074bc25c2b97c2be9813f9dd887cf118
-6126db00de2b454417852b5ae707422cd60b337c63ba1acbdd549c79f0e16fbb
-ac549022ccbb79a62e2fff0bcf1d99a016304e8349fe6c7782f868c7ecc3c27b
-b81fa8c522d9cd26268c3606d529d8cbf039020630e084b6385ffe35d911bf6b
-138a9afa6174affd18a6204e0b67c8ca76c229c30a13ee2de45e35631fc03f4f
-9b1645ada82e4aaa2504df003f8c6f7ea621a0d2bb693feac0e68544e07acd39
-ad72aa50b3b9518e87763a52f92f7d2bfb84ebc5c6c7fd83ebf6ab660b5d39ef
-3b8ad3d47743809397e04c52fb109ff9a99a3dc2f462db485b70068b80546b58
-a77bd668c96f83fecd4947ea612638502aa06285885913c3d0a55ed59fcb5717
-4d6cc24d070d554074890f9a30bc5f749220def451ed203fa509e245d0022dec
-80185e5130ba4c2d55f2ea3b518cb97cbdb99c94b7c71de53416cf63db5662c9
-314bfe5972e405f56d9c64fed47f2403d9a369d9762d045c51a81f49f2dcf7f2
-9b4b2c95386371755169be5ac5c77bcd5781b0024707f89703390a57417224c2
-f3c071030c29c5362d86fe7b0d6fbdd4ae0d5f9d88b0b6b3f3ee624a06d12a3f
-cce2f10522acd3b1627264a10d27bf4e4228daab35976226415e2b5580801957
-580b9b57d264ae556bb8c19aa894a68cc203a4f1c61b8f736c0056a6396816e4
-b325c498cb8ff2163bef8775f0374edee0975c0e12664f28c91122b2ec426e3c
-bc4040b96af0a0e1f1f08181a125ff32f1deb1541e765d3f6c395d4dd72cf70a
-0c8786e78251339ca115ee3f5ad2f2833b3299b88dd51dd6e106312b6d2863a5
-d5be8dcdfd3aa0c23442f5d9f2c52e26b7bcd93f651531083cbdcc8a1983cd9f
-7dc0de8fe4a2e226196bb179f8b06c12041c55b3e8e8919980bc4dc1b7c40ff8
-37370003395291883fe84981a3890f0c7dbe8e528cb2a81ebc8af0faf17a9069
-a7a7c9ed225f696a36115daa94dfd10dd270ae15fe601a9987bab5c9f66b69fe
-893345a4f78534651e6a1c3c3569ddb6f9a055e1bfc7dd93b698d98797ec1328
-a49c6af1fd7955f566b8ec99300711cea2d99dc4bb2c6aaeba79af44bbc2debd
-d43bd144d1d53b6232dec21840790213b586fc630685c69e438ef6d245019c93
-9b506df33da438b20df1aea4a4e5c246a8e6e5d3bd22fcfee85566287ec4f7e8
-8e33762e9475279fba8c2a21b334d6f21f189dacad1f5df0e6de190418609ef5
-9dae7a86830607c5eff55bfa5dee90f611d04f634b19b68f3ad16320ab5df8c4
-ebe6a153b8aa346060bff0f079c765f5b007d5a480acd201cf21205f3999697d
-23868cbea55866d79f3f44bda0140212f0790f51dd9c8d6c1b6eaff7443241d7
-7ae286049962a7a2df2f86d77817eae276876498128bbf9d0bd0d8afd6b7df05
-640a58631d71a56095d048d54e43b95e2f63a09e36286bf5fc9caccc3b353eaf
-3215a65f0bd46782fa6eff4efbb0a35edfdf715e7a0cdfba50c6ecb72808f1cf
-e2fe93a936c821c4fef275c04c4ce10e503216d92f41dde7132b70e78ee27753
-5eb60b276faa9b10b2c485b6522741889e4d80ab8adcd269e598ac4fb359a4a1
-ca313b71d5c448d32f7828b9c0854adb69d25caf61a7fc418e524167ba324abf
-78995886c0a6edfde425d5e2171de85b609152f30305138418f76f9c3d15753b
-0b2716cf8f9c412e553a0b7dd4a3b1aad4c6d5ea4f18f55ea03b91305e2d23b4
-96b5746b9060aec17db39fdef6466e99c99dbaaf458d19a5290969bbd1241fee
-6f8d49448d81521655b7e24f5c4d4f60f8d136d4c62af41ec98611a04a0323fe
-51671e40ce6a0ebc879ca0823b42ef74758648a09bb7b6491ab3c87860dbfa5e
-1c55f515d43d55074764dc43d7fa8c9f
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/couri.pfa b/lib/fonts/couri.pfa
deleted file mode 100644
index 2822ec2a75..0000000000
--- a/lib/fonts/couri.pfa
+++ /dev/null
@@ -1,1893 +0,0 @@
-%!PS-AdobeFont-1.0: Courier-Italic 001.003
-%%CreationDate: Tue Sep 17 16:31:02 1991
-%%VMusage: 56675 75599
-%% Copyright International Business Machines,Corp. 1991
-%% IBM Courier is a Trademark of the IBM Corporation.
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.003) readonly def
-/Notice (Copyright (c) IBM Corporation 1990,1991. IBM Courier is a Trademark of the IBM Corporation.) readonly def
-/Copyright (Copyright (c) IBM Corporation 1990,1991.) readonly def
-/FullName (Courier Italic) readonly def
-/FamilyName (Courier) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -16 def
-/isFixedPitch true def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /Courier-Italic def
-/Encoding StandardEncoding def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/UniqueID 263787 def
-/FontBBox{-48 -288 800 841}readonly def
-currentdict end
-currentfile eexec
-9451d7e7a4929782edaf756a2645851dbcddfea354f61d8628b8cff733b549d1
-03a6c4f5bff18e7f42cc7ab902ffc194c26f5e122df5e4153316cf8bdd34f70f
-7f4ac63c058fb15bed425f41d00b0fc3ce2bc7aaf11938e1e62955f527022fa9
-101fa95110e14387d94d5f312dbfea32c17f8467e82d9c3c014699e7ceefd421
-346e8b03a0eeff980f4119e6862a5e4c2acf990756a4c25f41289ed051a09703
-966cddf3bb9f59d54985d5473684443849535c5c052a1a9fd7bd55f5f76f6e3f
-f7eaf762c3144175458d38e0c1cfad096c5f759c52459a0bceee202940109f4b
-7e589678aeaedb32e62789199f908ae2c370138de2b7d42d9fd5f24a1a39526a
-16f99ff43def7d9cc15cab7bd4984a978c5004eec4dec999af4f79cfd01ef149
-746140fcbe1dd3efd7bea7c6ad6b84229d3836f4d7f5714424c21a13a941181d
-cef9ea1d136feb92b96b3e3126d9529878cd620a1fa3e4cde95853533f067ac3
-39f288527ebc6ba9eac0e767731a02705d581144986ea6ac8eb055b550ca00ac
-d031813c1ae301f907efde4be3eecfcb4a5928013475debe556f045ee0df78cb
-cc080be9c5628a6254b28b146328f10163a09a83267de2cad5115f778a369cbc
-84fad9d59d6eee9785bb43e2c96d13476cdcecb6560ebfffa7de0cf4662b3490
-36859bde1974b21efb897c498691cfa294b724a58138e92e4a32b138302362d6
-784aee399bddfe6a40ac7a1e473d9eb34e949ea7fc42e7276591218e4237b50f
-b02bf78be202b0972447920155dbcb8fde70e74df1167fc2ce02a96fac4fba92
-4aecf5f4f94ced70e010eff9147c40fa6ee88c7e5b06e5f761f2c222d414cff8
-12999db0535504f922a533c7538d77239c45f04c9c31a48bded20106cf6d885f
-1f428e2144d399a8e589c3790d572985a9b26876960e31eef7b8ef5430d391da
-9618103b8d95452d9ad4fb2df2fe324500e205f5830649bb6688ce7b599dc96c
-884d0564a73d7a3bb2e2aa12102079ea29ed01340ea9c2e6cbdab1b2ab6301c1
-815b16b46aa4cd714d2454c81a5c65fe62bc038c62f3db91431361a832fa801b
-001999d79ed82fc813e004b875f8f0b69764d55966952482a015cf67587f3624
-f0e94e983980c9ada89df75eea4b6f3c0fec7288b07a51bcaf9b50b7316c4c22
-65da826d30372d94e3e01067b305907a6784fbd29b427dd950a27a4569c9a93e
-b94d553d5698f8f312e015cfbb4e411a521ce2f0216f900eff711d60a21e0487
-1191cd8a870bde5c7d90ef2c52ab892db301513264ae73b2213c6eadb474d7b6
-03e6fba747bd5532515b9385eb4da75f6acdeb8d5225f01745158ee38c574b4b
-842962be90df91632ab92fe2af21f8699e670bb3ace0f4b1e5f252f8a9e836e8
-baffed5e34f70561ffc24a440bb45129d3197476d9446d4d15929d957664c3cf
-a3f238ba39dd636376e86414e7b1efcb42a6079e1570d987916d1c0e3abe739d
-bd70ee831509b8bd6276adadee7fde2a39b015884f5a8dde60fb6422a00dddf2
-84839f70f58cd9674d2a5b3e6608dd892a76425f4a719d999846d53ee1a2ba19
-fd0a7144af29d774ed2d707e6f5c409dd262ef6a1a76ebb0f326165e41578203
-492fd1817cbfe7c20e4e71ad1e708f72aec944f42e097cd71e75e530b853eefe
-3930ee67d4765fa79b2922884a4f54f5ead4f149b3d7397affd32da788d33c0c
-34c7b6b747685680cf8de88352869e58aa05405f2100033aef8e07e465421ce6
-1906499e3a9219bf545a2fc6dab9363c51d28778cedfc72a14124bc174868a5a
-6b077a5bc3fab24ddcdb66ce8f1228f2e8795ca00d158dd85b6ce80bfa2c5b33
-54582dee7138beb45b0b795205263cb3922fdfdff57a077395eff212f13dbea7
-595159bf5fa6ef014b84484bd27d8cc405dca16b6aa3ed6ea9b0b69ff2b160ae
-c0af127322c7f3bed8b8089f9bed60aac6877faf30db93b59e3f99f751c03174
-37135c58c3c43e95681e4254ed00531a086de8fa24f68483db6a97fdfd3dac5a
-6e0296b4f2207e2c301e3e424e49c7c5e98f48bc1a545b3a1b7e4bd5b6829f20
-0e5663995deb31543a56990850f6614abb032a91994f9bf380a8d0a22f6e19d7
-006edb7e5dfcad6e01b9e3d791fc9326862e72aa717fa3b68c537202cd6ae9c5
-d81773186a4c30c5a95d86e6614e30eb630690c78a40eb87c08e6f679ff4f862
-25dce99ad158f978b63c037b51dc5267c11d2d46d5823f429ece0d1b1e5225ab
-092cadb0c5ac32d54404b1dc2b6b340e7b2d0b478ab13a3e53d1f365a50c515e
-8d4bec663f52a818faddde2cb9f05aef238b5cd55a29382faafa3089d6f69379
-ef72942826fc4742e7beb16a452d0319b6b3a3e08bafc4f69bcbe9dbb938e768
-b392c9755bc00415744c0f850c855a1ba009b1e2b3a8c48ae92e4b4d95bdfa30
-aa0b6e310854ce3137885f88f687ba590220d27378d0ea52145b84429071ca41
-fbc3d285a49c55f32cd0d31676e36a2bd406f33a0ad837af2cf35602f9c6921c
-9167ef568466c90308107b918419e3245dbfba44178559abc36fc6c1818aed6d
-91c79d4fda4b4b2a47c068a11bbb899ae064327238fe5b4816dd820fc81a8871
-40025ede257cb64429dd34f9a1632c60eb44f3b24799a8d271b5059b45092b23
-a4ada866e017c76c8f7f701a37169fe6404a9c2f3987f81b9d13fcbadcd2505d
-2793770da0f40850a837fa1ca9b6aff2004b92c5ee6fab82895f7b7b584d704c
-94345ffb2f055d296f79fd2adcb5b1c1604290913b8df0f49df05e637266c882
-c0aab6855aca04b6bcc488a4b4cfdd8314b932f50e5d2c72fe4551390098da93
-060d3b350082b6950e7c9ace10f3063f9c24956cc7312ee1453defd2618392ac
-b8c970cac9a2caa289639c4a3540fde6851e0801f5fe97b278e42280dce79568
-a4d459defe3682ee830c395e0949f8b0e90b43c5c1081b02d28ada072e63a5ed
-6bd693ab68093e99730bad8499a55fb9b50c8a1b7ff3e01735077552b1f14466
-d86462a79e3b965a9183c0539d827686ac0c0c828448bbc999cee7545e6ff564
-24d47780bc2ccb4031214818681f6c1aadf6fc05ef40feccae7a672c83487458
-694df4bb1aca47b5d7922e55fe29c7df4e80d6e4bd4b79402e299e98a89d22e5
-d39073fcd45c50d08224481a9da4ec0648f002e0e9ae733d56823c9504a467c6
-325b8c959e79a08504417dc181116ef4c082394ac90814e97cd63c2b591eb78b
-f78c30368cfd3ade41f83b89dd6ebc2db9bdc9e62c40db51eeeaae3c0e36ea1d
-153f80beba54c411b75852627f45de38e320e3fa7870134e7cd41e355fc90aba
-3adc77b781ef03e67e49a0a94c8fb24f7b01c6eb37fb38cd409d000438b39296
-dbe1edf020ee046411bd70a3100aa113c4be50f47371119570c7b5a74fa60b62
-ae02a8488a26ba8b057ebd29c3dd1d813f29c85049c86d339f32f0ed83b41f7e
-92da22abf963abf1afa56f424c127a23e39a5a2213388827660e1c6a1b016b9f
-834e6eb705a69f7ed8cc981c651014fb12c6de4894bf36a317db98b870d07409
-43144994a4be0cdc78c8b14acb0583b9c6ae0286cfc355c2652e3ce38e4b57d5
-da616ade47fb63fc9ca2d00e118de2f9a43a18d5065c91ee3b57cd05d5ab7dc2
-3cf8c1de80d30a857edf235da528370b006209854fb381fd693bbc060936639f
-3a90ffbfa38d497c5e04bc92ac2282064ded4f8b48a1f0684650e8ec7aa8729e
-cbd4f167f3d6fe90a095ba8f75f03a60cdd5bc4d83afe96faf8e8199c4211e57
-4f7f843cd927b2581aa05b07ebd916989d980e3dabd8140e200de167e0c81f93
-bfa47a97844c1a663bbf1975483989d9357229ab5c774d4222acf58c8da0e891
-a6068bebebc3baf1ccd312a45ac40706486735db1fb8eb68f75de2ba3b640fce
-39934712779c7a27ab2ad4c3467b0d00f48bd23c32b3a2c3fa9b60a26047d7e1
-052d1d8c316caf1be1bac044be3564604892b7d33202142e1ce3d5952fcf0fd2
-faea492b74cdc5112ab8af4dc17997831d98b641d39592a9e84b1d7981c413c7
-63c3ae7b07ee80199900c204b54ce8e28ea28a7efbf7f7a13cb9122ad020115c
-ad375a74983094c289061e23d54b8ca38e8a1567a4a44ba1c1f3489647faff31
-45ba870af754402bc3ef934ecbee92735e8d88f0ed1097247e40257c1fe188b7
-b100222b745d457d8ed2aab04206dd62391fa2dc7b3d728e10405c9b5cd93bc6
-afe10b476451d3edb361a090a6c32b8180bc02494e01ee684313c171b4cd96f6
-4dfa467b45577b795deeccc0701c29fb665e8a20d04683592f7b3ec507cc8d74
-4072115649b573b99cee72393f788ccfc8b6739ccafd4ece7f0fae20ded802cc
-ce4442beaec97cf0b5489707eb9779e9f72b5f55b314e26422a8019c44fed234
-a21f96b1b69f99e0a265c6435bc18edcf6cff798bdb0b9bca878776b925423d6
-0c9941fbfe4e374a51b4f4ab6bdfe767d3aca462d727a364ee60360248c54769
-7b3cdf8913a78f4ee0ac72369545b36a8a74ee785c1013f04ba3a482815af951
-703f3f3359ae963f49d1df66cdc5d47010cd3765e29b73702f9e0b687207b8ea
-28ddb6a47c9aac53b65fb50d86cf716c68572a6e9223ffa141a05856de949f61
-12bfc258cb674114f7a5afed4ac2d75e5ee8e5475ed070342c724be8a8e14474
-b044416541284b470ca3360ad99898dae8194581749b1d7626eb0ced901beb7e
-33b3672d74ca975b910e81f14569c725b9fd9bccea96bc61dfc6c3fb2f490e64
-97c6a20d8ad2e065a697ac178f99b174d65c8d082d9a9fc937bb669c9a93daf7
-c32d165b09e1b9a0824a3072990cf9ad7103ebcc6cb30c552ff984600560d2a6
-ab1270bed37af4b8b7863ed2d10fcf15a88fcac28c61f1e9f97dce05200a9a0f
-291b4d0420a6512e6614c28457bab7007fee6591241943deacbaa5be0edd15f2
-6bdb59adeaccf91b843bad3ad2066865c7736cc8b4eae5a1ebd3009802955717
-0dfe24c72ae5da4261ea8f9070ef1da48ed288e22ddb060220f6822595ff0208
-448c931d2c6ad2e132fefb7528de2b6afd1c6453d798ddafb3eeaf906f972080
-d9dd4539de39dbc3654ace2fbc914ffea6bdb35aedaed3f5e0717c0fbf60f167
-5c9755485c254b6106faa14c995b6043d073a009572dd50f5054879b2c75cf3d
-08048ff3f1957355bafa70ebdb1aed4a7c0ba38648d193b18cb83f90b2610cf2
-df3f4c96a25dc64a341e253cf2d09dbfafd95f562826cea8a85c38d76d0add80
-cabd96927cbee4a1c16d89aadebbff0a7e2632e25e1b5d82132527e4f47106f1
-0416aaf3766916ce6d4ed930fb45cbb2ff6d606323ea3557fc29e0403ae664b4
-434cf42973abbb2db64dabaaecbbebf16547396e751138a24ad9d5c3475304b7
-99e85b57b37ca1060378c8211a99078f8b8e8e43e3d191ef85f4b7a7e7f11898
-b3eeca83053cbb2e5cc421429361867d6631d5eb3c2dfd890f74b504cfdd2042
-6ff193765ccf5ae1c820bdcad46bd1097386d02a59360da1e30b0167e01557fe
-4360050e15ef77f236c833bb7589b6e335d3c7aba5f90baa924d725a7335712b
-4549bbbd20c12398b8c8e8f7abe3104c068ba6db673b81d9532ba41b8be616f0
-3350f14644713b17482bed129bd1c5c2c4c5c3924e90918ce9e7262701e314f3
-cc8956a36219aa6b3c6782b7fe6c91af6b272f9936ba0c819ec1b0fa0a8616d7
-2d4a63f758128e2c348c083050f06a0b6feeb189ef7a000f4ec552377671b0b0
-393c66047a5756d7e9ac38c955d3ce583f94e50b41a0a153961ee049cab60d85
-97cccbe0686d23140adc2fadbecaf085d96d31a8358912989dea8787c292cae1
-7d4df00e359d791cbc932a31626662e0552f79b396a22adaaff556326d508275
-a2bd744f4583dbd8c91c8e89bb70104d88e2faa619020412a91fb03d1b511c78
-ac048f87ae0ce52eee8161a84bd9994d8c4de132a71d06278e80d3fb341ce4b8
-49a4856f5d0bd770baad7bb1338449aba330590a9784447b363872c1a2c7a390
-101e4ac42b1331daacd27aaf670b13b29da7601e05bd49cd62787644ef6f6ce4
-c1e67e3fd2a3923281faff11ad358e756d285642be31a8b36fa372b6b826ab34
-af6a9dcbd37aad998a881b8910552cfd53a03b2ccf128fd5634b30279b854a7e
-c3d87c27da01113b2e134fbf0283f00e6bee34291027ebaaa310a6728b98a2f2
-40fd33a44caf62306a706b5ead4f7e16ade438be5d36359d0aad5da320d98657
-9fe6af830b8bf4bb32ccc46d56f48e769b49cb6ce9606bb0f32309333e87ac82
-91f85441a72bd6f6adc4922908aa822dfc4ec0e95123e35b40f72be615eeef40
-58ac7c03070bf65c5fcbf8b7751a4955985fc42ad26c6b87433bc98f03ce0f8f
-51c1e63c253d32f7383d02c5b8d7c57aaaeea850f13881972fb594fd74b57d63
-de373261225149e899d60daf10c7707a6572e5b61d0cebf985b1fafae29db8d4
-e2e0969bc8351d482d270d93c6741eacc85b53b3fcdf04a931776933e36f8009
-0d15d03f4c51f27e41e1b09a233e78b95d50bb59f80f025e497494a35168628c
-b69da174cd860bf66879831bba9cb20df1fe8a005929b8657ac38e5518b94ca8
-ddfa11cee6f424446593c9ab1061bc6d7d285b4d2ba61dc734f23c68165796eb
-48bb353d874ee8b354ea4ba245f249cededb1a45eff353d3b24e6ae36b4bf29b
-f2f0d4958e8652c90c8607ee99d364525ff45ed28b2cdb035f4a921ff09f7fa5
-a0fe308f9322bee5db6e8fa9c1b928c093c9e3cc21d7f914209ae12fa687fcf9
-b143b60d1b6eddbabe07324398a4dd3b96b38637b979ffdc844712bf1457e73a
-aa66b914a46707ea94d87bdbf964c736a72d1f173b5ca8eeff1aaec036756e86
-2ae63b2a05ce9bfe44dc59c91046127522b37dc99e1a0a40f9189f2041e6d3af
-64adf60b14ccab5b3e0f19075f44f0b24bfe305db1a8cc97fc268136462fe36b
-c18c54f419fab7c9e6cc41ec5fb01970cc761cc5439d32f2d05d7753934bbf7f
-9ae1abc694d25e864601aeea52cf0393a8d99c1e278915970019298f21fb1eeb
-253ad932b9ca86ece282690e7cd815ef823dfe706e31499b3200983d7b2e1e03
-ee85904457f4b67ecfc10b2911be7935059375b5e1f4a59aae648dfdadd37d9f
-92aa32dfd4ad6aa52709ba37237b9ec1c15f089d80306f4a2f86ee4e53d43177
-72139d975aca988ce9fb925d4e8869d9bc3807114c8cff3b89aabaaae6c004f0
-b47d29a951688e253d4b9edeec90537929563e134863a5bc5b14b10c7003b172
-af367f7109a0026ccd1b21b70d768bab9ca649052944b5713df04fa2c491ced6
-42abb041b7dc3afa5fa54a1bd682f2f4fc11028e2742e4620bb7f7d2b6b3cb04
-2cca29b6e140da488a6c015a5405f6a9e87597934bd2eb54ff7cb60b457e3125
-75d1c1fb0e2b263cfc8a36be85418bc089c7ff09808906fcf9b2fa33c37926b4
-2ab5548fa99a68ac72ebed94f9e196ab78661d1603829f1077ed9667f1153b5f
-30527f64b47ead21c8971e649c6f08930b334c052ef16bd8e08ed918b551ff1d
-5b06e6a02c22c325a36a628ffcb7cda2e204a09e6c029dc837a1220e728f3a26
-370f833b16d3a24510de53f83f6295853ecc202053748399b8ababc574b17fe7
-d543ca4269466ac9b2f96a5322b1b2bda825c483f632dca511240c9ed233b5f1
-ecd258867fa35d43126995a505ccd4bee92964493d633dedac48bb516eea368b
-6dd30c92ca794affcf72cf93efe15a5d5bb730dc2ff190b35e7805a6a448d8cb
-91095447ce11dff34debfbd18e88940a93d2b35ff12108b89733a4fef8a8aa09
-4a569660e66793ac5fafc00dd26b07bd1e8a5db3de4599153864cc9c9b5b978c
-939272c070947643f999070239fc0489e4248aa1ace1111fa45a02ace8924393
-d8781113740c2666a2a9338023a4f0c0ffa4c304bd96f04a93edb7b6f04526cd
-6dd6125edfff5a3e252aa049a974e00f62c449c68a6f636fc56abcc3ea957011
-d2ed2932c11f93a299f9c8f76a99c166a8f0b3ab07723601a5360fed33dd9af1
-f9de7d2e5c62cde83a485f7b701a1de173c6480bc2354328736d3012ff4026be
-5f4405e71a1f3c6589bbf93ec9b44e9172c872a23190da0eb8783d864a55b073
-c606eccf6e032aa395a025593c00c1ede21490d590f75e07a0ace72030a03103
-aa6452a75de120ee0e87dbc5100924a354d9bd59b45eae1ac3522f1560db9d4b
-cea57007a8e2efd9eeb415fba88c17b6a262608e03661f78d84d10d2e3ffa3b1
-a6e22f64c77c96606897483c283a61b6eac19867f8ea6d30e7ab1c8426bc521a
-9c6d95285ef146c3f26306048c0faab3ce8903141ac00d34188adbb2943bea3c
-24ada2b77c2fb234ba81b18319141d0f66ed8f030b9488b42a8b77a9ea818568
-33e52373e4af68063a20983f7ef9650b36d756a9914e19459ca5f73de2aaf099
-6b7a4feff0cb044b5efdbe79c0f92be56c034f0837407936c61cbfc5c246aebd
-bbd6d10151ff96e6c9a70c83c252caad6ccb7dce8f8daf0fd9369fb7ca917318
-305553c4065a128d48e72c15e73d342b60fa5cd5cddb4ccd312909f3aa74c6e8
-93e4d03dd5f14ffe7620fa57fcf052edf14b24946c3298ad90495d4ffb1a3efa
-fa2a7fe539da1eb9a1caae17db4d791f82a6f7549f1bc9c8511c67fa7f9a0c4d
-0e1f6b499c20ca4bddb2d01331235306174ddaa89fbba3940fe3f0d90ea99ca1
-7b6068cc3a067fadc54ca07971fc760dff6c379e0da34213efb3e31b8bce103c
-b213d370e9d56a7d45d717ec95c147a5587d8fdc2dc5a473c55682d8e6ddf0ff
-99b84ff7708d0861ba2e173cc1bc5bea35c9167f434af0892b36df9185858494
-9a8c30aa60f56427bc62605639c1fbbbe8b3abe849cf9811dd91e51c7cbaf230
-2de453d71129891f573111286f2e1e3409d655a5aab5b711c827727a1c2b3a12
-3c6e267745c9151e4f68fdc8408cbd61e2415af33491dbcb6213f7f863a885d0
-a0e22a64c414738fdde20b991e8535188c7fdfa2c4c2f7464996d39ee7a6e2a4
-edeb319993ca59cfab71ea429df70d7c13003a14195491f38bfe9ca0e847d5ac
-5b4cead59f46f9a96e9d2da356764c8f9ba7f28ddc44da1e71aa78a1f37f4d65
-67d089bfbfc5905d0d9f8bf91d59fb36368ebe6dc98d2dc30bd4dcfd95f8a7d4
-5e5fcb994cdf902dd0d1e1c6811da7035265c2500fc841b593581a685348cef3
-e7194022c27ce9b6e6b145c00673ec1b5e3b44c591b624be9b98af5a2047f91c
-ecde59fe67573c7ed7059abfaee47366095ec644982546b7ade8fab0405df825
-77a1e716f6c5ac53f6399471af444ab647d20d73b56bd4f691a1af23668676c8
-7fbdd5f36ccd0b511a3ddca6749aade0226839bf535c49aa48c8f77b93a92502
-ba49d66c339eb423849595aab668a0fddf1f05ceab7aeb0b07df1f074f5379a0
-716aef2d1ce011c7f446af69375061b61ee2a5d53070c700cd61d65a19699654
-5749531ead8bab91300d32155699a97ebac94fbb074c047f0891dabbf4efb01d
-183cecd9cd90e4276a8b706f851a9545e24b979db7a160171a647ce1dec9cbe1
-48c67575c9225276534d4954f5bb7980f8ff64d841441c358c2fa6745dd63377
-fba23fddfedd38a275d953dbae7f499e16fd528bd167e35895d92ac4a43f1390
-d18c8df01a18da71936f4f21274a19fc16ac14676e9204874dbd4c5375d1761c
-26a48edba84acea46018cc75c5d394f5a512ee51296607e8dd91cfb635cd52b8
-f789fa9efafb8ae5bb03f7dbd997a9c935a55cefd104f0f9668ea3682beac7ff
-68fbd047a47b2f31e775bb7c014aadf38448734b5077843ca1b0c170f212110e
-0cddfd06af06c11ddd5d77f705354f6bb10c132cc3009c229360799254319322
-09b3f4cd6527dd7843483bb59cfccde571e7f0c3eb1097227206846f4ad2e0ef
-20ccfa79a259dce46351f57e6e593ebad5bab102f379b3d092b4562a3ef7410d
-c31c4e65b0bc5db4a9e62744f222f389b8367ec3b98445d18ded8ff88473ddb0
-bad0e15f159e29f4498a68f566e7f9cb93b8d49f4b896323a364bad3260fd5b2
-18de9ef59b9d86cb2cc3d909ce04da0711a6e609ef5766f00c21c1b0866df62c
-1ab78933e58c6579b1db3f75f59063ac680a2c71eebf9eed664d261926a448f0
-597eb74549a6fdd03986f8c131436cb4d1c0c1c2700a8be389ce3b1599710199
-5f24a9b2a41c0a3d2cd603b0295d93b8353bd96266da252e13917a0559b1b17a
-14f7d6bc5337a70f25f14a530d10a10eb00f9e3cabd9957394fac9e6d7af4f42
-c87de4804b581186ca91a8be760d4b95e605168f28009c8ac52e043cee9076ac
-fe0454370fd4ed08294327d321f6f9269c31702c9e22ad65b7f1d1e5d88ed353
-a5c22be5a8bcc628d35532eb0be85229e66efbe32940d6a0deef0af4a712f9bf
-bc42144f489e4f55d128f3c190c0580cb73e1f8126bd9af51007d29c5ba37bf4
-193e55c40fec90ead412ed8e67ae1706487b8b99a0053287a67f9394924fba0e
-66befd41f5984d869e86ecaa2abe3bdcc88f0a293d4f8d6fededada3c95c63ca
-f315bc533cf7684d70a535397e0a365e51b0ddcdc44695d64fca2f88dc830caa
-520385dd0189477673c12dff1a8a933fcdd35ff44b378054a388659bc7d34b18
-747e91e762106878133ca087ba8745055fa56b7d55be79e87d1b5393a1e354b9
-37ca1ccfed929827205fd7f4c488c9771c4ffebd7ad282e35781db53a4980232
-36afa1c8285393b8babefdb39279cd7e81f552b60789d4b3e75db380e5f5e146
-bf710018254463c6fd3afe5d36e031d8aef7466003a59e02b9a33d47a984e10f
-1467571b66c861dad8df92ca1fa8258b2e050905f754428289f2fa21903569dd
-4f41d32008714e3274eb89df20e990e1f5f8e374d9a02c1d6bc259292c589a84
-b1627573ba844ce758650e4b06609876a3358b42dbab955c6be52033a353992e
-e992e1508ad495437176290ed1cfeafc4f810d1127ca707e632aa22a2adc7ce3
-fd75385bc5b0b0599d9177f2a73228dd510bb6136d02bd456f8a4a7fdd7b61b6
-5beeb68fa6d07ebb2f326a9604a45dd1281f2fda33a2e392f61c0b2d358539db
-8abded8ac63f5bee429ecfbb646482bf5233c568d9808d2d6d1223262d97cb67
-cad55177ffe979dd3d75f23885195d30e1052932f9b0f0b69f56d20a6afa3e7b
-716383a3af055c83d81350c49f3cba01202ae59fc4917435fe2d60141c4c9b4a
-10a737b86504c8218ce86564063ddba7e1f79d348247fc9a0e66ae45977943b4
-33314c4d62945b734ee2cff74e2251e57bafe2d7df36aacc16c4e7e8317a99f0
-cdb643fd9bb8baae7554a3ce36f46203bf90ad04d4308182fbe1443e5d9b06d6
-0f690e546f14a3b59e88c73f8cee9e14e933870e726e57b24ab26a42d208eba7
-6bb854b2616ea206249684c7deca7a2039cd56a8b61516f4b804a8e7cef8f7d4
-64d43dd5addb534af596e512989402c18e23ce24d71084f38ab320c95cb9e812
-d1b1e0a5985229ebee8c939a4e520e7a6a9509328969fcfa8068ff6d7d0b2554
-2a1692872457f852a723db78280fa52f7169b8a781429bb077359249e35a456d
-70e023cdcba49da955831be885c3cf2cc5f70645c66d22ba02896edf191f6b39
-6a475fa8ce12caedb99f36fa1a152bcf0ef1ed857bda26d8fd95a8f47cec70e2
-7bc1c1e6b526ab9f65b0dfef215e559f8e83b2fab3bcd7a84805bf30d6302b12
-3f04d1df11fa76fb79a173c3698b9c77a7696c96965cc63647dd5517ebc07c65
-2bd13ef9ab6b4c85f1138add1aca375e3d59bf5f706951a378801bc3aca40f34
-b3803a4ff311d461c636c05572e86af42078ba9e791887eba8e2a5794a39e119
-1eabbc368e55362f6d07a4785469815210cb386fe46f837187c2934158c4ab17
-977a1a7c901ae294523c2876955387f47a44eb4eb669e05fd34a07eea12fd6c1
-18e86e83837a76ff03f38f3ac579489f2ff340b0c3ec3bb0f2e57c226dcac005
-fefc63ec5047983995465ff27efc036e879267677a8ec92b6ab89c5cf347d25e
-68ae8eea58c00884e4061b05b22e8cf4eaa7754046cde1ff34ba093712179848
-04b598e20ece471f32f99b8dd2cded970c6aaf98250cd2a93ef2b539fa7ab354
-27c69e31bfcd9e7a5003735d4a477051fc41261e2fd14cacaaed091a2928cd90
-3808bf6f43f1c9c68bd3722eae14fb308786562abef6bb2cdf044cd8b0b26518
-45a0292d3f11cd9deea8197b2d5a33cc78d2c9e14a3289c98eefa1b1ea91eb94
-fe8b9e0c132a0a3cbdb70c9ded02a644b31cd766bcdb7508ea1f1ffb8a9f9a04
-f72a3dceb6b16673d20a6b7acd566a955247ba287cc74e6007362553bdb98102
-bd5a1a1f8df9e1c1adb8f290f659357b592e8a325ad1f9cf74136b576ff926f1
-f37c044961104de93de26a01a2d98b8aead9e113c47e9179e7ec06aa5148d1bd
-d00f415d4aa5a94293f8b0266587f463ef0db2d7f10749d072faa586b674abb6
-56849caefe4f8d74710aa97549103a526b89bc9d286f0f0b400cddf827afc178
-3ce120cbd1e6bd83bdaae22dbfe752158801c42460b64518f8c7a374cb23617a
-3ec662a90c324985c4693b6e80b88aa2e96f7d35323c0999f56f1f8db37f9448
-d6214fd1099b4a73065987a236a4353cb11051c1ef75950c2c03647abaa98615
-55907189bf0147ff0c5a2e1db0627cb316fd2e6dea8f8c9b34fd5a58ee6a4aa1
-7191e2b5a08818b72919af8173fce5863cbeed9b500c924a55e58252e710c648
-d41fe4c020c0fd607b08a4969f3fc7bfeda3e20897669f2ef32511e08e9207b7
-305e9723c52a16224e8d0f1bb7cf6f7b687aa5bfa61582d1d07e980f91fae736
-8b5ccd687da89c884c5d199518d0fc9b0e424e740aa04cdb52510b668c09a3b7
-ea5a527074cace5b2c4aee3c846c383a1c9acdec4a0bcba9e0b3d05aa81b573b
-14794a9961ba4d80b4f308cc38f89005120bc284c67e670e35238a3a72498be5
-b84a88daef4ab123258918a4bd292bcfca94049ed9b7310834a0c6d1d1b4258f
-e410beac79f5d5e2bcbec6206421358fd7ee8d5090539dd3565ac9cafc9c2768
-9d84a692b06601008390986d834cc44e0bac0c773b099501c02800247a1c81cb
-85f8502e773fb41256c84725fefc59c6f39b3696ab0bf812c3ad445193b9dd02
-1efc04c8a1e13b0c6161134fd0679c029780537d6e9dfc33f8b30b2549e8ee6d
-360d5bfcfcfad3083805e8ee6a54c4802c8e6629feb6a291ec26c9c393fa6049
-aedc546db31ab6377913737976822d44ed7d41325146f691604bffe6da0ca977
-821d9f2dc65e7099ad3a07b3cb2943b9d8e5380d8287a787de997ce19d37ca09
-2594b973b56e58b0d14977b4180f9753c6ba97e5de6f268bd0d9c6a81009d3c8
-1a0bcfb206e17104f491ab5a736429afa5954c1a65bb7df664b7922c4bd041aa
-4a2a0bedb4fecc36c0589e22d20f961c43e19aaa3f372bf4536644c19e0b4922
-baf7b50b04b6f7e0a6702cb7972b82fdc443ffbd22144dd9a5747801c587ca08
-815578b8cb6580c773d297f4fd1c087564a90bdefa63ed2eea4d44a728c84d89
-102537f5fac46638aecdc4e07ee9bfe2981f5add3d96f49976bad8fedec4bd19
-b352cc3f804a5109f058aaf9bd6fe1808166155c89c73cda60287c9f00e234db
-b787860ba0e02ed0ef5cd7eacbffcae54064cbf5f0ac568800689bf02341cfbe
-aa1902087ced298dd82db84866ed704b83fdb7e28b43154084ccb8beb437703d
-b3a3215417039df5532da395a2d5ba64f2c19354b5541390d58c9ad230675e8f
-0ae43962fc1a40aee6906e05a517c949eb03ac9763a33c232b3fc0b728111698
-685cbc993a0868b467bf7df14645d70739bad8dd0e3b10317ea9df08ca9208d9
-b7491ab3732fc730bbb33f062662db76df5622999109e566e7470d2d3cfeaac3
-f7de6b3d715ee3055126843b4a3d0d2f7f4e671da66a2bf4eba18fb4ce3abd5f
-2fec20771e3647980766da5a9e5618a36e0c1c1b37f0e2732c7e0db107cdd357
-005a12ee4449f8b57573ff8b1dca68ee16875845ac77e89b8d3ff57d046acc8d
-6e8930a8484ad26389fb6dbf0df6ae8b1ed9e689b6dbf205e3cb24f89f54f6c1
-240c693a1289a36bd5d286aeb94452c7d1238db5e904470bcf411db0db9b1a9e
-97684013ad8e8377147869490ff59cd008c5a5104d08ba192f96cf9752e3754f
-3e7850bcea027eea59aef4b18023f4b364423087b56b4c22e3942d6aa6a16300
-08703e93bf8a55509284cd1776b0c8c40777096ce1dc9aa6b5fa28e8a0030d39
-a9b64b72bee43f829b544172668b358b3cf3432f6d838ceb488f144e4b500ff1
-45a0edae69c61b7e457809392cde962540f36077803aec3e5e637b9ec513b623
-830204a7f532d6ea27ee2c4a2969eddc749c0dfb0d8e059a9e18347e094076a1
-15bc162c4979ad89aaf5ef22a715eeef6aa356e39f53e122259f21ddfd91fac3
-b8b6df3c3e91644b30102a9e656e6542926c13cc8401418f1c6b84953e527c3f
-dbe3e76e2edf034b63f68c1905409b5f03a2d5b1bdeb97dcb8987c06f877603d
-0c8bc8621836c082310de2fac8584fe5e453c3cdd1963093585942eedbb099c1
-1b659943eeec493efcfc13a1628b63e101a0a40ffac0dc492f03062dc18c3665
-d0b7b37cb756fe6102bd8590705b9de712f169514b8b6aa528e42e36012e0e57
-1de7c4cbd8a2097f0b3e4d6b240983657044e7184144db4d790d552e9d7198fe
-b3131ab841d51d2bae989ccd6525c6f8f52f536e9a8388a760402af7572a42b4
-f49f652dad74c2e3296aaf7b6005b5e3a8d95507c145744f071c6f9e71c43cb5
-7760b0413ef195db30aa604b362de810c56d438311cbd193e540c68dd86b296d
-2b75aa450134ce06d0084c2b52e7afe6e061935084759ed8b7bca87e58985741
-53255144a2c75fe57209787204a562a2d5a8ab5e14816075be42e56a062a695d
-13553f37570985410f780f849926da1470240ee9246d36cdc06082425e381abf
-7707eca0ea73e1ebb268494b190b020cbfc46d54e14bd0ef6595d49ad50fb1c4
-13b1bdc640a3a249102f3057855bbef5f17f1ecee2323fcfc5f85ef23a75e114
-8ff0538bf1cee2bdd9535aba93abd484d837a88c36f6270241205a1e1b0f50f9
-acf34b5175d5c41d93d406a606ba5a9fa4ad177d73b2d8e830fec7280100b0ee
-65329c638ca69430f227ffdab6d8535ea52cfc4b31d6edd1c888049499cafa73
-51d205e533ee0a11e531aa5b7cc7daef28341e15b6c868535afa65529ec1fb00
-ba680a5f9aa6f90db191db3c0a19bf54291beda8f02f73e692075e1fbd287bb7
-1ee34421d52715b3a1bef464d0af2d367dd6be9ea9dbd2926688c09ca1a0e1b4
-3261a0008201f1663d471a3d758b28f1c5a8be1e904502e34eda86d92b8d420c
-09febfe3f294e01915a8feb99feceec3c3a910c53b475eb5330b2541b41c701a
-d17c810a269767abd65426b3e95b33ef098ca20606c000a8e906332e25e6471e
-0e7d662bdadadd4ec64b301b415b8b7adbed32fef6b484809c8e8bbb98d058d1
-e68fae1442178c9a357ef1239b8ee076c7a04381f92aad974589dc543a4513b1
-ff178b50671ba14780cd777efd5bf09ccd81c2ed6e3bc723596ecba121403fa7
-e832bc13e5a549c311001a113e6c35786a65e654f83527e319233ed4130d20d8
-c2bfd29ee477e639eb1493d09078266056bfe3cbdf1e3181c607ddc24140ccee
-fa9c2774246f2c93e7e18822f967b2d67035476dff57f0d9fabad245c3f7e287
-351affa20a22dcac4e8709ecca97ce660172a5a896ec58bea7f2d45ced2b4885
-d27b124367b65de5397e773c2829755972821c8fc029d91ed777532a6404266d
-c3e40c32358049c6fbcb6b6e0827514d8064d0787bc4e232465908ed25db2cae
-e66d3160836f0ce4a9fe4c06895772f31fb6a0a7db32f965845a6b12d3c018b7
-321e63aed1d54fc0429ad1a022c44f7ba340a3d584cd587cddcff7fb299513b9
-3d4dce430e28af6a12515359866ccd441c912c8f4f1bccbc00a651688a909516
-567a8b6264da305812330d6a3482b2869d3e108ce3d7884d5a53d20a84f08fcc
-359dbf9869295eb94e154dd58c6097a8feca591e0039cdee5415c768facc86ff
-1784aa20e914f1bdb3938a137d09359d65d5351d5aa30c46d57444254fa97fc5
-2aaa91b4c5a350b5546a1c645d28d60c9e2e1c172810c3f522a6a982c442d262
-0215def70617b5facd0ff4813365e817c207163d58af491169d5170871c4e353
-2cf911c2393cd627c73d591b500206f420e7ed5128539ff74faa798ae990df72
-d72b7c724070b67e0c032b086b11760f7abc6ca32788fc0f382282fbbb30c453
-9a8f3c793cab5762afc63b996421411e25bcb2466f1a2eb451f20d49e204a006
-51bb615f14c511c57108d08139afe3b1caf4d5e26af909ccef2c4da1df7cbac6
-445c366d5ae5c8c3085411ab5c27a9a105501581c57a26270f809b6d6396bf89
-025115d2e8731d378815abbbb637d13ddb8e871374a58fef87c6586a47dd99b5
-bd8c4749ba5f1f340a8d3d4f237c9c5a57dde560443e1ac655667ad624fc9462
-c18a75317bd8b0e953dfa96871d6a00004fe1823264e04966227cd079564bc50
-13ba790cb1856b33e3b857a5e9fabf0dea0cfb18fe337d6a0566a72484631396
-e5b5ad7cbc0dea22cd13a8a4f077ba1872b602160a9adcaa68aafc759a78363d
-35aac022ef55bf2c760fff76c16678bb74f3a9206a85a4adbf6b0e3bb4d3e4ee
-b3558f6bee823a48f62071eda0c220023cdb400a28251a2677daf9ab2831bccb
-32143cb4cb8ec6a7c437cace06240b09f6a8fdc7786f02af0ad7c27747495c09
-45d09871028c14ad33d661bfd0ef987570b10838af72315ab79c7e4186ceab72
-322b65635b9c2e839a610505a43b82f6e84a43b2b501e5f9727baaac91224f2b
-b268351a72fd17d87e951d1014ca44199f828df4efb0beda1906f858374239ae
-1f8b1f957b8ae1244119f72f035bb6d65385ca0ba155bfa9c97d176aa1f66b3a
-ff9190159758d211c45ed2f1d6aa919409e7c89ab1eb46285fa3f062b4069319
-515e88cb84306a498a4f7251619a7b8c6a8ef6430a65da49563d82e908785b70
-bdc12a18d08f7edfe7dd8dfda3c2a13596e15af4570bcec1eeb14d29d5ff662a
-2958be2cd3333c3aea2f91b20972246d9a61a7732b238ff9e233cf311c49bea9
-a83d354966d8e964b0518f0f5f16cc003b589a9da8627101e51cd2ff759157a4
-8a9d9de94c6d47f1579d021482b8eff62393b1285ea5e521ba09751b9b722d77
-1690529076e745164716242b6dd41ef4fc5e95f15924b43f75a8c689f143ae87
-f5e7887a9873697a8c4131352911a8e50004468c72482b7a38149e7abf8534b7
-2388ed5b8cf474b3a3b78ac89e840697205b569eba2e85e2f6416d41149aae6a
-9434f7e8e95e2eda2c8eb78925345e59728da3310e9d5da06b3b88569cb7677f
-f348e8ed02296d1c2d4523a0843936592058e916dfc0524a8f240dc760867dc3
-0eb44ceda8f3d98733378ad7b24795574cba77f641a4498102296c985f9e8098
-719c0992a5b77292db052593bd5b8020c8fe583a46e804c00c715f1004e627e8
-bc976f9208c6b3c19cecf6158f27a80cae345ee464b2eb14ef033be31ca9b0b1
-a1dd40d025d2fc0ec2e40900a596bfd205803b1f4341933e0a998100e343fa04
-9de20c2534a06deb43f8f3d0a2a65dc9dcfcdc052282ae177f478048b0c1916e
-e599a29d36fa69075254e29ca1d158d8c7dcd2f7aa643a3a391380dbb5258d6e
-75ac53529abbc2bd29c803285d2a6be5089fb84704291d4a6219c040efb8f439
-07261d057541ccecc7846a3b8710c47f35a490a5078a6b4271e429e77782f315
-90dec87f91023bb8c9d9626b8dec28f4f15a88ad2378abb01c8ed262075f6f96
-6684c0b0c987daf6f52751c00c45c390e3929e7364b1959d5860f693b2e2385d
-5dbaf080163e6922b88824f632ca07585d8607d9e5af14980558e6fde1008972
-fb77980aea10e2fd441a0186461a802572a6fc72e64925d7acf6f60f3e5b2a93
-fa3c76bf1963936286f496bedc875a1c6b51b4edaef334193de9f0a4cb00e0aa
-19de0a3ee0b1658deb23de3912ce82982f7666df1167794e707a5dce52c620a0
-7a8d93ec150f53f2ec22528ea4514f5e8b47159cb7eaeaf5ba779fa274e34245
-1f0969e3315af81bd0fe268ceccd1f20d7ea709a3af61ec7726863ff1e5c2b44
-5d6c1da0ae53a2e62dee5f7f1a518eaddd3a9905f4cdbb74f62a16ad2e9a3ca2
-16a2eeb7da59521b43d9b358fe7fe5b252850a292a0112d22be0377b6be31696
-e342592437c19cf0e5fbce729c395fe046bf9412a3fb11e6182f53ad1124e129
-244b19c5dde1adba250bf9a82daea88ca70fef20f81bcc21bb7547c65c89ccc4
-8a62a161a541a984e6284cbf2e1158f053561ba3c6da02cf176afb494d1e020c
-dee46d50a8dc700e6b71742dd929207846dd02ad2e5eb5d0db70d6267305fe4f
-d99c1f9f8c260cc8e521d2ab0aaf5baee24e2b7a168aeb971aaaf2bf207593bd
-466fa0a2dc24f2951557d02af2de5a05ab226b2fdf7d95259814db46e9e3f069
-12ae5b7b5c93a3b024922803ef16112acb0a383af5142ac274010d4ffa4ee7a4
-b5460fc628b6e8ed5f449a4e879c8af7550e7ece8c63fc00b1f31a7905251a6d
-477e0b9dd1b42eba39041a54db3ec7349280eb9471f09b507e2c878a5e9aa8d1
-3f6a0d3e127ada508e3685a272ca56afba11347addf873b229fac5b047e2c950
-258f7d280a9cb608639702ae9e78ab11dec0bd348a7b9b43a53e30afe18ba463
-36cd658c82171f41750ea125f7bdcde7837c36b8309f8c7ef757a08dd3eeaf4b
-4c28d8308556afaadcfca572e9cba9ea6bf5ac682eb798bcd62f5e4d97a8c6b8
-71d0de906248b1b103f461aae6eb1ee2ee0283cbcbd662c94468128d61eef30e
-838075f383b3b4606c160bb9e702c2839224342685ba8673d284f80858530460
-5b82b2d44ac5ab01b426bf49a38647870889fd8c62fc5c34d3565aa0ce8d74ef
-1fb14c1cd8d6f4f1306166698b0fc3c0446cfa14c6bb2d9f6ed7d7361f8fd573
-d4e032772529fe2248699a10b305132e0b0e03f8c709ae75034468f3252be6de
-c005ddd79a854116edcfd4e17a04e5f737df69e0a6347930dd7dd8cf460563b0
-e85af9fff730731f3778faf6a95d696075fa932491fee95b206b652de5e35a82
-0217f13e9b0cd0f7156859f1484f3ccefbfeefa8ac8f006299f7ee663a1da3a5
-142999b6b0520696a17faf2eb7134e8e2b37664686a6bedf2cdc70fc66f7e970
-a0476a91340719ac17958179770cc2c0e38a6eb46922af669a531aa0e927fcec
-309a7b121fcfa2cef327c4e71ce6a7fdaa611a0db34ddf0ab5250b8dc6770384
-c49ae556dc1a613e98f20a3792699275ed4d187c87d412a15908b6832d95ab4c
-865b2af89c0e471c46fbc6d0686b36af4b12c3684a7f45d7c2d9d9817361df14
-7c5e95c3a813daa7048c0028afd43bdafcba03c5c74309501d0494ec31671d29
-b30cb884d9748f0e2b7a8d4e3ec11bccf9a491905628d2c4b6b40f8bb5d0b9c0
-b0acddfc846d84487e9c2e7f0d82b991ab2ff2140770f2492e3908b6df2d86eb
-b23af04389a27cb3ad0dce5528059a519a6092a18f3a2b035cefd46d885d4654
-24029359070136db35c346acb8b288d36dc85aa13231fce659d4391a8f5935cc
-c8e47200f97c15b8ebb5b8abc023d027bb5e8211d0595548e0c95ea47bebf498
-76ef585ad3b76331c75fc41bdd44d82671ac32fd665bfdecffd4b8fc61255e34
-58476113b59bec5aa15b03d623912276f1ac560c0cf18bd9043aca2c28e805d9
-d03de88dbcf10aa9d7d0b1cedeb5270871f632f7b703fc8eb5020e76a638bc75
-40cadbab7cfedceda58d0254ee7e8e48920b21a7cd38cc350cc6b67bacf468a8
-a246fabc596a2675c1fdba8cce35c28655d0e82755fda8a8b5bbbdee98c30d91
-c81f08cd0f809e1d55a046158365e04f224656a6c46a43a3f79fa2d55cc6e420
-fba22da808c4afbb03f6f7b0d33be67f9883b30a1c1fff85f78badad279de4c9
-77f1d9f16a5b9b7dc8abfc85488f117a5cb317fd5c84fc1e59ccf695892e6ef9
-26dd71c9a6c342a877406f0258adf45810746c1454627eee0b7ccf94ceba76c6
-7f1ce137f97ee6025a23ad42a4cfc2ded9bfe7e206f31a63e65bbc3e304ba088
-4f0e0738675e2a4535283045a69ff637ad95c9e0b86d834726e2ad29ab3a03fe
-71ec91f8c8564ccd0069b552ea28867440145f767db71486d2e38e5a0a3c6099
-b6d3b57ab4513a0c25897b46410c783297a9b280f138bf91bb17f4f5d5bad5e3
-f858fa265cb1c1b0d0d9b84426f0ee6e4f5ff5deb2e50ba82d3405de51fd265d
-3fa7396ab39ddeebf8bd2b61af0090e349863e88c9a5a280c4693b6e80b88aa2
-e9609721b4747b18008df3517ed1331f1dbfa46b00155288b7783862ea9e6498
-52ca1ddcab6c190aec0e25927e8526cdf32030cca61f071325cda7e0dafacf8b
-c3cadc3ddee55640a7c627beb2ac0cb38e3bfa38f9c3a49cd7a400be740d5f67
-e59582031ac46c467fb35622ccc7b627718f858abe34a43e5734a74681ef229f
-757dcbdb302475577d18d5cea044dcf3a8026ffdbde20a2585fc84bf53d6504b
-ad3dd458ea271e5bfb498f9289849349a0c8935843db2382069eef873895c978
-341bf3c1c9535d13ae4ef05f135588edd96bec9066045199a8e76582dd9c957c
-2fdd24cb36b53692448ee0db7b1689118fa13ad5f73107bf0a59fdb32a958438
-6d9ee99dbe469d3831f43773dacf2a228276d076b9144d6b70b315658dde76d5
-8b949e998c0f4e0c2f5e2e888bd316001cf0c981e9c89f69ab39c6892f658eaf
-5c754c0fcaea82eeb8a443cce68fe5cbc857d99df78215f00b222f799130b7e1
-8d985455482cdbf5b9f8eb096fb0966aecb5bd5394f4224d85fecf80632fd858
-ea3aa8bcb7834df7746ac013d8b980eedc405df342604a8f87d92ae38e5f758d
-4ace6d05c933347a85e08e6b796e6bb59ed8c7fb72d1ac04dbf57acab8875e08
-a5c4d4092166ea473dfa9c3da7e61c53b2249515365cc89ff4e5b6f4ab5d2514
-9b2f24ede7e8adceafbd8ef9d01a89500bc0ed3ba5d691dcd4719f70527ccf01
-ad15912e288dc397de28a0ca73837d54ab4f67e36dfcde2d75bba41fb152b312
-0eadd98894d332b20ad05436a75d0874a18fecaff6077db4ced96a6e91c2e4f4
-65cdc8e73b23299317a7ff4b4304c34ba43afd9768200e141a7309eb837223cb
-be451fc43db69dd2cd3b1cb6b5e879ddeb6990f19027ca2d15a90d11d999e519
-d7ae9f87b009ffd95c5d3b5f8d0ac22629797ce6374451ce62d659ed1da0a826
-26ad8021bfb2db4f00f81b8e524b217e3347c2f93d9140e817c7b49ee457b9f8
-1f5b49c665ab2468ae83b087f3b6454913f8498db5d8f2ce02af56f307042c8a
-290bdbf72c24ad3678e0c527129817dfa5240c03ed78153e0cfe712f301372c8
-bf4b82df2ceaddf1b819b828af9bd9e595009c1d96700a14a2ba9117a04dd425
-bfa4672d7f1d70df323fe6efbccd582ab3154358212cb5e4d1938b097185f53b
-8da80ba35ef2bc26b88b8b0df9eecbfaeb6fe80893eb48da291b5b6674c009d4
-b9a473c4e191b673d693f865946ea5c448109eed42b054cbb3a8b9bfc1b30b3b
-d021e90f56634c81ebfdfe6d00c97824729979b3e58481a0f6186093e4c74807
-04ad223b1a696fb51777c5695bc106ce57811c8ee455006f60bab6b6c43f1fc8
-c524674a638ed65aa0597ac1ed7052ab3f3caac9e62d806ea31ebdb359b005f6
-75c57cc36147841fcfac56baac914cd697fa2052eab5bf27d035f65cd0fea717
-ab06306d5901ee083f929cf13afb5a54d000f61524707cdc090cba1c46868502
-9b2469b0a29ce0178d61b66ce2f6b56d8a3d725687ee03611ea42f31f29c281e
-8c4dc1a783171441278cbe383473f7f6eb4ded8513c5e14edb793bf0c98fdaf1
-1e939330122543d2725d3e700e0dd8205e8c1d16bea0314f5a1e993e0bd1892d
-cd04efc67b855d03208086dee33d0297a853a1b913e71c7dc495984f7da86818
-7db70ab6e86c974a4983ae863927b0456534abdcf265133c00c42115455dc665
-6c1c683a43b373a1602efa87f4b3a1be04da20f7f51dbad3af313a5658093b25
-5156bf9693ab3ba5ab071cc5415e1eaa29160f8090968fd9dc458cc8830b500d
-14682c560683dd5c3e2745bd9935886053181ab7d323e4b993587605ada1d9f0
-42473496e8e09f9af27f287c29fd4607a7e246fa3e77666ef78c0a0ce9c3c10c
-5e75ef7385aa2078d8c98453449869d40d39a720e345779b5e20a3565eb47f78
-48bca3ca0e04daecc57db1a18ca96ec60b6ef42deea17246509dd81542f667fc
-6d3b808075d84cbd3ae5821ea71310369f5b31c13eb0d122400dcc9cc52ba85d
-6a7d2290af5e21268eb0e837e4830bdfe930ea91d4dff36ea26b2c4547437336
-4f5d8fbbb4ced10bfb1f3afa9e804c31c08057140e178d37408ee6f10b1f2054
-07839a09bee7931628b0720cc62160b3f541b2658cef64da994bf8adddd663e9
-668bf56e93e92edac17b9468bb02b1d90bc4dca43a508cb33e6d1f0ba5ef0f3e
-cf43109894b73cfa7484484cf3f18451db8c0993b339362183d42edbe0c1bc76
-9adaa253eaecb81286a4c9ee0a89ebf9b85c5ea0198dffa514a192fb872d15cc
-f70f773dc58a8f1f05d710f1de541327eb795bd5b3e5bd01dbdebbb33696242a
-dc92a04dca1323151227dba59dfb17835f5da70889940e3fb886ee4453bddc3f
-f02944799dfeba4b46272ae29aa6748e5408b90935a481be47303e5227f2e230
-5082fbff2bf084a05546d32b918ff8ef71ec86132f28a52777189ba8d05b1d00
-b08f9a78e37bea0b42ea7f48f53be4d72cef03c72ec948a4c23b16e7d3b54ca2
-6cc77493f5f2a767c0f348a0c85c85c544b0c24709e52272ec14fe72c719ea24
-61a1a842c599d4e6b8f175eea17429415bbc70b71433047e73c2ba5c4998cfff
-30172a45e39f7fe86ad780ec28b9cabf4429b55ae8aeb38d6027922e985e725e
-0a4aee85139bc1d3532e00b80b389e9d4c8197d0083323a495aa6ff75b613bea
-94ba02977f79fa5752418ba6b1f4def3e66440985c525a581e6b75bf81997f9e
-7d49bb437b500aaefc8423c1ea3aab735f87f7a17958a20e2de998148f6d777c
-54ab5a128ea1c37e65d14f360c671745a2911313d174f12214818ca417e38670
-699371a1f7ddfc5c1634bfd34ba99cfcdb86daeb368e5c46d79b974b609448d0
-90b832c1f958142754571fc98c9cd0270fabfb5e8466ccd7f34e56c52d086161
-d6def2b38cb28a5126a8c0f233cbb7e5b4bff2e0eb4c8474d7e0515b14fb7702
-5fb5c21ccf4827952e2e20757ca37afcba30f4dc2b7e9a66aa9ff34a1ba94156
-da92b255835e8c8dcf8c054393537ed4b9fe616b1fcac41724a19abb7a1541b5
-d3e5208363e42adbacffd409b8ed46e410bfbde876c1b77fdff235bcfdcff0df
-65998b975a24e2614a2a8ba89c2ab9f41469b409ec9e0a5c4234de73c630f870
-36060c9f9f3111586739972b638da804ea935ef2e74adcce254c9efe1bc00667
-9ac610b00a9c00a1e3ff36f5e982504f2fadd1d6c3d458819bb0359daf480777
-4d7e2cbe16f16afa47155c1cde36125d5e89432a508832c13fb8c7fd5ebc6440
-49814c8fa01838117f6d298baed8cc1158ff99d0a3a6c8e5231fb6aa4db98baa
-216a556c04bf0e6f39c8c30f39ad1ec64f4a0db2827652e8d354a821cffd4dca
-d23876224ed57795ea129d045e387a45bb88372e47757a16115b9ac149ccbe30
-982ad2a9207b175d2fbb72752e8d3dafbf4ba5c02c2dd6a15fc0490dd0f6324a
-ecc2523ed53e2d5fde36b3acdb5609d70809347bea983fc6db80888420d82722
-7d1d237567be0c9c24a585c52fe3cbec727823fe2ec67152944ee35a65e7a005
-37e096939e42099a3cf73e4633cdc85aa3b4a2511e27223e0053fdb65eb85df3
-54009e474bda07b6a07da75957e621bcbe7a1e9d1caef92565c5a6c73664abf5
-fde175a64314f6b166351af7acb166b6a0bf596288a5ab613b80db91ff50f7ca
-17e99d41d493031d1a5b5038303f091153cd08300ac6c3cc15860e33fbb3394d
-e4b383b97b77d8ff0c2707fca55a838e0a2b5089fff480af5a50e6f07b29945f
-789aa9333211be2ea8e425e00255f5a3725cfece8d262202a73db785b39e3188
-55abbba63de9c53c24bf11125f6f0d3b412f777795ab86c0cf9d9d43a2076fe8
-828085480e7adbc77fb137f8bd8cc8d26ee6435e7e3b2511e7a7d7a19d330d17
-e7d797061428bab2e7c290fedd6c0de9bdc2c5b6b2496b8356593c570bf8eca9
-c5aabe89434de698fa17ff0c08ec3cc13b60b4c3d3712df8ee02ab92a71cadac
-3f4cc5e69aaad92774edfafd88d95ff90c9781d9f771c143b9918f554e3b3497
-4f822ccc3e473d345c7c598271e59456d2b1f75560fa36b02d75d040c23fc511
-506955ca16901774f7b4b9d2ff9f4e0afd79fd66175c0dc634e932566d067fda
-e40a710edc1c893e919da8baeedb4ae0f4ecf0ede9f08e43dbeac3e62c97fceb
-c434c60ba5c80d15f79823e25563e2d746baa0ef31ff6826c120ccd9c2323844
-9a48a624790b757f9f8c03e1c447c16de51104688d79c87461f610af5daed900
-748acd52bb3eb9d975d128adbbe794421c434cf21d0b07c33427b81a6d8a4c97
-49e24142d669e8eecef30f35a96390b81ecaedf8bf65edaf9fa12adbb895d631
-986008fc95aeb2df5dd57a4e09582d9ebe82c685c856769186f36433400f1be0
-1daf022f7c217099e520d05ade233feaaac372f2e7f2067119925b801698ca24
-12976934dcd628be992734365ac6b522b098c7f3d788eb86f045c6c9fa7ee89d
-2d84a923ec1a6de6dda87bd949867b2a6d6f910ec58519088ed577531c624d32
-bc7c62116630a4ed7af8927fb6c4f4e65f000c69910841fb600e1de1c6a23f5a
-a2a5d199d79005294c66dc160c38a880a11ec92942c01ff8ad5e5693f132b238
-12c90045fa8d0b60c6b868f0c7d2a27815e196438c884d2d82222125d2219356
-555f8a67d48a13b3662e988d03a2dd3b648162884b715c89d7021be05917ea43
-d1be90113ed3b3af434ceec723ac4cd314527f560bcd83e7cb3a764fdd8f09dc
-f1f1f45fa4a47afa6401420b1a2a6cc0f28cdeaa0c83c6cb35fec7ff2e432270
-78d283f79547d6689b5450d02fd13ba6096e37b08ca096d942cb94ed324cb63a
-55c9f171cc29eda44d10545dfd8bcdc4afcb26191f92d0c61fea1b106769e9d5
-234112650aa8346eff624a259f3f6833997038e24fe4b74c459b14841e2189e6
-2842ea4cd2693bd162a9e90ad5ad3ff82bc6ed2e7978093b9bf4caa1012e6843
-5c34f01c470eb39483e22a1e67faf26fa74ab7434a682072ade050e72cc73123
-1505db7a7b2512ee6f8cedbe6caa06b939a440c9e5f0d5497611c291fadb0948
-1b19186861938233bc62228b15171612f026b677601715bb4c5b1f2ba72db37f
-d15c629cab69bcd96ad1a6ed6533b09cd3f6049e6d214caee58d4ed72e9f502f
-9a9f5682398dfaaae732b6306076deb3921685b419f41593a46e3cf4f7de9352
-950d1f0a6843175138e8589d22efa6c4996098ec3946aa1fcb1245625d7c4e1e
-d18abc806cd490f103da453ccbd52db6c97ebc5df69a3f94229994bbcab8805c
-975b57fcb6ab0221a1c1c553cb64ab882cd3ece7da6b13b0505950c5d58ace09
-fa7a0e4ad20be0733d9d540918922c588bec42902f9f8278dc0d6729a31c01fe
-7f90292b8c5c006035ff40f28498f88ce4d9981abb7c9c80b915f8c12062fc89
-2d49b55e06e3d1220d1d29c7844e96c259bd806ba601a6e6a1d9f34f15f8e10e
-945679f99ba204fd1b7cf84adacd615e858dff1365aa779b241c58ca6d07ded8
-81dc8c5cefc435b9ebd7139879674385c860251ad25d08745165e0aac6b46c61
-49fc0da7baac61ba658ee976689ae42c13d2b36f2fd0b526585b6098a6df1f11
-a3943366fab8eb81c4fc2f1e510b4452d23c41e47849b1f15f992e9428e8926b
-8a28f15206802507f5dce36de4cf257e56dfb6edea19c9078658c32212005db8
-5eb640885757fa5fa468f7267fd0d89dc2814828c5b1113b7b276093854b5fc6
-88a01863a861c535e227e98949aa3db4062f52a88a0dc7ec40d7c8a92e972982
-a0f7f6b0eff29154b5d0297ed270948f05fdefdae6126ee87a8baa0469512ab9
-c2ea9ac48d5a01d9160a3e38eaef6550cb05dfeaa33ade4de76f4ca4649c69df
-2ea79a0f787768b7300bae785977076d4777bd0c76e7bc23f90fceb533dba7d0
-b9ce8ee3de306315527bc84ae9a14dbae631881f485b88412a5d56f4e69438af
-33ef583f8e6516b1bb7414318cf785444cfe87ccf1a31af08f89c574b8394a0c
-7d260ef39f50feb4df3121ccae4ee370cb6a769b40292d559de8cf00700cde64
-439eb7ab50b0547252b14ea1c88fe9c6f3b5ef5ecf8ccc010d488fc3c91c5159
-e0baa7afdf4af77778331e7ece03d8aeb6de3bcb9ef6370b9fb01855bc68ac19
-476a442d3c5aa77f9280e04ef51960b53492665b3a6d0e5d95bf545ba3b1d2f0
-b80cea9b814ca19fa6399e2e93280ca1f93a9ff39cf7ac04badc4adbe383fc59
-e81c19fa691c829cc5fc63fc56341b724209becea74960adac6e033e07838b65
-20ef9a40db38442544133888acefa9a6fe282e745af83c5e9d9acbfd2c73df57
-7245f691e3012c8ab3d9aae16adf1791f2de33765d2697a3c9cc01955d138831
-87b46d44db880c7bbfb5f9839b4800c592ba0e96484350221080f457c2ff80c5
-4794387ebd07cdbe2dbb0099c078d7ce26c89cf4d47f52b5796a6a861c2c3bbb
-c28fc7321993e18295721898a059af827be695a1466572488fff3b00aeb24306
-743bef6b9616e0e69c6c123a86049d2038c9d58b13d43da51f4a31b2ebd6f84c
-c72ff201ddba0047d6bba501edc889ba84bdbe82845df10f6af17e8d32cf3c39
-a8e9cdb6fee684b9053ac5bf867867745c661b4244a6e9d416b96c9e7acf7c7e
-bf3e65a396917f5f3362091e221f30194efe419b15b01c2c172dda86af46b1b2
-fc5632820d48e1292694a3869d0550c7256eea172fd2c2c51b52b6a9204bb040
-6aff5c3ade4d44e7ea6b259aee7a2a196f96d8df445f6ba0439787a2f9d56dd0
-b7e1a48bb48c564f83397e299bb6e4de0a3ba3ae171095e1f29b30dadf456031
-237754be8fc42ecd1a5c2c47ba0a4dd454f9ad43b772a43f10b93b9f21456aa1
-0a6fdcb3dd43c9e9fe0029a3d78ebd534f1f1373caae0e69cb63551c80bcecd6
-ddd726fe1b8a10d46e0daf9b028f13cf4f2e248915eacdeebd403397077143d7
-982fa3be9b3690f299de482d9d9d30d1a3c73fc0f77a5642ea70a5a738c4a203
-a0ee361178d65dd9697f0ebbe7c03945e9797c2b4fde79d251088b54dc011dac
-2461d15a29f76fdc80e3ed21625a1ce5ee5848b32fae9fe6db0ae668d5fab8d4
-65dcfd42cfbebfaf42b5a2a604c429c29031dc86fd90161e9d25f7426e485171
-d6db1381147bf66d92fa199377109b05723c5b2dabd5dbc157b89b7965b07dfc
-bc1271ce306d95d2c75988978114e451e07dc5ea5a0a7ee2c4b5b560d8e63661
-52b8175c258dbfcbe57fc8f1369238118ec7c1ea2c8183a6bddae0def782d71a
-9f0e4cffdea4ad89fbbb351c139133936b7d8331f17a14faea91b0fdc69f7b28
-c63c13383f1bd915c08a74801a12342b690288c0be035bd5001de092b0b0e04b
-60d56735d50b99f9810588aa4231fc6c7ceeeeda1f5e420c6e8d01a0db4b1b09
-51057283a92739d75e494c69ee7fdcea905eba07480addd991fd2b7f066f84a7
-bd6c7a24a3f7632c0fa1965b0491dfc426e9efa2dd53c6cfe9c00bc1ade9b3f1
-54943704d3ef3d40cd97ff5c28cc2ac0709d9e765a06ebc729f16b442bb7eaf9
-6b8382db843cb5ac8c3e404b765ec45dd2b4ed24ba321d019592a37b2ac208cd
-450dc7107b57a74e9b7381dab65d48548c665f7c9aad56dbf5d8bc64074b186f
-abfd2d574801fa6ead0e1d00908456f361f17ba2c74c99ef7e26b7e8032b65f8
-ef19777bb992383f1f10d363fe7bb8ab7ce8dc304aacd1b6ef1b6b65d2d41d83
-0910a514c3059bef3f677b92fd2601917842f9836eadf6cd62a1100855bab14d
-225c974eb123849a23514d1f50c622b258e59cc367d6cfcaddf27630eaabffdb
-5394b86e724d634868ccc7e7991bb2997631f8fb35ef850076128d65ead586a9
-95cbeacb7e6de8edc0b369742cefcaa38775275a17a6c83d0a81e323fdb8bed7
-05f6261f7976f6f505f6c97c12f80eec0cd381a048ee9c7a8a05595af297dde8
-79803975697c31da784c5ca16c668d3b7503b3aae5494a4d631929870f9e603a
-38e311ec4480e366c79d4d03c533277c4aa585f99a32475fc691c2241b00ccbb
-c55c1e9b14851f815b162cd057f1bf85984a3393aee38c0b9ed3e9722495bfb0
-b13eac7d28d2aadaee2b280e48e5179743528efd7042ab6b7ed6dc2f4efbbce6
-ad43c35a3a0372814b1d64a342ca614d5e601827c1c18f8a347de9573b1f55f2
-2a3a3d709e17f7727477a45a4fce29efae3e16b80b6df52a4abb265577fc4178
-0ea7a98238174222eec322104e04dac53af8867b5bc0334b02f634602191d4b4
-960b4f482c46862a86e02f4c0b496d1a8108cac762022ce6644b4e6092353146
-c9c42942a74869c9351b3101bf15421a95a7ca34158a56e7de3a7d45d4fd2bdd
-f1f5b4e5b3bc9f7320eac4f94655e8a42c7799314376d6fbfa29fa8f836a83c4
-c1fc3dec65d28c408d8f4460b12d6c63a323c0533110c6b6809d1867110f166a
-3b41da821e59fb8c8b75068dcc4c8f8db77fef2e5d5cc965cf091b9f47369fa6
-1c1f5f5d501b11ccb9f43c3235f94cd287b944ff7203034f0985bb163054afec
-484e0e6046aeeb50ee74ac84186027cac9891b1871980bb94de61a47c7379204
-cd8662b17cf066567c9bba779f76edeb13d2ee996655def66a0cf0cc59659cfa
-e416a40ce4b7ef774185e79c76545ece7c498db03fa717a591f9aab08c167ec5
-f2b4d9bc25478aa6697d0edde31041f185c965b263acfb2399c5695e42901822
-543f8830ea58e49ec7189ea0b6bdbce349ec55346fc238a7a6c4cd6652c6c30a
-b5c8bcfd382e6a1fcb1344323db38fb9829e4ef506b21fa5b6d58a92657c05b2
-09adc73d93897867cd867c915cb7ccac7f1170f9a6c555ccd4a097574501b6b2
-565a57e5c1df5adf39c5740ae63016da9a566d7a830ca624b5b4c75685c95000
-5de2d662500107686eb62b3a8f7f9f72bd6071c85518741da3b455249d84152d
-a165aca84daebf9395d469146bd4e35452d00f742905c9a47ae2040e136e8e62
-38dd0e9c0901ba3a9c3216226c44b1f80e41c212daaadbdddadeae082b016305
-54798bd555a251d380ef952d085457041fc51dffb6eacd582ce2e7cd1df623cf
-9237da7c39b2167c7463bb427a7199588a6cab503aed16238c68c250ad9f1293
-b4904d843ee27e2c1010ec9f4d1190a11d986e8ab56ebc5615134d52764a3ebc
-a9aaa1b7d5bdd1ca23bcd8fef9048c4ec2fc1b60853930fe82c133bdf9021102
-15ec5dca1d137a14e519bbc2e35f93508753fbead6543c66d40b28d828be75cf
-2f2d3e116b42ea71772e07fe42f298945232934fb85f9b046e8fc56d843f0d5b
-ce1594c5bccf37117111cb497c1532afb3ab347e3f555ba63bd47525407004bd
-8ac2f37f632f253ed4bed95afebe62f2316c225f32f1ed41fba0f84d49cb80b3
-cb5503ff106053ea70540e3732b4474e5b6e1d53aba1b8ba36b1116d2516d883
-aa55e8401226b175450b8b4f1ef18d55e377f7b40f305a6df691d316a0ef17f3
-8cb4506398258e75cf230bb26523d391fbdfc331a74c64fd06b14441fe966641
-4469ab2f3ee113716cdf0415fa646bee2afe4dd3449dd1a38f4135ee5c4c83a2
-4faf571b0385d2a2a0b61fe9bd5a047999028fef216f2ba0dbd678572790f66c
-c575cc82c4825aff3b542499519f82f4d1833c2899b5a46e7a64793c291c7238
-da8d2c0c7ec69978d3848957062ca371c8808f6d3244844d54a49ae57e92adcc
-a97bc421d8cf01e3e2fef019fc2d9c3ff6edffa264e55a24fd1b7c32f4a86285
-3f9353aaa19e6918a3fe84c798e019eda844a5168397bc875368dfaf42514a20
-f8123edc760c20356bf81d8230ceb04730d5d7ab947ed143b6c3c772350eafdd
-9636db454174c0de1a047f0e30370cdd4cab9a1f9d8d7f99abd8494ee82836cf
-c73cf595a2a72807f133a8704172c069cc63cd317dc20d28e45d6690c25949d6
-6bd3293aa87b0a93d5675c42636a8837b71fae1945023db866ea01a774b5c2f4
-6ec4b86a3055327f28b179a6a93087b15e7c6169b7053d76026207c41dabd8fb
-bb17dd3d49e63686638b4611b43896d1c7697e352c976c26fc58b4e1e08df30f
-bd25f93e05f58892bc7f07c4f739d16de447d8eb84537e847926e39461dc385e
-f79c2ba9327ca12e7033e6df84d8f044b57881e71f32d52afb2b0e61975e730d
-a21fc31cce5aad86c09c82b7d0b4557fb79feb7e1ce6d98d26a49e8160159023
-4c5da702c3feef7041b5dc43ecbc8b2d66b7c33e5008a4d171ef828bd96da0e7
-4d8389f04fb4eeaf1f38865a912142c0eb9934dda5c4576fe18251eafd7608d3
-f35319aa2335e2df4a0aba8a246aa93324dfc19ea353fe27c47628f377259a19
-f9f89c599d11fc306e7181d35792401f9304662f56a2f3e44a1281ba24f4efdb
-35876d8bc31f5e19dbc58ee35b98282167d21a1069dc64ae87240384309c42ed
-ef9dbbd68dbfffd34c57a001aea0c91c36c2c8f422cb09f9456379f450edb717
-e7ab9b36b451c27f5bf10f018e25c57b1cdf4d2124f284b3f0c396ab3c806506
-ac6cab227e74d19a593671ade70455869614b5296d8768eb4d390a2e644b4ee0
-46a8d64d40633575087b3bafeea233f8e7f22ce22d2c190a0c4301647ce67668
-dbaab051719d516cd4e6e7f8c2b9557e8167c78ca6ca1cec05b79ab1ef61975d
-c2511aaaf3f20e393099ccd20ab4b022d2b206d9cbae6dbdaf96296df88f0092
-aa318348201f37a5738f17b440b35e47d17f0acb0d0d255d2871dd5dc43081dd
-4b0f9390af189582d2d9b39fba9644537ec6e1725de83991f190b5fdfef310b5
-e8483a7a91720758e329efc146c95771b2439bf2607a3f10ee247fcb1b7d5578
-a05775df4bc4ce1b59084f5e625e26e11243185d730fb8931455c3342fdaa91f
-7093b21bb911fdb04469469404dd387ab3a61fa4a1347be3c5d69324ff67c6c4
-b6de7d8ad88b287265a9609a6266b0d9146c3a3dbb0a3c9dcdc0d6f04d48a247
-df9ea9ac5daebacb06628fd7c9feaca1d71c058fec7eea5ba7b14bba8c5ceafa
-3b81037a197dd21919d6028849539f2be815d65057d23018049f2201c33608f0
-54f358433c3df8bd7c72f81d775f2a86ed7edb494db813e6dbaf76e405f64a4f
-cb3240348612e2940b7531ef8a93a5978faf36e37cbc1a02f2b5e3337fa2fa22
-91a9d6e9f9969604869b954ced43fb53ea1badcd0435817d1fda2e66552dfcff
-8acb5b5a5c819906a8fb02cc97f613f8400a9ab950e12d71f076807caaff259a
-e63f0de2c096a63eb4451e64a4f904162252f398496c8670b92923b8f7bc4f40
-a53e324f50a66920b4f9f9239dc0a3da083791fb4e524d2c599229aefd8f64d8
-34ed26ac3f7af54ffee427e4d9ec3f8d7d91d4978d974be305028d3a32954d4d
-79f64fd4b9bb74596c6f6d17043e104c664f42c70a3f526069cc369abb2608ae
-ec16a11b0a8ca8095e30cccd7df1c4543f9e53c3ef8ee191b3213c4e641e0772
-d85601019f3c9b6f94692e729b87c5de209a92dfd47a478e7580399d635ac5ed
-0bab11cd5b969e9af5bf1fa7d0865a518f177c77a8631784028fec51ee1ac336
-fd2d1d9c8c2fb4341187042ef872aa168b87054fd265885f2bc0a1332b3e406f
-259103dcb242f40a07a5de136a06b03d3ee31d6a5f385ff1dcf76d1a996cdeff
-76ad2f1dabe5e2d2ceb334ed78a9aae6c6ee8f17483a8e7c61f7ca4ba03794b7
-3582a8334cd5545eee22aea82e0b31b0981161abf1611c2e350f4dfbb77807f3
-3d3536c51f2a2b83e3a0f9b7ed72de16fc6503e9d8967d83a557d662062036a2
-7778fe6c9f521b3163a2692d16c4eff90d5fc06c69e98a4d2466a77d28c80c96
-5287008eb275a93713a78e8d542d4917abea24d60a0c90d1921a5880aa521fdd
-65a16bae6b72b82f2b2eb2e46ead1ba9b9710b4847a0ed217bf98dafd5759478
-cd3e8ad681703c00eb13feb3e5ff2761455a70e0bd9181ea6ee4850b281aba92
-0d8192418492352b2c7ca6a168915de1951f774de37d63ebb033d774606c5d4d
-b6bc72a68859237c5aa77421305ac6fcfb6e555ed3f52c41fa177ba49aa31bfa
-fbd4cb3f5df1d87df5f7dd810d8bb6ece0a8db60385f6aad7d9248ae8eb799c0
-9e4bd4d2e06ae9adcbe4f5d4b5c8232aee85ce60357a75886f3ed6f6e0082879
-c36c45d57707f76f8bcd1f472271a56095d05f4ced5ddb6a72bf6b410c7cf0e5
-c6cd21d8deca9f8ab7dc08efc69e5ed7925a0e531eff73aa537704db9779e83e
-097b9974b9d697521ea6b0f3a76820494608dd21ddf0aa164bd9830db40efc9e
-2c07c02b4c7236688d8fc135757aafa153e75b8bc3636485112b5bb57f01648e
-1e69d5e9e6ae84c2a58cce8011e71a7ccea36b8efac02f75cd506b402365b467
-ec1f9e60eb81169f8d7b676ed8fc4d5704b8d06eab192939cb570e0e0c2bebde
-3671b64dbfbcc5376e1464964d6e05eee27abdd36e52824d80c74cd20795f3e3
-647f70416d394c89bdb150ba20bec76b2be5f157d1a9dafed474c521a214769b
-4dcba56bac771999b3d3e172be1133d91755234a8d277b1d63942f0cc3933acd
-641e40287e5340f8efaf9d06715eb2abfa57a7ec2791b3fe2bfbd3f939cfff50
-ee4062c9fccef2f3296143190ab4f34cbf11ab5fff417a6ccf01f7a1d7b47b8a
-4ba4dd923b0621b26944b513e530352c92e0f783be39286ab144ee76c1e57088
-fe62f9c417eae4770fb7e27959fb74e3b6b3efcc36f96a5342d6ee780db6397b
-cb0478b4f1f8245bd8465850e3a83816697eb16163b7d78d9e0eafb40372b999
-e173293dfa6efc2516703d13836e11f407113c49676b16f43b4165731a4c0f21
-01aa6f3a89d7f5fb743c1ceb44f97857555774a63b59f96bcf03c87b5057032e
-4c8d1d6b768b7b0db5e444116be731e287ac0a13bb25e8143f15c493c417f20e
-be5217df4041413f59e33f6dc1737f9006bc221c6458b1a5c6d42da46e84e3fe
-4db8b35dfcf7c0933d4c1c977c5edc7d89185fde71534e2addbf635b819bd48a
-595b29cdf59e590f2eec097e3241d78fb27edb9f2274fcaa3246d0ca18e4cd05
-81e45dbd0783362463adb5177ed036e6f17f1edfabeceaa16d20a176968039cc
-89fd7902947fd931a080e2105f50ae2c865c1fb3629f22fdfc4f5c0f21dbf758
-56cb817833d0f510da858fd4bb64e91b30705114a2add3f3e8541a89825c9d3a
-0bada8a21626aa329875c9f90dc92e4af23a7d83ddcf140888e3098196ddfe30
-8014fed9451558c2f74b1f13aae39a1a0a50db19609b237bc96fe275806f2e13
-6c8049f38fef87d5d0dbcd10f232476ca4153bf2bb3cede4102dc388cb05caef
-723b21b6f6f2d6731f4c72cfed94f77bd76efdd37bca46c9f7dae18c05617a3c
-1941d5bf77a25169e19f0fb50c5335539680ddd39e018600021856ab815e8bc9
-cbe764e4e06c8f7b20f4f84d404423e6ab37271d564c8f3eb1b1ebec03de7c3e
-3a68be5edf58414076716cc454bb971c4d7e09af1c897ab8a5091024ababcfb2
-43b89e13ba6d3af800736f9ab077641c8be2849125ff20f3d760cd52d5bb6518
-afa9eb41b98094cc129c790094c6ac076e758ed6d1dae764ae66a7fba70d2671
-92afd13be3200f95432af7618203c6a28df7453198b8e426b82514648f8fd0e8
-79424287eafa66e276341064bc42dd35f670a2dd82d2c41021531532e4333463
-c95b0aad5247ad3b6f1582f2016e94bf1f9dfdee6a28d74e05dfaa5f41d1bac2
-fe4f355ad90c24361ca11c24d9a92203be1fced536bb855777a0065964cfc86c
-d3a27f3ad545fff70ce4921e4479b61281f728d334093f90ff6f33b0135d91bc
-684be649b6db580b1d34f38a491ffed9285ae4ab412b2e1623c8b6679422cdb1
-2263bba72cf82416e151f47fe4bde170ccbb8523459d36ef415903fbf38c4834
-86ec72ba6c9a02b4827433d39c27d3c7741d8a9dffed007cac8157d6e3145788
-45b0a5dc6a5c627d2a1e24b351d93e2dde958d206e434379cc20e4f7eab470d4
-e1159aa0e714d3d4191cd08dd45457319e2c41198923c8cc360532ae4f640b60
-7244c08e546c85f9d077e2a249ff2ea24a989abb69e861f8e71bf788fb81946e
-bef9d0b05804417e75589e89d2b8186dfcc79b2511c810a4581334d6d215effd
-0e8ebe5425d92eb19022582ad7dac770c36c3d6f86cc2ee279cf432196ea8eac
-d3514db0d7f6c59e1a68401358a2d5aa8b80259afd002e6975d86a1b8b2bafc4
-5cc0983e4deda769c0fce889e049c00673ec87ae17f1930af5a5e2423709c2da
-49f44db4dfec3e00507d4779d904384b801a43a15770a40f10752d29e14c253c
-f4e2a01f25b70386667e7e5b2877425502df89a4c25b9412b8a1abc432256a98
-1e50c2e2c7527b6219d0413dd104b80e9d045a4f6e8507f0bfb37339f864988c
-b1f62e3f68697b2cfbcf63178ef0d7cd564577d7a4d0517eaf8baeb8b81b5c42
-8273229f9013e77df1bedc6f04f380e3e90f5edd9c81c416fc78a02edac32ccf
-a01c5d8b6664fa08dca3d10b9fcc59fcdba45cd41c44a2e0f606dc1c7f2e618f
-ee8f9bcb4685f26fa93d73be1d97bb431fe198b04884eb2d75f604f7326e3064
-aabfc389b7230d325f32beebb2d0c339ca51feef98de442792c0b5b7bb4d9234
-b7f82ccd14bdd609816215a9921d67c4b891aebdade0677297e2b9fee67c60c1
-6bca445b3fa9924c81f46a0c88b0bf880477bba09b471da11dcb8e7c42714011
-70c4216ab739cc7e998aa1e54240f9913e0162333a49306ad5973c8f650200d0
-2123a5726c9e939db85cb8978184338adc1eaee4c892eec474731e567ed56618
-32bc375af73840f81530d8a2679d25b532495263eeec8a438b7a9569b01309c7
-e263f451e593689f209806808edef5a896c1632dfd9a823c9ec5d266702db77f
-b145dbf4d34a371344437074c6d9954253da577be60e4c2f3e303e382890e688
-112c07d9e4b2b6e5e710e51e1de8399eb0e01c618cbf2d0c02a71f3986575ce3
-f2afda7f40e9da546ffd5f61fa12ba786a27498ba5a60e568e09a7c0f0b1341c
-7bbc5552d10a3c23de3a76ede29825d50ae9c509bda892e6b3bbebff58dec41c
-c126f433c9f7a8f417585e026468565f5b2f823388e8d5a36807cd6b53294c6c
-bebce4329ae476c02d3e3e64dbc40b05c9d1eacc9321179491a4c760c0c14ea2
-a0b6fe66832957f908eaa6f18310690938a38a606f73132b44fab38884d169f9
-5826312ab82666de60297f057e98e26f0914a32f7b4ccd1c9640294909b17e5c
-1b6d206c57221a5a17e9eddc8e51cc9ba343eed45493fdb9aa37e477da35a4fc
-fbefb497d3eb070784ef08239303afc0f15b4a9d6d1e7ffe49783c3c4bdbb5f4
-7012884e1cef1996d2de2362492d8065009c863d0bcf4867463fd5befe4af3a3
-9730e869b632375b1696dd1b2479d21d98554ac1853fca848241b911b96988df
-db0713c481cff11118f5f0e99479a79b5e59eb0031f083721a37de51758fda74
-5332f9ab1215884c1476aee17267c91d5b354314804d1f56678a168ec756b61c
-d57d4a4476b7f3d280557586b0c0f88be44350338c1b43eae03d0f8f21232123
-6732997b3dc602628f23619a081af22185e1f0671d807f682885d9d7832ac477
-667dd8d99cdb3683cbb4758ec38c2982d4710ee31ef2b9427b9f0278b5a36b12
-8c1511fcfd79cd8bdd95f845e164202caa314bfe1dbfede5ef71016e61d47c89
-b880f63dc0a79122118304ccec4e3f5a7e9dd6a8d988664fe2165910a65b14b8
-27e34155b2857ed8af38eb81670657cef86b8151b5068ea992902fb55bd4468e
-617216c9e4f11a193c5e8d5444700caceb3bb49365e2dc4771a58cedda7d6640
-fa370a4aa115a45d78e61e1bef9b1f47eba3ad1d690aeb1cc1fbd14c003ddf04
-fa374f156be114144cd4a124063aea75f383bc81759535bac7accdf27adf05ed
-bc184fd63f064e97dc2b650f04ea22fba2c9765c9a90f00cd987a0bd5bf12f70
-54a870dd7e615b3ab5dc0f16879c7020ec4a60b7eb94dd23bae021d06454f6d3
-985e49bec7c5e01c8be251b4368d1f77b28f8c8aecf5a41b959bf43bab9f0ee3
-5a057d2671d5a408f48ec62be987e8df582f40931d1f3ffae7e9515df5452f73
-0aad038f607c30140ef336261a310fea7e13c18d44de07968367188b77930bbe
-d3be4cb2bf84392256b8a180397af2ff0ad22c0107c333b0c690ec01aedb574c
-9ecb935dab18a853b5de2fd79d63eb688bbfb55f8982a9f6d19cabc1d2f27999
-8185e5ff169c01ee9d41723c8762087b4e7fb05b7544972350438825df0343d8
-29005417158a5cb24e6df53d767c0d82f3d72c53bc5cc7de22d0c346efc28af8
-ceb4ee03194d7b9ccb465c0e6f9d015e1e2daea4a43d9b04d7473e1aad92e478
-d8f083b1b4cfae16b3aee3cddff25d6bac9e05289952044599c25143b6d58059
-9ffb92a171b10fac1c3f22cd64b9601894165b76f9da6021c90e1713ec69ec06
-5b3d3048ef04fc0f4da8fad276fef2a36f79488a5a00e61b3ccfe7b237dbaac0
-5e0a90e10eacbaf9bc7f47fcd09befc4e6f502bfcbf988327ff5ff8e4b85cd63
-f6f253e601c5b267488aaa1a0bc8b590e647455ebfced9a84e4126b0c67c5974
-8d85e0ad234d93ad38bf9d320b7349d5fd1b9ecddc1cec055903c9aa96584a4d
-03330eb0e95fe7ae0ab895828a9512989cdedfd1e66403bf4122e293582baa57
-60b961afcfd1e529240b44f5943fe38629fecee1446d6a20863b603634dc0605
-3985d82a111445f7006ff79a4bde99b758c18d3cef4c6c281269ddc43f6b3758
-0c58462b47b12d4f79f1c8745d9a197851e00329bcffaa2e312f45b9a909a7e3
-353fc343413647fdaddde0836faea6a7a0740623bf43fcc3beed6a99b9803a06
-a02ce672574d41898e330f18f3fdb0c3493e377dfb002728be112e6625023724
-a89da99cd67caf7c1f3b395677169559b06d748a331e2818f27f50efcf76d881
-c09c7c237e3c00304b0d6f59dd7a12caff0b1af769255bedb43de8d4a0fe7803
-62d04729ecde386d5e85e3476dafafbd4f41f24d9941f441cbc92b73a3c9817f
-ab397183e9a64ec258fd965707337408c4601049bd8c38d8b6f769ab08008f5a
-badf01bc94d801e9561a9ff414d7d2b9401ecbace8a8b80ba5abeb5d701d02bb
-6ddea8841621c977ef5d680b1d22b4ec83c1a749455c1aa9c5087035b832ad5a
-c364bd1f18bb7b20f6c735ae149fead92d2c3a5403c46e0d55d1ad0fa0d4f1d7
-f9d670e5f0426e865c8733825102b6b92dde23679b74cbb5ca4eee791b93ce27
-e8abb062e3eb82f38018dfb9f144cc640543fe7d8ed16493848b5f1f31fa86e6
-caff6c5fbd54555940d3f1bd376f454caf69f002b91c2fd77848c3353a3cf208
-414155a9fabf34047f1d6ac10e3967f434218357ac6c5159698f21e53075122c
-fa05ed1392431c4d2638965864baf262fb8d7fae487c4f755a782855aa157de0
-15dcba11a1c649cf5c926ffec3dc264386491f298d52071ea5b9bb50d82e1701
-fb5463461de9e98e029cc3b7d4621b16f29c598c10750f61ad95c1f096c3a3fd
-d4a327adda358bbbbb0dcfd9ad6331e6a28bee5c58506eeba7db703a9524bff6
-2abbce7362e3f0dd61052504cef97f1725a5beb35edb5e08de8cdb3b72c2aabe
-ba2c9f6340f95487edeed33d8fb9006b2b105a71dde5f440a0543af51b9d13a6
-70f0438884b84220229e992f3c18d0193267b133f8234cd5be9625c712913e2b
-14697b6042de352f6f1afacfc6a225a4faba63826675f83290965a536ea3f31b
-88ff1ca2774aab2d636ab6de2f1f87fb54a5380d3a8b5f9a303649a4f7c0de26
-626b97599b0a935da6a62d4dcf88b7f603bac672f6575bbcff1784271bf18bac
-4e33df2ae95221bc09d7a58b670df76bd96d1303f66ebf40c3712eaa384252bc
-b63d409a8f280ddea937f73388ab0acbe7f37145bed320d3efcbd94bfb6e6c29
-9ddd6925174f858497804ab4688db812cca27262e7b5713979f5d5fe167294c3
-5f10878e60950d1b9d1bd4f7f10c0c0e1fbbc095c4fc1856f4c04d85649b8011
-5fb0dfdf37f9604f4a9aa6061b5029ef157b757cf3064a9aac5aac24648a9c15
-f0a2a74dfb655e65341c03139de98db3dfc2dcbb39bffafdff9e67d734516e0a
-eb7c111c39b6ee987f99a7064f98c4f974a24466f60dcdd9f8e526033bfc238b
-35a5d78df28a114456211b5d26a164ac45bfe67bfa3b39c4622d67fb8a305d03
-e5b8548d0c01150d18ab5de5aba0aebc35b456c42933ce0370f8e8413b13bc6f
-db80d558ae7b5a32077897e3ef1eb98b93db5c00f34f33133d08a6a8e7665e3f
-eed2e1bb318afb48b73ed72bf9b6234c40f028e76a5a0f902f8702ea234a92b7
-b8dd516336336c31f9baf355450fbe924c44560f32510e183a976a1f98e0ee77
-e99e26faa72e5e7bb50248c336e6481c1e7b00596b1f511db2dbef7a288edf8e
-5653620ab52f7e3d10921ae2e194c6a842ff1829ccb8aaa542a53c04f8c23cd4
-08b414afdacc34931bbb91187dfd8c1f3bef02652e042adeac4b9bb5ff5ef7de
-60926e02d49e3d55cc1ecdd555c1f4c1a1083dd19c6d58972d86558198314511
-4cdcee4aadf3799bf6d81ec7d4347225eee6e67126fd91937c7711072047ed3c
-4bcaad89c800e05a3304b95dadaf9c7333f0bc8aa1d711122176f3db92d0a4b3
-30939d1b554d47893be691dfe0e5c47d32928fd984daf6c03f32c1b99efda210
-faae4a783ef7d6eed603d5db1828c274061c1fdf78c40ce76a7949af802bce9d
-d84a726212e23d97b0ec1e975245826f3c49c995c08940c680c39a598553dfef
-1b3c7232f0b698fdce76a0dbc3a2fdf0a53c6a0a48233a322d1701bf43c82bca
-12ca3393662fc5c4d38a693c30b9d3c987e872b91a0bed138bc6a671573d4840
-46c9adf2cb62df79585011d6d61e2159ba67b4e7cb35caa2de2ec53452dd6d82
-f488fed31ebb907cee7f61773290dd0e0cf4969f2f123670d59d24f909b8156b
-9af55056199c5a1a4d4d3f72eafcae937765a6e041f626fa9ef67ad918d9e10f
-328b3ee0aac1fe1d3a0231ee926659f238c60c772fdb1d13ca48217e43a54b03
-56cf7084cd9bcc3e0e482c18a1d5e01cfc1ccf0cf196af73f676b915e5efb9ef
-5427d032e8d4f9cfa5fed93f85707a1cc136b7bd35b52a7a4cadcbe3f3a6911c
-dc5b7fe0607861e73d5c36bda58e125d20c30ebe336dfcbc4232524a179d763f
-6e23915fa34eca1e4050027a2b8b7f54ebf0b95a68960c676a0927242a436cbe
-64f7fcbecf8dc5c850858725a1e3b701915f9be0a41214e42fe2b850dc7de4e5
-edff5f9c6eb1be2faf002a6c3347f5895a6b39f8a4ca5aa65261b03d7a17b58c
-b04fcff305a35b1afce3bc9465770b512604209efa3052c2a455ffa83b870d21
-15bccef823883d2a92d725123912a9e89b4abc02185621a728a447a5957d78ea
-36a3e8640e9169a850b4a2cab7ecf9ac05f2e0b30c6f626a1f59316e29081c07
-5b22a491b8cc89d149eaf7216cd9d55de0214ca1e70a5cedeb9824894dcccbd8
-dad1e22d7954a8434773ddfcc0474ff722a521462bc78d20369fb9383a6530cf
-e8ed7e26bf47e61f7d16c44631edc1bd494c461aedd67ab56aee434c442927e8
-1acdb71ad196938935646560a0cb98677a64431ff44f2e50552fb2706f206a1b
-39b95c94b82c148e1a3618b666c555a258908f96bffdf1e6c34f65919440e8a6
-4c10982dcb24cb5ae5ee34981c9c340065bb0a6d68b1735ca808bf5593d86440
-6bc88f81d3c9f0575216f2f2e5d7e12df7459bcfd90d217f4eda8a8d6855e960
-e7427f6f3630ccca0d72994f168eb9e0b7d401e797a1b3b250cb11d3873fa3a0
-4521d64a5c71b3bb2ed62c762184a15fcfd4290761f54e5c2dbac8a9e196bdfc
-0fb03afdfe8c441933c35296063e4a15699c82b83142ca7ba239b6c65e3fc1c4
-e287be933346e534d611c38b85b298c51dacd20fa15f91a7c84dce62e3f9ca70
-000b6d0e62ef647b47f8550ab0b3e0e0575509f08d73b522653610f2cdaa60aa
-a62677a35d57d06e9f15d99c7fdfa77fda7625fb3f418bcf4cbe480d748b99a1
-2e332920f119423c75e8d3b18de4284155230945da1e26b73cf56aadd9e20fc7
-b94a75b55e3e5ae6b51a831d087e6e5b1606757ebeed58b5895d47546620313d
-80c230bc01b17f0e11b70e1a9b17bd878e2d5ab31e3436c92e5366c5b92f2392
-08e2c6994fb869586c4095ab7c559bf8c70ba0ad8cc13ece387c57a6f79dc107
-ce6f7821f77c6e8e493f756453512038b01f872e90dc1d9cd0b82026446a9dde
-fcceb653599aa3b063fcec2f7e9c80665b65ea21e69b82ee4a99ea51d9441ffc
-0f2f7dbe9d4dd204cd4066874b85ba361fd0aff5bc11b8852625701c7f174302
-e60cc1e257e6511bb7c819a8838501b1432710df25b653e1e3804e4749cb9abe
-f08ee2a0b28ffd07b9742fbe2d67d568618a593945959a706fb055abef058a45
-c07d62ad9f63c2349ab441e2d72b8be49d1af258e365bbfea63da2449a87aded
-b306753dd10c806c0c9361cc27ca6f837723cb538ced898caffa815e12bf5e9c
-819b16a449f8e9bc06a8f8ad631ee0e8e23b42dc7eabf8dccb0f9dd14f129d23
-49dd04e23f1e033c95d11fac2e2809416055546a93c9d1bf3c95fe8cb4cd8cfc
-f0f7b21632bec14a136a9b694e40e36049c6f233e01df150a946bb28fb0f000a
-4d99dd94b292f45acd9bf8cb8269061bbecc062b64b38c526cc7a55e2aba039f
-c3bf691978904c0152d90c85f5c33779af5101a6ab0eac7577624649c9ea8604
-b942b0b966c3c6e670601cf3ade97a20fb5a7a79e5c3c0d5a7569d615120e89b
-1c33397696744512a60789193d699802ee1f37ab3a13f8c007da56db937f80d0
-b9a23b066971241f34004597effea6d0625fcd9f18258aa378c8fc4a41b7d1d3
-931d1a7d17edb0d36568955e81787f4f2ff2858855f60b3061a85e6cdebc42e3
-44559734780c07989a41642720daf7cb97bf3be7acbc590d57f1791238ac096c
-b373165488fec94045578f0a69fa4ed0366b94f000045ecf486b0bd54d89bbd2
-33d1d814886fff091d6bf567417120895056372ce8d490c02ee8c0b40634becb
-3f13ca1305f352e96df55e9467e16ff92d2a2be8b1d65eac380e41db62be9d4b
-341f4bd6aa69349791c98fa61490bfe18286bdcd936b27b18b6675733d447eb3
-79d07b8cdd7bcb3f1297d4c142798d6871bbac3752de9b23ff6853d5438dbda7
-6b33d3fe159a064ad2d2901d5b31ed8a3987ade8fe06cbbe7d69716b4a35c489
-841220a5365f0a000206619b081bf55dbf6abe9adbb9aead2dd25b66896f81f0
-9c1c9cc4332972ce1ff07930421dcf83428e6fb32fb86c6089495bf91273d7df
-681070765ffc1eb22f5a31a00d424f99e11bef8067980e3d9f0e66ca266bfca1
-61413cfe419bf03ebffe788882aa52b4ac2b1928800008394e18fc88a55f1db3
-788c6882da7e4a1eaf14fb1dbe6ebdefa5cef0d686245c1dc794298511d38006
-2fae24096f728f0aa080ecc9d85e5bb0d989c5ea82fcaef430cfeb7aa9f6369c
-74cead4731d892a49458cf89dbba50d7f6ec38140852169dc4ab886d92a91a61
-40fa81b25b8c93393837d64b8c390389205b36d444731b3ec745a944b6cd2d4c
-b75a668f49b01b6689ee9d3bf88be3ee24d39b00e20b4764513e0b2813c5d4ab
-2d067d468ee2a805e3ab73c05ae11e55b1205af42fb851bc69c54e8f3f1083e4
-4b4f781cfa7f44ef6b1ddf3163567d125e052870995761b2a9c5753e867339fb
-781f0f80452d6350d4cc6dea0c7c6dc7ebc3f1d99653ab1374b26091e7247364
-b9ef32721378fa994ee464b5d653438bb181e2d5af0d52f6f25955fe91825f2f
-504ed079a87da169ef93971413c2f31fe10ac677b7d533207be18b95360d9aaa
-ba427161e12af468b4d05e929406396ab010aa775b3746098a044328ff0e98a7
-e53240a0a3a87e955b3e7c5dbacd9a0cfd7575ad4cd9cc22652c7cbb43a29764
-01ae4868bd7f4530775f0a6bb230567ee11d542cb993b2aba34f0bc38a36204b
-85ba53df1d746b211b1bd22ba85d6a7dcf9c039527b26d950afdf4892d186b65
-c7ce1c2de59c03a520af9d013878e989d6d5762824733cba8a37b01fd7e3c169
-90bb8b8b469767dc749663904285bd4fb4de7d363efa8fe2e058c641744f7678
-99f9b384fafaed93e9dea5615f13957c8080388b70c478eeeeaeff2f0d3d123a
-04ba45066d402c6d1afcb4920bd0a07a386bc5876c73cc5e89cf3f2fda80a47a
-63c7d8a2403c2c767625f25f2407931ca9f11d3f3f1236a77c38aa35811dce4a
-ce4f9fc2ec53e0d87262fac254827144e92eca37c09e73445060ff736a334f2c
-c1d6789ddc6f426024e6765fd9815f3f2636fef179784f7b47ea92a3f6b66382
-5fe65c4e219a2c43af91e40ac28c2b7a02e7afc1751b2b24eb838ca55bd7f66a
-9500ff4ad31cb1a627839334ffee506f87b0c44b50c4214318aa8c41551a606f
-e3addcc30fe261c4859fe204feb3471d9d5356c6508e2c37616d529aecafef05
-25b67c8f7cd1c26cac2d990ea57f3f48b221d288a034768646ed29db82f0b471
-fbfe3a70debbaf9736df89e7b054bfb1bb6c6ccb6a1a71f9e11937f156a75291
-5b717c9a40c8902740e1e5eb8eebe94183d9ec18ec857bda2635e0eeb26d7ff6
-3edd21c1cb4be925f049878ef687007a67636effe6deceecc73e8871441c842a
-117b9dd817ed80d0920ce1743ed6b8d9cb15c93725a4140995411d75a0f1bd2a
-a10bb96893a7d439d3110bba9ee156d8b18627c7c2b8217969e3f6328b53b4ac
-62dcfcfd498581b59b6d018733a3a5ed55eb759b83fa3b1c0793a247bbc6362b
-2a8837413d0edad8ae649f3e06214a316fd23c5d0306f0ed9f8f5b896026da63
-d2a18c58352a04c540a3f90de5d56a4843e3d1fb90f5e712da7897680a7a1d25
-4d32308f7e1b8de9e8cf4535d9c525325a1ad6f543eb0b1fb5552dfe957e59d1
-e66da60051d6687fbd7231324380c9eb9fc8b6cf4510b043fa48019fef1c094b
-84b7f5e3816df7c138f2e6ab1303b368687d1e3c7dbce4754337a3de11f57252
-4d2a143826e406e082c3d7a69ba88e2871a1cae22d6a7bf1ad1de45fcaaab235
-038cbbb623719dc5533d36af35f712e9f8ac826ffb49b4fedcc96c4f30913c69
-ad0533b02a4684bfddb065c32b54652402869d8d6141f90608201397f3f0bea7
-f41670b138c6339230df305a07d31b5aad40ec48277df06092358bcdb3961bea
-d551c94cd039fb97f46115d234965aed70aced9be3305de77c7f1a33f3292bfc
-f965c53292a7f31a8926e038147a827589579842df86b16e840b836c23fe23cd
-059ab92be7d7037843661fe65ef0dd48d31b07782b542f0b0852071baf3b2809
-8b95618ede124c9545b31323d1e454ada5a03e1a33ee34f6e1901d54fb90ab12
-ac146fa7bf5aaf50f0de423e8e47d45cc01867674ffd404060eedb137115f352
-c07f7251835a8ae2bdfb70d022c2700b79fcb83c3c312e7dec4001ac20919443
-acc723f7269d60f3d626dde9d961805ae77acec4d40419a51baaccda682de591
-9df8ac6875b9fdf1f1281988bd94cf1f5f06ccba48cdb6039787d63295fff9b8
-c2b84b30383dadf7ed216b830a38caef32a3279e86ff7e92865bb6b421166e93
-923b68a473de95dd52c986a5a4f73473560ca69e8ce5f7005e9aed1f2ebf81ac
-397c9d6efd6067cd741739f7ba770b7724336429685d486ced5a122aa4d78647
-81fb6611c6fbfa68e7aceb2a757992b249cfbeba51bed32b7cba777fa78f6db3
-95641dcefd1a61263e2ecfa95938e2c3380a8617d4a775dacdd824cd2c2cfc67
-8a5727ada2b1da97f157e543f252f8d3d2bfba555cbfe089e8bf708ab253a4c6
-3f6ad9bf11b96988aec8a66984ea4952ffa81aeee213ab59184f8be355db5010
-17bf130f7d492b9bcc4b67f2cdee249f9b00bb405e3c580bc56dd1639ff81771
-8d57d1ca96b5e8df212bc86b709355d1551b4167b4e35b14a32a708d7df1847d
-f80904addbffa67dc2098848c24b6154410df3c6ca0559a1855803ff6426aa69
-ccc262dc8a2636c17ab65c23004d5a33c7b6c801596f0089a033afd69006ad4a
-f21c0cb08238c0051345e0f1b780e914b80b1d74eb45facb77b1c043a55616c2
-8ba8ad3983fdcfa07a3ed19ba69b97c234f89a296f581e4a380fc58056e72096
-7781f036f7c3691ca713ca9d886ed1b4a742295c29c1ef093f93d6fd507af0fc
-80c5a01ca38c17b8ecf33b38fe224c67cb551e43db191968311c38779aab6c4d
-0efcc2a0781f4e0758a99b13b520b75808cc555736424a4333029c5b95edf387
-7e6d17b114cb2821286dc34dfffc1e89eec9519c44bb5c928fa4ec44bf5b75d9
-e13aab1a73abeca008d75e73d72839653af898db554ce339a867d7cde546c249
-d0ac179997861a121cf2e1a1001154ddd1f337ade69263c021bc78724884f470
-4cc8b2ee48a1e91eae27a905d0e73a98b00c4353c4da0aa4abb75794b5617080
-a4a610ee9270af4393efae916b8c4f5af945d453e9ad0159deffdc96e5c6fcfb
-95d9546275d8d7e4608cf4add77202df1894ba8bd0394d7ab8a066bdca5c649c
-a78544a7b54b7c6745321da400d74a0c67b7c1f412901aa0c8c73d075918b4c5
-a5462d30577d848479987a4a6110b1748884576a374b488ed5d06e017880cd29
-70eddedbc04a39bf3cd2eb3f0a48dcb3b7679bdf0686e77c63b2fd085eeedc2e
-bf04a42bfaae73afe9012890b088f75244b6efbdc2f37774da13dd60c89eb077
-3018a2d9707daaf64a1efe40cfe46a5ca252def56e9ea2abbea02e4c86eceaa3
-85b194025491448e9317efd74f3e323683c036805c158e6c420c54a9717b4c7e
-7343b48e2e9cb16d98efb347dd42f9f2ebeca64bfca0d15c5f8209d35c0e6328
-f19be8be0c967c2f577d7ff09a9d1b4c6dee3d744d6912977e597be47e4023dc
-3979dd6280d66382782466112ae09f2c8048c93df7c38176560a87e679a681df
-708ee6ee2e3270bf6c8b07c15a0839b0b4c4a9beb898d523216f2a9384fd767d
-07256afd80a51a2782907e34d1694b1aabffc98f5dec33af246e5fc759c452c6
-6b34ec94bc9d66fb80898322701ba188fe5ab3dda0cac7230f6deb980006b0c0
-786f1586d58bf75fba6f52697c8cbde27b8525a27c0b8bcbbc43faf42b419156
-eaaf3475a96cbf399605bbed9fe577155c920eb4a4851669ffb1083ef45ee35a
-83eeb96f3d0586402baaeeb1b71c448639a1ee577c42a327cc78484f4dd38fb4
-44162bd3b5e6eee672e6100a818657759b899030a0b1105be1e629a391aa397b
-888f0175e74c210ee7d5a8a817d4725785d2cd565059c8f08a6ad227a2645918
-5de5cb6bbf78143177a4aad766d2fa844dc7399ab1f800b5671777d074b8398f
-dfac8803cf6cb19ebdc486db2f55b8d0249382dfea1732ff0ee0d8fb4638c316
-458c6263e9aa416105806a4eff7ad6abd753009c243c3b1fe505e6200a7fbfb2
-0e5595292589d13e73286122f291dcd71b708414936143008bf4e42da33043c4
-c4fb7fc1cd40fc685c923439419a441200d118c497892ca1c492c52dc1408771
-c428cbfda340bee7f84d0c2ca16c4e35a0962da289e76a728683bc6baf252f8d
-a0bb4e3514f5127c513ed939ad1a585d7d3303e13af4f5c35db672658269feda
-b0d139750a4b4a26253f6402460117d541e55c7b899f544078e7a435d78d474d
-71f7bd24e01a395265cc80e525eb2185f137b26dfaec31f616e7deb0f6018edb
-a959bcf2d04999d1bb21e39e43739c995101557de20e32e0b25674d17c12ce93
-f0dbddaac156767ed03f2e081c63ef94828ab30d4a11ab5091e632b6efc0d740
-30004eccfdb55c3a50ff091afca5acf052cdbacc49f4a20edde87dc6dc2e9d61
-7d0a40cfadde02ac8e7ea1f375267c7322dcc2d3e9633895d1f897969c3091cc
-7a0a7a7c84a4bd15ef83a16690d9dc380f07189403ef0d9113c7ef0da0f1a66b
-61d7f9593f82f849743647d8c2ac15b7e0c87b9f7ec8d7adf890c754cc29c38c
-02982e19d542ce713462c3f5e22feb2cdd4cdb6627d419c5b499c9442c58e4f7
-f0c0ba8ced3cd519473145238abd923930d31f369d3e067b6dabd69c740586b7
-93acd9e69ae61baf1a063f062f22025bc3fa2e0ddfd7d75454dc1b8ad9629167
-656edfee69a41240a08f6fd792e5cf510a3254970429cc76f8c2f95a86d75d2d
-c98d8c7bb4418561d37f478ee00e9ec8f52f8c745fa570d42eebff048d60a6d3
-e16d9a9bfd1722aeffaaff77ec82cf4fa593353a1bc6d96790dfc9c6484d22be
-72ef63932b363c6b3057969624cc63d177f5b103b77b8a560bb0595da7416e29
-a8e43480858201306e31a72b3a7e01b367a8917c19293e57e4535d734fff4e17
-f50fc475ad13a5203501cf2c29a3d135860788507413ae93be0598f21a51f317
-e9da8415f5e00a4dcf49f640ca26c8623ba9c5e80e8fba310c8f06570a629a50
-758318dc48c876b126850118b8134ac65333f17d67ffb7f3c7bce5c07655665c
-4a09e6fed0bcec0364386fba63f4cd34431d2e5fc44e3821abe5033d77c1a901
-183a127f32b003add501dc875c453762446a87bcaa50bac3b75a453caeaaaa30
-12261d6c08c95eff1df3ece254e9f41d7ae85efe476e244fc9d9e0853017eba8
-7ff6241cb9d11b7213d2ce679cb1c071daa5317c7e3624df30854049ac46a995
-97422a2dbe9814d92e829744db3d600fb8509f9537a101862f9dc84d17f84b82
-b819ce71e40c2e397259459f55ab6af355a6c4f359ebb831fecbec1dcc4ee2c2
-503dbe52d26b3a72833d36a67a73c9de2705769d8ea05c92bfabf4d3ddced23e
-a37214587f6b58df7de6318187d2272ef039a8955de18eb7069d08fcd6f9bea5
-87a2a6d3db572662f278146b51f771189e46a044ef16b7def53b9746d888f2d7
-ff871658dcd3487ab266197e7e34c177f877b07ec4dfffe71a0120fea56282de
-97de3d547ea5b97b5f2fe7f14f7adc84f461e5fcf9aa866bfbc84c9797c68749
-03b1a017186b2a386dfa8246c584461bc07194eeffb18f8127cf521e7756b715
-7f6f7c7358d2e5d9255feeb70eb771514d052035d27a86378a22d82378d99911
-f8e667e1d2df9611eb6c369826eba29ed9dde39dbaea38c9fbf05ceb5910d484
-453c9c282e5d418163b4adbdd92c091758e1432e8e75e151872e1dbdd5e813d1
-1a86cd3a230bdbeefd67c02448594bb5e8ea2fb6d07b098131a73a28f9cd9063
-59e8cd66c000894ed7ab70240e06602d7c4e5c2847095c961f88f2b02f2ff063
-ccb5f34f7e0696af4e43023cb3b0474af145dfa09dcf90835b766358e2ede785
-c63e9bdbbc208fed261c5bdf4d10a769112b62b086bbbcc8d25486310f6a919a
-35383ca27e13724504c63667f79103fda47692d2713923a5b982a2633b3f86a3
-46b4d7159a68ccfcadcde10084b91150fd86e1e185753a663fa82eaa428541e1
-40edd7a75007ba37fcd7bab998a401a37348f58bc42d809ac2d0d38c7f49c350
-2bc84208804d6550bb732dddc1f760684f0f2bd1d8fcc61b29b5fc6b357f3832
-54a0f238a00f9dbc38f063827fcf36ab943c9f61ce4add29be32889b32dd1584
-c54d3900de0b0acfc1345b1bec5ad097f75adf92655a12542af7b8c618f07bc5
-cd4d69b206bce599e1e6a8485849a7f2dca770618e877b44150cd34101e4a8ea
-e8d3bbfde9dc4a862af61f8fb4db683a81e614545d38927875cf8c027c3e28cc
-152d7299854b95eb16df2443c7ec9fd40ec579b52f9ea5a6ec56e3b662171b3a
-bf35565869988ab1684d47b801ae6eb23a6bf085c41e3c3f2b040aec9bc6cd82
-58ed64d6ecd8332f966da918d44af30897e54085050a0cac70f459a72f5af683
-3264a26d0cb7fef77574f10d4fa8ecfea0aa397d5bdf3a62d8897723de545ae3
-bbf38ef76b76e3e72d1c3a35b29966acb40e13928de55cdc20e691daf5dede05
-b71e8713e67ffed407f926be5b69aafab337d2f04992abffd60364a8549835e9
-299df33af8212c75c0819000536b89127613c763df066d184f718e1f10fb8e08
-f5fe7b8abe9f72743d0db04afd1d528780a097598a67a9da8172247c6d638318
-9885e4fc9231537ad9bea8c3028c7cf26c3ec6b7adb82b1481ca1b149a9d2316
-2ef5477fe27363a3b2ce1dbed38128d16b869eb8f21807f6d5430aec30cec535
-d0f4458efb8c19834474719b6791b30edb637f54639396a7dd581a4ab5e97fba
-284e1b756f2e2e3b54d6e136b237bbd042c69b21244248674dbb4973ec7ecdd3
-9f1ef47545ff01b39b09d06aea5b412e81fa46ab0d048b6803a5992de0fe2f63
-6d6d29b316a9bd4608131cc7b4c0dd1db4a249647ef8dbc5a2f9b9524284df3f
-1e70a74c8aedcfde0f6c556713ca8b13cfd5094cfe64f1f482c29e72adc2024f
-a2846a10ff5344cfcf8113d0d1da07927c53b9aa76094106061eeff3c7e5bf25
-d875ac8c07c4ef7a0bd5d4af2644e6ff82c8aa6e4506975ac9625fcdd47fc085
-4ff26d3dc3f8843c1d97948374170812c223ca163451e0fe4ad73ac7089e4fc6
-c24836cb8413a3185224724c5b302fa8d9ede4bf88a0109d98be35ad56b45045
-3422785c4f579a9307a860be505f5d880fa5ae66c82b293205e738e910ebefaa
-af82bd9d493ee18eeb12e40a69b9ad40d5aa6839d58a7894b5cee115a2c42465
-860139d35c0f2640041679283c476a3fcee985a53ea863414b206dfaf72c7d10
-851ab12466eaf532d90be235d9beeef7e389e88a9319c536954f081f511dc717
-16f16c21eef839669bfd0d8b505498b0bcc83eb41889e6380d8104fb732e982c
-ddfe4d508c45e8741e21d6e5934e678f38dbf17c98196dfeee7f9e205a52ebb1
-b9e2fe333d6b1c1b1b3386e079fb941c7ce482f2ed5c9426a224309edae06e3e
-9e8f5819ba4248d82c7e9cf44f7d1eb97b2110f9ce9acc313579840154427df7
-b2e57e2c50c38b25f593092f20350e27f67a1000f86fe87e2acc031235de5aee
-f246f75d4f4bf7d8852267941cc50de864e0ea34e02efbbfa72587ce257ef2de
-b249377e0df834e89060680b54c38d036895e4e2f8d55b9e4a5fec6da7b99966
-9b4ad9b695d6cffc349bcd34ed2abab20e289417eab1916574e583258817a100
-5173bdb345810dbbe2c600c25fbcc73727698446a2c4d1f71732208a70cf557a
-30e67fea48eb40f288ce4f576366b0079195507f25bc9852f6fab94827a79d9d
-16fad40c0fb0733ca838a148f1c2050590eda6cdd3a87283911efd861c7183bf
-10462d87eb0c7131c18346611088c5a8deb6e200ae86977736f2d15d818a444f
-5c435bbb043c7bca3d5f65152508a0234c6043d7e67da24f0b4d8b3e7367afe6
-c50870216ce2e4048589188cf361412cd5cf8baa691fb7dc66677822263ef3e2
-338a4064fbacdd0f7460139c508bb21b65f3f433c90fdabd0170268b7ca7003f
-d72ab116cc3207ea8aefe60b715e426cadd96d4dde5cd91068214c92a1307237
-951e92f30e07878b695bb519d60512ec7124d4df28fd5ace12a9cbc8c4ff6c16
-f697ade3613e22880897bdb1a3aa680ccea6085e234ae3d62d270afe5d4254bd
-6c4d0fe6b7c281919e6d422431e1be80d47a51628e3edffbb685a7aacaa27dce
-73938aded090460b036236e6cbaeefdd26c1e5caf99efc45cda9b3fde97bd072
-9efcaa80ef173375e99894d12c609bbb57fbf0bdec7b2150970889d08f992382
-23cdeb12483e3fb57705d03eb900f648618cf5822b57480e2fb420a5022b4e22
-138ec9b68d4088a833d50b2da7a26b4cb07ce56aaee2a1fbe00dace02a1de81d
-143f3b20f87b6a394ebd896b3a6e8ff548ccd70bfe95eeecf9bf9367d543f75f
-575333b7426d644dd94d675e17dd5694b3a1535aeae056900a9bf30d6a7e39f9
-62dff42d57b9c7d469446bea7dc3248e2093d47c3afc995e7be86438cecd902e
-13b1686c5ac4a58ee9a272f0ad18599b8495306d146ac0f6b958b86b72e66121
-3279ed284087ccbd1e8c865df2fc26702cf399b46afb744a3e99af6079fdd596
-5d1b59ef92713a40d56917270a40fc029583989c94caac0ea6aedb0310ceeac0
-96c62a045f3e6b5de1963ced45c566d7b10ce5ac76a81ff38737104595667628
-b51a1ba8172022d9c06f5ed6ee8e429be415fea9c8f648a27f8529090c6bce5b
-69abe90177b1274d5bcc64d29db949132223c7eb9473d5af376a81d94826f141
-9bddd79521481b06adc451ef5ce33ecc43a69be43916509779b4c8a5dcb4a2cb
-c12bb54f3956a97eff63d26de59faee85d6d3ed74e2f897fe852de6831deab85
-10e2790367840dae069eec64a77abff4e09225cbfe9f4fbc99a1cff38e2fe632
-792db6c32e444e85b2e09dff8f66dd638c2b0b5ce375980a894bdd6a1635c793
-33da9068aa329714e0ab8066ccb7eb15d1ff96414de80b5b791b34a62b25a249
-21cfe87d128a4cb6b93d0e51ececc9deb841e3a3d63e78c053f1c580bfae7d6d
-7482bc54705022d1f48bbd33d9a2ac7e0f6ad5efcb172aa4e49f356b993bdd6b
-8667e358e612b24ea9994a30f80a4db180c801b740a3234c0c95a8ad6d823791
-0ffd5806fbb8e86165fe6f343c72e655b57b2102f41a42d0220ab13a53feb105
-4836b876148c29b5d2532869882f7b54c92bdb7794c13c737d8a44bff734def1
-69786d9dc57dc55d385209061f38a411b5d49c66f191af793ed37432d2001a7c
-0fa0f23b32e80ef519fba48264eaa841427b4fb6311995d63ad919ad034f2313
-d6f504d4eb0369678afb331cfe7f4ea1b69175d72ec4df93d4fcc4d91b880009
-6c371d04c12f033541b6e1e7a010689a1614c157d5191c69edc290a907349459
-b6ae2a0eca1e8e871cba19bafa4b861a29172153afe7b9b7764a6c3ff87677d8
-8f8db936d12c33ae05e93ec31944ab240099e39ea3e9de81217996c91a4b5685
-e5d9f7be2727d5f3fa41079bd37760568f2f4b4ca19226949b0723985e98e7c0
-9c1be3b1d19514e8236f8da7655c016cc7a79e7d19c0415c74ba1dc510536799
-5c08f9e243b1d3065b601af52a1fc72a24cc36b3a283adc49dec4d33fbdfaa37
-055f9ec1846911e326cecdcdfd4ab522d2b2871c03219bb991567cceeae2959c
-96f068e117770adff52a3be04d935141c20a9d1c56252003f8bd51aa1d22ccea
-15fb359f308ff2d6979ba1d0da54d9927f723b505b86de8325bf3978230924b7
-97234835b6b946c5239c196be506bccc1e9a4f2c339bbbf7b4291f1e830352b0
-2ba637fba6dccb5930638db302bb61621a534c7993a0096265271ec3ed86fa81
-b6c7888114a33b3346a27931ea6b0b2eff65f94ea692addafde2579482a28609
-bb20c6f343c8fa777cfa9bd9436cb47cd0dadf4d16754e7da03aafab0edfe819
-3d5afd59b5b96b329bb4955a9af589c6881d81ace8c97dd92be95623d94b7825
-4cec015c59bf4ce98de9081328e7cf5d085803212054da028016350005aea631
-bfcc435114a426c5d4367c86311e6437e0a59137e29db512efcf312e1fa13624
-ee6f728904e0ea5def5e842f8f07f2627d077320e90927a81fc6162586f9ba73
-d061839ee5dfb7c4c66a530d1a0647a87ac4ffe48c956fb619c01feb95baf99b
-56b0799c8bff1d670ba5530cf7cceb6b4aa1de7119958d3ecaedd5dcf835e7ea
-f16dfc6c671e6b861297e675ba9bde08d0654c4d9add46a288b15268df4a6572
-62f9b12765b59b338c718651ba92329c9510655da59347336f8be78b9508b267
-3e366a409db85adf04edf07d75111d2fe6fd24a29e5072a876ccfc4290b0f868
-fb9fcff47575a376c594196d8463f4b2defa8434bd1e769553eea3e817fce981
-dec52191e10a7c9e2a7328df0d568c9149bcd8476913e4cd385176184e029343
-3ad94901ce4b5c2cbb88c785553db92464284fbb1cc3c456d8211848dce535ba
-697134df3371ed34bd6b0fe30ad22356c0dba8ccb32055f01c0fd9a931191bfb
-a1af29f383a66ae3a810de7da2b79241e0bb376e4405bc7980cc17ab240b9820
-202c4cc9ffba362c8a547a7c9f3fbd37b55062a294870721db5f063e05b48d9b
-567728f7b844f85701174fc98aef1e583a022b7207a834dfbd9705a16ceb4dc8
-c5dc9305ac98f5f41be6d317e20cf2d7166934586bc63a4cad29b1715bbc8d0c
-0fa882e364ecd976e7406899f12bbcd6145dcb5f314195cd4ab865ae475a0c20
-644747ed8f79ab9f4fb736fd7f7361d4885bb41cbbfd59b0b7620cb17659be6f
-986fccd526e9756bdf412c6000dbb9ae766101ec23f8036d1afafd45f106ab14
-a3ef3553cdc80411e766399bcef62e77e67ad7568812d3b150c29a961dbd4e47
-ccf7ea533d1bc8c16ed25bf5a330731ccd02139b72f63234d49d5c33a995abac
-40cd06c867a08cb3c19b7a0f9df091d51a1d387773ae8dce4147533e41f929ca
-cbe198e61b81380306dc2c99e99abdd0b6f2f84056ea25d549bd1f88be1dbf4a
-6fc994783d4475d4018f48ed18f1bb851a221da3d9624e3a7faaacbc5e9b8424
-797e5646d08404f2feb868d59714e4ff77d6aa968749e1507dbd7b3ff19218bb
-fab82906e56136cdb9e3ff1db470a20298b16f08f48a6937761a593e5d98243a
-c842bd5c3acfd41791ab02f991374cc14e1cd0de834d5a13343d70d739c746ea
-626310b0f7678b8e7b767265f343ec770cb789e8dded6c56889ccb0528ecd747
-0668da632b3f399ef2e28e3d8731708d630be0df2a1becd0e95d031aeddd74cf
-6a2e2bfcc5024033e2828bd043dc7271d1863937c71650e5510418e9b9c35b7c
-8bf9037305bf2c78a63460dbf914e867c16ff5dfcf05c44912c4083cfcf6e498
-e7af6072d7052e882b188c696fe69d1cefc7baa001f095ed80299c9290c31dc8
-3042ef7d9d3be6ea2f97f667a77918eb207e459958b60feaa7ae8d0fa14f00b3
-37a1b40055b720048a3b67c2250f3d94b10133c1e473e5f9bca3b4f72da29c5f
-d4c09b6520ec5c54792dc37f10d75c0d4302844f7d193cba7ca088838ce44a82
-f1d3161489ad1b9a2cd319840c0f347131f94296f856d935661f691d737a7e94
-51872d4c49e71e9fab6ca34a96f682da48c50ea79dd68e199a2a1d49f81a132b
-9a990f99ddacd43888069c37571834ae8dc60a69851f7a80d65f5e1a688930da
-8784aee9a5d6ebe96e62e4cdc8b34740acd63f50e208b43a38c6bd0808d356ab
-5ea11fccd7ab3bcd6aae709995b45e03bddfe1052a1c8417f1d8a794a66a0e72
-9db494db21a36118bf7c031c1e0a47c35682e1f0a183e1289a438c799273543d
-99a3840d7549891458f6a3ba49b9f556920193dd86ef7d457293c17ce9cc76b0
-6eca47da729b0c9d0c3181b59f993e773f0279ac90a5ab526aacd6d8293e67ed
-ca0eacdbf1b9aba40e5979a2f20810e6590decebb53bb32414b81aecfe304407
-c42af75e03a6c1016c381a378afb7b943392c081af0680726c0ce4c984856999
-2b7995735bfd871bcb6228d87d3634b3ae50d766a3237361a9478adf6a32b12a
-b435014eebcc53c44c63c7ae474b4f6b0e4fa1b40731d0a3aa530f9a1626e700
-12b5a51fc6473e3bba2e0eb274b747273ca382902511948174fa78de5c7ab5d8
-7ba99000052d5c0a4c3ede1da7927b214b893d61fb11ebd6dd1af012ad26c065
-fa64581182cc1ca3b86150e63e5e3b892c49fe4f6ae6c34ca1900d5fdbf72c87
-6728d86b87fd0db490dbaf34c1c10b4d123ccbddc9887b3818f4335baa4991cf
-812bbefdf1f3a3c4ac56fb633d75d04c17b5256a8216537c928f9d48b0fee946
-fa5d23ce42a4bcef5075e9b4b144ebcaf4887180c733e8e3ecc1ffda9459588e
-a4c2f6af2ef3a06a8edb613ac2d5dae127e50077c4377ece47b7239b15b2d27b
-d08df1870d8f78fc6e82a08441ff64b83ebf556db056fa7847f572fb4c2b2a71
-e5ce66c223e92040e104257c916587c439e8ef8cf32e65b737395999c7a435a0
-2abacb6129f95513d1d89d7cc1a0c8aeae5b5aac1d78dc42a37c435c641972cc
-b3c92858756559f411b808ba10a55ee5296fcea9f4574550ef07156b66807b45
-2735cbbd8fe3c607b2e683ccc8f7932e4d5ed4d87c672fe56fbe8fb644f40ac6
-9b88d91bbc73fe3b94420e4aa3e493800934a40e519e492806fc34d134989a5d
-1c002d51790b15793c3dca232a38c0ed32ced20ea5bcc8da027a7144434be835
-9689e94ac5e8b38da131015f4d34dd8ccded41cb86fa14946ca03f3ca776821f
-83f875a2660a64c4a3788038d7ca62d041e24ae86c327af49cea43f81f9494db
-935a8b065639c789911a46b3737d9e5db2bd918982f172a76cec867a086cbdee
-a030c8ec695dec82fe0a6ae7dc013df64abbde862456b4d525517185015efb3c
-f997ca8904e985f2fa2ba8f72acf1b6704ae358e7d7c2868010831ece2c87739
-17c92b6b425ed85f3f21a7bc4daa9620eb6a224cfd08fbeccd11652427fc904f
-f589c45547a3a33146b80dc930fc515655593d24d259d925e4fb46996bb35db7
-fea309a4e4162646a85d3776bb44f20621d4193b38a28d1472535ec01d1b442b
-b681c799ced74655fa5b5652a8bb99012035a5f66b2729cbf45a998130d619af
-77301e13e23fde352a367343b8ed274a70ea92670eedf6f61a34b18db9cadfe8
-f45bf4933b81c8d98a370e5d9afef4a7bce1681627e3cdb633708efa623a3751
-7cefcc75635dd85ad3ea10ecb575789247b9d0257c40f97209447341deb604d8
-6abfb08a5120fb0fe71ec2e337928a4e4f6ee3113064e488270af5425c9ae51b
-17e9dd6892f9ea2f98480ca299275c88bccbe584a4a192c966b9dad344753efe
-efdb52013c642581e44d1b1c866439648fe1389963039b0a9352b68d7f3dc41f
-fd3cf32c49c062d964fd6cba0fd1100beaeebe0fdf55112132d5e51fcb0c079e
-f644dfa99d580e0cab548258aa864149d4a4c0e618566fe4ca9ebcb9324bc63c
-5ac232512d086830d18d0f6657e9694bb9b3c4f4915a511a45b3c56460dfd523
-30da25d236b0356aed6ea76117885adcf2bd57222199bb5fb586e97d1c89ab8d
-08ffff75137d2c0446a81c32bb336562088bea8702fea749c21147defdd87024
-d159b2bf1692244ade86b3a9f63beefd1b030a29b6ccb2904cee95b737180520
-59f4426d40c7ca7920d06fe5cdecd29e70983f787607055b277030105fa2d9d5
-adb7029c7a3a799494c6faa9ecc9bdcf91ec35cf0defc2b95d6bd447904851a0
-ab0e39fbecb080046246ff21e2328ce12bf355ed414334be01ec175299c7b82f
-3e85ff80347a20c6d46a596b85e842c185b8e7a9bb8a54fa272edd1d46d7466d
-d668d145ac815c5b051536a2a393724dbf52a3412409f40b92f857337f1e0adb
-23d2f0cd6fc33564a3c1e9010f6e0350c966a7a003cae4da4767ab839f032bed
-9ed1e90d128cd8b1396cef03c25bdc76ab04e6bef073bca02d83684e11731c47
-6937e5b7c02b5214ede19fb749eb7b33a4212701ec325a343a7694dfd6be76a1
-98890826f825f18ad39ebad76e2d9cdd294a79398d431215dd95bf1a663ba9e9
-b130f8e80d2260cddb9344b644ce84974ec8787ab84ab4b9517e44fb09d77a36
-102df99690bdafe89b4edda58c693b7f8619039a3ab676f10d37d0be02b29bd7
-da19c67fa4d07c1d562a65247932762895fa5e9002c45e59350ffb811cc5181f
-e8eb49a988ba3342d129e03e86ab9b16d5a92b4e872e973be41da232878cd14d
-f9d2db75d4d5285232ce5e4480fbd0c035dcc427e35a9773edc39d4b17f1eb09
-e842a7348246f1d69e3a15f40443471fac10aa392adb71e66b61308508ba380d
-64374b66e8d234fc62e392347dfdbd4301cef800aa88f29414f8d5d625ed4971
-f49a4473ec350715c296c71cc7947091b49b62feba902f3d68a29e67522b0db1
-3524416b434fed422da4563d3349d19d187f7f8fce150d746b4a038224e123f4
-8e27c8b26a83d039225b551c489d1309dcdf05eeabc4c1594a0ec8596c2c8a05
-081c9df97b8675259256b8531fbf5b684e7ac076425ec9e4082530763c9142c9
-808c3da66c0cba1f5f704a4d4d25183d243c01d33feef4119606356be453474c
-bec5283151aac2b18f231c6542ecd340f07cd7728db3b345aeb977f14962d72b
-e54f4db3e5596d6da03985689d8e6929a2aa8cacbe9e14b539cef80b2edda603
-34b90ee98455008b4768dca85003895ee04613075287741fd8ca8d579dadfa69
-2a5ccb49a6c5257296f9fb71028a6cbd52f4daaa7f089b8a65f1baed85c35313
-29afc857a7b9bc8ce5905ff58730033c8d49a45f9f098c39a08c2d537ed00b01
-a6605633e2eae0971506f3df8248ec06a343a4aa93dcc57bcb9afa200efbdb0e
-543f964e8b9b524f460ac8a72cacdf807b7dd6efb9f768aefb928876e40820a8
-31686dcc538e5cfd348ac3b6547add583322b3dd982e34ba161ebb0a9737af1d
-580bb24095d2629a6db07413050f653e8700156bf5bc85ba077c244a55316841
-aaa3c6bac859ccb7cb9a79a7c9a3704431c2caccfc35cca5f3851a560f5720d3
-34497b4a425b539cb74d462463a8ac183c924a8e53726325cedc4913b1ffd640
-466ac24da3595c7f67993f9b6c22ed186412831a0724a352c9670f6b5df44513
-2f271fb623984cc1f8d268565f5def71ae23e6b5ee14e33c7b3a247763ca2a4f
-9ca8f339add4056629787ec74e0bf54b8102e4b22c577f9bf3b151dc8aeda087
-bf05c29721f2e7bcd3433ceff31fb65cd6fd530ee077f4f0939ba37cb38411fa
-fd11e1dc3e910c2a7ca28eba1cc381e3e43c3a78cc1087a25631238c894dd752
-46cba9a8df26d9d44a830a3501fd65a324d63a969665477cbc0306aca018eead
-533c7685ecd289573423ea384eb629db976f9230d6a1fa6cff299aa98de3ea79
-f29b4c274eebc64bf619fbf552d6ae9c60e7c9de74036e434a4a6dd6e671fa41
-b8cc4c56b811f6ad0cc459fcfcc2bb3654928fa015fe4c6b1177d7c39c747fbf
-5aaf612f30b889ba576d87dd4208a9e99becc44753aed1480bd1187ec5172632
-25d00b69d034e040971aad2beb20710f726a696ac48efb960d05a0f6f6f47962
-2c5a5690275e47c173ea000d392e8c20789cdaaae0637e01b321cab63858b0fd
-901209b323dbe6c61c10d9bc8ee9acbd2a3cfc357f33ba4d5003a337df07d9cb
-32b7b7360148291c45a4d34d4d850ceec2ff978a5f0c90a0420b2bbdb4b6c778
-fe9b5a41833940a0ef9fc0015e0d3e6c80a9bba970c57e1218e10c0c8b8c8808
-2f444af6ceb012b2d9ce6a96eaad590070424ef286225d972be1fb2ec18e713e
-59497bb9917a173fd07507a422e35431fcf4fbc6ca86086f289c9680be087a55
-873c75e7998ddcde7b71c54b3ed2f6b3571f0fb3d4c103cbd1ba2eb006596829
-cdca02d166fea0f63fa0c044ddf4e3d941413b900f8550740e6115a86818dfac
-9dc935f8842e0b011d2746e198ae3a4fedebd8245b8285b7dbec0ad0a6d1e277
-23ce1da5867caef28cd21cf6378e43858e596f5ac514cbec60d57a6c4c6a2820
-b541f4d6fd50a03eeaddba07e236417341ce99fe674079a48725c6fee9b3293e
-7e2b593a573681155c344b0626ccc477840e49e6d7b76738dde7b340341f4edb
-30155156049a4600f1d8c17c3dc2496776425fd23287127d5a2f0d9fb785db1d
-9be6f1b410830df7f19f4c432c7c7766253c67eac8ea7ed19bb0df2ceb178adb
-5437c8d85b7b27fbd2c23d2148305ad2d44ec69fc26880705d4efc5daa7a1a6b
-3c5790e1d691a9975ca37d585c845cf15fc3c7b152e29137ca4168d42f8a7d98
-876564c9ad163eca51a2cc404ddafdf61f9139021d7dd275da494fa167267841
-b7903394140a7544ce4cf8b582bc8b0de916890a560ff490db22dd7b27b34ef8
-b8ac86149645f63306cd298b803ce40abda69ce13dacabeb0fd3c44248b49232
-2daa161603ddabb2498b9ccc84fec903b6b5cfff8e9ff5dfde25a69457d5a206
-c0eef48227281bb1866f2d3f13d96c4f26c6f6c2c8aca1359674430747c5fede
-93ecc169a5855f12b362da58fa513ecbf15dc22e9ee46665507151590ab60444
-89ee1f1986af4e82c8502880381b246a905c5358e8d23e62c210c455b579ffa3
-d8b3e4d993e6c446f3fa77b1cf68c1ebeb463e9e78bd53b68f918e05091b6b9d
-453ec9511b8bc1fea1025875fc38ccb3d8d4deaacb959b1d08a226b4c830b733
-6bfb8ad627152314212da50aaf2c2b5185e2429d46ad31cc6f9db819934e1af7
-b1f7e75aad6653b03c2b6415c11ff5c6918ee1c03e4cfd08de00c2240194df84
-328d780e49d3d616432272c26711cc0e05d88068bd009e5085d172c31c97a64e
-f8070719ad1dd72d66ab78e8201cf1f67b84456e3766544471fd7aa45e706cb1
-37a9c256a0d9b2607d15392f7060a47409e4d6a5cfc310045ee7ada6d0105fea
-fafed036a5cb444478ae11d920d9541877f8c1c3740afb763c4ccaf77f6d1dbd
-40e40ddc6a430e8e99962ad32820055ee55cedc516b17831062d308916502d40
-255f786238453677e19b51c44d8f0be9ef19cd747d5836b65af6dd5c41ea6901
-b6fc9c5c7dbd04d3fb9f7f08a2beeb9d0c13aeb2bc1d5419ffbe2349dccf91c5
-3cb956df77eb73ab811ca30633e6d61d5534551d45ae24fe967cd29f8e19c8b0
-305283df0fb776e5d84c3edd20bc2c4df715285926e95f2f4c3b963726d2a7d9
-4fdc743bb2b82bf4855cc0ab701876827457aecd2a69bf58ffb363b7fdaa2ca2
-8b7b7824ffb535b9a74b00e90ad3f23cb7daae9aaeaedf7d2b97807fa3329cc7
-63689a645f515c11d4e50dcde110015d5599859ca67f59da7f93ab98b75edcbb
-f382f878b9b045b9a114b2b4bb6404c0391c8ddda8d9d635a9e3c74d7ebc604a
-d07f0d4025e39a369cdbc672ebfee5a287e07d94f161e11d0e18bf764af79a08
-f15543796e4daa5c3497c4a3986084e7a9ba0789a2ed2e1432623b03c210ab9c
-e59dfc017ffc59039df164157fe74dbfb00087d3f4026f4d625c41250fd4c09b
-b71495a7e2889044e87bda9d1c514734c3d14f4123af5dfb6d618765845f9730
-c66751d613770679c554cd03d99f4653db05440e2bd1202006a05e044e501381
-5f51c02148a91edc8af6143aecbad2804038d2381f7436db6d46b0e9364a893f
-5531e49e42a740a40a87614d10f9e22d336711ff79a6b7b9f8248456691f864b
-4ee2261a13ea203f282e36d6001cba9fa218c220e447313420be2a66e76c4c38
-2d0cc85cccb5d4640fb8f923e1c55c9dd5cb80918976b5e898f03263177b0832
-2b1917869cbbcfc7789f3d799cb53183bf85b89d9850c1a0c60fd6a0047b5f97
-592f3dd46718e25395b6f13c20d121bb1b8c4778980d05499ca442b3d4363491
-19a968f8a0ebedff2b95cac72a617172cbcef5c6e706b9bb1d9de6431beffbf3
-715116cd1d9207402ed3453f6d343b92cfa09c4c23f8835919e183d14526322c
-1722e4eb7e8172b1c8c86eaf3a2187bf9674f482e1623163d2178351ac35028a
-89aa2668c0e10315ad5b5f65081e768bf4b02fe2cfa1e636266c4f632d1c57d4
-bbb4470f51d06eb3b26a5e02aed0d6f00d27fc4118b8a0b8b9ccae2c307fa7c1
-83b45122390c52d5de9bba735546c29d40027ca6c00ef6a5bdb99e7d9dcd721e
-cf6f3760d25ebd62174aa9c563a31da6a1225e3b4ed652db5b8fcf013954c077
-ed730241f4c26e0d2cbd1c246c855e8aeed5c8059e70d5bb8a1b7ff37e2d9ffe
-681f6fef2788e4a603be2b272a41946f63da44978d2b03033e5b44d098998d03
-05fcd73ebd820e5f93a9e9f79573a60b805ed0375c32cc65a1ef4569a893baf5
-45befee450304d67cb3460a10d620e929f44e352157e6d12d353fb3a5bff0a90
-4bab7dfbb4fa6c398877c79fdea6bea230d2b6df6b46cae2dcafecd544b56936
-40a00323ed5c9e30cbd14b40f93f37fc56011bf329ab6fb5d96ec229edd0c541
-ed4f661fb4167ef9c705b1d293dd432bf89b33e97a0dfc1ef10fe8d4c863da2e
-b16a3fb06680812c50cd83ae377c94fe26deae946687df5601e56a46496e2e09
-bb38c3414580cc1c327853235c483cf4600d1de1dc59223b4bb641cd4f256092
-9e0f3df061b19e8515fc9163d4f16fb3ee44a7a8cb1df1dda0ab32adb9252005
-34b21ae2d23b5d39399a7dee2866d2962445501d298390bc870d2d9ddb3586aa
-1ea3ea0fd2ad4458cc3b80c65364b893640c1c450505346a4f22d17bd44e7ba0
-09368203f133338077bb806db218d3aa4c187fbf7c440d48cd18ec75fb218210
-ce3081e0a56a7b44536910cfe0340c3f48033c9eca88560d8207c31474b42446
-6be9d5caf07a46a7892c24ca1792b5b3efc4dcdad2fef5da25e1b0cf22f2ece4
-0dd8715df95a808a223e3715a4a534bd276b6fb114f8493f72521f15e2f7c194
-77e0072d1c8f2f5a6038f3a91d5970656d7f3f740eecec42daa6615ebc893a6f
-cd030de96086b39cee1ef7e9207f1bf228c1fba43c53ea2b34732cf63bea3ff7
-60d3abcd75551d0b8e8d5cb80646ede7706674a63358bcce4059341471a7df8d
-f0bf5fb04baf4d41719f505923085f9c48388ce354b4bcdcf4fcdf7846a565cc
-38385d0892a856ddbf7f712c156cc114a67cadab7d472be7890b298ce436206a
-a31e770c38ec997a397f5af152af3df7e350bea9054df0fc53cec2f4a0ced3f1
-5c59a8436e4f14ff49b66bc6f9e1f1d97d4a0bdaef25cbaef33a0f7e951410f4
-ed5aa38b2da8ee932ba0a414ccf256c5d68271c75d51fb4fa4a7b66d8b4307fa
-82d5eb2e0b4681edfef789033b08b70c2e35b66c5f5b868a9825247719d2e14e
-7c1be51b5cb7b69fcf20f8435207e803bae6bd01fa949bd59d6e20c3ccf180e7
-e383fc79038a439dd256a4782906723448bedc672c980196562830632f809645
-872deaf72534ad4d42848ce497ff12d28ef0fbc728a7f60d60810db5884d77e3
-bd259d298dfe0e4de7695fe2ab4a43ce1100a5f766fca8ac44a9c470369a151a
-728d06bda6ac3a64905a9e7cbe1462bfaaa9a4d57a317682a221554fee457aaa
-485729cad67fbb139d4d7d4645457cc28575160493cf84ed6b4cf733052bbc95
-1b80a186e49dea1eb7f4e7aa45fa5c3666ae749676bca70674be4bfe6e196bcc
-9a294d3af5424dc1e994e0f0e8a89fe667ab89bcd11353b441e0b24993b0c1d9
-cd7558d2c89419aa18c2e85ca74c013e53b8d5f0ae4c53f29f7ae09e51c2d057
-95423b75ef20a44ab100c45755764a8d0eec7d8f013f30264a648a75bd5b88d4
-1c92ef78305f6403da9a971625be0b9503ba6a28e440af5dbe1954d785a93f9a
-7dd2904214940630ab80f88382486c437754bb541c946dfbbdcc28ea0bed96ee
-517b2f4de993cced9a5b503a8ef1561b74aed495fd64a44fd89a0adf96442db1
-cd2eb39bc85a1ed8bbcc60063998d49f02d3dc2edbfebdc022b8ce3ead29196b
-9c07622728bb9ce2bd992876c2e783b1dca5f33e8ff322f63209d94eba4ac6bf
-108ee86f250a9a5a6ae5b06ebdd0fd2751199d99513609864b434dafeddd7d47
-713b3da2b4b12ec7b779003e7df7d4f2bc33c9cc41ef41f0d9529dd0d3678957
-4d66283f10091c41bd2387cc771c4499001ef2c86d0eccdaa904e44c3fb818d6
-703fc8e425088b3753472b6c94a946ddb7ae390b2a2a86e67302cfbc5a3ab520
-728bc8c399655998fa6c4eaa3385df60d379173deadcb5e7543f8c6a8ada3c16
-744ce62c12e0f312ecbe114fce1473bf1a9affb8df1a118878066047c1a1ec5f
-ff9b8455ac309d720607eef62d2c0146fb73c256e90a722c5fe42aa19dba818b
-17fa00fb024793c03613650640ad749c039550e418b563f2c522eb7a40543dce
-7cda1b1322834ab1bd1ce555a5c284c9a92f666910af211aa6b258eb2bf7a28c
-ba47b4f8cfefe17985470306a85bda0aee57de81220a5f3c265096ac21da57c6
-60bffea3d98f2358dba450b29e832b09e764b4e41f9952e2935e09e76941a850
-d25fa4f4f916552b7ee31144c78776337c67795e135e26cb5e4e80484fcef1d0
-fb6c8a86911f7358d5077f41b31ebf9886430964bd316f75710d83c7dd696fca
-7b6490801cee0387b0fd42342322121f43163f512ffde8f284ff3aa1f211319f
-5556d08adc1880b1cdd4acf7592d4ea358d2f34e69a73ea9891498cd3d59a74c
-7a7c48629be752b60e795a12c1fb5f6d29ea48b1d32253e7cda453357d769774
-af1728837104aba991ab43309b2f298290dbdb32066b59b360fdd2f0e32b77d1
-797406014fbbe7c9fed681f4efa445ef694b26716a9d7b5ffb1375628d61d800
-70262b3011625594c8eb5dfd7147cd224d15aeeb9d443c88359236da5514d32c
-2308414414c22f47b85d88cb6954eb5a7bf4283754b6129ff9ba6fcd78e558e3
-281d4201679a411ad5613e38f5542549325d6fa0c15225eb1c13917b8d33fdc8
-30b2eec374994f6b6a19701f9b3a7ddcc8b2478a8601750da43565c7acb34114
-cd24f87d601f995fe17f94a33ca9005c53a5b760e6bdd4256f716c8d59d81128
-1e72c01629c2242295791e664f490d2808fa695986534146942c7cada8efcce2
-bc3ededf886ef8f4d0ebe0839c90496481b324dd7de90e2713c985d0dc196f79
-059f964352a2c72d2df0b13a4eeca5282091beab8bce8f1d305464a8cc69515f
-99c720e6e2221be1047c938a112f3e31930ad86bef1b90fa747238bbcdfe5a52
-92fb9cb8b9a4165c7b0156b550b536a7680f217f0e7130785644e1421a57c9b3
-e94d27d62d2835530785126d553640f88f4e5d05dc288743817504d48fedda6c
-637c53296d2703c986abadfb74f6f830a57c0c4915ea7758f2dc0881ce5a1426
-3f298c8ddf55dbab0a8f22e8fea76f63a565059c72e693d7e29a104f7f550d0c
-3d871d6c7e3c2dded288500f8925fcd72cc838545f2c7c05086cb8c19a3c88bc
-dc738a47505ed1e76616fdeb9421861d5f88b0904deb9ec637c997495ba85d93
-7a491a2b125e3a7a97046bb2cfc7187071067e6382a8da1ae760f513803404dc
-47a7f93b8f3a0b2ed5f033d65db9a5d5fd11db4f10152b19f4f5b2f48b8a95b5
-50145156dbd721997233961621f5a64f1e6513472e083c2a5357b08537c53b9f
-07b90663adf19c5028d53d26c4dc1c540c86e8f744c8e1d02dc76f137bfa6a06
-1792d82752b522e8911953e0f58906d47bf089ebc14dd0d9948bfd6ef2e0c892
-c8ceb39d382ebb830b9e6ae7cb522d189b34827f45c962b0da89ce3ff3e9f6b3
-967f59a7076733d65ccd8526a3b3db8ff45ed6c16392152b5593c94a1842741c
-2bb710e4b331fbd7bfffbfd77f81ef4d9c83b10eb58a2f51c4655f6bf062783d
-18c3c06ea4e922e60cef329de28fd55232aa8dd4224937a79723519b3b60504e
-5994fa207bf4e2908fa81ac69a2841d21cadabbb92498416a04630520b391c68
-30687dde665acc525e86fb783a3870ff43e0f0b55e50798dcb788ae93666564f
-ba7a6fc3742c86ef7e500d2ad2b77ee29348145b0738579189cc36d8fe15c5df
-dc4b66450947f168347afd5238e153b9f2b1d7f64373c0a90da71eeb18f72b9c
-f3e48ffff7c202ff5a7c2cd53a1c967f7d71e7cbb4e4159e5cb5f475ba0fef4c
-0713a2923adc04968030dff07fe9489eaafb0095e542aa9497544d47dee12c4f
-160ab99511673a43cc89c8629bba5f3863636b9ef246078815b283d9b7e91399
-e74cee17e147ed7caca02f203ebc977618ab18590e217ebd57e41ca020290d84
-f02a4fdb4f2b97df16b6cf7e3519eb810b654d0c50c4df1e68cd54bf05e52e94
-7fb47f105e02d1a4b7b78c0ec9f3bfd54b5cafd746322614ea56afa4d613d5ee
-6baa19c573bfd4640f9428f23988fd9f0ff4a49457e7bf1f25392d0d68eb89ac
-68f43c2c2e02bc83bb45d9f541bb2a6ad28b8c70516ca2476a52edb1ad4b467d
-63b970e2e40af4c59d46070352162eed10bf2662217b32ddcaa42b5c9ca7c486
-f3810c51a5c9f25af078ba635ed08620bb7b91818797cfbf47e7d9e22ddc1d47
-de4a7765c4566b479a1c66ae9362bd4bb7dc3db16daa5d27e79918bcc11e995e
-3055d826b489f527c5061f4d46606c7a4375ba317b35e43ddcc5811448489273
-c8e114b48d9e4e32fef51ae8e4440ba35f4c7ed307fc81cedaab0264ad7187f5
-0bdda954f5eff597f65759e538916efe1ceccdcf33c363a5879e78f1f47dd1d8
-2fa4a4cd61fa4d32de859714ccee93b1b64a3c7d9d6bec30aea2b10c896bb60e
-c8336dbcb047e66998ddb368e1f83b94bf3df73639560f568a5aafdc810cfa37
-f2c53a0f3a5d54fa0cc59a769f862b22d654472d9846099f5b5841d5f30982c6
-ac2feefef527613aaa3005607cd82cd56073dbf37d446f53c9509d9540d4b10f
-ba4198cee56d6c2448112ce7431a382fea84c92577de8ec194e3227b378ecf02
-a8443b9f395ba5bf18899d37b2cdca0df725fc0d3f2d2d010ef35d1d11009c9e
-23e611de999294c5b3854ac2cd44c6a3b5d93a2e3c0979f2aad87ad368478739
-94f0d9d78334a8cb0a9ae03cea4a9a211fabdb4cc1c50b325754e9c615facb09
-6e5bb94dc9b4ea3fa0470831cd8eb273753710a9d0e1122e0390c763c07b7296
-9b1ee534c46a82e62dd6d85eb1242f577a444cecd5caace05ead443675715ae4
-b2e89c8a3f861aaedfb882b2217c8a59f074ff7666d9dc0e77760e8ac0131580
-b4674ee1483cf7952d5f2614af279fe375d9e80947af930dbce773f89e2d1942
-55cffa5a25fec611208a5347d8da41d06b265537590ed2a18dd61244561f6a28
-6aa7b7d003fbfc182bf399ca86fe4f3b0f9916b4be9494dff4dde43d543b4475
-2dd8d8921b631588a792ea159aadc9a05b07bcb5ccbd39776eb733a2340300ca
-d08bec731a9d17bdfa35ba445f38db9efaa3f8bbb550cea8b742c00ed6237599
-9b9292275df9aae57f782a7ab34a92782a0b1be183913061201faa4340b54d8a
-0ae2acfb004ea2366aef056ce8a0a0e17cde94723223eec759e7abf285a133d3
-ce981716d305690e627509df3701119306b8e8adbc9cb7891bb5faf9a6b81e6f
-8b25275bee86edb442518ff110aadf7cb120bcfbd380af3c91e62f1cd51333b5
-6b25de8112c6d47e77bdd08e3bdf3bca8f20e6b96b687450b23fee7ded8099af
-31a25c939402b197b2356cf9d4d882a02b01a82bc7091775941e0c883f9ac2a1
-30ccf1d51440f8aaa64a2d0eae3c5ee5378b3ec57a27a6be73e3aa6676cdf3aa
-c6ad5603f20a30f032386d1293ffd63b98e751c6d937509bb27a0dbdd677ed62
-dd628e490b5a3852d2841774d6a3c16912b76314cbfd630bb48b958824aca788
-36dabb0ecdab2a2da7722c9e3b7f511a56a2498b329f11eb454b34b185704e3d
-8c244f54c36945370aad2050fe034726f739edea05b164662094962904f8474d
-263b43008f4ef5de0cc69c9dc7faa91c6beeb28d2bb977fdf96bdf27c4a49fa6
-bc7b802373517aa1e4d43342d90acb99f8db854b41bb95fc333e3fe0ccbef3d3
-de3abb46991ea91baa44fc52b96d5c5d683675fc6498d85daecc9f467dc76b4a
-f039a69902c5c677e998367aac1d3a765f52d55cc48ecefb30d709056d22c8cb
-b21a422419e6b9b9b50b3b5ea417e6b079d6fce2447322a960b74c33e4f7420f
-0ebefc2f36471c6f9997afdad5632ed7c0913a76b7314948696846b793aac81a
-491c8640a04a0867eb16d497ce0f26bbde677f840b87dc743122a144ba858a80
-1ce58bf6b3e5fc0fadec743ecbfb6f8fc19f778a3062cb14cf9556289e7484e8
-73e950c71c46b940d60a6a718fa72927e770e7a917987ac5f0afbf0c5b3c5ef0
-591455ae1aee69f4768d690148d8e2c831febd5b60203914c960015edd0a8e0d
-e3a47cb4e0093193dbd2b925bc3921f88b58d856b384b1f0158e44bee3e17306
-6c86c5a9673521f0c6dffd8413201a17e59a8235ec8bd63e60176ee65fd81832
-7782aed7eb7442d55164a7b35bbbb6413a36de24dc127cde8eeb9bcb1cdaee56
-7463bcccf86e738d7b5436d1079fc6aef850369c04139e93933ce920465fb403
-a1354553eaf1f8171fe79e61fe157bb8c9cdc80467859599354b73d983190ce1
-60171ad887b1d46bf64dcfe3c092a49e3b9447e1d2cecbc440a03a9ecea40105
-a7bd0e0a4dbbd18030887df3dc8271fad0a92b57da8202e425cb672cac0c36a8
-095330aba0cbf4635969d6f35d2626fe382ca7890b5743df92963de76e7eb4bd
-bb8a9a950ca59a553aaa6a94ee66b9bb154b86dae32ea20ce79de441228c47a4
-aa40949db9fe13d761781807d8e7adf991a26081427cf719ae656d40f3358000
-37330a4464860a41a0653fe5fd69adb6a733f84c2617420527ed720b944f022d
-890b2cdc2d7dcd26419127ad47a747c9d3e0f973ed50e9a83329294a7ef63b38
-bc297930be33e68046c466b7f44c3d374138e8ccfaa477db9ab5d83a77df8f31
-d330555acc08f04cc5e2126d4a163313183e0aaaa8645e545aa59c37efaa3663
-3c92a17a53afb715a6c8500dc1e2c7d454611ff5d7a60aa8859b8c3fec060f02
-c9576bda4ab3b101424b99e07096bb5cb7625bec43ffe2180635994158aa8b03
-2c82a993c6c7233d971d6c8306a2cfd45c787cbb5a1dd9fc01c9803689b4b281
-c82a7469992dbd60e611e37f0ed8133feb5ccfa57d9f091758622772fbc94e6c
-54e3b3d94983d914b3fdee77954be3252497392db6b3bd290c85e0a295f98c44
-5f87998274dbd62d5c724c3cfdc2385c6b54c8f073f9104086d618ff37bb4e1d
-5d571a0d41df55629c5c226317b77ec2c2441b5af0166517aacca31193143e96
-51ea351b6b17eb764be26591cf205855ff03022af47782095a3d03c805dccc44
-20fcc40f5a3aa7639853ccde5badc2a85248161a9266a60f17869ee89191524c
-f286cb9cef6a48d9fe8256fdc6f53d608f99b8cfbc5190402cbfaa58e16a0e87
-9f4cac054676b5f591f831c07a32533665bfc07dec0c8439bb4b51d54e35dadf
-5d81dcafc0bed1a21f0ef2fd67547f6f74815d8951b7cea076f26f5d19468e78
-4433f450bcd1f3b29bcdc72ec68385d908e773b6f9b1c137ca2b69b115d3bbc3
-05ce0e8217a1f42305c77b2bf244d298b53937579f5d54c94ee6f8607eee44ac
-06a657673402aa59402107aba64d49f1cf28aa48ef73d5d0ea01218c7b06100a
-9501fc2c15e5b67ad8f65eed9e42cf8a53cab1545dbf8c82803ec71a1bcda4a6
-0fa271fb315cbed111384051ddd396b8902ec7976fb48e216e3505a16a30e96a
-8d2da699b6160c8b3b5af59a00e705479d78dda5e08870cbd81da9868000bff2
-5a3311cdd21326a47a665c81bc450ebb14884ca84b2a7a1996a558330a7f17e0
-99eb457dcccd90a9d303afa279b45af41693612953c0f086d9ad81804d09759f
-c91df65a83c83edd31e652ae98f3759ccb963f40e83f532a98528911bde3d7cf
-041c6f8da633368d1bb63494e8ceeade4b2a50e6f3f4203d2ab275b751cdec18
-2509d76661094660cf22e58264dbea4738f5b2f05a4b6fe97509626f79561386
-3e78b156fbcd6ba9df4a2edb9d56251593feba7c510bce2768252c66ee7a096a
-0f350a5ae6fbb6c59f5369b3a94c7b4026f7f0670d7d7c01c9f4b58209a16b0c
-210167490ae40b4eda10dfcbb455c1068bb91d28634da73dc05830a33e0f2542
-848afe96acc2bcd8a138eae0baa5d1b31436751c649998f3aea75e95f5248abd
-d62f6425fd91506fd25f925097d6d67c6ca523f72e6a5b70164e0bc5c5781f5c
-04bedd5a784b3ebaa00c5ec187b9f30b36a0e3f6e4b249fc4fd085d7fdd36446
-70c740d4dde28e44a1210323dc4b1d6319328970acd5102cf9a049bff4e99cfd
-28ec810b2575aac8efdd65e7a9e6d929734ee4927efb0e25f843f9d4649d847e
-5917b6e18e440f23166d04e721696f18bbdfab79cf291684b3f0e8847007df8d
-114f4b3e7b7933859b0e27d019c0841f7ad680e54b25e7b52f8e729f9a62fd6f
-68757a9a650f6fc3cfb39f7ae9f03566b7d5fc87d765bd97e08e87e021a0369a
-34306fee74a2fdfb11f3b5f75499159e5c97a4f1558e78cae37ce871af94c108
-6b1cef84418ae4408897f5920443585f5029c8d70ed575c19eb1714e2aa53748
-f03c05bb82a355df1e181c1f3aec05cd63370e10136a3d912da64a717f66d511
-ff5edc9e42e15070b54455b95a52ceadfd2fcab3b3c338e6edd087123d2ed361
-ddcf924f61fcae961c6b8cda5089b4492f47db89088d80a994ed9551b977fe94
-8f2d92dc83f93067b38c91e873babd2ec1c32864f521770b3709c4ba93eacfd3
-74143d8159260afb59f774f70fc8a892f765e474b5e870d7a210ce552d1aa077
-10cb44f43b9c3e1bb6b0767f3de1d18a485316e80cff3a163b8e44970bfccb2b
-ea9f75157b99184cd1313d47dbbb21fca18ad708dc914eda5ad4122f7476fb73
-2c3a405c091a211756647e53a010822ebb8cfd4d331a97a1484d239986732179
-4ddaf15ec99812ed7f55cee6f8f015ef62ddc931378470c5c1ab335f5958439e
-f3f21f81e2993afb8f512783959134886b73df730f351e2135be658b38e005d9
-2be5950daae49a5db747e46f8376c1aa09c178b2d4d08674daacf05880852147
-6aec9a46230df3f4bdcd14081f0fd21801f7d26a0b0c5090a3e144f5f486d5c2
-85170c17145fa317903e7ad4a97315a8c4d0a9f845cb2d5fa818894f8647e94b
-feac033768c71dbcfc7e4b2ee4afe82fa0f63a2e88d191e579df6be30dabfb4c
-39116e045c791739845b789d2e5a4f4e138394c57ea1bdf03277fe1df2372e57
-824b4cac8751bf0d96c27c691b71ee19eaef51842d9a621a180af064aa774e59
-6d17c8f39b5095b8412fa0996136b523aa7e2d34a15ef1aa3860d1bc693fb986
-df92179b5c2c283ec1739a31c39df37e02570b2068fed8a7865d530b6b83e6d8
-c90755bebf25f806731eb5afe12c69b7b200595c5b9488511ce0b6d3e50eb78b
-b87384aff6319f53fe82a57e39a9758b4c2baa7dd9d237fcff940c7dd4e2dae9
-fd6f9814b52ae3952ae507d890e8ef4e46f47644d15663e50bef06e4c6e8f4c3
-c9bcdf6ce9c12e59442aab2209222e8e9c38e8d836e47401d8912b5944783d04
-2185e0b5d202456311fc41e3c9aba816d79444213f17d96b673bc819a5afde1b
-9fd118916aa3f976b67d40444085ce1295b2cf635a58d881b58e9d6da3cd47fd
-c385915a260cf460cd51d103aba3b9b7b718a6cfdf6e31ff90aa8abd8149720e
-7dec2fdc1f9ba1970dc589375737d50861ae4ea98b54f134d7870b435943e4fb
-50896149e3f419de19027f01feaaaccf1578410450cfb575957959a3e7f2b3a5
-295a1e03e47d2cc044af13c7f8d2e28f7bc6d498aca27d9503e19c7993795444
-50a6820f38c24b1415aa1322f2d3dc5d7e7802067fb426beb22fd9da5d3d7f77
-f7df61f59f5228d99e930652925a12436362de55a25f190fa33c3300997dc628
-ac5524bf2954d119407635b2f866e52bd1a44d764df26b66590696abcac99637
-6dc90dce6b68da6d630587aa9cd14fd4d9c2f27d8355179cd1bef7eb8f7b3ccb
-adaf1a938478ac5f858e712f0e908b394702a6e1129d6262b299a00e8767827f
-dd0f7d3bfb425b667717be47f8792fc7f852e2f3119a179c7d156e5e020926f0
-1a92a05ef6346a64fbc0a1b09ccd2a7e09d6e848570aceff71cd34ed28ac95c4
-03a468a2439ee50928e555086a6d40caab8d40dd847cd13e67f5acc91a12ef37
-85967f08fee498e5d9b562fa2cd3473995a0f76b860fd08393d4e59c38c86634
-f9d044b6d6184ff952b377691f3970e155f07412a640d49b696e3ea58cf60630
-ed965503ce7a6c0c145b6431fe0a5dc244173a089a49e0907fd2f8fa080f38ac
-ff70eee1ce6089611df1f488858c74b81518bd028d55b437878dd4d14e8d5362
-10fddd8c4cc9a8ee14e961481d0c0b00606084ca496a88edb25d984c34f6c1d5
-a85683fc244cce71b54eda970b9111a6ed2ab33c63fda50b49d343ad5eb6562c
-01748041fa0f964183d14239a0292d06ac831129fe7d7d34d0c82f1eb011f207
-c63fa085625feb4b87349abc9a065027ec25db3534c91ec2843c2ec4ff4d1b27
-1b1488dc1907ceca2d4eacf2d0c4d4c7ce6c42ac81ec78e853baf03d3941ccfb
-03a5dfdf040fbe9e61613d9147ce6f9c10e4f96797d15362467058bbe68804d7
-eb7113b166df726b040f2cf4aba8bbd3ed943c0715e09bd676cfd457a3c1113f
-eec29889c0e8286c314b74e4b39e2497c3c5dfda95278958c0995faa6dd4d9b6
-8dc6c934b1463734ad0c71e641298ae0aca519168bc667ecc7239cbefe78f34e
-465b10de38f54923be640a55ffb991a0164a6f8ccc09c5b041809e6ace280343
-0f447b22a97a8a7a340078fe1b765bb6f55d340f757ef8162162883ed66c029c
-f7ad3264829ac8c8c26f9d76d121167a912e1bc1e2869308499a1f8dc9eea626
-fa3f9d1ca80b45c3ade3621a3d4ba9ad3482a0e13bc7382af7157633adc45822
-d9a5c8a481775c8a69765c8956968affba3c77c115532c7680859c41500c13f6
-6f5b445374a79bc199d11930b2fa1cc1f8c76848b7a34c65f24a86acee4f02be
-4eda4c7da149723748b748c0adb67c01eda2a9c0db4e527f289281a70c32d574
-5486d18a49144a2d6f2d4488f61f0803805105b307e0ab0f4d795a0139acf396
-9c3cd6092cf0fe955653943dc38f9220981efe8d162caadd1f3587a5f434dd9d
-0a5efddb38477d669b1f2ddb90781c790ccf341d0a348112b559746dbcafc4d2
-e9c81839e66de708f12e907552c99140c428b13920f459a455832917abc1dc21
-aed809121dd4a9df4133b84378e413e62a0fbda75ff4e86fb8fd405dd3f252c7
-bed26aa06b485eb423c2aa83e0a478235240b19ef7f7ff1875c21831c7d50eaf
-ab4e0fcb929725dc92823eaf498c806a1b0102be38e754e3dc87754d1f480c64
-30d95da626a1c08434ad5edfd4e6be96a5c593b96f062d7c60e56a4a07152c23
-7fe4e29b99a23cb4a93ddec151cdc68fdb8428791987935574e53b8ff6c2a4e6
-4c6b85c47607618740797ff21b34f6a4a534523c649fb18798b55ed04d9080b3
-67bac8232a2be46e4d973f3cb860f1058ff46f7af441049855085e9ab8de8e1d
-cf035c13d86c62a1e7e39bf4cda92898a21e9d1a878f8cfc0c485d40c35d2443
-87a3a20eaa6cdb4920f6779fe9fc3832a61ceefda3d6b45b5b8c27845c2e9e2f
-c572e80423fe40d6d695d11853d03ead0e46974105333111101dd791c7b03f6e
-11a7f39a2d2232c9452df2e7831261a365e3e79599b69fa0b787844d05c538ef
-3274761f16f644fc94a7fb6ca0919fe5ee78539b59fd0232fd6bdf8e9e4b1c11
-485de6c6c1dc27f59fbdcad2790d1f9b9dfb1f88ff3330ca215e36636dcef81d
-167456983820580af7ba55c1f1c6b217f8a11e487fee442235768eb7b95fdf29
-d44ab8c385236c3947925137e26fd1278d4d3fe710527d9b017692b357aef874
-ffa8c09d59b78f3175f8fff85cb4d3e07c21dfe08db6c2036e98dccb11461fa9
-ef986be98232c893e25d76cca348df852963d1fadbc217658e33c49bacaf43d7
-1ba692b8e65feec21749e489c90ea26fae3540cb3a2af56b391569fbe2e6e1f0
-4e5a83c374455e1fcb6dd1adc2ed96007258416817bc4d1585625bba98ca3ed7
-f49f6439bfb0fe67ee1752ce1a678cdef7d9b02422858cc2fda1b58d0a62f598
-4f78daddc56c29c9c5d8d1fa7567cd69f58b3f6407f925fcadf6a1111978e51b
-1730a24ad9f5bd83e7a367c8e258c2d45f2dd5f7c3034690e968ec4eb4746a74
-d7d3316a6dac948d3db0b8d069bd2e833120668dd794d89f99166b04fed9cf0d
-b224d6985605512acb08fa6e27a8772e5e968fb66495cc618aa42862174f174b
-b400f59621a17bbb22087385ba839562281503632921c176c9e6c27bc2aaabec
-ef388fe9cb262e9305e78ec22a52f0bc54e0c4f167930de0558d3a3f228ac651
-932828895747c28573d3fb5e12bd7dac2ea2e00606f1e34ec36443822cfc8258
-fdb3b8f3a8d80fe17c6ffd932d63da28b50183071b30b198b078430f8c25109f
-710ccb6687fd2c3bcee778a5c80efb9edaf2609d275741575601b52f9b7fd6fd
-f99c10d28f4576c29530ba7d40ae384be27d88770b0ec8d870dd3e4a20a64476
-a30282b0e816c58080b09eb651c046ee91f52ac08f6c264a36099659d1e50e75
-ea75dd82238a36e7ca1c40cfd44ffc12051b06f24c2c4a4bf4bcd4aac42814cb
-ff434dc7c0a4356f4f9395913fa1df17e1ef2caf2f4afdc87189276b09988c55
-6b6bf8f4698d33e6acfc89e1bc25f0614cfcd94e575f0b881c1a8ea294996482
-ec2b1b0a6e4645d68aae01131692336fb74bacc9d91194054c76b21c2b01a8e1
-973e402e8915cab5c0b11da03ae8dc4bd570cf65746f0636a30c8cfb92752bde
-277aff02df8402201779f4b675c09817faac3b384f6b334524b08ae52b7995fa
-4e3c0a61f58fda7416db15558e1a6772a2349d2e1b1c669e4ba39a01b7b18c98
-aac82b5cddfde1daf47aad0dcb6ae96593904555ed04ec06a4595238a3508d4b
-4374bd37d3e8380f49c01f39c0071655e8b0808e9be5dcb715faa15c7875871b
-b9c75c2e0fccac1c5a597ed1d84a7f570b9fc582c6e54455551fbdeaa8796f01
-5800bd5e2530399b6be18f4e406e42ea671406ea691c732ab92182cfd599bba2
-5abbc1f25965c5696dcf2f2e9c64e138dc10bff55caa9a58a8c34519f8f50d52
-894e1d616938225abc73a28cb2f9216e8b7f1928a82194463a6092356aad8fc8
-35af7da897e58ceb6897ff6930e2712ba97e6c53c470d177c91300dbd04566be
-233833750c2e79b320c33fb7413c856a37eecf0b89c9079cc7d70f8c62e16437
-3b8f43e28aeb470b8865aa04be19307d3ed6ce12940a24d8d43ebc16ecaa905f
-2d7183d425035db5d77b518c34b2f002f199d27788664aa94551a7a5fd574368
-6d7a10851ab124640d58e0f67f0ad64bbe8c7a2654a29391485e571d5542f87d
-4d1b016cfd97584f18f57f6bf9e2fc514cdedbcf3ebb1518e9b53e8b64752eff
-909c7cd0a34a2cd3a945ab3c7049e255ebe0e40a84e2dd81d67e543ecc5a6443
-34450a5cccd34edd52dfc43fc420ef298103431ed1e49e8c2b4df26fd0727bff
-7f3ba05b16232f4c795f93a5912f6002c43aa243cf3dc7e4fa5c8d9e40e96985
-da2e3ead98770fb7c07cf8e71ecff35d2c255d6a3ab730ae6c2ceb3510752f0e
-2d8aeafad5a4ecb4c4d81dab5336d764e8b7df68b5088d6dffb9aea0db0f7384
-7593dce3f68c793ec780cce00e92e28a342d05f2d0b0d48fc23336c7e0dcd610
-a37eee3cd6863fd4b74eee6afd6f2235f92a1d32d32fefdfba511c8837d6eade
-7a27e375ff1235557486ef07d80a2cbcb0645ce7d1d2fd06247e2b52d47a25e9
-cad734659b9bead551871b85a2aad1340a9649467a791d89c9e40c6ccbed4f1d
-317b63eb10fc5b913c72e9457f0ba3aef5c50bc83248782c220ba4e1540f7192
-002c183e861eb1dc7f4f74a44088fee28b03979eb8e94e9392dbc24aee6ce563
-f4953106b2d7f71e2d38639965fa09d69d7c5569b416068612b32fe5faf650ab
-8ff820bb496ed9a4b025874f7477feb37157df5a35dda9a19a7bc3fd604e4050
-5a5c5ec5e9799cbaf4a8d525d2db9084f07395d03ed7a95e2adb4865cb36f3ee
-7a8cbfd35faaf669c4fde98ba282e5d2fdf8ca495ca7f1a054149d15a6138f69
-9a320b1a30f1faba3ab29ce4c5e4490aab404893afa88a1b7ae6731251e15db9
-b00e5f82f5f1e03145ae703849120f65fa475e1810a0bc636cf540ad441631a4
-52ab9767b4bc16efbfdb5c197501b0a8344fe008afae144c126eae037fdf9364
-f743c060bc4d17116e3a59ed0dc0e3218949c3d9259a6a4e0be391e8c8455600
-7871c3e0db8e7939346fe37f14d7a980cbd945bd85a78f84eb1809826c6d15d2
-628f170976117ed59290231459cdd6dc863cdad13504bf2da4c38ae32259ffdd
-f9325ce161a472c192dff26a10bbb74f2209dcea75a92fddaa50bfbfd12f6683
-3054ac58aa385b4e00bda8c962261fa4edafa0e85ef7fe908662b9f1c26cc471
-f28853b5c50652538f1b984db2197805deaadc12fb9cadbb68399bec0f707bac
-dd165f865a0e9a455e0a8e317b3b4c75182a5f4001c5c4dd68bdaab9896090e4
-f7e92f51bc147280b33249fc8785acbf402441e769f70b4d61991c51f6ae12c7
-6a26eee6986509400ffdf62268092c7e1ff78ae963673b60d874d2a57c2a1822
-d24822a1d8fefb88ce18b20d446f560f86e9238ef3e78d54ac04697c4ffcbc40
-09b9c1c2acbba6e17ee5fd9da57fa7e0b6aa720103862c9e5ff1567506b5e09c
-47fdef0cf04e4c10374eaaa0c47957ffb4fec3a9ff0cb465a10a5b6a09fdd474
-204ae694ed6e2b31cbe9333a6be0dcd9cc1a17672fc2be032386351c4ffa4684
-42810dd1c372e10a5343b97d6f623968691417bd32fbda32b1db60deaefa4df0
-c804d1c1926f6abd1e8d8fd4087a28ad05cd7b13080490b1bd03121270adada5
-e94a72be1e1c7c975d95690d4c2147026e373d2f464dfee782b5d074cf3ba1ea
-f669ccdd1ff040728bb9bbd3f27c2c63f0d381042a5e3d5ed43c397513a5aaf7
-62b4e17f1687eb9bcee0430b766ea8e1ecd137035a7c90b29e0e26b76ad542f7
-26fc0017903351fa32c9e9242aa77ced9f71623ca744ada6bf0ad855875ae6cb
-90d72dcff52084c7969ea06a49db1c0a2f11a82b5f524d1efbc7a48640944d28
-2c92da4d78aa8d13dc57a2aeb3f39e788e3563b5e6a36d78ac1df07dfc527938
-a12a129064b6e581d90308e2982fbc3d5eb92d7ab8b2e34cd0b2b9d7979def02
-e9a9559cfb15221889619ce00ba62c09dd6fb51e6acee8bada9573614a0ad0f4
-411d35ddb1c1d801a8970071bc5b7b5d1c41e14e96ee54208f17ba69ce95977e
-de58beab72e4c6bf484a8325a96153ed4672010717157034e02e78ab861f118c
-5ed3409b1db8f05f6ebe0ad2ced8008a73b3cd355da36c721aa40bd1df3f5af3
-41389a9b965dc43002ca70a828a849e41425c85cd827fe6e5416d5bf18347726
-241d22d665332ea27392009e81b3a24442fcc1b62832e7b81b02480dc6df345a
-ebd859cbe6a4d439b8400f4813cb9001f4c2fc67d86350d2004f7075a8264ec1
-e29eb0b255c6bb530206e96f39611d5446ec2c468acd603423137643e26fa702
-942d436bba71856e248c89000a6021e8bd2106861ed20c5b02ca4da733102b97
-7ac7e43e8099febda83003b6a4610a9fd0dc723d506dde420cb36e188c56bde1
-0a433a8a85589d9ca5fad1533da73075afbedbeb5358edd0e57492414a09dfc9
-418b0910b3e32efe87c0fa8702480aef1b281a5acf6d577e49f801626b9d5532
-d85ce8bab30b27c9053f740d9b1ab84812071dc7294fe5a79dccfb8ea3d33e6d
-514e303c806cc8d27852acb180e2cfe39c72181ff35c8799371fb5c0c0c002a8
-b1b63207ea72646785a35c4b1d6b7db906f1a1a814c102587a4640eb8db15ad0
-4d99460c843109555b33859b1aacb2e527d5aa120dedd7e7ff078de5782ff5b3
-3aa960e29b51b867c111a439bbae20cdb9cf3312288ad9eb549a989d863225bd
-a7991839644cee9cb7b2544b41e4777dd3f0dccf0337977e32c6e9791781b091
-2e568744cbb4a2c3b431f62385def0ac69ee221d4e339b407fc5641b1d67026e
-76e7c4425c5c6b8f56a1640c0b78c3c514138300fa971c220fee8ea1924802c2
-f58176075ad39d4c3f336a758956c1502539a23d67ca167eb119af5a95cbe134
-5989a25786ecb9b34abd0b5814468cc339bf0df3f63fd5032f0708bf0cfe1876
-91430a5ea81e649ff57f6a2a89e97532d7b58ab4d9be95e234885b39a73a7fa3
-d0ad9eba42dd20ebe1c4805641341b7a06ba786fa8c95d055de5b1b35ad51ac7
-d3a98d7e9ead882c5a0911fa45692e6dbe34f7fd318c17ed7094b38bf7113f02
-053f3b8a8c74eff956bb5c15f6cbf212059a2edb25528f60f67d6204b08ed8de
-b3f591ab5fe471ea4f602ffd6903afd034eea6b4fc7ed858c20d1e4a1c343ea7
-bf6283d3f3d8764f3b89282188941876679b48448645aabe8a04b8ec12e8d76c
-75a5500659e3cc3109962fe5c945979c8f56a997fd806f3838337de82cefb25d
-986a4e39416a170cd2c2bc223838d24b15330cb2352ba753bfc0d084886e7221
-2d275a4cc0faec6af2cb8591db187da7503e479c83d2cd78745c939088650573
-e9e60b3aa954044b347a63eef25daecc3aeff608cee0c3c3a7864081f7b237e5
-6806e57f68012877e0d4210e85d8c0f917c3172ca19c6fb9198ac8456dd9607c
-aeeca44bb0984130da6830522697fb5d8408430217ff9496275f0ccc323a9bb0
-52ffc86a010d14478ac6ed38eb6d4f5095bfb738ef0d88efbb5d26558f3691f4
-59f62b6f3d8f3c2bf2a87634d6b65b5c7c0dd9fea60fa51822b8e185999b4c60
-73730e89c0b8e48bce1abc500c1929571afce0ad11147bb0fb682c976e67947e
-6e02b7cd6aa88a3d578bbe3ea88a458629dc8799d34df525fb56b5618fb025eb
-c50f0659d9e9922f0dfe78d0d9c8ade1beae1cad423b5d63d43b0e50b8a9707c
-6322600d467750cfd7a4603bbdbe9e7c01899a3447ee96c66a464859cb0a886c
-baa46fce0373d84f6ff705e177497315d48a1b569ccfb7ff6802c2ffda806e11
-8cc119e9401e0ac7745971d33f21622cd806ef4d761d23388d632470f4c04ff6
-ae7a008f343d80bf70a7d02a9aec04ec3953501594ab91fdad11d6119e6e5ff7
-5055af6868e9ee262c36763b29813f6a6660b18635ca76c9ca7da158f9cbc823
-c234598ef5e858eb25cb422a0a30a7bbddae046b63b2e18832d73b7d2c2c8562
-31f88e8d3ec0f6a3a319b06cd5ca75a8b78b060de77d6108f14182836f2ba937
-914b433c8718dc06dbf52c11f6db1026d2e03418bbfbd297158e18583101bbfa
-7d932e2ed1a3d4bcb4671e9c35ad24732a296640cfe62adf680f66175fa8bfb1
-078b4f8a36b6a04c0534fd0037e9be040eab494fe8181ca7e99911f339d49a24
-8f084ff5bcfa9073e541c2b6cd2ea98e9818ab8594a1952a9a4a46ff5ad29692
-5a2043cb4ee3d9ffcf04ab6847b73b870350c32648193193b2de0a087262d213
-b270353988ee6dad64e54fa69ce113ba122c659ddab50525a5c5fff3855dd0f4
-5f8d1e6f4c8790ab73c2637a89af0adc86521390ca628b87a0b28b73d527dc77
-366d2bd2bbd51d881a0cf439aa85e19315923793aba81cb43ab8af1081a43f03
-8a8b6c6cf72b5f5d5761c279d23bab4cfe0db2c08b557201c583f401ffd20e7e
-a459c408130a1cf7edd311410d6fc05c7cddc6b57cd75ad08fb7bce952e0e378
-f6265ce9669177c624184dfd2a8bb7318acb4709e52224e44322a68e23728410
-e7ee378db5286996320a84ee9b00bb98cc9e6a1939ecbc6983827be07a8d2f4a
-7f16bfb7cca00c158e584965d7899a0a627163298030b8ffbefe9678289f4bea
-f835f749d878ad6cf3791e86f18021c795038f7dd00f180b9990006b9c8cfdd3
-630a37c8ea6ca98e5fad3d4a7cc68ed9aaf043b6a2e2974e1e0b77aa9e6edc4f
-491a7186ac562875a59abcdcf5b92abb49bb976a0dcdaf652ad02d70a93dddf5
-d2b2dae72861afc83bcaba60e08f5e149e5ad3e133b2edba17c77ec4bbdabaed
-57b9993fe76f41b0b5677892ac3520a04cd900070e589cdcabd105294c201186
-81f1d8b6d424c8f3d4a3311d1ba1fdbde82b1181fe27559e989364d34ce45f59
-54b49210cc735bde2d530d84de0825bdbbd3a43ad45e0b2c2369d7201797a873
-d13a15e97dc4011328682a38ba18dfb2720e1ab6060d666166ac3fff441df908
-0ebb1e3a8b039e80fc5c19638501988467a55a5a72aaf62e6f79ccce8a3095c3
-37a8454de4d221a3eb4c27c77bfdc4c1eb13c82987963ca769bace0f1306f3de
-5feb716b12542517ac79f5b21008654a9db7f46e2ae284c466f0474c92e4b13c
-286801a27516f2e33593188700950da279f55166c260b647033d6788518fb8ab
-8365fac94ecf28bae7951c0646c841c7374288cda7130b22189a0a9f54620c12
-3611842e62e411419974775609633d7b77bc5be483e13d4b34851f67f3395580
-b47781aad518df810601e7d7d297abfc761a2b86624db2efe2f11402a203ae52
-d8626d2d9830ca9e19cc6991cc818461a5a4b8bbc478de1699ebdf8a29f57436
-8503b18b699c98f0002f04018ed1f9f0b3ac9ce0f87e212b23774f8ace72cc63
-1e99c6ff814ab41433ea2ece6021ca93e5fa451e3772ad243090e0937b7484a0
-5dc02321d6c055a60436ebd4d778754f3e7e4605f4250e22b9cd1a12ccd814f1
-eddeb081c03244951cd43ef802e3aa5d1176417eef2d1c33643787f5528a61df
-90aabc2fc28a06d051cb52080a55783a91d9daf657518e5cbe6a7f6b91a82f86
-0dcacc75436c1e97e2273391802ac27b13af9bf2ef23277f2d45005ffceb0318
-45baa5a0f219ef6bb7ab7e4b393eb7ab602a802cc711acd271cfb6e886b582a5
-645924862d791d9305f4c3e72969bec72708b08ddd1e784bfd93e75b2eb90754
-0787c096a117759fb3375751750589bafb889d7c3e0d72fe8177d7c29f16b0ce
-96d65201519884c6a6255b50aadbfade3dece3fd1d37610bee5a31a614d65bd6
-980b7b2b12ebf02feb7482ce7fdeefc401fde075957b527bb07de743d7f8fc11
-4ad7e0d01bfeef9d19d4fb1d36151bc866b85489af274d4d58996b33d107e9ed
-b62b0517d4b1bdeab330f0281ee051ac74811995d148e0b0059986ecb5d17c28
-5fbc4d7ced7bbefe9f877fc303a0b0da0988e564a28e06a09127c34477cd37e7
-3b6a367e155fb2883cfd9f05f2df64d9feb9b379dccad9d1f3a123c3fd1d4ca5
-f8993ee3f62b19015fd51860bb3294625a6f936135d0b4c76acdb41b543d3de7
-c501192ae23f20f5f03cb3a2d463e3392ad6c5ffd4d33ed382bc3068be221667
-4f2f73a3e82c12b65e6a6339dadf3494a32e7f438629b7619a807d78ca6e802f
-52b450a4a60ab82ffb8345a3a83b1061320f9d4a67467f4bc46e9e86b88103e7
-f1c218b0881f7525eef46cd61719c018874681e6564294d37874fba063ffdabc
-24d57e553799da32f7fd498fbf053e626834e07390aecf277af8ded94146cc0d
-a01dc0e8ee4a1558a38571ae3a23ae16f6ba5069bef357692dcc6090bd2a5a03
-72acac2f7fdf52898bd539cde242d5ce0985339060e30a7b8ab2816eae920141
-47e70223801fcb31d23aaa237f9a46c386f2000681f17c9c2dbdc41e60e66b99
-ef318f557f62f9f375ffdfb97a439dea9143f0849b579fa4949be1066e28463f
-f2eed4f309c8aadc0ddf04be3f08edb096bfd656d8f567b48f157b0e24084899
-03b64fcec581ddb9d5548fd0f52331cc9746a7dc0a506bb37772f1c1c98d9ee4
-1dec9b9e3bf96fc73d40f5b4220ac1f3d2db769eb6267d985d3ba2fcd451a87f
-74321e8b1967d344f666a64fc939514b985ab808512861527253e0203387183d
-26e3f001bffc2fc25670a0edccb7e0bb1ae77acb8099be4e65d3df6f490ec116
-fa8b1ce80884b53b22547111d314680c72ea849d66430ca595053997e9669894
-12bf8a94d3efb24cdcc547f4993ca291653f31b16d64a0b15561bae47489681e
-e56df9f2ea964d6bc27ec9c33fed273e2c91ddafc0e994c61621adbfcef7e6bc
-29da8d114c35c48d87633072fff31627a095119ecf2014443b9b3d180a3c1848
-1fd0a079f11c60c046487904c73e20cb0c8558e63f1a1f03810430df48044b46
-2d7dc135e3dc7df8f8f86dab887e9f3e59e07348311276bc4451745bb0038f6a
-a03101638329ea3719c573a74f638540e0c6a9e26b638fc9e21aec2bbc9c12ef
-dca71884caae97a648e19c2d0d1d89364c47e7f8cdb68db910bf75cf31989929
-9f73d0416b472698c88b49ea6501ef95d72fd70702709f19e01457a70f9e9590
-e546dfea29d2ae0f97ff65c6b7fae6874e230465e5dfc37e929199cff89611af
-ddf0ccace45de017828aa0f60c12b4816634820fb31278ab8afcc4d231a8652b
-ed7ca3f05794958caf5ce60afa102a17df3ff4022531009c4fffb57a87b8a64d
-afb003137508e574a1674bb6a0a6e56c65916eaf7a280235673d4afcba05ec33
-b4924aa9a54d9dd4773a51b5f00e60baf0c950982db184ad0c96ac402a12259f
-22d1337b3c5321b7c8692943fc5655e0746a3ddce98ff33b9d13f884e9029347
-2aabe2275bced7ce59373a650d11cafd1a2f74394567c6491b2c0c1546f3f284
-6e783fcd8757d2b8570f8616d60e97b3830606d04f130ec22bb950efcef6652a
-01f8e358c822d788557c41d1066695db66f60440aeb80351610f7efdc2aea014
-4a682d7dd13851f6d187e9d30c44f3377c9cf7356361cc64e4ee2adff163121a
-9ac78e13aa4fb1112b31153c19b0d28f007848c1bed88a10ade265a8b606b9a3
-662683a775f94bae38e065681f7e00b0afa9364e56cae809771e53b826deef22
-4f6cd881c6b7ca7dcbc33806606c987f0071925edde39d68392a137aa17561d0
-8f14c811e8b51bdfe34c0aabb9f31013879b3f8a348e5e03f7c661822834e6c9
-2f6f64c36177c579706ae06e73c3756efd98b26a9cea78362bca4cd8437dfd98
-ded00bf0129da7508680158a213888fc8165aeeddc216f77f05e635d4a6c8515
-3f953a8039f9cd162e2778f30644ef6c13889080cd8a05b6fede9770834edc5e
-04fdf83bdb9422d18ed88b6f614569d63864c399942b1c9aef68272309e6bc7e
-52ebb157dec5104c1f9e0c1e3d9886403ca2a2515e0bdcf60e66edba0f340d56
-c1ad2b8d5518cc178bc4a8135121c45b8afb23de5d84f4a123172f9a71f721c6
-e4847c2f5c6d30cc2a966cd5526b6f98d85d3a8255c6a9776335bf2fa1e9d5df
-a154702bf15025b8cecf5bf1c66f0abc9ba99e54da9390dd5c04bb984e1c406e
-1e1c964e99a2f164ce3a6aced4af3ae77954e900d5508cb7ec7b83e5ea9ca73e
-e832ba8544107820e053627f8624e89e14301e18d80706ceabf0d1860d8a088e
-89e491b38c6428555684e9572c82f292d59bc8d23ec39cae1ca2e152805df3a1
-9b4d96ae8debbd4faba3dc79960ebf56fb18caff0c0111543d66f3d530c502dc
-cba972803afa6ea4f8149ba1708ff8748b115c523367244e9e2e9fa31c830d09
-f422f8cc49e5300de95eb6d6c07e7c7a29eb14c0ac30c5eef24219586b3ae56d
-3160839a2252f464860c32b3e74b23bd6d2deb50e23f547c6d8d60415f123f24
-e3bb62ce14d851c7d103e667373d6cd61c66513c79b0ebc72adfd40b7acb6c1a
-7086061551d74085fa458d212c8873e49658fae2c8c6c28d89a7f7c9deb4e1cd
-270082ce880954b8aa36eef316f8409e4835d4677ea5e35e1c093fe1d544388a
-e0b559b1245fbeba4eec94cf4a14be7c83bc8806151a071070cde9f13a8b8c36
-3d02b83d6f0c24c5e85a36b0fc2f907200d4e45fc4f5de13855ec20f5f9d65b9
-11b1d6f9544da2d5a5e2cd173db447995b351a722ba9122f4ba214465328eb59
-998296c9bf8d3ce6a95c458b9e0acc925cf33c35d99df1677240962cfa6e14e8
-2a0b7442b75223821213383e3785a3e3998e96d6305c61beff921606cf1cde1b
-d45be689ef1edcb04cbe2c7c317ea93fbce61db1e76f8ba6e5dd3fb265f52762
-59142336e4d375337a5545f944f6f8c8e50b4f524c3421b0316a401358a2d5aa
-8be973fe695518d61393ed4c7903a816535b7cc28ee379782dceb1ec955c2184
-8b9fb4aaeb7e19447f47f46ace999c7fc458129f215e4533a45e49bec7c5eb7b
-9474691c5dbfde3f56a63930188596e8264c3f5157fc896d1afc5f3a2e190f92
-33e8ccad3e8aa7f94b1068370f19075fb16efe9ce48ad789e905d0218bdcb325
-c7632a6d5220ff2b05d5401b06b5b9f3e2c2fe09af3f18e8a17eb6d0c51959db
-cbc76651bf2953b9590b7ec08b952ecbb1f8f8c86d08d217f04520cffef1318c
-56ed7eb2abbd6040a04032f62f59603bbbfcb48b578cc8a8c332e2d8e2322415
-a443a92afb8bb38026160f679bebe4638a81b259488f73b4301e36f052ea618c
-52dc0216c924e2b418fe3805eff335e6f2dc4517cd2ecf8fce49baa53c44b80c
-4809bbdced1f8cc72e35f362d567b5bec58f6e9bb8bb9e134fef4a8850a11c6d
-743ea1d516aa3f00f559e7432e3521c094f9312ea7613ee8a6b900fffa99b26e
-896fce4ef775717c982a136978884f8aef17d96b253e80064577dbecd1747c93
-75c16902367a19d0b5a8c6f14ef55214aeab3e4983d5d00b4114a07f74ae3250
-58c54d6903f26e3283eab708d672725549105992fd14eabe5ffa167f850de4be
-e473c356eb540e8bff1acba6ccae793f162ba95e8589505138460fecf8bb9c47
-0ef6f107ffff8f8a3c6e5f856c8be2f2c57c5487c9829f72a74b897258eca965
-58dc303c1c0a28503e9863564a07ea6ff620eda460a224dd5af73c806e72fa2f
-ab3f702a99e763b4ec585da2783d049a58b4aeaad5f4c799e3d2d3b1bf9f101e
-5b041db82f366084f692e914adbdd1240ed5d2afa22e7fc432f1bc194bbe2150
-b4521875c441a20b3d71ae58a63decd8cf47672fa04ae0e816902926c6481641
-2f139c8b605c1d065591bbda536ff18f93449ab8106994581811da593661da49
-6f964eee801f05bdcb631ed1d79e373ca07722e424a20e3dc2be63e6a0dfb028
-4234312463799b57c90aa43cb725ff51509ebd9852a37f9d643a81b0a4c9e304
-203512e475f467171805484bd5f6e38016aad5090e5d1e5f6cd4dbe6907c532b
-c5ad198ddd056dff2f7f32b75dbbbabb1dc24e971cc6768e388a612408a8577d
-dd6b5b8a03bd7cd432e59d34aabba7bee276bbba245000d5cd9be7f5d6a332cb
-6d73fa04674da67b8582b036d93ba3014eb336ca4c03119169ca8aa5c5ccdd6e
-297d651a6cbc07b8b8fffc95f56eda32bc6e748f33d07feba741a9255a8813e5
-6a788869ffeb0accb15e982debb0e81cda9733ccc8f79a48063d216691b72111
-1a871ff5754e21a7788e
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/cursor.pfa b/lib/fonts/cursor.pfa
deleted file mode 100644
index ef1724ca34..0000000000
--- a/lib/fonts/cursor.pfa
+++ /dev/null
@@ -1,954 +0,0 @@
-%!PS-AdobeFont-1.0: Cursor 001.001
-% $XFree86: xc/fonts/scaled/Type1/cursor.pfa,v 1.1 2000/02/08 17:18:22 dawes Exp $
-11 dict begin
-/FontInfo 10 dict dup begin
-/version (001.001) readonly def
-/Notice (Copyright (c) 2000 XFree86, Inc.) readonly def
-/FullName (Cursor) readonly def
-/FamilyName (Cursor) readonly def
-/Weight (Medium) readonly def
-/ItalicAngle 0 def
-/isFixedPitch false def
-end readonly def
-/FontName /Cursor def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 0 /X_cursor put
-dup 1 /X_cursor_mask put
-dup 2 /arrow put
-dup 3 /arrow_mask put
-dup 4 /based_arrow_down put
-dup 5 /based_arrow_down_mask put
-dup 6 /based_arrow_up put
-dup 7 /based_arrow_up_mask put
-dup 8 /boat put
-dup 9 /boat_mask put
-dup 10 /bogosity put
-dup 11 /bogosity_mask put
-dup 12 /bottom_left_corner put
-dup 13 /bottom_left_corner_mask put
-dup 14 /bottom_right_corner put
-dup 15 /bottom_right_corner_mask put
-dup 16 /bottom_side put
-dup 17 /bottom_side_mask put
-dup 18 /bottom_tee put
-dup 19 /bottom_tee_mask put
-dup 20 /box_spiral put
-dup 21 /box_spiral_mask put
-dup 22 /center_ptr put
-dup 23 /center_ptr_mask put
-dup 24 /circle put
-dup 25 /circle_mask put
-dup 26 /clock put
-dup 27 /clock_mask put
-dup 28 /coffee_mug put
-dup 29 /coffee_mug_mask put
-dup 30 /cross put
-dup 31 /cross_mask put
-dup 32 /cross_reverse put
-dup 33 /cross_reverse_mask put
-dup 34 /crosshair put
-dup 35 /crosshair_mask put
-dup 36 /diamond_cross put
-dup 37 /diamond_cross_mask put
-dup 38 /dot put
-dup 39 /dot_mask put
-dup 40 /dotbox put
-dup 41 /dotbox_mask put
-dup 42 /double_arrow put
-dup 43 /double_arrow_mask put
-dup 44 /draft_large put
-dup 45 /draft_large_mask put
-dup 46 /draft_small put
-dup 47 /draft_small_mask put
-dup 48 /draped_box put
-dup 49 /draped_box_mask put
-dup 50 /exchange put
-dup 51 /exchange_mask put
-dup 52 /fleur put
-dup 53 /fleur_mask put
-dup 54 /gobbler put
-dup 55 /gobbler_mask put
-dup 56 /gumby put
-dup 57 /gumby_mask put
-dup 58 /hand1 put
-dup 59 /hand1_mask put
-dup 60 /hand2 put
-dup 61 /hand2_mask put
-dup 62 /heart put
-dup 63 /heart_mask put
-dup 64 /icon put
-dup 65 /icon_mask put
-dup 66 /iron_cross put
-dup 67 /iron_cross_mask put
-dup 68 /left_ptr put
-dup 69 /left_ptr_mask put
-dup 70 /left_side put
-dup 71 /left_side_mask put
-dup 72 /left_tee put
-dup 73 /left_tee_mask put
-dup 74 /leftbutton put
-dup 75 /leftbutton_mask put
-dup 76 /ll_angle put
-dup 77 /ll_angle_mask put
-dup 78 /lr_angle put
-dup 79 /lr_angle_mask put
-dup 80 /man put
-dup 81 /man_mask put
-dup 82 /middlebutton put
-dup 83 /middlebutton_mask put
-dup 84 /mouse put
-dup 85 /mouse_mask put
-dup 86 /pencil put
-dup 87 /pencil_mask put
-dup 88 /pirate put
-dup 89 /pirate_mask put
-dup 90 /plus put
-dup 91 /plus_mask put
-dup 92 /question_arrow put
-dup 93 /question_arrow_mask put
-dup 94 /right_ptr put
-dup 95 /right_ptr_mask put
-dup 96 /right_side put
-dup 97 /right_side_mask put
-dup 98 /right_tee put
-dup 99 /right_tee_mask put
-dup 100 /rightbutton put
-dup 101 /rightbutton_mask put
-dup 102 /rtl_logo put
-dup 103 /rtl_logo_mask put
-dup 104 /sailboat put
-dup 105 /sailboat_mask put
-dup 106 /sb_down_arrow put
-dup 107 /sb_down_arrow_mask put
-dup 108 /sb_h_double_arrow put
-dup 109 /sb_h_double_arrow_mask put
-dup 110 /sb_left_arrow put
-dup 111 /sb_left_arrow_mask put
-dup 112 /sb_right_arrow put
-dup 113 /sb_right_arrow_mask put
-dup 114 /sb_up_arrow put
-dup 115 /sb_up_arrow_mask put
-dup 116 /sb_v_double_arrow put
-dup 117 /sb_v_double_arrow_mask put
-dup 118 /shuttle put
-dup 119 /shuttle_mask put
-dup 120 /sizing put
-dup 121 /sizing_mask put
-dup 122 /spider put
-dup 123 /spider_mask put
-dup 124 /spraycan put
-dup 125 /spraycan_mask put
-dup 126 /star put
-dup 127 /star_mask put
-dup 128 /target put
-dup 129 /target_mask put
-dup 130 /tcross put
-dup 131 /tcross_mask put
-dup 132 /top_left_arrow put
-dup 133 /top_left_arrow_mask put
-dup 134 /top_left_corner put
-dup 135 /top_left_corner_mask put
-dup 136 /top_right_corner put
-dup 137 /top_right_corner_mask put
-dup 138 /top_side put
-dup 139 /top_side_mask put
-dup 140 /top_tee put
-dup 141 /top_tee_mask put
-dup 142 /trek put
-dup 143 /trek_mask put
-dup 144 /ul_angle put
-dup 145 /ul_angle_mask put
-dup 146 /umbrella put
-dup 147 /umbrella_mask put
-dup 148 /ur_angle put
-dup 149 /ur_angle_mask put
-dup 150 /watch put
-dup 151 /watch_mask put
-dup 152 /xterm put
-dup 153 /xterm_mask put
-readonly def
-/PaintType 0 def
-/FontType 1 def
-/FontMatrix [0.001 0 0 0.001 0 0] readonly def
-/FontBBox {-484 -517 517 484} readonly def
-currentdict end
-currentfile eexec
-d9d66f633b846a989b9974b0179fc6cc445bc7c8a959a39a32e9dce7faef17ee
-3bec9f509ea0bb8adf2cfac3626f0443046fbcbb211c518d48ebccdd3cf3d833
-4877f4ef1dab34759b6d38f757cf015a5ccf12d00a3239084905ecae5ec9d399
-ff3b917ce3cd4e85a1c49a750549d42f00f90f5110c822aa441ea813981685af
-17a0e41240e5c924b9c12d51f92ed0f3ef4fbc72c8b3eaef402c3befd6a52631
-47ff2e91ace4fcc6f381161f004dcd1db73271726d2ad25185a9b1ad0097955e
-b319d5f6d40a9f7163a0e106a361ebf256f5d931e06b8d9fe4e84e785bd29b7d
-fb70d68d41d66196ab5099bc38e613d11db08b2e9194806b651615dbdad9c797
-4bf4ad35bd0ce5d087baaee81b670d70d72475c0236751e9f2ba029abcb75682
-ffd70e77bbc2fa605cd824d77659de79f11275b5d6185386f0f39988ae683aff
-876ab78964fff6118dcb35b502ed5c7a38c6e7f898a352c307c6ddd0558702cb
-f9c763be246b45355d103ca1bf99d92e0f7743000d0019d4e66bac2292422b81
-7dd20274357d55680301b21eeded828c8836a5c47b12daaf00bdecf88289692a
-da641e1893c2eb202c614afd6b70524c9e2d6385de26e6f48a5959f587f80a69
-5401aeaae3c78d5928dc524e12cf874a89961e67d9d71db9aafbbfd960e6c395
-1f0ba3a4af64ec2379e956b2715829f009faa9fedfc79e06559cff13a4c8b860
-4a07ec9c6565dd8530acee97e2d2f0b92eab28e5299648f00bfedf9c87bd0223
-02495fde3f194d735815acc2e09bf4abc693de6e975f0c2b6b0051c90d727988
-c6a90a3dd10bc83e264984752520880d26f1138dddd805001ec71b935a8461cc
-0d6aa7cb0cb6c7c7cbbc99af3a513ac06848f7e6a222363f8696cf4ba2409054
-9b616ffe2d893a8f5066e6e7cdb21656530c2a720578af66d456de1723b3dc3d
-1406bbf7dfeda3aa3f649077ea7ec19f8bb18b28b876ce1f8e61dfc50d7b4db3
-968efa987e8479766356441906d6298fb426a428a1109ee9058d4a71235ff03e
-205a60f64b77d3e0920790200fe13d6676c77f78e4ced35f23912234da3b568d
-e729baa323bb7ebb41d72994261eac9f2c02709de342ae5c070d9e7b394a3ca1
-aad2e95d98c05cd4696759cdf12d16c3e000f3b2a7b5ea03d3fbb204c6d59b48
-e4dd5094a54aacd3f8f62d63b93e3524bdfa95fcbf75fd8be02544bbe661c485
-9f4a12191be62ca8b60cfcfba14097f4f7daaea4af8675fdec8f6ac22dd822e6
-bd4cbb2380c0ce2f6e7e4db197ba213942cefeca436f33249a881c60c77e58e0
-93100c28caaa5f861d8557cd2779911d42563f5fb8f7c890c8e24bebf300c3f7
-15d0854bb460462de7364c007c0be17a57c23959bda2282f9fa8bfc1571d7e2e
-5cd033129735be336dfe0efe4bbe19669e7c1a3f3d21e11c8ca081ec442fcaf9
-e4d5a1eac515db6b686f9da7757475c7b47cd2dafc56aa63208f5e0bdc127a3c
-51b9bd6796842d3089641604bf32ecd04874ecbcaa8c4be805cbb6bbd3988040
-8505740a2023924894097f466e1736c0bd795cddb95d80937d662592c70763b8
-97a8dad80e3467ee8192d4d8667cae0ec40a5bc9192d59eece9a405dd140f988
-ecb324c75704e502d088b5184cac0ee0857289ec1bfe9a2bee359911b9bb30ea
-8daade18b1ad9ea1c28b2d9aacd6e93833d9d8acb46349225b4d6b0e32cd7848
-fe8ec185522eee670d0cbeaaeaab94fe7904232249027292be36d2aa06ce4b53
-adb71f29d4746fe19cec148ada960820ec7eca5ebce18f19de5a7974b0d15b14
-2c0f1d0af773b4bc5ab79c7f16747b468ff0a9ce39970cf439720bab853ae9da
-c6cd1e282d0860f012ca867969474e3d396370a876dd9f603a6b64afcccecab7
-dc0186a089a815288a68564f62db84d3a295f31efe6c1b40d1602e40c8fc8ab7
-713c11ec7f175b31389f70bd3255ba32c10b2db0215aa5fddb1c02f74bf8c33b
-d4059f1f3640a4dbcbe0fd59bbc830881326e28b7c8d5b9704f95827e5e21d8a
-f720e3ce0c1bd124963ea970e1c4eaa6d340eae793aff5f8257f471937147c59
-fdddaeed8b547b3b98adf6b5bc81a86dbf9436d010d14b3b5ecc4ed9aecf3ffa
-9a4ae3b08b9cfd79370f4c6ade8406e7808ab8fe30694ae7bd9008c3507786da
-543465aa40f8ddcbcd1d561a5871be7f39c95ecb0e3fd7754469b1103c71d18d
-446ab34f5ea212f0b5c4d3fa8c50658466d770adc17f53706ff5449729b9c23d
-72cb4ec02402c38924dccbc49c976312dfc8f086050dd5a38132eb139b43422c
-756a95879b56babe8f77771f221f4f1f25d1a308064ec10eecfbb306eb55ee78
-2692db518eb3d477c4b52a182fe897e45c0c3d302aaa0fdc69ab3c26e55728e5
-5e12e7a51d28af01f104e5dbc61bd210daaa526c4dd9a93abf8867178cfb178a
-70dabac26de06f5abb43392964a7acb193fbf31070de491ab477a4c5492f4fc6
-4c3bc40d760d41ab31d8a3ec657814086a133801701ba8fc4dc5ba92b03b463a
-0f8bbd73b9bfcd6eba567e0c84b5ad5b32dce09e5edf39bd276d75c3cec89124
-a4a8bdf208fdc212469bc9ac96ab17e9df27ddd8b085dce1ba68ab50ea445bcd
-0f002681a8dd517660794d96bba265fbfeef267d26fa2a1bda94235f763209c1
-1f817081f930f20d2d0cefb9261e22eea39cd0a390626fe71d312fc0fcf11db4
-6b0b70010dfadb9c7725f419c1c89f34fcbcf3b268c7a4f838d94cefd82685ec
-b619d3f6df7571031a82e2d2a8bb98b8471d8c9febeb853ce0d38d7747c0bd63
-fe04e36dd00d2ef30b0c842d2a59457b3b41e2b8cda904a5d281290219814b59
-c4a75469375e9e0b3a358434a910bf1774657bbdc64cd408c680e2a09ca26507
-06f95e8c16735cdcca195f20c9a03a2a0ed60184c03f4e3478859c6639ca8ac7
-241b33432661741333406add1d9439690f07564d09f4b67152f32943cf93e247
-3f2a17a476bfd897ff69d4fefed1f4a994fdf535e3e45b1a3d46d560d5ac55dc
-2e4c20408c8ceb82d7bc21016bfcdddb8d5daa9e902c327261549ba62090dc4b
-27ad160070880cbdff5d022dc9c7d6f3f51a49af6dfb713308dc590c7dae5236
-74d7946c1db33177e4caa604ecf655b792be55e14272e0daa0cceb2afad8f3b1
-6558426e102f72ee42a5d9dff66d65d672451316fe551fc2923e4b24d9788091
-66457f55f9c83350a62bc5bf590f7135929b365c0dd003a95e98760472ce988e
-0e5affd7c654bb99eb4255bcf030fa008bde51daa55ed736086953c599bdc3be
-16efb2368acc883bd670d753fc7bbc65ec5bd797d0cecc14ac15f6423f0f22d1
-6b630dfe8736c2db51b45774f99280ea1274ae1c207ef3574e55478f68bac3b4
-8e24180f8891a2f3e8c0c9f74c22744830f1617b99a78feba5fbd752134775f2
-5ab542c17ce32465058ffb9e3dea8030dfe1ec82a1818c9bd1e3db30e25d8128
-9ecfaffe85bdcad5126fd461b6d5137d2b15cee2d97486f3266e4c49964d46b0
-db16d96593bbf257efaf0dc10f18e2f4f14a347cdcc220e8ba87eb215a66030f
-8f30d405308dc15ee9f7d7c92c607140a6bd1cd8c8274a507c5f12293327b9a9
-e5c3a13eec859919a805f12aad2f1c665d054a17fd4dbff471890585a35f4e0b
-5e64c4df9b687526be10da6eca391eb351ae661e16b930ad77ad33ad2a2777a4
-ef8881b5be91a83cbffd8b95a8f7c91fd86c71061e7717e4cb2f44f4ba2cf5ba
-a64c4f7290690036427ec227446192efc7c14479525994dd0e86e7bca081a9bb
-00d55ec51e1bdbb504c4d43463902c05ff0c1d67f3125b8ec48f5d1d394c7f13
-54e70eee5ec074d6a7e0dd6f3d2f006fe8a527b56a560685cfdbdbc9f5c905bb
-1dd508ec7829a13a2d49cad2db823dfae5b85f3d7c04c0d8ba1fe9878964534d
-c23e890fe460c0b25700c5f6432f420f3698c6a655296104eef778a5b125c74d
-79ca60a8f987e278421b0d4a311bc4ccd59fc3f85972091516c8a4662275060c
-8851c2532e2a1f72dca5c350a03fe829db297d0accf6458b10836d22cc461b68
-452cd2f3764a3abbf2314105e414fefa39686715463afcb6fb6782eddd94781b
-5130a77d16bbf0689bf64fcb46c14682df23e70f7a571aaef0aecfda9c889562
-080d3bf39422821ae0093fcab7bc29f9c4281eac9ca14454adf3ec397855c008
-fe7a9d64ad134fe9122f7650e37c17bce7bfca7661a0a11b45b42bdffff2decc
-47df5d33671daa487d7bd6a5aadb32e7257dc8d0feb9b7f0a4a7825fdb8a5cba
-a31a988477486d0f09858c772b8c468b794ab2db0defa88c3b4927b615bb34a5
-8ac9d9af50a150e991e6f4330786f8a4f98654558a4fec8144eb2e46a6190b4b
-5043ae396e7fca1eaea3e9a96c0b200826cc065f49c47c2797ddfeecc6e9b95a
-f2deca74b594224dbf75041f00fb37f3aa70b0b0eceb4343a9331e3047e86548
-c3a7b1a42e7af0792e02a5bbd2ab548f7cb8cd112babb89213f66913dc109d8f
-c1fd5307e7c20d7340372935cc459a795ebc9c4ada9136b71fdb3f68aac98729
-16052f949b6657114a04472fe931a761c4fc5f9b8ed340c16035889172f7669c
-c6dfcd50bdf910c615e5f3c64101e2e6546f252cc4e0ecec03c5e19249b37269
-a0bd2e68296f9627e4ff72e37bf3c2be74e3b34d259aaecab472a595af08b2fe
-db51394d6b59c390046ad76dcb8285a32c247c7cd181d2e386c6d5abdcbb3789
-3e8d9859a02c13a72743047d8880606488a521185ca446499f7adfc9a25c8ba5
-1b1c84ba24c0612ea3d957e76bc398457821e25844bbd906defed4d3ae434c39
-9e52e60fedecc1acf4ddecfe92452e9841eca92acf99c4ca9c2cb32afab1dc46
-d0ad255a851a78cbebac54fd314846c35d35cb7ea10596734ab79be35e11dbb4
-9d30fc29b140d5823f429eb8eb3d1fabd90b9c1509faf33f609b3ae40a48f873
-763b3a5d5c9236aa0a2be1661be917921b58ba7fba139796d4c125127885779b
-6c71427cdc5812dbb6725153a83809446d26f9bc64bfc2a2a4bdca0c57a20918
-4415951c5d56cff5a3824ba8f8c0652e91a5d9c04d1ed0d928b33801b98d36bb
-04af8348436aef4abd549a063eaed12f7a4655f5183515b067eccf550f7bf906
-abf1dc63139fdb1e8a1d2472133fe920777df1acb2d12f5b655e568bd42e381d
-861daebf84ed9c6db8d307de2bed017dece82881ed7677b5f26dfa34ac25e19d
-5837f76dcaf237de6391c1d6679dc1a981737ea3e07e729060a0472090d5c76a
-dca9262a3823f24b1ecb646aaedd7de4a319f091a948935480d53376703049bc
-a45851f924ead472f1b100ee7b4b388c6d37e6e9cb850ce7da81896c1ab68677
-c3298a9e5aa71ae6379990327ec585aa1e291354e44ad972d3193424a9805226
-f43b07992c5f1c5e01cb5d049ce2922dd2921ddb5c4dbce968dc7a340ba0449d
-11ed4160c846a508b5227bb5ae574c8c7dc5d43a0db7a0bebcc638814f8933b9
-03404c4e720929833b4a5d5b3e54b806adb35724c2ceb47d77d39e43465e7a12
-51da0d53106f41313f92fbf9cd992bcfa4d13054bb7154965dcf530b2e0cd18c
-92690f54a6c6d7bb38ff4c59d8e35359eb3ee07061356ec6506b2081878986de
-80a2ba253a34519189e706fee9906a723bba749cef1c15abe3653eb31c59e486
-a6191335292bdbba1c442b229b56e7180be446a319e811327ed75f939936cb0f
-56e123a274c843f27b94b35babf938717b4d02c2a673df0a88d35c35833c4d84
-1bc1d5cfb8a00a181cc1bb68f9dba8fb10ce8ff9a520d938ed21fefb140b5634
-8f2c237d2d1701e50d3132ff93ba3c0543694c83dd500000b829b705e3268ec6
-f94887386593f0e629f6e74d3cd192a48c20d0b1a00ec7b18aef659a62777caa
-3692512ea0efe4b8a4f2a138631b10b59f0df0fe27be23f2d3e1b195c2375be9
-6e307b3b8404d2cc6f798fc995c1547354c24e04cbe50d273b50967dfce4ec7c
-ba9bd4cdefee3ff4310358014dc02ef0be941c4a8273cce80ca9b8f75eef61be
-854b698a2ca1100f40987aa622fe8fd1932984e77e8c9781c691734caf0c4e86
-566def79a60cd4d3a3cd79f59332ac99315844424a627e2d6d38b5d6e81838fa
-357f0d137804d5a29abdd374afb2e3c4f5901cbaa94b8d15a5a8988a62fb92a2
-e06cf8788f37a1aee7adc0e67626d0de2881d822f940dd658b5f310a1c4f1bff
-cb7fc9fdb347ad0372127ab143e4d80657e5f0c364f4721d5d68ff624705da2c
-27090a53f2d481492c3b15bd70fc050f909edbc2bbfcea26ae850abf2c2bbcbf
-fc4ab4d34d006a1a41469e2c8a8f5b4ca5f9820d105ca12f1d1240dd32d955ce
-ef9de1e096ba539a3fb11415bdc0851356a40e0571a1033aaa55cc3f618f372d
-8c71ec445768cfc42b2c10c04e45e98a649e770a324defb330b84952d46e5287
-65c417a6a82deec37727a517c12bb296eeb5e6c285dfd16a479369bb85289a0b
-e24254e6ab5de4e3a0343e7f901c6e39d79902e7bf437087fc894556dca62fc7
-114b344d4052b3d7f84b07ef17199a938f69b2586ce6a9bb840c7dc1336e185f
-6264b644cb411a2eecdc43e1dd26ec51a837401cf78dfad608a3b9038f9a3a40
-9fc464ff2214599f8ed573112ac944b593ae83348f92c54ae5d6db5956de20d7
-4d48f8f6c685a70265766a97367ec2d7c6e1ac00c30fd3b0fa4d2891d013d840
-693f61956cd4dd4ad134886868a55d9244f58c27f101b321ddb99b4e2eb23137
-a2e596ee6d131304df4265d6e72f9425127729028cf2c3375a4bba7ca9363e30
-9278afe6c282536537034c787be5e9ef1a0053c64b461ff496050cfc8da1182b
-c1abe0eb88089e2d4a994108b1d24a2205f33f3293954b8e8102be94aee1e8f8
-d725d52e87e57a2de1f79c68ca6b5b36d05ac31c2d2f73cf5b955b602a1f2eb1
-6091edaca5e90cf43a1fc23a19e2fa06eeba82b15704ccb5b1b93587b2762517
-abd0e6375409f518e74d727b145daac480a52602ef35aa037647d7c0d403408c
-095daa192800fcbb56e5af904fb72d069f6a15d4f95897f530bff36828630bc6
-e4f83f82a6f0814a943a49fe2288eda1452db8c48cad67b1b6398e481ca1835d
-b0f9f9257fd3c6aa11a7242786b47fe196cb4860964cba7d224acc20d22fffad
-c9e11d0c6a4487b53654719506c04b2e1ec53b3ca316d5232b821e5256fcbc7e
-7ee284e54eca74acb23fc3efeee59e1dabdd4e9c46c7a4234f7e3e5784b3e65d
-32ebba3709c63dc9ebc2dd6891e39c87bf846c3fe524e434d98e2ad199230432
-c84c95422e8950c4323caff03a9de5daa32a5ad3d07b5ee831bd589c0e331888
-33ac8dd264a563457fe1213d23d0d14536ab8c1e75e5af941e2068d1ba9a74d3
-ada91585fde5c2797229599749c420c694108595966b815c96adf3328894e76a
-a0cd504efacc06434c27cbcf96009947a0f80315879d2108bd1611d6f4a5455b
-178b5a85b5ea739546dcf226c6889dc02dc08b5dbad34b702fb77b82069777fc
-3892034144ce7995712e3295cb7e31095f430622eec4117d98fcfd6075a4f0f3
-01794fb45f3a05e725588fccca124eeaebce479b9a835bac7b113dddab302dee
-6c50e47c8e87718b3867c99025be81d05a905b2a9335068b59de14733d656b89
-97d21bb34893b9548830c45071921d0f13add9d9b75a6f38ebffe39f1d2cc4a2
-2482a80bf04e13b0e3614d1326e97e86b3dd77757764a9cbf6a0eaa530450928
-0c5926cf98b98bda505da3a35684fd0fe656e71aa67ae6e7693d3ae11425e6c3
-7fe01890b287f354f747e4de8d5bd48451ce4f28ed4bbaca7fac03eae6525174
-6e75b117e4c7fddb6979ed288f81053783f49f4ecf3af9cda24a7dd6647368ac
-4f2b8108451496612276dd42d7281d6365810a5ef3cdb304fa2630432c5fed60
-ace8924e807b54a77d63185e7c7ec65c887ff17a3633322c0d4c8367affe2ab1
-0845fa3f85262ed12a0ca9c74cf1c0f87ff1233868b83238831f911e41845abd
-73a346e7ac01c2b07dac7153de91318619f576a5ff1c0f9ba90315c5e89b8f37
-cb2d8d413daf121e0c1b3aa7bf1a62a2ce28e39d7c43da5275e8f0972aa73986
-98dac6dca24adbaecc997ad0488bd9cd356dc86c15756ecb6fe2fac61d4553b3
-0b996e98157e29e174bab3af12176094b414bdd13f4145144f087c349b8a7042
-b1e5b9e705c93ade44defd86ffe43bb513b3254e8310ec64409e79743c2f897e
-40270fd5154140e0e65566556892c49762a351845f767621f5f5e5cbe0b67109
-84e30ad39832cc5f8857c23aa7b19981ffdec5e4497cb52da24fd1ebb53855f7
-8f87823ff65f6650f362d6741f496c21f8db8a609af33f6e60f858e7bd5ab91d
-9ac64226eae4994670acf610130e10e7e3a6b1e6f3a07b87d4e6b712d243a493
-d5280549b827378ace2f866acaf117f9094c2b15c2430624d2f1c9a8ed3c92aa
-7c3ceee15ef6eba0e90686949aee9f375acb97a49bc96942d20abeae79fd8e04
-fdabe92b3c8b493f3d7efb13ca6bb9b8d98c41fc4c4f8e171dfb2ac038aba4e6
-60724b873c96a9e7b7b4edb24f09e22c937c8068589afba95bfab3c0618aec42
-fc7b68f1fcecea13a54f421c23e2df1b04785dd471f82587616fbd140758e21d
-17a1ff6dc30b301925fb1d2956cfe57f8b1baa1ccf4d171fe03c9336bdd0678f
-4640dffdc2ea1834e5eebfe68d4c26c9d009cc04d0cb8ee8f4f0bc477df068c9
-95eb41e087a9a4c390ac5ecc87667aa713ada2cc1991262a20fcda33625eb9c9
-1f419c6723f2875f40de2258fbaeb821e2a398dc0ec62119c4efc1e7da92fbb6
-c0175c56d32e975115a12697fead8852b8fb75b23cef1bc53b8deaf493c7cf1e
-9e9a9ce177bd9a78ec55f3dbfd247f9367974984f31ba071365fd79bfaacb882
-fab5934f730081165771963587130b5a1826b618ee51001ea81ee3372507ed03
-545d33d977d4bbdd73e0d1f235e7a2e020a28759dc53d383a980958ea0e49865
-b3658294acf2a04e0d93bc0806150eb192c8fd02c5dda1fb457bbaf0f71fd063
-29b87327fb05fe02ff88f7850d17b65ef608e7857d2876fb37fb0665e634cb39
-2ef9a4e3751103c087fa26998f68fe730c0ae114e34a3d412e715c7a12df3b56
-862f24f1fa06f6cc83769ba4d310467b07a91ef2dd6bb873deee11f1f326c40d
-89aeeb8f7ab1ba650444b2d3f077dfcf18803f38942f3d30f22d93cbad14fe1c
-1d968b62b018525144a5d2ed4bc636a0c9064940ef84d9ed682004774d8b09da
-998824b6cd1e7efb724fe553a8566b51bf2c6ec6f949501ce0bbc54a9309eaa4
-378e143ce3e035d57beb62873b294d07b920fece0f58d5ad1c5c4c67d3180a3b
-33eae3ce510ab906c841ecd9366ff615f07a905df9810a163ddf8d681920bd96
-d7b2212c74a05cea57e1e474be64eea47b8433755d72e5c1f79b8fccbcf7106c
-b70022721bd1bc779bc3f59301fb393d4429bc19084e228034291413f21fbd79
-83661ca0f6d331c1657fa69e2117464b8fe708520655c58b3f346f9213630fe0
-a31a55ecfc61f5466ccda3138f52cbbd575a56d4abe425266cce9e490d03bdb1
-0f9f959cbd9e34505dc46b9a439167931828d18f8e2b8a0b5d33b4bfb64df5dd
-b3825d34568453b740127811f4ef2995d0e7a09f29d432e0e0097343d5726719
-b04a72b4a5e0aa2804d6f7e155e1f89a168dfac8d593a8af33c075e213c0ab66
-366fe474ddb9ca17e6e7bce12b473ede15fc938239f21583bac0d6951648cc94
-cedaef748a18fd237b8b50f36fa97dad4b0a2b9e4bca1eb243a60b0eea59df8b
-74c76ea6067e77c0fa5b0aa43330690462851f923f6503ca2076f6b3d10483d5
-a1e8871c08434f6f2707f7cdf3a68d7dbeb4f2c7332d01435e37787877a7a29e
-a59c1493f2a959981026d58da06923d04c47502c7b5bb7f151ad5f0ebaf72c93
-db1db631865b261af7835ab3b596e4efa81cbaa8e6ec72f784e0b268f71d268d
-517cfd39804d0759486f8968ec149b1952be695da8553900c7e7c6878b63c664
-078dde438b8c75888e32c0d3285f6bed05132ff8e81e393b8be800662356b8d7
-b0fbff19c35c9ba9326b36586a179ae3e8869af85ca655406e1bd5a36c94ada6
-f280d1352577263444122341f71b118c95ed413a1237a72a78b59d12eda3da5a
-3d9fa119572142e43ae69551a024fbce71d153a1a1c211288f878bdb3f8a9502
-4a6420b3ff69f0ffa246d5ae44370a24576118dcd8c5f28f6988fd922ffa8cc3
-af68ab7dc10d2c3bd5900b05060b984a063bfe7b03932a1a4427de62b8e4bc21
-4ef0c83fe86919a766478406f57d148ddc4ae0500e6e15246e31dcf0a7149ff9
-1800ade772d44268a63d11ee0f3f8ad11b01cb96d04a52d57d827fd931e7aa12
-f31373e2de4027c293a1329311510a63a268af6d73bb839ce767b3bbd4da9680
-4e36dad7495374b17f506f899ff61fe23f71310b8ee2f530bdb6d8c951fdb34e
-8fcfe71b12a555f174cd72428acc96eefa57652a2f5dc1a446d9f363c7994c53
-0159b89ec2694fc59cc9e083f506698db58d841d03f3961897168b96a3965a92
-500e29b74743e35681fcf93debff5785569e3b0e42b2b586dacacb72ceb0dfa9
-6c2aa8902fb26f1c3293177dcc7f70b54d85cf1ea4ca1a980e0e053bedde3eca
-0aca76c214fbed2982cd51892bdc35baa7e3ddd34da26a5b9302ded1de8099ee
-0e87410403d8f782f46987be974b25ad7766608525de89cd18bb00f831c8b3f0
-54db8cb4ab0ee2a9b1e63c8840ece040c3d7d763c7f65bf4ffcb33e7ba98679e
-2f2f77ea277314b42e94e936751b1c649afe60fbc8cbba2655c4bba13e622e92
-4f72a5612bd507388c7cfc8077209c68c4252a81f8efbe8b8f9799a947594894
-8a1d1087bd458d2436f837ddce87ebea385e3c44f433f2b775f6257b1f80dd96
-2bbb0fdcc8c78d32dc1e09521bcd9810fe25117326f2ba159a60c26d5aebae75
-8d8a422e14feebf2cc3d30e6c70e320d3448eb3edc08ab72e44824e5175790fb
-4a6401326b5ffe81fac99839bdc39a9af68eea930ffcb80223bf21e301c531a6
-2a523ac9985cbac3bd9e426dd9cf6ef112817313ec460f8b90a4a2349f819d74
-3444ed4872acee556af837375eff1b44dcc310f4ef67758731f7be7c1cfec351
-ada83a533c06701f63d2d8b7b2084afc5e7949ff250340351eb4b2886d16ebc9
-7cca76190f3a4a58995fb281a0dae019ed92b64190656f7bc5bda4b2532c52c0
-aa2d5ec6168e24b120ad5ccfc0bd31d631345c2e2cf3c7fe1ef9ca9cd4322b9b
-9d587204a24e18ae280b2ece030626bbed9f66f2979131ba38043a92d19429b8
-53e3475c7b933e054616aafdf0d3fb6345ef888e3fcda12985c2b2afeb2e59ad
-ed76cd456c6ac11d453deceb45655fe71a3ad5f5f770a7124a2976639a0a5847
-b79379244738b5a7b176207080dcbbda96f43a68370b434b348ab5631dbb1d04
-1f1082c04c564b44191a51afdfb3950c2b65f9c4ed4afb5f4bde68fb7a09d710
-4bbaeaab1612c1a0b1060fafeb385da056099a2765d69388d9a276601bc13a54
-fd114f2ce447e68ef452a6703d6fad6acc3bb591c3da0581c45de6f2edd02422
-aaed358aa940272865f7f93acc28460c8f0f5222454c05fdd3eb100219113eef
-5b0c02314cd29c2ff20f4e86b7866ddc9b8eca4c7256e9434091319ed99f9446
-f606dd0fe2e5b86e3237b2af55df6bf9624b286a1a9970759fe83b3bde380b8b
-df7132016d4be25517449ad88c5e6da4e292da5632eb662a898bf2c76714b963
-ebf7e7cfd268198ba84cbbfecb7c3fd01612f7c6a9f118aef4cd59307cdde680
-25d9f98dcc9542ecfe6a8bd8b2d09caf77f29e4644bb7b6ae295277eb8f5b733
-617f4ed5a2111a5d9eff858db8ebec3e59e8fe318c2e7a474f07c9f4234c9add
-fabaf11cac0a958be217bdce993dc99865333aff57576ea0e43fc70016c23077
-8ba456546e8ffba24581ab50e72fc463e2f524a07cc6bc11a347584d4c9f40aa
-8fe8a6873b680b5e7871b47e1103a77f0fdf2110b9801e8f24ca8218e4a9724d
-021144c9449ded25b0532a33d410bfef2382e1ef629e04ba1b5fc09d86b85481
-bd8b1f1d719cb01352c49e1cc54c34d115a6c1d0f07a83afa2acea650ce304bd
-919eda435e6f5a044ce65aeba0884f5099d860fbbc90dabbf0ae5cb1dd59555d
-2ada2f748f3a74010519af69b8ffcbdde7e88de7ed1b0f53c255cbfb8e41fcb4
-8c80603c8be3f3965b3af9f94b027dac3754764f75509ca2f554ac1de60bea69
-a53d7a9c4973b51a41aa7c0386117b6353555b31670c803db4e475c330be39da
-4d10f247ecf2992f3e3b35cc56bc19ec40a3914da09c914005419448a633518e
-3d4a0ff8c39f6ea57917fc87f890ef834dd2c6531b3fab0eba79e0f580c19291
-9974c58cc1320d8e66765886ac966a55e594abf6fa69fd1ef3ad7dbe2d964495
-08dac3b161a45e836755af3ce6b0c3e3247fa56d71723e41838bed42de4404b3
-967c900ae419a7006f0832bc24559a56f417921ff6c83120e70fb9bacc6ed431
-8563d3a82877b5c1422cf56cda1305e7154ad1f63873237de5ac6f382217c4c1
-17559be71ea1491edfc3afeb9809fe0b4e9b6e830a48af9798e70c9411acd054
-9d835fb1466aacfb17b7a863c7a1cdc81811c220007ca99454e8c423ac95b8bf
-13ea2b29bd1af8ba4e56662df2eca3ac252b683df1e9ef0cd47326252131649f
-e64086725efa8a6886b8c6dbf56490143d5d91ccd1c1f3db4c78ec614c3f6ee0
-3a5cb384ad5b7f3c7e1fa13ac9cdbed4eec6c5012de7f3f48b41531a79708f53
-d5f16ac0b89c06267e11a5fb32aae3ab16a1782489945c14492824724206dddf
-98cbf03cd9d969a543ea1d516df6664b4a839281b179d1096a434bdf08b3b6a8
-b0231c8857f9d4b4436f9c02211b6af4bd22d073d008bb8789545b7f93635082
-641c6e475c12ce89c0a4361e91dadca8ec20583003b1c9306122accc59fd089d
-28757e3e3324c4bde7ec7a161b49bc994084a42880693ffb8676366879ed7554
-43661ba1326baaf4dc099884f753648a05a37c71be30b4a3425d768b049a00e3
-2a3f3c3b12ca5c99bbf419fd25714cbd00a850c7d84a0b4c3e5346cdb1964a0e
-9cd1ac316f017f6dff9679091a6e93a70fb6d26072a2dd886baf9b4bde98cfc8
-372927bc92f28bb3eaf14252c7661be1c656129af8b3e468456ce20f872bf151
-22ea95d1c79560268976be3ee9bacb2a468e1e84c8c387ac41d3531742ff094b
-c3e14b27444d2d0dd8f4dc738e0af4133cfdf7b0808498646e6d28b738e80117
-870bb74f8d4947a15100bd891188a1609560000bb7bfdcc210508903dbdff736
-07dcc542b58699beef7545cf0456b8ecda464126c86ae3db47c7ef6a6477808e
-a8c1dc20768895055bacbe2562921d078fe91794be3ef5ac268f410e4ea47f0b
-68bbe84e54fe139dc9f18808574ae9316e15d0f3db78ccb4c0a8ac63ede19a31
-09749a0829ae1302fc18d38d27e43cc24dd43b091a58ec394f998c5fd4145781
-d6ef576e99c850fd41d46450fbe5d5cd4063d0a24c8bad4a45753335937176df
-36d2d60a677fbcf63d8342232b3d9c0fe3062ce4f1ba853b40bed54da124d913
-4ccd113e18fe2d0c4bd55b58fd5c5fe6321996316eebcdaead6751004dc26676
-1f47c198fd7c0b686705a63a8d2d7e79fe826edbba1d166822aa804858c48f3f
-2a126fb0e7b2d0b4f2f082b78b98c2702f5ff3e4307e1b55fd99ddd861bbaadc
-90075adb2581c3d4e5ecbfa5bf8fc2a4cf6df7bdc0e3382bf12e612cdf016479
-3e237ab37bb1049ba63bbbc0da17d1ba3f98d88ba38f98d7133f53c2b9e87889
-5304664b4d5b6a43fb2577c5ae332fef6d7b7982e0ffb57b265d0f51cb569936
-8fac060e6ac472317597615711d6c13058b2f192982a9e858c093f854a60ae49
-8687141101d45bcb53dc69d432e0632265d8704cfb3766836caa3b09b2a44a1e
-bee69f88f9b8e62d36dc16fad6fbbad7f15c91f1d2431ec61b659e9072fa34d6
-8306c715e2d111f834f7d9fc93a902976ae995bada6bdcfe09d5d3a67b247c74
-1e45d070c6e02c7a9e4aa540a8fe3a41df7fb4b60dc943bea339219bae869762
-223c7492de1434dd6a75c0366624f936179c494f7166085416d126a6bedd962e
-1321f9a2e1b359ba90023ac18942f3d19f8dc7ea36468d055d68c9e758c0bd3c
-7bd2b10e7567282b6fe689a2c713c3272a664df39acf1eff9e3a64a353195290
-4e100ec249c9de6196020e30791284f028f8d98e4447330cafe620642db22f16
-e4dc191d9c2d4ac9b54c1de35a59b2d3138fd686741e836d55d4b12ecdf1cc85
-5bcce70a55d9dccbd33005e654150899527801be8ca74b238a7be4fa846ed624
-9e4d5a6a0fa190963db0d0b8c5f982aa477bd202ce0fa2fd54c3cd4d788d3eb0
-1317a307682c2a2813b48ffd7603a4b40d79209d49eb456064e66cdf7551161e
-9204ccd7d84c0deb458cad1a4556a1cc1e7df0c815da189fd9499e58c9d22610
-f387782f059929860518d3ad42cb245278dd67b01c9e3ad391e0a57b19fee753
-824cb856bd538a05898ded31e347c26ad123ff3669ac5b39e137d655b1c05899
-a9f73546d556290347af154004be5e9ade507c27292e9c60d8a2bdef92d57a90
-89ddeba1dfb5bd781c8ee4d036bb8b67ede9cdd533269c40a7f862a4ded71e16
-cd04e4f144cd4e2070379f4aee9c47781a15b46878ca5d640e0f434010cc15fd
-220aec4821174563c17e19cd934cef3290b3462ef9cb001b84991f29e8de05ff
-686787bd434149a2dadd81e4bc4079c31b7f19ba28eb7240a06b9cd5b5e11490
-66573636e87e5c0a10d0ba380117618f8bcdf3152826b110a7218c329e49fedd
-c3d494bda6c0fed8ff7da20da6a9e0b54ec79af50c7fd1577bc4c5fe1bcf35d6
-891091bdbc81d468935fdc75756067516080fa9f6cdffc557537b959d150d86d
-9e0e1794de22b011073e79eec4ea6f14d6ffe0a75677d20fc0dd0391603569bc
-8e7ffee11b6b4f75f081fe4e7a9eb847a49d11d8531bdad6a73f1b9146625294
-85db9550e9ce21213904a4f9997a83c1bb9d53f5c2099ba94f56bb7985fb1cfd
-be30d619af77363e943b7e94b12f88fe3f3a1900d722107350b0376291296f94
-8515d1b41e6bbb5addaf252985596f30df0aaa37b0e16936dd786cdc624c68d3
-2d796eb0faa89df09f0b41980b8b86009b682dca85eea7c16638d99ea711c631
-35a79c1d426ca9e8782007c61e424c8ede1d72dbf919267d25c73727882557eb
-f78da42d7e816cc83d80b95f3bb86356314e65083022a08f82148044d071cdaf
-db03c7e44017af773f0e7d03c2124e3bb8ef458736c1051f70fa18536395e521
-cbbe933c514747710cb9edfc30f774f75bba103b091e24e4811b4a8b9ea2b492
-de7c5ce1ed103b70c913261fd04caf13727c6df5d246a419c52f175e580b9f73
-fa96742e4f119405174784450411374263d2fa6d277cc0a9dd60c97e9bd91498
-a7942547c6888fb80f8f9a4a3640aff4c00b2181e9a89f367a680cd1932b7ccf
-6e1604774602cf412130503d43f8bc54bee8514a24da005c733295f022f6755b
-e5387da8e24854cdb5a73c39b1c34c4d1884a4d234adfa8d104c004efacdd2eb
-43f20ee50840d297bff0095bd290ed796f726b506e316224907130eac9d99a69
-3a62927d3ef4bafe96258b2b391b373b255a84d6e9d03797f0b1db056052a5d7
-4d4754284dac23a05ad8f2a0c823a8a9add8669678c9acc3d1d086ef67e116aa
-2542986d3a021f8bfcc00f66e812c83e1235990d4adeb39dec07e62c10089c93
-f1801ab8f6210bd328aaf6d44e0a4df0d5b2ee8ad1c8f2a21f43e4f9b897ada3
-88653a83ff3cceabaee4fe26de33ad5fb3337e48e35d14423718642c4071a56d
-f39725f27ad0f2a71b67a14708e70007bac926be651398bb19746f14d1271873
-b7d77ac822aed13b6689b311ca57b895287e16acaf3a03cb9424dc840ba5fd17
-543bf2b93b4a11cc9cb7f9cdf118feaab5d22244096b4ace849d8e51c9b86d4e
-4c14d5874bb374b75e8e468a10db921c066c5c095c5886f4f21b4cf32801a1ce
-ba7968215ea52e217b2f892722f3749460b65838227b45b4c697c2f7d9ddc59e
-e76a83887354180d4eb39a789f0c4ce770f54802b55c238b5189e8809bc29775
-e02104bddfab6edfb13614960b68a49f8e903e6c53d38faeb9472c8bafed7516
-0fad6c4b186735d5de8f6a655ca46f880fac0981383b4720fbb3cb90c757de45
-8f0036a7281b877143b5ae8d0bcfcfbf15f7fe641e216d09aa391ade483d0b4a
-f304f07036ba5b7f32d9f2d0c8969c4f392fa855dbb57940e80e56b3209853cc
-f140c62c9af0a44b180280b95c9af522e77b0f32de23eb5f7625251bfda99170
-e9dcab1f6ddfc1fc7d9ce75c8b9d9350a73823790b789a41b33bdd12e5f527c3
-6785611b74f8232deae963e873156e473f2282f7598d6b05275e8c5ebeac183d
-5239da1e92b56d987cd9e8d817b2be1730651955754e028b4041189921f28683
-8f80a3097ce2e58784a85a18477617d1565160895c588601d71584c097711d07
-fceb3809a57de8185ef6f4492f0ed8691693cb3c83a889f4116684657f1aca5c
-d954d0c87ab67b71e6f13358a83c1a651805a7d3571c0c9791cb761014129388
-de2dea7ba4d0e10c3e3055155fe5f713e51e35d927ad9bbb85b033b9c6d94737
-22cda751a32c178a3e9a526ec9f50d3ea4dc1c4e979597a1f85e3d4342e25e4d
-2bc78e24765ab3cfabd4db25c870488c2d5962756d737bb1c27ec5ea049e6ae1
-91ea186f69bfa8c8969c6c0453a47b73d9f6550131e73f00140249cd8dfe74c6
-c585467610842babae638f2c67ddddde42cf80d561cb19fa06a3b9ef7dbeec22
-e0083cd8916482c5badbcbf03e88f28aa322480baed5cf147f7077da4368da03
-9ba3ed7a96798b9bf4af20946fca2d5cce88915df1e03bccc0a8e8c8c65bd6dd
-6b2195c57bb04dd20928222a230f22f564f51b3e9fe79564525eaef5d017872f
-3020c9326b49682962c78064c067c2b46fa3b94567647e04e9e059287bf2895d
-9d9d169816cd864157c41b432c86626680157cd9e3bf1554965ccf68d033123c
-3667deb2680ca27d3241d6ad950b50ad22aa3166f566c91128cf9448777a33e5
-15a5bf3acd90e0148c7798a5a3875c7aeef66ac2d30c16e9ce00c71c82484f9d
-39ad43a5a30dc01aa0e0bf5e18d0f91f0fdfcf8c30fb6bbea79a848af26d02c8
-431733f1f7e82fa4b37afae125d374fc172d1c9197ead90f986afc0da1243ff9
-97d02fc4b4b5c340a748429841b3a8b56cf3f72aedd6a4d90575fe7c781667ec
-155153ca416dc9eaf8df3830eb21e077653f595ddad569d8bef8802ba2d2e2b2
-7123b7f55745380a83080ea954ba9f2c9039867777b33d1d3dd812d4f8166baf
-9e1124da1b7abdd6c69596cdeefb999777943235314d3098beb54f8f9ed68ec6
-b6acb5aa9d3347b138636a0718f19a06285f194e7a7a81fc94e4d54110561e5f
-61b8fee49f71566c8109162f879f16b80e3ef0342c1000e0cb32bb3b81dff1a4
-dbff77e91e6a561630848aebd0d1c40c5f3129e409da578238889870a7bce285
-b744707adac54c8091b1b1f50390f2886144294e036008c3e4f20267974310da
-229b68182c2bb1af96139268da254217c47e5e2bc279200d858ff72a885fb791
-43ae0be2efd2ba6233620c039a1d47d8b111cd330609cb1d810279a7882aab28
-0a20204aa812c580712c7179488815e2366103d96cb0d564afb0f5a020493076
-46cdb743dd9df4f304a60871e597bda480624939ff921d7d36957afc64d5a507
-a48f8a087585bd0548b1f2c5a4c72533cef1db0694faae62c035bab307b765ca
-422f221a5536c51eb201ff03b81834aa581f36c62916dfb1dac0a680f1f4ad6b
-2353c8603e960f4a70b2aecf44c0d134374c35c88a77e0a62b542efe834e48cd
-4de9d5a989923c8a6da285b3f6ba2e8ba4df07e63a16fe98bdd392df72759073
-f7af0cc58e8f279a232763a8a9d18dcb205350cefa25012c0183713203ec50d0
-f2d6bf83edbe9a6d933ccda8b1745b183adf413617af83605120075f49db2a24
-df5dab6f8085d71c4eec8944dde3ec0c1e51b4800a90116b25204a3e51def988
-eaa3ddb44d44a052477e2ecdde55d0282a5a9c5f4fe31f1d0bc7f40d1f76866f
-c31db401b2865de254b1699ef0660727bc944470949955feb0a8077be04a333d
-72de1f17e061040ebb66504544fcca2ae6b1b58dec1478967b7b17659a4e8c9c
-fb5cce0a95f52d3b5b9fae59451608518b907aef2e1e94144b72fc846b1990a4
-69674c263d050b38ee61ca447b0b25043c980d68fadf6114bfe9319f27ece2cb
-2437c5e78984c9599761d264bf15379d554540b13a2adebe9d5dde18b5663650
-025f9db1e17d5ebdd776125112f32c157d87978c564afc1ab4bb9d734689edf2
-e165cd4ed1eb93b699350d5253f3f869953eeabb6add680ba6a2d840bb7d90b4
-c4e478460059c38a99be0b7c07173b2fac2c68e242e9d3a2eae427c6fb733698
-e429a14c8b04fa08bf6b9980895b4706da12e7f8cf42fe3eb14aaadc87638a45
-704b14972f1df00b8e7a9354c15462ae600a6a8c4b95f33acd11a7da207e49a1
-192cf225d16b58ded179c8ae20fa7d6ef7fd384e7941a588fb7f8c5c29d98172
-4a848cd2a7109333f2a5963f2f42c6835170a57f92c54f03fb2bd434364d6a55
-d5adc8f90b553cf66848ead1de1197b267061f83442021bcd668fa332f3f2034
-143168d02812313f6abea888a321affb1a540a20df468fa35562ea4e45640c54
-e03f932f5581de862bf2bd2c05d2c995bf6ee2039a22ca68c9a71990cb499081
-60b1ee8c5dc10c9174e88f2aa5791908fdc7f7d37e7bada45f04043ee35d1dc9
-ec3704d315bb4e372ea62da6580a5cb5192ec21865ed4ded15de27bbb1672531
-bc5b4c3b2ac266dea3812192324b38c50e264f2bfd995e3a33119e6b47f23fd5
-51271d0a7603da01412889b76031948f722f9fdc54012b4ff53cc77e9a787946
-b79a81d8a32577317f3c7f715f8d3f0daf03877d06d4161503cc441c723166f7
-40e4727f23a4c75bec756e4c40b0cde10315afed35bf03d523d6ae00bad2dbd0
-358e691bf92867237ab36951657aa0c4d79726dc75d8c1c272da1b3d0b47f95d
-2436d59ca941577a232e540928bbf58673d51715188aecfbee7aaa56fa672850
-b047bb56b9c8ef5104b10f8117402b229e483c863d4831b9a1efaf164e99cb35
-39c0299e73158510e5e1f861a6715b979a9982dfd800b0e38a394f169f0f3d9b
-f4f931de232db24c616bf79f59719e6bad4e451df62e9769ef3b2e74033bb0d1
-437baee3efb900853193f6ce69c7d28a871449e9f84909a96e594db7fd08efc1
-217482e67b2e02065e60f4dd931136556c80f39641860d84b7354e86feef096f
-06e84d35dc3645f05626b80e24f01df1031a4e1ee3df4fbf139d27f95926ad14
-fec86931515bb225c1334c86a2a59dbbfb13d6558d389a7202e0fedce9df3d06
-3c4559b11255d23e5a45709756d857060f186c9dd2cdea53f0c3031a4f0392d1
-4beeea8c705f18ae48fd22c8412b71aa4c62231bb9f34d2220e361cbe109818d
-1b6b0be26b2ff128546d68029dc837e42204d73a35ca2a18e13c46d488fbf3bf
-7f6a6f623085e42743ad29b3b9c042efbd195dadc87928ca26487e711463969f
-e972c925d517c754fbf308c3a4ec5c604359a4c8fa57e8db4ab77341dc6364cc
-c6d0640113d541476389195295d68984a2f25b33441d7d7bdf581229503759d5
-e955ff29ec234f2a7ddef7fa898dc3ef0e82da664087a42b6dc28d665622cd30
-92868e09703aee3764518038ca3969947a1b4e63cea5d6a7ec7aad6e7577b88d
-2c9fbe177a04401747ef15b436b75d660c7cbbeb77bb44e430e9835ab409c2a9
-108f94117951832a5a0af0a5acd4e8233fe636a348f252d22fbfea95a5eae39d
-d145abddd1467561b7fb12660b7cbfd5cf9cd84ee2988ddb6d56429e4b87fc44
-6cf4b70f45e8fc082d7020bd6e8ee33c6b94fefc99336031d219145fd293f4ac
-bce0f52f8ea974d74f2b858a3daddfbfcfd50c3a778ddadd1d1090abf318fb58
-2129ab1f2acd880911be86a256af0d0f74657d53a339a4f527e0e9809e47914f
-d7719db5db1ab21f486d85dc8852e9e2cdce6d35f5ae66b361980bc0516d1d12
-51f9444d3830473e30c9060a76edc532e8d74c4fd22b5bec03021bdb293a3a60
-9d8fc3aa0ff599c7a4593e555e1b82f0186671be699c73a26a281aed93af14d8
-5f9961d44c7f4954d3c878f8bfa0c5632b31d9a0c978442e917fc9ee88666818
-9e13fb731cdecca15c658320272ac9e968ae89bcb8fae5765998c8b4d98aa59a
-26e36ec1543032f391f712dafaeaff23be8821b3a23ca765270cb0bfc601f57d
-da601e2e28bac03b7b171101ac26c195863ec701a6ad7b9db8177aad94be5ede
-eee3b11860892cec50ec4059b6adb16c63482233de6c780a26109f8639a029f4
-5c2d3e6a2d95ba25de8097aba992609cdd0a76683f8fc50acca1533e04f0eec3
-96859b3a92dfdc7d8d34f2add87cd55ff8cbdfc446e7154adea4dda504f6a835
-8e2b3433070f23fb153bf3838e13a23672dc8a1f88ad096693212d994c523955
-75b925b8ee182522d63a882f6d6a3ba45fe37eb499f44ec274666b1256595d2e
-537684f807838d60f07ab06603e23f360d6ab50c94cc48d3ac9b31926cb8342e
-b5a881221c1e34888336699c7cee8199dcf5318cdb661f9188be6dab543d2bd6
-9016f5094d7b04677de039ec3fc22732fa1ace506320899074a31d1e9e580063
-39613072d3eae526b88b5933a0c5c1a438558372ae20cb80e0d4682571f75a1b
-47d69c6868ee47dec033c4ac744d0f958e2915b2c5115a73b5268aa94ede8f3d
-182e89777695d9bc36217ecc7ac1bd1e460a6503d1f1a33919e1bf91349ad296
-45cfef1aa1dffa8a68d4cce0d3f6f5dfad069c8363c68924647562f23fb98a00
-62212b4b82a5ca2d9c98353b7863909d6c1de93a2bea9327757528701415eb45
-43472b40f1a044cd32ba7ca9737ebc5e98d7a0bb808b66d616526ec48e60f788
-d5051dfb52801b9d3ba318da1354dfcc13edb89536e9eb6216bf35a77a1f4b7e
-5eca0840226eac5a9ca586ad811aad53a1938860af4fbf5fdf1af521c07ba519
-e2c2fa0dd7dbfc1153a5a77bda9d78b0ec5f28e832943ec8268a9fe453bbb53c
-6a45a9e2f679126e323cf885ba754bcef56ff40bd992f0372bd85c303930be6f
-14087eb0f5b26e5900f236d2a8895aa299e3b769767af33f88da11e5374eb32c
-6f5cbc9cdd8b067abc22e26504fa960e4464803f95af1ad57b249f0826e3b092
-4a5508b46c8ac2eb5d113da479890a7be56a7a5a4896fb097e2374f2ac7d2e05
-ef4d4a31d8e9fae9a0df448f198cfb26ee8462dc01c448af7389076577d4814b
-65fa2e4cd81d22d81db6ac028c2c0419cf6c6b0c8678e1c8bbeab1b89637fb5d
-f04d600e7ea27f4768bb2200fea08e1872d2643cf36b7dc9a1d45425c2c330d2
-44dd92eb0631c87d8e6a275ce000dc7891a91f71a326d191c50c6426c7a5f677
-17a628260eabd753444083e6ff60c1a4257d97c6026a15efb19af06c73de3845
-878b618e10ecf189126b9c1f440b5114bf0d736226f86753da676fa34ea9958b
-863e2f5e085ffcce7ba461ed3191701eafcace0c98abdd6ec4e5e37cdd1375a0
-cde67542bede694bea4bd5a92bcb296e6ff79e40f730490fb4ffa1c0b88e5d7d
-cf6819b545612c1978c34ddd242ce9f05bd2de8c6bff8e79fb747035c89f0c1c
-8bd4f55f14b6c510060105605dac0e571cfc02a8a580390292473b7b1705175d
-33efe45867e7fbc9029106d0e66341ed9fa6ecdd6c8b4c50ce213a022a4d16f6
-adc0ef53f46870add3d7d1038523d8fff0b2443a58f087f910fe374b3181c982
-732b86c0e23bc8f9b657d5c49f4925868ece6e5257b6aa08f08b2df97380cc7f
-d9c8e09d7b6886fe8adb6184751bb1a776b0f0b365dbca4d2e470a9f33c0e424
-318ce60407abf86c71cf2373e4226cc556491a91f4234f75d8a974a5b4c9748b
-25e143d76d91150a4796b1f668e9d709b8d92c47173ca4323a5b1594c97409c1
-82a52797bf1f74a8cdebbe221e9d1868cfa963b57a28f27ced76ec79dad9eafa
-c9dbc14b8a0542e93eb35bee947ea0c0fc373170406275d6f94483b5adbc3c48
-1d877a83805751d169c08a772f3dbab227d3ff467c9804ca7ccbf700a75ca77b
-14f32e0fd063e6462ef94bec9bdb4e8a392db2d4e392a270e982b05cfd2dbe37
-02eaa1954bb92e0c74873c3e7b780e7ac3341635c5a48ab40a855052f1f769b5
-48b78ce8549bdc2d972b41b2ff8d4c188a6c6a3009b3cfbf20c9320c78b823cd
-dd1b836a827ab16d2479c289f766029f35fe1fa278ee20c0c8bc21b02837a586
-2112128d04df3d2677260b123ff58fb1b7e6075f1aa0f6c7d56b9cb593ca07f1
-7e5ee7ca93720a395140b558549933bda0106ed4fb29284ea2b76eeddf0e1ca6
-89aa2a31f3a655c6886efc94ab37c6f2bd2cd81e351554ac3f569683ff1876da
-ca0e0f2183c0613ff4266f9c4399f11dc9db5257a48f44ae2994dbce930db588
-46ba3d42b1e318a207645ee9b90ab34aa0ef3e113744471e5b827a90fb5f7717
-27f72758ca2e49aa0fbb427df80dbc2dca243e2d6c332d205fd8e8ccf4efb9dc
-be143004845e09908024e4e59e8828f3108da8b9a590decc82e5f821cf3154c5
-319038719c08714b54082e645fe0baa6667f6ef885a19de9033e25f6f2274f77
-8e8fe9b9bf35e5b8186e9cc7ab124d0e49a8df2343922ce64f0f65a00a5ffd47
-9dcf079a301f59192a3b9f6115845ed1909643e3171ab6f105cedf73ef9652ac
-c7f9c68b0b0fd090ea8bd3d3838af25fa3cefa1580faf0c50bffe0e964a12859
-e27e017bd84f8d89dd445f0afbf8da3a73904ca77d2b1ebfed76c96ec2f8a1ca
-d38cd76b2343f3b3ffae2ce64de4a0e3dbd9f0e265807f731f6f01e1d61bedfc
-f214ee2ab782eb6d3cf4746fbc372acea6153853b94f37f3f8771c5c01d46e1e
-1d307cd73f2963313f46b0ece915298005a2e37a20e8b0da1eba7f0c06a7e2c8
-5bb8385b2034401837bf414b33e4cfe4c40f46efaeb4eb66d8c73c82798b4dd8
-ad3e231d2fd7ab77e3bbab8f4e7b15bb6c93f92139beae8b92fe3903aa35db17
-35cc096486740c95add2ee1c3acab366b335d361f39b441d0e22794696cb2a89
-279f434cf1ca1cc2263218f4084261de8635c0f87e38240a07f5a0b8706201d5
-e84cde169961dfa50d0aeb38a6606b76289c8234a918a37c766877fd4b254b55
-44b31946a76521b83b6175e892670905956aebb55876d19cbb009346b8f6f10f
-a6a7a4c86da23716364edff21cfe7427d6bceae58e5fffe9e3ae92f3f88d9ef0
-786ec2ce0f1440cf0ab52ee2249d0eb924f20687e6716af698f8ab76f919d5c7
-4b4a860d28647c916c23421c50754d52749551e7349f72a5afdde899ae41a0a7
-074f2099a53d4403e3bebc0270bab5d191672b4fd9b24a3a32bd62c863ab113d
-0c98bd274aeb746e8c592c72010af8b3806c86d1434113fd3a915e11bdfd4e3e
-b975ee34dce95ef509c14f5cbc0ad0dc6b2eaccbfcea974baf685a369aaf802c
-0df511bd0d2250813063525c128eef1a2ce9e0015937a9ab1d590a71587a9a7c
-b75c6a13ab9072c934953e93ee05c36b99d54a765cb1b1062e5a312de7a5cb2c
-092a5b06a9ac8914f57212df83432441a1eead79584163d3aaf35be581bacb6d
-b70a2e42bc886f8bd7224c1e98dbd4fded0f293650901d03b9015b6a6f761978
-770bcb647758f87eac41a98633abeb13226e46171db24a7f0cb2f94e43cb7775
-e389dc2cc772f99b17f04dc1baecab2cbb77fd8810e1d818be0a22fc3e313d2d
-462d439e45ba764422692d68b01e7e18fac49e91501607974c9c1cc61f2c9a67
-1cabd1ea8ce615786bfee65314b414fc14528e59befb56f4863056b4fc18bc21
-d61bb8c0984bc7c16b491267a7f80255249179c6f3378c9485514ac7c2c84f61
-00e5d81d362e49f278fafc1b6bf0aa9d76c98476a3e3635165d53a904dd6b699
-d6ca2e9cbcd609d11cc9373f4c1179891d2c370681c8010ec75ccf893b040b7a
-a413663f8e262d4c054bca74f0c5fe40e24d57ef4994db6543bbd561f2b33504
-0356430cd25451126ec91f82bfc73ba6d843c07f304472aeecb7cdd660a34a2e
-05c1e3c06be790aedb514288ec1e029bdcbcfc13689377be037674051972e96c
-df6753b2e31da945b56c0a7316ed42adaf78a531d7412b3a26e33c3fb926446a
-4a8abcd35799ef47481ac60948245280236668ae7df01f3cba2384dc88945c36
-7c9d70039f6adecabc5be2bfeaa8dfc69bc1d40b593140c974587905557c4a68
-71ff97652466fd44e8f18d31e9855bcb25640f15a398c257292c61ca77b752bd
-aee91ff16e070da93ba5a9cb1d2e137fac8d78499b015ec2c3f8e38422c058b6
-8ced660fe0af345c9d4513983a7662a0c679236b9deca23879c983788e49b143
-67ce3f436353b3a86148ec21402c05a5e815ae1e375de539628557a8caa5af62
-7bc56019eb0c11f753193b3475c6512f1af8cd4032b4e13ceae3fa51c167a692
-01d054707f40b3cf7d7fbd23a6cd3b680d5c20e0181208d4b102e0f96841b6e7
-ec818a881bca226699ccf9587bac922a6b51b545d8222e9fec0fc90bb7b88496
-01a7c60dc2adcbcd798c8d3b67a6c4b6978388d83ee7f052e58d117c15067d4c
-7e0c8bcc3064287cf2cf511ab902872592280b67295c0cfc7b1e51b3f8b71fda
-b9e285f6f0de7030ce9b57e50df59fb2ad6ed36d423f7f2e148246e66d343396
-82ea928d4a3153a382a9638e9bac663b48e2d1f565ecf22d2a2eed624f3eb980
-444697474a2b983697ea5614c7a867d48363a1ddadf4efaedbdcf6306543d62a
-4e2c4b153ea731c1e44b1f362870621b3f7b992c85fce0d4889b78b25d1a1a1e
-c017613de16f6da6ccea3e6c0958d27aad413ef02097a1e379a965ccc3a75b04
-73dd0b82caf8ec8788d4bdd46665810855f8bac3daffb60ad8707c728fae783b
-e9c8a8d34d949caa5122f37fea44063211379c4b88c5fdc06f451d1c06b1fb81
-3a25044a5f8d348b4eaabdbe4f9c1ca8943d2af204c41dddc2c1a2bbf979128b
-665b9f84cdd35c82fe3fc9f7457513bf4a908c3bc2a0d917d8af2417ad776767
-9b8c7be588b373753077761f99fe50c8df8a8f85eff5e4fd53d36644b49e7cae
-3f65634f6feb5838017ed45a4ca1dba9adc2d4c525d1f952090d31a49b8e2aee
-6b45e0423385f52628d8e43e0cfe89d07640971455c629da5d938f551f8e60fd
-03eb7fc642bcded570f8f592eab13c71ea7c9e833ca2d2d08c453f84b13fbdaf
-7cdcd6383ff2c103fced1d16cc4d8a21d57a9e65d89f913f1a028250cc3226b7
-0fd0d223f4d715e233caa1aee5e9fe4ffaaea243b0e13c198bb8dc8af12fee06
-09be128117b9c7bc338f21434dbc92bba4f7034b062a3232f73132558ede0fb4
-5ef02c7bb6c146e4290f0d897ca4d72eb8d5312a9a5fbd0b1fb878aa3ac69c5c
-3330a735239e9181ae7f29267cfb5249fbe39470d119ca8dc6e0ddc18d5c277d
-b2f4a12cc489660685fd824e4db3a9053cd6fca133c94c75f8ac1485ca36045f
-8ff8c6640b95d2eb5a7b0d4c5931ea75418c151157bd25f93e05cba374c43c38
-f04e4e89cd5cda0b60e1e5d4713396e2b553727a20bb76a33273bfa660ecfcee
-2d3df3bce3c339a423fa84d97a637e3a3d99aa19ed8d6e5a68246ddb6d3d609d
-7515cb0f19df665d9f5cefbdbb745a89d3d69887e5a0bb1b4e59f4c5bc0c1a03
-67568e924f8c50654474b48003c443652a2e7a32d5c1775e9b930cb0c99f1a3f
-e6ed3e505ef02e231e9ba5a08c77571fb397b28df3f6334a59d62e87b9b73bb4
-8b3f911be84cbf41565870434642285ab575d94cf326ac39d601db42c83371ff
-55b1f9d5471f81754a3ec6233b47f444e28c0f537d91d8d13f57be0b8cce06ad
-f946dfcd3b272ddc13c3360225b79919f97bd2218313b06a80e4d76d899e17e8
-90a00622db00345e86a42f406a6f4185fda063e80b2f8b98b80bac88b400eb82
-12676ec8390a716d56e244320febf16f4ecb70e06caba17d7459801da82232ef
-71c80a924edaacb29af50d26be34bde0c1554671f4b0153a40a8693790d3ad6a
-5422eb65661cdca9379e47e813ddf9e1240cb259990bd8b92d96ae9576df599c
-743168ff8f0c64c37e870e3ef25146a9231c46578ef77cc3464adf25ce35131d
-640e067c5843d0d628a36b9f5fba003cf19d15ec0d693a8862685d46a30a18eb
-7d66a20b365b258edc2e9d9a6b414ed0f1ac1894ecdd4bc2d707d88833a1e34e
-a72389fc95d26ec2c10e8474bb00dc4200aae15adce11e1d8c4014d7e13c5c0b
-6caef835ae542019f4ea14c7283fff973eaa8a310f40de4de0ff56807bd4c46d
-c45523fc703fd8c6d08b32ee6e31943dcb52a47b30dad4d3d2a5cb4d647febff
-ca269375f1cd0455dc0a81e1886a1dd4b78a9d30138e03517011550a22997fbc
-4c6a833d32631d4a6cb9bfce3d8a98fc0393aca086a6bedc8ff833bb9c455e2d
-1cfd953d3f4e60f06e8226c561ec5dc4994ed8745d934e231d95765a0809b952
-48e85d325ebf37d8084619d4de9cc4aec1204c9122b918279b1ab7e63d9eb477
-74654bfa2cc04b8ca5984e2ed6cf7358df124b5bd67b523c4785046780708e2d
-982f3a7f3e6e266a5b3b72c1d9d13cd7d055a957d96015b11ac1e05dcd9fd6db
-aa69fec04dfd90eda81bf71aa205d1587eb8d1ce5b97cf43f32bb9bb2a41ba55
-2fe72fbcf8573a998a4be2e870380d4f6cb4d086ce926c86db0e248b4e594d4a
-e233bc13dbc6a55c5e7fc9c9ec994876cdc9795e0d3d0535f702f13c8cf64659
-b0248033530ea3b00295bc96240e3a41fd97a7e175b544242eaf7146a6d413fe
-fd9d4c4bc1362f20a1678b8d6ab03d7a72d9cf8d79a9fedcf826274efea6ae0b
-837eed3e717c09f713dd29b6ed9f5a6bd7ed0676b6dfea8c9c02a32fe56d704e
-bf1271604acfc1ea301d86e270427c417baa917c5d6e8e24af0b352d4f6b419e
-b63ac268e581a5aa86c7eeef14a718e33f4dfe5bf05a94675368e780b8f81ef5
-ade6d7647f4282ec319bf5991a09714594dd1854ba9c20d6b00ffab76e54f388
-a60780ec12af64779f2adc061dd71135447bca3daafcccfa6183fcc78522b533
-1f39f30e8750c0a3337a44766cc3f7f210c1a8e10f4ed1cc54d0729b26f1fefa
-7367aee66b33e8dd0e78cbec4bee5a70ca809ac39f84b72f1d119e4353c2e4d6
-20c7f6383ab7129b62270e6f7e75a1648d1da0536e79d60787aa3149b96a284f
-2ed1e0d2c9c4de7be5db53b35d360c1c6210362d4a35f91c6633daba2c2272ce
-d87c53f85ca1b55002d4e8680cbef6bf500632752827c0a5f19a062bbad900c1
-11442036e66d360743faeb0636e1f31b554b6567e4540d07abd6e1ce39313277
-5029e890b63ab4708ad351725bccd79d75e49cdb612da57efe3b44a2e7870e67
-a5d9686eef4b57c2a17f2d83cecdeb54914610e5a3401a97050fa517f1662297
-e06d29442d0fd89ba10f21584e71eb8bd5b03fbd56f5a538f72c9cc8ba5da11d
-9e4a7f8d9dc2fe56f2976d3e6bfc901de356a3d0690a0aa715ec6d339d72061a
-530bfb5323a8d038b8ad3adae140668e505bd100bdb20b98371228b841d0873e
-832309912ac7e9d4c7ee9ce81285c7f8e9afa8e2077e635bb36167c9e9c6153b
-c73fe799800c39fe343d70e38f30a721cf2796839096add3c82b675f0b659f6c
-99441f9352a332065c9df5b419a020d9b2fff06efd3295250d5335f7a256ef97
-992005ea2fd03f408a7a923ad8afbc8224daa112e8e4faf2ca974af2cafa92d3
-d5e9fc80b0bb00d933f50ab9010d671751b3a12196919e073678c2b047435a8b
-b826809e33bea0f12379ab1a0392d37f27766ccf15b3648e574e7dd1aff8295d
-df3db858bc078153072770fbe45196c3107a12df7f48d7bb6e4b99cd3553e01d
-59bc130f7877b18b65b15ea50db1146c8ffb2da5180b603d920c099d15aa9533
-b594791c144a3822f337abcba4d33d36299bbcd94190f85e0c28f4fd51f9cbb8
-9d301eb3f41179389b4e3323bc407c1ab223ba1608a5f8cea8d08a13dc4fc307
-2f93d59a3c8b32cf0721dd80c369e4f590d6fca9930d4ff110611d755b5fafd9
-9645e29003540c72f70f1ba5b1a884d1938f77ad689e6e70afa7216f31988919
-86df34a1089f9a009926b8983b05663bebbc603d90ed348ec33afc5a549af5db
-86b90fd34f534b24234f229409f960e2e921575cf45520f2d651c62bce7ab637
-6c2fcc99345aa8880a8cb7a67c54ca398cd61ad14162c9561ed8e4e9737aa9e6
-b513003edb220ac92894ab112e100509608504afe0fcf85b7bef8000adb3afa0
-3f85f52b856c23a68f58bc28a601e5430ae318ffafc24975eec7836b147a5a50
-d0369b90f111aeac20b4db1abe66c32bf4231006d79ef4c303e7aefeca4cd5b3
-00b6900a26b2b9d98da2809a9135dc6e16644dc932f106b016fa02730f1d6dc2
-b1c9e10b610f2bd769fc071e06ee636ef566bfc05899c740bf3ba380cd7164da
-7fa355324aab667f33fe518cdb19060cf3fae8a0363e4460a6c2c9b70bf39054
-b2d3eb81093b0610cb03e2e7180523561cb05761b5ca8cbaaf5a35f7179b1d4c
-18d0b7eedde1634f120fc0f6134e55a6de259aee6d440444e0ef0fb7db8a9c63
-95f3200e5d40b854ea844860529d1b694585b8826d988f432be1f620629691ae
-f282e79b2874754f96c4a4a1155c2ea07450c2a256b9d8e33eee33c232c99860
-1e34dbb63812ca08aff99255ae6def9dc3ee2789e9bc1d956de9fb255bd51d5b
-09da88ffc9d8744f61e002da68f41aab3afd0314ef876318c8785f87b04dfbcc
-bcf681dc8a0d615e24ce8f6322705a59a0824b5d1f0d35c7b04062d13f5cce04
-7885cf30dada61ba4cda74df52c4d4afa32206ca799ff9e9ba2bf939deaad2fb
-5b14cff0283dcb41869cfbab91eed9065d69a6ddc91cb241634df75a81fcb4f1
-490bf1195ff98db50e9fc3c82f10d91968259bb1b07645881c274d7751e5c2d9
-40e9e8a23de33344c3e15b8c0a3801cf73eb1dc8e9df066e7ec61667ed349f0f
-45ba6b0832143d4e6e7901d4ab7b461ea6489f419b59ef6fa892663b01a222e2
-7bc2f4cbc81b1982f595dd2cc94d6388312cbb61ff2bfecd27b1220dec43e9ac
-143a83b5a63c057e2ae6393054710b5d616316ed94db2e6698c4c1ddeab6d9ee
-2444408d659c7b68d4cf5c294dfd4299507c41190068c3905bce2425f652c49b
-de244eb94d28d3d5297e9a11adaa7c9a9138f00659f2f4a42fa34db8b8e29246
-15ebbafefcdc538911625e0e0e9ac8eca76662bf295c8fc2f871fd9aab87ef3a
-3a7b293875328e89d018f40c760006fba666b8c1aec0c64231793e22825df5da
-923979c72db39f5541e7f489fb5d9510674e8be697a1aa7a0249dac954fbad79
-06d11031ce4605ea491e9920524f4a60ae55c85371fcc9f046c1b83bf3e5812e
-2a2f06cd724c777d2238fc465bb016e8a78ce7c86808698a852d474b63c811f5
-43591f5d8391fe4a4d2dc3abc5005757a17922b6eb0be4b9c238fd162f9224e7
-475456f639c59a26c8c6107ec20330c8724d6f6842edf3875cd0f87dc434ee65
-421155bbf5226c31de48374d426bf3f3d07b9bd718ec54f8eb9a6f88a9de594f
-ec2c9d4b2b32827fedec8078a6851bbd269993b246b0c902242f0c7ea422d799
-65338a2ed8a27e49a0be708911bff10f485b753574d8ac8313caeab496e0ccd9
-5b67f10cc0c074ca7613d05a67bd45df6b72f6e30eaba836812c91a2a0a4bd42
-2141d7443ab359be588901f46a22d52fcddf6bc04e1fb006a32d37dda270565a
-575354b40af0869c9b1f8a85696326f546e9a25417b38b9b5d972bd0d933226b
-f8b34f70b324255750f5a64c85318907900c3320f070b1f789620e4f5db6f37d
-461f4a2f15e884b948327d53420dadcc4b073b37ee4fe935c8f520d9828ee209
-976fd2c26c71e3bad6583784ffd61a2f419981d51592a6f8f47b4718b6736a2a
-1ed7f729a521155a39394d038c34d8a76e9c6f91ca369da29fed83edfc05a219
-853e5ebaf1f3d5c6ec932e69b7a0dc19d248f81cf541348c85853acbb8334b12
-26ce33140f3965db1a6f79ae0abb24b93b6916496b1698057d4c2d4a6a72305c
-11b731a8a07ff1eecb84fb6e3f3c3706b09a0cef4b1c2012bb9278b76f5189a9
-38d5b9fdd4cb9028f43d16dd39fbbd10a684582951236a05e0692bd1c139742d
-7e75a21cf14fe99d51dcf0a0b71b267a0ad42b8c1d7f46ba46972c8ba7bdf849
-15fa6c5a922dc93fbaa9fc50c7696494e6c372f3467695da5a6d7eb87c0437da
-d7b68ee36874203d741e373e931425d4ce521b2728633a25dbb435f963399f37
-8d0adde8345439cc5295ba3d255a72039ddb1592dce1ea47a92d7b641182d0c6
-85d0616a85361c3b78bede0190834c1de0d4d132f459d8f29586dc73f974dcd0
-5def570984a9c2bc5a720999111c7de6a28dc0c6e9c51f82d8c55a26ff5ed760
-4337606960f847382671bb144d5ae5032c74e0581b19b21eea8ce4529eb792c1
-044418fb0e3da356a5b33cd97a0dce15ee9279b076405e23683f68c63b6b09fe
-c3ce3e1b30a4cb3a1e72455a372b6eccc7e4c97336df45d0bdf94aea01a108fa
-f28d98d7bacd750c7c25874e0fe3fe20d8e1d51043eca67c546278dc13716d9e
-f81a8fe2945a6a49c82b653804d54f626238396d8e4a9bdec4946c365d1164e2
-fed12929b769cb13712ad61c764d31798a87a3e12e1502cab14ca07efb524ca3
-dc31cf17f73feace77494de837790d812dabd36cf4c78123cf76b504886d0cae
-13fc6757bb6878f792a86d52d0e90913d089d7c81faefc56dfdbc3acc2195981
-0728dffd98a2254e39eebfb51742657ac9088cf8adc21208f3a333a1f45beafd
-69ae647754161c6bf0a76800edcfb6a2339f03e4b5ba4308b924ca56344770ea
-1c7322f692c297794b03f3c2a180b645ebf850afb290465ba050ebb9c8298f2e
-50b75571a15a599650a7fb1fde8263e49a68773b5184c30da3fe59a7c75943ae
-c5d26594361b53c26162410d3a1bced7c1cd0053390c1e2f8848e6aeaf75319b
-7ac5654a16cb93832bf981b9d54aebb8daecf97894b560ea75f51bb39a2bdc9f
-f59d01321b51b23a10827e1845e2db316d86d7dce368313f99ce7cab2a8e7c50
-8f91f0faf03626ff87247ba86dc7f3d837020e6aa83921385df0f401e4084237
-95251c27e8944749aa33b0b697456453ad8a5be8324fd22b192adcb22e03c74e
-6a3c9e6f7e452ca491db52e6b18016592cb09955f05365ec73300dc3e179c32a
-d08a443de2753d56f0c968db00d9cd58f1af7e3811202398bd58a337e7ddfd84
-1c8c8efd21aac90582130416d261f3a1b9f36ca431c8d4efceb9eee03d680165
-70ac1f37a1698c0b4da94cfd4c57ff54edc1b25fb713177fbf209928a1272cbc
-25655632d43e6d14c052763452d51cfaa32c8df47c57112ed37ed239f8c00268
-c78d7f3a0a965fd9e3f3c1aef2dcdf74f663a72b15fa09d7309f2d15b232efcd
-baed8a66f17b0dd190081a95a5619684a184603491a32114a5ef2c5076caddef
-0b4eb2197fd59ecacc6416398da20414cdb6a9a3e9ead646c34ae4ace4cd57e4
-430cf5bf55ae076419c0b79095d903753ad7f46dcc1b93f782127d33a309f245
-33484156f9ffcbf9e841d0c71ab0b12594cb2c327112508593573cbd95d75739
-f4ed866beaa48bcfe3599f62b0a848d6f63fbf79937966f3a0ee4c6163ed16f0
-4b8bd51ba483da59fd1d719499ea3aa49fe4917e10e2da13301b0a8b50f3841b
-6e80904dec24e5428b97ec17e66889170d12a27c028cfac9adb2eef49815f433
-b6089c9d6ef39f058f0cc655b27f4241ac74993af39e1fc17d5f9e27c569ade9
-ffdf46027fdd633bec61d8c5fe318810180f4437f356001633e14e098c992da7
-52f392cdb417d2bd30698612dd7b2ac00d0e5b4b3d7a20b99d0858d5e744d4af
-bc9acac37005c3841103a6ffdf3192ff85ed425dd221e4bd71ca3db6a739c7fb
-9602c130a1cbfb5b9bb9342099c2f60497642ed1029e5f9308a5097d6f33c815
-0f9a31a988ab5c162e5aa56357c8186ec5914533aede037fa99820ec322c8fcf
-1ae1a6aa6e048c99d2af1b96ee8b313ca0453923f5fa095aff28e7cf79c4be83
-70058ec3619ae4eb31fae28947355290e967453cf351ecd976ad1c5da7573f0a
-ddadb5b6661c47a0dc3dd22d7c175f9391bb9e359bfec4eb2b687a5a6f2fc8e2
-3ab232c34a95f54cf924fdf8011148145466799cd44a8440a0ac99b7f119e470
-a7fdcf6ff7a57a588f407de565b6a45e7fd5a1925efa770209110c54af8815ea
-ac1af9a0b5a790f6df301f7f9a105e776ba30e2b56d1dc2c0811990c8d2a0d59
-d733ee5bb53fe30323632057131ba4ad1d49cadad65d386ccd7a2c70bccc068e
-e881a538aa3471ea3b66ae24127dcaadbcb01a9abc8df00353c568aab8a971f8
-fe42a15ae22fcba141317584119f38d44e479a0d230273fb235a7895972f3f12
-c9964d1fff7ae88b9d39bd0c948a5ecbb2d858a26c01d57f3ae91ecca2475bad
-2d9c5d8053119644ee9ac5c3448c412b9fa18b8c5cd666b58714124c3c1f7d24
-62b31fe9605544652c1b62a4c16c03876977228b7808919fd49da8c14e12971f
-bf157f70c41e54927f569a8ded69e9ac4af29fc679a278a7c6b0b1a605bc8f3d
-d28c0da975292d88fb0b27a12c56ebb71bd93802ed8634e6615f92622e598726
-f1964331f9f3353638adfc0b3ae281842a8ab707b753f94cdc80a4133dc2fa76
-0e723c34a5962c79901e1c3be3644d926abf5a71cd581c2753042a0264fc5a5e
-f6196bbfbfc152730227798be62643e38c512d889e61b5123e58c173ae6cb8ea
-1f3c5358d9ee649afaa3c0fa0efc9d018be248b664f9b16ff484989e0ed8a199
-85abe77acc50b0da312164a738dd0b0f8156eb2b18b9c18ad7c08ad8b61de543
-84d1f5ea363354272e3d937a2f770a74d30910f195d337780b3b65791a0546ab
-18a8ad95353637c276b4fba66000886be4c478fdf68bdeab674527bbb86d75f5
-f05702581626ac0e693f73f08005b929bc154a5cb26f1c1447a34cf441aec12c
-e061d5c75dabf9b6055131b7e27edfa1197492525b8ecb98a74753f10324b4be
-61c87eed22b31f59c4fc0a434df9d34e3ef204268df01fe50866c937fdd83de8
-be67591219361b44441676d4e24fbffdf0fe6ffc1246c94de5de84d0e2ce54f6
-4001a4d5056dddaf20dab145f59405e14629138ce2aef7f7df4c3ac3c34c8270
-0195c65a7e6770d2e8211b5d6ee9ee826c316acd3063c634114d96b68f9e7be6
-d6f09e1004eb05a1b8d5b8602e7dcc4e9942a1a07cbce0515a5f651df70bd369
-31149d9d07e155b69fb7aa2ee350c52fec11cd82b0bd41dbe5af51b22a0d1aa2
-42bb655f8bc0cf68708f4891d0152ea90a8ace90fabedb75807baefc45b6fdbc
-ce98089dbe4004fb84cf3ca808b355a401bfb7cb0bdf3d34c56920ea7c9fd810
-1022917883c46cea4f9c53a1b735206870f51b55f688da9c8569dea21b033a7d
-26739a6dc374059371d7f0e4f1369f24abac48e2bd6c37033106921804790ef9
-8cd1e8b8e954dda81ce530dfd6b96e68e9e65f68893704d4e1d462e7fcb38be8
-9687baab78161f5e6957db5340f62b08b6a15b34574f8e66a0e3ef88db94a571
-2d01ac0f7b3971c994b8c4867c26294e63e18b06748cdf7067f521acdd28f928
-efd5ba043ff030c24f8dd60f472c254442493e4d5ba92cf85023881b5a222ec6
-5a37ebd19b3cf67310f5fb521ac4f8434ee8e998339f7fed4cb830c5f84198e9
-c5ca9e7347186fd6dc622118c624b6c5ec9554641de66beff929d05364b9ff44
-dd342e36818f8af5a81208e7d92eb91647f1b68e4bfbe708c0ea70e90a1bc7fb
-7fe7d3d81f207dcf44c20fe86ea34cebd111b7c5cf7e0c4ace99eef31ebf1160
-ac50564b361d8d039b8f622e3c4d6e85474d232bceeab726bf66b307ce147c32
-b1351681a3b6be40d13fd8da37cb71bd787b78a922f3e9f70969a716a76c2c1e
-fb6c315bb455ecc8d2475b1e61aea14f788f235f8b5a7cf987b78910b2da28d5
-288a7fdc879b66f78d5aaaed5293a17a1d96d0715e2d0006feb9a9d7e4837fb3
-91f3ff93e02ccee1ddb2b47716abca344666c1573ee338bcf35d7956b9cc82ce
-5083ef6d3155e28f8755aa7f8dc6dde81dce8c37736e78b97c4459be3b471336
-5b93671811cc5a397a4a943b1a82f712a7526d9010fd07514856505621d5d667
-68820a69f5ea83b0d810ab8ed4e5c9acdd54d4c19f958add35d3d21f7089ddae
-f69e4fddb831a94cc51f7be19410c5c6f3b0ae57026c4a2ff33bc8f91afa9844
-abf3f6ce
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
diff --git a/lib/fonts/dejavu_sans_11_50.qpf2 b/lib/fonts/dejavu_sans_11_50.qpf2
deleted file mode 100644
index c88d099092..0000000000
--- a/lib/fonts/dejavu_sans_11_50.qpf2
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/fixed_120_50.qpf b/lib/fonts/fixed_120_50.qpf
deleted file mode 100644
index 95b60804e0..0000000000
--- a/lib/fonts/fixed_120_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/fixed_70_50.qpf b/lib/fonts/fixed_70_50.qpf
deleted file mode 100644
index 76e5919dc5..0000000000
--- a/lib/fonts/fixed_70_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_50.qpf b/lib/fonts/helvetica_100_50.qpf
deleted file mode 100644
index 5b407e6a8c..0000000000
--- a/lib/fonts/helvetica_100_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_50i.qpf b/lib/fonts/helvetica_100_50i.qpf
deleted file mode 100644
index ac7c696301..0000000000
--- a/lib/fonts/helvetica_100_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_75.qpf b/lib/fonts/helvetica_100_75.qpf
deleted file mode 100644
index a1ddae0005..0000000000
--- a/lib/fonts/helvetica_100_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_100_75i.qpf b/lib/fonts/helvetica_100_75i.qpf
deleted file mode 100644
index 8bd9d1a3d2..0000000000
--- a/lib/fonts/helvetica_100_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_50.qpf b/lib/fonts/helvetica_120_50.qpf
deleted file mode 100644
index f7b8484a97..0000000000
--- a/lib/fonts/helvetica_120_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_50i.qpf b/lib/fonts/helvetica_120_50i.qpf
deleted file mode 100644
index c796828677..0000000000
--- a/lib/fonts/helvetica_120_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_75.qpf b/lib/fonts/helvetica_120_75.qpf
deleted file mode 100644
index 14c1904c68..0000000000
--- a/lib/fonts/helvetica_120_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_120_75i.qpf b/lib/fonts/helvetica_120_75i.qpf
deleted file mode 100644
index 2078f49c51..0000000000
--- a/lib/fonts/helvetica_120_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_50.qpf b/lib/fonts/helvetica_140_50.qpf
deleted file mode 100644
index daf1e0f97a..0000000000
--- a/lib/fonts/helvetica_140_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_50i.qpf b/lib/fonts/helvetica_140_50i.qpf
deleted file mode 100644
index 002ac3ffd0..0000000000
--- a/lib/fonts/helvetica_140_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_75.qpf b/lib/fonts/helvetica_140_75.qpf
deleted file mode 100644
index c75d848b87..0000000000
--- a/lib/fonts/helvetica_140_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_140_75i.qpf b/lib/fonts/helvetica_140_75i.qpf
deleted file mode 100644
index 81ef8ec96b..0000000000
--- a/lib/fonts/helvetica_140_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_50.qpf b/lib/fonts/helvetica_180_50.qpf
deleted file mode 100644
index 23900221cf..0000000000
--- a/lib/fonts/helvetica_180_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_50i.qpf b/lib/fonts/helvetica_180_50i.qpf
deleted file mode 100644
index b2d32da5c5..0000000000
--- a/lib/fonts/helvetica_180_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_75.qpf b/lib/fonts/helvetica_180_75.qpf
deleted file mode 100644
index b3a5f20410..0000000000
--- a/lib/fonts/helvetica_180_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_180_75i.qpf b/lib/fonts/helvetica_180_75i.qpf
deleted file mode 100644
index 4beaf00d8e..0000000000
--- a/lib/fonts/helvetica_180_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_50.qpf b/lib/fonts/helvetica_240_50.qpf
deleted file mode 100644
index a703e96fde..0000000000
--- a/lib/fonts/helvetica_240_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_50i.qpf b/lib/fonts/helvetica_240_50i.qpf
deleted file mode 100644
index 75ec4ecab7..0000000000
--- a/lib/fonts/helvetica_240_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_75.qpf b/lib/fonts/helvetica_240_75.qpf
deleted file mode 100644
index ca900141b8..0000000000
--- a/lib/fonts/helvetica_240_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_240_75i.qpf b/lib/fonts/helvetica_240_75i.qpf
deleted file mode 100644
index 9584de84cb..0000000000
--- a/lib/fonts/helvetica_240_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_50.qpf b/lib/fonts/helvetica_80_50.qpf
deleted file mode 100644
index 149db404f4..0000000000
--- a/lib/fonts/helvetica_80_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_50i.qpf b/lib/fonts/helvetica_80_50i.qpf
deleted file mode 100644
index 007d1d8325..0000000000
--- a/lib/fonts/helvetica_80_50i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_75.qpf b/lib/fonts/helvetica_80_75.qpf
deleted file mode 100644
index 429306601a..0000000000
--- a/lib/fonts/helvetica_80_75.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/helvetica_80_75i.qpf b/lib/fonts/helvetica_80_75i.qpf
deleted file mode 100644
index e1929258a1..0000000000
--- a/lib/fonts/helvetica_80_75i.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/japanese_230_50.qpf b/lib/fonts/japanese_230_50.qpf
deleted file mode 100644
index 5bf076f72e..0000000000
--- a/lib/fonts/japanese_230_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/l047013t.pfa b/lib/fonts/l047013t.pfa
deleted file mode 100644
index 475bdeb0da..0000000000
--- a/lib/fonts/l047013t.pfa
+++ /dev/null
@@ -1,1346 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono 1.2
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.2) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Regular) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch true def
-/UnderlinePosition -88 def
-/UnderlineThickness 83 def
-end readonly def
-/FontName /LuxiMono def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {0 -211 600 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078983 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83BF47CFE01E54AE843C1
-FF919109F85F08DC15086C2613CD4932FFC3BBCF951312D7AC8EB70626A8256D
-9CB48AE151BA7EBA556B7FC8966221E8114D04E16C2D41159D816F0736665744
-C5AA840A8C9E4A697E288564BABF9F22155139A91877825F56BC44047FC0057C
-78C5CD71D7859D99CAD461A73C7871F7161E71EF00E7DF6D787AD0209C092AC4
-FEB4AE0EDF2141C62D4C5120EC43941E32433D8D3EDB02539B98433D8D9CA45F
-6AA67D383551729AEF5E277B8CFC1BF612583912EFA2A3EB1C1490696E3B5B64
-987F7129C7F195446A898B0405208E0943FEBF10E74DC40EA182198E60E9BE5A
-785D6DF540CF0AE65F2EF925FD27DE63269160F358AFA6CEC1C121F1EE2BE18C
-DC1237C59283BE1B774EFB9863BEDEAD8229E459BC6E2DAE03EAA3083214E847
-AA01F76B67C91AC84CF459139DC819E0575C04BEEF896208B91E6A6CE8AE784C
-E77246F7BC68A2A4B4F642AC3AB4748E352DE8555F5907B36C1668ACA42182D0
-E9FC1C228F7BB63F6B041C2DD08180D1AED8C25B136D007C6DB9E11C2367F0B9
-CAC27A34AE8EB2981315AA94AE8377875C50BD43DDB93A2DF261456B4B945340
-C81C790B5EDE5C3828C55E244DA6257D05D0D2C3274A35FCF96C19BF666B8C45
-1982729FD8C9E61FD1F81A4A346902E511732F09CFEDB4D88AA555E15C05F19E
-2CA7BB2294D9079A9182D8970ED7153C9D262F6203290D693744F86EE55CF4BA
-2F11579C681D25B9FA91255884C9A5050A15728E11348EE5EB4F370749C3D27A
-D6A686868DCF0E327FBFFB45EFA735CE9AE0367E6A239B85FD751BE92E2C7D8A
-618A08110FDFB48272337AEBA86F992A033663B0DEF168DA75BADB4071110941
-7320C0990BCA84EF516AD34E5AE14FADF3E3E44EAD46613423069D24BFE0E28D
-DB6D32D0001738AE534BC2BE240BB5BFAD1489CC2B2F6621449936C68786A51C
-02E8C179B643E401D01BE6849BFC89E896B1C3356DD9E8FCB69691AAF6BEBA04
-24D62B9F266D560B4089E20A9F35AD4A7F65A7183761ABBEE0F7EF26ED3565A2
-5516A3A5A57143979A1EEED8CD52A69E4E1AE4795F3EE0CA21B9F4D166783A9A
-F54B08B6C56703932A310197E328C6E6A6BADAA11D66A952964F31FD690082FA
-02D1E2A4512A9F274233B203FB770A3A1C7490ED630D0FAEB3066429D00302A9
-5B07D8F628F1EF4E3F45B5AFC9638A46BF1286E21A7463ADF8D870CF36728FC8
-3FED84B967CE31C5F19D9E36E707907AB3946AA1DDE97A87CF71BFAF25A904BF
-9D15DA7739FAB55835A8B8AED166F2445E020BABCBC2A84B0A20C8CD2778BC3E
-074CF498E454F752CE7412BAC70A04CCB4C093854AC72F28F0ED22066816568D
-2B61F311C2EE3444CCE402A461CA0118CB6328C7A8FB765C4A008B5DA5AB9916
-AF83CC04157B769C659A794A7C3EF8149211C0EC2E81A2FDACC6E6C2C0271987
-E8C47DDCD84E8AA3BB0889764042EFC8249E0FD10586BBA5E3C7D5394C3C2FF1
-D482A67514026A4D65B094DB94C4A8872BE1FF437E983F6F2E8B336EEA6FCEC7
-5ED6683A41C9CE6E70671A63F4BDBE846CE41857FDACE3327FF35AAADE4C338D
-528224A55C4504C2CE5A774EE32DE11CA3FBFAD628A915FE452B0B40F774AD1F
-099860E44D875F4DA0C71B9E586A7D4B8AAA9B7D8225CBADC7C069C46B465BB0
-3F558588B9A6F0330D353A8025B39BFE5ECD63F6A6DAD23A1034B09F44BE2CFB
-F7D974BFFABD8E22DB54CFC0CF46203ED59D7E257E07531D818752BE3E059D0C
-453666701360B64A0E687F8B6B06234CEC96F09671999B301174E74945BE4726
-3CF6B35E73461E18DB1598541CD4903EE143F0FF8411858E57956DB86364104D
-369FA26A999BE77F55F821932BE8C1F6995ECE359BEC8CA7232E70C3E17F0DAF
-4983A7A210F2585266B9AF3C044D70B536630411908DE81B688DFCAF9322E09F
-F0977B628FA31D986C1A66D0F4A6E8A2D7376C6C60099E31F0AEA56CC42E30FD
-DF24FEA95C859905D140824AEB9FFE0A7791C50B22E8E158989FAE39A43D14E1
-BD1617E8F13FDE3BDD86015BEC64003E1D634F3DB00520FF465705B55C18F64A
-695739ADE2508BB69D539CAB9101F955D15BA475043848600BBCB00FE0A2A53C
-C5B5C98B2B0996D3DCAE394BDB1284A6B716D23AD0714E05AD6F4C749DFE7351
-A9DA7F1EE6A630FEAA7ED2BADBD4779E7715B866EF5CD6D17A79674F3F185A19
-EC9BC0480AE6FBD2DD06F3DB4D234F938A4FB5F61FCD5E23B151E89B610556CD
-C649D036DA38897E2603E9E2A5E16116D8484A0D810FABD973AB649646769A11
-534B6C8AD5CA5BC5A38D4236DE32F33F47132143AF460828E7AA912911E899A0
-1F3C85D501D3C8136AF692B3832412113F57F5B498D06E8BC475D6FFD7DBD416
-5033544CC77111B564F7B21465B2BC0429162BA4FD49C7A7A7A36F646BCDECB5
-01E63158A6DB744B925977154927F97628D61221A64F6DF5FD63771F4A76A4ED
-D0CBF03C2AEBE2B364298D7D8A4089EAAA7DF9CD4D0632E38525D0E59F037188
-BA436DEBB3D050B7D214B21AD842DE28E6D46D273F6413FB2B9A508639FC3EAE
-21B2F659568474C617900CEFBB5243D7496F73E0EE7F4A3A0343746E7B189A7A
-B1B3974DEE82543797BBB3D093DABCEF39C27CE8AB728CC971CEEFB76A24EDCA
-564A31C80052563EA4E9F5308F070FC807CA062E26F2D72AF06069F50B1EF911
-97C8873EBACD1D974C8BD85D586DDE8E621F41648BB24DFC3BACD74FAB79EE9E
-1DBE30BA8C1671125E5940927893B2790F7760631A34DBE6CD348E5605B5CEB9
-ACF9EF7A627CBA5DB5E899BD414506329E46F0B9848F730E36553F2A35AE992D
-42D7AE4DA66E75CDD23CAD56D4C51176924D5BE94C2A974BB46E1058454FDF5C
-7EBDA1632EDD353FFFF7525193286A9AF6145E102979CFEE99D9FB3CB1FC2EB2
-570476B11EA9A19A434801D58F4318D8414439922D89E568D6E83A57FD76802D
-C0D30431821B145BBFD0126F2AB0161F103DC8F2A874238870740AD3B8954262
-55475C3BC6B1EC0E77BA8B1CBB176A8959AAF99A2969C4E0A3214D0627D7CE92
-A0D7EFE8E39CD42CC31263968ABDD978F3108C8D2F70B6E386198088209826E9
-6C31F1325BBFF8FD0E4A59327049FDA978C9CDE7D79E565E1BBEC909F8EBB12C
-6BF8505890855BBBFCEE7265519875954B9F44FB1A024C28A734BA1A03AF3A3A
-64CD95D8884B321A43F1041E38FCE81A6B2563C2CBADB04F4036B0208B863FA6
-9E88D301B364AF0F99CA28E1D023539158B7CCC48D092CBE1167817B113436B0
-7AC9BD5B0382F02EB8C8BF99E2F463994CC60A09BEA9A64E8D2CBD966140F4AB
-F361D62845F72FAB9A107059C96E70DC1E2469EEDA1FAE3982A64BC300C9E81E
-A98B34D8DAEF36B9E1F55E3F5697EF6F029E650D480D210014C8F18647EC2356
-8EDE0B22E54524F04BE37DF85FA61E3377A08E57E03B14554FDB1B40F07F2E86
-259E818A7732150B01A71181EA18AF4032E1BEE9A4532B26B9C8C063396DB817
-1A1E25A731C10F8B31A84393E9ECB4F279C884C29A5E596E08D144D081C4B7D8
-CF46E43E35EF09F56892E322D345FB7BCBDC665FFC924AD4EC638AF0959D931D
-33A54E0062C68EC1852047D73E8715D5A6E11F62837DFCE1617608CDE2C753BC
-B1CE0C4C1B151CF1FF1A4830F7484B8B1134617F6B1B60CD54B3623E518CBCF2
-95C49DD546E783F884D38B86022865E8B57139637516EFAB9DC8043A4A8EE1BE
-623EDD5DAF585F5F3A9EB96E6A51C18E0B3793AA94B6301C3473C58B11B9322E
-F90BFE890466EB6EC6A1138CD2AE2398EB1AB8749FADD587C711E18AB171A149
-D262A8EA2A462C4B0AD1A00C53F7C3D3D1C9CE8FBB95A7653113D387ED03573C
-6AE045A7190E794571972FD93DBB5BB1475EB2F946795C131C1572F187F1E6DD
-438DC64EC74AFB6B730830D835642F1456E76C3327850B745C38ABADF4E742EC
-17B3293D8C64E041EDC5750FF5552C333DF29FF5AAEF6214463FCC682254BAAE
-84C0C71D4ECBF232AC4A4DC563C819BF966C37993F2754077385DDEFCE85C532
-95B2F6FAC17A557DA24669B61997BE8D589CF50BA27FEDD9E76A19A96D1D48EE
-4A4D2905E97F89E6C08F25172E511F66E04233648C85F00F219DB234C3FF33C1
-3A75ACEDA696AD9D778666C706246428F6B0BB75F812A4C16A689C9733B0D105
-71F948225DE8A512B7B94298D38555F9486E4496389426C896BDA10B71A25D12
-E984AF2EC3F78613269F85BBC185013872B1572A799506137E9A6A271683B7C5
-4590BC0FAC02DE3E0C9AED49C5CA0E26507DF36C2574C1FF73BFCEBCD4597632
-810D07BA9A666A07A099C06E0639283F42E7EFB3FF8DC79F7B2962967107F5CE
-41CF3EAA45B092F2BC433BADAF57E390D5995B69F1E7806BCE13834433C891F3
-80694297260788AA2EBC3A0910CAD32B7E0B3E5101B5164BA8B0259B7DADFE9F
-84A7C5DC8DB864471CB666F4148991C3530535DD7C086CCC09A768B22937D0DD
-E18B1EE12E1DE6AE83F6FB9E1FB217B1D9BC2B4F8A01907A80DBB16A496B2B7B
-3A00BF5CBD2BABFE145E5E49AF9C3398605DF0589EC2438A167DD38B46D52340
-2EF47C0644CE0258457F0D24FA19676191AE2540D4C98C6764B00D6917F62C01
-276D9E04BDC21E83A59CBFC7C6C252233BFD5C0C96A004B217B1E78436EB81F4
-FC2F82B70B19EAC733BB0E5B3352E4293717DFE2DE360EF780567D255AAFACC8
-432774772791DDC2BA4C250CF314D53DB0D8DB88F2B624AF4337C19F36D5557E
-8CDE1B8703A5F1103BEF1E83A8327F7DEF9431953A9C814D067EA660252BD0C3
-BD0423DA5EDA7EE5AAEACD32ADB758D3697110DC41B6F67CC19F7435BB9EDE00
-51B5D7D941F01872ED0EDBD0E012DB3715BA84F06AD9A7CB13221290ECC5D98C
-167209DB56A38C8961533D3CE2897063DC915F84BDA4095703477FEAF6720F09
-A70F352C574CBB342C3E69EE05242DBFF4BC8B673216206B6BFBC5FDC3F79216
-F44F8E2AADC0172794192CB17A696979CD4F7264268D1CABF9F8464AE0DF3FE9
-A8729F8B6AA0B493CE015BF1BD950E9D89FD9473215AD7513157CB46BD410FB4
-E130B2CAC097335F9C546FC6F678A0C8351A9424E981F316D7452846DDA58384
-5ED585947C87D1E1271E7ADB72085C960D9BBD3BDE3321BEE52132A62A57466A
-F6BF8B639C9E5B3E57461ED4671283236D09F7C26F35EFB6D363417E24684C83
-C758B9AC5FBF012EEA6E69F5CAB55BFDA10B062E6D439FFCA550E7BAA1019636
-C5113FE61ABFF64F29118024063A4359D114E21D80190E293B80AB32BDBA340B
-065DACA9553BC4C0F1FEB1F16E073937B11413C5599C058579543DD1A350F69C
-0C66EF2D800F790222CFA1AC0745652238BC471FD4DED46ADA6226BD83089FE1
-91C7909A2FE12F5F4FB0D41341FF86465D4539A227E782E1FFB9652E853F65D3
-04D9203D4C9A93ACF81DD54FE0A4ADF2E839C997FC49927B92A99616BD77CEF9
-C77266204AF4219EA4D4EF5D974D4993EBD3FFDFF0B5D7AB0CF13279577C58DE
-726476A0C291CB406A8D5DB1A631D404FA202AFD525B54041EE4FCF4DD94B326
-40511F36C2958FDB83DFBC22D6CFECF5415FEAC44C6529AAFE85212E9F030844
-DE707696B057D6AC50EF053F5BD88DDDB9552CD9F42AE29CFEA52065F06AE1BC
-3F1D7B12B2346AB2EBB9024294ECD82B148D17D1CACED60D2BD5EC91447CFA12
-9479FBFB279ABDBF2FAA8760A54708E65EE4B3CBE671447A8DDFE9C51881A47A
-83D5DF96FEE8EABCE230209E6A5208D1FB109D1B49BD2E9278C6603FA82DC102
-CAA038525870995634541931A77177BBF80BCFE9C12EC321FBCEFB916653F349
-244B6DA93CE590D48C6DC0D673299A47621E8397E0BCB164ED6D4CD605570CD0
-AF46D0FDD920181A58A1F2236D7AE126F07723445AA36179531633F8647F88D6
-3494299041A1B7818A7B62B8B8783B97E7C8F5FA7E65987EEE8C87DF23C0B09D
-8E84BEA5B8613F0C144EE32E58C837B0A2037F51B467083EC9FDA57FD8FE5E72
-89455DD56A17275637E21AF50EBE5EB9D573F2D834B0BFC0CFD414D569D4AFC3
-C71219F52DA9A1A73CDAADA94EEABD9B14D42421A562065DF9EFF2784F1F40D2
-AF44CC68901213F1E6FD68CAE79898785FA3FC317F5D402A6697F6E52FEF977D
-1C962966D0E44C714B15BC9B613A680B054D6B64B974AD0CD6C4BA7D255E49FD
-D881755B15859CBF57EAE82406FFE8453AEC2F07C9D17A8C4D3A52B6D4259CEC
-604DBE8177A6C3A96BE29FB309773A1B1472529C21FAAFB3AF407978B250353D
-490CC9BA66416E522E200F5BAF87A3AEA2A556021354D7B74A9AB3CC0955A5AE
-2B462ABC670F327CCB53C939E0586DA606EB7C2DF1C9692FA4CAC3078A250F10
-1A73EAC268EF45F1C3369758E1448600234477C85FB11770D17C36A66CCC5413
-544AADFE34E62102F2528407ABCF5775AC6308C7E3395F9F31976A7C0CA9A95E
-30A5CBB8DE888F8C81B8F9B1A2BCC36A89E0E75B2F0B19EB4145C9CF0917518C
-0EEC1D6B3CCF7DB0EC6354B75B9C54951796C825D9D8110F17BAEE6F4713ED36
-07BFEF64033F1B1E684C6F7D41AC91E8404D46577FF16E2851D3436770FDCB17
-B53D05F1F49C5B6DE9CCAA2B11F5470537C5C80353C62346058110C084C804DF
-7A0B9134752E93B76F54A7A573FA95D6175319FF47496E608241D2E33E51030E
-B79B9E4838DDB48A81DC4DE9492662F91C5308925214E2C226B28D8264F96E16
-4A49B248594E8053F86234651DE05A0188E26BC3D2CB7116DADBBC4DF98312B6
-8950C20F99AA330B1F011370CB0E50111CA1CE3773ECE6446742DF74432A38B4
-800DB338C4ED84E75506CB8E601B345BF60BA8B49710AC9765B33470A85FBD2D
-BB0D2000FF9C0EB524F44AB6A0ACE74EDA1D46317CB2BD488B621FC237CBDB03
-B23A450B64BAB89B60FE976160E5BB90642C647A0FD609B2A6DE281A9978ABEE
-0CD7D99F087274C3AC641CBACBB0E128CC29E141F022E4A404BB25F7FD57B58D
-582D176EAADDAE7E3385A93375C8B37D11924AAF00565EF7E53C117F10EEA3A8
-24D6DAEF6766D9BD9429C84448D9F1890BEC8FE63513E5690426F85655741096
-D2DF9DEE68530E79B08CFF9C53B280581C6FE3C5C5C8D54C54705F12B1CC6C14
-7606153AD79BB94473AEE5056ED3974B71FF5D3AFD68AB651A94ADA4F84C58DC
-42F3E29D3B7423C72DDE240542F038B338D888910E27B4F55F40F11B654B4BE8
-A196AC89067CD52DEBC77E0C4CB4B387D4D7DA79FDEC55AD017E62AECF4A69AE
-F04A2CD3F7F897A50FB1ED048B117A1BED63E07A0B9645EF7CD6B91FECEB75B2
-3E4C48C9F82300F8C100972F29F0C132F3F802128B3C28DB8C0C557E0C18B0F8
-F6F3085E1300FA06B9C360681B8B5083079B79BBFD9E8E82D160E8208A3940A5
-553ECD27B328EA8425A53EC26CA31D86D486D9EC8BDDDCCBA4421B050CBFF54A
-7CA93679FDD917E46A288060E42FDB60BCB784FF90045821410FDD246DE7F240
-8E4E5F9EE7A97945D959936D692C5345AAABEE0E739C8BEBA85316649DB457C4
-308CFA1AA2D107AFF0EDB39DB5208C4F6FDF48B053A1D7F89C473A158A031213
-80B96B47905A4FF806CCA81002C3976A4ED1849382ACA1BC62940D2F2B5423D8
-FC67B48D387B440A04C2051BB75B24B4C15F6B0665988427F23A3CBD576436CA
-4656A035E9CE18B233FFC11FFC35A88367DC48D61512CD052824B2272A92304B
-5D04D414022E16FE3A86B047194B7A0A29DA9E2111A575ED97405E78DE606058
-24E00909DA25E9F50E335128969455E6D3610F129C46501917A352E5F34C5C30
-8B5E67B07E4E6886E909FE8DBDFB2DDC0D3DB1F4978326A50ADE74998840F3B1
-5E82C51F00454B57DE06854A58A38D34B5B7197F46CB9AFAF975198C7821029E
-4CE991BFBCA3115EB5131414640292341979F90CE55FE7D737BAADBBEFE37D14
-F17C8D795A06F04883E3207A1E72AD520B22DCD826B676463DF341E365C3E95F
-58CC0C17FF5E13DA0CAE7601D5C09D0F5E5A06BB0452D26D3399AA084D88D2C2
-AC9DB9261BDAA3699EC899459996E26EF30C36B636B18E5532DEFE9EE1157949
-D719550715D577C1C541EADAB9564D2A5A8EB242014C65764002DE9D1368A3A6
-F7C2B52411EC39477E94FBD8E022F9B3392097953BE4F90F6098CF819CF2272E
-5D4A4C202550F1DB1D98A097FB8C1B1636C2E90C8E903CBC9461066D6D4F9694
-C8D0452C4AF2EE38513434633ADB80E1CEE43F90DB31DD3402A9A8F79F9E4C6D
-4CD4F5F4B8256B973923766DDDB1241E963F456273A768608B41B160472512FC
-5F708B6862C97AC5722799EE650D6B94A9CC66483FD6BBF17282C1EF506A3034
-7751B8CBE2494884659CB9B9E71126D50F2F771358C7ED0038C67721E4DE280A
-91174C08D3D1CD9CB02D52EF619EA3BCA6304A8C64D277BB7679A0E13E12BC26
-5E251DA7E103F7E82436FA55F5CEAA984B0920B415D919AE9698458E336FB257
-2E4A4341A2B26C69FBCBEEC84E608777CFEC5C099C912B638037C7F47828F5E1
-D47957FBBFE87A5A7B5454435510D5A79B769EEF11199C6A81E64D7C84AF6E42
-80C3185BDB0353584EDBB0B8691505CA9B69321DB43B9DF3F19E0A509EDB55BC
-0D1BC93EEDA436AC29C087835CB7DA098813889261C2591DE2C20672A9260E6C
-F7AD215E722505889A98A0FA33D9C3939B5FABEB8598F413A47632A029D99E6D
-1E40079A737A6EEE0D5DCE9776746448B4DDBC1DB82075FF8370512BC31F992D
-0C1865E1EB7B4A3234EBFA45B5DFD2803770063E06F54D07DCC059022A2F5793
-2A87A7E516B7B69099328F1274B491261FA9118F4305814AEC9154C48C2E6E63
-96C5E315056B50F5FAEF68B76EAF217AF680340A8FC7F91B83D79103E1B168C7
-6D90577D2E151338A287A5D8F6D45D21EB07D98D1445157EF9A970858E80ADA6
-30F63B956FD01971FA9FE829E99D8F460616C4462215CA40B7BDDAAA74EF9CD2
-20E86A2234C836201A7A53E511DB8C7DC430CBE22BD1F93E9010C27957A20FC4
-714981CFE0EB619D9A84E1B8A1985D5B638FC686FC8738CF790D91D97741A74A
-FB39448D99ECB58E7A7A5C061DEB0EA250BD616FB538CE3F332E455860536EA9
-7F59962BEC3D23EC294302604305C544616D3245EF904D6A62517BF85BA33090
-E68D5AD9D974C7A97CC63470138DAD63DA0FFCF87FF4476EAF26DD7C1D89B330
-9D11B5E451B73F5F6D254939EECBBBC90596EF0EBAC7D2F6A423F44026DEC23F
-70356D47F2911351B9FFA5D17B8A5D3100BD020FF83FEBF040FDB8E179C74105
-376613C15F5BDA64F18E162CF868DA0862F89883CC6822B266C1EDC84A2A5A76
-EDE519E849C2794B5975E968CE9001D823F33FD56E14E857D1DD6C5490EB678D
-80B66AC404AF5C25C00DE8FD8B811F68019A325BD008FF2758CDD0CCBC65979E
-2B8F2CEDA715EEC6EF000AB97CF24F5021F0529C8E52DA2B05278E9391D0E164
-DAC055D267FD3403237FF9BE4D30660E192DC8AA46EDEC4230AACA029C99651F
-DA02296C4A7F48D3FA14A66A46D3B2C4EFC585B4638DCA012505A09F6DA59875
-3C418609DCCF6EF10336093B10BAAFEC6447D8820F7F1D2BF8A1692D3876C8CD
-2152617F95BE5E507C9FD85B65CCC9716157E15E9A9A163C95A615981F67FB83
-B9A30F47E660766CDAB3D2FB5D4B32CC38B1EB62F4B0E3977EA0CEEC21391C6B
-602EDD051F432F219FC7EA421597F67D09B713DB13061DAB18219213F340E5A3
-CFDDA5A71F5FC87E6AE0DF373C0F4B38CCC8A69844740E63E17E526B32718E4B
-E1678F5B1EB02F35ACD314962D7D0111369142F1F318CC5CB72D21A1749F3C80
-744A126E6FC8875FF8AAC49573E9D28CBF5EEE5EF984507F01F5B56C6B2B9012
-F5C2D8C85BD09F8548D24095B691888C39ECDF6C1961DFFD56FB055ED7C620CE
-3E680603440A9368C457C95E340130B86737C1BAB1DFB2DCBD14A87FD61359AD
-F633434879EFD38A7DFDC11F935AA0271875377A39346F4809792D75D3D1A036
-DBE9C6E0F4BA355EC58E46A7C85241D72D3CA87B2E5BDEAB24BE6E087CBDA69C
-F5507560D13D13510640742CB19FDB451C2A313D3FBC571CA74E48D20FF8C998
-C30E56C2142EEF490F5F88F694708AE7251AB61FC5A55FB1BF6D975F750124AC
-21CECC1B8A9175BB8FF8EFC8DA34C873E5C3ADCFB3AFA3EDEB4A4BAD75CF63D8
-4FF86FEFCDB51FF7B8887E5C2E4DE36201AADAB8BA2671F2F7154A157D1C9700
-7528B1B9509C36428E277BF37A097A281F2D9ABE1AF16328505A265A4F2B8F9A
-E0D8F6F391785358835D5D382FBB2BCF5839D78EBD49A104ACCA215C17877E59
-B438ADC652A2130F5E79D4441BFBC63CA8AE9D6730FCAEF12C92FCF1061D0E24
-83FC035789A10DA0FA865CDDCDDFF7749D0723115D869E6DF100057E2EFEC85E
-1BE6C671205128371FA4D39465FE54343BC195498F3EEDBCE65B913E9A45F96B
-5591241EA325970EB5F2CC9791B632F057482F8E1309D3A20A52C2398BC96673
-8D6F30BB78E4F55FF4339CDCAFA8C47A4DBE00CC0A3548B1CACE66925427B900
-1E6ADAAB861EE413B225C26DDC765B1EC7DDD718CA0AA0E7E0B92A4F11435E7A
-BF6F106538B016EC5C713774BC3D71663029E0AD2D02674AAA26A91A6D048D2C
-8380645767CBFA882FFB0F62B5452AB47953C35DA3CD6F178B5006DE79D5CFDB
-7CB628E29C3BA71674D35F346488892F0C1FD53B47B8613BCD6FD8EA73BACBFA
-15C85653D4DAC9924A324423C92638D93E2C9DB9289271F7DEFFC67C5CF3DBD4
-DB5997D9356A4086B5D2041EA33C78EB7A4B8271840614E5D9021448C93CCA50
-85EFFCECB75F30B1466869558851A9190EF43F6C25EA419F02D0B4A571C62454
-2B5AF2D07841904716A18AED7F49DC7649704FB5D3154D1BEFE2E47073D9D2CF
-40D1D6EA1D0806ABEEE7803DEDBB65F30E69E0EA7838BAD0E878A86359529A8D
-716C6123D5BE99ED71A47CF92D27EF42F8BE0828261054C62565CF6DE988943D
-0E653E4A4E2EB84AC004FFCFDA56E5444E36B1BDF8021DAD38D68975F68B96C6
-AC7DF86DFA8B06E85669487FF3066DF334BC3F7C7A0A7B728653D333C901367C
-9434E3517D782B7DCC366E5D1217790F14C87839E0F820A7073E8E7ED430B6D6
-50FF6E60F50E6B4931ADF0B9C796D47CB44C9B8497D7AEFE83DF411DEDEE59F3
-3D9D24C893DC7C9727691818D856A9974422AF79A32AEEE7F84EDE5FDB53F405
-0C4CF8D19DE038DCBAA6B67621BE99979BC8D08801682CE7A6BAF9AA0920641E
-19F99686191AAD34B84C6497D7035DBD189A5D868721EB92EC73D62DFB0E272D
-6C9F5048E0AD5AA1E8DEE499ABA2F8D891E5EB8BA3BFFA54DABF3B16E439FC34
-2AF610DA9801FD977A102A136DCD03342ECC66E68B983E344ECABDF95387D7A2
-C0F749E5C9F5D71AB50B9AE441D7053332CDAFEC4E57FC1AFC794EB367307AB5
-750CB771BA33C8591D4CE3D0E8C4C841E3FCA230602B4609F13433CDD4D0815F
-7059BE698C1F4DE0D0297AB43C3C0B6417CD6DA5629BB857F4475DC30267D831
-01417146B0C1C7DCF877E445FA50C2CC5A433EAA684798E2EDD76EF9BCCC978B
-1A6473F2306C17A6B92A53835E2F6C64AC1D129644EA310A920E420266CE2648
-E3DC281BD364B5C3EA9933EC57E55FC1AC534FB4932C1764D84458F8B14A9D18
-3E99ED71B7D67CC839E9FB4747D7E15EFF60EE9026598D7FFD39CDFC634F6543
-4D538D4A33A5C563FAE46EDC8A7D4F7B62BF7538694CF5BD427E01E60CCE30B0
-50F2890260F7B8B82EE310C5E20E1D02310B36B76864983A187BC6FDDE8B1617
-F64C971F69761AF5C6CC550DBF3C80E69BE8B2AC311B727AD651665EE53F9350
-D472E4CFA202E95CD72AEBFED28F411F9B7DC4C2F7F9FD501B214E9950EC3F7C
-684BC28D0A8272A769209EFD48ECF6A633511388F5738FF97B84B7230C78E9C1
-C76804160BF038CFAC465E3F5ACA33E2CE853F0191415EA84072F9E44AB09715
-950013A33EF8E0EC7A9A7B7C10BE0DFC17082ECDD1C3D6E108F098623008F3D1
-6E926ECFFD1A0743FD695D52008925B0B031C14AB64FF996FF6128DC781FDBD6
-ED3C9B0E80E49B36B3C4812E9EE63A70C689172C65687BB83BA8E7916772A06A
-D972087B74718FECD5E32CC04FA76B57915DC0827C9D387344E72CB20E373325
-66037392EF2D1E9B7AB58609145AF02EF435A2EAE82C06F29B8E736F081D4FF1
-992BB239C627BD9CEAD20D82B9675B70AB6603E4F932B3AC9281DF73F2F40F52
-C2FC6951D6EAFEDF7F02BB70E1B5684665DC0AA3627AF05FAF58031D6643D0CE
-A54F11E2D07CDFC9DEF212ECB685522C9D6F6D6290D59677AA606313D0F44812
-7A4A7E1E2C992286184CE893B4A89FC32BAB2320BC3961EE4B49E9351C2B28E7
-0B28A837FFCF09E2F6054902C0BBACE191453FF48D6D0B0190BC3BDBE365846E
-D2A8039ACB5D9673C50C0AA82BC0FDC339FAF8CB61DD5E0BF5F18B9F979E3442
-4CB364E6D9AE720DAEFFE1A862C0A68EDABB17C4E43278B4A4C98C08D975F62C
-31836B3EF8912D40F1D211ECD3FF967EB36F332E3D8D7F7C98D7B4A57B373418
-C5732B949E391CC6B7C456E72E6ADEC949E603814467DA7D2AEBFA32EEB1A039
-ED79359CBB060DFC9782B28B7481B356CE2B39605EC6658971360EED1C72A524
-A95FCF684A44781D103CCA8B11D4390524D1201B68527E60EE2CEBBB3CD45E74
-9468E5A73EFF365C05EF520230A52BA4FD53405D08752D01613029D77EF2A7A2
-05F79644E955660CCAA3F2CA5E58ED822F24E73970C92562F3AE99FBFB7270AD
-D588318B44A214CC4DA5CA6CFAAA3F70FCBBA7F0B40767495A2F19599F8C4DA5
-A055EE9BD280F09E693A3B196A37628AC7115190CBFA9CE5FE51B5BCCCF86DD7
-3B2BCD92FE8F51246D0CB193661F197F9D731A3B719D87853D1BD267A16C391A
-9D4F1E8C16818DCE0D24F7213E3A140C07F66E465BD7C1DDF762F48633464D42
-7B8529FE6968B378DD6140FD636185E1C58C4AD8FC5FDA1F5D1ECD76E81B2515
-F29BD82DE369208FC9EA8ECA3704CAE5944CBC74FE076852658F237F3AF02D43
-9E11DC17C900E66910009893C751E74E3BA60B95605DA55CB9ED4EE060A34859
-7D0DBB5021C15E596361346E07833987845FD9AAB8FE403C9455C21B4947B978
-00840CD11857A4979208E2DFF63E5EC4D9435E297CB1EFB5E022EB30FD1C9508
-C26D1135B157259FC7E6B53094F4EB7E50BD21979F428CA996B438D88E02BAFC
-D1C2DD524879A76FB96C515F18DD3BD49A9BCB9B6D5BED899757BE7E748D842A
-61B916DF86CC3CA1431A9D3B6F048BBF4F348A70E03EECCE83961F7675CD8821
-9241C0DA67E5BEC09EBC3A4A16DBF7F42FF35D7BD3EC21B52FAA4D1F6A446721
-6F9D2C770CFD004E830CF11BEAA35FECEBE878B85A3A0D13C5EF7FA6999DE090
-3CA1A7C149AA66CEE6AB31E3F376AA4D3CBAC14BC612D5DEC98121D32BBCA0B0
-97BD77384E215A3011EFCDA2E24B2866C0CBE8A3FA646CC1D40F519D62A7B6A1
-10A442599852F9352221219EEC7873DE48F0105F95AA4BBECEAAFF33F94BAEA4
-B90C5A44943E4B9502598D260476DA762FD3F69CF92CB3FFEEBDCC3A333CFD31
-F5893F591CDF7A14412C7B6B24FC6451BDAFA0B88AFE3BC385D30C9459BACD7A
-4A50AEED28243A668562956006624E4F557E942212DCB86B114C5F88A1064CAA
-FCF7FDBFBF62609E114E9E1AD40AB62F6D638D866F278860E3F89A4987CDB130
-2704A70DB8C42D1CD9BD22A1494B52ED3B71761E459C30492601ED712A9A1751
-CE57443CCCD28E6116BCBCD227C50437AC7812E7AA9166AE6C0078B7695B4853
-4880007783A978B75D2DA6CC7FD83B1E7B07D55078CFFA0312FBA9062B6DEE2F
-B1093B47682FB325F3EDCFC428D3D56DE67101CEAF945ABB8BEC9A9B223C092B
-A322E0F0319495EF5A6B8F5538CF76C538D5D57E8D05945412B55720ABAB2CD0
-14FAF4DEF7793100A21715F4AFD7B9A2EF18A633F5767DE967E03954A7052057
-E0928F7A8115C2971DE3B14FD72DD75665525EC2DBFEDBB3153B7CD0B7BE1E5E
-A74148D557436C3F3780C8DAE74A715A41FCF50B069E45D3451BEDDE480F3689
-0E48EE9A64D35252B51672021805C0D7D76772470D28616B7E760DBD09C52A82
-D83AA682F189222CA3A01889E016BA4854B1ACF2121ACE59DAECEA323F9CCC34
-5644FCA6B0537595851B12A3C1E159D5CC40E9B632A941EE0AFA50CFF3E26575
-A3B799D850DE384D1BCF84AD581E30B0EFAC66EB8F4FE9DCACA0403F2F42BABB
-C6E30BD7ED53FCDD893606CA9F41EBD95509EA1448F8BF76BA545B3AADBA02F8
-9591452EB3310AC78FD5F86BFF400475F9680452976D717374C62B2AEF3B6115
-53885C26E4E2B35C58847F36B825CEB631C11109E5E9EBC52918DE2A9DA5F3F4
-D2350E2A69897FF8E4D148B2F554F22B95EED13BB4CFF88DAF7CB8EFC08C4D0B
-1A4DE99652B29BDA1AD6C58FE3626A1D31D0FB3234695835C33EDFA37584CA48
-5813347EFC28237649F5A29775D2681CF949130F93BDCD16B759B44EC210F457
-E09F25FB0368E4D98209EAC333EE2159612984F18B8F06DC1F7E89F2239CD7B4
-43FAC95CB2EC0881218DD3AB689168AB4EE907E09490DF361A1BC1C978C7C79D
-6FED7176C2B72C3F7D64B01E635C404C6CEEA25FBAE5B5669B5D089B562B1408
-D5FFAFE3C1C653A55D6F1F6EB4EBA1A56F8E255C15B41C6992E070B1DBE872E8
-202F7163E36C72AC78DD56CE8239BF3198293006BBAA89707D90E4C729D774EE
-165DB7FF5988125094175A7196939017EFE1A2DF1ED89EEC5309790AA50ED3AA
-1B310BD333BF2970CFA038C3DB87BE39CB6BDA17706D5508C26C9F8B4FFECDD4
-43E098165E0D0635FA8A54C2776C655113E27FE1641E1738B13873BCDAB2D922
-85698D571A6EB65A8F33B3AE27DD12C05F08B57E307A7B55561805C0EC855E44
-99B73DD02A6F95156A9AE5C64B677DE5339D97F19F4BD75D4A1251DF34EA169F
-5E5EF8C7B7D1043BF75E80212D05B3C3A9161F68FCA385C1D8553E299F9E2DC4
-EC56F08ABA3B8F692A477595AFC231A319410B97C5A34ACA08133BB3B5E7D449
-63DBCE7A0404711C7CDB14BEBF3405F1AADBD8FE13D8423D5521E11766EDA4FB
-8D751F78D4E012237C0F90B6F8FA1E42EA550FE5BD856DB4CE9F84908DD27B0D
-452373A9CC8CC6267A6C8B8D5B253A7F930DE0A861540CD3D6C5B68B817DCDC0
-11074810779B2E243C444DD60FA0E165B662FFB16418DFC1E476BD40549C09DD
-EFAA9752533B315BBC5072A3671C294126A8D4DE746CB0C61499577D3AA047F1
-28ABACCF06BC80D32B76D83C4E4EA743D61BB4D8F6309C5BB8320CAE0D0E84F0
-F5E407311074CA8260A32D676B3015DFFD9442D9F3F5E55C06982B3E359D2608
-8F918A354373C5F8209CD51BB8AEC4786D2591108D6EA01C0CD335FF3D007184
-F056535B30DA59FD9916531C9AE0EE69F9851784E3D79DDF5502D878FC92B08D
-D94F0538670EE8273F0AFCC92CA9B34BC71F06080DFD08DD0BEA5FBB4918DA94
-1AF17468F57970A007EDC44E7D095C66E6325A9C55BDCB1E4F0D003BE568DFCB
-D49D0C91EE3DC0514CBA3707408B35428689AFFFE60EC051CDCD04F8DDE96BF3
-37DB8DA3AF0587D4E1F7AB4DB221EFA93094BF7C8BA71C66D41A850C873EFC6E
-2B0FFDCE7524BBFE592D7C5FC27856125209A19CABD8390E436188984B982E84
-EB38C95514C5DD830ED54908C08B5076E174DB8B3A739780B96C085245AB077E
-83734DBAD19AB141ADB004B4B2A83A579B60EF3DB586F18DE7636692956290F7
-2DF3027C7E083EE457D4AE6CC35E11C90405304D9B74E0455E0DC2ED84D3223A
-476C7442336595FDE7F1D9CBD3B108EFA3F5BAA7C3B03FA2AD9D0BC7AA2C0160
-4DD87E2DB156E11F0410C59556A50A989ED90F37A167349B9971DCEE6F840117
-7A985EA44452A62A69F2406F0E0D781B7D52575171190D42F2156C67BF68F828
-1947A1E79ABE287D6A19C2A2003891AE956BBF4F18012385B249354093DC1692
-8D7B068CF6B371CDCDC742A20AAA4CA6DC052CDD2A1A3292352AF976270951AA
-7BDA8D6A408A761E73271A77E4A6C299161FF3E2292F77E8D319F5A39041741C
-FAE69BD1855A2DBA7CF238F0E0F3E1AC707A420D40ACF1AF5D79D268A01106D2
-27AEB0E25D265EF85B6C4715F8B2169B191FA5666C369C3DE090D352DF99FCB2
-A359992F5379F796992C77C4648B74D2BCFB70D2CB88644E6773B17385767C53
-63A897E259DD25D1DEC1B917270E9C2B90432343A02F62A3E864019EA3E48350
-482ADE56458C646DC3213CED67C35798718467536C417EE7ECDE3D968E5E6E80
-00BC3317067F615FDD4224B8A4A6F2D063799818681FBEDCEE6BF532FFC9A4C6
-22E99C5A3B6B3B8B0906E19934E7B4768E4229C9993DF93D279CC08E624D76E4
-97F5C8A68B9B0A3E20DB1F97AD62A9EFD0D94C86D5F5A50804D93680F7875E8D
-CCC5D9720BDB031E76C4DE35D408282506715C928C4C7DFC1CE7B569830E8158
-C64FA2D3791CA5C5EF2FEC2D0E7CAD0F72C15FBFE175C3BF768A011AFC3FAE97
-77F15B35F618B040B5DC4A6D952C947C93BFA3A49CD7660548F0CB67E1B7EBFD
-B02F89B429212C589DCC26E8D0A862F978743FE67E6E3CD80E9EE36023A90F9C
-6EF66BDF100B09613E6903BD7BB4893757F772842C8E71E01529740A453A5FF3
-EEA0FC407143610F244547C5EC06F18182014EBC167667B1C3469C5E36674DBB
-CD9822914244A3FEE18C6B145EE60C806DDAE13A827B1BFF9DA3C5D7219689C8
-4F425601F01CB9E15D67395A0D571B3B189818822E6CD0537C661DFAA8852E56
-1DC02616F2CF080976E48997C2115D1BDF863473D7B76953CA6B52F23F7464BE
-50CE2C9875882D265A9DD514E41F3CF44009F5B71E1F52D09261D95C025F1D51
-924891EBC45A09E1360D062CBD2E65DBBDC8BC92A7C3BF8FE1CC570AB7CC1691
-129650C975F1EF024D54FC934371E605C47E06803D85915B582E86A3940618F0
-6FFFF72D7369C2CBE7A2A5A1E2DF9373BD3C2D76AB12EDD4F11291781DAE2F6C
-E0601144B6E3AF22F5723403303887F1A4EB9EC17A3A0AD2D020EF2FCEEFFA9D
-EDE73E93B6714CB34307B11763A1B833E0783F918F72C508C529D76CBC4F0AD3
-EB9D86EB288648F2857D546E8FF022B5B0B039E490BE97025DACEC16D8EFC44D
-3D2D45FF8395F75EBA7BA973ADB7EC73C539160DBEA3E380F875ABDA51710054
-EA6D478B39E06839C5A163BAAECD19EE086474D9EB302B818061E1E4E6FD1D12
-FF82DB6077D6D6C99309A225074E6E8E92256042E3E88FCD9409FA1E19E90047
-9697E4AE194F086908F91B8D34A649C060027CDDE154E9DEDC39D9F6AA90C217
-2DED68743609DE718C75FFDC92FCA076BE4D0865A249BC72000F94E4F1D03FF2
-7F13CB176E0DBEA521BFB4A536E8FE36639ED3EB0CEAD041DE6455138576BE7E
-41AB953FC3720AC4F3512BE290A5E2D5C63132E1B0D56ADD8728CD616117EE12
-066D4E68B82BFFAF18B9DD91CB69558534CC419E600EE3E670250D0E19F2FA17
-A381077973542A10F6182FC3D0D250C24A2BC5C2E3AEDB7ED3FA858D558EE47D
-FF81A4768A9A233AB11C844035ED5718497E3395F0238686BE00D975CF7ABE92
-E0C58038AA7B09DF68EF4C559ED91AF5A6E607781C7D540BA0C77D4691A475B7
-B39363B6D7CB872032C4C8E382127B0756E0B91BC6F87FBB050C630453C08493
-AC24F4BC8379CA871515C8F503BB0ED5CF55A6C7BFBC7A09E4208776603447BC
-068A016CB63AF338355B44545B4D9FF234403E858D2CC43584DB031F8EE38B3C
-2732293233312769A0A984ACD721FFFA24A03AA9A00CD1620FD332EA6421C40E
-F4E917FCB00638E8B8FCA62228DE95CC02CDCAF8B2A43BA5950881BD7136286F
-BDCE88C3BC964E268D8BC6EBA1D367EE179CFB277778F20CC21DF0DA363F73FC
-A0CABEE965599A00FB9DD52C9E5EC85F598CEBFBC43C6B1A85CD6A382829FDBC
-D65E57C80AF9BB8D33177C856F488A91F6C97D89105702D9E36D3CEE11657DE5
-848D08C6F777ED161CF596C2C21DF22D5CAA13E9FC2B0DA8847C63B78E9D8239
-B48EEA44A4C1D17EEF695C8ABDF5F688B0C71537BF80146CA2DBC3030CA9D942
-1BBA232834D3220B5DE5452109AE248D0F5C87F26813BFAC6A953C49C456A74F
-D0840CB8E08AED6E07BFDB69AE6A4E9F8CDF872DC0D05D3CBB3EEABADD5428F3
-2A6E7C217E8BA597B225A08BAAED70C35EC9FFA8941D719B6E228C3E1BC94879
-FEFA33CA8B6941981A8E1DAF8CA642C7A6932686EB7E77BB54F4477290DE593F
-2AF063542CF48F8C0D92548903DF4144CEDAC9B9A4E83824839188D0755AE284
-07DC1C008BD7102572EACA79DF2F069BD6C53818C64D855F2B8B3658BA55E78F
-391BCD00E3E517B5FA7E738B10F304E917522BF4AF52AB6C799E1839C8CF45DA
-28A598DE94B0F4101C5DC4FDFA8D22B53A0A9D557B8B84F8ED6B0ADAC375B837
-346130A77F0B97CC46ED60A454CA958EE065584A0E3BAFF867CB29889F60BA44
-AB61DEA85910F12CD0F297EFDEB244ACC85537514159BF2277996C674D9B22A8
-94D2A552AF8556F487B6357F59B3EFF328F675CEA434F5780C1C59E540942274
-D6852E2461EC38DF58D6173EFB3A520EA6E08A6904895097746177A1F2676225
-A229432E5A44B77909A74D1300BFBFF446AA4394524F93F4621A10AD5DC44722
-0A0F1B79AA194C275EDAC3E6016E7FD5CCE9A47A493CC0DC6922B639EBC98EDD
-C906452E37193235127A6FF5F873691F98D714AF9E834004268D85CEE5D87D4B
-C9CA8345487900A16AD97243BFB135AFE42A138C2FC26E7F7C2F3655797608F6
-A722BD7A87880E7F7B18E61BB5C780A62E81578C2E6EAE90468CC53C16D34888
-A41F542ABCFF5946A475CE31D631010238C03288ED5EFE6AD0A08F5698A55CE8
-6202516ABBA71A3837168DC0F3605D7B5FBB88FEEF8F62CF8014F0759912E0E2
-883134B6D916A436864BE76727743F4AF4630ADE41507AEBFCDC4BDF1B09866B
-AD6C12C854E15194E756B96D2C9F986154E767F4DD73ABD97D31C0C5619B5CAC
-6B8F9F709BEA5A9FE2A94B70C0B6E0DBF63F849BB253EB68F06E43513EDD6F6C
-F80E10D98D348DF6F6FCDE5F0C20030A05AF703A5F4EF72F09313E7EB7450AA2
-BCC6386463FD43B51DCBBD2F585DE6AE64C8C0A58A06C26377E917EFD2477F9B
-0C084ED099199C387A3176A2DCC142C8103B74275F997C4E38BEA75F25CF3594
-079939BFD5DB439C24F25E5D900353EFC3A71F9E826D8019148495B692137587
-354E52E822609639ADDA15D9C466FDD5E41A6A3BCFCE8DEBA38F3605B4E262DD
-3D905D67B680F04E08208A21B7FD8ABF2D41D46BEA9F5697E32EC9701DC0F395
-B41101EC847CC82259A5F603ED6D8B311CC68D48BCCF3F88D19C2414CE01FFD4
-DAE254116363C032E274B538712310F46C2CB3E54F85D14D8FEB6751068A5785
-788CE873183B60997E0D5A0E54848383B56020F7105B5FFE278B66D7A4D075B5
-B7F02D7BA1EBDAA9EA32EA5953591DAA2A39FC9A72C364D0FC44D199BC1D035D
-F5131AA54AE791A2223AA3FAF28FC36ED32F102935B728BFAAD51EDF8A379C22
-193172FD86F26ED77EED31405D2C5A964F20FE631123DD3EA41CA5EE1A6A0113
-5B6BA096FBBEB694E813C3B99672EC808A0909A9AE96A68C0B960BCDE731A49F
-DF5F8AEF17D96B253E80064577DBEF7CCC237877477FD25650E26939CAFF93ED
-A7354A9FB698D629CF1CEEADD41EB09048CBA593A6D2698EED63F5281ED9CEAC
-4F6D8447BDAB9573AF6A69326F82A1D28C1D71B5FBC6BD0160D5D058B3368F16
-DBE9BF339018ABFE4B1462FC12B5AF34D94C47F8FD72320A2CFBB2B5C6D871D6
-630887B9022B75D603DE136AB08A3DFE989519EB471C308BF4CDCE9895092439
-190441AEE9B95D976F4017EDC3E2FAF831767543507A36A011000F889C75695B
-73B38DD95EDDCFE98862142096DBD55100715BE46366D0B4C07B41BB86D33CD6
-6D069C60B2479D512CA1BDAE44760D26D1E1AFDCAA882EF6DBCCDF5C8C9C0351
-55C58985B1E558EF7BE135405B3C6F436C4B601976951BC2FC021C95530D4962
-4B1AACB5CECC35355CD348565F2FFD9726CFB074F1AC582B433D330560B72DB7
-7E1DA2E2F92E695978074DE5ACBDE9B3BA497249A6E31629FF041E8F9D1AB785
-9954E01AF3E318B983E57668D6F9A2C71CE7744BEC3FA216ECE3740D70445691
-FB86F4181B0F8DD0250A0A5FF42E07018D0F42D2C052751D942AB2ABD417A219
-15B3F393CF8567EEA0991F9C749AB79DC9CDB9972EE564AC97281018BF54C116
-F5678650A7C0408E4CABDF28B7BB84383B4DA3F3B32B54F1B01972EBBF2C540F
-AB2C85B4E34106D01593D680CEE680B83E335DFC30951100DB3B2F1DDB92169F
-86D88093DEF5FEF12BEDB7334DE681043A76E887121AF90AB152F6B473222355
-C088DBAC06100F32F9601C5D76C7E2EFD238C3B1F06E91471E2E31685E7296B2
-DBD18DC081E23C608BFA875F632C9C2943C10EC6BAFE59F116B1FE4474FE9B34
-F1F831767543507A36A0110017E3AF059AE3AB77A75F4AC116131CF4CDD06D1D
-57A80FB17CF0608A0D00E77F7769C2278833EC936584C62BC403E92716EEAAA2
-E4264AAF7C0340E1C3BDF93090E2E9DC77541690BA2CDF850F9E1A967B3B867D
-1961709D9D3D5E3D0D9013BAC0D2A581E09E7F2F4ABF073BDFDB2BD0FE1C8162
-B1A98B5AF8382481B511AE0143F87BF420EA3E4B82D4672D449371F4E1AB6165
-36583BC5A90CCE79572D8E6A3C6CA0FD46FA494765FF4351F6A773D4EEFD42B4
-A2A1A24DE128D63457808B5CAF5DF465C1E966923DCDD7E3099A8D43C3676BF1
-9E3D6B1E7D996664E063E0D51EE85CD6AA56240BBA9DCB5485888E3F7436E467
-8CA74F68060D052110401E694AF6E016184348EF4C6FFEFAA073498205527B2F
-51EB6276E8B1A483ED40E46D10D775E5E9FC3A58DF4E4BF7E7692E61BE18F517
-BDD664E28E4EC5C6F53AFAFD18CB2FB7F9F4B2A47CF529F9536637875AA9FFAF
-544A50B142F015EA16B9A1055B5A15F184E4F6BEEDC245455943A3DF312D7F24
-9EDE312CEC2160BC7A169D3E9E6917FE7E795BB1D3D2733F0E77B5D265BB1DE9
-4641C27B08879B89E76E0AA7DB55C373637EA09C358324C9A0522F6E26B263D7
-2022A0E788DEA549DE6A1C991A3BD85C4EA3E71C2B461BE7A9121FC09139992A
-B474CF3732B8EDA9C38F903167E4DD3B35BF99893747ED95A0494141D3234970
-B9D8DAA1109F6DB5122A23C155A988FBC188C5A0E7540392C039A6E7C8553473
-7889355073080E32DD4E529DC97F6E7040C5DC37214DB4BDEE26CBF1E2E2E7F6
-A06B7D9E86C7561842B61A3E5C4B94DCCE011BCF92092A00D42B1A3B3F799F58
-11A4C8115DB64711BBA4AD932297F91739565F38A7FE08025B5CA3C479E39588
-5657AD3849A134F035FD142A263A1A68902ACFBADBC4CF3E64A10064C5EF7B5F
-A8C5B11EC9199E75B83A1BF891B2DB8B180F75E942471E7090E9E78A97507941
-9798D4CA52DEB18C09E4C4B24D4FB511681732E021342BF769437EB266EABAC3
-9332C3008375CD804DBE03AB0C9B5A29475E6D8C79E61ED661819BE50AB9F1AC
-81DD036968F39844EC50555A5DE8345382150B2693B607A67E0AEAF3DDD09858
-7AC8D0A3FAAF552F1B224F0BC57B967E9988845C61AA68AF74A3DD5BA00AD7EA
-7BB4D503982779D7397B566EEDDA93D4E3FE0558EB8351B7F15B4BFA39351FBA
-0EA54BB0FFD1D31E22E8C00BB3E642A64628C51A5CD3A4B9AA240B1E3EC4F597
-9A1090ECCA2120EBAB4132F0D81B60A1CEBDEEF87161DE49A707240A70F667CA
-5E78346070629D8C4480F9FA4B5026FCB7C48A149AAF3C909A298FB39CD6778C
-E1B0B400B1E2EE7576DD50E082E84BEA93FE08F884171F5A3B402C29D373CF5E
-339D8988EB92A5345CD6E10B6B61FCBF51E881A1B64C40BEFAD5C72C5DA4D219
-C4F3D0B68FAD2EF1626D1659DDE8EE66FC9D7E65F8DBDA58151412B6D9524777
-F9F1657AE4CAF358AEABDF7267A724AD62B4D006C463B44221BEDA0C08CA934C
-5DFB1C77B4A6A1F8A56D91B1D9192722B265E883AC45C1CEC5E176F331183B63
-F3E7D61929861372E46631FF63916BAD3D10C1111E5253878F9820DB501B0FA3
-1FD1A89C3DAD269A818B175E6E2EC61B7F7A562C0D58205A9D4471B083F9DBD2
-33D7DBDC0CDB8C464F5A1A798401A3EB50004CF735F8E8C16E6F83CE65B720BF
-B15410AB8AD4A9407BBB3E7A68EAC77AEE9698E5E50DDEE6EEA0A984480417F4
-9097AE400B8999F08A7572C37F89207CD83C1BB1FADBD562096362A13E173B2F
-D82D67804247D0910BF81334F2F843EBBCC0458DBE9F21D458D7F7900235F6A5
-C0B81D6E3B9C9FA25F53C714CE8BD134928E88EEA0CA70F49B8942CD33FB9BD5
-55F6F9F9B40879FF7BF41BEC25C6E676244AE10DD13676A09FAECC3FC2B62BCB
-89AB7305887932C37827F4044C555E89FFDD6DFDDFE507DE5785C16EDBB13D2A
-C76A294796ED347F6A6B3FD434FDE1329B37A4EEFAB85A489FB253AB54F627D4
-51401BC7B78F2FB41F43C47B33F33980C43939686392D3B1BA80063E35F07A55
-38C66B7B2CF11058CAB2EDAA16250D57C889EBB4147E963085ECDADD5CBF741C
-FA9D1CA3D307758530ABBB5C2A50BDCA276808972135BE28DDF01016E7EECAA3
-E90E76DDA13906E7ABF92301C72CDB2334AEC951934AF92A594F9FEBEBAA74D5
-25DDA66DB5045BC505FD43450B489B480C9868B17D0305373271039F50D0A381
-FAF7E94DFBFCB40E3DA958514066303BBA8D0B585721C861149EDD288428DC05
-CC5252DF29CA07BDA189B9AA0E56463FBEB46F098E5F1FFEECCC14C8AB0731AE
-B7AC09C515B3167691D90457F87A16D1AD02E53E3CE8CE7A199DD93C809825BC
-F1D8C736EBABFD526601EF314527A827D08C987749EFDFB8D57F95D0B0A4D32B
-7BBE1828EB2DF4C64C4DF2C6703BD8346F14C59A9AEB7615B3C6BB81ED09F494
-0B02C88D60F7C344CA0DD720220820CC857208B0704530AAEF522B46945461DA
-1FC1A105B514ED4A35594D391DAC2A7A7DDBA6C62802EF75E7A4E21454896F5A
-F42FAF1909A5EC61831E6288215D8C8BDD866C18FAE3668D39BA217567BED9F4
-5415FF5916B851FE3ADCEF9B9E2A113019436B3184884E6466FBC3F24C5ABB32
-621C0C4C793AA0BB51C4A68429A611563162457DFA45F651699F2F21994680D2
-E18AABA6115B1183D6A4F6CADE349423A4D3D83423EB59023E66023872E80D96
-D3E2658E3062E5EF5B9A90A3C4BD07442F57BFB0F4868EC9D373B5B8C72F8A4E
-290A12D1B2EA158FA7EC4818E27BCB2C0DF316A9F5A9606899D73DC39E3295BC
-3B342D20375451E653AC76A096F731878C0B250C5E3D1045A01ECE86C5643193
-0E309F64893EC5E5818676980BCFFB3372ADCD656B42ADA232BD1EAB9481CB85
-B738B31F0504C78A89298EB16DC08E3422516E51B871241C3D348A09576AF5A9
-A7AECB8C4D04B679187879EEE76FC1FE0810FBE6FCF7E9A51E25D02F4E30672B
-9D1DE282DD2D29265F2B8339533EFD9575E2FF57B1122DB4B16D35A54F3C4908
-6CAFC314068E5C37A89E2E6BCAF8D9B1BCCA87C14F41BEDB9214B3230274F922
-3E269AE3396283032830E8870DBFAB3B01EFF41A49D360218850CBCF2772F780
-0E30166FD6992C18FF429CDDA136BD81F7CEA7AEDEE140EF20D9F6E827FDF918
-0C1FE773A147A4AD0C2C0D8E789F4387DD69CF4DDB7A5084A37C3CF6BAEDBDC3
-7DC82ABFBE44E6D45960858C46A5B061A7FF169E95C4CDC59574B36F7B410B43
-C8643EA56010192D8CAC939D95009F3DB69E782C71A0DA0F78DC73FA5F3D6BB0
-D0E05C11D401DFAC1F127860814DC9A14780577C5ED809412BFF82CA82C47E49
-0DE1E08AAACA436EB618C2094F3519DB1685D572B046A4FEA93D19EDE10CF0FE
-DF2BF0C402D7BC3A9B9582EC955CC57A9377D0F7562F7991F7FEB542806DFAB9
-05F9304B0546C9D04C343418AE1204B6AC2BF6EF3DCAB00B2EFD50884B8BE2DC
-7CF985258C5489A37BDD9AB727E4430A2361D6CF0CB45C80A60DF0EFC677F1BE
-66CB904C11D868F88BF36D9AED9D4217A42F0D138B6943E8B42FECAD07B248CB
-89B415A0D36289E1F566A4CD2DEE7C8EB9F62E8A2EB3F6016780C60C460750B7
-D599D04F3868956371D587E68063D86A673CBC9E1FD630A85F27883E2CDEE493
-D0ABFD045055F162A009CB3B29D3219CB8AA3F6E0441E189C29E0E7033240F93
-907A7FE8AA4E9CCC93B0E6E6E8EA3DAF7212659378E95DC6AFE72DE348BB9892
-DB4CE11916BF8B4ED640A9CF0E9ED09E4A133AD659AF36196A8E2BB82785C51A
-A4931E36CFEBA394BDA9306F93BE42E9775B72743413D41A5656C6716013D30E
-21845140AD93C540B7EB94493BC25C27BEC5F3BA459F9B57EBB9379AB42AF326
-F3004C8EB6E90661E23231B96E054D7D903E77E3C01B8BE2A05DD624B84D7876
-E09A58E75E3A14D40BE9710C87B87839DA33A74E38C40171098286EFED3A931C
-A2F3921A688BB57252DE0FF714E4E6C57F50476BA3FEB5ED6EE6434F1CB9EF2D
-6CC52EC6A483956E812A30C4B565A02D85EE90C1899F5CDD9210926BC142F7B1
-A19C4487B4417F94AF9783815EC2825EC7B16FC827A75C293800C70C525C1C6E
-DD8A31FB7149ACE92F580CBEAADE4D8025BA127B528C88B6D511FB38AD626732
-ABCCE4176971678EA3492A168B16055065351D18576312B863B1FA566D380FB7
-A2DBF1AD881751DDBC8328B9B2E3B00EAA12136B14BAD25D2173ECCFAD1C0CCB
-3954B60B4A0A93F027050A2323C8A24175BFEB0DC33F9475401A84625F30CA4A
-2990ECAA3127A97CF50F995C001D5F190AAF7E1AAD3FD511E5DB04BDF3A21D97
-6763083BF896FEC43A4407571857790AFF5AFF1262814B9741F3A72C872FF129
-6953B892CE7159640FEBEBFBF790BB4017B4BDE4BE66F255D4115FB0261BD500
-90BBC4117BE9CC9FEB9F58C02F5ECFD16C402A55E16F31AF0028CB62A8825419
-8F04B7B83C6BDBD31FFFE546617B785D1CB84918226C8D15E29CB8E20EE2F706
-58E899DF355A4CDF41C7C3DCD52356B97ED4D9632A11C1F10C728D8CAFCB6A9B
-F9780D00B6B3088C8542AFA3BD27BFE59FE97B1A959295AD9F3998637EC138F1
-686C00676484DD3CF97AC801F31A764C799F2F207398267508558163DB6F9401
-041BD8E9D12A194E2B9816EA4585414005264F0F475E10A452799732C04A629C
-B2A6B696CB661584A092BCE0622AAEB5C8DE8753925752E8D7EC353E7D819192
-37A48D0ACC93BF59192BD92239E17A144C8FE2FDAC9F45A0FF0A784C0F33C0A1
-DFF65E2F1BBD6FCD94C4C41D49D82097191871674F926937EB84351E66D618E7
-DD0AF1E5D1F4BF5F5FB6E071F16389EABCD20AF855322775F6EF175DA0CB3525
-A0355FB8A75B2DDC429D6A3D3D14DF49E594F6132F40EE84607B21DEF33CB651
-986876CFFF7B9BFBE0A48A13A616583D41167A1AE4985DA3E295769E6833C073
-421B7A1BB12A1FB7F68E2B689C62CAC27E49ABC85400AFB47B65C347165E8287
-E051C825736965833C97C548A4DA4A5CDB970A26E5594D058A664ABD5E5FFDD8
-D4B2E46CB14A1146BD4318DCA6B934C0C0CB359A2F864314C060298DC7DB3C2E
-EE7A53DEEDE3488283848C612E01A3541C006D51EAFBCDEAED5C8BF5A53F8765
-8882C233355671ACA971546F073AF5D523D6CB158BD2E52ECDE1C86A320C1D56
-5C7CA1E2C7DA1518A64D7A9946BC3CCBD4DC99ED4C06C49FCF7ACCEB3825C20B
-A7FB66E20CDC7CD5B6DF85A6F9651B5A0A6AF8A7007D247E588CE3D10A659DB2
-2409C592617E844B788F8F31439A864A83F150B9180ECCCC77FCE80FD76762F9
-FE36D8622E27287C1BE29C6ACC87BAC41E303229045ADAB41339583A7E2E182A
-25AEB962E2DEF3938BA4A36C1FC61694231232E0556C48E4CA6F2D8B778AA221
-C7C2C602E5BDEFA829B8042FF26F6DE8AB24C3D6AC15F08F18AC87FD5DBD10F5
-6FDA435B1844B5B5C001F812465593DE42ACCAA50107438F94B9540883D5006A
-989426C0AC036D9F32221DF58D516CD07E8A62217595902DDB61C0122DA5CC53
-033484B751B448E828B3F2F5B780384E879A4AC2A0B0463CFACB6E71E64910D1
-C29D15AC53900540AF00AC76ABB9F58BCDEC17A66943978DB0FFBF26E7182F9C
-51237DDF5171BC1272D2A92795FA94FBCFC990A30BB4089729DD36B34EA74298
-4CEE7B47FE85AE188CB7F01E9D976191C6A179C793CB5854ACE7105651EFFEF2
-EF8A2692CCA84735965666AAB61B7E66FAF98B03C2C91AD6BB2CAC04A25697DC
-378F43BB2026ED0CBF3A95E8D43F3DEE43E2121623BD3F211D15AD7542666E4C
-D1139BED9A63B41A12CCDE934DEAF7417779748B6507ACD789049D0A9A13F020
-52616D42561F9D099CA6C9C2FE5F75841BAA73F9B66B499547924103D120A9A8
-D487525A93B270DDD29CB89F48CA3794FEA61AF992B6D063EE294EA6506EAC90
-50E497D4029A2EC47970F69C3CD93871128B24DB7B64F9E1DB03D6C26848C888
-DB489E5494A272A2671FDEAAEB5467D9BE36DCAC57C1EA64B5981105D6C0CDE7
-16047600B109EC9FB61CBDED2B3A9C048F5DBCC6894A4C2788B66265AE2919D5
-FECA073894E52BD30069C895471E01C2FB1AEBA27E651ADBEE11798B8641AA4C
-6ABD9FDA2FF963A342E695155472AFF17729FB6CCC8392DBDFD0704DA078F819
-39A12840DB11394E8C52B7D525F1CF6A9EC558175489B490C6CB529CC6C9AD9E
-858F6C6574E5765EF040A0BC741339CC899363C897FB17552B54170C094AC439
-C633D71A0A6B07FA0E5F052CEC01B7D39972ECCF810DD236071E6F33886F1967
-5BEC9E659784790AD81F18478217BC614A09B450F9F367CA8C1319EC321304C0
-F167005B9442397C767749A0E80172A3E798778842E72C9995090ED9EE7E77A8
-B4E0B5182CBD20305D29FA42232D25CE8CF595AFDE8AD238796CAABA7A05732E
-DEDC3D9611E73FB21BF48A838AE013D1DB05ABD0A8E104C793ED29C821B74B60
-7BBF7AF551643427F79E4A5D5430AD237629DC722B95DF7997D56C0AA35261F9
-059895E4915405E39187287F253D0BFC35C9221BC7BC7D1D6347AD79EB57D16F
-7CD8A0F05688C5BC3DCE2833435A9617B0724C9D0AEC113719FF60498D379DF1
-EDDEDA305BB21A276068B03655C718ABCC9463672BEF5351A07A70CA909BCE6B
-EC8D4FA901DACBE229ADDD6196678AB4931A4453D433BE83FF4B10781976554A
-E32181301F75F423949AC99BCCAA0D5E45E2C6443EEC033DBCCA5EBC98FCC960
-4D0FE0B2AD4D63F8243ADF0C07C669433639C898B6032BEF98D61A1C712624B9
-D703992E39D06ED9903819E6E06DD069AB2E49B39C7556A9A74FB9CD4005BD93
-9571973AF75229D7427643828DA54783719E0BB7093AAF9CB43E93C70C17CE00
-4F2F2518524992ADF04A85077EA168970C035F7BAE96F1982136D215BD19ED26
-B13FE585D88B9CFD80BE1CC3C475BA976D327E06A2C9453439C498A77074A537
-9CB48921B22AF51CE96FAA8194FC00E1A3BC5EE90758A28089DE5B78A9DA79F7
-9A292B613509BE684CEBB5029E7D06B115C6357A5FF14977EEEF7C54EA07F6FD
-B144024D10CD770D563B3BEADE262952B6D59260D9F9C5E4D0C0A01D3FAC32E2
-667FB0297A92CC731A30F2B6380E4BD1B5296001C5AE4AF98196CDC282F8EA91
-D79C2F7A25E3D28549EF0AAFCF9F9D25AB744EE76B62FCCCF9A2DC9EC00F4411
-AD6B2A3F7DB78DE22ADD31DA29ED3EB6105C86554605FBE0A9ADF6AF06360856
-8FEB129D9EED78D6CBCFBC65EC32D619405C62C5BB36FA30FA0AC7E38AA3A920
-A681E6368244CE4E3A850D08D5D779DB84AB1E2D2CC9AE7EB7179D01E910803E
-8D156650E3A0E2BC7DD6A123E640E6C7C950F5B11DEFC114FFD19B69E0028D81
-5D71285E888DC780692E120C9FF86951A13403321B6B32189608287EBE42C9D4
-5D87D9930A80732DE39715374715AA9B5D9CF24E753110E6480C0895F87A6055
-F9BF8CDC63AA7A304F91B9919E658E3E3506CFADCDACF85AA32C2FA99BA6A40E
-DAC21971342C2969C79DA65A09543D982FB7AB63EE9E016BC89C3782AF98FAE4
-F3DB22427AA0C4081BE2A3FBBE6E6B8873BC448E79C38E4ECE119CBAF49303BE
-83CEBFD5ECDD39B618D87AF87D2B23D0A39E529E6FA487799979C9CA7A8E057D
-00270FD2B06F5EFA066E071C7B6A2A9BAF7FF07383B73E115E6FB2BF4961B35C
-C1A4CC19E872465C98C0E7EF7566232A6E519E5DAD75EDBD011EBEC366C78FD7
-C38473EA43EED26FD251482E3BE6985FF6012BC6C29DAECFEA389E34B13AF04E
-EF40BE464C56A9BE7BF590DC2400B357FBE1010F848C62C3BF13A095D5CC597C
-49FE5119698063A4126D2B1EB8CFCF9A60521EEE14D203C4538EC94AAA4C42F3
-CFE1266BDFAB7807874978F69764670312AB322D502BA3C577E532D388864321
-F47D4750A55010B09B39F55F76BDC353860BBEAD1DBB0DA88986D8FC0B7E6B56
-4AE8ACC638BBF965BE16F967CC3647B7BE00D06C28EB360FF58801B5C4AE5DCD
-79A68AE48A36385CD539B0682551D1D7C9B35DA190991341443F3846F6A4E957
-9CB8B3CB47A432906010CA28F18DBA32A8C6425DAB7723843421C0524AA1542D
-7B23D36CC397AEF3C65D5A18B423B42E834ACA21BA92B5CC7E3B64BDB23C87F7
-2FD8B0D0BBB84A14DAE53C0582C35863FF8F372FE09DD1C1433F20DC53B0C42F
-15015FBAADBECBD8BB5AB0CD91B740CEBE9D7BE2B4AECB9E5D572C52BD3C8DA2
-1C52B42DC5B1861540EB21EDCA20DCA5901578FB63A768B5B25BE7E79E6A34DA
-C77D7BB4C18B90968FD2AEE3FA992359E5DBAE6CCD81CF3EE72A80C2D834BAA0
-B3E1676DABDE1FC4BA707DA236C3131DC4E91EF9716ABB2C71A57A076C7B366E
-1015F0E3D69A002190FD689C11E3D137D5130EB46E27AADE6203B1726B852FDA
-9A9BD004FBBA6F449309C517575DA18E7A9255152F8AE78B3B9C970C163DE775
-B9F4EBF840DDA1F70B2E20E5946A84C3997436A0F52D5EB8C923E9723EF105EC
-93BC86F27DC41BD26CC28912126EC88B376AC07409FFAE4CDB01A72E5B781BBA
-4316A3FA4F46A88B9B264F8DCBB9A8A043FFFBA529A134F62A05319825C7949A
-A07CFF3C255C68BDB81DD007AC7D759CE74DB20EDAAE9153A9EF4E48929CDCA6
-8F85965CF5F8DE1C8E7526FB5F8C79351BD2027287C8A587461FDD4F4801E953
-8910F3D1B2B3487FA56B2A5A19E16C0DF0555B4003B3B377A3E2F877872944EA
-FC334A14C024C1BEA0C8E8E18DA5B3E3CCEED380D50B278FAE9675BAE1A6A7F2
-8FEEA5B7220C84496216141E83ED512F281EB0CC8A34F29A04E02D29D4A2385C
-98E61C5D507DCBDBFCDD6DA3CCDE8BFCBE2BB31875C62F5A3ADA36A5BE0B2F1E
-372A88C8432526C8FDBFC2A8CD635F9D3055FB335AA1318425D44C7C290926DB
-52258A4467AE67FA2A373C6ED1FE3FD47FEAAA70439A06A3BC4F764754F48B89
-A47594FD6C71901DD76C969477F61D4D0760F0D961AF9A24620C3BED85DAC965
-0D2EB1883381DAA2E88792693D52516CA19AEC59085AF2DB01903E2310812CA7
-F43D7BD3B08B3B930EAAF44539AAEECC6F35507CDDB5E92D928DB87A72CC9CA2
-C6C454D3E8B1ACCCCA5FB80D518748898D771D7B6428DD6CCA288DB550D7488B
-296EED5C50F2FD74255C7B2A1177DB4D86F540764E9C51EE17F8FC39653B2AE0
-5171EE26A21F8242502DA857EBD9718319168669D9ECF8B072CB8DD0A5BE623C
-C26B4862EB22EB5911AEF655ED4F52BD5441B04F917EC023851BD94BF70E84F6
-84DD916927014771943A72E8BA16E44F782B7AB40839E20847A2765FF9EE44AF
-66834EE6E122B159FA7247AF41E616E5F6427F1D29480CF9D6B8BE66F42D5122
-34D7275F749AC63A93AD14E5E9C5C3A32CB1EBA1AA184EA8400FF39E0CFBDFD8
-C46078110DFCAD0CFC32606FFA7BF2183FDB0F9BF8FC68D5FE2C6B267562B777
-F3E11B16A37876A39F1824586548F5FAEAAFA57420D0CC28A57AEC1839C07AF7
-80C9D53D08C9030271E4B79739F2FB995A9E5EEF6957BA37DA2A5AE3B49D66ED
-A57B58063CF1A9F7A19EC131178E8F7CB63BCC3AB7B0AB7B2B705E1885766A14
-615520B8B4752ADFADDB24092EFDD737761709D8C2B64C68DD84C8A6ADB68FA7
-2DBAAACE58047C6E051EBB8646342AEAC94BCFC9D4111977763847DABB4A4061
-292B80A451D5B0ED2908242C842B907206BD8A9292F88F37106900F8B6826488
-81DBB4C9005F5618C7E807C45B04B914B5B96BD39C432BD8B29D3EF605898309
-C7C30A2B24A64706862075A7CE7A6C58331B1E6A22868D9032C34BE24C468B20
-CDBEAF15A1027E4768EC6D30A39F68868911CEF80C074328B8210FCC725F835D
-32B560BC1BD4BAE1BFCFC9CC645F24CD71CDB55D8F1FEB1CC3B579C2A6B2A50B
-0C79A09838569602937841E0D6CCBED038A7635CCFE7DA841CDDA91C0C14BF3A
-30F979E31B5060A102C24AB5CB6656DBEA74C04ECA37B8C9404426C60E0CF670
-B14150C7F519967FFF101AAE9B1912D0965119A31A57DDC772759F107B915F74
-956D7C9B33DFC59221EC7CA179952D0F05D0A21BFEA10AD65DFE985951304701
-1B0DA869C6444DC6746EBED908FE37E046A9C3A05263F0ADB027A201E3FDFCE0
-002339107609E666B29BAD895D1EC51C8CEAAF77C9B7900D4E48A8E0FDD7EFA6
-85890A414BF53D0811BD4424F73EFC028E1E24F827EE690A2C455BA56826BDD1
-76AE96CECB5CE924AAA05223080EA723FA1AFACAF18C879B1675E1334D14DFE0
-BB8F4390F3736EA40A1385E830E015E09034E3EC1EDDEB2ABB6B6923540555F7
-50D0AE29B82828DB755C16D3E28B9B4C003476EF672D9FEDB65C59FAD148693B
-2F9A6AE55865581D54A0EADF9DEF317DB623AA0178C423C72A5FA7CF6583B565
-D68F4AECD003B6777AFB5E54B7724838FA27BBCAECC7FEFA482CE122D67C1F5A
-7A89524A95B431C56180E67A728EB87E3831EE81AB8ADC8D5CD1BA34CCD3F7C6
-B57130F173E1E74167505C95E062AF8D17DA1AE20F5487D37ECB72D48EA157BE
-8853F32050DAE379469C56F529867CB1DB8102485946F4642D12EA28AFB23338
-309516C967102F60499CCFA5BA738861ADF3881E4C77381AE42DA48CDB8B93D6
-8C944D9C00CD08FAF9F3EA6EAFC4BB81A046D60B9615E9E32CC1DAD8BE65CCA2
-4D9E275EBA74300318C0808FEB2F97EB11179CEDA173FD5DCD01C7A9B55F01A0
-72CFD68091BF0936F2CB6B4762B4129DB790A130341B1281239317BC4413C5E3
-33BDC68F9FC125793F1E71E49A160E70A0CFB2935384036D489ACB19385070F6
-77F1FCD18ADE1BA6128B6472D9BBC41916B50D349294BD9A8E55C53C32146906
-C33F4E0DB30DC2B1DCD95C14FF736DEC32100887BC3AD61F47D518B984DBF15F
-9DCFD8D52DFE416E9330E8A7CB387993E92C40CF345CE5B4AA6237E5C165E444
-87B999C9C9BADE827E99338A935960B43E5D489216AC3A1B12553983E7387DA6
-0B30128CDB47234410C2CD262F4F513406129DDD4A5683D9A90213B15D82CC9A
-CB95BF820B80792BE989F8CAA2C6A2BD03A17BD5BDD2CE037430D3C9D50B04D2
-57C04A27111800E45EB0A23BC142F8E94FC5EA851476BE4B6F28040CBE35CB92
-D58E7F283EA78F7803C9B531A641F969CBC91F76F9971D839486841F7C73CFC7
-12014116686BFC632620EA3758BE9A1BADF107C3CF1D56BFBDF38A243BDF7348
-1EAB5035A7D20A19A9244D922A16A66B9A015AE480DFF90EC74E1ACD6579A7DA
-C0B60F1ABEEE7340156B4DE7DF797A6EC6931AF2FABCC7CBE12408C17EC209E3
-FA0AF21963EDE23E789F16FE7D5E504A082E0B1ABD3F32802541CA86D3DCFFAB
-FB6BCD78D318EE56D9BA4D9C79727ED3CEFD9C95FB08BD05CD91E460F249B955
-AC1EE6D90C09D2C58621940E58E8BC2C7CCCBF44D8677D17D00AD53978C46064
-7F3A231901E4C0520D07A04D308BACB848FEA20D5D3AE8D2BBD6AA1637E0510B
-42CFB4D7DC696414DFDB26622E3F9A763EB25B77136BB41ABAD6201D4A26597A
-D5A21CB25E54EE60B6FD238905A26192BE539C1C06301AC836402BA71952528D
-29E35B987EC4107D74F018410E5224C666847C416735AA1894A23651DEA153FA
-9AFB47EBB67B66181EDD00FC8D0ADFB9405159BA37AEBD20AC6DE2361C787BC8
-60E969638371CB4003657300F22EB205695F5780A9EF6946C41ABBB314860407
-5E8FA325CF7A73966ACC1A9FD07183067705EF961E44784033A2B5E439679D03
-649D027F64149B1C223846C72D485BCEC6C627A24E5606919500289EDD483582
-86B9F89FFBFA9949AD5119486222D9B90A836E9F3A30DF87C8B6605FDA841D75
-3CADEDA0CD4F5E462A769D807CD93E817597583C273469E451DC0A0EEE2D44DC
-390C8569903E0E1A8F3E4BADDF2810625A94C64B478F3B23329DA39C7D667A86
-A8C7980840A5BCCB26E9E00A03AF919AE303DB02E9CD24843A5C31D5C581F344
-CC05E9B78C99DF60271303F5636583D4AA19261A27324AC35FC60609C95D8A89
-1E1BD2D5D3BF85E9995ED8F5016E3ACD768C628F6EA4D629C225DB7665CA678B
-CEE9262A08F77313EC07D428CCC490FC953ACBEA8B82662843EF29194BECA18A
-9B9F7DA6EE5E69E1F6063891B6640E66A45DBC1BEE2ACE06966231460AFACBF6
-5F8CC0E6DC0E990ADFFD6958E9CDC3E2406ABF261D1E566D66C53FEBE676A6E6
-7CC2B0490A452F36FDDBDF720A73B499B2A24559447E6B64D3D1B9DD757EB587
-DCA3B09BBDD6270F3341F3C050D58A19DFE8DE6C967DD21191AF8D007546CB2A
-29B6A9286C4E247DC8499D53F166F96E7B48F6CA9A1615156BF26569F38162C8
-379229886C9A14B7CC27079581E9E1AD044B911A204B5B5099A0A6CD4B93B5D4
-9E19292024C8B177377C650F14D7156E7F80CB1543B7D1AEC4BC22FD0CACDE1B
-873D788E7679BA8CD24809A0E54734FB1DB1CAB70F0E305DA6FCE5158478FE21
-33D27702357D89436ECC6261F07609B047450F38F1FB447F44AC661B88D599C1
-46625D0796CB6907DE4EF2E96FE6619DDDE75FA874FB4C1885F533C7C3441FAB
-FEEF1179C13A7C15C3742B832629F1C934D9870FCC0FC49877DEE9E31BDAE0A2
-B7D7A893BEFB1D1E8D661AA06A615166EE1A809739526EAF5748B402787680F5
-15B0E2C09D10BB1CDBC540B321DB8EF320F8762787A3550C6F0EE4A1F4C448B8
-989C8ED0646C084F39F72A0DA2F033A27A309F002779633D69E4900E716DEEE9
-4957732BA6B0DB00F3AB9EC6838E8D95C2CCB4F3C2DE12683AD34FF8D98CE70D
-C2CD04BC2308FFE468EBF3E28C0451D2126E12FF74807E4EA74B6D318D358392
-50A057D3518C663E5C22D431097FFA3CE2D3BE94315C3C263E3192E2A0AE7468
-E8734C3907565B917A802637B8E17C0C3099E09CE5FE1F4C49E8F986EDC3F62B
-925AF8AAE0DEE73B4554E19407D4A8AE540954CADC8E8E04C0DB4F4CBDD597DE
-A042F8C1FD867A5981117894CB11DCAC13CB5B1609277AB8F52D5F14B0EF5CBA
-6FFEB15BB5EE985C5BB5B6FAD69DB3DA85EA0F607ED70A07F4186A976157CFD5
-1FD77590B37B053366B2D59076E7C4BB5B17E37C0905B5A4178801DA04393335
-C2F5EC5170D36510D8EC5A3F74241D943D32D5936312F4E1929201CCD8AFF4A4
-8ACA3EEAEA2F80811E1AB97C722F5683CBD3BDDAABE2BFD365ADD468CCF773F3
-0D4CD51FBF78276CCB2261335439820D3335E049625BD62D64C10FA5482CA484
-91353DFF4D23AD3A1BB45F544DEDD955B76BE2179A3C115BA21486FEF6B9FE06
-C09DD1FE4CAFCA1638BC6C9C063D6CEB9ECF127EA34B258D56D9F466F3DE8E98
-44588EE4E2BE29AB2BA7CDBD0833E48070E2CA66569D1A31D74B3BB93C88B192
-9F41690EE73BADAAC366A5583EDC00C3A09A3B36206485D0EB6F952BC475A992
-7A08E52A909D47F93064AEF90826DF8DBEB1B8295843C34526CF1A753D2969F9
-41D4BBFEAD6445152C7566597E27074A6D65751802C955762833EFCBB59CC9AD
-143BE9E315FF6962B510AD73E357C23B1E95E95D0E66F1870342066E083EC5EC
-106599332D0B1C04080710368D15505BD555E08552C6BCBE59F8E7F52099DD8E
-1262CD45DF1424FD99F35CEB8888EE76950AB97C325D1FC8FDA6B59C1DA5E642
-BECDF0BBC1D8FDAB995F0B42AC4B210841683DCBE8B0E57D9836EA9C5076D4E1
-FB7D278C068BBECD60136C1FEC4694E4C7258C4B907CD50D03481AB429B0DFA8
-5CEE01A1A789EAE744D80392D32F2D0D4D985DD521EE87FBEF8880B755BD8C88
-125FD6AB5BDE712D6EBE6C87E3CF95763C7F97C390E28B46DCE4BCD942C38A0F
-B259F6EF84B53657102B0F531757AE6F3D5ABC4AF25682F4AA841599623AB99F
-13613C3A8AD151528B371AC9AB71D884EF7605F242B0733BD8D053338AFEECDB
-C04F5CE3F9B87882C241BD22612D8BC8CADD3A0C5DE9F951B4A9BD4C31C96EEC
-7CD77871CB7FA20002606DAEB05C950B80428F48527800E26E462003975BE918
-6686583FA859951BD6B66661A0285D78F322604D2CF6CF12A3F92FE9B9121F05
-FA07B5FE84861D713956C1A4DF6A7899918FA425B97261BE40FAE4AF0F524D0B
-1D3C7708CAC08B05D68296333F7CECEAD9DE485E3F290E8C8011B7A0AF2ABAD4
-C8C91729CF4CD7176F99ADEDE5B888EF92FE06D05E597738BDBD4579103CF437
-75A0F31B10B54642583CCA5C7C2030E21068A52CC5419406BCE7334F4861970B
-1974F921D71FB38A0DDD0276EC5C2EA35C500C0806D9E06316B43F1B00B954BD
-ED1DEB6F6840D36EF1E6F0DA25C565D06862BED9473D6F1F41F7B8B5B91E7398
-EECC397C96AD82ECC8411C61E0AC028E557B5AC3155EA12547C4E7BF9583F0C4
-AAD5FDA2DF0A8590B0A142287F7CD739734FA5CC5C9F4F3BE2007B055BDFED37
-D5A1414599E5BD8308B7C0CC59F59A2E5296EC476E578983C818F1307BE7EF50
-5BF52A9F05BEAED92F19301C5D754B4DC22607DF4F17C843EB25A57963128882
-1636862F5791840C87DB94004094D7472E1742AC5A8223803BD20BC0FF3B4803
-C64DFEE01FD9603B9ACAC6BCA107E276D5AA4F120C007B0720493A37EFBE8110
-0873203D4CC3F03BB8986608787346ABAFA70C97ED093AD9F8DE3898454D286B
-FC6BDFBDDF3A907B1B9756431A73857B9C4605735776E00B63168AA6A7DB76F3
-3F57D42D4A742641C43C16DC4E9F9361100855DC833F154EABD36432338160B6
-7DCF1DF9CC167BE044C95A0C78ED4122DE12E8651941A9A00E9C110C7C8DF6C4
-3FEC21390330A78136783A85A410289C94B6EC85B28DD48F2D7299F10380CA40
-0689234695AF310ABCA57D37421A09245CCF60213C250BDD57D3FFC4B9DADA63
-4AE1788F0C90490780650C1BBA52139B4DD961A3650F6144C89E82012484AF76
-49C3371F84EFA5EFDAC65F27E899655F78E40DFD797CFBDF2888C10F720B55E0
-36B8670C5D0F2F1F7309F109583C440338082265523750F1872CB7C97E93E319
-D9D2CD62FD24A67DBBA77B305EE62FCFC13A60831F86F066AE738EDE223AD809
-74A5E78B2973B979B27652B12B2F65A8BE423E5F09E511623472496F1F886A93
-593CD8037AEA269C1D652B8261BE9F2C7DF6E2D923F7BAEB1089BCDA3F9F6C21
-EB0A8DD0F0CF8F28F5B2498018D995B14AA7DCC6A8C5F620F387009B7F4C9533
-C42D6C3EB234EA2AC527C551D098B55FE095645BD6EA74873635FECE40689D95
-B644F180B4515FBDAAAFFC469EDEB3D2257D3DF9F0CD87341F7D9894B709AB5D
-2D2FDA926F4E66019A5B2C66A22CF7875DE999248E1C5FF77207B1F4989A1155
-BC301C4B0C7DACBD9B1A233295DBD7ED1E750366EAD9C138FCA8F38B12E067B0
-24FA74A712404A8EEC4B37BF2CA76783D8B7D4D1EE29CD494FCA463F2D95CEC4
-C602D52B102556E20DE647CB9EDB1A4C0D0D61CD40FF4EFF35C7F7D7E39D7A65
-B932358B6A749D90089F0BD9B0754C0034E1D599A0F627B6B1BAABA838567120
-D4EC81A2C61A44CAEE0721DC58FB6CB4A294B2C27FB1848499073A4282F8914D
-29B158333483A2C30F1EB0CC5C35C9B44FE629F6A5A4B4227010E3065A39431E
-4387E8FA2BB656DD3CAFCE39CD2EC1B8C694FF8A9D0A83412B59E064CE126325
-7D47C1E6D0A14C2E00FF23CC3B46491290CEB5CB0D77C076B682822AEEF33AC3
-72E5C3C7F130D4ECA6573DCFAE80E2AFBFCD8F75B97767336622B7186D1E4D2D
-DBA4D4E7848A2528CA0B2932CCFF7C44CC84391A790844B68B7B6AC4E5247E11
-12E8B511AA79B10523C08F87C4FFD13DF16A32C14C14DDC3DFD5C7707AF0ADFD
-206C5F08B6FDFBE6A25BDAEFDAC6C62D46FAD67CEBB962253F422E03E350FB2E
-5D85310C754A56CCC4D415FA3EE330F65778D9FF6EDF4561971AB36976A7AA13
-65873392DB9FEA65D6CBD192D77CB3D712BA57CFEDE28FDE700E023D722C2107
-FAD33C3EC6DB0A1B8ACD2F5BDEC6664AE084E37C08DB2A394D6A03A4B5AAB584
-C56986A6A70CED92535BB8CDEB6E061803769D9AF11CC4F4B6681F7C309ABE6C
-A45067EF13BD9BB6128B82B884A82A93805C7F9979E5EC4259829EB3A609578C
-8B746C21E78AFFC105BCEFA657BA7E6A5232F6442C8F797CC460EBE086E4B5BE
-CD71C218A4B381E95FA0193E29D9925E4892369B4F872D4D05041E04A94884AC
-DDEF4B84BBF7CAB2E86CD9794931FF10CDFD59E4532F064BA6A043B7C878A1A9
-5E549CEFE02905047F5FCD191CB9421DE1DD7BC56EBD37D25CAD0B443663813C
-AACA226CC461223ED82E6BC4ED9C9E463508CFAAD72D7B294F6A1C3F2DC462DB
-D1D7A36FDD4F7F33C5CE8C9401117E58C88A1504E23A59E8B9028E6A17BE97B3
-A24057954B34E02B2013BCAA8E53A2A3BD80AF59375E58574796C76EB4F80A75
-65D18766C38957BAE977FCAB12B0905A798BDC7DF764A74A832F01A7EA583D2C
-80F177A56353EB1436DE7BAB8FB36A72D0C99DE947F801522895B37169329106
-9231484FBF6DE63F4B2E97EDE44B80308CB50770D49F00E61E0B7544CF8B1069
-7014F9E674B59D24685755BF266F6F9A77ED1035A8101CB2B78BEB3008E75CA5
-5FD5304ECF13459607A337F5784ED89063F6844277DDA39787738D355C680929
-DDFC4CC7BF266D18523F2A710260820E8EE84E3B4EC13886E43A399B06B5A6FB
-1CBE44275EC77FAD42B0D5F7F44FB119F848EFF4F93B7B4381EB3A6C70213BE8
-E90B52EE30700BD51306F314589A1154878DDC33967229B0A367AE70418739D2
-56B24EBBC2D687681684FD867163128BE945622F74AE2F6C57A63484CB126820
-17F30AD1C5329523D679696C4A7B8CEF97FDC8BA5C0C31B7F19EC8C39A61E5D0
-60A11A4CB9D899B363AD88F9297900E6BF51B5315CB42DDD6CEC555AC54E0320
-B97E989638A37897AA76614326D90977B6D5EF13DD830F004093E5A685C8CB50
-D976EF544D8C0471D3E037E19E42CA87028BC27D1477406ADBC4CE196A1EEE89
-BE9A06ACD6C17922A61705CA894C0D7F1783EAAB8031CB1C18DC3CB81186A1F9
-867B07FC73AEF3526C0ABC2F77FB35A52F82168B7A5C0455DEEA2522A5B74487
-82FDB49035062FA89995B9123F6EC3F84592158DC2D4B6D3E61EA90BE082E44D
-275A6C4512FD61A3012861111496E6DBCB2CDE57F5963AF6FB129A3DDFBDA2ED
-0EF9B3208FDFA7EC3B1F02381002D82BA5229E9F8D23D7802E8FE955E0DFBF6E
-624C20E9707AD4C924E080F65243C1B0D53492B1D4E874BCF92862F85A47A010
-C32FC9FF385860AE6C95481FD8B83B37A86435AEFC6230706452993982ADEF24
-8236F5D4105A4F5C20C8796778B8C3ACD4D0691B984459608915C7587D382C20
-69A1DA37B0E75C90DC7060A5971B9551A593932FC8A137CA32952BD67B6EF041
-53E8AB1D2DF33C50D1F8B46D057333F58009BA460057573463E0895AFAA843FD
-99F54D106E0BD9C7A87F8930DA17C78FA0A7057314E1E450CEBA5E65CF2596D4
-13684ECCB6BB7BA6C778127C4D69CA2E5F39FFD757BBDABDE26CD4059A85BED7
-C0FBB4C9428796356EA5F3094E76472A79E9E395F5CAB8B49F991F4D20CFE349
-D07B6412320C52F18EB4E87659D7E48AFF69D7A415F38BCD5BE489256C1144BD
-281F85F7A037E4E7C8D141FE449D16F8D36D9039B298BB1F61BFCCF6737178B9
-ADF9A3A184489C6D5EA2B6C81CCBC3D89072F5093025BA69B6A29F2976898824
-406D932F7F3A6EAC0A65A7F016FFB80D0738FBC2D503E2531433E4F074D29DF8
-507C48857E39E25A1EEB835D5300ECFECDFF08215141C7B6100DFA0BB932334A
-A4250162E36AC575FAECB1174F20F11EC6FAFA4CD886C023BB60DFA8595BDDFE
-BCE6792B85B17D046054A266412F96583F76A66DD1D25599F31FBF598E8E9641
-7415366257EDACEC2D4672F9165BBE172F11BA76E5783CAB60F86655F87BFFEB
-08E31DF6CC6863D05AD0ACCE9AD421437D17090354412872287B6D9575F45562
-C35597EA596E716B67971F5667713D8F2A971285C4D1B67EA77811AE7799CB13
-E357B1A03D5B71F3A7B836F74E65DC19DC8822277DE8B0073EEC17ABBA940B34
-F664745A79EF90AD4FB007C3F7558B84C98EAD1C20064082A2714539CC7F0155
-87508D192DB05FCECA78630C4133CD827932A84D21CC953B999C8C851A224B83
-F3EC014FA0D80C0BED17A359872160683A658B65309BB92A871B736E1B5E77A5
-8C43A658A9373F92459653C47707297BF2B08A8087B0D0E9BDAD307F118782D7
-D7003D9A160051C772E5291F33508921E1E16E48C03FDAB0F1C33BD9401CDF51
-9C7771022D3B69FE47296770914BE6ABCD4595116E2CDDA1139E6C0236C217A8
-DDAC4962DE70098E71FE6811A2E5441A54C5C91C2673482AFDDA9F1D25D39BA4
-667AC88E269E0A5973EAD0F112FB692A8DE56CD0840F2D3ADA9E35C8DC532669
-AC8EFC8A473C52E68A47C2EB6D1D60FBD80039C1722CD8D33121C295EC3B0949
-9DC8E10A76323B17EF0989B8C811A46099B179716BE70163106B15C58FEE49A6
-2BC6787698965C531312264F7AC5013A7F48C25D3B484D88213E093F81666D22
-D11A0FB4FAAF8D579125D58063D11ADE621799BB9CDF9394828BBA7C73BCF863
-B8B83B42C94AF06F076B73212756A3B6FACFF9F4AEEF704A5E8F6E66204C3EAE
-3042E58635DB16E2B20D6FBFFF4FE81D34DD3E3CA24D9870E81519AE8701328F
-B7AE637F2E009C8CAFC9C8CC9FD212A8D04236540FFFCE06A53F5E0DAD66692D
-CF04864C36BB8B932D869AB4675FB0576610A39E426E16FDF718940E11FBA5CB
-5D80356B2E191F3A6EC7062A60A91ABA2BF455C38A88681213E358016AECDF6B
-F29412284CDD0EECC405ADD56FDD02D4C98324D60EA23BC8FC61849D2C8CDB45
-EE7996210A041FE7DD55EC3CB98A89BABBCB11EF1DFB332DD2A053E2F4DBDB18
-D147A80A364AA417B4EDEE6F799D012BB094FDCD5E2FDFB3CAC7D592C7B04C92
-29B6C5E2DE5B1C88FADFFC69B356394978FA36BB8DD4B8AFCD61EEC7818029E2
-86B5135FDAD4C4024472565F1154BC76FE9450FE41BBD47CBDE835D888AF9CA8
-2AEAF152D0EC8F366DBE7283298711F4E19A262AA773A4B5E2F83E514AFAC904
-ED893CE36C8CF3A4032D79B3DD677E49E40A40ED8B818D1C49A49E9135FD3A95
-CB47CA7EDEA07E1A5583B92D7DCBBA85AA62C70C7C79706F69C374EC8C9C8DF6
-85FFAC786ABEAB4C650755BF6B5D8B0D7C73E8FE45DBAA508665EDAF8FC4C49C
-3A053156D255A9857272D167DE1999D51869F4329F336546D8CAA564C40E11F0
-9BFB24D7A92E602B520D2FAF80AE1F2306A6E4FF24EBEB2BE5F43AE99546F739
-2C1EB46C7E678416F973FD64C8F9A8FBAC24DDAC97FC3BAE905285ADA80EE265
-EDF710944473FFE82E0326579BAAE82A11EC1796F66BFBFD9D42B1F1844F146F
-468436F1E3B101350A15961BE3ED3B060EA6EEA54B4640F9135DA9678B776415
-0EE9B4E2023FD929505AC4ABC41870A287913B41A29D4482439081B22E4C9EF0
-606DB52CB4E42B258E26E398918AFF672DDB8137A3D9E56AAAAFF283CD204F60
-1A7020497BF3AAAFD5D19BC5027129759552BCEB666025A958E3C89D87F2628B
-B1CA120F99A5011E364F45524A30398A89324531FF1974064D8E442FB7F217BF
-0DB02F38BDE00115A217DE0B6450DD5B06C1B4335B55DA1B1738927CD6C0FF64
-82CA6B57AC50923C38343853D1FB4F04B8A5A08ADE3960339D85271E59CD2AFB
-2EB22CF048AAD9F50E5D79C8F640FCA9357AC2201E2F111B19E9E6D97837356B
-4BD21586B4FE993EAE89C196D08C445A0936D9AA5ABE103030F5054173E33ADD
-A3EBFA2DADC766577FC0EE7AAE0BE5FCCE4E28732905A49107201BF8DF75C2C4
-8EC78180A36420836D6909671E85B0FAAF3771EC118B6420116DC43983CF83C0
-98513F8F231E9C94DDA2BE07461E9738659913D3C7157269FD28A8B32CF11E0E
-9548AA110FCC71B3F98284962854310454D28D8E38B37AE93433824FF61AA808
-5628F23DE58D64EC1A52AF495DB65FE16087D1F3FA0A36319B517B51679755EC
-9E19706ABE12B8E0641336FB8F05FCE1E6672820E3E9C5EC624186805E4399C1
-F55F16230018FEFF64C51D5B89E6AD23D260551504393A9DE155AD8B545B4D09
-EA2EA8275E104F7BCFFBDFA9F8D4526F1DB9ED1687D1B74370F747B0B0E4B720
-CACD3A22A78819EC6CBA08AD1E7A729E5E42ED9B8D5166ADA2A94EEDE2627751
-336CF3F9033FF20CD52BE3F56EEC67E5B732998F4B1F136736987F4A2605A64B
-1E95A07F5CB058FDFBAC5758E9F0252A31F72ECC06DF1053E090762D17AE84F0
-0424DD6FED7193F99520FAE01556CA67914867016AA86C1C72F87F5D843DDE28
-FDC16CDDD89050A337E455DCBFAF605FBDA91BBE7E3BF1E88005CE32291C52C7
-DC2B3640454D0C36C05648DBEDB2EEBB00F585D371E7B2A9F3B1B153E5635002
-25F859F46BA3CDEFE809C80B1DBC37438479DED51ED2647F405CFBAC7A429360
-4AD394586ABB312F3751FB1328B15C7B15FFD6B7E92B3C8D61C99C8054A33C94
-F6A9412EDFD6894C45AC431D1B29E2AE959D6B610A91725265C4EA7A865A64BC
-CC1BD93DF0828E529C0CD5744644F08FC05B88A5D0AF329972E3B2CC2768CA75
-05DCFB2F758327BD961D7DB6C8401F3337D0A72CA5CDC00CAFF86A5A40BBDC38
-904BBF359700AE4DAFD9AF7B8731095AFF6F0572E857E9E8AC1C2DD5D74F5FF2
-DF3C0B3EABAE300C043FBD2E64AF0CF21ECB09A78FB62778C86E8E5A356B6007
-12ED08D19AFE705CE8E73A58136657E7357E074BC661681B4CF919B0B01B7D87
-9FEB2F4955DC17B86633EE72F9BC1277EF7D688E7FF5DA5B8E5646FB7A5B0457
-F37037F76100FAF3DBF4504F203F569550161D1B578E0E03EA93857ACF26C58A
-B75CAF8E1BF6BE7DE26C974E540FA8049EBA2D17B4C7506EFD6E99B776A78613
-3A953BCA37768BB990D56A650C70D0805D21856301BA9ED1CE9CA46DFDA188C4
-F5C73416AD75903FBCD6D9661C4599BC07E28C6664C72606BECB75783FEDCE87
-29EE7DDA74C74E62BD1F1699531892540E34B795189BF088923E21E65976588B
-A3E06B30DC4C62A4E10064F6D638CCEC9189A7BB33E8B599CC2AB618476D45AB
-55CA9D497C2642B6F3326FC846AD02EB109AF7D9866B5988ADABEE994672085B
-52C906A7F28343FE913EA90B9ADCA82FF8EE7A1B2F3E43687F4B420B5D551846
-3CDC11E099D8B0ECCB24B40C74DD93C5E40E9F3BB4814840A14A291191E95446
-2CF04B18F0E7DBA93BF4AD458F584FB02AFEF085AFC248263B12D76133776A77
-1343CD1E0BE802CF9D9A6FCD7F70277B10FF89AD4A78405C4D3C7C6767ED85F1
-20859187EDC5F026CFE93BF7DF4DC0B32D1F4660B5995A2A79A8FEFF93389CCB
-93D00A3CEECD3B631015A56D9E6C5E30D36DD98E6CD2A3F6148940AA180D7E02
-4442FCA1EC0950FC292E35D3A1CB8AB4AA1EF85B6197BA950AF5D1CB94712C7A
-57500E5E8B1B0A05D865672B098BEE02BE07A01B0A9CA67BF7766EE0EA5941D6
-823ABCC777162C9E35C8451EDA76E0F06E758EDCD0B65BA8AAB143C339D9E843
-24E12148C2CD94E6025FAB0093011ADBF3199D7EF02FD52A7DFDC782E9BB9DDD
-D76955BF841D7A75D806533DEDAC7A906D6CCDF5990FA64F38CC5C22A5270396
-0A8C7963FF5830231D6BC7D0A18A9939B159B50E026AD34D7A8BECB7EDDBC6EB
-00546AE102AA3D88CB76D9B816E069F1821BB2804654802E8EDD9A9ED2458D99
-C5C2D04D87174093282AC0879457510CC1A8EC14B3CE72B4207D7D35F0F74B8B
-0F121DE6EE1A189BF7E076302AFA5C0A09BB8095D32F469E08575E6AAC4AB9A6
-BF82FFA86CC60A3A34D1EA753DDE232119D9A4891B77B9527FE9D9DAE34D6944
-CB9EAE528886AE53C91EA315E708213196A01CDD9A181EDBA37AE4C63A23FC75
-77C3AAB05987D3BC0A654BD9CFD5E6F48D8F4AEDC967A8C51DEE87DE9629BDDD
-680515991E6D71FD417CB784E3EDE648DF8912EF71BF93E20FAE714E422792D7
-2B5F02A314191CB65DDB648898594B44A33F1252676DFDE978BD0188390120D0
-C0E5550B77CD3A08CABCF2FF5B62C59B2B6F95B8A2D8F3DE2BEF93E9CBC20CBE
-64C51CE0E03300459F11451F42C33DCC1D361206A1FBFC4FE27A48F667892C7C
-0817245326322B600B6C323587E7A07A6132BEF029835FE7CE5DDD5DA26FC5C6
-786FED8425EA1D113230D161A78BE519538614F61ED1E92DBA5A0D8B5B5BBC4A
-D875B43B1986449AB67508BDB269D2549D2F794881556DD132E18B657D33C2B9
-83DF615A05ACFB843453E291CAAD9E2CCFC7490F9F6E57C934C5A92037E866E8
-3B2785EE6F10F6D4DFBC8BE8DC383ED4750E67ABA0A74669E2C53FEF09B69CD0
-9D14DCD5A8050AE52F0BEA66BF37B315DC6461CD782957A3A14088A7E4016815
-AC603ABBBB4E179862A20129AE3E4BA0ED6CE562F7BE1C8498A17CBD58E954F3
-AE82734476C567DA005C28510423C7914655D53B0CB094586A0509C190F64770
-C55D2EB3329FFB1D67E35D50533629DBD88986444EA470207BC789EEC011E302
-4B5CD55C640C3D1174E1EEC5F5A1E68FE677BE2D0D8694394C0563734E6F08F4
-FC35024975ABFC560C487AF7AC9961D912E620305A58907A0F7A9CEDCFC7453A
-290C28E1AF0441419571546FCB5442A20674459E9E4E56D02D6D636DEB263A85
-38C63FF6F4F07EBAE0E3E204E94C4A56AA818FDFB54BBA54DA4C25A55C2025C6
-CB6483BC3B55AF578CB4BDC8DB58FF5463D1FCCC63400481A4C3CF4AF3D2C61C
-A7ED38B6333A755EA1190CF54F7881D3F9AFF6408FE2DB0FB36321DD833CA4C6
-25816321DD6E830343CC5325331E765DEA567A8A1ECB8A7E54AE74C7DA049606
-EA4BE6A9E13BB0084093BA80DC98BD5E214F34ADC9452D4A9512E550FD4E97D2
-A64FFFC366896E8325A6A816D04BCD8BBA114F6469D3BEA397E35C7F91AC75B2
-2DDC5B9BD0BFD8C259E0467F5E874BFC42EC6ED7FDF043469FB69C9BEA747915
-778A99648F8F00738962958D1D87424F2667E3788E945895CFCA9EDBE7274A4A
-BC44F16EE2A78599CD73B41E189025BA088573273DAA7D6A2AA19474AA29C1C6
-BD656548816750A76FCCD5634B7599362FDC9B4A252BD5667C4260F1116FA856
-AA4F363FC6032974DD19B5989D7D27BD59B8A0ED42FD9D1DD2858125583F28FE
-A266081D50EEEADF0DD5096885D7DC706DEA8460D04D3900E9E081F92A6A1F95
-3EED1486DFEB20B3DBDFF252D0B2DC7EBBBD755FA3929015205986AAD7404ED9
-67AF080AC63ADE35132A4AD0E9C63C600326048179B6AFD1907C0912113199B8
-427C6196084922B5A0F5E1FA25052DFA4902BB43D349527468A9A8F3732DDB4A
-AD1E9E3028B8ED4623D8D1320CF8A1E0B29C16DAB4A559EFEAB0D234A1A7D8BC
-71B25D5CDE127BCAB2AE7E71A328F2CE9D3EC9D23E370A5E95848A00F2D1AD8E
-ADCFEE7E929F666EF63CC9C90CA02C2ADDD3216C3BA79F469738D1B2B6349F72
-CEF3CAC9F4B4596771D6EC39E61B9817439F0380A57A97AA04091D75B7DA14AB
-0B864A58E00B4B28F054910709B93B37AFE76A7EA777BBEBD9A45889FB52C6FC
-FF985679C9607AE167EAD42791BD42DBCEB89D356416A38007220CEBF4A3203C
-70DE5BF488A91278272E337A47CF8A5F12F95641AEACA5AB485FC5A316BFBDD9
-3052340DD5739FF1C1F850DDEEED70968EDB150D50D7A1F1C894FCB95F9B4CE1
-79721CB1DDC387073BAB999EF40FAEAF721B6BFE427276E3AB02143D3CA60AC5
-055757203EA5071D7730811D723237ED10B83B457BE6CB673B5BA4BC097C6293
-EBE8393443B750766B87534949057B7FC8265048A748D61C4B80F9109CC7E1EC
-36217DCA2709BFDC1682F85E75E0FCF3235ECF266A78E859AC400D5D02ED385E
-7E30492DF22D7D5B3035D2162DFF1795E7E9096BF30957B3F75481F31FA87916
-D25DFE1711390CEE845A3B7842787985B516D60A7F3636AE0D036A911771BA34
-866336E447DD88B6892A00BA6C017156F7D4F4E613BF163EA2F325998F046CB7
-5EFD1077B1EF7D9A40705FE2AB8C9D3200EB1E5903C5BE740B88B3A46C6154E3
-F702924AEFE30BA19D64C20876D8CF14877BE2F1FBA6D2A52D35C395BA35016E
-8A9ABD8720C1A79360150242FB188AEEA1D02D7BD70D15CD0A4261B185ECC8F6
-DA0D3C23250D6B4C188D10D99F5B0B8EE0809BB20D0189D2E8B6FA6E0EF6E415
-890DC4E9F8252F6EE25830D5BF07365B58E0D682B4FB236DFBE36F32CC574B75
-9C997F3E74832510AC57C496D8F131F610A607246C31F548C859DC34CAEB66F8
-AD4A6355C7D04AE6876746489A94C750471DD1A33FDFDAB58BE702D1EA89471B
-1E73286289ADAD1935BEB2F17B2EE77AFD9FB1E278C99F85C6EFC112C997DFA5
-66FC3238FF89BB840CB6B9610C983C24424EA95A2229CCD0D0B62DEA1CE377EA
-B18709581246A060B6181D0A99144212DD9D4430E8B213FD5F37CF5EC4E11DB1
-E3E48223B990724D7C8561A9FA5CDEBBD4BD866647653F4DE6D794FDC4005D88
-C2773247A5D6397CE425E51B96C741FA01EFAB5DA86E5435365671E2BD29A628
-BAA80C56AF17B725BA84E5ACC005C658105162FFE81B5CACAEAE8F3A22209735
-E470CC97B04B0CA0A969E41E94EBADFE40684E0D018007D1267C2E27F4176BAA
-B484A032B0CFD0B3977322AA298EB5A11ADCB2F154294FDCBE9117DD3FA00587
-83430596B2D432A471615ECA7789A6B01BB496309C8424C818357844F34ACEA3
-1B71F88E89AAAE14BB7EF728D75425CEECB1408334D2836A9F62D1B34A1BC9FC
-25A43F2C69F01F3217BE0487563E11A9DEBF88C7655947F0BD725280348F9AF2
-864C611638D3B78B26785DCD3E05C47D297A4C6BAC0840C5E3C646521C7DE8AF
-CE9CC7AF715F62AA0537E7965EF4158276AA8C7A1EB9D7D61C423F39CBD918FE
-EDFE99AD29C73D106F7F1C3DCD4BDBD56F6E608846E32CF26DE47B08C53D3521
-9F8841AF5554757D0CCB44FA7ECD5BDD0C20263D097D9975E1C41DCEF4D8C9B1
-97EC5977EA0EFD9E405B429D451140105161EEA54D4632D6EC6220E28C7153C0
-307E1A3953DE1CEAE5D51CA6C58A15B69BC2528B1500BB281C7E90F40453A685
-A329867D17142A7D2FE906E15FFAEFE641EA5109E92FEE41FF134E8BFD57875D
-D4F8270C12808FCDCEA5812812501F64EC79342DC192B20FB93A1A6E0475DB34
-B7A662C95EBEDAF862726ACF65393A719980839A9C05C705F251E6B46E276CB0
-127CBB7EA4C251B0672C01FD185C7FD287791019D8FBCCB391E9B9F818BD32FC
-E61D57334FCB2266384D8FDDB094DB86E87EC7789A3287C1194827A38926AE50
-F6DAF70C2D3EB91238D87148642EB0693F7583F0D8D8E2B6FAB7DC139B06CB0D
-AEA8C08415C14B835BB928FB81B7DE129A08502D89207B8673BEDCF22024BD99
-5777574A3495BB18121903550084E8FDDE6F940511F23FB95104E76E3846515C
-F954431752CA60C08E345CE8E6199F1041855242A7315FF1ADECA2A23B7218BA
-F7D895AAA7D5C49AD7EF03CF8A2EFFCC1DADFBC101895D17B0C3E102C7DA16CE
-7BC977E49BC120C4673E14F55D00FB30DDFCBF592AFA42A887322F25C15A100F
-82F5D3336804E68FBD0A470FD66D0566F0FEADAE76BE6A436D715BE62A653700
-BE088E4E594D99611E0ABE626A9AFCE2E7066B65295DC87B6A508FA3EA6C0C43
-2580AD8D9266FD81E825C4B0F908DE635B650613435DC700B7920A3B08BCD409
-69D7E559B5AF1E98D02169D4F2BC0CC08CF94FDC62D1877C823D886569EB5DA5
-B93EC5F0283B8ADC719A4831C107394919DF585AB3BABDCD98A63B153DF2BC7F
-55EDD18E2195CCAC549C9B4CF3B91156ABBFB56970EB689EAB871D6FB5919B3F
-21418C07BBEC9FFB2E1C7268290776B993363429B20A5D4C7C66D1B3DE0256FF
-A3A1157C96BC1CEF6F6CD55207FE4DE2CB26E799C768E1DF47654968F6A708A9
-7F42E3A32DAB67EF6D16146793C36FE6876F1CAC18B409D5A5A6408F13CFB9A7
-141D3D25FC0027F6B7FF6D186587BB146DE91530B32B0F1677C48C28D54F3967
-C0E9C3619F09878D2C2A6112DF8FCA1133BFEA4AA87D358A35591BA6F402E7C7
-404A078F95D33AB26E0595B5BFC85D6D8BFDDE1297DCAADF67E1A30DE26D504A
-7FBBAD316A050CB9FC56A10F0A6721E61E87A462711604C33044D6197C0A52D7
-236C147B09DA467579C62A09BBB25DFD9DA11773EBB8032D1946A35928ACA3E4
-CC94CC723D4FC49976F39EE66225584DC3537EA4138AF062951CFCD0BB9D5D41
-F119E670ED47DCC59E67DF658942835353783F571801BF33922D8EB886AF461A
-EF66824F731E5E9A50B153195536AE96FF7F34F21598C83712DAA54B780FB815
-36880FBFD56675EFF13E12A8EDA31C76F6367B818089DCB9C25464C47EC3968B
-AA0939DFCCFDAA0D60672A349E2E4768B386160EB8B41FC8F959D45FA8831BBD
-4EA49CB9F152FC8D730216129FDA998DB38810CF886864927AE9F047855AE4CD
-DD6BC5C4733B48C6614E9E9F7EBE404BA26E352CBFE1A533E9E74C78EE17A9FB
-148B178F503B2154264C21A39B323D8B4FF8129A8E101949DE2C081E28D05DFD
-CA2E08F44BE9B5663F331D34D47C8876AD9540ED7DAFCFF0216D6A50F7D9C00F
-1591AD6FB27CEDEE703D6C3D9D024675A117EBDDC79DF5D4DFC7F201DADCA2A1
-72EB9A21EB33F5C8325CF8D8230DA66B6C7BC504386ADAC40C00E20BDE3B5F2F
-111AF81049379BBC4712A78B6B0A33BF40512A1C42E3095323D07B0B85927AC8
-29EEF89786724EC48D30B8F2F26831BC7238AE0786936CE46FE7B2426A09D370
-460B950E850FA2D6710C50E78497C27E5FE43B7A830E67C5F28219D8B0BC1158
-0A2B02EB3E7A96CC1B6FC8B3DA8708070CE1C26AF0B7D80D83021FC27F0322F5
-2C3B92C29F738CBEACB1065948289EB43E334B5BF6FD7CCE82FE9DED9E3551D8
-1C4F66C9F9C1A3BAC534D79CDED98FB5A28F5E7A4650B4F3DC52058B619FB0CA
-3DC70998B508CAC359C469E488B925685590AE5084C4EF8572EA48DFAACE35AE
-B9CEFC91F38A26A2105DF9C3B859674F6B20F9B3A9B7E2DD2FEB80A899FD2731
-54AA5EC8D6107A55C59A9C20F2990B9DB221908F629E0E45E371FAA3ADE91879
-84479D6F3E3F8F2E972606BCD37276E9425B893233852201D8ED2D753B33450B
-1CDD8AD735BEE3AC8C4E4DA651748B2333B972B6A9DC1A133E3D695D6C975067
-228ED6A4728729D0AB55040AE154F668A2DE8CE6CD5BFBB28A9DE3F90E358BF6
-1BE66D7BD0409D59A6E3430C2C32DAF12D55A8356E25B9B805A69B828B399F96
-824B96589D5CED4A9FAD83D70D12E2CF7C9B9CF34E3F55423F478A2B8FE24C6C
-FCFD80E8898C26FE65DF206C2BE1C6439BAFBF809046472A059F53CBA38090D8
-E03AE270F456B2F63987F18AED9823DBDD39F8A175770C6164D839BDCD7AA732
-E63379F4A5C45E217A5F37AF8DE3F5F463BB67F57192F71AFAB06CD96B2ADCC4
-D9FFAAA11B176A5CCCCD8FEE8453579EE23F97143E6B176418184C0F3C004908
-38D73E689018BC811251901EC141705FC39D61A3FEAD3D869A1CBFA833AE9FB5
-659AF715D30854D9312919DEDD227A4ADFDBBC76851DBD3427A28B9C957396BF
-6E530F570893A2056E53515D0B5A9FB44E16F26039161683C3F4D34A87E1A631
-7C262B4A9D1175C07239B87FF6756B5AEB02E315659D938B7E55CF59C35DC48E
-006F444D7D17178FB459506521227674339CC9D1CC80C3BC472B026DF0A45F61
-A8940F2D6E9379B95F28AC3BA13987E685E4C30BB8F6BA6562EFC9D1BFF66E1E
-AD72AFE048DA95093D064B0E692CADC6DA786221CD5655FF768B51FECA289395
-7062E952A0347FAAFD0C28F1ADBC0BB121F0AD038DA635D0AFFD2F1D65A769DB
-2F69BA310ABAF715AAF91EC3C5DCFADA1235716A9F53A510EA3A3A21D1034163
-48A7963C8B12C1DA71A02EB87C2863176EFCEAAEBB5289568D37689921FCE677
-7D874CCFF1A72391F25CD922DA5A7B35A0E40CE40AF2521B567596DF422DE776
-A9DDF64744F8164F24985B081F0E73F43E43217BF0DEF9CE522CE604AB739192
-BDB8FAD799C43F17AA436B7CC97268A73D583BC579B95E56B2FAEE303A565CAF
-5BE8FD7F04C03417A3121966B549FB7E7BE070C0B05A6961733D4F189B78FD41
-412EC99F5B7E841DBC5A7503E5FDFC10E85E2DCF4D4BFE9CE967C09139082FA6
-F40337731B9B6ABC831DEE16BB3DF818EC2B701210BFFC32CFA306AF069522E1
-C05F3A0A0F93E7251FD4D57FEF2211F79422C5172AECB8B51D1FB521924E43FF
-54BA9A4FE04BCECDACDF64D00D736272937F9257492E90A83E064051ABAE4FB1
-8FDB08EC54106FB4B3289FB095E83299B57CB6276B78F465800651B8F7C8479B
-1C97E0E31CA741CE73234440C0C62FC373006DA598E550AC386DC6E0932F46A3
-8A0588C3AD1B862FC14D9A8910574C17984B1127B6985C969729898A9197529C
-2897CF8A077FF821BCF055C2EFC1948AF0569AAB1ACD59F15D648671E726F3F4
-2312EBC0E6BCA0F7B977B04020976AE645A5738401DF2D81720C4BC90D1132FD
-7334F2C852838583465DB27C834F3F10B1237A7DAC5E0136BFC785759F29F5B7
-CB0DA5C01C2AFD7460F14E03A73C818B313824B23B1B5B7443E3581E3BC11200
-D55AE9E7900AC167A7D2F20935FD72F33B695F25B6F08DF95677
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l047016t.pfa b/lib/fonts/l047016t.pfa
deleted file mode 100644
index 48094088e5..0000000000
--- a/lib/fonts/l047016t.pfa
+++ /dev/null
@@ -1,1356 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono-Bold 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Bold) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch true def
-/UnderlinePosition -88 def
-/UnderlineThickness 83 def
-end readonly def
-/FontName /LuxiMono-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {0 -211 714 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078984 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83C82A2DC38F66F08FF34
-E7B34FBD496A97F0AE69763627499CD43525BDD2FA2EA9DDE51C821C26AC69EA
-AF027BC54141332FA165BFDE024DBE6CD20A8E4EF56F52F260AEC28695FE9141
-7E7F100CCF64993650A81C0856688B1D101418D3B0926F70BBDCCAF43FF4B16A
-B8328A5C459C7D6DD6FEEA1AD5049C4EF32D91C30962146E922D498E4D38D172
-CCFFA8F084C6BD440ED2C77C1B574CF8CE25AC39D2B18C91E596994081B36688
-EF1C949FBA04376ECBE32C3E29ACF83A8C36569C315CACB3DAAFC2FC8FF68839
-D9BF2A301E3E8F5B27EB82D8DF5D70444998F05B99D26AD632FC21A81D887E9C
-80BDDB95A1C0FB1F43386515E0F2903E3623B19F363F35885143893761E54BD7
-C9EDB5940386C62FA7A8919B57E4A4F0D9F3B4A4EA82C071BAB90B57C7A0F553
-BEC3A57EEB877476FACBBB61DB74A76D95DCE4D5C46F9686AA5176D6B65F0FFA
-37E1850A881EF057A62E3092D923107C691D32F3D619B05DB75B337EB54D5505
-2B7669A69A162DE45E9F900FB8BCC2BFB7AC5CCC64DF94DA97386D4E4AECAA28
-A9CFF3C9CE3031CC890E563F7A110D4690CDC5BBD49F7ED21C6E635952FE3ACB
-02373DD80C2C653E01525504AC37C849D6C5F25DF0C5C762C45A83233517EF9B
-D7F67A77881F6B46BE10E458FBDD73D225A6047095AB3B7AFE9FE2113751B732
-950B7865DE7DE98DDEC75D3D0311E902C2D7FD4A7F08F481ACB695078B930EC3
-6F3669F4E50345CE0A4CF1C739BD8A92BA29CF5FF0C3A85B687C0BC0BBBDB8D5
-DB96AF1962948038D1EC4ADD39D3DF966ABB57CA3017A28EB9B2148D1AB72F08
-899F5686A2013D69F6D3F5ACFB0503DCDF2D93CC7722D3F7D7486466F32741C0
-17F3D8F2D64063A9CBEBB462D4CF8569EFE4DEBE6DF3CD2F3C2AC955D8A20B1E
-A0199D05C93CE0F92ED01330A7C9E65E7ACE079CBF7616F24ED2AF540FA4A1FD
-5CCC7A1057ECFB91B02A84499F9209CE5989021F4D27B2B20D4793F6C81591CF
-ECBCC22005F89BCD1A089C36E659BF3BB92558ACE98DBDF10F0F6C7514356F54
-5A8BD7EA0E326494BDE14D91C6C74224FCBB42FC22FF8F819AC8CEFF7F28A56E
-A86FA3DADB388D04A015B0E703553CA2C2E5B688DD49DA92FD89107B744BDE7F
-85986FC9C688B97C67C0C4C555EC943D5C6CBB8BDA89ECEBA41037A92BDC075C
-3C2CC573B084B19EC7FF10FBE814B0226E216452BAF96DC3503218F49ED279D3
-CDC0369901B7764918E8071258114002152AD47B0ACA19066B5DDFC7AC37A6D9
-E49FC3A5C16F51A5B86663E15139A063C5D408C562951934700371469A49A940
-FA7074CAB31DF454BD990124F5E70B4B6D62DAFF949FD73DC758598B34376867
-3F7BCCB83086D6AED4460D71BFB2395A94A27CF34DACF70BEB4906BC6DC19203
-5512F6948158915E228603A5D4B906997D51EEA9BAD01BE45C36BC39D9C70778
-D6F8619B3814F7A3E9E0524C8DD61EC63E8B4E15C42FBBBDF8257442E5D2CEC0
-890F6B2476340387E8A4E21A09805F82A17392D2AB3CF3429DB5FFEFB093165C
-63525A9BE659AA22C7FA5DCB894DCA8D1560668636FAF723B4F618936EE634D5
-EF823BEEC25B274EB5E8912BF186A537D3EDDE38F09801E74D5885919850F48E
-A7A8AABBF6625CF2B0A9843E5D9A499C1047C490EDF9774F02A5CFE926BDBAE4
-18843FD4575E8634B27E536FAE9E09084D3F73FB29B9E4AC002E709986A90995
-B4EE10012F74A0BCFF2A6C0A69D945C19DF4F7070D60E3EF03508AF8793BD70D
-5D4BFC8BF5A29B4339C799EA8AA64ACA925A37EEE489C7FC8A31F5131F386A23
-C63F7D3C6BB60E204B169AA01EA12B590B9F0FAAD50D030381CD0C6177D28538
-377F92029F2A448F7586C7B14BA5BA08543D8216E6875AD18E974B39A53B5D3F
-157CACE3442B1948D2C44DCD88D1604D3AAF4487B4919349B7F0E01302261204
-50380294937386246EC4444C08955919A30118566A9B9D409F58255604A90782
-0583591C68296746D4DA1BFD0184029B73EC4C955C7F0BDCA08D8B85FBFA4CBA
-336BA29DF59226DB39C3B02AC5A906857EFB7A227A09FFE63BA35DE73434BDAB
-C11BE30C59E650592C518C0F533FA0CABAF3E2CAD23E69776879CC7A9225A086
-281FDF2C1F72FCA1723A5C2492BA061FB6D73F6240AE5708521AAB52F736863B
-B05E53ECB5C64A26B277F106FF2E0C9699719335BD32842806F0F866CE4818FA
-F61D141532738ADC2C8BCC1145BACFDF3BE1CFD92914C3945126847769D6DD0D
-6F44FC9D966F224AA72C22D0EF953B2A43C93E581DD907B611F3005D62C25162
-FD2149DEF7894A112449FF5F43D8F30CD7DA81D408E85F89DA78C4998BB8A24A
-38B9F346E5FBC6D09EDF332B8B7F8EAC363D0D01708C24655412AEB148E28D99
-D9F41076F0E7BBF10AB96BBD72FD05BA982F673D3D79270107C040707C6316E6
-11E4FB04A320621B6C3E10575FF97A28B60B30B840A877A5BEB0EFCCE0EF03BC
-F247ADE0F509EAFD6CD7F70B523E6E145EEF8AC9C17614BE65934DDC17545C4B
-50770418C185606C0A01B2622CADD9CBBB97E14A92D5230FB7ABE7D0D8CE9047
-F64225C6D488695FB9801EF4C76E20340721F7734AC114B3E6041D4C76C11F19
-3326FB3DE6CBF4B4C1F18B3388D6DDC000F04E195827F68CDCA2E0C411788B05
-4AAD40E3E09EDECA7817AE2B29316063C8579A90CF67D93AC158E940B14FCDBA
-3B82EBE2D4BBC8A8B22AB531DDDCEF6E4104314DDC2DF028E2F09436CFCFD32D
-0238D1C9C0404FD97DC627773CD8022632E4914D40283AAA5FFDF86914140D42
-0C4350BA37D3CD49E1D79081462E3701DC0A9E9AC67D712BF7CEC27C1200138C
-9729AAADB724BB9FFD5B831ABABEE5BE8C270A1ADF85A246ABB9612F181730A2
-30B9886D897C2EAD9AF7E6A47DA049373049E5E4C29F5B7DCF2258A1AF341CB8
-C5F464EA85663A9B8132775E4B8620420750161C419F88594908C64A2BE265B9
-84A950C8B63C065B1FD4F78121F582EC875F396E0EC8F6851AB87C36C56EBE7E
-036ABC0D89D9FE8E626646AC65DC5445EF3FB60CC5C50A5118F9F248FA15B3B8
-C8A88E168BCC5488D10CED157A8EEF8EEEADDA64372B76B944685B686DE8AFC0
-F4A376200790E0D0DB2172C80E6BF90052DE847633912F72840A5C745DA4E774
-014841DBB53EDB729DA7AAC1D3FA428DBFF252F91BDCFE3AC31C2CAEEAE29045
-DE7F0795D6D924180292E18B3955FA93DCC555683FCB5FDECA34EF0D0885ABA3
-C7BF9CC897C6E5737AF9448C952269D18AAA18FD1D3C2F5DB49D652F43E6CB21
-D22F7ACA596DE470A1264FA065C0B2CE3C58DDD168BD28D6A2FE2A41045F3219
-AE87AF49E363AEA5164C7107CDFEB8BACAF39C795D98F9855E35BEA4482F78B3
-8A62DEA5A26336671AE7D96AD413A2A5E98111D319AFF427420906C75D4E16E7
-AB85A37972380840CE59C78273A510C819EF376534266081CDCF3313C83D7089
-71BF31000698E853973A6D275A8F215677CE9EEC26B5FC21E481AB9C189C37FA
-2F7E2A63B4286E1AAB933C0CCE1AEA78E1F7B9F7A16DDCFCF350514F1E671D3F
-DDBB3CB3324AA85E9373060D2FEC1F218A06E4A1E6F5DA7E3B72511C5F0F348D
-A221902C405AD22CF96C4A14F09BE984C710AE0472E90ED804C33BC2797D5F30
-F31B250C791B0CDCFBA202DBEDEF03C144D31D7431B7667F88C1AFD9E218A08C
-46811F871812FA17AB468062FB0E478B8AB84B9C06208C8ACAC16E34B42E8B9F
-747F8BBDAAE6736A5A4BC9C494EE15356CF6F02FCD2F52D4A3F9CD5B472AA89D
-BF371F08DDF4FAD324B46BEA792CFD4E148E33CD0CD5C74A76CD5CB4EC885420
-AB9DF5D757C33BE1CE9AD32E6B0179C4C511CC984A5365E50E12CEBB8CC71CAB
-572054A7DAEB7EFF1025B60BBF1ACA5C3A701396DA00C6F77E7B86F1BD246393
-1030F1B6A8D13F6A0D3FC3825DDBD7CE36CE55612D3516EC214AADC5ADAC59AC
-054743534AC8068A67C09695C7D04341D22F5AAAC4086CF370583B93F417579D
-7392D7B57928230688C7C5B1931E26E843B8FC5D2D5D09A3005C1803BEACFD54
-F5A8BF2A6CF7852616F93E05913D188AC4E2F9AC3F2C1C455B0F0D1E32D9752E
-331E7ED9F777FDEEE5ECA4FA4A27354C1D5E7E388008D7C45456CB361F3E4D0C
-AB08D54AEC00286398730911A5F145D7DDA76D696F1DC17C0965A4B0899E8B4A
-7AD364ADCA31D1A0714ACCEBD2BB7FD77A4025EB94D4436925DC5E460EEB013B
-359983AEF8637A929A04D9D5A963AE764FF82C42C62FB220530FE59018A89D0F
-CC8C3E2E4B918FB14279F5D0ABEE4756C3E79C1CA70359FDA92487D42B7A2943
-3ADF2FDED43EEEF0108E7EC8778E14C4C0BD06B6687C08C1AEC415477176C892
-496E84FD5E9A7E4DB11287A9605F5F0CE1B71D3C198900C67B9B333D10F5F331
-CFC638F80E03CD59C5DC5862BF8A18B6ABA8435936A3E2406AE848EA94716472
-A726D75C94BBA07926745B20EFAC14EAC276B477B94FACFD9D664365B1CAAC7A
-DB2BA6B75F4F83339CD645428F0A5F498677108DC473CA984370A7D6A9E295AD
-AA68CE2D5B435915EB0F6B72A9F4D49E356050223F524A270A9DEDD0B8B66822
-C8E94A311C4A055EA18BF0292CD25EAE689C8F932226643B5085E72F5FE0A232
-6064C6850F189B2C46F9EB94966600A8B7205C654F33737ECAF9B4F3FB3CA0FA
-44A85FE7A9AAB211C6B4062052C4C01685F58F0D2786585CE0FFDD1B348F2FDC
-A19E31CEC44C59BFA74997E570EE0FD56629135F3BD7CB2B6466E2F031DA6E8F
-11813E7118A232D38AA3EDC86ACA1328FB9F870174F4D1BF511531FFF0E23278
-9D29E817441F255261318894BB2CEDD0E6F8B3339D888A2C401D7009E7879D5A
-7C6DF9C8D97C5221DC65181A96992EDF4C983DA8C0669F3D0BAA4DCA2FB17848
-F34F69182E6A129A983A1FC394EBFC31551185A750114B383E01E61CED8637FC
-B4765F1791D121B8B1D08035B6D8ECB2856FDB43B25101444D160E02588E80A6
-10D55BA3B76B5B9C6B97B4C07A0AEB124459603BFCF1C50DD19776543EE9891D
-9FAA53093A933077B5D3C0280679818348E77835C679C603F46714478BAFD156
-803B736D4CCB3F1C1FC2192B2EC1CF78C36FED5E0496B5A8F0CB1B72407BE183
-0BAB9171EF79069EC940B9B13F69F952EE781A811EA4A0A7FC8A5E5BE4FC60DF
-45874393CD027EB52EA2DC1EC163152F3B74B7E7D62E042093CF3119F4F50179
-302EEBB352C362A6C2DAE8A251156664B492FB60A1DBB7801DB26476BCE9E78C
-444040DBB110FDA2783A62FBAD6A95AB513B292920960E7F630CF7F5C2A5785D
-5BE65897155D32CC657E231FFEE30CCEBFC00C375E105A5B613FD2C27A6FF7D3
-92C00B7E0BDCC70A6E80F5BA164F116A2732526B669E50F5F6BA575E37FDC9C3
-38A49BA0522EA697F517D74D533BA28F928565985AF5E32B84BAF188F2B9B952
-0C291440B04DBA34354177783CDD82AFB65DE0E179E638FE1BD2EB3EB20D5344
-C4B6E5D639DFAA78A77433D36FED5462B6B090E3434034B8BF00BF7EF35407EA
-9F122694EBC6B6B4214EB779C94E6BBB04998AA57249B8D84353E0BDC605CA98
-492862A8239E8875A9BB5ADFEB966F0D7FCC355E3F0428E227D8B41945257F63
-9F6A6A69B7A902DDBE08D9FEC8233E11BCF15C1458C19F9E487314C26517D162
-9AFD021C75353FE5A161EF3EC7E06B616AF1447602483A3486788298AF766714
-939A160EAABF06B61D86CB02F6A958690D38C86BE7998B444B7A2B74C6BF72E1
-B9A59AB78D20C121D1AACD208531FBB2BE37BE529FBCE24D229CC242A1FA721E
-AC762979A4B92565B6BC94EFFA2CD84985F8FFCFA1BB44503BF1265D52370C53
-4B445AEC55B12E40F05DF383B356CED44B5345007B9F3454950F12C8E87E41FB
-72715838A27013F689D6B55925C49D92E0E14CBE59D9585BACC8CE5D62F86F27
-B51E89884EF529F27CF4C61A28BAAE981524CE3714368D664AC4773FF8B71728
-88C3E8878032EE246359A97DA80F1DED34DF09EE5F249B364BBA41BF81D16AAA
-9ACFE092E3E491ABE1C40A53B1A50B88788AE14870079175C14AEAF7EE777437
-8F4A7A03178AAC032EB320DBD8E0C19C0071B262C76913B787E1B3FBEF926A49
-CF96ADF8E3BBCC3F679294B5DBB5005DA2294848229A557865E0116AADB4E6AE
-94AAC10394B4FA2872BBEBDDC869163E50CE3BB2925B554235B6BDE9A29CEDB3
-07DFCC3D8AD0CFEBA9C7AE10314771DA1E6C3B927FB950ADE62D1FB8AE7A3CC9
-C9E0F4484D61A6C9F353B9AA91A186DB859385059544FC85C15E1A3357BEC89D
-92AF74938D1B56B7120B934297A71F1D92E93658C69E7FD4B338F59FA6F6C337
-427532AB1A4EADAA5FF1A8C7A84F444F81D60557808ECF3DB67C052EAF4A9FF1
-0538A114857BBE83BE784E9865B00EE8B407AD9E2B65E402EE6CF733C9B31603
-25F2C97BE78D94A51CA51F28ED9E840F13057B1F21C30F77ED6FF458C8EE4DFC
-493B64190AA9C8B22C5977FE16F31C3ACD5CEE976839E2456916EC66FCB30B44
-8FEF1B63D552E1B0F049C48445DE8C80F8563E9870134038DA5546C7E7E3A1BA
-1879235D0F328957290810F18037833D7A83558C94EE9856D3D82A3AD00659C9
-3E9587751B5BF2535FA1D1A508FBF86DBF7FC7009E1A542150F8F0EA356689A9
-DAA05EACE716C3496D4D23F326D4634B24A419F483154FFA9B81DFBFCEB31624
-1C87449BC00AADF4DA13A25955485D0C7C5CB9AAF29E1940B0DDA19594A8F7F0
-033C60CA8C9057879F10A6116BE5991F332AC272834D99344B0E476F9B2034BD
-EEBEAD5D1437C0B9E10DD38A002BCB01218A40844A91FAF28940BA11A40F2BAC
-EAFD82E977AA41B4971C69E82232A5018A31F71C1E60F2635D59DC40B233FE47
-C29D0A2A906955CC69BCB72BCA6D80E9B84F06F618BA1C7EFE99A75FE35AE359
-730863494339E0F2239191B6E7C5E8FED2F43EF6B5789872128DC528CCC2D023
-AE7A0BC6F9C194E642F09B78D898D63EE3EAFA611DC428C24CF363F78A174C45
-8C3C91CA391D7F1AE652C2D81DBB7F1A5AAB745AB08EB93BB316CCFD7D353023
-4B7CF322F928CDD5A413D60669D062E5C59A0F2C1D6BAD36CA9C5F5D50BF48A8
-AB77EBE65D054FECE72D08CE3A0C1916AAB4202D5BF4F07998534C1CFC49350C
-095D98A12E1E1E6A5BB2D3F3B6E6DFFD926A647DA7DA8EE687AF44DDC9FE4A00
-18D679F66287FA26D6AE4075E430BE22684B42EF75CD59AD72C2E97383D5AD52
-1867C37AF8855A4A5428D125DD22AE0B2757781A80EE7D425B7271AD95B96B81
-2092E92DA4D04D9E711AF88292C56E35E7FD15C0D12BFB7F244BF4CE5B589CAF
-89807DEA042EB5CD7615FA6551DEC1CAB933A6218E08C02443AB912C915A5E95
-DE3E2B66C64846F9FF403DA1642BFE9F5FDF0DA4BEB832D07FE6552394558903
-82ECF4DFB28B7E5FED973A99C0AE3CC792EBD9E7F53C84783AECAC10F9AC8661
-F023093A9F37141E27811C6B33FF8614AFA7DFFEC2E01F0B3D60442F6C62ACF4
-7274D7F52AA594A3A096EAEAA2C161FCB10E0AF00ECBF9D7EA6A4533B7F8EC31
-FABA55E1AACA89E5D02114E7FFEBA84528FEFE356A48090A59AC39F358FD8800
-0AB1486BBE16BED95607ED284CE271D6D9239F3F23FD403304C19E3132E2F3F2
-B7E1323468C66444B2E296E42365A9276FCB51DE065D6196CD4ED0E45A096DA3
-C45D8DC05C009C1C335ADE0D874F714C8EC74121B386483D2E67B8E7466A8ECB
-DFE911178ACC242FCF9DB814498ED313CC6199DE67133ED4EE9253C6EFE87DFE
-CC9E4C6F2950F1F9A93834BC359215BB37EFFDE944344F922B2AFD7723A45F44
-DEFA4E344C6E8772EB6F9D89E850E853E8119860A6871668C8A062869E15EE11
-64EDC397E138D823F520B8475FB6703098E3F779FD6446B2E2B27289B5D569E2
-C2B5FD00FC05A609572F57D14801C5EC159423E4B0AE61ECDA938424F47E99AE
-BEC534EAEF22396119C3E79AAB1194F71044A8973FF94FEDC317CACE3FC26E25
-8514B5C039CAD5B2E83C049D31C135EA4BC2167C44EA92AF8F45BB777BC56EAF
-BE7CB54F02AF2263EC1AF29C7E8D548ECF88BC262AA04D6F7DF26E5EC5E2919C
-52B5A8CE42AA960EC9CDFB35F2DC8FA31E0DD5FE5BC18A7A5FBAB0A509CB7451
-DD4230D95D6ABB2B914A93F42D0B17AC931E4814AA939F90E389EA9DF311F834
-8A0A1A86602B07EB1CAECA4178A885C11CAA3710B6DF83DA05AC6169364E6EF2
-BB75559A056929BFDCAD8C30CE83AFB66266D24D308A8A510FF245BE51B49A0C
-C608B08EFB13973C7BE9CBBC46838DE5BEBA093863CC9B896C1761E6DABC0CC8
-889BA134FFDA108C9B101AEB88E18B52FB151DD631ACB1CACC164306CF909452
-C967430620DE41E0BA22C811F5D6D728781DAA43B2279C9E301096D58DBED1B3
-EBE39E8444AE50AF6AD2929AC1C2FBA27497A0AED80A72D515403B46DDBEC309
-7A8F8A7E1D840E4D7F7FF390A0176E85D09A5AECE75D167594FA3F7C670068FC
-31B055894450460F91CF36780916C17E8644C05EFE80D525B2CCFA1FD1B5FBA9
-2CA3A87AEF0867E8F135086BF78C43BED284339040754E8091EE2FB26E58DCFC
-9025C55C286E99D5CD2B1C0767F1FE0D89BE87146C8D9C21118267CA2D9E15E5
-4DF80A9E709C6E4D284AC29AB032FCE2AC173A4381E47FC8876716DB39C63380
-E0D5417D1D1ECA49D5414E93DA59754653498A27B796C04CA3B3DA37D326EB09
-5646C20F0CF2D34D45758CF49BD7CFF0D71294BEF0584E87D06D4C069A7D9256
-B5AC4005F524A46A97574FC42EF2F0FD8382C26A385A3437FF85525F80711A14
-B928853A5DB29B64475D06B1CF33ED36396BC1FDA09B35E0857B2424584D5E9F
-A1CD56B852D910C67EC88AB907BDD4F94A6CDC9FCD1CA1ADF7D2D3D3F4C8EB88
-EDDB632D8430B157546038CC69FEDD9FBD7E58BEA5507520C9D55910A656511F
-273BBBD804DB9AC2CAF9D0D02F6F9420C7E3974B2A7C57D74B562155FE7D1679
-904503BF008E32DE50A007251D27461F62277E50DE498C0432B48F3F8AE9B589
-919EE62872BFF2DE14850773B86331895AB20BD96412A52E9B87D06DFAD62EC4
-ED02516D2FD8866B41140D53B4AB65DFABD08B96E7FF634DFAFFF3403BB6ADAE
-947387754DE0337BEBB7CBCC8CD4D0BE5A2FECC73DBEB5A3684979939F352E06
-CB07BBDE49096A91872C1B77BFEA8B6686354E53009577C2AB75BA32D9E6A6D9
-1D2324B105428EE06BB04B862127F0DE5A849AF6647AD7722B86E1E42C58A940
-F3A7CE22C828D84B84D80BB7A3AD87E1A16C2BEDC68E9E3ECA734840614E1480
-F70C26D8D185830FE5C1B2E6FD3AA633E5F856A4496574405310C3FD709BF92F
-23353CE76FF2C5D22B5345C3AB129F107D478063807E9EC522EB4905F59F72C9
-31012EE90C7A4412D01832AAB0F8B0A84C532ABA1F6EA8EB84C91F16C5EFC2D1
-3A9C2F5DAEFCB1B00936DEA1988049FB1655BD5C1912399621DD755D506845FE
-A59C625AB92649383BDDF1CD48B33CBD8E207CC63D7B4EB314354F5609A68713
-5EE512AAFE98A7329AB516F89FBA8BFC6AF3AAF189CDB905ED3F63F479CDAA3B
-27A384522D571226623E887756EAF7539BD2FEA33ED6A30656A3EFE0264C2E0C
-44E065EFD20E0961F86B2067FC7B60A3201F789E8712D79528CC5449D8A4BDFF
-A16F13C8E077A259CC71DEA56691BE117BBF356B78074CED1F54C9E16DD2CE48
-501444BA0AF54B1C84F5415CE7863DBBE37CA30688D5B6542E9E743F8EFA5A46
-4F46FFD30F801D02ED63B52C6C0AA0750FD82ED149C8D35DB524C424B2DE7D17
-A886FCAD0D9A0EDF04EA5C4072ABB8D07A6589E9AEC0C9E1933B94DDF9350751
-A6954226F040D8D13F7F34ABEA21CCA64D59076F61885116C307A95E74F52324
-8B1E8A05358FADE97BE4703CE7AA80047BD200F59F4CAB6EADB05A892469C4BB
-3816C606D39BF8B7CD0B69A5CBCBAF35E7C9670FBD4CF8A5E11ED3794308568B
-174D42AA69F3FFE58333619BF448FB0951D9E627DE153FEA9A4F2312EC701C2A
-9915D9434205857AE251095E8E856D01C4F1CAEEAEF2A7F2B974F1C27EAD3976
-7479273E36A7AFF9D4EA352ECF7642CD0CC31982D945EC00720286E2ABE0F9E1
-199033AAA3F9F0142F285B88B091E01249472F339FD8A9BE3ABB16DA3DF606E4
-2467780732D6CD6C20101FDE86391D4CF8BDCBDC0A112E9339FC5E928792B62E
-4FBE7770C4EC526C4F5CEAFD25B3E4D1A0B4F06B516971A099299D8005C9231E
-D06688D4AAA4550604F7D1C9294B74B159B6B0B15CA2A5395EF6EE355E59BB68
-DD8B01A0CC19ABEFD5337B00E8079FBD5E5CB3188C414E015DB57FAAF330FD45
-E62887ED507092202F32CC49757032D13444DF1F619FB561379FAF4931BFDF62
-3FABFE5B949829267190F61A4318678A07403A5FD9FC8C2F10EBD819D6EE9C73
-EE3D852B1DB42EDA74C3C63EE61762EE0C8D5582332AFAAD3A3BA0B5FDB17836
-9BF11422BCD69EBF2F11C67780BF0533353DD045AA551757111F11F4FBC067C7
-84486CB7A486B602F9D7C56EF84A804AA08A740E3BD2D647D1DCE018B4D225BD
-DC9607D21377E450CBF76AECAEFE4C4FEF2F72A4A44E90B28D2F46FC8E549C1F
-312CBB690F9D96FBBBD77827158FB5C2DE80DE51D17BB86A4E634EB917ADAF1B
-00038B6028D3FCFE6805A72DD10B17C7A434C68744F19A260BFCE7C040D1930E
-B4B35E0A3A8330A6E197F359CCAF0EF03502846C784ACB3068280CB7D3095977
-9BB914063E289DB7BDD5F8D50B9D8B64A6259AA947FA3AAAF20FBEB3B020B169
-8A2A68D6C899F8CE32BCA97D75E9921883663DDE2735439F8BB5B62BF61463AE
-947A0E4862D480D9197054727BA1C1D3E34A0310DC8D30F24AF051A384D5CFDF
-4DEA1DC83277553715A026F0B676FA651D6036886319455F265C4AD78FE72B41
-9C8A0B613A4FAED194DFE836C15F10E4EBDF0D2779B0337D54628F4CE0EB0AB9
-2D67DF7D287D233815462CBA378BB4D05AEA230DD884BBFEA756954EB0A6F304
-5169129B2D3A55D3ADAE8017B3D9CFC5687F2CE00BE59D084AB6ADDC8D8DF76D
-B9449917623FFB4F924EE1BD40A536E1380F22BD07260D3BE827E62220E0FCAE
-E21094047696EC4378722E62F696C4FFA6CC92D1D5F719E472CFF99995CE95BC
-7D3BD9A6172195243343868EC7FC4C51DDF43BE6649F096C4DDDBF6498BF6208
-A7FD124B9D7CE06E89C45EE3162C8505255DA806684280C4A7487692862096C9
-ECCA26F72DA251733B700261FCEEEB7DDE3542FA852B39707044F5E34AA80AEA
-C4F54814C72C5480AC15478E28D7898557F7FAC89720BE0C02B726F674ACD9FD
-635A87EEB2BE08765AEADD636E261625FA9E93E77D954E5DBA6A2A75D431879E
-5936B3E396B3E681F393669F20884B1D75CFA3714D967A7C6DA12D31E26FC12C
-96CAADA06D701DC45E00C1903A8D9BCE04B19DF613B54AF7B6DE33678078C03D
-F1B0C31A9B87FA42FB434F105633C646E2A45617D8352BA18F5F9EFA6DFE5A0A
-2FBF4F79A0CC5ED15F8B9EFE6BFBD2F7F7ACC99A7162F1D0491ED4208F2A7E23
-1165C3D65FAE7B3513818BC46A9A2277100867AAE0DE763FB6C7319C933F92D1
-4A8F8B5B5460200FA193805D3972F18B4B3DE7398F8C0A4462EB53C54A4CA42F
-93E671584DFAF63AB8B91FE0EB29A8E525C1F137E7673F632B0E1E3864E1AA54
-D22252FC1EEFA76092E85680AB35DF214E761395744BC84E03D6F2E50D15D1FD
-6B0C0914E661159BA887B856C49C04993C4F3FF4530F45CE0323752EA175F97A
-F4C5CF8E8F103FBB38295D016E639C931E1421762C075133DA533E5F5ADB6CF6
-AB5BB6C69A761BB71398C0E1C15E112489367193FF3464271F439E4ACA94F47B
-8855971F042AD99F97B049F6D57FDDDF401551B4793C4217851444D674E2E61D
-98D1D55CE1B7B00A82E16C25766195167C01E3BA58CAE1A5675B4E9DE80EDCD0
-96DB71DC7C2E8B147A22E683B900DD3EBE402F2DBAA6DDB847E5AE7D0D95D4A3
-0E5EE6E1514391A69ABCA5078C96E0895047D2242316792BC99D59EE40293A25
-AEE147A96C9B8CE778C4ED454D1E1BBB351966B1684FEFD4A8E707FDD5EC675D
-96181FD81641BB578C486A0529FA2EEF184B0402BB93BC400B1A29DF5ABBBB03
-774499655178A19FF518E5241C86719B1AD5C04A0775C0620F23BF19A1DF3864
-9219F74D06410CC1C85DE0E172DA953238F83BB44ED46C37FA1841D2282D16F2
-5C3C9D3A3897F880D49BB65E9A12432F517175C2F3F12C5F44DBFF1094EA2CF9
-0AF10CFEC825F1DDBE0331DC70EB7AB9736DFBE1D6C3448B5245AD469DB40B64
-D1B89F7E083156D3B44E7C27ACBC411413D69D515FE03C7EBAED6DBC7CB3FB7D
-DDE6239F8A21E6329C07E0C601D4B114BC3964D921D3C15BACAB7AF7EE202B20
-3FEAAC53D13F088A932409337991D5CE4D4D55FDE4D515EAFFB5E47ACA6207B2
-F059EE7A93965F859AAD0EEF2A6FDBB45408834E885747349244741526882DBA
-7AA940C038AF5D0909C1B6F163CCC5A9601E6F7BC13AD1DE6A699100F9E2BC5F
-EDDCD46C3147E747C6D6006C05988AA402A7C123F015A271C9199E3338B7FD85
-B73B31611FC6ECC10F203C91605279EB6894304A0FF6B67A7CE10BD48E44C0BF
-04395105279961D56E6D3CBB3F5ABEE1F069FF512D70BD9C81BEEB62710FA967
-2AC750075845E2EC4B7826F170023D7BEC4719EA2028AAA3EE91D3E212DBE02D
-53CDA397F61A4CFA58543FF5A5AE88D410EABEF0AA0CA8170AD71922181CD387
-96ECBC28C88C3199618DDBDADAB8FD6B87621B731D91FD6DCA973F2CB347C2AC
-110544A352FBC02B408AF4475AC4A5792455416A6E9184C861B4EB02F6D565DC
-EBA2A752C0C9EEF51CC5C0EB286ECEBC7FE5303AA411F14DF5B569A271BE0650
-BA2061861610C64BA81442A8C98B5334CC41603B00FC7D49CBAA7E6257EA6F13
-72A7FB4FEE1F7EE3B6226D7564B105D7902B3DF2BB43286B6C71A5F70A67E926
-706F301CA4CDF22411A6C91BA7EF405FA5EECA8865E2A12290BC2485714D891E
-CB9EA86E36EF1C7CC6BE96AFBEF493420FAB5195DBE4DC80BC075C17A1DC6565
-AE1949B72A9E26D9E832C08CDCFB37B73BB0C80C452EAD2145E1C217A53C1E43
-6D7EB4F6D035DD6A6852F33E561043F8C9ABF09AC746E936B522522D1B5A4A70
-7A0566D6F3BF82A29918D3C01EB69EF77776236EB876853CD9C599D81E0ADBE1
-F909101A47927116919FD881015CC23E7280DF2AACB0D0D442B337952A691393
-7A7D996477A04A0A7893B22E6DF75C912518C0E80CC57D2F3011F7CA639FCD2B
-5B69DAADF0882629EB56CA6823680B247C5131EA52B097977AE71829EB7D60E0
-9190E3B34BA4022932F24166659795E75AE0E286268D84F7D57F1ECA608EB49D
-04B7BD31A76337C487DD156A131BCD19154ACBB7C36FD5E11FD3DD7D57684E4A
-45861AEEB590967ED45ACC06D360188912A89BF7F01CF4430DC196B32F29414C
-8BD6A961882B3999A3EC9CED31B063AEA557667AF65595B67ECBA01F488FD07F
-4684052C4BAA9D038B4CC8FE1C1381083CB1A2F7DF95A213C46A272C45F7AE94
-47A605265A776BB5B81CA6A87875B3BF33A2E055F54E73FBB3FBC63CA47C64C8
-21D776FB9AD5FBAF9482E4A24A556B1C1F92B3984105C1C466B340DCEAAB9A41
-7869FA344F7AC673AF6D49752B7391260762B8525F43221A86D87FC74EC3F92E
-BF23C1F2B04CC63F9751471E3B399B683318762DA5742988FD122D1263064645
-079F1DC46F7F66039AE0B9D42CC2B387C7C47758426CC1E35A249DB3875A8466
-198155C887D5502FAF403650E6E336CD5366FDA28662B818BF5C5E2BF484E207
-498C3CF05C037BCDC3B68D0FC718D9EDBEE4B27CABFBA52DA116A60EB766AEAF
-3D16F3DBCFA065720704DB80A7045FBBCB219A4F679179B5B7E5851A4CBAF2E5
-20B4FA5B5382EED902E6CCA8EC283E2B39726C5B79AA72B45CFDF9E30EC4D5CE
-7FFF76A90F2A3EBE77E017CF6418C4CA1E6DA141D974360FA597273013ABDDBC
-A340524C822A2DBFC5E9551D79745595105EE1FF49A6A1E33516390A2C59FB71
-E394B13481C5179DFBC6A7E698C0364D93A8830F2BDC3C7B4B603D64BB53BC7C
-67270C93AC504557DFA97050029D6D7B85EDD9719CFF04581004BC908B358FDB
-6DFBEE6183A0F7AFB84040299B04C560ADA8AED59E43C2036F6DA09F3044A781
-DA12A23145719FA0B2C6AB6E10CFE84D8466BBD176EB17B5FEB793A917B3B604
-271F299780A5F33E212CE334756D9768339FE866DA429858CC7A6551B192C80C
-659A3627BB903D74E8ABC3910A662793BF0BA13CCBB5361ED6D1B4AB6AD299D9
-DB7CD8E592D2D3D9615AEE2BAA6E67A46327E29298B0E91DB801832D66788D18
-47CFC4A5C9B8CD41AEA2366E8D7D19E605D0474D6A2D9C1AB44CF5CEDFF9A678
-9B74A83724CB185EAE4A58BDD2ADB9941B41640EEBA42C3E105393639D84152F
-8E26E93EF7D35E028244785683C8A4D59566AB8D2FF2906C0BF7C4856AA9C3B9
-E000677FDEBAABE33B23F13077EA25E1699519624C03916E3CC0136CF3A3A468
-F328D43F7BD1C6DF305206F302936B12F3529421A81D0D5026FEA5B811029790
-42ACE0E4AA1D401D15B283E2959F3E130ADBC3262F73DD1CBC94EF659860A2DC
-1D9ADB113C701867A4E62886C63FC43BEC3461205A37F1307061C62EBE4509A0
-24A95211B890842C00ADACE0B75EEAD4031AEE5EC113B7303AE4C42D0A263021
-8882592E518CB3274E367B937274A5F7FCC9F6E9D36B83784C4E17888FCDA3B1
-CC0F9E41246CB830D282370137AC001D9E4ED0351BBB39DDD7F19A78FEC3CBE3
-B875543006CEA3BF1724314ECC6AF4932DD9B5CD64A91D5A72CC2487A2F4298A
-34A1DF796D1E32DE2A7F12685B33992F92886647B4CACD145FDC35C5C8317DEE
-C9F58DC50E135F65B1A0A1862EAE22F1056EF92A2ABACDAF4A701543F274700F
-4FD59D4033BAC20817F1C97B41466ABDAB3AF22DC3F60A5A5C1096A2ED73E84D
-F5ED5392ACB5FE5027D0C3B1D47249D809D5D7C7FFCB0AD72C6E54438CEB4AFF
-E7F1C42D158C78144B7073B8A1AA4AF5707CAD9E9EE68C45C32B1F2B2C876624
-163DB24823427080D1F81F52BAA3C0BDBA113AA6F24AC2F01E7E70D6F7754BC4
-BD2DE4C46D398DA4C94DA7F8A38AA2EE20A9D124291FB3649DEBB4A5476FC536
-56E85EBACF09E3B129BD41748FD8972F124DBB5821EA6BD7F26EE1DCF086D847
-82D0C7D60583B1424EC98A3B436A9939ACD437CB3B0F5DF18B4BAC9FB1F4AF87
-0854FE355E5C8790F5A5BDD2DDC835BF8FAACC22FBAA6589E843E04C2E8FE52E
-AD35EA2608BBE0D77184EB4B4D211FF2CC58D37E3D7638A57551D4961F9E2264
-A7DDC677F263450D357D482B61D91D2B1EC15F6DE08864A5693707AD46266ED3
-46C1E5C8D14962B82FB881FCDD2C2C20A1AAE200E39FE74E8CAF7E396F1FCBC0
-5A0CA7EC0D2FED67B17DDE349A72923D2692B565D5B752336F4F49370878AD9C
-772386F42C7E2FD66F4B8C9558F9E2C078B7D140A5E6B0D8C48E5F0196CC5D66
-553EE79C3596349568293464FC361AF011F8148B47BEB397A4F8A0552E416F02
-03FD3967E0AD6A928DC1DA73488D2A093E7D587A404F909D24A57CE63F2EE6EE
-C945CFB2297EA4E331F41A6B8F67843B61C9226FC429EA62FDA4F91C98C4D7EA
-D2EC09399998F08AC9C2A3602018CD28B3411218D90A7BD6A310427EE54B19D0
-2FF1A39B7363D31D6BCEE6394174BCF0CAA755B2EFEC05B962B7E28A73BE0BED
-9D33189E82D125D4EB6E5CB370705430B78324A079769FBF7B4DABCF305924AD
-1A8559ECEEAC4D0967AC739420C712B213B9A84C5D930A7265728931CB35C4DB
-1889EE886BBA68383E8926821C7EBD13CA2AAF9BE7C5090F9D301AAFB1001C75
-C52BFFE1B81E7F415C38F560E902653714B853FEB28125DAA168ABF2EE66B6B7
-E4C0AA21E4B936F9F757188899EB4BB6AB3D708429954F706B12D928E264AD64
-1C4AB1A5C4D209D757DA7857B383FE9AC3319A9380603348A700BBEE4849D9A4
-2D7C6D49145FDAA73074B8F568BCE751C0A9023124C71F8ED7D8CEC4FB01E841
-EDEE9C56BAC00DD17E83CDF905D1B8667BF13C3B8DF717D23C6676840A152215
-ED17A14B0DB3602DF9170F979D8098412345BA610888F3FE450387CC46D47FCE
-2241F9180024331FF12D713DFCE680F167E8AEAE710C765FE0F791C065DCE040
-676C53C797AE7F26C52CBACB82AA12DA9A14846EAA73A6F0F98A628CAAE12718
-A9C30F2B1D13A4FF3BAB73CE32593FD459A9ACC4FE7EAC78E893C9A37BCC8363
-D8DAA0049F383F1848F037F0250F5D9A07E0D6271F771AEFEA2FDD6E298DA77D
-41CAC0CBF6871D2D8891B297AF8927D33D6E7A16974B97B7BEE5FE92ACFB9442
-3DBFC1A323C2DECA0AABE3C44C4E5FC67E31AFA32A2E384F9A158C5F5A7DC04C
-C6342B7D88308F4BD0C813A8A8FF6D44E8B6FF5073F11EE1FA41FBBF07CE8E72
-CAAE5FD345A00CD4E0DF5B80A44DA6A11B271CBE994935937BC477AE4862E0E4
-0F55BD2214CA9F7186885EC69811F821109428BB851C01D1FB2F38341408D262
-F5DDC76451A7C107A725B609DC363270EAE8E75CF6BC1877F2B2BA1455EDE408
-159506B7727F9ED61D807CB758C0BC165EBA7C734EE4BA55AC6F42B6BB930FFE
-DD0AA0A34F994AB151BA1815BEDB828AA1BF85DCFF99404FE4898548F2FD6DCA
-E1A338E6446093AEA135A75832AB0D268A3B56C8C20F29341CE6A48D5F5CA445
-91CEBBC1E344CED028FB823437CBADEEDA3B322077A05573D60D7BD016240153
-6C28F065CB849F8CECD24377C69B42B00D01D388363B99330AF05226758AAA2C
-B34BACF2F63EF54FB718B001C5AC90C9BD85DE8CC38398621AAACDA2FCFE3784
-B3257A9DCB63773B8B99076F2D969C0D7AA09478DCA4A6B3F7D8D95CEC5208CE
-ECAD3A540AC0C067733557B5134B7DE5C75D2B5673CC9E3F08DE0B9AE76C829E
-97E3BCE64918E5F1687046D0318EAC32659629DCB7CCA135A2A7B450E14A9A1F
-D89F5C9793A4FE2AD7719037418ACDB24643ECD71D70FEC1D529A87B89847945
-F4BB9E9919386DA70484036A926DC3DE7FED1612C4B89B701EF4409979CA914E
-5FB3ACD50E15AC6B4B22BE79954F45DB6BEC4CF3670414540C7F394BE2CE8F34
-1E8D02282357B6BB6DCC14B6E1CDFCE52FE38BF7FD091F44E3309D88C2CC2014
-3AAFFF868E201F1729C0303F62F5E21EF7581674C46DB63F615A57C4310B5F07
-A591A293340497C59D73365152F4F1ADD62DF144C0B2F4BBA9C04819D74CF5D6
-E5DED166D9065438C89ACFB14744EEFF77FF21A5DC2E60F8FAD10DF69556219D
-3D5039A505D5DA8A35EE75094EA3930417E7F92BBB14C0948D347FAB53BD7077
-3FC6CC7EF5541D2082507130932FA415218BDD959004B5D1D9C6AC7A6D62AFCD
-CEEC5F43688EF251A1D7FD4A9DA3018ED9A63520C0A0E4910C2D5B2F9FF03712
-EF45FC4AC93DDEBE9E1F434EC1D86938253F736F7991FA0E20500961EA080DCD
-D2A9164A8CF2FB7546EBB59DACE8B6BA5F9438A8FE29223341EB1B1592607BE7
-E6E7FB761FB4B198F8D346ADE3B6C7F31192541D688518969AAF7C2A1EB51563
-0A233BFB89F1C2F8736E89A46DF07D64E68CD0F58CE1D698675E4A3F504F5D63
-E58854608EE83814127A760695FF30281D2C4648D5808C8C8548854474CF2F0B
-94E15450CDE2CA5D5CA333BA71163E202F54DB4E6B3AFF1948FF2A5758A9BDB6
-9F004B02C13211A86F6B382A809BB726A22AE41C4E6210B61FDE76D99A5E6890
-BB1C522D0DCEB8916506622083567680F405E687C7FEE05577A8E7C02B30161B
-A775FE0DB6168AD93C19B83AF6E95761BF57EF046642FD3C47CA1EDDFB426533
-5022A78E85A91D86F3B78E463B01CC30807204AEBC0E622B383DD5E2A093188B
-62CBFB1CDC759D4FD7A66CDE922671D6F6F2122F39DB3C4CF73F3E16C1003688
-21838863DFFFB77EED7093A1B22CAFF89443AAA734B788F7F64BEB8B7C6E9579
-0389ACE038CF73D46AE11F9D653820FB3EEA99144CFDD4C6A28B3A86621F664F
-9441664E4B2EAAA897F0FC577344FBEF2AE0AE4DB43C0CF12CE089AA00D6925D
-BC8537F52868FC9EA59DF56FBD7AFD6A4DB12BD17E4B47556DA97DC1931AC87A
-38A1EAD3D3AD8B462C1A76F830D7EB0621CC8B4FE740AC409EACC48BB7324B92
-1F5B2093F0F6575E4A903E2EE134E77874F70DA87C073FEE5191C118EF6E75CE
-42E143037A40F8D5B5C92C55B497C134B61BFCE61D8E7AA93E66F74F0BC2F725
-A8BFD5795BC47B0B46F526E772917BE1FD164181B5731E27CB13D8DFAD0E8D9E
-BE4436C6921E7AC96953F20CCEA3C2E6450E51FB088E16DA8DF471ED8AE84F48
-71433349B7EB58332DE9CB7126906B6FCC08CF2047D39986D4DE9BC1B2F2FDBE
-163C73C9DF62D1335EFC64F38D42E2E4EE9A422718174189082A4E83B5C5D04D
-E34ED308A2D7F8907571A40A0BF77B4990D7C1BF1CC0474C0A41876F2CA0633B
-42D5A037E87BB056483D0E88298260265AB723B24DDF8E4220C8E7F3E681B883
-E94EEC6B2E77BF249CA69E12AEE9E03569D6E99D63FEAD2ADA9135B62793AFD2
-B7CCB2CF2D1144BA7FB613F00C6DB9736720CE1BBBC49AF359FD56F9E98253FC
-57E2CD93BBDAFDA1FFBF9A33E427B37B333BC48844B9F7A757398D146133B416
-58DA341B54FF74D097DFB950D0C850E11D85522BF8D10BBA53A99117CC4A4B72
-A1636FEBD444F0D61397039ABDB39CC4D969910F46AD2EFB671C05C66B0C6FE5
-5FE8FACDACF7AD619A44B49800B287170D086BCAD5597BF592521B51603CF4BA
-A286F141942C67471B47D67FCC581CE2F96D3C8152D4A86F9BA90EE6D5F06730
-CBCAFFB91FD653675DF525C3948EEA1F09CB6CD084D7D34F00826975368373A0
-A05CBF4F7425C9F57F0EB5F1BBEBFEC259BCA347D47BC00F90EC77A06C0787F5
-6FE2264D2E37615E28C74B5B1B96B950243C32CCFCA6925F42E921819C57D387
-819BEAF8250E117B9475D4A8FAC24ACC0EC44CD4C9597F0F852781C9C1817C14
-F38F8280AC2415268B3BFFABE7AF59B50DC33F7ADB38308F67F50EA4A74B81D2
-5FC9C14894963F82D10525E0926DFCBFBE775B85DAB7A4BF4D13E422643109AA
-A93E559CBAD1DCFB01C24037672B2AA2E06433528915C03F222C8523E06A7BB5
-90049A82D9E930E77DD4BCA67A765B24E7274C45331E07D9AB8544C7112327F1
-538C7E19BB37C05C42A2AF30EE19D10E4137B75594EE6D6CDB9431B3AAA6950B
-99CE785EDE29C89F94F3C0A395DC4CE31D058732DE45B6FC3D15E12E474AAF6D
-D43D56FD939A8719B432D4ABC752E1201A8C1A66866465AD9DFD2D9B3AA029F7
-9B95EF7B4459F360F4F515D11149942717CE8137F0DCB4ED01F74E474FB91718
-4AFE6342F4D4597ACBADCB5E40EA16B86D4DADFDB970149C0177A943038CAA99
-D07C82504696F1A87046160F9C0AC7DC0F3C8496CD63B31E56F51BEF07C6E7E4
-C73FD39EE686C0B833315629060DFA6DEA06DC6BE6958C3F9BD1F007F64525BF
-7F1F1B1D17C682BCAF0B581F0B986BD12A8C843DA6CFB65E901BA8BCBFA7CE64
-9F1E86EC50417744825150D56F2FF41E8B34D07B7EA3B19CDF906BF67DFAF212
-73EAAAE9015C8DFFC0C6EB7934DF360ADAB6BF70FF5B18F2A571B9E42A113F11
-38EA6A07CE358D0B2F4EC4FA45D3C441CF21D465CE936FAA1033E7AA407DBBDC
-4A44306ACB55017E136D70DA322A115FAAE9FF0A07A3D588E48B1A571D2585BC
-C7AA26DF65D9416A3C5DE75324CBFE52A76F3B74507DE787C9E9DF41FEA9A02D
-7DD35547E56BD3FF30B12668BD2804F93CA6199B4AFBEC7EA51EFC9EE14AFDE1
-91C69B76727373D40C5D66129896314959DC47D672ED6B3F977E671E020BF01F
-1A838631CA10118F13F91CF616BA7EBAE0C06EA8AEE25C73D4CCB7203FCFB0C8
-6884A1E23FE5ADFBFB0FFF19C532C2571062CBA81D3570761E3E00BE5556CA1B
-25F2292F689E5B950288B794BAE1E15FB3284AA76731772CCD6C6085C394C5B0
-3ACF82A852A32989A638054C2E75B0E6893A880241498D3627B55F3E58761B83
-34208FA0A34738A75A67E5DEAA16597E0264A75BF6E05CE3C3B8B1B5A9BAC508
-B282B2B77CA0F5EDC38EF2D3DA6DF7646AF3C9ACB62DD0F59F50D0EDC193D847
-F8A5D40956C169468F5FC14E3D527AB047E8E5A223A8BA05270700AE1A07C3A4
-ACA5ABA29958F3CB2D1CAA9B5A0643012681D0A32048458BFBF2E3BE88C326FE
-5F6AD9C996F3C82F186B5D77B4E31498CAC8EA4F6B3AA6BF524B38FBC53A2B04
-3F27EEB7854861B3EFD8C5DF19D2DE5D9C44540AD64AC3EFE729F4BE0CD144A2
-8A1DA61C8CC27BB6B861DDBB25782E44A33EC1D507D7127B51B17C7BB260937B
-C4267B4CCEDF56B1FF949DAE7C5E5C3F061B6CE47BC4BEDAD0A78A952A33F339
-ED8654918143FE913EA90B9ADCB9B5C9C140DDE7E2E692B19A49AC15E7ABE60D
-29453E54AEA9381B981EFD66CD957936D6C7F54CBD6306B82D13B8A716DABB77
-465EC55DFBF33839D5F37B47B634CA94489BF050000ACDEE4019C668C6EDE0EB
-42985CA668123F764789075C18934790B1D1D9191E72D748F2E30E0AAAE07451
-E4D294C0106CFFBED91600DA5FFFFA3F6DA6F7C5CF3502FBB2DC37ABF30F04FD
-6283BEC78FC7865D1B428F0698672E431D2A20E9FE24B1833C0EB0E82A34A1D9
-23C4791E6F8C17911A579DE17A289D904ED8AA16C8A365481D8235613B9C71A4
-26679333F179886DF86BEA8F3FB599294CA1A9859BA59E42B061255C93ECD97C
-AC0E4A89EEB16A25A5FF625713F8A5792A2E6A0F537D3436F603D7F464B61470
-DA712B94735254FC69C4F4E0A66A36170EB151353CBCC3E55D392D78DFA3FFCA
-EFF08200F1B222D9D9C4BF8329DEBB42D651E826BEB449BF8DEDEF0F9CDA4105
-8406F1E26BB06F60B7B00E92CAD3BF4EF06B9553688B099106932B18F7239DAA
-27B747808CF11D151C28C9DA11678CC1E140DA40049190B194851F753CB82993
-349CE659FA85B8AB585EB7FF322499C5940C026FE8DEA5EBC9DE866B03C98F79
-D36AF4901182DA9E9995FE8400AF094906D52D3CFE28088B14675F2A6F846CE6
-5D5869A70EBA2AAD1D0C538E0EF7779C801F866EB96C7B5E19C67354BD364263
-B67D82983106C682E0D9A3BB0D5E60EDD6452393FF2724739D426295CD40AEED
-882153073D356E2AB1F543E20F2AC2BEDDBACA73BDB5E8610E58BE6D704E5274
-D5C252A0669C56261555D0642C0937EE08329B8BBA2F807284B8777E1C2D73F2
-31E897BAD03DF7587757BE939038E75B25137471552DE0B7B3842760F441FCAB
-0557EE93F87FC7079457AC62402B55E51ECE8D50F94566B1671675F0215C37DD
-31FFFAE9B27B48798FFBF14D18A2C6F1306522CD8E8C0D8CFC228B3F1C17A827
-1E5273E3B5B20C2792275DDD7C17053AE8DB61B679ED2780740E947D5DC47B27
-D35F9B5DE0166539FAE75DA2179F3F9EEB39ED0452E49A35A1E1083683BFAFFD
-9A066C4CEA4DE699EDF570C9208892E0ABA87784EFB455238BE1A6A376F64252
-82EA5B523A8B2E7812E3253C2B6E1CC4681656561179A4C95B48E97CA5F9A39C
-D255209D9F7D80DF55AA3FB99908B46B101D509F3BD513568A4949920DBDCC6C
-70ECD3BA39C44423D02B4E5B13E9F434545979F7ECABE6A6FBD131E169C914A4
-8063C6C9748D32E71D0A25FB40C764ED26450EF49735E12DE893F302FA491B29
-D5154B441D5C61AA4AED88F06C63D52409DE17D7D97C572F7579296D297B9942
-880FFF44810390ACD46FD1E090A6412F7BF21DA7CD3B166A845890CD887F607A
-1F04BCC7F4BC3107BCAECD61825A959B61E62795CF4E458EC63F1F2235C64D60
-C62FE46E4A913685CEB2DD7B25494832542059ED9DD0849029BC1272582D630E
-4310F978FE6569A4B9B97A7BB4BD602D5D32E79727ACF46429CFF0F7BB8EB39C
-DE55DB6246DD9DAB7863DBA6DD21EF340E19727D5AFE9026C284326BA0D4D9CA
-E015056824B392BE8B930D04BA60B58CF4A683FA14850B6B24787958D1A7A42C
-7C33C1362DF20AF31CB88F0F11BEA022C609D9575F71EE270440480E0AEF6207
-733236DBE9454F088CD4A01F63B6B2C6270DD08A13108ADA783F2E7067B7DE4C
-C34AE192B05F68B0022F5F30583D9D68754782186E5B8FF76ABC451DC9EEA08C
-52C12642165408AEB813C00DDF6C27F4053435F2CCD8CAEE50704DBA37A4AE42
-9B7960169B0C865E92D270A714449FDF13D8835FC1D4C03D7FB376ABF7201BE8
-A593576476D8AB905076237BCE2630179D158F04568CE4C85734FD0A1C8E3D90
-272F3A65B556C7C803FAE8A0C82756B99C35C06673210766A8042682C873F811
-CCDBC015005336EC438C3476B4AE13715DDF6F7034D032D29F2383E005F6FB4E
-19AFD4A02BB7A79917D54519D37BE66ABBC156464898583522A4D63FA6DEF194
-BD4B90C83470330F8B5233C24E80CB64C13C0CFFEE81E3087A4BEB84FC8B152F
-44A9FE7D4393C652799B12A2C0FC0842861B1F1B656E802CF0C40DBE95350BA6
-32341D0503CC7CC3348953723981ACFAD95E18348CBAE09B630DE4247F3F7A7D
-E4A0095D461854E4CB12840D355912AAC33A5A04C833E20005C2A71509AF51EF
-697773C2D5C8F958893B26BC64215E4EBB7350166482F29539AF54D860C68F3D
-1C60ADEA814E869E974E1B78114B091134589C089A2CBF12ECF1E31C4122155E
-A90587849A11C46DAB620284D66BBEE187B61413740176EA8F914D6923AA0A0D
-3C3383D95EC1FE1587DDFEF289B4BBA9EE208408BACBF5FA0A53BFFD88BC0529
-10631201650A258809DCBD5D136E038110AE4B818783716501CC5DDCF42ADC23
-86382A06F7FD13F6E99935F9CFA67D49BD51A2D28E1C605DEDBEFD24BA337407
-00029CDD5E8808F6EC2FE5BAF3BD3995414E9D390092ABDC355B9CD4E80A8DE0
-F104658871D0CC6A7F06CD149A0FB36F4C1F484D5A43AB44394934F65C216EB6
-C33002BF7D0283E798813065C84BB8EBF6E19A0855F0E146A7ED9B4B11C9B89E
-48465EBDA7CAB38EA818991CA0B07182AEA5438ACC95823656CE47CF932851EA
-3B0A9A2DBCD3FBD926D904749F62E27C4725410E297D9CB2CE16ED4B32AA41B6
-888B1480C538548FB6EA68D3E8221626AE219EE5E998B310D8820AC61CB9D9AE
-D5C1AEC7C3CDC305A5E88E028AD21C6DEAF272ACB93916AFB42081E9C46F0C2D
-98081D7D0CCFDF2A3062F218582CF432DD75BE9622B1DADB99B5801F709E2267
-BD5E0E1511912DA7D888FDC49C2137F65D5C1A0AE5E10961CC392307890FFA8C
-3CC9CE5B898812BB6F0AA59557E352735A2B11D6CA98017C7C118D1D460585E9
-C6A2C132A522F0632B5B66CCDD2572EE7378ABD5EEC211CF82EF19D151D290E5
-0A0B3328C699746960A0A7BBF540E6F6CD9544581D879186CA576E3CC0164930
-264C26785042123F5784D2CAE377233A1387A3B4F8D868B40171EAFE7BEA628E
-7ACC740937076C878F76BB8EDF36ABE98111D319AFF427713EF3CB8F16464228
-C083113FCEACDFAB97AA3E193E8FA750FA5024B674F63CFC58073BA959137339
-4B6958AD894CD17C4DAB82CCCCF154343270CEE203E13322D3808321FC02051F
-90CB293FC80FE9BCB853738AAD70563E124CB39F9935AF590ACF3F5FA8560169
-2572D275F36192A5ECE86B988D6133B0A1745D6D386937989850DAE1E62D09CE
-7D24EE2066814DB161F6103247EC2E8E065940F82E1E984942184E68E556A120
-23F52C75017514BD176AD60F29DB768E9F1B3DBD72C89E895432C39D2EDEB089
-3692507DCD57FCEAB7031D391E5CEC454D5266D140D7EE0CD151F9CB042E044F
-FC95CA7AC869B4B04DCE1AE9D5202C36E343B1A2AD786F5B7D0F1AD1E42C4C1B
-6E6BDBF86F022D90840FAFD81604C02689B3550AC41AE36435B29CB823D255E2
-EE9BC538502D18ECA40E1F340D0E9BF70C58E9C775D86DBB6BAE3D3EA1BCF920
-6ACACBD4D2E960723EA3376AB2B077010C1E685F759A56E9B0A84BBDBBD9A0D0
-FB4B0806861C272DE667F219D8645EE294FC321D8E373021BA63C1003CE2D689
-D5855861A575696ED7FD601D114E602735DEF72049400119E933DE8A1198DD94
-8457A24FBD19FF5D21D169FD99B6F6F6A2824F8D1653A13D5BBCB9B11E36B8F4
-2F9DAB2CAA39AA9453279F8D222EC4AC8114CAF0F7F58736D457BC01DD915ACF
-7D9B4AD3D90F93256C4C9E41CC15A43B71E26A8DAB324639FCCD3E082B580CC7
-B7F2A695D029161D2F3A2A8963EC8BDC0E6D256BA06F08B6D48682CC9ED169B3
-58B063D8D7265C15B59C3DC91EB307F33FFF73C3101AF250F3CCA40A161FB3A9
-B698F261E9F7299F2418D1DCAA1400F7BD3C74AB55316F22593595649F3E9C26
-6F903C6C0B74D96CB7F92CD33D610F0AFDE14516105B49F1A43BFA558BBEF71C
-2FE095E954125172B6CFE4C6390F701738232605A38671424723A68F13F2B94E
-2FF970C51633660D9F5B00FE64046C85722B40515F34E44F32D18ADA4C85315C
-2461D81D8F34BA7B13227E865B7C24236A16D9C6E1F428998C22A43D3D0332BC
-55AF05204EA352710B199C0F1F710C96C72370CA7203A2882310A629995B5D78
-D57D695B654A718C5268E9751C7F848CBCF87776ED10DEEEAA32F50769CF5BF6
-58455F8CB9C793290D7F8A38320743F0E87CF2BAE8A07BC2DADAA9F61ED6EF01
-6E24883E78AFD03E23D3A9E77C62147447BB772B4C80C1022727A9C863CB8A7D
-5C54C057BE3E148FDF79659CAA77229C438A163D366F5CA9F857ADF98F9377DB
-8CA7CE8F361E5A553B4541763D9A6102467A059DFE0004C350EBA6C8FAAD15A9
-3C68C30AD52BC1496C4C214B5ED4E537C3B25DF46166E1B22B0185FBA3F9507E
-7ED64C77517B077164E6661D73E441ABBE1BA0F68D8B53BC8337879EB8C08F47
-A579D32D0EDCCD91CF143F05CDE56B87E1F2868D001648513BE0FF3700732AB6
-CEC0CA78BE25810FE125B5542E407A984E758EBF4A3FCECEA2434815F64425D8
-C8D0862CD06D88B613434DA7CADDD3D6D4F1739E744B4DBB99C08CAD6112F0E5
-4FDFAC2B8D0D75A7A7AA5CFBE2C3966284E9D33CA71043357CB951808B3453B3
-B140807FBABE8F6B89A99B329D84E21F14F5D0022C0AD05D24B00CC2DD560C03
-AFC9AE7BF337FCEA66C41BC6A6D3768172C30F45DE176C1B4EA57828702857ED
-DDC1953FD25CC900941214ACC73A8878EFE63AE700ABEB0AAF8113675B12D8EF
-E370EBC067F82917498DD9A5C6B080AC066FB0B209C52448CD68713AB98D78A4
-7ED37127959969CE4C18D686B8FC5312BCC6B5F4B375DE186E927F42AEB377F4
-E96381BF6906E4A24328DA33A3C33F00C7034C53B10CEC70058D312D3EBDF1B7
-C81E0972E77259376669C71141162CDE55F5EF7E4A8A95A16AEBF41D00740055
-FA8CADB6CCAF1BF0850C4A11F905AD3287BB90D66E2878C58F00A71DFE1334B3
-3FEF4A33513070FB9AF215BD26E039563DF3BFD597B8723545C52570E863DA43
-8303766D7B0CC6EC75676C77516470F9D83908C0F91AB5DDF2041BCC68B1D3F1
-652153EE95DB246F151F63D85410B6B5FA265937B373A085AE2C42542287C17E
-7FEEC7246F98BF641ABA0006F8658956222A9E5CF6605A3A93E5C0C97F43E679
-321F598CB94963C49AE48BA497D99B304D53F40D605D17DC12D966837825B070
-6AF66368D569B2BA9FD4066A155970E0A9BFD8F9E4645A41EE98391C5A2819A4
-CA09ACF8A056B5F65A4EC08DB490EC4BCCABF6D5ED8DDADD250A704D8D0B70F5
-D54C83A4E971792EB7A807172475F195836A9184EAB13020A8924232C95C8C54
-5852CACDC34481E182F98C3A3102EB6979B8D81A2FDA248D74E76B3C8900D6EE
-9EB9AB23DCE457ABB1829C514F5AFBB43435FB2B4E83E6FB0CF79F24E93591FF
-59AFC759E491A9B569A1B1EE3D61CA858357BE7215484F4504C6098EB705BA7B
-A38C7B683FBF36EBD39987C5447C4F5074893D934C59A056D72AE4F0A363BA09
-EAC3C4AB6EECF15BAD98A0201CDB4F836206F64FE1B84E590D6D4119D2F7B548
-36A2B3EDED5A8BBCD95509EAD11F6F43FEC653F131CB4AD546A6B7096353B016
-FAE4C3C0C8AFE9E541291104425A1DBBF7091AACF5F539F29CF261F27DB2F2E9
-96B170EBD139D7D9BD009D6DC3EED26EFD5F0FD4F46F590B3D218F0F54F324A5
-C4FA31B4DA7340302287C8A3F2417F02C6324F2EF4A7BA2612F343EF11A4B4D8
-C3D6CF3DBCD272010AC01B525420CADFFBF2341F22B018515D954AA24E026A00
-AB3B5045E73440ACD6A2957BC5835009A310C7C85DA385C498D5D847469563D4
-146E97EC0FE9F8B5244B6F9C83B6E1DAFD109EB7FB1AA5AAA3A3ABCBF4B4FD5C
-07B5524EA0501EAEC5D280688D6FBF1441317C2EB2DF818120427B4FB62A6AB2
-68FB208350BE986F805CC893E6C3F0B2936152B1E7E19001913C0A9F821C345D
-6873A92FDF009CF16B72FAB99632B783DD3EE5317C30D3363C10569FED1519C6
-78F6A2343B3152C4303321F6E2158C040C7877C7514F30A15F052D3C0EB1794D
-17A5BA81039F0B0F3CB0093CF6FA0D7389DB279018806C1957154952901F41D5
-C9786A7C0EE76E57189A58925CC11B9F79C17687198674B2CDBD77AF4E0C528F
-21E588FBDAE805AB5ADE20E37242C55D6ECB9574C82A6044BBF8C649A39C5512
-D500006733919C4FDDCB5BF3F586E6C0DADDE28524039187CD1551FC7E193DD8
-B912AC9D6DAE8B1FC859C46D871FC08408E2ADAEF7A361A47DA2DC64DAE45B96
-AB720474BFE8ECB8A524FCEBA21ED5A28A01F90F6D28A7D40A4F1A9C2A7A9820
-12FE8B0E532D637F1FD9E939F124A8322AB92792AC25B2C6D5964F54FBC0E882
-9B4BBDEBB7895CCC4DE40159121E2BBEECBEFC1E83E2C386654997A9E9947B7D
-38EE4C03C5145167E554DA0A7EB0FC8F4B80D822C321D7574D05A1289494271A
-501FDE3325B7C87E1D24C34E08B799A073AC8361C9D49A02B564126065A7D550
-07E36365337A08E65AC7130BA92D6C9B97B12300F2C8886F55EE9C434F7768BE
-5B9BD13D87F2063E39747F10C2CDF8A60B9196FCAAE79FEFCA552919AE988A2B
-B16705FD84EFB22DC538ADECFCCBBE8E1F58BED0588678CE1A0005FB3F5BCB82
-E5519E9D23ED670D2D6BDE06E36D0EEEE7D78F99BFE25E1A89145B138612C8A4
-90D0B41453AFA81C62DDF3B21CAFE3C9807275BA3C5A25E74FFBD61A092958FB
-CB84C171EBA5F91D31123B578780AED7E074BCAE8DEB9C10900F2261F198ACAD
-72621D416CA2768A0851FC0F5483895FC84FD629F1C32212528C966DA662FE7B
-8DE8D4B261723F8853A5BAF63276EA472698079F7C8E09908C614A0B8BC680F5
-9EBD5DEB3866EE4DE76926BC31DCD160224A056BB6EB98843D2AA129A3B35999
-3A31A60727B74218771BC7594DD1494E8B385F037F1CEEF0E1F413507E89F426
-A88D4D599B8B7D40E7C90A2CE00EC61E35AE94FD68E165AA4B30F3163DA0B493
-18FCC396151A860D96AF51C1BCEBBCD15C711BFB5A33692D7FB570F044386748
-6BF849598D52C58F4E963263CE9A9F64E8EFABAD9FE77B69C1F62A418E7DC918
-87470BE747148D5D3B5C718F9F49E2F398E7A2CDC59216AAB2F16FDFBA741F9A
-9E0FDD43CF376DDEDC8FE833FE4CB1D5E27B7CF160F2F22A05A117F348B632CE
-B9C299669607C6A08C86187B78A6AC4A70C5D6A204153B346D2AF6E4DF9175F2
-31607B29E99B5641BF3A818AE6173008066844469A0837A35C227DA9863D9ADE
-DD2314224B8C3296B93D698D0B5F980EF4E1B62C30EC9760CBDBFC0277A242B7
-CE7989E0BA910E13734EDA04992F06A0A77E8B20C87EF6AC80A2AB7C7FEA5768
-46D2BAD6C8CF1D70B9CAD91EE7FB2F88562D6280C12A1B4D32FDA0A422E248CF
-220ADA5A2AB5597B312386A58F8A21C3ADCE6D5FEE3F9D2A4363835B07527BE5
-BABF7FD63B05217FFC7ADCF2EC311F6B91AB091C6C963255B4B8453897C5D8E4
-B67CEA88C09C23A3FEFCA3AECE9B7ECF02DF65A99750A337D1FC2F13D198247A
-D892F0D9A6A06265820AEFABB3F0729AC4AF8062B916DD3ADB87121EB799965E
-A07438A72CED4E5320E6706DC2CE33BA6085DF0F9C788A176571DA3501A15929
-C2214FFA20A0470B9CE8952CA671C1B717A57B48CC839F5DB4A6D66248D182FE
-C6D0C89A8CBE513E0AA41595376F70DC4EEA7ECA38B8E44EF6BAD64F6C15103F
-A7692126DF2BB08AA38C4B90DD6C39B0B462A4B37729CC59B85105D5C6309749
-F1C93F8B2EF214F2CBB58922F050A80C2EF0F7A0D332B5F5D0209D7EB3779828
-F94760FC65E0F1547CCEC5159B7F751637F8A73FFF9860547CDC94040F432FF3
-0BA714B6665EE9F20A8A56C3D3E6225C3CF95D24079E41797913B7BC1869D27E
-32212E244C9E9184CF56CD15A8F1EA694C92FC45997426F19201EE37CBC2B24A
-A8015D92E29308FFDF9901CFD5061DE67D85AB5E9E5752356F4C98AB864AF589
-389E6B85C439670B28609810859B5EADD6173159903FC65125EE9F444ADD967A
-CCB73B5C4E153C81110C5578C552D914E05DD3A18395087CB147B1985AABB2A5
-A2D97BD3D050EC2729E4B2E05F5204C06E266F552ECBC4472B0710D7A431C3E1
-0B7F89FBB561D42487527024D0F9AAAB4CC4233DA4900FABA883A595CD445101
-45B5F4088B21B546BCD6C0D6B757BD8114A7AFBDDEDCF923016671015D3DE3D3
-3759EE001C9828684374E20D6EECA756DE290F6A020E09D8C411353231FBD7AC
-E02EC25A5B7AB5C681FB95A03D79AA01CD91B0F58CD3E3C723BD40ABD4B9459C
-4AADA21BC33C4F5161874616818BE67923E3FD3D65BD18D4F90691F491B4EF3C
-34DBBD11D03D396A086FE67F18928C5409FC0298D21AAB0779CFA7440FD3A083
-7C3414740EF7654EEAEF51253FEAEBCD7C0D5958E1EE340A298902E4B23E5BA0
-AB47D6B8A41DCE006A4E3671840A4C077E9E948AC9C1FF7AE26D09575727C2FC
-8A2EC23A7736665DC4AE2BB65B475640BE71AC6D66BA0971128E7840654E715B
-EA8C8277C1BC221590A283EE764584DA9AEF65CBB1E52CC41736378F1E294C44
-0701F1977AD8F5F8F2D060DEB4FA32D9D9FC53408522F74640D3444BABB39209
-68C1873D6E0C0E3E10483D67CF70570F55FF4A111F0F4EB54557AAA79115E31D
-8D682671241914FC07D431201AD76319A849D53640C5E517AF616A157A056CF0
-ECBBA141AED25FF648829604626D52BE98AA9B29EF2E2382ADCF9704D0B2216E
-D7408C359B159E84389B5454AD8E10E4C62C592E052590DFEBE546B02E2C100B
-599FFA2942872097FB093540BF7786E7D45A8B5EEAD6D1C1118FEED2635012CA
-178A40DF6F626F6596CC773954472F5D4CBC310CCC041E384304ABD270BA8ECB
-D04051004C71FEB557C434CF3773FA9750F5C2757B7F1CD17DEE48B1437B59BC
-30E690522C3045943D45EA6E51A4EBF8FCC557261689C562BF8705780986D2FA
-C866A3FC22F941DAD2820912C97510B1CBB1BA36839EEF82DCF7368E382A4EFA
-0ADD7FE767994941E9A5D7CC44570DAE3CE7A785D65AE2784B079BAA5DF1D7ED
-C870EB560B792467C72C874601061E0FB3BF003101EAF8BCF7BF01F6DC3A71BE
-32D391649160BE738A739FC07BE94A0241BB41CBE04A5F794C37E2F5C258CA81
-9126D73B4471411D4251283EC936EBE3F8C28EC36BA0E38FD4136F779635E95D
-8D5E5C4E14C680D855DDBB8C1F90FF30BDC971919C7E6A93074A36D88561114E
-6C999B1CBED051B7675B6264E27EC4A015CDE54B0A986250A21271BFF242B675
-9AD36175B01E120D43F8A60FEB9DAED5A70BB4FA975450097B966F1C95F2BA44
-3071E1057B6996F53199879DF834EC867B161334FD281CCF75CA1480F04DDC4F
-511E6EA992114990629034D590C97A6409B520A5E78BF118E11B2BB74F1374FD
-F3415AF23290A4FC3DF6683F1D5663B17260850FB1E307D670CD527E53BB2CB4
-40A4452BEE0F4BE7C62B0A7074A5303B534F3BBAEF96C818A3BCCC30B082B502
-55B5A82FC5E0C6EE660EF38167D9AFD853D48500839B16E1FEE13BB232D55040
-0805F63323C6D228E192B6DDBFC0A54C19C3059E16EA511F33278AE666C403B3
-BBEC3B9F435A9752984B43DC4DC6C5AED25A3D2E73B10B01BA097BCFD167D4EC
-937DEAF6D992D924FC03B53A70EDE75494FC0EC27A34EF8B637357BFE6081EC4
-9731750F93B4AC3D1B3B6FAE7AE7D71DE3F2C0CF4D734CD43DA41A24DA7E7C46
-A1E76C9C1005C0313797A2C620DB3EA13E924BC71B2916C308533834030CEBE2
-E2CAF5AFBC7FC6D6F0D12FFB290A461F7D262A1F620AAFF509F05705D48FCC67
-B143ECD4F2B0D61AA00A69B700209F2DE4988323112836FC1A75409516F86D16
-3D36C7B1E7C4995E19F0370586B4C6242C64E9604D541B1DBC252F782D4F5BEE
-A81FBFF9D7A49307E2265AAC20501FDE30BA6E9C949D5095DAF00ADAF7BD67A3
-77BEE10C62F19F9CC3B0763A9B1A62EBF43FAB15425E7D7AD7E29D9B40FCA346
-096549B43EF7BAAD35FA663928050E3E82551D502403105F7881257039A8D67F
-1B5934CB7FF76D879DC26D6D9F8DB1412E04A18CCC4E30600EEEF35557E73FF0
-B9583317CE899891CC608D3E5332E0CF05C754FDB2256BC946EE256607A1550C
-75907D32C995B1B54A243617AE98E2BA9C042B7ACFB4919970505E7482653F4F
-F780ACE9308C9BEA60C891C5FF175E108C45301C588D4636C09AF8D6AF016450
-F66E262673314125FD1459282BA9A0EC01A7305A8ACFB6FCC254BE58DF6CD19B
-98483D77048A3DE933F94DB60CB3D89A7404939FCCF918464032EC47402AB1C0
-DB66E1F48AADE6A3DA6D77D6124D75B84C5CF556AAAB07FCC2DB87262E5454C6
-4814F1933591DD4C29841719D334BB11281B94E5D44D234212C3A7A42C2FF04A
-9766AD45A1B0498D0DE841D0DCD7C02428806F6F158B7C69B92743892FC693AE
-4A147EE4E79D6F47017DB95262BBC9787D330D3A4A8A85EAFB909E197177EC4E
-F2DF74F543EB7D97B5EB6534D7BF16D16560908D8408777D96D88741604B2697
-67E91C3041645C0843815BB87E0C6CF3BE2F8244A24017E6C2114EF0F51BFA97
-15353712C0F388552A853B285DFDE41F352F5ACF474B8D86491C2F2977FDDB43
-1F00F9C05C87ACF8D9F9B56C3617FEA2E7D8D9195C2C553A6863C734145D156E
-FCC1D17572AAAEB4B0BE5CE51D10BD4273020DFF43E0F1FD270BFEEC8B2BDC3A
-F16B43FBDFADB690685A6891B497412EDC358CED9589836AB173BD20E984CCF3
-59759CBCAE3825BE4A428BEF168DD88717837503804BDECF675BDB8174DA3EAF
-EF5ABC8BAE00FDCA6F1AFEA1C03C14902D0FD9BD67EEB2F344A374688117858C
-DFD1AB9A50E7F4BE806C5C5BAE3F07B8A7F3D4F54A29187BC6C38520895A823C
-4B5B184FBA09CAA547CD661F6B4BF98E68A630D403D214374C554737AD7D5994
-81149DB2480176D618EF15E0517D56BA02FC995E85F2DBBCBD046F723D52903F
-14B617472E7305E9F6C223D78A2F477C9D065181AA86FE051F70F7B52A3D82F7
-ECF18D48DA8C17870E8B7E543470AC7BE549759A1B27F31AB30C68ACE22BC9AC
-E147F8C182255E7262EAC0D1DD1B8FA888D0D5CE9E2780C0280C519AD761AEB9
-C5C3FE40DBC65147F680F9D2F6B9AF3BFB5D075E91CF3A092249EA71774FBDFA
-FC479A7148B477BE528C3667F0C3CD9C1CB9ADDF4F4AC8F93E1FDAAF3FE1793A
-24F95BD0EFFDCD59298BA7BD8DD48A718C660E195C765E450380F771183B302F
-F5F27514863F9FC48CBC94306556B6DAF16D54F9CEA9C45A8D28AC6CE2CF954B
-771BD117CB67E8F93D933BD0693AC61D82BA1381D51AC427425F8791B779AEC6
-20AA9905734C7688F1B1EAB3F1F713B14883C48EBA0E91A64C7EDC850C1A6D7D
-186F405C48125A77377DE45AE05B6BB2FC42849EACF6F6F9C003EA93D00B89DA
-79E540A2B9BD52113D41618D7483068F923B847718FD6C516000B5B51769787C
-8DF0B33977F61AB477861AB8D493ACCFF30D4F39511B0D9BFDE188FBDAE805AB
-5ADE2C628E6E047CCE9EC352CB63964DC90905AF18DC3C7874C337AD2184267B
-DF974A6237B97451A0C77410EFBB3A8A3D55643CA08A8EA2E0AC5F0A9375C461
-E4B343F80CEC40568C521447BDCE1A2E5D45408B47E5058D328C8BC323DAAE9B
-274E797685343E37583F2F631BB07A8B954A5124FB9B90EAA7E22DEE4EA616F0
-C65C57864A3AE70F4E7C09328B845F53AAB943138E005B560EAA306EF67AACDB
-122F74773D084FC0FE926AD1FC0C3EBC9BA82904EC2D6596EA65F4B3E4B5BEEF
-74C3CE3CD45EAC63D7202E2FB9EE03AE4DF5B30E0C78AA18F38EAC73045DF537
-03D558AFD6CF63271F3AE844614482BAC4A34CECBB873F13888C35B29652E763
-30087613B8C3CF47008FF0C2B4DCE7B4FB86D0B968AC4E98882EAB48F41F7197
-9AD42A9C46648EE7F0F270C203E125C92CD0FAF9ADCFA05AEB08A69DCCB712CE
-75D6B6BE60839492D18BA28DA2251A5E5D3D9504100501B32AB001F5D4AA2991
-ED06C8F063F93B888D504C5596CD273307730460EB46BC5FAC040123AE2837CF
-59E9BA4C2B1E83412CE3F9CB5E2FC7DB0D15607276D93B3738C549619B17C0D8
-357FD5094A703B74DB8D61525C3FC1DCCAD810F5E5278897DEFAD47FE30350D0
-C9D3D830D5447A8E52AD2DAEFFD2279EE01FC95F4C38EF18A6EE079727FF62F8
-7F4D2BE5B80CB0B14DF3281A312EEEF077584D7FD2F0C06B6047934D745F3396
-AA7ED80DD3B1E3D1FA27D68C68F1317D30FB14C6D9D5F31EEC05578C08949A0A
-866D434E4C62087DC082C036BEC3F9DAD2A26BF89687D537B58A9001CF3324A7
-75022AD2F66C9F4200A5EDE0314190F6638E8F7703B25C0912681695CEF8AE5C
-E0A8D860526C6AAD0B0C3CA9CEABA721C69D93D5240F186B849BF50843DC098D
-9F57A70E3B2F0961B304D771FFBDBE2B5B737FFCE21DB8EAC51594138F63A104
-9994DB21D186FC4C317A14FE9FE9FDA16B9B9B2F94E1E8A9DB232DF8B23C3704
-53164F61CCC22789D30C7145B6FAEC3D0501AF29B4FFE749A091BA859EE5CAE9
-9A404B19E949311CE275101FC885408CDC12C46AD88F530DEB6FC3DBC7929613
-C5FDB899B93807527A6CD8842B09E701E3C2BDCB75945C4B2E473BC4DE2C9B07
-5DBF4243D35E70B03A26DCD0EF55282E7993032441E8B6EBC5EA8923931B48AF
-3A9618E3E6759C2CF32332BE904D74B41A46B53EC579A8CD490E2D94BBE4131A
-89BDA47D0809830EAAA4C6BD50D146AC79909979E5716F768D1D95919C6AC4C1
-A63AF5CFE0C31F4E8CA5BE704EB74876DD3E8BCA2CC14DFF2C6D3F15A5A66564
-2416789B275E6FDC2E93EBAB3FE9448FB38AF02F3D37D1C9105B03A49DB0A86D
-275CD3CFF32C1250335100991700B0973F3D5E54C39D07D260C2FF3E054D2D5A
-728CA8DF72801940AF4F129FB2E5C4F32DAB16258C3DDF41B41334304C99D25C
-D164D565E687B6FBAA406E001BD778939720B725B29B0444EBB2E22AF08A50FF
-0C00EA68F9D4EC2C0DAE1D0CEDDB9C7417A413F5173326DC5CB8275021CE6F04
-5A9B58A4D50832A861CDF9C9D31525D35A943AAF66A34877DF57FB6B156AAB19
-3EF93C8C4B8394FC0A51732AF46FEC3497D2D84B19F64AFC3BC52B054231D5B9
-A34D45FDBC25501D52C6ECC63492962B685FEE3BBB6C2DD70A84D704CA35D745
-467E73C8E5B6A2DD66C370D412525628174D5E10201C84C9C4DC77D0FC4EFF73
-293ECBD31C01A74379DD9C4F90EAAE5FF84ACE13643356755405F66C7361A2AD
-8600BE9E98A52536FFA517A2D4AF896663E6B930A66E2DFFF2C57D4D7A5C9F69
-F3154F6F8375E9803060CE0D4C45AF6475E53920957BF365961DDC2DF476F74B
-5149BD0687AFE0786B18D2BACC769E28A6E2E8BB1E3F284992AD1F1DC058AF02
-CC94EE0845124DAE980E6D9ECEAAEE1849027B0684DF492F168C5DE0DEADF4D8
-9800BAEAEAC9168846D852C49387968E86D65ECE24D6AA3B60A64CF86484DE06
-F540D5FBFA86BF810EF5DA04473E8E25345AC9A12424150EB621CEED8B1EB090
-C76FA51610E7CBE23C6CDF040AD880B73F3331F85824319DDE430C00AD7F809D
-D408879B1FFFFDA10384BCC19C8F3499B63C19DCAF99A5D0C2A948A7CB69E094
-5D3A79A06DCD7FE2122D3B3E646ED2032B8F82DBAD82A8563C5667A5F015D31F
-8FA8AF22D4728672AEED085F88DD7DE8BD13B0E7D0306969AF29AD850E149889
-2B4F81D1592CC36DA27A29097B8F720F477E6F9E26DE7C265A54BE07E036B7F4
-ED5E303876C82496C2C5396679DF6A91802452F079AA8E653D13438B214AB47A
-282D714843AFF0B74BF1F72C4F7EE4A012EAEE04A82AD8B2EFAAA33A87977644
-AC4F6E5CD474A6C8B08EADCC1665E3FFD09C78FF30CB4929CA140E04795686BB
-C985F7CEB0363FA650137E7DA8226A45810CA44175E66ADA50A0743211D3FC9B
-11B4EF4B5DED09A3CA69E48E0ADCFA5EAF749DF18AEDE11F9046A8629880C9D6
-38BA9498CC17F4DECF25ABC9AD80335ACCFDC534C82A9A479EC9074A1D9A01DD
-96D464E1D630688755587DCCB5E8C1AD4032B4EFF0E645E2E2329D08128E3D11
-C8D22F4CD4E4783DAC3D6BE9AAEBC2F4AF3DDB05020796C972677AB90AD7E8EB
-9FE96669A4615BFE4BB77CC787C941B7A0FD430AD5B9D7B63A26E954A28F60CB
-E380AD0BB4724D99F3F46E73160555A2BDD7FF5BE83A2312F7B04055EBE5B2A0
-08FD96C4C90DD9A06DB0B3D5F570E8CF4E9FD7FAEF7B5042A5513C1988E63ABF
-B3C8E1D8704041E279CBBF208AC23385E97A6EAC8BC634E3F9BEDCB3EAC4C57A
-EDA544E06719AF5BEF69257CCA51FA7840BE8E21F66707EF31300DDC70717F44
-EB2DF6070007E7B93D1357ECF8ABF097B757524E92D31524638E69E63B2DB200
-4BA1E338B284936557D6DF04AB23741BCA5CE6B34099FCBA07CAA9595DAF1E8D
-F10FCA58FEBBE12F8E2FE6A0680EA5E6CE0CDBF9A1C872621CA4C10AC91E3F55
-14C3918E1D32A2078CCF4D109ACB79C3FC55E3D222B9BC8E1D0CCBA5DFF91B1D
-76367940D4CB4CDEC260F3152E03A86FEF74DA6A1DB82522B496C177A77EE9C8
-652B0B6DF023E60401AD8614ED9D77224D822F4B961EEAB6D9911922311131B4
-49167FEAD3E3EC5E251618F7D1986069847C7F1E7503E04B48DFE249135CA5D2
-8903F8C25A141CBD2E7117332EE320DE0DBF03946FBA0DA27F8DF4AF8771699F
-696C489E8AA7EEE92B7824B5A03D8B297F9C606E64BC376B10C5C606106CA8C8
-B764BFAB04512AA9510A361CE189858A9A565276CF007EC6BC1C7ADCD6C4CCE5
-CDF512143002C6C2376D3CB2624095DB10CE42032BAFBFF7FFB6BC8AC5EBE973
-02520AE31D24A36AF5C897965EE3922C280FB056A36B802E1FD49A7C590F9A3A
-2D699F0DA5D50F8EF5C01779953A5BB88EEAFD3DB8C428C6514146B1B55348E1
-E2CE1D3D4A13A84A240C40084EA97B971EFA414370BFBFAB6F6342425A324388
-7DB7E4A7BF1FB654BC7DCB56C7E1FAB0848828B86F5CC8B069055B76986391C9
-76CCF12F945173646F85C1676235855107EBAD75BDA3CB3E655BC81AFDF3F629
-F79687F72BDA04FBF6ADD00F9A1F21C0007599A177F46140D6004D06F6CDA03F
-F087938716D4D6B2806985ADCC344B17B976547AE0F745FBF4B8663EE4F39196
-4B21F9AA8442DF78B1BEF23166510DBCE4405A20DAF5AEB09C4ADBE05169A52D
-839BA7B8CC777A0E4F685686F344716E2AC2940282FBC795966BEB564B018DD8
-FC56F588AD42CC2630ACDB1957CD2F3A461AAC09E95A549144809DD7533812A5
-7A8BF8BE337EB618E11D24B0B2C34CB39BA93DBF0A588DF611669ED72B92144F
-FAC3BE40B7B1E56B38068008B17DAC0C6648E5868A965166A798B9C918B5FC67
-E60AF10D6191FCB156411ADCCC75010D56E7A87C95F7C1CB33EAAC7231BAA719
-B927473D40BB980F3E9D304567305A653290423E74BE544D39BFE92E0CE23BE9
-0ECCBDD14E74EDC3C19B121128E807299C64E68391F13A96CB1A418A450AA9C0
-982B3B3CAC83E11C8A6CABC01F5F358F2BB79578D8298FDB47151007756597FF
-0574F3357B719AC0E368A14CC91F6E65108FE1AF6797DA6AE4CA52E1B15890B0
-888D8082B70CA6B7BC5FB7AD9262CEA6FD18611AA1D7378735E923A6A45D1869
-81801E21906A4D73AF8D397B6DFA28F52355FBF16BCBACA72DAF170FE4CED247
-F8A80C1CB66BD33BBE1AD30182305ADB2A88BD5F9B435B472AD6564845EA9CD8
-84738801D498CF826C540664BC8E87B868C982E49D77916CB87E10AC669FBD19
-2CAEFD9113127041479C98CF1B2987A45A22ED99B048EB76AB183714E069D51E
-6DA757A9A4E17E07AB37FFEA7618ED5E583F4910C7EC87042E8180DDBA7CF58A
-B8417BBCCF198AFB196124807215030A9204771B3CAFA90876A5193F954D73ED
-F0BAB43D936D0617D804B6B2CACCE9FACD2035141808E583A6E4AD03FC1719B8
-7BC89A97156B32033B9A3538E348C8D7A59183132E9BADA34F1E77B2FC8CF783
-3ECF3E24FEAC7C7BE1E236A94C9C44CEC78DA17D4D33BEEAE1A76CB5D4F0DD8D
-93E332D493C6D6ECE0FC03CBBD275441D61AF9A42443355A369A0C495CDB74E5
-AE071679D9DFA6715543D3FC1B6E4F66E5557428C616047C498DA9F50EFA1683
-AADCF6B403F0EF9A78F1F8F1ACC478D0B5B66FD60322C5AFC4C79557998FC714
-41AAF6009A53424935C0EEEAED8CB4513D8CF9AD3B52CF941989591FAF2696CC
-40F1887F8EA77AEEDF67CD3BAB4BF1DB2E57087D50A1F5944942CA5CB7085240
-1929A28CF489F26F59B850FC78A647287740EF2755A91C7196E4A53063C42BC3
-575061B2CC994D41EFA131FCB266A9AD1E18DBD854F2B99846EC903AFBBEAA98
-B32671B08856D84FBB7BCF5B82D245F7DD6459CB437B4183ACA555B4B274A63E
-158F68D8873925660D260B4C7884014E735B72EF322D646C4CF5EA4917CAAA18
-3FF6ABC26D16ED118DC4F1B85B3405A6EBD15C1A186D7C7A9A8D22F6F03B5DED
-F11167C738C758092C6BEE44D03532AD27708884E6F3EBD040A906D59E81FDEB
-BF0C0AD4030D661DDC3048CF4883A59C362229EAB078978F7E62B9AFD9E329B4
-822CCFC1DCBC7D0714E5EF2B7BAA7126894612E5D1F4CE7421DB0580E8C3CCCA
-BEC8DFD6392E9575607C895CD9FA1D78E92B634D62F3FB5DA75BA65958F720A8
-C0006A580F39D8B63D7351BE480B24B3E10318BE8780D486D3AE2E510217A5A0
-3936E396AD22D01D611DDE5F0F5140BB003D24599E9238397939ABC3833B8B79
-5C2B8CF9DEA9F3DB71377EA34DFF4A7062E91BA9E090A815AAB4EE3CE94A4619
-488EB722ACB22B32C391633A9B6BFFE656C75BC7A9DEF0E02CDC56DAEA9597E9
-360562717D81560E24972ED5E8C9CDF7F54B30792829A9136D2CC9B1348504C7
-A2F500383EC033F4756FE20A8EC0B1B0643F8644C1D871AFE21412EF88BB7497
-C79E3905528B6B2F744B9C9F10988BE7D061F5A5F56C72EBFB94A5FFE994A2C5
-D0BBD6F79F2BBFC9B811D6B4AAF40FE1D3FA6DE3EC49E0F24EA9490D6E3F81E0
-B56FC8B4D6EA1A0E899A9C1ADE24693A6D7E4C214D0847E8C0D5B31FB133F4B0
-F77BC331474486F8E4A69E970054D0802BFBEFA856550D95FC2CA900F5D6D3D1
-38A892C66D541937D24D9FAF5F54F169E5E78BF181F2C2E2B2E2B5D6E0F21727
-1E420D2E69203BD76417DE9A70685382A0F3329FC26C671537CB07764D1165A7
-6E4403882716938A18DEDF1292F688F657E27FA8E5D86821978DB65B0166FC49
-E7CD5C8D1C6AE1B78EF02E8A81B51B20EF5BFA1EC1F2B80017292FBB6168CC82
-871CA253ACEF6AC823372F41CC766617377ADB19FD677C46D7CCABF870DC5DC5
-0366E0A5750ED38A2A86811F9852E9878A95D3BA0F6CE7FA2670480B6523BAA2
-ABAD6A9C2D43E2BD21F2EE7222D21DBC394EF4CA9FE693A5A77CEC2EA60645ED
-BA3BF1ACC360B253C970F7BB86281CA813563CDEE08817DBBA24059FF290B550
-4F803469E990F5ABC2F66726E7D04E00D8E634CEC60EFF5FB69ECCAC20C2986D
-65F5ECD610BAF2EA2AB937056DC724FEAE337F5777258FB5462F3C94AA7E94D0
-FCA0B0684F884D7EC6ED8BFD0AB95BD5830CB4ACBFE139AB0A0C1C288A318B59
-A9A3E79A5D1D8A13ED7F632C7E52216E16A331101EF404489B2B095C0F787063
-9370950775CA15495982D882396417FAC4FF86355E203F53B33F35D4A5175EAC
-A78FC91C980A6AA5BD49D87043C4686B224D0535C816ADD1D48BB45EE7529E64
-0EDB35B4A27C167DFE994EDFB41D9D166802E37318CB6D4CDDBC73F7CB30816D
-E9C645E32C1B7513199F8D099CF39BB8DD762B6A947AC26242B3D51B11971F72
-DA4F942EB19C883CC0749E1596CB89A1E6EACCB35594FD8E272F1DB7529B059F
-FB204FC404789EE182D117AB303A886EAACAC08999B19367801BA5622F5443E5
-1EB2903D603F215C9355DEEE42A5DD29C5CBAF1BA1FD52B9F8E1FC5DED7DE91F
-34A4461661549339B595FEF063BA44CC0DE7428E131CA38106279246F5B9FFAF
-B127B9B46B1F5E050133071924005746AD3D6AA91E4A0E75E5056AC983A6141D
-D3DE44D5B37461A76EF6A8906210456F13FCD15203A80AC071FE10B2F064145D
-0C7FCF12AC9EDAD42EDF4E327FA57D6BA92607F41B7E34A7DD27945B4AB2F0EA
-532AA886EC057F98964EC0CC1E4BE095ADCF030B1952293B7B6465919A833D52
-F24EF2D9BEE963F7A33320CE29D54471526D4592CB09B0DED834AEDCAE0B629C
-5BE4E13337BA87E9D64D744CA5CE709E528F7BBB7C35A3444D643B1ACDED2F6C
-F4CE7ABD757F477BB4F64459886814743C8872DD2312EB952D5DAD81B0A6E52E
-AF1915A81D5DE395BE25B24412ACFA3C65B7E447BC4B801B5531218BCA18B0B8
-D72809B5B3DC921B2BB0B76B91618064F45F614C3B3E0506CB24DF52FF8F2555
-6B231AD0088DBDDE51908430A8102E0246EE56870D08C960E00B9D49CFD7D751
-697625B30027C82D4B3AD0AD5CB90CEE2A2FF301608967581CC45FE77D67EFFB
-2508905DFB42A0C335D1FFF2FDA1DEBE81C39628F53601D9ABAA6211D044F930
-70378306273D11DA99BE820BFF208CE0A7A81447056FA422428A6A21389CCFDC
-5FC34E06B4EA5D9C5DA9AA401F1733E2CF6669B438134AF47130FB9838208A83
-668067B89C9025CC059E73C6B4C332E1D70BA59A83EB7E4407D000167DFDEC42
-8B86B4B1D5772DBC673CE5F8128858E46EAD3A675BB5BACF61E0D1114D5AC0A7
-D4BA9FD5C37FE37D6823A517F39B1FB14B01E38597E51BC93CB836825ED1A3B5
-B841CAF361302234A2C3560FDC71BCF6D8832A1D74AE60806863BC1F3271640D
-73A10720CD078DAF15652B50716C0BE61EBDBA0AAA8A6DAFAAA327C69C29321B
-251BF50D418596E84DC3BE92542887BC0785F6128085F019C1FE9EF33E02A968
-DB0504FAF26E033A05C4C37E5946EC500C5941F83318E765DCBCD06D4A09B208
-56F226B0C8A9C55B6EB087C936F7237FB2A3D2A262E9C6F95D454AB92801BF57
-B5788CD2C0FBAAF274BF5A8BA908CA18EC8FB5C52368DDBEC42F9C3E6FA16AD9
-6D4CB47C2359309BA3B458BD05FD4FB40EDF6B495DCE6A091E780B328BFA995F
-869B5ED92BF513511C6DD88690114C5F3626CC6824ADD9E2BBF528158995DB9C
-08888D928E420016C254485603C49FEA0D26E34850843A066F5628509183FB4F
-78C3E0FFDF61E91C984D23DBC5677442559540A798E820E3F1BCC192456E9B53
-72F2EE0EFE321115375F0E43AB35256C770F5DC063DC7DD4CC59CECE9E7F3BAE
-BD474CC7AA33FAEB2920A44D78A51D3B75964A4310F30CC0E33018D3E365F947
-A69434C67400EA09F40706320D603F292862AC24A488AAFAB0392C470C84C912
-11BD82A3A5A3B70D3DE85F3095A6AB122A930F8014AF527B71B424D29E91123B
-0934BAA13F0765A883CED744E967B810EF265AAB4F7097A817E94C580068AF35
-C141EEBC26D24754BEC2FF730ADA142BEAD3DE4292E93A359E701D90EC594E6C
-D1FC795EE82FEC8FEAB7D21C656D079645F36FC9FC9D7C8B35B0BF424FFCD466
-65CAD025F6C31398018304AF29117430B8745D8372FAE966404129C8BDD5F31B
-BD827695C491C7E6D7B15867AB4C5DF488CB9628C6C8C114293337043B1616D5
-6F6B6C5F75238B27ABBB0773565A686BFAD3593BF53BA7C8272E1C597DBA0D6F
-D16517424581069689EEBF47641F9A0E3E7367423FDD88FDFCE78426A0D3F0D9
-942F66169B84E5418C80585989E407B5415EEDD8961BABB8AE61BDD51AE60BCF
-033F5360E7294430CDEB05DFB40C382D28C9834782B68F73FE9C129B7AAEDC38
-E3B6DD8DC041408FA064E0AC4EE68A7C07D96A51A1B7C65CA28951E38B58B774
-0312CE987BBEC2B3C6F20556F7E8066353CC46D8AF15DA8D7CEC2DBA8A3038B0
-BC09C733C76D095F8BBA0EF44D6C1E397B19A866364DF8EAD8E2E0E7531C7525
-8A6451008591A02C59FC1DAA7C83A3689A79037EB90522FEE181763D496A716E
-C01C78642DFFE2589D3980574220F09B144072E6135DEF2919CC852056C82B8B
-7F8EAC363D0D89CBDFA1B40505F3D356EE16E5170FBEA46B426E3D88FEBD8E23
-59C2FEDC109DC7A300FAC3EBA750BF6071DAF7327884D3C7467A15189AF18DAE
-17F6605DDE4E2B2F3AFC641503E4DFE27F462705B356F7C17E1AA0E3D26C56EB
-DADA9BF8B1E7149459B958001093DE38391374A78BEF8951DB54A69964525693
-63C5017ADE86C0E2CA89BB581FF57D0370F8AED9C95E326F88533E690B1C591F
-ED30E893431F6F615ABB187130634BDAF94568E2E17613658D02B29A25F35F06
-7FFA714B60A56D2E9D586D4A4DBCFF440A2B47B179CD456EF099A34A56AF169E
-5CFBC9C59516407286B2E11184F91EF25925C9274A6EBCA6BF38EEEA96E27616
-5AF1E9F5E84D9888F8EE35119C43CD7F02DA23C130A2D1A753A2D1E25E0F7478
-1ED3F6BFE62714F53DB12D15138189D0DA31E79F18CDE3FC84CD6D6B5EAF9E23
-F90A1703C6C9B435623FD375F926C8D013620432174B8C765299F6F08897EF92
-F129CDBDC3006D3755D3EB5D2953E182015BED56819D5A7A1773CE22214CC7D6
-0ACECC81DB66E1C6AE9AB70B77F6DABCC09111F559DF0911A87726B44AB063FC
-1CD60C964334A97E2A6604CDA700C112450389FADEC5DCFC12980381CF6BD92D
-772BC45964247E3E39D087B52FB67077AA8197EDDA4F613DD43D1A3EB7D6F686
-8528F7024C7A22B61A33E43502CD37E91605E0EF16D28A9A2806518B839433F8
-1802738E0B1BF0C7E95C4C1500887FB099834FE6DF4CD9A9D7547341A6D8CF21
-F49B9F8E7A9D602644B31396A7270C989F1A5BA9E3E225BE1F592D02D8AECA8D
-79C304CB010A2645158654387C77AB0083D08A3C0A41B29453908AC57C181431
-101C6EF00A8A55B6CB8513DC8ADC5E2D6FDF41990E6B3DADBB607CF37411345E
-42D0DC8AE568B2DAC69CF347B18C175C0E91CD34ECBBBF3DB1B5E6CBC17AC9F2
-8F77337D91885D14FDA32EE7A7367A3A382E8A894A9AD550DE350398FFF2BEFB
-C05BB7A915B8DC4AA5AAFECCBF716F518CC608E1E76588CC77359CA228596279
-F95055FB260502B1377E1AD575D3C1FA65DC158057E071A56D2BA3BD77998B43
-938DC18257C526FF2F9625CCD7DF0AA3D50730B35720E75777DEA2175017A503
-A49509775646DC8D8926A75D64548B9E9C01AC33502A7BE04BA31441D5F39CCA
-F889AA4D6B0CBDB9023F05B39DD7CCCA53608173E9DC5D45E772A3F7B4F7C4E8
-C3F7E7DE51770B2C887F14C473EB4F1A2FA420F64F4DBA1A6B651625F2AEAEA7
-8A030BC2B65BC4237AEE381DCD24B6E9940F39EF1D4BF81DA1A25140BBA7E1ED
-FA371277B13A016B264B14833BCBD14E6B3F71FA822CD0E1B174B569ABDB6C6D
-CAFF1A208C8E409623A051033AC99A06FE1FDA685CAEFEAB404804A701A702DE
-79EFA5F9DBE3587A2B8434BAFF152B9F18C574FDA77AB286FBE21AE741813B4A
-CEA10B071946CD4EC410BEDE7C68CD0B5142C2A99C836861A5B6A07FFE60E7E4
-1201B9966CABE2B10E71888FB8FC43FDCCB882DC2792994AE178B6129F23FC45
-32BFF56904E68A53B85FB8DC55D917C7DDA412625BB28CCD6A74273F5204CC07
-962DF7D462C57DF81738A8AE709F63BAE35532607CDDBA7CAC46F6789CE52010
-D84412E3CA30A0B8DDDE45A1E9956B4A7A8199D3177B5CF715A120FBA413CFDD
-ECB451EDF3DE65A8FC8069D4D1F65890EA6D6969D8663C5909ABAC85D4941312
-CCDE68C63BAE2DC990B6D119FB0A8ECBD5A11C503A668FD66168BD051E55CCF8
-D0022F58FCD3B6020A70838B97BA5A54436F41D26F4FB60EFA36F9E632BA44A8
-A21F57BD665EEAF35BA65A4F2090F3D831E14B9164183C0565DE2352C00C1649
-0796E84BDB6B679DA065AAFFFBFA67CA8AE9D024A3700959262EB552C67FC216
-E61CEE4ADF9BADF3A38B4A618BFEF4CE0F96C5C382641C99B706A9BE793B24F8
-78CD09F4CCF19795F93B8B35AF5598470124204927C7EE6D3A87E05F40626F07
-B9521BFD489B136B01F406BCAC98D60130A298C5C455B0B2CF05465D268C55AE
-26CAB1A2D4D740EF3D90914D334910DB05B5BB62B6863A4CFAE3834014D94C38
-F8E20C677C6A8B6BFA4B1EAC29EC87CE9E3E08C458219FB6B719089AB6982F75
-ACF33109F84FC1C7F0F542FB61F78587B7010265B411CCF63F00EE397C6C9D39
-2E33E50B1182385C79773956ACCB5970A8758638FE8069401540EA209B2D5AFB
-3B20D9B33A51EECF3D65F0DA2C2063BA2A2AE9164761FFB5D1D36F2E21F29F31
-D2852443F8C6316545C9D413F64466CD7CB3D0DC23B5C282FF5E2F91B63B7486
-83800E8CF3D07434DF16557AD530DDFEACF3CEDE34C7C4ABA3278E815297C7E1
-DBCBA8FA4291D43F1D1AF0E35B0E09A2AC97F10A93AB9F2510BB690E3C635D2C
-986179ACA326D19BB958BC60382A9E8C765A978A148CF02403C2C9866D78F05C
-3DCD029540EDDFE623C9F016734B8BC19BDFB039BFF4FFF409DFF33F62508298
-B152FE332127EEF6B236AD5C1EF9B145849788311477ACC365D9E5848626DB26
-773F93F0C44AEA8B014A5A7125D09E28761A8720DA53966B251BE1C1534599F9
-B246763A28D4F9E3C52C33670EE390FCCD476419FA1C4429B31C055EB8072D74
-0C1FF3311293F931EA7F73A35E870F6D81D0FEA3CC445C841BED7089A64EA42D
-947359421B7EBDB671E2E30306912EB99A754AE5BEC90783DBB14BB0FB3FBF95
-25BF143F7C9D9D6DE690C88CFF219075D9F9698D23A5C428F7418DE625217393
-0B79113E1D56E74ECE402015E0AA9FC320E447AE0345FF429359C48D617CC9B4
-6FBF2F72C9DBC94794BD9584E23F757C49425E7665A1A97CCB278AF1016E4969
-C813A40590E738E70C5B732537F477E9B80B3860B6FFD35A631DA0B6BC84E4A3
-8C1576C9EE90FE2E5FFF30F1ADB9581C6296D442FE1D3B3526780C5F70F73E07
-0233A3C769F74334BA6560ED81163307DC4AE74060B736C49BD83A837CCD7EF7
-44EC891EA5828026982D9E56834A3663150A462939E6557A5AA30C47C4EAB037
-589BC1710A9F042AC39006A5170B0DB0A952257D231498633D99B3D405C2A4CA
-D064E43E50ADABA18A80301460C2F17965C5EA3DA09A7C96274AA1915FA9E98F
-059358763626AC7EDFAE84B026CC16BF40296FA76396148C57F5C0E219B759A9
-33A46A922233E0AD0FC248DFEAD35B8B6EA330B97BFB4A6AA6DC27DF5082AFC1
-C17A6DED72F61D0C7F4DE52A3AB13734E55A875946F6D36703BDF1B917A758B1
-C1B4D00A52E890C43A7B8C0BF725F82FD416DC8EF9BB6E0487D7682F79DAAC6A
-C9595E33481A87C6CFED013243C5BF92AAF6D700006F608E30CF70FE9E9E0835
-255F9ADC616A0218C7D4892B9188C61C801889291E17344448ED2D8C56095302
-E71CBCA27D70DC38B8BDEBCD7109D47FC1B6E6399F07AC085BE592FF9B5E4960
-02FDEF5F965785540CF412743E0C71126A68272CB23128133090E757249854BB
-3F271F2DD8D7FA66985F9C380C104FC3A1A69A0CC03E2AE81E1EB3C7A2C3C297
-BF91DD1A6E2B0D3798C3535717F8046E92EACDBBA1ABA7D68D08AD31AE673BD7
-D10BCAF3324CC5A668199904ED903BC88746F2995ED2F5B1B49C73C34607C632
-37FA574A1F09D9C42789077425B8153E8F7F36589B1EB8917C87FC29A5E97E14
-3FAB4DA5EC20C38DE0CD0863683B58DA5C412A72C1BB8280A9236A1600BAC9E4
-BB930318B55E3006E5371157B1E2567C9AC8FD1FE196AB8AA86EC2A27B5207F9
-81AF2F85115BBF22287BD8A041DCEB89B3F5DAE811F1740D010C345F53FCC8C7
-BA7C7D685ADB01AFDB0D30CE7CB0E3BA122B9C8FA4F2CF4C5BB5793439E57137
-9D2E63B6132100B459F31D822AA742DBA61B8CDACE93DA530A66C034125344F2
-DCAE69E08FE774A5E09B29466898ED616EAE3458478888DEAEE12B6C1E2B1228
-A8A7C9AD6658D0BDA20DDFB0B4D831AC61CD216A60DE294C7408F7E34487487B
-B462888649DA65F548C6EDE671FF2967FE50331006EB5E3636EA8998384CFFFE
-0CE6AE5DF4E49ACC5574C73223CA5904DABBF73437D55E2353AF9F7B17E33771
-775F67FF5C53C5D45C40E60252F70ACBDDC054CB3867AF0BA7B01EFACB67933A
-404D56C53520278826DC106956E120A34A7E2B9AFF2B46C2AB3E64FB38776E2C
-456B5901398E5BEFC7CEFC35AA61E497CCEADE62360A0EE94D0273636A6CA4F8
-F144CBA6697FE4707361E09ABBA371A5FB8D8FDD319ABEAB87A5C3AF9889AA70
-B53E3C5A9565AC1A2F275EA303D579A0221004365CE864634BBBDBF5036CBE63
-3B5358E8DDDF56C65BB54A9FDBA710A10F9E6C505A2D8D11A6A17551616EEAD5
-679126F3C7D52B17EDF2AFE286454580A34F1BD963699F1AB742DF7CD9EE4D34
-17DD8BA2497BEE1933B02EBED1161165924F04915D1A9D227B719AD876995D88
-7C67DF53C14C7FABDC5B4D773CCF361BC58413765E7DD21A439E86B74795203E
-24ED7491AE6C9FD9CF3310D3FD1E91FD3F714013722CA2B13DA3EAFC49A2506B
-58B3B2984A1933CADDFDD10C628BEA54C798AA4E0A84FB4639494814FA18D79C
-147BE5E688F182B901F9730DA6C8CF362F915F69CC74ED4B436E5DE3924D7DB1
-6B4728BC39E8F9E0841865BFB0AEDCD7404D48ADE9EAE74F6C1E9FADE513539D
-9056DF8B2F6168A86405EA4635C19E128DB67D6F7323BC14A983FF1CE808B4C1
-F9226F3C6521310DED43A16EA768C8395E6584E90C5F24857BD989C1C6C2C248
-06D4BCD3C2E271C7AF22210EC2A3EB1A73509082819760E2AE9950D761828F9C
-0D1DE7B23A9DE64AC61F48D45956B5894815F0DE950FF02FD0A4E0355900C665
-D1FE0B411D4E34B093E17AA8087B606AFE7B2E909AED96B799922953C8416148
-7C3CF96E27365C3A4CCCD78849CD9D9D498D7747EB8AE8137B16178BB67B7B36
-E41780DE90DC23072DB8916BC8C778B79215212719A88744DFF9AF40980996AF
-379552BC08C8FFDF6605FEBF9B3CFB6D3D27D07C49554DE4844981DBF08A43A5
-DDBC572CAAF60EF7F8C4137C38B057E1AD5D953FA64E6844EF770A9B19B7E643
-F376273E028EDAA0729CD722C57F05023957F93B281F91510ACBD72F476572F8
-B66681AFF60DE653F4C8BFFB5A9076447AA5676C08828D7C6AB803AE9063423E
-3FC8F0E7DF5F8238EE36A7B8DBFBB88DFDD587D5C9133B69C6E4B86D4FE42886
-F0BAA809350CC835274614E4DCFAB77A8AA83916E5B65351273A69E6F9B5DB39
-205E3A62C2C4F483B3D8BB2C4C7C72E2ECB6E024A275DBD82F5A1A9ACEDEFF4B
-9C5175BDE3DC023253026E5E321A0F5867654B8F11076CBD6D49F2A7A1F45420
-9CDD551806DF00372B4D0426EF46BEA85816AB39246F38427431D513FEF9E143
-64F3A06ED9F59F1F0C250C9C6D45FD2B6C69375E9E0B89A4478A5EC458E132FC
-433E8A93D3497DAE9E1AA0AA7CA895B8AF67913CF0D13310DB883D388AE9A35F
-F5780A0AB6D55CD9B976014689C185E9455AB5B9697DBA8B9132C517133CEA4F
-CE40FC2BD4D9DE31A6A5F60E00C781F6763DC03DE8D159CA70048B8CF6D1EBB2
-2BA6966CF523579CF5FE324AC1C7C12A50A8EE71A55B3A6078AC0EE02E877A02
-18F886CAF9FB51F29D01E3F4AB961E5515454D05490F4C57AFFC4E63C0D1FFE6
-C4BCEF8F67066A4284ADB88E569F0E7D36269A6A0DA678CAA5C1B1A4BDD3800D
-FA3E3624A3698300BE00884235A996F611644E19AF114AF29E045FF2E4BE248B
-7BE9FB19B64B2DED77D5CFF8D85A332A33EF073BC94E30BD78AACE2B40C9E04E
-1E88D9EF0F0116E27E9432D461B64FD5F4055EB420963FDA20CB8D746B6AFD30
-4C70C4DD1AE440D04C6DE4F876BA09591D1A7F7F5755DB5DBDF1AF0FBB9744A7
-051885F2F13400F77297D66BED2FB53CCE01B56A7B0F7A74DF38BBAC0BB556BC
-9EF9F4FE429DFA89650BF6453FD1B6F472427FF2F91DFC218BA4690C55CD23FA
-C7E2B86EEEA984E0DF8ABE65813C6E9068B878F22467E7D981601238F82A43AE
-4F61CD56ED2C3828D7DD53AF88655ED8E00FB33795EB13F5A166626D35A94AFA
-3EA4331C79B44C8AD4E85E8A58248B83FF91BFB89C64CAE2AA2EEB95677B075E
-3772681DF3F512E315C7266B9B6DD3C38619E8F0813451BF48660E137FC76714
-F799E17380CDE5813B4B6217B0D0A7763A754065E2CE172EE6DA76FF5038C614
-0050F3BC4DD98CFD8C0BF526ACA742F4B79B53708DD52EBE58B00CBAB52BE921
-C131A671AD85BBCDE61B97CB147D9786EB2C01DB4425E827C3297F9886BA6354
-C526D89B6B4629CF7DBC38AEF5D3EB58E92A7BBC14F796778BB3ACFC654E3CD6
-9B0C5EB8B24C3279D46CCC0A3EEBAC870EFECBAB222233E62E76022E9C80C109
-70517E245561033028135DE10E1BD8FA0BB9E5FC89AA5197CEE50A98EB778B63
-BF0E7A97BF243FC8D6952C78192F19753BE77B576486D491344D4DC5172F9655
-EC6D86C591840E8B90AB507C63A7942A88C5301C8E7C9AA2EB41BFDEBBF19DB8
-A905B90FEBB86086E2E01600FB897AA3EB954761045B00DF247C796EBD4E8E18
-41894D9F62E4C8551944FEF97BED212B29FF795A02979ABF453C0E83C00AA39B
-E95AFEFCEE23B58571795F0358912C7396AD8E05373E5DAC0F76AF1B7A5406CD
-2D82ED5E0F014AD1512DC75D71DCD22443E7A071E27A52329A04A18E12E4191C
-57DED26A8573ED0BBCF6417D993269E56241E45E05A61CE72C63252D908DBBB7
-ADCABD21921CD36B6C2B1C4A5D8E6ED8F29B8F6AC9B8097F477AD77CE01C51BA
-00BE8E44D5B3D3389E4ED09A7327763E7F50426CECA5424D243AA8BC7E7B5529
-9D14434148B294C2441DD0A926B678211EFC6A48EFE84130BD4D15BBD2CF1388
-B5EF11940CEF3CDD4AEE073AC131947B960D716973E63BB928977EEAD41B80E9
-BF08B06F0F107B4DE2828FECF7370578FC116F03ED602FFCE688FA6D25E274D5
-519B1EF07165FDB10CB32D3748C33CFB601C98D17F274887B554A596FA9B3C3E
-63A7C426779220BF013EFA2B30448FD9B20790F87A069E0704A1EB4188A4298D
-6A7ECAABF7F0454E3E7EB98650C2BB14D2B08F2265B439FB20C74BD93007DA70
-EC6C445351BD0607997666DA0A56A186859237F9BCCE4F4E594BC8A81E6E22EE
-5A58C7B349DDCF0F753B3DEF9484B841DD1428881B625A4E28CE54CF896711C9
-4D380F508081C26CC9090E09C9C6BA12FAECD7074E2549779CB6FB88EB1368A6
-F709F6A2CECFFC5CCF48CA2985BFB1CE3E0FA2CF5C3B0F612869171F3649ABE0
-20837D908FF436B01AB54EE132A8F0D0ABB4C1015FE6ED45575B1573AA3F9D64
-66B521470DCD5C73ADBDA46E86D6EC5667D2AEEB5F7938F42018E1541822E475
-B11180512375AE63EC7BB000883043513928140A23CBB26658A6B0521F8B8DBE
-2007353A924E762BD8DD3AD901D81DBADAA3DF3C2ED5AA2163167AEBD049390A
-F4459FAD558F3FBB3B805EB1EF332FB14F0C677FF9CFF7831F203383DE4CE7BB
-8CBA629180AFF36228D3997BFC97E051F2390791B6F5AC0B5AF929107EF3CEF3
-00894DE1693653C33B012583EC5FAED006BF9410510A709594D34E558DF5290C
-4A36633EA935D67A351630E6F75FCCFEC361A8298DD7C9DA2326C8EF247481EF
-20B8C91013AD02613FB321DC00C7B9EF87ED8AF212D769C0EC1D8F116950A60F
-3FB2273E4EB993A8CFD3787C86AAF54CE86DD44A9A652307B7EF8BDFF73942DF
-F52AE037D5D9FAD5E2D673F4346921B642EADD945164F8B8116C24D7A5EF8845
-0D1199AA2D6C6346075E1FEA51B351F6688DB0F9D3DA6489C34C9E1493038281
-D5929568721CF3A309C21FACDB7B4AC9BE329935446212E060629507D78CE8C4
-C5BA819D284C6AEEFD81CFF819A14C445BA6DFC9549CAAD4CF56FFB4FFD46716
-C60DA7F437EC08CEA0FD4711D745892ECC7AC2FD5422CB464D42977F991BC3DF
-52E26CCF63B0A0D73AF537712F551DF4C8A9EB5837C6CD11119603EE13228E6E
-3326A8A9484B9FBEF42D121304FD19581085459FE250BB3CFF7B689EE65EFAF9
-9CB50E6DF0DE0F2785EDA4C7B9E7AA036CAD799C8451C72C8387EE5BB933851F
-ABE54FD373AAA654DF7B5646427BB0165303DA86B8A778F4FAB052928B6ED9F6
-083D9DFFC0FBADB4BA284BF9E3D0F45337EE4E52138044E8D2D9B09D1B3BF028
-C9EAFE1E2D352CF101B1CB1546A455C3264E951519FEE78C35BACB2A4103D5F4
-78A555C6E7B706E40B55115364E3690C7A7632B74CAC15C54D97662DAB2E7549
-777A7D0F70F1D20C5DB19E77FF69AEEE8DDCC120783D327817D3BA0E2BB98D02
-123CFF3299A4475153DD03AC6ECCD53B7395EF1BBD235E4E635BD925B46E5E9E
-DD4E3818F1092525B84F504450523420B40140F7AB6FBC8441779B724B371939
-CBBC534E8AD2EAD3561DFAE319F1455D8F4D6F9A20A73A79FCAA449F067A1AAC
-90D25E25BE199A9AB789D2B130605CB19CD2F3D97130B38B6B493DF57325B885
-467EAF56A17FB05542CD9567B0E04E291EE8E9E19ED3EAEC6FB270FA3F477B65
-4B60FD0A5A0ECE6D822290233D2FD6D0ED1BBBD82E5F0222A18417773597F999
-D3619B41BDEDC612072E87FBEF1ACECF313C297F4D6B27837C60FD840353C902
-31CE101BFB0B80450E991D466C0D33093450F373EF24A82EDCED7B9D0BD658FB
-8C7422C078FFE08CACA51E7C14795759B2F8A100D042FA3BDA944E6412659973
-4037B9A540A20DABC38FB0F6A346E50E04D530115AC770669BF34FD88238EF5F
-A80C403CDA940AE1CA5213E8A06E387EEF3C7D4941D634C3B3BBEB133BABEFD4
-28D3FDB15075E1A6626F90303D4E3DD558B910308D9CF699AD02DB06629C894E
-B09D7EDDB076FBC42ECBC07B8C248F653BA031FBAE56D61762B48ECC3DE15CF8
-7FD07380AA03FA30DB29CED313D5EC2F8C21F74A337E76C097AF48463869D0A7
-20F46A5FE98359236E7DEBF231916B70AFC44E201F13215D4C0A017EA43ACA63
-F86A6458D0AA360E451DC4E3F864F33ACC0D5187DA632DCBEACF296C6C85A42B
-A31E58EFD9F8B19893B59525B1DAEC780A71CA6FD27CA22C23733382E6D46689
-9AB673C87D7C6302C34FABC19B4BD25CAF910BA2A2957DC98917CA2BFB27636C
-80F2A056CFDC2CB868CDA68F342AAC19538BA177B228B3736D6050298F868F8A
-E9F0
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l047033t.pfa b/lib/fonts/l047033t.pfa
deleted file mode 100644
index 11e8dcd3a4..0000000000
--- a/lib/fonts/l047033t.pfa
+++ /dev/null
@@ -1,1353 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono-Oblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Oblique) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch true def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiMono-Oblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-15 -211 758 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078985 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83D51B996CA62E18F5E16
-E975A60A300FD933D7A757982DDDB53E6F052956F0A57B2EEAD78CF7E7056859
-D267B6E270C1FF751B2B0803C0B282576AA3575CC0743877BC5F871D3E0260CA
-F07EA74B7C3BD6E1C9B3441A87CBE0C24C39D5CED05780E7A051605C83647B3B
-4E86D8C9CDCBC1029AA84E30E1903B322805D506160BED37770D3317D2FE2469
-3B12CC7ACC1E3BF68E1F4F3AA7AACEAAB78CC0288FC854175DEF8280BA4981A7
-E88AEA83A0960C26504940E1104086BA90E50BD53FF14FD9EB047A0FBE45457B
-B4327143B7AA30A23A05D29D397FE113A6AEF33F0AED8CAE911EA27A56560D87
-1317E25F10F1FE017D115ABB4800E8CE8926A3146BAEB4E48DDFC4834F93F488
-42CF2A19F662EA9A223B7F12DE1F71E9197DB954D2E57806F6CC5741E5AD0EEF
-0A47F7D6CBF12D269A2ACCFE3976CA6829DC8BCE2165E18952C86A417777B867
-93F78E7A83BCB3FFE7891DAC14FD7FF0D327E664BF01093046303A3D43CF4E2D
-1D22D2CC2900FA2D274C9A5E857C780DFBB1E935E529EA1903FB85C982282A15
-A36BA8725067022561F47DFDAE8B913B525718B98BEC9AA28A50EB40A96D1A92
-EC82A03A1D24CBCF043F743547B8DF642E7B872793C2D61ABAD6B655233F09E0
-509B371B60CA55FCACF6FDAC2D1FF5710D1E9613F5837963BEA103D99E02F9D7
-B75C9D78DF42286BDF35A50997D6BBCBF08309D0247C1E9410FD6F1A5BCFE056
-02A6C4C5C6E54F32B1AA03A7B377D0F8C5378DE4A6BD519FD954BE94EECC40B1
-1B2B14FAEE89675C2D6DD97623A9EBAC87A08DBF8A71417904116B989D30D794
-A9ACFF1EB9FD4EB6627F541FC552E3602EAAC4798761225FA682C5646A21FCDC
-FE9934A59F90722F6A4D1A4BA63C4D44412F38CF175A8FEFDF9130DA4FA2F614
-E6842BF6F2D1DB5D8CEA85ACDA992C3ED51F60422EE7BD353AC911432419B925
-629BA2CF0CE7D2B93AE1783756F78FC322FB4BD50986AA0AB7B789DAAEE7416B
-8023B87A09EFF918BDC4147B761217310B1467D92B15E49C3E15AF62D47AACD4
-AD77F5AE7EEFF90937C6FB7A0C27AB7EBDF1D97E1512925D772B114BB44747C2
-9170057AE71C3A36D11E1B8AD9C1CCB207915DC181A0FC47E0F66B1018EB091B
-54602D0D0F74463EEE996ADAD5F99148CCFB27D402A59BC27D610BC0177BC0E8
-CB287101F44CC082E657BDAD45DE4C4E231522E56FE328FCE34D38B020D3E34A
-99A9CC2BFE1DEF5E1129CA82364C6D62A346F94599B9ADCB5459507A92F19D72
-9D461A4DEB9AB96E86C21085F9587191E01BF047B383C1DA20F1F56866D370D8
-F3DCCA23F36C776866BCEC11F8451FD632233B2973A1A4A64B94558A92A287F5
-074A8C0148F2AE882FA202212C575F5B32C44C767CE47A8101B25530F8BE1C8F
-B45642B3C7C2EF7FEBA3A38EE6BA20636A525A7A4305D8CA22BDFE84D0F95F11
-AE5AEEE2D2F22391F7CB647E1131C0853DDDE1C65EF3C618B286794875DD6690
-7ADFA1F1812F1F078C851C24E2B2C31D593589E9F27228CA21AF66F4E649B6D2
-3F67B91206DBE74E704276634E6032C91B71CEFADC7BFE832A8955F139F56981
-3422C47B3E8809B23C259975D466440820DD4E9E5F20A24787504667FAD72202
-83FE9B391A7CF5F297CDEE3DA8E9B9620F1DB2D387351409D38A9C120367E388
-4D9724EE90C5BA737B847A5E330A23ED12DB609837BA866780582E486C89CDEA
-39D101941B7608A5633B6EF6FA9848C2F8FD8DC9AD48201C98A7E72C38861822
-8DE5C6800E152D2CD869137DCDE16DCACE6019FFD26751A5689967512AC8BE34
-882245228E4774EDFF6C8E4A805F854AC5CE495EB91F84876A1FBCCB65F5E896
-BF07B3AE7B4B6F388D6EE0072BD9DBCA176D225D0F45E55F492457FFD2CB27C6
-DDBA44578E2AB640190F11C953C3C80CFF99D2FB39BDEF423AA9AA4DB4D4010F
-BAC17523B4B386B4E81B98F0AAA487A38641A966C829607521C7CCDFD1ACC6E4
-088F0295842C8F86DB2D05311EF38924840BC8FA3E02D9B554475C09786CC4E9
-F4B942030E1765F1CCCA561FDCECD1579DFE1F6B4A30D35576599941A2CAD8A7
-783135720E6AC6454BD4F1A7C1A1CCC9AB629445A4423AFA2B99296B2A478735
-62DEEDBD02BE125A4F7FAAA55410683B4950F60131BC8969A7E52BB8E11F986B
-5193BF75D36BACD8D2B732FFB29A5A7E76E6BD785EB1F605D035B653276EE252
-344EE302BFD7DCEF9C1DFA24532D6E0AF7F221ACBFF7EF479F8031B8C836ABAC
-FE89FEBF57CCF8089F9387AF1E919B815FDB85C69DACC562FCCF6BF843E088DD
-E64FAD2F51D22189D6D2402FB12C9CF390791BF3F628C04978EF15CC9C2EA909
-B55DB3141788765F610587CF76FD63C73FA8FFE8F7697529D85F42E9FC0DABE9
-4DEFBDE3BC659FB168A8C4BF06A57A8661EC248E1579101F4B7CF022E7186675
-EBF6E5F8C3DA362612D97EE664BD10A0A81DFCA85F2C3250BA95B0903B45FC2E
-34AA1C9900C092C3C1EE4A514EFDDE0F7BBB3FAE4A7019B547126FD62FE6ADB2
-17B9F504BED3487D1CA9DC6B5DD9DE01C2CCAEC45A0E115C251B0E9275FD216A
-9A7445B40BEEA1E99997E81D10C6331797DD98C94288A64DD4DEAFB68E64806D
-4B758A177694A38BB736D5C799F8B64FAEE01E8DBCA99597F0DC4DADCFACCDA1
-FC3010B68BA528E49BFC3A72AEC35B084DA9BEEF372C53AFF900824CE31269AF
-9FE252457BF229DA29CAAFC67A6B91E2B59922379302D243B2BAA44A6D24DE8E
-9D7470F7987C54DC3407221E1E90FA763B03536C9FE5DF99064B716412EBB665
-762686EB4249D83C7D80B27817DDBB152DB064796102467E4A604EF3328EABB5
-3366D50B9E2330CCFF98A8B98DD6E2C39AD991C8921DAFC4CDFF75DDE5E2F2E2
-DC1D8091B7E4B03A9772298DE764FE81410506B7FD8102EC4186D6AF7219DBBD
-E11BC975E26F8057F5EFFC1FBA8E80C4653E80F24347D8D5697505B9D3FBF980
-847430935126B257A8E0B1326AE1C06A5EFC97F01C45471C7A528C550D2FBA8D
-9CF4235FBFD4340B9CFFFF0802EF934183F93E0CC81CB125ACD01FD01B669595
-00A7B8675E1E61515594C1612ABC6C08B93732760B843FC93880E9A1700FB89B
-5DDD227A3BB43D2C30A953182EC1717EEB6AB016EFF3FF18108BAAFC62AFE6C4
-819B12052B09742A16F9C86FE887BCE63B23A422FCB2531235CE49CD4E7D3B85
-EF05671D86BBD1494CFA9F2E8A9AE5C0BF831B6E537EC57F69626AC89B685D39
-AB226C5339D90F0CD595169E3D3F70DE1B05CCD3A7B54AADB9C0D0BBF1E35D47
-F55ACA00064767FA1A02318CC3F90635CEE5944C984148BF437352CBC2122F42
-26675385DD0131BC7F41CF4BB9D914D29972DCF531A1074055477B3AC44FF0F1
-D895759AF4B365FE9112BC4958191171EBF1EEEC3DFFBCF23DF9679CA9350A6D
-66E54A3EACEF4390B7CD1A9C88C53490119121DA5DB6E77D9E065E9EC2B0DD1D
-2A276275A9CCF63D4462A2DAC9B3F62F20BF5C8B3FFAEFBA2971A0DA0F78DC73
-FA301543A932076CC943C65D5147E2A018209F0D2C18926355994F3F17AC6310
-909B998AFA45EB9B9E5225630821DD05D6035F9677F839A7970499234D93C0F5
-5167BD2FCD1A8D3FC1850E21978C3E09188688E383677E091DCE521F65A8ED62
-1020255B64B2889C787963D0466EC3BBB6BD2A02907B6D8355A3149EB88E5EFB
-D95B59470D51616B93B5DC90C84564AF3126689E63DC98D432B6FAE3CAF328CF
-04373D09BFA77F54368D24D546C7B7FCCC1F66B7949AE19136EBA43BB5B0FE54
-E0E7EC4DE599DEDF4B2A437985235F08142555F62282CE0D0187987F7663812F
-DF9458012EC5EE9624024DD39C3C6F3862E12ACD7D7D993F7A36A0E08E777C04
-DC55DBB78C02639ADB7D7156624E00CCDE7B3637C8DCFA60BD96E03786E27237
-180F51C3613F2C1B5C38F173A5E6CFE20F074C3BCE04556B6A6F2677C83DB5D1
-0F3DA48AA22E8B10D61132A58534C477D8A6146F60F1201801046500D37541B8
-F0576F790E918F92ED070B31DE94AD7F46EAF05F3677BB5041F1899BE14950F9
-7CBCA06BF444839A18126D23D57D567E65F9D4394F4846D88F6D3EA9D76BF4CE
-9D168701DEC9254F2F0676F27917D25EBF495AD97144886A468F8CFE1475C3BB
-DA73DF9EE532AC7EE2D706824B81467A9A2EE84C5D6205C4E1916C8250C778E9
-830718DDB534E6BA14F4A1D723CAF5A43F7668D6235580CEF1D296A9828F7397
-1D97D57748460EBA113342449E28B8EF96B9D0B8AD79CFF9FCCB979C86F14149
-4970698ED1FB72870122807321E0E2C3B1FD9B6B88FC3144A594646335BEB914
-B8882474AF2A0315BB55C1924EA4BD6E305B7B92E2BA498F5EDF6E0C13AA9A10
-218899781EA3EB98E9C9C52361BB9338766F055198970A06812DAB8EFE4893B9
-AFFEB1D540EB70D18CF3C8D2CACAB15A0D158E21958F020427F936E15F969467
-D2D998C50541009AAB95BB2844A0F1FE9E3394BB64A6B1E5AB8F98E9311A0CA4
-38CE611ED06E80C9DFA8B380A89AF7D18D1692DA62D816FA3E20DD647958F52B
-9C7219C4AE3A6CB987E1C0442D1F92BE6121DFD75A4E7F68A4D3E6F2BFBF000F
-509F8CFFFCABED431E5CF48B6BEAD630ED02D893D8F3A16E97E91C802B23153D
-A2E93A3A9BD228AA835C9394085111344805E53B23459251A1FF26802D7A736C
-9ED13E9B53D9BEC50A3D35624431F2E27E05FF01E56BC64801D06434C7179E81
-9390FDD19E322010950F09F9A36878E41D9D3C2E4FE37C2AFDFAE9519FE4939D
-DAAD914E331196BC856E68BDDCCAEAD7551B0C9808E10A92D02275AF1A5590B0
-CB71F116BFC878EEB358E741F35F8C69BC659B844E2946E1FF649001A6A2B1F9
-F973DE46F57A27A567EECCE8A1EEE48760C663F9D9E5665F2038767CACCA4A9C
-C9D0C11D846A5C649B52FEC6B42EA6717434807A999FB70784E620E9E4F05638
-7CCA3D6BD952B69AB9845FCF2E197455DB59A118B8C43C26E5693170463E1DAE
-A8CAF498A7036EFC436AACDF9221A35AC4175917FAB053818A318F7CE4C218DF
-EBE15A7E773CD4E988643B09D6F5482B9929D12A1C3A8B6611F14FD47C21BFAE
-674C10B6B5FA34108CE615812F9D0E95E34F84BF024D6EC5AAABF6011684A03D
-E83B69273A74D75073A380781D38C7D2A317086D80BB9BC3F99EDCBF8C3E4077
-39FCB1D7F88391FD4445DD94E2F193839B3A5C2CE65329FBAF0CE58CC24D01D3
-539D2C0F94F65DA1E5BBBBA772997227B2A702EFF5EFEC87195F6905E9A9ADBC
-B8FF45681D61D02D28B119241FF8C8B377195451FD30AE615EC2913FD53B8DF8
-5E2E4A63663FD231758FCB97DFC18F1B522A9C1AD976C4FDF257E1D529E1D325
-34E6C1A6D8339B6A61577A17947148481A62C5E41238FA86968A3ED0DED467B3
-4AB877EFC912839525FF9A52C0E86FC7A9D7499FC0A75C604299099106256F5E
-EC8168FB9343C144A726004BE642D55027DF9B18B80F9EC609A91C8E8E1E4AED
-FBBED28CE193CD71F0F24CB64F08F936B7B0932CB6466E1BA4D8EA73E66A146F
-12CB155775FDBAE83E6AFDC46E9A0680387B6663919884E88BD13FC117963368
-0C637980CCE4B7F393A7A7D4BAFFBAF563CE3358CB959BADF631B42E21E164AF
-81AC41C462EB987D4A90EEEFEC128D1545C27A8A34FD0781F85C1FB588B2B12B
-3DD933BD3C85BC4DB4D6EF64D7A1E71A68E56894E93775823EF35513DA281866
-9AECEE4647B99680344398D121C290923103E463B7CBF17514F32D1201FA86C6
-75C00997EDC3C17DF62E0A4EDC539167A79AB515B0712CD5702B3C8ED1662A5D
-AA8994BFBB26CE64A54A1AF3B2373E8215CE0F64A6BA038654E1A098DE4E67EC
-EF8244DCAF470EB351B684722E9FF7EFA6FCD589A1DF28B713A585F013DCD268
-4808FA1693FED0A859BEDEFF143673340F75A50F4904E3FA2351D874ED7DD95F
-149C82171CF7992CE2C64C64CDF1E9E0C9CCEF0DBFA5CEB4B20B4466E1079B0E
-8BE6CABDB2C771776DB783EC1E4AA66FBD34EA8CD04D253B005D206916B19EAB
-2F89BDEA64268DBA665FAA0D68D2371EE1327D0C0CF18FEF2CA99B93A322FDDE
-68D8F289A92C39C2B6B722DC1DF742BA4B1BE35259F0CC9DF36FFDD4E037B512
-364BF1D2D450843A1E9651A7431424BF1425AA1C2CC5C8E0DDBC959966BC3099
-D792ABB111B5AF5D48027A853AA22167A6704708AE7AC5E94B0F233512A7140E
-125D86625BB6DDD4B919AA9F322F34A570B772307596216631906BB5B8D856F1
-665D2168ED20C9C7B5D9B4B49584B4687ADD1D4F888229E6A2DA6D7CECC34442
-3D48FF83F6AA41BBEC5A5627FC8A3F6D9A4AB9130C6FD0DDA44B48434200E0A4
-B939668D041BDBB88B5EDF1916598B4E6A28B893C4C1817C14D1E2335533F236
-B7B62C425C7155B85EDE07CFAC64B907C115859965A617D383440944DB680D80
-B959CD223F917446FF9354D6C833AF334E8E1C8EAABDEE4FBC864B5D4AF6D0D0
-3B26D04BF93BF3DED0DC029E69DA8D7D0404DFF15E050B233180930BD8B87813
-1661177C7E5B5348BF0EC3B12682EB539168A4304F754F244C8F2FC92D24AF2A
-27B4CC7B9FC94447E28DE63B3FE9754FE4C6BB25B2F5DC5869A1A2D088406CFF
-893AF7968C6D4DCE14E9133AAC1F03664E1E65A15C440BE2E9D7F48FD6F63A1E
-9C06C311A7990D17134F424C41FBA0351FE639313CAA5D5E13FBD636E512A543
-1AA47D50876064744E03B82CFFBA550FE76D4A3DF6481F178F27D5B2557C0690
-D702153C470986414604018F15C89DB61F10BB7CC0ADBEC3F7CB3359F9F85473
-94377EC80668B4947F508CAFD4E7566F388801E5CFF6DD19EAD712D1E2EB9AE2
-F15A76E0F5844A7D7609D654B6E32991568CDB99ABC3078D960C0D1125A75A1B
-90B73079E29654C0DBA19565303A9106602DAEBD547C31F82C29DB4A98F6142F
-B67DB4D934D42853462A2EAF9CB05D6E0901E8774491BD44219EEB9CF4FE4AF2
-493FA01140E2ED9FCB1372E6484D2ABE6B1EB5A63E272F44F7DB36080342F7BC
-A63321982294C76A9E63823C63722EACCA6C6A90010D3343A89E49FA2103ABFC
-C60D3DFBBEC711F50B739031C43D984D8D59A2A4BA4937B5A08E55E6319B49C5
-D36B1A39170EEBB4D892228788F90DCD25878A31660AFE06CDBA1E656C60BF5D
-0A07A2104EA457D1B3C6E54D068C7094AB8D0B9FBEA7E66C72547B7F63B8093D
-1B29DF5F16D4BE002A4C5093AD3567AB0E085C87DD97FA849C1811CA8014B54A
-C1B1518E962E8C96D1295955C53DBA39ED5821FB1900F24DFBB7C8F1942298AD
-E97C85BE7A0D46873EDDD6D5EE79531DB92F3A8DD319D89E5D59BC4761562709
-EFA2526749A5FA9632CCC71BDF953A4F0A26C5B4F383A7CB429322736F449F43
-570942D8393FA50AF619BBF760016BB43DD12DCF93A150D7CF1B41EBB4AE221E
-3C2F91C3D9DA821D2297B0C13A4555E289BE8B900A7B7FCFE2A1AB4405ED44BD
-76F459235B3A5CFACA4323E85FAC84BFCE532BA323A92554D9799B20298FB086
-EC7A1CEB5D36BF34E7D6BE96D8FB7CABB562A59ECBBDE044E0CCDC42B77766D0
-54F2B99E0A7454C4FD03E30CCCF3887CA6C048C12F9D1D8E6155D490E78833C7
-EE6085889F8C8DA07E233FDD3BE1164C715B07A160EEE303CAF453079DED6F94
-91311B6CC2C79343448E6C94DE4CB1159E00CCAC3DAB69443B4A52270FAF2DF9
-285B6FF81E7F2413E7A79BEF760C253E9AD40B28D86F4924CC02274A6E37102C
-0716859EFA924E50581B092D2EEBD55409A211010729337DD11B376D70B2E816
-39E3F67B0CA5051F2FE1D6D732878A8665B255A5C490F6376021D7C3E614BCF3
-CC3EF1045CDAF7A6DB17E3C496FF792605D5388C93E2316264D9CBBD3FB64258
-F462A7F4EC677BADA2948E272D2EA4F7D45344CFE0764886CFA3FFC4A2177574
-168F3236BA418838B7C0F68B9AF7FE806F1057E97575A79D4815C707C5EEEF46
-3A37A0E5B3DF712246A50C8A1D08940CC73A75FB7E80F73FC044D56001AE3474
-BD7AB6A05DD79585B4084489C2FB228A7BC1E39DF7C01F9FB6A8E8F9D6675C28
-351C433CBBDAB5B7F9EDF1F299B9F3831D60F6F7FC0839F3E33239F1F75E02BE
-2F0D9F0842A3DF1586DB930CEECFCACD4CD74AB61EB66B20C3240507EDC9B178
-B0DA13F58AF8CF48526D84D39D7E0EC4E8D2E83CF8510E052D2687C6FD00AA79
-FC426348F421771E9F728AE1DA40FC3A6400E2F00164C7640EE12F8B9D6D485E
-C0AB79540F30441E97941E5D9920DA22439730C84E1404E2E3142966D2FAE1C2
-937BD857F6A44B76776FDB46E849DA71032EFE2A5B50349990B90EC233E75ADF
-E940E4EFC436D15DAD29C10BA71FF988ABB796B659FC250BA6BD83561D00DD2B
-EE1B4187754F0DD7FC325EF420CF64149EB7C010F4A0230F5C00E8EF0287A430
-FD501437E36B3CA17C50A47800E8ECCCAC731F5217DC39CAC15EC1326FE67412
-4C8B6C795C60587B4A9200328FD08CC435723ABD617A9C1EB6D6137F845F1EF8
-12B2E76659E88A00B35C3D7DAF9126E35794B2BFA733206435AAD584A464DA46
-11C6F47250EF166301246CA57B7A4A360A43A577560FA90310B9A41DE8A7A569
-11DB0902F1F8F4580D2C9990E19E6DE153D42AE72F9CD6654A09EC69086100BB
-7C7F940DD92A8404A09B6CBA2577AFF4FBD1731392B404F2C73477C5643AFD49
-CDFF85D630DE9014437AFD41DDB2A235B606AD3D19A3F32DDA92502C833B27B9
-FE7EA1B93C4EF69D6C25FEF0919D5270F1FA526EDE7CACFAD9282558BE6669C1
-AD9987C7261825EC00DD51D806B2ACC0F1325743093B6B1BE15CB05582D942EE
-7F32F08C3FF5D4BE9BDA66523F19C565035E56A2BC2610CBBD446735F81BB02C
-4A1D232F34BD287241B57B5DBCCA8529FCDA70CAB0464A91CD99A0B68A5BA7DD
-1643513B5EC3F79264DAB7936CD59A7953F563E5E34EF016CCF46F1C1CCFAFD5
-118CFF688015AA2B3B3F287295665D51C4DCD6E96D18BA3C5E25AE7886DA085A
-C1A0FB9471BE802C6D69B23BB1E9AD88FE3258FDE833182295330067910857B0
-A3A72BE8834CB2A1DEDC38CDAE04D2B0CC5492D490173A4757421323238C8438
-A660C7AFFA3C261E5EE4CD655B19B6FDE54760C2FB0955941097301142206565
-D048CFE4A7148DFDFB2012490C551A9309FCFC651892242EA852DA00FD19829D
-1838904AE7061E21A7F1566E70469F52BC8B9E02EFF3D944B162D3C563D91E8B
-28382FDCEE78EB8A527C9B6FFECB466AD43E0C0DA5C16831467F53EDB0CB8626
-BA92737DA27C98AB10C97A8A76353D3F975EC666FA00DB003015608CA6BAEEED
-AB8BAC7D02A6607CED006DC1B4AF02110EBCCB50854DE1633C8085ECF57271E2
-49B479B3BA13B3D491313B266C9085ADDB3EF486237AF30306704B36D99B99D9
-B4DDDA188FD08BFBA1D7691651338BD1F9E3D2325CCB349327D09AD5A9F82548
-0CB6FC48BB965A24E3D2438BC00A80BDBF322E5B81DD7D51599A8EED5E1C0CBD
-3D353DF1BFBC3050243CA4CDF48EDB660DAD7CD4326E7D8ECFEDDC3B79A28A58
-89FE0A38791F9778B809664E1DF7B0DD829288C3C7F00CAC6182629E86B1931D
-D5145A5DA2FC1EBCF001ABA058AA48027688AE1725719BE01163C03F26FB3C6A
-DE78AC5156763D1955A713CA60E9B98A0C8A84D66628217093FEE40C45E1B873
-BE5E5629F437E9C821EF110B3F89692B89F15F7FBF46FA1B31B66F0BB6956A0A
-B1233B3D0475B839B2F3A57C1EA98842DB201E2F78D654837C11035F52C165A4
-91206BBDFB2098B435A0BC91622094B9F460956D1152AAEBE80BF2AD888DC412
-F8741BD4B4F5E4577F5F1931C1D9D6D8F16D63376507465B216E42586E28903A
-8FC9A8799742081204B5BAE38A59047E0668598102BF487733BE3F830A1F524E
-55CA5F45EFF823069DF8D162A2B4BE2542D6AAE3D7506710E46E50F80E4E95B6
-A5CFCD4063974BE71542FE87820C530BDF026DF178AF3F99BAE56F50DEB17645
-ED9FCB0F52A576EAAEDD00E5110E7406C3757DC5120D4E8263ED0F04FC7AEF04
-BF4ED0D0FD4EC2CF08044677B8CD49517FC934AC97789EBA59A68CF5593D45C5
-7257A4408935543255CB46F8BFDF523E1695065265FBF1948B95DEC97C7419E3
-D15BD2640E3965DD0FF38015994858FC8FD1EE7CCD08CA522F88584177240D93
-5E51036BD64402950E6E655BCF7AF79D94D5881A04E439DB1CA3D1CAB39CCA82
-19D1CBE17DBC2DB0AD5596B0BDEE6561229BA42A69763722DE13CF80BFC544D0
-49E9EDA64605BE71FD6BF076573B8F7ECFBCFF911AF62B6C45056C3D62779A55
-5AB3824802C2B317B985A9FFB380EEAE5E816EDE9A381334A323E1A3EA9892FF
-6B480084B6FC82E42413CC9DA035A5B587DE706804232F4C269FF4E13D8A03AC
-480124BF0C5C5536F9B491A40F9E5B74C154E6A7A05D91E0A01D1B07BD9CA08A
-DEB2B51FD97C30D828A530BF26D35EAF941340FE61AF9D30D96E7293676D55B2
-0F20991553AC5910B75E6C8F5728F5060B3B35A223DB1A69C4D2E752335B2C9A
-4D380197F9413221E12876EBD61467024A304EDF24E6FFB17622DAACB5AD710A
-439CD1626F3A6836EB48315B2011491FF4F2FD7D9046315C8998FE7C758D3568
-D6BA5C6E158ED2FCDAA81B56B603DBBD917D82C124A61F629F9F69F834D08B59
-B53F10029802F0426C83E923D658D7F8D04D96AF9912389EB467F7271278601B
-DCF84562F771B4BAE0A5A367015F91512A72171E37CAEA1B9930C0EE51275FE5
-0F49B05CAC5E9EFCDCD57CAA3EB5D101CEED7545F2BA17BC45648D22119B23B1
-0F9B7DC950350929A310C3853C4333C230A78479127953E85A56C335B264FCC2
-FCB6737637F864A503BD2E4FE44F14AFD8E8B51EBCA87910F6AC4671F9A9591D
-972D0AB26E2AF36519CAA939C07D6D75F56BB331E7F37B6173383EA3B967981C
-903177D5E441B6069D6310476781779F68B4A60EDB732DF6A9BF1606B5BA8616
-AD10D97F711902CFE0B79A228F3CE5D31D7E35FDE180E3A52609BF2A3E3E6DBA
-E83650227EED7657D43594200EE4B71BE9A70ACF49A79173A985E1FCDFCFB705
-EF6D655E220FFA05B96AD4A5EA28FE833272A2034E0DE412818E89160B1AB71D
-CC2293238DA9EEC3A0E6BFDAD89BE4742A4F893CFDC4847E769A8AE4E3607D2C
-8FCAB808540C553DFF751FFB4996580010C53EDFF3354EECD54DD2AFE4BBAA66
-3587D0488A2E96BD38B16D5265FE05D92608F41CF56FEF44E977CD965DD29390
-7393AA40AABEB5006D6F0CC0740DB96B2685737C89E445DC07718B5986D13284
-0589CE723475C6E750F398CF7B138D4017120F774054EFB7CFF3182167A24035
-0A31A73C79CC763DDBC12C371D8A77F7B9802F9200EF1715F163EAAD1BD26139
-289405D97CAA32BF9D5C2979382B78635E39E4B4DDC0AE2A0B2B411C08A8D0D9
-ECF61C48C33693F24EF1B49293B2F637732C932C35998E9F7C2CC23B5031CAD9
-B2A816310F484FA71FAEA04B09237762C23BA7D864095B3234E32814AAB28142
-F65EEEED4BED3A1B7AE05BE68D6FDD81AD73CA46CC51FE29CBB6AD9A7FB0C521
-6B776EA1A7418CF0D4168AC00CF74DC39BF649B27F32F9791D51DC32FEF7E1B2
-F79502F3AF78BA3D549E5FB21AE5D265326D93CB4D32F6DFEF33029432A74D1E
-B23363450A94833F158F86B7885E877AF5F413BF0EB3DB99B508CE4CAE50BAF5
-C522A038210828B44EE62FF7D64E0E33D959D6F45FDED3FDD6FA828A5858AF82
-4A63D360801D8DDC9ED0E131E3339E86C0A6E1C20F7B7F85BEEAA6067F18D9F8
-E5971282585D3930011661A5F4333868CEF20CF01770BA2C60DEFF2B368AD21D
-D4167DD179EECBE8EC29225FBF1FCCC1D1D5A311703D80C942388BCE852CAD69
-E6034691247123B45A5613C7A307A3118DF37F009001A8A87D093BD0F48B1E93
-57A0360E523CAD04BF1BE259C75F52043A7BA57EE718852D350F7ACCA3664722
-20026A57015ED6C0208F36AB7247D91F81868424C5871A376924FCAE64382287
-D232C928831EB8C80D0A107DBB9CB53568E51B85912733B9559B6DC8287EE61D
-BDB6159977F76D58C6D925CDEC01F728D7D6BDD27A8E61473EDAA7BD7D80D20F
-B47E20C691794186AAA4F6AB76FCA59058E190DDFA2179EA4A3297BCBFD6F546
-EC6A1F7B013264BD04DE97E325A7F440ABA206CE1F0AD45AD09932F33DA483FD
-A8C54582ECDB96F9E612C8F2A7DA397E1CDFC11D8C1168F18B5DE813CF7EA37E
-1C7B2DF3B38AA6B3D96C6DE5637FBA31152034EDBC6511A965C78CB526DF27E7
-967AB9939D93DB8379DD1AE267FB7FC543256686B68434D3C5A4F5D823B50F69
-0F1D4DF1F4C575B9DE19C46363CFFD6CED771E0A74EFCBAA609A564631C59C0E
-0AEF13343DF77FFD4E0EA2AE1C1405D5A9C010FA32317445B8B172E6382D6F19
-A128393ED2C4ACDB9391D3E96BF3289BC12D1B8C0D6E3AC30074E55F641FCA5B
-B237CC2084537A34284BC94F3239C4E56A23722E89B8D604813CB8F776D17842
-AD927359B8147FC6E05503A0D0209FA52653481E38E7530D39E42DD57EDB19C1
-C4D8ED8222495543FBA560AA5774BED94A5A24D933F633BEC4DCEB70166176A3
-49643A62599243EA05741910083A0652E39DA7A759A554F48A4D550A933E4ECE
-D6D12C6D6BBEC0A3408A9BE220B328060015B3E3B663DF829D93B9A982F4BB23
-F5C8F24DC9CB77C7DD80809D353E336659C5E7C2528D95E521208ECE1AAF8DA1
-D84A8A68E2289650D800AD369399594309A144AF3CCB62BE30669C1FE773F072
-D9BCA31AF45DEE792D623ED6E99DDE9545638A721111DAE7E74B3A5B07881662
-628D47F08A3749F6AEBD13FA11312CCCD8E06297A5A698C59E139D52EE5793EA
-A03B23583052F10AE38CB951E533623133568377A7F2FAAB301C16F957A12E82
-7D2A9451DD123A725EFA3C3D93838581CFD60E69C772647D384BEE1A312F879F
-940EE9E91E6F7883B91DB9D4F1C5D1A941DA8F320EDC0FF8E577DB3850F2B5BD
-3535917873627308450D8CE2BAA054BCDCFF9CA964FBFC8161787697FC10195C
-6C32FB43D6891AA1538B728C34ADFC9DA526E87145693815F6C17CD9C361BF37
-E788FBECC2905D57DE7C2AD8D03AE51C33210490395C00ADFC0CC1FB5F5CB3F5
-994FBBD3DDE7DF9A1ECBC87480EA78770C35E7DF78AF2240F7E1412F8ACEB501
-FEB03A131CCB795EA51A6FF5B188B5927481C63B82EDD1542512F069800249F5
-A8F963EF9383342C0BB584BBE323069CE631D985DB8C4F2109A8E1804AAF0603
-BE3A5C8863A4B815D5200B65AE7DF41D79BACC2510E700F390B2EA3F4BE01D89
-BA75972F5354406DB6157645B80A9B43B8E0346A7E20D090B0A37C533A7946C6
-EE2953D8B2B216AA2237E9407DC6F90008C2C0E449112DC5C3C2C8019CC9135E
-C136FD411E23F26398F422EDF01AF433D66F60E5B961B6963F5D14CF48F77A50
-8F6C584459FE6887764353E2BE8DAB3C4CCF79A1CC5E1B28C427F520E9139230
-83E2B8C409F6C1A8E954F81F8F8C1091C4960C5132B7B5AD865AE564AF68CEE8
-7924B401ED8FC90F9A222C6861BDBCCBF54D06D1F2B27EA2176E4BD643295A4E
-49CBB9CA351F339DF41D3A0ACC6A4C7A33196FA53E49E409413E8D6D69F21B09
-3D7CBF3A96347F3DDDA92C435E1BA4980457D3D9957B800B144F590C136547A7
-660F182BF7162F5292A4AAD4A1E841867EA48FD686C90D563BE6E2879BF05614
-EBC88A6DB350DBF2996AF28B2EBE9415AABA07FF509B9DC0F5F066F6AF30BFE9
-D9800B5708503CD57BC055F5434655E68E322D699EA77974F1A0B4BF47AE76AA
-29F0BF7A35312686997FACFE24E9F8C23FF882E36D99CD4426742B6120B67E92
-BB855092A15A7BC5E9A6AABAC61CC20EFF52246334525628BF6F4D7DF5542399
-91D6E985BD244B8A4FEF73A2366783307FDD8960D81648472C9FE19445AD3AC0
-7B0C8C2DF9CDA23301BBAC2D7D32574DBEE3A176FE9C27B78903D1F3B1E6B7AC
-AA2768578872F3FC652388DCE24FB5F4D83426756915476C62A386B95FCC7133
-D21B17F9548DBB193D8C57A42E6B76306487EB53A5AA8765BBF8B64188A44E79
-2087928358CD1F1CB7286D6C7BCCEF10AD5BE805817BB9BFEDFF5EDAE0F691F2
-742DF076DBC7FD8C5D3F6B2ACC84BE4E16B1D68C3008055340B1952919387BD9
-D3C45456CB361F3E4D00CEC4F4D289074AE591074BE3C7AF4DB010B6C1A577FC
-DB61CC1DAE946C39B1573AE788B86FF95457513681CECC79B5CB533AEEBC98DE
-D04DE9C0CD9FEB79ED7143BF3B1DD911BD1999A2F223D4C41F51F9AFD17C9E84
-AAE9B30BD00F460A88C74A27268559754A4E416485F0F9E71C2CDF13F62F10F7
-25808965E37EC3FECD537D32CF915B6F47D6AAC1E7FDC9A90A49DF2C1CAF5721
-66501C306734B40278AD1129CF85E474264E65525F14DBD3BE2C358364F5A624
-21EBF782925A9A271CB4ABA439475B6D52A65EA1D8A71DEFDC476F73099D7EF4
-C5E68D5D0174860D55486F443E0E9C81A86594D28B2BEFEAB7AB9B14D1EBD02D
-0CC44A01437CADF55E4FDF86B2CC1762175F11725F292819C97168262C3A2D51
-3E3A45B29C5EEB0E57CDB122C8A5C077D99AA50415E39C44C206E980F06F0ACC
-7128ADA7761D7520AECDA4660F2E3382A733C31B5A5BC5DDD782C92E9D1C64CC
-F0CDCEBB4699C08FAF77712EC8D58FFB78253B978CC7219D7D79515F8E54A060
-180FEF767C9D8798CAFDF295303E7F0A6623A8C12B14C1836F11F8EF13E426D0
-6713C847925CAB6A2BDDD84344A9F3FC9ED2DBEBED62986E39B762DB093A70B4
-8330414B6CC6210606074CF505197209BD0154CCA72DE4B58CDCA2164BBF3AE3
-3CB35DAEAEF2247EFE9858FB09FD7386EFBC3726E0D8D0C105CB6F39715A9AA5
-75E088AEB767E520F30FDB5B1CF1301EB4CAD57E870C91C11F2839956FC3B033
-ECC34C4794ABC5062BDFD9EE75BF35C7838DE696D2E89CDF370F6942C224090F
-6866206B027A9385C29E50DEBC25EC087EA404BC87D9B06D6C9A6DD16FFDD199
-53E5B20FF70287A5407C80F4C29BF1E997B9206333CCE010E05B6C8C2ECB7E35
-486F96890C7A4F8E97FD7B42EEA6FB4FB3083BA5B01BADA2164C3E71D2438FE8
-4B4D38EDF4F1B9BF8334A34F42C6D093A56763498F359AA5AF15D5FD17868C80
-854BD80EB0F1ABEE40195B49FF7E9E04FD5DEA0FB07B12E0FDAB3EABA242D3D9
-11CF1F8A0BEFE0F6C4CEBC2DE687F7088E3556B95C0EE7D0BEC654F642212093
-E4ACA7C9F8049BE764BDE283D512BFEB784CE3E83BE5AD94CBE97A3C71DA85E6
-5ED201F11B6BFB09139D8FBE9516F1CDEBA26868D60A5244700875C72BC399FA
-F5D8B663B4BE7484E46F65EAD424D7EE440E1DB7394CF6BCDAF07DB43C86D0EA
-E08F34C56EACCE341389ED82C4485E53C3273F3F7FE285530D13A9A7D7F0A298
-458A3735A2B84D8C2AAAB2DBEFC847AB55CA7B74D9364AF272C76A1E9FE5D64C
-9F61FB670F5521FE8386A332BE4D5083A16C705E61FB58D7D88ED2B540949451
-46A2514F38AF7357F6CECE334C83E274A194A376BB5F053914C7DF83E411BBDD
-271C782539EE5CE86E3DA2682C634912BD8637BE31FED7085282BC8FFFA4A0D0
-2F9F7B62714D3F5B0F594983C9250081011114C0BF6BFE683261BB901A140656
-7FB4D34B2D59D4B2A37952B2150F7F0BFDCE25FD104A664867D9B5F9134787F1
-BD1AE54E3E1F8657DD5094CBE001A79FFF7A6A29C25B50376929504155707993
-5788678C618380A2D114F65D064435D44F56D8C2E969D054F3A5CC369D6772BB
-94805947ACDB934C10CB78FDC3FE572D844AFE0E8CCC0B25C67EB4BE8FA68447
-22DE142AF0D17C8DC4581F65836CC100525220925067A5DB6831DCEFDA4C3409
-58D49AF007E13958E64DFF010B99A9B2C250EE05106D80C7958AF90A2CAB61D3
-6EC40568FC2DE10756E7DF2C9838EC534834CA2E6342768B33CE370AFC934FE6
-57DB8DB7E490EB547D817E717959EF4C3124C9B6DFC6F313430426A7CE5011A2
-B8643B26857188E1923BC0C0D722DB3495C07B393D5CA15E71B1163114B4368B
-1041D31ACB26D732FD54BD27F7E0DBF1FEC7D4CB80130F3F750E0B9574B850DB
-675B928FF95029DC848E8975132E46A07F4E4FB760DFE3E599C8A84ACCBDC7B7
-50E2E7B44B12315486B5E36C10031E4FF14E1B8C2C101B9616B6D3F1F6DA316F
-458D0F76E00AB6239173B13DDFEF9E5B0F0E687957932E351D6DA95504B359B5
-F7E5863B601EBBDE3A8F858F8D226B02DC011914865E009C6F55AA1CC4FBED04
-0C13AB5C954B2FE695699010F5F228428DD79C3D3920F2B75631467487FA8486
-AFCAD8174F32B55897DF2610EB5173CED6E53534406D78000826DDFA40459E0D
-FD81766CD79277D950B1615599634258ABD320D8F1E60750FC5D839BF5AF451D
-DCD394129C099484D808AF2C833BFA65B56B8108ABB795EC97AAA0DFA912F306
-4594C7CB096546AC99646BD06A66B00AAF37163831DF857D9BEC11D0AF565073
-3EFFD23961848DCEDD747B329B1C0470B7C2C88C044DD6153592E6CBA21A015D
-4623C290DE06B357E931155942D894942DE13D7E1FE94D4FB03A90C684FFA97B
-D7257106C3C71B8BBB70D322CCDDE39DDF104CFFFC3C6A4ED68FEA52823AEDD2
-3DBE10A46C930B7874050B7D4A310C14451C9955E7D02EA21B09EA974567A655
-DAB255D067B913C8C8BEEF0F747F9900806D7618867341C49F395D78909B00B6
-CFAFCF12CFB569C7DD3357858905A89C09DF87609A0153471300D032B2CACBA6
-85EE4EDDFCBA9B9393611CB6398160A6178618F53DC8D9A26BD12FC5BE10D99F
-16B3D8A44009CE664056FE03DCB5938255C6450A6EA03F60DC577A1DB34A8358
-C48095F42E3F59308B51C402724DFB4654944445C655F68357E6303A1F480E26
-337818AB5B12CAD66E41DF871C71486ABF5217658A34630968B3ACBB5ED31971
-F6853BB51725FEDADB0107090C1FFEADCB70367D01655BB43FED064F3C59BBF1
-CA9059AACECDDA6A93107A72BFC8C43546219FF4BAD0E2BA19FE9FC6F42772BC
-4EAF6FC8FE96218DE04D77E00F666550F7937F610B037D62FE873001382384D5
-371C5B73D690A5EBE7355AADD29205F7381D3D758D655DD72197445FD743A1F5
-57D7807A98D1E8FE400C6E741AC6537CA76BEF0A74C24BCBD284726DDA89E7CE
-4431F4AA32844896766FFB8569B70D3AAE67462AB13C25520560B97F1670489C
-C703998A80E8010D509A48CBCC48EC52D619F7542E1427470500624F1F50C589
-6F03FBF17BDA013A752F4CE279E87112216AD59910E1B9D0957B6A2A3D839CE6
-81E311273D4C2B9A33CD0C760282F37EBA8CF6356C3D31465AC73DD9ECA31EC4
-5AFB71B52BFCFDD2F8A4410400A2FF3547B80B65C397D4AF6B314BAE4B5FC408
-D697AF9AA4FDA94B6BC540410D270A5317D9AC13F075DC8E3D5A2424ED57EB81
-C9CBC37DB4C6F453BFB5E52A1C30EC66129269B583B04A0A6FE60CC5694A8056
-14F8A81D7171653B491E30B236D39CCC40885C7B8B57DD43DAC6C32C95481871
-3B112939856B2C6A16E27264F4F65F22465B0015782E1553643171C469A08D35
-3F351E5EFAAA5A3440FCD03EFAA716CDD06454DF556F027903045D850AF30425
-231E67D59DCA6095F1A8005A50D8B0F85B6EB4844737C66A590BFAC2CF9AD141
-658B674A174C6FBA8E57BF6B34FCFBEF31CCD3658BFFADF331351B1818494C12
-53FFD05FE9677DCA63E4AD2C5EC1983E045DC861AFD71A696FC606B7C0AE609F
-36C0A90EB386994A007ED9D2349EFD645265013E717BD94A66D6308D1DF01BB5
-F87CE336C3EAC77EDECEB76F173DB9E1BEF481B7B02CFA679ED2DD5EA04EA512
-5D3F45A05E681B9A226B0701941CEFFF253DF8FA7FCA4C793985E6993ECDD9D3
-F3D0B2F267188C93C9824B92E8AAE50BB63E4F0932C92592097425F9533C747E
-9F9338839396E6F5C6AB0834600AC2478FC80D4756428C5E8C953DA74BBA67E3
-CA1E597134FAF54121D96D3EC56B04E942C0CA51B9579669E5B0BA3CD3163505
-F5A18DAF3E10EB1A9CB666B811154FCBA7DC868C9A115812329ABCADAF9C17A6
-467A90E949026BB37B2647A7D051DBDAA490723C43F705D7A53FABF2B91E9417
-39D2070ADA25A7AEC2F5E7612F07CB51A7E8729B059C0FFD0E11D77A1EEF82C2
-84319DE43E3854368DC488DD65D2EC3B8AE92611C1B74CCFE301B9130B31C8BF
-8146355A86673AD5DC32D0D00C7FC33FB2F1FA263797411130E686373AE3838F
-A42AA4F7BBEFF22F7CC829A95B9018C232D880E6441FD6A2E68B0640E0C74709
-C4E1976A6499A9D07D862881D0D063D2CC215D4825573ADB72DE36F8FD7E7C07
-807E88153F4E1261BBED152592FB9E306E43FB4338C7FC7E584B148192B03003
-CC5DC0E2926C59FED544A5D9A8FBFEFFF43967568B595597130BE1D3806FC034
-9E769165B83A05436E610A3E2ACE24F3E6F6FC40F1B9C7DC049404F1282D8A29
-ED19A320E30C2E66D2B133C585AADBD736A4950D77B6278946459ECC98AE9A53
-9BF64A9BF5CF9B24F12BFB5ACF91AA0F13AD869D7F61CEADC50BDB3EB949B706
-99C99B4674DAFFC8D31B96A1222834D8F7A81389A583F8FE7C9BB16023E8798D
-C5C8B3BD2270C8D9F35EF54A8EA8038A50018F2B8CA0CF190BB85C7D135E436C
-3ABBC9C76086B6A9425F84FB3E6EC62AE49CD54A4B673DFB819F37847B0D3E2B
-9FC5DA3C384DF99112160808FD3E15FDF82213859EF0E653897B64415A2BEE47
-7B7BDC1882292CA07F3948B7C26A0D3B2A57AB664F5A0C399E5697A2FB09D1DD
-B2FD96F7691AC2060173B7457287C7B27B9DCF58E609623631CC0984DD4919DC
-24B66FD64ACFE2D15BA049737DD142A254B6F2F4222034E26EA6C9F6832B958A
-CB479806632C44A5FC3BEFFEBAD867D1DBA5C0EA9AC82CBF56D89B4557C7192C
-293A693759CE35359055A2A549040FC43F58E48495CFD33D7CC7DB25480FA8D7
-DF149E8E3ECEF8328991923C4B3FD0A4D0B1C7D5E1EB033C56A5546A711DE5E7
-A2F168EA594A7EE68BF805D039CA96CA9C033E11A20F8A6A3E1E7400E86B3F89
-DB506BB4936A300008CA2E3F5D28C71E2FFB2B5BBAD18B950C90974EBF01A56C
-5AB94077D6071CAC8E45B0EB9DF22A3D896D2A45DD6474CE6504CA41D3562F89
-A034D7A2841D810D8B9E962625D7B9AE806009D39C6568F3B86F87B86F3AED6C
-6A42F9FF86F3CD8F78659FBED4012AD3C903E140981577E9E9AF572E9709DED7
-2633035EA96932A6A9759E5A39A8B59CACDA37DA21F64EF56E6683C166D5751F
-132B5A99E5624B81A364861495CD9208A811C47A594534317D8172D71DEBC579
-B7F602E3656C138331A03C1D66E02A19D68B80B6CEF1A30C36FFB21A8FA8DF16
-5190F44EC79B651CD09A96A9572E27EE3DF890D9FE1666710134288E97C14357
-6DD606516778FE550B81817D4D29EF9C1048AB62C5161347B1239B5F456A917E
-EC333564922DBDFDAC3537BE348EEB932D2700855C1B38E6632AB42688EC96E5
-E70B6E21597DD9AEC0C66CD5BE04886842418E5D7026CCF8F3CDA2560CB15D72
-64FF100148BE72752ADC59C8F19B039954A66B5D17B03ECE70228085BE334806
-FB49BB79CE8082CE9CBFADC30179B303D64C34BBCD9BBD50D0773B7EE72E9246
-5B01B90848A5ADCC95227310A886872DC56466A02A3A9A5F720B7FE4EA511BB3
-518DA5D1EB43E13429BCB41242E8D2908CBA3FD3A2881C911BF95BBB667E8B7D
-612A9035BA2602D6BB6E44C66138FC57776827BB7D6E19056EEF9D1D01CE27A9
-02C6517FFE875770123508F5C5FEC021C2BE78AA71F9D9952EC91820874B0A93
-AD291A3032F4198BB8BFE80EC6EEF6DF748E37316383EC01CEA99A64CAC75EC6
-1BC2997B1F2856FF05FB6772F6BF07764CD4751CA4FE1657A1ECAF6D8C5AE8F0
-8C9247C4F2BABC32CCD25E991A387DB42B2DEDA9FC2ABC3137D87C9D54778164
-7EA9972546C794D69C636D58859035BF8CA3DD17231F354445FA10DEFCDBDD9C
-495A261258876CA0380917962C18EFFCBF89DC4194FE9A1CF72DF12AA04A6084
-E631F9D152775E93A4005A19C1FD6A4EC47EA032C6BE37A2B78785370405E27E
-6CD97AA308A962761D4B7FCA5F042615169A97F738D2E3DB6C4152C6FDC5D5E5
-5161772E44B4D900B9EC705103368DA03F5E062C2936E0A98D310608BB170E0A
-721766F9D9A6764720624C1A735DA3FC426FA08BA9FE9F9375A3CD338F0E8E9E
-AC95AD060D67186CCA0576C1BCD646981D38BA1D3D33819F9548E468D9A8460B
-ABABBDC0A2D50B5C4224C722A681A9BD8D7F5DA2D4A343D1BC9029F1B9BD4B7E
-FA4817CA039BEE3856BE4B367F942B1A9FDCD1B804D69A132A476F5DBD8D7253
-E11FAF4B04BEDB7CD483BA74CE27B2C4557DED04E0A472F4B745DA0CFB86A9F1
-8AD4206B208661CDCA7F7C7ABADDECD59EB566F647A9138A8C5376D034878D66
-B4F4B241411B9489A2D9BBAA5D69A6F075B790E42FC929F4703CB5993D7F2A5A
-233C307CDD20F07756AC73E62E3FA4B599A19B7114033A6CC6810F1166A06F2A
-B13A9F2183C9B05F13D80BFBE21F47BF5948766D82AA817B5DCEA8C3332A308F
-72AE7EA0CDA16227B77AA521C155CEC0AD88CFF8F8EAC7C6CF91457F050007C6
-FACD0E8DE03F5A484920787625CDDD132C551ABBDDEBB1F7614D5B84937A03FD
-51DC15EE0737A98368B12D24F6CC11F6C6DE487B0FB803A2322EC745443F93B1
-C31C452CB55AB657011080D77DE585799101C012ACCFB55B0E0DD7788B6D0BA3
-8C73441FFECBA1924D322BAE3B180D6825A4C3D4E0E72C2446FA448AA84A0FAA
-428D6784FE0DC862229A2A4432B21F3A4A9C6CE0611606F97603609792DE3B44
-FB1F8E62327ED68CB6F372522C05A857E059337AB8963C9B74458AFE461803ED
-0E49E0F9B522BBB7AB20BF8C80937F41971A3FCF31D06F62571373E097558027
-0692E476E281AC8009A400AC26FAC8D7E8FF65A454ACBDD1462A89E8B2E7C7B5
-394DE68607953A7E3555C7471750033EEC5120731EC09FA95C9790777712BAE1
-36730C0EA143778E476557720F32848A0DD352F1A909AAD94A17EFE08EDB3D34
-E2CD67848B90525F263F480C47BF4ECFBB1B74BF2A905127BFF26B3E844A96BD
-470BC54684FE137B21821358D191B3A511B8ED334E1FAA089A43897C1DBEEF45
-D9FC57743DC68822F51FB589DE48E0A2FACDDB47405E56ECB39CDE9E501FF1AC
-0EE82A440A3F32DBE2396C3F78FD4C591836913F2E60805CA398377919C31E47
-030E4561CD6C7FC45F0ACE67D79473624794C8696A79CEB837700F3EDFD7A8B3
-D1942FE8090CA16D616272E8A3ACAA54356EB2052767480F078B395BFD7B0CEE
-182D6D01FEA66C5A6941F74D1BC8DEF650740B2A2E9848262290D704AFAB96E6
-5BA9515184B323E2425356D38E85D137F79C13495330F034FF7BA30B02C5AA36
-8E0EA4A6A10A56E4CBAFB2A0043486426CD20A168118D5427FEA1264777F8543
-4A415049AF307F6E4C982FBB3718E255F947C1F2BBDE78BF7C08FDE37C4CB6FE
-BF88A3AFC4AB9B077516D7898EC3C87A4FB2C2CA4E89F6FCEF185990509F91F2
-1C85F09084E3490DCA8F96FDD0CF777FD4FF021814DBB471891F8DBD584C475C
-912EF1F70CC389A390D36F290A544F1D3303A5C2728DEA320843076351921FE9
-323462B251FE732D2EC98BF1E4ED4C3F96FE04CCAC497AC8330C4D3D8D3AED08
-3B7BA8E51544DEF22CBB7FD126F7E01D6E3E6DF0D2F38E0B059637D90E2E9DA8
-5A1A404BBECEBE1A0D5308D992AF73560603476754C6BF79126C436F8081AA12
-BCE6E8FEF3DD192ED812E7BDB1AAD1F8D14C169889B6C1E155007DFD98140F6F
-37AFB159DC12A9E05A272C8C7655229980B5CDAD4047D89FCCB41E66DED71F63
-F07673212DE5D6FE3262696586A92EF04561C101405E21B341424B361928FA74
-D1F0F4B36B01FA6A07A7E45443AF1CD8ADC0AFED6FA8D8AF2C8CD5272A53C28C
-AE944B9045DE6305CABA0B57CBFCF07145C297A4BFA8B4EA532BF6E6A0D7A452
-1F2CA064ACA886650D27E3F605A27B8FB827BC68BE30EF1707E819BE9F90FB5C
-D305CCA3C1C6DCC1F1A1640D04A037977721F14F49F449D00CE1AAF040CC2FC4
-7614798B64A4BBD1776F9A1F958C0364C5D87555CEDEA1D979AE13F028C1A79F
-5232C1706CD1957E6B772C89DC78F9E1F2D4B4CF9C3081973726FDC294698D7C
-5B133F141499C32F8A466D72047ECE96EB36F6CA3AEFC2DE54D25DED3A3E5A80
-D02DFCB3A5E366C0581AFC853566B5A8FE47871B3E283257FA60C5AF514EE72F
-97E44BF870ECCB515A94ACB1BCB22D37D563286B2F5E484555C5E94E56005A86
-A6B2AFCF2166929C97434E72C35DC831162CC6F484F36A130B8FE1BACE568210
-90ADA920D96AF14E812CED41CE8DA5C50E9E7B9194BFC59E3697790DE569A6CB
-DF2CEF5A4E802CF13C18826C26373F508B6972B82BF855F6908687246CB307E7
-38E9B07F8048063A9BF4B98B8C064D1F156887727D430BCC27D5A0C406DE1AD5
-140F883DC4948F45C5FEA6518EE06CAA2173A4DCE956FC96F1B1A4FDE58FE917
-F92BA13F1A97BE8F67D7F4E31FD190E48BFCE942219AB34B2471E3A1DAEF0391
-EBFD2D7E6B21A8A7E14768A51A5FDA4BD00BC6655F16C8186DB3AFA1BF4B117E
-EF707AFB48006BEA3A03CDEA5ECE604C5EBADCCE8DA638FB8C7BA7C62C458703
-31799FD9C1D86BA345FD20D20819400EA4C5852EBDB2BC24D93349E4A0F83B13
-F00FEB05C4B9EBF60944CF77E73B7B02A4FD77C55E8ED9CF5F90B74AD0F7B31F
-45008D57A1CABC54D17689256648BA772B5C5C4187AA81C5BA8836C4FA9ABA57
-7BEF8291D50AACDBDA73923814A2B3E7B42ABD14F3A14A60F4AF671FC8DE5ECA
-A91A3889B81A2396142D56AFFB120C5879E5A831241C321EF41D4F07F9D042D9
-7B70EC2AD9B5AD42ECE4467605FB8B7A51E9EF319684FDEDD446C5058B5A7C5E
-0CBA92B61A69E6E3C86F927AE51CA81DAB7192F880BCB408DF63BF96E7F0CF96
-EFD11A84EDF771B51B13C68E77F555AF327FC45AD346491162CC3FE0AC38869E
-A4AB1727C8B50EA6025FC0799CE6CC08DBEEC0F159D48C56DCFF08D9DAE3012A
-F9AF6C7ABEEC3DAF9A802F246923709BE64048C9E9F409485A1E176E62DA2859
-315677A95BFE35E67AD99F718D44ABD943E5B92AA0F2C59780C718EF1B26A631
-233F61E53C8A197A0AC2AFC9775EABED3FBB7130081B3D0C9CF4BBB1D9A1B67F
-AC2F993BAD45B51CD67920E4F9637B69F849E89844991ACAA1E8790D19B5DC31
-DFA36E3F855DC73143AEDB781072153CA543A2DA531EF0DC4810FF92D9B94FF4
-DAAC1B0DC33836A54820C7C7F5642F0D20CE07AAAC77AC4FA51AB8B736586F65
-56A828EA7DB2E6AF374D40D11C30BB974D7ACC1C2B27F947178F7AD8B35BF2D8
-EFFD2E20B8C5BFE5D8EEE155017AF9EB37DE7F5544097DD2470F66AB07CA6382
-226C92B9537D287A0A1E57AF6C1A0A18DC3764D19D0A7AA3467FD97AF670A0EC
-BCF0D4D42F1A493467C4535E82A258F95769C7BA6531EABAD7798E22B6A0AA63
-4AF47B8197CFFE4DA3FEC29CA25CF395D601F06B39C89D7A3C2FB110CF59402E
-D3C89808BA8D3F0302F82C7E66E1DB53D7B02FC5DDE9A050C2CB71003807A9E4
-9B73F7B945929F9B1D8C4976CFDEF099B1A8EEF3389797C90CA68DBBC3816567
-24D0C57D55758F460957705F1620DE8306256180F1DD9E98163D499F6BAD893C
-73A29F57A88C79B55D644C37882C7B82D16CB15473BFF847C60373880EFEFCBF
-15271BB52855B75762CDD566E6673DF95BB784B578353C1BC5B56AACE1CB6944
-6C79D6DA087565A0714E5EEE2D0EF9D6E3FF7EA0331DDD7AEC7DCB441C81FC5C
-12A3DBE217C4C6CF893B0D3DA4B73DC2F2BF130E7813E659A7CF758E73180635
-D5C9EB39D6802EBDDCE71040B65B96EFBA434E55F0D62274D2AA44A21AF5B0B2
-839A93A97BD9A732334EF951518FC8A0B10C916994BA16DA6D4CCB190DB6D252
-7A837AB66DE254292258131256E8924AC7A0F1D1AE25DBEE15545D26B0D675B3
-73CACE88AFEE6A1102501F8BAC82A5C49429B802E81BA07D03321DAC1541EC5C
-FDE0C08B796895F2E1B2C82C158FE38F1DB46C6B525C693253045F9A41C99162
-5C59DD1A955D89A9A803AB1B386E563E97CDC59A89F7ECB733951C53B405D0B9
-FFF55AE6A92FC524BF3627690BDD7CF51C91702ADACBF25FCA4472BC9EC24109
-3A7E7F146F626FD04B1B1310489FEE98F62094536EBF413D7A14F4630CF0049F
-3B06B0C0A9CDD4145844ED7B2A359DD3F3E76469A1E1F88D5BA08D98BB152BCB
-E82452EE2678CCAF2DF565205F1EA4B7152DE9267890184D2643C0EAFDE6A10C
-6D4A118B470525AB8333793D68CC118FB4C2594C9634E174E40A287BED466AE3
-EC659A1C817622EE74FDFDEBD0C315026E23F246872822EE91CA5F54DB10D82F
-34CFDFFA8EF5E7DF28599C76C3A5A8A8012845667C3AFC8778CB308A7529DCFF
-946D662F2985478560495F401FCDFE110B652F02486A31205CB3409BC2445E4E
-4EE5DA2608260D1F0FB9F19479CCB6E3FFDFD9C0AD22D05C71F85253A8A09AAD
-5CE32BB44B26A5E0CC4DE00BE9D053F69949A82EC43216A10D33D971CD003E3E
-05E46A797D07FFE2BE809534DE891063D91EF2AEB2CCFF995574A4A661AEADDB
-2901F6390E93E1D40E98C7269B5D0376B1D556138B84C668A3F01FFF41563CA8
-22496A230B1744C5E9BAE0716FD4B20FE26F31F982E8E15F366CE98AA78711C7
-E04BC14426245E073CFF01B310EC370CD7A1D12442A302DF741536CB81CA5AAF
-7E1AEDAFA92693552810E5E9A30070825694B374AE6A71C2BC836CA76CCCAD00
-ABCDF96D1A3743C526FDE299FE0D34D2A02D61C4609A4308E19B7BCFFC4F7468
-141592B2837E7508FEE49BD3CA0E7F00EA0339442D5FCD0D613BA8935D73B22E
-1D04364D7CF5B2884B657BC4654DACBAE1A96F281123179892C21127466243D7
-1EA15DDB2B6EC1BD2FBA790EE2F3A78CFFEC079558DE093D4D5D673E0376BE27
-D97737149CCB05FC15A018303C8197C6E9341850886B9BF902B1009372565BA2
-156D4594856A834EE39E1F4F4E97AD97CE3142E0315D0DA4FFDB85EB20C1849C
-A202430CF6AAFEF97F628D7A605E4E321B6F7338E5AA37FE94344F98CC48F5D1
-480C452EB80C17591C6DE1D3BD4128F0A87EDB0B4E6BB00C0DB0DA7552C98FEA
-1ADB74A24041B574EBBD78AB937751A3C5E67F47E90FBFA0D88CA6CC7A8F06CE
-9FE37899631D1C4175EAEF9B0D206F218D72495F0BEEEDED6B736898DC7F5BE8
-886C6F1F971BE694023581596CD92FB856770236CE273D67E589DE38FF09AC56
-54FF28A6229C014184100E63A58313053CA2AA7178AD9E83799216DA2A533532
-71491192A6BAA0AB61045CE0BBF1DC3F97EBD47939442D56D60BE3C8769542FD
-82BDD0C82C59E12EBD65FAFFFF9FDD1DAB4C2DCA793073DA6003D43AB34D49DE
-6BE4984F46469246C696D0DAC8CE1540946D3E1E3DCC62DE19C0831A2459B282
-0B3856AC04F1C8FDCFFF85FEAC4F39EB3978DC78A39A491F5345E76737F6D744
-949BD6C007C1355644E5CE8F5525830A9F6A41D5C4CE124BFA22D934D6CA17E7
-A605411CAF6FBB973412C0D77FCE528C4D8964C7FE38AA2E5DC90266B29B43D3
-5C5A25157C68155609D313E7F15B055FC0D94F2C5EDCB633623168D4A430FCFE
-AFA26C0FCB586A81567FD0F442B373F2C2244648E0560E0A8E2B250F6549BA36
-57E2B248920DA2995F735FE19502BE2E8E917EEB78DCBC7DA169D8A9CDE8B839
-8E49BE238E46CEEE2FFDCD4022924196A92BA33BBD2631A7299FB77168898816
-12189825E564FFFAC9BA9294B7355FEBCE3A2656F803951F3DE3703987BA1C65
-B70755A7A84702C1650E6BFDAF02630057C81DE4739FE219742C9B7B38799431
-77010C455E31DB824AC206466FEB06DA7EFC0FFCA5388F5542F93C56F9311088
-EFC400535CA13B64406CFED124CE07658514B0CD9997EE7BA1ECBF9F208A5842
-48A6559A124253BF0B7FAE1A572FF4ABACD0EEAA5CDF41731983F2AF1C3480C3
-6A702AAA1ECA89433F5C432AE2BCB78B762077F5885154A59B1BD750D08F8FAD
-1B239532A4963508222BE34ADF98816F358DCFD5F81ADD3C017A808F9E8CEA8F
-FB112E2956EEB689E0F7BB4BE12317FA352C08E74EA43CD49C200BD19DB6EEEE
-36DE5CE0E2C648212F1991F8CE69D093A792C8C16A31E40C436744E47B12D24F
-69F1EF34986004A83720144B5DD8C92695818BA4D9F95CBD1607BF768FF81F9A
-457B40E7C7C8218FEB865A23C41BB84557B5975F386D48F20BEB92E9B164988C
-426BA43F1F30EAAC3AE65765155B94555E2A5171DA4BB3E243DD6D50DF5E365A
-A54C5C47F62E3472D363189FB9BF00C15850225A95B2A5F85AC26758CDF14058
-7BA3F07245800F0E1A195477BA46830353A6707A63EBB486F1A2E628764849ED
-6A082DE08DA495EB5A1CF5565A0DCA7826EE7B800D4000619E90211C19E705E3
-D667188571622A904C468B19E515697B7D9DC650C1FE08D18E0452BC32175CF3
-D0AC419627C323C02CD6E23BA6C0B2E95EFAD56AE1C8E750CF210BE153986563
-5D15CA3700598BFFF0CE909C921ABAB1001F846D82C5BA038D314181B534D17E
-36EB7B608D2AD01818D2151408FB57D70EF005857BA884F800AE2103A18A1BD8
-F507E08944D6E0FA6CDE0CD3CF6D07898B8887B2A21776A198FEE71B7A0FA1FA
-5B6624E72FE4A672EC528F7160F23F837DFF75F7DC11A78B505A31E90499E92F
-A29D9E9D5E385BEBED4E543D0B0D92C271B9D517C82ED234AEA1DBEE24DE3A17
-C341549EC96164986809E4648092F6ABABB5EA4F9031F89D706F3445E2E52250
-4BDB1C62D2FD8A71BFE834C787C603609B62915F436D56A385237B84C024C2BA
-450E64CFE43893B573415FFBF0C18D97908CC3DB39DBFE5322DA82D4AF6DE21B
-CAF619898FFCAE76174518C33E6EDAB7A2EFFAD5EAF8FA4F7A3D021C55A4C002
-DDD96D014338A5FB2C214B43B4C6B733BEB957BDBDDDA16B762C82C4DB7CAC2C
-5C66C8C248C6B48A5AF78D7B718C988182F6C56635B24FEE045E6B5428A21833
-611058A27DFBD824ABDE08615491A1439AECD10ADFF051658375263C4C2DAE8E
-5FD3309FD5565082C64060ACF770FC723BD76995154D35D182DDED00B80AB6C6
-379C42D40BEA5A574E489B263FF2A27E12DAF300D2E08F439728CA0C1370E6F5
-C32E0A1D5B7C8C199C53AF6BF8905FEDCC883E3BBA883FCCCA6366384DD69818
-D9C4C2FE0D13A8F82431C2A4964D949850B936C89DC34853D7070AE0824199B2
-EA0787F3ACA846E37E9DC39DC89E106204F6234480E07E2DC94319BE1C488F67
-9E984848253BD7DB8332AC0425376B6B3F07019B87120B0F25807D6770754143
-5054374D89E7D617213FC9F782D34730F58E916F2DDBD5319F0A9BBFE78E253F
-BA463950D5737B84CC250DDA5CA4A9AE3EC7034C78AE09F6A05BA63E8FFC3175
-821DCD0275020A68EC05DBCFEB123D114D3967C7D68D5A71BE5090C72472EBC5
-472FA95F07C1B85B91B03BBB90B5BA9263138807B5139CF5C35481666A7ED675
-986A6305DBFB1E8681D61D17B903F247CCD7E94569F598958685F487F413BC05
-90B76EB550A20CFA7576E3F9901C1ECDB60142F578FD684382B0BDE1C8B8C40E
-70E200C825E4C853D1DE36CAD6DBFECEDFEF4FF8D9610535722E7E92FB46AF92
-30C9CF8547B36B788F6B464D0403FF830E75FE5C488671F49EFB070860EEB9EF
-59A0663919E552FFCB7DC70A9B37039FEA11F955E0047D4C51223B29AA0AC2EA
-49E41094B59A554D3F6B89B01ADA663A7239254BE38061D0FC1896AFE32DD6CC
-9B7F45FE6CBBB251604917CCDE3217439C4043638B9914151283B1DC4FCEE80D
-2851B13BC5FFB868FF564683292BF51F2FDA82587BA89618CF171347CAA34671
-020A84C1235E7CD9232CA37438638C26AF281B1437D126B5848EA474E61B2DFA
-887AC50CC739C34F9759ABD50D4814D9DDCC3023A307ABDC42DA6A5B11D13E8F
-7DB330FF224E96FB36C6FD432CE957A0552893EF638DF8FF77225DDE7F2FBB6B
-961280AE30FF7A6A2DBC7A06CA57F0F53FCAD4B5716839AD1B1C959535AE4888
-125A1995517B77A52783D0155B2779DD346E873DE3C6D648D1A7C9754C29C343
-D9F8C81EBBE8F59906E1A610AAE958373D315BA032EA026F22A846D421D29B5F
-49BC07D6C056B61B34293BD9FAD4F26F5F4F75C1AA67B8EF5B316ABF8277F39D
-C3E23830EAC84627EE1F023A670D25128907885ADF64828B9066A56AEF4D1EAD
-98A2ADFA5EBDF80B3569D93B60032B619F7A79A19406C04CE33112628AB098B2
-609CBF3D2E63F64AEB9A68526B4C9696D602A0DD4747AA230DEBFDE27B1514B3
-66BE6C0B6F33BA3A990F14D0148B7AF706B95F4677A8F0E84164F5AA9888FA91
-BBB46D23B89C6D9B3276AE7AF2DAEBB0658232ADF4BAB4C4D75BAFF7BE9EB97C
-486F625F571F41D950E521C162E4FD8CE1643E13156A74D63BE736BAC443CB59
-069BC06608C6D958A0CB4AD2F5CDBFAE0922ADA57600D753A9E48E82AE08B34C
-F5582BF8B654370663ABFCC008BC20A004F5DF0FF001B225AE06F0805733CC40
-DADCFB49CC90404F387E9D126330BC4221E4BA6A0E8A8C496115DDCC95D5388E
-E10C2FA48BCC7AE21CFE7CFF979F91EDD80B80C18D877BD93D0AF3E02F79DF4F
-981FDE508492B20F7F37E9D35B69DEB6D1F8AF3F05ED411D61FA89F8913A690A
-A3CDD0D72D529483734B05872038744F17760690EB6E6B8167CF2581B13521AC
-0BAD559B9C1024083AC6AAA885DFDE9AD7DFEC0B0139754215569281843A5073
-CA3AFEC3E265C457B628968C44A6AE9A53FA423251A03AA270F51F13BA5F9FFA
-80DA548D56DC6D0417F3DA517058DC9ED756FB2E8867B74FDF70817C15879C27
-0D8456CD4B4E39B41B635A8E10DA744889CDDEF45B406BC6D9831F0DD0AD77CF
-13914D7FE112EFEECEE1F881F9C375A9BCBBC00F0F3D0D5F9DC58CB26B2C63A2
-20DD5A5A1DCB3F49F29073957251FE88D9DE640BCA0978DB287357AD5BA5069F
-B7ABC4F5B10C9FC272A56490B24E0FD2F5BC3FF60CBDA5EAD0AA4CBA59E6F951
-F5FCA03546F7D242A0BD67804B580345DCC9C68445C213ECC69E1E730BF6EF06
-05AC8128F5A4D3140A8844846D174A77F0D4ED59F170238F0876EB4D3444A080
-44262048710F00D7E218346004BAC79802CE708BDA11BA209FC9002AE1B694FD
-3F616199C5AA6590761585C12B49F795C9A8D00808697A437F00921C66CE6D86
-C68FEE49A62BC6787680A27A0DB318F4CFE0891AF2EB26365BE68F2438E0EDC5
-75DEEA0C73886A0471F6053776C786453B1C092A553B7953AC92B2B10EB1F8E8
-EA68D048E35E3EA92BD0BD47632FD6E13BB4DA00F55F9199675B8636AB23D634
-06EA2A5C58737A8E30EA12F22EFB2B0AAF180C3130122D385583FF417202CA9D
-588754F5501E5368BD33D79BE01D9A2495E7F409C9DF4288FD55B9076478B41B
-B4085CA5B8D8B6701D50788124E5656B3E9D7500654730006F3A39B4C76ADC94
-9FE02603844AFBD18144BDAC7DD09D154D6A047A230D44CE62F1317B2A3B783F
-C13722F7AEEAB2F9150A95FC8FBDBB6CB0415D5409A57795F5083F72D1FD79CC
-FC1FF965FDC61297B4F76D059C493656CA6F0965F54229BF23A13F794B0F5BBC
-D4C4D0351A346DA55D4221010DC9A458902F20ACD56F01F409518C4EBE896B5A
-05CA57DFA78DCC9DB61D0C477D131CCF4DF3C2DDED4E7573E6AD6D5A54536E5A
-007FB21C25639DB2AC2C5B618325EFCA183E89A7FA85A0C1D6812F0CE129C5A1
-F3DD02C6181728CCF87D6F8CD5606D113EC79899621ECFCB29F8B4C4F08E89D3
-E7988071DFB3232C7C21D04C5A2F5AEAC737A1392DC2F60D88BEE9ED6E882CE1
-C7B42E43709F34F68CBA4F352B387DE2DC06E471F98B310D0BD3E994FA0FCFCE
-B4D97C49E494F814FB09835AF83EA1E18642F4A4C32D04BFAABEA46BCBFEA0CB
-F8230E404ACE57162F9F96CE7ECC10F782140E11F23F4C2BFA61AB6E1ACC9496
-012837CA40EDBA0C62E1230A30D5C8D2C6F478813CC3D0E8BC6ADBA1E5238837
-DD5C6E4F1675C92E41CAF10749907EE81DACDFD8A65A9FDC4ACE2AB457925E68
-8DF970BB7927FFF2E957E53B966C2A5D8EB11D43A8F10DC21E3F8D2490997229
-3AFA58573E7297834E153A23A61E1380BC0C8B157E3D52B9FE1587282DBE52B4
-7D021A4F83CBE165E8F7E25F91C78F8177DD0C5FFD35B497E519444446F0E24E
-FE29CEB06666E1F5760C2D2B5C8153659DB7AA36F284FEE3951772FAA4E9BD41
-D9CF7968CA215273E88FD37F1A64B7B4AFA2E239BA6F9C463A8C5D0CDA152D44
-E61D6524E88D940FDA1B4306B1388863F80ACF9FCEA03C88ADADB7C4FDE56D14
-2192097015E0C4F622C4118EAA3823248E6B9CD5C9DF3517F731E17C1DEE88E9
-8C10DD9482135FE1581B9F9D274AD2A4F4C4AB82687C897373786FF3A19B5DB1
-28D5A3B59455D17D2442BF44AE3D3E37E5635B3981346782D169E3860E6E33DB
-C5777DE21CB2446D3D53E25C1C3E4A5319068D3A4EFD2D1616859959B5573B97
-446B9CFEFBF8DA22FCFBDAF672748900A1986D6FF0C7DDBB737AD8CCADB39D93
-B8C0B42AA5811564134EEE9E1745DDB5D87D6336E21EB806BFBA21F296F3620C
-77C57F9F2F1535C1847D7DFE870D292F1889B17F2A1DD8122D646D4B5ED89A89
-A27B55E5E3DB0A21BAE974EDD145ACA2D3DBFCC41E1442E4C71572F6332A2BBE
-1F26951DD76F7E9F1D21AFDF2B2F176D5FA873A0E87927C98432469A5719E87E
-61F0AD048A2C6CEB22E0A274A2E24739CDAEF7E741785098969714FF22FD766A
-AA91BAA4F2E148AA2A4849E44018CA3A56CB24F661BED204A3228BCB34A71328
-DEA7E832753F683136EF071596E0E1553FA9B7C0FEF063099155D11E2B4CF246
-01F0BCCCC30D72FF73C88DC2AFC3E2BFFEE8455BBCEB9E130D528E13BCFD9FD2
-A0862E4516CCD3407C7C7EFECA329194A48BE68A099F9CC80CF4724252DF4D2E
-BEC248133C357C7601B3B7D76D040A3EA0F3727C4479F1F781F9EC9EE799A795
-EBEBFCD07D218B1C37351AEEC49D2FC2133127ACA717FB1E3DF5C553D7B867F2
-984659D466BD116A607E68A3D7776B10E62DEEE8AC4E3D019C65567E66CE17C0
-5D77CA70FF0BC2B669673169C842F724BFC7DBFA4E056DF12AA73D85669610F2
-98F468FA0BA593C51040940E87E2E7D3DC8C2E843DA2756D6D139F410F146B05
-D18180CC1FC0ABF1EF9EE86901E87582641E7F09BFCEB2CD5089A3D6B510C792
-C60E635E453519CDC183DE287C8B2340D731E4A792CED7174B9AF9037DF5B279
-8375003A95965124AF855AF2CF04812782E1CE0B1B9BF7C188A53C4B86321301
-F023734419DD8F8236B11F4C7015080B3990EE63A22D721EAAFE702856A5ACBC
-ED1FB74F68245C1DBF46C33B755777B983DDE8D41590E7248AE8DB259CA35197
-FE3ED93CB51EDCF280E094B2CFC61F53FB5A52CE74702030A3C90CE2AB3B7FA6
-59B305765206591B0143B4DA04D625B22C7264C261917A02A2750BA492C0F0F8
-114DF714AA6B003B9540001644DEF7462C01F7B90E2FDC0981E79E9763A10251
-FE38FCC2FD0AE00EA22722F96BBC059C371CE5936C634F2D07BEA7D46CD3CBEC
-0C7862B368988A95BBF0CF65967E54EAA99F39A23FAA08FB2858D70CF94E865E
-F7D4A937C06917E8D9163A2CB42CFB57478EDF9E6CAF70DB5477AB1550E97F12
-E55CE92A01EA26E55A8BC51A38EF2079B0D7BF46376B8FF0AF901B8227C936EE
-19B7AEABF17F242544350A1D0C28CD2E526A44E60A708221302E3B16544E9E84
-23CB9A8057A7068320F1D53DA24B308389962B9AA889DEA3A71C10E4DB41B967
-2C2B9121844BA1C256EDDF8EB34ABC0B1961FB40B44656693EF0C864971A3627
-C9C8D89E73445E684A49BFA4D3670AF017A9B5425085FF8CA94484C8D06F0C5E
-46302D06D1EB646019513472C9FA7C2296085E208C6891EF2A7E3DA75E2A5140
-F5BEA92C2A5AA6F44E6B2C1FA1FFE434E58BF6CEBE3F90E0D299ED043EA27EC6
-3CDED517A698152C766B56AE25BCB8FD12C27F0AA3F50FFAED672BDE0E14F674
-5EC2F24FC0C84D684DAC7F10B2CC4808C0A9F91818DD2F05E364D0D8658449BD
-BF598370B5FC48ECD85DD9166869DEFC21707C30F7B7CF99A34ACF26C62872FC
-A15EDE09F554E21317DFCFE0D45CF7E38A72DD2E8F6AB44541D85E0F95617224
-CAC6E099E08CDD956DBDC49F1AB81DE6C6DD6C48241C0985FD00952B453DE19B
-2EBB3424E658507F403FD0BD1C0C5E09F15CEE4A24DB327DDA8D88D18A41DBE9
-26761688A6666DC33A6B0CF337FAE51CF9337627941B818FA53001F639D488DC
-C10873E21F3BD0DEBA50BBFCDBB76CE071151AD2C3B54E7DD18865BE6233F95B
-69DDE72B7679DCDCD24DD7DB3732A1E8B4C8024AA5251A4FBAB4FDCE468774B3
-8904877FFCC902C3DF9404F3A1C7A1D0F49A3E65C7133B4C1049A6845A57638B
-A9B10CE7475AAFDCC84276DFD61369A1640C76C2372EE95A0EC399DCFDA9133C
-C593E499E24B5B2D03A6AB3E43B4B73E233F7F41FC38A0FE60575245327A47A5
-41E2EBB51562EDA317BCB5E207ABDC58B74F28B904DD69D58D534662E95CDA5B
-DEA467DA01B240A3A71B2624B49B71DB8A81A3BAF67E15F4F2B57ACD1F1900A5
-252B680D17F0887F613BA5B9081CCABC851CCB4C37A8E147D3466526B407A4E6
-19EA389E1D5ACB3B494BC5BB2104807977E5D773354C9AAEDC1B84A92CBB706C
-C4247888B0E2EA8CF8AB5F7B89834C08AD34CC099A59CC51264D833332D19422
-36AD35E35F1518AFC233A4FC35CF30F94A8518E299B6233AFC100FA3B3657225
-88A43DCCF90B6CA4DFF9685DAAB56CC40B6150C27CD76F4AF209B2385D41BA2D
-02B552C436304431B4B42C4C94EB36BAAF23740E36F555989CA4BA8B4C17400E
-044C7B7482F0683EDE11DBBFC36642676F02FE0BFB74FA890DB2125B1EC34561
-77E3D7CBC9BDBE1A50662C9118B78EBD96BED8BC7F2661AC6E39696CEA072E9E
-485DD6FE282F02DFC87F3588DE87F1E5B4ED84E5D98883DE09CD37B421ECF443
-F3FF7E57D32D528E5AAF87436CFCA1A0D915E1FFB734D14F81F4629400931E49
-E5908D1D3BB86B3E02D69BEFB614E5F058F715935AAA8A9B03FE6BF82ADAB9C8
-4C382F364D128BE5558747DFA3342979954B0C484B698B663508923650ECD360
-E75A9FEF372951FFFEDE0561CEA80EE29F015EAED4708616478E4405D09ED7C2
-6221BFB22BA42401FEA2966161A65C08275E9EBC7966E560E69AC39CAE196BCA
-DADE8D7FD55E69EBC1F74E8E0CD632687DEF2E32D02CECE979BAC2694410623C
-E89C01C905EE4BE92DB386768475C054AD40FAF3B044ECFEE1167C08592B4F6A
-038B20DDD4F8C70654A00C0D28107E45BF775B1219DA6B884F7728E0FB23DEDE
-A79D8B6F80E1FDF72EB717620544E58D042BFFB2A89F01B7E2573F6B5DA82DC3
-5F9ED7B644452FFACCE761382BE894061AAF0ADC92B218D3F30AC8B7C2B4474D
-740A9661FA4F44EE53F2BEB101E16102AF3AED740A0486BE28543BC49DA90282
-88E9977720ACC7720217108EFBDE37D013FF19B60744D735AFBA27C49281CFE0
-84E22E30D2B418CAE223455679F7AD9A8BE049562B8F8069B2DEC65E6C07752F
-3AB1D19C6EB11903187DE9A2B5ABE817EF14C5F3CAB32B382A4A1AE10E9FAC76
-57275CB4A19D5E4AA90485C91DE7D83846A309F908C26E3C98110BA217ED7A54
-F0FA10F8CC083189C8ECFD6D24ACBB7D14BFDF7E8EA573F01938E750BFCE841A
-0877F25A4EC9AF0D17DD358329C5779E3C4DC2097CCF7B2F23A3670B3B67AD31
-5428E0A587AC2806A9634B15CD1AB20A0245B4066311CF8271F005F66A22B102
-04DF7C6E1BA88413155201BB2CEC6FED892C8F812CA35EA384FCEC3DD8D5BCBF
-C1E676896DFC2D34507BF1E934552DB0C1BF2DE3881D42BEE94FD8B1835463A5
-51868CFFB3BEC123D3AACBA8589DFA7845CB99C5881FB07E97834E805686EF4C
-50B71DD309E704EC56C5B4C431CBC6A9C9F7454ECB5AC64113EE5D90DF8C1ECA
-86386B38D6A985E03B45448F55D39E07FD4696FC4A2DBB2B911583DFBD10264B
-9EF54217156384F8C0D5C99D0B6EB62B88991C5158542D202DC1B1365456BE94
-7233B0B31D541D15143EB4D48AFA929E22ED2E3AACF090B9E50E320256D95223
-2E4B473AD58805DC0020DA6FE8CEDEFF339569BEE59BBAB8A9C789A4D1B1AD24
-07C995B974AC8C26728E25C49CCF2F54341BE82892B3D3C1243075E500679F93
-7F120BDA233CE416FCDA2267AF799EA4345FC4B932CBFA61B588BD7152996EA7
-D441EB0172E418E22A0120D148A4C1F73D95595670BA3F983C7D36EBF68B0916
-407D8083877311B5F8C9A72023827ACDD925B9FA7FF7C1F629FAF23BB224EB30
-1322809CAF5DC40F883929D1039829938E19FDE2559D2CBD001A8AFDC7E2B716
-8118701CDFECA74D2F7A82149B3EC4101C77A0DFEF11F3692FF2B3DFFFBC164E
-BD71DA2C7005F942C76C3454A7904EB717C16848A7EE8B67A7575F5CF156438F
-0D54C88F91412C0A6D87AB253B6065B997B84AF1FD24B03CFDEABB2EAE85118A
-E0A35424667E71F732924097AF22C28DA648A2E8A5BB764E5DF9072E6C503A9D
-C05CE851FD964ABF5A2573851F7216E613F4535FEC10068E88C26E799EAABE88
-1BB6E4BA270C2744508F8B68EF9F551E7BD3247969CD3D53569723EA41B32538
-56AE9E4EF636C1299256E1D1E4ED108C14A69082900F5585906AF8A899A22450
-0DDF61DAA3B3F626DF290EA31B1F37F6007F207A78C798F40853C40F62DE362A
-08C0B06386E1A12270C528135D3C2602B14801C37323B53887FE309227353E7C
-A02D6EFD99748B9CB2493612A80A936249BB17F4540F93A750C56918D65FB485
-693F169B514B077E49CE664C619653FB7BFEBE77A63D1B2FF857326654F7A32A
-87970F775C3C57AAAE98365D69D3CD9AAD6CF26ECE04A9DE4E3DAC9C9ADAE5D8
-0C7C60C62F69414150C31AB9E0567F53C3A8F575DD994CE0F520262497BF8DE8
-4D52C3D9DD349A062154CEFB784AD62F625163CEF7F01690C711D4BC6FC53DB3
-A84187FAFEAF5D93D0F06A25B4EC48341EE39A8D1F8F7387E5A1DADC00F2D83C
-4E094BF1FEB09A0A7E6F0BE30284F743040264442F3188C84D388FC01332DF39
-2FA2AA98FB6A75E926749781717D2AD92ED2E14EC42866EB5046F7C8CF86D298
-0BF6C520EDACF09EBAAA43A477EF416E8F1088D31554E1CFA4552E1914B908F5
-92513A2C5416B76FD56C12535E2656344D0877105F841A259EF69927AEE6B1D7
-BED8DD0F6CA7F6D5CDB621E4FB44899CDEE60B8E99F3BC198912E3687636221C
-4CC00D2A8A80F196237A54BCDB1C1ECDE659D183A900F544205AEDF192CD8AD9
-0FE31CE9513D298B7DF9E2ECEE56C10DD81E4175DC2966504DA5B1EAB0D88400
-3A43F4330C53D2A7506E240934CFCF65ABE9C39DF8F79442D3B8872519D89ECB
-766F57344FC42D5611B0B86EE4CCF4BE6A550A7E32FA83A8DEDD10279A1A5CE0
-63F3DFDBF95D2A60323399469F72C76FB26B92D95F1ECA6F6D4CC8ADD207D69C
-FD0BB3E2B00F3944C4606941E723D904E5D7F55D72921DDB383430CD0C4EC291
-B6BA49B1B2FE99FF849FA2B5A8A898C8179D0C2E796DE8E3C4A0F998CF4B5433
-8099424A7C76C3A498AA6109E46EC9E6AAFF45E10B364FA41B7577457D6CB5A3
-FAAA3EED89269FC270B1014A22C4D2788FB425396B97FA3FB7A959823D5FCDFA
-2911B02A6A856224F202B50020F85FF91C1397366AA94734EEFCFF1D66AECD97
-B4A443F37733498F4B8175703FEC53547BA08CB2FC84DA76076B1D49905A36EC
-E8AB606AE53986B8C0F26CB2FF58A58538511FCDADBC5F51ABD0901ECFE06707
-B41CA6329128DF5CDD6F3526D41174DFADC2577E4AEE525D5B01B0E1E3327A95
-B0E4050946D347C0EAA483C2B8F9DA33EB687347B6A0CF28BFFB11BA7246DFD2
-84E721312CF19CD124AF18F3F8C7DAE99BA5AED0D951A84F4955A218215DC5E8
-EA5B2CE36C5E06196966B65F4D3AC37F54FF8B2E5568C234970369E5732F324D
-6EFA761A777DED5C806D6EC15F45ED14D58FDBD331C9F4597199205FD2AF2A30
-2C41EB17F71AC38A085AB87F6BBB37BBB8A40EED15BB05FC48A99859BFBAFCB7
-2F84944CE2FFE95B4CEB21DD43BB323362BE4C8F2D6E016F3D69FDAB2BF5DFCD
-287DF42B7672E4FA8AF34BD9E257A34E388C7B47B819AB081EDBDB20DFE86F72
-90EB77835924F2FEB9D7F1516DAC09467D720506C419E94E44B79225C6FD001D
-461B64AB5AE56440D7E84D5C551010865BE4CABCB6EA62DA4503C7A73C22E05C
-31EB5B7D480EA9F8BA4877D7BF8618D88C7B56E208215B9B50EDC8D378C2D835
-DB7F3AD35489F6F3D6A03C9F0490956ACE2D3878BC31CE5445A7C63B13086C28
-9C9AB643D12CA41C54A6A98FF8C550B00D8035FF7E485CE380084C80282609ED
-18BA58CF164A21C80A65B235A5C10730BD6AACF33BE7BFCE7371F647D5D73708
-2791C584D5D19BD75D9A9882B70B8AB253495CCCCAEAA74455C61DC23E257279
-EBF501B3BA3A249C6F0215C1810D02B021E90ED3946D96066880E8E594B0B125
-28B7F3FE3832E3BA37DA65ED789F3EBAA00FB6F43382BF83CEBB70F056D06896
-DDD48B5278A27EAD5547BA2F583CD0961A5A040692FA8158B0C83275529AA118
-1DE0670915C269650CF843CEFDE6F896E0E897E12899E591F6EE44AE743E3A04
-AA7F2B41CA6472AD33C6114561B3A15EC8FDD3595786C52F5889D3BF0B20AFCB
-803E6D199DAF887509A9A7D663840B15FD7DC05EFFB27B3A30DEB80D7BFC1406
-481BCE51C2D6033758F2649EC81044097F039C448B8B91FBA5AED1F15CF17347
-96C3F938EF0B212A707F4BA27D6DDB9016B07CE699C2AB314DAC8A99A004F43C
-92C0EABE8A0E13848850ED528D5269C353243B20EB4C1DA88AB6301137032E54
-0BBCAAB039E216DC09694D2406D82C1803D26BDE251899012A7EE6298D2C2F52
-E5D87FB42ECBA66A40437B754C0E57120FDAE35481382DDC2A498DEDAEA9915D
-4B85EB7A313C73E804D425B79A2EE9FBDE556F745F5DE31947B1331D7D965179
-3F6F66D3F4700807BEA5232CE668137CBF2FD67BA025D7CF37ACB925C5651337
-2EAC6D5513DB99F6BFA61B717B33796D46B47B68B3E5B937C170E37F4EDB7B66
-E3A8417123B7824569AD515E47CD823FA8F0A2944DECA5A257BA2A71CDE90A26
-985A9D46F4B4EFE36BD46C8CD48FBEA4B3B98FD33A050A16FDE2518E09B7FDCA
-346F6F01C7B441563D64341D29CAD327F62AFFC3A59675EAE1ECD2D0670AE179
-D98511AA514EF8111BD2812041D875BB9A198133D3FA17319BCF8F9BD838DBE4
-D0BD072D92DA296A9333250EA05A9796BC1347BAD789B803B317914EEF08AA47
-A05EA5C5C5B903B7F33CA520502CF3E8E5923C6AF86488CE2F05A1A503117762
-F49765A64E4CF9343E937CDF79097A9E8ABFD5CA9D31C8979B8F72D80259C4A3
-F599F0E251D2820A48B01ED48AB4BA7E474CAACCA2F9773285A049B66A0E75FB
-77F1FFEF68D6FC457C6C0AD6630266FF749C58A021FC1382BEB1F400FF4BBC2B
-EED145F907CCAF9C8532EE3F447C64D28334ACC54B9D4F487A1BA4CB26C0274E
-73245199C085FF391245126B990D8CE428C59F872F86EBEBC88D0242486BB201
-0076F1C5ED159CE403D08BD278DD21C917808E20CE8B23730A38E172F537383B
-410795C3915BDB06D922C3604E68656995A3452CAF4BEEAA176B487A39E24149
-05D0E6E6FA2EFFE71D96617E5CF773E55165EDBB37C63E700F1593221F866189
-CA8DC2EF18FD9DD83D312B1B3B159656679DAA25BFE2B54ECBF532ADDF3F7C4E
-BA23628D7FBF19E6D4271F16A91F751357AA46776D1F874FF4497EF50F6465F2
-48F547A8D00FD9022814F58A69A8643AEA9886EFEA87E5AEEDD35652FF584AAC
-31901B459D2BD707FD79F629C68F94B471FD95E4A4BA996AFCAEE15557C1B167
-4649CF28A5C8BF857C3A63754E8CBA570E4235F179CA3691E948ACB1FE92ED28
-F82D2D96E3CEBE59FC117570F19F364BD092070E06C69A40B6F53F5912841BE9
-AA6238E14A774BDD8E13060B20BC8498014F3A5511AED7544BA9CA3BAFC4529D
-27F430F14C6016B7A5487FE6BA6EE10545A0342C8DAF5EF6D6FFD4D55F74F406
-49C557FA75E61BBBFECCF67C0A512C23559CD71CC67A5788ED0282B2F0B8D6F0
-3FA276675CA5F2411929D6ED8E1F3C3B6E3011B46CFA2CE18AB291C7B3A7208C
-DF161C0B2C23A0000819848C490EDAC1C320B5A7E60DDBBD93003387298D04F3
-1EBCFCA1B17E3C136A9D60080DE114697682E4AEA88E2C61698E2EE9E38A491A
-5E10BA3E6AC61203642C2EBA3BDD759E15F36C75B4FC4D58F33BD9F4E1E2CC64
-E1E88E22F80F0F160F4BA00ECF5866717EB3899617C21D1ED5F98BF2AE74DE49
-F3BF8CBD0F8C68759C3D4CF56EE723B12ADC58ACE93CA4274A89C216AAB3419F
-78B60B263A44B1EB69C07BCB1F77E2CE24EDFFA75A88D5738C75424150EFB5B8
-9D128D3C20E4A1517E4C085C67F1EB943603F4DBD591A617EC740373B5AE2DDB
-FBBC875171152C79AD3BD887291433489521D7F6B4D762FBA6067EB6AB5996C8
-32B1D3179BB3CBDDA8A23B7238791E2DF97C654B8A8EA305EF4951283689898C
-0FB114A5EF5F29F9045C7817EA7D8E578DD48D8806DE88B68DDCB879A0AAF44F
-415B911131E45C4CD5664A1F35179A3355B4430520D5C5D08F7B63ECF99BD920
-7EBAD74476FA147B94447E84AC4FD7CB8F850CB19F41D18210DB569D5687FC95
-0CB2E776FCC5BE3AB89C611F488FC07C2F8A77DE6C008208DE782D24395BC158
-5EB7FF2D4AF74BB0F10D8EF2F1ABD2435CF699EFFC1E7CD37B4382BDAFD2A83A
-23419D5A7DE1F19EB03D7FEDB30D322BCFEF3234580A91DA108FA4EC4F2091BA
-D169DECE3AEDE61C07E2092A80F6A8D5A8E4F8C24106E0D76B71E9B63F9FD9F5
-3F7A735CD61228364E76D65077B2EFA802E15578F4785708DE8A509CA8A329A6
-9194B07F1FDF2FF3EBA62BD318F0ABB3ABCD32B4F77870D8C4F964AE4FB32723
-3BB395D30BCCA1A06966788E2F8FF5166985D83D0BBF0C0DE778E246B3B724F0
-2EE098B24EF06F6600BD6EC4F109FD2CD765F85E04D9C95DDFC7B9EA8D14A892
-AEC2C060A7356B297A3864FDB434EC80D577FA82EE91C8C43A1D5C6DB5120316
-048075EBF3A7D88AAF3CF572A1061617A075B0861474D4ABA6749D14C0272156
-4B8709C55F7FA89E47C8348E8181BCB4683A8F3AD1D9EBAA9EA7CAADA9D8E939
-0422BDD77C9C023E7E1DB7AE1F94FA53E8C9F98C6CF9A9F11D99F35F2310389D
-B468F37C3F0C856B9CA592915F91BD94DA48DD620E1B07DFFE09E0EE181EBE44
-75228558C1309B0ACF02BB225C7640F1453E89F9EF8A81752F66538498B835F4
-06DFA17EB45FA5BECF212C55F27E038FD55C6BAC12CF6589A150AF8E61F1932B
-AE29234E26183D4C05ACB111BB0CB06397264606C3B9043979785D77B17B181E
-B6749BD23196CB92A90CD96418B7DCB67C6E361726573735EF5406CE233A3E7D
-045BC9FFF1796FB53AEFCA6A13E8E00EC0583E5CF1546572770BBAC0F8E15F29
-DCFDD2EF48CEEDBA6E8DDF847396BD03631A20CFFA2D980AB6A8449F07A5CF5B
-8B21931B2019B4E8EA928C26940EA741038A1B7522B62A06B78FEBD9C88CEB72
-17FED8435A7EFA0ED35B36742CE23C508B0940A362C7AAB5C3A0CFF8129D7085
-12AAD5A82E3759AB1A700007A16A911E25B895175D3286FDC3E60B038D6D1E65
-4E0AE7CA2A93B482ADF9BFA97B46B314607D2D4227391DA382D4C2E0A853D2CB
-A9DE0559A60ED27AAFA24AC31726E19A213654E8DE43098F329C107E71698815
-86B7C2DF663DFD34504AA2F5AA848D3FBA32A8C21D3726A14626F8E253F4503C
-2AE03FDC57D866882DA26B319C3DB35DB4797D4FE14C8EDBB9E26B130B9D25F6
-42B006483B8541F195EFD48890729843BD683E76C3318701C0423997AA40E8FD
-214D5C28D6C37FAB59AFD4E9B17C142302800B02651FFA7E10B9EB88C993F559
-BDCA7958B2629DCB21C5AC2F139B5341D0795B594C2CAF50CA3112E030FC9E60
-EFDBE4D5CA899E0ADA27410CF1220E3C100148124120E104FBA6494CC9D8BF39
-6485AB8A75E588FDA7BD2E8F0ED89E87796F52AF8800C9BA3246C0CF0AAD955C
-15B545540748C11F32B970D7CF9C16F4BDB2908485E27807EAA51A3CF11BCC86
-DDBEF33E2B13994C109C7607C4635CAD863FC7D1E49051EB501E47D8AF8A96A8
-8DFC6A2A908FE78A7846016C2071F930FD2A3E5050E19FE26CA09246A350839C
-C7A06F69EE29B4826409249B8687744B1C28B1E4EFC4423EE93403C4C1DD054C
-28C48DCE81C21EAB792BB74E7C173EB784771199CB163783D232A735F74D8430
-5E488CCF55B1550C2E63447F0622B407D3B680EFB8EFD504E88F1F7BE09A97E0
-217565473AF1E7EF0594256AF56A4ED17781F897AF7251ED8B1680043AA64B60
-1D7A2BD9DC3F4A9D07B0BB2B3DACBB2A9AA3F3DE8D747016983BAA7C21BADD68
-583BC8A37D27DCD643CAA653C50AE9D4B40719CABECEAEC5AEF9419A8A370DB3
-3172E5DF5EC198F7E96F26C4EC7107432C2D8C7D280039031096196E57A0C3D7
-4B91EA0194685B4D933FB898F90BC9B31552486F1918653B50B28FF81369AD88
-39F875864F938051CBB1D872B193338E68135091DCEA243655FB323278B92E09
-D87D8CD4FCA034AD7A218B864A54FB13F39491938E0094E46CE16990BB47DF69
-D236799B02699BE88B54FB17C80092DFD628860824F789000BE4F2C3BB2ABCC2
-4447F49BD36B1BEEDED6FA3B5CDD935126835080FD2AC78D04A4DE3A153F5C9E
-23D4598C9CC923FD9AF0B6E47D50403A6566E68ED8655AECBBB4D4D0C0D70287
-D02AFC5FF37C660EC894A4ABB0614FC165C256AB968DEAD57414F06746D41E0D
-36AA18F73629BEE12532B32F93E5EFA54000F251BE4ACD610F5168D32E0ACF1A
-98CF89170C4D2D9E4F057E38E7E5DFD61774709A823581B0723063F88E217723
-54627C11E53B904958CBAAABE93292A55067B04FCAED977C016EEACAFAE4B8CD
-09F39F4854CCA7E6E7E7C1B9702060C781ED45C8354D3AB3923BD200BB2ECAAA
-5D767EF34D525398BA831973D9BB67903D9580FFFEE1AB2358EEC23EF38C426D
-C433391AB6229752CFE6EF4595299E02383FAB46AF8B3E3015B6CA441839DE46
-4841FA63E8A7CAAFD0DB875B0750AC00A4C4615EF8784E0B70AE0C00BA83532B
-98351D012A8994CCA18D3AA36C2E7AF12A051A8E166B2C57EA8A23AD2D66881A
-EDA79F565573C76F1249AA10C1DE4B60B51220D6B946498D9800B8B59BE65271
-A8EEDDB2DDDD19B273C48FA601CCDD84C5495F77FDFE22F609D4C8FE2DFC7BD0
-F108AA16AB5B34224C579A7E1BC8AEA267C44100BDBED6897528A799C2E9478C
-DA8F6ED505AE1410F0E4071CF80FF8D3CB5C1CE1B44AA7B2F38990E65D9814DE
-D5F2CAF8DF24154B0E54B58AAA2473F4A27F712A0C6690391138EA6A07CE358D
-213C6D1B0CB9DE945762F18BEC50C5E11DC0A0DCF0DC8A02CC2BFEE7C4DB0BBD
-9FFFF7F3C79F3A991ACE3BCC36785FCD072FD159E2CE9AD429A27CEA146BF182
-10EF72E4B329EAAC8B70ED717F0C8B4B2AD31A0FB0434652C01D42FE29A2E0FA
-3B529643E6FA98A66189E00CEED4A4A0D9A583FD9D83E8485C7569875F9BBD5C
-270B0859EF041BF4006DB8E2D32FE80C1C54C49B1906E58576EAFCE3DDA41AE7
-EA6660CA549BE72E06666D69F82B26222BFF5DB21C15B8CCA4D8193500FB0520
-F7FD4AE3196853618190C578F485DAD0D52D7EE45E47890327EE8A2387E26413
-3209DF5C93760B565625378FC1DAD322EB0373525447170919D40D12394CB0B3
-72859C51197352AD62F3417D147D88DC59C5CDF32543AAEFFCE63542C6E69B96
-1BAFB6AE012EB227A066AF9799C58A02FAC1227327FB5C0A4C3A83D105275287
-8CAA7E21AF180FA6181643E10B72E0139BA78A03A4FA97D3B64D079A3BA8564E
-14400D92A3794251E68CF55FA7530B64BBA2CC4AF800769D6F1CD59FE767D129
-D84B4CC327B4E27566B60B8505119C2A5967342B055274C793A624EDD6156478
-0859496478997011C584BD20CC9B6E950A129799A71BB917EF6399D60B62E6F2
-1BC2C88A955A6054DC6CC0CFA8EA2384CB34D381670B034ACC7B74954C6D3871
-60534C777E1E2193CAA62F14937CC9CB4ECE9B5F23346EC280F06B7A8FC53D6F
-EC0A91A2B5458D46763D6207BB6D7FBD8CEBAA2D028CB9C256EA1A9A04AC75F2
-0DA3B4021CB3F872AAF7828BB33DD137058B6CA96E9A371662CEBDB0CF2228D8
-BD567C88D9B813BF74D5B014E34344BDFC46FFDB501770BFFC22E3411EA26866
-8D21DF54406DB95377DB2DD3045653B25823DB046672CE0095BEC20B8F0A6136
-374EB7584F372B665C07441903E19E61F84A1103069F7DA211DE645F48A3F550
-1C42CC2330F1BFD8913A9EFD1155F2C87DC62608D532F4F5933A226322B91B5E
-CAF2A1061908FA76A09DC057B582119E526B5205CB52E77881A9FC75059719D1
-A0FEC51FAE6971FA9F981E7CE7A2050F426A8C1D9EC418825EE8EFA9D54A6C5F
-628205A912ECAD23572E3610DDA047EEF4457EC7F68CA82D2E0299D92ECDD09A
-BE7C3E9E81A9A72572E3AECF8AAFC39DD7FBB3DD56A1C8997207BA956809913D
-881A0B818F235611FB3CD8C3735AEAF53C5B6959A9CD7608FE2BA5C2A1027762
-83EF74740E37ABE827E61519FB78994F28C59F5BFD328171B825A4BF80C91E9E
-10ED9D71094DCE44B556B331B4DF9CCBFC21DE15440F2814F58A69A8643AD72B
-DD53A2CFA63CF29CA3DCA60EE2C558F3F4D0D7F6D1AF921D581FE434244AB4FD
-01C32682508A964114388582C645F32458FEF0673FCEF009CBC27FFFF120C57C
-0C5A9294023870A510CC6B5FB5C54F98FCD27CE5575ABCB1CC6F3930E3CC9895
-BFC7FF80C86E2608C3FEBC861C71F34C1F392B7BD86146590CEFF7CE332D8797
-BAE8FAE23DE40905CAAAB4FFD115849754D2B5B3A3B9B726BD45E0935E22ABB6
-CA298C9D8C313D83AFDAD44792AA29B814D2FDE9D8209FF3FA4DD21AF52990CB
-E0AE5B9B7024D8D8E147589B496771EDDCB46A8034B6B2E7D304B5299D44616D
-114328D7327730EA360AB2213EBA21A32930F323992973EAAC24BBF4097EE98D
-2C4BC8E7278923E8B726FC916C64E6E746F1E2DCE24EE57FEC432436DC2E0028
-375006996DFA4CBB077034D588E27C2DF082E4A4115A849E8B77FB3CE4B9241F
-E747E4A719CBF2DC16DFF86BD74F536478261827A4C9CFC96806731396036CAB
-DC301B8979F7D1B467323E0FA501905F0DD3075D6F2F859A905350285F8BEBD3
-C86186D8B644D7C07274A7AF96761464201EAA4E0694ED8C091326F7D2D0F464
-9CFAB448A108F376CB6BC533A3CEED71E6E995E33F8197F23ED966AB0595EC82
-4BB3BCA4DB7BB42E6593EB0933CBC7E404AD72061CAADAE15A94602A7554E6B0
-294F6DC2D5FB7929426DFB4B4DC90FCA08331AEA9D226D8EB21CB8CB2A4012D2
-027EAEDCCD4F4C17CF03484A94B824388EFF176962C3426A09979F84608628A8
-B8504D72E5040573BA7AECC13EEEC54051A31807E77FC5F480C8F30373B67E7C
-F9A45DAA5B97030E16604EA3A24337537D60638577913280A130C6D25C8FEF7F
-439EE76E361B3E3A46EEE9F6C61254918C666EE7A94969063E7C8E5023D8F354
-0CB1179A4BF4C009C67B8B10464C38B2B631DDF0801177681B7E7CFB941FC926
-D4362E86944ABF77E2C805815CD93DDFF46D574947A100854AF5BE55F0AE51CE
-AE58EFEE5D00DAD282DBB600935FD6D3676D4B35872E7DBF2E5D164495CD93A9
-E3EDC2A8D06F9CD7E6BB76D655CB563F2B709B1FFA45E486C1E2A46A5C2EB5F4
-3DAD30D0A21F3FA4170382DA80D2729EEAED59FA99800458B6E8C2BE642F01E5
-7181BE0C35DA1B3D85E49E78C65E7ACA7CBD3EDBB07C59D6AA49F89BA36F9C10
-E141D9B7EED632E1FB544716309F24651BE47D4BF099441B763567EB6156FCF7
-E90554411216854A74824113F4C7FB626A91F32CB824F6BFE607455317DEE718
-A0C49504B2817459B0BF87319085BFF82F8C2D4E1C7DFB0EF4A9B8D53C78FD0F
-5646B00130AB9F22300B69F3FA222971386CE71B4EE23006914F73B6AEA13422
-39126FE987F592176DCF482BA5B61AF13809512957A15EE3A1298A8BB5A11AB6
-314434BF61067ADEA42FAD97CC02F0A89A62D96E9E6C7B06088C3E02044E78BD
-F479A423A44754865C36F54E154D663CAD44F635AB03D62447E25F5FAB14CD4B
-86DCAB14B68003A6715FC145A62A8CD1FE60230802E56A5D906465E17E8E1384
-EF93A2248C92AA69B30EF1958459F2B4E073EEEB207CAA1C2C81ED7EC203D328
-080A7E22E41386A49F7C50C7C3484E118CFD08F4085553D08F95E9641F2F016E
-CC589906448A0710F3D46F2FBDF6E11014B71D5B000FC8563300F3DB14F20C88
-1777732B61850770B1292132357DAB822EA0E82CF09069DA6067E8810DCBA80B
-E038AEDC46DCDE18811BAF4CC2BDC823FA0E525E4920AC49A13FE1F0BCE09595
-6B0A80B68659521ACA8DFE71EE72EAB21DA362841DAD6F1F50D20DE4D53AE3D0
-3F5C96727CCEB1272DECDA82BA27E018170F55EA2D94660037E05207633556DC
-4C8F0108367FAE02F1409DAECD5D0CA9BA47558B8FD450EF3C332E655D3222B5
-AD96C39A5F74DAC7DE60E5352113B3A778D97A49569411FF7B8502E1B27BA4B8
-741DF55BF75E51AB977C3F0DC4ABF7A654AB21C603A7CB63CAFCC87B5E60052E
-E091065CD32CD1E15237FBBE40B5E8D4C6C34AB13D1EF5C1CAE1093824FBD5FB
-562B809BE191A1C4E6CBB8D8C619536385C76FE5313F186AEF625C4D7E159151
-77F732524F5300DCBA3FB5EC9091CCC533F9D8D617D02E93A80DD924A9F8FC00
-08F1B1D0A1F78B36785C529C35301BED56EEC11F4940F12EEBDEE487C8AD94B0
-6E14FCBC1BA8AC32960AD9FC1CEDB320D53204AF69A56E4EF6B28EEF0C703DB8
-0604DDC0DFD2296BF919658C28D9027434980456A57577ABA0024E3CECEBCCEE
-BAFE230A285771F1E6D56DA431AC0E06253F141CD97988D7002598D4B14849E7
-EA30A6ED6681C43E5169F2CD31BEDEB51F29542D470C3D90E87A7DB4F11A9D07
-B740EE90E4A39F4CF3586C2C723C3139F33186EAE49A3FD6F11A79626E422CDD
-7D7825DB95BAB0C42AF78CB0E03FCE914A5489E6AB2143AB4D2B516AFEB3D4AB
-92D533AE294568FC498E5AFCE3C131A7762C43C94BE1940FBDBDC0A44087FAC1
-5F7EC321EC0E7DDB3925C94BFD150FDB1D3556FA8456FCE3FC3B12263DF3EDC9
-C184528E75355BFE6D88935A666F53A53C1606A019E5C6E328F787078B15AE32
-9F49454CD025F0D601098FD599642340A59A5D2E9226E4E468E77B240030479C
-14BA84F04B0A4063CE396D89EF3091467D212C5FAE02730A17879A1520D3BF00
-BD5E80610A75E4C3581C53674B4D18E3433B24841C20B7CD7A63C99511366927
-0A117CCC8CCB519DBA75940D75897C664627C88B98B4EF7A34CE5A9FB212777A
-FC65DA6A4E1BB920494407828F19501A649850F6996171528F5A9E0740DC5D50
-DD72C991663F1605D53F7D64EB94AC101380718313DB47D43F2F465616F7949B
-E46CA304A89594023EBC34B252867541C336D2B534DAD7AF58653956985F0AD2
-D24E9C4B75755A5CADAB35E11047510AB4517AB2AE659E42B7C4E27262376BC0
-43B6FC44E67B3A85A9442EBAB410EC5A4079D690C3DC2284A080A520327DD98D
-8B9327C6F3B24B0B445D09030E07297E568DFFA76EE5B8349161CE403AECED8E
-1B539A2B8414C0C45C5D99AEBC72E97308F6BA250DBBE6D924591A4CDC18D6AD
-E9988BF0EE0FDD981A674D98BB066BDA43F2E38CCA7BC274F8B3DFC9F2AC5235
-01FEB0CB145AAFF3EFF9DD7884A228F417C8B1F62152915FF43D09E3BD3FF648
-30B06B57033983D6976E635939D746F194F3BAA218B2A37C6E27FCDC8BF8A0AE
-5B077E8F11A5A9C23C24E4E0F28902FFCC81DC60B243E20C6789BFA50A86C25B
-EA4B440A7FCDCD171331DDCD591C83A512B2B962B1FEFEB9D334987893211AF2
-C2A6F2F6BF83CFCA266AAB342A7604EF55D4A94A0B9BA8247A328697E3D633EB
-4DB8EF437A559CE366B7F84E3707C6957C09759CBD4C3432EDB02835B16E6F76
-5DD95A0DD812B06613EA5B80EB037010E9E4BC4A73D79B6EFF0F40E84BBE57D5
-0399F85547D3BBD324B30C931C8D48A3575124BAA6AFF4C0A857E99F0892EDD3
-563B4B441817EF65B4430591DCF7778EDCC73080CF9BEA32ADD6325D5DFF6292
-DA21601B493AC7A1619406B9A62F7D1A31AEF62B95B3ECED8E12AE21F66CF90A
-4C82CE92C5EDF3A29006D9960B110F2F732A0407D2291F4F4DAAB8E8F2C7FFD0
-EF48EE5901316D4A1556E16700248C0CCC984B728FC9A89858C4830B5CEAE115
-9631A1023078363A0A217FC53BB20791AED526194E1F286666325CAADF009D9A
-D7DC8E3CD65D635134B149F806BF27B10E642868B5E26E1A8A59F6B0369B8114
-E1BDD480038007155224BC3B593E60F4BE8E59363974CFBADC8A322F13DC7FAD
-F5A63B0699F8FF5181F2CAA5B20CF8545E63E7C034337C748B3BF5B61EB34EF8
-2CB3639EA164F6F8A981138701EDB82ADB3172C77F3D01BAC1B1F6740BCE0FC9
-2B09BFD6BEDFA3CE8EBA804BBEE1258CFABDF48C296CD1B57D4A938E2EE41B35
-CDC177E6EA0BFB5BD493637C4174476CDDEBE2C1B6F4F90FB9680907158FA53B
-EBB6B96EE573081C420A0C1FA35F7E2A5EC39E7A915E466FB7F4A750148E3CED
-EB6375853DE4180252E790FE09D57373DC8CA5BFE68DF4D9FACE3A95C2FF8BE2
-E342BCF84C98F2E07C6449732D7885050D9326172596CAF8D6C1D5FBB1A35DD6
-927367908C3DF2155AD9B651E02E56341EBE697F5856CC2811E58DA6BBFF14E4
-46094DA3EA6ADDAEBC29C3FC83A549D883622B1E02CF5C0C780BAA5B3C84D895
-39204F12F590C1F84947657EE2AD21473F766CEC0802E662797DC0322D13FE9F
-309982171134E7102DB9FA3245F906CDF1C2FFF5208852C7C4E9F7BC95803D15
-F7C2717D78D75843C3D5D4AEA4507956954DAFA23DB15D43B26121D03FE5417F
-2609A9DF71782DC41990592A6E81D9390838F1F753D9A3C003B0F2516E8D0689
-7BD5269E48D8BCDB266041F51E8BD54AB37120725945F25769DF62B8F3C24000
-C38ED31E14974A6F4FB99C87B2DB02A4563742A0FFA768213E834E4029208966
-BB4E4AC13F8591A02C59FC1DAAF725341EA72CF61C8F1EB6343FE99A924581B2
-CA0F034285758D49CE07427C96528834AC2C99F8BB4A9223AE4D8D2B113E769A
-5DCB1ABCF2695477B7BB30755346E970FA500A6575189E453C66DFC966F4C088
-B9DAC012965BB890CCC132F4E6160CC2B113F5C908C621AFA34F1D95F3DB2332
-AEC26440CFFC0564B57B4E40B484D93CEFED8768DABF83A3788F5B68239C40D9
-0AF793F5FEFCCDA7383120660A4451A9ACC99D10B232D25075EAA46D39A3D8F8
-80FC17734B9363D3FA70E30F3CBE102BAAFEAF854C1BB4944CDFA73A74BAD32D
-5D0760A5971B86735B2F349970B0311D9B36A74412F5F7235A497AC3EA69FDCF
-9F8AFA9812353B45ADD205B5F31B2B9BFA46D08FBBBD4CEAAA527B45679B55EF
-87DF44F0539987ABF6CE2E7088DF7AA13A515ACCD17BFEC5626F01D97EA9CBF3
-3DE7E57ECC531119B97695463806D889853FC8AB6EA6BAA44BFFF796C29DB97A
-FD6675ED1859C61CCCA85D672104B9F20384D2973797BD8E77FA198BE97E7B88
-D7EC196CC296EBFA08A048C60005DBB696033E87F4FA8D50423E5C58CAF32EA9
-F0669FCA67692291D86BEFF717D6C5A1E0AD6A75C0F7E3EFD2F7A5F5AD7D92B5
-9BB4BD9E7B6E7E337ADC6ABECC3C1B41073FA3A25A2FC1640DE3AFD97BE7BA03
-95DB5026086C842BCEC3A6A1C3DAB1D50DB50261A8B19A7CDD7B7891475E53DE
-754050D783D64029006A5BD200B6C64D18EE7576C68E30E1D6F762E9A90C9566
-D90FE497B27A9B52223A5DEA20D7A67FBFCA5907BB0496E10D87FEE2FF90C895
-CD69414B219900CCF5D5E73461D0948FD57B8681E8E598A25FADF80BC88667F9
-C871B4F87AF7DB9797A98B40BC29CA48F614F754442AC9F5D71D55D14B93BA67
-180B01E51B781345F1AEC0E68CBEE1270ECA7B3593BF4E3E4046CDD4FD9703F0
-59822E8D30209D01BB0E404EE693ED74480B179F8431E0BF3FFF6F404AB6803E
-782F592E87FCF7B811683DEC0F6DDEA4D5BCCF19F1842D5E08C16E4D61952D46
-2620AFCD1DCBB1D3D2E38539537B40E291FCC6D69667C47DC77742A8C01149C4
-DD0C08470FCF10C1D5C02985AD632A55C8C86BC7604D8438DF27DDDE6F773051
-38E268C9D7E72C12EF3C02287D229AB27C864DC7A90F6208DFA2B2EA0027420B
-13637FE2AAB2CD0E90C1BB3D58C1A1E92112353C994E4A3B1FD71781CDDC7237
-A97299CBC0E704ED11FEBA7B3ECA2A1CBE15F38BCD5999525D24200B0B742553
-3FB0065C5DD170C57EC79E9E04D46BAFD0FC8C9FAC2BDF17B5B756F9B0BFC0B7
-B505E533CBBB6762A076FD1D6140C3BBCAD87AF61D1FC65613C84FC7DB3E2260
-45C8A31C5F4E98DAFA54C7730454F66C867143D2A81D841400ADE0DA5BD9F992
-58C51B112AF3674B454C138B3B087FFCD596D5F8C23A5371D955CDD247F87229
-515388BC8CA93925412DBF27DC507D29436A64E236465C3BE9C5EDAE31EC5CB7
-FE4A32CB0DD86F5F5FCDB616F45FDA945A26565818F62FB21B7DE86F61160A6E
-BF7A74682E9EAC5BC99BA5709D96E52733F71385693E6B75BFC0BFE73B8F7F56
-690CD5BAE46F2E7655DC840ED4B1A8E1BEB7F956F586580CB3C73F144872D838
-72B7A58281EDB4576C06815F79EEF626A1269FA5A899B6C2B67CAAE87E737DE3
-A60AD91CDECE2F5FFBDE4D84179AA3A5A84CF55132C7160744A0BC0B30A59B8F
-31BB9CA6D079CB016EA257EF19FE7787EB73158D1589DD2CFD1E6F5CB343A57A
-616111909DCC5EDEE2194B0648D58FEB782562D469BFB04A55B027A567E6931A
-4ADF8ED23D57A6C2F7CFC24186BAB1D1637520B2ABCF18D78F69F5BDBF4D1859
-27340FCDD8E09A247752C05ED51A08B063FB3A21150ECB022AE818E49AC126FB
-B0BE9023C87E2F15A49B751D03EB78B55FA135A735926F6C08627D980DDEA027
-17ECD8798B9259D1073AEA2364F08F75DF3F3039C2A5268210941212638A9198
-2B9E83C5325C1A87EBCC577FE081557F252EDB8DCCADE7D92B6F90607D635CBF
-B1CE7AA040121AC48BDD09EB9A78AD2C004C2852CC208844EDC6C63C0ACEAA1B
-02006551B614463B87156ADE0E336773C7B364175ECB202EE9823D2C11DB4311
-A872159D70B91783BA0D47375222A677166DE6B2D727E8FD119769BDA354947D
-B4AA82966AFFD527D160DEB0E5589C3FAE2EC11A09A41F9B04A947453CE96A48
-203827A9CFF9B84AE9B0DA3F
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l047036t.pfa b/lib/fonts/l047036t.pfa
deleted file mode 100644
index fb500c6e11..0000000000
--- a/lib/fonts/l047036t.pfa
+++ /dev/null
@@ -1,1361 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiMono-BoldOblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Mono Bold Oblique) readonly def
-/FamilyName (Luxi Mono) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch true def
-/UnderlinePosition -48 def
-/UnderlineThickness 96 def
-end readonly def
-/FontName /LuxiMono-BoldOblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-29 -211 755 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078986 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83E1F4276DACACA37DF93
-6E81F12A36C75497181154EAB28226DE282D3F090A9E260BE05FB75D62F0E576
-938A5E3E63A16FD101E72F7A3306261230B60339CA66A60A810D6560F2BD77A7
-B4702D2F9D75A595C875E823EBD7C94797B3BC36F98FA25220790470D2A38DB9
-0E90AB4F3609A1A013CF93D016E544F4E385663414AB2B2927BC000A9B3E0544
-00B18DE5B168D06372C55EB16D6D952F716752775B0B8BC63CD5A2DF27C0E0C8
-578EB365ADA6493181D9AB5D7B8AE30E2B499F952D65877C8E38EDD7DB29F957
-9D09EAE5B1EFB3F29CB94FC40874DD2248AEAEDC411B39AF2D35822F0F742AD4
-DAD1049609EA9CD325557E8E160E64239BC87CA11A7E215BD050A87E55EEF494
-6198CD3AC7FFEBC6D44FE051179BB739FC89B74B5183CE255C10320DD7407CDA
-65E13878AB431E7B99F49D2E6E1B39D152BAB31A5BFD73BF6D298C2E71EA710D
-E094C139EC016D48233AC2C25E8E60F168DFF50892EE10F66894C471861B784A
-BE82A8A08C9BC8FAD0FA2E2D84406C5522CF6B9E46ECA79BFF1678DE26FA6E29
-2C3E13C38726369542682E88F4F3C0596C877E0040063BB3962ADFA6CF3FE9AC
-B15B289FEDDDAD64E40AC82B3D26B1593C4C8A90B99493E33C453933B127095E
-835FF7B340EE9EF89A0C792D4D0DB38784BAD3F484CD951F98B89F93824B729F
-8C93C7B931D025983DB5BB21D2560E444528DF8EE5A07CFC5B5B82275CD64CF9
-926EFA32B59335B1B6E709A62D8C17D278781FC619AF66FED15922229ED441D4
-008B81578C0F30866E20841D389875795F9FA5D573A911A573281A1051293A6A
-5C21938DB0F7E4508CED69E67D1F4C2BA55448BAA255E0A28DFA983C55260E54
-2E01F5372F15F74B785BFFC7502DCD104D2270B0B738BED86DB0F1F680F67408
-A9A806F586C0995A7586822B656B620E9B392D3BAE3AA5EBCBC86358CEBA1256
-EBEB0D9B5DAB1CF8F45D1FF5229ECEA379729F326E85A8CC963AF8EBFC9D84A0
-F5D7D4B3DD19142D521D2D7F96372E53EB54527D6E2EDCE42912D0B382FBD266
-4BB5E5E8FEAA8D4EA4B63A6497C0B276424F50A5E23BB17ADC8592E0A88247EB
-420D12CDF7417972702B41738B7E6819476362466410CB3BF8452135B16E6F76
-5DD95AA1C99CFB3F988F1C895AA4C434076FBC66297C8BEEB146CADC7BFE4038
-CC6860C0ADAE8C851BDFF35EB980B8B4CE3BC9C2F2994C4B76C25A3811336B48
-7BEACBB256D0C91BDF5B94EE65A4032D238B59DC55D442C02553C48B1D4B8ACA
-2FD1418A19576FF0CB0A58B41BE33D1810D691836F064809AED5E819D30AE1E9
-0CDF269DCD6CD605AD27E3262D25A2245933A08689A8FA2C7910938615C19CCE
-8529DAB09A8CCB71847F5A79F8546B054E6E2568A39A316267E1B0C145DDFD6E
-199C481BA1233D069EA926B81F1AD863C9784E281515F7CECC2B4845634D77B3
-70AC75FC74269301F562AA2B647AFF0572FAC99DE472A9B8154812ED7D0880C2
-E5A57DA12F51B724056475519E205047F52655AEB77EE422FA3E10AFF782CB25
-E02AC8572678232A611777FC31914196BF83CC82D2102A5BDFD5317063918EFE
-10B43E3BB2368B7868C178B1F940512B463F0D41B85D6275EAA75856AE4A5CE2
-5E3B7079EA624D03443222496D6E5F28752F3955638A06CA42AE43EFDE812EB3
-51B65581525C8EFDD17B0514F3096D12ECF2FB417DC4F3FD866D7F3A15B7E98B
-078A37367794D00DA2C72512A788A68AC0324935A25642C30320885272CDFBC6
-89F87070581BB8E902B500B878936A270441FDF0731517F86C512E02699911CF
-2DAED27087013873CE750708EFB2DE9DDA19AB4387E4A5E09DF05F620C7E4519
-43A4E391BA3069202557823519C6D07B4AB3D19CD9D081CF8AB9C8E3B2AACA28
-A6A1977A7C8609019A0A716631E692AECC540BCAFDE9073E2AA7C6BC1F9AF124
-CBCBED06053F8B176F6EE71C6D804F5CE9187A2CDCE9A5B5CA28A07C8C94E328
-6D29D9051524A60EFFD07CEFFC39592E14D6F1460EF90059129AF3D989144A5E
-0DAEEDF5EA6D1E7F7212291541F0E1A1DDE0CFBBAD2DFCD5B367227EF9F13F57
-0EDCC40844358B9C95764FE0981D99A793DD6260BFCF25A3F660DEB9EC5397E5
-D33D526857E454BF2694C50E7558A060C292050D534F7212AEBCDBBB622ABDEF
-F31E6B6BC528B7AB99169BD1DC4070D883BBCFB69EA73E05AFD18DF56F31B251
-A1E8C9748915856FE50D441C0F968B7240688CA6CD661EC9964D030BDB6BEF8D
-3FB25596A888D7530E767B60FC3C85932525DED921A63D7CB8D84169522B336D
-368901BE9754CC72DFCA2A1FD4F21C2BCB512D6B97D07F9902EEB1338680121C
-B2A6DD32F54632E44943081F80998C0674D640CC003BEB0307B51593BFA99CC5
-380390D36BF36A83618064BF63EDB81D5347C596D9E43291AE0D6083E6E10ED4
-7C78856F1F36C5B5C9A7570A654A86002EFD2D757CE3D59E04E2FDC681C3D297
-C8B8EB8FD5821FE4AA3C35B2B4EB97B45CB0AB7F8AFF57C861DDA0F78FC053CA
-B0F01FCDA6EDFC00174F62B4ECE8914AB495804E9793DA4587B0A295A8626A69
-64A1B3C9B2D828B60BC6D18F19B604AB72D007FF0B571BB42FD6BF692C887C66
-D21540E2790ED44D117E1C942FA69694067FBF198FD8DCB22FFB10D47F75F445
-59FE728C24B0968BB9EBFC74C1BA3D42858DF3EBBFF8C27E4ED19C4F2ECDC009
-EDF6F19E1EBB4A653C5E0FC6F01B30E89BB1D5D4D232034E8D1059334DB204CF
-6C75B87ECA4995A322BDE7A2B9B3F355A191E86A3B23AF11B52ED596A91B46B3
-8C03B34F328992BE927DDC4B153B615F2C55224167A957E4CC442C041BE4B961
-9EA06EF6F76F093FA3E672EF104FABE172545E51C4666C0BA73A6F08948D05E4
-E54C4496EDCEC0B33DA14FFA172A3E2116F1E10A04BEA1269E38F396C857DC74
-3DF40255BCA91906CD2710ED5806C6C6A4688BA557B78F5F81FC9764E06D391F
-EAE0DF580AB7F045DC04A3BB886BB27AF53DDEE38D38AAF35CA96CD3F5C869BA
-2DA4D9927809677025B7007278E0916FD8B5FB793BA74DD627CF29E7A3621EE2
-0951BE2D39031BCFA002E6FEF53EC0283247145B2947BBE8BBD3E7D5C49D9A1E
-E8B6C05774B1A339A469C677BFF0B30CCF7325F9077349C96608B60F44C18101
-25E03F6EB91B25562A4F3738977FB3A463C0B8DB6B771B3145D44CA360E54E7C
-697750053AA18EF9E9A3689B6248F124A75C6DBFBAF5181D8AF35A6152641092
-320A21B984DF101293A365918C113542819414E0462B6697C0993D8462A7F853
-D22DEE0AF329705BC81F362C13CD8FFD411D53BC4FDD03A3F5B95AD75FB29B08
-D5DE5830C69B2DC4E6B8423118B1069A1275CB6414D09FC27CA353B8B239AB41
-FB8E8E68E175B3793818C22C394932CDCE1E17FDA48E8AA619583D5E27A8D06C
-9176AEED7FCDE33883A4509A5C8D7F81BA4F517888265E57D756314626BF3674
-F0F327380828E9D129D8BC8B352658BEFAE98218BEDE1C0E9E2FD95D595506B0
-70169BC18FDFB2EB5B4F216D07D878FC92B08DD94F5D1E06C3B20A15B5772A29
-79B770D5C82EB260F821CC53E97B5FFB84FC936D1452A11912C9D865B1C4966A
-C9192A0E1CBC421619AFC16EAD4C75ABFFD0F801447D9E197A3D8049B859855B
-E61345674D6D4BD99C94B049CDB1253D45C14DFEE7B17B8F7A8DCC9B26296657
-E7F033CF55ABC7A703BC755504EFECE597F0436B98491E0A8B6B128C8A4E9B22
-924D33B6BE65CD0470871835C856E25B491A527B1FFBDB8263A64E7DA5914C24
-1C4B7798424AD3AB0E7D97C0EB3FA94215F98A2172FB9AEA3AE44B04F4F14505
-C229FA8974641636010907CA68786D1C84BA5510A26EBF0D9C23E7A0EF4C4E7E
-837392A223C16C7092BB2677A0E6C3BDD718F8C16DFC2232440EDD967B305F1C
-85346F4F5C109A902DFF10E990732992CE920D95F999C97948BD254AE64AFC2F
-771306DFB8454F8BA062AF715F50C0CC1C0B40C039D8A36CE350CA5C858607F4
-0E86B74DA44262C3F0D2F8E19D6E3D93683D204F9D506481C3022A281D465DA0
-2C33F3CAC0C9E357A1B96C24EEA1E4D6B3CE3B61E84ED48342BA80DCB95515A1
-964537E23E8368316790E6F5810FB266DAD3DD8F72FC219C7E7162596B4441A4
-1ADF396127473EB8FE164B52C251F3C997B726FE3F437564A1E5F455B595D20C
-F38A1BDE3D7A61691DA09F7D8698950883B397A9AC908D69CCF461892FD9AD5D
-F17B55B60B5378F9846B7570803990AF00BE3D92E40A62C9EAC215ED8ED4F12E
-10BAAF1BF1313B88FBC92C37292E2C431D9C5E7D7A6E8B1E300E0B8C7E6B0137
-3DF9B8CA1CBA01F68FF29F608572859251008B3CA544521593A19BB470E35DA1
-9749CF4B5BE790810DD78DC9C28C310F15AEA54D23D58B2449E93C5044D70229
-5EA791A06AC3DD5F512401400561419EEAE9D72900EE6336B6A8DE9EB91846FE
-14BDBB2A318E8FD269AE8862FD5121E402D85CFD707F844F02818F003B4A7C71
-8C03A18E097FC460ED1651C34B2C83A08DB246AB16389CD1B73654F222A16A96
-132EE0772CEFC1001FDAE643F0077E393AC5E328654F06FBB16490AB1C4B1016
-5DE8437C5E1C2FEAC4DA3E73F84266CC47928502B1FB5DE4A160A9CDA7E876F5
-FB512D043832F0B3C3AAE969C5DDE3515C19725D7573E0890C2A0D64676DCA80
-1EC2E72C1D93A08755E8E6AE34788A7EE87B0198FD576B798841A289C3E4B18B
-89438BA3EE74BB0ED495FF8F2DBBFBAF532A14B0D75B90D6533DC439F65980BB
-F081B537F94B4C48FABE0873D12EAFAE4CBF3779D34306071814D2DBEB3CC5FF
-0623456154368D68D16E478358590539195654C70C9C8C814F0AD6BDA45AA546
-3F309D22787B7DAA56F60D65B953A257254FA3054727A57EBD5055FC96BE3C9B
-9D5B11BD8A5D980BF5C1E1611D0EF6EB000D594491579ECC8F45962ED6228A9C
-AB2311B7E09D3F846ED366963BD57A5F41F54130103A97401FDBBACB880A8E96
-70F230922715A6CA9D88B33CF4C9CBA196C3BFF1521925AC49E514689B094159
-FF60C59D3D6963F72690DFCCD6740A1C0D274CD047A83F7630BBEC073AAF67DE
-E484787A78C170FB8D900ED4C8351FC64C75BC7F09089EC8D56C11C575E22087
-98B3FD21D1FE47D7899B908DBBB80C0CCB0304D491798F5090173264AF3F5622
-E97C4BAC6E22D336732CAD404D51CDF3B2C1F1F098244A8FB998E77BF689062F
-8EBD6631461CE66217694515BB0BE2F5A97ADDE9295001E5BBDFCF1CA8DF1312
-2D9D444EC1438AFB1E1A146D14A8D4D1FB554D8A8B7DDED6D01B3D3FD2D408B5
-6CE034520871339B6070567003255A7C685CF7579C5A9612D5707DE094D3DEB9
-1253809352F9170EB020BC26CF69A274B31F99AB44386C01A02D0F3E4EE49BEF
-7D85C07C685AEC301E0323C9554AAE970C5874927909BF8A2F48B553DEA37057
-D39ED353AC8F7EC2279FDCD395AA162354F237BCB993AB3311433B6373B555F1
-BEC82D844D2D51CD938EAB2CCE3603A46DA3C9868C3CD586559C403F21925AAA
-51C60451296C01AEC7604C7CED9363536F2CDAE99A774E2ED95A60787872E132
-311E1E8412AF134BDC094597C80BE0535D81ADD7464D4DDE57DD2BB020D0B57B
-C5527E84D4A7FEF6CBA439FEB165E0629D08E7BD41C138CB1232A2B992540D3E
-9626A62FAA6F64961B56E454CE4C918B57560C08868F0F262E79F43D7EADADDC
-6B42DD8DA70AF5AEC0966C0000A93949CD8B402017EE23B806ADED418B470DA4
-B7732B8CEA6A2464B35D3850F7B57596E5F6AB71CA9DAEE51B21C8D093D159A2
-10F4752F4410489CC6734735A4CCA0CB0E6124F38C5B879715509A99A5FB7F8C
-3353A4DD03B43F41117B9673E1B8470579AF8706965AB50CF5F402848A603E9F
-60FE3B123838A090E1CC6938DA3DB19908BEC6D92BB5A0E2774206CDD7EC2969
-186EBF848BE9EDE2A30DAFE89349062A111B53346E44CCBDFDEA993DF7E4D06D
-0C395C514E3C9BCEB7F2C3B7BB6BCA214F7DDCC1A0BE92BBFB04601563686CC8
-13901FB618CC2EB8B07E7568451B63F8D294881CF4E03C492871DD81C435D92E
-8247C5D3D3501CAE89D690ECBA5B0FCE995DA9A1A56B4A0EE568281C44589A46
-0C927D6FA7873DFB85137FC1A712C97771495C98F86B46968C3E9C62AB80A93B
-C5DCACF6ECAC4E0827809FC0A0C6B588170BACB25B3CB1E99A38CE73DBB6D0A2
-43E5A0626FA8019557FFF1B27B4EC673A3775641C4AAB7F84454191383E77E96
-3D309D17B3E74998CA515D9B80C329EA920A7BA8E0097AE066B5A2F83D7A9456
-78738E0CEA73B15A4DA0259507501DF35F8AED1E9CB8DAACD2AE0118428B06E6
-4CF0F812B618E7070F36C4A9832FC7348F2055BF55E5E25853F669BF1415B67C
-FA30F3C3BB89A96985E6B82461AA8016A93B8DD61F2AC7E607A86D84291BE847
-11A0AF6F40AA08BCC6464468CFA7C9B0AB741C3CC01C14BB26F6F7CCD561DC7A
-BC38619F3D445BD4BA31607DB4AEF620CCFF5DA527261E7C7DDFD6E22E7B1AE1
-AED11E8DC5132A1C58B15B82E65DEE25FDB5E4F53403C99E2F67FC074412DEED
-E83E53B23C4A571828C79AC3FF17D5701354A14B83969FDF984BB065FC0A6627
-1772E33637A3D303B652305DF8DB459E43637411B04312DD2F7BFD268B209A10
-2B2B3482C84E4A1F27430B729CF6C3A25116CB81155832670CD8EDC17C9FD068
-C07475A76F7F37D84C905CE96B5ACFBCA703A19E35DD2EA7060A8A6C6BED4209
-5620764469BE1ACAC422E039D35057F5FB68E446BA6134FA05EAF51D70809586
-44B539790748F9B7C0FF2698FBBEEF37D318DCA12FEC1B32F88BEE11A91E9054
-BEAABD1723857DCF87B13D57AEF68E6CF2CC31AD340270607EB6709E113392B8
-0459C10C6D06A3BB7C7F6252621C5BA73BBD8ACBDFE20D7146B0C1CB96E393B1
-25002DB37DCCF2633EDCAEB9A86F618AD4B3A985A83CEBF0D62B31D0D09082D1
-6CC0E355D4557C8391A5F2716F8BBF01F009235DC8070600F473ECA33DA726D8
-EF411D558D5A8B80CABDE111AFF83C0F9C058AC2B9D053CCCD1DA44C97AF4C7F
-702B162E4CB347CAEEA9E650C076DF694ACB8F2E4364C675263D3A677A754B96
-20B67808EA3D015355F0888C406D1B0DF6448F2E08D9A164F955940D517A38DF
-F9677BE00C66FF5BC8D722BD91D66D22AC2AE70BC551406C69F9CF4B2FE69870
-634CA58D8FA15DE46ADA6403D52037684CEA2F5BF8E589B23B402C596BA54825
-9A6B0365E1958886E26E5AB8BAF31DF7FC9BC809E8D776A42E7E8DE876BD72D4
-C226133F690A08F11E249AC083F3A984B1D3C27AE4486A4620E14D9D6A361F3F
-38CEC60A5178D8F91893B91AA2D5D8FCD1326079F29E439C5D2C7ED3F5F10B4C
-A29C4E97C111E18476731E0013A0ECCE409EA27077F35E7F0505B9D49F2F36B6
-4DBCBBDCC801645163D605A517866E71288130609254E5D4BC3743D7A81729AD
-501A63E0C74EED7E1AB6D1328C67236F9780E50146A5DBA0BD8A402FEFD5A6B0
-956C11C68D14796CABBA701AA133C3432ED4679526DCBB089DF0F4C6780D16F0
-E90029530125B39047E4DD8CE1EFC7ADD58BA85DD905807468446504DFCDC65F
-4BC08B27AA069C5383128B36FFAF4A06EA758C511F6048D9E5389A2F6066D7DD
-D1FB36F91CF9D555934DD2342322B725EED853A189C698331D26AF00B9D600A4
-EACA6CCB05E063BB7B9DE8AB01CA4C071F31279524C18B52A9F92B7F2BE7A2FE
-FA88112F9D534284418689A7E5A8DC2F7E03B43544BCFEB4B98CDD23C4D7A48E
-457FF99CF93866B0BE306783205E3C525D1BC42370ED0C0643C57CCE4ED2930E
-6BDA7B6539D9A4BFEAC4FE186CBFE3C728D1DAB5D59D8E542CFA2154FD2AD3A7
-64DC84114D21E4549D8F6E4E2BA469C4D86987BA339C9906EA3408481198E71E
-7FDD1C135105790A81918A00920B17A56B11A78605571933BF450B408ACC11E1
-6D18B2D95188A2E878BEA4BC99CE430F3336D11B4EE22B72D7AC4A095E34DBD0
-14B96FD5A7CE5851AEECA990F98FE61214104B1CED07FF1648BBDD5C9E9F9BA0
-EFDD2F3F5A9CDEF9D514AC81EF0194BB22796AA1A86A04F77EAC27414E94D4F5
-FDB66069026628694DB03635737D4F51ED68BCECD50AAF6A24DB6E8B02D83A6E
-6C06A2126773A1898855138F8B98E5368486FEEBE7548A968DB773D3E2B31056
-F217B22DE4E359BD03B38653F959790F3CDAB6CD89DB03B025438070C1C4C3DD
-33F82E6793C7B922548AC44BE5683E28948218D1DE771768B4E01079113772AD
-6A9C99F07AB2A10656CF381D58214C821846C049DB3C4D8327C1C6ECED879CB8
-54286708A843CF50D9BC0F665CA7FC81774C8E4FF3DD40DF528EBB1EA735B3FA
-FAE0AE213414C3D527012BEE1302C7301A8E20CE45CE52430CEF71DDBEEA9CDB
-83F0CB20D791183B6BA77076BF912A48F200EF883CB1A28944F6AD9E19B139A0
-39477AF27ECEE71A9CAB3A8CE15F721E65AEE8D97D281BC2D1E8700679C46D37
-FA193E8C3B307E013AA5473E32E1307F296AE7A69B467B502752133624A5D608
-011F4AE60E1BF61463E862D182A6C782C4B0FB86D6028578F317E5AB05D2DE98
-ECBFD98975BAF5C7A30679179E047A1E382B8515EC3F41793BC3A9F8C86B2B86
-84AE948763AABEF2AFC145EB1E978EF2152F8927334486F9A9C9082BB4348795
-478E42B197ACF9AD0D51A26F0692E9C9F7C802ED28E9700C3F5AF42AB9AE5983
-CA8A47B5E286F8E47B05F344DA33CB13C65AE17884A929F5681CDC218C128AB3
-601EA443AD09E8907EEF59F83D52223EA7812EECD8E5A49A8DE58AB7300838EB
-2BFC53A28EAF747D4D375EDC1B904C705F4A100476F6E06855452E1E7A89430B
-643B6ED36DCA4E4EF4C9B637F7865303A5B32701CEFB270B2301D97A4DA4DCBB
-6695E94D42952F1D135403DF65D025E6D86299C4E56BACD22BF8D8418436F380
-C34C7C40E583B8FE3D4176B905828D6FCE052D0363F2C525542E5F0A0B25ECE6
-DB7C70809D53562B48A65AE5D98E299881F30FF096E53E8876B2C18C88706363
-B7EC370D953C44BF78A10C9B76904191465F72B1839940FC5568EA58D62CF1FF
-A986F9B187FD03F8AE785B16AB08A5E4C37022B79E96250B31D55BBFDA0D8B20
-067CD1E1C8608EC14B2A1B46B3B7F6A1A694FB5001091D797321EBFBF1708097
-D4AE6AB1C315FE5BAFDC7BF2FBDF894973BBF91EBB14B0B850551CB23A4BCC39
-0F5F6CB3FE36DD2FF66DBAF8DEC16F99910B7D856D0ECFE608E3D8A5B018FDC8
-BF9B929F25DEB245704A546A9A1AEA30062141DA6CE80BAC951C432726C5C91E
-A5A23F31596799F6E675A932A0338F0CAC2F52331442FFCA5B1570A498ECA353
-C18AB67E8164B828A21E9E4FEABE3B94882B2E819543F4E723C59C964A267DBC
-A2E8EA1D48018A4D4DE7608A7CBFF01C29C4AFE44B2662C0180F0C686BE89B81
-30A280D61C321C67B2A6ABF1209D03F16C05539AFD90DEA6ACE3AC539214BB0D
-10E39EC438C3C952399C07A96521C42FBD1EFF57971D7B06902D9BB9C9E32629
-FE2439769D67DE7103138B5C161E8D58C6B01884C93C2D4FC8DCF87DF00128DC
-74F6A34F7CF4719524FC8D28502115EBB86938CDAFF00C61D70EE4E1CB98D1AF
-436197CE8670D99F6CD73828CB3860D34C9B8B49089129C71DC3B4BCA918CD9C
-C8B978011AE713105AD89529EBBCBABFD85D629F058BBE9C14169B7430C835F3
-6365DB92E8514721DDA91B2EA0BDF9C9297BE12E2897F59F5C6886BF8EF6CD90
-62F5364E2D4363A7A20CCF26B24016C260F4660DD823E7995F575ABC3048E8CD
-EB0E3D0EDC1CEA4F86EDB1EB6F46EF5CE226AEDCDE6D7A9BD142F87053581082
-168FB0FA1632F6304772F83781D5B797631E3D8305323C28F8096AE577001EF7
-CF4B69C7A31DC24D9A22EC0B9352A35DA0284E78D342059B2B87E186BCC06D0A
-C2B459EE7B3506C9E79C72E4B3FCA87AAE77183C14FA5BDE7BE126AF47E16A69
-2C1F50361E8ED35D6C77B0BDAA18C12F219741838E78E2E721275100BBE764AA
-9CFD95728F9CD3BB344B40ED7F23B0E89A8AEF47ABF898ED6BA710623652EEF3
-9E9FD89221B624C7B4277A4AA45FFF8147AF3F68D5A7AB0C8C06F122DF0F9733
-38B1A96D51633848FFAD7DC260BD09936BD1FC0ED1BBBF67ECF2D2CBFFA77D88
-82E4DA43E68A11690B477A7D3B2B2E404790C1EF1A58E898318A360B72BB87FC
-F5ACF9CB294A091162A5F0F9A391C8EE2BEE9A15C36AA99CAF216C1506B1171D
-E20E627B22FF9C685ED7D9CD8924258C4CD490F72AD5A488402919E2C6ED3864
-2B9C54EFF3C03DECB50DC1D48E1479AD4C6B5471103E1903365BCC84DA4D04B3
-80AD01F15F2BCDB2E341064184474466245E44DA617B24AE17C49D57F2CE26D3
-2F7175D78255F7195EE48400BFFD86B99F7AE62D0CB70E72026AFC38F1D2FB8D
-CE7DF49602D24BC8199199EF5D9706FC24E0A57F7270B70CC5976B9A6EFE8F00
-B0CD1CD7131651D0230C17C02A844CD9F4BC13FDA70F5CAD18CFDB6C62FBCF34
-E56579BB8D47053A5C3836C87A047C99D36EB2B66F89D8887F3CEF292EC6ADA7
-3299ED6C5F12ACD7D952E6E7824293CB993E8A68EA874501D84BA68A264C82CC
-C9A99FFCCCAE6702C9D37B9C9BD9DBC1471215DAFFF6FF1D0890733E3838AAB1
-31D94D1719B35DF54F41F3C1DCC65C138714C350825746ECF14A4C5C80144E7A
-4A91C57217C2BD91D6869B38E6FE2D2078EDE5266A3CBBDC8CC625FD5F1575EC
-FE57CB298FB7490111DC9D89F6450D8DFE17B478B0BB2C49EC8DA7B66B2CD6D9
-6BA9365A3CD1E90D2DC12FEEB38500CF56543D1AD5B9E8E1CC0C9A2E12CC988F
-47B5A75A6FF8C047C678A2AA4E8947F1C96F9C0BB8C2B9589404594731C5B18B
-EC8E87925BAEE0D39BBE9D1435305488DAE9BFB681558654044C27573311E2D9
-B0F5E4F16BAE74ACF4C5F76C53E2212EF9F24B36BE2EB027015860DBCA06F0A7
-569F7C5AEB098039038B90D2D5BBDB69BC563ADBEBBB65F09EA75E093D92FD85
-B94E5E495C985B406F7D41AC91E8404D5CCEC7F0A907C2600F5EFB567C7F2BF7
-95A755C8C121A23F7C91A211D454C004CEF93AEDFC906E155AB5E547F0C48010
-B410F1221EEBF25F4088F72163296E956AA9E7CC5E691D4B1C40A62F21DE31E7
-E3D78D51EA7704D0A2820FDE922964D51ADEA8D0B1D855F8B6C35848938E5E19
-AEDA302E955B25BD58B2582EA770090567EBC1607049EFB639A4CBD3212CB220
-C0E2E11B5694599C82A40C1EA9FD1C5BF91C782A9912715B2FB534013822E28D
-04F7C089CA656D77960368217E0B9D485AC80226495D72F4E29706E714227C4D
-38203D69653566A26033946E71AC51BD78A513FFC383FC3128296FF68026B46F
-6406FB931C699C0EE832519471EAFA2DDBFFE30EC2A34F0B7D0C2D87B34A6ACF
-57716BF296006D7ED48935215E98AF8B79568027DCD643E0E67E504AC34F5F0C
-93795382DFB9E1FD1B1BF12FB5342166D48188B84E30E3BDF3BBA314DA4A62BF
-1E8971BAF7DCD7A1B515B265FC0105E2E647175CDFC932F83DDE00AF9BA09C01
-FB1AFF7CE0CD22A5F5FD4DE0CCD0449735C1E2D4292D4F9B781E94C611126CF4
-772743225EC58DA1100917D45C41819D718CA930786377B236BC0B1EA6020EE8
-ACB3D3BBDF25BD5013A7A61AC75BF1668FD77FBA4F03F62119CF0737ED0B0419
-76308D50194F06B47999F6C354D08B0627D7319885FBFC69328416368815F09D
-DB26EEF2563129A4C8AFDF106AEA2FCC0E6754CE0F71F7DB6F559A70C683A5B0
-03FFD10A4284C9738039ADFB937A91D0C1DE16684B6D1EAE980EAAC05D93D5D9
-B262567864671E796743B9D06C00803B6390D48644914BBCA63F28C4562FF8B6
-20B8B5F28AD2F1D3E28AC217ED0A37FB310892BCBFEA9BD5B78DC8E507E14233
-B4B08935B47E39D976A0DFF3C78F35055797F80D7518184642446941857CA803
-86FFD7E3379ECBFC607EC5B03CC2EB13CCC4A1C2AC7FF94032D005662B432151
-27D3CF031A878AB01EBF4B1F99D8C9D682857399A88481B7B4ACE2F168FA9525
-F3CE2C2C1293386921DCAD7A0888D8E9934D4451BDA74F91774D2FC1699B6AC4
-22BB0E85C1503FF692B48E43F445959F599862D5445EC97F6B9543BB8DF87A5E
-D0F0BEAC996E1355CC2C2812D617842B1C13440B9710EB705419B7E9C7364219
-BC005310FCCBA5C410639DFFF7676D44166848ABEE84C5A14614650BBEEF7996
-91BA6AB25B3D3FC0BD80FF9FFB8CCD4D27160C14F4808AF0BCC62B288CBA9B0B
-91F266295E5148DC34C3D89961C76DB1BE8213BFC9C2259CE3E10C52DEF4331B
-4847AAC71094B1883BF342ACC37463B7E16E4769F3591B426F2B4E3DCDE31B08
-BA838A9DD1C9968204C777034A745374C96B13C5774D7F46C7DFDEA2D8EDD79A
-E678BEE2CC407FECEB38CF5A76F9EB8D67155E5212F77FE0FD17AFD4D7ED1D2D
-CA92E8538FD5152608268CB0A5A6F068F7C0D589F6CEE36634C81F69712726A7
-3393557C824783D5915BA5952131BAF40B28D78A7260A24E399BE1467125B7EB
-3C9E7988E993DCB90B1173D94007A31A87F35AABD3D6986B230EDADD193503DB
-0843329EDFE2AD82DF632E3CA916ECC6AF1E9517087660173939D20AFB2FC8F5
-30E028382687AB6CA543EE1BB120B29A9148ECC9EB08E580ABEC61BBF833876F
-965B1FB64C7A11616D8D7CB6A0A83F08ECDE0499120853371F936F49B4C03C29
-C0CFE89B22DF2705ED6518A0076C045DF47D08C708D13559F50620B00743115E
-301528F33A7865A028D6356DE6B73147FC05DD30EB35521DA418A1DF70E06326
-FA40451E91D8737117D9CE45F039635061F2F33253F865D60E7EFF52C1C6D2B2
-CD3646A717134228CD910A22C256710C8E61F8D0676AA54A94269CB103F83854
-FB64074E1A5D4335EB72B37BB1CACD438EBFBA04D9171CBFDE77AD0C9E12E4C9
-FFA191FAA899BB448B1321D2D8D99D54DD126C4EBD5E70BC9FEAAE644E79DB91
-167A89F2C736DE4E4A760B84109F746F56CD32CBF8846692DC46590479B4102B
-FB1F8A64B613277CADFC500BBAB0EE49BB24B134A5B4919163D15DEBB8E914FF
-A446A5F9E10538DF344392B75CDD5FC72C2CDF999A285C11C431B4F71612779A
-ED983EEE2C397420FD7F92199B2086A5DE50C6152F4EEA3E27C1B8CF908F2F3D
-11C654DFDF2636CACDD571BB10C94F2434D39D6D9AA97B12F8A1C2F5295C4112
-3145DA333E3A5E21253920B698A87521E4DC22E8353FDC4DCEB771D22781C30E
-9508B8D30431483F12637B271AB8BF27FF28658F62CC017071B58634F19B6FF1
-26703703E29FAB5F64B5AC46539BE8F3B8E11385543B3A5E997B6DB4EEF4BC3F
-08251E1FAA50528EE2F35A22D36444CA11CD8F0D4AD0BA9158D300E89E6C56C7
-2E84628C68CC84AA6607D9852351B43CFD29C6DCBD7E7A98CD838A80349031E9
-C8C30D7178E9DA6FA7709901D17AB300C946327F2A59F038FCBAEB5FE6477115
-411AED37A43BA69A99663FD1D6A1BC52F1A5FA757B9DC89AA452493786809D25
-9CCC6A177DFB1FE396A9EC6F1513303D16D806ECCB12AB4D160B857AFF1F36E7
-E2C72C5A4B29B5CF1FBB55B7FCC0ADD70438ECB5CE4961091D096AAD12166590
-A8090AC848F0442E952509F2059ACA93E6C93A62646B06A9CA2F27295DD72025
-61C8190EA2D782A12D98AD1F59A7087AF2F7E6AD183A2A8B131174BA12DE822C
-7ACCD50426A96AF76BADDF9C7E958625324FFA804319305B7C5E5B745AE14215
-517B1B1FB791E9E18E5D9DAC6DECC6397237DD6920D00B308E205493964BB46B
-09A2B35579AFF38D6394BAE736686D89495888079326F42CD18454AF18000942
-AABCA5694EA2B965206CF24A0971C254CA889E5A50CAAB373809D9AEDD7E2F49
-7ECCFFB3E20258D83B93082316E149A9BC3F1952A541F644A91D830410474264
-CB8219D66A87111B48DA301286472E62F68D9ED53A80461ED91A90CA5B74D7E8
-C715F2CAC2B8779E478DFE036BD8228DB056DFCB5E59D0DF7218034573352C36
-C2100F4D8754C41CB15AD0FFC7C5CE5D091C41B7D4E9FF4DAB4908EB2D5E289C
-FE228B98B3C647B12889739F99E9EAAE81C406C71D9BCCBE030FC5630134FE73
-6F462E6725FC49A9461015367EDBA48FED070CBA581C0E75D20ADDF2EEB46A79
-ECF3B1BD89786130D6CEB0514F294FAF1E253A5F6C359068E8A233E0069C371D
-EFA85D0C87012D04CB4A53BFEA47A148CA2B4530A5C40D37BCC73C6FA2BB7C9A
-AA3B6C5DB69F2BD36B1BDE5B739C3645C60ED7D37825F691D3BD58B8ED63A257
-4EB7BA091C66BD98DC9772179B0AD2FA4EEB2EA8D61C332D88B7E60D4D2A7C22
-80ABEBB582F7E1813E1448000CDEECCB85D9E135D7AA2E28D867F2A87F902F28
-36155B7D0DA50E56464765D7CAE2232CEC8BB7278F69F8631B33A40B2EC09384
-4DBA8F6999DDB77F55AF8E1C7F7646C66ECB86D4DD869491B457E9CB35CED2D7
-F4173E894210E65EA08AFD1EB2810EA4972658C21CEC80330D7DB5F2A07CFF6F
-343C3AB0930F392612FCFFF26CED13A711E63C591E0A592B00E2453F982219CA
-5C5ADF76C4F697E9A73C992D1EF01162D36DAD14DD0F6D8741C2E08FDD51A915
-B964D967EA8752012546F5D2056761F7B694C3DF915432944491EDE756D01997
-FE85794680849A613C1CE80F8BB514864A0340CA0AFC2BC750CF8DC0954B6DBD
-A97B1EE3D8C2A7DD7285F2CE0F995F96BCBA3365F2247AF9F6B924D80192A70F
-7EB242BE6441482A83D441856B528AB7606DB5E14C5790140BE1918EA5FFB306
-10E08F80C9E9524F73FAF68D5BE79419343B3DE032706EA272603056DF6A821D
-C78B5F703CB38652482F5D7DAD5D5EA7AD1F832596423EEE9CFF1DDD2998511A
-C43F3A71CBA3A5C14B3B2297A77DFDB49B940BCB3F33A9C4B99F26CFEAF818E1
-5D37C5D029C9DB979D89DFAF55D253E0E6629D9E2E4C5764DE4BEA3CFA6AB185
-F62E1BCDBB2CEF688433229D07BC458C4DCDFC3CDB17C8E288E7586BD7A4DE29
-E8A092A0DB26FE23060477AAF5359A558B9E79BB6436F2B181E8B53C4174AC79
-5796F204189DDB3C0156E5675151D09BB73DF17134F7575269B3C22BBDC58104
-12ACA2F40BB9918FFC1D77160991242FCC4AB7044F7C01282F166B3E9B6C6B50
-B805C828695555413CDE6DDA31E83000B76C5FDB3D30085E6F02A8F2CD1A8213
-2ED5E5188C18852BFB629CA6237F7B6C634931D90F5C183FB880D96B8B975DEF
-A29D427ED88A34F09267525169EE575AE043FD180E1A793372A551E0F4DB7EE1
-4B18B770EC4EB043067D12C17D147207190D0C6BF8723DF89AC1668B1953608A
-F1C5EF65B80A76E34DF9A77BEB0C70699B75F519C80468313CC2FCA9E3CF42BA
-1302BA6B3970C3A72655648C240CCE5D75EF67F49A2EDDF8624A2B7521B888B7
-AC27EF9CDAE54040E6E7E797E18A3FD149F680E6BC5192E0F067CF1DF6969D02
-CFBE9CDC500ED58B2A140BCA75AB5822B2F1F34D8AC3B3ACF2132A0944D5D912
-33923BD27BC6CD13DC87361F5D03186727F4FCBB03E24BC1872CFAA635014882
-0F3A790BCCD88F22F49F4EAF8C56955D3073132CA2F1FF89F12FF67A2AB9A80F
-02C257BAC189E1907300DED6A5D946A217AB4372DC64CF596DEACA9A85833E9B
-1827EA876EFB89C94BF9FBF31563169C31F5420F6D10D89DD88CC87BA46FCC87
-761E9A50E32FAC58648CA233FEA7EA1C3EE485214E0AB723CB192F3C46004010
-3F9CD7382CC394CB4A85034B2D0D7C0CE9DABC0C73FE7BBB8BE5C4EA27C2BAE0
-977C4C730F2A37981137D23657218BC8BCDEF4B2806AE29B135525C17FD4E8B2
-D5673C58F6DEF3D1F11A7E8416268A3133882BCE91A97C3F4F07B8560C918677
-C9ACCE4AD07653638F9F03BEDACA787535C2DFCAB3DC3A4303F7553989AF6FCB
-8D4A958EB5A3A6FA666E7A1A7AA41427AF986DB990336247DDE616914C4F41CF
-5549DCAD6C3F8A80A01108069974FAABCD6A372E7A4DB8A62CD1E052218308D1
-3335F3337E097B266D683A5305D0343F6813B0D1F26B118ABBA30983DDBED252
-36479186AE5CC91E4FC060EFB1FE70F9E8F1B450893D30B36E6C5CED71B45DF4
-E586FAFA0D9AF57647728ECC16025916769E84F870FB9CAB10ED3AB674F765AA
-E720DD18D2FEE1DCA40BCAF1D3F8D0D54B20B12E1DF52D625277B49355FEA41A
-8366EB9C6336F2030F0D9E7E467BDD8FA7A1D4BE6025E33DE99825D9CB401164
-C2EDDEBCCBAF38E74B4E41985087BAB13883F205EECCFD674203504292518548
-401E83A377D3E7E419C2D4F86456C059A1CE971B02FFA0952F361FB758F413B4
-5D9E783B6B9D5CFB6878EAC6A75CBF4ABD3BECD01F162ADFA2987DCD1CA12F0A
-10B7B4E153743E3B92D13E6378F770CE2937CB185BDB4B53963D54E1421DF5BB
-AD6AEF0F6702EE22FB980F24B15CD5F961D74D20D66340D37F6A8EEF4F1F19FB
-2529AFD84E67BBB1BFF305820F567697F675F0E002F4972A48B8A52AF5A98B5E
-71811A929035A76A036627A64F5BDF97178B83B1B9156C7E52D278DEBA318038
-8E59DDAFD2FDAF44F80FC1CE7E65F328EAE820974C7FE1BC0AA8DC328FE1C692
-5884ED1E5C19B119DB94952EC58139BD111086D0C134A9B6C0E1A291D5B091E5
-59D406F60AC58B82B6D0A523E7E94C53F6813F79B0FF1267B751FCCF9122ABAC
-72AA9F993FA42971B30382637C2A8EA8BD1567BE6F24C87350F581A0F0E3854B
-2893C37A5B7195AC467155C57F7A0C94F87102F98EB370D6C16D4CCAFEC2B258
-62A53DABF7A892D8ED0ECC1BCA5D78933BB69B9355DE8D7A3E297FA4AD7F1CFA
-C6A0C8E3819BA20EAF56487DF5A9FF545B958F3C9F8B1DE57C570D64D97C6396
-AE325AC12A5102A49D683B78A1FF49D16AE237886440B31B80A5BB3A15ABE827
-6524120CC5E432226F2B74BD6B24B2D285D95A840CE3BBEEF7FED24C2FD07D57
-6BB486645F60BC180DBE5EABDEF926E923F405270CFD781C2205D7B68E5A7BF3
-AA20A4961C3178420CE6F76ED017C5B23CEF6C66125F5642EA872103911A2951
-01DADEF025A53FA3C798183ACFC3CD6C115EB9717D36D1F293248B94A5A1B1F1
-DA51EDA82C30FAD863E0AF8DAF85AF76B7C49BC10ED28BF794D8122A54A5BAA2
-D9AB4615290010FE370158A640137212E93BE4FCAF685FA6C257E350E3CD021E
-F8E51CC1D4E89A72E63E6B798ED0A4C88F07B994EF8EC79FD3559DB99DC9E501
-235474E224DF5E3EF7B72C7EB5FF2533DF5265E2047323F9E073C4C098F55CC4
-F291C9B403FA7C04B0ED802F2868ED917EF69F45E4D95600BF425B8A62968D03
-32F5E19219432CC55891F4FA758943F337B8685DF269425F97ADC08EE9A35C45
-788BA07F0914FF05591B82EAE3DCF106975565EA089D1A7BACED9FF13E29DC06
-4F3CE6A1E3CAE3258426214A3D98F7FD59B78BC228B5D26EE0DF1848C2C135B8
-365736967E5F2DD98C468B5ACD2E1C5C51A961C98F7B043C47B0586D54EF8582
-7420BB57D4C6C7C670D16492A757D7B49ED54A3D1A95EF635F35E99F21C250CF
-DFE05FBD85576E9D7CF3942B870610526C130FB83736C0766A3F75D7EF20AD46
-DE70D0BB071A6156C4A4CD1EF853A7DBE6F0EF405D97515816F305001A0B9067
-D9A4025585E6CD0CE6D215C3CC7C10B0FCDA876810A20C87534FE9818037F824
-8D3F10FBAED0D281F6B455FC91B7253EA61758E318E724ED441468A793DE0020
-478004FAE5A78FF9B6F35AA3EAC21527A7C1E754DF332CE26EF004111CA4D791
-0787B7C7539A2AE35E48D7D6C28702B09187557EF3097E06B53AEF62048023A5
-19DE2FD4FECCCE4B945F7A90E38DE5C7C0E1A98F8294271A0234D735EEC3BCA7
-9544B1A2F7C0A934B04D6F2E1F19CDDC2B060F309CD5CD3A6EF9874A45DBD0E2
-51E52E2E2BA358F7D7D7D1415FBC788F230C17BC8E233396F121BDBEC3D2DF25
-FB9BA0FF917AC8E885481BB8F92A964FD89FA52CCB97BF4090896E1B3681065B
-FFD9B517D06A0B9FFF6C4E16984AA1631C4521488EB01F645B3BD1ECA92952D7
-229117E36331EE347A81A93A61628656D50A2C6C149DCE418D4B8F5FD8E68042
-B3A25C5B2A310F793D479E39F31BB5AB901B7513BA3C61F891DC1CBC2613C777
-E47A60B1EBB29D3D1C695950C365E0C3F13994ACA6F79C812D3DF88576EBB0EA
-C49A0C4C94A4B28CC6445A4E2ED8D7880D1FD473E2A62AF441633CD7B880DDB8
-22A0F54F963F56A38CC334337ADB163F5810DB8B478D432B99864DBFFFCD9CF8
-4764661D1EC2090EAE1A05590C2C48C7851829738234FB4C8E36415369E85719
-EEE6347675672DE97992B294BF1E501046FC1BF0EF48B746EA2BD8C277C21773
-406D0821424F52F967755A2CD99883EDD26F4A2F83138CDE1A9DFC3D85580E60
-350CDB143E479976D252AF123C9D03A7B3068641C950B90AFB26A9625F1909F2
-700C5113CB19AD7556BD54EB9BE6DFBBF4F4926C193802B6F61847271661D56F
-A4DD2537BFB0E5274CF71C0B159BC2A624BA9EF265FB55BC2806B5A91DD33F1C
-A6D98BB3B5390051B750383B707B2AA6D6DF26FBC1959A3438E3687E75E29376
-31FA652F12748C3B49B43C1FEBBD00687ADDBEBECDCEBC0DC1A940ABB1FB3F32
-2D46DB5455F3204FD1AE17273DDB24E6DB85417184C9935937332BDB8F115E08
-E8F54891CD1D64C94951541C296AC30DF00CAB27FFBB3CCE8402DF81F9CEA1FD
-6E04991D688114D018023694668911E06B29E020FEA094577DAC47F10ADCE816
-899B93115B1AE91BF47129A7AA5CB9C11654386EF9819B666CFDA0773A19BD32
-E2EA8E225747899DDBF6A10411AE29447CE9426971CCE0A5BFF7B0F3B1885B41
-4887CD11240ABF1F9F390AE922C049040C5C7CAFEB76BB0C1833C68D5AA59193
-D484643C90248AF23C0CC645045BD0CFE07A8FCF4F6CF643E5EAF566AFA702C3
-8FD22DE496E04AB1C4234AE5B7B7088B92D2AD2AACBB8D1F21D896AC099E3A80
-CFD75DE424F8AADF45D1FD52D240384A469209A5AFBD4EB47F6F391C5DBFB7E9
-36D6C9B923B43458474D510E4FC8F206353ED27101F9C5AD395FC7184782E80C
-0EF532C0AFC326D49A5A363E4A271AD388529B1B3A0DA25E27E116F282D87ABF
-320BC51CBEABF7B580F41EBE8F35B6C6D04D0A8ED6384B8217175DEDA617FF41
-E7EFC2C4DD7EE978E45495656C39614F9C129A75B0A8DC6A801BCFE9AF5809D7
-607DFB1563B49A2EC7FBAE0CADDEBD561E1E6C5143A22DF0DE9DAB834B095D70
-532852C47336F8DB56747ADE28315C5877E7B25CE4B3F9EB3B6659EEB0875A8A
-D78C8240BAEABE84B14ECB5C927B3EED837A9A6C105EA0C3ADF011474DB3ACB9
-2C5106FCC4CECD37AE11669188B553B8D19BF69896DE8F8974A73798B900C2F9
-BB6A1529ADBAD84A77EC86D7E1EE235586F54B6B6E12DA0432E4E6B15F9EAA58
-54ACEA0F332CB4BB133218B9A1EA0982FB1E8C2060EBAD881D8E0E89CDD8F1EF
-9A2B346D99DDA2347402F60638211263BE2EC6EBBFF8286E9DE03C7044CA2664
-C843692695475D60D325C46D8E6263125B70572D5B6CE75A6D55E7F02E746581
-5210E04537B45EC6B3D356AE83E64DA24942633EC35EEFB29AD01520956A34A8
-5F188CC020C5B5D8809403F3AC9AC67D1FA1919843CFD83A8990E89E45A07658
-F06D8B34392C44DDA5109A0BDFF6038A421223B0DE8604A188B40CC0236FF76F
-213BC77372514FA46B833231057BBFE73A2C60DF37E592FB8387B62150E089FB
-83BE288AECD13F6B9E4AFAB9860BCFC54F567DB1A3A992296FA72F9F7CF1236E
-CD4A8350FA3718C056786536C9585F8EDF06BC8B228C684452513CBF13FA5AB0
-6555D628BC5DC83C5EFB9D4E3843618EC8A1C2C80EDED76CF2162779BCD9E9B6
-AAF63DB3797294EAC1D1CFA70034CF6504EE792D4AEB0D268B31A09B12D39BBD
-B0411CEFC45CEFEE106C10865CB7AE7B1786F39C0BB93AF3FDA169E556CE3010
-E46EB2F6EA196A0C91EEE784D372D9EEFAA4A4E29ED940E97D1FD4796315FE4E
-5DBA57EC20895C32F37DA3327128C242FD357F68AE8C17C599BEAC615EC07268
-78D4E2179600E0672EE605787520E8B370567658078A379CF6437A7D2D6684B7
-9B9B155D30897740E4696E90C5C4734115153849F10D21B5D031CA61F1BA5B30
-C22DFC777CC5D5056B5FDDCCEB66EF1D37916398FB231079281D8BC778640A0D
-417BF9DD81E8D1DD6FFBD06AC6F7196D12F71D3E34BB9251EF2A4AFE4FA321D6
-F6227A4EB3660AA19D3F96DCFF1C0FEA659FB7DE881C15F7C65B76CAB9194B56
-BD1AA0A2AEABE2B5CCF260D74926831663A9165F95C178DE64153FE87C323C44
-692970FC8EB7ADB1FF6D3D4932C7D17D000B42BB579D1EB057C63894567C9896
-38A37897AA765949AED2BAD425F4F68C51E3E1AF0CB1CB0CC3F0CBDD72EDE2ED
-E50226E68EC8FB46BBC06BFF263813FA7B6E564DDE31DC482031B19180ED957C
-B68B6CD679326C478D5D9A9DB92B19CB2C662679D6B692643D81760589B7C211
-A71F69228B4A6EF80AA4D3C816525E1B589A15F825653201A8230C66DE7EF8A2
-33B3DEA5465FACEF0757469521C59FA932955A321AFB159DC42DF603BB449F19
-BE418B859D45F9FEC1B218465D6850E8F95F1DCE44708225CE2893DABA8F651B
-FAED8FCB4142D9BABF7FB71CA8B8C42B51F8BC79F5DF0BD56868C44624A6243C
-532EC4412C580ADE86D74377466C7CA13E6EF1BE45805791DC8C25D7B6FC32B9
-2021C842497995F60B67309CC132DE74EC422D7CBA71A1D0DFDC772353F08E73
-D333B1148D2ABEB2881D8FBE18A49476566F61593DE423E11AF90909B949D3B1
-0DFA96D77CBC1CC3330920AAC7CE2DA6456DFD8D0510981AA923C399FC3DEC55
-2CCC5CB34C81D21B8C6E78E529B6979AD17547B164C1D1D756DE7C9170A44396
-B5183E2F47B265EC4F5CBDC9C3EA2D68198772053DE5FD985B4B9912399F6A81
-C4C37724FA73FFAEDBAE3F31BCD6269FCB4E3CBEE214E9D46BF1ED0FD38BB385
-72225D7CA6476A2EA62B9E5780FC5AC3DF591F56261EFEBF59B567D0A9C81B76
-D88869088CA4C1AAD0DE77ECD53461B5B370F93558290AE7FD5563D16402ACFB
-A635A73EC6AFECB0F10F0F67AF7039B3F8E2DC7A03B7F3C50FF6C3CA4DDA95BC
-7416FFCC10A615B1FD4252DB7DA19833DAB0C79F4992DB442F2A1E20A16B412A
-211CE3661D04FA5E6C9BAE3437B7E0DA579B176E1CD6B5888BB4ED30B66C651A
-91EC753E6E672847FDB5F3273E55371B247F38C3F863B8391C7E6731C25A10BA
-E939C248D83D5466BBB7B868EC3B49DFE4904A796D26C0D0EDBF49BF0627BE51
-DCAB5D752D318EA1484DED9C7E50FE4C5F89F3A39DED4C781A17501FB5159314
-D26E72AC51F03DCE4A1534233A0FBE2F18E9E812D57323A7D463BC4394A721EB
-F4A7AFBF4127A3EDCB31BCCABF8B6E38553116FC15FDF323A7899AFCC3C61A31
-38E292BCFCA7833723239CDED4C31F8AD1E91B1A46D51D7480834CB6BA824EAF
-F468B832C6F59254C144FE56978D68A00C4D9D4FB1BE356543EDB9F71EFF7297
-D689EDC87A558463A913D176881552360C5322BB70698F8825D40790811DFC07
-CBC54AECCE432A0F97A63E71414964B10F330AAF531DA36B0E70364066EDC970
-A52637EBD8FCA59AFF1744F5B46AE79FCC86E31BA883012AF7033ECB43C8CF2F
-474887951DE88E3288936F9CB63ECCD381F906644CD4036D3EE056A6E26D52BE
-C23C2102AFFB461943D393967EAF80E1422E51478448C211A0D62AA97A686DE9
-6B21CC05DA1CE1392FC7C22FFC4CAB08C60CAD17F8DAF5B360F2CBC2F1611A62
-E704671388B7B5B8DC1405B3239085C2DA2944401276904B000D46A5808087FE
-3B7EB5AB33B934AC0E871117F8F9AD77F9D4C3C9ADC104BF7E6B53EFC37BCAD5
-7B73A3BC2102FFA686E1EB8C784654EB18C7AA971E30CFD598B54BF11E1574A4
-5A6E3C7EDC4B000EB802A90F9F2B8A9E3CB1476382542E8BE4745EEDED3CC1F9
-2E757983F8837517D46350DB7B463E0AF5EC62D99F161E2E6E2D5D31C9A67474
-0C33287741672DA6D25E4D12569BB09A57D05D77C4507A36BA534833046D5A58
-88DE60F1E3B475BF6645565FEA080C918E67AFBAF673B83A89C866954B2709C0
-98D93B44FF3379952A5C3E4F063D3E2EA07F67B2B5BF9F7202F4AB2DA5543DEF
-0429F61E4939CB9C41B86099F8EF62F5E80FE38139E9A75F9EF4B946F775CBAA
-D31654675CD0EA94A63803B27B72911E164560D5939111A1D1B579F80509F8F3
-A3A591E530F12741FA5C4673BF894005FB893C2D725CCDA3EC41429383A4D6E3
-0E69E7DD7EE8481E237F5C3B3C2EBB29165A7B672C8D9740E07F10FD04479236
-E6E61691A73374537DFC2DE078BA3F4692D06FB08EF2493633510914649EEF10
-B6DF07297D1C28BABFFBDAC287F83D9CDD071831E1688FE2A62D654463C3BF1C
-574EBCB7CDBAAFBFF43932F944D130FFFD11C37488E452D616E745D1F4AFC58C
-5417AF552DBAC64147F87AA28A04F8C1A3762DE1E9ABE6CA61AD64547C637D68
-0A954DA58CD646586933FD73C59B124CE7DC09A32289E13ECDF617084B05BBCF
-8ABCA791092C9D2AAA654B40C9F3D3101A47B7EA53FD3D3ABA444ACDAD67F9D7
-2F6CEFF3F06C5436E0D541A145DCD80E0DB56D966C563A2CAC59D7B64AD40E0E
-8BDB2952F66A77C6C2B2F59F59E5546B67F9753EB7ECF59099412A91A5E02DE7
-B42D80C851690AAEAF4ADA1785BCDC63DF7A857C1DF503315BCB9A48FBED6624
-C04373553329C2E2D7EDA7FDD877EEC15EB9CB4C32BFB2AAB37187E6F7D91554
-2BB4036E3510176A4CFEC4A6ED7AC037618D0B02F7E4E61862A5D8C89CF7B69B
-3CAC808DB6F582887113DE7E70B0A833831A6250348F19493BA4619D4E9AD23B
-356FA36E0576441BBA4ECE8E15F5C4AFCA524FF9F884CA6F22D0E8457EC0D7B2
-89B16700323B125633B5E78762293B5FBF0A3783069568099377CE17A2671292
-FE5C91CCAC9308C94266820944001038809ED5CA1B80C1C5E5FC35014F7CE5B3
-94E5C4C513DB75BCC1D616A3C952DE3370FEC7EA89AF705A1E035370E3695233
-F2AC4D0117290BCC7C63D930187290BF470C9D33C980F62A79862F5B722A8DD8
-5744A2271E7D2D5547E0685E046AE1B99FBFD83FAC7EEBB576FEA7A823FD665E
-FC5FE7C997AD1C6149B8494C9F508A1F29E64E8C636A0B570650425D4CC6F803
-5E8060B89ED4171442ABB578BC9F7DB9F768F110BF55B63AE8B1561650B6F11F
-974D2E2E2CA973C2599835523278ACE31B11CB208AB1BBFC342C653266768B1F
-F11C9D18A3125F364237560ECAF6918C66AAB987B0028C4AE5FE72225755269D
-A2A5C843B134E7602AAC47A5BC6881C111F4895CB6314F12AE0051B426FE1F4B
-2F6916CC6645CE8E4A636BCDED8F542679842582DAA3C10E7FE83018C84BF6CE
-7728F9FF32D39397C4B73BBD6EE5D9D13BAD2BE727A5FB89654767010A8E6380
-959601231774B9371798797E1AE5AEEB8EABC2BC9033BFA440A6895E090321BB
-2B02349DE3178B6A6EF649644C6DD4B5942881F6A35FA2D71081028F1D504AAB
-123ADBA4F0A59E8CAE2565A62E21C13464FCBB0DE37957F3EC66332DFB2BF4BF
-943BD3280E406863C8BE266023959B99C969C2C2423C9F7D814B82D56635761D
-3E026A163E3BB32C0A97505B9A87CDF5D08EE112C00BE377E170618E59897378
-A2026BC33EEEAF1F902194F17837E6D14273C1B23A97D080C26419F5E68F8378
-BA223CC1B29A0E488F21C47462EE2ECCEDDC58D4D6229CBFD7999F8552B21B07
-26592F5D4BCE67F427F54DF72C87DADEB1EAD4684319EA39BDECB65EFD9C67C5
-EFFC1C9171B05354BC769B4E0609E10884735700D01D3421295D75D4DE190D83
-90BC3F9EE03E97BF8FD273B50D3185BEF5B0EB32506F51335D8D555872182830
-1213403560F935CBF17B30B53A5B3F422F770CF3E0AA964B900635519F486A2D
-41EC65C342EC235F9DAAB07AB10D7B0A15A231538FD107651A4964B913E77C8D
-BF49CFDCF4CAAE0B2E3EE0EB06792C600811EE8890DFD01598B272FC8E6686C4
-FC425EE1519C372D02B0BBD58647D5E39E243AAF08D90F8092A424E2167F7BDD
-45A95EA8E04E1B966429027E6467416C98C89F16F23EE1CD6D5DD6856927E845
-20FEA2128528DBF01966CC8DB433C9FE3E0E9EB13F23896F84E369A9AF0E80FE
-D193C40C072D71D85045E7FEF3913094D71B84C8304154199B7FC2C7F278CCAD
-899A3107F56687C26A9F60557ECB4791CA4CE7CB6D7F6422AA1EA6C67C2D57AD
-2F09B3BEF09D36187650743D8A6A0FF16E88CE09728EC77EA0507EC8817AF105
-6399158B4C7AB6DDF3505A20880483579CCC027218CAC36E5AB7C4EF83743A03
-EC38E97E4C4FDF1B35D8548274DF1713E509BAD45BE78A49DC41D9341AE68D3F
-D9C5720ADB1D7077223F85E73B7EA8A18EE0A44856906C89842A0E734EE7D3F7
-5C7E6FF3524DAD3EAB6060F37CA8DFDDAA9D7B248F3ED84D4AC20D3D7D23496C
-61C7A315752E2906B0CFFD0E70D1328DFFC890CB6D77A9D8EF8C205E3E52613F
-08845C54EB98AE98FA5B7099211542FA54CC5D6F75FE3DED541B7565C656126A
-68CAD216C1A3FA9E8F72DEE7FA7C5AD5136044BB161023C701B55F483BC8155E
-7DAD9D13C9ECB613CB6D2EE48C0FDAB9FD2610B7B32D13B27E023A5975C776DC
-265DD695BED2DB7F63390B6E17810C6C84CC11748E49ECE00AB18896726E9C1C
-2BE9ADFD635FFED6FD9E3A319DD43560DA9614F896D762062C1E29A8408B1642
-C5FF316F6F919335C06369D9C4A83EA7AF7C30BBF5126760647DD964516E1BA8
-E24EF01EB04F20764837F7F5A7FCCED77389848E276F71F05DF88C655AF17437
-774B95174BD8D8B77064B87B9FAAFC461331EF0558F3B48E2004C5541ADA5A99
-A8C27FD3A67B18E8EA02CB2C28ED4CA3ACE3F456B509590BFE9F74F73C5CF180
-4323C1255EC01A6D90C5F25804E066B4497843CE0954133D363BC2B224549568
-1660734AAF2F36F4310DF330BDFBBC7D8A49773481CB4C9E220D86F33A07253A
-114D59D15851E63826920182939AC067D72A3AC13A279460F7C45AC519C8D413
-C8FEEF16ED896E8DAFC0AAFA8531324315A736793F0C6BEE37E9F856EA90375B
-00BEEFD6FD020C5C867950B8EE72FB0313B52D405817C4DABA49C44687FE6C7F
-8CB2D791B8268E8E6E84F7444A2D5611D96FE06C8D26A200EA644D7112BAAB4B
-2113F0B88EAC26D30E928CE19F1C0540F0A0D1B86B610A34494231FF64939F1D
-774BB1331A19BD8362EFDA7871B334F20E3421D7A36B38DE952F20E98D74028D
-5D076873146910CE272F9C22072AC3FDD68B4FADD7EF802375FFD8493AA5C52B
-54BD781D1B8252655F51942526D1415340CD45F9BF03ECB5F04B645879D617CA
-62E9B669DF2B2D6601AEA8F4207C0A5C0037EE3803F809BB12AD45D4889CA54A
-D60C06FA1577B206CADE0FF82A43D64F4640A98153E8518EDF8835116D21A87C
-F2406FD91D70F27315FF9479BC139C41ECB02408417E82A50A7A369D739EE1E7
-92524E23CA98C9706FC6007C2602B526AD5D4999C58A45BFEBA601FDE6746BA9
-BD6911DFCDACA9CB5A7E98EC1CC3B5BEEA50D99C33A514BA7AE8760AC054EE49
-5AF381DF0DDE1407A875F507E0A251BBB4929F987DE13245A0694FE20A77FC44
-18854A70B761B234ED078EF1E01C4AF65B426D4B8B5D0B677BD02C178FD0D9D7
-3D637D18ED510C81DF887CFE1B5179168ADF2A9FC4BC2CA5704543DED74765DF
-6980462F7ED8A555C59242F229689CE69CF6C02BEC7CAFD901DE76BAD3567349
-A91478177B804F1D1269E60D86154B7FDF152EF501961ABFF65752E91292B0D2
-1C16AD00A93162653338A34A851F64A843E265EBE373858298931361B79B6DA2
-DBD8BC513A6B2BB1EB207261B54047F34412C059DE05C6A2EA8971424BB0AA06
-84AD5E495A41CF9F11A844D22A805385B27FCD507DB9B5B9834EC15C047F462B
-63B44D99D7CF3A744E6528D738A3D42AE696191B6B6EEC3389748058ABB8A3B0
-B161E749539CA01169A39B16101EE2EBAD18F62D7D936D2979BF49B92ED08268
-A774B4121EA592263B367F3FCB7B89B35F72DFC85F85193B8EF32EB07DF86FD3
-6E3E8DF750C199322010950F09F9A3626121DF00EEEFE761C19E05416AB28916
-49570B7B77705906630E72BD5C12C99B68C09C00C43837F4CFA8715EDB4128C5
-7267F3FF652C858E3D2A8349B332E3BC2BC3B2F82D4B05EC0E5520B2D7235105
-51EFA9BC01C096A492130ECBCF21389E5BF1D2DD2F51245E47CE04E684A0ECB5
-3C517EF74789773889DCF605DC459E9DB154C3E171E2CB28B171C8A251595F8C
-89EDDE44A82C9F6349D51418DA47347DE4C2D8D58FE770574B409A4389293E60
-6E5AD82E2AF14DFF39A7332F5089FB957CAAAB4EE0DEC0C49E1F60CBAC617445
-F22E290834D513B248653D348E0F735BA046895452B2E091259E615C45FB18BE
-B00B5B8DE4AA1AF2025EF1FFB46AF12DA219772D7FA2D2D9DA29860B5C0B5C0B
-F87D104C167DCE484E1834CCAB2068722B51AA1C287DA9BB041C3FB12329422F
-B3B4D3413946FC5686F9A3C028F23305DAAE24901649B535D3A1D24A140CC6F1
-A098963ECC6D302BA9501B4D9CD0AC35D30B33051B190691253C7C82C43ACDD1
-9CC5A439590BBB934FB917A135EAD27EE431A2CCD999062AA58D70289E60C04C
-99083B7F7CEE37370AE49C85342882348661B1344790E6B15A26DE133342AE03
-140C5A9D17C96AFEA55747425D19AF523A42AF250FA448CD3E1ABC318A95269F
-07F72C14C466E0D2A1EA73262FCDDC95BF64E1904CB1DBCF751C748AE8BF7332
-F99ED128E60D4562A163FEA253F955CF0E61020B03AABCADF923972C8696B9E5
-5965A516773909AE218CE76507E734E5DCCD2CDE4478D956319FD66AEC8C15BC
-E421B166D663A1D143DCC8FAFD843D60DFF89D32D9D4AB29061C3E8E7E1FD89E
-065EC49781D209B5619ECC2C0A9B0F155E56DB3DBA50B847B0CA06587B4AEA20
-DF3F6E220EA5843DFC65600398989EAD4F6632B923C583D0FD4D57E9723D42D6
-420D9189DF6064E2F7CD8FF0AA59375DC4E1395787AF03FCFFD59FDFCEF452FF
-43E28A9490EF824BF80D471F2C5093885AA41DC863EF777730D074559739BB43
-EB84C8CED352384410B018842B453599909EE6CEAE259C96685BB1E5C08B7968
-82A00BCB0C6BFD57170F1DA7EF8FD41097C8BFE09AC3EEF9FBDD8DCC52E71157
-7B3996B93612F4B65FE0B7CEDB5F9EE91E77D7AAA3A3C8E6DFE4AEE3BAD2BA65
-A3786CF3EC4A3DBEA0BFDE3ABA62DE428E032B3B7471BD6CADFA8189FC2D52F9
-21628DE7E96AD5AB9F57ACC77F9B73A9F762E8D1E492BF92D42CFD210F7B3F04
-691F02C13AEDF69B0DDBDC417B3A12B292A8B41CB22D53AC02189DCD5D7142DE
-CB7568FD3584F6E1F134FE9251056E4B8FFCF06856B9E30DA50EAE765348F39E
-4F6EE206B73B4F399244AD997F7AE0867C78126F070E000859364B690E72D492
-CE00035F9F8341C61F220F27A29F73776F542C939445405CC670AD753248343E
-12AE1A2016E87A8861F05B7ED2FF65AB2E823C8D8FCBB3B65E0E24864D97B79F
-A94B489CB32EA91176D5C3D170F7DEAC36317AF5800B5BB0DE38D38FBDD75D71
-B2C45D2AEF29EE2F1F55E2C7BCBBEF114F801A4A8F340E3159EF67CF966520C2
-6FCDD2316112BA45E96544A86D3BA064E674ECF9FC71CEBEC0678A85B1229CEA
-6A174D115B6E834F74DC0E21BB0FE151482CED2A5E037ACD1262AA3979FA4604
-CF5C2E68C657967B3CDCA1AD9F7AF8E839639320D24FE4C8FF25F4F8CD459967
-E154862952058FE33E16357E2C204297AC81488E33B76DF2D4F93B1FB8CAB223
-B998577B7FC6C8B4AD8B5321AECCA360E98D2E163C3E4DBB01B7F8E02B413A50
-2EC8D14480849B85FC391009C961E2CBB0820A2DDEE153A29B727A4547EF7A4D
-40310A9CF65D49D68860D5161A5F4F32A746F8A4FAC234EC6C515608012D6AD8
-812279D4364864582CB04D0DB04D7B80F2B43ED41B46DDAD763AFCAD08B10DA7
-4A1BB1280D22A2E538FC8C764AF934494FE22AEBE6845D20A626BC4F9B0F93A1
-BF02AAC68090AEF9462D1E1517B0898B7607FA866104A60B652A7A2CFB9D4626
-1108C550D6BDA61800E63BA5EC8E7035F1D1CD66402686B231AA87C0B54399F4
-A67BE1C656004E34D74031C046CB57B35F3C32AAC4CB9F7757CB35C6C7204960
-975430B63BA2DD5B951EFED5A1DD645BA4BDBA778FD5231807A42E505D73277A
-7C0877821D82F14E064A16474B1D21914EFCF4CBB9A1F4B34E58E98334A0B732
-430CEAA87636705F6CB0AC748AC6EF54CB42C31BC2E9D8458D467E13A6BE6F6B
-F37777185D70689D4AA63590FE4CDD91031F647CED0B09FAA741FD90D7C82A8D
-5CC25897C73BFFA5D1BF67D768563A3627389FE841D286681FD2B507AF80B948
-1FA3F25EFF61C42E1E59FDA3C6A0F5BAD5C23F2470695660BF2D218F3EAB741A
-C0E0326D88691A2BE6715A739DAA2F410F51C9FFF10FA140F18DF3BBEEBAF0DB
-0BDFF699A8FB134DCD17E9E9B60AB3A7B58FD570957DEFD4854C2463A823B795
-2BEBDD075982332BE20C7755907C977C9B5C1E50D824748643748BB8B03EE518
-1DE1AF9DD73D9D40B855C8FF3501092E810A47FC25110B1B8B2DA25D6CDF034D
-1EF0628227C433E48BD5FC7066D091238228AA83342B306C3691BFD16F2A89AD
-9195347B3E5F51F07665D634933A348656C5C563E7843EA3EB7B6897A722BFD1
-14EA5CCFF297471F14486BEB20C5B086FBBC3839EA6929F640A249CB4A1AB38C
-45E76617102B4AC6C0A60701EA17B23C5452C03BC49B03592D9C389B41489B10
-A0956B893D7402EEC055A93CD60B0A91B369022281D996ABB7F9530F520A8439
-C76F2A1BE71639DEC7545C8E37C75D43B35E7BA53D52736A5D5B6231D795D8B0
-66A9A7E2F296CDE2E11A95C7BCA510FE3F3DA0B8F4F312C5D50549DCA50CDD19
-B6ED0F3D9B9266706A430EE505535217D0F4C19736A235BD242B044706B17831
-A4E8A51490796F045104BAFAC97ED33961535B48FE7642FC3A05DBD1196112B5
-00EBA4C56C3E0311E4104E50BDFAF7C98B8FE0BB6EBFAB065CBDF71CB3507ED7
-44AB743713804C00A5CD6B1DF6F3AC3E971937087C9E1B82EFDFCB905ED833E2
-A2ECC8E08775EB081C5D16C3B5CC5B25312AA0680FDB74F95B5B98A56D34DCF2
-7B04A3DACB5DAA21E17F8C13F2B358901AB91C13EA4EFC19EE44A06C38AE7091
-7C1EDB90B538E092A4B41F1308E6DE5769FCE25E6B9FFCE0426119D868C3B814
-3484F31941231BD94FEF454F62A56D08F5D319303B2A612AD68032FE7596CFB6
-916B5BCA3EEF33966B845F3F2D5F0BF6832DB5073FE3808BA5F1D9812091E226
-FC2F3F7F56DBD04BA14D06B1E3C77B7A1F9D9B3E81FE843AA08C650A5A7EA77C
-D9DDFFDFD4D0992A32915E8F162D52127248889882AAB06495D56780BA3CB143
-0A7D0D416A8B8B408E9C93EBEB2AD23FA486CAA8AF348755111532CBBA15DB40
-02E102A3D1E979190F4506447BB063CCD7862C3E842E42C3FAC628A8D283B193
-DCF1B4B5E5F9A8FE229970123CD899ECE471C1AE20CAE796D638F38180493347
-C06E62879492306E400F6643D5E4C05846342436B01287D915CFEC221881B6AB
-135B07C2066C33BB01AA8F6FA3E08747D5705F44C1367BA01BF0882B4128F5D5
-B3D3DEB47BB78E6FA654E56E66BB882EA194DC224F5F156A9AF7B30EA87FB116
-D6806A6A302012E9927D05D4F72E49DF7FCD76D26565DE03B0A2353467BD1E11
-0749F05760AF2FFBC3471E37DC0777E349A5D843B6B2979DC8F9C069A48D7506
-16502F58D9152C391ACBADF638ADB08809F71C647A6C3A2C8326E014215F0288
-D98C51D5875E0EC2C7784FC48B3D5BB5FEAFBF4D6099B903C034300AE4D78E64
-A2ED79053D3E95F08F5FB761C494ECD5E2EC943D8F38086F2D16DD9736D3DB93
-E4EF811A1506AE38F13A9BF5FCEE9F240C9FB139638305C0CDA53F3C42D98A89
-A0EC3B17FDA0FCD8AA28E1555736755EC5B9667E69B1F493CB5130C82B70E70E
-DE8B948F17B04E6B860D2C2744B29F6053F0E938E23CD2CB3049CE97430D6F77
-2C918E7CC58237CDC43B5B4BB714CCEA475DF58E87520EF3072AC90FC2A4E310
-C7D5F6AA831D3804E44237E08C318286A4947E603765E7D1E32F584F943BE06E
-64726A02131E416B04F0D33E0825F0FBC6D7B1A5BD6D2916D098A0F977D29ECD
-B2A6296FA4C182C24FA4356488E81E4144A5A1D40ED97BDE6235BAB6F3CC1318
-36B9B94DFD0C47C3341CD622F4F4DBF5EE98EB43BF107D59C005745FBAC7CF34
-8442F5A76B632CBBBC1CBCEF59B5B99C0F3981378DEC3289211094A4F4D3FA0D
-EEE94BDD5707EF4A94776766C76C85E9D984422D4282002D9CCC760339219864
-BCC23DD9E624B3360CA714A9B7270AC4A6F7CDA7BAC441C684D29D29DCB8A761
-634AC269C6809F99B73534AD2BA27210107E49F65DBBCF22E31F828FB0194BCD
-5D4FECE626925475B43DE7B346AF10893DCDCD9C13DC9111506FB5E8B41A69EE
-3BE7815105A6FEB8DA8C6D7BE2ECD49B7F315C66D212C4400AD81426EEE1C5F0
-193CE191E871D4F9F578518E372033B8121869EE7F874F3513BF81D28B7D660B
-B1C59B638E677ACB4CAF561EEE077ADB0CF64E8CEA0930FB294E031C0BA973C6
-903DDF3F33D4E18D0C55CD89FC109E72AE5CBC86C37EF512966DAD266676F8F2
-6198752E232C6F3241BAC082DA14A68FC89CCA1C3C0422D19BD2054D3B91E60F
-51AB90BF2317562A4ABCE1C96165F1DDAAFE73BDFF939C327550BBBB5B0FF5A7
-3EED7D777E48E7D337FEC7836A7757343A3C3781E99179C654345940CD55BCC3
-681906BD573C7A47ABC7E334899CFA8090CFF0104B88F74107027CD6412C6183
-2AF6851F048280DDF8BE1A2DA8DBC1F7634ED64C3EF0F1A94E27BB3A3E137BC6
-F4211E62F774070DDD96156815653BDE961D5303A16F67AC4AA7E66477973A84
-C6AED52AB10A57E95DAD8F212E5E25BBF0B45CF4721450894F67A01FBCB498FF
-BA5AD16FB1521E3FFEB53E8FE8B2174C76B780DF8D0B1B8B9B3EC6FA9B6AABA4
-8530493A92A904030845A5158D6B3A8247773BF93CE1D59D793575EB912FF49C
-13E0FB588DD61D093D3E50EE934563FF44E26728406864C4C955E58756D217A4
-B9506576819E76B74493C7D5EF4448673504D81E0CB23F039BA9F048073C5FA0
-3A47C5B314F1AECE21F8EB9D77BD9DBE49A2B505DDA54C1B787FCC1B302DC9AD
-3DC9A2822107BB6023F259B3D44F1269EA5A57C457DBAB824EA2F93B046B797E
-4C82F7EBBF47A4E69072D735955576F17F7D3B5AEC2A420C347CED162D7C734F
-3B0FA59774B5266387C5CECC7B5D856059C195869ED7C0CCB66DD20E8F70E875
-BF607899DFE6E1A2858380317E49BFCC0F331A75B12D646CFEDAA09CC28EA30E
-1BB70F720539A60C9348366D9EA597EC52DC4169A8505565FFFAD2D372FA6F3D
-CCFFB10831010C190EF3248898750D45BEFB7B444727F6B45B61F1D10BCCF6AE
-6190105A1B427D3754DD9A4B42BA65F82A85D0A0739693F52B01B7D1FDDF38CC
-5FD09CC00C42529D96579810BF9E5B6ADBB96B8C907E29D662530E2D67BA8924
-C68204FEAF80B1252084E657C7E7C836C65CDDB909B91B9E52E33FD14670C6C2
-B6316D2BF298DA1BF4E6BA9BC2D50ECBAEC0B15FEA65ADA070DA8FCFF3F7C329
-8CBC3B100307FBCE9EBD2105B663A86AC14CA64DD7DF46240F597C693E0E79AD
-C2C6B46AB8966B0500F46167C881A88B9F8943CED18762CE708D053EFF9A1837
-8A542C548ECA7FD8266AF696DBE4823DE65A7381EDB5CEB5338027881A29A340
-2C655936D1FACFBDE4792101E1A2F758CC2DA582DB3E8520AB299EAB77CC0E5B
-5A3F84F0FFFBE93A35D8D903C14D0CDFD9D592AD188FCA5ED5CC7C9F5A94929B
-50CA7CA7EA2B3ADE408FD05AEB7BF322A694DA53831DDAF8299196822D2FC0A6
-91B95D4A3D9C46C36DF6E80B80D6C2982B73DA7D790477083E312EAD31D59AB7
-D172BD52AC99925EE781493D6DF86F174BB6BCB1A79559AB6BBF6B6ED1A3A85D
-53BFCB6E7BC7BCE12042DF6071575DFB96CA21FE03C3A9C7BF9B6D48FFBF59BB
-83286F95D40151BAB0A20EDFE224BE0915ECBC400A0F11E9B7C1BC22C71EAAAE
-962B4E1BB8AF0E7365683A89BFE403880621422684A8A5CC63F6243DC4A1BE18
-E59F1184C6B8BC943282FC3EB1B099A47B3A8F5862F1B159DDFA05A046DD4311
-276D76A13E9E308C28C19A9BF5D6F4DF18DA369A8E9B18A32CF3838B641D8A73
-2421B397BBBF80BF80A197353D0CDFDF324FC2E34143D2C1D5EB6F91DE906A26
-0D11990A96F29B7F3C7735D5F8B9433AF21E8D84C5D7593FDDCABFC6D024640E
-8CC8A1B3F9B05E68797064D6F9D163246E6BA5A5198170406640001BE0C441F6
-656F6A2FC0EBF17E7324FE428EA430B6885A8F100D6C1EA6EA3BBC865DC7DAA4
-FD9FB6B6EFBDC86FCDA11FA62C2E76826BBF896846B90F99F58B3AF125F9DC42
-A7036347DECF0693A058EF45535278B7FB440A07E32DA0C52A0C8F2E8EDDDB88
-E6E97458F2FAC03A7D01873E37B3DE6E6A1125AC5BEF387EC2E9BE91246C530D
-E52F13CBF94C67FCFE5DE8E0CDF959ED6CF65F327C08A915572FCBB9AB6A732B
-289E2CC770A642021106AE8103B28A45FA062E84F1395D51EEFED2D0C2143DC9
-939EB6D57233AA4AE24B347373FF4C285749DC66FC225FBDB3AAF247AD1AED2A
-02CCA1391191DA629B0CCAC3EE434B12ED69DCB05A96ABF32A44BE6C9CEA1FBA
-CEF2FBCD765BAD4C53929015D381B8562E91AAB72EEEBC4E741353964D003DAC
-FDA6F739D211209B40776889B8F208336F24FC402F27A8AAD6C45A5182B1FECC
-EE2BADFDF613DB925307006771088CCEBAF0805924FB298BFA9A5AF06D28D347
-8181EF23DE09F8D8E1C8023988F957A740E5A7586C7DF06995D9820F82A8B44A
-B8D484561A558B896AF8B5D8C3FADE04B2D6D8D11467CCD869B9C6E8EEF793C2
-0529818E6742AD8B226374B4FE146219BEFD5A13E0C7F1A461A8123CFFE79166
-2EE95CBD7F0B29918DAE04E030A1BFFE6BAC8F5F0C3B9407C4B611CDEFFC9E01
-3BF0B6F50922900C431A0AFB51B32F6A2B814E03A17EDE45B3E33A0E1C2FAD2E
-68AE579E8F303E755C62DDC7E417094DA352935AEADD188273BD46E6A9A94CBD
-9C522A4197A0B9C40C79CA656396231D9C609C864A21B1697CE532436B6BCA1A
-B9370F172FAD0E997286D2806B3521E09E19D9F76311D65FEF941B0DCA969D26
-FF2F6F4E83D52D765D218DEF920D27BB21E270E2E7F31EC1849F641AF0B9FB60
-EBD6794F1023A7676A53E67295D46A75DDF7C240AA05730B045E1587CFBEB501
-BB9C9BBCB8C94A1061013CBAD5ED3F02D180C7886D926181B2E1DC9F3C8E8B6E
-FE48EF896AFBEE109300C692D2F94C8A140DB6378D6F294025AACC2E95E9907F
-F0AB63D937C1DD9EF1B4CA496E3FE4F329F246A93628923F122C2C7AD0DF86B8
-53653F52D36AA1F67091296FA55B978990565F63B92E7BF7B4B3D043D7F79789
-71CA93A7146A4C5CA9653C92B172FC275F332B07260A573F843B0BB83CC5E5CE
-EBA290AE6C7B43F3E5CB10BD84D558D2A5B6ACF1A0974EF20FCC824F5B92746B
-D2A517006E707EB44899D4407FDB912BE5F4AF3C4796438331EEA2B09ADDCC96
-F798BCB7749E54F578CF703EB0AD086A6A98E4EDE1118EC76338E3B76A28306E
-B1C400DB863A2282988DAD49F337A5BFAE7BBF6E06553DB67F34B3BC115C63BD
-5ADE29D5E6770BF0A1CDCDD0637B9F877BD2BB6363062B2D6A01BAED65D5859E
-16CE1A4EB86B9998D5D28213EC0E5CB2A297F24250433D61937B607C289DC54D
-E9F7FF54BA94E40865A70273C4915BC17D6D934D275BEBDA3BE285E12CEB17B0
-75F6C87759B2E2E47DB0F4A5BA9CDC8673EABBDEFDD2EB781D9121276371656F
-795F9BE5528E2F56D7BED80C679F996957AD3606C0B1E1050FF62F6CC35BAFEE
-3CDE09668AB4C5F58DD7B68352CACCA2D7CBC3DBBA2B1EC9ABD1AD16A21AD93E
-50DA4ABBA9EB945A93CF1C5BAB83C1BC0A1FD2084A42D892B2FD7A9D390CB09E
-96610AFC7181DB4D25EDC34FAE3B0A8B54D32AFDCCEA649800DCD263730C2C7B
-79EB5117277BA48A4A00806D704C58BE4679C71ED74DD4896A95248B99AC3192
-D01920DA9D284B03D8535DEC11F1A7EEBAB5A209458F0752746E1E80F1096EA9
-B72054460C14CD2DF069CFA77E7A70A366BD3A72CD81F4FC844A386631F2A661
-6C72BD35E2F5568453C1D67287EB4D1F088CE9167B2A9698507CFB51319EB6C5
-2D597A548460FBF527F53D1E43BE94B343F5EE15365D7435EFFBD0FF54D5E9DD
-04915AAB6426DE0C749A0221FB8E8BD679B93519B817938F6C92392F89446228
-57F2C33C867E0AD824B78A81EDF0FBA93F89DFF8A8A832603E6CCC5570EF6150
-B4AC37603D0126D485BEF2C6AB59CED890BDE0B6FEEE1E3DF069B7E62139AD5E
-85AF3BAE0A35F6F428E02FB819EAB7E07DCEEF52A2DC7AFF5BE9C5440EF61C49
-DCE3422CEFCF26721D73F0BB1D07C4F8D74494B399769273C8F3F8E8CFB811BF
-5C52C3B3006963ACF2CF0A240F93D54A62DCC8BBCCB2D9FCD29A2CC515A5C668
-9CC2BF03AE1BDCED18E564CE28BC424D8905F2A495BC2264B19B36CFB9606837
-D5648832EB6D7A3806FEFEBCB37232619AA722D47DD4C182E3496F5FDA769E77
-21F50C61BB6D7EA38412C02767010CB9DDC6DF5403EC5883C345BF6B0E49505D
-C74B68373429C894CC8051B9041EA12026C99F162CB5E817DE3DBF79FAA17FE7
-60E803A56FB1B25E425D589F421857C40AC0DB303AF7EA5948986EA9886DDF3A
-2EF39DE46E24A789CDAE1292D8DCB35FF1457AF0F8EDD204EE66681FD2E0C120
-566AB747A050363BD7F16A94438FA75B4EEC2B4B7BB6E5F37339398F57767DAB
-E217F5FB234595BA5858295B3C17B29EC35C5A9B944C9BBBFD3A1754C95166EE
-1CE61F4125D776618CF5F28929D708A1193944992FE9BD0084CB83D7CEC379F2
-35774CFBA88FA0460668292E55B932B806127E9953A21234F3DC2ED273715546
-478B16A332DBA4E9FD4F995BACFE211FFB648572B4628E6683BB1FCA63227184
-6C1E7B0EEC7DBC12D2EC7D3FDE590A0B1925C581AC460F873C2A698E4F95DAE5
-D52A2872D795687D3588DBA4CFB7D9CFF2CDAC190BB7B14C25A05852B03700CC
-03BBD5D3EB8108760D942FCF0816C642D0C11471864228D073DC6499E9B6EB9D
-8BED6D54FA3EEE8F83D47440F6004A62491027338203F8B8FDE5250BAECF0F88
-CBD9903DD0FCAE0C2FA3848E1FE0BED94BBC52D740C530570142D6849BC55957
-DDFEA6A33695FC5EE51D31582F8D65FB1A5006F87E3C92850815411F9A5BF768
-E78B7CDC680787CA9A418C56B5B51442F3084C1EEFB6F4C1F9584C9ED5FAD5C7
-8C7748480224A4B2F2EAD2D64F6AC26EFACAF1C50D2A052328A56DF2D3522960
-4EDF824D7F9E86318959459EE2501B4D395198562E5C9D53C6FA0F8FE9FF0363
-82197B9B30D56A80A999AA522C1502D2FE6D5DF512704B7FDCB041FEF68C8D9C
-B9CEB47B15F8D7B74CF7D2CF328B4F02AFEF1A2EF6BC1A3FCF1677944562C497
-46A10E744D45E0DA7A434CE2611EEC8056D331BA0C1E76ABDFBA1AF15CEE01EC
-5D43BE452C090D8BCE86A02B03C9D28F7053523608FB56C7F3C865843B0F301B
-2962F17E44EA805DD18DFF5D7B323E733D2F0D47476E0C701CC6CEB3D68E6D73
-4FED816BD6BC3CDFABAD659F39098034A97388B778FD29ECEBAE6E46F944DD3F
-F4A5EE2737FF5EF2FC6BFC7AC13FCA18F0534A61F2BCB07FE1F3FF2C0A708F1D
-5B478E0BD6E28B98EE9AED665B84AEA01E611D2A9C5CF678130C24E86A8ED000
-BD2B002F06420429DCFB092921512AF879FA9D9EEDC6FB1E83464A48D894AF35
-69968A886433EB620A3B2FE1A2EB577B19384D8503DE590B9389F70A0DDDCCC1
-8AB02CA3B5D0822BB6410F69A35C9159CA848B0F2AC5A3F34531E69AC0CB2EC8
-ABC182E05BBF7E1E3EF0AD8C91BA89FD8D8033071B7FEEB1EE932466A7A03547
-31D03B38DABCFD83F4E6FB7C7698FB11892E86B14542F8CFCBDBBE8231BD83A8
-5D9148E6B2C41D20CBF50ECE4290F33CD551E92A28F7BBC7E2D1B4EB303A4AEA
-41D682037B8A1EE6A8146C81FDC857AC9993DAB7E438328EA8CC01B6818CFA4B
-24AB35E0A6C4BB1A4AB166064B195F7F92A8461F982F6EC9595B7A1E36E72465
-04D6DA6A97A9168EF5A252A1C1E5CD9E9810299A105F59789304AADE75A4115C
-EB2201197CD87FC59E5A601C9B66B816FCDC2B23A062A8EA5693289B5256E9B4
-CDC042F366E3DE8511176D560764E0F92BC5E9A1BA1151A64649FBE4C3CCE03C
-0A427E27ABA7AAAC6EE305FB1C1DD6983F026C64CDEE06F57A000682F880283B
-AC0F18194953E96429BF6A59999DA5DF128503AAD963F49F61BD14CC82266A77
-A20B25BE10094D9D91B3E149B523B1A503BAB5B4AE619552895B8C632411F496
-865455FA98AD63A7F5CE08D08C212CAC5185AAEAB87823282A500A1B0530D618
-BEE058F8D4ED61BAB4CF56CBE19E66CC0D2F0C5E96DF2B23E1E750F050162EDD
-5FF3EA8B4A853C5E74BFC67C3B37E44E5CA5188745E5D18D23245450EED4DE2E
-2166A9C74A595E6C7AFED61479929F9860597BC486BAD3557C8A59AD38B1FC17
-59A70D61226D0E83F416F982CA5F8E7AC98D35D4401DD35A288095C220AA2EED
-4662643FAA021E474FC11C0A9601C8CB1B597AB9BDBFBDA9AD2FAD662A8CE14A
-89481D11C0814475C6972EBD78031F2BBB3A96A3C8436FC7E11A3C35654A914D
-E7C83F8B0521B3BFC4A98C87640FC8050A95CC740E01D8769541956D2C91FB4E
-3E4F5A45F76183A847F202D7B63478358CBAF452CF47F0CC26F82893300D0F87
-A8C0FF3E1505943ABE4C725516F1E52B47EA3232D3EFD5EC0D5FD06DBCEA8585
-5179CE8810B64978B9353C1AC8739B86CAC020DB9326BF917E63E1B4C9BB41C1
-5C165DBF5BB76E2F2E192874159CC287678C20B8BFAFEB61F621CB8185DEA0DD
-C45593CD896AB1E3BBE85A0D0957DF2E49E5BB066C6358FE7DD15D861E031777
-D5AB5336D9026AC2C8C3D041B6025E93E60921508C435699ED0AA29C5443FCB3
-63431F6A0341F4157B1DB8A2199C692E6ED6D3964F552BFAF7A4AF424F1A0F11
-5280159EAD178138A1076F51F7EC5C35E318F9B5789EC2EDB7C788D0A6DC9D2F
-4AD61CBC193222A76928509CB73986E377123B4ECC99CA12B6B627F3BBA93276
-C553B701C5F879E4B38568A77012B44AD4514EC0D7603E742C842D329B629B79
-BF38C72A3F14BD08CADFC25D7908E0B1D83715A44AD81368629E51CC75586357
-9B702B7761839FE17D47C63ACC701B266AC345F1AC15F3C30F0F5322E9310054
-EEE5C861E0071CF161E47CE6155A1BDB6D938996F3EB83BA923950FC90FBA41C
-9248A881226BA32174F85B488F3E710BB7D2376E371D23BE051EB54E15E22796
-675FF7A2BD540B119C78790E0B8C61FFE7E74E2B18FA0D5A7BAA2BBBE9B969F5
-C0D465E11D8F6CFCD8A4ECD536A7F477C86CE7D6561F3C17C4F70D1F7FF4A66C
-E315BB44D8832F9AA0B35974C9B0B741E96B8404DD9C835A476239135463C9D6
-09ACADC65D032E88A9C0FBA78C6FE4F625DF242383FF689322796F9003B66D13
-B9545377F48AC0EEBB187564E66F2A56C04F8B3093B5DED8AD536499A921A231
-765CB71B84DE828F905EB87E3A2B86DA1508A18788825CA0FFC5E1473015686E
-A24B2CE92F10A199A71FBFD56110E7FE7B4AC102AE7A03E65E8CDA68489ECD60
-E8251072A2B61EF9523BDA385E64EF7DC05DD37730B7BD4685755C58391EBB3C
-91D2E04C0840C80FB77B71B8E28F43BE6C7F54CD3A87EE5F07820F927EAA1BC8
-0BC5C897B56B83906F35857C0528044D4CDFE72EF613BD27EC286CA90883F5EA
-B50FEBCC77961B3B7B2A3C95127A697A1BBDE0AD2E485967DA824E46E982E143
-A514888D5FB0DDD91E7D216F6B3D8A92ECBA09B2F1493F520D32B16561603F59
-2A3D4F272BD7E802A871A190944C9329D2FA05F16C278D071B00CB25F3F5005F
-053683F8213CAC1AFA299BEE16F2BEA5F9EB512D60295D216F39AC080B2523B5
-2CABB71A1384F1A5915C255464AA7CFD008CDC47DC9A6DA83B65B6A5D121763D
-61EDEB73F5D1C7556C66D26DF92F853A665AAC14D074EE1F889A0C21348151E9
-231CC55FAAC46E267C623FB80A647FB7C8EA853B1380C623FCCE40225793D949
-49C0434E4604E86F46686EB9B95C5AB739547AB0238B4AE798AADF5D07B37126
-5858C1EAF561017BD4ADFDCF3BB5ED00381BF1638ED5241D6CCC706667E6A00B
-B656856EAF809EFFD856BD53A3FC2710DFB05A0E174AE941A8D60AE698C7DE72
-DC63147A6E9968E8F58357C12FDFE37E3294D210019B402A4C37F21CFEB68ABC
-E68D16E0E69BBB3BD3385969AEB2E4E16651659D31BB700A4D19CCB5CFE85E84
-64422D11C64113BD309CF149252FD5C0128AD0E70102B3CEAF21792699B4CEFD
-14B8219983F1E03F2139256FE52D837E8CA3A010B683D72D041D8055BCEB3942
-8E26C359BAE9B98B98CE6661F9F03EAC9930F8F26CBD4D35DBF12A828EECD77F
-66A2AF677147351D8EE322C049040C5C7CAFCC4374FBE8A8DF601C79830FE6CE
-2BCE4A1988C1DC1C063CA77CBCF6DEB93F01516AADB40629040B2BB9762239C9
-BDC49BB22D7DF3E3764CFB26F6AB4E32F60367C229B6ED37B3B69D7DC77CB752
-58B17DACA68EFBF15219F8644A06E87806CA9F98C44707F6CB21E91E1342E3BD
-7B2659D95B6273AC59078BE16CBE957D9D6B9C24CA9FE2C3BCFEB0A27034624C
-02BA674381EA0C652B6128DCCADCE4EB7069C9E67E96EA3A803F2D0392FD6914
-EA87C90AB51314E25C0CA722D9EEB6063AF0484DD6789D8A6FB1FB6021FFE6D1
-A4F5E64D3D944B44CDEE76F449E3A19ED9DD908F4FF6C1FDEE709526E492876E
-68ED03B7D07186AD57D5A39F79D56443236DCA1204B7FCB3C57D0D20070F359C
-F4CE4EC541CDBC9C3B3467CE5412371FEF041C5E2F3B0B5C2D020815ABFC26A0
-C2E9389C2B8B44D4C628E69C07712659B261BBE1CC681884F88ADFB3D44AD4B5
-F4CF7CEB5584EE640ABCFC226BAC4DBB478927FA2AC5C2968E4838C380D8B7FD
-054DF20862804848359518F189C62752C284867B8CF9A04E332FE1E3FC91864C
-76CA71B1FDC80B13654C7D19B68AC039590937B75EDD0863B62D7D8D123277CD
-4C97B1366422359DAD7155A816F0E9001DF0D1970A345E4AFAF3DEF28F81C7CE
-868ABB2CE5B2C145266A71E05DFC1FF79005D9116AFCF4F4C0ADCBE7B9600E2C
-295EAE977AF481DD81D185FE4A9533DEAFB4A95A91F32A00DDD4807D31B834FD
-B1CFE04F46368E939AC6F1CEF3472F2207135CC700F053F52407BA73E7987406
-E615265C624084368AC04A3666B290599F630C25FEAACFB0F42585F644631448
-79A839A9E8FDAAADD135345A7A69EBF2BBE571DCBF16D6E47BCF65059F71742C
-75D10900D875F2EFD9CB7A1905B63FA05DA0A0413009976A176B83B4A62D2E21
-0D86ADD86C4E2EC9ACCEAF1C5A0A19A1330CAAF6C223359A96DECB2F7CE50870
-647BACD3241D90E8850AB5E8EEB3DF8F9AA8DDD65CE046B7E8B29C3931350463
-A715A39482E550A7FC99F4F24560FA1B99B62FE4DB22DA4D3AC30955E2CC042A
-8F6E3447357622CAC0C961FC4C5EE16CB6BA958EDF66974AA94FE167DE4AEF55
-A59BC805AF7C6F00B8E6A81CC4820762C25577BEDBC24BFC65317D3F95871963
-B1AF96D90E6731FECEAC86368488B4F08FC7A9B4C23D2D9E96FE4DF19825DEA3
-6D9FA6F70A097E55AAC73D3778671B1442F9F81BD8DF5B80344D2F92CEA557D8
-28C5BCEFE5857B9B3A73351B4CA89C172C881B9BA568E9EF1E008A407D9960BC
-8056D9BD08BB53DAF2A577EA903F7E07B8E66FA81D37BA9D9967D43D7D411072
-462370676C259CD1C6C99D42170157A5D739CA097F1BAB77D25B11F63BB897C9
-EDD1A897380917EB694B9A9EDDC1BF72DEAD17BBC01475D090685BBE646F5F9F
-048EF97BE579CBDDED5ED2343563B24D73998833113FB4BF2780E6219B029041
-B7E508AACF2CF9F3B2D1C85290E5344B5C086678E5C8D33C99D2E13B40EAB5C6
-83C8213FF27BE85494CE767BADDD084CBD56E8CFE8EDC9DD3E22A625B14B1CFE
-0F23E0A45165D0B1ECCDB980281D0C39759E46892734067CF3C136CB2985E870
-D3E696D2F3432C4AEDCF7F2C724CB25913949CC417135CE988774B7B21661B02
-BFB37039C04F20403C057EAC33C7AEDA89F66ED53ECEEDCAE68554BE213F01B2
-0FC9D1AC95EA7720921B514EF49F58BC4C8833E7B862DEF57C1F2C7B10FF89AD
-4A78404133D02EC9B4C5D772149B516557A94C342BA907C3AE257B98A44A05EB
-48496A46C8E86874E1A4B84EB034F4E23403D733E5481F0F235508CD13BF99D8
-BF26939A4CA00F13449A143109A2C0A24EC521CC6C8C79BEEE2D566B487B78D7
-F8B30CAC371067C70D71A0A93AFD0D6EE568C98AB4559E3976271E492C15C678
-F9AD0109EAF8778855213DFBBE42CA18A25AB94E1F4FB86AFECD6F1DBFC023E6
-F525D79A8CAE50A6507512690D2DADCDA47E5317899284C2D0B2E6FF8A211CA4
-7AB9CDE6DBE438C0F0C076CF9FAA7D28B2D46B24358762E9F6B850D6FE2B3878
-FB03C70BB29D852EFC0F928582A49094AE48CA7D0FA0B1D20DA43A9EAEBB4F9B
-5043AD9355589F26202AC6C31EACF8C8C8F22F1C73B94C8F5DB698E081FD3BBB
-717DA3E5B0CCA33FF975725075C1682F7A6822A9C68241AE8CC93E97C3170476
-B17BCDA45C98B306FEAB6BB8E97833E70C0B5B314518A0433DB6CDDEFFABB2B9
-A221CEE0AD8E101B9FC42700EE65922C82D1831E1747234EFAB63982D92235F6
-0C4DBA8901A60E1BE04516F3A682438E051743524DBFF410B6B784F740B8E0B3
-9CA6C7029DBAA0E681572624406F2331C30251990B7BFE9ADA2061E4BAD72678
-637F632290DC1D987F2D6301399BBF70ADD40456D212A0BCBEBF947FD0D26107
-01D1037BB5AF3A3119D6967592023D483D463EC7E4474E1925905C17E7F7CE62
-7693A52CC38DD1FCCE98B63554379C03E033768C861C4705416C5E583CF3554B
-6BA4A6006C37BAA69FAE8E6858DB6E361DE2DAFADFF82EB8FF4C476C316B3500
-1E0BB925D21C33985F00223797F1B109253E41BBC99D9DE28B98301A77F2FED6
-1C09AB94F1A922492271878EE90437FBFD202AB6C3C8B6E66A80B862DDF9D1DF
-CBF60DAA668F88A1A624B91FAA8BD574961A4EB0BEDD209376C4174C55681BE7
-D71C0AD813B995508530F30839DCCC26001243A76F96AEAB5E1B45A182D7D3FF
-00124EA41F312422029232F71275F1D60FCFB1B6D26A5E09CE796D72791F3E71
-1B075D016C6A2C119FFBA95BE034EEF1EA78B5F520BCF583B284421CC65992B6
-F319DD039753EF833F450332B056A04A8B3356560C55438755D2842A27281C42
-EDED9E7F7FE3373F71E69DEAECC43A5F585D30F4C7DAF77FFFDDB558D6DA9233
-F8A7504E4B80DF76850BBC3B0174D1F45C3F70869957F82B0DC22D42426EDD7B
-9943ED5A17BBFD3EAA7AC9349E6FF6DE3B7E88CE522A399556B1DDC660E89BB0
-07458D0D55A51EA83D00ECBEBF007D509D0F9DA7328821D981F854D9733BBFC7
-79DABAEB9B3CC3AC69AB9D187DBCD03AE29F2C43FA4A0C5A4924C6C0A8A1E7A2
-25682D001C1A3BDDDC1FC4385B9F217EBAFBA7746AF6CD52A5DD24980B8591E1
-827F57943538CF2ED56FD9D52C5766B5A3C25B36DE530F532A795A8E464FD9FD
-BDB86793EB23221790692E8F6E4C4D5F88FA8C96C9AB9FCE3BAD899CAAFC0D2D
-7305885730B68040CABC1DCC1528C2DDDB37B9C9681B7E021E3190F0AF480ED7
-84E624376C43AD688D8E0FE302A310D1CA0CA912941A52336F85F7429FFE4560
-E082A1A12B75FCE9F1AF0B4642F96BCE0E61EA6798E7F8D0F0F4D7CA90F757CC
-3009A5D0897B22FCF894E3B0F1163BD490E8AFBD523F10696534A77BF17FB139
-909C1C7A69A48BCA3E8F2274F2C3063F1FDF0905BE8C162C7D790293DF5DBC9F
-9CCF48F98817AA69E9E9BDE280283A137162ABC9B27B0163E67EF310B51B51AA
-DF31943B3557785D5FFEAB1B34FC368409334D7DFA24CF85833783C7BA801BC8
-A95DFA28402DFADD12EB9D4B1F6C3041DA1C87563585D1BAD8AB65F0FCD4015E
-D21569A0AB4FFDF3265E1BF3F7F1A43FB96CBF13B905CD46C3571EEB02A3190A
-613B6FA912368F0099F30E8E64FE899411E4C072CB63E2C662AFB6A0EDC2F082
-1009F5681A23D7460BDA4ED4F9389A2FD7EF64DC2FA9B2807F2B307D44062371
-3AD4C8D327120BB9061BEC9A5834899896A9638D2F846ACA0462C9C8279E0AEC
-9FF78C7D6BACBC7D6A15A0F3E48A7E1B43265201F1484ED27410A484B38D6465
-9B2A29BA97294CB5DDF0099DA4727B8527F454F37004BF9C4901A378E1A623D5
-33D9B460D8E182691B4D8334E836942B0D34AF6C992540B4E092E6A883337DEE
-A359B9492BE06E8306ABCAB5686C26AA3C1FAD4B5A1313CD3C1B4D0EA2CE897A
-E1DEF890B729BDA6DB9EB328D1E52B4F999A0FC3ADFB787EC38BF65A3FF04FF4
-5521A909DC11E204408FAB630386252D62CD3F09ACF2FDF1B29B40695F1836F4
-2ACCE65A6266A52353665E65CA65A9585701D3389D23299D61A687A6016C6DA4
-B7E24F5E9F570B480814923A33193261B00BE584F9A35B92BC799B0FA940F4D1
-5A61BAE6E7F6ECFFCEA868A6FCB4B40C0D7F0D43A42DB66A287D2BA92A6C9ABF
-891528E30DEE34C8880AEAF2EAB4826A28E9F7097CC376579CDB7000111D2E9B
-66AC6207D5DDD92096455E86DE62ECD4C6219401865F11B8A8EF73000B5D3B61
-0F89405A82ACD6A8D675C44920E281514D16C177882518FC4532B2AAD2865270
-B26D955148B48478631B7493D5D68B590DB12BC72EDCC64BA4FD2186787BC161
-CE587F9F3E96607541C180114B16D058ACC89B425DC8C20165B881368F0E5292
-F6DB2F8350080072E258EA2C5E85D6419A72BA782DC01791A4959F08B2D40057
-10711744CF043A4D5E3ED3FDFDB4A5ABE1D842097380AB8693DB90A0BE28DDDA
-9C24F9446632F1CDAB75FC2A6234B15FC294D41ADD6C6E95B13FEDFD3BCEBD3E
-7BDFBCAE303B6A8BA181EE4B4CFC4C20432C75CE5323525C671AD4042519537C
-C934C699D9E00D605AA1F8A3635116C02BA07760B62DFD50D059CA88C69569E7
-194FC05579C53E8D8D9D3E9C0D43364C99401CA56A0E6DB8BE22D595E2D2D4E8
-6A251F9E9812DF3F355DBBFCA7519C53DD3C4B7501E11455E87D9BD6BD9B91A7
-50AB44142B0D01E7AE2548D0F544976E0172A97114927B0C4FBE9043575A730A
-3F3FB0A81906945BBC36CFD6573044326EC43B5D42922956EFE60888332A3513
-0B690D4E024A9A12175E39D5E5955790B9E5AEF3451FD1992079290DE16E36E5
-E6C6347F3716CDBBE22D39605A27024E5D441C9EFD849B02A4E43E4DE5425CA9
-6B6BA2C8EF676016432D4AC709BB0452F072D6039F7E33C33B3E8E1ECE0FCEEE
-2F6D083786DBF65E62D3A4D31C937351523E4851DAE2B60C7DC91194DDFBC13B
-353710E9A471F2830667C837FF0C8119C143144FF8B392C2BEAD2EC5F7AF5EBD
-DBEB4C36781BA28CA854128182F8D21760044B97439FFEF7C16A06778455687C
-9DB73A44DEB241F1FD9A5F57CA2D810B0DC8D3E0B87C242B916F68DF74B6A46E
-BA6622BDE90B6660AB6AEAFAD5D1EF04BE006193194A295B0CBE5C45750C5711
-A338631906FAF7A915B1FDB38BBDD3B4797B96EB4C816B7F13CB803E2B1DC5BC
-ED66B603C68CC23E3125FFF102CA544EF9ACB8289C19DF24A9589147392767CE
-F2D9B47CBEC2765B6D2E9C40B67534C01B94E07A6991813BA31018E86803440A
-C9DB6FC5AC8B0A4C6DF96C7906DC4D3F51F99AB314959EB94E82A1A5B84DFEE4
-D10E438ACFDDAC92486835C46E120824D0B8ABB3224B94091845A22D15600F0E
-5AB1B4C440529CF7957FD36BB2C7362251FE12FE59EE41F2FFA52236BB97DF53
-C29F81F4805992518E02D747E802D38B8E689BB503DE7928634D64352ABB3C68
-A073988A52DC63E1D606C18D68A95BB4F3D1D26799EA02101782CE1154478B36
-F4C0F4C72C032526C0F28B0D49ECA060A031D84EA9F5C58E38DD0E5C36F11BEC
-C5D9DC341C9161F092C1602E2BA67C1BC76938569701CEB25780E1D346582C2E
-716674ADD519D650E158B257D8212B9734BC1777032AA477429750BCA4776719
-82C313594CCA6F1EE1424082A43699F59ABED9D6416920DA4B69DB319E7CB0FE
-73E46699B31917C1453FC158262344098378AC2534954D78EF9B6B73B659E07D
-94B187D72A93EEADFEBDF1C7236BB2DD4CD70D79A97A92E0327177FE0A36AC5F
-5F396F771608D2BB8D90A349833FF2DD24CC8A46E8EB6F36B31D3E51A060FFB8
-FF66AEA579648800CD0C8A9615C8E2D0550523343657D6D509BF7094065EB390
-5643EA96270B1EC6D338602D8C8C72FD323E97319E7E4CE802CCF245DF7B11D6
-917D32B6B7735C3EB089A1071FE012C72D4336EB2B68E2BA85677F919401E5CE
-442F3CE48909B6AA122D9E16236284A571A5A3FA0923FAB58EC8DD172B2B29AF
-5A5251BCD86FEB0EF87F77281F686C1A14C734F4E49C278CA38ED3A5C0342CAA
-19CF6315677DCFF0FC76759A2E08DA2DCE2783D4B1B9284DB4F399A78715243A
-2610A4B1D34E3A6D5B0C42D96F19C4392A63186D941FBEFE74A2F20FA4B5D998
-5ADC9CECB760FDF57BE53F057F726F164C9072BF499BDDA065979014B83E7A2D
-DB24B70426BD9CA52768218CC89B3CBF387D550669FAE2FBEC1BA690D2D1D104
-F4363412050787C325B900B54483B7EE0B951626422963A54006802FFEC1649D
-476A8C4521CA07C68EA0D74150B1840DE5B9A801E7DF3A8EBB194B11A72E8409
-2772084D0C37AA9A158AB21B49EDC3EF581CCE7AD4880F17897CD61511AFDBCC
-8ECAE00DE43CF21A4C69194BBACFAD417C93A71A350CF087B77A96BD7EB9A198
-6B01A0929D968BFEA348475803690EC74ED1CA9032F4E201081FD85BBC6789FC
-4466A642A99E8F2EF742E5DB88CB2C8E6B1F15A29A2D25FC3B579F6DF6713BD2
-B25CAB08F81350C31E7E0FCD7DB5B9CBF9EE07778AE32322F684834F2F223D56
-62491EC149964AD940491C1FB4A5BDE45B8A81FE990EC816F9C3BB17F1D5EEF1
-FBD54785D787F6544A2429D7468878F210495BEB13F3429B8603CB03D1AC41CC
-82A29B3A3E23ACAFE098BE5E60CBAF6651CC765DB907A81A0C9AE730EE3C1170
-3C1CD8B5E4BE68B705502D97329D231AE9C629A3349F3E88270692E476E281AC
-92C364493BFA024B5BBF34C6EFA6995735AE972CB8652AE61331704DCB10C42E
-3B944C013734CCE07A91A4016AC624B5EDDC2B49E633F6C7F11A8F3503277ED2
-AFF98C4A3868C67A4960C760456420F4EA8C28606690178CF6335FCC01251EA2
-93A337B0CB1A51A1234DA080DC0209519A1D92CCC2100BEF87597BDAD3EA2B74
-27FD9E35ED1CA16FEFC86C087251BE83D80234B6EECC77D19FEC8944D5C344F4
-CD89FF27CE457C066F5104C627D4830CD57DFA3D4B416444F4129DCC2EB064BD
-D94E6888F7664817C3332FF17759435AD4E95C1710D0D72D6A7D7CB179D3EE53
-5E86BD4993A87996B4E793AEE530D6382AA59AE08898DCFAB4151CCD6F99AC59
-DBCA039FD79C24234CB479CF85BB7F99B9FD82E8BDF9776F7FD5D5C03EFC90C4
-4E3A016C7E653A1870DEEC325B2A08B0E636F4DB6949DE052FA593F7125B0D4E
-177162EB4E6AC264034C82E33A04F9850D6E1DD28E26476D46CDBA5D46F4320B
-01D2EC7EF1E108C82D64169243BFA6AA10A6CE9CC9225FFE15F71E1059D7033E
-C49B110FDEA14578DC663480A9B753495FDCE6881940D94C0891A907E0E02F48
-F8B2F61DF35D27493CDA6563FCFF9FAD1A2E41CB27E7A1B541C16E5489525A67
-50314E35DA4C6F2F82EE6C482B72537647F88A7A658DA89FB03373735EB1A943
-58765BD68F9C6644A01FE7DC70CFF3D2FDF5C3A009D37EA018D70BC3BFA1433D
-064E82206EABCCE150D784C9DB26FB54D3FDE40B8D7002ED0006FBB3A8D6AC76
-90B4362A900AA027782E6E31F0C53CF90516BBF375EFE5D0A40E27DF4A1441BC
-878DB3D53886E0746DFCD8B5111FE0AC0C96BCBA37077381E72194163E92C7B9
-7AB1731086258DB9A87F54CD7E58F1156020C7F72BA15A68F0EAADDD80B75523
-5367EE05111189354281E390B4E86198269B954FCD9EF07F9D957AB2EE67FE9B
-8C6DB530207753D889DF381D2E4AF823716BF9781DAC4C7548C385A62CAA026C
-CA5FCFFEA7FBF09A5A90AD09DE2E96D03C0D17ACB5940F94450B6C6663EDEF8E
-1613B93AB0D980F5AD0EBF2158D816E5AEA6262C4CB6EA4A01D1D81713B879A8
-BEEAD737A0A8684C927CAB5AB269EBD1A65109A4DC373149482B82ECCCFA24AA
-54D04084C229C625FBC19BAD1CA67EB23A0F9F9F16EF1566F5A29F8BC28366F0
-3C0164C58BDFA577C564BB2AA923DC5EEBC1A48F8C67B6EB6A5787003C691C42
-FA13C71EA7F6ACEAA29E1A6F0E7233FF9DE42D5E79433B5823AF41A99C4FE074
-E669EBACB04C9E7992A3739EBA956EB6F385D20958FFC2FBCA7E91C36DFCFE15
-5B78030D92EB4822E16EA2D5CFAF548F6DF59BD118987A35D67D67429FDCDC16
-A22EF6745D7033896A09F3DFDB36CD5DB2172FE15D4651EF4E871A9960CAECB3
-70E3FC83CBB5E1B22C52A46F1AE96EA361812384C61EF14EB326026ED0B94CA5
-A94C62E9B9817FA83DA4DCB60CE5746EC37F2C235B6F411BEDA030861D10977A
-A36E36720694009ED6BE27364F02A28BC7BEA691A5F7FC5F0610665B8B98F183
-1FC074B69C33CA23457F5925174A23B267EB85E9A9DF7FA7C1D3C3C9BAE34053
-455486562EF6CD906707A4D771E19DABB1B057F04D758112B2ADAFA1EDF3C3D9
-2CD2D77D61557E1BCAC2D756DB060E9D2834B41E6DDB87ED4827324D63988C24
-9440A816C9CC7B59EEB52F89863B27068111CFEA00EA162C2C44494E93E2051B
-ECB2577F6C3D9F2084C41E12070A8FEA78FE7CFC3B2AE181E1BB177E2F33F061
-9CBB7F4FEF066E63FC6038E43CAE90A4EA7E6122395BA10C730064E67C6CB284
-65567991D64C5BD47025CBA6EA0E5CAA111DD891C383CBD8E688E767CA0EE879
-9D60F259E539595348EFC1BE7D46FC67226F1230B6E16F59A3913ED0634FC1EA
-98962C1641177C618E38FB038CE792B06DBCEF5771D19DB5CD047EE9670F4508
-5E8CE0D6D3986F606A77C7BED728D7F8638087E3D5D7F76E1833F241EE14F6A6
-EC3D76588ABDA5CA79668DDE40F014CF285B5888CAD8489873789493DD3D27D0
-0A9299E68D61EEB26EA367F1927A0F8E49977CA12E4C7F04BB77FE3069130B1C
-4566B996311AC6FEE5F66561F5D2CFAF31A8ED3AF8897BD1929EBA5D09D03735
-E3A0157E61A48A05B5A4F1CE6916AE4C51F8E81EA6117D663E34E5A7222748E3
-8E46D64D8D458AF7610A00861A66D1D1BD47F9A37CBCC7A0DE20F66B818D0FBA
-2C34E6A560216CD2384B5C58D4C2755C8FA2FDB66D0AE9F5AF647B5E0C30430D
-9903489714236607C979F2E12994DA64794D4B4F541B1DBC252F782D007638E6
-14DCA8B2738BA9243D707395DACD052340EE41E0D481282AB40C0D42D0185E7F
-AF03C64FAACB36CEB3BB8053D3A8AA6C1D5626D27E93CB0CF2EED4A9FBA8B910
-0A315118E3BB6B7EA84A817A728E065624ED0AB9867019A358FF6E55FC6872A7
-33E8611EC84ADA92E51C50427AD3C22684A54526B48B2C58CF7570BDAAA73476
-CC26A3D36302F349F37DC5AD02A967626B10CF4AE6DB99C18C6F71C44446BF4C
-A682CBE7658AE83374D43E5CAD63806BEC29DB228AA1FBA0943C135837A515AF
-8B55D087F7A6760120FDF314BBF9F52FBBC9D9F013AE5A85212A5EC501096868
-8DFE1958EB6A783BD5E0935B9A1C42EBFBDC86B7915600303514554DC0B5A4AA
-6494EB18C2786DC7F6AEE22D1892336DDB607E9EEB8C71CFD02D3194AD1A73AA
-C1ABC69F794E128E5FF380BC01F4798FC6992CDFF4F0EA037282DECF99F45C03
-FC8B2B6B55747198A0176E54E532FC832602DC5027B4CD4BC5C5D8ABE25FB019
-789AF90B8A4BD8182F8BEFE13D6F1D5B13B818DC8C2483955914509C54E1743E
-A413E005F5F6856D0C1995AF86829BEDC2CDB3A4BBE45910665D9B520A879AB4
-598781138D35584199E7E7F682A847F6CAC2B3F2E05260BC302602A21CCBFE3D
-FEBD33B49C3C3B4218BC76FAD312D105EB6E1BC15E3BA0FCE6B6A95E6127B734
-B994C4EE09AC2DA6C958058B564A958EA0BFC04CC552CA28E75FC4D098E6C6D6
-943222CCC51155F2E3BBDB9901D52B4803BA384FFDE04FD20F5DBB5E9A3D40E8
-DCF6D76DACD641A96BAE0E281B88A9EA80D27D441B7AE1D7BE2ADAAC238D5B51
-43DA970337CCDA3E978F99B37CD2F1B6FFAF3BEAA267BDE8DD5E98D1A2A869D3
-01BE851623656E091696920D5BB24F9EC248A8CA28017E58DD9C48E53A9EA7FE
-8C70D4CE0A878D3DA52F3C575576C4F0BCC2CB2D35609ED39326320F58DD8E2C
-30BDE298B619B1745D518F2B8716880C813B6B1212D3B6BBA5152F9B792B1011
-84725D9C3F784CCE5932042EF5FDB73ADF28F1AD3912D35FC4B67E23BA84C35A
-4F1E524A95D7FC381F56163C02736A35DC7277AC5081D74B32CB2D6A34E7D866
-B92405C3C2D4A897120CD143B7874E3CC1B6803328A3D52EED3E92DBF27450F5
-F34ACD9DBF87DAD9F130DB9D487A67EA1D9A222539A412984207F4AB62A5592C
-358CC8F8A786E5461354ABFA8B2E746CBA08E266E1E06DF2F4955C1EF281DE39
-6B32FD4A1398E2C59E295A4CEF7A0DD49E135DB7FEB7F7C663970EBE419642F9
-E1FD36D1E5C197E7788235C81C36E6B4C104BFEEDA4F0C1CF0B5CDC6C09CE358
-218A907AA7E47CD1ADC594B4FE2F7FFAA606E0DCFA43CFD3538423E145C6B2DD
-38D3FBA074E97F1FCDF24285BD4291DAE16339AD0934A04ACBBA910DECF83895
-AAAA4EB2924C69396409DC474587C310E3CDBCB8CBFC417DE903CEA643F80F04
-9ED88E90E45562291A684D5344DFF82172B1B6AEEFB26A0964D35E33C0C3FCE2
-D979DD4A1C21FD478E3431BD4D440AF24893979008E0AF174C9AC54E6C7031BE
-E37A79D234544D94392796A8939B685D931559EFE19465564C18CD2972FBD929
-1829A64F790E76F4215E45AE0F8B0C6CF74E9BD1E15F5D76EA2E13D6346239BA
-FC95D4C89459A86BA6226EA3FAE0B1493FF2B1ADEE14926AD908EE0251E0E0CC
-F8D88C3AEDFC24DA6713815385F68E05C60444256819CF07964420F1389319AA
-44624B53B9CB0C6844A3C2C47635665E45A9DEF0F78EC59CEDC12D9E23F7692B
-5F2A04E3E3B0E2295F593BBBA3B811BC4E33878035A0109F9095399854384E27
-448FC4523808CBE1B095B0D21AD1DEB529D7CEAF5B22311B6B1F53B540031889
-3903DF99EFF332330A1E116729E6BB5EB05AD82E6D047C6F53CC7B8C272E1961
-C613DC557A656D87162316A0BEFE30741A69F1DEF72EEE442D6D5141B856C2DF
-5B4AB35B6197545473625FF3CCA81C2DB8A4EA622A5AE80C40E7F2379F35C87D
-5F0F264DB53AD10DD5209C3741CB50B2C51C50B2CDA647A279E591C6249622F0
-29C4EBF1FE98FFE5C1E5737DEDB9A348A6C66DC34DCAFDD983421E44E63D2804
-3B4286005EDF109F2A306CE74488F13653DBBFF9F10F36205801E217C08BC803
-AF2CF71D4C447A5CE08C1F7C77D61A1D43E6BEF030E69C72BE027512C9309B11
-902793FBE1CB3E990E94898A8D9E896718B029692678C29F326D4053C7EAA2F9
-EEC0DCEB5AE860D49C49E1F2B974E9F268935A428A3E66C9B5E66DC10518B2AF
-6B19F339114259019D6B2907559DBE1A8DAD8F6172CAA69C9730
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048013t.pfa b/lib/fonts/l048013t.pfa
deleted file mode 100644
index 4c9d0c1689..0000000000
--- a/lib/fonts/l048013t.pfa
+++ /dev/null
@@ -1,1233 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Regular) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSans def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-215 -211 988 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078987 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D83F2EBDEFED79F2D9B89C
-8EC53816C50F0AE382BCE732EEE6D88D5DBD81066D279225908FE82D1016823B
-76A6ECC3AE378CFA8D4858C797172833DBAD7A6E3394F8E694E1492FE4B67412
-7AD6A6ECC7A6ADC95E7AB30E84E5C6EAF70F5ADD2C2325538478BA68B505A016
-4E1EEE2C4BC00D82994B690B0A7F593DECA6BAC94DF9958F8C9D4A1B5E8CB301
-F978E31D098ADAEF1A8B0C49BE16CF963236BC1C98BFABE641EB28E425926D7D
-121C3B5ED3F3B331A592397A0118B79F023A1F3427922D646B40F1535AC406FF
-9A6639600E9DE05CB8CB72DC1C2315FF3C04432895774FAF2E5BC8C409478E7C
-5E14212F16CCB01F40C090BB951FBF5866A7C22C10FC75DB5EF8F207AE4FD07B
-10C82861AF1C7831ACC5759E0B603A9D8292CC48BD8720C06CDFAC12C303437D
-D3B5D1F4AF514EB57314E27DBDF3FF7C4F1B5DD60244CC8C383F433AC4D74E8A
-E0C76F22042BCAF8E576FD489CFE0ABC503C5BCB003992FE159A65392A4AC64F
-4E555112A88333D6CF854A48727EF93AA0BB589426AACDC7C06FA3D61049F58C
-74416E873A6B6A2198A493F73834D5C19BE517A92C5ACF16093E2F797548DD37
-FF9841B166114296FA9D03CAA6877981EC35D279B3795106CA671228224D0B4F
-D4AF3640A59F9E44C59541F7F06DB11535289BE84587C698463286E342038704
-8D9B9A670A0D11A2B5C6C2E2A1E8F4AFDE915A03AE45CE5947909B1FC9A03413
-75AA4857E725120F78BF6CE2ECB35F685371843C3D95512572A7A0E3BD246ADE
-AEAE95E62E9775AC24597907A8B56AEB88F46BD4B39018AB8432D9737C5CBE73
-77A82B56AF95293C7D0D847C7A508470CD6762AC896FE223E17730F05C9D3747
-E340F37E7BAF694BDAC9ABDB97BC12ED7B01173D3C713E0A8E68E10DE647BB03
-E4E67DE1972165C1796F5EBACF057A5AD7FEA38443D91ADBE54028CBA31F75EA
-0DA41FD14F15496382A0D8C9C27BCE1FDD6A5164F70BFA2C5B334A2D2DEF9AEC
-F1C39CC0484EE7F97A39D31A46CE50FC7D2CC52420898E2052896488606A5328
-FB195A9561E9D5A41A4C8117C86EDE60F80B6C70796B90EA9D3BD5BEB05E6656
-A8BD35A2A884BF8677D05A1F8489FAEFED5C645AD23A141ABF3E78C69EBBF48D
-14884B29D1A4D7F03A66EEA0D0EAF7476E80EE45A894E706B5D681AEE8B31E58
-935CBE30E790B7A3995331BA9B0FA2F03F9A4D326F249BCAAC590345596F8369
-028CCB95F0D1CE8A44391C0E9526214EE28927FC98B3BF6676B1EF48DCE63F3F
-48695A3AC668FAD1ED3B50A1FCD29ECE9E01F8BC3012053AF96B0C7D276749B4
-8CF046E7406621979A92FBEB7B5DD5CBB154ED51C4A9A1C13F6223BB54F6F3BA
-326F6EAE74DBD8B370A25A7A1DC320E9A17CA230A868B752FA7FB1065F435BE8
-A3EA5775CCDC33A360DDC25B2891F7D2AC399BCF6F789109CCB37DDD02BF9EB7
-EAED7A9CE82793DF6FA7F68F9D45530A14EC91D71A19A9251BD810FBC9934F19
-FE4FE1BED828FF3BFA6E91244AFBD8B430B53106AD18F41DF767E2DA16F57083
-B8F66A0356F80C30B956C43416BA6E5CB805AC10ABBD18B31F8BEF14757877DF
-152D286CB6B478EFD4C88A3DC1745A32A56D845A7E61034C7907A7EE957A4C7D
-A6525821611CBEF18947E727A49E0F765D648CFF974273D18A03080EEBB6211C
-E96439F86431EFD0BCC4CA2D2D8A4FEFC65C768D28FCE6BBFAB055E0DF961A52
-81ACE5A300787BF4A458016DB1CDB671B4867E5F5103551007BA0F53117D733A
-0D3E8802208CE1C54965A28912A03CA12D9C34D7DE9599E6DAB5124713CD716D
-916701BE3D6318B19A9E2827E94D4FC3F4D7D5794228DC958B3FB82617CF21EF
-D4A5129EF9051745A52DD66EC77E50F35A8793858819131F36413715416D372D
-DBEE44AA952C566114C8E3A21EC8BB0669805F48BCB27C92E609905D39C7FB82
-A62A627280ACF84937B0F10E132EF579B69992A1942133DA541F50CD3A51FF2F
-C56C10C6ABDA32C83F1DBB4127843928A4F6E714E815E387588478BF941F1F74
-E8632BD28851474673265AF4A18905C07A4EE77865CA41D23069615FD2176AB5
-2595D1E86B86DA9D0C416B67497B6B9FCB3E3F709C3A4E552E9EE130BAFF3810
-C30F41795F68105BB700DE11773B6435AFD59D7815C17D2D0C33C824550CEFC3
-1285EE76EB1E72D6D3BFAF60973919F8FBB4E2904079F53927F7F1FEA66FE0AC
-5496A13D446B0FBADA61467346AAB2E5A9F61619E09C929FDE2BB660FF152DAD
-AD834A43A906585B1B48E90D2AB718011880AD2A3431E5C9B2AAD5B9E401973B
-AA944A69F49810FC10FF7B7FFF0BC5A2FE856D757DA569F34FD03953534315FC
-BED3841FCAF428FBF5210F66C961BF468F25A82E0D6868D3E4B93F95F9B04BFB
-D9B99488FC520678A862EC1AB774A0CE59CEB043230B6DFDB2309D0FECEFD69D
-8D49085ACB83B16034AE0835FE67AD57F38D369F4D9604CE276CBCBADA2F8C0F
-3230E3525204E3868B0AA1E8B387DD2567E000CCAB04929BB4F9F5DAA93914E2
-A4C4F6C5E91C51725CC94DB972FD7B8B46C868D6D2FA9B63C84904E9C3EC77ED
-FF4ED0FB21A310ABE4C54FC6D6D18CE039B4407F06B95CE7C262F789258D0585
-BEB98AD999A28751FAAC37BF6ABE82331A9428F873E91254E820DA499C11F4FE
-85F0CC83DB4763D6B4C6B832D3AE8CFF77C0C883A0B41A21DE36A1D32DC13EF7
-D35F3E86C7EF1D8461B171813160E56FDB2A0232D1BAFAE968A4FB67BEEEF61F
-7273B238C3E2371A05B71B15D8E0B460156A5FE5DA20D662247CC36385544C4B
-A52BF88B7C20C78AA08BB0FA4835FAB7642F195D29A5EDAEEFD711169ACAEE55
-1350C30E459A4EF0D5E7F7C068D1EA4882230D157A51D639750E2550F96D752F
-97B0AC14EA6524AD772E10B6E420584990F0D622598832F519FF9CB6F6A20E79
-6E75AF675E3886621421E2B0DE3AB619E6D0C65AC4B7366BDBA74C76C5F6DDA8
-9E8D11F672D02ACF26766D7CB6185BEF931A4ED03E3745DE92BA86660BAC7865
-61F4A64F959A7B4D825E15FD9567A957B9C672ADADB83070795EE44D7022745A
-9E8B7D0C03ADE959A33ADAFD9FC69A0EEE08FEBF24674B0B6F16B31BF3BF0278
-68B511314B4C73FE31D640D6726EA6051A079A7F503C6C886C9DFFB6D03D2E6B
-AAC0BAB66F9C06FC11A4D7C165CF97CCF9737899D41F602E326BF02394F6E438
-A579EBA81C049CA9B773C10BC5BE33353775FFE01E3529DB4FDC9467564372CE
-1D2976040390CD1F1C0DD3DAC8936854A0E9B5074730AF4736C0E4F040759B69
-5AD6A1C46714E61914180D1F80ECBC33689CDFBE788204DEB11FA4E35DD610C2
-B82E28A25991DC4E55331DB54345E3D11EC304B7B25CFB5F1762444C55AD642B
-8095CF31A30BD6C429497BC0904B1F06EE90FD9926125E77FD430AE3852CA235
-92428660C10A19470784FE02E536926779B248650A6315FB8B784DBA9D226B06
-09C6900E5797693983CDDCF08754C3159545042ED401B364A45A9FD7BE0AC6DA
-ACD9120E8114EDF40F21D968935F1BF9DE05228EC140AFB1889AF353996B79C2
-E6795E23B5D0CED1E0FB1E6A572C6746958619FAF88C368EBBD742570DB4CB4E
-DED4D19E89AFDBF6092D5A0A48372685DD9639A32E4F91ACD9CA3A9E34D64E11
-9AF8E6BDF8674D52F1242D8FE11E19820F26BF1F533C34EA6471A4C96D4D5207
-A9AE99536705F6934CB16165657EE6F6E7CAA7720D4AAFDC6C075346672B3E16
-001BC35A331F03524D28301FE77D9C8B5FAB0BB872D568D5B95B2DEA4322ED4D
-0DC15BA4F0C1D1AF924873193FB809B689646A4CF1D97A1660F953C82211E4D2
-A58E370AF2693919EFBD3C1E18BEC7A472B20DECEBC0CF1861AFE3978C993CE2
-3D7E93946083689CD61E6C180B3EFA962E2BFC1D073F7FCFE39EC0F963C51C77
-B2A77F81D20BCAF1F0B5DC1AABD9869D4497CFD90953EEE70993ADE80AB6CE15
-864AC0BA7FA4B666C54EDCA0A0F9F67CFBC21A3BFC4E2303F5849C130B9B7E46
-0A8F60048C57FF89DED4A6D5976635ED1AFB0331370E53EBEF3835107D02FEA6
-5E28A746BA8E0A4AD649E0CC03B6AB56398D922B96133DF7024BF83A46A0EA6B
-E4B05CC77A461AA0FDCC59E90FBC96D16DA364C2DC55E618090800BB3E8A2D90
-CD72A4C067A1C107EC6B0A648FDFF3D05C508C4DA9826E7082CE58C2B027C014
-6C001421F42F21B18221E7AAAA092EC197AF592EA3D432175856F58FE7EAFD05
-B81FEDFADCCF38AE807B2DCD8E4260E348E3B561E72112DCD7BB0032120966E5
-5F131F2399D9C89AE65CB33A354903D37A9A5E480EBAAEAA485305462228C88A
-16F99457F7FCB1538C2BD86DCAF01F6D6404F02FD91C82562EAB72EE21268867
-CE2C0F3A083719E62205D0090F64F694CEE7F0F38D57D01F3732839933DC0F8E
-DF5F9CBB1FED7FB149AEF7A53C644E17A672DF4F8BD4A0ACDBCB32859117ED77
-82ED68468C311C51C8851ADBB6A9212DBBC84EC1B88A4AA31CC6D1F764AD69F5
-CEBBE3F7983C3442FD91D7EBAFA16CA047165BD327BFFDC247F822314F346D2D
-D3E28BB4C05C485438E70E62DF3E165DF4AB31B0CF7FE84F420304D3FB7D11D7
-DA73EDB8834AC45479C13BFC5B845AF24C2F1A4711AE4BACE4D60276491D1BCA
-E3A3667563FEF12FBE7667F1EA621D0C241E49D68B09BD92D5163246425565BC
-FAD5051C5CEDAD508F387E192AD94FFC7184F8BD2530FC7DD585501E34AF3846
-BB1295CF417B218758F11D342792D81C8CEC903D970E51BD263AB1BFD6E9B2C2
-76E1B061522A88930712D2C169877295EE5340A4D1C3F69B9874E5CE3E3C82C3
-E7CC446BB33407B2F2B13722054B9E4286C06EB291D0410964FBF53E079D70C8
-1AEBE7D82ED6C7F95A0F83AE408196F9FA71BCA747448B3D94BDE6B25D9B1B17
-4C55496B3D0480CAF91E053B3FCD02C6140317DD0457EB98BC899CAFA6D274C5
-06FD587285251051CD5DEABD6E5B22A3F42189ED36F3A5DF75F8A1BAA892D296
-13A466A0FD134597DBCB91BBC63400CFFE7B77A8D09367F2252C22EE637A686F
-C076ABFC10D88395D376ACE6CC23DB7F05CD6C457ACC83FEB49C6B50BDFA075C
-ACF9D01E6DFA07227E28C3F651EB02303A658355BA5176FBAF95414C6A704FB3
-C8025111091F5482A01628F05547A9ACB731A291F1CE05EA8D6574272DC2FC4D
-48006EE157BCD0AB293CABF3B6201A4D90350EEE2948A444F59C774847A5F3CE
-76E328F3A1AFCB732F339DED374E8FE3BF9B964C9A26B3E1C3524EB27FDA0B4B
-EC483B16DB62FAAAB326B862529E0B284283AD28E80F362343BCC66DF8EA0E20
-38AFC2F98F623770538A38698293FDEF0B75E3C5D851094CE5928150C7296240
-1FB139409667CDEE7605B4F16339E2C4A9B94E316D7A6B271182A19CE5DDBE61
-458DA5B24620348E77D1EA20B096050013A299D52E51C07EB68C151F6EC394D0
-26D6AEEA446783C64E15E7C7602522500E789A4D38EDC317AB7CF6765DFC3190
-FF1B84DB7A4A0194A4400DF94AEE615411313DDEBD12786D1720430E0DE1278C
-9AB02BF0705A2E75738D65B832DCE7751EFFEFC699B97CF4151AACA2D94623C4
-73748CC15AB6D1A07F5D13178979CE175326C5110B335E47A53F45818FC9E4EB
-5F7CB8332E12CB441FCEEACD64AC84BFEF1E858C5CDF1F0E895CF1AC75BF2105
-D2B6B86C14E9145BE2F22792CF68CCFBD007C728E816783AFCA822730EF16766
-2626857E1E7C525793A38955C4F40CFB8E42F86AA9A0CBF0296F9C54626FF1BA
-E25D62B530221D6421EDF9E5D7BE7A1311BA3AD0F48771252F4FBE4E55605F4A
-0A520DBE08CC94B181952D89633840FBD1F79BFFC71090E918076A9053947120
-70635D5EFCDE3A566101104D54B346DBECEE79FA87EBF54104904756ECF68B32
-2F6F26103CEE3B06A882DFFBB0B08BF9BDAE2C8D9AEF88837235BBC2CCF19C9B
-E262B6F8748CD3B0224E2237CE0413A4AB2724B6BB3C3391CFD6E8C45AC32ACA
-7249A955656967035944D14823D7EBA0D4FD6F3747ED319A6B133AB8762AF94A
-B43B1D03FCD9F63766753EC12609B8CDA51E65875B04A0DEE40F768D91715D29
-A06076D2712CD5BB154CB9E3E77F322008C505F46FAFB3ADAA066285A50F77C5
-8A9695E324B6A24B1D96F4D4197EA627089D71EA7371D0D0348B8893E5261EB3
-F41BCD40EE77A02264BAE486CB345CDEE0C00A98ED7F96A3AC6CE8C534F5CEAB
-889F7E3563092DFA96C44A28279AE30DCE4031150E2A4F03AAEA5E2D854D8AE1
-0E2DE62B83B05DD9C7F0BD5ED122FDFB6D4E5DDE5BA1C27E8961CF61119B482C
-69055C36E2C3A1DF9165FCD5F24CBB5D6143C9E43A0F93EB260CD66CD4BF54AB
-7AD064FD0D7B72E71F51464E7CF407BA9D90368ED4E9A5D11E63EC7F7E2563B6
-1678DB1300C88F3EB77DA3AC104B644C799344A7B93B7925991A065087ABCD6B
-4C72F2C60B3AB3E9B1B008DFC201E2F48E47C38ABE247B622A75ADAF193E5E9B
-301E0F19B8066429FC8F64E1E5D7822CEBBDF08B83A5E732FB45B211090F0A90
-EFDF2FFC7BB6A847EA398CAE9BD0562F73DBBAEEBF83595E5774C5290373F3B1
-161905296921A55C4C8E9C925AA543338254E7D9855E01803A2EA96B4AD8ACF3
-E4682030B7BA428C6C505C9F6A97567E568029A0FDA0652947ADFCB7FB74BFB6
-F72CAB5267EE86F34D878C62DC81BBF22FFE13CB066760353039995E461AB2D2
-040ED87EA2CFC54F2D5BE13CC99FEBA37333228C7302A34A4F508EE6595797F3
-7BD211BF901C4055641869FEA3546B89D36949EE0FA2CE8DCE71842A52F05DAD
-F63829F2B3184CF814FAA64C73B65E4ECE9B0517204981AF9957F1B6FB29BEF6
-8D47E887F8EC987889705FE17BDA506B1C9E521BCA46A10BD728BF9E21551C6F
-E233316FB7F5CF3CA15F1DD7B827126C89D4EE7A4AA82FE71026107963523F09
-096FBD47DFD66CA1A69A4D7C076D9A2ABD9D5A87B70DF1016E29C3698AFDF479
-451C57823F7B5250315EC85A8E7B1367C2E9F064E2B716340EECF712EEA14886
-22F560B22B39BC1CF25CE9966AAF766BC606CA93C04ABBB3DCCC7E0BB8F4CF22
-2D37CAF0BCE43B93B2EE318BD72BA502D596EF36562A056E1413DE0700C776A2
-0B4791C90FC8ACA2EDA723CBED95908811C2ACFDB5258CA181AF38EA66E305A8
-046EC71857E31894C750CF59C4FFD7DDF405378FFA7C854A0E0E3C7BCA0AD237
-2023844F8E8D69C15608CBE17D84FE9C0C9404913D68B98A6BC8FB01479E0B60
-E2E624A5B4E64213B4BF4734BD3C8B30B0E691B190B30CF2B49978BEA937BFD3
-A18AB4FE7D77EB75837ECA25ADE86438AB48F6E2A6C7DF2CBA1A3006F4A89AC8
-E9596510EC3FB24B33E24F8819A9129429376CDF5E84D61F79084346EFD83BE4
-55348D8E9BCDA1ED8096A3215600A1EAC278B99AC3FE8AC3BA9AD3B861A492CF
-B38BEF7502F608907CD5418B768C795E3A31E7B6971E482FDF8265032FB63F2C
-4B9385860945B83E244B19B7769160D3E90CA5E81E39001085FB8AB7D7A855B2
-7F58B5AF4D7A04C214015A5112FF363981AF0C9F3A6E98C391630F839C8529D8
-79B2AD12D38181E9A57642AF6915E8EC894A2592A606753C7C6E67538B22B1A8
-18D836B53E4E775A9D745F4F0C2BDC493A1122F1DCEEC4F7E18445546FBB332F
-45A62F4A7D2BDA18491577A7EF07D19F1F48420944A2A8DF92D953AB628D2095
-F02358B542AD8CFDA1E2C739EF10ABDAE3C7C17AFB2F0884175BD4BF29164836
-49A5AE6C7D7438D477D15F74939183B61119367149B32B38C4277EB60EEF82E6
-AF4E94FF0D5DCFD77052C2FADBD0554964066239180611E193CAFED231F7CE82
-381A14BB9D908D842151883AEFA0C5C155184D2A6E82FB943792DF1D1B9ACE7D
-3695B87CDA9E22839448241DFE11886518AFA164707842599A964E65A2EABB2B
-1118F729EAADCFF6CB3DA1BD784DBC6BC6D41E895EFE4BD8355B65AAE7FCF6FA
-0B2E115F67B7F29210611955759DC3C52E6C67FF1AF9B69D0DC3B53867FE8DB5
-E3E9F35BF158340E2E888D3A9DF0160F8150EBCB76D053689128B4DCE663EE5A
-DC8526F46AF7DC1629A28BD8200EC03F6A11D2573C68580CC18B0DF7E138A6E2
-9C9022DD9093D3198ED133895B6EB49A5475EB0BB06016E646F3244D76218EB8
-F26F00F8F507ABFD902788EDD8755DDAF9973C40D1B7CFF83E696C2B60AE9E33
-DB98E520A33242F3B367287A519255AE92F2512E3BAA70DFA3D4FAA48B6E16D7
-167CECC79D41D27F714EB1029BF021EFCA5D4D9203062585F1C2EBCE61BDBCB8
-A834CE84A1716F3A4FF8C8F596E5B4C607DF81D25995A76734AEC487BBB1D440
-F1F11D2FC345317BC2928AB4F59091B4B3EED478E821E6A84ECE01C760698BF9
-19163E32D29ABF92C5E2805434C317C05F7B1BE3B47E26AF33FB53A720820B30
-771A2DCE04C0E9914B6E7A2902C4C4A91BC788FCC588C96AC517A2FFAB00889A
-AA125ADDC939A6FAE98D809F8DB1DB49B6D1297EAACD08E94EADF3AFF59F8E0D
-1EF968E765BCA6FCC3D52B7DF57ACBF89E45D13F001325B796E11A5BD51AAA3C
-036C0AFB391EFD7984D3BC6EC248122CE2721DF837E44F58F9CCD0C06C045D2C
-5098854D31234CA2AE9C41B901CEE60220E0DEC181BD39A3EC3E3F355CADAEE7
-2BD3A09FFDA632139242B16207428E0578080CA7CD604A186154665B31877131
-4916A2C04C66E01C1B71821C44E5161DF2646899F1923FF90BC203D592B9C371
-58C88945B5D0EBABFE0924D01CF22B547CE7DFD556CB285F0BE5D9CC7AF56DDE
-5F61D0C66895199CDB61A39C944664CB438422E7FDFD2F3FC632058E5C8EC998
-673E8BA91DE92E64AC3FF9CDAA34DF107836B121B5259807ADE4324D0CE7B7CD
-F2D94F1A5A0D2ADF7A6AFF0DDA5E98F72FC29A34B01ADD8682B57CF97610EA47
-5DAACF94FDB9E61CC14CD2B2CC361C9704EAC1F54E3EFBF743A551FAD5B52174
-486A5448637530218091DE0B4513443C8342CD18B669BFBF241C249BBC8080AB
-012361313B220C3943D4F82EB3A66173635047730A44797CD20753F196A19919
-D1F75BB016E796214058908ED982F3C0D9A524C789D7F634759FDEA8C035E715
-190133B34E87347FC6E8C8671F50616030E5B199758E370F4E2BD838BDA6979C
-3815FF7625F1BD41B9C4B6BF0C7DE3DE69F1C6C1D3F4D387B9317C530A49A3ED
-37989944243F8DF2D60241CC6E4E5285289A7EA597D1DF92640A83360738B5A7
-26EB20D1E52850C829DB87E28B4717B8F2CC3C8942F38694A5DC5A5321DB5725
-89F49CA6D1A2AC555878CD43A023114FDE61FE8B8A08A840ECC2FBBF1041BC54
-FF4681D0B755262384A664C98ED1D1A1A2AF0F1AE96971EE2E4A1EF9E7C0B2D4
-A60B7A6108947C8BCCCEC3946984332F8AFE04AC9345FB60FEC9FD3534DF4E98
-585F371ACA9E10941CB122BB65D9AE82D16F0DDF13ED41D3A14448A83F120F7B
-AEE9C6729E8D82DE68CA746554169CE6214842C399AF76CC78415B52508CD330
-0A776680685FEC3BA39A5C4AADFDE2EE53CF53C5569C54A59CB346033EA7FEA2
-3A5BCAF2442B4E18C9609220A1A334E71D0C4F7748F8068C3E42F3BA0D906155
-3EA8CBD989C0C7BEBA367E63C8484A2DF3E8EB27E50E60D09B1D71B8521336E2
-04EE168BD3077E6444266E1506F7D8F1A73254E5422A0FA4E5728712C3217829
-071803C4E65A4FDF9DDA27A2C4220EAA6F7520292FC1374DB4252886600780AB
-BB1EB3C5F479E96AA17644BE204357F8073127B57B5058CE06C53475CF82B946
-E7632666847BE56D1E37EF9B4CE247B80E2287B80E7C3DB45C4F90D49E0AD5C0
-BF2B51C79F1D929FC84EC2B8EF66EA213E862A2F06759059D72931822D35695C
-82A834F08B21DB8F40C9BDE784C97BA483E15DEAC3552146AD67AE417836A024
-2F388EBB7E877AEB04C226031941BC5E00B62DF4C833303E8D09360345DD3DF2
-7C05793D4B8954D01DDC88C7852B722546691B0DE58D03671CA23B1F8015FE7B
-9E50DAD5AA41382C4E9CCB98FCEEF7785BF174171C4D386777DE16A4329C831D
-FC04CD5AE48E6F13DEB41337FC48AD7C7B208CEC6587585768C24852122B70F5
-DD3A54A92F38A4201C6D75C8DEB955471638A9EF4B81BC38DF39C4E4E6CEB929
-0B06974A9D40CD5622FF02A7D3CA2F25249A40E4F0B684E8FEE2A839FB365DE4
-50FB988F97B992C9E8AC58B74F840221865C6E48B044E0A1A4201490F74D82D7
-5383AB46CE69ACAD4B4B09F5FCF3C66A637DC529695C9442F19A15C927569161
-6BFEFC8CD1B7A7F3F9C67A445F8B6DCD2EE53FA25F68817012105E420A61D35D
-3741FBE996F921C24A4EA47CC5D2099A314183F55F4B098F3CC567E9DA4EB74F
-9865A8019106AFFE5C8BD34EC67228540A4F49747678FA79DAF3ECF142A4F3EE
-07E5B66F004EAF6FA3CBDE4782480D9541CA6E4BFDB69DAB7C72C607F56630ED
-2F3B78B7FCAE17BF13D3FDA9A092B0DCA9D75AD9D6EBB9DD649C3B032AF5A1E0
-E18B31810E6CF3D26702B480D1D2F16D8A6BE47354FE17AA318AC16390AB1C4B
-10165DE80EA293822BB63DB8B72D78E94FADA203B0CE078A929C5B9BC681D560
-B20A2DD69CFAC03D8F2EB16FAA431AB0E7EDC77DFC40AE2C8ECFC0CFD4A9E236
-15BF356CB6EAA90F6630801CCC05B577EC4A33463182DB9F40AD504669655370
-11CF974D7536EA8D8BDD56C268F2362E544CBC1D31E25F9E5D6F490D33026575
-E45B367739D77DFB4D079BE7C379235C8095D6D4F52C8FF0FD4C6DFF2D6C7C0B
-13DBBAB39AF732C38348A4B170978410668CC1A2189A058A3EDAC1B08C09CD6B
-ED16950A2DF3893B96CB35F551D7A8103380F1264FEEDE157C641B4783C6581C
-790DD7349D6703D0B61AC8196A0B787A9A1F0BD9C906CB00439FAA0A9C9CF7A2
-0F26A9CA013B8A737C921722C76B167269A8443FB1C894F35F7BD37EE31DA899
-75B4EDE61F409D8539472CE9805623105FD5E67E6FAC734A6E83151BBF93BD01
-EE89EB5D4021777C423461554F2C2406D35FA6F94824EB29F88E20BFD6383C6B
-2499DF337517DFE6F01B0CF4E35C4E05EADCF5684E34B7A646F3FCCBF3811790
-EE1B34FCA03BD9E6F65916C15C68D8E7B7D2306FBC705B90341415DB1262D49F
-A6BB3BFCDA817AD7668A2528A76CA62AA8CDC02C9671D254B8427AA2F0CC354C
-C9F2B673814A0637DEC6A052F3F279C23391148B4C9E761C5B811F89E737969C
-79E7666282A91CF9D865F25A1EA923C85660404A914C90C9CA6ED4EA1E552BF2
-F03A64AD507EF630E917ACDAAF2CF94A6DFE99BAFB2309BF05F9B6CC991664E0
-C477E1BE53A422CA0C85ED03933D3B210D6716E50022E0BC0DB4E5D5030A9FDC
-4DAE2DF78BF602F524F138F682A21CE9E1B929CAFF0F1006F289A94F5F0C9A68
-A2DBED5009FB809985FB0E9DE0A0CD342366A329B0FB96601624415392B0CA13
-F62538B0B96F27B6E24E8DF136800885C9A3CDD5615B8FA19529073873BC725D
-DFB03865A17573CCDEE9572D13FD100ACA9EF2AAA0FDE0A60A3A219778146581
-92B520565791410F4E515A7B088C43D514B8B16BAE2A658E0AEC9E9A6E7849B4
-4051FFBD37916E095F56B93D56DF69B39B3AA423CF3021862F9BF963405DC9BF
-2A13467ED56E1EB1A8A874BA6FEB5E9B72ABF43BD10C709CC687482CF96806CF
-8BEFA8F7E7AD89186534A4795FA08224116ABF435509E9A6773F88589EF40C87
-7EDE77FE457008692EC223B98E0EF858DB4C8DFB275F6E631FBE611CF31D319E
-C3E946180CD64A4D519BF3F311892C1A5462838271D03D5CE7C4960D675EC73B
-18D41303945FBA3504E55798D86E174BA38DD8B7B1D4F23109857567256AD067
-AE8BBE62696CE29C95D4326E1BF4A5DCF73BC0C79E972518C558654D7CD8BDDF
-67A3E799A95B05426A1072ECAA116CA332E1D611CBA90BBF9D15DA7739FAB50F
-E31BB619F7513BC6BC72617923EE35A2999EF78AB74EF7B3DCF32A6286EB096A
-920DA01F6DCF0693585165EA80543E74646D2DA147F9615D4914EB9690ABDE16
-92FD179A66FE9A0290AEF99733F5995943C88EAF7FB5F8B7E5CFAC2FA77EF9CC
-4F678820742A36D2D0AE01F11652063457DBF0A4C535708D4AF777D37E5A33C1
-C3FBEE96010EB3112FADDE319A17ACC1AB36157CC1A5BA41B291CAFE448380FF
-B11C7CE02791D702D70819E83C2ACD8939372B7DDD08E98D0F17940D94F825EF
-F759BBF2BD70387DC2467AB0B21A536F5F50F2EE5368542AA42BF43008D17D4C
-E9543A490AEA3FCB360B09198D649966BA730A06F8A2441F5408D5A7095B1A0B
-545FF0CFC72E831EAE74B4E3656F413CCB92A778D154F74E05BC0C1623EC926A
-E86BBDFEBFACAA94B9A6127CB16336EE4A412B32FAF19B7C79942A8A399D9C15
-A621EDED310FC33108673F0D6290FC882CE490FBF3FC65B26BF47A9FD3AF6BBD
-13539E842F08928531CDCF19DBE2CEF56C1FE7F6F617099F18CED9AD3B3B7C0B
-89DDD37A3CC1AEEB69C54C162ECCB17D73FA18405BD7F58B0E78021BEA22CB81
-1357F69CCACA5E090E658D1B6A826E621482991101CE50C62B343132BCA7E586
-ED3DB34DFD1562D7AC57A088375B145F7ECD54BEFEED6791C53B4C0F475C0B69
-F14A2196A701674C8845397E4BE0F13C66A2E28A98DC42EB96569E06F3D923C2
-18ABED5B8FF7B43DC738B9E2258D1C0F5A242350AFEAC5E95BD80C16F094246F
-182C53E12CE7B880D1A252999C8EBC6014AEEF1EC179C1F5175A7AD8163ED9A4
-07BE5B2D3EEDEB61826EFE3D65A9441701A76BFB637E5D5053988903DEF41C28
-EAE257229172CE100FE8D5591BCF99F000C5459559B517D3818A9D65A94922E2
-CD5517C8A5927378B580C048FF5D5E60317B469F4EE7889E4461050F2AA1B20D
-D8A2F241D25635F195218A37F29112C2DEAAC7D8A3B1ECD4A68FCE0C24CEC87D
-CDE22DBE1A0A73614C3DB14066448681DFAEF8D35598C6AAA8F70AF07A7DF0B6
-100113490C2131D5613ADC8ABC12FAA531B3EF0A45D19C72D77ED225F361BC0F
-86B70C9B531F4900C6CBB9500E532C5C50BCD2A1295434F1E763AC95E68D7C75
-2444EDA3C23FB50D2867CDA09A758D32E4E30B01EDBD02F917FED439D2F097FE
-0BD6B387FF89CA48E624295F91D96D6370FD42AA6A0BE14666D791E088BECB57
-2A391A8E87F2C6E50D188475B74CFC4F5BD1ED8D1EC22791BD31AAB92EAD4DDD
-C7E610667BB1ABF783137436279D93A71E565923296866F9704D97AEF3876367
-5A063F8CD68C9223B621797F7070D5BF6F743EF717E754F94D6EBD201AB0164D
-C240049723150C45374BBA15E0BD104091781F7CB67852002D31644B12E590DB
-82846375410D004AA8129575F45562C33862250858C46F72044D58FFED513301
-F7881208CAB4E4C4459CE16CFDFC75F768CA513523C6C2AAAAE41C0A219B06C6
-7B4AA98F92C074356298A588B571A0A03B566128C0F62ADC9663E0EA2BB9F686
-609BDF8D6EB178B00E121632620CB7331995A63551F8373A22801915C7BFAAAE
-652D11CE7CAD9C7AB1CB646C605C6C4F2E42BCC872D94160024D4C0B2DBECB02
-25650FF58D1ACAE991CBB26FFB229D8355814F5CA8620C9E637F4A77AE88553E
-E159519E232749E5D037EB2BD3DE28EFC4615515DE0F44BAABE6916F0FA7D61E
-2C56F5B0DD6B387A7C160EE009302BD3D1925D6372BBC8D72344100641B9A87A
-647386FC7F4A4F16CDCA462B9215D94E8C9068B760AC18660FA125B352FBF456
-C145C0DDFF3E4F6D2C84937AC82BB53D0DF720BB8E0EF59CA0F1DF1AD8A139C0
-92DAD7B59892303822ABFD24EA1A922B09F5B4344290B3647CAF6E7622583798
-3DAA4155916D90B1142F2745304C46BA7E3F98F1319A3F6500C402133D8CEA89
-A10360935E26ECDE1578D362C34DB7037FE312A5EEDC4054DB2CC52A88D2820D
-C2ABA013AFD88CE47E09BAE8B40F7CA321DD86BAE6C82B919884C8B855D7F5E6
-72B791936EE754670A53E92AD0C74843D15445AF39B6C7C2B065ED1B3A29B81F
-DFCA2F5D4191212ACB7FD331692C0ECEC8DC4F442A753F60024969BDA7E5A010
-3DB640453B353FCF772678C52781FD6DB32BAB10D6BC7DA3233D0DEF0EFB8B5D
-7009EB3F58D77C0B02B2341FB3D485EC340E80C842B6E1EC4DF85052FB2AF512
-A48412CDA18DBBBDB5726EC1DC3D5838FABE8ACC5C3D19414DFCEAC70B857638
-5924531C3803BA645F902CA88F74367B09C70A1E8504F8A850100A5EB21ADE63
-3FB038C571150C9EBD3A75A2F670122E92855F6354919189E36374E91C59886B
-22899897F868B8720508F9BD5A161797F61EE40942EFB26C155359D4A6B2314F
-CCE8C7059E214534FCC40EC602DDD283B2A931B5CA1E873773637BC9863CF916
-1B7B36B008EC1BB562C4FD883A631598831B1559C5D77136AD03E94DCD9C495F
-315470097E005FD022E53DCB7581DAB60FC791B4ED9C636E2DE5F5B22482374F
-088736F9E02EDAE88C55C5CEAF21EFD64EE282AB84452A1319AA8DA3695B7806
-0ABECD77CDC40FBF7D9FD09E1ACEF73DE682447FA18F45C93C03E7D8A70135EF
-2B18D6F397DD2885206DF5A8C52C89BD54B11B4F61376CA6D6342F44A57FBDFF
-171548EB957EB47C62C9B78FD5916FFC8B2D9F9D4B744E3D7B784BE985DC57A6
-92352900DF235A531109372BBD46A8B862298EB6967829DC163E55CE85F0D8B4
-D952851ACA00BDCC981DAF1B15E5D53D29F55FFB46E81327ACC6C147B5627FCE
-9989428A788A98DC4DBC9DF0904DBFF8DB4C6F0BA3CDE8FE3248F29EF8003878
-132430F063596E34424CECC9C9FF6985D4DB0786EA1CF7D0DB7099A3C4D5E26A
-307080C45892678EA66C0A539C32E688222CA098EA3472814A995A5701E5307E
-DAEB7C853A4B7B46F9910158BFC4B206F7E7CD0D9B5A1820773CBC23E6E43CD0
-6A4E88EF6F45285E85651FA56DA663DB16D356FEE528772A506397D9D86B3D18
-645D3FBC57199F8FE75913911FD64E03E24C6D0279718F7BBB0C8C502BBBA59F
-9B2CC3C21FACD744CED42569A8841D3867CBEBF2ED3486F5C187583E0E6B5D5E
-9441B9F0F659E5BE48A17B05F9D3D96F28D95D757BEF3CB83CDAE0E667F3F8B2
-42F4E6D5AA1511D320A2E1B96C3C7CC96A8737A70B974760159CE08941C3E06C
-EF4B1F07AB12EAD4BA26C5C3627A231EDAB2197F8B0EB12584C9817D5BB6B39A
-B415D59E2112DFC61B10A06EF9ED5252F9C0FF98FA4A2B49193F09F796BFC431
-38B88C7EC80A1E192DF7B6A0E5BA7EEFED908BB108AC20B5816DC41D57DEB1C3
-37E3BFD817772D44F7C1FC4F82F41685FE711220C8175D68F4C73727A6982190
-2894CBDA32FF2B70656B269657AEE710E75D8BB54659D46025405583BD30A344
-EB026D2DED75300342807E34D661FECA07A39F567E0AC9053B3DE8330E6FA84C
-10A47732062EAD6DCFE4982DA630008C33823AAB374797946A17678938259C44
-EE9BD6B2DBB700BD2CE90B2407DD6F7B48A62D3A9DAB971477E50CFD4F4BC72F
-5405120220EBCDFBF0034338D21BE2FEC949C90466E14DFDE981A70F2F6F26C6
-5F0A35C1ACDF277E7034066DE11C25984CB5511FBA51CA0EF84C1143F8CCB991
-116A2F8BDB68B1EC45CA2D0B3247F93B2905C146FB10A63104AD5F9C4B82C7A9
-5373F8783913A2F925B09245825E167EB08308B1691DF759C1E90FB2611AD646
-0F73248F56E90C86F99093486FD1B5736D4E0A6F880670C37F1AFBBF142C7865
-C846921E34887D57187F0828675AE07826351005BC73158A2BBA59F5E9614BB5
-B9E72334E760BEBF7E49E74F68525F9A017A34A18A1EF40ADC811DCA5D5835F1
-26132E606874DDC48E181F79D791DAF9B2668DDC6A833969FB573201E745DA5C
-8176B641258ADC5990C82F9A9C8E6EDDD446843278A83BFD4300F749EA148A28
-1CEB260198F38A5090427A0052FC91364EE8A2DE0317ECC66F676E2F9CAAF3D3
-BC6E4FDDC0F31F9259EDA5AC75B969257E635391539330BF9AE0AF73738452D2
-6388C2975CD9727BF11E0C4E887511B0975F6813E77A08DD27826D609F0A2F12
-3FD49AAE57298D7D814409C4EF9C66F81A02BDF349FA0F4F8D46683A56165B06
-CACC0EA3D648B47D501AD15F83EA655D5261DBD832A6C7131A73F3A25BFF3193
-B9B37D19D2334F29808FE28BDF612DC38172E9F35CB9616CF9F2248B7159465F
-FB90BB57BA61B00B4FC957644729F270FF485252643F9F16244BCF1178C7CA2B
-CA532F178D44B8A7A47550BF1D1BD89C0A15AF41BA0735C486F61D5CDC421DAD
-17ECEEE048CB89F0CC319D0C3809893E441F85E2635CA10A869BFEE0B753FD0B
-C9849370A0CF1631DE406FAA5C4A9C97EA07608ED72BBE10D82C17CEB10BC478
-1EA17F6336A773CCF515287E9646695A6A27E84A3ABE2EDCFC49656008B951E7
-B3C0453409A7003D5E33F3CE248C108AA0553D8EA29F52ED17443716EC967F48
-D3C2E15470F048D317210A67916ABE50E11F6199D769EB5C78E447D9164BFCB9
-FA6565C7B3AEFA07018695F7D3D40868AFE8EE320D6BC24D55F972CA66BA98E5
-1E2149F7D205FBFF2E1C5EB06CB71F2F10A61DB1571726D0FC78F584294508A5
-844449982ABF95005A4DDFBE364DB40D81E573C937402ABC251B64F130BFFD0B
-5EEC2B739A109B89895F8EF47F6F180A4423ADCA8738735D1287AE5EE35B0CAD
-09086479AC06B5D0861D8EAFF2CB0EA7EFBFF7CA03CF6460DF5DC7FCD5795497
-57CC8EFEAF7AC8CF44670B8519825FA30825057A23DF1469CA1C14E4737FE199
-38064FF83880E04C863D4B16292084505129670B11BC5796C4F551770C2807BC
-D5054771387B8FA34AB300BCA9447B952BCEEC98C72B7BA65504BF02BDAFE588
-0DCC68FB6AFAADECA915F572740233D78E6D3E652D6F8817B771B1E1B32BD1A3
-6DC2B632C92E6A2BAFD2ECC15F7316FEAB6229434E0FD979685202408F71CB8B
-1201512A065271EAC2BBF1B479798CF2E3A05F05F21E123C5644F701E3113EAE
-27B93EEA49A478484B91A844F9325CF0742AC676D55C9187EDEB708B4C8D1B1B
-37EF1B96CD3B554458B840A8C384B89A91D53E0C8EB72483BBB08CBD9FDA0BA1
-4E124713C547E137E60B37E88AD35B0FB9DCF2A29B8E191A2D8CA785576AF525
-938D5D856049CAFD10E949CAD5F42A390045D90F2CC97C981D1FC272435374DC
-3ED1E0E42C04E0984CA1E12960C2EC6BF263F4D74389F1761A6E87857967A6EA
-16BB17A46D36F1AD4D8BCCDB8988795D00C76677DAFC702EE863AE02392A840C
-03215E0CC08DC8385354022E7DD2923F419501297A3AB017FDA031D6616CEA5E
-888ACFBD83145CB8205DB631E632822AEEA28585015695A4B206D98EBD27BAB2
-DADBEB6FC00C72CCA83AC401B367414306D36291AD777747A3C29E52992A8F25
-D3DE12A79EDBF370AD7E9C4612C665C72E57B612FCC81CA23661FDEB7159CD5C
-1F159EB60B49085424F078081DC690399A5123240B698B7625AF0D34BFE324B6
-A24B1D95C4BE19428DCE545E7626705A7CAED84460B44256125B829098D97FF8
-FC319CD72C806D7BD7343ACAFD866D00AD8F5EA111E9089EF7902A56B7FFBE67
-F9BBE8853D1734D146AEC85E28D0903A94163C1BA0F0E5220558F85966B0B787
-3EBE0329D0E243970B7FA61DF295E8493C92B30B2F5019D4E4F2C0C775C25AFF
-4F502727BAC48067217E5587EA0C6A24918AB20D6A7C7938380D1A342B76E99E
-0F12B4C6F5BB424E447A26CDBE25766DB8A1E7E374BAFB4EA2DD58ECBF0942FB
-6A54885EDA3D8CA43D8EB86A1DDC6572F468AFA03E20F0E882958AB7EA7E3ACC
-8DE675B4C35F6F9052E7850E7205849E8505FBDB8168C26FD29AB6E849CF6001
-DD4FEA81FC83718F4C2F2BFA6E4C0C4FE66768B54A913D4A29499AE406B343BB
-450B3D7029E6C578F523974353DE37D522E8FB091EF6106819675179FD6BDBDA
-B6A42B339DCC43717C6C12C56EB5C80EE2A7AA2FFC8097EC905DF5EF9656877C
-4CEA6360082D500D23BBB0AF4B4EFDF15A33360DEA36DD2591FB9DB7A1501A18
-6A31927BF5BFBA8FFFA22F9EBE0384939063BB305E307DDC3E595E525780CCC2
-D4CFFFD19EA9BA61E2BD6CBABD1CE52C9B93DBED0F486833E7A252D818EA8040
-94213BFF2DB659ADD126AD0455EE85936D6C02E67A07B163DDC10C11B5A42327
-50348D881F4005572D61CC0DC9510C958A153D6434363A52DB4CB9B9E56FA46A
-0ABC1939A1FBD632E18C3D250798B27418403610477C6736004B1FBF6BE7561C
-950861BB6013CBAEF7ACC21C7096DCB7B99E8F4E17815C5D40BCF2218248AE02
-086353CD1E8B0856AB31A3C2474326F14D0CA9F6A0C52236D9FB89EC842DC8D4
-4857B0DB7F37131137AB222A517CB80C671CFF8A9A5889C8BB2ADDFCBDCADC06
-CC2BC3540F12169D3C46E579E6185B218228603A4B3FA8AD8E840C3761C61217
-8861458EC8BF163C492B748FFD349E00996B78705D9DD932D6CCB6FE7D7B25C5
-A92DEC2C6B950FECB4ADF57C5A95BF7ED12E431787DD29C6D4414FCF3C4E360A
-31E19B37E2722A94BCE47087C5E1845929FEB43E73D3EDA981A0FF9C0F757042
-48F6912DD892E2CF8880A9D1B19FF0A197921A2DC12881E913A4C7858A3B3B96
-E9A4DA7FF3598E74D74B04B5F2545DB3B1D84E86E26AA8396D696E667C2970A0
-DD9978187C583D415AE00359BBDDD7109C15547B9A56F978475531BE02542924
-65D23928DEAC21CC7D0C1E1B1BFF850ACF80E629EA46D71FCA2809061C61F65A
-B881D56F270E8C776983E3CE0271E3F502818DB1E3EAF30D0C98BEA340673FBB
-23CD34CA17648735CD2A532A8B3A530C3E523CD013151B75FF664463DCB0B388
-BF60CD928E28139A13575635F349BF70C798D0EFD52011E75A7B3A2841FC3D72
-65EF0CBC6286367F1F4B3A7EF9F1F4808954E6D973ADF0CB1893D49B47DBB0BA
-AD66EA4E84BBC2F1604FDFC7C9FA0E131718053BA1BF946A6859DE3E452E05A0
-0E179B5F1D03659522BF22518338B6C98397F040F0E93F8E6A463D7D504D3690
-142E26C28172E8DB43E5DC2D45655F7D05D999F32B6BC9A9D0C89041C2031C32
-C54C4ECD75FF3A95B871DA7155A73C3B2FFEDB148FD851AD87437BED46C10E99
-0BAED69E6900AA9F66D77F30873A508C6369C4F898788F8204FB5B5EEEC4068B
-2C58510223C6B23B668204B2423FE7146B7C5314969349CF72F100FEE07D4B8E
-9AF97E9B7B6EC0894C6E81DE8EFBBDD37641EDDE1D241E4C4440CC91F8E3E3BD
-E70703769D9AF7227E7A16BE76336B46DB6573D0A195837471D18666342990BA
-4465913A45DCAB6420462C5FFB8BF1E546D0C5B009ED19C8B11F5E5D7A41A3DD
-4AA97192A047F29E8C8A195634E4778EA5F16472542D9A0B24C8741F547784B0
-3CB68F42169804AD537C0884BEFC4B5C0953A11F050117C86BAD3F5E151FA668
-D83B462FC0BD10664F0962D62E31E163FBD8FEDFA0C300994421E54A9BDD620C
-42ADE78FED182C26595F8CD93190C4CAC7F46D7432B635725038A4FF6DCE92C3
-9385912E24C214AE42D5C72EC74EFE2017D4428F4961D416454F41738A6C3D2B
-4B59F8F915D7A5E03B6A6A9B982CD07BEEAE7760872646776324BA25AEDC88A0
-38A730B1FA17BE4BBAC909375FAFF664BC811439F269CE71B92CE5D30FA255EF
-5F5CD5ED0393DDFBBCA2C4008A6D58A1E470EED8CA803E56CFFFCD581793CE83
-1D49557CB4F47FAE9CEEDCFDE140E70F70D8AAB8B4A851D01F219538D8185042
-46E442E90954118BC348EB5896BB31B185D659503B9214885CC2600719EF8F58
-F006E2EC11EF22C286B7F058E8F4535D7EF5F3B674FF0F5B476E8D75001ED67F
-48029504CD633DDEA56FC7750A9F9D707C9D3416430C210089F60B231526F4F5
-3962D40FD4C549EB4E494EC03DB95DEB23A6CBF25DF58F1327470CE13B9001FD
-04467E3C1FA4082DECD79B4CFF71E9284168794F2151C1BAFA164AD43CED97BC
-A410DC015AD503B270D81AEBA9A963CDA9031FDAE6B51F0C1F3606A00215719D
-477402DA2B221AA885F6351EE8C4B17876409ACB320444E69B0DBDE6C90E4D10
-2F72593F2C36ECEEE2F293DDEEA74CE325E806D825F94B4280E94B8F5803A7A2
-3A47DECA7E1175BF08421112A67C59C1187570DA6B60528565F0AE1F9810AE20
-E9A0990380605E0C186092B7F65E9C0F1602609DD44A8BC80376EFA0D406DE98
-DA5E4D2BC78E67543927C6DB57C5C480CAA6D5D81041432F3EF05420341F369E
-499C5245507A621789317DC4C294265DB72AF96C7FE3825DBA6AB5C96773F1EB
-203AA5092F63C0DC5C8D47C28F86C5E41B280C77A8501F529B1AFAA5B1C64031
-DE2E70D75D8A471E16EB1660D64F8F1000173206D82C807A7BCBE7C318934315
-EED4B9B8403A58E18C1D4D7250FBD8DC638A3D13D1ACA9CB71D805D4809BDED7
-8F8732ED4C08DA5D6F705DC510892EBC39EB623095D6D7CDAE7FD01A9E4F3A63
-64BC83D0DA24AA2333F473ED023CF9189EAD1BFFF702E0B8E5BC6F6484B6C77F
-E79842C4F56244E6A5816F0C76A4210F2B9A81E367A7B02CB683C6A19DF10F98
-DEB661CF23424272183272EDFAF0871EC214A6261A93A7C8F9CD1C08CBACD9A8
-048961430AAEBB34A5EF5C0E321CD6C2B0AF1E3D81A8153CCE16C87CC7A24585
-62BBDB75E14CCC4EC692749432A52FF9827F1CA8ED6F47059CEEBBB945B701F8
-7ADE1DAA3C6FB9F3E95954CBDF0883BEC86A6F63C4A794634F503750B169A642
-3D73762550A657BF8A5B6388E41E7C8136062EE343EAF09C07FDB04A9972A91B
-6E9B192EF143F9E8D111CACA0540CFB62346A23938314B9EAADB27D5879E9376
-DF4465948BBD6B1E845C90518802D5389900E1B98B68DF86066A90C7EFBAB98B
-58335EB75CF3E0572DE2BBA77E7F6AF3E199842DBBB7060ECAD3045E834E1BD8
-64BDED3FBF9306C2912811E237FF9D6CEEE5278F6613E371AAEC15620C4A2A15
-22150F8B1B0C81F9A18D49B2684640E7ED5CFBC31357A236FB1942982EE96B6C
-E3C54F03A25C06968A53CB9D7FC3AE8C5B917BF33C2D4181280A0242E823E2FD
-DDE615424F9A3FDCCBAF420542AC90A4D9856BD2C6371F75767A6BEA4F861909
-1444B6A5BB066C63E46B32B55F2D26B97D074661CC54BA96497B226A353CE86B
-62D435CC24BAC65985A947BC16218E15579F16FC8DB371582A15D3E510558BC7
-EE6169F2D9D239F40C010AD8EC8EA128CE416E21637174D34F651E4DE30A024E
-0FBE8B5FEFB5C89772D5230B3AA652D6778299B048C4CB5D68455E18B66DF0AF
-851DF300836E15EAE115DBD03DE42716281E531D5B6994DEBB0897B97D21ADE1
-49F76FB3DF0FD481B322E2F3CBDE64B16BB7FFF8DAE55923757F1A65FCF48F36
-E51BE3D300E0D251BBD18AC914B242D71E491F9CB99AE0909D326AE17D9D94F6
-6F8CBEC8421AE9941069126986D9C26DAAA474928B2BB477D14D7CC7A4B3301C
-A9B795626F9FD0BFBDC870275229C5E67451D37BF4BF92090A5571158169BB81
-D3F45B9C6D65E3DB921ACBFF42885AEF73285D3BDB6FB4B9B8C8864BE52156B5
-B2F20F8627BBDC08D8AD002440E47A2C96D79240147936CEA7CFD7B09027FAE2
-60AB5109DBF7059DFF4FA0D8B8EB06DCC73A1D1405FC19CE7D23C18CF6B353F4
-FBAF8AEC7E36B738F6B1CCD05A0B9C9A4C13D060273DCF6D39DF922B3797DCAC
-876E0635F4D60C3D5A5DB9715D09CA2C6D0D16B62B747BB8BFA0580D0BFC0469
-3D78A9331EE1C9E7D5FEB03C241B47C60E70AF08FCC5A37CD973B4C6DC83C6B7
-0D4BBA368135DB44092579F9FC257EFBC1CF7D915FFACB222D06C52E4E927178
-80EEA6947B47345342D24FC41FC24A90178BD358759247F8102EACAFB14F4BEB
-256AC2EA0E6D3446B1F1DB46922790290C38F16317FEB372898EA0854C333A01
-6A43B3DEE51F5A114B90B421C4CF9F874C8AE2CEA867C7C7A95DB46C30C1AA49
-6FA9F53DA9825F54B6653E509A079F2FF1C3615F0F34D04EC75EB02BF0ABF364
-12FB55935F20A858F30F7C86974A3485927694695DD500607183FCB73F1C3428
-C9C24FDDFB844232A43D2C596605C70C9F0F14DE98F222CD610262EF9CB6AD1A
-41FE3C37051B2E591A879AA425118BFDC89B41D42E97EF93FD6E50A82B7F82B3
-267FD63506A2208D35FA855BED185FF6ABD8C5B5BC833D5CACF9C71AA6AB3DB4
-992C5BE71BB6DC0596ABBAA03F89A4FB0D77FEB283CE666DABC4AC06741D8B76
-05E80D80C8D95A5E340B8A23733960DC9283ADCBA0C75B0E78773B198C5A37E1
-27B7470CB6E15CE19E890BA07CA1A419F1F5FCC5C1CB6AFD5B530BA03585568E
-11063A0050CA5E8F3DCC804E440845869689478CE1D7388C4EBEF6FDFD245810
-AB2C5860CD320AAB722534AEEB9E3483329BC97B693DCF7D3AF4D29E08E83F0F
-A487B723EA2ACBA403B03F3D17F8380B2CCD6C269B6D201E465973BD821ED5AB
-BC7AAEB05418DEA87619D40F4B1CD70E951CF7AD151A9B8B1A127871BFEB6997
-8A90798D6D075F8C74E1D3375A932A3B57136131826C83F2B4B4159456BF5DE6
-ADBB4EE690FFD3F2D760310841CB6C21509871DF6CC08409617AB94A32FCC617
-632E3E8C98B5A2B3E7B4169E53C3FE3966CDDB526EA5A18DC4894660EC1C4FBA
-25BDA925174892535C368720C92C0EDEB4A245065266674C033D90D52009F5DC
-742F7289F36CE321838680EB9F8E667234E802E6EBF61B60E526E154F2BF3A43
-4925FD043EB471476117D86127AF7894C44DA04EDF2BACA67120DA53B1A116B2
-B9BA47A8193D791E951735E33498D8C705E67E2986520D880110D35C0566FD8C
-EF860427BF833331A7DF3F7EABEE61E25B667BB6A4584AECF704B45F24587AEB
-B6DB1D7B6972FB4B4328B2160A91199CEA30020FD62EF0337A4D4F10AF923EC2
-247660A5AEC4D22E976972C71EBE9FD9CC9988D2E272D8FC20E15C68E9CF2621
-4778CD8C3CD42235F7FB33D3DA71F5D2C5CFA17421AB95587919AC1BA75C85E5
-E459C9AA3DA52A0A8714594BE4F2AC32599DD6C3FA3340DBCCD87B8E7D567595
-14E3D254F660EF2C5EAB9373F33395BD7327777E3DCD4A11B7BFE54CE272439E
-E2BCC6F8EF22672F81F20318CA95FBD8ADF3E18ED04A4E73C9B32EA493317B99
-E7680A397A72692D0AB3877CEEB916F8D7D7E7B40D97E449F76BF4B1FDDD08E5
-DE37609896DEBDE25CEE302A509968144061ECBB277142D3512485D11003E3DA
-D57C8992A310C2968CDBCB65F3D975EC5E3685F0FB2D24B8E03774CAFA785BCA
-F6AB8F5B958FB630B7DB2EFE66EC1C446E5EBF86C0F02EB9A96E582471E48BB8
-68AAB996C02DB531A45FD3AF2696E0A459629041E80D4B25CC6C9F60B5218C9D
-2BD697F050E194E664AC1F229082656351C8CBB04F8DE1584411800C19261918
-FE7BA5FB2E4C02AB650D73B4A62E41C15D4A92EE8221C51A7C6998CE99BC505C
-DA3F3F384215CE8EBD281393E8EFDB9EF91F03EC00DFFA1B2229D70143981563
-4B52A88FC1378607096431F6B8E1DF869CE2FBF2548B6C1A9D5A4E40821E3FAC
-9B15907958C13AB21017A3432D57A0190FCBD86287B5E2AF6DAE27E5F34D9EA3
-1B8DC48F1574D9484951F76BF3411788428D05874F0AF0048192CC05CA43EF70
-E0E1358BF692F8B420358C131E06E33394317AD867CD47F5B91A075F5B72C49B
-DF756D282F3702CE9F03BF86CFE4F51FA00D186145C002F25D4F897ECE7986A0
-5308DBB80B40B71FF4B776BB4B3F82782A76EEEBBBFC3278DA716868DCBC097C
-D3D3A37B935809D7FEC58B537799E1527E7F0094B11490F9999D23D73C129A0A
-7048D4CBF9226064A31B3ADA9C19254A20DD1BFACABAF15B3DDB06C4D7E65591
-3624A68A5559C9BA94E47BC2C08AB8C6FA3E0A2494EC8B40F90E0CBF14E5076A
-CB91AABADA49BBA79CE47E70955200256475BE67352A65C75292AA82FC3998D9
-DB4D7E5366138B7C516819F0EDDF92351FE34CF73011FD339B0F8380B52D7C9F
-B7EEFBEC433B3CC2EAF0BA105559172088AC7BEBED21F2243E7FA81C59554911
-08E9304C1C252908CA315F95A1A896C0C1F782724D3716D3236DDCB129AC356E
-06E4043FC93CA6BE977339C6527B4EA54EB74E89CC4E8D42F3AA2F7AA5BD9D3F
-B7FEBDC1F174F5F594BC6AF14C89ACF1760ED6F173759AFA80476759CA2E7E80
-6BD05284C63764047A0AB8A545C67868236411D96751FDFFDD4990324951E071
-7A8E17659FCAAE93DBB7E387569959C4A4AE5F069207A13E1D1C7F40802A2D0B
-8B3DA376E109A1AA9A428F23B0F9B99650FDEF28AA801C1F9B7291D47880444E
-7EE09C0920ECD434CFF5B851A343BB70E2CFF06854E78A1F92CE831BCD253713
-4A92308D405B22D204FB7139CDBD1B14946F2CCAB6242DE87C5C7565EB1C9D99
-85CCA6865CFCD57DAA7291591A202492CD863A98E17F9AC2CD9867EB827E70D6
-B8B81A6996ACE08112BF38BB07BB78C6C879FCF709F8D94729D06D3BAD9CBCEC
-E85E1A08576B1B4192FF26B6F923D08EAAA58EB670D84361F9688229A9F103CB
-1D43978B1B067FC31CA0AEA33B5B244D7069C29B6BEF12907A78ED5128D678E1
-67C39DEE6E9BC38E134FC55DD7692F5219ED04924CE8163CC566BF6D6B331456
-4047FA2F3B2C10D95F1BA5E7E527C539144B135D3DA214B88DDD2B024E6F8F7C
-D943E64B6097E559B860E235E2CD13395DD7177D7F93070B8C8EBADCB127162C
-CFEC2895632A15CF1E55A525D342F96B023648E8C5479C6AA0A9BF9729DF2E70
-DC54A2A26B1DFE7BC7669FE938FFEB7582386FDB2104E6A19042FE6DDA8F9850
-D5AAD74050D5318F0F8D4D750A4492B50C2AA395795CD635C8A914B707B14E35
-844DDE1DF2912ED6B078D2685AFFB987D8C4D86A9DCEADDEAE4DA772B947299F
-E5A438058A936C0AF23106FAA82C9D8BB8D414EC5371A2AE978F99513B7DD837
-A6BDFF5551C9467EA26AA91C3900055EE65185DACE0D675A8BD6C9D4BE4B006A
-FE0F89713E038B7372A86D4A40532D6AD87D2FE7B62B3D2EC605DD00377A55C4
-E8392D8D3ACCC84664AC3E30C18D8C486E8C502196F4A36226C1538C4AFE302B
-846F2A87AF880514CE1CEFC5973FEB9E9A48C4E356EC79D3AC1B714E23B7562F
-AE7199C0FA5345D37ECB4F371BA123B67CA068CF67BBDA93268F4E08A5427FD9
-0ECF6B33837F8A4F42B37530FA5AFFF10D8D558C9B55A930CAE49172A6D36079
-3F952690DC1D987F2D63015B3DD6E2642B97D7175E345E299FE57C3AF1E83E02
-B34BD8A4244D95F7CB1AE5D501F358051477C15E534FCFE4C637E316E5701EDA
-1009743C789B2FD633798171F4E88DBDC447ABFC9C32701527F34BEE07FFDC36
-003856BFA9325A4F7D1611CC5B36A4D7604484471B74EA3D8D5A28E9DE243332
-D3C6146772D773971E5BB3CA34D8EBD37C8F435B0BB57AC9352DFB3D09BC2C92
-E9081DBA9D8BCBEBE3C2C42066DA13188A5DA5939BFA435FE5D2CD8466EB0EAC
-4F735302C75CBF6ECC96969E3AB91593FA24BA117BD0BED4E3F9A51384A5FBB0
-BDCC7A14B31D8833C1B796B8667FAE8348A7589218988BD4C2094B1456099BCE
-0E925A5673C13BEF4F1D91A72B00B75524E9F2B6EEE39EDCD8436A239FD6194E
-02AF04CE213AF8A4DE0BEBE6103A1CA891C90F1F79E34E8D7217B59F1F8A146D
-94017DD36B2610883692D55453BD9300545764CA404E3699548992C65226F772
-19066C8DC53B6CD2E378C0773B10F16FDEE74FFD370EEC6963762A9EE64FCAD0
-D793878A07386CDDC0B00A6E3500D50536E7CEF106105AEB4F7FD391C7825C96
-3D1492F6B4431AA74736462D14F63CBCDA4CA2808E3C55BDFBE668F6B1AE5F01
-4A4B8A8EA303C345CA242F0D9CC02F1BEDE134C6B4FFC0231CB3F16D0F5ED86B
-56A2D04CF64925215CC4DF3B51F59F69E99DA91BCE06D02872A60E8756EC89EC
-15FDA8D54067FEAC2E07483F66B00E8FBD5BAD31BB3DA45A549B205B2525BB6C
-74B4762CC4AD3BAF05C4A1A23B50BB22EB8D88603B7CA3052F83FBFF2D7E49D0
-438F3810F8076865973D1A4D2B06F3FC38498935E6CF0DF4DEEF6335403E4748
-611D63BFA4273A823E027AE5868907BA7124FBDF11C4E30446DBC2346B4595BF
-2CE8784006D1AD74432F5A3A1E5A7E6E69498995114830D4C7C9057B0AA4476C
-A9F5F44B45861ED13CF485B3CAE0E0DA24D805B5FD78D96064EEECAD82FD881D
-6046574FB32545B5B9D65C46C7605925054241013115C1B0D112DABDF00B45EB
-11CB82077372FED9B125B9091129BEB6F8F71F093CDCC5F3ECE4A9D33B55803B
-33758CB9F82DF01DE13A7E8C800BEDEC6840E37AF32B40A412F6DFE46E9B0469
-F96589AD547D14F75F9B694071F1F6F7A459EB8DB009B26B9DC8744E250A99BA
-EA1421504C17BC772862BCE3F07EE747D57487DC8A611FEB526095B872A10902
-6839B37E552D2C798F761EC0F1698AE49FD98B8CCE873259B911D61724EA6C5F
-5AFB0E44655BF454D1D35936638684A5FA041CC0E1884E362ACBB04BBE704282
-86E87C674245143F5E35B598F431EA3DCCA443318EFB85242AEFABD64B8F1A21
-CA7B1E372748A25ECCA6DED3A7E81737AEC77561723ED57A7006F96D17B8385D
-91BBEA3A651B5644FEF22A577543169056230A6FD1651EFC5140F2FDFDD1B417
-4B458D312D9B58176403D160628EAA9E99CB5CB7658DBB9A2217CFF17A3F5761
-39C720A5924739EABEB75FA12277C5389166FE5891B484C4F3317B2513FF0EEB
-18DE6D8CCF1306FD85C5C19D47C1C36BE1BC73957F8291A641E39877F3ECA3F8
-25A539CD09D32741C725A7F7520B288670AE6DB55BD2879005599744CB54B1BF
-8759C7EFFDAF992F557C13CC77A95FB0778628713ACA9A1A4F0F9B5304A2E828
-43F6DE633DC423B4AE3AFACE6D08A2CB7BA7CF2A0AE3D52100A3090637B446B5
-3D69CD48477185434B35884FF9A965BC434A6AED30C26537E14D7F5E27438F5C
-CE5A8F4B01B0375092137154A9937719C3D6874C9D1136DC203C1F5811BE4C8C
-9E10437D27586D4FD8B4A8146B0C96A4F13FF403188A9EFA26D0974C731CBD7C
-143B1AF2EDBD2A87304C5FA205D285D324BD21C1B8CACB4F5AABDCF81186B08C
-19A8FCE8F94CED88BFEACF2A6E237BACEDECE38B60D581CCB5B5B5D86DB88486
-0123DB51D12D11E49379765CC5994D16666C886D18A8D44DD3EF0235E14156EB
-EB767237EC9A93606E034375048396DAACA3D20F55666D0C1357222572E72404
-163C6F5F398A73ED1395AADF530282D61879A6DEA51473A286EA7F6243CADAE4
-BA9342FBF4A5248C1915590189A4616A3C774304B6E88FDF20930552BCC493F5
-0FA5DF80C3C72608D532F4F5933A225DE0F261A1D33D866417E49DD3C5CAA669
-853AFB20D792FC6BA87A46049621030AC1B7176156B1D2F49A8DB24861C14445
-4E528E2653D4E4F41681655CAF55E57A8C1D27B60ACE5AFCFC0EC8839CD99387
-880E8CBAFA86B397E8E4B6B286A8BB53EB55CDEB3F8A238B15A3C1E5BD457450
-E3DA8794F224C8EEE4A09CA8567A4E71FEADD076E0CE221A4834B817A5F5517B
-5FAEFA742EB1CA422822BB178B19225EC5B90387929145F7690A2ABF9043E595
-E67E23C9482385C17038DC83B9AD1EA4B0D5E0E0A9BAF8355EA256808B55366E
-FA65F8089A406983191238BDCA8F61C732D99E204CEFCB3F344BF39E240B8457
-5A6204C0257753542985E7AABE35B01B991AE9B4B10E87B3FC44BC3A14479902
-CFA8572E0D255269B7ED30FCFA1023B8A614586C5A2722EBAEB9DB53E87BC93B
-BDC9CABB3EA3BD4938893D2C8F2A198042744213F419C5571540E96741435FBF
-6AA57E260D84DCBE3A214954028AC1ED4DB2C6DE2DBF14A749647E1641A7863D
-B91A9801261731B65BDA550A199941158AD9827527B9D37464B8614438AF6008
-2B285CD83AF213BC6AE6198208BE43540B76165A5D5617C01CA772BBC98F9C30
-52E67F6E25F7192D36A130AC18B71E38D20A724E28C109FEBA4A3F1D677C8B67
-42F22120C99FA00FC0122F18ABCC0D24CC32B09CA42D428508AC63E421F9C0C0
-87D277AD58DADEFDC187ABC7D79F8504DC1113D70D7CEA1B4783AFDA128EA7CD
-C7860C3ABEA3BB53D7AD6EA3C116756E282C509058D599FC34B98F7022CEE941
-7108B44C0A6AFD98A6E79109F8685FDA6C2AFAE11BE2478FCD4E14BE04A19DE4
-822906ED944EDB5B532DBEA395A09C7156E45505D43215863F63B635C5A30F6F
-C7E316DA9650D9B5EB90F6A45E36F2D2B2CC89E18A246FA7D391A7728D51B18A
-D4C92D0E97BC88A78D5F3F5107938BAEAFADBE744EA9B9921177C86435A6475D
-5CB3F71FFAE0132E0F288BD509993DBF5C35A5C3B87EAEE7D3ED71B73091562E
-45B022CC7FF481142E18A8D98EFE703B4AC8904D275B08E51FA0DBA6C6FF4E11
-0D0334639A04311F6AC5ED7E2FD7E81D573B14DC0A7F5A6720D2F2F235554B8E
-7697BA92F17ACDD426E107A266D8DE4F774EE90C8FFE38193882015FB1FB1F77
-DF9779C16BEBDCC6696915D5E977BB40BE17CEFDBF4BB2340B35610F2BD333A7
-E0BBB08338C5BF12BB103756EA1BC94566FBC0F1549DE72DB4404D703DE8D566
-693DC9A8BD6D0679D54FE8FB5AC0934D2336600A1B528E0BED9F18B93F6CD0A1
-9363ED941A02704BE7C8EDB90C7CEEAF5FE0DE83DE1AD9398E42411BDBA8C9FF
-266FE82D375FF6B6B6B42E3C72F9D310A3CE90D112F7F0BABAA8FCD3DCBA9870
-91AA07E001EDB3C1B8452EAC75169E0A23C108FF9020C4CA9CF2A0E2A20E53E8
-42146154259263EE4BE01DFD078472363B0481B730FFF03E6B2322009818DF2F
-5B7BC17D57A70A9D02A1ECFB9CFAC92B4C43DA454E97EE9AB42FB800F397C403
-785B59D0961536165B7D5CE598913155A75310B331E633AF46A818FA0431F7B5
-E408BBAB437A7B9B47BBC875F8B7B14B7B46A421CAA505B3C6FCE2D6B98FEEFA
-BFC8DB0B5182FFE040461498573AFE9ACC85EC4AEDA3FA37086CFD35155115E4
-0F5EC7170E19913DC7EE88132663A1B1C04521A0216C73BBE09605D3D76CDEA0
-53C53126DF96298813CBF9FC2074167A41E9FAF05868D80CB78C1C114473667F
-52E8DA719E7427A6F688C5736E59FACD7B86856AF7AEAD82AEB9A3F3B76220E0
-1DB2ED0049230607E78DCA5CE38DA174A9CE4FEFA0EC187DE2020D472889E553
-C988AC4A918C3CEF06EF3BB4EF02C2725D1A9EBA406967F8A4969694E929C1F8
-7D85E82A434C5C5E1C5D9F03AAB7FDD6DA21D3E95B0F6709BA6CCA5F37D6A7EC
-58CE5BD8C82FC1A5A1F0B90A6E49F14B04D8BDF6243CEE499B4303B9FC35E853
-1FA4804F9514F966FC5263567396E28A9F605235C797ABAEADA1C71646A2FF24
-2753C6D3A5348441F196294860D44C47DAF1E50B004CF0677CEDBB7FB842B7A4
-90E4E31E85314E9031A665CC3EC0B3F0368567E154A4A6CC206CD8AE3CD45061
-AD67FA9594C4B3FD7BB01C6409D9C5E232323C60566E0C254DFEF45282E75676
-5BA6FBFAE1FEB9477BA7931C2C47F3EC2FA506E7DF6E1D4D7C60530F33F4FEF8
-DBDB65507F002E7DA817695508896578D84E2124748EFACDD527F4190E7C8931
-D7D30D8A7FAB5FFB4F55B8DEDFE2CB84230DDE12C54106FA697E84B320E0D508
-ABD664C7FE500549229636138BF213EB55CB325210895024F8F748E9B8A85AD2
-D5B1E888A503C4BCB2C5BEAFD980C202A0C580848AD9B7088A53AAF4AFE7EA35
-D1F3E05C7D1348ED6EDEF9D477987420E79590D1EB76F33043A6D18644FD3F7E
-E65597D5C699447573F37B082DF8D4527780A5B77A7A1C337759614B6B926183
-83B7585A16886CEB3A8EE1622BEAFF917B2397FD7FA803AFAF8F0DC99A0E202D
-795B4FE27345F3D275D29AE0A13C258C2EBEE48E5332C0064B1E08F82E2D7094
-705BE9F0BA6CE2ED4E7C34FD707F4DC9B586718D2FFA05108ED8F7623B9A11FA
-01D3A755250131A5BC85DE837F8F6E4C56721747A00830395E2274B7116C3845
-EEA1DDF51FF498DF2F143DDDF413870FF42CC4F667802695233C8BCBFFB5BB9F
-C416A5AD416CA61832DB67A517345F041A85AD1455D7B8580A04CED89CBC40B9
-6BFD0598668F99616579A960061DDBC5E4EE436730C932D645839848A1A0F5B0
-B8DB725B2D83F436E23B81B04B3154F98DC99032AB08C897DA86C933ED50BCE1
-4A728A52FE09F910F7E47BC3F2DAF8C22DC78DF9EC66C2664782FA94B3B9B56E
-49481B999BC60526881A7AEE7DA30EAD63A32F65D3FEED5D8D6CF94BCB618A83
-82EBD5CB11DD9DF1527112E4AB18BA84D3006F0A0E2C2696C6730BE9C8056FA5
-22D5215932558B28D2CA5CCF2EF5075E928DB301202FFAFB2578BB25DFA6B1C3
-20077C418C1840245F73F8E9EA4C473E182A46A33C3CAFDBC0BDB2B67442BD6C
-77F2EDE389AA66AEA8E1047FD90830FFC5A53C05A9A5F02361953A9A6365F866
-68D2AFB36867724E5F1E4E15DB55CB82332AD2B50D1F4FF598743A5BD27770D2
-E80178E01635596CC17D1625C55E7BE5C9B23FD330B1CD1AFC3B250A359F47F7
-25E6A837C96953EEDC5A4F3249F50435432A4268710DD9375AF252C2B1A90E67
-92545928DDD1FBC28971A075EF7F17AB44C51D4F5628AFC8F53B1EA0E92BB299
-E50CC983132C0AB98BE00FD6E9E432876859B25B9835185DDF9F88BD9D1045B3
-3498F720E9A146FEE51225A5C72758350B48938E63D92D16EA5E700C48EA5C75
-B493C810D5490EA12FEBB381ABBB5AFC1DBBBE50AEDCF797DDA608D4A4412F20
-4C697DECFA4990F5AF13CB7223442714F907D5C3E41A01CAD4744B346327D7CB
-2BC0B1CEBD3E711B8E63A7A28A21905488B6AE388BDEDBA2C4D81DB3E8AB4BEC
-105FB9C0A25BC6FF47973AAC6AA236B16D6EFE49EF27BFABBB061535970534E0
-04C6851F5129A7453CB74A1E4285B560ADA3D87305E0EA0BC89F0A6EEB2AC5F9
-14520E6F791AB083DE23866A4A84342D751D8494873F1064DD3CE7B7FEAABCAA
-EA808E944DC0311ACFB1DF0DE76EA38DE7E33AC71EB7CC7135D94FCE33FCCCEF
-AB068A62E2B9D20DFD65B57E7F436DBACB5E308A8E4502C37BA0E4DF7AB021B5
-33C6C93C8AB613AF3D96D7719E56809453BD1E0900E4AA9F01CABB634D972346
-081AF11A1E665F59E4BD86491205F43A6B21EFF8056478293CE34AE045DD7A57
-6C5C33AC194764C0DF930EDBCB162E093452D15A72934141F683498684C951D0
-733DB2FAAA862A3D7A4CB337366F8793A9B865D70EC280CD084E71484805D5C9
-7823ABCAF00585281C5F0934329F3265E38045E64752B28CFBB668C8077C39E7
-53704F2EBF5A95A8F6879E2135374CCF7A50EBB6DE63372975EC7A83770BDB60
-EE4F9DA3CA3DF1E31E5B489AA62E29B92E90C3D95E2C5D9F285CF3800265D8B6
-ED1822CD6F328059DF29C154ADEE3FB10D56D8600055A823E10D9EBFA3778A5C
-BBCA59FE3F40EA37F67515E5F947025F64785F172213045E882BDD672F434B3B
-2B4BB66EBF9E85934F3F3794B9B320D1ED0AB3C3B68477A595DAC9536B2E4C47
-E6B7057A96359B57E02F7282F35E9BB1A8F7DB62C9809BB21898B6402903487C
-2029C7300384B376346424D99E2CBA82126666335FA8DD0B5225823A733457EC
-DBEBC89FA3FD249BCCF746F8434B8E60EDE335D0F515A063260D6C6F0B6F5691
-96CF588D856421AD4561C864E0ACF9FCCD4CFDB4EBC60656D66DA3C1DA212A55
-6B4617DEDA813739C6D3D07669EC10F669711A17B460C00AD47359276CB293D4
-79B41F1CA8CD1129A6313A2253A29DA8C2CF46997F71AF365954F5F612141198
-8DB049ED9F3263D3AACA68FACCED6F24BE3E5A9E602F775A79EF90AD4FB00789
-D60896451A39A34648C7CFF8AF04BA351EFD772CD253BD902AE55EADB42E536A
-C1E711854932A03A36D7C3863CAEC28E4FDC836265504FF8406675A625644168
-3FC2038FD2F050F8C23233E0481832BEA328A7FC5C45446EA919DA3ED28F8CD2
-D8D93AF013B006C46E1508AAF9D159C348E04AA3E78119E361A34D67958DD040
-DE1781D010C6F15D890C0EA00496E8ACA9E3440860FFF5AC4FD0507983749142
-F92E2DC5B8082A5DFBC0CE442946ACD947E8127AAB82E5A60176735ABADE226E
-8A11D6D40F267030B3415603F18A59BF6F546F5C72DCB84B9810DBA500ACB230
-2105356AF679B3AF478E0B0FCF991FE2F2D046280CEB35647F7C63A7D6ADD948
-D22E8714B263952E07716678B4A94B5A5764C69A6F268CD58285A82AA61BDD7F
-3CCD2DF266C35605FF93A95A46C44E93514094592EF43425FE5E1F49206F0551
-DD35636F54BCE90746586FFEF34774E43D2DB09BD6A06733DB1D8648487BCCD3
-F1DF35D24638B081A4F04A41DB88609F63CC2B720F96171360D74DE840EACFDD
-36E8D3172BDFD986A3F7EE97DF58B1BE6867C306C5DFBC9F625FF2F9F743A884
-16889BC87FC49247FFA31F3234815B6BBC0599A9463E3AEA983346F55DDF8F8C
-A19517241D59B502D099BA9A1A254620F087DD37A20AE13AD23123873798DF22
-F94E28ECD0B0BAA8DFD8896ADED992182F78D35FBB5CA8F95A69984FDB9480E1
-3D524CEA820DADCAF0184A565A18AD4B756A287880ED3125581E4F094C6D4AE5
-3B7C7820C12458DA98A99A97DD7F9587E9352F8AF642133C2F9E2A646B97920D
-C9033A1E95F5F8A1EDADC9B6E7ABFD29F9CB8DB9365FC60B50BD8C0506A62EBC
-EB8A8050C1ED1A9E0A7F975DEB2BB91EE0340BDF44538E03C102627691BEF28C
-4243BB73111382D1F4F2C9D328EDF7674C7CA2BFF1570E52C3034B13E805E75A
-DC945433E1222B4A711B6508C26A4C3D0EAE6B81A664CC9024907319AA5E3423
-F9BC4A45A2E2A1330D2D6E6D087ABB22BD7F1006C1E8763BE1338E1C993432E1
-654098913C062B102A53F26F4A730E0756BB4A47FE961EED2A60C6638C1EE93F
-75FB104D556413B2314375DB036F4225CF86CDCA28662730E5022B980EBCD6E4
-ED29E615CDE69EE00F5DF937096A53CC303CD9A283950CBCE8BA1DC7592035AD
-FB215A6E4D2D343FADBA32EF8B9CF34402B89CDC729DC57F526FE3CD4AD46D1F
-295BE9B0D53FF0CB06EFF1919E9BA9019446CB33ABE3DF3ACB7EE9F5E02F9795
-BEF2E808CCC7FF21C9EA41C93E9672C035E37B75AEDEFC6384ADFA52A0762E41
-4557321D665719B7F4E43513C997DD56D526C10641CA654C19C2D35AC8CFC0FD
-6946C733A51BE65AE583F186BFAA4C8C112F94A24D33B435C8820F99E1D10F4F
-BFDB89537ED95354FA009A4ED9F4E3CFBC93D8FCB674F0E1C2C4716A203389E5
-A38E42C10A4C41EF6E63BC0B7D584A97FA508D4677F037CB1005C90816B90E96
-3B8AD64FC8D63E9DB21B4A8DA53C75F4BAC0137BFE9FD710D1B8E5EE3EF21E46
-4C6AF9F5E4676810CC19F9470FEAAB3D30F409AF9BE1BA0D03229F6F5BE5226B
-9471585C007D680F356F1F564D723049644039D1D3CB6124ACBE7C6BEFC36597
-6181E15716F691FCE490CB0F05F4E550AD35CC4D345B2BF4E85982D523BD919C
-73A974B806A1C8F78507798B5296D48F8A4B5BBB4D7B736C6ADBFD00D2590D3D
-924406CD1BB3C89636C55B1C90B69F51861A654D6683A0966FC413C1CED7CAAD
-243262B42908A3A16031EABCBCE4FFD02DFEBA01A0831BD1C8171D93635A1F4A
-BAB522D93E4E00BB91F7C18B38EE47C5739C6D215E330BA68DDF5A16BB025E6D
-EA4094D60332A289053C0380D456924C548588B9A6F0330D351B95E511E00C1E
-8D82BA7509A653A4EAFB2002048632D63B9883AF38567E3AC185A82B7DAF3237
-42DA7EE5A95115E5CE652D507D66073850363DF068282134BBB3928551DB1A18
-8FE10A825C388A73C1F3DB270504626154C4D6A61A750578A107F0BA4780246C
-6BE6C4B69611B7F01EDB605B19ECBB7A229300893504F5C32E0A3BD998194390
-5FA3CB3FFAEBAAA2175B85DB4B8EB762BDA274FB322FB39CCC73689232CC0A83
-8E1EFA281735FA00FAA4E955348A595240821D120D0C9ACB6CA8CD9ECA4980C5
-4B547873A58BC840A28592C3E66000CB4D7A28CAB1978083EE2847F2B681EEB5
-2D2D892D32904294C8E139B0FA4581782A244742226CA8911F83C1D7C98A2A92
-6025CBF85E82824CECDD6A9E18445BB815FE21E80DB10E2120D14DE94B453274
-E5F65F6BBDB3146690B0B7FE4BDC1C4CC55754304AB6B61420164A88A76E8541
-4722CFFE8AA2664311FB7565B3F4FD6493CA2A30DDEDF03F5749515DF9214E7E
-0B219296F094F92637A427C30F9FB712C3E8F11533CF5C1F077E808AF37E3E39
-94D4B0417212312BEBF1F4F03F95A1799E3AA24352B93B2BA891DD6183DD124B
-B9833C82F4BA2B41403233DA8ECCD88842625A8DBF00B5E3E83989273A3F7F01
-DC31FADA68CD56C8B95479B21EBC2A295D76B68437B80DFCE037B3BF87CD2170
-8BAFC158730D3B2F695DD6C701C65011720B3376581D6BC79166EAECFEA6F9E0
-40E62651FC8C72F47B47CB2E36A4E7667B95E82C88E20921A52C76EBBCE06CFB
-29AB75D051007EF5BA5EAA35FACBF549A85B3B6F37E3D206F7C8D39C2085E3FA
-74D3211EF5E61592ADDA9092C0483B9ADEAD2C64B6778AAA14FB6CC8A4FC6EE1
-82999FE543B0F2DEDD7E442E0BCAD4212F38852D6F2183EF8C3DAC77666AF856
-C410454D9F1CDD07DBBEB1547E6718FB9B79D00A9E3F744071CC75C3F48F8BBC
-3F09406F816A86BA4CB0D169E473AA3A62D68785283B8C5862E631A9BA78200E
-8718AF68C6215B68675C94B43EA901592FB2B8BBD53BFD835356FF45A200AD55
-3075927ECD06924B6DC3F7FD0C4FA9AE61AE9B1C332E2B996612E8D9F49257B7
-10D8C404213210CC338206109F6A0B5C7A1B9AD18E0979A790498C5BB0BBFE1A
-3F3249489FAC00A369470B697344E989099D9377DAF483C93EB7E7420DA436BD
-0ABA11777ADBB2716927806D95526AA226E1293E84EF76807953C52B515DB505
-7942B890DFB216807468A84788EC815677FBD55C02CACCDB2654585E42DA9A47
-16C0D5DC9D321C43C5E17EAD6E80DC8F3D11D50976FB342E1D16D2BF5C8CD121
-1DFC079858141F3631526ACF733A23E71C187A6E7933715841AADC7CAF7060A9
-CBAC2B04E33B047684487D4BA94B16A4431374A8867504A4EA338E192532476C
-D8EAD70E0CC6BD674A8AC75DC18C4E4C2E785FA52F89EFA5F0EFC6F624F30595
-1436CAF9F1682D2FCECD7AD11429EED4F64D82B51F8E8451802D4885418FC253
-41EC5ED0821E7BCAA89BD70A62D281E90938332744896875AA79038971E778D1
-2E350AD149AF542C44DC36C236272FB12BB8690F689C74736C6888E2884BC0C0
-4E105537BCF3C8F0CE8292BC5C044E2C99665F3247AC9330A516A76420D070D9
-0082116A6A43051DA9AC00B71879F1C9C1D43EE163635E87852088A6D3B77A4B
-574265A679334DE35F02698EC7884C8140207187933A36E2C577753E168F61C4
-21E2A3AB436CCA9C0BD7E996BACCB156867A89ED2B8F8DCB6DB9CE8FB870DE91
-4D1CDFA268E5BC6A4AFD1B0890998345F2754045257BF43591473F351B62AA97
-D7307BB7AD7C8DB43A73D5EECC987F34CAB192480F570574227E2224A5CD0A07
-3E2BD0287A3C313EDF5781A4D9E1BF2B2B8DF35CAD3DB80E0C5B3972260BF124
-BD3FC3EA966B57D552DE87822AFC04A46291CA66623FE48F0FADB5DD7CB571F6
-F39F0CDD7F541C9503AF6008B389F3B1FA3743AB1774F0C9FD4EF228D1C0F9DE
-E10F5839D69560391FC0AA8EFF9D4B83A970FE1351CF6478E4D91ADA69E3240A
-B1B09C1F24ABE2B23CF8D74DE43E3301E60F21A12FFF51D03AC00C2B44F552F4
-0503BD7F3EDAE51A89BDE38ED6A4B16481E457517A7E363CCD3FACB112996A75
-771474432AB0F08DB7F5EA12C3036697CE979D321B7AE1E4A0C1323E05C0C4A0
-13C8F18B2F59A4D396182763B94A855CD4CE21E4923B6B9AB3F7A9127F5F5BCD
-3C4550F697B4BE1ED870525BC0EA67F994558375C9E6D28D618E9CD9675CBFE0
-BF24A75A1B90B73079E2C7222B866C89D4D0BD9A041EF0FD603AAA9551A64C2F
-EB53C41DF2CAC894B78F8C84510C79F11CDF8518D585A2A5018A55CB8EF9E30F
-77DE2200F679F9C3642ED792137130083C0F516C98B6EF34758207B799FADD76
-E0939B3C1AB3AA12543AACC2B9BD2642B0FBF48E0427B64ACA02F1BFDC501413
-83E32E59F705BE89284AD702CB6F9BBB88F223ABE70B4256B8511EEE6E21E048
-148E8B4A7945A5A67D9819B632D86D6FA1CA5E0D040994D8165A5DC175245D68
-42FF80A82575AAB2B91C0472F97FDC8B537201F2E551D18CA39669DFCF0A1586
-370AA32695557CDE598771E158B023404861CC76464E098DC4EE83D9EE9B5250
-FAE90B4E0B2D46BC459D99B706E8740DD701F4C5F5D1DFCF365B261405541665
-B1E532AA3F9F03ECFF018E9FC36BFBBE50589308137B120975F70A3965582260
-1D975C394A11304AB7EB5A1448FC02CA062D2DF50D3611C2C00179501089BAF3
-E57DB91CBD6812C695B0CFD658D3AA7C2C32713B18D420AF945D00850EA7A0BE
-B98096A00D9AD0ACD656D4319377700D0BCB6FAE93A54BF27B3976B8353A6261
-E25402861065694F507D81D099BC6E4EA8D851277A8273E6318739D74BBD7344
-5EEECC73CFAA72DC0B7EC2A8794A5DB64BA9D4668E3E9F330DFD7F27CB83ED92
-C0A8480A15DCC3A16B7EABC23C594309845A4595164711333B2FBB9F877D8A9B
-426130F95F3D645A3336EF17DA63109B5BCCCD0EA1FD390E6F0DA649F81AFD8A
-1973EB6C74F7663D0BAEBBDD9B0738DBFAA9B7657E7B291E803D14F1EF7EB1C6
-B9306C771E3A5AA3AADFE2060D2323A9758412BB6E44B95F82DCAFADDFFD1A6A
-7F194B3E4F67279EA49410DDCC1F7DED6C0B34515D5E203BCE36F8755EB1C2B4
-8184AE1B1B570817B73D46D498358C4ABBC349C283DAC96B3FB23D2981E47337
-DCAA2F7C1010AF1C4FE80B7C22C534BE4FDCBBFB4731BF99A369E1E3D6231132
-F5AE9D2A1D701CA8B9F7AD88A5E17BB90C305D6604986C41058C6CDB78CDD043
-CBF6FE9D482363293156C6069C0ADBCDCF3710FC904361FA0CCAA012D3879556
-066E179E09FF5B001B52E838735AAAAFA899E71F2928562DA997133756576127
-CD0FEAB3447B5EA57BE6C32701D248813EA8B93E869F2137F65D5C1A0AE5D5E4
-21393E16DA6FA116864D07D17B1C8F08560DA2532990E2FED66D0E0FFEFAEE49
-55418C41DF71AAE21318D1CFFF5B38C90F7763B278DC825CD31CE53CCE9CC805
-C5A11B3CCE9EFCB43928C1E8482302CD6B66A2CF7CBEA7E98294F7F25C490478
-3080E7121F2ECAEC5F3563BA632F2E2019398B584284DF9EB96666FDF10AB2CD
-2D348D416D29200EA47B9F3CB5DA356DB357E0682943F0E5FA543987EEA76020
-F633FC4553F3D4E2FA6B8666374200BA14F12E9384A8099712A2E17916C61934
-317D443E56D8C3B5B11B5ACF389C6DF35125D399D19EDAAA53049E119EB110D4
-201901CF7D967B9BFDE6A5ADACE2222CCD624B6889D3574CE6E94F956198ED5A
-0245956F031084B7539141D01C5B66F6DEBC3C4F2E90E7756FCA65708F755E61
-71533842008AF59B1A9AA5372FDDB7D0CA18BE1EC8E399B4787CDFAA931DCBBC
-2AE9687D973DA7EB4F2F764B8EC359017E1877F4EF5B81A4A7684F87C4F91BA4
-54644E4C2D45F320A4A58592AFEA5731D47A118C814136EA91A00BADC6946669
-5EC507D7854C1C3AFAD477A1D844A520159FCBA8AD708B522B2FF6FBF55D8A0F
-6FD97F7BB4C4F61DEA1237DA3B8E42409936DEDD8EACF155766889931C4A1740
-4C3C646904268114676AF5B0E5E614930B0836BCD5292128779645E2D8743D5B
-75D8442A911425C3932B61F14C97EAE0D895B97C957B9C0489D47254A4ED52DA
-99F6C27F314E03812E6B45B690890743EDA6CB6410952E4AACF4EDB38CC22C89
-2E569D597B91ED013F696F06BBA6E6549C4B74B0D6DA6C7251E744CAF092EA4B
-D3ED88A4E5F8873528792A2549133E25C27A77F074142E38D2CAEFA2D83E7409
-83488D979E5EDBA0AF0EC16BD4D5E27E624765A93DCAFC7911604CD2530F754B
-C64F3F70591B8E91B2C28DFB8A4DC3534C6C74206D562DE3567DD3C2AF1DC5CA
-52C91FDCC57B08E23D47A3F9E55E1CCE984991AA4701210857FD85A8C2171FAE
-6B08136B3A5A1D1B738D0627F2FBF722F64ACD86A083CEF02179FECC90E2E6F5
-3567678D46B877850E30000E2061F68102B8B8E92AF0B9183F250AAE6C1B7992
-6AB521E20196EE31A08892167103257B1A9671CA14DE2079CF8770EDB83BAF9F
-53DA650828761D27C50DE9FAD629BCAD28805CE37222CEAB505D9508558FB660
-04D5550F42CA25880E37B395583EB95891942B443DF0B3B8187D5715EA366766
-E59E29DD4BB93A7D0876E35CC891EAA996CEE283EDAB491FCE06AE7B04D5A0DF
-31CEDEAC4FA7E7FA52A9DA00067A7D3BE15C0AD2166D5588B879E6019504F633
-95E783463A8C8418659F3ACA7DA1EC997D7A04D09F8D83784702EA9ECB3AE69D
-C56A063B59A8FCA9762D3DA187DBDF3DF719778F9D2578163CA01DD9B5B78DA0
-B5D9CF241A4B8ECFA244EE22D3B59BF9ABCE7320DEFADA12D442EAC7AECA3B40
-8EE795F3909C603B80DA8F2C1DD9441F84F9A41273ACF33D03F111FD78259500
-9BBBA8C3F021C09AD376B170C1C5FDCE2F8882593219D3955D73C0F9827A0A00
-262B4D50A92969469C1A3399F8580B67BA618D99947CC2D6001749FF6E90B2CC
-07617E54B52DC6C952B5CBB975CEFEA8E4FAEA7BC4B019BCEEF05729FA72E585
-001AF774F0F62C33C0D9C085AB8952CD7C05F0C4B63DC1C1C2EB91DCEB7A503F
-F0627C145467F95C8E9DD49FF2E8513A3691B4EA94A96F90774B839E6A7150E6
-842331ED976434BDFFA7526B4D3B4204BFC3C550B68F8EC23C735D3C23F97796
-4F07C86CD3E76AB44A4883B21A75A70E7C10404E6EF46719B9D00772E515BB65
-7B28F43986A8BA067C6686E4BD54EFF94038750976D74D74833CF394D6ACCB7B
-40173D0B70757EBEF5FB4D30C487AD7839EEF48E78C4550FAE0F1DE33D6A472D
-CD3031B2A3DFB0D743BA0FF56F6BE3E0EFF3A7471A74A1F55F4F4C1998BAC995
-3B5B456934344CE6D634E1F2D7D12523D1EA8720A55D5034D99543A80AFFB0C5
-D352E32A35DDD0320956D21442B3A6E82E83D81CAA47043944FD10CE1B505B97
-D6466083F1F5C6DC2B2929783F12658766898848C1442487D0091BF263CCD603
-52F2B00878D567075D442BD8731ABCF5D2C83F36A0F9A1E6513774501213BDB3
-CD17CAA600F19DF66E0CE30233080DC6DC9D554D95FDD1AA2BD681D1C992AC48
-329206615E6CE9EB6DE557FAD1B93BCE7E629962E42E542996231E4F5DBB96F3
-C98983D0F5AA6A21279618F524DB66C8863937BF8ACF9EE54C403A7E4F939388
-76F64E7201FE28C37D3745B817F282D9F85FC68693EC7532EC329DB55D4E69DE
-30F7515684E7F0D0EC089DE4784617BAFA338B369BE06ADD099DD7EAA13AE100
-6A36A3E098E41ED121FE71C1958477B1B592B32F9A772BB15A8CBE00C2CEF494
-4984A9C5C590BC158EE52960D641FBE2FC2F8D5D47E753F67C9581811A51E4F9
-9A4EA2F413DF149256CCC0F0F3A31207E8E3129A0E3B26A0775DF6FBD0DEE987
-3D30C1F5186B4E26F574B0CFEB2DCBF60DF97E82AFF543A366F9DD6696851741
-AD6AB8351D633BE824CBEBBA9C5A98AE6F1E23B9587F171AAFB43611DC5BDF76
-2BD293B37EF19137CE825A6B8F6413A22ED5E46BB4C922AD40E2650A6B4D2277
-47281F7265F3ADB31C432B7A6B88489D10331A923B403310BC0BA06B85F48785
-72D3259E3737071BE8A118D9549F3479A928FEC0116DA2B41D12BC958D0918D4
-4A8C9CF30FEA2149B200FDFD03B4D0CB0F148E89C344B90C59936A4E7E290654
-81B2444128E79E3D5C8B8A4A4BEB8921C504050F4177959B25F33FD25744080B
-4F05595644171EA0FCBBE047F31BE2976FFC586B38B9982CBF76E2A67C8C50CD
-3C594701C91398605EF946D3FBD80B96ECB679CF5894525BFDB39690431FE060
-60689DF26CA49C37041EA77CA90E89EF6E78C4BAD0F4ABF33626ACD029FE4809
-C409AE68C321A594E19A081D4835A538B63FE0B7AF8EE3B68F34E2F7976D4EAB
-B865510896B0133C287A3B8FAB4FE04E9A9BAC9865A705EBEAE689D0736D39BC
-5181AF6B84701CDCB7176BB0F9107FF547299AA8B8C8E8058D6B7805F084CA22
-CE4FB9F8A520835695A71D733CD28991F6158DCD0C43A09314BF520BC86BBF2D
-179F0AAD7E934A586F31A196F2A0718B30983D13F8DEF42C59B7F2FB0F8EB3A1
-F8B519E9B9CD59E18B3D5240F9EFC306BBEC014FC566445BD8B76E5AF0252FEA
-372DDD3DAB04E6D574FB30653EF31F7D2CF6B6F3DFE397D84DFAB299B7983BCB
-8210FD423D64A0BDB250DADE971A61D08B78EDC48C167C579B8926C60081EA8D
-9BE64490D5A6CE67CDABBF06041AB535A21380D43ADACD1B5C62664BA44FAF70
-1CD47EAD956DECAC0115273386EA8F78B268DA881EC845EEE5F3FA5B39B0A258
-E475B58AA506B250DBAA66059F7F420E3686FFD482CC9AEA884CB9DB881B4210
-A41BA3023BE3F62F42744379A82B140130FD6037773E62E4ED9AA6DB831B23D6
-672115DF51AD99C61696594E9750E3F9D73B215345A1EC45FE47F8984C4ED919
-B09A00582B00E72E38D602F5285C7F266D95AD1FC045E63BF653C8E781AE40BE
-84271632E81777B0FFE8AC6C53CEA0C785E4440D84216D2EE98D8A589278E06D
-FC7B5AD41D3DAD85FB465F63D773899CE58DB1991E71F15FEDE9183743F20933
-3CFC0EAF71B9711022D5AF0030016F28D7D5651975C5ED9EFCC7CEF436464F29
-39332330A92D8F8225475BA5CB2A6FBABBA28930BF747396C2F2DC0542BCBC3B
-98ACAE77991DCA7C81A3EE50E03555E9578D516C511FCF7682C5203CA9E83F83
-ABB3D68231F4F3445F8AAA41642C47E1400C48322E4276400D9CAE1A62213F4D
-55B854C7C255D24FFE8B20F3C67E796C7E8146330E43167FBC56434E40167A5F
-9B8A9273FF702A4F2A48B85874D309DB3B4824692E756981D7E53AFF26A1558F
-5D7BE49021311B18D34636D3C2572F3B0859014DEE1519D5FC47642A08FD5B7A
-CCB41475ACFA477D496C491739D4F32B6239E220A742EF9479A6C09FDABD580E
-E172FE89856018DA055DBE38097073833FDC90D9416B81B3B397C38ECB092D1F
-98831F1463319D89E2F978CD9F7554E6074FE7B1712560C5BEF1C7E1EA5816D0
-B10C7309A4D7C13F2F5D88A0786D283975F98A4CB847B51EAA2E65A2E822AE1D
-1FF5C49B42711E1BF49ED933E1485717EDB08612C7B86B05DEF387C2B2951610
-626DB79C36F8CB5181768B4C297A5FE8D73EB470594CEE2D0B12659D9249D1C3
-70E9B0E02C5B74D16021F039173A98507B189ECF34E4C17F982738B9B48CF9D2
-2CA18E2405D929A1F0E75094956689D7B9407CE9A8B392E1E4212FDA5810FB81
-E66BD56AC62D271947D981A459D0DA12E0FC520A54C7369AFFC40F698BBAC99D
-2128405FAC517E8E273869809965D208642C73531F4C670BCDF69847ADC008FF
-087487565C3353749DF7368566850EBB3E06B9C79D27E7792E48ABA5DAD5967C
-D3F5FD33DE4A39DBCFB1AFB37DFEC440165A03CD0F9A0B0D72ED78A56A6A6C78
-CF1E06EF1F4416F01576045A26722A346795FD4D4D76AB3A19660018B26C86B0
-F45D403864D6EDBE6231764590EFA528FB31BA9ACE331D3EEBE9871F209336A3
-935E8842954CADAF5386325C4BF2A87969FAB335E9FF3704929E0D0D5BBA1D59
-795A5328AA2CC4FB411C0B5898C092B1911334948BA2109432AA5045264EA67F
-5126164BC3FD96EDC09A44809091872EFF39CA0EA66EAAAC6314C61B505141FE
-A631F8B5862B04B1A4DE1DCF607286B2A3987922E0CFAC1D88FEEA2D2C027C7A
-121F76F9433E5314BC554360874933FD7AED268986B789FFBD6D6535772134A4
-52B2930E0207B273C98BF26A0F6515A4B42F39A4935E10F1BFED78D292DAB6B5
-105A43E5AB00181A6E3F035B28C5C3BAC2B6E9E6B495C08910101E47AF030DE4
-70208324CCE7E0421173166BB245B544B9BD102374B67D02E99FBA474E9C96FA
-963CF1B714340AA83F9AD5AF75B468A6DAD13E1F7420ACB51B0096EAB900C4B5
-2AC1D2866B273BF011E2C7C07F6FCBF0AC334A8A389D0F351D3C74D403EF66D9
-39DCB12D7DACA0F5EDC39F2FD220CEEFFF2E1B9617F305CDE3E740C066A0166D
-EA8B7E08FD185D048CBAEC8EF574F59FB4F80DC8382AB91F56388F586D7C4B4C
-3823847086B9EC3CD99DB118DC89066090B20756EF990678BAEF4498694C0884
-FB309CF7A22CFB79BBE1D4064021A647A957B773052A0CD872AFABF04478516C
-97F76772B6F511FC2EB58980103DA0FEB32E61D0C83FED84B967CE31C5F19D85
-A566ED750CEB9C8BC798CDD9F0138BD650943137394BCCFCD97EF2DFC435B337
-4F45AF417F9388037B4C5FB681F5E11F3BAD9450632E1C2DCFB263EA3ECAE66F
-AB78AEA057C18ACFC12098E0DD71D16EE1794904252BC427298F69D9FEA435A2
-F00A5BD09DF5C57254EA62FB77B0248873AB68DB7A60413A96F53850EC693B1F
-C5D2BBDFB6B197500C2CC5F35597D452A501E812C102F8C235542FB2E78278D0
-E1C1D0C96CAF2628B54C98E3F32DB8D62CBA3441A63945A250EC21C4BB97CBA5
-4A80F71E30CBD8D974EB3FDD3ED45EB008ED54D76BD01766FCAA8F6753402C07
-EF04B9B2308F66D56CEB917E0848C72ED4B1E290BF4A6FE7728CF68A23F6EA17
-3FF37E5F9574645DBED15C540C0DBA3C61E9C02697329BA57C29F3D28B5D76E9
-9EBA8F527DFEC6C96CF090804EFFB25E1458FC5897CB9E269BF2FF6880222F28
-1988909D794620E260521B65CBC1C495DB903F916F50D15F36034506E0838CF1
-D741CA25C5C2B68679A056F03F65C842BD628A2AE8D73203876665372DE0B048
-C2FFC030F600E500B5699A7CF7E9DEA818A5653700143FBEB970F2D51DF32730
-FAA372EFAEA1A4E15E6C2096AAAA5AE7DA3D9C05FB11F83E853763DE89AB47FB
-89411C369F036A03D881664AF026D76B52742B74F6DA12469E8D560D3C2E2BDA
-3357A562201416BAD3F046BBBF27A5ED52C606C96CF2FBE7236F0D76E10097E3
-03ED4F6A70BACB2E52F00C260C61B66040946AC7A5B4866C61501A883897512E
-FAFAA687ED471B7CCFF704B4674CBC082B07179B30F0A78459B6D23A16C49C07
-BEDA6A23F17F25F1166EDEE0B17F43AF8D897DDBD715B9D9FB540949EB3FB4B9
-8B749FB156374E73FD7EBD72EC9C4FBE54E24F17AAEF29B1E846A42C84D3A1CF
-27E2E59BE76B3A8828A1EE70887CEA3DF74A7C7DE9A239CCC9E9770740E16E87
-84EDFDEA5B34168384C0F429178B7AACAE1D37A731AE1629F8971811F032A2F7
-A88C26E73311F6BCEC83FFC99B01DE9BC5FF9F34999DBB568199CF8EF8836704
-192CD77B452622002C3DDF0D5BB06FE822B0583E00A425D85A4B29633B1DF56D
-9F5F7CCC9AF8C4333AAB65841CC7A4FEFBD07ABF367D0E691E22384362F43AC1
-4EF4FE416F8FB32F29EDB2A20BAC9D285D78F8DC79F7677DCD002E4A30C98DEE
-4AD9EA0B00AD161BDA8B6C19922E9840B3C2E96CAC90369FF71A3E5311A4334B
-10F53F90109B6C218EE7B8D23A95A766DE4D4541ADFCB4A488D8F913F9D07D35
-2B303F2518E0BE70549BA0F0D8D33EBA0CF23C610FAFE29C1302D7FD008972B0
-D8E9DFD0DA84C8CEAB1B160056C2B69F7EDDDB93B069C8E4378C7777696A7ADE
-9DFD45125F9609D8403F72905B73B813F320B6AF2C9D62532328C65FA25FA75B
-9B57A65347488BCB948FCE4E3843E9A195F5D6CC1FC91CC9D474AFA91BDB9F0D
-457D08F869F21A78800D1744957848AB12982157748ACDB74814C05F40C5C630
-171553B9A547AB9650509B4C8A02740182C0E902120721DDEC1EAB1AF4F9EB81
-2EB8B93EBF9875D368D11696BC7AC7631C0C357E4E90F121B58009626C101972
-BC86C45D2444AECDF6C734A9D14CBF243777B970247A6587AA078EB820DD9131
-2D729B6B7BC569A444460BA522284509F8F5A70BF465F20EA91733A07648AC0E
-D7630DB0AF9FCF9FEBD09D8847C8CC6CF63424A784937F00594D311AEC11B55E
-8AC43A2FDC85DB70DE025FFE25F1D314CF06847BF2DF90EC2F78116EC8583A3E
-52D8B8F0C8EEB01DE18B3F288710FB14DD0E10A8A4E7704662CEB3CE6E856FE8
-21AA289801B84CEDC7FCBF815D2852247C8D06922F8FA940B93421F256CE37F0
-441F8095E1A3481AD60771C65113C61D844E489725EA5B34501709463897CB5F
-B01CAAA3BE5109B4A49E
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048016t.pfa b/lib/fonts/l048016t.pfa
deleted file mode 100644
index a14e724967..0000000000
--- a/lib/fonts/l048016t.pfa
+++ /dev/null
@@ -1,1269 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans-Bold 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Bold) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -39 def
-/UnderlineThickness 78 def
-end readonly def
-/FontName /LuxiSans-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-224 -211 989 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078988 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D830D512B6FF3BE2CC450E
-1D74C05D938346D8713E75C290B6906D919052118C8C44FE8218A20F8704A3AA
-2AFD1790F3C31C39A443F7CB470E4FF7E05E8069552396C1CFACCDDC1C77FED8
-D4E7A947701898A3E50351EFEB35877FA44F29F04D5E5DCD51D55B1166E650E9
-6DD6DDEB0B5A4C018BCCE2D2FB26C42058026C5EDBB9FB634954094EB160B402
-CEF86BE7ABA16B63A88F1FA3A87A267C8AFD876E1910185D01FF64026182F83B
-5D30CB5CEE202C27B727DF2E31EEB447AEB941B2FCAA382353FEDF664D72D31C
-0C3D1FFEFEC97E0F0DE0352DE4DCD8F4878D9F677F89747B330FC1582796AE19
-B79B28EA2B74ACA2C127E3B4A3ED23A57F4A48260D2A401F4668E48BADD96502
-E7F1239E705F21FBC7C4FEEFA3F9F938850077D029227236D0D4F3E1FA17958F
-36E21AF35E8C937E6D0F988233C8438BAB6019020698D80B9C37EF035238364C
-E57BC9ADFA77D4084795CFA6A236CF1E0DB7095F4361AC525DAD39DBBD9D3D32
-08AF35AA38CEC79C2BCEC3B3AD52C93D4F14D25535A391290532BCBA80A9EF67
-0387B566C065825FA04BF4998AEA0942AB50727D74038FB6B602BF5B78C4CAF3
-75F946BBBAE55C32E858AAAB72F9BA53CE6725835E5654791953D26F7DC5EFB5
-5064F3DA56BE3C0A7E6BDB57D59843B0AEC11922A53B1243479DB95B43422F05
-95A1515EF0165589E6D74398C0D2C9BEB6E516304A4AFC8F76161A074969107C
-48FBDF8EF6BF7EACB8CCBC18D39ADC605A56A048CBAA3828854D358D473A66AA
-DAEBB2FA045514C5AA1B99A174B2E8148ACFAA807038B0A8751EC028E89CEC7F
-6D30099DDBB811888C900488E09DCA1D60BB398DAC1BB2A39FAD166B6444C182
-8E8993777B38A3EF591FFDAB9BDD2966BAE15327808E560AFEB82941B65E7B3C
-49B3C59330E2BA07204301F845E32EB608E12204EB511C09D06AFCC2BACD0654
-8B70A1A15916CD5CF40B633F3626B85366E1DD3545D14D71B21184CED78AAD6D
-A7B16AE3BD38FADDDABB38EA2BDA49EDC3926B1526C57D9631A664E872610478
-84D1DD1A3E6CA785B5630C31ED8EF22BBFA07286E8E446F1DBC37FF4A4925A99
-DDAABEB0BAAA3DF5E60C3ABDE27C49F5483FF1C9C3358D3F1A37C2DA1A4A53A9
-F4DE466B3375BCBCAB491663DC09CF549A191B4E53B533D4DCC3D65F0AEC3E95
-15CE5CFED746E12CCA4663FF4B93B36914A7688F13BED3A7A4B62F272199B8D1
-01CC86E75715BEE99940BD3B54DD82F8F3C3BD993723E0F032A89A46E40D4187
-EDCC579654DB07E4ACEAB6C1031B35466250647F37A36B1FD73CDBCD9ED005AE
-855D6AC8C5560B7F498FA3DA42D510AB98D922C364410F36D3AC8F27F0CB185D
-004AD2B98D3AC972C91E47BBE1C2766F2A3480176645B2F405589F151719DFD3
-7E40DF255EB133FE40C48966D61B175C9C1C422D654DF914AA78E6139E2EB05B
-D3F4DB9CCE46D7FB174B210C45D7E60B2DB14145DCAF2B5013C53BC002762DD6
-DC0791C4FB9031CFD24C2236AA61AAAD8AD8BCD9045EADAC9CB6E6DBA94BF817
-C78C0C686A7EBBF7B37BCBD484393F5D53EFC93485C0FBF6331F3A5D0A0AEEBA
-23BFE63E49B48245557B7C88B478FCCC333CC083D9D5F0CC2335D5D908413AA4
-8F690E81E40BBB674F7E2E37F37DCF5EF9DC6D7CEA3F7CBA27FE86AB62F65F36
-B2F0996F7F1A33BA903243ECFDCAC2756E95C19E4718AE188CC7384BACBB2200
-ACA8A513F352B241EDB68CCD6A74273F5204CC22D722A00F9930E874515872FF
-2244342917B787EAB3341439041E3C83667441D2CC74FB58195E474A55442280
-75BA96B201E789EF394C54AA51D2E55EE43257442880FCE2676A7EF904B01921
-74C50502863BD66DAAE2381309F33A3DC0F055EDCF96B2B6C9ECE80F151708AA
-750A0F2BCEBB3ED6E586340D9DB7E78BFA775366070A9E7EDA869815A4AC7B17
-3F139533B2F721832B5E846AEADC4E952C709B3F6DC3185A913D0820EE1933BB
-0B4AE2A6AEFD68C99B7AAF6B11D8F012EB816781A8A0A99C2EC174B0B6869F2E
-3D373E1CBB2EB3FFCA74B5A3B1667ED301AD1380A02DE73F258D2B99B81D7AD6
-00AA0E604200A17BE9AB1403086BB55B80E6B693B64C48A7AE2217ACB82FBE70
-3EC1F87AC9FB2B637D7D943EF4C4F6A49AF445A76A1BDF21F67493075AB227B1
-F36A743201A64A3797EA6539AA99A864A57DF2B651C3A77915A6BAB4B17E191B
-576C80E4023A77559305C25CC0D75E6BDF287298EA30D2E916F97ABF092CCEE4
-FDAAED0926B95AC5090C01ECE24D507ECAAE990D7808F294BDC0DAF5E74341B8
-3B9406A60C3CD4054DE11CBA95BC1C4F57531636628524311AF3018649CEA3D2
-1174EA1EF50985964346A8AAFBB7A38EBC9F01192D741665FB01CAD36BC34457
-B0E2AE912666E96B6E4F61160966AA3E2B051CD61584D9DA998FF702FE01410A
-62DAAB390155A045DF241FC47FE824E49A5E96D3BB3D354DEFF8F21498FC4F8B
-8906C6A7E3CC692EA39013DEBE53EA53780AB6FF1CEEF8A2D2C2930DDCD31398
-6CE78CBC84EDFF1B9C0C1B6DD756AA5B53B83BBB765E88A8A0ACA6938021139F
-881FC91A4FF6F1AE7B2BC81AD0068835D69B465196625EC7F1A5D19141240C95
-F95245DACCB2E0D527B37B8477CA62E9933CDA5FD82BF6BFBFCDEE5D82F07797
-3F2ED2D86C8950A8D4F2769579F25961EB3499A002E40B3385C9628BA50C7556
-693AE13A9FE9921E3C712BAAF060CCB0AA4CE5F70A9C473CA0A5F53CA25E6761
-D269D13235377380380290BF10467C2A726C096D4FC98BF402E498D91F4C2ADA
-A0DC3B235BB50BFB85FFD5252A9727C174AC924DD4B086AD6BA76B37FE0C9C0B
-C44CF99D67C9DA1F97158C69D689BD6B0D313ABB5F8BC62AED5787B33749C569
-A0FF5A740C6B51371CAE44B9F9A516C06341FD0A530ECCA6BA769D016E3E51BA
-016AB1C7E5B4A4C0AECBD0B743C97025C20D021A92E079B6F051138E5945EC72
-AB5CC8435892A5DCD78EBBDE078033E866859BF0F2368FDDBBAB67AF17B943AF
-A1D72B7E72AF6D5AF10ABA4350B627464441DDE21D458E1789635D18E3A51A9F
-6A97B5F73F7FAB11B0684C33FBE0227A67720F748C99C9FBF849508C9670CD04
-61BEF83CB62342C4215BA40968213B2BC35E4775218EF4843C39EDD64D2DD648
-462A625DEE03561D0688198DFCB24300DAA7348E9A2A3B7C3FF2119F3801BC1C
-450B23D9DE355A31FE26641EAC1C24DC1D452FD17A0DF9DE3016EED76ECDA07A
-96BBE3DFDB475675473851E0B6FC5784C065C1A49C88B9EABED14DE2329C139D
-8E62A5B152AFDD0E5925969881DBD1E11AA9AAA8FFB179789B6086B89FE4BB84
-736F63C2D2544A636A804D2FD6773B6B760E1493D342E1CB9693AEDE902D3ACF
-9765253D70A82D40BF2A300C7FC3C90C5A164F5BE083FB587B9910DDB220EE92
-D962E3B41F1D1D4517CDE42A1B31E1EC802220E487556F5DAFB74F7435C6798F
-D300019AA3460321482DD5FE5A0E513AB83021809BE7D502FC1CF70A03315BB7
-DFC2D92D57D026180E03E2F93223A2572FACCAC6E115E84341D155B11B15CC8C
-91A58C0F13FBB809BCF649BFA631D8F39C3E4930315D11E95241EB5C6D7179F0
-89254794EEC311CE2003EAE64E7AF47565AD3670753FDBA67806B8AEB8342092
-6C4455FE7FCB11CC99DE5747F1AB6C5E53B805BE44AD49B58B71FCE5E406FFA5
-CBDD6049906397B512151A5ADCBF89DCCEECD0BCF2E42EAF31D07147F459F299
-DF8CAE98460EBEBB371D8C04A7EE3D30EB34E73EAD6CEC8E569C344A4DCBADD2
-9BF49F036E25A722A0D94DA58DA12813A4900BC32E5BF7847FBBCFBB7C78E034
-6D5B6D4C951A74639BF257B122C698114A842431D3B7630C585BF5B4B943A83C
-09101C02EF689C8D2CD6DFBF459F0DA464320B7D2993EA5F9CDDA1915966D490
-1871C1537EBB120D16F8BEF6ABA64C72FB1DACC1299174432D59368220EB2EC5
-79B2F9F355F77959D5919815A90AA9C4A0BC87D40A06D860BA9B4BCD89708A65
-EFA0063378FC3EFBFD13003BD1E656A697F3C05FC6CE231015DFDAF48378546F
-CB5442A206740766A972CA9B08151D29C70702EFDE0EB1187C1B15AAF948E994
-006F532E9227C04AD44EE22FCA8450D745DB2DD5CCA57AADFBDF081D21EEAE5F
-6FA39642F58E8E669262630123488394D37C47FB8110D90521CB3F100873E7F3
-BF89A26B6A51122215E1647ED6BC3604A5B8FE349CBCED5D0C98E7E50DD9975D
-8214D3D164A3079DC1E702E8B88704ECBB8E015293E7D5AD7EE5F30BE8C79FE8
-C1E98BAC278DC577CDD159DF88DF799B7B5A48FA9672AEBCA7B54935B204873B
-3AE4272A4F4A578C85F3B62B45D19F2475D76A7581FCDF7C6046442ADC2E2602
-B456F96C1526CF436E2470D0D8C83FAC1DAED4536304C5975AD70861C56DFFB4
-39D09D5302B0AC6F33FFAB5F43D465A85D4403EF8FDE2ABB552472FC810D8660
-4C88A1A7C7EF6CF3E6B2D843F72873D43716FC3C52CEB6718F0E714B66B83DDB
-B8824156A1EB779ABEB6DE745D2AE5615F565F5A1155EA0A8D2FEE3D9D0EF1A1
-07D5FE36091FFBC8B5CC09733D25C1E872925EACB084C30ED44470FA44C3B89C
-7255A46BA16DA37F4E1362A200BE49BA9386B8DBB0C54F3DC801351C083C986A
-B15AF96A717DFAE03A391DFDD7F812BB6566B6F3A4F663581B76C138E9372D34
-B3A1925EC8B59A3563124CA92456B79DC0B52613EEEDF3A719B8FBD44D873F9A
-9A4053F77E37143B2E5822C7971C9D6CE4129C64504D5D857F907ECFE27729FC
-3D3D7CCCE919E50E11BB62E3596A247F5377C8BD41BEF51197374ECCAFD3182C
-D07F7A931D0D0B17C956D8BAFF218BFEC60997D00207642C52461F48E9B66B41
-2DEDC7D90051CE288CAC0A8382CB3FDCD11C1EC3B74515A7E6CB157F7B2E2CEC
-E5A664011AD2D240BACA4496ADBB2351673E0DC78B3F9618AB412D04AA75CC24
-462D5A925799EB85598559B6E4194273BFB2F461FA5FE3165B5D49620E4AE070
-7F45CC85AF3BBC554E9281C99A601789010A990962BD8727D38164A16794E19B
-C62AAFB909CBAA7CA55A17080ADA886EDF6E38D09AA4E6418E8111B33CFA14BD
-0D71127D8F95D03FF4C8E247FB19BC9D0F33E50B7C1C8F0CAC0AF3A8A62E9521
-E2292ECA00E69D6C6F94FF7564C62382B1A8497560131D9C8377024A8D629BCF
-B04005423D59F2494362AC97BE736AFF562A591454207B1AD52B060987E5018D
-7A2A17F790C0854F19BA9FB95F04FAA769B954FDB5A1A5783456B42845357E11
-81DE026B170DD8EAB0B9A782A6FF7926DC23910800D83B169D498A8F3F2B9BB6
-5C30054793B82EEE43F9055CB214C8377E94A020B9098842B94BCADC8C921055
-B1B60536E6BD12554FC5A56B1AE7F96F7547837F6F46AD232D7E0BE2A62EBA1A
-87C74C44047149CB00ABDEC136FE5CC1A90DE011C80C87C9AA7431C656EAF1C2
-A9CA320D197746BBFE55603A34CD3AD42776139CD1E155EBF3B3BB64AC91EC73
-FC0E23A13DB317753789E3BF98561A21676DD91B6BF3715E88D9ED98A8E5EA32
-E54A7D84390087ADAEEC3BE995D19B43C9635EB8BD6D13A46019762699E5648D
-DCD8331CDDA187AE4D917308B7DFD30E6162CF927F3C2AE9666C8DCD8FAFC272
-ED1E75FB3EEF0527935B9C1DFB055F057C998E560B6598F1972A8829E57AE99C
-9D3389EDF9A7A8A3A43EE4713357396C62A27401EBBF540AB2A29D50C1DFC3E4
-4012F882A6089D57D97BC2C5DE19A81B1DB98EC4E8D58C547A5D131B84341CD8
-9CEBAEDF1165E8FAF604F0290892B813242B6584BFCCD68BF3F01995BD89BAAB
-7C7B8AC166F5F78AA84659A45D1EF4FF658136CAB8627405EB36907CCE200B0E
-3A36E0593B40FC3CCE029881B0329ABB1A948F5191750478F46A03C3CACC480F
-070ACAE4B6C06A911E88D649D297907DD631916E60603CA49F35A2B3C8D478C6
-9F1C187C315A859AC464ED353F09C964BC171580257A31EFFF445950E2EB6106
-7EC224409386B3CC2BA0819B6CF9C895586B23E740C7EF1A1814A26117C868C9
-FE8A5FE3A8DB9F53165E0C62CCEF9F3735EC18C31E0C7C743B0DBEE893DB723F
-D1514A59713B273D4C9395235A126BB9155B14C9F47E20B8FA8880C717D756CF
-CEB12CC6C82FA5D3F4CC91A39BA398B920B5CBBA3B55E02359FCD284DCC3DBB1
-63DA4BA07C38E3E9E64BF24E74B62A6DE5F1521D4A1DC6657EA507E56207726E
-08C5AF790CC07D908750D852A0916861B8E67D78CF8ADDF16CF9BC6322274AD3
-8101E46FA56CFFC505B3D6C20920F13D8B40CDE364D8FA91E7357E5FB218A3CE
-40F84B5E537D90290154C68256015C5B8BBDDB702DCAC1FFB105AE9CCE0A65FB
-EF43BE91E7737533349E0F6D227B30E52D41D2E73EA55F52D1A065B1669F97C2
-0B4B1C2184C4161820220A52E85D3A0EDCCB2A5BFA3B406A2F675D0E272E41C4
-E6293BE2CF58E8536B0AD6087E5A89DEDC6C93F981B61AD9E91ABD1E4B2DD4F7
-5F909701A0EBEC140EB7840D69F2428045CD604A590F47821CA8D51DE41E07E6
-C69D97C54D21A64CCF2E914D4AD2C444C129D767B285EDFD21F8A1256CD18D3C
-3E5DCD834B3EB61B39FAD0579921459A1D6D52632A7CE0DE74D2FEC0A91E7FB2
-AB4C61CD334B66B27263BF8FA80456825DEC46D7144CE5888A73F545905F5B51
-0AB1C1D8FC967B23741C9139C2497899A500A0F568BB22272D360267AE36BFDC
-37022427D27F6A5AB5CA408E2E925339DCF18DD3663A2C088943A59B703F6BCD
-B4DFF736DB3EE64B31F93BF8E8E04C51231E453A4264DD5CB3EDE03EFDE84C6E
-EA04803556B2323197F4F0EFF3B4CADB6F645DBD3A80E094DF41DA69E7DE2230
-FA155A5731DFB74212F26391BCEF10568C12F3B63ED608555E29356A31DA7E03
-6630A630BA93CA08FA4B2CD93425B6B1B166E64759051117A5CA57375A175B58
-88CAFFF8058A6620717E3FE9B0B3199E201B99E29F709C9A1BF56E775F295EDD
-FC347391E56FAF1A620F41FA2954AE8516A8E7FDA373B6B3318FCA7B050474FF
-5043E3C1F6C2ED6B6393CCDD3EA31307CE63487EC58B0EBEE57B7FE38A797E32
-FC1D5CEEA4194031848930C172D98526455C6F7C97350B893EF62AA17684E675
-48FE4AF909D9D42CC82B801B19777D99ADD0CD6CF454A42AC60B6D973441E4B2
-EACBFFFA2980779B87FB9DD3FDE5DF16BE1B67AA40A382EE0A5EFB6BEEC313C7
-313CFE4522CA12401C2236D6BEE454693A7AE8275633D580CB578E4EC4B5909F
-E549B79860EB0381B8B2C60A8B729F231FF0BE0595747A6934D70274FFD50E31
-ED10F8B9B998956B9B7145313D667336D28C65DE14B92B5DEEB935200390211B
-A871FD3910636BFF0F9F3D932C77C412343DBB318F1C1863A71B0321D8C3BAF9
-8C8A851E1B210C3AAB8E4E92A7CB4743FDEBED828B8B40C18588BFA45C4972D7
-E25707F2C8F0F295D08E9D56C6C565467C088FDBEEB4185AC9503A87A3D0203E
-6913E3196A1061E4D788BB04A481D513ACBA92D5C024B51F5C974B14198E9C95
-564CB28A446A2D5E9EB79BD08DFF005D23E80C68B59D97B4B8B9D407885FF333
-B19B30DF7582E296838D7D68823896EE44C2E82D136840E72FC34CE6F718A07E
-E880A2957A3B516FA90BEEC49AB0BF5626609752BADBBF836E38E066339A2D0E
-8392B31B7A0F2B8256311727BDEC7102D7227584CD8F96FB0F218E7AC4B3B407
-61F6D338D99C1F315D53FA5176BE6563437533439020C2D967F0BFA4013DB08D
-678445D75A980B2456241EA5E20151D12B5E9E573FFEA0432EE3C55AD16E8C2B
-251F17F3AA1916A5F4FB99ECF340AC0770A763927BA3D5A03D777C84596FC8F4
-FEB2C582705B8A4A50E6348522DD166437DDB2BA6B029637DC0A189208FC51DD
-1CFFD1409F17A5B6978D776439D702691A79412B6114A9EAD17B2776A791AA89
-9CB426B20F18F45093EE66A86CFE232A2A9B979074D2D77FA0EAD9BE8A7C731A
-E38675C5E1D1FBF36AD4440D616817BD48C294E387F171FAE366474924E09855
-9839690F0D2BC32A0FEFF7E0A5D77C22BD692C9EA0557ADA09044AE6069475B8
-9D58EB7041A9C9A4CE8482ADCB3CCE1CDDCF21D842C619813D830ECF67B0CA67
-80E5B5CEAA3219E7D3055663F34D9BC549FBB66B199F36D4C033B74EC374CDBE
-6EDB97CF2ECC5FACF8A68D9A8514D49014716D5920A30E85908E232A8D8ADC5E
-4306F54550CD95ACD81AD9A997F0D518A14FCAD5997C892B54354CCB94BD7256
-7AA5FCC78175EEA5E30FC5AFB22CC1EDC499303058D767BF038273E6E3FBE028
-D514C87AA9A57EB739DF5C60D943FD5F13BFB6EC3179ACD638F3968CC3DA84B6
-E4F72FCE3DDB95ECB75C272BD790F670B9DE0D38F506CB2554FC55290CD34DC3
-EB2FAAB05A3429EE46DF199219A975BF5A55B7E802445AA7F3722104E7608F84
-D66A70ACACA0B4AE6CF96B4565577031EA3884766458C090D5E088B00D391D1C
-DD5F456F17E32A00F259AEA00A6419BC21DF016E538C74CFA23B1739B485A150
-C57FB3C7C4DFF0C2BBC03CB1FCB80AA0A8ECBC1F76A371259ED8AE2B92BECFF4
-573CC1B5B502ED6CDE7A17E20E8CB77C49F47DB74A64F66B43F8DBC1D4E75089
-440C1FFC5CF38A3F498CA3A1D226287CD54C1F5CEA7FBA8DF6D1448D322774EC
-3C0218D5DF970A012E1F5D5499F2B9D7C427741B518A7E40C05DE156DDDDE625
-1A0DDBC011601E7ADB83A38B9B988FD3DEB78B0E9189A6CB35DB3E12169BF0D0
-04AD6AA70E2E26DEBFECB88A224DA21AAE268BE352F7B591274F7B85695F5FF4
-5DBFACCE337F2220DA9246138706A0401C7709580F0DB5642F24FA4EEA4982EF
-4F221DD7686A0902E70E64DE739819B4A34C34A8F5C68A591B2F169D3F9E57E4
-409EE3FE9A19EE8CC17D6B23F836DFD6D053E43178F72C8CCAC64E90D59C6E7B
-F8F2C0F92CCA49109409E471F7D59743BA1F9756C105E2B3A88431E74525029A
-5D791598E6757242D6A2BEDCB07568DD3EE55AF3C2FE01BF49BBA42F2D669637
-8FA4AD2CBFC8335BFA14C486A3A80F5682F51719C8C5050E78AE3632B88113AD
-AA13AD85403489DDF471079F73F641A4DBDB5F829B69F9591C13E947C8649F20
-F4035BFB5B872781E8DBD33112FE780667F03EF8BCC1130691EC49A4F952BA27
-01CCEAC81C98E1E782F3005DCD160C5F10390470158B11CECE9DA5A140E33000
-801CCE2D780F5624CF5367ECD0F037F7DD4E65C282110204A16E258129615E41
-A8EF65A70DDF685028858C523806517B94B7936B87A6A63E5302981E322C3940
-CC320304D5C861FE2A10675005C9B824F2B23C1F792D79F6C21A79E0AE6EC01B
-13196E92DE931E84C4B731427523572F1FEC80B1213F8DD279FA35E6553472C0
-E5DD18DD2179BD5C5C386F8F10180AF0037E0C5DFFC6C542F3F54A1C8012AEE7
-3C5B07953BE7867171FF6CC743D5E470C8D1CEDB8B417EFD8388C510D7036255
-2BCAB7A81F4BCE4457FEBE1B643D11FFF23F57832BAB05A6B5595D1BF1AF736A
-7E0BCB97E4CC17771AC4C287F7D9931F87389E6D54864BF991187B4450B8B1D2
-72F78B4BEABCD93F81E5FDDE93594E34A26DD7FBEE4D8EADF932EC3B46684AAB
-D88CBEDF312A4079B5FB0D28629C0709C9838D31942BFE7CA23C619038946E3B
-59BF1DAD24910B65BA4B93A66BA05C795756D8C6B899381B352A1515F06EEAA0
-668103569EFC81EAF2770EF1F0C275E176683A19BAED35F8C4EB4FC415CEEEEC
-EABB976733FB60D260292631B8317D90AD16F149181CFA0F39381233F331F9B5
-5544F44E3B2F2C544EE067A7259C19F49ACDD963E79046E45337C98035097F18
-5E7ED0E33FEF28163473E8F682A2DF99FC6B44E307ABB5C459A0FD18040CFBD1
-8BA0F6583A609C5CAED532EB0CDD21714971E0EAD8248237755CE81C919824CA
-D88FB1D0F29A00ECBC76CF62C63857BCBBAB9FB36EDA51C5C69F3B766A8BF388
-8FDFC8BC575DB2FEAF388B75CE1FCD42E192965A2E21326B537DE3EA765022F5
-7CFA5CCB84859396439EC1D6DDDD38AC4E9F06F138663B9D1A4909293CBE7861
-93228D6A7527BEB9D7A06B90A109BECC91EAA1BB23069024AC95C58FD2F0D92F
-0C9A23F9F98A8D26B7A1E70E081D564AE0A7A80BB84535D7583983161F4C3801
-DED0939FFFA6B101A9EE4004A6800354267881F0DE62EA5C32B4A107609A863E
-E16299310CCFFD62A7EC33A75F7E366B9CCB16A9905C5B965E66AB0A82161CAF
-BF3DAEA49CB8689752BB02B67C12095F38A837A702B1A7008B808241CB3E8952
-77367FCC9D8D8020A70FB767B1EA866C8F0A6F1C5CE1BF0BD0369F0BD94883C3
-69243523E0EF6B8BB94FD81FB9FBCDB3F536F6EBDCD64BE81E24BF77A90AB41E
-1E682D022993F534F5F084E5AEE10D831D1561C3F05024CC81FA5807ED64420D
-479D0B05266B6E93CFB2B2298073C5DDE4DBB1A084D47516D8A59C7D8A3B6FDD
-4CC0BB36179162C61AE84F3DED09B5880954A324C3E8FAE9A1A33D38109D8D6B
-F9A471E8F90FCD48604E265BC789574CFE5CEC36994951F97CE0BC88CE51FD5D
-B44907874A1B286BA978537156E589EF0A1D087F435EC06F1691E51D05B51926
-E78A55C1E9A4039185DF20C68E2E4701C4F7C5E18F045BEE53B3991A3710BF3C
-9280A1A369CE41FAEBF3664B056FA83F8DFE4C4000F7136073C49CBE894C1B55
-4BE63B386FA539476FCFAB0E10BE9F82575D59ACAB276C35F800FA1B33646310
-F635AE6153D935E901E0EADBDA92DDAFC6B1471053D6A3ADE4E74045AD693A7A
-F3609376CDF493EEB0B2A69449CE541BE697FBAD39D86B27A785BEC81CAEC54F
-6BDB34984E435C3DB92D10DB49DC6C135D9D65AA195B9078D6E8944F2031D521
-7264C22CABD2634EB5683DA871696E91670265BEAF792CF81E80383A82459741
-29B9F13C24ECE80432CB09DCCF5C28DC545ED5E356A5416CF586B97ECA91BB27
-B07DE92C1178A0AAA216D4AC235B19AB5A62BFFFD114C4F49F7279C94DA0E6A0
-6C71BABB00469C502207B97A7CF0CB79D68C2F5ECFCBC94EF07D0C37F222FB9F
-FCA9B78A445E28D686F36A6A517B88FEDEC5F00D7E83C8571AC06FD325808921
-CC7CBD648E7CE9C1A4ACAB26DF540BCED76950EE004B457F4BDEDA23CA8B7C1E
-B4F47CCC42AA81045ECEA93F8170706A15EA93F5FA78B1A47722681A6073AC3C
-A2459CAB0D5DC8AD079ADE47271875F6F3FA540CE8F0A5097F12782589577F54
-58EFBA5D8590CAD95A6FC2BC78227994B43DDC151F5D2B7B9AA85CBFB11BF6F6
-A9FF8784909B880F6B06806CC8F830F92E551F363882847E215E147CC4B38EA2
-B29D70A9D6A9558226DC92E57F0B0E78C95CA0A2BEDACA4CD0EE68F753912E6D
-D252610CC37FE89078ACBBC215BADCF61A29263E81C2F429E8948B926A877C5E
-17E51B64E0D3B325C1E4F29B92B8770C90D1D6A2C809081C612065A3285DD573
-C33DDE2196577F6D463E8D19ECD438F12C339BD3CE6482B33CE6CEDFF0109521
-12D3D79FECC373EDCF9E3E82EB3FCC26178202F42AEEB61DDCAF57CC4F995B32
-56E41B2FC6D6C675FA363D1CA2C2601F311C568C224352EA2B89881C8671CA9B
-BC0C5C7548A74D372B009F5997ED4BC5C0A2137DE941588A6AB1000EE9745108
-A64F2F780043F4CE9656E3FC2E8777CA1E3F88A99DA1A69A0E79A40EA2C6FC6E
-E0C95F573BAE78791B02449F75E9607887C0EC9B3654233707C6954E07D9F742
-F637D965954D2CE0CE474B3ACD1226E4E9CEEF1B8F73F7CFAF10D83FE9C4723A
-37BCE2F2C78054F4EC5DD881815EA4B884C7A88AF6B0A78B100FF7ED33D8842D
-6728D98CA0A0E3D211A0638BD2EBC392DAA12E01F76B4B5123A337B5B3885FFB
-14DA87DE71AD3A7CFC662C020CA6803F5F1DE8D70283B61CB8A049254EB8627C
-C2BFDB41658742FE18D0DE9772B9D592CAFBB761A5A9768B4B02DC6627432260
-5DEC39919A487C019BD77225970F1386B156F85AF55B7B23AEA03957B898B1BA
-16515BEA6294D26F5A4722685E7FE08298EC331ECDD7DC824CA60F19B7F03D1E
-683899368E18FA8499A2336FA880F6B7983F368886C6DD31F7535691974E47A8
-299D8F4BF4223DEEF07150CF2453C714A0CB5FE7ABD5AF5FE47FCA3792A13977
-C531F2A8F81672564A75DD3BD50622F94DFE38EC8E8540CAEC171D690AB803B3
-01C80A9F4371C59CC0E0011743DD480995D5160986DAC3DF605FD473CE527CDA
-CF9C10E819F769132FB73C17399C6AF0692EC445CF768BAB03DC70C1DDD793D2
-CBD3FCAA117F019EDC56D479EC56914CDF19FAB530D0E2118B20E735E4D3898A
-A95329E98BDCE9DD94573B27564F8A1B7D075AA0AA6AA6008438A63BBDD174B1
-34BDD06FC334D97670568AEA4E7F762723064BD4B56CF0718C55DC8F435946F8
-9951D65A1333CF4C8DC70792546C46E3AD6353A2CD596FF2173B1CD5EA8903E9
-D1593C8B5DC53A42F76A233237C4E34DD339F1D789E5E8C56E3C8C37F5990732
-47799BBCB3E2C0A246EB34192F226668BBFA48CBA95CCAA6A9BA5C543A10532E
-A6CBDBDEE5E662BC1F8DA0D66AAF39CDF436966FA58CB3207070631E8ED917E0
-26489A16182B29AA0313E0ECF6479DB4675FB0576610A3A9D5617DC8807B61DF
-5610D4ABA159BC25C3C3F678D52DAEEED03C31F5DBC876952F459609915BB5AF
-1C35AF1C7CFD30D8F39E3F0B9072042CA8A2FC564EE23D45181544ECE19C2056
-E6DCED4653F6B1E02B203942CCDB6175463DACF0A1D56568A248F39C3B6BA054
-476489539269FF2E88D0A463FB60D52E0A29086D2F86C650842674E0D4DE274D
-941076913905096454C72DFDEEA33F2C7F142364018154475587DF2B766AF169
-D424EFB12A1E04CA32B1ED4F9A844F95EE708F7961D01080E2EF3C2125406FB9
-5F000937A6E5504917A4C2EEB0EDF0EE2C19CE2142E875AD64CFA4219072042F
-BFDDA76F6A8933616E2D9C14622C17940B2DFC4CB124E33D1C7FBA5D4DF91230
-95F75B3B2944BD45292226DEA4128D14B094477B804163830CE7A310A7433382
-53D9F5E37DBB6D1EFF6D699585993424ADE9BE7709FF882F7F66CAAB3DCD9D2B
-0A1BA066F3A43BAD8D0CF5D608F855E14B252FDBED8C6B944ABB3EA837B2CDF6
-DCF730C7CE1C2A0A63C652DB8D822E74767B95F5D7F20DFF654644F93ADF8FE0
-8B4C393F9815D4980DBA50AF43FB5198246C91D9D1558E1951B790443F4DA185
-B9D71EE244833194B6E9C12238A613015B33668D7300F4EABA5D7749D485B9B1
-1E2D27B5CF779EF39EFB94851A0A7FAB1BB928D05C4E38123934CCA47B88C007
-BA2437937EE3D46D8B469082905C43849D54E873FECE86A7068C32F4698A1EB9
-3097D47D8A14BD46DF02FB5A8D811A3ADC43FB362381634A4A95CEAB4F43A0C1
-DBFA3EE3721629FEBC8565BC17C850FFE3F757D0CBD3FBAC0F4F48AFE89E1941
-60F5B4CB76B8BECA2A734DE84DBDA0F33BCAE440CC5E7124076363E37FA7486B
-B3A90F827052429DBE0BF5B94997FDCB3B8E896C0B8786DAC25D2368FDDB7E8D
-311D6E2F50DD30639113DA11A915B3E36F450AE6738FE3E93C5726AE8C9CC8E1
-7AE55F17082C00ED68C7A189783E5D955077A2CE3C2854834AF677EAF4749882
-C90B37F66C7578C534C773D7AE8A1F27864541006B747D3B7580E3D808FAC8D7
-47F29252F83B4C4D2855ED5E9C129FB90FD85AB248BDAA33BBF956274EEB9AFB
-46A0E155FA1C006A66D408F32BDDDD511EB4F5E9F92231D7F3DB5AAAE0287A16
-688A9BB19C728267E13FCF20C9E635F1721B555C2E08A340503A75D6EFFDC772
-269BBCDC68CFD48AC1772CB37F9AA24DF90494F782DD63EB3EBDA77EAEB2183A
-2F2E9C4750CDE2E047A842288A7F430C77C010C0B7E3CC1E02CF51DABBDC9C6B
-DDA38147668F56416D782075F98A337F4314518A23F01C37E47244408BAEA44D
-BC156F429A9DE240414B25081B956638D2E0AF490E92CF18E44E666D650641A9
-A1E5746E8155519298DEE328297AD4EEC55FCDA7ECAB8C6241F8DD5B0959F9BF
-4E1F5B4E7E0CDBA1204D78ED01B95AA34AB90C8B3553693F7B18413E51843D46
-ECE2BFAB532BAF3EE2DD93B2620F96F907EF51215C17297F5A77E058AAE1A5B2
-A564C5C11ACB92D4C58D29EB2543F454700EBF7F350647406B306C2B9CC29B76
-AC75AE82065FEBB75CDF9D216F376215633A4A062191891371C8C165D47371FC
-148CCD1BCA39461E5E915C7C5B13F04D5BA7CB3B6BEC4489E527188B13E2C06A
-E393DFA9B1BC17A141CBFD2138C7CED07D86C0EBE50A8A6E48A0FFD11F791B3C
-E3455ADC6DC8A02EB3CBAC56D879820AFB2557E361A0A208213C0C2461E6CCF3
-576AEA9A46514266E2850B2AAA75A10FE3CE609A591C2DBA9545098FA577D89E
-35F48FD4CD0EDB72B9A7FB7873D01D683DB3DD2DB9342C23C8CA0BB681619B52
-0A9C6B27C726D11B382146FA8D54D556FA6EBB117BCE2E4D53089C9292C769A4
-37C573E7C7A00DD95FB351F20BD800A3CA17169BFE80AB0E6E2FF27A78BFC3C6
-9E416A86BD22470F4293C77B0017118639866BBE9D08A44A23C7508271FFBD1A
-AB76E5E655BF66E87DC916E0AE1447DD01B8D11F82362BA55B50A4FE5FD7D534
-318EA499A1A4924170C3FD81EF41BBC66090F7F393AC0CFC4ABCBBC4255BCA1F
-FFC45010EEEBE12B78C513C1883950E8D3E5429CC5BDBF05B96D1B6C53C7793C
-D79A82CA916C9EB160DEFCFE32691B44AAE98BBB3C3E35D3C871BC80C7A4677F
-76DD0CB632534F18BBD47F961EB620BB805BA2E5AE46B196E3B907C42F157B68
-6A3FD76F75AB344F438CA0661FA6243064303A7DF12EEE75669151F9E297E812
-78CFFA5ED9DEAECCB330015782093908846B044BD8C7740AF44A0DCC1F9C8197
-B15A30DFE0826454E68C9D80C50F2B1D98848A143134B3D19749F7E1BD5A125F
-990811AE2923F0BF502285C55B49BFCA0DC5E1CD13CF5A42E09C764E3CE54AA7
-12957D7B267213BBED74B278B21EE4B16D0C58152EF52C293CE44D5F4332877A
-AC8032AA8CAED48B5A2B2CBA52AE827F9260383D84A5C5A565BE1D1C7634FBDC
-5F083180351593A272342F08EB1BA76A321BF45DC01F0DC73F81E27B6E4FFAFE
-696B3D57CC50D1C05AE1FE053B0A513985B5A0113F1CC0922E3407376E339204
-27F8E293D1E7A4371E60CA2BF0E61ED2B81B12DABF5371D03C19257614E99858
-5B93773F057BE3212BCB115345D43339CE2CCA48ACB413B206BEAEAD638CEAE6
-5ABDFCA4D1E5907C1CC8BDC7ACE59C1A3E27DE3B006EE0DE0E76E72909F3595A
-4202696072875B42D51FA59473C75AF17BA7EEF32BD822A5AF4556CA5D88BC53
-2782DC0AEAF8F66B1024D73E07E0A26B90FBB0D583BAD7326C80BDC77E5330C5
-5C854E5A81BC3BC45BF9DF2677B9C89100251AC18CDE331FA79A1536E1019D49
-FACCAB95EEB940BFF44E4ABD1C0BA262C750E8193A38B8774CBB92B873035460
-D75CB085C3FDCCDDA3D04C963690D2F5EAFB3270946F69A65346A6A9EDF973FD
-CCAEACDFEAADFE6B2A99D14AF7A210DD834494A4C4D22102042A6213E556CCB7
-F645930874E32F95010393ED42DBF286CE565D56D5C80C96D5C88547C09070E5
-F17A395A3E030362B943B61DDADD60F7D5C4192777D6714F141BFF9F035B205A
-DEA3AB2A307B1F9D16E62969C1FEEAE6C5283DF2DC414E904217945AE629C91A
-0FCDC9BE4459F5F0448E6B2B8A907E6A000B860BDBB3BFD0F8567D6777415601
-267D05C6C0BCB3FC969A22D34EBD2B3C90EF8FB95E7684004F8805A80EED2F88
-CA8C552887A6972BCEDC0ED9DE66E7A2C8CB7E8A884D1693CBB83B5275429BCD
-5D3D846AE8233D5F492D02CB5D63118E647C17F89B3187459A0E4E64738632BD
-35C37B9CCD46499B7163FB436BE8D42CAA9CC1F21D12D7F62EDE4A0D88A4E09E
-F0CB44634407025ADD949A68633115C3C5569DEE891367A6624833ABFA6961AE
-6B34E438E76FB2ED7B65DC1A8515D9C7104587897815128A3A6210E08B55B083
-3EA57ED782299D70FBD8D12534E74F1B7658D61B999E0C6B67FA4DADD78B2769
-430C12161171250BECE14E7CCE85ADB0070ABC240A237AD1C2C3D7E75C23015C
-E145454CBE80DADD25B3FAB08B2A2FE0A3A728FA57261FEF8073952090A5892F
-B9A64E855D36F775154FFA79FE7ABB4A89D7D581F5762ADE506C2D0270E7D64D
-3E8E6F0BB595956B468833842214B25BFFBA2BC8818FADD58EF206D88E32379E
-2C8FA4A3A25D51EE8D8ABCB9C3772CF32DFB6E85789F5DFFEBC252CE9CB768A6
-28E09AA133598A0A664A401DB0D19674EA7423E1BCA26BE4BBAF9DDA21454FCB
-4C2B509EFE29AFE2A9B01CDFC872A32D175EC93C5EE5BE3469184DA910D449BF
-1038F75546A1E37F93169DABD6CB7EAFF6D30DD12975FBC71D755F29DC3C7795
-D150C63563DA4A6282BA626DCFE3D360EE153CC0F7928AA60405AB247E9FD612
-C77688F9B4D84115E797E5924E6B40F23825164AB8B23A0B179CFF6D5A02C500
-8C8AEAE9C9724A17A97B164D0B3CA0899FAD42CCB7FD52ABC3BAF5E91F64ABE5
-70B05D60756664262B7BF4C8AF85F17B4C8F13BBD6420CACA0A324690A307E8F
-DF1586DBB5BB4DFC46FB18C9C4DEFCBB8937EE5BED3DFC1C1243A4E6D743B26F
-CA9ED9F7402BFBE17B7CC477D4E79883162B4ECB3598FA99C53536EDED81F607
-B677815418063F64CDC05309EC4F50C3B49ECC75D47DD5159D24178277543814
-1E9AB69F495A3D0E03C028E81E74722766E868A74675747BE974D9465D48DDF0
-3F1AF3FAB683559DAB50A977CF47F7C4C1BF43F446ECA5374E2B8E77C23A3F57
-33858E972578A0FCB261E1C889BB8C972AD5081FE67D82BD8B929409DF9ABFFB
-BE835C6DE98E32112BBE1883EA92C023A73EBE61FAAB85FDE475DA8531D17184
-82C7914966D4331774027BB2AA9022A0843321C85146A087E617B126A6A17FAC
-75174D5854B40C08EBBF562A4C7B04A63C55A2CE2FF89E8E1D715B49A52C0EF5
-88C0ED63610A7268FB0C9F9DF4527E6CDE90D8AD645C54E26B7E7225CBFAD29F
-80059EB920AE850C60D68D5C8012B1ED8E7AE12482DAA3B5F674D4E569824126
-ED93DEF05AE9031440E88062F475598B4AFD463C144385359AE4B680B2828CAC
-014692B1C29BE6D84F5434A3BE10A6774D1493B466F7623C9371420936B397EA
-CCA8221353E6B079468F08130FF0D3619C4CAD9B8F2821986F91511EFECC3B95
-15EFC8A7E9EBC936D3860809CB265367DCE2850A34D673727FFD65D31E2EA8A9
-45E747716B12EB8E7B7859AAACD23E04E9AD85AD1E5E9A8C2EE7D535150A6AB2
-48ECFD5AAF2C9DB97A5E104BCA486DFD432AB386B4B31622161BE0F92983BC15
-50E454658FC2A987E2812B8CA402A618227ADF685169C12A4F0BC371485C6D82
-AFF5509CBA35D2316C6DD808E70FDE08712A1DD141399F925E8447F3EF8FE3DB
-11F0333E5CA2FB92CB762E46A1C27CD7EA355F8F17798AFB0BBDB5417E6D3FC0
-4BA77E9914A8D37EC26D6009FBBE4B080CD7D0B4F35DB32D4B7AD26C0C79B130
-D82A5481D024538265AE6F9F6066C3E4D4A4C45BF168F8D8CAC1C703150524EA
-62CF558AA34B80090CD22FCFCCA620F671F98E61909014DAAB8C93D36463B6A9
-C07B33058454664347DA527C7756EF50FD865F3D64C8AA8BEEF1354099FDCFAF
-3408FE61855CB91FF1C9DC778ED2784B3423B9779308EB908ECEC25D190D5233
-F88C60DA18AFF88C880777D581F369A750C6782001767220A84B0FB874E4FE35
-90063FE863173018BDC7B0E97A1715D74477DF5EE7490202370A838A5F15581E
-C98893DE26F75A2832A97920333F97214284F3291D83D41F2BDA3A74EB4724B7
-E5AE936863AE5758D5B6D4E0CCC9703D045931FED54F2D98B039099510BAB2E8
-804FD603E664663862E0AC4E957C7E65CE9A63E72F635570A068C7B696D800B5
-C245BD650BF0627C063678A88085F961B770E8C201418DCFE03ECB74776406D5
-557C37493855E1774F4C87B9C9ECD38BE306FB64016D1A54A848783821512718
-CA1A0BFD0188997081649F6D21A00F341BB0A843B0B598EEC9B18C7002F76150
-7272B91A10148713B64985FF6A00C75C22C708F2265EB223C200190DAC8457BA
-89C4FB61D095F6C2FAFD3F13780F75822F0E26080BD7CD13B31B8C82A4A007AE
-29D450326D79CC899BF3BA9399AF4012AEB18EFEFCB829B40EB8F2FC97225212
-A7C49B4D9C5E362D2E64A011E9891BB02075321E1315C1FE219E49C2F4D2C8EC
-587BBF73C35D13E91F4BDD3C17AA023E0B862BEE477BBE257910369DAA330AE3
-64B05486B6A13D5C3927EC6A591BA7DBF5CD81840841B453AE1832D0ACB35935
-9DDB4E8E88D45175D4D9A88D0F77065B98FE59244DA1B24A0D2F04FB3D11FE59
-C69BD19C9535A0507DA6FD68BBFD9023144D99A71EDB1D00105CB59BAA1EC8E6
-8E3F4D99723D87831482DBB370FF8E4099D6EF49A562C5151B948E529FA84147
-5B80BBE6F9C4F877BEC307667C6868B0384B98763A849B47C889A62E69E833B6
-04A60319B227A40368B11D3B0E92FFCD15009B654B096D4E09AA0896B70F1677
-EE32339A931B387D6476843D91DA00229282D60F04932A644B22795C7E86AE6D
-EA7DD4AF07E3D8AB4D585C51E8CCAD2DC043AAD95517E97BD18D688A1DB92A8F
-B70CAD704FE4D1CDA3310BC7F3C8245E18094E65C82C9A7277BE922334E410FA
-93D5D6087892FE352F03D536AC06EB9C9637859093538BF0BA676208CADBEACE
-AF9EFD10C49850701AA500F1600C42D1E635479BBDA49C2812357728BB540683
-90DDD54F4193883F2F8DC8849E90F329A9234F79A731263BEDBFB01F996024DD
-A95D5FBDF7A6B4ACA2BC93E3EF299B6010E203B59D24EA8E05DE48906B3E91FD
-7629A1045E32639610ED53D78236842B3B44DDD2F36AC347F0238E27182486AF
-A6618501CE34112F848598A2D28CE97A18407F9C82F2FE39EC4DA96801E1A23C
-F3BFBC09EC9C81086E2A48F388EF5692E9E5D6B5B7440A60D4FAC21316BFB71E
-01DE8CA6AA0496097FEC7809922553E6C7DC24136301CF15AE3A07CEB934CEF3
-61ED9A944BCEEA2205773CA1B5134CAB75E5DFAE05B79DF8DE0A30012B50046E
-ABFD0F4458746F14AF71EF79283E570B4FACD9A6FF5A309CF795520A812233F3
-3F97621D1603BB7878354C04AE66319A6F00F4ACF41FB459E90ECBDBF375DBBE
-B205EC6A89494E4390560C121040E8F4DBF68240E1C77B673269CBF10DBA8E16
-88F18C662CEA332147C7E17F88B126F209D2FC0262D7F1B9C8E42A6D56FBE9F3
-9AC64901CD5DCBC9E120C7FE424C5865768C9CB901EFE55B0EF8C363F0516A05
-EDC6F3195BFAE2338DC6BBFD8AB31FF7D2B63A7EDF197ED12D51B0342AC43791
-AE851C12B9FFCED87A9A0A66490A126293CEBDBB12DF32BB27DE30FD02A961BB
-9DA36A32B0E9E51DCA92EA7C9E09C48707728774542CB0B1DD72601E30DD5A6D
-22F1081F30A8F5F6ADCBAB5071834CAA362B0A586F93A1E2C08B4961094A6060
-0E767F90D241CAA689FCB364048D09C6E61277E23AE3D3907B5DD935DF1CF941
-ADDAE2D173EABC5C1DD7E13DFE00C4DF73E2CE2EF0E1ED9254513D20C87420AA
-690769FCF932DC6075577708714C19769E39B8171A7A771A5619F5CF9CDC8388
-082E54DEA0658E8218B2CEE1F8E39FDBCB057E7A728204F5DFFFA9E7EB0D6F46
-3A6328C32F4DF1BC54BCA3800F83AA77D23F9EA4DC3D78F052EF49C11DC8C3EB
-530C3AC4F2AD8C861C09FA96BF6313C7195F634917D2F4DE84F7193A837F9936
-25DED0C42D12DCFD281AC0DD5879CBCD46D17EB87693B269D8ADBD935F66AF0E
-8C2FC7412D541218A57F6D9D9763B51315EFD5B1BDAB6685D8F3759A98AC801C
-21B89D3575593A0865A4CBB176C9592EFC8FF47BD2DBF34B160EC8FF8842CE94
-F44F9A5DC66152B2980DADFBADFFC915A95F98F9406311732E077E8C0BEEB6DB
-6709009FCF541F514CCA4D0427D633DA65800559760771873DEE72E395128FB2
-53C856D3C48F8D8960F3E6281B2B4172734FECC78F09EC23F34CB920EE884D28
-41963A47BF3544912E0AA19A48799D894CDBEA789C44BC355763C5758F0AD638
-38C6D5492238EA2FBDCB43B1214B4E740296E3AF9789773A918A26E09A6167FF
-8CA0150EDC52D4BF795C8F294A0E2061C6372716FA0311F8A3017570BE24DE6B
-3F59AA1C888C121C4E2DFC2E504B014DCE8D922C7CD1C4DD31A53421883A63C2
-859D73F217F3C2B0EB6881A2B0BA479C5F826BCA1F6FBCFB672FF7CE4557E2E1
-BE07CB81D0D4F772A635905156711F3836A3C5919A833E59502FE32A06650B34
-44042BF4151827589B6093DCFBDBC97626490687FAFC9EE3411B49AE64F650DB
-4E9ABB16A6E3A029BA745BBD0E305EE5F3C7F9D83AAB3EB3F549EC62730EA472
-F7C0CFC92C72FCAA1319C6F43B3E523AA831E4419DA26019B5CDE3D14C264BB3
-55DA4D1C9CB74B073EB2C80843D55378C1AC7ADB2BA6B75F4FA7891B605EEF03
-A3D9DEEBA8F029CFBD4343E57D2FB2EFCFD5B8499275B74E39122F00A0283138
-758A19661381D508C36B49D7E1976BAD40690EE2AD29F49C499B66FED017AC75
-9EF5E0DF28EFC831E454F8D0EE9810EB0991A7083A878EEA81B494437D1680F6
-3344196F46A958340C9771BBFD7E9DBFD8DB8B19E15294311BB67CA78ACB89BE
-112053F96F97685DB0D0DE8D3772D2699CE60E5CEAC18083300AADF886126D0A
-9DD38E90B5A99F2A24EBF47FE8BCEB5E258A4105E7123C4174AABA79C0304B94
-506F89D3C11CE7EA02A7C3D2B32EFC7FC7AD1590B544D8F1F846ED5BC371515D
-82E17D0E200D026E05653C983BAA7C4B2E4D0850E3BC5F5BB62BD07D55510C62
-2CA31539137DFEA988AA24AA2B203F0D2256A8DAB677BC1AE4BBD0432491CF43
-346668E6A6D8258747B27898897B3B1D404B2F2473951AFE38A563754ECF4F27
-D9CDB65D357C5678952420C9EDE68EDDACFD9136E06F3CC2505B3E192F20CFB5
-C6AE456E1E8FA86B9E85A21FDA36B349BB98503DCFAC96873471B2AFC43F4574
-02BDDAEBF5ED48B959860BA93570D6389382A085A2924AFACC2D582A5C1C23F4
-4174EB5265F09C78CEE6858ECD88F35687046A178565A249F85F2F12EDE73467
-38CC89DC5A980864C877B4988C862CF44722E5B9C79C79B2D71548D28D50215C
-4AC9E316968EB5238484DAF7E28B79F72816DE3233BA1F2F01702AD28564EBDB
-FD974DE6E4D29B25E5D6C285257386905BAE46872615256546399CF06B80D0A2
-282D9E10F14F01D977FCE93214725242BD69CB5A7275785410885710D956F242
-A71389EC59A8FA694CC681EDDD984123C10EC191AFBAFD911524352B1E012DEB
-EE56767497213386FE17C0F5CADFCAF35AC917F5423C092EA86214C01CF52DB3
-70DD3EA2ABCA0D2C5160BFD7AD66A24B9725BB07F08DF833B26912731540F34F
-E7B772A43541E28959397CB23136A205FB14B5D98CDC692A17914E322114098D
-B91397B4CB2713BC28A75B846E1CA0FE21F3E936298F63D057BF943E5F6666EC
-B62A6E76C2478C480392BD50CD0CFC312250D8DB942A16DF1AAF6360FFF78687
-3B412DE5CAF16348601775E2A6EABED350E16D810C11C56D1365DA81125AA1E3
-6F0F53162D9D1453F2A9D3869FE5CF687E11B14E7B043F8477DE75406360D233
-A105B72CD6B28B49D84E62F148D59B935D4F80F93006D1D43CA1887146266DD1
-CF8CCAAA1460F59D854762BA4DCD2C72EA3B883355010834C167789742D0C886
-0E40FC7E18490AE6501D75479690D7A67ECC65D749B69021F8E6D86E98D0032C
-FCA0341852E051A31B948411F8E27AB7E23E0D9F6B376273A97554248424C0BC
-4CCEA57AEBB28E61F46FFC12365281A763229B00D86034999AD5ED76E9B7B5F9
-D8EDC6BC419A43C86C2013985EC8CEF1B6F251F6EE1F37E6752B326D01A2F486
-55F4469A4C81594D1133BCE884B1438128BA4592AEC98981ED6DB57046D20AAC
-D9F9FB14FF8E3549FE9A43F3F9B0C5ECDF97626EEE5B7A5053BB1E55E7665B40
-85C2AB287067E09BF68B2A97310D6F018D5EAE8FF29514194380729719001045
-BDC12CF32D5B575F04540A4C428D2567CD66F7DA4FE41993EBF6FB032AFEDFF3
-0CADBC79AC90241C71DBACCC99742BB516849F1C8B3A6C60EDB04D290F4C9F47
-4E3C8B45B18BBA98FCE737D05079940E7681C587175E13D94B676C0F29434DF7
-53D0D9757ED0DA610E69AA32B5977ABEE045EF8ECC9D5F9EE464683ADF39F314
-7837ABD6353BE90831A843AAC6D08DBCBCBFE5615F88774F47632799FCEBE8EE
-91D0CFA0783234042F66CE7A198017A867BBD6EF6B3077106B98A1CDCAAAAF91
-B5431654A8196FE452818DC97E9B64A48A20968E12A8CA92E434EA61838AAA3C
-F0501F1AF7DB5DFBD6A0CF7E1BADA364DFAB8B59E076A66AD0CDB95C13ACE06A
-D7CA855048E2BBAA48228BBB6C437CEB366EA93676F8790FBB883BECB832DFB8
-618120164630AE23C2515B6201CC0A637AB5397D3FD8F575230559F633654BF7
-31E0774D2CDE9457262341BDF81E24F69A72351992807EFD05F5331F648571BE
-824520CE7537ACA3E919694EE5FD274207130E28D716B144060FCADF613B8379
-693F7BCE8433B319406BAA89D577841E55F73F8DDCD9762875C18C2509D826DB
-4ABEB7AECEBA26BF2D06884BDBCD98DCBCCD11047BE8F33A766C5B5C465CA713
-BDC2FEA07B34070354687C2F5F0DA72C50904F37FA17496BA812ED7C556709BA
-FAEE9127BAC4E7425EA5584D317F6D4D6287CBE769C21099D2E3075171158BAA
-348477A37E790BBFCF9D214CB2EAB7167B7B9672D84C984FAE71FB830B914825
-7E789F50FAF9CB889C12B2D7237B8FA90123695F0111C4965802A7FD73809EE0
-E48BD07721C48D81FFA6FC5FD14994772D3A39E6F91EB962B0BB15471395461A
-577684BD8DEC293465B85682221EEEA16A02EB1AC65D43BEA067591E90D49660
-1704167CDB94B046ED3FA8225C15595EE9E3EE4ADF486DA47F269E9415B92403
-49E9CD8929544444B5AFAD300B274FAE8F3F722722BB5EF87E2166F084D0D18F
-E29E46A3635D2A9778382490F636E236D70F32841D846518AC83775AFF5913A5
-164E41DDD413728A2A7F67131167822E255A5BA9905B41D33718D506D4ACD872
-9C96A9EA31D639CA5B627839105D27A3FA0487B0453765C5475F2069CB73998F
-CE3B287C77637CBBBE181F003418488179A198D7DD76FDA0803CB5189ECC87C1
-373266E75972089432DE229A9837C0DB0C4F4A1C0FC242551112811A94227644
-EC271AC874D9AEF2F0A19C3E52507B601BB51CC4B063D7DB56272D4E064FF026
-77DF024B3EC16BCB3C2C573DC4B55D152A0847080520EC9794590776F8D1159F
-CA7D525704CE0773003528B2DA05CE92C37814295742DE3C5B85E72D398FC549
-8C627D97F4B77B17D0A0FA2AEE9B35B4BE1303515C2737EA58EFE3E8C02D9A5E
-B4BE134695380B10F9D29995FE9BA0F1B8D725FF40FB65A1B5E4497F6F7EF1F7
-C215E98F2B230FF2C1E77DEB317F405D76399A87858A4431FED2A7E40B444870
-000A2019680A7B179FC7E336ACB8B8050ADFD9256E501D716A64D40D045AD891
-B9BB7A293C0010A3FA8172743F2D84FD3A7BB02EE6BA019FE522761F5D48B06B
-82AB108F46B361E1215F4146B9499BA9B67F4CB7BE248C0F452366401C4B1EF7
-6A1FCA84C3806D14E98CFBB5B19A9E9C130D20CBAD9EA9D55A8BAD6BD22DC210
-CE6EE0C806A3707CDE7AFB920F87636526309CCD2F7C71E9F41691618503DDAD
-A1AE1FF5800EC16ED9BE08D0CD304939975E8FCD8EB99F8F408C2F9CC6AA0F68
-AECF45C5AF7D99B18BA291EDF4B99E01A7F3FC3271B8B14A6550AA3893C3BD99
-9CB74268CA2076FB23A1C93FF528D2A3E28FBF2B9696622858BB4D6621AD5C74
-83E08BE6C12D20D08105553DC668F32AB7699783EE9C5482F1EAB146CBBF5A4C
-7D5DCB7523479EB24CF2FED6A503570C210FE2BBA4370ED880810D952F4D603C
-7AF879D265332AED31F96792AE469D8B42B83931DBF557150CE66853B6B999A1
-11CD84C513E2A4F94F67FA8F95DFE5746C704E80920BA0521A48DBFDAA615D27
-8DC65DEABF16F1681C2DFEF912222B76D449F9EFE165428267881523733F8DA5
-C34922EAB8ADBB0ABBDAAC668FCCE4157FC5A41E6897EE4D7C8AB47B0D1F8947
-604FF9BB1034E652A091830B21E3955B49F43EB6BCBC35EDF5CD081CC4786F1B
-4FC68F3F95D209CB2B74944CD9FA3F78583063DAEC648AD231BCA52699AB888E
-2EC4B31D79F9016BFADDC53CBDD785E931FECFA07CAE66786F15E95A5E68E0DA
-CB1F7D2B788C9276446AF1353574A1C31BD1B009A9A4FFBCAAC540D5A728D555
-C19D50D543709AE3063F122F39AA2C1217975E12C08DBD572D242B6668089F50
-9303ACD75A32FB183BABEA1B4982B65C3F7AA3880FE5BD719295393EE246209C
-0929F1DC19844EF3556DF49CD11848BE88D84811C6686F56856DB0CCE63FD473
-BB08A721AC03A2275057214675BEDD7DCC0FB1BA4A02E5BCE939392C350DABB4
-4D81DE6629C7713119648A025183CFE5E8BC3FDD518ECE2A3F2BE0314FF8D073
-FED63CB458626ECA9525B2BC255AAB91B9569FCEFADAE921575CF439D4829611
-7E3B020B9223A6C4A622176F1E7C906390D4B436ACCE1B2E8D9C03E31EA0CDF2
-49D6F2B1296716CCECE5CFFEE825B1DBCE083EC16384935A7C1E654B6ED2BC5D
-A8A077DC850551C90C75A044BF66713F21EF2E6B963BDA8581797A833B1EEAC7
-BE663EEBBF0AA5779A508DC2CA40830ED8ABF4A05536B56CFE94FC10B3C0056F
-607C2F3625130E87C03E7201F293E62C69B5FA6E8AD2E870D20DD70CB689DA1F
-A955797C9F6EB85CC96505F409556992CA2A19E9F3835C0C3A77C134C6B716D5
-952AC896207CE3723AF534897740E4696E90C58025E8629895A4ADC0DB1AD6E7
-6A89AF91C2A6E39134434F80D4B50D0FB4BBAF31BCE787D3F42CD0B3C328B6CF
-3EB7D5DE10CE8CAC478E3340C549A20843857B65649F842B0402CB0CF0426600
-6C0C7C280B7B23461F4E555A40FBB0750E077EF744EA3A8814EC08C9FFFC4FD1
-2A840A1C6988BF0652F623732EBAA16537D2D88077B5BA6591844B42374A7506
-73B04434912167E8B2FA443BDD2919521E7CBB51EF56851735AE880DFE196687
-BA36E944F2A33C00168D15D83C51C4E500A1938A427CC97B35BC08A0AFFC0252
-A66E0F11C26F03ED84ACA2AD9EB4F4913D7BF8A548B8D395DBC847CFC3ACF59C
-A856D945FEFFC9E89BA7C441C85B718B58BB70886BD6AB9430D3DB53C985C8D2
-A59CAA7EC7B63976D36DD9719B373AE58F09030DF86791E4B8FCC2807D30307F
-6C83981D93095832EF7B6D7AB9717CD19C1F3929C31356B6CBD7B147464ECBA8
-ECA45DA761FCD20F61E49E496AE4CA1BDB5AC7A5591D0FA9439F19B136D6F9F6
-DA7FA38A69AD6251E5722C47DD6856BF23749DC3F0C339E854B4F84C4301417E
-5D7D4A42BBCA6DB6820B70F0432823B5E3A95AA69365DD34330BA317B27B4E9D
-9303691BDCA22CC1BA832224188F575678D5E7F95B3A090BA8CF1F57DF504C3F
-AE0C8961BF0FAC6CD00E2566DB1D502C8E953FF06049D00AD5C22F695DCEA09E
-37EE1B6F55BC691789350E0EC61F699A6E411AE0096B71AEA9A51137C0B1A0F6
-39D8C4B3C85C034057D56D235D68130FC3AE064B6F54723582F06EF00D110B03
-077E6FA25BB5525D5220DE4F8978D3C5BA050BE03B4A715910352EA58E625E4C
-E435204F0671AA1F2B58A5CE2BF58EEC8CF7297E8288823C64E9918185B87283
-93F8E3DADD1EA48FB267094948CA0448854729152FE6F9B81F9C734960BC02E3
-F4CD9659A1D7F9F4F2BA9CD7809E1233DB4368752122D756C3DA26E391DC4BFE
-4F83FCC871AF08E7CD5ADA72021562B233BF268F6D4B745371D8424019B72A90
-C124F65C29B2C15EE8C0EBA2E70A3DDCD6D9DBE25B3E3B80D3E9FB1D19A182B4
-902AFB63B7D989756462AC1BA9BC6371B5C6E1481E57F797693D19DF869414A9
-D314B0D0842EC99E5D156EFCFD20D07C11B7B5996A4DB5EC85E5830B3655F84A
-FD7DF060593758A6E7FCBBE97AA3AC1BA6C358F26F018E292E50E1DBE44FA436
-617AC91F2341E1E4B92F9F8AA179E6791BEC0C5782E283C73C4E9EFEEE734F24
-0BBB7B5CF26F8C6A61D4CA18F8FE8C39D33527879FE08C5BBE9D87C3A3E84FA4
-F61B6EE1CE3AA0B364656AB14533E527A55D89EA59BABEFE2114204CCDA3D247
-A11562DFDEF7E36B939A9341121F4CB1C61D2586AB147C17DCECF23FA58962E1
-11EFED42C6C90A0FC71F87939659CB868BC64C513BBF688C4802DA63D3AF113E
-6551D91D8A91461888073F8D4213CCAAC483B43B3AD158C537657F1D4D22E9DA
-804369D6308B4AECFC5262B047280C9B40BA4B53FEE769DE9140C5F262521744
-54DEA4B4F639CC891A1576364BE160434B02049C90225454CDFE46FC89CD6F84
-3F7B1E81D38743F469768FD6F17B3BB79764E72BB2BCBD8D9BD966E7ABF7D5A1
-B5816A8DF156E4E9EF48B33C87C03A0F00EE23DEE5D76707C6F123775265ABD3
-D93A901B7407524CC2A850771F4B609B835A62374DDAB77C8EF7B9BEB6867029
-537B4B34FD2354655BF0B16F473130084959670A0311CE512A487EB399253FF9
-03E9024BFDE1099B16943C88627DDC20C7CAD23F5BCB669FD448DC6DB3A6C4EF
-D2AD525FC42261D6B25C5DF42FAC5A9A7C034CA3B44F7A67E3AD200F9A8A4154
-A0D85D385D8F07763AB004C0C71E5394B0B509AA237175F5036C1AE4BDCF35D9
-56F7F958D0A600B28B7DBCF127E09FA3A4278AAF163FD9C8E576ACC5E3282A3F
-2F9167C68744E6D9ED2E5E76A8EDE76E6324A03DDF92E3E329CFC4E2B3C13D56
-77352C9CD47FC2FA1829C03A97ADB39F86ADC3FA6F8F4D171CD2E69D016ADC20
-7F088462E2A724E833B215EC6DCCA694DB9490F00449A11B83BA6DDBF64F6B9E
-4BB753980470E28ECC677DED274DCC0DE847ABED5968EE7E855976820BB417C0
-1072D132D7FB33592CED1661A8D1A476FC179C1636915BE6FCBFAB688EB06742
-424BAE841C7F675E524F376E16FF60489DB9EF1C7D95C50C4BAA18408BE32CB1
-80E85C1BB0F7CCBA1AF6D62EE471EC44EC434C85BCCE76F90C2A9264F9B03983
-CE2BC42A2A22D543398021E7905CE5EFA5E0429B19273C134E0E6629A8616DCE
-24C857E518F95FB64383F4D1339EE65AEF89F9798BE6B5807404B44AF398EAC7
-523815316CCEC391026B9759EF0B1696934C55DBE1992D458927AB4119C939D2
-2C186AD0B2B90951D14EB9333224FF343B0F8DC170562B3EF981442CFB4C71B6
-3041B81491BAA4D0C4BE442586D6BE61C78F64AF199737EE5AEA8CBC6F36919B
-9103A2FA390B8D1955EB6FAC1B7D4FF549AE12562EF99DFE37AC5021250FBD02
-6F2572F2B26D2F29C2660C5F311BA809E8B3094E8EB21476A72BA4FC2A02765C
-98EE0A8AAB56D511B5501F53BAE9EA91EBCE96390CF8C8EE43ACC8704B05540E
-DA577F37810B240AF659A9DCEFDDDA2AED43E7F7059F2767CC9F095DF20E9288
-1BB6488991DB85793C046F4BEAB2AAA7DBA69526E83A1628E09760CFC9068321
-087129C318D6B5A7A10A6D5B465FDF366D8E9C7E418DFF90534393FE1D48ECD3
-8460C02B9A7C98B52B2E9010B06DD9C73ABFB7EB8E74EBA05DF5B4CBF72232A0
-5C8349817CDE593F1856A84B2B7692CE5E831D890C325F96234218B9150C3638
-B5342980C1928BB5635C949B9902475E6CE9C7320EDD66442CEEAFE824146C44
-40F95771F064230C2567C747BAFD5934D9871CCAE206C13F8A5722FF06CF0591
-DA9576A35763476C59F4CFA638A5DBBC21B4C01190A58718FCCA959A501A6C83
-3FECDAA23E59D234C372D07DD420DEF9A0B23B4D0D908B907970D32763864973
-1EBD9CC5A7C53C2098D9A380F1CD63E9AAE74948B209B91F77D1C19DDD26CF4C
-EC61267D2126AEF60A9496E3AA26A1F2A383F2C854D709A60454B193B3149072
-67938C33E570D5149158FFD40D8D0592C934FF2AC5B6E0FD93BCA7BF26DA95E7
-5A381E94CF9C880D4EC4C8915C60B4430469EA3D6706D2D410C10D9E29A3CC0C
-1622FEB7C9F59E949CF40ED21B322985BF448C24D54A7B48A5E10C8CA48F6B18
-A1AD2F09F6788F95D29816A251C19A18953A4EE9ABD49DC93425D90DD80869F6
-858286097FA0CD44AB0B5BDF2A371B02BC8FA4B0A4AC48F111DCE4A32A856EF4
-D10F1B777AE2B9ECF77AA66E3EEB5DC82BA69AB0DB3E536B08E6DD8D32302171
-4F30B69609C9FB9B0F25D26E4E9A8F94785D5D816634697C604E1BAF6C4C67DF
-FF0D2C9847A27440D92328561541169C3AD45ED863C8A094ED14D1BCD713790A
-5E48CB225DC501AD7AFF378CF8E94B3F5A61F52487B5FF4510C1E7525031D39F
-63D9A9F8C81F1A4ECFDB4E3F1942DEBBC6DB124E2B695F6390A2FACEEAEC809B
-80D04EC03B4D3110E93F2A2CE88BE76298F3B2E6CA79FA4240154A41EAF28211
-B79DF626D8A4C541199BB9AC1039802917451967BC159176BB6F1E17A02B9E1E
-9D8D7AF8310F2F7ECBC22DE47F1B9BEEBE383C8B9730CD61D2392496B7239B6E
-3CCE01BAEA37663DDD4EFE1A6FC6D2F053F74FC1FC28D3E8DF2C3929F64DD2F0
-6570C474B0B4BD74CF4AF6B72E5D5B7A079E6B592BEDB76BD3C0584C2ABC4E2B
-0ACEFE33940EF69AA41C721F401460581EC1E4A61F665786B6674D2F0044BDD1
-2E2B115EC28A997E0B4DA476C09617B1CEE6A2283FB5064248D096EA5B0FBACA
-FB41C2781E2CADA452F82097ED5D12AE2A9DD94CC49E90B12731085364EB162A
-E404983B1028EE4FDC7EFEE7A430C715192E6A9FCD67BA58D77B3EC7179418E2
-9F44BD60D81ECD7805566919AC8A1F7EBE5CB882771808F32EDDED24DDF21A93
-EA0A872F229895B9912E65FCCCB6137BCE3E0980FA96AAE4F8040A233C5CF826
-97ED79A163839CE10B23AF1C6C48C37A7BD711DBF61F6CC713E37757D3B63955
-515B692289C3D22EB2D5048BAFF9E63865CC3C4EA26F356A448E4A6D93F153B4
-40DE89E06B98191899E1F9BDC0FFE92AC098637AA564E954937CA4758E3D13E7
-A790C92FC5064818CF1B96F9C6680708E10853F50E012F75A2136874340164F2
-800A9A0F7F7377FCA81760F626DB49D6A9285747A9867F423BF079DCCD22B46B
-D730DAE458E3DAEBED7A85EE3899B9D55965464F45FC4D2D99F766C95B9F6980
-307CF7E29C6465DBC4E2ED023334831BBAA961E4493D917DDEB50D0B69B1A615
-AC19FE6143F7294CBCD9B2280B3DD739D9EC30822183F644FB1F53CAFDF3BDC3
-56135C7C5A5365B3B767E6F77FE7BB353BB137B41B3F3258CF9869FBB302377A
-B2890B01E41C9197EFCE051C394F2206238886D69714E96FF6308772F7668176
-33A22E84871EF6B37F45ACDB7B19201C2BF5E3C83F74A58D319A9EB523F86F89
-C4ABF2C955D99B3C2F14A84E1A9D170FDC1F324C8B2F3DDB868D47612FE0CF75
-0279425A46062CFE4AA23FAE2A4EAA427191F42176DE3FA5A60A1C3E50723519
-FEAC2098A2955F13DC65B855B65D0879258D9BE45661FC2D1388D6670D5BAD5D
-48B8BBE379B90FB24A664A29C66A20BB26C4FA710956765D637B7CAB2F57D4C8
-D1CCBB2C48AC19E1C36E8B5DF12F94766805D0D8886515DA29354B5F4394384D
-6D59948D2B028619D130AB81BB38EC2FC7713D4D4F6B29C4B138467F8ED7DE28
-DF41B3746C00266C4DE9AAC4E71CDF8272152DF2310F80BC959107CF21814A73
-6EBB99F07B92CFD4E167F53562B04065401155ADC4BE985FB3F2595E835260CA
-797059CBAE17FC381AB62786EA902B5D0AAD92602AF851635A6C61B1D9EA8140
-A93E8BF8E24A688A23B4C1EADFF3CE00109D86DFA84005DB0B4E6B9EC75DFC89
-10E92A9AAFEF65F2ADFE1F47E8AF72E97CDB1AE17C4EBF861A7706A3754A6303
-308192CD292B1B1BCD12D1F69CD6F609480CAEF16A569CC2354D7B725C81F7AC
-427AAF42F2CCD1DC6031C0699C60AA4B0CFF2E6257E0FD316A90B9C034B9969E
-D1D25EB23C33FC9A083A84E3AF380B6EFA30D5B825A6FE68556F6C517BF5706E
-4E3B070D5D8F5DC452608180B6A3A7AD6A009CFC3AA5F2A6DC9BD12785B655F1
-DD5D1D6A3F0544D6EC661B9C1BF7B2D2585C0E74BABAE07E453796044F1B2768
-B08111D0FB75F0CF90C8E3B52665D07D79F99EF0435F805A95EE4ED0D9E88DCC
-8D256D7A67A96EF18CB707AB91902DAD348CD514772E0A649B66287D1BF8DDD7
-E1CC998D0B26311CF5F23BE0DE0A7CA089E0259EB4399FFDC4379157BDFD7655
-FC5C2FF95DC94F2FF04C1E465BCBBFB8E3BFE024862D85124974BC6FA083C3FA
-6DF2F92D3978A998904B0A16EE9FDF840195F817D6D40A630463D73F544CA551
-15F8784F4E52B0CC03528CA24467E1C3D6E1CA868AD2EC482C85CA111F814D75
-FC2E92124E29406E92DE5205CF02BE28F64902BDBB7AC3D3763FE78159B4F143
-7AEE808329D91B034CD438823E7736AF4135C5B6A38769FD9DA821E328018655
-DF6412118D8832ABBCBA583A55A66C758A908C2F195092D87B6887E9A5E036C9
-CB4BAEB7EBC74466E5410DD289DFF8DDD5C4ED6D478FC4715E8823264E9F861D
-9A9C9B99514565CA025360188AEAFD7A42FD1F319C46502AB8D81DEA78A95D05
-457E477EAA201F67BC40979F9B86E086C7807DFBFA7E4A2CC0F90D87B2A3EC2B
-753BF0346EF5C28AD1F96E4F5125BE9512886E70A232B8AB45B7D2B8FA190D72
-86A5A4ED1E542D23344CDEE87EB7FDE9B3957929AE3B4ED9E7A407530ED99A1C
-F948E2689B7FF456E82D8CBEEA5FA4D4EDF577D37188FE7B22523F5E7DE71480
-46506645ECF7C46862F4ADDAC3D3F0D8B6D6C962236F83DE4F930FB8B23A0B02
-978C3B9DF395C0DDAAC6417E96A3488833CB7E6FF68F0B67C1702EA81BC3D6AC
-E883CA0953D4FF48CFC6966AEFD6821E5FC91874CC51BD4B98233BD2164AC5E7
-802DCFC0CCA34E4511C4E68D89E711C0CCAF195E9A0E93217C5AAB30BAA40543
-BAE734612E4B74CD1D6D6DC9C794604C3CC678E04F8252678E18E61B292C3C7D
-D02AE8A6E2F0C7939FDBE188151F8F41E58435168E28CB4A3F33CB49F294244B
-69C4B5347D7443959F7267F45894165E735D00CDDB1C34980A9922E097795AC3
-1A3F5E45C609F32308310931BA9C18ACD083F8A63723F7E54D018DFB08BAF692
-4F258DFD971BACE3A13A863A9C951826499A814D984AA870A8FC75162E4C860F
-7B4E459069DB0E5F331EEF074B3481FC2EEBAB1103B075CAD3200E94D080F3CA
-66C9703764BBD33D05558BA4693AD855F67451118798CF236BA060F7539F4FFC
-F3B1E8396EC34AE1D06D51FB678E2FFE110223FF341DA23CE45E58097E4E7F6A
-99616B1A3AB563B342C5FD9DD9B1DB3B9544D0ABD8771AE0A858B8F827B5E27F
-3ADC25B822A6190EDD69346EC9D6460C0BA25D52B906F6E37CF8AE26958653D9
-96E6F4918FEB6DAFC3940E40F692836B8C46169D978D3B6361F720AA33723C22
-B7A4C1BCE4292F85BD581F443813DF12A02C5B460522DB1E7D2D61C79A4064DA
-10BF9B9DF9B347381DA932CBD3B152FEC7F3A0F7AB80593232F091CEE23A98B3
-7AE07929FB8D6015A6CD4B61EC26384966FFCD23034CD6820D426ACE6BDC79AC
-9C17E5E482D61D203126D5E628027130684D2F26C4986904482D6C1589E1C704
-E42947DA81A5B507C31ABAE6AAB31F5AF65E736BF281EAC3D9E6194342B0AFA6
-186D427BEA12D9AAE1FF0D34D52353030C5E670115A719FE28F830562887FD41
-0A5A3336A51F0D752382B07125BBAB85CF54822B0BE9D926A0DA846DD11CA7D7
-94589C19A6B07D977FCCC211BD35DFC09A4BDF028143FD057C3DCD6F6BC34B28
-99A1B03C506CBDDB4D8345B3FA949B8566F9DAA7F958A7B05744C2D8EB7E980B
-6A6A7E92C536995B673E2385F654CDD0A80F1317573730364ABC9463B77E3224
-68E4AAA461806CCE47861E9232A95B6A326B32C429D817AD5A3FDC7B2F5D472C
-E8DE7DD2DDE194FBE7859302BC76030576919474A610E545B2E89BFC30416298
-014EBE7808197B3021E6C000A12647EA7E90A7D835C1D1F815E175B944302A3E
-014B001CB71EAFD0363E6142082DC0A00B0DC19E740F33EA62BE1F8450AE3C9C
-1B184D3C3CE5839A0AF3229D81DADB6D93AC7E7BA27CC3B768A430185172BB97
-EDC7C3EB4B7611858F7658F604C6E411CF05662702124E6DC1A333771B319FAC
-9553FCAEED75C50A05E7BAD92538EBFE401FAC35F5CF8982CDED508DAB81CBB5
-2558C3BF59FCAF06D266BCE6B647BAAD2B0A2A2266FB6A97782BD461EAD173CF
-884F1370C9AE823C85F5C392EE21A7217E603FF66A87BE77004C67E600AF8BFD
-E68BA369C571B42C86C51D15350B9B6ABA774E10FAC7DB98893B62DBD832063C
-93CAD111B5177CE7520F95179DB50F512AAB94E321684F9EA35DCE472E607451
-A8DA404B573B4C11CE658C9E7D1A3AC07F0BF8087A36859762904A1803277B45
-20840FB55C7F523246599E4930DECDDDF53961999A25D2A78F3C26E328A8F446
-C415A92A14A46397CC5E1099EBBDE57A5556887137305EE31399E8E928C7FF3F
-D24B02233C82EA0F0B52F1B1EA91543BD00C69498E2288CB6CD5E8F4ECC2E314
-D463C085482F6C8F8E601A06F069FBE4FE891E29B73A333A4E48F0A384A59C2D
-A01D470DE89DDE5620D6D20F94437CF558D96123D8D451F609CB7023C246A63A
-145C16F1812AB2F82F7395A8F966CF3706B9ABF9D5FF13897930E4D7D697CBC5
-77D3D89709B89D5D83814E26619972C241A654B145A9B63E20A7D7394EEDC424
-3A0625F0515C60D54CE2A5B4D0506B130218A9C83C1824576C537A64A9922DF7
-934A40DB1783C98D9FD20E673CAFF7B532647689F1F2A5AA1C28E2005C1B9A82
-1B4A56D2F77C8B71D9945FF9898B85A0AD49C8079EC601FAB664DAACDD78E63B
-BAA581FCC59C0B23D601216EE8AA69B63738FB5D3A461DBBD635FB18A4CF5167
-45F612C2498B80CE2F8E3BE11BB0F57CB712C4C0570B54FDCAC81640E6ADA1F7
-0835A1B7E8EB31E9DE3C11E0B1AE5CBDEA7645E764A767421B6682839BA8484D
-5130B2F6EE7B997926B1B2600781EE5FEC641DE4F3FD213843FDF14A781D3643
-A267B7ABB5527AC813C367D58DA95380FC828D517AC437603F87EBFA64EA5E08
-3DDCC06BED850CC08EB8C61363F03414F9A23E99BC005124B5C348F422A67BCB
-DC6A5D865B2225D085B249B7A483153FAB21F5043FE55024BB5027BADFD52A69
-46BA5647A04940348317990FDC91DB0C1E493E83972F1CD01150E8A2705604C3
-B85B501748327D9FD8D8EB4A878FFD72A0E8ACD033E03C1DFB35B8B1098BD2A6
-E297AA8E65E765A9D92F7F0E46E567B2F0179EEDA2F674EEF2ED7EEDFFD9B922
-29F72D9DA808D81C312E823E83D506F50650F7BA2F94B94C40D58A00BC11FD44
-880CF8918F7C4C3D6949A7CFC770ED162941980EFB918215F6CC80A7941FC467
-FA3D65538B1DF061BB3B5238126E01F319D3937A3241F02D0985326FD56D783B
-24123E58FFFF3CDCC50E096A71A944C9E471BAC8F2DE41F430B319DD1F7F3ACA
-400DC2C0CF75CD1258E3EB945E42D9870E774D65DC1CB182E9B7D0FAAEAF8668
-84C1077A71E5C95228915EE533BA686504329DE2480D36A0B13501944F900D98
-230D0D0EB3591C23204D9C108C56EE2920D21F4871E5A8824615E3001300C447
-44AF734326CB7C742222FD862729938451DB670697B79CD8AF1B00D9ED7D0002
-3877A35CF39C89B4EDB3BD0BE7D12C0759E8D6A35A241473CA9C9D9F74EDE95C
-8D633B7DB65772E00D194276307C10ABF809750D2A8DD375675645E17A36AD91
-1F85F811EF4D5970C2A11397434642D495F67ACDB0B6CCEFDC74ACDD0A59AFDA
-9BF9194542EA54C24C9F622525E6D2B8EEBCB8F946EC7906E6163517B957F4E0
-C0C50C8E2989764DF98287DDDF2F211F546387494A2A44C68505D7CEC67E5390
-CCE4D3D6CF672FFA80B2DF81766D1F94747824D7AABAB17667485D17F7EC5A61
-77F04289FDE1CFD903083F5CBBF0869F6E5414C4E20D63B967165C9D7248BC27
-82084BA13896A667728B5C71FCAEA6416951EC753717891D9F90674733A05D50
-D5CEFFAE43BB11B72B8F16C855BA5F0D26BBCFCB694C667E507FF94133927748
-5681BB4DACD9BA08AE6630E7A742D3AF1D1DB04A6C13DEA51063F3437A6E36C6
-00D592F06EFCC6C485758AB22A957C6C2EF0BE8FB16621F54EF9BE7150D45397
-9ACEE4DFDA63D14B71B1ACD42D67B9D862F4464F204A25F337736547C0F3E697
-EEA0459991E492FC28B75B25CD8F0A188BDFDA900480BDFE67F172F61A015292
-405A576326E63C87BD7140E76601956826516AE66730E6D57F5FD43C964055B8
-6BB09EB0DFC93F5B78A15BE0B7C4533518847AFFF483F428F7675E7234A0F66E
-D9DC5426BD143982599EC2EC9AD374822E428078E8580837BCED097844C979C5
-9F07E4D5F902944EE1F0A8D339EE814745B4A520794D7F4DD9311AD372559AF2
-D1196F10BF336731499FD3DBA03EF6E49AA0AFE6C99F5DC9C99C8E85B1A972B6
-390176C6B6EDA3DCF0A3334B1971214483D1082789BACA1892A3BD971AC9ADD6
-8817F031AC322E16029C689971D06FF45284C0A6900FF5769B5991F290B2D32D
-1C7156FC9401A11290EF37C41B82B902221724AE447DFBB10F85EBDEE66110BD
-CEA3DF2351DCA1E65C972C81F2B89D6CAD1FB987C29F02970E41F6F2F317DF6E
-CAFD9E7F02D48B5AF58307320C0F95B28A8295C2BC29B689EEFDA81F1FBD52EE
-38057FDEF58BE337072D0462A4AE03F0780EC62F6D8AB4A242EC1534FD9C51CD
-70C3F94B538B4D9AEF1BD8F7427E647B2B8C5E19ECA1D565761531B52935B095
-A31B00B40D07D4E6963399EB3291F47F63C45C5E5E29518D9759E31FCD861518
-DF0A34C519A18B9475309AE617C8A456A4D6CF01D8D4E6482FF509A5CDDE8BF4
-C2FDC963AFF50E8F81E1F644D11F53051AD7303D15E633A5180114F5704539CF
-B8B50E017763CE474CDC35834E5AAD07A931A099948A6C848030ACE5837926D9
-7FD9FAFB25A099832D91047E0BC5C37BDEAE93BA64ABEFC831CB67AD8EC8A1C2
-DCFF7E1C18FC9A6EDF35F7B9642223D82A657245D3204DC8733176E4CD8B28EA
-BADB93906825BEF461B8A29EE8F32CB65D18CBAF517BF1E766BAE940F81197D2
-95A97CDEF6439C18716A8DF5DB91EACE95F2CEC2800D9EE93AAA4F12C642D0F5
-78618A3EAABD4A9DBF0295F5F61D1E0A5DC4FCB513BE81DBE23B733994AE4358
-91668A7683C8AA5E74253CB614CB72A002551865155C3B22CC20BBC234977D3B
-2264187531CB2AB2AE77044D7669139CC1F1E0258A355F8D7E45DB084F43E5BC
-BE11D376F1B040A9F2140904D15AEEA4C65E463AC396DC2F8CF642803FD2CA08
-6106863AD763A5762B413C6098EE985699526C2F10B73D5CF5A5C8FCFB00A75D
-8EE04EAAE2B1A1376AC4659C75DB630BC9D8A89EAC3A41DC65486EE0CBEBA09E
-E5127EBA7F22FB56E11DE85EA3FCC5EF86C61D035D55F8A211294B66ABDA4735
-370C8909D3AD3FB83EEDA6DDAC31C7211F55DDECCE2A76D518EA3EF7C18F1D74
-E551CC3B9718C023C4399B694CE556071D4EEB4332499744308695D7FCF4007C
-6C001EAD49D7726AE17109A8016038E923132F80C75F2B3C850658C69309E653
-F5E803F0F524AF61E8F70E875E79F32A22EF77670993C12431FF2740DA947B41
-6AE7C9D90C7712BE19666080CF3DEC4079B0C05435B1871ECF35ACFE8007113A
-BF7C8518CE4A114BC62126EA623E5138FDE2B573B58F30757BCF3B010BAF8A67
-4DACBD96367DEEDFC21731BBE6A28E4EEA2A625AA682979B88D37528DD8D6E64
-56A2530BBA7700DEB84AB34C29A8402F9FB72E4A2F0AF1FDBDAD266E799455D2
-B5D4D3AA9B95BF26D6B2393B876ECEC41011C4636D4F1FD195E95764D627690B
-A5236BA4154CADD7F34393FC514B1D46CC5EC334E0CCD0CE153F370CCAD25DC9
-F432BBB12D3101EF5B8131F8BBDEF9306FB49444CE206C0D487576DAA936A65A
-4AC472BFD5AE7D4F0DB1DC8BC7AEA924A8ECA1361C26DED2339B427FC6C52A7E
-6FB778423F3494CB50E41BF7DB32C1A0DE1621C04A609CE77F62FFB50180E3E6
-ECD85E92CB4D1CE6F5ED9AA0D0A0C3585968559547606EF6966CCBF98E3AF59E
-FC505D0FCBA8A575AB0BEBDCDB3053FDBDD987DEB7F5D6D3AF920FC6B27CE0EC
-3EFBEF16A5D809F604767C0C07D17F14636ABE98EA17DAE9C9835B780C78583B
-FAC4E38B6BB37E203EB776BBADCB416A56D7762B88F78D5DC9BD94044234C492
-10534455972606A286EF42BBD52005BAB1F5985E653A4C1EA3A22E72CD2B2B39
-D42689D41F5F56304423C3E346D82F39EB4AF398A003FFC0EE4CE90D801C5CF2
-85D7F4A894B2D42A2DEABE0A19749EBFDB6D2548AFB150735F33FF200335B427
-ECDAE0800F8549EBD4B6ADA45A4969A58617617F595E10FFEB0FBEF422767A93
-E95CC12E99261389A80BC08965F9315B286EAEC4E543DB7143353332A8124B11
-B0E1A81939228883986EB56A641FCEED024A10C67BB874A379D3AA3988F8926B
-A351FFCD2E957A06E74C79E17378CE552CD09483FC8945BBB64D67F8CF39E986
-2D1A5B12F15CA11F9DA9DCEB4966C178AB5B1943E9161DD105E62D41D14F1AEA
-EB4999D98815FD9D21013B2689919AD238A66B0B12B4C6F5BB424E44A771484D
-E67B57326A207217D6D141E267607D4C66604192A2B0ED182413F04C37F380DD
-7550442AE3E0F86563AC34FC580CBAF52D4DE3530FE96B2E2869A2784526CBA2
-279C138C1EC9F3016955D5E0FC2DA6ED47D61F837FC2F50A9EE782541C836539
-1DB89268F6A80455724585AFF4C8617B20EBF9B9664712F5F7235A497AC3AB3C
-6917218B2D18E57472F48CCB599C3B4F2892B8157FD93A4B9BD5A719888ABEA4
-914DF3E56D33582504876DB0062FAB1CCA694B9D64A49AFE1EA99A149B6E6932
-5AC364E9095FAE0244E648FAA9A9E1CAA5E94B085671A1C012E267B490B5D2B7
-52379A959E35337FA0C20F589C89C859D37F5502BFA3AE84BB9D81C56E8B6F0E
-76908CD8958E3A1CBBA061DD0CCC833BE7C851A09B341ABE106C619714EF14B6
-DEA21DA0F2822D37E783A765F5BDBFCE8FB5BC8F75C56E3FC04AE8FE03F600CE
-10DA2C120C1AA9C79DC8D987A87D1B1F7124AD44A44EDB67E785DC2A4FD7B5AB
-E6BE85122340D062568D207A8729DA26B92DC7029117D29FF071D8F689F65D62
-7469AD8DD1F5E3CF1EFD2E0157EBA8F41ADC76644E48AC74E202D10DFCA98479
-49BBF66CB748C56FE70202C02B5ECBB1080D6834B8CFC8A8488BE8A502F0C0A3
-DC346A1EC38B172277B244DF4EEC610E50E1FD9C6A45F5099BE894D060160A5E
-7481F3AF11BE4A71C49C4E089A12FBBEE7297360CAE36E35E6CDF16D9CAF3A24
-E680AC8CE756D3C945BBDB2139063062C9C4215EFCF77F2E7B2565F0A0ADEDD1
-F8FD0C4D7A4C64704B568B3BB66721D105D3D8A8D814CFFB5844DF2B3DEFEB44
-D3CDDAE7642EE75B59D780D7490EDA093D13833FF102AF7A186EF8F2A8770FD5
-69F98F812B29024DD4BB8F5FD49E0927E8202BACD9F773A1D4EC9E4A2085624D
-A7566081270F322B2642CC758E2B5CAF0432E78E331FA5BF0E025B953CC08833
-7E80E535DC3EA12F6D8B0E73E354E3B358633139D5BC3B37102271A2AEF65D8C
-DD0100DE27C285D228A4391EBE70428C4974E3BF16237C503BF9F17CAE80B5DE
-66630F26D6082728D84EB505452ACE002D3D96A3CE36F0B7DB93B6AE1CDF773F
-8EF4EAAAD384E7D28A0C499CC38903F7EE1889AEDFDDB6FF180C2776BA7DBC33
-975B0BEDEE2B02A6E34EF65AF208212A1BC47794823FBCEAB57E1DE0D5B4D132
-D31404C7E4E7B7E8AE1B8A90B078C6565143EDF7C86EA974EB2D84154C293EB1
-7338C5BD8F021D40D29F646CF31DD9AA14BD090680AAC8AE481099F316EC4749
-BCF5BC65E7F9A4F856CAF3E5D3CD9B06CB7B64DFB5C439CD92E4E1D63D829701
-2CED8107B4FB6A80E8DEBED078B3540BB5E055250FA529530B0B035D749AAB59
-B2205E1E405363DA6C0B16BE5D41F5FE3B16289D983B44BC6D3F589C4477F592
-3CD817EBCEAEBBFE6CC9CF1C0C94CA39E7EE2029007893C40CBF694AA88BDCBF
-A0499F2A22760B4FF01EA292F9F2BF0060FB72421B5C4F92D132BF2FEFCD5323
-435ADF9299EB3606BBC7F1DCA88068E9A8296C020278C65CCDB5FB0D41433326
-D85B0590D0B4594B3B6897F8F51E56F8882FB8F37DF7BCBD41509233297A11CE
-368FD4911BE32552CC2FECC9A98AFAB72B9CF21062B5B56F37E35457E6E27EE6
-9EA25C8B8933E38293FE178BD91D18DE69966E068DFB263CC22392F61D765538
-DA54523707A62EF8DBC323983FE398F8DAF8FD95F26F4032AB1A6E3EC76AFB2E
-1279A60B8AEFEF52DFDC605DA9CE091F24491B7BE41177E2872A851B4DD614D9
-5EFD53076DFC5756509CACA9E69EB0380634E586E9F06B786609B625022AB77D
-97922B1F2DAB9DD033BE2E11443F24F0FB85EE66A1985DCFF9D8AA93A11D0AF3
-9BF24E33FBCAF72BC85E6B3355F130672F0630B8A1D258718EFE45A51A522F66
-DF6D779B654150041D8F557A9565C39FAF1EB01153A8ABC4D05524A4FD160551
-2E09A4B4E1B446F5C944FFD0B770F7DC166C85886D301AC3483BC21496B09642
-A11915728923B01957241F7FBAB8238E79BA49B49AE2154F71165EC8EEB62298
-578BCD5050EB474A56839BE37A67174549EBC4DA422B4360D50797BEDB115C85
-3C3526FD46B7D1105428B68AC52680A53320AF24AA12D793D1F14E2560635501
-85248DB2F251DD3423D6C6722A1F354FFFDEB5006B599D47C7CFA26CF96FB4B6
-8057F2B1FB82E5119BFEF70384997A19DC261F62CEA0364D93BEF6DBDF85C5C7
-8C515EB0850D909744DE8720060FAFEC8F4035C3CF065BEE291599C5B82410C4
-ECDCA99D957871B1485E028BD5D837EDAE9EE2615F29047407DEAE94C05B3B4B
-37EB9B774415CF8E6D759908FC40CED03761329355416C055C21A529F0E89700
-ED9136B16D9971CF1A0299D3703BDE044A8FAB6FA4CA7D6B26F379211AD70C47
-A8280E919091DDE0F9F2C9D4303CCAA9DEC9E6A41799951C6AF62F0DAC1123CA
-2E3FD3046438002673938F576A96B2BED3E5B2FD39A969B638C1FC2BED379380
-6B86F68A2B2405A010F02B796F60D10AA97A835C6733C6E969CACDE2194680B8
-D76B78275EA088E01E67DFF1BD081E5F9E7C3DE17AAE4CDFB4E4FF98A22299B8
-BC3DA60C4C02DDE93EE6821A8DB3DD1B17022589A333B7323509CC2AF888BF6D
-EF902CCE0D33FEE46BD8A476D27C3DEA65F6FC9799B40391544B8A42AD5591F1
-3E8D87E933AFDFBCC0DB880385A86AFA73365F6DCA9A1A8836579FCAFA0ED18B
-7F2A42FFEDFD233767B7247455E6D0CFFE193B5B6FD6EE0273A32DA45DAE7189
-96A2FBBF5049380345BE379B84997C0C7B72E34791FD65E38A44CE1CCFC98ED6
-D1DF926C4455FE7FCB544D687B70CF416A547D94A84C9DF64A61034E43106093
-23A4FB1754E274581CB7D01871A8E00AF352FAA6C1B24FD27343157B5B2709EC
-625D8F85192393C682B739EBF65FA47BC8FA5DAB1828F4B0F7699C1EAEC74E55
-2645C3E7FF03710D24901FFAAD7BB14A12003ED61FBE2EF0EABDE9B02FB9FE16
-E0638DF3ED8DB8A0DF8EE978368913D3011BBFCB8DF718FBB78BE8C0443EE4D9
-774F5269CFEF93D57667F09BC73FC37DAB996CAB3CEB19BE1966BF7735F5D8AB
-6404B66C3760BB3AD191DCB23AC2ABD884D833DAAC88DAE232218AEB006B40F9
-9C0BE61B420B0EF3111AD76CD972EF61CA05F32C450D30AF955EDC63A3D70EBC
-D76C66F83B7E61A149FAC77884C78494D576043E0C44D5161E29D8F482484494
-395202D50B9776B54A9944F80AAAA81E6E3FC8D6FF478923E4975C8B591C9A0E
-094F422FF675A1C04E736A827A6B42C8C91AE861B46F490A77118ACD7496C339
-1A2E16CA94E34E2C61245E5D54DDB5A8AFA3B0A0C04F462057BD72FBF9CC85BF
-98808D73A036C2EA1DC6DFB3C98239921F322C3C3BB4B05952D9F055466EC977
-648752A0E9F8C126BDCFE2DDCE5A85A5B57685F3F534A6460F8273F385BA690B
-FB3EC6F19B4DAE1DDF8E3CED5788350CBBD3832EE84588184C88426D82687614
-42B99AC324BB7D51D716B0771281A3D209AAE3AEB76DCE73093375D4E9740244
-87C7117DF8EA6CC7B99898363B1B407C0B5CC18C597832F1557E154C7D4931BA
-79BBBAA593F473218AB0D1798964605C02A2A60682289BA88115781A36E05AFB
-213DBA60AD771F9D9C332EE58CE4104B4E3213D6C5571D09F4EBA3D85926989D
-A8E96D143CA0364C780556E59E39914E4AFC988A7BC7B1EB352D02F753829F5A
-C6EFF13BAAA37AB5A8B62510D0DD373F5C0DA7DCCFEEE724F0D7862BB73092D4
-55C7E0FA43FBA607E4EDE16CE1F875571DB09956D6FD53FDD0AE47A91BDDDF60
-4CA2129A9EA729D41264A039D4B841E207BA5A2E8B81F5E866F7944E2E432C93
-BEF83BEA1276266B1D37C2345FA232203536A880BBDAF573B7CE9855AB7A2574
-0D58567235EDC86C82D073B8AB94BDDF7B8FFA4821791D5E68CC0AF581773F02
-4D27367C2F3CE426E28C2FE6C238BEF5F4277111F624F1FB2C0332D464293AF5
-81765D8A0DC5B50915DB1155A0453F1FEC0D432FC5868F5851B888E4F1B7FB08
-9D12B61C3EB0C8FD63D92725F2D16604E12E3ABBCEEADEEAFE7368EC205B4861
-3896CB2A9CC7CD3F8D345BBE5A0B2A96ADC7D66A8A241A652A247F555BAB37C9
-98CC5C16F7E6C59373C15C4197A03A43609D1DC9E210629140F440FBC85C4E6D
-F120EB3E2397A760A08C8825E53A5D5031C3E200CDDE60A29992A76E3D70115B
-809445837F16E1F30BBEF48DDAB6900107E371318BC7A96AF47621872ADFE5B6
-01D78A37DD12EEA29FCFD3E9E1DDF86379280062D1D3A542A3210A79618702D0
-5D8A2707395A5D78C698C7FAFB0D1345D977278210E75FA8A9D611242A07CE8C
-7F68E96AF1EB5A0A9EA7A73E044638639BD0B1E0F4F2FB669DBF6F0CE59747F4
-CF7DB5F4BF5423900AC729782077F36373EA1815BFAC07B281B4D4460F583887
-5FC0F99FE28826783D5A1080F5C8269A54A9C15D787ADDD9BFA8CA0EE94E292F
-4F4DC1320F29C6EE65A2D222C56F468D80F96153D2B57D83FDFA444D34076F2D
-6EE3FC065A7428452AF36B19A56DE3ADC2936E1B6F6DAEE66D6B577F1A4B32F7
-4BBA61620953F8457F7AF03011B76AE28940FF69B61DD4BEEA2A98999D335595
-193A8189E521588AD09C7866E86B52AAA822F1C58CCD30A67F2CBECEA8126582
-066967E4DEFED674CF19BCB9C1D72DE685D8618368A1BCB59FF49721A55275F9
-F1F8A6D5C58C232708E56C8040AAD633347378E7F60E30AEEB95D9925EF69524
-AC0348583C29402388491A01138274792A1C728F6ED2ED23491180AD718A2B43
-7F7691C09E7008ED1E8A49229F41AA10719339CA4EFA44FA24C6D1393ECF41EA
-7A1CB96A8F4EF84305C9999BDFE0684EEBBB3B3A4A9498D89F3CD588D31FC00C
-6AEFB7EB9650C2BE752B819D2B68CE36D79F538FF203748B6C491C51610F04F7
-43BDD86DB26A2B905FB8E0601EEA9F7CA1E2B26B005AA8FF0D451D4F45C3E6C8
-22B79AA3FDE7E7D95B91834C3D01E94356BAA6164229AE7A3F82455D457F2EB1
-DBA0D7FB8F79EC435B59F25EF6F9337C635655EA13A8A04F5073C3B6353A0004
-D9D85D824BE17A94612A3559685A42224CA59A9F55058BBEFDBBDA5CA519451E
-DA0077345ADA9205320586AD3B5568DAB951D8C2F998B0BD8C1C01D3270AD982
-2D391EA3C8618293FBC09582F21658C8EE2FDCB9EC7FF8504ABB9D5803483DA8
-A31D985490FC989E75288C5E8EB1A3CFEE35777B2C64918AD3EE6D2FE5F13B50
-9FACA93C0645CD9BE90BD7E48CFE25AD2C6DA42234D7D2E9DA83A0A0271D2110
-00B0A9E149392AE7072ED5D31B088F7C1E4447D3E5423C29B5546A26B0D4C1BA
-7B8CBB26BEEB492F6EDA6B03429598B28FCF3F27AFCE1DAF8E7CBAA229CD836B
-DF8BB45825DA2858BF9DBC9BCB30CF660C7FD418EB3D7ACA2BF3A38D304A38F2
-127937A9296041925BD54796FB2BB1B01F0E3C7C4E7304C87C0CBAAE4CB713D3
-69A10398CDF5C40E43B301BE17F0094EFF2BB3527F44C1F0ADE74549FE2B290B
-E84B679A4B2D5FA09ADBA16C14EAFAFFECDBBF13E9C395AD367EAC66697AA240
-DBCA20F6F84CECFE2742FA6BA9E9597B65ADBE892B4747F4C0C59890DE22391D
-469AB1F8DB6B962DCB4F3AE6A8F7BE07DC903D0D6C1C00B1A06B51B12A418720
-8B03C294EB1336319BD0960040AC293459EB6EE4562BA6ADEFE9838BA89305A0
-20E11073F479853A856B3F994F717457416EADE555F569D7F9024CA0D2486BFD
-BAF47F3F006B149DFB328E836C3AB71210E42A1269A7588CA3BA2FC80FA64B42
-91B01A1D58CFB9A2125B161988E7DAA519907C73843EC08FFC502022034ED1D1
-3A27F57F94FC6E57F7B24348D66D198C48114E4E936EE6D2456C5D61FD509182
-A18BADCF9F6014823E6915885273D91C173CB58C1962F640668A86EE2454E318
-F5CCA728BA2035EA749CC674E832B90EE789BC9BD0D93959B901C006D4A57642
-36ED92B5AE29D8BF29BC8ED3011D4E2E1A180CDAACD9679D95F3685CC3FB907E
-53B1FB857EAEAEAE33E5B87F1B53D7432258055FE02EF80351F8651E169DD121
-14654E913B701564C9DFF335B44EF9E7C34C891E8D5B4DC8AF49F1E8AEF69C2D
-181972F3558AC3A9EF3649C5A8F62DDAFF9E15B8540AEB5D665FE8C58A7819D2
-E945305CF8414E4C82475C6C7EC10365322E0D1251AB032D2B53986AFD68F5B0
-C2E9BB2BFEB6A1E1BDFA8DBC4183DD875B6E09D9D7653C97569AF9160FFD0177
-3D23E21C59B0330B6034F8BDB5854B6CC73463DB04BE06AEFC170A9A0E356537
-99877948CA4CF92F1B24267A1BAE1B5EBCC70D92CF76D63CEBB004B77151AE63
-BF957222499C82FB04A976118FED7C15810F7CAA98C17E06CA6712F318405E8F
-E40CAF5568AFB6464B10B409178F6C2FC5F2E1659D5370004D8319B76AD4E24A
-EFEDA214690C5CD3E0281612E90822632770CBCA36CD5581410F0BA737CE5581
-AE466B3A4DC73EB951818BAEF2718749B834A3A4C7A7EC08C123069FBDA203DB
-DFA7B49135B6C7872B51E25F4210F282BC6D6F429C14B26BAB2090EABCEBE2C3
-C2F58AC82C68C557C63CB2B4EE2167F7B52B444F917DD54AC87D21730761ED32
-561165CB25CDFBD83C1A718BAE119AA7331E7C99534DC68AB0996A39AFA5237D
-FC1007CFBD84917E667F53A49B1BA38998F29056A0E8972D5E6CF04456F63732
-6B0656B515C865A55E7508BBABD5F5AD3F3FAAE9C2081E2D32E5DDB16C3B4ED9
-AB0F7B3A0929E7775B0FDFE576E15043A3A9D61434FF0A5379C2266BC4A898A2
-A77B5C032629C85724CC1B91608539A0DC2CCF7DFC55021C75350C0EDDC79D50
-0A577F2F2960175A90515EF6F58771CBD2D7DDE0C78AC263AA2FC00F57EF85C1
-50ED7C5513B0E7960D2AF0B83BAE0D9B696DE437ABDE36D128B618B872AF1F6F
-959D1871BEC575BBCBE847622031307858B24B041DC8D4221F1C6DAAFF7AFE5E
-C7064515A0FC41A267943125A71F300BEA8175B85668632CE8D65D99C75C3C6A
-3CE8CF0165461DAE6E57B5C92A2EF499B3B657B887D05F8E8B56759E23F6807B
-8B3143BB22299DA9DC600CF907D983E4EFCE3DCB42275C706E1A7A2D47B5A9B0
-F3DC3D3B279ED66EB955E2ED9E64F660050A9C1629646252924412F639616A27
-1A6C4FFF63BE6B0B616751A5A80154B18BF152F53D153FB21A6C269298D54774
-38331BE0DEB93A3D42831ADA931C653006BFAB39162AE1D97574CC0ED7BF5C44
-610F6C618178CD9BDE88E101BAB5F278828B3622EC01DF8D4717BA72F5DDB4A3
-BA3EBB687C866EA3405D8C11BEACC5DCE3076FC8508996D51DD1B2AE89D37B12
-83E11FC3E41AFB8B497F676C5E1D161BAFBF18900D50C03CB6CFEFCFFEB649E4
-198F1453DE0BBD03ABBDCB5A075CF618978072C47C3B4A24043B687BAC3AD657
-3657A9A9B3813C2456D2DBA2D910D7DFC0B55EE4EAAEAEF8BB07204F0F537CED
-B8F67C2738B5456BD9F0F22C6E54EAC7CB905375C915D0D662060360ECB10C10
-F30039B9A5606F671E0EE132C5788655E4671F2E79D3AF39118AFB95EE5FC061
-BDB869E0CFE549BD106EEAE8EBB6A6DF727FDCE35F0375E95B27DE211FE1ADC3
-90BB092E442046A7E5DC902CCC3553CBA4912D989ED8261539DE69A871F82C99
-06282FB2E8105107F9B443245FA74FDCD2A47673DE6E2F631D3918374AB6236E
-792D5DAE1C76F3FE6A7C73346D1E8CB2944E382E7C31F99F6BD5029DED9C3E54
-984492F4B99F10FE5739F6D5F6F05426991B8495BA4B8B21002CACFA1FF45A51
-6B76D1469AE3874D97517A32B9BD998D2E4590862803544E33330BB869C5E3B3
-60BB9FE9B9756D3FB048C5A01A25B39B8729506D0F392350136C3DF46C9BAC76
-CE450B346A274AE22058339C6DE92E6CDFD584F421756E17ABD5F5DE2BAE2D7F
-547DD3CACC6AA10AAA3BEAA1BE9651527E3B7CC5F11737FFFCBC52771819DBFB
-4E6D3E71EE6C4A0B24AAE5988F828CB5392821FF2195D3452DBE0408D0B87669
-C6A630B6C1E00D0F1CE10F1000310B9E177F6253BE09247DE827B97FE02F2413
-AC5E94569BAF3635B4C5936BF1434FD7D5971F6286BBBF3102B3CFD68AD25993
-B69BFA3C89F4F4C777BBF3190D1295957F9ABC24BC147E8C95202A6CCE6BCB05
-91B821B1A27A398AEFA3A22ABFBA4227C5D0E0E138FEF04391E39C66870A77DD
-5D2CAEBFBAB1C5511BD62849EE9963D536461C0693074DA942864438278C2778
-2A49489EAD7B43340ABCF99A71B9836A696995C6A459740D58DABB5AFCE96C08
-B03B0D403121744ACC6F475E194E79A30AC2B165BF302CEF914D34777FF1CA88
-46EF2376889244CE73C9123542D3759DF83B3AB2F8E5D4865FC242058AC4C337
-96E923EFC4FA1F23800DA6B51D6187EF9F1764D15FC343C5989760998C65C642
-C4201ED35171BADFECDF52AC6CDC58A0CA988E44FEE389A599BC59395969C211
-DDF7969C5922950B0CA4B0D9C960AB1E16A60BDC44B9F90D309EF1BFDEE1949B
-87B66449FF949F1B935DCB7B492D4E1E805167B9B5FF1454AC7D5409E2C8BDB6
-13B3DC21A3A3A834A64BB9C9FF803E2754EEDCCC140AB0D8A38A4B04F78B83EA
-7BDE25812DBBF98994D414F49D560B38FAA060E1B8B5BF985C04D425CE9914B9
-6EFB14ED4DD7C5F5CCDCA97EC2AA2CD6994A140004D12F7EBE5DCE90183592A2
-7F431A2AB72AF8E4F462C020B3166583C05F3A1363CBBE68DBD024ABB7F99523
-E89696A976C173D373E4EB4B20671F010F1F7A186BFFAE0152A8A38F0E41BAD0
-8543042253DB5F848324A27D0E681FA810AFE80151BB2A7A97594377ADA7CA6F
-58EA91BBFDE300C547F762D6D0696A4C1A145191F410B6B784F740B8E0B3B855
-56613610441A509EAE3F7585272FAAA54329831524A5079F6D78093B3EA3FBA3
-12B7691ACDAAC0611499FC658DFB64A1A7B0D048C82050D8912491FA1F5AEE1F
-E02E423A89119C25AA0F89EE27882697E60DCC0156A721528E4D449AA5B9AC21
-9F1D343CA479DA22D4DD4DB7EBDD46D7985428D4E799D9240AD52ABF2AA64773
-D4319BAA29ABEC21172CAA7C0761F78756D3C72A0C921EB3AD83A850FBE9A583
-EA1F219428A23FA044BBBC6755F512F7A8996DD7C793CF8BF7FB2277DB8E28DC
-BA3CAA878C7BB8D04343B7B9E4079EDD1ABD862B8D65FE1E305BE631D3D03700
-EA13375B58FE76453947CCE3A01890CFD4F91F5ABC705BBB15
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048033t.pfa b/lib/fonts/l048033t.pfa
deleted file mode 100644
index a56b5894a9..0000000000
--- a/lib/fonts/l048033t.pfa
+++ /dev/null
@@ -1,1267 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans-Oblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Oblique) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSans-Oblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-219 -211 1101 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078989 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D831E44DCA3B6490FF0789
-636294029DFFA55E327982DD4A2A67A6FFF480E29F5A881EF13E768B43D431AC
-37F159650C27EC72157C59E1AA122FF145C863CC787E9A7DC23FA008BE85711A
-EFF0F8EAC9648157D8211D40578588623322CC38EA02A3880326DF2645BD3F64
-08412786DCE5E604A2A62FBB694CCA1E173447AABFDD315C766BA891E3D75393
-437A58C7BE654E8B56EB2FCFF72BEEB66DA88A528F948A1278CD8C27422AEC7B
-96BE8694A1B33CA185601D99A08AC4905EBBBA42E7751122791E5150EBEC7423
-ECD39B2D6D6A8D2A7B920E68E80ED6BEE52083684530B8484E6475D0646EF488
-BB1BAF858685DDA12D8D63B4D35DB9F9E5C0459001B27DC28E98E154771B08BE
-055DE6C18C9DBBF7892717EFE2F18DAE3B714528DF55A9BB6DCE3604435E4E82
-3567F359CACC0DFB39D23489E75D582DE8FCFDFEB6DAE957065CFBC65CD52E90
-ACA6024498AD723DDA921826B6303C7AF6121273B3C87372CFA8D6D7A2F23D4A
-3B217CE35D2546E0B4F34A2B53F780AFF950AF527184D475FFA61133B9E1F3B2
-8612DBFEB7D7ADE93A68187E35865E23165C9BA77C899A309DC736CE27DEA6D4
-897D93B9E5FAB92EB8DAFEEA2E1C8A0D4EA9820860F103331EEC52FD564F17B3
-A6998015B9ECBFDCD47C10FE6B1D915FEC61720051C587E36D4D4C4BD30DB959
-8F0D1F67850B7342E41125F0175B287DC0984BBA8870B2EBD237852E12869412
-D864BF76ABAC386ABCF0D8CA91CA842D6D4F8450DEE0D405DD7B5965F69B0B96
-309E02CE3CABFD2038926DB8DFF48618F83DADFE43C6759F21487EE741AE2E56
-ACE575512F6AB199BC9C0098A082D4D4E21BE5F66A54DDEBB6CE8C00DAA5D92D
-51C6C0CD9D52E07A2476A92BFAA6DDAB6581E5C5F83BA2385B852FE2367420BE
-66C7455A817DA5D1484BD3EE124847B89F1451912F4A759D0AA87D1EB408C340
-D047831847B5DB5C943BD2D5EBBA1D959BF559D2BDFDBB69BA0DAB927E1D428A
-C401BF5F2DEBFA016CF35B31F5BD00883043513928144C4A98A745D08D81478B
-A5733CF67EC9FCE378C4940303BBBA71CE104B525874E93DDAD5ED06EC4F5E8A
-917C2E46A4DABA795E3F72FBBDD96C88817A501BD3E639B0FA4581782A249F1A
-C62D58ED43C26BAE32FD2E592631D9336CB4D957105DBFCE2D22586255E4D643
-A0C3BFD1EDDB43B97E8615FCCE2ABFF8EAA14702DD7E5D2795AC181014138B5E
-314121F572A72E0EFDE33814F6219DEB0B31AF67F655FA5B1C28DBD78E322B96
-A1DFDD81E3F75EA43A7C1BC923344774F9A06E8323CD1C5A3764C98A95F78290
-C66703AEEA967DD717B6C11E2BFC4CC966D38D7CC05BB9FE5B98A59D0321BA6B
-908524F664695D6C4AC6D36DC0650E792993B3C8BF3A5F9BDCF1DEE23469CF3C
-9D174083F0666A94DCE183EEF39AED664EA96F369CA87C365BEFB386FA3D1C57
-855BBEF5FB778FA0D16EDF3BB714C5A0085FF924036170096886992647B0506C
-19AD3E8183E108F85F22474EEF2FF1C792F900A7DED01E37DD0A0E5659BF98CD
-FA278D5DBF3C8BEFC72FA3BC09B646D5C229439C3E3E835CF60BE09EB8DABBC0
-76DDBB693716754E3869C0FFBB425A3B33CC88681849B22F31CD98FC1B7EBE30
-76657F699667B51B1EF8E3B550CABBCA69BBD090C92898AD9834772DF8465C42
-4856D3AAC91A29A3B67206EA3F99A19DDC78433464D8A6315679916C4CC1F66E
-F6B43EF15FA032F4BC45336D4119131936FAEF8A440BFDADF0B6F076DF1ABCDD
-C3579F02E2C40EB55CF31782D8BB8B070C3BD4F48D0BBFCF331703851266D535
-61FD82D986F1D33C5CF6A9EACAB25D736AF2A1BEEE35A765BED58A75849F0068
-5210A5E110BEF1741A96C2FFC63C3F9D8FB305820203C1B406F3DDB54D869961
-E034946FBFC4D184CB3481693C579145761951F7EFADE27ABB4A0003847AD885
-FE585EA13987B334332EFD1A958CBBE3CB21A4F1C61AA81465BD4F524CD99E79
-35297F71EB9CA7C9701760857CE95295B397976516378EC7A570126DAF1CA3A1
-5095186DEF18373FD55DA596EE7688D86A367E02FCC0A36D564BF7DB6B263546
-79F4E1276EA549927A38DC8383E8FBA16BBB17CFC6B2833C90959FDC6B3F7266
-32F177624A9E26835C7C0E2FBEB1656E246C8BF4EB7803FE4AB0F9DDB77221DB
-E4F134C8304EB13D8AD0FB57C4766133AF879DBB7FB52F25A555FA74F145DD3F
-65990835245E26480C90E25CE74A249D9B8388A27A4BD2F63D72E383BCFF0E08
-B9EF146B512522DC267836520267ECFD46C68115FEF3ECC655A1FE092B9DBCC5
-412220BD4EF12017FAB9C51F198725E8F225DBBED24F56239C558D545D353632
-415F5688D0A85519E8AC25F27E20A4F7B903F62D9D2EAEEF33ECA60EAC68E55E
-2A50DABEBCF97404687089D2B569EF016DE39DD953D7C458F77FCEED17ADD98C
-C6AAA67F4F09E24BF7C24968B44D1B489726DC2E2BB3C481C676B3BBF0E623C6
-E649C80370023502121070725DF295DAA8565F5771AD8E8E2C82F96700D896C0
-CEF869F7EEBA4D2DAB7C4E455C10EB229AD97B669781182BDA58DF962823F597
-BC8CD6BDEA739C255CDA232E4B2256815DE91D09CFAC6FDBD8657BD9DCF730C9
-86315332754F25B6B3A913D786A2AED4EF78083F82FA1EA8EA16C0A6CCC6533A
-0135BAC54D05B4553EFD04D1B5BEC10B60E1A621050CED2CAF978B057225CF30
-2322C543CE420CCBB0A24988653589B431FB84646945114A37A6780BF1DE812D
-31E82FA08B4C0716E17F6831F4DBCF7EEB127855B88494315A98C578B5C5C03E
-151EE2E561D90DD354E6697425A49E5B5ED079FA28FB845E4ACF4D447FD0A560
-5BB8D71BCDD40F657184F0005B40C2A51F9C0B3782B8B984D0F5552537C37BC3
-5864EF3457143C4F36B42E59B27AFDB623EE36C82EA73A1DC27B52E544702659
-AA4073FF40AC396F1B2D19E30A4A69A1723A5C2492BA056DC1B7D04BD4331E99
-B921369A7E502808FFF67C468440ABBD4E9379C0FF2893D2B9E96F32F9E2A304
-BBA87F43DB45BFA9B221EEBA8F65E0D97385485A49FE8C259000C6E2D66120E7
-492347BFA4021115140252CDB140EC68E2E404C35FD2BADB2A27D36BA2E11F15
-D300A92DB828646F12CC677EEBC545630FA2A8046E6AB14CAC5A6ED967644D32
-D0D915351D39913CC43E4C2E379C59762DE62C190657A6AB262F4D2CD54EEAAE
-6305BDCD3D240FD8CC45CEE4291D905C01C05975FF24F77EF6DC03471E9BB834
-AE38A38225342FBAD3F20E3AEE82799CF60EF345BD46DBB56BA7217C1C887F89
-581B6A9BF199E4EF6B9DB643C2D0089E0AC0DD291D4C2A0752B7944EAE45E0C0
-A3CDCD4D5266C7C8FDA7D5D1F84E6C93348CA767108DC279D961CAEF68F8A496
-492D446DC08D83A60796EC823C1BD78872704B08D9FA16094D274398B4B3CEE5
-15504209BE801FC20D7CA94EF3571938E17168A44B36FB9674ABD86A83306CAE
-D9EAB6D8325852DC6B10D798B95E56EB8FA973A2BBA555000D71F7D997142E36
-A93CBC654CF5966B93D599405BB73E5473EEF6B961452F14E0865F44FFBF0797
-C5693895A9E33620B85DFA530C480ECEC3D773DE6AD42EAAAE6ED9DDC951533B
-635E40FC95A015974764B7626C71A9FAE2D672B158BB1557EB24EF575ECF5FD5
-3BDAA7AC6D8A5FBC83AA00F45F1007D1BC258AF9A672D9E103A74087C041F4CB
-911F8DA6BE3CEBA90F205384E9C509E13D7B2B47286F459789FD24A838DE07FD
-ADACC111B894CE32BBDB391242AB4FED699F01D3CD324F1627B6C6734795D322
-D9CF128F25DFD154B79304FCF80893C922859143320D0D9EFA15F2E03465E5C3
-070D93B1B8A13271D90437185C6772A7B3B87B196AA179FA45E7C0806AC25D21
-E5A085A0510B197C7A5207F5D56ABD5601CEB6D079BC26849DB73EBD4E3C802D
-8BEAFEAD9DE346E7AB231F70318B1F0238C766D61943F81F94EE771042743947
-77E4A94D282D61965A8C2ED87E8439C080B889BF255B92FF7B61975A1AF63EA7
-DEAA26B4F0E843E7F4A3EA99AB6FCC3D9EAF6160E3BD2F4354605EB04DBE558A
-A52FB6D8DCA009DCB6C601B876B742AFC3A23E15974F95967200EACF37191675
-2612AED74EEFF9AED8C10CDAE9EAC4838360EF1CA65674752F40B025A003AEB5
-A5919B705EC58109C2CAAB41D8776E02892099B9092A6D457ADBFDA01E85A140
-703575A7733CB865589CE31B02D11A0C00A947CC9D9AEA8BCB465AED57BC4ADF
-061E66BC22D032CFE50538610836FC4AA481441FCC43007AC96BEF93EE9A3A34
-4EF8100E7DEF7C6A000FCDF5AE879D1A8DD4DA585C9A71303E43D48B16FB83F2
-FA5C94590FBC5EAACE4B55291AB239B5DFFD8ED7C872A8A35B0C82EFC57F42E2
-93E4A0A517FB12D9317B6CC10A2627CFCC61D350D5D0DA9E5359D97B7EA1321F
-F63B3991C42F2CF06910322C780E5F47AB64AB236225724FE7552B9D20B80758
-0380188728CC0D3CDDDB0EB24112C19122DDB20F74117A55EBF797C1FB3BDF24
-F2008D619DB7C4625A4B057AB3BBFAD0DB7CA7BD269E30E23AF79F55128EB072
-F1230F61B2F2335E4552933EAA4E2FDBA83B68C4B728BE38FF1DE4D3BF0E9E60
-B3B1B5DBB32C20988804C2F8AEC791170AFC72CB1314B80CE56F3F73A4E660CF
-A37AC1164AACC6E4FB408F222758ACA11306768B9563D26ABCE6712B5A8D9C52
-DD6B23BC73ABC37DD6FE71959ECC1068CEC2F7932C3097B97660938717DA89FB
-7D5D36DBFE675083324354982253BD5397F872299E6E1CE7324A65ED0E36D9D2
-F4D8782C0F73F85442E0363D3E3059AC33E8BC80164D5DA72D5C5A45A02552B2
-EAD050CAE6B0568943DE1A68599EB004B2915CAF6A1CF0C847178CDAA1A1082D
-A67CFAC77E43F21E5DE0B4E0C67F59113E98AA0908F7D84B4AB5E52BCBF44D2E
-7742591D365B208AE0ACCA84DFF546069D8D3A8A7007B09AEAE51C00248BEDFA
-48A4D06B188A51E9FB585694A79377E1F03F685C1E901D1DAB35E37A3E4BC240
-CC1203D603EBE53891ED663DEECA562214DDE8A6FD4145CD70D5C11FFFA2C160
-3E855E6F51F5702C127348920EF8128B32C7F355C491392075143FE94B8B9B9F
-9D692E4937B217E4023F20CD7E215EC36AD550FE802D12014374F2B71C66491F
-B36A3A167BD8DD66B5AB2209A161E45B377CFB13842198736A301B6032E48B45
-89C83613A7D8EBA90E721C747C3FF4DAE1B0FBDC1832FA1ABA7AB8ACA5AA0AD5
-3EE07D977E8423EF0EE73FD074BBF9BB333107C8CB8EE34C6453A92E8F00D97C
-AA32BF9D5C29794B97F94B299F2B256225F83749D1804BE657C1AAF393A517B5
-A299757B0DC2927975118FCA733BA8D1AC62ADF30D850F2F0D15FD7CC86DFC9D
-FE51B94E5404FEBA90C39EF938AED93E3D871780657B4B3B2089CA226A6C5BFE
-D558B6DFD466A8AB3FB9B1EBF7DE20A58D73F7169F9C3D74162097245072EA76
-57C1E0CD95A52F20A9696CFB3A0C9B5E291AE98EAE099046459FC79DFC035FFA
-2226C3484390AD5453CA6AF02EE6EF557D7091197D9D6B4A350268EB383A0E21
-432C9947F0406246D8F092D7B4E66C4F26022F23764C5FD368199A55043ED876
-DB5153DE7AB4517BBAFE8C7E2E5F9A8009953CC190CE2FE17D8A4A9F935B53FD
-B0A7E99E95890FED19FD4DBF3037CD343F0DD60D976DC45FFD226BAAA771F8A8
-825BE0896EA5FB4F1630E3E094F4CE48BBB77DF3B3E02A4C87DD3DBCCEFEFDFA
-49366A42922C9D6BA8B158D5CA984E39747767D90406F265EB3969458A0EF64D
-3068C11E9AD68E9A7CC8D16B9A7D039C771FDFA7A53B57DADDC28A192E855F08
-53C1181C71FB478D99689750BA59720B93D59A6A59BC01E31043E0746B31F184
-4484ED2190B3164E5DC9611F4866ADFD85A70590F1E10D3342210182D774DE19
-69E8B4CF605F9DF4C801305406F5D6FCBB9980D63521C12AF90CDCD2C0A728D1
-FCB6FF4E863DA97B067C95A66DB6CD3793B140F62DD957769B62E5CABCA270F6
-0398DEBF12A0920735A29CA5CCC9E713A772E5F49715EB6940E4A9F06CE317BF
-7591CE708F06D58EDC3780472793D31B359ABD417FC8FAA880B39E7957B90312
-0964AA59434BE4D1A758B0AF818B2FDECE8A66A7E8D5330576145B60FB56297B
-70365939DA78E35B2B557012568991AFC0C30042E0EF061ECEC5718B473C9D00
-47C519445B354A2A80A161A49E893D787BCD72AF0717C2F77F8AD5883433EE6F
-EF9792F7DCE4CDAB9C63E13CF9B5BB241C5EEEA9DE55737F194C2F614E80D0B8
-B52B1972D6FA1B08B00DE7D85FCA62277DA0BEDBBA20788C1C6F30A81392BB8A
-1AF5EBBFBE30161C99A168DFAFC67F3A32DC0E31E5E08B89B0E377BD4FE7016D
-8F65AA31FEA39019E03A5532DFBE38754B6170E0A1104AF8A31B47254FA38987
-90E53D9688161537F1C6CFBF189C792B2B3E7817CDB7072E1391457DAF548270
-2F91AE044394B948B167AFA7DFE2EE15CEDB3409095D19844E623CFAF4907DDE
-965ADA237507174C60EE9869D7E5E8ADDCF44279B0CEB596DABFBE6D2ACE78E2
-46211F05BD34346E31D885FCF6BE36A2A643205944FF48190F448087D93CB30C
-3E7FCE736771910C808CF27BC1E5C0960987EE453BF73AABBFA80108154E66F3
-159104B535BE89859557D664DCBDBE24E6A9B9AAE1EC3FE611BECFD8A0BAC2C0
-861A22799746A3F8C75DDCAB438BFC31431CC7113AB6360D19A91A275CD45503
-795765EE75349C2BB62ED8F062810D3795D653D4C3E4FC7AEE0D09A156F4D683
-BC9DAC716398B877BC4F4FE997255B26BD15132E963BFF80D6F74B102160B97C
-27EF76D963C6F54668D47D8D28CD4CD8BF8A15E34776D3342BBD5B6331DCF1CF
-8C960C7EF6DA0F04E136CE2DE3B338ED4E45C625BC8EE55E30FACE1700323489
-C7DFEBA8382EF6CB5E6A61833D9E92E68C8C3EA2DDAD87A3F2CE295D4A629F88
-70010FAAD335D042BC9D465C0CF51CE964853A3CB5CF28A1959E3C865A074CB0
-37508C4581F632DC9DA0241D0558EA26CA4F1FC705E5D041843E1066695BB5B5
-8255BAA392B820EFA34754C408516E11AAB38CFC02FAE7FD63DD7074A6E184E2
-CC740327F503868E5E520FCD90B8A35C82AA7CC73CB7131DB9884A3A5807A640
-AA44A3DBCEEF922811D110103202903499614AEEE640F3FC59E388063977C9AA
-A9F8EFD1011B373B255A97FD7B78ACD5DA909CC4C93A1CB43FE7AC05602460CC
-D1C216CB1CAF35CC28EFA959702BD3428F7D632425234F0F576620EE6B1AEF82
-20BE109D25F84EEB9B63E0B73D821DD4E61E6818399CEC44CB0EF3FE1344994D
-B1DBC9DB8295A167EF8E5BDC1EDA72F083892ED899985AB0A3E18498A45E2B59
-08866DF7F498C3B2F7E23DF363253F9E98305DEB607409E5D0AEDC7871C40D58
-F23B5BA04228862950727602BD83F688C922D3A68DEB7D232FE494DC1FED59B0
-0D466C25DCCDBE438E03D313E569FBE1B6876622BA9EECC2FD175489A79BD995
-351E2C9CD01347462221D7515DBA4AD2C9C20C266973409876EEB6CF6D6EC08E
-2E7A63E48B4A67E5855FECEA3C54F06F726DC0F2ACA724B448F9C4E2BA7C6938
-B6B3C6059DC998EBBFC735C9663F1A247697647E5D26FC8389E4F6FB5F69A18E
-38EF7FB2B36238EDA100BB2B2C455247CC08127C60B9A28D024C4DB20C80EE0C
-CEB3C166B6008D6A907F24AE05B63C9B85B430E35CE927A6D13715B65F5C67AB
-E2CCDE71EEF21AC3FB69357D5916DDAB420EBFE320A253887CE8299F546BDA97
-17F45CFE9FB9B44D66993F40044DA0580276D975D803A05A027FE197C3E69D59
-B0C603D5BE4BE783BF55EB89256353DA6F7DCFAD6C82EB09720475388F813717
-7E2483F98490A0BB7646648F9412A4C4FBC5DE09314824BF6A43D101BCFD9C49
-365EE33D1B763EE47AEDDCACF09E3E6D9641FDC4F9E284FBFF5F294B5D0D7982
-A9E545973B54B2D8C9D6BDE55FD08AB8E694981977C77FCDE79028F32C83957F
-26BD8CE3831EFC042B0451DC555F7E9EE0F2D40D2CED487607F48893E8696F8F
-82CB5367D9FC51A77ECF7E5DE6B8BB8C626EA7FC74B0244A0BD2EC1FAD94A851
-2539C6AADEF9353DDCF498D9733631464FBFA298E9D23BBD041773D482749836
-38408C5D99794F76C6446C22FAC277F8DDA658D73EFDC46B2554CA6086FE7EBC
-34509F5B1207C16727B2BA222684395FA168CB5AFC620533B2F96B75C1775BD0
-441201D19F2A70D8ED17863A5475DF5D6A5AB72770F1A3DD16B39E8144782FF5
-90E791130097DA74E731272EEC9BC60BA75957A5CEEBE835A0D77A4780346A93
-CC984FE0C9C46C069BB51434FF0A79DBCBDD5499F48CBD944693E0B9D18A143E
-5441A3A57F34B00B5B8AF59D97B19425795D85109708F66F3A37E88E291BA6AC
-5C37B29DACCF16C44FA4D77AA0DD573AB26DCF46D8DD8C33C881776A4FD6B343
-4719258FD5B4718BA8DBC94882C530D8F47B26EAD4E54B19848AF2D897AA7B47
-CFA178A45E213BD3CADA498F7BB93E3C74A3598C62C28C5ACAF0EC172F883BC0
-79376D48F6E7BAF85A6823D839AE7AE15458BB33C33E6FFF63B3BE3D76E02B32
-2A207D6F113E85E66112E81177C3E72A5B7F902B6D1B8B7542D7985D69DDB0E5
-97F03187C939369D10A417C300DA1FD0833F338232A00C85085354794AE9A087
-B8459A999A576151D01F30F45CE06180A55C236C5C3588AFC541DF83F444CDEA
-779B7C825B740D7B21897818A5BB90E728A5F1E915D789FD3E8CF619283C1599
-ADB01CFDD7B20F4B9FDE8CA2413C6F1325D5E39A641E638A5F212F32651FC540
-CEF349609A36CD64B144BB229B28B167355EE604084E480453478F271D93EE51
-41D289565FDD80C24047C5DA6F6E63CAEEEB361039CF136F6BB6771CB997F039
-D8011DC0882CB6E07E419E90AD2E1BC3ED4EC481A2437C1E960B86E413C54264
-4B0D655C8BB8C1EF0B2A584AFEFEC63AB229B037AF7FEC78D0C0762B250909F8
-84A3937FE5ED394B22B1A4F7172070CE1BA5EBE02E93389A6451711D2A33172D
-8FE716E279CBD94F81AEDBCBE43829536DCB6D816B5348FFAA49A335FFC47016
-40D65A9C2CF70ED6F14D294D7F00F94DD5E918704CE7BCA42214E9607686FF1A
-61397C31A3E9D28589472CBED26C2B8E3AB2CC5DDFFC5936D1CF3DA9649A489D
-32B719EE6DA53A1FC5A2BCE8CE665D5AE01EE561782FE7B3200A132493AB290E
-E77BE8561EEC178552D26E0BAD490BAE7B2B2D1CC2AE29BCC85C3034F43B3BBA
-513BC8375DF221D42B25F5558D19E12D70402A1BDA81C56BBFEE60F99D9F152C
-6437B8D268FCD49673024BCFD4755E1A0A3436D12D2F6E71CA0BF0C3CCD00D38
-34EC290C7CFFAF3485C8FE848A543DAC0172E025CEBCE2287E958BC91207DDDB
-3734DBCF73E7EB9E6ADBDFC35FE75F759EAD1D341C576F047106AA89CE30039B
-A9C4155E3EB571E700F8C0F04E24D4841EEB8D99A1BA05E3291925820C28DDCE
-34CCCF4CFC655D49295F159733DE276D962A8C5CB859886FB0CF642903F78E07
-FB0995EA336A63EC9CDB5D2EEF6B32C81B13D1848849F07B653887067115F113
-57855931115AE76D7147110B2F3C2ED20D7466B19CF8DED751C15F12C730CC54
-C86124A03673725D1331E75DD9E4A84858EBF5F2DF6AD2B0FD5842DC6372F5DE
-F334D21F312501E790CBCFBA0EC9823BDB1BBB32BE5CEF2AC5906A368D6C39E9
-D913191C0DE05C20C24B10048368362E7702CF6E993E6904A85693B520CCE666
-7F7DDF2FDC2195CAC5CA89D230EF1C383403DF6E22B64EDAAF6A1ADE3086DC01
-1849B6865F7ABA165F2895DC703FC7536F3CB306CA6C3375F36CB5C7BAB8C78E
-DE37462B465EFAE538C52267E0FD152467BA4EF681512BE295D3FB2D5ED98B37
-9544A30798D1571B8E794A4D3B6D0D0F2F630E2948B45B187EAC18272506E2B0
-8029D9ED7C5C82CFB5713B0FD929DB6B718B8C3A1211C9A9D587DBD58E54E0B0
-E05B89A429FBDD4BF4CF309E9C189A21BD42065D007DEFFF38387A02B90EEEED
-CC4C5CF3B8788549D626CC25AA246CC022C8C1CA9703EF945139B8E10936251C
-80C21FE36821D75D0BAA1443C3E119BC08FD153CCC20A52074C095D2680AB050
-D203DC0CDE27771081ED74A2C5E0718B93364680F6512BBA43F1357A70839CE9
-C7D010B2B90DA733C74E634BD0FA1D281D40779E4FC55139CD11170ED58E71E4
-A4616EBF68B805122D4AC069B9C30F7F9B8A204D740C17DE428781CABDABAEBB
-02F0B018E812F00EB92D5D80D91A5E9755176BFD7625B80223C2E69EA237D8C4
-08E1A8B51CD142F48A760EA85D01BDB66284D61120A61EA87086227DD004CDAE
-FEAFD1206700187B602FBB2E3CED6F333E6DB5425EC0E604A7478C017CF376B7
-D7B7548FC9AD882014F7598408E31000BD53B0A7D17A8ED5EB220D9D7C9B0022
-24DB358061C415A4A3DA467579F663357CB97509ACB840EF5C7609B7B8A5E1A1
-14E23BB75597312A45241847AAB21DEB166BB0452821C26063A14EF05B628230
-D63292B46CB3F53B7FEF2070D4C4D613479CCF39888224995D02369F5E3F1DB7
-27390BF482072E7DE300F0425DD301869878946C67DE03E713B69DDC2BED58EB
-1E8FA154A787BBD1FA64D76CD35FC1502CF01CD9476B5C1B7A623F221317965C
-AD3838AB18F185A9B20DB62391599043F31D1B0AA90C38C23174C7B018EB576C
-B1C7D583F723420FEF9AC11898802AA768B4AB70748AFBFACDED99C1789700BC
-A662B71CAA1855B83A55CFD1174DCF8DB001BADA69E45340FFDF0202D311006D
-996FA17BF67209A51CF06B84BEFC6BEB2C60B8669704BC51BA6AFD0130F37076
-6787C7E5119A7F1B4D1CCAB950A4621C794A128D3971759E71922D9FB2112998
-4C50EEE88291107A0C519F68E411E47AE4EDBC9A269DB4830FA3B2914B53AE1F
-A58B33B223C20BB614BF2E63405764A993CC250A728E4D420BB85F5829A862C9
-DD58D417A74FE8A828F62DA4D1D31955E57520CE2F7DB2E4F06B6179E55EBF7A
-289335B17E77CAAAC62C6A8FF7CA4CAAC6BFA1326B5FA32FEFB991B0DD0B38D7
-71EE06380478EC47549B91881C3D6E1B0C66258423B3C69C0FAC17A802832D06
-0B9AB3088DEC73B497204E5CC44E434647E320C5D83F8EA2A7E25B5868957E9B
-0E5347626A484C986FA5105920F079A5F520F5DE92AE530DA801E329C8592FE5
-5210709E8CF735F74F9CFFD32746E3BFD54A40E4C08AA4EADAA303C66E4417F0
-8D5B75ACEA41CB1A41A6788BB557420A9609400F6062AF8C3BCE7F603B73BACA
-35BBB418E0802B22725723E12B92A231E0C35B37A05CA9380CBE911C8895F380
-780EA4E04A8714D90EA911376541A2CAE1A013362634AA04504D98DBCEEEBD8C
-6DF498805612B3931FF721E63C8EAC4C74C0AC8128468348A2DB56702FFCFB23
-A6F78B6F7DD08E48D44E4DA7880836CB949BA8E915393E6B62F58F9D34568A49
-2FDF255FB29FFD0DA9878C19F2961BCBBA487A9A578C36476E6A49CB72BF980D
-D64D3EFD82077CC0663290BE95C13BAA1C5C07F50B74FD00A1B50788BE98EEC7
-F0CECD0D9612B59E385BC644B0728EB209FB5A0BF334A8F1772A88AA0E4138A2
-518FBCFBA956ACC6F566FA6BCC66AA2CF374F0D457DC7D7A715CF066B08FF1BB
-561BC5F6CC3C48E857595F9986829E38C6FC8AA8573EFE7FD6A95CBCDD859778
-AC517A3CAC168CBD3B9BBCE9D00111B3241418BE0B2E690CF4A737C816441862
-E25529374DE12E7361ED23E542BCFEE4D30EB8B746C2D133DFA2A68A8D2FBCC4
-6934E2ADAE482AE22DFD714F77E228F95E934E4C286E428AF5766B5AA22189CF
-DFECD70F4D98ECBDA9FE483FC30EB5FC4800D0A5205F23F863C21CE0E4BF6C84
-1EF9E77C68C99AFD3EFB879EB1EBEA8ED7E8C4C7CF7DEC6C2182901EF483B76B
-F83AFA9C1827AF5C3F6A29C36723E3A657C0E5DB55C198934FF5A59119DB5536
-F69CDB34DADFB6F596ABD7C5885103CC95068D113C3C17E9CA8C34C0B74E7463
-1D5C83DDB5B45D8EA510C279FAF577840958A13CF2B13741D74BEE4941A1C207
-BDC5EBFADB4CC01FA3F12D22E431BA17527C4BFC940A6A08BDE150C6E47D752A
-5FD943C4B7CAE482FFB7AA27371A6C45E2CE4C31EBDC8337A1B853A74B2A17D6
-BC607BA9D38B71D86F586A33D440B616443F58A103521AE1D6A1755E74BE6BA3
-05E45006058BA47601191958463583E8D2F0985D6356D9868E84C538654AE972
-D59C6F48D9D3B929BA4704DE684A35438FDA0CF60B3D2E1610642D87F690A3E0
-7CCE4A5AF8180114A8EE9D360C8F0C6A033F2331C546D34FD1B1E95B9E7C914E
-0074C40A105428550886A264C74306F7CC221D78352DD53E39BA99C1AC851E9D
-14A3B0B9CCE04806615D7D90F377FA3BA50182DAB42EC6E32475AD56B8B1CBD1
-D265458CEFA79C68853CB11DCE026C339CD3ADBB44259AC7318B39EDDE33FE33
-E542E4BC5C64B36B159D68F59A9B2BC55C0343EDA853A4D9E6E3E53176F46EA7
-3EC1D108D76588C7A80BDB8DE432DE32CA3AC3C74ADFEC515372B0594EF82832
-CD7075AF87CCDFAD82D2A570ACF179B6B6A318AC8EAEEB99B34DCB1A14A52ED2
-E35A0EA8C1A5449D63695FA7E52847B7446C4489751099B0D2103FA57ABBBC30
-A77E6C9682D560D4BD9AF78B0798FD89623126945A09BCDBD5789F6551B679F1
-52EEF0A6603ACEA8F7B9E5B58C25D760BC078943C5502E3230A31539DCA5A7B3
-14562F1283E8FF98361D23CAA48BC78267F46B0255C526AA8E5800D0B570D3FF
-C6C79CC39C2CCF320006298AE4085BB7E3C57ED37DB620A2D8B34F1E970E7020
-4C5D676BDF124E2524EB93948ECEB3B53BB3DDDE062293EF03670EAD36FCD0B9
-001D87FC35F0EB90B6CE065AD2040770E4CBB96F020F665E563DF248C12C95FF
-C07EB290B8ED0AA843FCD2D04BAFAA0863143FAAEB275FA8321DF73D589DE07C
-797027BFA79A5B29C03B560F41C999739CD272B01FAE34C0735820A9A78D75A8
-F89FF3D929D1CBD7B76707BB236ABFAB615FD25F4033EF8A2A9382C58A8C3617
-78CDF0F6B662C3785833F58F71115ABF92195968F87D49762536661699EA32F4
-E8B82036F147A0C8726FA2181EA36EE6D627F2422115A66EFA13A5AEB1DC6743
-0961EBBFE03965204975852DD634AC09B0C3C167F53C34EF7ADA1D0C1A09FE1B
-EA96BBE639FDFFE69A5DFB097BE71FBFE695DECA330DC168AA85065345124FEF
-E37DE2DB9E927F58DA629D912B31688B51B4BA61D9B8AAD2C552CCFB36274DC6
-9E6CBD67698CD4D16E75D1119A90A32373982E631E5B8DA9D648A5CFE65CA188
-F27778BFF26E6A55DF01A286E8F6376AB5A472FB3B2E779E79D55A41AEE83A00
-5D00E9CAD77F5E6018FB4C59A2F114A65FCC20EAF2C8E026BB97D1B94F9E7686
-B42A7D9A1A1DBD41DB89C4DC7FEBA4BA24613D0FC3931A05E39C4C6BF4D8E92A
-11FD40EE366783E9BB2EE55F57B5E2C4B9C62D3217C83E28DA32D9C122149036
-CBA8F707B7D3333517F283612691DB9A335A035A77B5C4EB4B4FD5511346341E
-99C55CEAE7FFEA94BB8F326BE2DE4C8D280FDD633CCB813B56F4E85FFFADC926
-EBE5C08265413E93C86D6F3CE187B09B0747EFAA8E25A153167A140E2D49614E
-AF270C8B6FCC854DBF52B62DC238E83659B138CFAC77F86DF19FB7D5C3FD4DED
-C688799A95A559368A4CECB79B7CC1FF10CCFE9111A74487CBC153A2248A9E66
-C6EE896EC885B43B73C18215CDD7CD8355BF63F81E4C8796502D4CEA494AD600
-49C684E376F5844FB4D02707A1F96A5E942EFBEE3359C77ED930EE904361B0CD
-01C86D8DC2C913E7644821E9A30714D18BC6357A5FE23CD8C9866C8E8F5729BA
-A16537D2D88077C7143116322F0ABC5C980DAF9FA8F13BCCA75B02E5CACFC475
-801A43107FE42A0CC87AE1A78B0F839197C02F2680F9094779C3A197574B5C76
-8D48F3BD89EAA1A1D98D6B63BCC31CEC0996BAA5F7E0057C2447E72CA708F14B
-C458F47D91F356E24D91049EDE3BBDB7D1BBE32C4ED5AC7771CD321C3296D92F
-68B6CA333B0060E2A6F5FA71D4A0CFF0453A788C1BA661DAEB4CF87557BBFADC
-7BA7D7D2939FD8D63F29D5FACE40BDF71AD0353293E80988D111FEBF46719056
-954162563E759F0314EE7A0BD5367CA6D2DB23B8E33EF0A094B77C89E1DCB645
-8E1B168561D7925778E38208CD5970A2E43CE2A5EBF52E87273D21E7D35A3869
-CE1F1A0E07AFAF4C2CC21B80A443BD9851D8D527C1343E975EEC4512950413B8
-EA9F99D32A13F42A432EE52489EB370AA99FEDD2330B75C47DC86A9106D67FE7
-80192E2109FEC77E00F60F1127501F4BFFFF05167EF94EA7B9CD14049AB7AE80
-2AF55490FD8DA3C80DBF9ED6FEBD0FC03CC5D82194F950F902966279C4E84D83
-A7CF067E1D1F07EA1A31C93B8FEF995E65BD7DC1B3B81181F8B5954C7BC4B62E
-19DC9B35C23652C15ADF50C84B968A12CF882D426486C46D3FFD964F5D6CADD5
-BF4500AB9B4CEC2A1AAED512CCB64071CF9FCE7E5357915497ECC259DA2949CD
-9CBE29B3F9ADE03E939B636146E8A4E8AA19DCC0F8C7A0DC9BA422BBE4988A37
-6513EB6774F0043EECA9F241E6A827095FE05AA6BAB09E66D08AADD69EA5BB8B
-F813CB9DB27C48F68508550BD494EC3F16589333B7E4A1803A5BE00C40F1BBF3
-835682C6242C479843DE30D6EB9088A48F115BBA988EAD5DFA2FBC018400D176
-840CFE498BFE4F06367B74B339B2317362897D6B4134DE01BBF9E9D9F980911C
-441EA5D6F6548F4E87835A7B566C8471A03C53136CC7D6A58E77A702EECF4327
-89D008FF5E51A274BDB5A00D3048039287C11B51E458A4DB2A9481679A2C7FD9
-A30D9E8FFA4A7220F36A187D02BC85D76EDB1FF407F33E5E1832AFF2ADB9EC73
-32281F6DDC48EEBA894FCD14741BFB4CE477EA93640F8F7C7E8BD21E257477CA
-F7688681DF0D3954A6C6794AD9AED1DA0C570E04CDFC4D3933D7DF89AB3CCDBE
-E268AABAE4FE28CC63B84894DEBF941D3F886B0464C111B698856873F05910CA
-A413A719611582A91DE699BC47E9C13B7A0F0B3E6FB816D5A03AEEB88A82ABE0
-106DD301196A40FB17E79BA85A6D5D4867E7D057B246BB24DB079BF42D1663F1
-B20A7E4017EA26B390DC39A57CF356C81851FA5775DB347A0DF1F174202CEA7C
-E13CA1F2713381D9D9FB3A64AACD69C0B48C18EAFD68C6B6B3C088189E805ADC
-D1F58F03E0B1BCFF4229CDE123B1EA5E026AF1B958B9C08ABE3B5D3E2F821ECC
-3B92CF0F3AE909D1EE1E5158D1D70E0891D888E385FCDD4AF71CA1EEA06C7BFA
-71D584E9A0000D508DBF6C18D30303666B2DFF6EBE81B9EA48D8D794763471FE
-5FF36DB90E8C6D2FF2B7897FF64070F8D1982DF106E402426AD09A64B7AC5BCA
-1C6DCDE633BC4DE9E8AEABC46E7559E349A0E905322F4B7E395EADFA8F8D959D
-F0E28E01DBA51F7BD55163D95412B7E499C9B480B6638F1CFA2278CFB3B99555
-0CFC8821F3E79EE3362947A6406B58C5077A75E2ADC6B61DBDBE9AF3205257DF
-8A7D6069D7B2C9721E50488BC754E94D1D8A4FD3747239724BB3C8F5CA2F88D4
-F69CA5F395B8A36141E40954392B5D2E3F3E49936F48E8B51CD931E53AADD3CA
-32B241648A3CEAA5E2D53B8B0A8DEE138E3F4BF88D1BAD2988AE342E825889B0
-38B5F9606A6DC3BD767EBDF6DA984E28F9A203F015DC1B17E26CC038DBA71CC4
-6A3D5ECF75802A02182AA4DC7FD34438E59960BA78B9E11755B4314886681B17
-AE05C263496170AB1B642C34226043809F8F8CB80D30A3C3C97F07E9EF849CF5
-FCF99D9797AE8DFE2644F1D597A37BF88FD02891506EB46E3DCF1C4DC905B39A
-568ED960C0CCEE30C5A075244E2DDFA8B568133780DCB656A537936924B7BE2D
-30D00FCB4A82F0C6CA1E7391B4ECEAC37EF8A32DD4FF229E31D8982D1B876C47
-924D26DED97B91661E126FDB72057412C5DA49D95A2FA3676CAD58E01ED9DE79
-162BB27E9F2005680D82967F953A96A11501ED68DC6157894C3461E1AEBC38C4
-DDF4962D9E09C66323FB6323DC88AC476ED6FD17025A5FEAB7B6C6A1BD4EB30F
-97C6527D6D836BA80E4F2A1C046368AE6BFBE132742EE6538DC48C918A1EA445
-A5651759AC5E5ECA97F21EE2DD6EE9B77B406DBAF1EA9BAA64AA075C57DF68B4
-119C681608ABD57E5A6E99251B000CD846F2C72519170A7750E01C1BF79C84E8
-0C24B2F74C73E3939BD161C67D2DDFB5451488B8EF6EB0EBB8C8012D237C9ADE
-B04820C893FA30A071C8431E028D33D656ACC12A83675C598C4E5F1F4162F113
-75D9D193D32EB3B3266DCA5B2FC27AE87403191FC06DE4BE6B40950D60CC2483
-E9EDCE3525E6AF91CEDA7A7BFED86C6D2F5ADB3DD0CE502EE2440D6529604ED9
-0CAAF7A0B94495B5E3472B9B4E4E72EAB9C899661AA695F0E1DD191597C35CEC
-11286CFD8CCCEDE2D696E60DFEE518FE2332532354EC36D4027B9E54B5C1AC41
-5D9087477E50D0074E93CFC74A8B2B4040C46D926982699A02547C6E5A95515E
-C906EADFE24EDC658549171DE19D95CFAC7A3E49590A741E0A872F96766F7171
-619DE1436EFB3E29091DF36087E573ED4C72A81B41ADC7FB681D08CA20ABC35A
-51BE69C85474E53D53F684AB7FBA6870930D72B2AC917858348C081334478640
-BFD6781387E5F9884F5B9A2F3F1377AF5FA2CA52EA68406AFAB6C91A888F47A1
-E002AA927D2CC11E2DDBA648960495CF1DBC184F6B4D5A44F1CBD67D8EB6FAC9
-76E386AC7DDC99C1D872500FB355A3A0AC805C1E00947F8B82B918A84B1AD2E0
-3E881C0E82BB047E0275CDB9E09E1580DB2EBF20FECDD095910DF6EE017D79CE
-6E4590FE4F14BFE554C625122FCDF115A6C8D9F6FE0E9AE6A29BA1F7B2311716
-E37CCFCD0E972F8CF909939007CD86D2AA045ED816AC1F330DC706C3ADD1D239
-D3FAC4AB5CD5344994EA1978131472A279EB0A8F9B9380333CA610DB402B679A
-0773807938FF12E8244ED2F0D75D6C5BF2C9AADEAD23F8D5BE373662C8485AF0
-66A33CF74C47C41995581B77AC05E0165E15173A956E59C6DF4873092C27986D
-ECA1916C2E34439E1952CA26E948E90840495B9698C2FD3A729B83DC30A0EBD2
-DF4270B5209BF65B841617AD963AAF85FA87CBED7158A4268F2F9C8A15E9F4F0
-C665FD784CDFD2FB1DC812AAFC7239315E7165A6B09E85D55C23E7A0482A6EE6
-E3F7EF9C479F66538A7F8FC39336E6CB09A3198E701F8D9C1CD3FDA395962097
-DC645A28F27CACABC767CA49D2DC82D41FE90279348184E415ECE21B1A3756B9
-F7E10BE0C2002D2DD040983D479C5E1F8A95DD7EF37E795B7C0DBACEFA209C14
-A295E95EADEE1CDC8A35E72C77ABA8DC344D00E2186091CD6420651F6D67900E
-67C6D42D0AECF3906191DE5996D7A9E7B78FBC03D5D7E9974DF81F1B203B6D1B
-BA18F089F2A40B72E69C7317D753DE2495E9EEC907D099F22EBB8AEEA6D65B3A
-D7EC581B0A8004F4BCA4067A66578D68CB9C0408C0010DCBD5A40D51494A19D1
-E586028EE13A0AE09BF2B52E4CDB383BACCB87914AE039A38A24282DBFAA40AD
-76D344F1F86950333AC92AAC28EB2B07DD65C15877AC6268091863E89DCCBF46
-F7796E2668AE126B9A74244BCD97445947031D6AB1C300F271EEFBFCBAD1BF92
-779DAA45BAC4E773C9222E73F14F1EC37AD10E663F836BC3E9C6DD70330233AB
-D8771658AAC8C8805D661334ED1DDF293DAF461212E88D95E53D5C23F3086DB6
-BC1BF93B1F0A90C0AD5C3321225F173D0E407D006BE11A963DA4FD5A1F189E1D
-04E40C2BF9162ADF3F8B672CE9991EB8C422B504F03C1B253290A000AB95DEFA
-6EF50D0F27CCDC324A7D8BAFEB8C5491377809252CFE69536FA3641090BAB758
-8DDF49F33CD14A87245F29349A09DFF54B8F9A743A5C20DA6A8178CB4FCB06CC
-EFCBF812158F6169015C38D0003E9D06223D3BC56E4585CD6A74273F5204CC13
-14CA969003A6D705CC923E268760A0A97E36A2A21EBCCA8ADB66C3798C08DC92
-7797F5CD56CB80CC88D00E789A677106F9D612725E5E982DD14E5EE696DC8C11
-12FD5AC302CBD81E03089865560659CFD4B4B770BD3CAD2D8B7A8861E7A625A0
-078977713FF4E8502B21B15AD68CAD7284AE50D0FB611980B82F99CD8882AD82
-6736661B89294B0DB38F4C65603F9EC45A0897400657BB67CDA50A67C94EE235
-33AF76525858D303CDA26C14E355132C92E132EB84B0D6297FA50620E36895DC
-B02B2C8562486AAF6D073E80CA875068774037CA16C01C332E799AF99DEB62F1
-2606727A6E4AE8715B98841FA84228DFFA642AE1789F45C86C8245807835C584
-BFE5F7EA749402E94A40AC9C72FFD3AF52510728ED95030C85816A117A6E4A7F
-B223430CC9A9AA7CE31278DD472D71E47A2D0265EB47773D14961888020A0259
-64E9E24B35AC6F44EA51D1F55CF7C7F3D7E4BD97877EF6562B49A842F6ED087F
-1B51BA1F1EBDF4C6443F4E778ADB0E990E5658A97FC203C6D210C16294C74B54
-104C616A58D1B0551CF94C6A9A0D2AED37A417E7C105D4EB2F45B4F547B814C7
-730342AC615286E4ACEADA9948C237F2F3F268D5DB47AC4663D485C60586245F
-E25C0424C4E6F56FF33EFFC35BA38B0EF5A4B2131CA9B516F6586D63D73A13FB
-867FF248CF66FBB2074098C05B3B1CBB401496A0D6B0F2487D1FEC7799AF3402
-00402CC895168C4194DCA7DDD0AA150CD2743DDBAA19A0EE9CBBFE6D6FB15C9C
-C6EC08DB9DEC8B5D3F1883CE2143843EBFAAD522447809E38C1FFC492B8A7400
-6C8DE288479664226DBBACFA3D29E6A63221BCC6939604DA895617A7FC99E15D
-72F4FEBB96EFD77D31B13D7B0494AEB0D286058FBBF013DC8399056C7F222332
-CC93202FF57BA3E51E10A873F20FCC95A776CC7EEFFB46A920E00A5B34FF82D6
-2D85C3A882E187199812BD1AF4C08FA09622A66C1BFF2AC1B7A8E36CC2C0C720
-4BF8DC761F23D8630C51AD13E55035A7AFC0BA10D87123FEE5E51EBABDD9CFEF
-4ECFB3530DFF83347533286C93C4C728054785E7A60516EF699351CA4392626F
-4697A64B3CE9995C57FE35878AD42BAFF0A4E511E18C94F740689D0C37850727
-4C48333BE8C6DF3E45204A752D791DBB8C972DC6F2293C46F8D4B06DC7B6116F
-3AD7A9F944B99A92A603C57BDDA29E77F9419E4E9885280AC3270352A38A84BC
-B10821D43020B2FFCA14452F8DB602EEC9201BCA8E538469605F5CEA321C8D43
-59660CC2623E613071B31A51FB9A48DF6238BD2A0625D74F3ADB1B67D51754AC
-E5DCAD203DE36E54F93728D88DD3A9684078D04CF9417A79894597921E636C32
-4B18C4C3A15712B9E765D8E53612FD66CC91C6B6EA4D2B93214F57C7BE19428D
-CE545E76188AF078C1CEF02D078645039382229BAE21580C5A309B61E2A7CAFE
-8A9A5E378FFEC21F36D2DC50674A7DF0F542C1D81198EA7861DB611F93E50E41
-B1844C0E761CDCC7D9A3AA3F11DD2B6524CDEEC67936C578A47918AC9A12221F
-6941DCB91587A1BA4D407E4CC7DBF883A4225EC0407B03303841994D254F04BA
-A725F0D9061B52D72669FA70D694E843A80BE0D8543DA6DE39C3EEC5FBB145A7
-8A41EE0C62F2F67999F4BFD255D279501AD97B94037E9FABD4997DC02C2ADACF
-82BD90C64883F4BEA139B8DA0931CA0C618454A19B639747CFF20B6741FAA7AD
-619B8DA6EE7569E6FBD4BC8C48E5E604A1F06C84C492150EB01BACA796F111B1
-4A10F4B95B2148AA66104BF95D064960984BC2A1FA25C6BF7A8B6C9A5A062122
-B0D1D705F4BED1AB70D5609CF5930D48E0292C1F8E07C50411F8B2980E36BC43
-10AC3CE58127BDAA32B0F771119C98F8FEE653B93BA2080CDD5CC2F5A2D96316
-2E40D79486B2C9DC53A6A92F523263C0D789EAF5A2EDBA95F5BCBE2AC4E53B97
-9870800E256D67DF46524B6D09714C3802318C52B7C24C2A37832E2238487362
-BA7DE4301CF1459801F03C5D4D3E83D502BBC21A4B0BE461FF5DD5E3570C8DB6
-6373ECF760002A8D36EA3AFA7B513AA886F44070E6BEA83A65F1103BB33505C4
-A17B2EC8639359548F49F5005107BD2CE0A5FFCEC5C2ED08C9905C5D31C36247
-961A0A1638F3E8553D5BD8CB1E8273A552B2BFA3E0B20024D0D3E2C710BAE20F
-58E952611A8937E30E1A3E57DE281897A638B4620E485A3D792D650F07806B12
-EB8803D2C0AC01B3DD975B461BDE462A5063BA108DE6DAE031439764C95C9A28
-84BBDD4AD3A67671883623EC2580ACAA99051C344D3CD418C583044813554C5E
-0B27B7F42EECD3D54BB7B57A788CE239F0B076029EAEC2257A5C8EF9B1506B71
-289FEA35762F47EC6D30254499D4C2AE0BC6723E560B0F6C8C137719F68DF348
-73DE963A4F912227AF342F82ED46FA1FE7EDA82B59CEF25EDAF5764C66A899E7
-08B0715CB21C10B318EF66E5454FF1A7B324EF19E226EB1587F8AC0326F55D03
-9290EC6B01A9EE33A1ECE1C3E2FCF4E3B7563D3A77FB4D40BBB8FFED1C858042
-8D4A83EE2DEA47CA2E9A9A59570B0C8448AE0F8C05A4C205BB4C20E37ABB860C
-82DE3869F24BB6882E08F045DB9147D6E83D82D0EE5EE7596FC89B23553039F4
-449C6E2629BE1E78BE116A98E435CEE7CEB3D70D98AB93F766468E307E11FD41
-C26FB0E90F6D00455E229C987A128FB36D50BEE7953192FF409E5D72980BD49D
-32AB7A064CCA9431BB605E68F5EB862218762F7C3094CCD0206C0383108222AB
-EA8129A384294BB9179F412E182ECE777D34269CBF7607555AABAF56159B724B
-67EBF49667E47B7988E5C81422540766D26462046894A61EB9F764746062F06A
-34C3EE2767798433263E6D3653FCD6E4C43E6A5F0BC762E77D4174F95E7173CE
-A03CFF3A204C72773A7F6C301AD3C418A93042A5C479200D13EFC4229BD31602
-9D4ED8CCE127A1A900B5CC3F9B292301DA6CD4AD0D5E1465BCD50C11FF9F4727
-E4BC06013CA5F0FB6B4E26C5636217774935F63584F69D7797E6A871FB51B3A4
-7E3108E160D01C4DA87DF33FF40B452E8A23144649A72A04366B1B3B026C749B
-A897D52C40808BA52ED82FAD0A6DAEBF41F24D5B9C705C7F3AFBF38C923DD3CD
-1DA764DB623D1E0AFFBAB095E9C6FD5788E91CF697FBF57B1525A0164E536F82
-20F532DDE94CC1C2DEA0AC7A41D75C50E875D605DFAE0FFB07009EB4B627662F
-C1A17A5F8AE3DBC794023639D4E4328C55067A8AC921EF54D272E6F6C60EDB41
-AE35943D366D41F12C2BADD1A2BF17429EB871204A309DD6A3375992111D9AC7
-902E0E7A62B85A1BC6FD35E11CC132F37EFA0B96A733FF668EBB8778FBC2B799
-33AEC8E08E1576545B5BF0E1BA5D5766F22E29E51D404C25F3E54B77D6882DA4
-B491536CEF9DFDFE15362DE2FE5221D30D2D6F15158E57CE561C88F277FC975B
-616887F1ACBCA8789AE0B854DFD86FB544192E0382BA380B79076A825EEC0315
-35C892FC89E778A71EAD7B9E578F849E10047154FDA362DC45E5FD1865ED2D5B
-F701D7AC0A35626A34BE036EC912E4C4C2AF61B55E75B1AE8D8FD27767696AE3
-AFB440007C6F73DAA0AA62C89081D7EF6B02751CDEAB00488A591E8F2E79EF94
-53BD8FEE595A98A986BBD053A3CB86DB5B039B0F732438643EAA64E5DAF3B6F1
-9E6B4EB430B9E7D648E729EE569871AD7DCEEDEE1851238DE9E23BD10E75B7D1
-B7E02CE3F22D27D7E262BA786D74EC0123DD208030553C0C5E1D538604F7F438
-858D3234D566EE22C36C2D09009322AD41D99A5D0F4404A8939E217CA32C5092
-0E72E2FF0991FF7B882C70F56C7B40003C599A8AE5D95B74F523248B1E8A0566
-872871D3003EA4885DA511FF01181DEE541F6795BB2D1F9EF7C3DC229F153A9A
-86BAF08D4BEBCC0D2B32833DDB4639226DAE13E120A99C5795083E80643C153B
-12744DB8D138E17B3540E971192EEFF244BDD5E799862023C858B885467E9E0C
-8D2405D1DCB579AC44CCDEC5AE5254A017C6ABC65E4B072DE80E9683A9A9815A
-23A0B829E805F069A98FAD27F3383F45A111AE854D512777FEA721804B019A6E
-E16F12CFDF017093A2CF52A4A92683E3B225EB0C99EE5AE97BDFDCCB18C5A674
-F48DB9AB89038911E912DC1190AE495C6BEC4907D0EBCFC1CA4E153480285B87
-E5C03D8742A43382AD893B58CF1CEAB04AE2424164AEA7B3479205A0B2778AF1
-44663E61F1E8B22F2670D11ECB8C8A901557F382A909B274B20725B1562CAB3B
-C57C8F857E9B99E033A41979E4EF543FBE70074F85072866D837954AEA7D9317
-3744DA0394C9412457E1C2188728371638DA19CFFA2A642CB0D2DB3A0D56F1DB
-CEE646B9407645BAC2A3CC8F14581E7175B1EC76B0BC82EBB69F9A325A6FD630
-BF9FA4967F7A42322E2A568B9B6D9878FD68F2254908EDC36060F474346BF78F
-7AF59EDEAF883489CBCEB0671CE77FA180FF7998FDCA6C4635785D8505A45824
-7EEE6F60384BA5AC06D4A19C0B127E15454A1ECC70245CCB99E271E83E42EDA7
-CAB83D34ADE335F91DABF3F0CE8A5DC8D4C0EF7F250391E51CBFD1C52B92C43F
-CCA1A3B71AB20E995E5304A031060FB78B663E939470E0F0A9602A56E0352280
-AFE8F87758508DE73CBEE78EC452185854B11B280AA5EF1D2D3BA7553CF54FC8
-1B73EAD7E3FA7FCA7E8558FF72DDF68B6F7E50CBDB1B51D3D50866F1AE4AF193
-BCB3D30C14172FB5F9E8A572F83311F1C8DA3C8FC589D01F32B7F96A794812B3
-E581012FC496FCA018C5E9C35C0C2CB6CC2E03F7BCF993B8B58AE58F3EFF9F18
-C49B86B75F8B33144A1D4DB7CD1C5F7B1A2C362D1C7E2686ED7DEBE396116230
-FEA4B66E13A90CE9C61656BEB535691E3F3536EEF300AF2B7431770DBA738220
-CEA26E86305F960C867A56F6C071F41CD6F5A0B768FEF7B5B29E75FCA8F336F5
-FF0135B4A715CE926A7B78D6441053AA2515C96551A08CB94B77920C8DAB9C72
-08C6A760677CFAF137665CCD19366603811CB5CD52D512FBD763BD62931BD5F7
-DB0BE87955C0AF863D4A7B7150F33222E24FAD730E0D29FF7A88F5BBE2272A3B
-69BA5BEB0AD926E9FEE21E8BE08DB110657546284DC9E724BD0C79EC3361C07F
-7EE42824DC1CB72ABF5FB3E3DE9CD4EBC1482DC3FB57D84EAFEB307378EF4B16
-7EB0832E5AD1D1AE04CD5590CD3E0042F528EC79E292A67E38EE3EBDA2335B1A
-1FE95723571C040F7AF835DC7493AA5B49904EF6F1947D26FEE59628A5331DBB
-4EC4A21D07231E85941A435A74F7DF7DE42035FC3146FD7921D02F20767A9797
-881B24164556762476E17D0EF873F17CC4BDE322E3A5241FFECE04EE7170E0B1
-835607C7716AA603FCAD9EA5FD2AB1F718733B58F31233E37A3C22DF2C3F52D3
-4947E041AC29A07EBA98F0261E5C9B5E280B7038568E470DB4D6DDE3ADA5B12A
-69F715BD02F4898F9222A0DD58647A31EB890F2592A4AD7DBBFB7485BDE7066C
-1EBC43C9873052644138AE98A18D4902960F2B709D194003346B0B6F810A8AD4
-21D63E3142B7589916B3B4B56C62C1C0FCE1713379EFB8E760EE7295AFE5E4AC
-2C38425CD1E4056715ED2F9B4E31E0F05AD10E6A52F4CBE25F37377A4E9E08E1
-16131D26CF7432D5F289930BAAED1E3A444E011653ECA7B9076094B5B72571A2
-D29E7BE5B062B0A69F7AF0D20CDB6F156B63DA9CA564F483395A88206EFD6569
-48C59535FB7AA8942518F0E85A8BF56E0E8E30A35F47C948DF5AC6EDF01AF41F
-A14D10ABD45895C907DE950927DBE09F79D53EFFC6F5681D715649BC42E8BDB9
-86894BE664314DEDC69FEDF7EDF2347DFCB070CF591CC8F8F14C04D7E665C0D0
-A413590A72D242D6B619A83DBC75754DA87F980106A17B06F299898BBE8C51DF
-70A6DBED6264DED8D4977BA25AB7DBA3BCE39AF7ADF8744170E7D4AED20EB63A
-EE248A5D3009C47700D73056995596A2DE0C316785F2CD4C12B442A6DECDE45B
-9C0F023599FE9F3FC5658CB23EABE96D597812EEAFFE50F9C82CAD33625AE0D5
-FC43ED0B732954F0058942C1BA515120E7D77A61028770A3CA029DB5FA12B06B
-DBD4ED00AB9D53A705215898CFB295D53B38E5AAE8589BC0CB1A942D86DE0FB3
-DFA195D7075BC0F01B4EE3A069B115D237DF36E372B650903CBB4EBAD1D6379B
-0429886D3ED160743BC13EB1C5F3AEAB78D1C01A27FDEA6F1D977B5F53117326
-2DA2DB70686F72280200176D138796F7730C9B883D56B8CA95A59AF0D7E943E0
-230D25BA4B738DD45E7923E09DA7D53B9E20CECB40247922492A5875D4EE9F33
-01251DC67C2D69895271F9747D0DBAD71C6E1BB31E734AE795042A285AF9574D
-63913566B3EB07994867850236FAF20FA42EAB0535D5FA5EC4CF80BB2B13932E
-7AB189A5B680852DE51A2417A70AC10DA02549E09CC96FDFBC49E39D1874A93C
-2A28AD92F036B9CB36B5563EE2992268B1B02D11E4E51D8F3D6128DE0133BC48
-909E0C6156E527C9D87EF5C577B5E6789D4307F2BDA049B17A489A32DB9BF19A
-A181375F10E7AEB96561662DA0F6748D37B99D116357AF029C6A25D761953BC8
-A91C2E06A070AD94688BF7954EB3D084EB4E3EB03E1DBB91AC3F3A14C8718981
-0EBCAD4DB31BFE5ED25382BAED473B29F07E225AC3B45AE131478E544BABF7AB
-C5C59D01188347A370F0D0E937D8F4562F2450B77D871C775116DC8B041C0AF8
-FC8C9B67C4474A8723ABA7D4CB318D941BA18DC07373EB74822D41D1C859DAC5
-F14A7B1956C000E545D6F617AAD2BB0D545ED9FF3851C123A32AA012EBEED2CA
-D81FF7FFD29174655C42DD6545611BD3B00F47CA4EA2D9D0CE4A01523CDF352D
-6A8A2F201EDCE2E6CC5D6DFA6DCDC12775D5261EB120056D88E080E5F5CC03F9
-F17427E7F8A02FE5C8F3B125EB22DDC9E79640EEFC4B643C915734D7684B873D
-51940066B31876F5A58A3B7224BC067C7476B81210CBE89E0714449CC7ADC971
-42EA708B18C60A9895B6CF391C57E815D05D8FD40A12B6564C812B371CCE1B9E
-B7876C9274B6716C8632F07302483B124CDEFB9E388AED5E330E8DD89BA229DE
-33331F6345FA3505FED271BC6DCD0087CDF347DBFFA4F35666BFA5C1FA6DE923
-97A056410CE3055CA869D9C583D801930E1BBA5BF6E6F2863F59ED54DB785010
-9F2AE393AB3C939BF8AAEF7AAFA0BE486855B4CA5E3430F242636DCA37FD0F38
-0315BD038B071C53193CC56934A5D428BFF9AD882BB5C3C639A3FD9693721E3A
-7E29412AC40F83C609ECCD2C6B52D93C8F5FDA19E1BBFC88CE8D0867D3A611B5
-A4C86E617E6ECB65C4AC34F7C40444E5891308703A88379BD35EBE3FA6A65EC2
-2A20EF94D793591F1F6EBD5B5AB92BEA002E9FC9C665AA1DC0AA52F4E5FE4E84
-F425217C32B82D8EE65A9D74B74EC359A9F117FF6E8D4E0635512FE4F387C6C7
-9B001E708417A717CD007D758CE443C0992A12FD65D06AFFE668E7A8CC2FEECC
-7C06025509E5C8E89D1D889480EEF3ED695FF92E7907860065C632DA306F6F29
-C434C5B6CA2A230F5FA0E33AF207EA5224B8603A554D5B57F1D353AC785FD431
-71A1473AA77E5EDD11FBCA16BAFB0057B12A30E3272164369F36542D813C360E
-9E1A3E8523A1723F786F34AA8ED9C5E0E79BC8489E65CC14D444D43EF65E52B3
-9937BB572F745603D59070B19A99B575DB41E09603F7A1F97BD603656E7B8F93
-B5168E3329AF11BFF6DC7163E2FD545BD213668D9BD3503D61961CB6F0CD1280
-CD3C349AEF61C49DE74EAA38502A51A4D5D0397C0F04979399A24C1332BF9236
-DA1A31D9481C13B1263F48A8D06351E2E860E7E7115B1F4FA8AE0E970EFE5CD4
-96DD7332EF2371FA5A2CEBED96A0BC563018CC42F51CE45E06CE5BA442FD31FE
-9BBF37A952BD37B78F06858BAD0B5B6625D943690E22A1C3F9DCDFFDD1630992
-A684A77DAFA50EA4D581074765779C4B2A41E3694FB0CD14030B885324120837
-1601DE07811737E429CFC59B8F4B859B2630FBBC2F46A2693DA6D1AC17034F2D
-68966A6798BF0B806F6A9A7FE369B501DE71DC9378E2005B5300E7E03693ADE1
-ACFF88AF74F27AB46304727A54EDAFC01D1E80A7E27598DE8D634D80508AD1CB
-0A06BBAB366C11D4FE2A15015FE4E85358EFFB71C9ADF211914A23083F71838A
-85FB2421C14D308CCD77A13E767AE60383F6967C877B299EE7A8C7413ED80D64
-530FC64CE65979D77348049D3A6F38ADB64E811976069F4CA20C8E39210921A5
-703B878F6C147316E8DD47066AF2D551161196B0C9FAE339104EE8E972932592
-CB04F23576AE3A61727E4E516FF3044724346D639EBA08111F1D18A47EC2B48C
-8E71F694412F029C85E990F099CD44D3BA1C5D3F2D8CDE64A3753BDE633EC0DA
-8D84255DBB77A07CBD3DD87A3993A5C3FA8C646F36FA02FF808329922028FE03
-1CA83777099D4FE72DDB0A14509865CBB53B44191937440509F542F3EE5DFB1C
-C124A4D58C22D8C9CAEE5214E05AFC330B1BD639651644F3C5E45B2BCCDC9AB1
-EAA1F69A5DFFAA62BD117724B278907AE755E2F9D30E4FCA48219D7840B2E799
-7EBBFE7CD2D02132EC89DE5340858DE4A670E931969B808E5FC8E1108EB3EF2E
-01C8E758532E78E6AB5E5B1F4C59F974AF1F0AB5F2FE1BE61E70F71920960B09
-1B5668527F343DB865947B284456BBF00A696353047B812834C59A166DBB8BE8
-92CE57146E59E8DD2E1CF1E356614AD29BF34D6474CEECEE1F90D3E776B0DF8F
-CEEC8D6F49714CFB6AE2CD7F77168E8977CDA9191C25CFE7A726CF78BC41A535
-09E66A3A97139535AB94B385E5B614EC835DAD2756F4585FF40483C65086AAAF
-DBC5F9A5AA28174CF307A4223D27E10720EADA0B5620C3C85D211D00017BC843
-B3F5A207A41199DD72831ECE3CE0F674F5F942AFF93D541651CD027D82E16179
-8ED292C0E2E5D4489471F860C0300E428217BA5121CC668486B35EEC259EBB28
-B0CF1AA02B7ACAF293D22B618C537A873247E4911B2ABA5B784728B4167EB1FD
-066712437790A213DA5A370F1896735DF6FEEEE02E2FB0C7D907434932DF650E
-65566124FA36D25812192E6B2349FCAB5AB2F78B5DF4CA8706230B78D6E70F9A
-3CA5D6CAA0CD72D2269D74A4473D239AE7E68E1DAE8217F890A4889396F86299
-1E1A3AB1C1298DF1C22A1BE1E665C6D4079B94EF89E816F4FC07843FCE5199A7
-20CE6B6D064051B9A98304E3C97EEF2F900C010E06EDD686CAD64F853A1E22CC
-CD9E47056A63A4E6CDE247A8903A2309B61EFF86E302858F1D236C5403F6DCA5
-9ACE76A2F51337BAD4A4221FD721387526DE8FE12FA25DC7802A111D96E6D974
-48944AA7A92186241F681392B54CFD91466EC39ADE17F24470C44DEEFAB641EF
-C9F4D45E9DD2911E9E50C150186F4D3395C2684C6045DB59FE947DC169D2149C
-A591690091C7ADDBC50DCB395A16334F68E73F3E222661838B1F74C4FC2DDC25
-7F06CF877B94E1D859FDC8CA40229A43D03EF76649A6AC920F73D8B3928F161E
-168520554BCBBF957883B7112B6DF94E62408E24C89FBEC3ED02561EB664DC8C
-3A72E91B03479C2D3CA8311B7F42F13F6E95D772ADCEA91A6A2C710E2CB3E833
-E94D5E817E2A8E440CC6A3D75C78487391F1FD8B85FE14C22C619C1AB4792BA7
-0B96FA5555FA29A0A847202FE1B32287D172430112C0787034AC9733A09391D6
-B5AD1A920951804361C8E8A4E4364C3E7FA0D108D4BEAA2E5370826A919D6C9E
-AD7A77D61C8ACB19DD62AE544CE5871FEC9E99A90E7DE5463FB6CE253AE40C78
-3523A3CB5EBB7EA51219537716643CB1B24B73EA26F34A49B52DC14F8441E496
-430DDD5EA1A7762AAF938C3DFFEA1934A6D486F9A9057B0B087FC35B7D97DAC1
-E846E39856B07D81DFF0374175FD94ADFFA6907BAD05820C519120FB80D7F5A8
-C08673F2D168394FDE83063EF080B9D1C52E9CE5DB537ACFC3009B39005F3988
-ED1CB1DC24F9278D1FF0F91D2FD9BBB5C746019B00C77C9C90EB833D42610736
-07AA36C7737ACB0DEB210D9C6DC10CE47005E9519C69D6264CA1160818CF0FE6
-63E9CB5FBC59542DDFA431D192C2C6ABF694013024190FC8422235CE88C200DD
-18020DBC11C9E41B12A45D23EB8B56FA7A4BC772B14257D8CFF8806DB05D3F7A
-AD6C71709841942300BB018CE63B35400F979AE4F37A787C10B8BF36A41B8FC2
-1E2940FAA7EFE3BA8BF96F5B9650795132B00D9C8DBB52BF0D182A853350467E
-EB02FC268F4DFD4FCDAA1BB02C9722E88AAEA3536C837E34B53BE9C2837BF188
-CA19639F2974A3AE40A8421DD5BA1DD903DF9B63E716FAD3E9E03DC6234C3988
-5AC8782612EB6F008DC80D0C758AA75D4A3909765831B2068A170AED234BBBCE
-DAA91AA0ECA9AD4C14330A168762D119A3C2AB0D552EBA73196333042B2A2F95
-0DC37909D3E3C38FE9E2BDB8B2CB77A6DEE2D146D777628B35894A538D561983
-55E8F2E37E00E1A182090595C7514EEB78E9D8AD37859077F102AC1496BFA3EA
-E1790FEC4B708738C8AD9C3542482D75E5960B92444D69AC6EC2CCCA945D23C5
-25CDFC2DDC08D599746B686A1485F474D151C326CF5C0C62FFFA4ABBF5353E09
-FAC520B165577FCF2AE0B7E623ECD3B44A0E7DBA7B0BA5B4172C502727283D3E
-0F4B4EAC070DA76E72B911AE6567411B7D59EF3622B213FD28AFE3645B061065
-ED44E30EC1D81A1BD801EFAB50C2AB27443AE9D256D4CDDC907E852BD0B5C8CF
-DF95B90D45EA2262EBD8BC29FAD72D6B1DB7669B2F33A6368FA260A407686AEE
-5C622E7BD7E620BD735A5AD6CDFC71EC5CEF80324CF59D53B945F9CE2EA42806
-E4EAEF0D882FF37FAD4D28E4A68D221A735061A5A25AAD9B73B4EAC3455983B5
-B717059B778E47E00698EFCDEEEDA99C754F6C61D56E617DD78352FC39F927F0
-0BAE0683DFFCF55AEA0E7CBEDF278706D147B6BB099950E1D6410A1F70CD056A
-C79CF45A2F03B522D95CD9056E31A51B4C71A10591BC5AB0CE178C529CD741BC
-0F4C7854BDF9E1930D2D597B444CAF59838AC30533FFC1D39B74D99E82E2DA11
-BF169929A097A4883B7CAB01C37D073E230301F4D58396D428F541354FE82CE0
-B360D5DDD4EAE075395DE968192606584ACB94493670C5DDA0DB8D8500A27786
-FDD7D908CAF14F86971771C604EDEB9337DA9A7C08135CC60D7D5CBA7DC822D8
-81011117F3B156360691A4353C84AEDE652572DEE12790CBD357FDCCB36DBD5E
-0052471DA8B89500EE6BD0BB9994FCF9F949E8FC9B92660B8FB66FA182447EB7
-7728AE2A9BF139C9AE75C9327257026A9CBF8AF1F80D0D6E4BE273148B2111DB
-5E76643CCE284E79FBE70347AD0D5D8F81E6944BD01AA02C3ABF66C27BD39E78
-5B8A035A17D7A8DCD0D241FB65DDA12357357DC0320C0A1ADBA0E17112A87682
-24A37F48F45D0870441DEF18F885FB7DE5726D545D91ED71DC5744D9B81B4EB5
-6CA17C065FFA80815D513A50C5E6762641EB969C1EFEBFF6F022D95F35AC3A5B
-9DE915A45BE37832AF5BCB8FE8ECED6566802185492E24C348D88D7B2AE14D33
-BF71D8E692B0857D1E744E75ED367B1E792F258F7D29F69A2277EF81CEF1C8D3
-D84C989219743476CBD75F8654CB76B137B8249B3A86513AB2374FD12027520E
-EF2707F9DB82CC78E312E4C5E1B52D50E6B21C37F796B40E9CF27E98080D3FD0
-F73FCB06B74A82D5C4CCFD484E8BAD2AFBE25A5B8F1CBF25412B160AFFD6E425
-86339EED833E1485508E6ECB2471393636E58ACCF1DA80B0950A3AC134B324CF
-F7D80AEF4ADBAB4E02DFFFF5D4EA2F87F667142A6FB5EA8414ECA68B302DF431
-AAB49CA5D8120C95F6C4E82BBB70DAEDC7DE821AD4B5DF4796E23316E5D20606
-DC9567DBE6F5A06182C3B9848DFF54E02EE26B6385A6F7CB9C5EE0DD0CCDE6FC
-E6F98D726F64F190DE1C523B1D4472378FFFC6F7281495DE8C36300F2B696308
-B6A69407FF6247830D3E1A6AFEA8C8DFFD63A737CFDE9B9E1780B93EC4244420
-9DE722676A7F64EED5F13BBFB0980BECEF18E55D12A34B13A4FAF0A10F74B88C
-59A45F668BA03B900D9F2D1D8220E647132604DBE8B06E0EAD7670A7D7485DF6
-30E8C003AAFCCF7DA4C3672EB8B76E56A9F7F0F5EB631008234A046205C7AE83
-36BEC5CE37BB25861DDBBC4539C38E2D99E6B17A0497C919D5F3309C30E43281
-C714450D9F883CACF058F8DA7B93192F76FEB29EF1BF10E262EEDBC797D85936
-96CD3B3922F727DA98F359DCC2347FA95A7905B5DEF2F0B3ADC90301405974D9
-792BAEBA9EA0070FBA6C842D40497DF039F975F6D85D705D3F8DE8386C8DF996
-39EDA645F3D1F7DA2B87EAB5450F40BDE12B26D8D4A3433668E430988C1F7D34
-0748FB4D4F886762140314F3F2D1D16CC6439A033F8068F048179605C5FE9023
-9BCC22B5D7B4E8E9A1F66A5A9D3A888257394C353C835BADDD00B2BCD94D46B8
-DC3619E4CDD01FE753166022055ACD7ABBA49BE217260A47843D3E7666A90ADB
-E3ACA94CF7AB1D73D6230446F4848E5111E03A5C7DCB1CEE340ED84F40660D75
-6FE5D691F5327A3314DE7622BCF2DBB738ED7C7B3BAB9A975CB2E739161DF51A
-51B1902F65E6E68D77F2ED65FA45B7338AACBC2D6536BCC67B965C8A2F32B576
-EA583CEBAB347A5BD4CCE61EE80200D886FBE41913390091C747D12372DF4A03
-A2B68A79007FB7A8A87CA0E7247F0B36717C95944C34932B0B5E758ACFCAA071
-4DE4E88E5B97EE25E3503045B366EDB477D362C34978CC1C66D4720DDBED2983
-A2F6B75572F935D08E16FCFCE23A32B9C4E8BD895759B96F64D4B1509E0F50B7
-1F2190A352478EE247BB65E5DC605436F58E7369C2A5ECA8744FA45B251FADED
-388F1974505305A520E2B39B9B390DF9170097D17F36BC0A52C59D25BB5D0AD8
-52A9430750B489AD524F7D3AD811617E37F3628FC6BF331B6A8A3C1A874094ED
-5C5085554A5B16D60679E9825FE8BD11C4E5552D5AC595745396E0AB8FF21EF9
-6BDF132EFF5804B02FBF46225B2DC521FAB66293B1BCBFEAEC26DE6BC7BB58F8
-746A67BEB786E5BE2642B24D93A46C31EFA288D7D0F3D54FE578F0339123323C
-75F1EFFB112F0A4D711CA88946E0CC691EDFC3BEC310AF1354817736D6F2D5AE
-D361466EBD8F52F0D4935608FB2F520A49F771A3A19BBE9AADADC4ABB9006844
-7503D94FCEC7DCBA66D258A76E8BADD54DED70AC66F0EBC6F052937A94C13A35
-734578911A9B39487E51B0F5BA48DC09591FD5A1D45ACC368D91C3CD3B4A9BDC
-98FF62111F1EA93313568A1162523379CF2BA6A240AC489B3A8963E42D08A8FE
-EC22C16D4CACA1B43606A76A9BD512A9DB20A40C3CBC9C35C2784E4BD072C04A
-74B267B18ECCA5F59DF84B74A361F5406C582BF99B99F69AC1A4F57839E37DE3
-B8AD9D537AE12C66BBFEEF8E7580273201FD665EDC1B594055B8D312C303AACB
-E07365CC0C78B98A9A62032438D806340D1BCF852924854C4E50CE53BCF8562E
-F632AC26B18AEF9346E29B019A19A2ABFACDD303AB7630CD91CF68E229F5EC79
-508ECCE0E44B8282523ADA80350D28B3646B62005184736B434FF29472B67D27
-27BF7DF359BF0B7A8CE5BD7B6F49126E8C5B429E57910ABD55CAD54BE35A0F15
-6E50601498CB9F0AF7C88BDF21E6D600638ECDF5F17AA25E25F4ABF98D91E1F2
-2AE15BFC7D8A57924F019506D82083D87A24291B1DD99CCA652ADBA3F08F69C7
-5DE09432CDC283A3F139FD16B3CA7B15106795D5309D918C2D3302548CECD9D1
-2CA6690DB242949D647D835D86C94709BE43333D81F800527DF0EE89CF11EA53
-C5FB7B0E2A5C97477DE8AD164228AD96A646FD9BAA1D497EF07760BCB2CC2C23
-2502F8BE7F8AB201AA730FDF14038E60F137A5BEB60D9A43EF3DE2D9417A4DFD
-136EC1709DB3871BA2287FAF13674BCACF09CBD5CC9050A06989740A1F9E76DD
-12D8CE4739CA3E15C41EA616D69B1FE079B4A26C45279A105FB53E75E0C49D8F
-B84EF948AFA24A920699BB185FBAA8A85282F97710E82AE77AC3F32174B754AE
-306DEC0094D9E4A48C9F91C2D6662E68B29C56C9367E7980B1359D3DF33A2D1C
-DFE766DB2FF85CDE7E591B991D135BDCFD8CB5EADB07E3519C921C6614D5DFCB
-1990A6943CBDD41ACBBD5BBC0B897DB3E0A89DBF059FCD9AA77B2E418A118721
-AADE7767FED3BE2929C192165DEAE40640040910AD1E205A86CA27D586C4A9E5
-001E56960B9D4905F60E8A7298D615FE09DE4218CB463A89908B6DDFB6BE54D3
-745F090F39333A06017CA640FF1CA7F09B563EA8FF89627E679294CD5C727D25
-86A4AB9AB2ABC2F6AE5D0C65EF16CB93C42866DBF5CA86332526483E49651277
-11A5D0F1E6A64BC17A6E76C8767A125FDE537D12FF13B8D274E35A3CBC2A89E3
-9E8C55C2AD70B607A624B0A67E0BB449C56559D23BEFF4C2BD99F67FEF973C1F
-90F938CD1981C7DF56AFAB82C7CEA98AC7216E2B4F80A26D68C491116A6BEEE4
-ECC054F7DA563F07C4A18EFCBD45A5FBD566EF722F5E71D5C95E0FA2A33ABDA0
-07EA5CCD03D569DD830BFBEB88C7D5DFB6B301555B2A14F15E565CCB4F12B60D
-E6860C297F90F9B8A0D39942888CA8A3B8200D5368DEE25B0C0432377598866A
-88201A65C0716A3DA92B2C3D05F20A0143C841E54279AC22DEAA33A6C75ACFBC
-E0C803F82F6E79D871FEF0F56D7B018172FD281CAF06D1FA247201FB1CE5081D
-3CCAC6629676C1FF1B0E64912311CF8196860048DF27FA097CEFA4C257C426CE
-9C61967EA4AD40E78793F4992E30D865257AFBE6E3411547CE3117868C7A0D96
-887582614E2D8A2543F9408B69BFFA44494A9D469722486FA1A8E84881443843
-4CE118ABB689CFFDB6233835669C2640A60C376866A9CC1A4846817CB26A2862
-CA8F4F5DC66174C7C62F853F8704BAF1B8BA8934451B73C9D23F7857F53A845C
-E937BFC1DC27451FFFE0C75008FCB9A372D1E4EBD771878BCD05D9B3C598854E
-33D19ADB2A50CFE4D82723DD4F94BC6880EE00BA9541069BD5E6A658F0BAB38D
-769C47CDD3FD7D664A35F9C0758DC060415B5514A31C6BC5E0038E2B4D5B6B9B
-C246FD9A961E7AEB4DE3C4DF0CC1F3D4CB0852EE3AE72CAF18AF005AD96224B6
-7D9462A0C747679B00D81AC906B64C5B8D3A500A8A1577553E25E1A7D91AEEF9
-FF84203A025933E56A0ECE5735436323D6FDED9B4FA26274D650AC3DBE4B0AF0
-4ED960E495203FD67C300619125257836C9DB76F650AE523401EED4E5824898F
-A1B77C521C1A070A5D20BB324C90207B01A0B86A6F42DA7ABB1B2BB2F8F99782
-4331894668170332E3894E80A5C43DE08AB3AC4074B1DCAA5B43BB354C54B749
-82D17D9B53CC5B4018CE4467D250B4F98036B0CABC0B149FC7B2172D60FA5188
-512E7801FF83AFD47B0E87ECBB64281E3ECA9728A30A3B98681FFDFC8FB161B7
-D57F511AC4BF30C2D548B9D38371EF4E3845C5726C8A33B20F2013833BB68268
-A326BD1C199E3FE776EAABE066CCB4C80BED3B558BEF58B6EDE92A692A8F90A8
-45D322A2CDE3EA8DAFB316B510CB1835AF292C30F58861B61CC3816DD5953673
-2AC0CEA62E52CAF6F60FEF21B726A41CB42CB7202E3C605DD481BB7072079903
-8F5A0DCF8142A83B2D746ED1E11521356E57C07402843B6F34D5EB212143B5EE
-7D49A9CD2ADAEBF0F3203AED4FFC99B05A05D74F8BC7E9A7E0F3CC73CA87CB1D
-F734DD7E6DE90680D3DC54739DA1783ECF3DED371BCDE79B86BE61FD0C25C656
-89BC9B059AF6359719A55F1E095558673B2B6BACA8087C729F7CCFB5570631BD
-B87A8BCD4B6E1BBE918A44CE8FA4694670DBD43D2D87A8F04722310F2893256F
-6C9F2BC39723FC1504FE00753D76554776E370385DD79F72322A8FA32F1052FC
-A6D8AC2807EB52000FA90FE1275C8876ACFB3EE0D81589920F00E00588EDAA3D
-A6F2C43E8400C13690D6120286A3689F217C6312F8ABCECA44B8E11DF75AD509
-0420FB5AF0E18F7BFC7A69C20C9E3FEFA7D951AD9724F425F38502EC29D32E28
-9407B9E3601773287512DF1D279F0B18B856367996317FE0BF47A30DC0AA3A72
-F1596681512189F0D954A454A16C89F0F109CD95E845CD1C06BB122E8D58D71A
-EF61CF589BEDAD6ACF19B30ED3431E93F73C9391D3A31CF94DEB212B4ACF956F
-B2A859BC2F96A5B52C6F5DDB104FFD2EE135484C53E4CBF8F4C9208B53E64C88
-68CBD15D46897DF78E2A0915CB550EA70103C6738124A0639FE3498C95A8A1C1
-3BA81BA5D5DDE68DAC731A5F84044D94B22462F47DFD7BB38B6AAF0DBA52DAAC
-086434027B5058AF07D1307D6350524029E226525E8FED9835D9D60F301F1D61
-8E458D0E2C7F243508B6ADA892224766897B70B55EB9E6AD6BB39B1B639E6B8B
-66B73B761C81CAFEA2EA01E1C3C64BAC284DF366B24415DCA1498377599D9248
-A5335694C94E134BBA10FA0B4B53D2ED32664C8951308966F5BEB37E110E2D99
-EB8752F75839EF2B602BCCBBC7BA8460332BE43327EC7DCC8F0F57CDFE262AFA
-EBB720D79DFD9319BB889BB0DE1E2E0D064641764390258215CDF0606855934B
-7C8C0BC1AF945AE45B40B970FF4713086769EB30BF30F272585F6EFE48525474
-0C236B1F4710977AFEC9346C8A920D4A8832015D401CC2A44584643DEC473950
-811A3B476B3D42EF845657E45D390B873D3ED65C8D9C3F6B0C189BCEB6B46A11
-E103B9B0A0DF61A899BA5CB68CEFA1297F156CD242BE975326849D2C21DE504E
-D4FD3CFFF53A29F671A5B3ECECCD598010C52CCD451620AB99A917C3DA3EE592
-98D726DC6BF96E9D73EEB778961242DFF2442D8791E09E80853A7F16FCD9FDF7
-DDC4186E54C200403DA07294767C219D161ED55B8752793C8FE1810496C3B855
-CD797C653DAB010CA1909584D6F42460ABEB8E04B8A472D177995DED8ECBD456
-99C7A2D42C6A64F8CC8B14FA0B06C98E1573AE19A086556CA062268AD02A3C2B
-BFFF7947BF44979A39149E124C564CBF1E782E55B219D13E87B790D90F0AA463
-E2107C5A76CCEEF736A73ECD38C30BCF527AA53CE75B6B9DFD35288143610D4C
-4954585EC5AA5F9DA22A5A9F0AF66BB8296283053685AF292FB8C891F0386ABD
-2DE33BB1F86D984DE21DB7129D28B06DD6752877F78F04423447A8D65255FAEA
-8A6AADA92D06BA150D7F4031639F3DFE149916186BC2FB0B6B616AAFEB7455F8
-78BD9E857EBC914457F1C2927BFED78CBB77401B776C698AE100116920383BBB
-598E41582E679E99DEF5E5E50EC75F20089C70209AE12D9A7A1F01DD7B815CEA
-11766F2B5B82D13AD78BE0CBD7AC82DAB46575CD90CE59B2FF705F328AAD4BFB
-B60839735DA8648F312AAE70AFC24CA58339630E430E417D4469C39328FCA6A1
-9BB91791521E7D43ECC2FD92399E250443C9C0D14AB1DBCE22076F81C286D61B
-136A956E57AA9BD12B548474134736DC80138C678A437BDF746F9140D39203B0
-C79F51F3E31F679CD80B1D98159874260DE5A298FF11B5ACC461A567E1F7EC81
-F4232A80CCBBA20F071F0BBD6749CBE8DB8724D14D4DA2DF0676E182B0C165D5
-397252C6DF93F7C2C52FBC3DCC24910929A0272672F1A94C03172994E4FAFB47
-76FDDF661F13DBC3E0D3882B5D576BE48F2C16F5CC10EBEA40CF90BDF4DF4997
-E79D92C92B4D570AA930F0C841144E440AF24893979008E0A8D2DB3FD81AAB59
-426A49E8FD770654C520289B2D48C14B35A069445324E37F66AE20BB0EB1C27D
-4C23AA633834A3193129BD9C9FFD8F8C152D9819F852A0522DAAA38BCF1687DB
-E22E3EF59EB2D3831261A88106E41C86490C32785858538FB9FFDBCBBE186DFF
-3964C03DF7FEB945B1049EEDC856C5F4D51A8C57ABE0F980FFA7E9BDAD21E476
-67976A0DC9AB4D84EDA8E9926FFBB302CAF28CC3FE6C58680C26ADDC361FA10E
-42FE75145AB186214E03558CFF881EFF28DFE535D612243C8ECD8C3C2DE54C1D
-14DBE7DF5200AB36C47064E7BFB0C554A5F6A03B6406C13FE6D724AABC071504
-F0C55CDC2F963DAAA255BA3F91208DCD272D395273D98D7A0083301D0186A37A
-F2D0385CC5B0698C21A197E57145B1D32AA873D851664DBB3B672A84A1EDF6CA
-C3EF5EB58023FE876BD25AB9B8AB1D4DC1966CFED8EB3CDE280D81FFF60836F8
-68D3D51813E9BDEB6F54FD448F6C6123615E12514DFD986532530DD65E84986A
-5BC1C1E3B0E760D88730E708270924E98890115E3927EFF1D8DC891314EA205C
-DB1F328C8000CF7BF21AE594840F6CD56B6CE4DDE05D2FEA79A1C037BE44BA87
-D9B4EEAC6D044464A719D6674B0249E512F4C3BA6E6CD5AA138BC1C1B0C2614E
-5CA4E7CE5773FDEF44A0248A47031B2F8D06EAB92BCB2157D4D15C93139A800E
-6BC273669BCAA825AC886E8F0B308F3E5E7B6F528D99A1B6858BAE807B162ADC
-C02397B3E017260C723ABB24582A414CB1793BB5F4ADD3762366F880936D2906
-5D8D0A3C2EC31C3B23FD7C5A92246E0FB2DB50236084CE103F56B00511CFF8C6
-5C695FB66A1003DEDC5BC43ED31DEF5D2320DF77D2B712C5DC53F32978E14177
-0E95FFD8FD13E8BBBBF030CDA5E4F05BCC50F4A7AFBF5510398A373FC34032F8
-5CD80440C7138DCB9A85A656F0474D070AF48198CE2382E92C855ACC69EABAD5
-CAF94D8A4D76EFB4E49953B8EEFADB557237F495B0DFA5C3F7BADA594348A88B
-973E5CFCA5783B20CD3DD05310B24F9539E4C30689F636DDE164861E8702FE25
-2DBED89160E815A617A4E7B1928FD84851B40EC28C8DCF9BD9D95C5DAA4DE46C
-EB78E0902B36B389DCD3DDB8C8410D684D003A989A15906A38F2E11F4CF42324
-DF9A1341ED9970A25C4ACBD73F8E68AEC9266C539A920EDD17245EDA202F68DD
-42CD0F2E1CF99E2537E4432546DB208EFC3CE2805BD937220A62E692D0B8293F
-7831E4E5C580504840B4B5C01B2E73C6BECBA5BF37CC2657A2CBD51A828A1D82
-12E7CEE63847B2A80DDDEB8376EE7E364FE47FE1B6DBF0C2B052D7978FD529D5
-FC880C219D892B1ECC5617D30051860C482B2D6EA24DD5B8959372DFA8D2AEB5
-C06860466A2D22891EC71BB7640449CBA679E67E6C71F44A68AE7739744AA4F6
-D4FB1F74C20B301CC545737F131E0DA3183F976ABF85B68BC4AA63FDC006DD65
-44A1C122539EE0A1C07F29EADB687C7AEBCC92FE2E245C330C10A9B2FBA8C9C1
-0DABBEBEDAC3B91FD3F6D51D653189152897963E8FF5EDBAA5D92381EAC86ED1
-C896B4379433DF5212C843754A3AD3F217863353C76153D102359D803776096F
-BA9D4D6DAF5E3F2CD47762468AABE5AAE4387C54C2C142E5A63ECB22AF0914CC
-32FAD5435E23F7395871AD8CD2C02873E7EC7900CFCD021446487A9E6820BD63
-EE0EA22F8C82A90D59246E110F696F2FD6314F65E209028CE4B211B7B58A22C7
-C6B82C5D0E0325A92123947FD8305924E2BBFA530C6E2C335268D2442D3EE9A0
-5453B3D87E5BA383071CFC4CFA7131D24004ADBEAA6A80040EE12619B7010973
-627EAA9C69322997E06B8F3E10105B9FB004089344F9604D50E9CB75FF6C1B9E
-208347262D01ACFE1A26E6B6A1724FC811A0B602F9C5221BD2359AC1A27D641D
-B1824E3EF3C6ED001DEC8328AD41FDF8F8643D5AF1EBA51CDABADC151A16839A
-9852BB2A8FEFB5FD0F236A17293DF1391530A9BFDAC288B4BBABA3E8DEBF68EB
-61B820678A2C5A844B41DDFC96773AB21207C7403182BDE878BFBDB02AF22416
-7FAD6A039256F0321CC568049E80522250E3BFE9D841E18796C108EFC61049E9
-91890A11488944BC18D63D911B205B8DE16D062052A7C97108CDF5BBA0BDE087
-E0B31781C257679FC8A18C945761528FBC7D8E61ECB9417D0AC43857C0B3055D
-F1C3DEFEAB3D9ED3B357926BFCAFD7796994E28799E0CAAC3464A6F8A2203D9D
-F006C837C8929EBB2483D13AAA62008D790B81D0CC90CA55DCF1DF78E855849D
-170D5F0E11B5ADBD7682CE233E26F95CCCE957E16C55EC3397DEF52AD7301BF7
-B8E6117415E7EBA61B9D64ADB3091AFAD3F969E8D28630538AAB1240EFB4EB66
-84766B4DF14C48DF117072E62AABA7FDD41169E098249DA39E884724F89C427D
-F60D85125F31DADA544BE2426690690B8EC4E3F97DA0F2EDC2E1E76F6D28BF17
-A3E1DF62C0AB685A0F22143A5F1BBC26EAC1426CFD4D9DF7F0FFE872E0C9A06A
-2816EF89B5D6CFD470F7D6E0897A27CF607EB99099F8883D9E63D7354E8987A1
-B1F995D0C38EB5CD06D62B26E1B4C14C59DB4C3BB22A796C161CCBEEC0BC74B3
-01F218784FAC50F1D8D735F623D8E568F17362F26AC3511DA3177D5E5C18713B
-FF1170C0FE3E1D71BF5CB13E09582A51112F5E73C30BFD6D7D40CA7973C4E98E
-3B503F6B9B74F48AFD91BE0018F855B449F93BD9D28CF4640191D4F8A2150345
-77C29EB8D6660DED45A25FD769AC5DCEAF43A62DE7FC6144F1AF107997F2BEE9
-0ECFD51B4EA120BD74D0514CF9F704FF7699574144B06A3C9F2485472A79DF7F
-9FA68A82D377F7870F2ECE5E0DFD5D0A182F8C5D9BB8280AF6DD3A66DF28988F
-C4E7BE36C95DBA103ECE133E869954D87FB2D955B3BCAB1F3D25DF55B1DE1D32
-145D39D8F1AC1B5EFC1F77E4779699E8C8B93A78B78BBB181A279631E163FF0B
-EFF6F7B04D4CF8873708AFAB622B2B3613DB434698DA87B8132E1F3E46ACA7E0
-B4C03EC12A51D0E8EDB1FB1F3633042E15E61ED677D4B46C287CFDBB572C8FB0
-64974618F5AB0945CFFFBE67C5EDE351258C528C9633F2C9743C3386ADD552C3
-DEAB08DB72C254EDAEA678C405DA089849720B68AD9FEF4DDB7AED3D21CEAC9D
-73553FE788D35A46F322838050C9846F4145C4A2B89072C4B00514779BEB8FAD
-CFBBBBC2448F0E9EC25FA43AD956274CB6CCD5A4FF228A61478DD68F50BEC3C1
-B580F32BFA52159F33B554510F29386289EBD7CCB63169C859CEA82A88A3472A
-C87FC773C20AA63DCC7C64BD6048A1343439A9B230C05ED126866A54C84FECE3
-87332796F8DA7A91ABDCE5F9FDED03B1E8DC5C61BC139F33D430F0990EC5D092
-B49D10AFE3F993569784F2EEDDAD5FA6E10762D901FBFDCB1997C40EAA885CB0
-52F4CD610296E8C297CE215C7CF23B873E67F6A12B495C415CFC27A0013ACC3C
-FCB54D840677F056886F7A0AA5DCAA07DCDCDE4252B9977D3CB3DAB09FEEFF5D
-B03FBCA4DD809B161685384599625301CC35166785BA66B1A18A4A9564139D16
-D33BC7C0731F6E0DAA9BE2EE103BB8C39E958C3F89E26C2644128BFE9A3CDD18
-1115429D6317BF9A35E980044E9A2D59DCC544D0B25E4FCA28046B71593423B3
-F9E27BF3239404626C495EDAD4053EDD0A601BA04837549232AF2C54B02D3C95
-2CF348F4FE12AAEE0DC4D545C935C8E0A8294B4CE56E026C5CF2B36EA1F2F904
-AD8D130D6105BEA237207209A1795F3D3A03FF1B16A7C3163B99F40F079D3970
-86E64A758BB2A068FBA3915E75FAD7D7455EE272C6D48DC07138172457213537
-3BCC124302C549A43F501A5E4230F8B0AA54E7FC3A644FCB42E12DA142862EF5
-1315E92F31A29E92B3FC3ED944EDE66685B1782238104FE41A7A039D9793B810
-639256B4E1229C87094C0CA19A16A5C5B6C648E57A4CADB955E162B82889DC72
-FB8B11A00C6885B23C0ADBE5C8FCE24DEF5AD7814BE49D547EC42E312D795D0A
-49C06F90CE9F29AFAA258E9BBA47FC2317F45CB73F246A277C0F6F85CD926CEA
-8B119C613F7427969A4D7241AA375205EFA30482C5ADF407AD692D5993200D6A
-A8A7DABF6F9AC7482F70557CDC7E09C3CAC4EB3FEE98605212D9474193CC151F
-43F630ABC8335B4C91E8E64283EDE6A46F92D66F1F25312B41B1254EB6A44BCA
-5EA1F881A8CE2756358AC4084C6311A41827D70F224272C5F0B78C8172E05E1B
-128DE2205D27D2EDA3CC930783879123520ED5F52D3174477B64ADF595C398EC
-6EE39AF98E5EC04CAB0BCC122E5DAB540EB9EA7387F6B3BB208A3281E657A2C0
-F4A215B2B1F5C5F08048A0A357F0B3F4ADE8D0DC91915B78BD6B1666A05C4985
-B3D45367A6B7BCC24D0093AF53D9FE8C91D7CC542C7AAA883A26757FF373EF88
-A79174BFF975687F693BD51DBA40E73FCEB8A18FEBD10E8200A29F475ED47F44
-ABC9F2A6F66D768508FD3FE078AB46ABD69B79A6ADC471AB866D326C4A20D9BE
-8A15DE54C80945554AED93AA561465178B6F38D94769D5447D1C267519059101
-F9501BD996B8DDEE625A74673D13A647148A9F11CE99E7C6BDE7D1D507017648
-8173E81909387A04A133CE42C4643F9E5D69BE24E48116B3590E6ADFCF02A21B
-88ADFB0F070F666E38F260F7A0F9A99D22433F8F0B436BC169868685E7A144F8
-DD4C3FC1D1A554BE8356A18ADD5626450A29E80101A8164D0A5A106B7313FBB5
-BAAFCE2240A66E18BF06EFC32A055120F7DB77B269C285C27384EB0187A135E5
-8F7E926D9C48A9DD8C2747A5B367CFA686FC1294C0DF48037492C1AC42241469
-CDC137863CFDF8CAF8B9C8FB9A25F4CA4D517AE0707F94E8184386E0138C9098
-CEB7FB05EBA48A2F10D38F62B950EE4DBB2973D23D8F2C36FD315ABA5DDFD03F
-BE64C12D18F9EFE17A0FC0CC57599826D09A45D3F5839CEE0FC0BF726CDD0195
-924583C8C4E5BC06FBE89DB34EC1E2A21D09A8D40EE8FD72F352161A25F7DDBC
-F4055FBE67201414BC725815A68740C1D73CAF7EDE42D5863AF0EC9F2F29A2D8
-26822706CA8119EC6D0D9468BB812F48F61E0B528F48730F65D755A78330BFCA
-B38406E441453361EA517BBF57051C499BFE502049F5B869CBD63A45B26DED44
-F4148C9F523681B5316B33F261D9F854D58F301B04F46631629903B5C6CA7C1F
-32165F3BF96494B89614E773E21FF582D2AC54DCC559604378E9C6E87655B3A1
-66D2DF34D531F89942BE2002903071947F9600DDB63772D73C3625C969E86859
-3BB872F0FF0F3102A043302117900DC43A5B295EBFF6E0F098694CEEAAEA8F0E
-336A33F31E7FC4836DFF317A8E5C5185B931B49F55288790B903C5F709AAD9EE
-7CA77BA4B905F1094126C8C2DB2BEF9D47D9764BA02291B61D6F1111571C48A1
-18D7A3F4C4AD999643E77DCF067D59442553B1933FA1C7ED31486BBA13E38BB1
-A5DB843011ADE62477C8D700039407E4BA7140FA57F0CBF1F592B0FE9B77EF26
-1993A02BC2A06C9E19BD0AB9BC6785DF07AA10C9D23F1F39CAACBAE7A06A9D2A
-CDAB181BD867EE80FAF7DF151B46469D39E3B146C90D0EA389635FAB3CEB30C0
-40CB74D4C6F4BA399FB084D3648AF356B956F9CAB3C3F122530AE112CC872B7A
-7010A34B1A2ECCF920144672F8315633CC6B50B3D3288A922C8E8C1482FC969E
-59060D86217EB3919DD8BDB95241A7B089DC1456965AA6807141F2448C50F8C4
-88BD54017534F9236C4EC812E2F48F13943C8B81273285BCE02FF68033B70CA7
-0F38511329DB041A8D38CB609B93A39CF98470975E9AC50C5910A936722EA880
-E840E82DBFC809DD5EDE3D9D896FF879AA47E89403E5E9078BA9FE3B3A2FC4E2
-C2FE85313B5D53A05DBAE54CFB25BDCE29B4F5D6168549750C2457EEB109CFAA
-A14D71A996B2CC1414A8F89DE240EFB5C3B13F216396ED83F09388DEDFBF2CBE
-604C08D8ADEC0E3116E33443CF68AFFA4513B1EB0A19D7EBE845D1A0516A9EA9
-03B7CC5D17CBF0E1965CF2A879146049318579081323FA8A13755D51C939FE1E
-7774653F6610F5A542E30966220E69A4650B00BC6BBF8A09C13EA3CAFEFCE3D4
-B2C4E1CBBADEAA6DE7BDCEE8795FD31E1297113230F8670CB316B5F39F067043
-E261567E08179748C47D32869A686B20F4BC5B78FDC9BA35D1D4F35987F357D6
-3BD1325EB529B80F88EDD4E0EAAA54F11ADD2CA20640A77D96F627179B39EBA2
-8C3A895D4806568A36CE0B589B2C29A962A8F6B6AAE4FAC50E424B2EEF4E7B47
-ECE15B865381E87FFBF29AD1D3BAB2F6EED94B874ED3A975A0A5FB54E2729CBC
-FC079469C3BB4AB361A7257653289BB9E353BFEFF7F8982162CB641F1571D0C8
-9530B1D6252C5FB1DDD8C29EF848D105126703AF7CE5DF4B87488F382426F583
-34021005B87B8938DA00725BB75F548F15E382CA1A57F8A27A81B5A97EE26244
-E739D10A43BB170D5C64BEA9580C3017CA5F53E8C30F129E0A63A5E9C391AF5D
-A1C4B5EA0EB4722F6C9D187CCD4BC71A063D85305B14CDDE969D9835906B0486
-5D47D6857E82A3FDF068B81C0A747AA0F3D5C4BC089373FB9E9C54802AA63B82
-DD8C82CF7B941BF0714E80EF038C1B25E0E5D47AB1BF04755F4C29B712D8B668
-0554E90DFDF8D489833CE9317C0EA6F23ED270C8128FC8C95CB187B283A730E6
-32D0A11357ED48C36D5B681777CCA3D56A827C5AD83F35469869A4F774B9F2FA
-4C437C95DF2DC13C8F3B69DB53F4DC0A1980762A9B736C4F1E435D92B92E7840
-B382109C02A5DF71DE910533E4925CA4FAC2B146E67817CEE6618F2C3BC9B828
-74DAAE72B6BAA987EC03CE66EDF04462B72104FC3941351EDA8C1D7E5273C8FC
-C3E4F2EEB29C2C8FFFE88579C1EC41543A55C6E9D5128FAF3414195A8C7A9352
-0667E7ABA457A75D720A090069B396D062200E5A2311535AA241CD8647D0242A
-0EA4B1F527C48F40D79FFCEA636D77DD07ABA26FD3F878DE004B03A2F95FF25A
-1BCDC1D87FA05B201A4874325D3FAA4DC787D8C595E3E8D11FDF381B92FF830C
-0AA70E4E4F65C7587BC5D6ED535A8E130B46D339CDDA5458BCBEA5D2243E4C18
-0DB006C0DEE0468A24D1DAC167A4D8174C296BCFB00439400D0939C7EFAC5BC5
-F62346A2DAE415684F1FABADCEB476B46D821F5E4A28A1F6F51B67320374379C
-5B73458575162583150D0B8BF816CB57E08682A3219B0446AA940D0CF43CC1E3
-7566EFC3BEF49273128E9238B31A9244C2001E38308ADEA60BD86A89E1E3C0ED
-D4EEEA31131AFE60827FBCFC1BAA348FD183A5CEEBFB472CEA0800FF18CC2616
-F43B04620E74D3AD95EA13E15B13BE3345409D3321397C77D2E612FF5011B90C
-3A51DD8C7CD3A3A46EC0CBC605D1484A9C36FBE3A18AC54DEAA2282F7C037856
-B6511E5C990E421C34FF668EBB8778FBC2FAC1DB3F88282478A52C9ACE31128B
-2491C873A3B765A204907B5EC4FC6A94AB9461AC8619AFE24C2F0A4BDEEB9D8F
-D8405A05F9EB13EEBD79B32763DF402E0FDDCFFAC142DB65DEA80B5EC6400B9A
-00A78E80FD3B9F909E953814958F2A1AAFE51FA01EE54970FBA5E41384903E04
-1440C92E2EFAB3E685D730455846D97C2DC7D25586052401264A31F98382BEFC
-CF9049E23208EBD952DF7D4A5F0AD7CB2688D77C2F3496AE263430000D226918
-E3CDC6C5EB23B8611A14747122DCB9E016898F69D4314787EED886123293FA5F
-01C3FDE4F205CAC20FD19471E9C8FA721A3AFDE78156DA287E8FF14DBF80315A
-B56E9E875CAF0DCD3A622134291B4C42E7921F6AD0FD4940066229B892E57554
-4CACC05DDE1F374CFFD453817EFA9DD7A6ED9079B32EFB148C235EF50F26E479
-6371A267FB33DB00F0766B00F0D43992386062F80B62291F623BD1245357B2AA
-FB3B27E7BA6CACF749C32AFCAD322510C8A13449277BDBF7C221D63B96D99311
-93F461C677AB372FE263C5C19D87DF70134CC0AB6B1FBAE2BEF9F847E30932EC
-89D7521A16AE1351999AD4D4735149AA2892CEA8519F619DC0653D01992AE7F8
-D0C5635C4BCD35708D454C174CB9863B83FE504314A9FFAE0D7535946F0C146B
-9D507E1BFDB6095A5AC18DC2635E1DCBEC393DE1D8D3CCFF7B0258CDD6C00469
-D3B94BB1E9E4397ED49FAE2C83103484C1C24151046952E3B9816101FAEADDF8
-8DD6296AE76BEC4B00B89D319115F5F95C568DC54FDE1E0A07AD3D3620B86C6B
-96166C4B9AEC2DA6D2B2D2EDAD08D4F58D193278A99FE28ECC676EDD4FE3A624
-3FE82562852B0EAD2A6FF707789799A1546326EEEA08A5AF24FC99F1A6B15E91
-CB13F53C90FB93669B1D7CD4882F55258CACB374088B0B01886155E2AFB7F3FE
-F4DC284C5F2D0C56135ED79D8348CE3C1F8BDD50627589E806E6402A32E69D1C
-D7EED5F9DDEB91496AB5DBF0D3698FB728A782073D64B0C4E28967DAB8087ED8
-491C3778FC5916953C235A59BC191B8445B118AFB64C3E7840B3756E02ACBA77
-D1269ECCAD63C3FA7C162F3AE317372686B1FEEAC57C8CC0637236CA01DA6B0B
-83C40F977F766962E15349F020BC048136E35C678123B4BDFF5B154E234CD0A1
-70AC976211A99B8CB8E131D85532AD7A72072F577B51010F21C6334006371A3D
-AAFBD45E1E76550DCC6060678F94E0C7D54D88D066BAB5BD21C254D9628F9502
-5043E9205ED0FC7025C033558FBB3784D2CED521EC7C9F7D6BB8D62899D0E52A
-A0E385ED658B1DC84DB76635FDCF0CECA2BE5919D0E63BA75850596A3CB916D9
-55F856AD3075D5C57686E65AA912F0A6E9E4A778522A630D9D9AD3732629ED47
-BE694C35221FDAC7E8CF5C381CEE23E29AA749B52E68D1CC2554EBF31BDB5CE1
-FBE58C5935D06F09B46B96B94CEBC92981474F77036F0EC33C2149E6D945F147
-44CE2B86399056014CED967E976EE7DCDB4AFA12F1EE4D486549C14FE1052324
-ED70C3A6955BF8CDCDC7EB01499126F0C303E64B4370E83D5687E957DBD1B374
-7600EE0E0DE2C57B37CAE46734FEEC0A2F3863CDEEC17265F1EE104BB143442F
-35329A81ABA8D5F1B7F8CAC158E4DBEFAE91C2BFD05389F048B3BCCF5B0F66D2
-4A40EAAA1E7D913DEC4A44A9A382F53EB1EE3966EA18BEB5EBD24C203B95476A
-0E0C8568E08C357FF880600C27BCDA5623C8034CA1EA2AE24701DC7F1ADD2302
-100F16EFA05F39A2DB15D091F103259FC3C4CCAE4A858B7F72309ABE6CA45067
-EF46BB3C4738E048C884293EA5882A2E6E3B3B3C100B5FA02EC334DE2B68F4DC
-2CD866AB8F83BB0DCAE954BCFF8EE7C3D1CF90CC51B295D02F1130F09B62CD05
-AB930D97F9875B9E65106C4A8719DA2C75A332C038E46F7E82BE4F69DAA8715A
-1046DCBAD2DB3086A1CE04C8904988F7A2C9891B3C2BAC759B20CFD5BC8FCDD1
-03FBD0AEA3CF53E7B1896BF003AAD60870BC9AD50F6D257AEE013DC166B0B448
-D56900DA44885BE5FB7F3273C15DFEEDA5D6E895773F4435C3F2A684987FF31C
-4DD09CB3B2CB9369704CE85FA266676C25FC30B98D74451CFA0A3C0E99ED6CA9
-D31D34A3566A5BA3EFCA62168217429089E61A231506779BC845BBBF085085D8
-BEBAC6370E595188B74C1CC2D9D15CCFF9220BFA63A2D002E7D7F2F711837671
-64E44FFC9B07E092C2C3BA99354F163FB87655EC865C3B2DF852031A3930A148
-9A1D29BF24604E2E635C9ADB770A13288A488F4FB237FB1CAB2524F7D33DE2C3
-F2C5BCF05F7C438B28296F842E86F8BB4881A3B4F89B4352AD50133E79A70154
-7DE8C607A98C696EE1D254EF8E5BE67ECBB7C1220C5FE367EE2DE9D8AC7B01ED
-47AEE18CAD10A639B038972587B10BEF449E7DB2C97F4D97FF55099893616BEF
-4DD08E57DD9262ADA201C5034CC56D9D34B34E2E1B6DCB02F3971302060EEF2A
-D942D62C270090BE5E74572C751A0A6FA081A6DA4430A4A069499A2ECD39FEF0
-AE78E58ED3A64527A70D5F8801EEC47BAE1ACF720369443A0B3D7AB4543C6830
-098F2E44D895F737B26D090F9706D9ECE37CE444F652A5CA5522B0F836201376
-89A28AB47A1291A96EA418DED49A829E62ECE80A311BDF5D1DCF070D38D9C9C6
-AF40F5D93824E089A7B95E4E4DAA830860F2F9A1E3BBA08E539CA4B54EF6E2D3
-DF247E11690FB99A7784D7105F0B4EE1509D657497BD054FCD0EBF0A9D3B5C39
-6E087FC344F636C26158F742D14A363E2130C0EA0DF4E0DB891ED797B63A42D9
-1FBAEF469B0C79081D2C0031E09A3776F862AB8BCBE8E80FC837AF15661324A2
-7C4CDEAC92310EF54B9A24E44B04B5D265808B3B5639018397EBE66F21829F06
-7D0E6BE0DE08E5961848E93669D607F60C25725B7EE8FA83011A5543EA5CE260
-A4
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l048036t.pfa b/lib/fonts/l048036t.pfa
deleted file mode 100644
index 4ec846a869..0000000000
--- a/lib/fonts/l048036t.pfa
+++ /dev/null
@@ -1,1260 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSans-BoldOblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Sans Bold Oblique) readonly def
-/FamilyName (Luxi Sans) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -39 def
-/UnderlineThickness 78 def
-end readonly def
-/FontName /LuxiSans-BoldOblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-228 -211 1098 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078990 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E671B3988AF5066E3F90
-863D5BB633FB30AE28A6ECF53B5A2F518BA91BAF2EE70FE3F56243BB3F4C04A2
-FC016CC374C654204EC90A7BF559178EE8015AF532372CE4B4B82E2469BD5401
-63B4CC74D7623862E31F62F9CAD70643A7C39877265EAC7B5D71744C4F83BC05
-E893365C941FD0FE135013335FA2213B42226D6B522A41C5A6C11780D38E624A
-F8BB54EE866274FBE41FF83840EFDAEB7227809D506507E8322CC5B16FCD97E9
-C441FCD253585347C705C556A3897EE543648265232A49B9D545B6F618870554
-03227116B9F656C288F9C0E3CADE4544BD1E749D80072FC0D0163DB84A4245D0
-41460C3566BDE66E29E0AB39F280C2F229583228198C7BDFD5C07F110E0D5CC1
-BAC768138F8DC9F0974EC7C2BB9F5DC97B5950A1A4E33F2B20061B22196C7FE8
-C82856D93A079270700B11CB7A6396A4E3FE6FC04D6AD49FF13D1A2E1FF8B07D
-FC49258896C83AAECC29610440D2BA2C0D19A4E8AE287DC0B8DA956F2B4F5607
-A04F0E366F0A57561CE1E06CF7F3A70E300CBB077F9C918B099FD178493939CA
-0D25A808F335DBF82A11AF2D6B2EC8E4456B60DA9F5B713568A34E66F4640C81
-69F5023C211D301FE810A6B6AEC197CEE2B0FFB4CE02B119CAFC5449D8F12416
-989A5A22633105A9750581969100BB65CFB052B5A3FA20A0B4F61A4B497487D5
-BE89F7D45E1A93BB28C6778B39FF708CD041FFFB50B640C93DBF1EFB2FBEF63E
-9292124E702138A914432C50435D796B22106A34C1BC3EE1EDF873F60367C580
-7A5D98032EEDED53BAEFEB69414B714E9EFEFF2B1FBA659081577F87DB8BF212
-4C0E77A8605C1C1FE19483320AE88A041EC9B95D10E89CE673E4BDA638184422
-742F4CEF3086B62F5873A1A3F8263EFBA4CEFFDA958521274263467B9C485EE5
-7D8AA17A8C364F517203A2D9A66CB18201897A6223F5EE5F7ACFC3009B39005F
-61095364ECA6DDE4113D8C39DA710A4716E179812E79E9B01C3D7B00ED2DC574
-63AE485A2AEA55611672E1AC489C6D09EA559B9E8DAE17DCDA80FD287DB8D742
-D4DCFA54ED2EF42A988D72A491A4FCB9BCD2AD4F225E23932C2779C3B008AFC3
-4D2B158EB9697B6598672BD99C91405B5CF668F3A4F21347549C1150B0FD3EE9
-6EBFFA6F54F44DDD229818D109E7FFFA337D80C83852B12597686E29A0B855D7
-D548EEB2FD8AC5585F458D60F8A18F33CF5CDB9B45FB4A8F61732FC5A2EE6F4C
-25C2B903EAFB4A0056764C4FAE4278535DEBF80DB8A9B5C8C471A62755CEB38A
-A05D0FC10C4136AAB774FEE2C6CD57CFFB88D9266696C390919F94BE439677E2
-E8AEED7B8B4BC2E422F6C9CD1711B496E57D31637BC0CD4D6001D0E38F54402D
-1D6B7ECAF0F454219AD6CBFB857D7165D1217B7F5315DE5EF333AADAC59C0CD8
-290FE129D720FE11B2A16ADF49FD140902FB8D8D33FAD0EF0A79AB30319A9048
-F7C2A38D5E9333A5F0F20D12A73EBAABDCE13D9B38CFBBE20408959E1F506784
-761CB0A7C72A220EEEA74FEDF0158F7F36EFBF9DC5D83AB22C8756F42627A51A
-03C6590FEC9DB77B790A5672158CB32C9ED1980C4CB369839DE47BD57CB4183C
-EF55A34C70996A7E00740D236550AAC8CC6471BD00D8E3F5BE3727A9029F60AC
-8B0C06076ECA4D854E4A1372610EF8FA0FF97D3E637CC8580098961C24735991
-349C2958B4E7C4F67625859390B9567ADCBFB334DC7FF5AB1C0462DBE72CA093
-0D7F43CC5230E57824ABF7857EB2F856841013C9E06D0DF4BC9171A75AFDA802
-4491D89CD7D2D65515CABC474AA8B9BB1177A502E4B94302E1E40D6C8FA974DF
-C6496A7C1DC202A79E79FF0D9983E48F8F66415610F0174C5C555DAD5EEEB9E3
-FB5EAE5F9B5307ED89700DB98C7031DAC8F371CEF716BBAB2DE3DA113E69EB18
-EAC7A1756A0340248142E95538BFC1AE4814585AE16E397C3D34736738CA5A26
-6E761DC0F59CC2C3DDC7AE6E801DED28695E7DE6FE9CD1E29FE636391ED78E0F
-C450839D27A01CAAF1A56073473A4347098007601698AA2872EBA4F2F32CE6E6
-3A9EACBDC28AF4E8DCBFD8A0ED978058FC9E7FC2A676500E19337917EB0FB8FC
-3C37E3903185C96C4225436A42C5495DDD49A9D072D1FFBCB9C2CF51739AA6EE
-CC537EC85C9F316B9721F9806F214EA9D10C35645C0A05CC242E668C9B60C2AB
-DBF148A8A1E8BB212A272FDD180480BED9988C9AA3C99342EEB70D7EF76C5282
-3D10C8C811418DDF1516660CBEF817DCE1BA41EA0AC8356B1573B9F0272472DB
-2112A2D6AD1371128E62FD35068068713F82E2FDDB721C253A378E284175FE68
-8F77FD876230F131878D76D91B43001821A4DAEC5A6C30742864B2F0A1E6B434
-80FB5A969A3C3D6471529E0E1972EBF27FAFA811808D374C5157D8A90F04A4EF
-34DF27414E217FF7DEAC000537131429842625464D0FF55BBE51B7048B964D57
-DA20A4F579C86D81B3186CF6C503037C83CDF97349E575F24BDAF5C2B16290D5
-805E88F22B22C59249E9F8CCA25DDC665C2BD937CC6C957442626EF81BFD7640
-78990E9071638880C0AECFEFE1DBC5D86EEBE3E8C181C3DAB690EFECD7C291B3
-882F31F29C281C21DC1C5EBF2975364992B3996E5393CB54C4E4A07EBC183617
-DE1739F62531F36C19404E395389B85C893F5F8BF72AA7CEB5BFF1603C144D69
-25D14B3D1C4565E72E0E64282C5398BB07F45EE86FD19A2C20792F06CB6106A6
-C4EBE8289ACA36D30B57F62A11F90CA64F25A15ED9A187D255E532490F74A885
-9DC77B2D12EF1CB9D5CA120B45A7C05A7945F83F764F5620CB01BFB6C1B68AA3
-FF860DB0A9A811A6D2D6862355A95DC11CA108037E03BFCD8D527A3985546876
-F38487881D7575298C274CFDACF1D190103A9906B08D6415E14857594CC90BDE
-9643A556543EABD0412C8BF1974F4A19BC80F638158D5CAB73657BD7395840EA
-458E7345E25BF1EEEEBD4CE7687934B5BA62D34E5102E033A9EFE75CCE2EC089
-E62093489C4D0F18F6ED577700D5D2C9A74561848322BDB46828E39618A39D32
-F13F6CB6E9E5CF8F004D6D37C02FCCFE227D75ECD3E4BB1C50440858A3CDA4D3
-66BADC120B31CA9CA8A42FA9853309A1AB649E61F45351E2946D9808BDC97875
-6F08E8C2931B4740800142CD15A25DFFDE8B2EDDB21FEA1F251ED643F08D744F
-F7DC5E26064B6A16FB4F5872BE9544E8CEAD0DEF9C52B1E16C7FCFA64CAD2B9E
-5AFCE93DD0F8B460BEEAEF3BDCF5660D99A6C9DF1138BC0DF400084540991574
-6F59E90316FF7A74B5979828FB02465D96354BA5757347FA0F92D41C5659196A
-FF6E24F615039D949E6FD374243708910E145CE8E2A2461F5A30A5BAE30D5445
-7C10BAC56E08289FB57C1D4C9C7A87CA8D24FE421D4189540B6CE0190281BA4C
-9F3CCC4C095B86F076BDF504F24E9B422DB680624D2E452734D17F0416586D80
-B3BAA3C782475811191B857C19D1C4C5192B33997E1368786F9A8D3A3500F7AD
-988FAC17371E2A74B1FEC5CC55F9E64649D01230A83D28FE63D1175297818C48
-29697A12F925F189D1A162AD1A71FA29D1706F047540BB4730AFABCB6D3BCED3
-4EC3B8C028AF3E09A9D30AE9BC82D8031D8E00FBC591B1101253809C7A733B37
-4C39CD97E0EB92C5DE19499051EF9FEEDEEA7621C0CE69DE520587D990024BBE
-87D6E8E5D59E66502FB01BB368CD92FEF24A618C1A987A898AA3D23CC543D7AF
-49C8D30AAE8B9434E491D98E8D4D68DC8D6B741FF66B9AE193AA685864D542BF
-3BD2C156D7050190A4D4535D5B840587EAA6AA058317CCB77D0471D83D1D2724
-3FC905BD7F771D0F6D8C3A1D8CDBBA2461A709C004F2953668FC3D0F4B13FE33
-A9AEEC634A3F9A0850D03BA733F6DB834DCE4228883308EC70CD5EE550E51EAC
-3D35A3AAF9340E2624683083F75EE493318188E58286F1A4B879C92569DC7960
-538921AD7C6B3C89F4D6C28F650C7C86688FAFA81FF4635EA3EDD855C3CF4DE1
-FE6C8D145BF56105E416F5F9064C4129A0277251A46A054E38E6ECEB327ED45E
-1BD5D272182A1CD8A8D0EF92EB46C55AC149D29A4B7000A7ABCEC1EDADFBE735
-213E93C0C251917221DD8926F3BFC5CC9493941B41787936FA077F706E8C48C7
-2430D26CECF90F6086361E3B09D2131963EC4A29FEBEDCDDFE69D56AD538D258
-C3CA85AB0E7CF62E5147038FBED9F0F834940D5DBA99D2E2DC2158BC1898BB3C
-57912686C5BC36A015228460F7F1A0BC47BAEBE092D69CA9848E389398997613
-5B5F1F5492A02E35585864CE24860C1647113B53203BE4702C4B09EA377C64C0
-2645A1C416E4551FC9FFD6BAF2427DA4D4853E4B2F9B59E4163FA3D5CF4B1831
-6C51A54BF8040D96BF17EF31A6C832D55AA3E61DCAE57F91DB30BC95A30F8251
-4919068E31C8A678D8FA6423911FF90F48F3225EB2E7CB6A58DDB1DD58AD1272
-6C69DDB5F50DE8718E58126289F883494343DBD4A215FDE54548464E8A6051F5
-6C3DA917300AE09ABA0EF4A4F079A63E1F15030EA41B1EE8EFE18D98D4A88912
-7A790989F9B20E68A81A49CAAC1CD91CFB9401F60C9DFF87F2ED944006432CBC
-2CFC078CB5809573CF15721E20D85EA27541FAA4949BC8FA6708810DC205FA64
-28B84176BA868FE351B87361F8832D742A5FC3BE6B0557AA3EA5788239D1FDDB
-0EFC4CEBD4D736054C77CAFD5B1453B65FEEDF7FD01311C2C582B6B97EA70687
-8E287CC3A451A190DAE2CDE4708400A48D6F7BE00704CB3F9AE8BD7B4B04A2CE
-3C3B8E6D34E3C3C9263122E10F32656166B2BBCB1EDAECD6500C4CA655ED6B8F
-037DFD3485443D4B789F3B591B350B9F411FCA0617CA75EA728D0BA4313FBCC6
-B845ECC9E23E497F1F955A15795F01E4A6BB8AE113B2F64DCBD2C7A0F87EFFC8
-994F130004DCC8F2503B56BD9A773C920D3D5A5CD0FAC00763E4E17683455C90
-FA36D8B76DF144C8BA7D2EBBA2E4D5751E7B4E2C675E37714A3ADBB0F17CBEBF
-518E3B60DFEFF14230B2FC48080803B9D05B13023B2BEF22311E91C8181355B8
-CA3C3680786B74FD8CE374CFA68A19E7AF2CB998E329A7219859AD23390668A7
-3C833BFA931829782F61C50E2F91A0B9D8EFBD8A6B2C024D5E8E10A4485F922F
-06CAF23E970215328465A347A9E283511B92A442D9CBC7B221990D4F679B04AF
-112B05FCC1C323CC94A73BB4267655DC61D2E57A0A013DF17D61D3E565AC7732
-23BC046BF8B812CF67AF115A80C8BEEB632B9E87BA2BB8FEE8251B9A4B4971AD
-B4982DA27005E24C78E5470F5664BC1F2F48E7D46F660E543BC2C985D2F2B5D1
-8D9C43B976478634A91027F47A5E6F5F89AECBB1C455225528E6A76D4E5E0333
-56C7DBE3A520C8194C27AA32C34AB0AC3F5326EFDC65CAB8F7A63100D0AB11E5
-F3ECFEEC5D9E39760F0B5B3F227B5675F6B782DC03AECDC1C94C16B4CDC1A1A8
-F4341DBC38524D47306D254B37B7CC7CF4E8A2006B7CF3E97B38012CBD63706D
-2BA7F279218EF039D9F2F1B1E1A59FEA6DB6EC02DF73061D2CB3C179B3BBFD4E
-2CC03CC26F4A4136EEE04F991CEB916FF87E1636740D020721257121F938E0CA
-33C265E3C1250D7E62ABF64DE8B4E38D871CB891AB19013334E5D91A744C9EAF
-AF9510DFBCC3D2FFE910C4717549E818056DF04A965140B505BDC08AF8A15F4A
-4DF3EFF98A4F1FA538B1F121166A5C250029861ACB23F8C619481982F6A6A5B3
-F789B519D504B8D94965217BFFD62719F7E8B8A8A51C6637DE5CBE7A2FF5554B
-3D08019194EA5C2BC5CEBDC53ADDEEDA4CE45BFFB9F16A92EFD9C8B224549AF0
-E77131EEAF05BC082EAED8CB6D9DA2A3746510F00F396E66A90C7DD34770F4A3
-A570BB3805F4CECE06731A46151DDD1971731049F57ABF174C5766CFABB72356
-50F03E186424F00A0DD7158429158487223DEB5BFEE53B4990E9DB0E26BEB6E7
-EEEC6CA0A6EE8A8AB949768B21410467A8ADC90E30DA2D8D0E8834B30CD25CD5
-210825E6AFFF42827C99A7E89FD9ED7D11F1795392BBD337320E4075855C5B37
-BEA02800C4F9D24B95E43CDFA3B4B25EF8BF41850C0A0FA8967F94F75627B6EB
-FE9751B0A9F14A4454104ACE3ECBC77F62397C7DD731C0D0D754F5D8975A2FAC
-2CC33806A516E9FD1DAE386456AD8C5D6D84FAFB2DC08710E285D8BC25FD0BC0
-CE84C436045C9DD14C34768D04D17D62A1CD97BA0DE0622AA0F01979B2FB83D5
-0814DA03FC088A4849EF6F85452629634B0BE5B306BA56DA0D95E8C120DAF5F9
-C880729E8971E16729996CEFC60E980B4BC0F734C1DB840ADE2C735E97CAD49E
-CCD3FB38A9764688A52FA164C08C0B9B614771B51AA4E6C95622562ECA3FDCD1
-1C1EC3B74515E9B5303433551B82CD1DAE2FD07DFCB96884BA912A1CA6253747
-28E81A26E46B3169B461943AE9273307E1234636DECE2E32F18CDDB4579C90F3
-48E64E999FC86B7361B8DBC95EB4D1B4B127EB81AEF5B86361FA83085F8F2618
-6AEDEB2345E69557E992535F7B26842B02FEFBC4994E6BE410137AD8CCFCC8AD
-76599D96338CC250F9AAE458B6A274EABCBA497DF7ABA3FD0C21DCF14EDC1613
-A0471FA5A3436E83323CD33074ED47C21EFA96B2035DED6D0D012B6306E4DE0B
-3CDA126ADCF1F6BA4C2B814A658668B44BFE5C0CA3355D738459FB7ABFDBB0F8
-786B00E61CF93ACF31B60707D674A1A0285AED6E4D640FF94A0B0B02AAF27F13
-5CFB88D3C5E5499A13AA520F4A7889331CA9B35A5D2958683E872AF2E51C1BE1
-7A7DE58700B791FB8FFA6E0F249681FBD10BB62BBF56B6A8B788171F0C72BDD8
-E55CADFA6E7C913BF5644CC759B59609756DBE4BADE6115B6E42A4E15A5D764C
-AF80ECFC52EB05FA03D4A87B9E6961F54491FBC6E4573C7A4B960BA6DB2EEDC5
-22742279DBE770E15ED5703D20EEC6E56A61C05D508A64C2DEA63289A8DB4225
-05E16B7D9B915FA7D94CB28426EF0EA683C543D173B22CA22E174A4B3EB88C1F
-AE3E3056F4A3173AED92601CE514C957C7E5277070A72169E9A58911678F9EC1
-3F39BB3E1EAD8390126F8587CDB7F8A2FE06B06732EB9FDF9625ADAACEA23A04
-36DC51D828A5FCB1F910DBFC74E1D2B56FD88EDD58B9F2EB0504A2F800FF3CB7
-502C05AEF78B333E4EC076541335C1E3EC95AC70943127B5632954FE3E0F9694
-9147B51E0D75976878FCC4AEEC2661CA4B19BE4F93B07BB7CF0E835FF18FF48F
-137AB9AF59CFE1C925CB0D548CEB2FEE5F5B7F25C730E9FF2D757391D1310E4F
-EBF025DEFF64DD04D9A06D4B5B84F915CA4810499D3B8F2E3065E5079126C181
-BAAA287430C555E330B53D21FC9C08C1D1822522076A247EC3C322D163FF492C
-39D0BBA3DD100EE943FB6E94E4C9686DD0025A04535538D816ED742D70BECF10
-0D6105BEA237207209BD25F7DE0A713B770CD0DCC988952F847BD8816E91CA83
-0BCBA7A48E9925ACC4AD0B1D1C03247DC912BE14909BC7961267BF4DA4DAF6D8
-01A1AAC313F6977BCF8232199DDF4243829130679FEF1431BD6C7BFCF2BCBAA6
-08F6F0D9A4AD5D04C9109CB5AE6013648394C6EB83ECE2E39D46759AFF128924
-004DA587F7A3D6C7EF7A7BDCDD0E1777A0265B1B4954A1F691BC61E2C008CE39
-F4AC7EF840CBE9FFF366A71A1940BC4D7A9AF68000485C49DB2DB1FC400FA036
-71C490F52C175C1315297D147784383759FC1A0029200E7C6BE31462D6D6BBC8
-3F5F67ABF810D460D157E94DB0C1D7965DA58683759800211657E3ED552C586D
-4405243E51052A55135B4DE1F10248ED310193E316E18713372DB893ED164232
-85193FF7C88FC96E091B565BEC36CD6A757B6FBA76B54AE14C2EF6B65ECD8420
-3D5BEFDBE6A4F71E52506FC18BA2C02F8AF58DDB285F1677DED6F10A93836A2D
-0BD821A5AB069A85D4338FC007AEC8B21FA8CE6792BCB01727990280A57183F3
-6E74CA7520341E95BA611F600D5056CFBBA755B302DA747B08208D21DAF7B7B3
-F2BDC1FA0EB5A05A917FD9E0834F0DA72A9D3AA2AB0A074752737C7A5A6A5312
-CB40DA86B9BC2258EA09B5F6DCF4CB791963D4570D4E89F4CDF0BCE26ECC79A9
-444447D97B32C2C06F48A963135AC0EB1B1D0888BBD1625C11CD4A9F40C1D27C
-E6993E6992E1B21CD0FEFC40BFC47AF469563AC79BD433E6FC0419E3564CD4C2
-E3715ED41E6166696E4CC4FF0C89F60E88691AEF06E800DA26151216C0FDDEF9
-F04F5919E3FCD1972F6383A60AE0A56ACDFA018988E01AF9D8AE9A8EE4B401C0
-1867B3CBA3D9E7EA775BBAEFB8FCC0C22F904421B20B640D165747E180C15437
-92F54D2EE73C22A689BD11E70B5A964C1C7DE8BD98C063C9D1348871F5801694
-06844033834CB512388D1CF765AC08824629B541F84E20AD3C5161A3C232CFD6
-07AAA25A6B71B17D0209EBAE3662041FEA4F315A8F8294A4036FE161CED4707B
-32D2B2BA3848FB1BD93C6C420F53DD1BA44DF7BEC87659CEF2FEC38BEBBFAE92
-392D2B0671FA00AAA30F06602415C8D67E5252E04E91DF5F62B615E71A46A514
-FD2C5B43DE43DF612C36248B8D27E2D7D390FEA0C56A396F591307CC5BF972D5
-E9D7AA5D65332F178F311A8E08E4911813E3D201B3FF4132C83EF21B5EE08864
-3711EEB51C401B8AF91220AC05FD576D8A1EE80C3891A8AA792699FF784C0953
-94C4E33B8D02D81E2F5E85AA049A89141CCE1140A9CFA4C78153531B1C004549
-8D9DFFD86A271DAF08B85F942D93037BF741258CA94DF4296AED020B131AD485
-DEF39C8DF7451F81ABD667E103E9FAE7F4AAC9D567192AAE7E8EBAE2E46087F0
-A83E7F096FD436AC87978A596AFE55CC09A0C329FAB21A53492A1C23B6ADBED1
-D369010199BFFB00FC6554DF5568F04460311FFDC67DCAECE1E8CA5710B0E8BA
-315DFB8C6276B8FB9CB9C14D42A2CF94CD54909E8873FE58D18C274EFFC29D09
-F744357EEE5E12C5A32AD69098A1BE95C6C3713C62A7F86C1874CD274589AC11
-40545D2DA1BF3450680DB402512098A4FD147D47D11D3E9157570586733D24F6
-CDCB0762FB61B16EE2C85564DA2B9A089CE4F12DBCABCF8DF177AF3B1A6F1EED
-D9DF8509AA1DE596EAC9AAA062AF4E52BF05E243C9536086565B71E3D9E78CC6
-430105D74B754836513CC837E26AF3423701EA7D6E816FC7E796B56522622D68
-D750972A781FC96854CB962B069377D094C861736699ECD6ACC998C1572775B6
-00E3EF63719E34D4950D1D674548248B7693866A4738F837EE8EBA89B085AD8A
-78E2F223F7872AAAB987008CEEFE8A8DC2A6F6C379569696D4B2FE9B174F3BF0
-27D331E30B15762F52F343F1CF85B237838A5AF84AF9BDB7611EE38675D76AB4
-AAE4FA7FBD5CE49A47F5F52F42702905B1B5E3C754EC74DF3F7757E7DBC56742
-318745C387EEF697D14E8013C25763DA1A160A63482F8462F806614957E0A5BB
-B32FCCDB28FF2C7C93EECEF415CBEB80B1C0A8DCFF21F6702ACA217E81294879
-AC7E90D9460A39F58D255AEFBC5EC674277B7971B7D272C1F8C1C10AD7B27F55
-90EEDD1F14087D002719742D7CA335853E8641B8AE1FAC60415B83E3160E3A68
-C5B2F117B4503AFEC26D8BCC0EE50750781175FD616AD7A4DDBFE60666F8FDC4
-44BD2FC4C5EC34D1259B578EC11EF75944D0E1A531BFEAF7898965F28306C015
-6D572FD61B31F35904CC6FCD85A598DE1BD812DBCE737DC93FD91079341FF963
-4432EBE341D447F08FBCAFB5C7389833FBA0F47E716E6790DFA1F486CCEABC78
-FAF007EB9686B0C16990AD09DC205662F51BE300E51273C543FB072EF77357F4
-F5AECD3FDB8ED5F316099B380B0335CADD78193F60C7FE5CA9C6695D887E4E89
-123426A47988C2B5F3460CB005C9E139C59E2D377F6F1760911A8FC2E1325B63
-C023F62AE8D2D3AC3474CD637403D341C50A3E380EDFA78FA0C0679DD04F69F1
-3D5F0C33F19D1E670D377652EF5D35F1568D2F3769214B3053005ADAB1C73FFD
-EE789CD271A8D8BB800DC4A2460F4F681F3F1735F456D8B9C4B62780D2A9F372
-665352E8D7EC353E7D81A6E29ECAC96F50700D8F1E618918ADEB06337154845C
-C1B7EAF769D54A3858D8E4F81C7B201F4E8BB74751B8EE4304BEBD849511368A
-D405ED3942A7CAC3E61B49EC8D32E9364BFC20A8072564D427E3892165F7B0C5
-9785EDAC494D590658F226E84B638154DA935AD664B9DDAE7C8344A157C36A57
-5752AD98198DFD97D942C38CC5716A1864270085533519FDE9C7088C7FF9E0B4
-E1511BB6291BA896F40E69E2AB7EEB740778442D57E4DF5D17E7C0F6BEB99666
-4695C52D1A884284177EA3EA6AE6F061542B21C2D3C87714EF5FCD5402E22220
-709E610804FDDFC7C9231D7E85F70CB274F42A6B0D2038613D7649C74BFCB997
-10D96D7E1C26F7E0D58CA6B79C7F709E8893FDF9765F4C53B8A13F28EEC8929C
-55164D25AE26C7B978103A593E17E49557CA642F72F529A5504C6381060C3EE2
-181E1ABEBB12B5148649F461C7643E1243A44C8D02711888A8726AC744140B59
-7CE5BE248EA280D802F0F6B7955CB1D4D0FB36CF8960BF0A718B91FD2D357DDB
-484739DD257C26E01C539C5BACBD92A8D6C97B56EA6DF85B1E4E384295BC5A82
-4178CC59DCE00C6C75139FF17EF33E4654F806D81698E2C35870EDC52AC05827
-7476C4ECE666C134CF2231EB498555248B1DAB1C4654E4EE3B5455D2C472B36C
-958BE6B0D1CC3C87EF568D4D2060C0FBC17DB3B8495660A47423ABA7179EB6C8
-7C746071C267A20E51E231A127874CA2517826A6A980CB51068BC30B7B3937BB
-61940B7F361C06644C1B2472EE1C836F9F9B8A4E33ED8CE8ECEE0F5E09AE4CDA
-088A34153CC840BC895D6D947A57B76A9A6C8F81339CC12682D4CDD18989F936
-3D00BB0BE992C50DBF82BCF62926ECC17FC680808C5E802258FB9EEDAF8287B8
-6788B4D3C3CA5F3CA6ED288A30902F3304A28F40B92A5A6F987BF98F777FEF94
-CC8AD2F86D76A7475348AD3D07CA6CE80FDB458DD8235B852B90950DE333A444
-0B00C47921B1E201D7033832ABE2ACA0495D0FFD3B22488552F43C8A423428A4
-021471B6109144E03B6FF5148B699DE67FDDE6FA25225C6806650754F82BD446
-40CC9FD2D90E8812A6E08CC935126C8612C71F4CAE97ADC75FD58115E212CD59
-6614F53AAA30D9C8A7DE2A6EA32395EDD26713BF8B6086225970D8B4EEAF71B1
-D3B6150B945878F806BFAC36C33B2344C5233F7C35B8D1264EA12DC081914E60
-78CD9F6AB21585D3297452BA7EA1CA2BCF3F39AB49ECCF8BBAA1A22883C161E2
-699D3A46B51E75E3D80A22ADCF6984B6B67BD11FF7E05C46E0516B434792FBDC
-A88DE35EE688D35ABEC1B8945A9A3806C1C214D80D0B60DC31496898B73E46B4
-8EEB7B9D2C3A8829E041663AA48E7378DB18079F4D76863FB08405EE7B8F3D9C
-328314A3DDB55BA7C28D4ECC2A4E23A701B88A80D82AA2BD4824FD90F47AA702
-014753CB1E8B020F9A3CFE47F6BFF747D257F48F3507494ADED3BF179FAC674E
-2A372DEC39D0DD73AE3F932BC5513947A51671365CB6032F86BF3D3D0F1E8CBC
-145782A2D8B27FFE77AC5E07493BF2C423A56A37FEAD71559A149637F8054AB1
-5F76AB661DD116FC5C55ACEC633447343E30C555E0042739B9629D712CBC22ED
-1B725451BC0217964F3482250C473C77286326EFF965406FBFDA478FF4E3F4E7
-A53CBEE24C1BB2AB8A79D88BD7BA1A7B86C3650D2D5C7F23119719586BC11C6A
-04C0B90489CC46FFBB2C6F6E8993DBBAFF62F63F79EA27C6D2B1FA55AFEAEEC9
-705C0A22B7E0E94CF9306452A854EEB6FB0032E442B5B3A16364BB3ECAE00E77
-2B845CAAB5966A5E78BE8C5440063CA3BC84A4B0A07BE880012DDA7FACE5482C
-0DE438ED79516FF924EB0713A68124524D74730A6318E359B27CFAD218DDD03E
-5EC4EE23FB7F94D4C88367F6299372BE29B5A4059D1F00C0C2433F79DE287A3E
-60A5F5B1C812F1E12809A07F9623ACC0C0DEE78F0981FF701AB187FAC2004BFB
-73B0926EC097237B301C311B478FFA455B8B1C1129FD2E4A62D43D2F79BB693F
-1E88E5DBD5705480519B874F502197C2CC30D8E716A5DAB4EC24298E7DEBEA5F
-095EB5BB78B4D7847B9C25F2D462C86A5033B7EAA136BE3B3993F479B76393FF
-757CDC548E9093D916A40045AAB54413B0563FD905451E2D0BD7815FD377E00C
-7DBDBCC6476AA2C82C52DFD027134D8154734342BEFE176CE8AC20CB16C173BE
-776D5089A4C080D07196A06AE34496F04C5B3945BA8403B2B408EE150BC0269F
-CE8A1C1CBDCD996D75705F6CFE6D487025D924208E6304791CBEAA62DF66C80A
-9557DF93ADABE4ACDDA1C18DAC4476491A84F8C8D8932E6C02FC22B7ABDC397E
-AC155EBDC6F8DBFC3A2064E99252D3122685753C3BB839EC743D7CDF9428CE6D
-0DC0CB52F218CF1D9C8412DA2CCF13677FB55F9963BA89A47357DA9957306F70
-59685DAE5D0A70D180949B206D8502489F82D89AD159B969ABFCD08A746B8ACA
-538FE5E148F151034B6A69F604AB09431787DD29C6D4414FCF3C4D04090F17C5
-0BB65452A3EBC75DE088201997025F808360A7DCE5C74F04617E9BFE06072F7C
-D3EAA6FAF4F5CABF9D87B851CA785CE5A675AE5DAE55C996D5CEB5F760051237
-F47CEDF612D326DF900C771FEF1AB9CF00C5B29558FE329E88C62FDAA94EA598
-FDFB4A27216007C73B14FB5FCD9AF42F39C0879080463A9EFD11614105469C73
-F38A92C4AB2290459238BD513895FD11B0234A17B303A1F55617EADCB41B7501
-0FABA82CE8A8C5E98308B5B655DBD6A63CDB44B3034A2E20BD44947FA1F52217
-01B16A2E6CFD35527363C5981CDECB886331092AE9DBB2403126BA0EA79C7356
-7AD019A16D9957B2617B5F4F9B7F82E75A718BFAE6EA4BE7D8561361DB470A9F
-82E7828B10C718536D6DA7155FCC1FDCCC2692BF147027F9DB207E981EBE36C5
-EDFC37B83290541EAF2514891728F4D3D17730396614874BEEA92FC26D1DD076
-0142E42962897F27700D4F34A946571D2AA7F5E9BBED708A9E1D0BB2F9FE0823
-A6D026E3C9D4D92320570B87D428F98BD20A395BD06B600B34E274A9FB42B0BA
-4430B56E5DED6D014DD78EE54522C25429E5F6FBEABD61CDADC297ED24758E2D
-85021DD2E900864CCA07616BEE37C74B379C279F554C4A20C195176787EAAE66
-1466F8126083FBAACF3E774843202587C09AAA172DFB89E26761A7398E9A9997
-256301DDB5ACF882349D99539BA40C38CD3E69464B76B5839EDA48508A3D7246
-FFA59703562647B680288D2944AA440599D0B9BCBF2E1261F3AD23100219B1CF
-3A1FBB617606892DFA5DE1D7C221C4A6C8608566B92C67C3044CCE7FFCBAE2F4
-100445E92F506306C2553EF320325562284B579353168624EDE9FB921A759BFF
-29F65445AEA413844E4C9E7448E47E7AC8E934D993EF1DCBD153537282E28104
-DFE7BF8601A2F1544FA971B9FDA521F228BFC95495CF5BB48E4DB9828F64769D
-1C7AA777D2F1B79E054C1E6A03D3D27CDAE3594D6F37F8F03572778058A6FE9C
-E8E9AE758B7D204A02B5CD228029C1909656F1A784A3120555C2705370C80B6D
-6F0F9A0DA15870FC79D8C451FFC98D8BCA3AD6865ECD906B2D8B9AA6F62FD013
-9B7D59E9F9C84976AF2F142B953A76748C078A1B32566CB71C808B4EF5B0360B
-60000145951DBA021F16E090FCC1137C613A5C488646FE8DB564D5686D49E0EA
-152390D5AED15FA44C71C4A829E250CC5B3E2B708EAFECA4B324FAD72A5FA2D7
-CB9BCF155F04EB6EFEF4CD2E38A6D435E09178D26B9879DE75B7E366DC829DC1
-A7E25E4DBDCC29DF8AB10C7FC617481FFCEF59B60ECD35DBCA03CAE19A9804F1
-758EA342DA058363A1AB7210A73045411EB5EA0C97C64C7D89162861C549778A
-F748232138F5BE892143DB15AFECBCC6E16646DDB26C7122D7FDC60D530EEFBF
-32F9050BEAE6A683CC7702866FE1E6D543FA8866CBC92D25772C79E823F6BE83
-F1F4F52F8C851F7F92C1E81A3FFAD932BB8A35C263B535B3615DBE8ED8770B4D
-84915C479D24345EBEE99B722DC5C169D04A908BCC3D0585BCB6C96DB29A469F
-32689E30797076DC2B096E1C92C8012E3134BFB2CDC67E6C389B93018B42D727
-88FAB5CD6F4A4262F4F45D72346645B64A393EB960F6BF1A26CA2FEC965DD763
-1276D5168664E29A51BD7B8A10CB6F8EAADF55C9727DB220749073D3E1FA31EF
-9F468511A80615D35F26A05FF01C183480D2AE7E729B9B04A39789730E5529D1
-180942E68402D7407419F2622574E55777A4DAEDB7CC9F6CB605AA428F28CA6F
-C859BB79A649578095243268D594212EE8A80BBE4DB720EF6B3695F8A16516D5
-6B6DB2F9D93EB1598E06879AB08ADCAF0DD75C0BD31C9B8F44041415E6EE47BE
-4421A95E6B80589BD4CBA6066C1092D76F97EBFB971E38B986762255DAFBF5DC
-7F3A28A028DBAF10AE5D8210285FCAF35E22E68A42B3DD8281D41A657DA2DC3A
-7107994D7E9FF61934E1F63186B9E28962AF5D783458A85A84A5EA3676AFD039
-F899DFF2319013F517A0D3F36EEE1C42DFA5B1C3B8E41A5BEFDEE21136F64A74
-0B2F3D8F2E64E4F106DB68C3FD4ABE346FD45B90DEC25D1B705EB119B08409FF
-3769266F3A94B030B57BE670BE932ABD17800AD8115BC513329CF65557EB4E66
-788C2481A74AAE555DF0B8C1746FCE0349BCCFC76120274B4414F3E860295696
-7A94B5BBCA7F31D3DD01A59E2E2E188A323F1FA8E1B9EC45589B444FC7438731
-F4FDE301422B653FEE01C38E0B68DD30B1B7E2079EAA2332BEEC840AA36BC3E0
-8DF770114A53A01DA1F4F2BC6EECC92160E3EAEB18041E2FE43891778A89A23E
-2FFE2A64DE61CC651CF2B1C44EE9677DEB492438756A31C9A3E89678959EAFE1
-B93A0A25B64712253BBE7259844D4988A574FB1219C96915A7BFAF654DAD6BE6
-B1A88AD6CF09027359A681FA82AE364D430AB261668897C5414511B9B31DC31F
-FFBF69F5C1EDBC0187EC0C658770EA19697D92D1A35E1A98BF60F6CCFC3BCD51
-EE602EC8A919306705D61579F04CCCF587C6A5ED9B056FFA9FA84FF41AB30EA5
-28D5498ED5207B7244EE46C84FB5BABD2AA6B136559500CB5BA0FD4BAFE45AFE
-9E0AD540712C7759078A5C257C1B542BE3DB37BF0CEFD0F18C336D5B4C5BA34C
-9E09B8DA0E388BABD69F7D1573A86E1C52AC315719A5179E7D986430BD34CFC3
-6110822B15779B121E917FAAB2510F9F280AE0D24F25D7D6CE64DBE1241C3CC5
-D9E14F5A5B8E3B16957E642784246850E3644C6ECB7954B469C1CD954D0557A6
-6F04BCFBA452A34A6733543D8321405EA12C1658EFE72CD0D2BDB735053D38CB
-C72446A5C57FBBA56345C1B00B4E0DC9BF4BD5403B1E1BD0A890A95316BBF90A
-C683E7C352E2D61B24E84C477AE559D5BB86BAA35F235AD4F32D7A9C9FADD578
-E3FCCF6BED0F7DF1E412B8A923F7197DB936E27230DF61C370318052ACFF31AF
-4709AA521D561A6F1B4C8C425F6638A138EEA6A8CC069559AA3E35C7448A1ADF
-7445039449B49621781D2D5E969BBC78A0CE5FDC02A7E0A76828FAD14330416F
-B79CD927968771EDC913E875C5D11C2F29CD9DE992F652DEE96685DBA857D0B6
-0A2F410B2B46D779B25BA538E0B0145ECA0B14BAD0927FC63ADBCF8EC10506F8
-282DB2D07172C19617F95235C7AF6E1253C8405F53839B54C55DFF7C46A16202
-BE0F0587471E8D83E8E91A3C9F3BBB82BFDA98811803945EC85607FFE3E94E6F
-7E26CEE7A306E4C4409DCDD8DCEA89DD1F08EEA1F0EADDAC133DCB1931255F63
-5A22E592DBB0C8949ABAC62402CE17DC7A18AAF815C6C86BB341E7444F878817
-1590AC436E3CEAB3FB79BCDF5A12F2413A82579DE9E5E36E92B47E465CB3CED4
-554D1E308769F56B2C55CD8029696786C0652D7F042DD0DB7F24AED531753E9D
-82F63CC50A1240F87EA74381D61D912C8711F6F6E9C0CD3A302D0F3687EBF024
-C97CC23D4E08514D6BE8394632BBA157A6606DBFFE884CB958E2F876525ABFC0
-F0370C5C9FAE209F10F91614475E9EE4972E95D8880F5714F0D414272F3AEEDB
-EA181B2BB43631C15A68C0CAA12A8B9202722EAE1D0897657A1A8C57CCD0DD9B
-F97C68EEAE1E098DB56203C994904A400D4750C150ACE554E7B45D4D22563D0D
-8879046FD0D8DC9EA5893D5A58C85E81C6B2E13A89C55ED399EC11B5C1F80EA4
-53EC27FAE17E582B3EECF86CF73119A8972F00D946ED58931A10586B6B51D39F
-72D17CC529105D5F8D74534C2CCFAE412A516CFD4CE923EE8072950A606224EB
-229147A8FECFD224E4158BEA0DACDF53654232A1B946711DC8D20146B4CB7D23
-CE3F199B1E2698D626A28CBB039B073DFB33F29DD00B58875C28C700A985B0C2
-92656881336BF5DFBEBF01FDBBAF1D86EFD6F6ABED59FFF6F6790E94ECC70B88
-B0CFD30EB7D4677AD2E280A65CD9D95A35F7EB0263EF3231AF61A1E81F2D46E3
-D84C94044861630FD92006B7C0AE4667F0D23FAEE1285CC1B9D6541349015E38
-8D57858099E69487015AAA314120CF1D2C23BA28CFB15F11C12ED21EC42D3E73
-80AF786BF3958C30AFC42553C77EDEDF143B6F05BFADB6089FB93B9BAD0EBB87
-8ABEA058ED232D3F24C48359BEB73EFEAFC4DC43C6A1C4ABD12FFEEF73CF2649
-84E08AA367F464A5E009D2BAC23CA90A1B3F8B463B7EB947A25C9294E188BCE5
-512207D22E67150459C694156A6AB56EFC0637C661E3ECCB5D5331BBC268284A
-8695461785F63473F18C9BE89D9447CE7EC2CB9AA325BB56A5C7FA6D03D9CBD7
-6520F3D07108DF20136AAE5C1D3B0BE03715C7660F767846D85548C3F6B5FB61
-19E0E43AA7FF6CC70789D3B646F0DE24AD23FF3ED668C6E7E25FF7130859A5F2
-3392D7F16549D755038CABCC821BEFA442C8079A33FBF042FCAE80AF0FBF8C96
-6E759BAF5913D55AFC923B065A752A6E47CDBC6DF8C5E3685D289220CF593255
-E509311E5D26BF43CC8B7BB2A519C274423089C5FAB6033E17625C953E9BE3B7
-FBFD85C879B64DAD56EFB9F0134E5714E8411249B0DED90B9AFAD6E40ACC3C32
-2FD398BD0AF07732302617909BA907AB22062EF8C849CED6C30A392BECF6383D
-E6A3FE99D6E928CDC000C08511327BA7A0AC713A78A3D515E07396AAB5147135
-86695C077F211101014466A2E7BD0151B3E752DE0D255EBE1D2D56C5D11F778D
-5FB60C8FD628814DA7F9A3B7F95CC77CDAD55477364A8306D2B28CD374926E57
-04887E6BBAAB59107A7B89C36BDB46E5704EA401C4DA6394D3AFC428F45465E8
-9D01140F4D783E3739AED22E0D871D5A4017D9684D2E55A47EE953FE22B75522
-6817F37D12A1EC0976441C94FF787EDFAB1E409FF9AD3201D73D24BE56C7CAE0
-43A73CCED4313542F4C1112C35141808CADC4DE6EC7E832A4AB4A580C4F26B90
-5B37051CD708D6B2D770364C04B7546244474FB9574E5ECE5427FBB29603F543
-3D41C97C021348F027DE6EB0A658750AAFA60737495FA80D6E1F61F1737FBD7B
-0007EE164DE9F5877DF68DD8CB10A8F06CDEC0EB86280B3EC29F9DBEB1B91357
-0A51B254E35A72593862247E85053B922581A1840399BB254403D721AF75E774
-70BA7AB160BD5C9CC6EC08DB9DEC937712328EE8811FC9C917B293575A6439C4
-8147D7586ADD5DC23C61D1511DE64AD1F5A93A4BE587A99DB617CC4472B1F984
-24D991FAEB3F6CC28A21ECE4DF9175CC0CF56EBE2D262D431D3E8E7A1D220FA7
-CB18F1493A97CE32DCE1D95149C5FF848ACD3B3B32C433064AC995006AA2B775
-5C4BCE15748227CB3673B7A09B5DCD00631F91CB0A157FF1710A9D56505CF964
-DC1901FBC364BB98385F009C20BB41F96CDCA2021E36C3EE59863D5298497915
-3BA4DA380C705B1D81E07187A3D4B4191E5F22116FCDD21A3EA286C53961ECE6
-BD7D029AC344E7A5A03823B6A13A763C946C41229697DB8EF67007A934F27F7E
-07BB63C5C5FD24CD241EE957F854450097D5E6E291812CFB9EAEE923711BB88E
-B74E472FB4112EDE27A893B34725C9DA28F91F4A91EBB54168E327C1F9AB7A80
-96FCDCD85BDAB9ED36DF209620395F539FC7184D88BA680389BA9CA51B9A5397
-BD0120BF40DE8B99D6205FECE2E509EDB0C39BD75F29D6D97E514C2E3683CFB8
-FCA479BD47C8E02DCA2AE350529A568F66A7733528CA14CFAF4E792F10A11C3E
-CEAA08A97CBD6D43CBB43CBFDC7FAF22E87EE9E008301D60083FB7002697B3BD
-EF38EB52049C00F157558B3A8BBE5361C82F049D4566A1466869FF2584F6DA99
-23AB74F19AFDC1B6CE4C4AF0299F6AB4E57AFD2EBE1AF260EAD4B46A79ECF3B1
-BEBA4B9154DC2390AE0061E48D002EEFBF44ED6BD59317E017C6E42B2D8283BD
-58B8DB392C511C12C72518A2B1C4D185E1D0E5068ED5F4C73E771A75F0BBEA45
-428E0D31C9083ACD4842EA136FB12094F786DE99956EC2EDE1BC9D3352E68CE3
-4CB3994988DD766F6DE69C5FA907DE7B338F22FB9377E20B7978E2B0BF39561A
-F526141AF262AB9C6853BC1A947D79F8A6930232F955C6C88484791460E7AF48
-B235E17AD4507948DCE6A29CEA6778893BA825CD9DB22F9BC36822EF4E98EFA0
-628F8190C1B4985DD9A11F2879AE248E2D4115CB01446379D9FA1820B39A4B39
-9B1FB8E33D9C22EED5CF125B37DF0B7A471A58E7CF6E516DBD5F54C609517F00
-D40B22BA5BD7D3EAD411D4373FE4BA22A93E2DCE3F7666B178BB881AB2138076
-87DC7077CB5EB50F0CCEDB1786E5AE3753C4023E9C6526A57EF2C833CFC36CF1
-C818DA36058631F2E7D76A8573ED0BBCF641034A35E3B7728BBDB3B8CC9B81BA
-71CA28E2FABB0714271E3CE86F5762B3975834692C390A3DDD31C7A609F3B850
-FC284EE819E6E6A4A8085A92155D502F95B9A5C7E5D02059D9D0B7D06F9D5ADF
-85091858CFE4C7131562507C64F8AC607AC9936C79C87DFDB9E6A4E2284A5BB7
-4F7BAB56A319EC9D70D184F789C5BBFCCF7B7C2B91C2581E8A5CA55C8EAC26F7
-CCB524EABCCDED72C187EBB1F6943A992E63C0D46206251BDC363362A7A37081
-9D58205CB308A33E290AED466DDF02B1FE375669B08B19376CE9DD152E0064DA
-EF925DA958D560D86FE710D798941601D996C655C553DF0AE6C0F3A18E54817F
-7B30DE1D156861C9529A281DFC897A4B4746FA7AB6A95461BCEE458DB6D05332
-677619D0BD96AAAFAB4EE63912B703029AB349AEB275AD79512DAA4D7212C101
-AE39F00CA8DE02F438686211D567EECE1E42FE13386314A94281F014440D59F2
-6E258D72363746144577C85BE389F65676AE3C3D19CD2CB8BCAA75969712B8F4
-7629698C52DC6001E32736214349690EF8E57A8BF50C9F56A4A0493FD66A919E
-9875835511AC63AEBEA6BD1753044BFFC98432A7EEC9E3AC68880974382B1EDA
-7E01A7FC78EBA3A38EE6BA20636CEAA56E3FE22FD60542433EE5CD688FF4018D
-307D893C2021D03C7F59C9F1387960FB843E1AFBE04A2F6F406C31CD5DB4B24C
-20739D6D74C7BC11B20382DDE8EBC1098E0B5521CBC13D346DED4E5C41701B96
-A8F8A382207C21582BEF7D04129B3AFBB97455EC964455C85B3C177C41675699
-77FA7D7C2E62EAD5C151965CF3B4184C3BFDAC859E1F096CB050BEEC459D7317
-A088DDD378A476D46F26C048BC4377CC1BC095F688B7B7CBD3971AC1F050714A
-35C81786288D82C54D86F5B00ACB50B0450A2EBB9DF94F0A7AB1B0DE394BDB53
-5C7BF36E6CFD410056591B94C351C1544BCCC77C06EF80A9D02026BE1D6B7889
-212859D0998B0B3E5DB66E75656D69D30104DC613DF83C7CB2C8F9D64646A7DE
-372AC87CE3394DDF99D86BD15EAF56B06593F04E47862141D81D66D83AA8806B
-47D3B43FBB79E806F9DF2288D9E6A2CDEA497B854C743DD4373017884177AEF0
-B44D4661C0989492EB7F9A5894AB8DDC93D21DA24338E7E12EF3314DF207911D
-B84D6CE001EDE032D12416286899FEA12724AB45497E4A0CB868E15FBC144CB5
-ACE3ABC1B5CB2BC13A220F93D9990DD9B4CA9726CA00DEAFBEFC2BA9EEC3D94D
-595582174CC45D726E8B961860CAB4C611DE70769926372F11492FE2D4693C05
-9AFECAD80BCCA589D7964DAB00C5E123933F6BF2331091E81E67F0DC0ECF1707
-0BB1C5E2DE5B1C88FADFAE9A6594B5EE9E9706466F750195D2D1539F7C80594B
-531DFD2DFC0BA2482D86F2C8C3EE068C3B8596742ED27AB960DDE361827398F1
-CECEE6F2C74F944383CF07C88BC80448AFB946C782FB232CC3FC17A93E7EF7BD
-3CE53C6EC2D3D25CF63A3CD27140B8D17CB74BDAA4BF2E76CB2AED491E9E1F70
-800B380CEE1A505E612E1BB47B07CA030F9E22C8E5B559AA42CBBA8C36E4A7B0
-6F1879675332B6EBAEE398CC34ED9E02770A3CE0560818B77EFC03B0DCD583FA
-CFA3251AA96C0193B195DE6B37E89F2279603E17036B3152A111C54D0BB8EA57
-32CC5E5EA68254075A7133AF0EEAA153ABDE61032E6B4DF6C057DBFCD5981449
-68F39B3B1FA9EADBD8CED34E625A23BE959347D92158FB083FD351BC4AB0961A
-2FDB383CC4AF0F4D841BE9EE98C60AFEDE729630E558D54477D47B41A63ADE7F
-BDEDED305CE9A874EB2CAA040DECA194FABDE66EB73F69DDC4B4542F035D26A5
-26ED690F92548CE93CBF174EF853217C93E25A68B7C6E47FDDE19627AEA88A5B
-5075A2EB5EBC4F291D8D47BF8B699B4B3617731ECD998002F003AC8F48B22EE6
-2326AB694E4D985154F4AB6F53E2023DF6A2705CB3C6E2122422A866AC481A30
-9B9DDCA04F7F5D3328AD58454FBFC63790F87C1947A987F740B02B8D19C62A7E
-AEA6F7F7C7D0B1EF9A4A04094891F1613D3485DF031D4016E52729F0AA3BCFF4
-A5AA7C714B957C6F20EA9DA162785C4F25C37C0EC00CECA092B74C9BB69B3CF4
-272D015F54E607FD3BEBEFF03973BC28EE73685E037CFAB19FB5000E16E05B41
-23DCE6A1B6C3C6426F675912DB1886B8FD8EF3FC186A4E8581267B5289BE404F
-1757296E1E0D67DCD01A0BA71E46824F962A5220BFEC6FADC5F3911B1F13829E
-41C92272767398BB235DBCC3C192136AFAF90729EE25933F761582FEECD8A2CE
-4EEEDD25A50F91DA79309E039FF2D1D8268ECEBAE56DC01E66CFA97039B96FCB
-7BC9B91B6349BC9866EAEBD1C3982F5AEA86D38C3690FEDC113DD71B5BAAC063
-72C28280BD462003F9B8BCF16B3221550552720741E85066694CA465044FA504
-2BF11776595CC01926639215CD1258F59C16514BAC7A0E0DFA9BC3E6465F7495
-882A0C8B8E37DF36F890A2C4760D38490C031B61231C3E2D8FF421C3E70F7F95
-82383BA66DA2890FB3B6001C69713E84587537C409674570DC75F041B3232416
-B0C3483A2A724ABDC5AFEC995C1F32722FB685388A162BEABD1EB092D1105EA8
-D7C03E271937FB18A65E259DCE716A5C0878A01ED4A275FEE7DBF6634F3F3BC1
-1364443A9AF6697EE9DEDFA9DD67FC0AC679498D8DB38816D3D51EFB75E9ADFF
-6715121DCF5B071661A9BE993CD9BB6E5549E528701702F13B5540AC1A01396D
-84BDACC73DA1B07CCA3D213AB57C4D8F1DA01AAAE6C92BF2A197CA39C992F855
-F2938A0C8B6B112FCA85829FC4EA35943B6CE0FDFB766308ECE21566A2E59A23
-449FB9BAD4CF2B6460FAF544FFD5A0304763B6D61D91CBC7BFB91D6FD3559F6B
-89C91F3AF46F9B14203D2813472065DE22D07D828FA2677C876652AC40AAF58E
-C1838D8A74D192964BC8127255EB00951148CD288E84F960867BC49FA2702E2F
-7C8023C3E86F10C63ABFEA6A328F1B9FE422488834E4295AF83BA1604D132A05
-6A68331BE2809C17345746B9341C97B014614B266090D5FC73CF8D2DC45E0F19
-EF046962391AD19DC55334C72E3C131B502A63A8025443F5DF795D0F2E99D749
-DB028C621902C64E72635E9A4CA28C86D59006A24A65A6BBDE8C54B8C433DF38
-9C93E3A0A3F21C223D300167C199FE2293BD5ABDD9F0B4CC092A6151BB6AD061
-D79F12F437EE38F6214A9C009BE720377AF0021AAF5783EA1511004B1238ECCE
-C75F2CF0032133C84981A7FE1241C65DB91D449618EDA8FFED39D3066B6BD0FB
-7DE0542C491202D694922F4FA4C4BF2AF72E4F74564F2AC3F54A9F72BF693675
-400F251F863683A1ACFD71981FADEEF3650B387ACA8846D7C57A84B5BF5AB913
-38A4BB4FBE788E9A856E366895E36329189BD5802F95DFE821C79B3B8841FBE1
-29DFEB3A465E36E1CED694425C1D700239DAA5723C916FAA77E91E781696C8C3
-E5A4571CEF70DBEC17C494ED46BC095486079ED8443BF0894B26C39D492C4802
-6CE5E89BA641066EE9993E5919207B12BECE4773591EF3B48EE224CF18843DCF
-3F346BBDF9DA3B8A85A86C0B8F498AC5D92146BF9C187AAF18E6CFF2420A1816
-57EE974186F63E5A161375A822C588E417746972BB1A31B0FD68B95EB128B7FB
-0CC33F2778C6236FF6B588B1A9D24BFE552BF848BFDC9C275F4E6FB1AF090EEF
-9483A7AF6A6D7D8C285F535669786F02F0AD230DD9594A351D72950E7633A28B
-ACF784F1E2CBD036EFDDC24E9DADD0C67F33D8F5C87E97404F718437D3F768D5
-DD9B9E81D81C0EA3445BACE76BF67DE5801FD0AF3AB7B0C40CA1412631DF8DB9
-34C640F23C28B0F44DBB92FD79C254F768ADFB59567D4341B339F9C9DE47D299
-3444A3E8A1392122F8FCF9B78FF2C2918A3FCD1D4D642BF89D2B12995735096D
-A4B65388D6D8E9500674ED399DB7A0E35F7A80DDE50841FFFC19BD7434320230
-4E3EB457EB7724138BD8A53FD10F5DA01176551136B004F4CB535BECC7C79B52
-1DFB022DC76DD3FC3DD114A6A42C89543196FB5B85B6F8B9C9D9EB55752F69CE
-2EA3C2230A67A15AE41C93D6904580A26CECAE69E12E7744CA7C1EB558A7F4AC
-4243014B5694363770DADDE68740C483F4740C97C861293B2C06D7577E63F5EA
-1B3373EA993C1C9BB452988A474D56D40D4B1181DCF2802B4822CF34B0FCB29D
-56255A7DF6BD8BA1477F786502F55A31467EA9011A71216B93BCA4032CBCF8D6
-73BFD93A21D8102E4CD8FE5B9039D7AEB01708BC4976A5CCE0C757138E433568
-1DF2E3A2CD93DC5D4A83C60011E7807F206E0C13AABCC4A2351BFCAF4AE66971
-75FAAC7162E84CC0515A448997A20878CD4092777668D3806FA0D28488478110
-CD37E011C61FA9F98F495DDBC5C43B6CCB794771A954FC694EE1CCDB92560F29
-C4EB9F2CB61543667B95173E1A36D50F448187D52AD351FE8635A95AD9461966
-AB6D6FAB28DAB949B79724912E910DD9B78703590C55144DA82BEB8775855C0F
-3C8985283167B473B3B2D495BB913B12EDFFA92889E5109C50244F3005DDBF89
-2583BE928EDE0102B0F7A40E4B0EBAC9DC01DE981BFAF286E04ABE3DAFC812F2
-D066DEEBCA2CEC8913338335D6297114655C844254175128C13B0831693ED51D
-C834E442ACBA7ED6A2B3887A19C58B113A7BBEC794A909A1B9053BDBCEFA2098
-218CFAD30A617246BDDE096F066A00BF81F8FA0551AF34D98F50A16FFB09533A
-E35D98AA6BBA9F845494FF985D83EA8B7888D9B058BA84F801BC9F78800F2CE0
-8FAE86FFC77A085603AE7002E4F6BE5D66DAFDCE2B355086B0FEF5A7E2A87316
-DA9D535BFD88B835C7CBC60220B6C546AF6F8DF890C9A582E47EA590307BB5E7
-A37299C66DA33CCFDCCE4E289E19A4DCD0ECE5CB3445EA37FE23053433FD502D
-6CB673425C5D9DB2B0AC5C56D6420AA9E7598381A4BC05733F6479F24A9DF669
-FA4C9CF602ADC5C4BEE77BB61D8A3260ED88823D20A9D779BE6DF977441BBA4E
-CE8E15F5AFA9ED9AD93737EB6BABB8B32379AD3BC714A6D1152AF18B4684ED18
-E46BFF0725B90A4886CF93FBD29246F9A79D7B41432F598B54602304E77DF101
-C414CADAD6D520FC84406FF20622E60B45B7BB3E353BDB5D4AA824CE42128847
-C11BB4DCE8A8A0EF76035908D50386546E45A1548124FC24607C397EF14C6ABF
-9994ADBE0C74129E63E76BC5BAA44BB4F42B875AE8D756BB8FE5153ADE5244FC
-784CB936E7C2FA1FD6E6300E423A4238DB8D658E8F1B17C39F5A1A33C7F44330
-7FFEAC4C1F9B8CED5308BC43E4C128FD8457B89BDC493B9C68DAF7E76B3DB809
-F6D3152B676DC1A1E103C465F33F087BCCB64583733E3773F7D6D4C994BFDB59
-0F7BC03897EB3CCF914C1FA400CA14CD5294B779B7BAED650CB2C8D486718876
-07B60CC3D111FB8E5DA6DADB3951595CF9EFE458EE412082A35EB390C9AEE0E5
-237811A13BCC85F07A245EA22650BDC4A9E8DA0575AB3269A4E40034013BD348
-44424AC74B1F6628A16533D8DB6D14DFF72E1845416611D45CE2BCCE3F34B1FF
-86BC076132556E6C65F2248E073825D2B2D0E3DB91EEEF5D33B12B0ADAA304A6
-6291DC109F87E7A92335767B3C711F92F105B0B6AD525A6F8F72FE2644F1E180
-4578CC1C66D4720DDBED3CF91F1A46A96F5619A6D762E012053D14A26A88D6AE
-87E37882423056FFB32531C99F2CA89175FBD95EC4A9E678B440D82DD77F9C5D
-4B6D97D1BF7B2E24038BF1BF4B8327091EE59491D91DA01D8756B6F83C28F203
-572983E6CDC9C1D5C865B753D9B8820A39858C389CBFA4DAB82E2D35B6C5B332
-66A239F5BA78A4EED07507D2FC075C65DDC391B1A93A051F559C832CF36324B8
-B7909C130D20CBAD9EA9FD1ACD079D7B95401F72A950D81760DBF8895876FBF8
-018587D37FA6ACEF2593364C21F8BDC34A27392145EB2F63ABA3771402316E6A
-2A30C48B7EA2096BF6E53DAD2C47CBBBA646816DD1E6EAF631F42B108BB2FC5D
-BB808F1BC7A8D3501B2464F8BA83303AF8C43028368E6C814541E17717B397F8
-72034E115CE0AC6EB5983237CE8F604A9549373BDD938187A39F6418A8461705
-A6ED43F775595C7A756D9BC1501A440E6E4ED43B01DE23A206A654E2FEB4A2A6
-4A2DEA86708FA9CF218CF933DBD13044E82A7CE60182F6BA33519BFFF275C2F1
-6B6692E841CE26752200DF632FEA9C93BFE0267D4D5A99566C1AA78DFE8FC63B
-2917E6DB430CEC52D19DF490FA7015D9796282C3FC78F9CB2F2D1CA2A1302CA0
-C6A066ABEA6C871D69B5E5EDC514260193C6C29C8D308AC4A6D38C962FB7FC67
-EA268A9395414F7E8DCEEF611D1AD784E9D56A4F71E13FC7B697408C1924AB70
-A62BBC66F38ECEFD60BDDDDF85F849BA956C3F3BAE422F9DA0946100221556D8
-404BA4327E9ADF31B4AA708541C46717385C3F57C3D7220C59AB272AA94C4F1B
-62136AFF190C4AE70F287D2336991886EB3F14D2F2CF9451CB55C162F494A261
-1A88690D9308B80A3BFC92EB48FACC0C7975FA1F262D81359C88BFA3B5F91461
-EDF3E9A7764304AD3EA1B51DF695C915530389C7DB27FDF73D37CFA666E6CA37
-389BB54CEEA60324D68423B33B2A03BC00E7C890FE1A276A3741C4E133802C69
-8BC3692FDD7B0F837AA060A0C08F8A77976E0C5695D16CBB07AA95E8E4355831
-5B43B8C5F9D351826A537FBE9B5F89DF32DE754A3763A75CF5DDFC60258C044E
-B4AFDA88104390CC2894EEF40DBD766A481C5428592FE68A6530F1E063F013C4
-950A3A30D2F352B6E547EFD81AF86ED43E0BDEB8A0B5B7F61DABC796A21F3990
-94EC45D1E229776B9357F339F6148EDC74A2DB064745749A936E1028C8BED9E5
-5EEC197EC2F23457A690F377A544648A9F151917046F34B672C00C2CA89CB8E3
-26AE54ABE1ABE6C6C697E08B90DDC90F54E32C0982299BAE9A7753C07755A6FC
-CD5F7FAF5BBFB9B93032E1C176E568CBF93303F38BE9D78846AA1384A047E530
-E7497DAA12D294DCCB1747411A94EED2F231C5ECB8E8A43851F4840066C25E51
-EAD18EA9A3199BE80429EF8298BF6D473F1407777D857075A3CD41AC7E62060C
-54F97F65A8EF5CE6FEBCAAA7223E2FA0C6A2C86AE5D82B0C80A20F16BB8768DD
-E778337122FB7DF527B0E9AA47BD792C2484784C8731895528A30F7D1B7429E7
-3AD1E59232438BEBA5D065C8C4FF2E6B0A84233EC5BCB2E2FBD7031F1B74AFE9
-E4301B662DE9B6E27F62BDEEEC1A7C73ED4CC8E4191A473728CC5A0A35D2F3C1
-0F743792A11663F871FDA8582F7EE0B7C4C2CEA0AE1AC74A73314469903488BB
-DCF92439A3AEFCF1621488D7BD8BB25318D7196D459EA3ABA44546B649BA0CC1
-9E29B9586D948282EB1D8DB89E4CFD6DFC16A005922A7BFE071819D8CBE15F41
-06217264D10450784FED734EC809C68AC760007A333E4132DA48201C02590D40
-BFC91E614F145502C9B27DD7950C46E6B25D4470CE79CB2DA192336726253512
-CAE6D87ADB60EF451A507CFEA57914F241A8C81DFC8AF788963F2E2EC722F81F
-B2E1D28C07CA64D5E9EBE8722707CD91021DD64EF2700953D590A62AD8AFCC85
-30420DEBCD42A684B5C527BC149DDC14C4FFE9B350DB04B850245A1650E749B1
-B0C094644AD43AD83087930CCA240ADDC2975E05397807DBAB4AF30E6CB15F7D
-014771BEADB55CA911E29A38D7D2DB1614DCC0FF899BBE9FAAD2513C27BB74BC
-A225AEFD85DEF96AFA64F89405572FC5C3A40BB24160D7F274ADC4DBB260EB87
-BCE6390588627BAD6B640100D58212467736FCA465A4EF71821C6D765F3FFE41
-A030BAED3FD7DE667BA4479D5316588484F6317B88B6E91018F3202E8625B837
-49A64AAA69B7B00FE37413D1E632B6404167A439F9F2140975891FECDAE0652A
-1FD5FFF18973750883207300E4CFAB59DD7C7394F173D0DF78DA3516B44B4D03
-C6761A6CC49608F0CBDFBD46FBE6FC6E7BC9558F281A8FE32C5AF888F3241AA4
-BDA43506A22A091D67934D138642141EA39CF627A6A2A5520634A9DD05F09165
-C03C0A3CBEE624E4F59BBD2201BD2CE1981F46C53B6F2D91AD7839579FE7E7B9
-A29DF2BD08EB5A218066E77877915B6E1AE372100DA1BB9B8D0B229DE48ECC9A
-5404AC224521D9F648DA7E1C1102CD514F4A4F8F8AF5E90BF78A9E2D90C93248
-D39A5560AA0BA4035EC7B45EF7015A9A97E6A0104194E6748C11C5DEE3FA7431
-267CB641D551529E89571B9D701D1FEAA4F1ED1BF17FB532EE6B6EEAEFBB6764
-4CC55E7C8CCC63C7E4B93C9D0BADDE09B1EC8F31477D636F4C2CCA1A817ED12D
-7E2A904EA8888C20333019E235870FFC51A17504DC9AF8ED6B6A462B7D3AA186
-CE76A233003D7A5AE162B64BF90AD0B784E1581E5AC17CF6EA2746B4240D05B6
-FC2D4E068ED743E4CFF9ABFCF73D66F2671978C6E8B440B08F0C18514039EFEA
-02A14A8839A203C3A921015B5DA8EB9688632EF87CF933F558E466FCA150DB2A
-494F6697334380AEAADE71CF8C532CBCBF70172341A0AF65CAA5D39907AB6DB6
-061948AC7487B667FD546F155E09D50252E2B24C7EBE334527851C8D5164D66A
-56C0502EFA0884BDE703668BB25449D1AC862C15D434087CC14AB94788C34ED0
-2390D067D9D13D4D6E7B551B1B3D494C77F4B9576213835A221ED022FA6E3D0A
-F44A85CBFD09D8E6D68B43BAE4CC2325DD56CB01A93B84FA68336ED8B2CE9473
-4EA7715DF92EA71C434759638A29738C84C814E13D858D0E23645C8FEB660603
-93EB19647F84B481CC71018766552BA16BDA1A94943EA464E99A0230B67E92B9
-4BB6DA4AF80D8C812DFA55CBFF4AE00E2EC16BA3114FE8D39EF537B4A982D893
-7B25BF1366C271B509E1C16E9632A9A64A2BBE64474D9500E94C21D2C0CF9258
-FAE9F7BA3259EB2E279995C2C7802CCB2C3E946B011043A4D7D2067EE56B77B4
-213289CF677C8F7572C95F2A03A6B7EBC64D99BFCC0615963F33B07FDBA894EC
-D1F17EDF503D5BF1E5646E2C7995FB3F15168A518AAA7FD3FD05B21EA5292E95
-BF48F0BF9F41820FEDF9F5DF7BA4C396E4C71DAAD3F209CE8EBBCF5F053504ED
-407FAD8BE9CD2EC265524575069CD2820E516D133AFA55CF42B3332BF53DC45A
-ECBFC8F42F9A34E5663A6694E48B4EE0C5FCECAA33E19A125FA8831BAB9952F3
-51020BF0C27F175DE97ACC64C74929701567E6CD99A0A9F4EEC88509E2B2E93E
-16BE159A8AFA0121AFAD45675FDDE7F795CC8EF9D41202CD38B148090FFB520E
-530C701D3CC82A19E587BBB5CCA1EEAE2687486E1AF28A20E1C4C959F14868F0
-B411134AD1EBBD9CCAE1B708772CEF727D92FD864712B96F6B295849968F484B
-3DB20337EB5386325B127115487425A5D474766075BA04259A6CC75B34D43529
-F41E37D69BCB9A80F8F9B8C4EB2E65CBDF1EFB70844639F347DC5BE018657FBC
-F34908D7D2A25766F1EB5209DF5CB00709321B02E05C48E0363F0E778E0864EE
-E65A17394FD73435E9F4523FB580DE5333B4EC4E5CB09F53504CEC5289B18B94
-76B8166EB1AA30A0512A56B675C4E9EAEE695D82B2D770DF175CAE19AB19E0E6
-E195CBDAC59C6559CA9C3620632C0CE3A380B6545D58486080AA54FBC5C4A8FF
-AE0D6BE9F96C8E489C0E06224FF96E35F16B94EEAD8368D470E5100A0A731B69
-DBD7735712DD3D882420941F5EBEEBFABC28C3086CB238DCB99C0DA005FA85BF
-4E5BD9578C0CF27395D29A94FD27584FD96F0ED37169D85D8B85F5BCB5ED8E9F
-329D4D1A337BF1EE62628A3D3B81C759AFF5F6DDA0D8742044AA18B93E32665D
-80E3DE0D2332FFC076A76F5535592D2ED1AFD60805D10798E03E8E65C17DB19C
-425904FF83587A0200B406D3BD3965844289270ABE86A5D7A9BAAD43CB1AA363
-ED87682CBF19B2ABCF8E4C9AA701017F06A4346DCF7A000E40A00BA37AE5601C
-AFE7D8E529259D1F57D7B00FCF5F246C902E920AED62751D94FA41FB9EFD25DB
-A86F9B85B634562E96B8EF8CA5F5B77FC1CD168EACE9B19CE7D56CD99CE70197
-D80A2508F3F31A5BA5A8AA8F7B833C2481BB9A6CD8826475814F0B74740CD443
-83C3F266BAE4BA683636FA0BFFC57D71F8D13F91F33D368810BFFF77D9710902
-BFD32D9DD2E94C1C06026B3BFBA5F8A71518CFA31220FD245868729B88390774
-EE063923474CE8D18C2D34AA77F9EA37A92F7530DA0F67A05B2C11C3D9942AF4
-386DE7FA1BC11F0028D5EFE8A3474A5ACA8C1744BBD24EEBAC3BF7EFC12DABD1
-C4DB771E7617D4F5C4B759E84F40426E8AEE3BE6E334A378A3C56319FE296114
-047945896F2B8F8F925F86CD4755CAEDB75017A9729187C1941AC6A9725DD547
-197F636F0025E63FDC74ADCFAF0ABCD64DA1F7512442EA2D2E88726BFBBCA2FC
-AEF3D4B56DB882F20ADE74063FD0AEEBF62AFA179E5AFCAA443663B3E8594DA5
-F4C4454B08C461F85142AEAE2BD3FF04F9A89C9E2C9519A856C2C32558EE6A1E
-63D565CB3746C9FB6C9BF7494099ED1BABAFAA9069BEE833D13F3ADA35B1605D
-2368303ABA5179DE23EDD6E2610BA46BE4B3CFBED8D80A0B8FCB27F93287D3A2
-33B9C13577AAB8B77BE80C0466255A693FEA8F2D0FC2DC6951F6431DE0F8FEB6
-659C8E985D3E02378DAFC9DAFDEEF0012FCB5ECAF17AAB951E0C6D213724B6C4
-E5AC05B554F814499271F37A4A0924D4AFC9960045C7E4D7546FA355016D5C2A
-74B78E6F4B92BD1A45D430EEF88DC034CB01905E0C26460D401F44772C260759
-8A716908FEBDF9EC4DDA187960DFD111B73587D5B8E84014560A14FE1B46C152
-DBB6B7EE966712F3E8F27DAA9C758355ABBE19F067F140B522DF95ECB66264CE
-B2F6B7A1DC8B3CE934F8E8B005DAB5D9CE71ACBEBE51FAE0E689429B3C0048B4
-9DCD4C933F249085B0EC1281A3754456CF4224329151DD2CD391D35ACECCF6EE
-B03741D088A36B09AC5100A068F58D71E71050DB62D8029AAE834DBEDDC3C012
-C70D090A3A4F1A77797E73B93779928B824A882974004C16981AEF1FCF6DC7AD
-34E68B09E69063B253447D6F461D0FD38C91EDDB5496040787C62161643B0B8A
-B40873BD924BD5C3EFDE93964392B2503F5229F91C5B6BEBF6B977FD1DCB5EFC
-EE8AF1CAAFA81EA2DC1B77D565C69001DD20295D5C4576F6EF44CBFB13601118
-F55B5763EDDF93C0994720CC32BD01AB5D50CEEC5C3E762F8E60311D2487D143
-940802637DAAE0CC3B892E566BAD6DEAE8A9006D71233C4A1C9E96ACD5EB7056
-DBE34D18C2EEEDFD73C771301B9C2EBF0DDCF269E05464790E36A6C124634374
-CE6B8F5D046497C80FB2F4390AEC41026B593693A6FF9E7196192FAACB98CA5F
-BF6F7A10F8C78C07030D3BCBF0DB0CAC4981CF3550077183EA1F6C6C093F3A3D
-49215A00FD60254AAE82C26AC7E2B74405CEC4EFC19E5C84595E88817AFD9E5A
-B3D21F906F757F037252337BB6552DE24B4ED3665E588CC9C3E916CA1E2DD333
-85DBF273ADB790E1087E8D4994CC038D4F5C203539D1F5B72FD4B2396E175102
-82E544BE1AAF2045777071CB4D0CB8B7999FC2DABC172CB5200D01EE76D90C85
-F5BD6801F07E825D94FE5689C2CBB18727B84C0793F168D0EF39EFA0CE317D63
-AAD99D61D9A953A60FCD905AAC01232ACAC04D0F164E59FB59445F4E9C9206C4
-22BCA0F75FB6EEBB3AC6DD055D4751D6F93424E030CEF9ABC9E9C4792AF2A3DA
-1F1D98FE0971C2B6B828004A58FBB2B4808C8BE492F636B13660839C5B6F9B94
-6457A0DB83D0FC4F05A993F6F70FC1ED418F6279DD339790006EC4CA34B34011
-8F4F922033AD1A70D2A3CDE0BDD6A0C0F48ED3BB61727EA6FE093E393C8E1A7E
-D4B58BAEDB50B5395BA7D95D8921A98FE44F6D2DA73259560D815C82E435325B
-D633FB6161FC6F82B0EBDFEF76337EF416952A7AB4FA74090DB78F02DAE15CBF
-A40AF9D8BC81C164C581302E70040581314E8FAD7E0EFCAD384D8A7D21A18C6B
-ACEB44932A14F6E5D05CEEF88068FBB44D81F2149ED7C294C583B3A32AB289B1
-C660E734972BB390708A87829D527A1C9608A16F6FEC6BDE309CD440A0197C79
-7682FDDECAD867C49BA02A0CA7652FED17F411F5DBCC61A910C094DD249FBB90
-8D477DC7F10C7D03157D0C2822CD3F3F7353A7FF200F0C20C04A395D66111E6E
-A6EF63B509624BBE57A17B0AF22E67F33E32FDC20D24906A5D1A698A675041ED
-76EA377C33CE7530C501F1161DE10A006ABADD053F635408C51E91E089A83242
-B55AE77E0C10F6F11B53AFA57A14B7F23BE611EAF1C8C3981AD7261A7AE81F0E
-D62976181C4512FDD4A397E375D37E2A127AA5B2856C82AB99D770623F36EF3E
-DFA5B73D2F8C134DDA82FAD11F791B3CE3455AF3E4CADA2977F240740D1CEE12
-5E60A4A290A8185645D0F49D05E5A59909EEF7C87D87209468CA51C352845C08
-77B816FEA743C2BF5296DECEDB5569EB87CBBED1E2BDB382C35ED191D451CAAC
-7F93A34A219E6752E5ECD3F2CE819CE9D46E5509AE8B5F18D85CE2AB87273C7E
-E067165BF75291EF6E744D6F5C7D199AC1758F2FBE9556CF9ED6245A2A9EE591
-E78257E36BDFF553B6E7CE515732C152A436EE59E219FFFD4D0CF148A5919AA8
-9986C04CCBC5D91B180529575BCADB7E34F94E2E1528C7A6B602D4418FDF1265
-9CABAF85FDC831CFCBD1449C8CD48E98DEFAF3BF8DDEBA899CEAC532E30F6D36
-B891F0AC6D74393034D49BA5F96EDB94ED8E1F10EDF985EF757BDEB967959038
-C18C05EBD2F27D6E47F4FB9602679AFA54E5F2810D69DAACF96DB0F277B8CAD9
-6C0E19D9396F94B1025C4DBF871C99D579C9DDD4DEEBC28A01661013CAF907A3
-4FBD2F019EA42FC201957DE80C7240B799FE4B199ADDD3C8078BF40E5F052CEC
-01B7D3993E2E61B89DA8E539A09508576574CE014B530D13EF43FC8FFF1EDF3D
-BDD344511B2486FA2D4DBEA3D6E57796A6788F396939748A957E51F01BCBCFD2
-DF91CA7FE81A054BB15C1D3E3A1062ACEC7EA6E4089913BEE42E1491DDAB0BEB
-1E77A608F72A5D43C10F6B022695448C76BDCA33076A02E5AD60C7C247D2C3DE
-85C878805D882F452B782B3D21BFBE54CE2961759F8D71C17F0C952F8D38AD4E
-6B6AD1F498A64FA52524E62F37ABAD12E6D5F7649DD796E031BBD951973DA19D
-C6DF66F38F0B06783B4DC6DBC15CC689D80C3822D5C3DAE96FABF9C0DAC880A3
-6F38992EF13D0C3AC162C9AB38EF2B8A4F176D8AD645E982CACEEFD28947BC07
-BB233FD9ABC9F4AF612F691F4A52BA5BD67659B8DF5D68894CD3DAE4C724B238
-8314DE16D901F3B63D8D11FC1BED822294527CEC6F31DCA780031F485A906311
-9D81A365928EA38CAEBE7C450BBA19FDD76AE8CD81A1CC6E38312957776A2ED8
-CF258CCAFE221200A03F07627ACF8B979F361C0A160E1E5635D0E30BE18EAC55
-DEE7A21FD8F9B6A53333C8F94DC6C1A1F4DF0518116402255CD84CC302991A20
-789689C51E8FFF3D868C73E1FB042C30C1EF54FDA77E03F04B12781C572DC4C7
-8D60E506C6FFB6422AC0DA6CFB438D0B5687A1FB63C9A96267630CADA9338EAF
-B0F4433F014A7D37840496D8F9AA0188F558D87CDCAEF0A7F89F7400AB143F3A
-7268A871FBD6010CBCADB1ADEE40104D9BB6DABACC4A7F45F155A352F10C8057
-B025F9435A77DD3BCC4C131B3DFAB32706A46A9ABFAC3E5C30CAD28F3F9D1ADE
-4060EBC1F26BB60CFFCB06AB4F752EBE4D00898E99ABC6A77BD31E0C74E34F2D
-268555785724E80B9CCC165673D2F4306045720CA41C606E9C33611C8DC681DD
-0E8AF0E4BF73D39374BD5D36E1E2A95929647FC82583BD962DD149258510DC76
-6F03DBCC2E142EC8344964C303AC4EDCF7C1821623A24A1DC88AC09B60E1970A
-312EEA27B9850401C1FDFCAF3A9BABE622C52268ED778475173E1BA15CC5FD07
-C1CFE4084A5C1374FBB7ADED6B89AC09E9FD125FE728CBBE52BEA25B2B0E0E76
-A4BFC50EE334241924F6A9750731736139FCCC3BBFD99875E2091AA8F9F33109
-7640F7A0CDB5B1783FA24E5C5434D732318A5114BF0080649C1B5CB4A06122E8
-F592101C09864AC1FA6F9DC9DE816B1D6D7785A6422AD5A5CF997E2A5B683CF2
-BFD6B12AECCA317236D4DE5B8E11AB4E0C0A40ED4D7F2F29D9D5D6F97C79A6C4
-3B626C4B917E2E2144D7A9F043B8180E45B433838BF44F86ABF22E29E50C1551
-36D56E3D89ACEC791CB407A7959F66A0272FEF1FF4ED642EBD735CD954FE2C01
-F0DBA979E80EED581BB0E1E643FDB205C86E89C19A149F4F978460C716F38749
-0027EBC1437B8B37FD4F9D7BE0720437E61747D2F16742076773041403D85212
-294402ACDCD82923E24860E0F807FB0D32298F5FE9076E6F07BA9BB380F53F3B
-39288A33519FEFCD75F540B597324FA43FE1A8DEE64A756587419F319B8C6F1B
-A2F29F17750953CC9DB864DE2CF3B5164C093769F6FDCABAE1F6D9616D8EDA82
-DE6BA7F8D24B227FC4AC0169F80D0B2B1B7BCEE7ECCEE7475E7201164C8B45F5
-31FBD954BB31D060E6E32BDDD035DBDDB5ED89FA955911D8B747AEAEA01327AE
-3C2D04BE4DE78B313C4414BDE5F06FC0AE5ECA638911F691A1FC86FD8BAC3956
-C1553875B45A80098F377AB2DDC3549514ED658A557BDB939AB6FB2479F98BF1
-8157AF4D86883A19E9512F87AEE0411C1B08BAF29549F663AD5476C50C96FB5A
-356C85B2C52995EBAEAAB8096D21EB470713A567B58D680A37E4DDC3C1A52BED
-E01ED7897410EF6334A75217FCA97ED5E299C5FCCAB0F92584FA37A1EF03C7B3
-A2E5A3A278F3ECD40695E55F6072058BE81ADA6E096276E250AC662BCD562763
-863C4E7A7B357FF231E5467E76394FC47B591BBAF322FF9A94B2C3F2975C08C4
-881CDC4D7035E2385615B35556035791A00758F33582153874B3E6B05BAB6D2D
-659351CAB34569B8025C7C51F915E30AF7EF8D48F3D42411AC8261AC04216FE6
-B543790196A571B4D28EF60339BB05BDF3208B8F9D1BE9E50F9EBAD04DFCE8C3
-8A39ACD81C40EB4059A9FAAE9B422536D090A4E2F757D3BBD8AD6536F000AADA
-EBDC6AF9115E067ABB4269791C40A0C8EA696E851867186DEECDE350E0121003
-60563C43AFAC8315BC7D87DC949D09CC36FB081715E959FC914E931D80D846EC
-44C3178C212B132BA2E64043963AD0C20D56175D57D4FD4BCCD30D7944E613A7
-BB863764A6AF5EBCE17C1179D60EB17B9C4E61ED6DE2C7CCCDB6C4493C8CF326
-A53E07C83A01726A19EEFF88D46EAE48FD5FEA1024D229BBE7B48332DA245FCE
-F2C1CF78F1D92218BC6967ED2DF365E6F47FBB2BC8E9AA0014155348BDF54A91
-471FD23B5F75C270BD3F654F3815C43C4860AB4B8984829B238C614D7CD7EB6E
-6ABAEB392C23196AA2ACEC2331FCF813AC4D6B5A076E6D6F5C98454C78135384
-2DE08F8E66A983B76B526C42C243CF15852CBAB77BB11A7EB644590254C939F5
-CD4FA3151B7E12483C75DCEE22A88D9A1F1E0F53E2579116D3FD82F6A55BFB92
-17E173A2D9A3FA4CD85ECBF1C088D45473630EDDFC84E94C36041E06D68D0184
-DCC03474698ED646CF7C636B2181CF5BD89C8E939AFD0B11A233A1CF2A7320F0
-D8937D68D03579E5C8CACDE90D37123944D7247E4C4440E4D29A1872928D87D7
-6A10AE04ED4053FD0A11DD5F588C4147E3809D071305A3CA695E181948CDA1F5
-A30F95AAD47D95138683452EA8A9867EA220E9597CA78B2F8CA09ECB43E9AF65
-2590E87F1A24AC721A9CA3AA88F0FE23A2263E279DAD980D7E752BFBDD172BBD
-162741DF269EBBCABBF7575BB7C9E7B42777DF8F464D85245A5EAFE6E3D10C27
-0FF95542793833E95C8089F4025A8BA1E5E884541F0B33065F93BF1D30FEF287
-D7C73908A027CE521B7D6ED4DC2E77619854E10451D4ECADE3BC7AECB72AE698
-4E4CA0ACEA0836F87CA309901C67ABBC6115110F2B8C7433C4A248052317B283
-DDC1238D40E3D00E4D236112319F872BA3288AAC2BFE2B4C723C0C3239B7F95E
-626EDBD4EC068FFDABC261E02A8A0D216D5686B005E243C95360865605316BCC
-1A2EE56693C7B54DF2E68E6288C0DEE652E76F3D16791EFE6B7FCD744384311D
-31527E20E4E736996C67331CF78A08ECAB6B5A720FA6B8C8FD80314C4793502C
-9EDA72FFE0F66F303E84495B00DFD9F8F1748311571A52A1D965EED5B0DD1CB6
-003B902E1FACD61472980C40DAAD23C7D35D0CB00BB80025467A421E36E3FB35
-DA936476C87ED2BDA7F9681BF7050BD883DE8D9798D3F680CF983941FDFA3129
-18D0054964095C068B7A2E520ABC3B88F079A90AEFF5441256CC06D169A6AD8D
-84D8D55E99DF4D756771B9EED972ED8A5B858B429216ECF433D4C9901B0AA14B
-A55DDF1592764567D919988F21BCAC5F6E2823C374BD6150410F5AE77C3CED4D
-5AE61BF4BABC795EAA2816FF42966CB2FFB2BD2CEEC59930FBEC3731C5BDA5AD
-32B4A19586248AD9D3422D987321135DD57FB8939EE3D3AA7309FAA01F2474B3
-52722950F1216BE421C280C1CE4F5B6F2931E0D723E8908FE53A955EF5D6A6E9
-4188AE3DB1FC8E98E1946B882F27A4D6D46442DF31221659824FD9A68340452E
-2AE390724AF5B78868FD734D7812FAE570EC1254C509153DA4A58AF3B6918F0D
-CD439CE41A00234EBDC94B9438C2D541657DC3F840F485B2687BBECAF841C0B6
-C8418D6B0A342FF41CE90BAD8F8BADA85BB5EA094DFCA987AE5269C651A1C4FB
-853F5514439C159CF16CAA9FE135AD70E5CB37D76EAFFA880E8B0B860DCF2DC5
-AE4A04FF5C9F3A4188E992DD1C25BC8ED3011D4E2E1A185147DD98127B37330E
-DD0091373135082BE8B0AEF51C75BFEF9261D6FEF8B61179CE5DC17D12F1D202
-437E5B60EE9B2189464BA21E4A1F44D82A97242B74B6BDDC0144B44736C20B14
-238F49E81C75FF6585ED339D47FA62D94B6AD30E803BA4BEE3E75B255B2C0FCA
-CB72A26D596C70A43C5DC401761FA38BAF249F2B9862A26045C122E4D27C08B9
-1E476E46428080D75CDA97A6FD21CC573F9B20FCDF26D6EF973000928FB4EF6A
-2899B87F867C5E588BEEE781E24B670351192E4C479A66DAD5176AA8287CD1B2
-C5E81EF0C515AFCCDDB657FE0B2132C0910954045BA122A58025E616C1B90BEE
-3C46C5D48DDD251B4E545271E4BC8133BAE3F601038D5C794EF7710CF561B19F
-64426B0789FE6F8A3ACDACF5628E10A1114B447C03E201958404F76ED151258A
-1A2FF8B5702C702C01F89DC17F7BF02BBBA8F78DFF03078C892285CA880A0EC4
-D27AA9331C674E04D085508D69B448D1B54298133A680CD67BCB80C334BDDB56
-1904CD441027BEF374ADA8D824F54473B7A090BA6318728E077A84989A4A4C91
-E8E648B51A68A39E16E4A2C5FA61AFD63556158F9DE92107B5ED054E240048A9
-FED04273519548C6773755222059259601C960A8D06AD11AE943D678BBE344B4
-C05CE0EACF18130D7470BEC987BEEF661DB3B5360B822D898EF70E5320E2D8FC
-7D1E8B8C4496F2166F30D5D8C607F52FD5F12349593788B09CD9A0F3ECD80683
-956EB208E3B8E1FF7530EF6FFC96701E7FEA61D8765C7D3F1212416166DDBEDD
-78DA095B29636A9AE2F854BDEBACBEC7AE41CBDFA15DB3704C46122EDA7F4170
-C26A5F3F26ED74E21A50679B40CC077E2EFBC78F3ECE60727283EEAE9F0C7396
-F318863C392AAAB0A24473B0801AC7ED69DDE14DB1462E4F988CD6143E9BA70F
-C2BA50189A83AB577373E2DED9DFAAEBB2494C738B006C40FD81209C09C5D25F
-65B94F71E4B12630C2651431F32C7B3D9681FE19089221A15ABD6701A2B9D345
-11915E70E6C18E0AA0C1587F4DFCB904A75CA357C34155CA5C712CF5BAEFC795
-0F95D60D91714ACF79756DF293D5E0557BD076DB63954B714D498E8244195173
-0F59833143EC98BAA06579E7E3015EEC4E40BD440211563971328DDCDC3537A2
-EF85F45EBC83E00B7EAA3272C16341E58E82BB3560E9318B512A5CE362FA098E
-30FE2696E03B63B47B9D06A1FE63E336DC7B7FBA04422CE1EE9BCE3EF55FBB09
-4476FAF98151B50828F2E894D83F0A28EB417622AD150C5800671E32326CFBF9
-C7718D18D9E787C0670CFA112671D93A6B1F7BC1DF303A6E40C0A2F409917E91
-4212953AA6E5C67F3C4EB25E1B71A096414CE4C3455EE9A596A52473964E02FF
-280A5037244294582F7700C06C5CB5E36CB4C4197DCAE062ABF1FB454E9FB4B7
-8205B1E7EAA27F177FBA6D621B8B75DC81594DA014B3864F4B1DC3E1C3FC1FF7
-F1528F63975D949E5A64479F408B24DD7A46DE3946A51EDFC4AAB046CD2E17C2
-130502B2636A631844D6E659BDF0CF6B180035F01F710F91F1573FEEBF8BB630
-506EFCA96CC5DD19AAE89054E3F29F964E7C6CC48CA3D98590C3C637B4F98FEE
-BD75D9141D40DBDDFE318BD5D6BF6EC9A95305A959C34ADF2D9DDAC6FC6A515E
-0B23416C1A7FEBFF8BADA0F36FB7E61342A8658E15CC052A94494F60844BB93E
-6173C2CD93CEAAD8CAA61F53E70554AAA173868FBDBB7EF226F862C9EC437A48
-853C4F4D9C95F1A5FC1F6B25CED0DC33F616A04AE68BB9C0E869DE7B5A70F781
-E2991EFCE385076FF7ED839E55958D9A687E50ED4D4868B3BF5D92BE8F225F8B
-E0DB1AAA3ACB072A1040A66BC457187648E7B668577DAFF15B3C2A71A5FC8786
-5DD8F0B26C0B51B3861B394E31C831107E9DAF2A5B4E54DE859E9D75FCAA59BC
-F9DE63491362749EE6048766F2D4E1CA725A1194DD4E53BD0D42E0358930C81A
-AD02BCDFACB892D098A345D9FFA8EF971AF3FB0F41FDFA41D9BD847A6303E83B
-14B340D14E711CDAE7D42FC7A66A7FFB6DCE8554F607429010E81AFB8A970F34
-D5E1BB28DF0D6B23EDA7370BDE6A30B91E9F87E47663F89D83DB820895552B4F
-2B9552C8069D460ABC93DFC88A6BA2495308089BD374207A3DC3A620099FFF24
-9B6A819B6C9063C17C4B37E875A144415E8457E422D1DEDEC11527132A8039BE
-C5331ED90CB75732186BC48E8A393DC0AB95A14E84909B8FFF82AC15026D9AE1
-F4D644425E1A4919996E28567CC083AB66E7A1BD2775601C475D4791082AF0D6
-BFF7C28332439B20C50D9227459FFFF3F8A4739175E0D069B6EDB24E45A86D16
-13FBA0DA2C89AB468C17D2AFCE9BB04C4784C1BF76E61F7E934DA7CF4AF3BA24
-8E5CA0D0E393A59AA84FFD072123220D0523D68B3D177AA7B9055B9D08F2DE06
-5B466DA58A134276FD0EADDEBD6D594D62DF588EA65A2330413F7B143C3488E3
-73FF170DFDFB4878E0E8AB55CDEFD1A70873C56B28742A10FB55EB6ADED70A30
-12396A6BB42062A4713E72C4742B2A879A9ED91BEDBFE68DC1A934B2A1DEDC15
-1175DE769C11DE05E6E97F7678988274CE2AE0C2793393D6ECB1E6D64B72EAC4
-F8B487A1CEA2C817BE6E7E5F6979B5CCC836BC0A9D74D67C5E18F35CA43F1903
-F0A5B7C1C9F2FE48269FB582B57DD89768AB8C7B55E96CAC3CC3D090607152DD
-89AF7A767AD4CD3266BA6FC0037A5CF9B08DD8747FE3D33F8D99C89123BFFC63
-A514AF6B08F6192F3EC45F62C2FA5D4F3B80E99EABA309BD21DDFB3C46ED8874
-F227278F654ABF4F935473898A36F306DFEFE8876AA51FAA93D43267FFFC9499
-1E1C9385FED5901799078E2FB3563655FABE1933F1BB5B4A876BE25A924777DC
-D1D9C96C8D4C7CF260F5375AAB5262DC78E6DDD6CEF9337A3E7985C0C1875C6F
-C06F4BE4E96C8ED6D805D235A1177778FFC894400464219584CFFAE7AEA5A184
-BA6ACBCF04C43320D2C7176D3666E28FEDADC2E73B9782597E947127DFFA9ABF
-F8C8A42CC74290E30897D999818BEE47E68A4F672A4AA1225879138375EA0804
-C02DF75B8CAAF2971FE31F69155E56746074519505DB3879BCC50F9216CED99C
-9430B4983C1039466E8D5A721BEDAF43368611F3E90C3BDB8B954A3F5A825EAF
-D393D5E3DFDD0CB757B014B3FA1EA45892775DD3CA8D176697FD9478CD55A436
-8E62A63F84DD5A26271B502E96A74BB52468FF918A5F54249FA552DF3BC1172A
-EAF29CAF5FA5E58CE9242BC04A70CB0527F554BB8F3E9D8A189E6D8BFDAF0383
-20B7390C5263D6AC6781A500A9D97DC8BDA3E156F63D3DD8D1344C121EE6FB16
-FB54B5CA0B7F74B32A32D55415AB5FEFC2E43FB4EE8B3D019C3FE29CE0BB3294
-96C9B4AEB0F8B1478AB7C9E4D784C25187A958A6EC1EE1359C3F7D3CE4577904
-CE2B8B18448ED83EABEA54CC0B5B092F234BA2A2908A15BA4A60851C5B1A336D
-7387499E62F1AAB27AA9B071B849F35B99E26547B07A943D5F0020D37AF09624
-9552A0BAA86C49FE065A5E7056E100E84555604C9796002BEA168CD516C0A8FA
-46A7329C7ABF1BE99191ABA619329AABECD308088D74C8C47F2E0772C1DFA1B2
-391B53A260A1E28BA2BBAE063BB88B2E7F90E6BC03482B23F3DBFE9D1B3A0097
-7CE9FFBFE770740A19A732CE7BF3314A8745D71E9F46002E1D38947D4BDC3A55
-A59D0149B0EF50411166E00111AA63F4A595F24B52DE94BC85F0535192095A0A
-A244B0A292D30EBCE2629765155713E19521FC7FC3E10090BFD1385AFE183BC2
-E635EBABEB69C737C1562670D9F815F28B5FF2ADCA13BBCE2E8B719EB85D52A4
-FE27A62B7D8032BCB6E0C43E184C8B864793C272EEC5752A2533404AE5B4A2F3
-A4178CE4C2404C71BADB724657A956B6AA8C7DDCC3411BE0E49362570A2D39E8
-53AB4CEB466C10CAF6C38B3F3C4084F4C9F9197A8625751037EA5C2920B002CD
-413F5F9CDA6FE303AFF476E88A14B90538CE1BCAC35BDCC953EADA6C5C36825B
-853797CA70C519BF8A3D1A538FE6E16CC84D2AD7B1F6E5E725EB772326C04E48
-5E687A44390A99A50EBFD4A3D81B7442AB1C8D5B311B051C3B973AA2F2A7A28D
-8BB32E72117770CA92293C9551E7A210655243F3813206C84C8569EDD9002047
-84AF2A18917F46115EC82BB96FC868A3E7058D7EB655FFFD15899C00346B970B
-0BE63FFDA54A50A5A6B0054F2B9D1C9FB94C6878B04DB10A7478E56816725F76
-CB08B9DE852E377DDF83EB4F822026060D5C517F0E62A6EEB9CF13EC90002B9F
-C2212C697D91FA63D619E863981E9F27BF5C092004D54E367A8BD3BF15DB2DC5
-927DB805F25E05C0394B7A6A1F6DA3EF3A480A6BFB6CC63A856776C630746D08
-2BA98EDF1C1FD7F7FD05E38D23BBD6F4493AB0C6D69749737620F4EBB458C2B6
-D8DD2E634532AC2F7BA37CB284767DAFF3330B7E69971AC6A3C77D5C515CBF0B
-A228FAF9AA6A095011124379C61FAC642AB282E4F190C9E08F0ADB8DEBD3EB71
-3B12241BB3D2684F59DF02CA0F711B83A888080849ACDEF5682EBFBC62A4501A
-EB2A59D9EE46F33362C13C15811B46AF95E460E93B3F50BBA029E233BF1809D8
-B845BBFC6AEA5AE7C83755281FD47F0C3B152FD8AE4B27DF7372860C9A09BF4E
-6925ED9D6B1AC0533DD715B68C1B27D8B4DDCE201C111E681859B1BDE65CE007
-B3734F7B14FE748B840F53453252149F463F12DA0C87FD03E900DCB2567B453B
-BEC6A42CD0C3BE0AC8999DC889576351750B944B49515AD9B3394EAC6B066996
-1FECA134E160D99B36D3ED88FEFA777ED7D0BA66259CC99C60495B6B8A5F19C2
-C957848A8E2C05698748E50A77B32C223C96C7A28AFC92EBEABEAB453AFFAC63
-DDEB754ABFA689697597A4C4FB90286A715CB31C2E59E37E23FB873E2488F413
-38EB42D55521239BCBEB233068CF020DAF179896E55B5609473211E7E9DE50E1
-65F684134614C82F5F7C163D43460A3B19A88FC1A14282E9DD649573B02EDE52
-23B3073A3FFCDE1395C8302146FE37C3B9971C428ED2B48AF8E120D1CBF06F6A
-F4143BD5F8E0CFDB333050E13BB931C9F579FB333B177473717627FAAA0D5892
-CA4A59F46CBD2CEFD5A0C7A823139D3C60A2687B1E0EFF201F6114C047D23F17
-DDF63EC251069EB083C9417F07D0C344DDDC8DF928DEB6DEC372102FEC938184
-DAA203C172BC62111AD329BB1BB1A0F44CDDEE22B1A998939333B1A841AB4608
-51DE28FB8FEA0015CC89BD43F3E37C2CB48F1C0BBF3C5B638E6EB2162A10D6CA
-1DDA501B6DA15A33D2D141A32F08D43AE66E23AA41BCE9111707B72E3D39DC83
-6BA1B18178F3942E269C12214DD8557EA6499DE01F74BDAEF75E658FA7D38A0D
-168DBCBFCBE04FECCDE6147DCF5D8A577B7AC4E812260B86EF88F13C1B2F9D38
-331667BC7598F4B138CA6F295F565302BF393D67220B57881015F28169E12BD2
-43B4752ED6904574F6C80E5E1679748C4697358904D960DBEE2BFA35CBCD8594
-34346B184F1030D6500C5FD4773525A91D4AC22783B61434D417C9F57B848CEF
-E90B0B243AC9B9FB37245F4178E6E305FE7A45859DA1EB02C024BA4784F39E08
-C4FE1473828248409CBDF74E42AC80B446B5455E74B75F5FEAFA8055A3F1E01D
-FB21C1D9E8BD1BA09C3519AD87B54F27BD9DCDD18E9F7B2BE7B1F7DA396117B2
-821383AD37D76ACC89AB90D24B43AF386308508F14E36702D86A07AB2F0B7E63
-AA0C1A7FCEAF0199FC99CA393FD44CA8AAF7B9A1E820720EC4658EC8C6D68C5F
-101FD9B8C0A45AE5C2B4B8682DAAEBEB686674F828AED86A8580E9D4982105A2
-3E91D62A2E9FAFFA2B3AFBCDEC4DEC3491526066E2A75745775567CB84F83127
-76E426BDD8C1EF9B64CB5F3EB256007935A75E63D5A90F5946D9266E07CB4354
-F6D2A89E2D1C332F3B1D9DE24195547DA0A5A674A50D9ECB92BE482630D37061
-A094DF9C31054884D4F2F89651FB8E1BCE6125AD240C7AA38DAAB1EA0C57A681
-E1352460873893488DA2FAF208E4D511FB2E2E44C8E9D7713A805F9AEDD79074
-632756250E9BB42FDF32C989F81373B75758C5A00167C49B5D881ED5B2DAA746
-EAA8DBEBB0AA0883DC30D79D0B99ACA9C47CD0CFC039EAA053EF194F5699397C
-0F69920D974EAED369D532F3BF706D35FA463FCCB5C59BD3867A70CB295ECD3A
-DED42339E6918F0226FEF5810EE2CE5FE9994CE4957FA626F5A10732AAB59651
-3776FEBE368E3F24BC27DFC528098ECA5DFD3367CECC60F5DBC2993B1740FB4D
-A0E7FA89553161167B1617F698DB3DBB6672EF5FB052332FAD4FA5822C96D0EC
-03111DFF00E76129690FC5A7C6A5DBF6E1BEA4371BADE2304923EA3C6113DE18
-7353D433DA5A81959828550A30D5894AB3FD05811D2BD0345DDA38DEF30DEE17
-F63DADEEE286E488472BE0E167DB4475E3C3C248E425D6E32B18397247530C48
-FA60846D3E477C0433ADAD9AA0B0A9AB1C258537415E05CF354C6217993F5AF0
-F89996ABE0EE4D948A42EC554FCE412EDCA1C88C4A171AB881DB725483A62B2D
-D042621DC2948648D07D8C9AA493CDF26257E0E38CD820417E61F0C955E648E4
-7B884CB722E677D5DD4100EA6F948A10346B904510ABBB6EC7C5D3E194308A2D
-E44821460563B65270700BA3ACB5D712CFC2DA9FE3094487502518C1634ACFD4
-700DC4BFCA3155484BA579C2D2F20C147B60F4C7F55C80A8378A241E83D67E2A
-037C59D5E7EECC35BE2BAC0121C44B40AF04881A35F6AB7AB17259B027C56182
-61927A1C8F6CDBF4075F725286C4F1BC8401CF8596511352F310A14C790915DC
-E503D88685CF1BB91AC27245F9E5D91EC23A8729BA05ABE5D9EE7AC81BD289FE
-72A6BF35B6C2AC895F17EBD812D550227C06991271CFC565E149E6487D1499BB
-6F4C93FD408FC31C2065CA1D85A2EEC8858B4ABE7836BF784C0040C1BF3E8175
-75FD8812D699F9BA551C6FAE3226DFB5B2F372312F0081B9531DF453A54E3ACD
-2FB15B2CF43F2D83E004B2BA9229FD048B63C6A4311E3DF32CF57572DA953BBF
-A38593F4B293A0C315888DCBE6F93DAD0980BF5B0F2CE3878A65AF744AEBE350
-22FBED4A11039F57CB7A927382A9C6F625B5C4B96C17D9741A76B422DF68FDFA
-13C670B6A53BBAC82EC45BF1157DF3DAF8B766DB30528877BB8DC77D82E16C16
-3DE6523F9E660D2C5A8A9D5ACFB135968C729B68BF04879820B8D69308458421
-6199052857E16C51E8C1FE965C93CCB85A876F1CED2B4D6428EB830E3E63BAE4
-ABF42C9D77855A0A9ACD246033302AB74CB82359BE91FC947F69CC8738209580
-ADE0948982C8D30AEE3034546E087EE180D56AF4FAEF124D5934FF3F2BA88B40
-AF3819D1D9D2EAE8574049BE8F8776A3F7AF6BCD4F999506B072589062154CD6
-AA7CB677A73F201668C5B355BA59499A0F93BB904231FF29486E60473E87E00B
-094B51A4790694507237253F121BE0897A1EDB09E37F08C399597A47FD47C0ED
-7A4235821F72F021BAF9EDDEF1E15D285802AB6EBF721DDF8E6A85264A5CCF87
-1B5DE9EB24AA3B0A50E0FE2B195CEC0D9F2B9D12D9B68B5E4E5A8732E74D30B7
-3FC9FB783569829545B6984F5B06DC5E2CDB95F409C328A608276D79B7BE5735
-AD90FF4325DE84DE077D4BD77AFF7345B8FC52A8E1BFCE9CB5DB7186717333FC
-6BE58A7CE61E4D13266320102AA06589BF00D01E884D9FF87CABDF4E12F62127
-DAA725186B7796A1AE7CB37BB6B164932404F3017E132202B42599798C1FFF82
-236711D98287A426C44F9DBDA9FCCC662690649A6F4D6DD932AAB5759EF6E481
-FF6F40A980DAADC5850E948B8EC0A60101CCC339F93EB829704A843C79686F6F
-F23AFC0D04AB902B602B7E1C4A927D6C752B2BAFBEB8D80273CA0395EB9D4312
-A052AFDB82613CB29D8B9A5DCF2BEBE5606F6E32A577DAD1FB9A9903B92C0B84
-13C05ACFE23AEC511CE6FAAC235CCB47B598C11183AD8713091D65D3F9FE4918
-CB4CC13F25A2A6991C9D930DEC24730637487EDBE1634DAF1DF9B9024F38DF1B
-2B44FEFBCB4A64756FEF1E2791BAEAC248DB8946DB44A5674171789701FC2393
-E4C2192981845C5E95834E60EB49BA90C3869A8497E99B3E676075C4EDBBA164
-DC9E9B3414443FADEB59F32E39C46439766E1E3ECFC5C197E031E645CCA4F970
-38266A4F21B6B98A581B838DF1077D8C3858FBDEB2A3A16D8F5847BFEAC138DD
-D73ECA92B7F1F5A0177A4C2E899ADB7F2218979D6BA217D8E117DFB2BC7E7658
-A81BDBB92AE722C326065EDDB99E2378FE2EB426CE3402F254BAF1C3115E4ED3
-18A05A9F129B61818A54D0EB53536359FEDEA8D409F36E08CFD272EE7E376F13
-16AEBF9AF354D20FCABE9819643878797FDC9B784FE700F35C60BC70CE72F3B7
-D3E1ADCD69123BEA6C6E17174847F62A5867CD674F60D8EBAA41A019429DF304
-57BA5BF34142F11E328DCD3BCE5253074988DB4AA42FEF1C3B5430E44F08E0A0
-DBBBDF4776E2CF9DD65A42188ED02C62520B62A22D0DF2B6C0D819D5ABFD72B5
-C716BA390B682875CF80AD1CDECDE4E9E57204445D71D55EE6DA675FF56B06D5
-8650EAC74044170B3C822D049E295138E0F327C93A829E70BF3F0B5325D8B65D
-12B3108C53E594D93339C1CCD5028EAE72C2B755CF3F069BEE7E9A803AA5940A
-5D277F7AEEF43E1A175AFE4D95F5DD641724B3BBA43C131145E3AB2A8E324E0B
-39CCCF9E30929F711436A1B315BA636F38FFE73D25848A97099450F1DAB3CA99
-783B23590EDEC75A7BFDFA4C1D70D6C48C57BBD08D6E174270C09933473A4682
-8A4F59B3F501D92C730B7C883826F8E24E201475C4F17566E8CF364219BECE93
-268E339B4408ECBC5B415703FF37EB4896007FB7C21F79DDA664E32A0204AADD
-DD50769D15DCF9D35A749C7D8672B8B06E2C699D6A378F43675E92E13EE42F5B
-AE783261BDB17CE63BB928977EEAD46770570DE46B302487322B089D5AC4FE65
-E826CF4ACB665CF3847596ABC4D1F36958C0C00FB3D4C6B0F130760238DD2649
-0C5A735B0B4DF8E609698700A080A9330CC8BCED0AF170D4E791C64EA44DE301
-9ED5D59F24CA9987034EBFD3FC3F829232D690DEB685BD5C91B4C6A3D1C5DE80
-DB6CD484B4114EDBCCD69CFD20461F6C12CF347E45D9579C9AE4375C1F00877E
-D3A2F2B6051D09AB480156C6A9E86A559469AB63C218F51BA72397E7C8BF37AC
-A413B505A11123BA8107A2B40E883572A5A41F2FD07D7E8A17656677A6FAEFE2
-A790C3D413670B569716A1248BB0C507C853225308B6AD39DC014EB034CCC13B
-315D7544F5B8FEEF1DC4028E89AEBF12137F9FA617BDAA2298D326A4673C4132
-719F7FFA1C065D5EED1AF32FE1399E48E370038504DCE43CD8F45977032322DA
-5B7297726BD995D24BDC2E3B0848E688C157877AE0EA411B0EE5284AC6D223ED
-82E6AF4E94FF0D5D41BADE24E636384C8F8261B8E9917154067200EAAA09C6E8
-CD4D9103FD27BD24794A012A15B9C5F0EBCC16ABB05E2EF63DC3A126EBEE67B0
-460F384EE0E07514DD75A6B7B17DC6DDA8A2BE32A9D4864EEFE67EF383EB5FCC
-8D756A08DA6601C4C4F6D85252A199B29D61690CE7EE89BCD84ADC9B4F067361
-1B837DB712E904CA57A1A3C9A0F18FC457769137434CFA34F64A976D49FB46C2
-A533EF92E525D2C880B17A935D4C34EE30F41D3D78D1BF013421462B2CC74DDA
-F16A48920E6D22A59A6B71E65A8E86999635E9C24145EE1C4BCC54B5D0B529CB
-084E14058F56337822EC46C77D4A7875E60E1862598C8EA5068206134E978A84
-7891E62D0545B381CF984A445426D0CF7953C32F36C32BEAAC1D9DA343D5716E
-308270DBC4F48DA9E32727482434F81452291D8353F974F5F370A5672B2CAEF7
-DAAEE9BC8ACF114D13A44877B44F87D9107FDBAE64AE9241353203C72E41A472
-53347A67B4D7D4D65B384058792AF2C2ABC08B856628F8E732D208E548C4C4BA
-2074697982852DEADF2EDB80DA4A396BFE1F1CE044CBF92ED2482799AF9D81B4
-9050957E97437DB07ADDE068E6815DE3684D6BDCEBDB112B450BD160A63A2B8C
-4843D232468361F9B15C829B0628E3DB765FFC1EF181991A7A96E0432E09CC96
-6CFC5CA74BC71089
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049013t.pfa b/lib/fonts/l049013t.pfa
deleted file mode 100644
index 947a31c50b..0000000000
--- a/lib/fonts/l049013t.pfa
+++ /dev/null
@@ -1,1598 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Regular) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -30 def
-/UnderlineThickness 60 def
-end readonly def
-/FontName /LuxiSerif def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-203 -211 984 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078991 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E73F44EADD0D9361D465
-3748937F491E18670189FD0D6858CBDFA6C4D794959EF9FD6996B4BFE7447FA1
-0B99FBD717D8407349457E126F430570E461A06CD1D4022BFD31D3140B4F9D44
-873A31C28EA941EC9D76CEDC1A71BF7589E11A6026F35F47E4216D7168D7E0FF
-7C75BD48730F67FC517E7539B16B14D61185D9EF8D13F9398E4F3881BDECB05B
-CB62672DC2C80ED0A24278927395F6C5D99D9FB3F3A1DAA087C609DDA0583474
-E0C5C9EBB773EA16786FD1FF2BE887147ECAA6B69B261A6A61E8E0DB8AFE70D2
-4069C33DA1AD0763306A2860A870AACF636654291C3BC44893FD9358616A1D47
-B3C79598FD22290D57AF04F3C192DC67611A2C2EEF144F80E0BA04888A5BAE0A
-AFF6C484103BE288EF75F74A81B453A4D3B3BA25B37C547091D840C1356E48F1
-80E2FCC0C091515CFFFC446F99945BA70A6F868F4EB9F4ACE8AB07B64CF9B7E1
-4A8D5C16097D4ABD16D3573FDA57A646D3DB6414E5F3EABFFE30F22996D0E4BA
-07685D5EFC2E97D9BA4DF8A1262EC2AB3C74A57AFE467C7E8130036360EF8D62
-4A2B6D8C290AA2365EA095EEA4EAA7042F747358A9F6151AA6F82F17F9A48ABE
-646A9A3F1DF12E7729658ADF3111E52D08E50998672E884C2AE82B893364675B
-9D3CF06B6DADFB13C53452730FD0A61A05A44B1FF1C3B0CA05756677C3D262EC
-6A9344B80929A6D456F8708C03D4E0B4AA29320F7E3E9FE420397D103641CACA
-87E1F114F525B6AE34F61327595648DF8FFB4FB09DC41C0641CB8EB349595ACE
-3A65D4E04735BA31E1D613CDD02337D460780E22CF8B8D7BF1BFA8896C343E85
-5791AF4BB99293E9B4E239A2A1C680099BDDEDC3D68BF9F2986D3E0E51834478
-D808353967F7D861A900DF206C52BE7267F70928102B914F39E001632154BDE8
-6626FA0F69D81F13BA8F561680D2C0645BD17BF5828EB43B6C1C443E8E3CF346
-50C103FA53A029A665987560D17F6959D9FDD46005A1EC53E443D89C7DD4A618
-3A114F733C87251276B35BB3A03FE864E0FFC9AB3C8A1686FC5605F5EF9DDB2E
-B9F6D75B1E1BA5710BAF346CA720318F32CFCD405C006E4DDB6FFDC97067C0CA
-394C5EEEEF2D27AB9810AD25A421FA7A4095D692F802C83CA5F8B2D6AB83AB6B
-45469FB7C8613F9E7DD094F9360435D624C67E7306D19FF80424B75968A3D68E
-39215E86F1ED20ACC5FBA87E107785B48411A9F5A8250D0E561FCB1DA12B590B
-9F0FAAD50D548FD78020FC3C5EC3B7ECD9CA58E88C81FCB7B2A3C3D114E7F327
-220D436632DA6EFDF722D4C99AB2880E3CA577DAD1FB9A9903C5FCEE69C65D36
-DD56EEF77CEABC3BF495DF819FA518194C03BD88E1DAC75E51F23765797A999F
-4405E08AC251FBC7F8C462EDA4768D668C93BCA47E035EF0BD905766ADB2EF24
-EA82B9C97A41552F70B0A1EA5172028A917EABC78B1E8293BCCCC03EA281DA0F
-9346FD6688D58DE2B14AEF2954A70B3755CA545F4E0C460AA89E4A9C3D3475E3
-26F5133DC36517157853FA680642587B62E71EBB8422B6C9E1335ADB17040561
-50D94FA4FBDDB86C9FD3812B90EC8A44596F9C683A5119DBC735777DD9D33AA6
-2A33CF98754D16B34D439FD8995E625C8250129701501346727F51096C407615
-F7B96061C2E733045C1C3A427F9B1AD26ECDA119C7B38E682C5BFA7B871AC397
-BC063B129FE54E9CF58C6F329390F8F14172ED0EC22A11B49787751A5E47340C
-37814F52C05DED2F8F17A4F53250634B4B54D675F2776A867C1AD96BEDA842C9
-B8077DB381AE4AC283554FEE875B64A37FC3005810B42BD9C1C1422B7B104DE7
-D912C5BF74B5D0B4671983F41ADCFB287E40AF8BF69686E407E2E97D4CC14B6B
-172972FA86ED76F43ABD480EDCD3437005670A2E785942CCD45023D1B3B70E9E
-C8AD2ECA580EEE06993FC79C3B44CA5841ADBC4378DD68B5A21E570C88EF4016
-CD5A7463F1829F1F761D719F770AED1CA8EAA1FA7D166C86EC3C858D8E76606A
-EA4AA03F3D3EA07CFF90CBFAA0E60B26FF57AA395AB4225CC19217920E0CE8E4
-119FDE73501174065D1C0DEF1AE3D6A9F0C9E2558030E8199E99662E767D37B3
-3761220EFC66C81205F64B6ED8EB09865046A89FDAA0275D248179208557E218
-40EF4FFD2B18CD1B46E7DF16B675C3C3093141BCF45BA70F31EDB235DE3DCB24
-2C93BD4C3B6414DC7C57383F35D1033E400DD0FBF57ED73514E1E186F08F8E7B
-6F836CC6702047AAE17175CAEB08E20D06ABB02FF72BB9839F34F27CEE5BA199
-D9DA8AD3C6262E0B467F9A85E1D84AFC792C55E00156DF5A50460D259353F33D
-505FE3ED16817DB13AE355DE90589F85AB977D09547996E06A8F123F655D4BA5
-E188E9E86CC31AE6B817DE4D90D7055BE09601F7CF4306BA04295148D4D42EB2
-E03F73C682CEEDA8C2862FB309BE14C96C256084D6DA1A0254EF1769877EC2E7
-90D0E6A37EBE7680FC0C6325F6772D2516FBD2F71EA193B0D96BD9303B746FFC
-0D9456B7B66E849477F4ABB1565BF0F95D6941C6B8500F9AFB561F08F71CA6EA
-0FAF63400979CF3F29EDEDA7041C380A0D3A086CDE2A1212FD6017E8E5A280D5
-73BF391BFCAE1F0CD3E895ABB45C025940C489F30D38B43E5506D57043EB6C90
-9798823F6AD59BF33E75467BDD309210803F24EB57E2BA92BB25200527C66A7A
-1D20D092637AEA5FE90C8BAA0A75172470D5C872206450164E702861D50FF618
-748CE14BACFCE06A869720517549082B5FF664D27CCCD7920A5A70724C847F33
-E893F9316FF2CE0C07E55FE095061940D12AA04853F444A664E383DE510AC21F
-2EA065FA840618B89166BC69C6BA042714A6DA420C38002841A2BD31C35DCD5D
-95D01CF0F4233065B48CA98A9F078EFF2148CC0B6B4601912B93F26F1B2BB509
-A89B6AE424FC9FBC1506D8DF65D85490124FA0B2C19D4AD0FB0BCEFCA1818474
-806028D9362C308A707C001AC9AA9E3D604CF91242901AF68176C70122646FE0
-3489B2D0AB026B5F14FD4E8B6DD4983435F8C1EA647C6EC3A30209332F5D9E81
-6F5F1D827D05995B996C589C6365E5D2EB4922807C996EE7D653AB8E6FDFBF2E
-450740A9EAC9D97EC4B05955B35992B8FF98065B126220D2FA9FD5361F00E7D4
-FCCAC7D0131097F55420F2E723779B33AFFD9A439B80D2B5A70CF35D9BD62E5F
-EA17E2B6911BC219A7D1D62BCAAACE9FE03A28780D32964E25E5ADDB423B67AF
-A377AB0E9E401DDD8CB82BCAC58B26DBCC1174FEA59A311B133F897ABE574040
-4CEDF6110B709AE16E63BAC2ADB18B30918A83160B2D3BB8EA25930548C69864
-DA2A4C23339B35188599EB5668AD8F1D5E43D49471ECED568D45BD02A38006E7
-ED0CFBFF4C9E8A9CD0ED5086E663D880FB388D04E665F154E5E3AA7E658376B2
-C37E52A54EA086300039929FAE313573DE586DC6864B07914088A75241A9B955
-B60FDEF10E7C4CA62F04A0DEE650DFEC8CB0C31832D6ECD00EB8FDD4752F4376
-965F0C7318C152697C688EC0A9DF0709F4D98FE9E8ACED5B47FE2E640C9043BA
-535550F55C945805685313E95F02D503DA1F68322938A76262287266376C9430
-34A8A7E9A1E090FC84F0942465BB09AB0E885772BD34D23C38655530F3266C6D
-A8B703AA8584D766F3140B468CE856EB0D46A9B7660E9D41FD90DADD603D43BF
-3E573959254916573DCEB05BA14B58785817B26AA1FFD03527F11068079EBDFA
-2C97B82A7C711113561EEE00C10424F43D5E3A7E6A71BEF9B8173A6C4E26B827
-664ABB5F5882369863CC11AD9F67CB687F1A5D9D554962839BF4DF589A5B0627
-72E49732552AA9886455050A00EFD580BD616A0164000E54A898BC9FB14A296C
-17ED96A27D3416956AE0A7B8EB477143FDE8D33BA0C2BE89249DBF625CBE983F
-AA6763CD284D0B59099390BFD0193881995A522B5B3E689CD7EAE3E718DA40D1
-C1B6B67463B2B885DE1E9D0ABE0ACCEFBA3D29F7F482D393F988A831FF3A9688
-085108CD2BD75DB01CE94BB7B4CE3674937895D6AF2F6659C4A612EB65F8E81E
-B9693701AAB54789B2BC251103528FC0A7E7700CF70B81230B65C0261A8584FC
-F19B82615DE07D894AC4CE2CBBEDA4E79CA2438B119A8F0F596D0C605B3BE598
-AA3B1B1F58B6184F0904A73640E466164CFD0D0C1948BA56753520F144F1AE1A
-015F1402E25F26B0B462F6C4FF977C7561217862A5E91E1BE2BA5E5B5E045B07
-163CD0DB3279C6D182DDDB43C1E15C6A96F0BDCF32C4FC497837321A05ECDC03
-30943D2E7A81A319C58BD5C78EBF72ABB8931921DF1474A67CA2E635FDD45C19
-1B525141980842058B8F07DDBA38D0FF3F17D95F833AFAC787AF090ECB75DCE6
-155969189C4A05055899D6AB35C9B8F1EA2548B596E799876C8A1A1CF5A2A26D
-50AC0F7F93A4816A983F82675AD33D409776ED878420262521C373CA48D01CB5
-BAAD873A8006CD8E74A9CEC86FBE4964497D72D92A2837AE2DD223AB101F8C37
-8E2565A1B6FE12208A05B60BB09082028FC3E1924DFF5A60525064A7B004B75C
-40FE50FCBF3CAF6B4E2F487C4778C5E6B105DF2962391EC856785F6ABFB35896
-8C5C7B4D3AF8AFE4E6114D241B943E0ED2129D6BFCFE863AFA58F207A654F9F8
-689E53F795F5A199E91F8F76D4C2495BD307CE3B7669EEA5C46E3BB4CA096420
-D4EDBF4044F0E2C79FF6DB09592C8D29587B536B189DF331336C72EEE5C96FD5
-55E4039799465EF1678063F2AE4CA788C89CBD6EEC9DB3B22BC19680CD130FCF
-963F30007CDF0BFB436F34B87D59A807189B1FD4015844DE56B7B5398794412B
-1B406C318D5AFA5EA90ED303E3FB726A7F83634341123E5CA48FF30AC16D2B1C
-6378EBA79DF54B6989FAAC13F076D88C92B1E485060D5B5703D3FE55255ACF02
-6A94FB7EF322798E945E24BBCBA0052FB611E9451F86BBD9E1BD6A143A98CC89
-A9C82B0993432956E2AD3A243CF7E81E23B770F5B576593EE0089845046259EA
-797B171AFFBA8B4A2712175CA836D750B25289872538ACF8C3A51E62F18C5E91
-B6CD6249CA9448C071CF2B9114696EB0A0DFF0019DAEA8399D679D8484823000
-DEFF6B14034B064969CC05E0B5E34FE6F414F876E2809AE3B09F03492B5193B6
-0D358C68DD6A3C48FE6318CBA17BB3FA9265235AE417DCEBB0380C30D04D6E93
-B414575828679719D85B9B4E5B56248E52B4C7841AFE7B7C9D6E844480C7AB80
-5C9412645FBD123919936859F61D815D105249DF52687F31B2701321F8DE91F7
-A88A4E8D5C3926CD47F8CDBF8DED8C5F24C5FACB2138736EF67C5742B33A12D1
-2721A47ADAC6AFE384C2066AFFAD2F79C9FE60FC11A7B71C972B897B12588196
-93C06D7A79AC25F2D9D2BEE654AD27D454D4F28E533A6CAE0C9863692E406A53
-C76344151CA587709CE1BBC845340FCC7B3CBED5C421944652E12506193A5212
-A3E384D7A63F0FC0927B2EF40AB4BA66909D323E6079D9DD5A9F09FD1078E804
-4D6633D71CBBFC5CB1E9B3BD13F9600B1157E28DD3226CDDD358B0878503D954
-0B43CBAC43A14D5034F44722B05D12F6EC8ACC66972E3B9D5DB270988E8D8E88
-4A2F92750ED6979ED5EFFBCE0731FC34213ED99F37BC31D0BFD0DA1D55120C58
-1167AE0D33E8F190A163EC437B1E67DBC254331CA1C77EB1AD6B98CDBE95CDC3
-1C7D04211BF48C8F86E34AF2CBFE411A12BDF382AFBD63ABC1A42BEF2825D07D
-1343175C428704AEC8C925ED517CE7CAC954BC556690E61278079241FCF33CA5
-AA04CC20D34B12BF04BE34848FEA0015CCA8192D7B6E166025DE3F12B4FD08A8
-5833375528FEB9A4CC7739AC1C6988B21F3CBAED01DC535A0999B5200FBCD961
-890288CFBF06B0E8B55CFC0D28A3D660B9A79A4A65C2E0F23B54355E41E5133E
-42990B4B1F4925AD1DC6176919F37122D5B783BB1A18E8699F8E3F48EA0B9415
-DE9376500F1C31AA51B98E9D5012476EA6F89D93EEAB943DEA72DC6B2734CAB1
-12FF2C8391949455BC5749722D280CF49B8FA5F6FBA1D55B332E0BC935E9B33F
-F47FD34619FB0E217E0B5D1026D29A3C8C33CAAC9AA86015B009B153B86215A9
-BD54F753B708FEE773C9A040F23D99C941707CD0200BEA970319E669907017B9
-973BC93F89E7229F4185F95A70537935ACEAD61E7D458C33307560B6D0DA4089
-B40AF5C8E3F428116D5D616E4B0DD6CC7FE203885B32931005D517CD021B75DC
-A4EC6FB5F0F8E8C43067DC7CC99B4055E45F38F8D411CCC80514814CBCC8747E
-DFE0FDF457428445D64F5E1D0811BCD103E6EB290E363BF1A2964C5FBD63A405
-D0394E066E54774E7B05CF3E250FE7E5E2782B06BECE8D97C5CFA0BEFCBCED02
-08879C6B8F93460D1ADBEDB3CF5EF9469933832A83088D6563EF6982E5F1E704
-B0387D5E746D708B7787B7D7F91BB5D99BB4BB2C6646D5AAF8B1D70E0EBD2054
-492EDE6D5B226E2EEB6B868DFE0DFDAF858D7239520824943413105CEA5AE042
-D9F12A6EC811415A257FF2AFA0FC15F64D7C7F21762238B86EDB5AE4E4CB4FEE
-9501350A8EB10809B265D5B52F1C10A89B5F5564C8C077C4109DEBDE36F5456B
-F6B4F3889DA1AA3855374A39B9AAEB76E26FEF4683821185A8157B392921ADC3
-5782BF866461D525CFEABD17ED262785013A628A017E50EB70444CB1A9E8DB22
-775040FDC83D38CB5C91064997A88C4DCAAF340D66608C4A28A473EEC0A08785
-C765166D9B6C234AA35ACB7A3E676E756C13A67D80C148A2BAF56432F0AC012E
-612851ED8B16B2C0673B11BF65904F7B9718E12179D36023CE784FEC7B79D0AE
-8EC3F1244A5D293CD4E67C7B58076A6DC8E4168398D4E3653AA7C0B44649F372
-58A5B2AFCD59AC43796B6971C27EEAD8A4E645B78559FFB90A0D2C4367F25F7D
-84EF76B89D09855FA0CAB5BC5088C220E2979FF17AE67491C77E229B4668001F
-DEFA0E5B581E24AA93CFD0A21E453FAEFFD82A27D236FD5913132FF54C925EB9
-F59D48E16FC904AA8C498AEE94635D187C7FF354F48771A3B730A994E4085077
-53EB73692AE569A52EC4F1FDE59E793357647277C96A080FBCC9B95044FA71A9
-359225214796A4C58C90C47682EF714B21F8C289E3870EA06BB9DA82227F7ABF
-DED110C7307B86772F538A937885873BD0D427966DF81A871F1D5F5A2105F25B
-C2BA884C9C3D8342064B7C6979EB116A6077BCAAC52EF21BAABC0AC1BFE8DFE7
-3BF35A96077B78E47551BD07A89A2353366F0E3560D495BC906B40102AC68381
-642ADDE76FAA8AB2466D26B4A322288ABFF4AEA43A5DA09F32F3B6ADF22B0409
-3F16A8CFC70421613B04078A94148E47DD1608F1E262884D8C47D856C1DE30BC
-C60933D7BF141A433AB68B81BA42326E2935E37217932DFFB28C9D8580886C3B
-DA86AA0795BB69DC249050FB9434C900DD3E97D8C7556834DD3F66EF47347B13
-77E60D03674E47CCA9F3D19B2AFF6660420940EB68A843E93BA89131606835E0
-4EC6CFDD92827C56A07DCB9B7C6FF016D3500D1C6F62ADF954551C2C072B0F7C
-86CC8295CC7BBB42CDB70DA78807C2C0CBB3C5369AB2BEA7DF33281A1770A562
-A19C5FB30E616743248AE7D93F8ECDC1B081F96F2F52ACF195A86DAAC8E53D80
-CB8883F37D3BB12CC0908422CE4392CA1014A45C7EB35899A8B7694C2EAFC62E
-F69D5179D4B6E893C2CFD762CC388C6356D941E89F1B0A8249E8A701678A86A3
-AFDD4B74C16633087CC14AB94788C32FD74B1F01FBF8C7726DBEE0013E576CE8
-F2D2B7E3CC723BCDE5ADE760D387EAAB664A6F4043A0AB6260755868BE302157
-551883035BC8D73366FE63F7BBCEEDF072224B01DEF7651E0CD9EB85BC58C7BC
-01DC0E874147E9A1F9A9116BB60A1FBB7FECE53F802BF95E3A52C4202C89C99E
-BCCBC7DDEA17AD7672CF9AEF169B20FB20D7F76B2EFF1696674623E01642598E
-A86C5365E4BA709777AAFD328E40D3935660CD986FA959451A5D1AD43161CB67
-5A75934F7EC456F55822EEFE030DB1AB048A2E69AC59A50370763A5AA4E11C4A
-DCF9B23C9DD7290E73E1B72B179138E514E99167EF94FBF4A97866EEA33828A4
-275804BD9DA8101E6F7C78541D05C2B9513C7B03A4AEB0F5D5646626E8C81486
-610F1EDD9748BC95F93E9D0C859F270AFB655E2154494FDD83AFAA383389BEAF
-70A4458D0D7CCADB3E4310B29A262C084F4D3CE3B0BB63A271B90AFC60EF2EB9
-EE6D7F7AB4ADD46F243D94F83154333ACA2358E4F6D53E633C37993587320978
-F407155D27463A47282D27D50C22B7F38BF34974D60A361BC6F26565D5CE5DD1
-A48B580F5A1379231A8B6E90D0F0F770EED72C9D9D4B397455C59A0687CBDE0D
-AF1CD3AE0B83ED3DF977C0DDE3E7537C8D03AFA3114D7AAC6AC5870D0F4F03E0
-06579E9A7308BDEF66E5DD3FADC07D612E6859AA57D08E6A4D118BA7DDD45DCA
-2E003472B89169CBFDDF8516C43851451DC5B37C32A111D9D7AD1323C708EEE8
-C500D1E8F5D94BE9E6F3FEA2BD8C5A3EFBE1EF84F5C95BD6CED21C8E2218E513
-46BB8456BFBBB143CC7F0D11F74D53BC996C5D5A0A157B2355768DD153DB21D6
-C2382318562DD4D1745DC04A3941FE0176189D8B041FDB0525A24BF5922A5E78
-420ABD3B2AA5E5410025C9F65FB43D0A68262981DD8952002F7B12FAA9D62011
-3AB3A84C5F720AC7D53671F33477E750EF4F700B2DC3AB8B44587E9BBFA1D67D
-276FFE23F32EE806D3DE9C138035E0B4893329A3CFAEE28E6992A3834B016328
-D3B1785119741A71FBD79193EA6EB20EE914A644ED41BB29017A20E534256894
-4D9A5DB399CA943AE5351D842154542016528ABDFF55068BFEC1F2B4A6689CD1
-1E416FE8D5B150FC6A8E68EFA4478BF8931F01E405BE2531B64B4863AD649294
-C0391ACAD1BBCC2627F52FA1E07D77F0A35ADAD416E837963A0E88F67C827C15
-EF55E915BAF4E5F3E4C0CAC6E16654331B3ED0991A7D01C93C60F6961A73E72C
-A77434491DD87F8EE1401583D48FC38F63C1E2A35492F93B871ADED0348EF0A8
-437B033AAF2C3C6234A1A451C143CF926992ECDA1F1F3FAEF13C6B1040A202B4
-27C545405D90F77C939C3199FA47F647B482B7DEA16DFB1B36DF0F70446B8CF6
-02B33A96F2E81416ACE4D1B53B6EC5D96C1D9D43E501B989580DB90E83A39CBB
-E699A7D49F993EC3ABD780632810CB3CEF816CB7501F38D73106C838BB1C8208
-84382C1DB306315AC4662285984F9D431DCD1F2C854C4AA95CE08C33A99B8B7E
-6AA0562D554DA18FEF39DEE068E60469FD2DB23428ED0EFF075A9DF7EF3F92F6
-C73E9CF760FF0523522747F7FA0B9C21B9E4826A900B5D943BDBE82330DFB8C9
-C1F7CAFE80F7F1157EFCD3E6398F77CEE305E39C876D42BAE82F5078E894B112
-3292590F08D820E61B6F0454B47A23C78A5B8F3F34D7DA46735BD26A19EE0327
-E9D27D29AED59C044068387BC305A558A13403C9F713F6C5C2D9C6765F8B824D
-5C3DC4222ED8079BF0610C8CCDDD041FCD67684E66682F8434A319E48BBF7F01
-F8BB5FA9FC41902E7285DAD8DDE62B484FA5DB359668E6AE0805B48D864B7C82
-DBC81F4CEBAC5A5108391DA129E11C12138D94EC1A407371F70C6B84023DF9C8
-EA177A087632E3EB4ACBB13815B604140285AD93D1E72D17AA685EAA7886B5B2
-E6C3BF45F83594C841954B58FA051B7A9A94881598929A8C8310671932CEDA2F
-6DB1F7F015F8503EF84B19E059E8124E4843D09890DE094EA6EDF792630EB0BA
-1486947D0A0B484F4E223DCD215EE78D24C090A3C76C550B065225B957C47C01
-9C7AAF1498157177EF2A68BFBAF50A3D221B4320D71EA261C59A5600B55037A1
-8BF30F7479E036D463341CCCA9E987C3B87CCC44E383BB5FF98BDB2730C840AD
-C388CA6480B85A9AB7D42A63F9F4B049B45AF49637E9464A2C9B709A7DE3FE85
-10A6842FBC7B4C56D14F998D6D382D31892F7C066C77A6114185E4A573F9C378
-489CC8551D1102C2052555F93CA134FED3383AA3F28A0E11F5D471819582BA7D
-852CCB06FCC3CFF6F99338AA046BE9F96186F288D3951F75449C1DBF650965B3
-3D1030CCDC4817BEBD6216943F2DF5EE8B9FEFE6CE4D38DC52F3CB8A7D29722C
-990AFC8CCAA016181A26C3EE67AC35FD6119E23D689EE78E05E2FB7EC3864120
-860E8BD2EA388508327C46EC8F895E24998AD2EC0D8CDE2A333719DC03F57C3A
-229EC6CBEE7FD13F538570C2DC2F1031801BE075A473A2A2A7C1E01F74B8500F
-DACC782033DEB55C23B08368EA6C6AD8E47AEA7119D76D4B9F80252D66F70D2E
-6A498A684FD131AE7B22322009A4870CA2C684C5FA7027E1D98750B6BE292FF3
-0EBAF205FF0EBEF7E1C322DC79971EDA361E0597BDC717668F6B1E66EB93EF2D
-62CCCA7BD345104EFDC72D1FCEF328857B84439A811819558DA11DF635606EDE
-FA44B2AEA013F1FFA384905F5E32057EEED1FDDC33E3672F42425E8520999004
-51EF287E37D33E8F2A6D33EF933A9A1B1B6472889499D5F24BBD442EC57A6218
-2DE6452AFC09388CE79C10C09562307B117171AADBC4583AC258F3525534C141
-6A85CB591C56BB9310BDBEBBAAFA8270A5A179A368EE401D36A07075F21DEA6D
-B1A64E018F87AE259E98401E87FE8A808848DEECCE5B9BC45F44A621301E0D38
-AF6B9042CCD89445F09FC971F94007E7CC558F81080A51B3163B7E6629AC2162
-A410F477E9709541D6B4EEFCEA8D2208427D82F6D46A6DF1E180F621C5B44EBF
-D262084531D95974D7BB0F098F279BB04725C16955BCD5CB341F14903C5EA661
-7752778CB6A73908D89835CE1D302733EE233EE7099357A243E77833FE9E9178
-5A025A89882C9677467821A7414D970B9F7C0BEE6E0D3F5EBFA3438640E6630F
-916E9523D92112C2FFDAD975FC3D3DB51273AE8A250288AC30F0C63DF9C98DC0
-87EF8A135936A2F060405A4B8E2B597137E9C0B115B91F67A7015CB6D895E688
-45D23AFEFB6434789178094B15F666DB49AB7DC74454933692B36DD82019CBD1
-4EB94D1C042285E9D76F95B80FA4901D85BD16056ECDC82F068E794CB4410D65
-4CAE5E1B495D1D14647B4F3CA8EE5ECE7081693A7AA06646594744FC1AE4723B
-49EC675530C977FF95B41B1AF51A84E777F1124602DF8F5684F3225AED18B990
-EF1150946A5D0888BCD0C79975A631B147C627514406FCC022DC0875CCF8B036
-653B15187BA94DD8C5B6127AB5069CFB9892C6CB64848D4637C523AC2A5D4B5B
-611CEFBD818A1E06BFBBFDC00EF8B2602BEC466D996811B2B424406A29718C8C
-F57418415DD2422065C2CFFD83949467243264B16DA0C1508E597EBC4B18EBE4
-4A4354E8837173AE628FD5DDB5610D35F96CD42386C234A9EB05C71322847C46
-ED113F60A988110CCA6DAAEBDA7155A28BC035B803B81F0FB6A05DB7EDC4A880
-80DED199A41F62EF60D904F55160EBB83F40D7125B66750C881F809F30E5F72B
-26748422CA9BD09A8FF4D86F1561C3B8AF623DCE26C85BF643700759324A372A
-B2510533A3B8D885472BA12963E9C400B81898E6E116F4977CA724E782834A56
-D45F67C46CE5F9C0C267D39ABCCCCD1BBB002B4F7F2890B868ED1071BF8A5B0B
-825DB9EFAE17C7BD9B887D75EFABD94EE0B52FC811A8EF3C94EE93838F4FC793
-D38929D6E0AF3F6D624F4BA160BE513F683E7751FAF422AEEF111463F6B889BA
-B264156139AAFF7A1B64790F78A9168AC655FD94FB82FAA0828F1B284CC2D027
-CCA9153FD60BF80891AD0B45F0A356A3F7B90B0D190F1CE69398C1F2C5B8E99C
-10A2C2E97C530A8614E9203F424A431220A4F5333DD281FC1CAE2F2C0E6EF57E
-CB9074A7C7C0B355A1A567CC2D6CFDFEC64401510F29EDFB0DBDFF88D4FAF643
-8E721BAFBEFB4E1E5B2AAF576027CBB3A2BCB8B26E252CCEDFDAF8740104724D
-020CE168B39A12E0AB7F4E3BCD05C30C5419A9DAD1C3510CAC11EE4BA2B74818
-88A1320E5FA1D6BCD4B58877927878D9D3A65C38CF9314FEA0E37EDA580CF121
-FCA5FAD167856A8588BAC41CF25B3F9C0C158A253D40B53AEA357806A3D0D706
-BE64FD7072267DE22936D8CD0E33DEAD240C795750299728D41532FD445692A9
-08D8EF48054B22F12407C5846ED8F14F24CA348FF9760008D2F85FFFC514789B
-63E5569E73BF23A6413C4C077A7471E7275107F2C7BABF43696B746ACB2F4D17
-A4194B4660E7C797D3DD3785B92EEC1C7C9702F5ECA5BECC027FAD6731B49E0F
-08F0486C25CCE8907B68C18DDAE8B42655B46B19B652670790CE1C9F3C8ECD3B
-C88890676121A2C89D464D9F27B3CCCB5C5C014D198B5AF358699B998BB61488
-59DF9D0D706B84D457DE5430E8B5B6BFB5124B16C626E9B3774AEB27B3461E73
-0BD7F788F60264CBE30D39CFAC48FFD28ED12D55C7D0F2CAC21AF25FD25359AB
-817F0320B766B414547B565B52DF5702B5957A0FB9D7058DD7F803715D122859
-87517638A22E700783EF621F407FF829E19C6B379AA448407D79FD4F76BEE1DA
-71F6295803F0E7F2EEDF22038E3EBD6D56A1F0B72D203AD1A89AA7344ECDC16B
-83AECBCF61F07C75B07DC7D0D5824281C08F0372762047B3E745C58CFFDB701D
-2D35513F4EE938EA93D7A1FF911C07EBD7AAF2151869CA572A225D305E4D2883
-FD885BDEB7876A89AE4858FD2354FD4E347680E3DE3CBC048751600EE94C8DC4
-A64C4ECC6BCBB494A8B5DA6556724CB090FC00BE670E7D023F843CF23D363BF9
-36960292D6FBA48B69330631A12A871E56D9BC8772897F6492EDD55AD6DA5117
-3937DDF370CC6B366555DA1A22700A876F6E535E07F76C28B864064D5474A8D4
-CB2455AAEE25F2CBD6CD19E9B91D1380B73E79C7F852596B97B3D1CF32064594
-42B96C2FFFB054647CE2318D4EBC68EAD9DFA5029ED858DCAA0D5A972B0F8DA2
-2E080D507304905ACF3943644BE25757DADD2589D77553BFDAE17CD50D3431D5
-1CFAB002AA9A493F305BCA941D8CC78B61AAED56E4771FCA6D29CB0B9DB7F542
-AA16E37E647A3D71D0DEB3F18D9E19DEB7DD26DA826068554445E54144B6FDEA
-949D5D03EA3238916260DE4AC2152200977C51E5693616977C581508ABEFA156
-B0767661AED9D47675F71455CD143EA30464077398E8835FE9057C6FCFFD6576
-8EE913496CB05D8E3AAA6478685A5E03093A7F62BA5FCED32040D00680141C48
-01DB98BEC6F83FD2B395A97C0EC0617223F19486003374A38147AD0AD996F6D4
-9E6B70187368A368C84FF0C5C2E143CEFF967C279265FBB2F1C5B94DFCE706CD
-702C0792DEB7FF682848529C6B7A40BCEE5F7F2A868452665E00B8140C1369A8
-133B5114A62C9983FC3A13537C4D614DD9E513FC9ECCC001BA6A3287D82E9E17
-FF5D88A373023E0A34CFDE64113A6BE7C365D68A64D44F74205BFC5914D669E9
-06D94DC90890DFA84A169AC8D206ADEFD4A281C59B49F12DCFF9D9A2A4B42049
-1509C1F929D2820803279DE83D0A2B20887FD3026604DB42716F32378F996CC0
-792CE403EB698C865C21D26600E8706BFDFF5267F7D9DE38449AA71FA2C3EF9F
-5CC34499FE2CC522142C8C1D55D7E6DF5188F9263F37F51AD78E9279A823433F
-5755D9F95094B7FCE2F2224236585967CF767461380E28A674E831DC73F979F8
-935D6816947EF70D41D5F64DB5BCA12C184BFE59EE26334C7C9EFA0DD1C6CE22
-D8315677AA321A9B470F63ECE4DDE11AA3604E8B0E9DCDEF721138EDAF421D7A
-09D9D6A74ABD55112FEF6593C062EEC5AF3EEAFC4B9C831C7E8D56B332E9844A
-FB85AA1EB94C1708592E5E7F3266A037CA3AF551F3679A0B67029B61E9D20190
-2209D680032D5DB92CCA9BDA51820F2185C5678E879176F4DD7A9D64328F1305
-FADCC214B9BB8D9AD595EFFC79D6CD443C2F0B7DA981FBF696A43D4B74EAC3B7
-0441144EEAC59F52FC83D7CE750E0F9FDAED943D9B67BE023367F920DF5A220D
-C18432A6AF622F53D0B240D762AC25137DEEEC12AF276246943C4C804254BB04
-9C2510885398BAC62E2F67961B2D24F00C86053BB14200DBE1AF4B9DE0BE615E
-127F1FDAAD1AD4E939C1D3DC71FFAD3B9264AE547CB5F11B4E3D93038A95B4C5
-5B0D4F249B20FF04922A1158DA5A7C9B99971AE16FE252C76C21475165CA356F
-1F9612552BBEFD2A020635B7E0159E37847CBF22B9EFE07FF1CB9E9129D1AD19
-E979E52F78207EE4DD64287C0A929FB5BA5AD68D395B61CD12C545C6E88DBDA2
-2224BB1751E82014F2995936B6144509AABB965D9947B5B5D1346C1FD14DEB6D
-36A559DBE82A31F2DB8830E260C9069613B8DCDEF6E6A88C7B0421A4B99D4EDE
-F22CAEA7D7B519A2D12CED44B4F4DD63E3011779EA4B44DCC803E062DBFB6BA5
-098CA9E78832C1E6C6B7C0AD47350BE81377EF66A93134CDE2CBDF0EA9DCC5ED
-E38F663F72B1810DA8C23F287ABE369C496902E3D18B718B650324FF7D7434C8
-6B8FB37E30DC7C5B59DB7B8C982194F148B26914447FA86CD95E9781B3918DF6
-5FF76FEB4C8F0084BABF786C5771ECC6F9033C1528C4F0C5008F19D8608557B3
-9B32BC80BB28CD3C9636A8CBFDC7C3ADEED9BFBA9A59904091E31E7AEAFBCCE5
-2DF80869EFEEC3E3B3A5C20B49720BFE300F8D0C807FE3DC3615DA21501AD3B2
-9F602644E6CFF34AE0E34C8DB132643D7EBB7E485F9EE658D6E5F2474A0929BD
-768056CF7A4CF2D42B3ABF73B5F9CDF68BCA4753CE33DCD014F646F02229F9D5
-A207A0CDFC782280B8FA180A8B0D26BA629672E6DA6AC08F523C030747C7DCD1
-2721543837EFD203912078F1C21B4C12E1D3D99CC3D41A1EB4BC7A9C7FF233DC
-56251E5951A62BBA5164C4455FB7C420B1544FFEEDBCE126AC7BD5259C877732
-5F434F717210DDD55C655AD55C94A81238FCB7B105DD2B13BD30CDF70CF5190A
-6B2C723EDBE8E171EE85CE4BA5010E254C217D8A110710DDA85C1C16858D84AA
-6CCE64E98F873104628594126EF0B15489D651D8E9FF1EDE0F7147C3E1EE5852
-629A2851B69CBE14F784805C22AE7C9B2CDC7EBA0661DCF803DDF353E2A1F5F6
-8AA7CAE75B44C6187180B7FF519208887DA1C895BC7B8B1783E7EB487D02D234
-4EF2E529CC10CD2538BE4879ACDB5259E694675BA50DB78A91347A4C0E58573A
-055A91E73E3A6AF81E890DACDB9589EB34E061E8936D1DF638B35F22FB3EC97E
-DC0FD73913009B9895E4C95CF9D7719D9D63C25678C45372667AB85BFCE4C77B
-A37FF8E0E6215A718E1A4CE6DD6756BC93A8C1722288FFB56A4082C530D8F47B
-26EABA70B663BB51AE64FC03543E7C3F285A38FA416B20F4A73F1442648EEEC2
-3611E13EE34250A248798A2F0B9D6E3658EB1B97389A66C96C96DF1E41A392DD
-F667EC2A88C557F4DA7F708A33692B98A8A75212231B395D6785CDA4297737E5
-13C16F5FC9CCB761CC3618C75B259F46C45926F3BD3E4994E6DBB890997E3FF5
-D0C9185B9D91A54E6B0BAD88018DB6466492608DE79791EC93516E67C7C52977
-F9E27B153910EF29F9F24B0C9DEBA4C3AF8C59098BCA325824016E26EAC228A8
-1126E6D8821B379F140D2ACFA1DEB12D434BD0383E5BD448FF624D8A9FCE8CF7
-D843B625CE6ADF6F89794CE54C5B6049BB95EBFA62A296515688317FD1E7AED9
-97A2E7FAA32A4849114921C752AEC2C52B98C69C57818EE73CBF916A235F34C3
-3E05CDED2956DB5B0CB7D51AE40E56085E5EAFB0BF29DF9B04BD66B030BBFA1E
-CE3C041E8A175033AA4B4C592575F28775102F8A45E15E3E2D550ADC06CE6514
-B652105633B5E7876059C81527B9512C40DD586CA25AAD144BEF5E587C97E6A4
-45B9772B8D54C2B75D4A716B83617CE59A1E52889613FBBDF5680E676F430ABA
-8D80ED90B8410AD5BEDD7599306A8EBDF90107594F191F927C6D44BC816652BF
-95C03DC365DE827A1AE756FE769550AFBC535CD3F92FBA42098B2613302020D2
-15F884D51ACD348FF9A0441F3E4BFC2C02EA7CFFE8B388BC0640ACB468F3AF2A
-CC50955F7CE335B7E7C8E16F03A9DF18A31B257B6106C3578A343F16ED459E76
-43FCB7DE1E9F7EB80E5D21B7D4BAD5D628F55E1DE0ED07EA926E73FAA6FD190F
-796E75D43954E67F8ABD25A6414F08AEE76CE48B180CB1D3458F563A3EDB63F6
-C9C3D9078D20914B83E7A9DBED2A2CE6F0775D3EE4405148F15A5AB53A4B0626
-E24322A78F87041E956C655601CAFAFDC6F3C75B919B4E5A584E9570B6F06302
-99CFD1B95C575E45AC1EE59C798E726F129643964A47283088298D9ED6788B30
-D48341D03C2C1BEB4F31BD92ED5494A6B4039A88DC8C726E053006F9798E9C5F
-BB96B002056FD39A7EF2195335D04E67EEF12E0A16E0FE37FDEB37B925144A7D
-DE388DB0B4782BA6D48A2084C5A821427F97D22C1938BADC908C772F1A578179
-4FCDC28D435B6BB443C31C4C9BF6CAED51370E133F64A53D0B56334FF57AC964
-B6CBF0D85791D12C68A7A8BAF82CDA61335057A1B8FF0746F94C93D360F4B0B1
-8FDACF3610C902BD03E23FE6FEA2E5935067D10AE5E83ED6214B0BB2D4A4BB49
-F05E89CF47483357C676989DE740832C4E004FF1F2F3BCA3E34DF760ABCD85C6
-95D97A55885031DE77C16B89F18648AB25F9774E495D4751ABAABE7A25CED555
-60CE44A39581BDA539D4733919B9948E2257DDBC67C14E6CA051AB6A2494A818
-93C567A1DC8030900555C28AE6D1A0CC6513C7B31A3F4EA137EF925CDFF3F5E5
-CC9C88776B12851525A920456464431B9385B6D1508FA472B3DB12979DA517B4
-1568600717B7515DBF20E33240405655B3039B7B8C37BC146967C42C4548CCC2
-50EE136F210442A8754946C8DF57016D0109AC569AE4675E111A7D14CA742BEA
-47F0629A7EA56D657BDC06D84E4B248A2628123D100F5ED185DBE2BC67BA6F1E
-CB72947E8C47E53D91F3A28C0125374D2D78FF3EC984B3EB47A5B1B0421F2EE5
-4827EA2D74EFEF8427FF88BDF27344A82B622327EA307D805E93ABC2DCE0D457
-46C2463F1F5FAFC898D6C7F64561E385646C8C71CD624F6486D9EBAECF04A0A5
-ABEE1E6495CC0B1554C0702ACDA0CCBB7275703F51EB6F10D955DE95727B279E
-9F61F19D9D54A638E0BDD27FD15B7DE67A06C31BECB0C800DBB1AFB099CCC2FB
-0BDA829E02EA8EA8CB86E97F9D074A99CA8F0E464762BD1B0F41B444BD6BB73B
-916DC811EDAD9F9775890D9FEB5337AA6EAD524C1E293A78ACB15BADA0BB59FF
-714C43A89459636515E61E73C2F4C648D2916424B688896567E6B53799A79697
-E9DACC8C43A3DDD425AFA8B542ED9614B482F73DCCFC20C4485A67545E241B9C
-CAF58CF1811D639E6C79D013C9CA124565D5D9FDFB2044198A41CBD6ADABE1BC
-F1B43683A55E7D67E1E00CC18986F446B1AC2FCC22B2A2F0EB7B78E567C3987F
-6619BB27788517FDF9B5603BD8BAAA894CBF354FB6F066144931F91D1D8EFF57
-F75B1ED60F4204CF0EDCEBD9252EA04F29712B3907A7AA75964C8ACF7D216759
-931C517183D319B5218AFEFE28F64471C79447A8C96A02D2974A67778DFD3409
-BC4415F8D17B12773192F7485B93E6CF9C99C281514C1E1BDF3628A5F093520A
-9CADA2D9BBAB43139F4D067BA7B1D799BD3ADD62EAD68A70C6CD5249CAD7BD87
-C72EF01DE59557A3C3479E36CC872062034B67BB60D8EE0B703443CE7B982E4C
-A6714F3333D6780AA342A9FD1D290225A79536F222F2393C5FD6EDBC1325C4BF
-61D3D3E5B0C7FD0643DDAC4181FC223C1CDF89A44E542F2AC67FC46D06881683
-4E611D1993F6353E65086553C9D8C415FC809A289795DC5CBD74FC1199E0EC66
-C984180B57F710E59FC74EBE76A8C2CA96AF6A7774DB9879F9A73958A8DAC26F
-BD6C2CBA67E3AE7AAC3AE51CEFD4CAB980AC13FC24683151C15E83B23565214D
-39600CA55C611ACB9941F78B5349B51B1C489119A4381912AF6D74508A1194F7
-D825C41B88F8BBA571414C69A085CF400D4F7B88D16DA3D7BF554FB6A96BF754
-238680BFE0D23146EEFA3CAF7ACF4475DC40A446758F5FF8FDC0BCEFFE4C5D23
-6DCFCFB0663B70BE4BA681C5689952A7A26223CFEF28D76DF18E6170399EC32C
-14B40821724CDB09EFCEDCCC932EE90CA228D888B76A18AE6D94FD69B7BEF356
-13EB8599508321F0DE786EC7A5CB4D6A218E8A62AC044EED391C8F6D4F657C8F
-D9E5E8ED382685556E5FC2A8214F93D1AEE16A49CB6A4FFF2EE61741EB41D56D
-282C083DBB24FA25D4C765E336899B10EC68C62358CAF2CE6B21A74F9E554C82
-221E8A0414E5397DBF86F54FB355640CB742DC10CF865E0C2E16EECF709B2A0B
-908BABBEE0175F8CAA010031CB98818494E670DAC8DA0ACD46959E51669420D4
-128E38F2251F7E9F20F107A450E23A658F3B6058F63D699B4C5135E348CFACFC
-58BA180FB43251958D72F2446C6DB69A17BB2416B5B0975C5F01D4B1C29455BE
-538BA23611CD5FF3F06278641AF5458FFBC44181D9DC7D4D6188D8A506D61035
-338C78D5B248F2812B3493F890F397C1EEB051D1AB29050F1E1020DF89E192D0
-930A1EB5E35E0844ED2B7B39C5982CA708A33E5164CF14B10EB890EFD606D80C
-D08206B43A60C21ADAFC0A57A392B40CCFC7FE02AFB2111F3A20B18AF2F8D64D
-C511FD613492F116AD08D2F6E8193F9685568B83A08395331CF44DA500C405A1
-58D1E63E6F36CF298C02D2271A27C9A454329882EDB15736CFFE070FAC32ADD0
-9CA8FEC258CAB9B80C0E4688322B87D4AE222B574C5C599DBBD24505FC00876F
-7ABCD94C089010E6DBFCD033DA2476EC01E7D0EEF82D6C761126C42531CB6880
-7D7D887817FE9B688447A04B38709197A87F4C0DE7D26877E08E53F68354C2C2
-492B3F3C82DE586A5BE477D2EDD5A8FFD23B55D05BBAE7F6D6ED28BAB27092EB
-C859930DE9BBB54EB2DB5452302F46AEFEAD89721FADA13D5340C7F8CBE0270C
-A8861D53170E8050F5C60D72D85E2767D42E7A9407D6864A2118CC70A16C80AD
-18A214550E33B636BDFA811DD05C871E9BD39F80682BE56F0E9D0132D5B92958
-E4DC5F4A27BBE2D2508B6B66322C4D2248F09B1112E63032DE8D750092197808
-262715C12ECAC600AB628B03732E6214AB1E2CC952B4BCAFF89D31D186079AAC
-8D18BE05414AC7D3433B95FBAEC5186269E8C4F5D01536331A78A3D405DD8311
-8D46FCF30F6A339CA1E0C12BB42BF4C46612F3BEBA9D5822E3978C7E7F24B019
-3F883DE1D353C6BD609698251802B3BB06AE88AE85CF069C70AE3029A66DC96A
-2620389074E61FC3FF708B5B9AEEDF245BAD27A66025636ED25A38A1BBF095FD
-74D0A25EDD692B863A29E3F224AFCD67CF5FB9EE9E45C06702CDF81EDD74E000
-653C3CA9A8674A8895FCF6922C77EC3B63115CBDD52E8859A7A2F736C9CAFB22
-5A62C420FF7E6410386290B35DE4384DB00AE1077CD28CB6A27392F0353260B2
-8964096063D8E225240E0B357FFA444FD04EFB5B9555A7AB653C9F81D879E718
-E408609E458BAA7F912B8E8587A14B27D38792CF0B66EA0BF6FF28AB27D2F132
-0C4EA7DD61F4619A5131828FF73B622C8136E2DD8516194FA86B91A1FC11DD19
-315B3BEEF7BE8856F36C5A41ED2B8FAA5A35C46332174ADF029456721D204003
-17CC6CF3DE50601F8DA6A943A1A5FB4EF6263738B2801F5816E171020163C3A7
-4A1EFB474171B8B54A62E29A84B8025C0A486BB5871AD62159C8C2C2739BCB3F
-1C22F406E26F311AF6D6E5DCF9394BD6E0F2271E9347150B6DDC8E6EBE12BF4B
-4FA1C6D03A1ADFE14053F1DFD4086EA3FF849AA0CBACC03AFB2567F9A4A5E3E2
-4CC1DD4DFA6281350643C771672B4E8141593AB7CC1D684307274E42547239BC
-1A66D2F9B88FF19774F77A29DDF1441094DD13FE8B60BE3D172E2F03F5642995
-D3B4EA77D4B8C2A5B95E17FA3F4FF3BDAF29D8FA2A1B269839A961E6D5F05079
-7914FFA78F79641CEFA7C1E7029B45CD3DE6289FEF5AF3294DD287F8243F4816
-6963C42441B459C2E47C48D465B3F73117A58E45F4849F7B84A3F7AABBB67BBE
-C04E794FA35C3DCB2EF8689864AB5EF05CAD5839A181E6E558355A212B7858A4
-B91DE81B88ABBA4DD07243F9B7E7616F28A294A7A6BB6A91467ECC40DEC2DD68
-C46482EF44B79EC6726318CDE1748366ED8A46995C1CAC6AC2D95DF400C565D7
-8995FD0D12B5059FA90DC42F97176A89A6B77C06E89DE6AB4647D89733F5CB76
-8CD689C40B2BDB5400914EF8F081423A9865060FAF419E3CA66BA378985F9DD4
-FE2A90B6B7C189BF2B9530D43BD54AE78A4E6F6CF1436B5B09165E501F5D03DC
-4921066327922289B1642CC41DCF873219055271129C7A1B573AAE9EA60E0072
-DBB3FF4A4F088408012F3F6AA8C85FD786C1561431014FCFDC04D9EC154B14A5
-3FBD7C31E281C866EC9336B78531071144CDB99FE5D9411EB5A49DD0DE0270A4
-03394B3129890428232C45D40685C9741CB09EE1F1382216B1DCD028FC1E0F5E
-AE9E6A1339E911DDAF47D74ED9E46908672F505D44D5B96674EF2943F17710AD
-C05FEB120520F8E5AD6293FAF919A49051D2B7B0B87C9926512401D2B45B1F7B
-818BDCB0F26A70F48DC1B0DACD6A2E5CD23483F545BC78941F5FE1008B487193
-B59180C93EBA03BC0DE031C43C172F4B2FCD30B2845ADE4C96C662157B1001F2
-69CFC12DE72A3901E825E11F5F7B1B1DC9F8A783B840CA9BD21D082F6A9CD8C5
-3CD6EA5E2E4ABBC4AC276CBD9AA1E73FD66FEB9262B35C637F8392A92B598861
-FDCAEABF130A5C21E646B711566EDB6803F1012CE88E0771F7001B683094629D
-04FF9CC28D2268C22F8EE75AAED16D4A2F95851E46B9809CC519DB0E39618DCE
-C22BDDD8BC151BF4BCB0F7CA35786F6B68F68E8AEE4032B1BD963A83CB00A249
-1878844DB4DB27B7FA585622248E4FCE609E4521602CC6AAB4713FFC6A39A396
-7C2A1A82EF4D6E814B6914F24C5A5AE2952875EBD6CE5B7429582CAD0D07DEA1
-72E65642AACC1DB37E1C51B920BED00C4C6D597B5920A5861DBBAE3B43BC09A4
-4BA3B4C52B3930423C6D2D39C5249F6C2C0EE21B27534EDEEDCFF791A302E5D6
-2D18005FF18C046714B9938AC93B5B8099CB7DD3C142F3BDAD20CF23D7CEC7AB
-C64D591809E95EA1788036BAB68B8E4CDB12A0CEF717BEF6340C9CA1092BF8FC
-C30EDBE372B3D640700717F98E9912B814D1668A1169259B529F3E12DF309B92
-E0BBC7B6A9C2D4903BD44C4B0969E9E5DDF3B8CA44B8BD065C77CD2ECD3A946C
-AEDA6FF655D5F8C94509F27934B9207534C98CB3361D8767D22360F5C4419E52
-6A3A861A6C56AED8F6871DC5671011DF104E31B3D5DE68F2DE00F49673BDA295
-F03EE38F4F2BF2CBE7274A6A6694DB0AC0A90FEA1714F798096B0B47453B9F9A
-6E7A4652CEFDF5755A0C9F17C5574FC5E5623874D5360ADCCACE26CA2393188F
-A81CAB8D3F35A3FC81D43D450A073474A391A31D7FC994416AD2DAB64AA6D4D5
-9AD3DE4132A10074BD4A27ECAD779F66C3711BBDD7AC92203583AAF0E70483D6
-FE5C76A25FD50101D6DD76C9898E8A996F6DC34F1F22085EA743F966D1FC36C3
-08A4CD8D337DCC8E1DB190750FBCFF37726FD48D1E3D036F1556B755B3C11974
-9F81BB7C7B6430235FED173EDFD5FE81A1815F1A424E372485321BFD6D92ABE1
-C647E7A18A0CDDF2CBDFBD5BC0A1A57855D4AE646D27063179B2FD6E2A01367D
-95D63DEB069446A7AD2346ECD9290472E4D057BB82F5B2F86C8C81FA765FFAF5
-937C8EE96E839472E591378995354261EA890AA0CBA33CE29A7CA6BF1DE2E312
-AEF2DF4F66B742C91BCFF17635416598A0CDA87D2B94E0AF915BE7EADAFCB9B4
-5BA814C81CE08C377E448EDBB082987970203A20B2BFE8B58EC3E6AEBC7F0CE9
-DC5733F5A05CBC25152EDEAB6507B8BAB2736593383FC9FC744EDA54C67726B8
-199A3D9CE9DEA371CF1B47FFB18951D8F350DE7FC5D45BDCBFFF8005B92DC257
-DC098528B4AC8BE791F5FC75068506C2ED97CC77204E2F37248A2BCEC9ED4FED
-510A7B9603779B68C57D57A94DB76839004E736177752A2A63BCE0900E00B493
-519AC8820D96F9304034D948C8309E4D199A5BF01052C9F807D27FC0C1C20C55
-1AFDC48CE6A0529E32AD7C316A4D313FA9E28D5D68E4692C48A9A030BB275DFA
-004B19FD59F6ABBF58F5D2DF093F0ADE1EE44FABEDA97C775643F4616A0F5262
-076FC11E2C4607EC5AA475B89BBA1117182A9CA235FD5BB9FE9B15798658B285
-6C35315A41D5DD6BB6021219DDF2A30C7A695330AACB6D180F53A2C5AD703A8B
-41256DBA79173524A8020675CAB62E557CAE00B396084BA76A734E1E01D46BFC
-25AABBA5FB4D48A1654E1BCB76BB5E792B2E73F6E7006B6BBB435979C8218585
-C41DEB66A2B9152FEC7CD454B4EDA06A73F35AEAEE33016A2142CF0623E93969
-F86E81D72CBDB19B4BBAFD70DBF0F8EB16443A9987769C532B2A5053A7B55910
-50E459A1098F5467E8175AFEED1354F1C50326CDE9E761427F585DEC3C9A4D36
-A76A9CF4C0EA0B8712E890F81AA6C2A9A81C8D9B061931F75A257B93723BB6C6
-19CACD8CF81536DF0D2A466463EF195AF59B5207CB52D0902AEEDB39D79EB566
-F647A9138A81F7B3300E8D1CA514B6C481904879AF3C99EDD1D94CAF56C61166
-CF8D8663E452270BEC6324A17F6893F1447BB9A3F086E54FC1C2AA2D7F58F66F
-7EDE9BE293ECD25F74AA7B10E3DE10513B13333A4224EDE43414EE9F86978C1F
-0ED1C404CD511F243A1632663BA338317DC7B684A84C1D4E022D567821331064
-D16F76253F14F91DF2A50E2DDBCB6750D6A75DCD3356AEF7CB5A9B699DCDC80F
-0F530B66BBF4A60F102C402DB836D29BA43941AF05680AD51D4F3EC668E6AFFC
-CF0D36B5CDD912A6CAF2082B702EF90E16906596E4BC20CC979080CB78FFF0F5
-C928F5EFA8914DF3E56D33582504840071B2FC38CE433A6DEB63E6CF6E808E87
-9866B05DF8116F0972DD25F2FE5232522057A095E311C247336F669BF10020F9
-45B9B454DAE2423E0E9B432B1A2E3470EBA9CE177EF28091EF444045CAD0EAEA
-23A3B620D0903FE4185340014920AACE478E93919FF0C722B77A448424D0DEEB
-819B8B686125A6D8CC719711E108C6A3F9EC056C4400CE3B5D209696A45F5CBD
-913F3A9AB9A6BFEDACD7C207DC01DE4554EA63400489918123741D1AA8843EAE
-14BDDCE827785FC2324CE7689B0B7C2075A87520B253AC1C61AE34F5AE34866F
-9B68061D1C1D4E4C5763DD68801ABEAD6967F056B8D934CF84081A6A82DC2B91
-2A0F350A5FEED1C1116E3E94A18427CB4A4D1A6935532FC4CECF43E10497C190
-AD3AC6C300A57715E3FB715AFFACC30D4D4EA325AA52DD9BC29FFFCC3646A7E3
-F97A12FFF8E0E355DCD3CC5E68CBC9FBD67DEF5B5157161BBFF5B61C401AB639
-DCACBA6C3F09E9683F872288ABFA4176CB69B8D5E61AAF135B7019CC8F6AE07F
-573B897F7AFC0A5FDE3A922DFA3529B65E62372F2CD8F57B6ACA0FC382C148FF
-A6CB30FE9E9891275705FFC71211EBB0E7307B00E629E2CD9F4BE16C072F3247
-51ED89B8B087D69DAE1D6EBC237AB8D3483A8F9D48C2F6B465430E12756CCEBC
-1C5E3566359B47A0AC0B5D4A5A1B1712457FA33FA5BADF1E302CDFDF655D5ED0
-FA9C6666022302D1DA091F8A19CEF58923AF8996B4A5AEE228D166812A6BC684
-9C89B9E6F07B71454B91F5EAC87333AA9B29B1E83A3FADFCCE5AA5044FAD8167
-F6511E27E444AF65D09B8A7A0312BF78EB35CC34545F9BB06C88A074EBD5BE87
-763B3EB1EC2A4CADBB704F7A2DDA34B013390F0B63B0A618C6CBC2A7156608CC
-332AF4C93466EF7D18E85DE5C5B3D2AE50A44DAD39738274E4B1E8D350FA4ABB
-0189273E99A3D9659AFB5C29C68FF969D3681D28B9322EB08214CFF9289B52F0
-74E74ED0F1DDCF8011A5D3BC4AAF6D8EAA4643C347B912544026D328BA2BFB5C
-ABF3D683F2A0AA01EAE0DC9760DAC0EDDB432415B1221D35391FC5BC5A30AF20
-79469870D85F59B9BA86B928A0BCE261D4A2296BA7AFFBBE7F1AEAE1108CBE81
-C2E5C9D7F0B64E634268C2510EA92E10C1CF3AA7FD146106513F7C1F63823DB7
-F7CECB5A80ECEDCB41D3E91CB4F3FA9C8FBF3F62A0C488933D55DD2DEDAF0947
-0D067211819598DB2CFCA285E3A8F74E7887265847DFE8353C428B253EFCE70A
-766A823759D68B665CFF11BF62071F2F8879D076429DCE282C36ABF335E2DE77
-BB53D459A024B61A5CCE35ED62239410C0E6D2194CE14EC54DEDE8F86BA83FC5
-3EFF391C331C78C5C9C754F81D1FE358D76E84F470BF6DDF6EDD643E62680098
-03840FDDAE498DA27306296B282E76A03EF8D593EF0764AEFD4167C98059FCFF
-CBB638E477D6FE42537F6F7BE5957B0EDC591363D434D1C60F46ED853E8E343B
-68CC70D92BD90958345DE0CF9F345AB7641CBBDF225AED9BF559F6D2CCEB3D7E
-91A0211CB5628CDAD748F37A8E49369425CEAB98C9C4F4F0554F263371D2C9A4
-16466A96356A3EEB31C362478D5D6B849E02F6F1F7095F9A7CDDEBEB00524F2A
-3191A5B347CD1C75511FB605579D6D718723D3C1E26862F78B5803AD3E6958FE
-6777D6E374B40F799F13514A7DAC43DCC6B68B7A5A0F25A57F540FD87AFFBEFF
-3BF2D62098BC62B9F111E663E753347E7B40B2430E89C4056C71FB142DA00204
-6D59F1053CD6A1A030B6EA70302114E4480993E3447C926E208226375ED723D5
-B18698957750DB23498A960066FE6FFDF50B97B7C46960DEA0170CC19568A0E0
-371359569055135B47AC83242238F42B29A460798E246A70185B30A026762C21
-B0F1F1EE8F3F309AE8CD042DADE3E36151B3B7929BA6A14D90D924CBA141D1B9
-8DDE94E46286CB6BC7604D84389890C0AA8B97D329CCA87E5889F695920588B4
-582B88B39CE78B8C35836AE8BC5C66A86DA1267E46BE9F20186DC3BF636FCC29
-141302F57026469542DEC1E8EF2B54814EE534C87A1B4699D58D1CD95EC4B957
-802383A21B8CFBF29FBF643E452898553CD5FF01F7D73E461CBB43186A96C66B
-BE5910A0F78C730FB54611E4EAA909096A77574AF9F481E0CB8D15AC003F336F
-F8FC934023F37DAB1F5E0FD58575440E3FABEC39851905D14FBE4745D11246AC
-2EC21E7E547F4E0620EC4900C327E20248F7F6D60BFD8564FBBEC1D36AA9C27A
-5796EC4DAB33961A2493EEC2035BA4C49FE459BE440562DC1AEAAA6330732146
-CD7E01AD940744DBD87AFEB4671A0A0ED5CF115E3F4AC466A741F086DB742965
-3204FEE04DE803F0A0F53D1EFC1A916EE0EACE7476E1C173EBBE0B560E95242C
-5CD33B424B8BA6C9A26CAD4B4A3B37C6FCF2EECAD1E8227203686172B25B376B
-8B03F6B7C6D6184CFEF80170C1E8B97B77B3E7DAE20A8DD97B04FA0D2B955F92
-8994806F6B43944B520F4DDB8B0B6DEF2A4AA7E427F6524B915FE5145C055915
-D2753FCCBDA11C598DE694011B929475D5A1855934B03118D52ED86419047DAE
-CAB3FC969D072D0036319B517B51679755B7E5647543BE8C60387800139D5F8F
-1002D480015EA8251624DC1442E7FC84B46356200BACD8C99F1A581DD42F5798
-5B5FBF460CF1F10E3125211B0128586D65B73107E32FDDC354541917310B1467
-D92B15C317576BDADFAA7334C14E32C2D811B22E6ECA84BE80532D5FE222576E
-94D6950015F2EACCA793406DC18C427864AB6F4E97EAB9BC634DD0B3179B9EFE
-2C496C1AA898C2E821E23B5B16E7C3081360CCA50D42A459FB603475EFCBE5C8
-8610E9D856933CE6328DD3EED0C2EB4497C9D7622259AB0CCC303901051C4136
-4A235BF3CE520FC4A6D4E99937DCDCFB359D15FB1830A434CC01FB8A840D893F
-79F38DA3641419DCB90165FAF459070A2C4205E1772ADE564DB3E5AE47045EC8
-83FBCC23CC6D41C71E83A01339C2BB9A4E8FFDF67D3DD149C13B8615EEBE0963
-21F59731B52B83DE23808F86523F88464599EFA1E726D3C080D13752E18AE05B
-60CA2052E559B00E9F055C692F1EE98A0C0B734035A21D59FDBAED45C5541A8B
-839F9757C6D3041144879185F75952B2E1A19B01CA1665B50B7FFC911C4D9D1D
-05B0107D9FE3961A5B4A447C1CB3E8E88836D9096B656FA15CB9EE3D19A5833F
-A5899996A26BC047D0F69BB9D243328FDA3E9D9975DA456946070A48E641D10E
-676B14F21A2610055B5D7711620A201B465EDC837E661D4633AF96F60CF1808B
-D32318CA59537415287AA572AA8CE82E522ACA934B9AB564E1648E3378648C26
-01C8EEFE576BA9A308E2C0EAE7A100F57C0DEB11623C6FBD57AE045048D4D1EE
-81622AE08EC95179E21AE1C6D5BC9A0463BADC098E282B18255A0414270E41EC
-B98ABF908114CA425B3E4609F5601151B3AC79055A14E1A2CD87ADE46CDC2047
-C4AB59252E633EBAE216F9EAFFA55811772ED0B7A75CF4AFE8A7E59EDD252CC9
-43FC4E60B3E47606760D06E3C22C599856D0C5FDFF00627484E77DA4D6F51460
-5412849807945C28B25A0B684E33D02EC26401708C1DCA683C85FAAF9F3D74BF
-66C485F3D5F73B785F0A2CE231538BCC1E9DFB145152768C84E32F33CD0BA1BC
-36D0B9383AB4333598627553202A39EF3E696C8BC58B0446D514822245D888CC
-F013C52BEB7067214029B943D7E93FD42BDD589FE1FC0AF049E20F60A8B03B41
-5E7D4CE78FC1229D48F7D751407CB8ED28258B6ACE47F74E0EC4BAFBB4D3327A
-6EE3977D9643A67CCCED9D34A563CCFE8BE6C57CFA39B90E5BF8AF85BFC30B7D
-D6E697AE61FA9633EC1C7806636A916B30073E4C215280F73B6BC10DEDB15202
-827659B00933C6486E67F96D81FB80CABCDB9F159937989AB3E55878D53394C0
-C7D5E16C8EB90551B1F0DA4F06B911CE34423CC2328EE5E43292D03C9A41D13E
-871EF89008148EAC9C5CAF24729019609D114CA82FBAB5EA34311D5710EBD6C0
-37F9D4A31AE64CA73B1499B39512ED67B605EBFBA6682D0DD96E23063CE3830E
-AAA4CE2F1C6BA52DC2523DF4B3EF1F97298F2523123FEDB43F295D84E9F5AA3D
-E6F1D4F813CB884E940A216A0C6658D1E69D28F2CFA4DEDE60059F4E919D2246
-9984DAF8A569DB04FD56E11116BA2296BF63ECD1B65B3391E6D8B8A8A8B95318
-8F9C9B88B7171D73E0921E5C9959186A20D01982D38CFCC5A4F91D31E0FA8503
-E05950007B611CD36D3D714BFD49F6DBF09255535579D0E0E01B540E51FA68EE
-EA6362213A0B8572AB83BC8E533B63C6FDC4FF52507C34739F64C528A815B8BB
-628BCBFFB3CA3C2F501182B46DD1A72580E91BF85FEF40029BA737438729C51A
-BF25EBE3882B8351D0F356A6648ED0F11174EA948F3F140FD7DE1821BED2FDDF
-8FBA1DFF2786C0015EC2A8437DF5F02AF89CA383E622570EFCF2895E3CDF60DD
-A64B152E2F5B1DA795F50C59D80FD35AA7A2CA4B55C3A1E046C3C84882EB8D86
-AAC4750A3A786948FEC26CCF63395208DB2DC2DDB6310B59817ABDE61C856183
-500C350E58D4847F1FE95FE6068508A834B4882D863691F3DE33A9953000D8E9
-A8AC105E3486CC974E06351B1365D157A6948D49C904B075C195277F943C80F3
-786F1CB9D118766439621C23095FA5749C945E94648E70940DEA20F7BC66AF49
-0D6BC622CE00143F979085824A2A1E850D68204BF44161EACE7F8AB0E8097B9D
-C4ACFC76E36776BDBFA4F03424C4E286A6B925B98EDE522B21641C95C0D2910C
-6425C3465AED57BC4ADF0633D0AB3716F5C0EA050C493D84AA1E0903A20F0E3E
-04F2BE6265DA7D2E5D308337E1B50D361D0BAFB054FF5292C58E12ED0A095870
-D39C50CAC7B0B010DB79001816F7C5EE04AA562E11F87CC6006B9396DBBCD9DE
-4D25B032C5419D85D28306FB3543971B4384AAD68824D78C4E30C945B610E315
-013151687496006EB9D8E867B82AD13770535C982DF8F84EECA2E8382D1971FE
-8C4D0F28D8CD60B2EBD10550F51B3DA50C7CDAC3553F8530D596558B238FC24E
-26EFA58FC455D2308625E4ACB5A954732750A03D25A88207AF626534D73D7086
-F21936FEFC92FB0E1942DF5E43A52DBF41595BEE66DF4C66A769D9C3B316E332
-F1B94E86370C14DCB944486E47A0EC71D4169ECCC072BEEFAF645A4CF3B8AC01
-1543972D34F94639C7CE00CB64F522BE3053BBB55E8E7470680BF1F01BDFDFEC
-06C3B76ECF3D8BDF4A150ABA5455ACA30AFB5F63998B277BE7EDF9268C07A751
-9DCC7CAF54B1F615F1D03CF3E58A447C377929CFCE75A6681A7BAE4FCE70281B
-7E4B69B0288633D39EDF2F69BA310ABAF715E9B1533EF655986811EBF695DFAE
-902D7C4F1FCE16EADC43529513B9DADE8F0F4DA4053549A930D311977C6AAE0B
-D5A74E1F269D484A3A209B8F87C9D5A1E4EC5FCB83A2292DA43389FCC2756007
-EE9FC95E4072CCD35BA378DB6CB79CF7B27F017F1C78CDA81D887EAD7A9F3BE6
-53A80FE9B5F6B159E32BB7C927B069B0C94524F061C8D05810481A44A6F12846
-31FDEE232C38AFAAA1C81BC3D6DE2A4563A2656B0978DF8D53936C728C3F78B2
-671E7F22CDB339E25111E66AF44DF414EE12268DBF4409B84130157D861727CC
-259A9E95B9BEA0D98F6620001C3912E22C2267D7EDB65E2C20680728C4043D5C
-0DD01B294BAB0A5AB7936FEA9879682F48B1C39CD600BB8CFEA75F04D937E654
-80225375EF6F2EF5B77857FD79D050A2B20BDDCD94A9B455A09BBC746CF8D5B7
-93D5CEDE3997B1CC75634E2DA7B19788083B68F6B8ADBE69276F0E1BDD33408F
-27497492E0624F96998FCC221F8587D30D45E56E5531A730CB08345B9E792AF6
-4AE3EDD27A5C6D8E0F523AE7C97E8481C775922B48E3C91F09DF62E1D41F26AA
-F5C72265B567BE0B283D6981EF0AD941619574C4584CF84D9693E0CECE14F76A
-594D849968EEE1F0984C7B2A37544FB2EA102B1ECBC8E48113579EAFB12226A6
-CBF0C0152DADAD834A437A3A59D6672E74DEE4806A820477FD177A8967023B27
-1291B58E507B0F68FBBAF99A963E9F90F4A846F627FAB4A2E11507689C4B5EA2
-D0A79B352E8722EBC3A662C84F6A163B64E3CF96C59AB5FE04201C0DBE426AD8
-9C7775FD046E1F2F4FFD1CF5820338C5353506C34D99D474054EF9BC265A260A
-630CDCB706D2BB45C343E8918FCC8F65FFDB3655F565554D1D451B416EA838D6
-59A66763C9515B66E20932B41650E01A27E3A250CDD40ABDE0B7DBF60FD08700
-6885C8A7DE9F14F7E8DD6CD85E4370C2E3BC26AD2AA416A36877507DDDBA6832
-58E0A4BEEE2495BE6DDF7C71066FFEDAB5FAD4ED9B4D6D97B70468AC407A9FAC
-EA45B5F501611EBAE7CE46F9FDEF54AF912E238315325F664BD295E53A05F73C
-5318EAE8D4A34E472776F142C57F34087277308336A511A3A65B4C4CD419C288
-F6E5206D62CF4364C478E9F4C6B64E51D2457CA950B9125D22ADDA4AE08AC275
-8C2399EBECB69E7A5D0E31726E520DC5CF7492C59076B3AA425383A04C653C50
-34E222AE91DCE83E758C1C6DC3005CA2757CA73102F584CD2E799DA49C77FF12
-4911D74BEE8DB74B1F0298CA0A9EA5BA2459056D6D6CAB0A90A68986D492F5B6
-DB37630B7058B6161926BAA0D62C8511000BB7D2FCB92C5922F0519A1C1B3977
-81329801A5702540D4F84385876DA07CBF5D648BEC2030473C5FFDCC29ECEDAE
-C3901C5FA181AC12187415086F68D913CE9993D40411810C505DAA8613C80EC0
-91336623D5686BE49074CF8A39E1EB7BEB212F635ED15C0CD1653E692623437F
-91314D34CA09C3F66C6C1F11BBDF5F720CA4787F2441B7B9AA47C7FF9EB113F5
-E4E57EA7040314E093B6729CD3ED11D18FEA94D60E1D976C786EB52475293FD3
-C0DFB12695BED5E1562D3EDF6C9A54120CC23CD025D0D3DC32A37C5BD00D6263
-5D2808D9B2E2666CF4CF92002B9F1BD2D3E12DFDB18D40DD52CB427662ACA883
-1190B5A2F9860B20D521E55129E7333DAFAC54ED4783F40A8A7A69F04D7C286C
-A52B8F3F608BCED599DBE28AA6F69A0EA54CED3B0A21D199363622352E8898CC
-9B5B0355CBB533E6B179220872212360EB718BA0D9EF404E4FA7439891D2370F
-BAF1CAAA2802FBA445687E743200FA6B9E85266EFA88D05E3B2720979A43E724
-64F79B714FBCF388EF35E9CDBA1B8DFCEAB836395907A0EBF22D285883B1B3D1
-772E00B255032ABDA52DFCC0BA366CFBCD081156072DCFC3CCB903C305FEB7A6
-D16B59AADA73E1A06073D20392DD17D1FF43C4E01FA6D5801BF3C61887658A72
-32E319AF638CA3D03BE51F832F9BB24920B4E47D0E3C96FB079D771CA5C310F2
-B8B4183CB714383A50E3948F6977B16F4A368C086B2A0AA57C66B30A895B159D
-CB63B0FD7990279EAC00F0146D58282A8EA7367BA2885660ECFF69C64F4EEAA2
-F357FBF8A514D1002CEFD82AF39D461E2BE59543321C7A991B9576778C5A7EE6
-34703E9842983E2580DF60DF6EBC642EDEA4A1F1CC34E754327A02DF2E9415DA
-08CE3AA32E1A615A484E69E6BBE4A64C2784E27626E017DC0DE42DD71EAF55C3
-E3D15BF87E9727FFEF3A66512C9458E557517BCCA1A2E92191259D1EF91D6E12
-6454380986B17C55A4E631C6DD20E5F87208D2045BACFB6AAF14129108A5B35F
-41B29AA518D795C955EB247BAD1D1F03FEC701BA6CF3261EA985A932834834D7
-DC8C65409644E7315D66109D8F92DF5F42070B97A2DE3B69EA97CFFC71511DC4
-24A903C704479F445BE051E96AEE9E220EDFD0934CE793AC43843D88EA12757D
-52C10F73BD34C812C1B306CAE0F18D7D1B095B9F5EE76256605E312AAF795609
-94D3FA76A6984C63809F0EB8741AB3AFF516C3D6F8FCD8B1A43F5912A2D98019
-EEC4DD105E77EE0EFF0D69A6A55370771E21851B58AD57332DE44B5B2B2AC29E
-B58FA30709128A9862C3579CFD08D85E8188D26EDBA5901D510B258531395FA1
-7CD5E059CAD028AF5AF313AAC4B8BF60966CA2B53DB31F0659898D105FCF4FD5
-DD2B78C838EFC626CB81B32359CB11C5A3E9F8ADB8B1201240E34009BBD2E23F
-C624C1AC532746372CD00EC50C92B576AB3D5F086B64119510DB8294D48DDCE4
-49FFFC05594275C796DCBA291312159CA9EE7BDCF3613EB3D962B6967BFE2BB2
-5A9A441DB81FC861B10F910BCF5E80B77F506EC8A64E6ED10839333BFD7E25B0
-CF6FA7AAEC17251811C44031C7871669C3343CCB0D0921BA8A9546E2C052CAD4
-BF765EA279DC4446F1D31ABCB9E6358A11DC2C1AB1CC71C244E57B4852A9CC36
-8309D3B5C0FD91CC6086DF741237ED81F847897FE5CB939AF97C1B9022CCA3CB
-227B7C49BDB2FF6AE381E282B42D22BE5C6326A8602BF364BF81FB7367BCC437
-DC971EDB49E8C1AABB29DB90839A1A70CD20DC53DB0CA61133BA0571D00FB797
-13629C59658360CC0472882E8E6F085057ACA3FADEE34BE0832241EF68242F90
-AB650BD7FA6E8EF0DB539346515580E57D3B08BF7F9846911C6779A481D1B348
-D1D0A1265498F0ABCD04D50581ECCDB89117E4889C4BA30DE7155F6177E3F40E
-1E9DE1367427C3A1F17C27AADEA655D59CA7B6C2FF4B833442BE50A87B2D4D1D
-DB57A8B5C3201433E00728A9D9511A46C3442C3E29F6D9554402A516796E60D6
-23E6D61F0ACE1B60D45CABED468523416532810C10DF9E7C711F5356970D5FEA
-FE5D366722FA3F10E097FD16DAA5B68614E7D29636019C4ADC916AA6F45E592B
-C429AB5A668E1795DA4F755D74126B6E230587AA57E3F9630715DD6F224CC236
-A5F67B3668261FB2D2550F16A9700B1D997D2801EBBD0F113C47B8A13960775C
-6FB40EDF6D6276916BE3198448E020A46BF782B4F02F3B1C85FCBFB2B2F09578
-F90BE57A53B596E9499F9B3E23DE0BB1E159BCD9828A47B3B1256D305D879517
-E172C1E3725C4771B3C03C9AF0B62EA0C5AF7C0D692F94FD1E554E3E52A0E7F6
-835B95866B7F72514098BA1CCE2C3613FCA568C3594534167648E2AE52BE3F9F
-E8207FFDABC084BC74DE49FA0E8C61739C28C78CC994AB707C2C04860F0C3F03
-5929D056CC4CB6FB4BC1DE83D2FDF9B2128667B6A2FCD13626D3889D83683715
-131AADCE22BDFCEC3C9B03E50200BCB5321B42D108DEB519A5C9992B2D3A87AB
-4725F5DBD2094F8D9ED8835777C2793FAE8FE40F3EC0DBF4F1362A148F890CA6
-FDE1970FF1CDAB096D9355B755AA0D93E6E11E9D3B1F5EAF537E48C401A75C85
-58AB20685E5C29DAAA6A9F90B066E991968475ADEC1F946C522449C0CA2A38D6
-A8789A6871F96165AA3EFB39089D22EE69BD05B4E0853D3C33CC84FA7ADDD576
-639456DDAB65EA50A3C711F78E8CACD7E112035D5D1633819EC419BF5AF0CE9D
-40EB6603A55A7A2BDE2D6E9FE476B1ABBEA673B397F2510066D0D5AA650E3D1D
-BCC93BF8585AA04228DEC13A6082A5DB015A70FCD1D3EF72A1CDC6D8A9705E02
-662BF3F0F8B318108CA4C9621C01D02EECE3817F9EEE14D30C34EC262CB9197A
-377828142C04BA679630C281AE4A02E65604DC7FF73859163F0F0640316D079B
-D42F807A41D0D128E010C3961B8A742908ED989BAA0CE2BC9E9C26DD73DCE3E4
-7E31D958F4DE4E3A1B161B2C5DDDE9D1C693745D146C83F807E5BA7E00057959
-F00E3FB89781B4F084F5B24A42113E4B74933CC32A11877B4499A19272B60985
-9C936AED3AF65C3156C8A705AB51749F99263FB2D2DC4F21F8AAC6C9168F8D28
-414A602824BA3EBC3FBCA1A8D29825680FAAAACB6D9B357B437774E6C6A1BE61
-7D146A9BB073E1903B9BE2CC9CB5DF888C51B73C8C5674B172E4BD5286F80E8C
-9718FFF592B56E1BCAF33BAA26F5FD402710D27A0CCB1BCEA92D9BCA09983B1F
-56701305AD3830A74CFF0091BEEA6C706C3433977E6F3BEE52E77BD7B09C1D68
-37C3A5ECCF06F8CE25F105CF88FF3239DB905472E10CFBFC4A0FBC8F587B1017
-26A6080B364D6C3D7D8988AB1B4CABF6EA6C5531F8A82F99E5B111C81F9C9412
-0C54828BBC82865316FF0D9E8920BF00E1BAA976FEF21D0A10E8FD9837799623
-E4CD5E216ADBD1D76518815FB49EE4AE73AEF9447255A99CCE4EC068959C8D9F
-6FE965ABFC53DD09C063BFC80BC1E6463DAFBFD673262840CD9BB67AB5CBFF2A
-383079643499FD42FDE13BE2FFE2615152FD8457A547FCBE2C1CE0691023CE42
-3409A9B2B8FA9C4280856899D1590B36596B93282128E6AA6552B8BA7072E603
-FE13711746B110FCDE142E497CB2B623682A60F888B1514F7CCBBD86150B9DAF
-24C9B763172C14BB79AC1F8AE60F9847D9223DB0ED5F3B74362F4AAE3D466311
-79D35B1C81A2C48205028BFDE7BADFE708F104A2C41CD32BF8348E206E251EBE
-FA68EEC9738CF3D3462CBE7DBE7F725054F08D6B9F1235C525F8E84287381A20
-10D4AC542CB292EF20A215A3BAD7CB43686DD5675663BF23D89E860D392B6FB4
-6D9021EFA0FAB6E04999DBC8CD3E84D1C751B8D24B4DE92C8A80E23488882F09
-D62FD350C636F73DFF5894861281974195F6BCE45EF55DEFFB318001CA8EF32F
-864DD1459613772E6B23AB6B68769846BEABADF07BCF11D78E26CD09E76AA9AA
-F5F88F95AD6EA652C8E08D1A7BDB31E60B90F31308E223B6B8262A39DE23BA43
-EDCEC76D6C8D82622F980DF095EAFCC83B79C206A314D4D83624B2617BAACB58
-304274ACC6BDF5D2F0529FCB76E9B5BC43EEDFEB149D61CE36DD4672F80A8659
-331AC6DDC433FAFD85BD5A0E404B878B2A34BDF8EDCC7E9E9147219C37C4CF50
-1D48B7F84E95074412BCBE0C060BB8FF5AFA81D3D8F0509EB8D1B2950F5CEADE
-51BF7B714B9784C9A6A91AC635C09CAC5BA326D1F5C52A636F2C6B61BF079DE1
-47815674304950E4D724D68B4CAD2B8E641DF1C7B6F7587D258EFE9CA777E2C5
-CF2DE3D47D6EC50B3094CB30EDDD1B31A58E8915A4D92E89D0550D1630E7D47A
-5930E1A7F582DB33E1EAF7B15E665BB214F62D336F4D90C6B8F467460BFD411C
-0296ECF5019A05553316BA7286B4B9B4D892AF6906FCE7241AA12A18C50B6168
-F299DB45B7DFD3AE5DE34753A0E497B0D94B0178E66D38B494F850BD820D668E
-9F3ABC7142C364D5E26345C6BF93B08B0CE0AAF87838DB65834DC4117B3CBD59
-5D315844A0CC89757EEC0204E2CE0F2A2248B860FF1DB439294E9E107E2560A0
-B804AC0CD639E314BDFC7A689BFD77A81075EB673A7C818FD97009D0BFD4B121
-46FC748FADD2A1CADA10A04566049FB6E00FB8B5C928989FFF0AC4A102D00693
-0FBC36B9EC7098BFCBE62E49F317267F5C8FB541B73DFC277DF4E8A049D09835
-ED628F1736AC2E6F4BFE40AB17554271671A348C4CFE13F58D0A5B2A7C3D83C9
-EF2ADDD7A6B674AC1B96BA31A10BE2276F45BF27344636A19E09D78E56798DE6
-774D7FE7BDD3C18770CA1DEDC5C035E4623BF5317F724BD8EC0324BC1881C437
-4EA69508C35BFD66D768A0AD744D8978DFB3DD210D5629A19D6A70DC8504C49F
-CDD35E164B973CFCF36DB986C6C618AAE4C58D32E21188F8C5760DDBFF24C3B4
-F0814E471A0B76950A8BFBE86DBEADD5A2662B56A078DE456FCF8FCD25164140
-694844E5ABF924CE7CEDDBCF7F4492AFBDE34610AA5B54E6E5A44AF50F0E5464
-877D6855416CB8980E1B114B6F6597347C432F2D29E4714A6BD4F3FAE8FEBAB5
-551802BF47867563FEA5290BCE8022DF9D293FA792238B7F00F84E0F99163B06
-744A2EE93224CE855C72E1FDD0E52767A30CF3F0D451081EA69D0A80893FA79A
-1D25E6F56DFED691E90393FEB1A97061FC3F2BCD4BEEF1C6F56A0514EDE39BA6
-BA4583B7FCEA404149425F6969123B3119AE25DDFCCA3F2F672B98BFC0C56907
-DA2923A73A30B8FA2377F36620CA0392651CEF036AE31F1E5FA9B2DC87F2E8F3
-B1964898A76BB97DCC8C63101EEED39ADFFAB3BE571AE0210309DCD4E4346868
-DBC33FEE28431EE6FD3D64D570E04C269F6D905DD391D40FF03CBEF98214DBD2
-2BB4638F41793E842B07A9CADCBAC476A6FB9EB23795150785AE1032FB16ECE7
-3DFE9AC0AC961CAF16B492C79B669A9F0FBC7F365BFA02C3981A324E047DF5E1
-41D2E85D6F472A6BA1D1CFC896E3DAD437689296B2DF397E40A6102493D09D29
-06E359254F761F3E1E3E66938270BD46C6DD1EDBDC60CBB35C47D6760B17B782
-76F6F472D584A07146C19846AF187267E7E1635FD04F311B7E70C7A33018C6A1
-943388278E04542E454FF117491AE7B56F3FD5B01A31A89F85ED680173087E8F
-CE5365E1CE48CD62DB5AA71F4C2369A09BE3B0C134E550E72AA7C299FD3B26D3
-8D3D744758A87ED77EC946914B8EC92136FE4884E30B545A2CDB474FAD36B557
-509C986F87D992FA39BA7E8D85D5EF322ED08B1EA8D90B9E391D47D3FB2A3B9B
-CAF230B61E0F987282BAF6B10CD07A23E3468BBF814EA995AD6224FD4C919D96
-A228947D0F2BCBF4B189F1BB9D2E1D1EF59F20CD6A045251905C39431C548318
-9023A4297D0D21E380F93C9FFADDCE951D0ECC25D8A4967447438DA572CEA724
-6B7743FB7D68783CEF142E50212C166D2983DB08B1EDCC59E426B4D73716B920
-A14805FF0FB04DB3F7AB70A1068CFD39DFE12443ED4E8BB832DF520B0A750139
-57D9A8F4CC6AB8935A3C01858A8ECBD75F740652DFDD752F4FFCCD4278ADBF75
-C27537AE1D759AD75B7BAEB3401925949E4EFEB1C20D441996D671C51D327FD7
-FE05253BAB53DA22FD071BDDF4DC3A9D7BEAABF49958249B5AF68B88D96FC333
-FE7D8781FE9EE147E162B0F0B487272D44522D8FA39842C472F9D527149CACE8
-AB0AB0E6E2D88C03E62AD7F6BAEB6E67C8EBBC94F330EC8DF632A5AD89FA1E9B
-D953CE17AC117024A9E4671E5FC05FA194D38BCA2737E73D079881BBA8BB78D6
-0F72C39FF3F87C4161458CD8F6E07FF06312B5FF9F157014B545F6F1F58488F0
-E64494C390A6CEAAA53576A32D53CB5B51563344002931AB82AEDD0BDAA963AD
-902B6AF937798843B5DF895CD487402ACD82BCC95D10FFF93F71FC4C93B737B5
-FBDD6DA8BA8AC357620F0395252BF8D626AE942B759F18D26C4667C67BC43ACA
-FB4240AD7DCAB1A702E3AD59138A1B958D23DEEDC8F24D46CC0FC6B58037F447
-45A537C7B8CFA4D8494E737358151FF023B729C6BD069F980F33D5DAC4E278F0
-FFD91D253C9AB617CB9546F992615C1647123D25E8DC34B257FAC60B9B04B7AD
-AE705AB62C31BB5A17E8CDB319B7A6601E8D3A5D144479AD66ACDF016B351226
-80ED7942FB3E3CE3EA9C19ECD870DB4B1E616B0B8C5DF42551FAF463FEF88527
-0367D3C5C0B8D9CC318324D3722F36E62EA52C1C7340A4756C8F79CF1EAE7A54
-66FB610907CCFA40C9DF6C64D2AF33427AC1E44A843D417C2CE47E768132454C
-42BE3CCB830D5BA1D535E0E0A58D1AE992C552D3C0C1A468C79438247FE04119
-7D8217AA8E7BD66DB305893269F99E48A3248DD33444CD317B6B13BC7329F9D8
-50AFC5BBCD7F7E8A625C70ADFF0FCCC913945B53DF83468D72931877B664595D
-1189CF5E16CC19A1C4B0C8A1B9861593F722E654DA0D166DC93C7DDFC391F223
-A9AF93757B01526FC9737C7DFE7258614F23E9C3FB8DAFBD8BDAEBB411E6B106
-280A4CFD7371C884D1CE8710704751B639ED78043DFD06B0CE0EE061E7CEAFDC
-C442688CA7341531833129B28B6A3F012A60EB39FF5CAEF433C13C60A6F1DE5C
-C2E8384E7708B86EAB25E29B10E46350E3A0A01F09F3A1B09E79627A2B66F6C2
-7E5F1C526FCF92AEF1399BC65C6D6C9E53EE1676A7BC66F41F6C97A8507615FF
-4DCF870DE5CF27265693C26AEDE7684882F920B5A37C98F5B3963013AC586135
-B5A5FC99B222CF400D777EAED21F3B0B5EB3EA34FA5333EB5478D17AC7AEEFDA
-368AB0CADBDA738B602D1186D3CAC6D79ADA72D2E1F2EC7107D607B663A9EABB
-ECD6DB66E5EF29F60C54928B28A0BE531AEC484EB6B43237652F9756C8C14B64
-FC229E9CF2CE82018A7F05694FE9234D5886366E342384ADEDB53AFE5CE37222
-F00C4B60A4837F6D2B04798360D2E84ED5EA7A8EAD38DDC0C1A30595FEA4F2A8
-E1EAA5B4AD4C4931B17A971F32A07B9D48DB35C083345DE2F74DC9ACFA988B3B
-C909264AD0E95EF95E475AAF7D3681B4298F24854CF9E93915530BBBFBBF715A
-0D6E9C83FD5E0189D714E5BC01BEA29FBACF253A0A2C07D5774AA8ED1E837452
-1DCEFCCB4D39FF3B748F1EA2A3A02E3E9562814340CB4D01643745A795FF68B8
-7A49AEAB3F795D2887E1339AB5E58E97CBA70D62BC844EBAE6CB0D9ACCC55D0F
-22CAF8510023FC9ED3307A31747B1616A87026AF5E8B7A3882041AA8F98C7FA7
-BD28891EFAB5748F93C9983ECB6EE46C525699FAEEFB24BE1226BE84BFF7C967
-0C2826527B4152ACFBC75CA8AA608C83E650D1915292D51555311AC9AE837E36
-1731A90FC77FDF52CBC5E3941188080B792B57F98317B1FF61E92E6B023F531D
-7BE4F036DC3DF11711ED1FD118CEDACA9A550CB846E10C93BA7037676CAA105B
-33F600DE469E5CD1768470D8A136B0FF623931A8E0861D3A35EE733B529FBFDD
-924A21B496489112F6D210E0E4C98EF989FB07DB5B5FBC228A164358B3F2411E
-3C2F24585AF5EFDA32325B466010F0273C2FD0907F87B16BE8039196B28751EB
-F6DD29A4F455CA05496521A74E3138987C1C2615E049E3E5AB14B54D6E2359EF
-DDC13608EC4B7F0713796C312C08775747D2275EB26FABFA3371F05DD11BFD74
-3512C5FB8E8000D09E05F6871B0860FA88E24A7C5CB61CEA9E3A112C53D117CD
-6B89CFE96BD9EF0A6B9A24261A8BED518CAF65F0797D6CA6018BD6D5598ED7E2
-148431FA40639E8725FEB6E10B48DD8B035D57CC0E554877363DA6205FCCFB5C
-718323B7CA09015029F7C3253FEE03D11022673319FE9FBF54A2F5261C4DC16D
-9ABE661AD52A63710EF6C546A3EE8E0493B7B5808169F2D86CCDD826CD7769C2
-65C9253EBDA76C1DC6A431750B69BD3626CEAD87323BDB20189D09E1740A63D6
-C9F027088E51A5EAA2DFD8733AF1870214AF25EAC63C9F90A55E379BEFC17EEE
-61F31ABF17512798EBC9B4F1C96A58B15238D3B5BE2BA97B48D27160110C60DA
-40FE2FFD4DDFDD4161A89158BEF42CF9E726D5797C91F9FC76CC90D24AF59CBE
-60A97A6494F32B95ACAB0D59F24703A2D1350530678B40D66238B4BC48110DD3
-A880FD437C78AAA94997ED8A49083B9CD843937F4FCA9739F940778EED9413A5
-80BE8A47258282C2337E630F6473CF9022011F683B87A8EA0B02A343AF7C896F
-F4B8CDDCD917248E37C0764BB1E1DD0FD406A0D80D9960C6C32A81E209E6478C
-ACADC1404FB84BADA418A5F950EFF6FB47B6FE500752E1E5923598A97B96E48E
-9417BCBEE2F698FDDB9F5CA45568234525CADE3F3EBCA7D1D36DADCE085F2E12
-B6C6B26E3D70892486676191C73A7035A6E4F8124548332A0354457E2B931A67
-7E15A1DB1C802DF3D27208B0B1C8553ECFCD9B0CE1C2F950E26708CC128CC965
-4420238882E48BE71CC52707EDC8DBFAE2563E66503E74F3B71C0BAF3872592C
-AC12D490F998E2198C8859342B3E769281EDA05289F8A3A4C4399E6F427ECD18
-A8C6281497751515282506477A9E0553B6ED1AA8C89F2EC6D244267BD358C8A7
-27725E0D288A0344D21ADBA5E498898A284B3A5F2494E4AD056DBE7461FAC6EE
-0332E721A7F7E2058C864E02EA3DB74E476A1094F00BD5CE8D85E0B11E150C9F
-95D584C11CF6B285E4EF068C533FD49017A51291CE497F6E336577EEA1C39E67
-A19C2AE6E8EAE3A8658E8174D98289DB1AC6DBA0EF27F2598F35E47D6B94C8DB
-059AA1D803A9EF242F88A7993872A141F97D76B3572CBB811F34E066412C948E
-7B7B22AF31C9030E333A104DCD5F29E649901D9168E330C8BD4DF7E50141408D
-267AE9599099CEBBEB392A28F74CB75802B4AC5DC979A0FCA75EC11F25DAB3FC
-67DF1AF2291A93D469B3278A2DA9397B018024125A974FD7D79D149475726085
-02F30E996960097F6CB908C90E5EF127E5D2543871139A7CB94CBB2A5FCDAC6D
-755A60F53344570C9846812E6766F1E2C952AFBD260D252129CB7C19821AD057
-2DC1737D49FB047C564C4809EE21B6899F02916D50CF72DC0174BB5A75A3DDA5
-74F578245AE90CEB882AB4EEBD1A4533D922197C400A2F651C1A6C5F4FFC17AC
-7AD689F45B1722BECE5F648584C778C96FB1C606DE7E7C6799964BACDFF5B239
-A7D25397BDBCA2DC06B27246728A6A6DF1F5EF6D8677E6DC2459472211A35500
-C8315B238FA5796C2DD19716204C9D6FDC7AF0419A8C3A927250192E85FE3D95
-924C818C60F4234946EB58C7CABDCC0ACF82601468F963C968209AAD57296D8E
-92797D765E68C6B64DB292C1AC7A779FE7B671D505343A2D32D0898A1D90E000
-EFAAAAC89A3BBC3A92B7224E831F2132824875BDB04C318B018B49009FB4D0F8
-A41C484ADE005751538675AF75314008C6F45FBB3B6B73E80D223935B9D7107B
-3D2B8F2D967D7DFCD9F2F9EC3338844F5D1F36E2507B2AF6F33A495CD6701B1B
-76630A10878911FBDA1E8590BB83D5A59A5017A0566974818686187205D6C1E9
-4B8BC41BD5CAAD046F99F989F3FFC38FB507ABE17C03B466E423BE3D38B5B659
-4115B2527B2D3FBDCA1A2944F5C107DFAFA5B3FB0BC6536806F5D9BE46166CF0
-F84D3EA7F0E5A904295F84E63A3A08BC02B75C33507C5F09412242B348EBEDC4
-7DC51DB5D49526AE4344C51EB3CA8CDE0F11F9059E85CA54122ECB587BDC5A3B
-7EB1B5E4886F976037B0D1131D9CCFE5656DD9F88D7E5B099D4862F78B30A7C2
-02B3ACA955C31742B0C732D84629D705F3C40ED57FA05C368EF688D075E57718
-6DEE8CFA86CDA31277ACDCC66A23D0656B20BE6445021E16DC406BB68D548F3E
-1D2CCDC247B2A9171FA02878C108EC0FA6AAC271A82B8444E714360681676A9E
-2E30C41E9A40FFC67C7C9C7FBD10AFA5DA7C228A1697A090F6781F2E75C528DC
-56BE079C98DBA4D248DDF9AA7B6C52BABC2B66218AC0DE509F08A4FCA26C646C
-9972C2CEF664ECFD1D924B5D5D7566A6B859499F6758CE7B762CF986C0736D80
-0B4A4298E5EE920AC718C5B64D5433FF3F9F631E8715ED604D708556781B1539
-882DD8627E2FDEC4B216C62D4CABBB2F115CAC56A5D93EF98E30D058EE634DD9
-95D5D1AB4C42680B3635639EDF9A52E29B37FD0BB0478E6ACCB4C7DBB5F9C428
-755744092BD250A8DDE731265A110615C300DED7F143D52417377E90B91FF8A5
-BAF6324B3EFE85B2AE0423DE309A36A64E4369353E6C2603E802ED31B56E318A
-8F6D19FFCAF6627099C0E3C190CCEC20C4A7DD4B47816D529138E2694EDF54F1
-867F0143A444024E0528325ECC148D779F4C98C06FE9E752C366416044EE3FAC
-72D8AD35D89400B4F00286191C16E16979D5EDCBF4FF9EC868D6E3BA7D98A83A
-0710CD1AAD878778C0A4F0C9829723572B4DF407490D64B5C49FBC047DB49F33
-E824A4343825D756D894B41EB70093103C35FBC09FF55931B81340666A0B50A2
-7633105B04DFB6386ED196F7D540ECAA058C0B44E89141B68CC41FC21BB2C4B4
-4B13E070FF953B88A70B3880561FDBBF309C68F5C159D90CAB88B04CFEA0F33D
-A48D289473545DB928964A1FF97B90FB16C449A27E333B56A1E49386AC738A91
-105C3F6DF518A43C97FDC345F5553842D8BB735C33271A8FC7E3BCB3C662A375
-53B8450229EDEC6156E41584971A159960569DE8AA7A959D328CC8C8ECBC0B11
-DA239FB55CBE641B71150154F8A9A8A128F8B58409791B88AC57AECDCCEC9893
-7B3363B091289345EF59DD66D83982931E090B8F2A8CFE8F46F3978A67E28047
-48A7C711553E9846164FFBBCBCF505F953132F546583ADBB7F0A9EF02A6C3163
-0057C83CE31709A61F2B9B09CDFE58F02211CA00C0672CE30572CA53BF75538A
-57C1DFC3E44012F882BD50D4A3ADFF64D8E09ACDC5FB80CABCC56102C59C5B3A
-8E7D70F350CEBD556CF6055160C1DBCA6411579F959C873E4149A3FDE8836252
-FEEE3A2F3E8BAABDE53FBD71B074FF5F26AEF5A6663E2117BE561B21DDB5BEF3
-73C1365F9CD57FD44C29C00395B7CB0F5A4BD22AFD390421EB238707C3D18BA6
-C7A1B0B95ED985D208850AD1BB88103E7A7837F707F0B824BD1BA350896BC3A9
-88CE5607050B136104344B3C9E999D4299546B7A107E5254AEA34E3DB09AA599
-CBD028178511FF44D04C530ED6AD10EC5C41178CFDC71DFD30B1F856DC2A4FB0
-CABC0906E7682033B43765B5F59F7604BBB01A7D660C3E5BFA8651CFF42936B6
-22059C2BD479060AB78AE53CA8B618F1DD65DB73F507951738DDB94B1B2898B5
-9724D93F9872A79725B86FD72BD7CC1D53061F8B55D3ED5701D99CB24F3F7469
-5D456C51BE9D32D8F101E50CE4BEBF5A8E97EA0580046639EBAB22BA25A69EF5
-D80A9854ADF2C2F754C35F380F72528D1142EE6CE628942F3F98C26EBF5A75BE
-C8F6DDCE438A2BCB35A51DECB444570E36FB2C4AE1AF422C91AC39A18DB9AFAF
-BA33B7C945743E2EECDBB82C10510C7D8EE5CBB80AB3036F259FF0053E1CD954
-650C4359157167A10C67372C068DB33982CB1101757966FCEC872B24CCD65E0B
-E1CA44F1CDB5B42616DEA1E07FE6038A0FBF4B1C314FCCCF8E2C8B96389BB33F
-978440D27041708AFD22E3E2E3D944D152F9A5F2E50A08BBEBADC84A7E0039BB
-4651884B79D1AE90EF67AAC2A94BC1EBBF38F7E4B3FFC5A421EE7EEAD34CF658
-C89D114027B859850874A5FA5620D70BE94D480EF1D2069F64C9E70C669496F5
-918606F17D2B02178746BBD22FB088A7354A811836B7AC7CF69964B01F7B6C38
-D97DDCFF7F2A5BAA1D509D5EFDFB82E5EEC29F2F12879510790882D7A6554A0D
-35394CD4CAB3E352139B4DCB9EB2AD2CD31E9717FE5EC1A5D0CCD89D2A6D9A55
-B0DE096EAD34A9170CDD32D058DB6DA9DDC7A20FEAC9A351B2144C9CE7CCA732
-7F13742A7F0D9A1736A857D465EF44F316F8B165E30106CC22C5255EFAF1C02E
-0AE0B448B88CD712E94BE503D0424B6D2E42CE266D35B246D9C92DB1032E372C
-FEF9CEE8853617CCE04505671F6A2F421B8D86C775BA10ED922C06950EC3F162
-888C5E240F3A4E2B8A1F5584EB8A5C86EB099396D209DDDDF6239D612330484A
-7D1578FD98F395EF6FACD488B64C4BC127C129260C4577A5FEFE60FC476AD32A
-FD26A711ADE1F32F869172C4B770C0CC0456730C5090A39B81CDDF7F43189A41
-A830E3D0875FD39EDE7BE3A37C5DE8BD0D53B2AEC076E977835BCD177D55B487
-ED28D26B3CEB6D86BE909C92C4EE1D7BC27BB10439A27F35C405B76B79C0CF98
-21A58E3E4015E50CE027AB45E1B1892AD44477D37E09AA6CC12065749339D505
-D96A72AFBA6A6E1390A6F01849D607E6DF07B928A490A424017C9E7199573F6A
-8CD3D62355CF57FE164D79903F81679B4998AC7A65DBED69184906D6A6AD7618
-A93DC4288D72AD42116CF3A527E6F6958AE02E2AB2820C4C8235DA5F8C161D62
-7796C9FF711917AC9023CFD7BC831AA847281DA84FC40DFB8532AA9A6E24118A
-F6F0E95313894F71754ACF52FF8AB3C9E48C811D5D19A0B686B8E1DDB9E3DE55
-7669F0BC5BD721081891536D9FB45D5FC6058F768007EF51315A619EB93AF0D7
-74DA6F7C1F0C419A0B623A2DF8AC5F81AA66CB8EE50B69CF20B7CE88282AC1B9
-6A758573DA78757BE583FC05245BC6457EA6D1073FBD3F3F506139D493E56B05
-EE5897161C99CAB23AF97135F18C72D6B0F9802A339E3576271AFC00F077075A
-3724F96F7D1904838BD92DD6787D86763B553822D81E63ACB53EFAD31981B71B
-BECEDF7DE2AA12ADBE30A544CFF6883A0869631F70F36D931E1077F8788627D8
-AD4868D51502C35C0C3697C811AF509C526689FB4F8139772964F414C0F5B120
-37C04E77902A09414406E447EF46510D80B5BDD17B712A5137869B813F673C63
-988A772C0B49D04118B5D5E5F8D07FEC3E8000FA1FCF06AAB49BB73791E019AC
-148BAC5E4269A39347ED188848E503E0C04E548D4C5E0D1FD132A3EB91A9C92B
-9218A29580F6A99352F46C747C29F87EEFFC7912B6A60426BEFEAE7EAED1AF22
-C757AE1D228A336D999E620934AE9D1C124E4190BFD280B24A40E8519854D386
-8A6140A79F2C1621D94FA49B4B869DE236E51FCCBA2600BC7BA951EC067E6759
-C4C616BA9F1AA22C72DB3759A24F77B63DAFF16785F0AD51B92DE05BA3634D4B
-941AD4E19379CD165BC655EB7519B58608935196F2DA9F17CC2BC1238781D29B
-EAF0FFF3CF529CF48890C17CB1D97CE95AA2BF2827B43B39C8C61FD91E7BFCC3
-85A92AC0528C12123EDBD7E9B1FE798EE0CC8967CE01D19276E8BE4014A06868
-6CE0F5FCDE2256B8D2FD077945BFB2BC23342E4EC323FA864567F8867AAB0196
-3946CFA77BD98C46666D80D4C67808DBD53B407E80CEF7DE3E9120E2AF3B27CC
-4F3201027C39A296C1406FB76BCF9E46537DF1D3409812DDA774C146E135BCBD
-62E1EBEF09C3472DC0DBB9CE13B31D15516B50280B3C09E9F6EDE5B05B8D0B4E
-C7AB274068D129951FFE53FA5F0E85B5F1DC12382F11B5225FEB793A1EEEA45C
-458B1EE64C7E2A787674140AAED80C0521469C3469EEC92430A9E3ADBA3A094B
-73A71FEF38E2098E4B882D171524BE3B4BAE4A568846BA996347E728580F6AC6
-EB4CB545123E55D0EE933CF9CB63EB60EDBFBD3E972B544477AB4D68826331F0
-4F8AEFC29ABA9E1D6EFE807CE2D7E8BF254F153B3C9BCB6507E89B97158EAD5F
-4224068DA7A1686B8DFBAEE60EB405CE71F71B4872D396FCDF472EA4CF3E6E61
-7F35278F1E7B3ABB2714E1723F5472821674C130E7301D598A6D1CB33FD3A94D
-35F73E34AE11BFD6070CDA2EA1C994C0AE4304785A70A38622C09D47EA08238F
-7E497A635032592C8E28814D114AC8D1B9FA512FE66C692F75E42B67E51E18FB
-3F642D14C8DC0DF74FD81A594376BB9B7DBA9B4930AE048E4344476943D31F24
-35FE5CEF1A0BFD45EA5C43BD6700A38796626A1EBB23A3BA4B7C64E1B145FF89
-E1E3CD5F27844E66E9868F13526D31B87FC9DF2676E7ABBF3176CB2CC698BBC6
-23D39533FAEF149531AFB05826F48BD2CF8CEFF48FDA67C72EE1F32E41745A79
-C96B8264CE368E6FD3DAD0CBB224F8A9525C6FD720DEE0FD278EF36886ED076F
-EB24D1D8B69C456A9543F4543160B6BC57D0F396BCB5F416EAD863C35BB5DA81
-B218D99B5CE34FA719E6C67CEA1B25DDCE2B019208C1DA5D9C105F47A382797C
-A73AAA78B4F33F509E60BA34B4D5D55756639BDF4761C9F221B09866291760F0
-4ED5CC9406061F7FAFB0B6F93796F64BDC05277FDD466DB850B5ADF5C6E293E3
-A6AF3C0CE77608F2027BDEAE4076B776AFD67A7BB7123A1F2F1F95609779BFE2
-9C1E085B68A4C444EAD8ED8E3E7F08CD5F90D12C96005EB144157FD1A85F7176
-3090740FDF72AE20B73733DB0A0A9ABAD612F6133F77DB8FC48DA198D73C1CD8
-797C02A00B9A6343D43D1C0B392047C71EC1D62B5308B76936F64EAEC52FB0AB
-A53516E6BF2189E657E6DEDF0C680A81282F877B0DB2EE045919FAD21BD4153F
-1E3B07E23F7C13B55B47B85E99E93C6C64D7132245FD325E9FD9C6760C01C8DD
-61930D6F4BD6C59F880CF11C3F1588E72E98F80140F43DE93ECA43931919237A
-2450397829719ED4E34241D30FB4F5C8A85B1A85FAE2305C47550BBB555EE76B
-DCEBA951B61B0D3A7240B105695337170A9A56468EFEAF599FEA0CCF01A2DB84
-25319E635B3EEEB2B1A6ECFE58E2E387FA5996D311B87ADD09AD373BE347B291
-140162A7BAA5CD747ECD0DD86807449609C1B86BC5CE2A087AFBA83091CE4B0C
-49E6C7AE1306511A1BD1D4FFE475FD7501461D782745128DEE7C1BE525A3B04E
-5208CFC6600196DE9ED2E7A7E20E20E29CAF5019130609E1D3AFF1DB46E12579
-1BCCDCDA2A43E93CF68534225DD7CBEF77AE71AA22565258FA39AB4D9448D462
-326182601922932B23CE0E2567E30BD47772A11D59E2CB15B0BD340C0657B465
-733E5D4BE23D731F0AF280EB827526F9050776DD06C6CFC96318E91F821952E5
-0CE9F613F0C595C55F7351D7D4114D9611AEAE733A45A7F6645166307E210930
-0F1E4F7A64B77EA34F19A5F52445EEC38EE28EA988EF3478F03929AEB7ACFA8B
-12AF9CD3778F13FD2ED625B825053F2E8532562AD65B4BF0C2631586E30FC27D
-D2B5830E9EB43090370C658E1FC9606BEF5FD9CACF8FF8C051EF770B95C419EB
-1E21C8D10456ADA6BDAE7069829B6760DAAB8F4772B7FBCF8A96F691BFE6802E
-F9EA5F469758411B191623A09A49B22E042310EB212894282C023852E11D1001
-225FBF626AE3FEB4F127D055FAA2F1D6533FE15F30ACDB50FDFEE0BAFB1D4CD3
-FFC9A8CDDBB834E06F0A2009E96E82EAB4364D42897631C46797394A1745A3A4
-45B2551DC83AEFFAEE4B19C824C88804C8789EDC04A72079561B851853585AE0
-E4DC3FE1515E0751FFCCB8747E05B3BF7DEF41CA3B9D17D8A3452D965E7F1F0D
-1770F771EF9B8CEFC746F42EF799828CDF99643D61F02064D472E5CBD1F01AE3
-027615C852F4F2455711D642C5AAFDBDEBB87BF4389897DD96F463964E84BA09
-75778F0201C395B006083E068C1CE5EA1725AF409C9A0C9AB1DE481F85511594
-79A3610A5D62625D9177B7DA0E2345FB16178DB9AA58588732C48BE70A5DA581
-EF630C04C61499312B2C456A5AD7D3EF4B6BA25A17E8990B9351A5232F783D89
-CBACBF1100EB449EA090943C73CBFB94AAC0D8C675D84284B83B4871F7F1F37C
-549C0F4194C12B2FC3E52D8F89FF2A8D18EBE7F270B786500B3238D7D8100CC2
-613EA077722458508F6DCFE09A5479D450B795A1100FE3ACD3BE0EF191BC1625
-729369ECF1EE49693310F8A241EA75CAF7E4B2FE14A91E9F0C13955496FB03ED
-E8FAC0DDC571FCB38B006A186E9642B6EAB0A7CE39B67112D9F83651A6E9DF2B
-9F6B6046744A77788DD927DE5C22FCC918C93C7B42C834391F8D9AC89A2D20A2
-1D979C7D6238D4D8E28946FE336A43402F67BE9FEE64B7AA3F4624358C09EFA6
-99FD5B78AC68D5E3F1854767BBD97701ECFE92107F6E51F00D0245484732150C
-C33E963DB666494C895F05BECA73B88B7043828D0637B3986372F28F1DB8D68C
-0CB56793D0FB42444AF9F77A634923A09102AA77F2A5A36330E8B946806E57FD
-47BC5B0CD1605E564AC173D7F3E1E19870DB668D87CC1A2BAF539925C1BEDC28
-ED5870BF8BB79B0D31DED055AAD85A6D8EB98D1DBE04F10FCD01932867FE787F
-1CF53587378BCEBB146135335100E2251577F42387DF4517DECE711E8A65454D
-FAF19EFC6EA9CF50A4FE3DA6E4902F895702F860AF0A82D47FC7E7C4F3FDE9B5
-091A7AFE227BA45E85679CD34B38B14BB824C7B499590C9DF82C7C11B36354EA
-F2A862100807308908B088EC066B2B20410914056F121CCFF70EAAF9F8C37D31
-9C09832C462EB0315DB838D2E2816528FB8391213B9CB687ACE34E6055512C6A
-543284441527EA2AB308D7FBB8BF137D201042117527E548909E3951A68925A8
-1F741254040BC520FE89B7F675EAFBCC1C2EBCC6F55BAA59D211572056ADFDEB
-3CEB28BA5B9987C4E5CF15A23D558815AEBA5D4EFF8B04D2B9A07F9EC3195A8C
-BC8E5E8422BB1150444C5683471207E26BA7B42F43583DCDB2868337362887F2
-8947C359480DAD443D473C61C4AF2E6BE2F7BAD06C79C102586C325EE523F000
-334B1AD5F85E52486C07D5F2B88CB36D7C5E61B421A67F76F1705CE79FBCF403
-FD73DD06D579EE0891AFA8CCA2002D031A2791B5747BE3FA9B7053DA6CB943A8
-8FB3D8DF855C16A641AF1B9E0FDABD84A5074B583202A8C120405C781F2A591F
-F44D17300936BF3C77591752E3F3FDC5C448910A7DD21F2C84F1D44BAD9C7EA0
-2C29193B42734103C2EE5A6A0A6B3F9A668D0E58B7450450290C4DF4AF6BA8A4
-EBCFCBC4363ED8209DE73972FF2DE7872AD38ECF92393023354BF50C918F84FC
-8EFAC13B94DF583EB1F6E02ED73D73560DCCA4E2F1CE8A7EFE29988616867139
-FD6636485328F32F2A9C2D1A26306936ABA671225CE1685FC633E98F198AC865
-C0ECDAE559DC639FA8D0D9BD2191C97317C07DDF2BEB1B8E6B0A2F4DB30B11CC
-FC7CF4D9EB529CEF39C017E332079C03FDCF16EF57F51CED595ABA70EA35E643
-88C4313F914D6888DBE345B1E5B97DAA93CCA097E330D3CEE75B91B36DB308BC
-EB676516AC72507CEE7469A7DCAD6E98000B1E3C77D8A4A4A1AA3C31AA384F2D
-2BD50F44E9CBB4B5FFD65C4E7931BA8930920680537920623C80A06AA95EA0A2
-DFC56A91E877CDC9E57A201BB933B4B15710CB4C1BCBB88AD119C273D9238020
-24DA817F6E77BF55F12E9F61A1E0D2A9DBC432E0827AD7F023F1DC6C82984F68
-F6F778AB1DA064EEE453A2C148AC1FEFE43E20392D59BB8898459A11D71F9713
-610A22F0DD1797E87854B0922FF58FADA2AB26FE02E9D6838D4470B8E16DC017
-874787097C64EC851AC4BA343EA6D9D1E0442F0A8AA1D6AC71C79443563B1BAE
-B4B159333392763A0D17962080B8243A4A6F11FEA2C8D5F4BBD4482638854019
-DC1BC660974B96EFF9C01DD2797B1E1C8E0CA2905F783B042959701A74AA8023
-CF44AD6A3C0B7414D41BF9E330C0EA9230853322C41F8A40E782AD8F4587E647
-EC3943D77A2ADE03D8FD096408B4085690CCDA8AC71C6C11AF690D8C32036AFA
-4ECAB5C1F31B05FDF26CADEE15383EA1BBA59FFFE6819D3155FFF76BDBFDEC24
-5BE59C61F3F0D704DD0862546F77DCDBCBC313B354481A9D529C4228E0E43EBD
-1BD15B94876AE370FF835434A588E4E8757025F2B1F82CEBF20AF28ADB8ED79D
-2412535DECFFE25B2109229C9BD3AC9A06BD241F9284EE8FC77096DE5EE21BB7
-7A7162D9AB3D2CF6C100D66BB240E43992444151A9ACC99D10B232B4E400DCAC
-BD38E0FABA6F475E6FAE28448FF34EC8C1656A1CBD27CD6561F9BFE0FABB1444
-2C25908CB3D14B664B3E9BDA6F0EDC8D933FFFEC2CF1A4074FE4CD3C8E72EFCA
-925FB57C53202E5F89D8CF63DCB5EEDC1AA68D11F263359B84A3D7F9AEEBE5F1
-4FF089AC97F1222221437833F33C06166B8CA011A5D2F9DABEF2750CFC00DE12
-9D26BF74021ACAE3AF901CAFEF6BBFBFDF7A496A73BC1F495D0F8AA6979EB23A
-0E4936B95B1636788C8937078CEF6AD30F0794115E019D187C11D6DCAA187303
-706FD91D652D41AFB4E012DFC5A0F78F435FCBE98D433CE9C7DC248106C5C763
-AAAC5FD1DF5367B41E004489C01C5FD3AD98B8EA7FCC66E1B552A4B6FF2AB13F
-93AFDA81E74C7304650C1CC7E0162AEA22A754E413C55D571349758D8AF0D508
-9324F516E8D4FE7CE7D0C2A574E959AD1DD3CD001E95B429E4FD1A6CB65A6133
-EC9893F1A7F476481D209843208146D10F9A4F0AACF2A6DCD4462CB4FC9D926D
-D5AC6B561BC9B0CEBC0CA2707AA010C66299C1DB237B020DED71DD7D80C47732
-9FF3A32D0EF7042C4021585BBC826038D69CB48982BD348946F44D80C39C26F7
-C15EEABA258F8095767AA5447F6A9CE1D43D6BB3A6B205B8B9E8CA81089CF71F
-5EDE578C4C244D0E35599CD00FAE11024952E3ADEC2ABDEC90D2FC76F9ECD6AA
-A6B40D16DF171738262230DDA062E9154DAB0A506DC761E79DB40C7F389C6E8D
-71B5BFBF82B224C4113A8E4580355E0B80D408B1D34F55E3586E9E680C689413
-5D584DBAD8258397EB0EC2EDA157621F90CF742E8F98974C36E2B1DA6DB71C53
-02A1E09A7E162F6E9B23F0CC5CF025CC9D13F55F787B2B565746C2AF129F0F4D
-3E304C56F314EE80A250BCBA45112194B4A3D8EDE0985F9067493F095520ED4B
-7F1CC08F330EE6F17DB5EE43DDC75AF55B1EDD1B41833FCCE5E842516E49BE84
-611BB71A150B44FF998B5866DA29D7DDE99D9D63F862EEB7C935216E5E60B772
-43800ED5868AFFC2CAE01F16B50902B292C2BEAD2EC5F7AF059BB8EB0CB73C0E
-EA8F144F716F3565B3CE4B9597B7C0257BDED508A600D3F1968CDE4E3F773F72
-C1AF5E675E3AFEE289515A32C4A4038E0B01410B58AD63AB537FC501F3470514
-A0AE66FC127777C616379F2DA2307DDEB634C5968C1EF03BF7981D9D90C14E37
-AAA1A0C76CB40A95B77D6ADCD43281E3F680AC687F859ECF4AEB35639E1B04F5
-3C88A52BC559DDF82BDDF076E58368AE6C8072EEBE110683B069FDE3BB0F5E38
-A3EB4E820CC8B98E2716D27925F5351C3B3ADF3D60398813106BFB474617EB33
-12C56B1BB2D743E2950677BB680C01DF42517D0E7C7F035D968938CFABD07E38
-A86BF53ADB0CC8715B052FCF6ABB0ACF56456F4F88C8D0E17220D88C82DC5087
-CD762D2538E309B6BF33C1F9B449BC0EFA035DDB9D4ACDF95B12FCA8BC429A78
-FB6CF03BEA0D047832E23A3A3215225CF76F2C213C92D706AA96182368F64173
-AA1D106CD441938A5BF7218EF0E1B73F2AD3AFF7C87C580B7643BF5994FABEC3
-CB362FBEFE73BD731ECE265093411559A49A5CAA01C4B55BF0E4CD7EAED28FDA
-8C264B62682DD64D12C7D9BB5119269DB43239AF2C80AE362D7716B5E49197A7
-F25B759B90DE0A436703CBCE72C472C53D842364D3BF567DD3F7615B29F2D02F
-C4A8E4603F76DA39138CF8596733947EA65F1B8A55DC91FCD08425B2DCECD526
-5DEB615E7DEF0155ADA336A523D0974D4D441FA925CD876CBE1A85D644831ACF
-705ED79DFEE14D519EC7930E4243D38E86CF01F355E675E9BD24529575FD4A6E
-2187DB6C8AAD53613FA7FCCCC6146E9F99DCE7B10815B49659D24880A949E036
-C849783186B13EA91A595FDD1FEB4DBBBE58C512F89537B27A2BDC4B568D1E38
-02916E8B4AF4A537C19453F94710478DCB89743D7EE30E15C165C0CE881CA43A
-E18E3E98BCF0423223E37C9407A872A996901E03392F8CE81A928727FBC9BF85
-6DC374D2AA3B2D2A82CA328E4F1A261B3EBEB470E5001274F564115691D01E8C
-A7480387E7EC74C5CEE5BDEBC0250108FF13D87C71EFB1BCC9C5B8028D70A79D
-0D2161380357E0E96D15597F673722E535F7C459F2650AA6403778C64F74F10B
-049AAAC72E6A409ABDAFE7C2778154D6E920D5E2AD710CB4F7CF7B52682EFB68
-FBD7DE55B4B5048A5738A329842AF53128E3A9E89ECEDA65B2B1A634EECEB846
-6D7C0E11933A5278BC377C5A1F50BAD2DF04CA0AEC47908DC12CBBFC367448EB
-7FE9D1ED7F2E13E35CA8E6FFC9734CFDD15E5322ED7D476A537FC691DF5B1CB7
-9C8396431356B92F4DFE47212F403D0A60253C0F0E7BD7768B157FA239753729
-CF0C82DC68EF1B83B56573BCD38C5D97A3D3889C650AC889046FABAC4B55856A
-858896E794BA81BF7D3917884F4989C120FABD9D82698DBF7ACA6FA03B7DE0B8
-DE93ADC29B8FA9DFC15D5B6578AD6CD89DFA21B2E0AF7F0FFE862D1839882472
-809FC43C5255790B323AB759EAFE0928391A8E87F2C6E50D7A7B87E6464EA553
-A1AD7FD38833956A136AAB9BF20ED42A2972FB4BE9186D48C3759D0FA38DAFB5
-7C4446C3E4D0743817A361984EB4CE36EA8837008484F27750EA45BB0481B07B
-CBFCAF075117CEC9C612DCF1F281C265177362A12F586DB66B890BFE45F0A5BF
-D0F433D8C3AF860D3423F6D7515192AD9FF0B5DCE2F50074BC2FFF95AB9ED49E
-73EF0AE628B503E7EA97A3B3FBAD0FAC2857BB8219ECBB90CCCC74B111A74F84
-2960056DBCB65504628C56B8E5F887912C80D8CFAA2226E23588AA243C14AD88
-BB92D576D161A3C23D065EA003369BB7E2DC0423609C2591D4AF74C86D998620
-B7F6BC6162BB2D98CA81222349BAC8C5E6A3F3170713B188FF08B8C40FFE0B2B
-DF51D256BB2A08D1FD0890BF51EE599578E189A99787022E19B8F44E8F0CAF54
-BE711062BBD9A270D1FF131D69F1ECDEFB84CEB2CB1AA8A6B474683911C895B9
-8CB36086B59B54B4CAF966749A2D395FBE6F4DF81F71E37E6A0C5AB70C65DFED
-CA21D87FE11CB967AC0E11B70CDD98CE389DAE41F21C429D57482B736EF9CC09
-16AB1D0E877AA92557D24375804161A6C1AB7C8912512BA2E0D0B1288A6C6784
-9EE2F3573B32873DDB0AF81C83B9097C0E4E5A62B6E324A02E19393A2A344DD9
-C6FF7B8D8405A6985F1C82FEB248BAA43FA630661F9708A1EB25A9C8EB93555C
-5878D5CBA73FCAE33DCBFB998B289E2204D62B8463AEEEA2DBDB450D6DB0AAA3
-A4EB5562F40D56A252C5D76E71CAC523C34F2A3CF56745A909C79A1A202D64B9
-EF5F98AE02CBC7B9B4D6CA1192930C93E9516C7B8491A38254EE14AFAE4C5E3E
-CD9560356BF0E1BC7CA29753C978394A4B06BC0807323267A97E6AEF0EF163B4
-2C92A7610BFD6257188892B55B5BFBC1802B0C648C1968AEC2BE35CE5788F7FC
-9FA1A42826378BA3F5142F8C9DD8FE321DB0553838FCC28B2191A5A26154CE54
-AF61C72B0867FBDF822FCCCE8E08E9BD728A7D063E3E9AF29BAAC110B817B34C
-A5D9B8A61CBBB74DF4FC0A490BAD78938C4694B26F84DA7A8A241FE91471D2F2
-0F1228907E852BC113205EC367D43A6BC47DC77742A8C0117704A0BFE29C1EB1
-8E35DE45C4FB9B4E48AB4E9EC0FA0F0A33C7197C19B41D2526E74040E6E7E797
-E18A45E86F480DFA98164CE339EAD8533F95274C13F26F1433D7FCAC9E28CA00
-5CDE03DCC7AEECF7FBF442840845EE1E17B58D71E9D58456CEDEE36A57C37EF1
-7159E3841F282ABC7E1C66594051DD8C7A9E7BE73C987E1640F345DF66E42360
-65E4D30006179A3355B7F0C54CED3F577A82D30E99617E52C0CE533016DD5B10
-211A47C3FDA4F9F7B54E61BCD46F7812A26D127EB37C047B67D547E644CDCCC9
-97CB89F6FCD4B80C83F15D5D280999772613A4F08F3620894C7C594C115A5FC4
-A0699C5A13F5D846F2220FBF86F2AB4C209F8703659389AF32991377A3E7A38F
-5EF88E603CB754D88E536CA1D071BCB9E9ACE9D737B8430ED73A1642DD094D87
-CB2E636ED90ABB1FA9612DD39C767B3C0169FBA67B3946E1E852E33588B8AFE5
-D593AC0BA2A92D76758BC611F252B7B0C00E0274BE5FBD392EFA86EE49473788
-BB5C80A82FFAF17372F480A08459D6E042361ED54CECF42C88523EEBFCA805E1
-E59A1743234BB6775AFD46BF07C533588E38634FAD480E63002927F24680B547
-6C63D3A937F4830D31E7689E6D422662651CFFCE6EA129C04F632D88FE43EC27
-CBB4BF4D4232D3DDD19599026EBCBBF47DA6C805E38AA6C11F1E1857A5E8F1BD
-4CD21F360419A0F3E555DE7EF68DE7E081573FE845402365C846F1F6B58477D3
-1259A60869E4B93EDB66C10D6B0E46D55D0842CC47DA05D21C8FEC6CB299409D
-7A1BB8B99EEDEB3C4F10A2699458F19C320F3FAE9CC6350CA383DDE889047279
-0FA91175252A42834BF9BF5D19AB0032B8383AB056BBDA41480F476835457F53
-D1083B641023078AFE58B2CA0FAE3832ABF70567D5E5A0EFC39C3FFEC8A3B2CB
-3624002DA2706BE3AD3DB339BD43BDDD9BF9D336F25E572289F105F319A4FEF4
-60E799202F759DA96C6489A228EEB3E975BA1EDFE6BB1A13612BE4A5B690C615
-97445B00FCC75097620CA90F06CA1C58AE637D12186D892295FD5FA126CE1D76
-011AAC13442F1DAE04AEC3E7A5AA6DD27F26ABC69EDCF606C10D34B0F32CB8AE
-2B0D21CD02DD3456FA3BD023E4E92233AD9F24146B7EB0C2A68C49FF71A01FC2
-2CEA9C5FA57F09147C6DCD8D3A4A33C1A70000B334527716C12052092B10E905
-9F22B1E3048E68EF2525762163421C33A1CE61D0923C75E738EA9A37DD3271C9
-AF4D55786F5BEAD707EC8AA26DD53D88476BECA54403293E8CDB02A083294545
-D4BD7DCBC7A73C480D4F3A903AC85AE133384CCCFDB357FE6B6B341FE71E4A75
-D283D1511423A2596D7543A293B4A6C26FE21040F0A3E8BBFEACD0152EC3F190
-ECD74D3CEFFE9C3E86402D8B5923CA46C8046AA3C6DA39983B645808F97F4332
-D66EC475C8B93982A7EDA2BDD0792B332A9EF932DCC11191E399900EBC05C3E3
-8AEB4B4CB9539D6D209EC0BD5C49AD675409BFF8EB2DAA5E425D4E65E06A2458
-F0C4149361EBBD54708F4B4EFCEA571DF325AF6835652E7C493DCCD8C8C2F01D
-382B800240082986A52D925D6F804BE8F048CBAB7C60DD389F7F3501121E1752
-AC0606E26537356594F6DB786ACC6152D194496812C20C5310970505EB0C3EE9
-73C5AB36FEA992F2ADF54BE9CF51B77D4B1E3E63B9A40E2D701F904C5E0259A3
-14C12EDB20B2F5D534ACC7C3AAB655F58C73659C9A177FBBC40963B6ACCEC0C0
-8BEE4D7EB45D68FD74C3E8AEB3D432CCBED396C3EA5F7EF4E40A8BE9353256A5
-25F88514221445F3373BA7FA3B3D360E533A17FA74D1F63EB847F313EF4FF04E
-62E3057E60FDC0DCE1E8DDAB7B45678F68D90680E750DAAA3BB7DB64E938D89C
-6246C43EEF4F68B65B0A8704B41882495F83742E12B2EE017B1A74DC8E1F4761
-576DD2027EC0F9C65F94E887C1E82D403879FB4DA7CE46B6B64B03541DDF3788
-6B417F4557B029C1A5CA503ED1379FA986DD2ADFE5D1CEB12F1B9FA0B4404132
-FDCBEDBA2693C41F999E5FED058098745312F520189CFCD89AA7EE42F2BD782A
-FB595F059CED0AB8D0BB55F65EBF29D89E023070E8A35964F7D8A8D5511941EC
-65C5BB39B27168C392FA68D211056BA38830B5289B399927BF79BE6733395940
-DA32538EC63BC1435F6500BBFE3641B96B52D46D4051E393D302672AA30AD51B
-E3E6E133CE80E6E9A7D979C63F324C99B5A6FA7B8555F35891AD9F60942D4085
-68A4D12E945BAE908F2C71993851A616D4E69E27F30441466DA68E16C74BE058
-C8920C64CE03667344F9DD28EDB24C5062BA27BC75B924029E5D86636A0E347E
-1B41D41B6556EE350C0BC921F11232DA04D5387176DC11C4CC64E408C164F8D2
-2EA268E517813474172B3787747D4C12DB61804D93F3ECB81A52329B87294C9C
-DF2AF75BC8AB538565E066992E8F6C2BA4B89D5DDE0CBBC202396D31227C777D
-60D7D5905ACF8E02AA26DA2E49BAF4464701D01081E206291FFAAA45C5087028
-AF59353DA8569D6000ABC1B744CCC4C0A8A391FE1FFC415EB4901F950D0B4E7A
-89C6F634E5410DED1B428A87EC74BDE51BB5EB54AEF68C385BDD5ABB283D390C
-02BE931669CB603C063191745F913756B28E81DF6B3760804300B01C4AE126BE
-C558B85BE08C2787A930A944E9A6F7DFC85E7C243E4BE99B57E2B120190708A7
-60138412969D73387995B15583B8C2B3BF6E14DBE22599859EF551E741B04DFE
-36E53F1D04E091C840C1A9D43835A12F4244D4D694D46B6D3376E824FD3C50F0
-D889F2D544096385C982B5004268D199D46E56051B2C46BBE23F0D1A3DDDEA28
-1E1B0A24C80A82C2FAA2732A5B9CE81B6D22EB77ED0EE9E3E1F89E2C07167A86
-839255DEF07653976250EE4839BF800EF371ADB3B19F92C34193399E6C2B005F
-5CACCAC594DE4B92EFE30C6E891C622BE799804F691EB54BD12E95F8CB57C618
-8FDEA75A9FB8B65F3AEE065B9B4C545AE70F9A1925A0D7BA9187E559E85C317B
-F1FB71EAC15E75E1E93AE8D29A56F4DB65684D6CD4AE9BAA74E1C57914BAE369
-17C403097FC47954DEB81B049B99B80B9B2CB80B709FBAC869077B9E5279888D
-987639D5CBC79C8102FB496E5387450808238930AEDC3F2A13558E56C9587723
-4F9FD604CFB9831A34A560E2F24187FD519A3F2DFA87541E4DBF75642A4044BD
-B62A47799D79B6A6341B2741018FE8640CB8129AB492355B0CFA3B4C7D0B8794
-E0BC808057F439C71057A5E15C1008793A9733A0007D7C95C408443F851CB1AF
-B2D2DE86AE8BDD6234002311C81AA07E10B58AB87784DC665E498DBD1F19C7F1
-7B3278AB45C358DD71821ED3428296EB77771E230F82933E71A99662199DFA5B
-2A7988C4060180B916EE8EA9F4896C0975AB0B33928BABAC1D7B08C4C80984F1
-3E1EF19F0B8B61ED8AE5B5325EDB72234C4966B0953C463CA79935C22EE21855
-62C316E3C26BD4CB68482CBFEB2BB05C353F1671EEDE4D30162472879F82BC96
-F9C32CAF2AB2ADE3E14D704A1871E193BFE97F3CF8BF9C5E1806446FA2207B68
-A1ED6B9EC3C914689F2AEF2436792D25A7829C2E7D53ED15ACECAF1E79B589F5
-90D80E0A25DB1F40F6C1302B33DFB91A933B888EBA3F58D267884F0A4A0C675E
-5CB0FCE0AD0F58B692344E2A3A20D657035046173A346C1ECA438BF92F75A047
-89AAAFD72B7FCA447146245D10B1508DBAC840FA1D52DC174DF2E64D6792E4B5
-874DD42DA10CF5C2F83EDD54DF2045F1E40F50F529CB7F9375BA7F5A57D0A5FD
-D958183A252FD7AB88F9E2C099F587E716C6ADAC29A90619CFEC1E9E6E63046B
-F688F7DD7843A1216917A0146C248FC12126E8DD38E27D05E8014C7D5614C661
-F102BB47A24CC223EB05E7F5A7F33C554EE4B5E6D16087884FA939D3E56A0B7D
-1E3C9E7F6C3CE95369FA6796F24B5A11CF30FC93160366F5C2EF4FE1D6D1EE9C
-E21AF6B09F1FE1D076353801D4799A38DEA9D323E8091F591884D471336F0BAA
-8B353ECD3B7E2FC36F5F4C49B6ECA8C08078F857F919BBC14A2B51B239807698
-37764DC6C7BFE510F180C63CD0E1A9B001DE2C50CD99D934B71D9CD633F40341
-4C0E56063100447522DC53346428F562E9F6A2B4CE6644EFF13BC5A1B0C1E75E
-659F64B4C5D31E51AA2DEA57882BA22D149145FD316F928DB46E680A269CABDD
-196FB35A49DDE6F4CEB9D61654CADB3B9314EC1C0DCF0DF00DCA92A944BB40AC
-31F94EA1FEC6993DC4E8203E6C850980DAC682B04D2161AE3F9E22F34A874A5C
-3E24B6B0C44CEDC23380752B6EF7601670B58C4C9B25728709C322DD98DFA48B
-C965B6A283D7ADABEE1789A8BD54E14E6B2D6FBDBA6E19A7DAF45646E036FAC6
-B761AC1BF621780B92CD97E068E50308D5BD6CA17F8BA70AE30B9C5F07C2E8CD
-9D4DCEB6844CE6F2241B1D19BD6A1FC5F28848DB10FEFA1F55BED0283AD14588
-7051A33C3854718059920BA88259032FBF481F0F0A2D1749A867BAE63B0F6E92
-8A4CE00F73742D6D07DC31932D8526B78A806B1F242153AB3F358ED69BCB9A9B
-EC008CB67844D943E1BD3512F47A81959D74397B05AA8F412A5DAE4F657B4738
-A8B77333A3FB07ED1BF72DC0BA5CA9BFA3E74AEE58754BBDB7D8A898C9B111E5
-194BCEA1DB2035C3B1F6E012D22785F9BA38FF027B3B622FC8F0F256787FF91D
-FC4C9F64020219428302102566BB6A8D572450A2647521DBC714D7C886125239
-1001F1C8D9E928873665E89A043BFC9F4DBC8DEBC04E849B1D52B3A9A108FE6D
-09DBF96DEB165F0521B90C4DCB60A8187288C400B85E6013ACA8227AE83A8DFD
-351D6C8F863197A4D44798FA3A292FC2B21750B077E9B9670D25E023B2A6C14C
-A6DECB08D3C3C61FCECEF890F02B6442D0D7C0D419DA2889E7FDC3AD977C5643
-3E61C6793A2729CD435B3D4CF67A92DDC450CA6F4328F028A962D0783EE0DAB2
-4E9D496FA28ACFB0693355360E997D3177640A354CD8DCB8263F18D621218201
-D1E7F6C31E8F08ABFDA261B7A3512C784931514773B16F92D04FC11B637B8BA9
-BAA804CF55C126CD35839A50A81B00ED35C3D32AA64BE73E2D4587025FF23A5D
-ECD93B1298492A4FF326E74042EB1DC3E98B4F041F17F341F4277AE117D6E4AA
-BD76023649042985D18C3C28C0FD330D6F0A74778787221B325C4D810D6D87FD
-8EC7254D1AF3AF46C2BADE5D292225744945CE0248AD303DF4906E0402159D5D
-BFC58DB629CDE8E81B6EA2E0D5B50E1C455E7AF6B3368627BB3FA73C2A72AB31
-627AD18658C8BFABF0D7B2E40A9E1490D03296AB1792E160FCCAF4FEF84B71DF
-E284C03E87F17D3A440990652A9503B2C45D48D9C8DADD9776238E22BEA1C4A3
-AB05918672D6EC5426E06F688C42F4755635CB0F5C41694DD9B07C5945F6F7C1
-EBA7277B32C92E6754970F6821B217944E09E89A81F325D78AC5AB6E1F9A1FA3
-358FB78159C333EEF87541D46247902155B6DF41F1241C58197825D3E2F8C1E3
-9029904D5203F7120AACB8C012DEE6460257727E259831BF7CD658197343C8CC
-9832FA2C62D730D0867DA1A688C38436D26837794BBF6AD78E3A8820867CF045
-C9182C904A87B9F542F4CD87E315C0ED1DC3A545D043C2F337312B0C70144BC1
-29581023FB0C7E114BF72C0D010B3CADFC79E87F303F0AC7FA0CAEAF0A927D5C
-A9672235B9E3F4DD72112C1273C8AADEC3A8ACEEEE81927E3F314DAD0FA7F412
-D32ACF1287D1A500730D8BF20E290B2DBA7DA8A778BB9F206BD31E2989DDE5B5
-D5CD2DB85EF2834448364B7EA6DAF3BA0088D9D9260B6A44B0E4C2D3411E3F64
-A748ABC0A8E9BAAEF164732816DE572EA825D945F4E894D7D2E3CB36961EF8C2
-853D2905F11FA8AF17763C31B7216A8E6EEE28F8F3E8A7E9345D27B52EB6AFC9
-33462FD5A6DC850EED8C4F403626B1381AB6AF3D6E8BA6BC7682095B180043A5
-6DFC2F7D7304C905771279E71D05ED597285452E06928E3183F91589774DFFA0
-7344946AB4081EADDB102E205A17F49FEBC1702E33942F5260D87DDF65473622
-8218C9F68106399E2AF3EBCD07B6B58284CC3F4661CE7FBB21073D7A313CDCAF
-A15A05658CB96154F2232CD57F183153BCF0DF1E96F1323D1C45F23D68536C23
-D2B141AF03A36182DCB872B6BE7EBD4423A5C048FEC8A6C6E92434A9E1B79921
-333A249BEC6ECA29FA4FCD627DAE3BA8F6E123D95297A9E2D1FCC426BF7E50CE
-4842D85C3E8ABA8CA9241DF6AC71240BF1B73F0DCB13E1E9D2D1F9AA6A081476
-6CCAEB851EF19ADBE584A7A50109007AE42D3C3E29971D04A0F5FF1890ABD460
-C0F9C909685D097583ED09EFC536285F752B16A55E31E6B34402B6160DD97563
-1AD5F56A8F1F76A3EEE62A6108C2FA0CFDC25591D00F8896A8DCEED9864EEF32
-23FA25110F6E78C8F18A55A3EFCCE0922A3C733FB9D4C8E0F5952904DD5410B4
-5857953647FF97355F9CDB187FDEB54E8A6E4EC0ACF4F3C13251BA034F5DBD7D
-C0F04E856E49FBE5BE24D220048B7D9AEA6689484EBB50AF1F7A1AC4AB251404
-8F62BD7993ED8AA929A029FA4A33CAB57BD9A54749A796DA9A9370E1355463D5
-4E158E05FB99E2094C3B273787D851D433AEE9AEF73FCA873329ABE21E5CC531
-81E7E9B76F347F43D36E16C10C709FF9E16695EAADE5566476B70906B2F93838
-CFEA62C80D0A5FBA21711D45DFFE3AE3F2CAE050648FB91C87EA39757D7D6885
-B7018BFC81564DE44580290F53FB601701342AA22C825C566961EEB9F886D550
-00079A5FDBEEC5B00293B784C5651C747D93149B22DB752958992E64AE87C919
-D97B0DD0851E105E8D4C9FD1792B94E7EE1566A482A55BEEE5F4782065667E99
-FC0B355020548E10A5D7786D6FE53589D9B711D0DBFDE94205667092766B8351
-0CDB4B715EB701B1BE4862B18FC4A26D3A8A680EEF001C0EF439972FAB7F79D7
-18AC641B6D1DD5A613868D67121C0B67012EB27B920AAB6FEC1B5D067B7DE813
-FF1F3CAD1C279036E0F2B02C91A32339E1AA011CBADBBEC510AC628D85273FC4
-956EFE7F85BFD2BC6D57E9673AA1402B0E145A2ADBF33C3567BC47B9BCE16A5F
-A049899A532B554245FB468A6024E7F1D6BFFD3F0C63AACBF8AE866C0504DC23
-266A566F4EA034458C160DCA0D860995C246DCE9B8BC76B742AFC3A23E15853B
-242CA55B38B3F1AC192CDA70C873363D4F6912A4B6A9D691A53BD33F9AEDB1A3
-0825DF6D9C57254666105DB69A8CD29522FA2F4016533BAE1B75031836AFD5FC
-5ABA92E8588B152AAA2252EB8BCB5F5C5936E6072167405112A10DE09EE454BC
-48DAF59774DFB93094631DB0F2C97480EEF0006C18766AE1EB1A16DC6C0B52D9
-9ECCF897B2DB4D0F690749F8068F82ED159207E06CAAC19EAF2FE95CD333DD6A
-1DFD3F3C2EDF3C0734B14814BDAE8331BD430C963492FF6E7B0BB14D56613FD2
-C27A6FF7D390C13286DE72F5241AE846120CE1DDCC827D00678A3CF0E49CB7A8
-6B09DB2A8072898C89815C8B01240F8E7AE7E20589959FEEC6470089F8415C7D
-1BE0D344166835AF7717016826D627AE4204D914A318AE84C6439E4A9E8F12C1
-9D98A1D5E85D00C536811CDCD56640D44C7EFA03E6FEAB29636210534E406252
-A99D75C077CF99D8AAD43644EA16DCC28C6F885A041E0B43981F09959A603ECB
-19F9ADD4D4997A07B6317C731DD429A6F0D1D99CDCBC475FAA8BC888EC263433
-0BEE727E2E0B6FF98F982C1B128D097314AC7C696F84F19DAB10DB5160A59B26
-CA44DDCC9284B843425A302C5B21A829BD261FA33A44F339D51B2F95C949D37B
-D75FAD32FFF3E76FFB7713FAA9F15FED09094E476382531DC9639FECFFB3940B
-E7DAC4BCFA633EAD07643CB27D9CDE05AF6ED670D74760CECBF7160F46742AA8
-FF962C22E1EB0E492C75929625F6839E6190E81E477914979837A9F165B13B28
-C09125D9659BB596B0E8B165DB17965AEE56EEB46022390513F395C2987742F7
-F141E45BE948632B3272BFF43934C84950649B0AF418E42DBF71B4098FA8079A
-5F26F81922D97866F8183783DE8289703D0886A704CA6C2FC9DEF3DD9B116F18
-23A11A448F7D8180E1BFB2369B2DA3E6A09AC65A3B7AE63EBF4E388855F85A7A
-23E90FFC6965D9643E9FF8DEF8DF0DFD552126E19B92394D93A492B27E4D49E4
-36CCA1D51783E6A2A2ABC9657D5B8841A2F99E6E89F29C2B1ADD7C4D4340C3F8
-AC3877D3D11C28D6E1252E690B3F94704C9FD6B64BF03A46E1F399830162F5C6
-CA081A12E1592D9AAA6103A2C10BB2CA96A7BB2A141385C5D550EAC392EFF1C7
-FB1708AF908BBA2F807284B87764DB4BED8B26394BC24F07D731790A1775C909
-68B17ADB0F4A37B58F55E514E85BE8FFDE0D1FCB02EB75990A9BF953A88FD966
-801A2428593E86E240CFFD0F5A9481BF3E64AB2B3CF8D8A7C6DA10E5D4F96A05
-7E207E4C6F0CE1FE061BD6235AB57F568A664604D913F35AB9B9F693A4B93EB8
-19A583E1057E77BBB0FE596DA83AD659FCDF9F793417643DF22C12CF0152A76D
-E8A1B9C890235D22B81AC5255BC024FF69A8CBD1565CF30778A80B56D31CB253
-0C3A1AFA5B912ABBE79D1E84B68407359F72486A6EB1D5095F8323609F0BFFED
-303E9A448C3385521D9C6743DE00ED69C1FA67DDE59FAB55738EA5E48FE3165A
-6A64B88D8B1F6E033C6209D2BD3FB040C0523A6D0C266758DB2B43B556A6E3D6
-2384F9ECC1BBF49F0A922FAB1E1934B279C7E8754E1C0ECCC831B3A7BDA34090
-31B9B02B8D514E21AF2EF6A66B248EF1F50CA646FA603F9591D4951C22472018
-B5D4C5822247FC61E4201B55CE9B76C0A79FA05A15B85736B7CB5C8421147314
-499706F303606B3A0F75012CEC4A1AB0F30802CF0B5769172FCCD3E057798E91
-CAB106C3B1A022E93DBB6721A3B1386C8878EB7C342D8ACD5C86A30DECEC22C5
-55C18C1DDFFB5B15D1A81CC9A9C67649B555D5BF07FD1BB5DCC7ACCBCB7E8066
-5635FF4F1DDF308FB2A2FDDACA60FD88387821B10753D7DF0AE56BAC14FAB05C
-0A38D450C22F13F00EF31F73701F38BF229EDAFDE8C3F6D41DBD51616114FB8E
-631C8D64DB1F5C0C359C1C46AD245ACF45734ED7D22A397333262D7268453D68
-B8AD396C05800C05819BC0794148DD20E6D8727CAA6F167F5888249C44BFD95D
-A85B651D7C2732BD1FF349E7DFF7778E28C88516C04AB1C67CCD5CF9144961F5
-93A342144450258D359232F11FB19A4AF79A0C046E845B01FB7B5B5D62622D67
-DE1D52D712E1D1B4ADB8D5DD51309F2DABA84D38C1ADB4B31EFE80FB690605C2
-B63BDF89D1FDBECB2AE4FDFE47EE5C122744875C107954341113B31BA1AC4D07
-2166F69F1386BC784D82F69AD51AAB6C22FC8641F1AB8989307F7643782B3FB6
-FC72CE90B42A92156044413464F8634A5B4FBC48C347E8D2CD8A1A407C44ED27
-677CAB77EC2ECF29BD752544A69F46
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049016t.pfa b/lib/fonts/l049016t.pfa
deleted file mode 100644
index e47d5bb999..0000000000
--- a/lib/fonts/l049016t.pfa
+++ /dev/null
@@ -1,1582 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif-Bold 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Bold) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSerif-Bold def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-217 -211 994 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078992 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E494BF284EBDC8877C4E
-5D28D2A79EA7D5EC25EB01F73826320B565BFED33D55B5D2B4128ACF57097B2E
-BA8BD7BC7EDE9E6C636AE6FF86DFEB5E9BCD723BED1C30F8B20C4086BCF5FC74
-44FD8939C7580185BA7BF311E1E56D7C53EE70ED83BC1615501895EED5042083
-A5A0D8CC28978C5DAF869CEC1F15FBEF2A58A11A3417D1527AB511AA9B6746E5
-5798FDBD24006F12521FEFF4284ACEDA2A6FE84D9DD417103B4B1FE7FC2BC351
-2564D903599E253F6F4BD11D7B3BFCD01EA9DA51FAADA5F18B9F5E5DF25FA0D2
-A1BD84D42BAD716CA9303DFECA5DF05B26EC60612FBE0E931112268B223FFC37
-FA3ABE4C7E429354DD82D7F24B6A342F53EACEF4188937778E2F037B002B29F4
-9A4BAA19E878E7B0A6F326E3DC7949DA57D84E1098506B0B4C1BBB57196B597E
-310BF7408315F69854ACD0F8E8640A70F20D4EF409AC0F891554643BD8040BAA
-6C11008AEE7BE22282A1328C271E30817386EACF45542EF2DC63856FDD867C3A
-4408FFC606DD5937B74882832FE9D3C806AB1C6594AD2F95B763919345E37202
-5C3474453ED74E5344ABA7A92101A287E932E8900F7CAD3083D38FE1EF3ED4A7
-E6C2A0A8A19A2DCAA58F823D354994C9BAFF5FAF8BCE6A50B275F8958E9254DB
-32D7BFB3A1F3739B650B9704B7AE03378D90E8432A1BEF6EF20F8F49EFD919A6
-C9C90F60822299B0B50C0EAE5243AB66D9573E257E99ED424D4F7B284B779EBA
-1B47D49FFB539EF6D3CAA911911E7CDD9E7CCE13F60F2C698A7E4AA8AB3A2B2C
-6F3C86B9EC9EB8A8B8687FCB279B9B2B4B5F838FE25EDE772B77407CAE3C5840
-1EC417A4D627AF14F5E8D5D45EBBF564279361B871A0A142962BDB83EB1673F3
-CF7A34044DAA42321ACB120827402D43CB17607D9C8CB2BC726B8D06AEF513E2
-72CAE380EC17A1A2B0F235FC70D479A606B3360E291426B0C651CED104A39B26
-C4B14949E12B160B048969242BDCB760C123FC89DC73D8A628448CF678C9F679
-99EFF5E798EE5E46F41D1B84A38631876EC8CEDCEDEDC21038F7707A1F4CD355
-81003CF5E163C1DF8E76B1C4BADFC4C887A084E94CA74AA5314BDB69CB0C5F79
-B80DBCF17D95CE7B1B0E3C68652158131D8B776C368203356AEBE5DA210EC561
-8B56C1D5BA9001CCFF14D7AF2CE1175AE66FEC8CFA4F1F2D2C2FCD5C00FC62C9
-98F5FF6209542EEB45BA0DD8ED9CD08DBD58FF8A70C7F1578AB22E25136E31E6
-DFC05DC28A66C6C852092E56590199B2394D5B99D466EDE33EEA357806A3D0D7
-06B658A6528AACEC3682044D37A42E960E1B92E7E064AB891AA0006AFDE4D8B4
-0E61B0480EE2879F3C8455785EEFE3E8C02D9A5EB4EAC0AE01C79C44F84195CC
-4724AB8ACC2E93B1551E750DB22D707F1BF8FE2E9A751E542F347A7E54C91D69
-25E99CD65F7A348E6234D1933177E5EAD802D3907161E7A19A3AF41378FDC8CF
-464A5A87EE4D83218A9CAD27B1F349E55379DA9640739A502427F52C6A16CA7C
-FB8E3F19E256918FEB39D16B6C4734B058373BA35A222B58A6421F7FAE124E40
-B11A646757F60DB2ACBB0E8EAC910698C137FE9149DAA39EEB195ED3823F0308
-A8BA9E889E618458ADC62C8F372B4BE51B66FF0E9F9837494E1E04077959E166
-C3654872114BD6A703746FB31E330BE538EC7C440F0473D5983C86714E002205
-7469E7C388E390068A302F16F7CAAAACE00BCBEA71E1C58E3B59C411965F07FF
-04C2FDAE9FE2D314E85C035F58440DC004366307A9173BA9342B0CDF58AD1980
-5C38795CD0967F83E13EBBABC37CDD0155A49FCCEB5233B0031BAEB6EDACA49F
-E842B25DD5E791DE4908C94E372B2075F9615CEF9275316080AB9F5E678AE30E
-CCCA7B2C9E71571B42A5315849B08DADAD9ED58120D77BC16019006704D436C2
-B36A8B3860A5B63B5864383034B6FF0252E29B409D01BFF9752D9A845493EF2D
-2F1DA1B6DA9933D24729E8002E4507A15D90E0CBC40FB562E4C0CD70A95B5D7C
-E70186CD14657AE2D308DB650768E9B135E24A82212A99EA217EDB93D1EC03CA
-2FE7B4ADE5FE28A21225F39722E0C2144536DA5083965642FFF7438AABD30710
-94D3F4B1118179748A71133050E51C94D9928885FADDA8383EF01BA234BDDAB3
-273FAC0D86260001AD472BFD440009C19EBA1C212C581888FCCE590516767F4F
-A17C7F5BE71A2262A34673DE3CA11EBFFC1A971EBE827C4A232E4C6CBF65DA34
-A1D231C875BDCD842BF21E1C00E28AD90C73571F040BF095E28B4F4AA5E3833D
-D050545E8B5A04A2F67B7C0EE5B49ED30B189F0130D544912E0CBD25D09EAC0C
-334B30759FF0ECD7FC05D11830F0ADDFC9F84028706324B903AA963FA4FEB4E5
-12756E76F8A55E130A14866983058A7FA9BF206924C0C7281E7EFDB384F9F1EA
-EC120F349CED13B2F2FBDB930D1A66B1AD1C10B9E66E7AE2830B9BB5A51D0DD8
-0A5A0A0729571B9DB76123040AAC7E791137695FDAB0639FD2F994107145E1BD
-A539BA84A3DCAFFCED2FA9A1642FD8123D65E24FEA77CBD299D22AB1DED3AB40
-F0DC657EAEC450B1170CECD360093EC0CC14E2F50E141B8F52A3F5B9D7CFCA92
-30D819A34BC303DB080E7919E573B46489BF79691880EEDD6B992CD63374DAD9
-2DDE4B0DA61C03CB953ACAEC3176B7C474A1A5A351B259098FB2425D2522018D
-98C0CAF94E047EE130438CC2AEA2AC11AF18F652C53157DFD31F44261103DE0C
-4D582D29B23BCC137849306504F3CFE49EAB54D05FC62754A3166AF5CA301F89
-A1016CD076761A415C900AA958F922C6881BE652F32ECD8DCA3059CC335D3D95
-AE5C4F0DD70CE9DE75407AEE7801B9839A56C3E372F126A22A779D949E4111A1
-7F2E1B2D884ECAC744D2E78C1D16A8D3D67A6E818BC347F6E6DFE71ED0A7F45D
-F37653BEF6DFC90D98629BD09DDC53EE1E2227CD0553375AAB4A3F10ABFC38D9
-A55A4D376D18148CE67C7D0062AC884CBC6500E646C84DEAB420FBF64E4B4360
-B2F5EB123D42F0BACF232E9F3392FC1704EA390941491BD97D191F198976EA7A
-8FE3D14141E1BDBA8010266CF791D0E700C1F1C1FE69709712EBFB2136026E84
-A246F78B6B713D7DDF9E01745AE071B8CB052B54D5545AB56091E3134306A532
-8729EC3FD25AC305D3D39571C2AA50D4FFAEDECF998BA46AE033AC1D5DC3967B
-C846E475352E0468C0826A8E040332D9AF6975859E069F70F624E8A646A65DC6
-1852339A3857C96593FDF7F4787E5A7D691C89396F4B5D4DF91A092863709AA8
-F7D8BC7C7739EB060C3BEECA0631CF9F47BE4854248EF5E88B79FCCAD7C19BB0
-1B745E6DCA8034363F4C5CC4B305FF2EE1B2B9A234F394EBE15B82B5F317EA7C
-39183B8D590DA62B3277FF00283C5F5DBFE10F29AE99581F6A9227009300BE2C
-2B0E509BD87D96AE7C5B198C8FB02DF8E1E5A648EEA044A5AAE0293BBE43D2E9
-33D55B70F8BB33CACEB5DB36CB9A731B3804D859E020E2FF49BF121A7950B984
-7B0913BC2139A8F70FF6DD3C6DC638477E4092F1179D540CD31C349CFB0AE55A
-B0E772894CF02BE0637692FD6574D4EB2A76E93070556665128B99C20296C550
-8BF29B1EFECAFF31925ECBFD147490E3898A98D374904CB7BE2E7C752734A359
-FA107535533B4A97691A242FBB82D66C006A19374AE8698647CE8FE951EE2B84
-0E5836F8A3CCFB6F95FC009F8B5D200C0ECFB0BD6692A8644BA7DA5CC2E80DA1
-10ADA3FF7F79A40AEFCA4B98CDC4EA9C29BC1E901CCE1FB466DF65233B889C24
-DFA2E161FB6366CFF3AECE89C404283546D7814B254798EE928D74FB9B72B709
-E965F4369ADAFE799B4510CFDEFC772ED5516D9EDD5F1AF0410F5D82CA9DF5F9
-5134D9B9BA4984B5A8A3D8320AFC0DCD6305CDF582B08E28C28F0D137F73EAE0
-800469768BA91CA121A42D04A606D1722104CAED2731D73C3304F7C4371A1319
-F9ADFA53A1F7A7F8EE4D7B74E3473EE3C11AB66BB43756CE0D57AB36B5278E43
-B860B5A9C51AF0BE85CFEA6C3D114AC0AD68919A9027DA7C80D5C3456FEF5824
-1447D68ACC05CF272C0D0E62548DC9544908B9F50F5804B83C229F5E9B65C3C3
-CBE220648DC64EFC53C40473A421301F19E768D3BAFEA7FEE49FD3B4EC279861
-D9D751F4D49A64C463EF174D0F7672042E22BD2F55AAF7F531809A541D5146CB
-FA4D776AD1AB10289B6EE3E01C19B8A8F7A282AD668D5F8B76C45A68D51BF56C
-56DDA612D9E4FDA940D2C4B75593834F882AD142E6E39FFC70744CD9F3B7B19A
-1FE25627DCC832F20296F2B4608AAC873F5F7D859D5BCC5C0B83DC569264102E
-50BE5724F8F64CB35C8FACB12F460A311D57F4E52B7A08A5930BD56951C0C88D
-6FFF6A6A18553FA7A2731F001C28093813676C4ECF8FCCAD89D94EFE35996AB1
-776298BF7E1EC9AB0FC95D6475A635B89F7E0EF16EBC188B1FBE3D105942CB47
-0A4BFB9FA132E1AC19D544423081ABFA1AAAFD91165B378D3CDD2734430EAA36
-B070A780F90863631E2C7CA2079B1EEE7666B975FB9BC62C37DB28EBBFF3FC57
-5356BBAC08A908976DDFCFC1664927E69DD7713A47B1A4150EA0762E9D30455B
-F840841688DCD60847AECA495F411656D669AD3168F261BF9C31821EE3E8685F
-761276952DCA7E4F21C16D9EF197AE2FCE0D1E85263C738E1CD88D4147ECB87F
-7C232716CF20C51575BBB0C771FFFCE3C08CE867F426FC4D1DFEFBFA1618ACB8
-ED40168DCA837A254EDA92887905BAC603606E427256D2922D6FD43AC3A18781
-63EAF11A9102411AA6CEB7119688C106E71364A973EB54F1869B419AA6770383
-9D2F9E5C0DFCD9334CAC426FBA2AFD070A0374D65FF2C203516D9E052462993E
-DD2C77E9F84B8299B2399045A09E37744EDD3F3DC1599A2B8901C84DD5640936
-8938E43B662ACBEF2279B10F44600CA2C61647B67C8909097119232BB82262D8
-8C55D939A457E84CC03F2DD9215C78CA82EF556DEFE179DDC0D248A933E9F906
-70850D991D72913C554BA1E71E71CB773020D452247B7B482370C8B190A105F2
-6074F9E154E9BB43CDCFF610B2634061614BE281B1809E7FE0B60D308507465E
-13F424FA991810117D147A9D68D76170C75502E60E95D19B30081969BDE3747A
-1CD185820B4080697411DE70ABBA838BC6AFF19E11AE35B5284B2AC7A96CEE55
-1D9415C7FB88CDDA4958F9C9892C1119B69B5E2B47B2896F31DE83F6476510AA
-CCB73E9E3ED534D7269C8FF23B4AD964AC6A920C20F0CA0C469EA85F6D675436
-CF22A3B92B7A4BF502AD1A94D0A575A82E90ED3CDE6E422B73B6B76C23B1CAD7
-7E246CD8C3FD6A40CFE5E955613118FC584DF75CC434F8DFD05181056CCF0CFD
-53BDD45E4F8A9424C3092C42FFF19D59AE1C003D3FD837882D6B0B2A00489F23
-518B48040D40CBF9CE77733823CA610735CEE4FA8C907575F0F0CFCBBA4D2E50
-04ADA5DEFC707A82324D7F288302C99D2ED5009D20FB875AA0F861479497643A
-0E041E76CB10B898E1EC007BF8F70444474A75D3C005ECB947B8F8DE8356771B
-EF4052F1D5CB3B19853804BCA33E0EB27B418E75AC398E79B1A621F85E4F5C26
-1603C789437477357A69A585BDEF24F8F0C9246FBB04F40AB6498FF72BABC3F9
-2C5D9476A87DB82859C374969A1016D0068FEC4AD30EAF10E871DAB9564EB600
-8EA14C41EBA75DC1D4B4EE36AD57CBCEA9E862542627551B530AD763BE607808
-5441ACFAA3AEA5C6DE659B15F522C10F7719A4F868473883B8D1BC1E40F7E525
-3C1196E9850B6D58F7673D6403BEB6FEEDE3105BC4F7CECB15A3BAC37E77D83A
-D802F77B9A4B4014C1FEFAB1DED101A0FE0ABD220965367F99DD6E4C34C6F47F
-040B8A1924E7889DC4A131408D8BD1AC15B3DD07315C4A30BD30BCB9C03D6C90
-ED4295840906E3AD448FF83F74257F0549BAA5F0D96FEBF943F07941121908E5
-AD6A27A33BC555B602F72F067273270498410D2089C3D1EE95D2C423223CA83D
-EDDB1552B6E121D9FD1D0F5BBC1E9E8269C0CD6515B1428D61704FE230AB513C
-AFC088CF436E7121630478E115DE2F5157D244B6E081FD74E5539385F6FD056C
-5824847358D38BEF8896B93424F40ED6F485CDA0D9AFD896F921750E331ED55C
-B58A93CBF1F74F1B11DFE0E35EAA56580E949130C6D670271921C65BF946FA75
-1B9472F92BDFDA5D71DDC5C3D03260B67E2D94773961664EB4FD4D23D49D368D
-F2D8ADB7F2D6D41A019E20654EF4B78D35F26A159E48093EDDA1FDABAC484D23
-88EFF39E0A4C2A64953D53B6039BBA748751F4B6C077C9B66AEE9127E646723D
-26F7E288365818F30A38071AA011E67F0E9AB64F4A943BEFF67BBDEAB4915B31
-FB6326BA1EC27EC9F525CD183D97015750C17D2944F793407DB6ABBB72AC2F85
-98C449326CEC03227FC767470A3F102A12C2A8122396D00025D84A3778A50869
-FBA49AB1AA1506839DDD675A8AE2DE1E44E83D300CCC1561210A23D1A97CD590
-FC257FB5367BEF1BD15AB855D07CE21771EC8B815094721A1CF7306AFB4EA421
-DED331B92C7481C683785A92B9E213B04A2E07F420ED9B9C025DC23D4FA9DBF0
-B11D6948AC62ED02298B8F1C6B519364B6140AB89B4B53CF1D05FB954FE7C185
-4C63616799FCF3492ECFE06D0D1E00712756862C3F0C1BF21FF08564BE0A3AAF
-9364F4E7DAE16D828E7E5A2780BF6A9EF1CFCF680B4A96CBC4EC5DFE7E64E140
-31968BC00CCE67789EF5BB4B1E7A57D5FB53819CCDEBF38A555EC145FE2F607D
-C199E3E514EE3012CDEFEE1FD70176F39B5071EFB08DBF3FDC2DB6E89E2CB41E
-5F6B9528C7EDCBC41B3C4860CA7EB9C469BE1D5D1A9E590F6E721A956CC53870
-9EDE2D930ED28AFF92DC834913C4284847CA619D27B68CCDDA91E7BEB15F44E6
-DF8B38AFA1C63C6F484F0001247F6C60043DA83C802E0116A1EFF49EB943EAFA
-01412A0D518E2E860F61B649D2AC312AC6D84BD5D7DE93A13DAF1C4336105813
-869D47538CD56009E8BCE20243001E87020BB2DA91D83EBC9E9C98171F1BC02D
-56CF45AC7DD7358ACBF26590A7894CA6F99AD01351A384540B9615C233ACB22E
-519CDEAF5A0A975B8B6E7C711DD98603F684259B9210E8642D955A4F4D977291
-4C9CA4F59C76E598F7E48DCB42A331BDC8D4427A13468B735FF5D2F58296FF65
-180B22485EF5DB6838A5C049B1371571D7257701929CECD5E1A315AEF62E2E98
-2AAA70C380E40C3CDDCA85A71558E3AD0AA1064F840FF75334059B84A026AAC9
-DEDB589213D45C520F8BF067BFF0170BE3120A8F6E3BC29E4D1114DEBCC4626A
-96926AA20AC4396734C91808EC5DC632CFD69ED1D517D9ABC261E00815E1F3CF
-A4ECC31B5B0348F96BD4AF2EAAA634EC24FD310F86E5C760A122ED44D2962EDF
-06104A5DF36138284743DDDABC2EE689499333EB31347F488311A93DF9AC358A
-BA157B8898903AFD6CE2FBCC2A558360D174E2A68015A676EF8A3F0A26021B55
-AA27B65B2755F48A46920C0BAFAAE72E051085538F6C60D0A77295754C755BCE
-D30F94627DF2AD3311767D183A22D64480ED1E06BE21162BE345CED43DA52047
-3975C8647A025E2411F15A78368A2689E100D692F23E0FC660D321D55ED4AF88
-01532431864B03835099474C36F1C39C71173A04965719A7ED95995AD5AB40F6
-E8A33CC915D25C2E9EAB91107E89DF746FBC96DFD6FB7A9F020B0E3AC7C81150
-C21D9E5D9EFEEAB4BDBEBBDD705BFC0F3F52A77044831A6A0397DDBE135208BF
-1E86FE2830A8311768634E62B589921D1B5B1347ADB167FF9B410FE902ABE465
-2E0C320C3B5F7CDE7859749978D7C2C80E5FE38901EB75FC166287F5BBFA6848
-C839C5FF11FB245ACC7B6C8A74720BAA44625D84C721AFFFA310E52EFA782EC6
-96014134479A15A5C6DC7D11D8256DEA0CC645D9F0B0524D7885A8A59A2638AE
-9DB5273E3F3302D1C94C96CFC9CA768F3A1F8E41543A272FBB3D40D65D82EDD2
-EA11E127CF93E345E87E41401E2699FF0BE4E92814DD959EBF4FB412D768361A
-7CA5399AA68C6153C77FC080273FF4A987EB649C9F5C4FC18BF106E13BEBAE7B
-8DD477865BA85C53A797BEF5F177C053ADAA1EA2804CF04692817BDD0DAC9936
-C63088AA328EFB1B4CAC4079C2EFA244605E362EF8058FBBCE41C2774AF399F6
-E9949214D2EF9B899B5CC5F628BAD3FF2054AFDBCEF21A29783732F56C52D19B
-12C2301D5C525099662DA96E0E07CECDA9A2137655A3BE6F6F828C85408913DD
-8F31D8521A84FF78CF44DE8619B8E922CC7313090F45860C5847A50792518480
-6CD5C1B6471F14D10372AD4C7CE4FF0E6A9B4D2F627A74B52660794691F1789C
-BAFA5D38F92E492EDD7A0DB2D7E860250C0812522FC5B912CF0A39620FCFD304
-D67F4F79FBD079FC05E403651A30489B717FD71C42DD2CFE0B970460F7D12C2A
-04492DF55C523C5E9C62318FDD451FA5CD0B7325172B5A07287DC2653BC5EE83
-0B78FF312012FB0AE605575EDB52F2A1F16509C12EFBCFBC070A4F9A90E58F27
-30D5CEBDD6DA1D2D740E0EAB4AB226F245C743D2808C3D843722050ABB626744
-652B3D3CCCCB276343C1BAD5C4D307753FE781FA7F47B3D9FAD9088586FECEFC
-E0977B68BBEF19034F53FB1BB7868EFCE3F3FBF89A26FBCB3F8FBF55C12017A6
-4743BD2279542A3B824ED697B866609546A4C27D97DB532BDE215CF8AC0C5E97
-059A761A197606B6285D936096EBD2AD7DE53C8CE2B0D0B4F7E50D5E11FCDD0A
-2BF4736B7B9848FD1D4ABBD8A6F3903F1EFE48F0034F9C888923EC768D4DC7B5
-EBE32CE269396D9C198BAEC1076F842C503E546705FD1678E7C6B8C3F5F431BA
-1C63CC1198893BA77CC79E5829E39B541962F6B110E9CF545B064E46F3539A1A
-CD080E98DE474EBAD440ECA7E820C145955BA0B6CC80E7C4109185A3877DAB6D
-4886FBA0D66D6C3F619ED6A81B346F5A196D1CCB4D796E02C35E5301E9C34A58
-3BAA4CC1BFCD6B0906FF15F200FA5859E6CA7F2A21872A51B7E75FFBD92C3048
-9297C015A3BEFFC5B5D13A988AAC23AAA4F0DD4F86FB5E6FC8279C43A10D5C2F
-624E8CDD2C03794CE1B2246F7BED4DD4564395FEA490A41E5345C6F86D847D0A
-7AD58C606ADBD3BAE5E649998FAE5D0257FE2878CADFC7581C22B31CF420A0BA
-A3A76624A582909E209E53B462BCA38014162605977B87FDB8ED67757CC363F1
-A50E5DC6A8441B9406D874A756D91B978415651D91E8BAFF5879235B830E8702
-700D5A797B9E1ED4E04123513DD23604951C26C892004DF6B8DCE876430ED7E0
-56BF36ADA204464C0789A18B2C8F9B212BBD5E8C9E2925D40AFA394F8677336A
-C406534E239292FED55B20E5A8F986EA761D33B46BEA1A37DB3E76FEC6A5EB04
-BD38F5B8DEDB095993F81BF12936932E610D72CDA00A2D3CC2522793B7887B23
-0FAA526C9D42B6C087A936EB98B776EBC2BE5E2A3301AE9A91044DD21403B2F2
-976BE40E7374CB47148F8CAF85C16D7DE4CF8FFF13470B2E6925099C3C97219F
-5F967068A9E82488FD591A964FC3169C38AFD8AA352CFCF35D3E0D6045484475
-4EF4EEE6AA387768FE9767CCD9F81818BBC7046AE0C2B7B42BEA5FF70C65CD66
-2ABB14F1E1FDE651C260129E2235FF02A7F27F1C948CC500657A536FACA3BA8D
-8C3FB591601310A2315920555BE054BCBF4668DD8032C562EE12D2C7ACB9C50A
-11CC8E3B3EDCCA00A5067ED11C24E5F0037FB82955F242BDBE1524583D2B676E
-12BBD3C0FBE80DB47A23D4EECDD1F6545860A415AC6BD2E852A39DDB12EFC723
-D0EA87E1A454B661249959DF54DA9DA50970BFBE0113821F1CE71670827B443E
-6544081B2BE1260270A23E9417E4B0155A1302BD9845A5D62FE9EDF7D1172353
-85BDC4F2DB55CF4FCCA18ADE873B53FA4FE0B58EFC867599891A165631064771
-5CA76573ED070A85B135EFC0B619213E0518F0D4A95490C32535F66695C84124
-A1413AD30D918BE68A3335E65C2BEBEBE4E29DA17A0FED672F3B714F809C157F
-006AA925F96003CBE7DB7C7FD7BDC5A890B9EFE60E9915EE7AC3B3FB9EDB2CEB
-581E71527907A1E43FA1A06A12CABE01979FF0E28EFC4965BD7ED592142D9F82
-47BB2417B528590A116C791E19A006F274035B74C8401A35952844F22DAC9D07
-EB2F28E3C9BC5B8E1373F1538F67686055D1273C565F536E9F35225A67D53E86
-510F371B7E6BEB04027216BC50AC67B2C0E9F528CD55613195C351098FF6F9A8
-D713269EE95CDA3CFC786F8F28DC3BFA23C6E3253E4E5CFDACF097B862636CD3
-B7C78FF990ED9B7BC27AA51DDCCF408F0EBECC40E555250C8077DDA1646D8BA5
-00697705ADBC54DB525A131A1AE59FE8E7C3FA81A913FA5C6BEAF2FC393412D2
-685F1AFB5C1B6208AB5E4900E29036832E8942550F206D721A759E994814974A
-11EA5E5A027C3870A06622FED8632C3D125ABE15C71146A7FA4179DCEA8BA117
-E6CE9AB0DA1373933319CD27BDD4C69CE672491B1F15BC249B7126F141FD1AA5
-30121588773D42E0070723427DF6AFE7FAE3DC6B940EE28A8195489F1DEC2811
-A4773B6594A8BBE4F439EF76D5D4025BA7FE822A72C5D7DAEF0F1C88342EB016
-26203272584C62E26D16F6E1A5B37A65C51553F93ED4EB12E95D6F39DA5204EE
-62B52BBCE5F29A47D942F247A10446672FF26C6F710244A237C89A7BF6D86F7E
-1889103269B8932632BC0F0F89FE477C24133D8F06C1C74325FFBFE82B59923B
-06045FFF59B25B50897E71B8D94395A939C9319190F0D891C24BA6186900F8C7
-9824B378C8570583C5303AFECF6D32A4AA96700D915D0DA70DFF8765D44740B8
-518FE4A6A8049E3CAC9589A3C0752F4E0DA6AAB319E1C21D0A760867602A9CF4
-CB372F3F4B7B28712FDEDABA55A6B24B533FB96701728762B2F7FE2DD070CC3E
-7FAA0F6214500B495F5D986D13C012310BE12BF864B7928BE4FDD9DB68EE7C9E
-21D645094A676809C455F8AEB85E5B5B33F9AA13ECF24E5258D49D2B233E22C6
-F9926353011DA6B75D17AEB6BA6EC8E4A405181F04A656E0CAA13BD463BDA234
-5F4692AE9FFE0C4240B7F260AD199668D27C07ED34E69BA9C3E09AF0F18E5731
-71C576C4431B9DB7E83D645E7FD6D3DDB5AAEE00A9A3C806FBFFE1D8ED8D8A47
-4F69A5BD9747B6BFA7EA057DF540203AA6030B5932896D1E586A8AE9730B32A2
-8F6B27400E4F0773262505F37CAD309D48B02FDBBDE883E0DA5CEE4AC6B28AE1
-7C7663C7B4AF5EACD32EFC8A8910A3BD514B8E19820CB2741BED0C03DF65DDF7
-ADA651E232059D9AD05257A8B271BA34007E8E2D6BE190CCA9992011EC455E7F
-1443C4DC5BDF1098C399877B64E02DF566B5CAF6B8BE73CEC6A2651305E32C91
-2670B1D570CB8F2CAC29D30588D7C6D3D810F660F7BF30C18609D72D60FF745D
-D879957E4542F5877A05D0A281BE84656D3D9879FFCE5F667854CF00DC01B8B2
-38D2473544E81D8ADFE49FFC6DBA711AF38BE51897A42FAD78DAC2D1D08A3780
-50C9B002A9EA58E0DF5F4FCE96F3405C9BA1F32C91405CD058E9EB51C43457B5
-62755B6FA91CD94C22297FEB48DC03CB78C0EFA09C74D2E7A8FB253ED4F6769A
-E54731333C9EDF078829A58AEB8C1D28D1D7C852EC574B0E2ADB99F2A0CDE7B8
-4FCFEC125944835A8E3F1FB0C15FB669E670D2D8DBE24886AED75A9190BC52DB
-BBEDC221D68B88FF825E69DD69E61FC2E37459DEBABF7BCEBC179D4082DB17F6
-12408DA590D1F768F630951D7C72A74E5172F71C97624F2F4DFB37E4913BC382
-990F61400A362D5AC3A29D64F1F1BB24E572832C8A1A8983903D086ED747442B
-EC2DF2DDE41AD05045AC4BFA77F83342BC1CE856BA2359A66612962A5A2E0635
-806D70FF2F6FA279F639E5C38B0360C33A170362F5EA48E096CFD7BCBC43B49B
-CD4801CCD9E9C421F24B6CB3F793D4ECDF9B1713E7C141934D53EB8FF655273D
-810ABB04AEAB956AC369DCC11C17D10F08BA7F1BC47A45B3889068A169A22761
-52149F3BBBE409F8C28FB89460B55FCC0A357A14FBC50A396512CA588A4B2324
-E557EC51138CEA0ECC37980259DCD9E01FAC43FB9D7AD36B1D17656A932FE69B
-3D224B98F0E562368682150C9D9D4BA2907E4439BDB7A6B8F0D18F8CA351B446
-96CBAE1B9EC0C1BADD2EE20443E01570A39BE38FFF7A2329CEEE5EDF6B2DAA05
-C51F9F75B21E7ADAF05591569AE0DC92F469675588F12A28E84D178699FB76AC
-D75E66C0F26F4CFEC9BD0597DF10342033D0A2CDE6DD2576A651DD1855DC61DE
-FDD8BF33FE487AB7CB0FBBD811F413BBE9E23F2C832A654B37BA922AB7F6DD9F
-689AEFB8B49DE285E7CCA8EA94A0C45B5431732E81F5DD0FE804CCA7C82D5234
-672B3670A16EB11024C31FF89A5B4C03B28B2B582315307C8CE8686557A644F2
-65C8C2A9CF1C9A2862BAFAEE0E94AABD856A183394331992EC764A3B82EE4306
-2B40848D8D95D0CF561911797C9A2C6D9E334D3F6E595D59F54017218A8E6376
-39235EC929904AFA8EA42EFE54D294768DE0B68B4C1907F61662FA6710682673
-AC64FE11B84BFB0BAC6D1F5F90FC91AA5954BE48868AEEC05E19117B682186D9
-A0CFE621311708B56EC668EB0BCCD9E9837CD7E957D72AF5B562E51378E8A9A9
-34947A8BED94C55FC7A429E28DFF9BEDFB3F28E5D1A2536B84DBD1677320B132
-27F8A8DCBD4AA2B971F2F02817DD7753431BBB210216F822CBAED265C55B79BA
-D7D5FE873E093D62250A27022D63D7C0823E9FC09209550DD4BA413E50FE2DAA
-8D60AD9AB7E6FCE79E1B6CD6FA41F5C723DBBEE00FFDC8F614DE64DF40B45BF2
-84D3B6F96A1375CFE96E446E6757F31F8FD2E34DD88106015037F4F5B5D381C5
-AFA0D5724AFC260CE676DE70C666B34520FE2E2515D2C5194049F89EFB0D1A4D
-10D40A12986228BF3CADEE7E8C9564F9F2D61E094C44310FD5295C5AED950A23
-491431F3EE071FC38FA803DFC580A7F0FCCFF19F3D8CBE0D503057E95A2A7D00
-A490CDD1BDE01EC8370310A869793E4DB867496094D4B54B3B9AC440F304906F
-AFF32EB87AAE8075149299798E681B83D47935D93FD3A26302E5EAB671BC2C7C
-7E87A4C1789A772A9643C5737084462AF596F23DF9F36A8C00488FB78C6ECB64
-60A22C5D2DEBFA17E2A78968EFD029A29CC04B6E231B58ECE47CC6C93074F701
-65B19F77969B4DE3A7272E769CA00D5C481F5791E559F61A68CA64D4FF88D513
-642E82C48019C5BDDCBA0246448BCB765626462BA0CF6DE0E55F5C4090DAE3C5
-15076B25A8673D89A4DB9B5EC5B133EEE44BDB76AAED2A91FA68632997927EF4
-EB93C9581DA7663A24CCB982D1BCE9315F8F719E20C9E388907555FD27ADD8CA
-81B8A4C5F4F7614F15F5A6D3A542E3F22215F0DACD6D78E22209AAC0036AF039
-12045C916E9858E2C07B20B13B4715DBD513DB1003D256811D019BF84EA41069
-53731364B773A23EC103ED81FEADFF565BADC9B698819BE95D6386980B13D678
-A33460A92BDCC24FB6EC68FB73A8ABB4D240DA5146F04B1529EA28B8C47B661D
-3A27F5E03DFB5C7BEB8B1E6AC63E1CF7236198487663AC00BEB5F59EEFC366AA
-C9FBE97F8EF03A80F37DB7F1D98D5994203FC3DAD6EDA29CE5079E09D504E360
-902FAD0E67257EADD77A989756B3F1B866BE530583CA81610AF81D516A78E37B
-4AD1D27A2ECBF67AFFA6914F06CA73AFEC79921474F3BFA2D2C169A7666BD668
-821FEE767FB326ECA936FFF52FC87963027983B23751956C9780F1791595C91F
-3A5B497D8107667B12CB2D31A64F16F51485CE00F376DC07CEFD4DCFB7A91C27
-CD8F3584B14CEEAEFB824C59FB4852C2F285159BD37CF3E3880F47658D3799CA
-E8DCCD4C79144D1503EB5492670440976954FCF0487F54EB23A1CE0A139AE7E6
-3F34594B7F85379745113C0EE8D05E10A6E740A76CF900F5EF056DF772B07258
-A3206320647253786225D4CC14548B1750CD034CBE4FFFDE56CD84B07896D08E
-2EBBB9006DEEFE45EAE3688F06806CABACCB255915C695608A6C99DB3AF5A6E2
-DEF0B77D903B0BDBA16C66541905C737FA79CFEC143CC89C4CA56857096E7A07
-B8A0E2E16C778C5C929066AA567449553D2824B68EFBF7D7184E56470080D7C7
-C847A46A9C6556560B86FC1F82B7231742325E718990E81FF7323084267F46E8
-9F4B6BDFBF811CA84296216FEBE788EF20101B48EED478454F1B238C03A1E0F3
-DA386922D1A038EFD0555799B29712FFA294AFF0312793F2349B1DD00E16240A
-6AFBDAD7B8AFFD1AC1AC380F35CB7DBE92D517408EE81517C04D9A82E1A6DB84
-EE4A6EB49650B0F94A64500A771CC0788F0CF8EAC76EA80437DA23D05651F9B2
-65C5112FAF87B2AAF4A8E07DB8762229DD3C2D74C364ED6F41E853DB2B6DE3F3
-9AEF626535EF31913165796AFC6989371B04BAE091F9980448315E43B29AD252
-5676CF2B2DEFBB0702007DCF4F8E2BA032714676CA56CC18BB378D138075DE54
-316D7F4D9C73B08A83FBE43DB11606B0520EB9C929BC4BA925680FF37726F65C
-2DE1D25B9500C2C2DA7592A5212290DEE61552175001675E3258903873E9F3F3
-C2D5F7F57B1ED253596425E95743F67145FE18B80AD5194096E10EAF1329BAFF
-C5666BBEFE818C9F88ED0A728F5A791C297C97B4B398621E921419358666B69A
-63D129C875A930087A889420CA64CCBF0152CFF788360BF88A42464C40D03B1A
-1A342A89C26CCEB7014C0A5A1669331D918604AA43AC4A0FBEE0A39DB47028C5
-44074EF228719E1C3CB91FE9F053148F3FF3BAD16CB57DDE5E3E863D40632D10
-68E72FA28B258913E38816D9E0A25616A8DADECAF0DD52625FC5BABDA943017A
-3B36959C495A114346E805A9793D2F30C5F7AEC8CD082DBE1386640593ED1E97
-63A98310C1EA703BE2AAB203095ECABD48D761E92D614233788E4FF98C154A95
-15B460EF33121AC9EF0BBAC00683346CB2586ED0D18A62CB0D6DCDA7B0500843
-B07D9C149678BE81FEF9AF9BB18D18B5CDD59188DA9FD6A79822A69CBB9F0A9F
-731FA4955946D4363710FE1AF278EBC8792158D431B74327017814D69E5ACDE0
-2877824093AD46C7FE256D4615B6A2EC4997310AABAE4F3CBAB629F1522D5B2E
-5B43E931917589434F5731D5418AE96EBB0C07573EB153A6E5442202BEDB507B
-4D09872458F184159873E21F91F999DAEBD2E29BE8E82C6B796345B715693703
-CD412195D1F170A2B2C9045A4D3451752FC1945F82E92B07F37828F44EF2EA61
-77F614FABF81162CC1ECB0676E8C121CEE5B20F325993CBD2AEC8B7BB1D8B1FF
-85D6D33B75BEF89146FFB0BD73DF334DD1A9396861EC67E447477A00A4276652
-F67B8FBB2AFCAFAB9C3A14B0F7BD3F0C54CBD763EBDEC129DCD7A7DD2D6760B0
-460EB2E5EB3414C87365BBD0500C5FD4773525A9455BE7954C616C3BC0D892A9
-AEBA406B14B5D5340785E7EE4C2DFEEED396DB448F20E58725E213DDD11DA1F7
-000EDE41596161C72151B05D902FE2E3203C3C6458F3B462E07FB0C40FB83FF8
-375942B9C7440A0EFCCA65322797DD2401EDB69D308DFC579403609DF855E29C
-3E35687C40EEEF2D02A2239181836DD51D99A366D88C31AE289787211A3D5FB3
-0BF10D01299C451C4DD869B8BF132018BCC45077647F72889EF81A5BB63669E1
-66F5EE6FA504C44096F7AEE1031A39EB8CF7902D881F6AEB66CAECA514618719
-2F4F459BF2E7E6E2462318279F15B1B20005AD6137F3A4F2A810A7F08D3E0BCC
-4710DB79054C4FBEBE5AE07CB156BECB6316065D24C92272E276EDAD21FDDD29
-E1F4500E0358D8933DEA0609C49DC211A7A592EF2CA1AC5108898F9532311CCA
-37C83333689A12AD0B185747D23E12EB86B0753311DEB69F6F471E0F0C99AB14
-CD4FA8E882FD8D6A17FCE3B2301D85F0FC49ADA6A508FB36ABDDD7A8835CE644
-264A62708CE1742A26ABD8CC7DCD1FA60C856B96F84EDE061B534431E012AB5D
-93FAC0808CA1629D45817ECEF15B78EE77BA22CFDF620AC795E4FD1965976657
-DC97A3C35B513C8A31723C902D38F27714D3CFE6AC6F107CBD8B2E99FE08AD85
-811F052B6424524B1C049EDD48BA6F8D98B7C71302ADF601C3E5BA4BEDA0C7C8
-C1BF6E4B8079B303D30D0434B7F2E47FDBB7C46906AF947E7B5DE1E6ECE052C2
-9935D2985B98DF860982B3D044D325306A769065576686DA5F2E552C6150F5C9
-25D0AE2009A796D322521BA3329467B6DA1F629CF9AD82F9F9BBB30AFC68CC30
-97440AE12F41C7E4192D740ACEFACDBEEE4EBDC3045AF2E1E188FD6E1DE499C1
-E1B3EE148659DBD3B4EA6215791813BFC674D4CC8C066771F82DFAF4C5328AF0
-6292773E07A15B213126F96A3634CE70FBFA7DF4067D540E0C951F919DE5E0BF
-DC2E1B37EDD3B45AC9F009412A6A237E7695AEF028A8D9EF4905EE593FAB2BAD
-EAFDC2DC8455D087E72E9AB830108A138EC1D55D38A040C1A81A1E1E8B95F381
-9B44E42D55EE9057010BD0F7E32AA87D636CB9130F4793DB86131B9B2E9068FE
-E8CD989A94FC0FCC144CC99B52AFD4976D651C0F855068753303593FEAD53AA1
-2CAD243638618F68068005C923E681D214597570B8C418C5F1B606D33C0D0C54
-3FDA50E8CD52D8ACDBA45C88FA875BAB5E4690F866E154C525BF02DD103A7567
-70A307E5AB1EDB318E5E32B6B40A6995666657136B18F9D45E0BBACAEC4332B8
-606F8473AA0971E2B4654209B2353A94C5E698519567EA54377A533DBE6B0ED8
-FF2D5BC21D0EBD7E1FFA597B59826271C18D582692614A48A433A3ECFDE25400
-C4243D260370C6D23EA8EAEC41B3561AA399C67F1E558A192B13F258945C318C
-8B5ACAFF5793CE0FDCF1AF2A05152489398AC405F24C24C4B377F5D44EA10C71
-2D9BFECBC713A9E8CC834E52A5A9D58E9964EDF7BC4F1C0040DECA723C0F5C4F
-1287CDBA5314110299A1CCDFC00E55759606AF2C52B2C47BFD3FF62D892723B4
-110D26139780B49E35D77D3C5FCDC51A3B3E2C64AC161ADD295004B271A75823
-D79AAC2D931232623409DBC3224E61CB529DEDCFCD86EA583C4097FCA9DBF18E
-19700118D65A186F94C261762E54AC0A6FC47F4877236EBF23B0E497F6138D75
-0E20474E2D11E68F7CCDEFD46C5D62E81E559496AA830960F6DD379BA16BA099
-D13AA5FF5DA079A7ECA28B701CB49297C5F2E75A1F851008A0CB290DD0EF6E27
-5A8E785398374156FCAD3D45E704C6DB247CD56BCF919E836DE2E52C9FC0A8CF
-052BAE14101DAE8C43EB766806E26BD91F48FA455C9269721BE8492FC68D8AB3
-01D638D04856E5D203D28CCD8B702B90F32870D104787F8EB6D61648417840B0
-924C38AFC4B7CAED1F08E34E1A3D46A545E86A4A4542ABD6606672C07684CE1E
-D5F2CC4049DAFA3304817E05C5945F70A251873D93DB4D5912CC4A3BA082A05E
-1BEEE45050212C93EE272E8C33AAC196B201E6345FCEDBF5143940B5D9263C31
-B8DB7ACB464E0C3989A8AB68EB7DFF28AD666AD3BD003C2978DCBF5602107943
-E5060D5CE3E42F27B65F058839099C2CF9B7F045D1927C7168202D39C6DF70D5
-00CBC98EDFF8837D6CED471DFE0E7F84AD5BEEBB25F619D672D9EB812C3B0FAA
-9547AD117E6E27D7979151B2512884799AE8B4503308345680D61CE8FA394EE3
-4679989798DEC5B494EAD4C0ABFA713281DA98522810589A2CE473C8C3E448E2
-57BD26EC6DE17D8A9E1847795597413B1D80675B79D0AF56E8D4031300081FDF
-1406B9A2952EFC0F2D086443FAA4D96EE5AF3AA562F67F9AF495B0F9FB438043
-4F955599A04824F8BE5CBC825EABF544158D99FEDC664150D66CE9C85C08B720
-7B33BEFAC455833F57C43CF481DCEF552AD267BB90D0EB2662BF6CF1945822A4
-4EB709E8DE26B4858A75CEF9689EDF05F91BC2BFDF73CEE6B9090A001D97ECBC
-7CE94ECD059F992B608A19FEFADCE3B5270A8641DE821FDD3EC1FC766F0975BB
-8DC349EB7D3179749B16832C7615DD310F815B71717495308C3902CA46C044AE
-78FDE58FADFB233DE8DD6CC412CA9091C02B44FAB96133F0F617584DC2D5C51D
-CFE828040673A5114DDE42228F73B42E1E7C9296C51BB657773D8F15B0797AFE
-E846B26599E20C73E1C9620FBF224446A7FF87ECFE64DDB0D45875B5CDEF1C8D
-36D20EA6F90E09F2A3EB423611423370EED5DA83D5E845051C65755A24F7E11C
-DEC48C78F1FBAB97F6306FF2982E3B61C3AF46F2CA65BC15EF35803370FB787A
-0831506C9FCAEC8299005C68DD453D2107EACFDBFAD9F861BC46FBB3802901BE
-1C6D99EE609C7D9712D9756749D7E8E1FAB8231A9897CB4D7C95A19B734D1631
-71532C43E1E247CDBD404F33B080A3202E23B6F7549C7E8A8F0B050E3DB2A89E
-1E30428EB2D2476F5F275DDA324CBA55D3772B0C460D711FED6D6ADC43CE821F
-683181028981AE66EC16BE2D7FCC2BA13BFF93F3F1BB1BA32DBCCBEDCD9F793C
-30C078A839C27CDA29CB694C74A70C86008F4F2B2B8BACA49ACBBAD11B0DF198
-184A6F107BD42D6F129A7DDFF949288AA27C916694D62C9AEFA24BF172F43B68
-930F7E369000656155A593BD360E0DDF160C273A4B3F538955B11F25846146E9
-4CE0A3DB78E8BE770A7B83E0043B3BBBD60C0333AC55BFB8E1503D03A37803BD
-841A19848AC9AAAF32AC249E880BBC04CD4396DA8F4CFEB6BE6E9D261A3FE54E
-C3BC8A01257D032E916CB34C9BC20263DF0828B5F94FB9006B09A00AF195AD03
-8665CC1E7A772D9968D35B5721163394D221147232ED6682CF081607D82E933C
-DEDABB994359350A95AFF6153F29CD96E4C3FA1FF186BAC26D6B41E275D2AACC
-68FBD05ADA7BB1C68EF37508607C9A81151D88FB40E78890E76795009CD1410E
-FAB3DEDE1A0F2E63B8835743AB5582F45EA40C86469A140B33BF721B936FD1C8
-56D1D571B04E8CF1D856DED27BF608FD3286E827984FABB52D7579BECD5CEC42
-A0880A44C230C6AA718EA897ACFD482E0B79C46E54F6338EA5C58BCA595D735B
-4C1D3C851A2CF846E86D685E6667B8A975F38DC802269CF7B1B0626E5E435448
-406913DE4D10772741BD203252280BB13624C2C56E861FDD9F1E2F9522FFFE42
-AC2E18083D916B54CBA60179AE3ED01FF1792A17DEEF47731BDDAD86ACE50673
-1D8330252BB4D8D4CA0D617B0064FC1F13317F799C1A9F368A3E0AEA888E2BFF
-07C78C6048718CA2D0D5D1A20686A7C44EE73F6D749A9F0A6B978A4A522D3E18
-C4BCD89CBB1151324182605BFDC24C6C450E79EB69E79A420B2E271CC1F903D2
-8C1BD054304250E41624F1FCFE70F0509EB8C6D0530E1D6BF45604FCA1FB7D44
-FCB548EE92CC85AE335A8DFB27647879D0BA25409E4066B4F708D3B0C1FEF15A
-80892005B4CDF4DCCB2B62AFDB72B1E1B1A172C313D7CBF31BC56C897E8D266C
-AC8D30CD36BDBC6FDB790FF6FE1658FBD3244B447404E98BE65368F48B349003
-3E50B4F6F048042CDA62AAE7C6722BF80D56F1EDB47B87028D85081289617129
-15B21BB051833AEAA4BD415D04208A562D73F149543DECCC768AB03B0EEB3CC9
-59C09134821939FD322DA9A66B4EBFF6C0D10C0A973DEEF572AD5C92A12AB745
-84B1624E7200D285783930F51ECBF19AD8E48E709893EE0F1AB7CDA6CC7C1864
-F16EC1D3FFB6B4FE4DB7C9FB1620C3C0861F900FDE317599B4F050D465A662F2
-DA6E93495CFF5DD8EDA52514F3F8E6AE745AB86CD729721E7A3CCF64B0F6360B
-A4F8158F4B952FA4CD3DAC4F5F81C4C93710BA738F96DD57595D424F45CED71F
-6F35820FDCD31533FBCDFB56F354935CA0899CD8581ED5EEE2F85C135F50B43F
-3725DC1EDE43BDC851AEA1AAE8520CF9DD760A42C5D0B3754C7B5C44CDC502E4
-E74830EC45840E287ED7DA2E98260742740D9B904E975F3F8E80D7AB57085C76
-5EB2AC9DEAF38B2E1BB7D50CA137D582B954FDC797845B3CF623E1F243E9B65C
-87077E67C43FB6258770D604E0DF9FD9710B6FD6AD8985A07820C47F85DEA767
-F55210F70BD45DE7E0F3D335BC978E738F274593DFE14D6489366974AE4B9286
-EEB9A4C1A712D6C2DFEFDFF7921BC6E31631390B8132B6E62D6EBABD4FE38AFD
-DE7E0A7B6F783786976EA8402DED90B067E1D85CDBF13C991B4CA2A626A3C8EC
-21B13B0902AD8389C71F14B810E40394EA7D41CCFD4D13FFAD46BF4EFCE250CF
-B6CD0B203E3CB540390BA8DEEB217755C284C824DC9626F917D119934061656E
-6836B119CC894064B51B9FF73B07C559C366CC952531FE858C3B77706BE21A40
-BF0AF668CC376F042E965BD12B020A06D44815327D9F24C8BFE5D4949EA85FFC
-21FDA7C58126B3F5CFDAE27A926E2E45DE062650B615568736B10F7CD8EC20E5
-19773FD4B559D45A18B152315D45FBFB4B57A969F81F42FCCDC15AC1C6890F75
-A87877B75A14D38E37CEED9B5AC39D4CB8E0A5ED6BB09A94E32BD33AE9B894B2
-9757CB08A99818058EEE75EC2DBDDA97A2425754D9D31AB87A1D64700D28DE3E
-3748BFC11DC5D134090B50864981DD72F2999191AA0111F9A23E62B37C67FB9F
-704C3BA150E4227774487A3397141BFDF8F6DDB22AFF40F61E05BBEA998A2A7A
-553071533382226D9ACD4748325C9A90663913F9BD84C40C83798985BFF131E7
-8B3F8DD7214DABC6F29D83E336C337F936CC5092B8064031C5C67AF2563C19A1
-99E220085C7675F59AB67800B82C287908180C25229B856AC5B8A63BD0F0342E
-E72FEA35B9EE85DF933DD7FF42E7FEA8580ECFF435B8AE058DBDA697D1FDAB45
-50F396FAA4AD315A892691D39ECCE620EFBDAC6FDC6FD387F3F20038680DF50D
-9C1B28E5CCAE7CA4F11797B03A39192197F1F89E080270EA3FA549ACC696102E
-3D1B1E762A061D6C772E72EF6BF67293A80A290575990CD2A04A2277E23A29B6
-B0936111C343C67998A3D25E726444CC87E187C602074699801FC24ECBDBFD1B
-E9DD025C51EB2B93387A27659569A2E0C4DA2A7C3BB16EF63FCE6BC8DE27D058
-A323AC3A394005F31D8900CDECE02D3DADB7C5514A6AB69AA7041D75927C0FA5
-A9D40AF9433D103DE31E080F65D1D3D2AAA482EE9432F3CA84903CC621E1DD58
-72CEC6ECF9C4C4B3F854777B65215D7909A15260D3A39CAE9DCFF36B6B341FE7
-1E4A75C5F8702378CD5926103A2192FED1F469C2794C0B6C0918F2A85F512C69
-4B2388B7F553BBC5606C4CD3A23C34F60C4BA40904CEA9D7A82DED088E2127B7
-5151C37145DFBE0FBAF3EDE7828EB3553DCC7CAC41B4B4FB522E3EF6153B9275
-F71917D930792C63680E93C025775367346E04C4B34FF74022A327AF9349B223
-DEBD0AA515BC86E247AA4D797EC20564D1CF0FFA853C60B0AFF544BBF6E82EF1
-6AEF5CE96D05F66D650B4722569C2E05DD039F91CAAE1473E811005434D8D95D
-C6A2071D47EB515DDCC5D9AC58F36ACCF2BAE3D0907CA43FA58DB14AF6D5BA40
-020E8CFF4AF7C80851FC81EF583ABD9B9ECB4D7E8981EB6D4FF6272C7AF2940D
-53C6B3FCF4953344C70616BBBE917A295B491CBCBA2CC73992BBB1C037ED48D6
-CF3B80F5E08EC3447D297A8214872A48FE10A4FAB74EC700B71F2F6EFED27FBE
-243544882B39F3808092361C9F7050943AA4F6D569B67E3436C004987FEF870D
-1CDD98CB5F2ABF72B6E78719A6A6D95E6C918D5BECAA0C23FC99B526C7C8D0C5
-B9E17494C0995785EFAF555907AF23ECB761F47AE1B27ED80E988640D8854294
-5296708C4E9D46B90231DDBA9A15D5F8F2CD7D0E1DAEBB91CD3A6AB60D16024E
-A61A84032B1259BB68A3E8CDB78B5C67ABA884FC908F0E0D0B46F297402737F4
-B8B40A13C9E2B987BFA3C1AFDEE7B962BBF7118E8063F83CFD19107A5B28E0E5
-FB38E0E26BE4E46A68BF0CB2515435A3C9D3A9FD61ED73B3CCD70BDEA56768FC
-7E90410470B0087F9B123D986006E729CDC571DB1EA3D713AB3CAC52C42472F8
-A7325408C9416DA581B49C709E1E35C3980E9F9D86E292D29C24C169A4035836
-749A9D5475AAB3DEE92D6A0666D176D9D0C2D28183459001348453241F632A9F
-E4F5886355B548B13CA7E9766263E70514F495EFAC23DB6F5970325D079F63F9
-852EFB7B135172F5943B51294BC44CF215D7DE2BDAA35FA62F2358A8307D9C1C
-7ECEFC0B93842A762AD1F8E6488140331A7DCF8F85A1364390E213FCDECDF652
-803860AF5FF323B7D0314EC85BA7CA22D6E83AFF66C961C21793601F3D030BB8
-16EB9A3E7C97041C6BF0D15CEBFDEE1C2B48AFB25F7F588681F9B3EE2D5C010A
-52020C0899CC36A1C032840171BB439D30A9D6B0F739910D8A90E43EA370CC16
-AA8814F65A26CF0F7492D076115E91DAF6A118133AC18779FF3595A42A12BD3E
-B61611A23E8631E780B420EA0944BFE9E4E97F5649BD953E8E2981F3D043889D
-F06A4C62B5B90F544BD3E98BA2639AE0AA2190693F4247A91FF8B227FE3FA527
-F11EAC34057C446210043E19E2BFA0C695F33B2F6BBF4CDBC07917E433B4F5F9
-CE078FF709CB1A57851D117954315C893AB0A2FBAFE2290E8AA09ECE87887717
-549876185C50621598452F23CF40207BF4B4171B13E7413379748716BC624AFA
-BC6C195173052D303AF74F95499180AD2D76360521F090C99C675AD863E46B4E
-E7F7E6F0B09B4DDD286C3F9A742C8B909A8545957D3EC324D04E66AF9F8281E7
-6FDE2A7A9E1710B452FF4537C19778A9BB296F4AB176C617A6F1B1F9076E5648
-9AA802B68AF5A81208EC0F7B829039C5C6773EC3B80479FC482F9050079173FD
-9AC1F6A89862DD56EDA4A054E7146975EF106222B6267415CDA5EA2E8DCBD1E0
-ABE3A94DA67BB6F11C66FC5AA8EB61E55792C18CCC945D16BE530ABFCB14DE75
-8DE8D5154E6AF9763FCC5ADFFA0D25DBA667BB614A05E3BBF945B294D64D1266
-9579A4BFADAD351F343B529943CE554FD40D52A44A7180CF894B0781E63B8E44
-62117D0F6EE4D4700D903A72676F0E876939DD77B217279327D372BD4E69B367
-68E654E9F1A2D11EEE90AA49B462D517F76AF2660BF7282F4C78E1536AC5C130
-0C7A4C6E0D698D372574EAEAD8F979312D648177DD0C724CA7400B8729B0003B
-CA47E02E1CE0B32F3A80AC9399517175C47F26E5FBF6AC5E73D178E7DF67EE79
-5EA60CE56EDBB227694AC21A0E8771B516768CBE2836A00A14D608D9D32A27EE
-E2ACC8CBB9D5DE7BE40B680A7FC804F7B9A39AF6E829D112BBF57DCA2D408240
-9D2B89107BDEBE8F4EC1EE8CC6B1F89E78677B8FF2FD7384EBDE659875462F99
-2D4E62D18C0A8ABD3B87D806FC514B0E5700E83D16CAD6EFD00C79D624FE841C
-7F98DB4ACC86ACE1776DF5439E425CBC1C85D489E4D542F504D384B09209BFE4
-D3A008E069B0FA3A71CF68D097FDE55712C7E6A5BEF6CE8BE02A4E92EF5231E7
-0D8905EF4FE0D5198E32511F945E1172182CF690D7A769F8C4F76754E5654BD2
-A9F9F23B6C230B10E3AF6CDC745538D174A75B97A3CD3697814180BB1373B296
-203E523EE5B64F1EFA979AEB8ADB60CAC313F117EF8CC53FCACB4883E26B0927
-7897790E4AABF9667F9A91AD32AB1C5CD27C26C5BBA5DB8AAA7E7514A239227C
-D798DD6AF110481A99753FB9B3D570366DE14F6C0AB4C31FE068B1876934398C
-EC2298CA0A9EA5BA245907DA786D901579C497C3739BCB6A4DCB2E34E21A53F7
-6F673C1131F114C05FD1D3B37BB435B726AC2389DF866200A75A151725788CF5
-69C1BE79FD6FC36625BF73CE46A4FE5F12E5692B47F7C26376DFDEAF5EA847F9
-367997E05255C7EC67832533922B997028AB8018F404ADDBDA81BB0698AD69A2
-B4C217C392BB250B58BC4FB901F2912EE8EB6703DB24AD7C2CBFAC12F8D081D0
-A700C39130316DCECC18E64F3994E2C6F5E0E1ECF2EA4B18FCB424D9B8DDE8E7
-ACE87FA17D11158E96FD6EAD04B12B8917F420BB29F4471326F54C896BF1A475
-3EAD86C7968818F95E632A852601C07CE9AA698FBA3043D86168FA27FF43DECC
-C71581DE33FAEF3CEACC93F5D626FE05894F8FC2B8719A92261A215929127FBA
-BD9157BCD9D4C5D62D08E7E690F1DEBBED0A839475B1427A7C91E7F42C3CF6E7
-80E8B55B90566E21214A4AB708383F0A3E0406058E26A1C34786B860EC597A56
-2E33F58DE6C6850B71E88A2BAAAA6CCE519055463B468E49B2FB70CD32D84B8A
-8EA3077E49E848149B2A46AFF247D80A42CEB44278A9341B4ADA55162F67933A
-3BE72A237DEE6B9CB4826D4584623FC93882C543D173B22CA22E6D8D5CCB02D1
-25EDCD56559CDCB126185BF4128C71F228D7CDD7C617EFF12DF100F64925BADF
-39E7DD693362ABDD7E17C3B21A74B31D05C9F4F067BCC1D0AECC6C5DF33D4C77
-04DF0394656DF7F564BD7849A6EC8A2A0007E6D32FDA98F7903CD8DB16D85DBA
-47416DCB4806AF61E901490C8DF6A42D050C5C07502E7AEC9C15DB70BC015E02
-9696950D94CD0A7E8D46557DF9226B1369975F6276182B92056065B2548F9717
-05D488542B6ED9CBE2898A37C41F3093C8441502585D607CF07E8D1473C48D29
-68D4217BF4B16F8BB279A9E7F4F4CA461A9E9FA912C1BA9355A4261438E9CDD9
-20B0F7E2C324A89BBF23E8973783C2367AB9C59693E1C90D3466130C0154AF7C
-008E052A63DD8EE001FDEC48EFEAF1AA7A7FAE4B10D79C74E0586CB3E9809DA8
-E1946A3E2EBF15DCBC950914B860ABE6DCD273FF45D57246F81DEE176B7DDC9D
-C5359E1291B5671AE9FCDB06DDC08FF46607E784084547AA7848AC30A32B08B1
-3FBFCF2829821733FB2CDC11AFEA7DFD97B8D278DA3A8258C69532DD625F204C
-81ED8DED59753060C83C4FD0B9B4D09E1C6483637F7C8EED13DC01C2F477DE4F
-5AB6D45C17BA5B2C6E8219B46960E39695077D2770AE34FC50510067B89736E9
-D172161F0F1E2A7FA79A400F54AE4F20E673A3D91D892C7F88BE4237F1A3CD55
-BE5D1F91FFBA4A88397329E4B62F9170AA553B0E7BF2ADA42C4AAA6920F8AC9B
-0EF3425BA25C2EAB8DE2940857712C68A12B5D56B9EBCFB4F19F63075CFA8E03
-4255EC777F9FE32E47905F950BA371B539D7F9F55C21A04F1AC6D9280E8C5780
-014794256AD7B05A69B84AE84337B5C678E43BEE8445C0F79E621DB4AEBA9188
-2410D0E6720380755B4AC748301CEE5A235FD0C1E2D675C147F3C62037708EC8
-0DDB1C349FC6ED24879F0202ACD4C881DFF4BA4116060E65F17F07BCF2CEE0DB
-9E8FB76D0F8BBDBEA799071F08AA753BB3129FDDE4D12B32F5D566D8C9D6A35B
-4A69C077A6BD909F1BAAC2A2C62A6AC64E722D1985CE4E8771F53170A20D8543
-29D11CB175BBD9B632C89E4A12663C0941091A1532DBD59A65CF6D44AA4B08E9
-7B5BD346182AD70A34A2527E352FAB0C109AD72EF443A5AC713C005564373733
-DAE20E3198295D8DC532ECB3F98551F84AB2BAB805F2EC2669B01F1F5F9538CF
-F6D20E05081178581990783705E24E9C25E2E82D45541E5C16A30A72E2E2A168
-129A688F199DBB9575345ABDA993DBCE8CF4DF1128B0E74B6C01666CFF1A17E3
-DFF06C8D3FB42097BEFB1B33A25F4BCC9024C29B4650B43D1CC0B79665D05D1C
-751F94FA99175C257EA991E6B704B75714FC7FC9D5A34A1A3019AC5D9EA8AD7F
-6A75CE3ED13ACE632532BCC589F8E94B8E08805C56E3D91A6C7CFA23CDDC4767
-BD735DC2A7FEE4AF8FB251174C1015127CB8F7C8BBA872BE416FEA0D359CBE84
-D915D1E8396E1267018CFFE5447CDDEF6726F47E499613589B40A72EEAAE768C
-9FBA53FE832BE227F605E4D9E67FDE078120869E5F71E3F05A31CD37A8E48458
-6BF4BF69736DE755C90D6B88D5FEE096ACF50F5FE5523138DBBC095DB9ADF46D
-BE0384A02C4ACE11DDFC5FEECD1E0C4F2554BD6F1F235C8F980D87059DEFB98E
-411320060518A16DF3DA0DD8313C305E5355FA2131E16FF6A19EBE17619F5773
-8C626D6BD2B7A95CF9FC6996DC514FF0915A585AD3C6746B694CDD7CFAEAD58B
-2F842D764F3D0B6AA582D3CB96632C6A1AB14BF49BB4F3CF59612FC40CF63A5E
-E1CC3E2FDB2122FB8822F3A85A4AC58683CDDEB72C34E6E346DDC00FBEB75FA1
-3E88EC10B348E8D8DF2053EF2921E8BE24A1CC861268AC66CC4647FED7EF6ADC
-287821A9B3AD7191E9733FD34629DE60C47417167ADB5C3B2ED7BAFD2278E698
-6240EE28358460975D3FCEED4C2065CD0FF3AAD547E1C63D37EF2A94BABF9B0C
-9525F03D5385CABC6AB58077F2AF1F9FBB419BE35A8980178C27E4A19F30AF35
-A48B18A129B900CE280C100EE5A40C4E6E393542472014F905C266CBFC75ABC4
-FDAC0228A9E73BF3B268D9736A3F8560E78B48A0D7DD43050A0D7757A4BC7C92
-6C066B399F71CFA5BF090EA459CDBBB674E03757179C43CC5B0FDC950D6C801A
-F3D07AD30F08A6D299D1E784152103B54ED264156A97D64AE4FBDAF8D5EE20DE
-1B80A4E6AFB427A0C18DA8A43ADBDE1BCE9DD46A75C1A1D15995370F792BF843
-02D4672D4493773F5907A814ACB139498953B52390D84EB4474934713976B9F3
-BF26CF310A682FCB955682E4699ED265B520D5D7800F9311C6AAAFCCE8E92435
-E7681D56C537A1C1BBB1C2CFB94AC92D816983C97614E26B062646E2C8808D07
-5E18B87ECCE3A0213EDC73919F7C9D80536F98DE0B9995D8EA4A2633D2E05417
-AF3DB26F9268647AA646C4AD12C3146745A411ADB2502D1ED58E46B7FEEC303D
-87065F9B881907F127E02DCD321CCC580C89FA6B3095F607090B2786E5848D7D
-273B36207D75A008365C5F1DC4F748E78A6F791ED81631D7EE1E6D79049B8F2F
-B7F38FA45B8809B4BC05CE91FA3C2F6F6AC323B3D304E8EFEC54E20045B6AC57
-D08055CB193CAAA5C53454E279BE8F7F38F949EEBF62795AE7B5DD0FCAD1C3D6
-4AE4FBC6186C750F3F2DEA0BF8B65491EACE7DE5635470EF6F42C3395D7BA0F4
-A0DA6BB1A99FEDBD90A551FB217644CEF9973BB90A7FFF3318499582A93468F2
-9E766C2906BC6C4BD7E300E48C997C474C03E2A34D9B969ADA9AEF04843367D9
-AC4A08FD88BB672F2DFAA2CD0B871DF62A43A61AEF77AD88ACFD112850940CB1
-D74CD733FC4DEA77C454A52ABF2BDFEB9EBE3FEEED53CE6D4B1968F0B2BE90C1
-12F96E7AE2CF62F7C2601B589A92D8B024E00D4E8B1F636884803554E9B82005
-8329EDA334D1DF5EC7384418609A8D89909245737689B1D108186F4C53237559
-EF42502050EFD6E7F822F835517FF93411F08B5FDF163CA1A19945FE51C31F9C
-9B1EF8AC79EB037F1E704243CA1F33FA130F8DCC3F56219CF6987AD73627FFF6
-1CBE6C8911831A43827D5505C1289A62C7AF94DC668300057993FCC20F752A75
-5E79244AAC3D790CCBA8222CAB05A953BC9BDDCCC59E1AB9F2CFD3480B836B79
-5C74D384C53723CEDC5E42212CE487EEE190F6B067C322610A6C17E0D84A7DD4
-C3171856FFA19470F84E207DC9BEC7B44C3EF2BB5B043929A5E900750D117A20
-EC2297E4E6AECA011F3D08B06593518515B495DF8D64D3312AFB918985A3C4AF
-173ABE8C26318ADDCE1C262B03000CAC5B5B4505B26B26A028496703493D3AC7
-E24AEB4F741A6E4A68EEFA0D156E58CEF880E0C41CF6291D0AD20D299026B9B9
-D09BC425FD7D7EE59595CE14CDBB36CB4763AD7AA8841DF5C17FF3A4099BEE95
-CDF6DCB8F9ED7E118BE4F2D2F5B4D67A2781F1E2C1DE8CA03022C964B1337830
-1E20572FEA296D9FBA4FA416056378BAA8A86C165A39EB148B255DE0E7EB6351
-EB53F4AEDD8D411703A3F01159BD148796A1FF52666D962126FA863C9811B3B5
-ED20ADAF32EA3BB018EDE34276FF46A7153235B2E9D778402952F2C73CDB0290
-3C24E2BD7C74A77BC339F7B421983E6146F64718605DAAEA2914F3C4AFF5E078
-63B7DE54810BEE9F140B9F4B0B84521AF90C462914CECAFC07EC0617A189158F
-B4EFE2DD47221780D87302E00B139F47239EB174102E7304F6B83B71DB890422
-CFFB05C39ECC0EA883849178EC773C3F0C6413FDFD1E1DEACCAA89FD71FDDA42
-B206A827F434160AF34813CB02BFB13B08ADFD7A0522ECAE1C57F0B35292DD55
-213A2E2D4E7BA5971F46C438332D85976B7D2F15425CF626FADD7F0193C88B8E
-365C3724440FE3A2A3C8CCE159F7508D23AEFC92EE92B0F824BD9A5C44FC96D0
-8126FA6E5F23A6207D079E24E4426D0BE4798B9DA83763734EC13292B5FD113D
-D5F83379F86FEB25C1ACB394747D34F0913B7BD34FCFF65AEA28FD21BEDAE94F
-CA631856987B7413A7F7C5CF8DBE3C900B7ED998A3141702EC5B86BC12FBB132
-24608C6FCCC626F19871A87B5AB45283BBCA5FF6F1A19277D7DEB93EC5EC9977
-4F23995267034A21F92766D7CD17F573E1017AAA96A61DD36C211DD20AF3D34A
-340900F1188A9547FB19761E2AD2E0FD506F17F389CF9EE7D8BFC1106195199F
-59FE361A39CCB0EE0D9E3C5782AAB7B6E5473B50E81EAC6A46047F110B155079
-9EF8C17A6BC2575A28D2447E3F08742F4BA6205B5C198BD5B9FF54FA07000468
-19A6A54448108F6F80CE1A07F2A6890AAFAD3CC15E8505EA2E2B3A3B35663B5B
-FB6F6FB1492DB5DFD395F8703159A8D5EC1E73F859722755453931FFE63B8D1C
-7377F5B64B3BA3B854C245569A731BB6C13A7AC4C6A2EF2374CFFAA99CDD3984
-7BC0A101F49D0837B84BBCC374B5FEADBC644FD8A5E66450AC95E28BC68EBBCF
-0E594CCB0BE38C6B50D4958B0333E568BEE976DB2E19A8E62EDFB683B7331EED
-3D67E0C0015948B07F6529D2620FA14FAA23A898A32360B5BA9E21BC24DF15E8
-669014A32F848EC36E63348B0FCE5C5035DB8C2234E3164DEA3243633046903F
-94EB81AABBAE58A1D2A6EBFCD301BD54F49A47670CEA8E13013DCD9026201231
-CE0687971DEBA09310443ADBDA9E637C2FEA83D73048BFADA322E72F3C577C16
-0C751FBB90641C66042E4487DE1954A2448ABBEB51D1C11B312A3D5A7E1C3D71
-521CA8F0996C2143A0685CFE49C8BCDDC0E5403823122076A1A9EE3CFFDFCA31
-BF6A4BC12E03022A8D423A71FE46E17FC03B333A7F09E879F533D9BF149D1CD8
-B7A8265D47F2D63F6C961C003250AE33321BDF8488CBA52E2AE5924CB1A96482
-C5BADBD45C8E2F6794E265FDC9E5D4BECA1748BBAB6A6E1D37A5902238B5676E
-32409C3053B8C8F6E6FE3C4CB1F3DBFE8A920AB0D4D5903D877ACCD0B367E912
-C9C00CBA8EF9A3D9F7E042CFC3ADDDF9508895A9B4C61D6BF0B76507013EE065
-82241B0AA5B0EF9E30A2120E154FD9E844FA1ABCFA468D7B3D58A4C97E433B3E
-81CBB8C498B11D75A2E818EBC52EFAF545654E2B60207B986EA905F4E16C148B
-CBED6CAE4C7DAF3EA41B1FCD32BEE448325DC5DFED2585676CEE3B057004EE9A
-1028F7D0488443BFF30384C88FF25886DDC80A155DBFE1DD0A9161F5E9AD8DDB
-9C81A53981E6338E822372062488ADE96CF40007E4AFC7F6602BDEFF3B5DB602
-50D1418A90EF6AC7A630EFF91835EF925CAF67C2DA09A1929301938C5DDA0EB5
-4DF4FA31BDB196091A0B171113FB3E293255F76A78195643CF930776D2CFD22A
-8E991888FC446ADBD613AC37999EB3E14B860BD70CF6B77538A8512F1EA8876C
-F68BA5C67BDE3249C2C46B91D1C86E153D774B9BDE31FE310F24C69857D7ECFF
-AAB9BC4A73FD94851CE77417ED982BE376A21AEF2C167D5858534EDA58F06509
-1C21F5D13F23C76B599873E237A9D0F13F4E93342F601331C93FD12EBB6A3A96
-2B6EC380695D00C55DA40F6952F557450E914519BF6441279EF39D7EDBA95112
-F28213BA6CA883E68B59C546484F76BE53CB0B6732DD19DE6065CABC0F9F9627
-75DD538AFDEBCD2363D39D89D0A3778F7FA728CF375CE8029EDFD0A068FB5CFC
-A13E5F2732700EC4060B28B7D7C1252A7B9C421AA6CFD0970C4C29596EEAFE13
-E8A8DCB6749EC08D9B25CA464B7A7F94E518B269AF5E5E532A215DA9640B6E04
-0DD104E93D58236D0A2C481EC119FF16FA1E0F8F3349EB6B0D347AB5A8723D45
-348F41971756CCD0BF3FE5F03EEBBF78B974D1D6CA364C5CE160C8FE154B3176
-3ADA41D6A7D2D1F0003489A7DC354ED43CEE9F121BFF9A85F65225CA38C7DE79
-EB9DBFE2471AFF0F8407E5B8C64565BC219C22AB0F1480908E1B5550EC510FFB
-62433B1B36B30861E183E5C2EA573B54F35F2512CBBA49B7BE5BA2A7F290ACCE
-FC7DF2AA1E5882A8831F9F105776E9DB60DC0DEBBD1D1E8403704E246EAD6286
-454822A957EAECBF31AC200EBAC45E0D340FD8587DB953D3F9086F082487D2DE
-771D52AE8CA7416FEC9E91AA0DA73F969498A9A1610DF691AD908917EA3BDAF3
-78D5A705B156A95002AF6FA3BF3360B5DFC67F1BEB4EFE9933562BD01DE2529B
-E044F351F50D51EA139828EDDAB0CF0194BB070ED70B68008258150F5CCB185D
-92DA71065C20C2807B3CE00CC0FB725440B7BF52D0F9F6FD58AB3B0FD89CEDF0
-1414D83D25F9D2C91A5FB0EAB5DCF3C51902588EACB5ABF77736EF39DBFE403C
-D0B13CFDC488D079A86079978DACD3E4E5CF112623DF2AB161E9A8387A523081
-51A836C2240D7FF33E113BB6F72843B7EDADBEB595D3C0EF5C55C5246139EB79
-28E4FEB7C216B4AC7C8189CFAEFCFA919284893684890F17910242704CABB4CC
-D805F4C67DED52E59830BD569B19890B527BD916847C951BEE9652E602AB3DC2
-69B1E2972ED868219023805692F80D83DCD99B5B454FF9C52C46AED905140F10
-AB71305333855E1E8DED599F4824BCD118E789BEE6C260C99CEF1EB36A10B13D
-7AEF20B6FC8EE0436D3C4344AE5DDC7018237B440867AC459C5A31F9171337AC
-5E8807FD64462C64C63A434B82D3C0BD1EBEA855399DC50E7CCFD487097A1561
-62F5F651E527FB70C0E47FE6680E52015FE2399E25F00FD38AEA37B13EB42435
-C4A6084C618A12651AB94A09793B7B5633C350CA69EA9B1CBEB45FD240FA6D24
-58A6AAB28D6F6C97AB6854A0B04230DEB18303C2D77B3B7492D28E632AB60EA4
-DAE6441B7DD6804C47314951870CC30E662E9FD669CF37E4554474A6CC593801
-E8085F0AF185FE7D8CAB69969DA62A37171FB6EA39487D2BD5F689E6C67D1EC9
-4532C8DDACF164CFC7AF6850F19E199FC0EA6AF11078F873719A5A10DF16CD1B
-F6968D78666E0A12B0E8AEEBFC7E523C37595A47279F1AACD6D7C832DF6CE944
-2896FF8F09714D92031E48652BED4AAFA55A84F5F06CF37095B37C6EE05CCCA2
-08F3D27C885B89F62B68768BE01AEC18326634C4EAA7BBABC3C9C4DB5CAC46D8
-85A79A180EAC7B74B3DE2F1FAC1C8BCE424886FB22F1F45DABAF374C7EFB8573
-A9E9BBC6F6ED8A720E174CB8FDC75B81663F4B85E472568E5D5B19FC25976FEA
-8A26B417EA52D4A79169FD8B9E0DF0AC600642FB694621007248589923F2DCA2
-2265ECF240D063D6A682B7400AEC39B965CF6522EC807897097DEA226DCA64D7
-36C85D0DDB18E290CCE3F7E1301D04E91DD624D2F864CDDCC77CB34ECCF4AB87
-D641AB6901FCA513685515B023100D735733CDB77046B69C08AC0A0F65B65634
-437E9689D09878191F6BD79C0487EA25CB34724EF394FB1053BA4E6201162CF0
-AEAD889FC81C60601F9B53F161DB6C9A8BA9ACAA7BC29E489122667C9A239466
-59CF8981E1CC278C158D7AC2B25B4CAB265EC46477E7E3E69A98B3EAF47E48A8
-DD27803797671AC9F0290BC23AC56649B34EE46C97533DE11E459115149757F7
-C8050300EEB391D6367C048B5B48078265B5F70C57A9B8EDA8D242FD220EB33D
-73FCBEB3E29E36C37D59A536945B1F47FF6B9EFA81F230A29403A2932E1D3CBE
-DF6EDDCCB02F4C5243B3C43A079F32329BF852C894F7FC9B4786A16CA9583D4D
-5ACC28C6441029FEA945FCC358999F6D7CA5418356A4129B98AF5B2066D141F8
-07F7036B51FF49CBF6878E89DF3B9F226A9C019DECE2FC8B7CD2F7491077AA59
-8A30A25BA74134B01F43F282B121498438AFD69D7618C77F6CED9F0A3CE2ED9A
-64FAB7C69498548C51B96FD7F3DF274E399577491300D4AF7956C851A8E058A1
-F49AC57A5869A46BD5B51523361AD82CD3252323899058CCA42EC1DEDEDCB53E
-24E289D0095E37B4067FD051414E4B06215350F9FEAE5FCE1479E77BFA287857
-9A9AF5F7BD93FC5A96908208949EAD6482366F796A88E9AC15B6F24558C58F14
-565C9CA8EC72373BBF2C54C97C8FFF8442ABC8E25DDB4FFB20EB229A4031C14F
-FE32FF67BE4A28EE0BC60A6118EC3A8D0AFAF472323B0065C670CE41FBE92F54
-CFECE8751123AD3D51198E5EF050D8C751345E5AA0E578F4703340A3EC431557
-51FE351A355FAA778F3EAF00223A0BB03A7DAC11F58EC64F89B2A1C249A9F720
-7C373942CE60666CB9A988E8971E31CC706A9516694F1F968FD0D902BD69B6FD
-5E04755A10C8DC057E60C71DCF9D6666FFBA80ECA59CE185AE97F8CD64CC7949
-76FF8D9C9A0FD74835A67F2A34A1229A7D9FB0B9252089BE32C320D28F22C93A
-358073FF58864EB4E9BA5C83BDB879C67DC64F591F1480445AF304F6CF657265
-06E758177CE96259B3B2AC1429D549E249A8FC90444E6CE1E96D7D57A5272278
-076C2055BD26144686880FE76D0161DA226BE79D781DE33EFF4F9955C928BD6C
-55F16E14A5A2B8306164D863C2537CFC05A7F1B9E9221321924D33E29C95321E
-D5603A85A3F3F890204BF7745202DD217CEE21BF45514B8BD3D5018DB01FAB56
-E5B85AA57D26C115F349D826D21785FB2B14B16C3A1C3D764300C6AEBCBE66DE
-4D8AAC6484D20857694BD65065BF4BFFFE35D86D6C4AE1A29E927861D180A339
-7476FB6DF1817BC6A077CA5BFB568F6CB759FAD1DDD86F07CF9F6D6B8B320E01
-D9DBD04D0315ADA0A2F8010DA572EE6AB906E55CE716AF7969A3F64097210C94
-7623AD3E0748DC9614F27C4E5F614F13770A7C5B49464AB0E6527CC6FBCE4794
-BA32DC1099FB73AFF3EF8DDC33132DAAA7546BC6359DE8A49254AE44963830EF
-7A69566BCA08FD8DD4C0982A38625EE58E39BA2762CCF85A27B037D34BE5689B
-880D9446476613BD98CD3DE649117FEABF6156BDBD39AD05F360488C3A80BA3F
-C764F11DA922383787A8E93F945C8E9D1FD4CA16AD0958B21EB36B84B524A9BD
-C8434B908D4CFAB46411E997E75D9F48E140C50ED2B56723BC43069B42554850
-2A73B211D61800ED608891BFF059E8C49C52BA719CBEA6681A9BF720E86FAE4E
-04D5BA274046D9B103FF247068EF9B3F51C22F518AC1BE20B9A00CD21F341BC6
-FC8C1FB5072C69466CFD1F1085A92E517883C037F3A73658CA74686F07BF742B
-98C121BF9888160E0DFEC324C208409D876B887E4447CFC4416C9A4358D7B1CB
-769BE77537BC8E2771F2EA19EE1440468925D41C01ADBF2484D8B5321EE18DD2
-A0B1F570E0BD0F8B0931E1C6DA0E71F1E995487544B22AE91B8C2B9AF65224C4
-BD3E3BB227FA37121E31077601FC205EF5E5B69458333784B42D07CD58AA73DE
-8FDCF30351D58B586C9A6116F0CED2298B7E6E088247EBADF24DD85DC2680BAD
-D217DAB604987181047F426ED848CDF475A9D19D0F00AB7DCE4E3C73C8B666C5
-37C09106A440E2421E94D699BA881B53D98395F47808FAB1D594561D46E82175
-0FAFBAB8F8197119F14D789B7E798DE37D62D2043EFB8DB3F819B62238D62E8E
-ECFCAA92C967CB2FB089A8AAE36AA54C43C8F9AA5A7E8D88B178BB878F4A7073
-1D6BF3309D05856F4AC65191EADBCDB22982431C86745C3E01B0F563B2405AEE
-1E56370F1835559BA096C154626D36C090D3F32EC2EEC0B35FF492A08E61DB6E
-C234642691A4B214E27FED0D420254C5502AB9797B273B8C6DC49DD29CF1C65C
-CA61944460CC2ED03655E713B63DF538209FA69DAE84B4A3BD89F7834BE5AC7B
-F3C6CD20E8762AC2E365548F396D32FDF7349DBCE34D93E68C626EEA8DEA1EA9
-A369A6435B000C4568BEE6FB00BFB2553D7AA6923E3A28B131A135920A43F5E3
-D692FE12C30A2FABFD2047DEBDB4D9037D87B7FCAF0DE6EA92596235FF5B16F5
-80D4B99B2F98B51A350D8609C9A65D0E6BB6CAA01AD47912D72A869122A20E76
-8FFC5353BFB61600DB1851169A8B0CA7461240A1EC10351AE38DD223262F5F1D
-C00DED1F9AD9F805F8C13E34E878E64D2951DC05C2F95AFD57F8C1F0316FDF5F
-61809B7AAAF7CECADFAF70C607B77005EEB7073BA88B7D6FB714C10C313EE3BF
-82D1BD536D7271F012ADE21C41D2D4BD9301305BF3FC46323C0F9F58C3229897
-F691DD00E9C538DEB7532019339406CEB61DCA9509DA08B4E5ECB4966369BA10
-739E73F3A6C527D685900E6A592D25D01EE3803EF8A741232C8B48C2798474FF
-03CB68F61FE1065A45C00E86E339580EEF6A90545B04EFAC45E57F0B5E9BABCB
-E053AA4FA0C593C1704C58858CE462891FDCEA47411714BD9F42CC66714A1947
-5637755E85F7CEB3F85720CDCFC6594FAACE2E49864514B00860123130D91672
-549C4B4A46F3488F41822C30C927430207BCD5BDEDD48366A1336196EE37CB90
-EE3193289796DC165A51E6C01FA7F87E6028A8CA46E90A47154BD95412C803A6
-97F35D80F6FF9FF64053FC3F67E182A3AE7E72F12FE7D85778051CC8BC847FCA
-CE8477994CB78628DE7F366A6337AC42372E54F5809693F631910800B854C832
-090D71B89E09D49256B84F5B0A2BC26AEE76CDFCD9D58F4D739B73530AC7FACD
-B66DDD8F3E601336999AE1D93AB261E1A101DBE76C7C9C988D4FF999BB480853
-9D366BC1F0CDBAB25214BC5D38D3383C85345662A65E98851321D776D34BB6C0
-F7E3367D7329714A5B8524213DB65B36229AA4794ED1B8B9B735B59CFD4136FA
-ED923B234EFC0F1B10E99B4778F1616764E3FF5EA5ED64D7488DBCDBD8D0327D
-79E703E5FBB73192658B48A6E3A50D43ED6F9CB14A0E1767C1624258378BAF01
-B4374C36BCCB1EAFBA373538844F5D1F36E25046722DFEA0398FCBB80B1509AD
-F76C2C452C2A3668231F46B8A953C722FFA795A9B25F34FA0484CB72DF2A9E3E
-AEF724E2A120B9C9D3BDB7BA2F1688C85BC8B4F3AF3137C3B5AD07BDE5E6DBEE
-AB93BA821562CEC2F498A406932E1571A1AC323C894256D19B1256FA855DB4E3
-E2B7B1F286B3A376ACB8EE51BC3036838D9C5C6D275E92D92FB3A04EE15DCEA7
-83E772D8F2EABFE039652049758504CF3BB46846C071E1C834578ADF50ED6BEA
-4BE184F0DC7D792825F61FB26B06E8133A0FE6A5A50D804FE19E3C58CF1FEF52
-3A44C7DDAC8C9FDE076125A5E69C61D7ECE569901764FB72C9FFAA7AC49358ED
-B49A2F27361196F608636480F5F59E7C501D77BBFF424DC90FFB76A98B10676D
-5569395477FACA2071053F0C8E233F6D63B5690F30ABEABCFAA4BB42701332CE
-B2E3AA23501DD5164738E9C7649E1B3FEC004775BA90902219C5418411CF3E6A
-964C79F23EFF5867E97CD07ECE28E017105A493D1DE4A4352FC0E82966F1323A
-06719F6C7982E802385193DC4644C80E0F849A9A9435236C9FD97E7E444A8B86
-531F89DAE02563F58C45B8360F38101B5F27536C91D04277C39CCEE90E7D3889
-80AD6E6377672F8C3D9157BC6883CB6CA46F48E2A2C9332647B8C6BAAA0C64B7
-89D2BD9E096B0AADAE3067BD9789A7340C46B398F4CA1944AF01A383875F6365
-63D143B3944E283A23D54AB91459EF2334FADC4D4B967A8B415841DBA74E7437
-0A7E38218C574189FF14954F1CD8B2CB642F017AE7F226A9B5D6B1887864BE11
-B36AA442F8493AB43CCF30CCF818C93FFB2148EC95F4E53FD2B203C9DE6C1335
-08D0CA053B70CD72CDEAA8C808B71B14BEE9B0646CE22C37B1866715238B2E77
-0ADC53682451FDF6D89ECF1C0626E41AAC7E279AE8335140BDA6FB0F617A8E33
-9D480F774DFB91528FAC553BB0948B94DCDC3EC4082EF3549E669A7A49C83FED
-98C6C7DD43634C8321CA5A3BAD048442CC9FAF839D7647B744E11FC9DC7ED2B7
-1E2BB9E82308703FF7C7C8C123D8CDA3631FEA47EEA9045D6DE5BDFE87E92B58
-E5404906E06B417F088F9F9F5BBC78FF369CA8D78F3AF16C21C8FC2F38E559F9
-11FA7F88FCA559E319D63A6EF43CAB1C7E2C50736627674ED172BDC507D7770E
-706DA40D79895E339D3DE90C2B95AD62E9882D9C306D58F80666A419EDB2A0D6
-0841DC59C6D652343F31BD5FC75CCA2E69C9B8495C9518AB83E95ABCCF6C5475
-94CC30358A8533ABF1D9A550076A6652C0ED47B6B77FCE29B8CBF2A7A9329089
-9F310FFF1F64AD75CD3ECDFE4507AC92C3448EABBF9ED97FE3D9E10B1EF3A0A7
-D692D0698047F685E6401FD72330B7B5736D285A923360C4B6B271B74544F855
-158BC5FA3F971DA2492E6A75F7A2F0C3871FBE4D4B4B326131FA1FFD6360F34B
-9853376D4E9AE399DECDDC2BD6D790B59A0090BB748EE0EC0D459F203604741A
-3FF6D964B3BF1B72881924F6FCA5C778CE8CC8513B99DBCEA1A8BA6E46DAD45E
-9A6EB90AA1B02FE6D857CC50699424F559E976FCC174BD5459884F8A723FBFA9
-9C7DBCE6D0D6E426742F6AFDD4BC603254FC4A4A53E54352A79E74EB198DA28E
-72ACAC529BA702956D1ECC0DDA91F64C822F3B1D564BD0EE11D26642E12DDD66
-9B2FE63051C59415F42D597690C369CB8CB64A8E3EB300C5DAF80E6F9DECBD78
-07AAEA84633498558B623AF42FAEACCD8D4FB005180CC5F55CC4DAC3955E222E
-AA4CD5BAA529080F195AF80FDFFA970CB01B9AA321274A8DA701C9A381B0F21A
-977E59520496E965447F88873026BBDAC1BE01EB7060674A656918AE89D6875A
-83A4A71A8E583F09CB7C7146AC9B1CB5866DDFBA9F6E428A2D315F73F9C4049C
-32B630F243AA9F62FAF057BA3D8C042E93414867D6DD3DFBBE9FCC4AFF865449
-B3A7AE8B3665B519CDB7E2372BA6DBC0EA2DE31B04C2A16353A29A760D409CC9
-F5DD03E2C11D29E0D545053A6AB7EB57D556E25401306FAF915968EDDB542D62
-E2F2D772CB09B4723DC936C0E08189539972622D8A2007A3DE1972083A902D7F
-E50C882272691FA11D0013D6CF4DD34C6D2062C2F7E62FE3467E665D77A40757
-B16C6136E7240CF39704F49E8DDED8A5D60011C24177467763373E93730D04E2
-235768F2FAA0615532EAE537755434F130B1F83CAD5FDF4092FD20A324B3FB30
-80C9F16C617E2F13F315ABC8B2094F8C768277D629E10A6D0A9ECCFA0821ADB3
-D76C8206BD399FB5AC93AF557E2E982777B6C1FB0C4D74993E6084C1D4F50F1D
-F0F50BF8B5658FFD4AE0C6C1275C06100D2DEC016F809CD8D9FD3FE7A7EF988F
-8F0427880335F024598EFB33405D55C44DCB1DD147C398D0335E22AF9A195D53
-4AF6189CAA57CBDC5F08272D7CF1B5BF92BF3AF8036EF848E437B50688F49D49
-46F11D87415FD9ECDE418F452EE6FE7A3DEED95A0996BA0862DE216DA08858B7
-524A78820B2A5BAB4ADBC1BE71D69B02B149DB5CCE6C859A38A810C901CB845A
-F9873F64E986CBFE0B2D2146DAF2366757C8FA62F7DF8959CCFC78EB605EB6CE
-4E5B4BCA9C64258570EA229276FB5D417CF1B1B315148693C5EB6996CFD1508E
-67DC8BE993EF72542255F7E323CC182EC88B844AADBADD4888A8C6DFC1C39843
-0C19767F9883749D6EC9D065C88DBAC9D87AE9BDE61B8950A51FEE9E531CA3EE
-CB14C95B7301CC5A7A1B22FAA9E1E956EFFC9BDC1DA96A8910E733E10CF2EB61
-B7E324653C797D1DA73C2C081D70A14310D0588AA6915B0F05FA2CDEA0FAAC6A
-FDDE41FBB23B5CA3D0CBA1CCA54C6C685F12C1DB1B4E8943AD873691186C7A13
-C29C42C86F1E46E1307CE630DBE4332188CAEBFBD604252EEC001BD89FD79563
-D79B17FC27A5506496576A62D3EC8DA2EF2BC0CDCAEF707B3A18978DC99BA0CB
-3D6E611BC0E27CF54D8478853EAA6F80B3A698D179E8660CFBBA117EC0694457
-44D6DECED3C1DC219D63D1EAA09BF546A16E28EC76B7EEC8B01C4EA1DD332503
-8FB779A7243A90B4A98201B51D27E02083FA278BEDB9FBFAFFF82C4772F2BD17
-53AC2A75D9101249F2B0C52F0C565E6D084C1C6C50C084EFEEB5E3AABD25FCC1
-339773BEBCD4671779FEC8A1DDEAA73D2FFA456076F4D3EDCF0267A48E72D2FC
-F658FEA7563E4B10908358E5FAE253C5A1A1F19631F1821C3C80BD048CE166EE
-F77ACBBBE8F2DD4FB7AB2692E8C25BF18EECD4F0FECF677860CE50B10F3E67C0
-39F23CD146E0ACB5B6D2866594E6AD5A482D864B1A94E0CE45D4322AF6F3EDD4
-015504E7AEE530A5283FD5A934524AAC4AE9A2FA647CB578FA7E85016F97C906
-77436277D984277A329961807060D928D2065449D14FB75B6EE088C7496A0718
-0796B05E1C228EE7E1C7C50106CD49AAB88FF7C5B94658E3D2D8713C061B5105
-44DA4C04D051ADB47161510B9BCB4D18542A0EC5EB66611BC9DB1B4EA90995DE
-19F86A76565445D112DB35479C7E70EFF4C6BB3E45307CE48BE52A9BFB818387
-9A0D04EFBDBF9EE973CB2808D9E75694E9C77BCB72EE07943096FEC011FE7435
-BA43B5AFD8D0811342DF88D3C50B9D001CAA23DB7F88894D58AB56B74E9D6E45
-9220790C088D3C2FB8304C4032FDD3129C0B52283AC284F36DE8F89E9E4505E8
-0AF4B25B6342B8DDCA18497D1C741BDD00ABCA6161682D75CB20B3D4C6CA560F
-BFB97A5268A8912F873AACB40C9D7E6131BD2C2FB99DDC95A104AA4DD69E531E
-1F7BEE6A10F0887F6DF15EE64F3B65061146BCF0F46B5EB53A294960E291A552
-0400BEDF61D30D4E937691414B8C14DADF3D4DEF27EC9CDE862922A8F80A0DD8
-2C4CCFDCFCD568EB78EC96FB946CD704BC73C9C07A239DFD8824F52E22C1184A
-CD4BBDDB3E2301C142A6C21483E57A9BE8D060D01F5EA23C22178F3EFEACB76B
-45C46C034A27953B14D9A2F624C47668B8700B5363F5C86944A8DEC84D382D56
-0C6ABBB75031683E20755612736DF206D313301FC39FAAEAF05D483C1E93E6EE
-E1DAB686D64D959EAA5DB319812177546027092595A5002B151F433289AE5B87
-43767F545F3FDC397C02DEDF76AE6462D4A2AB55867241C8A7EC2293B61AE39B
-92B8A82B3AFD65A6AF2B4C7928B4022B9B944151FF0936AACF2269FBCDDB31DF
-29358B779C7FE59CE4FA452F0987A6026E0710C4DE0DCE081FA2602D01EDE3F1
-6C29CCD38E9D8207504BDA0CFC49517FB02E78BE3C70E4763B58C1CDD2DF9F2F
-BACD21EFA95A59D67ED2DF67366B64369B696D1FB2717089B7E7073A6C778127
-2A2C3250B8FC0B5D8575997D6B8AFAA761E8CDBC9473B29C10BCF3E16CD9B555
-18124E11ABFAF29196579325B3F6C1DFC9AFB4B1CF54A40605D7B1A39A337C6F
-4B3E724C02BF2C1DE1B5B327AA0F65B9581533015A7834293AE558277F7E78BB
-0EB225997B0CF2AC95698AF7CB0F2AE6E297A7176EE56DE77CE18E6DCC988011
-C51C80DCA3A6D6613D517DCDFBDAC2936139030AE78D70A579048E27CC418600
-99CF1DB94EDC280EA97768ED37D5ADDF09F26FA9CD7C71FF71EEF05BB8F7AD59
-EA1600BB67F8D32408617FE38D3F03D23E3A9FC3921EC9C880F0A08E051A337B
-72ED695E9B00DC820E7EF062596B651EFCE085DB5023D14713710BC6E2E98C7F
-3F674351BC3200F448459590558A0F7D1FC99B33E69F920FEAD378ADC6F2FEEC
-542C45A265AA21A7C5408102E0618B0653CF275D78D13DA3866048521F937A45
-8AF2EBEE59DE62B5AA226BFDEDB8C7FA92DA2A277141C1DE3301618DB5DF7EB6
-AC5BD2226122C26E0AF1A02C253D60052BC8768DE3DAF4BF58FDF5E707347558
-9431C7998D3FC3E63482BF8F31AC6E0630B4127E8161FCAA5AFBEA9649390F18
-4C8E16117FB1AD2F5A125A9C24BBC404A2491B8C44062FCF8A6609338052D3FB
-840A905FD9E94E54E6D1EAE195C3C635596D9D284CF7776B2BBD7D786A9E77C7
-F868643441E41CBB50E2294A007668954A0B33F47D470D72654FA58D4622B8DD
-90C3CDE66C691A4584FF2D93A6360B274E0E3739A12773F497A6FD980DEBDB57
-1B88A8792964708072AC880AB3331E8625C6010FBF9EA04F3572C737AA1E47A0
-8C5A40B1A3CDFDDF7314D1F06978B3FCCF751E0DFB25F830FD684539AEB02DE0
-856D6FBBC4372D76D109B1A52C8AAABBE455CC37982BD728EA964AC19D6D6C87
-6875A653799A383ADE551C3C55C08840D1C4479F1B97CCD8E07201B4E66726AB
-B5FC0504C4253CA50C538EE93D952D148C6D7A1F99EFFCE9C9E066BC77F2C85B
-5BA9474A49850FDBAC35F97EF5783D647E2F6B238F7D77B8F494D6D04687B8DA
-9179A7AF10A1BFBC50141AFD6FAD87BB58FD1510FB6167E2955AC7336F2038B9
-7AA2683A32BE3DB233F3DBA776AF699305686785053DC25682B734C93F2725AE
-5C82CD88B68A7C788D774581085BE2E4B467DD5C5C7FA83D3B159CEC68FF0F91
-5ADD33BA8CCDF3D93E96B0F9CFC1F7A2F98585AEF0DD14481CFD1DB73963BBFF
-83BA8D9490FA120F6E4E141EEB1D14F29DB08AE5FB636AA1BC7F46EEEA33E8AF
-334F22650CFC2F3CF73BFDB769BD34C3A80694278440C8C7B6DE03C101701365
-06ABF17546953891D8EA0F75E8756DDC267027145042C2817910064AD0D2868B
-622937ACFE34406BCA089A50BD5D40CAD02F22BBD892189D94D41FFF3AA8F3A7
-DDE098C2A5C23ED877B7D8016709D6D578CAFA069A3A50AA3FC11AAACA58940D
-D88505D217BD6F562C8E435F4247AE9AE65BEA57AFB21F13E546040A1A51BE21
-1D2706F228150F97BDAD799A4823C7FCCD8DFFF66DE7AD2AA661B6C1BDE91D8A
-2625DDA0C9C2DEB214C9C41DCE148A5A805ECE8229A9F33AE5BA7A99DB32F225
-24E4C3D639EFB9EEAEEFC61E8B36C2092F3BA757882F94FF7DEB36127E272527
-AE79F0F55F9323C046708C4428389058F9C67CBABAA779F84A3EB8540179513C
-75BF10AAE036CEFAB476729A8C5BD83B4C212656163F91FBE16384611069E2B1
-AA843715DFB594523904C3135690350EE485893F3A51CF2A72366EB840EF3CD0
-918D839BB55635BF7EF6E9D3CCD2158918CAB7C9FF74AB701C17E07F2F04A19A
-F6BC970D90380809A987150EC0C8AE2FA190759B3D669DE4894CF4EF7F32E3A9
-50BDA5A1B083A21A9B0E1BA8A536302EE71A14E8778CF1ECFE0ACB592563EF92
-D2E727BEC93B5198FFE8C0AB9FA44AA3842B6E070CB4BE0F327196A6CF1F2D47
-A7CBAFD8FFACDECAA76F87C26E561DA20B49D2FDB81C42BC36D52A95BFE3F2C8
-4E4644D6560E0B5815DC0751A92610BEB4512A4614D0406AC8B5E5FE05610143
-DE3A38D11BF9A3E8B0E5A76FA18E99B559DB6C216938AE9DB50591E78FF9FB13
-67E89709CA7AAA17D20D820CD1BBD18B904436581FEEB2D9E5C2BC992AEFBBFC
-7129948DB03119F6DAD5339CB950EC410B1064F2E8D471972D60514B9037DF21
-6F42C03932DA11BCF6B8896755D2115220E265469B3601EC1079843E0D27C207
-0D0624E118EB64924154EF01FA65BD93331754D469E61BB34DA3401A8AEA17FE
-92165E1BCFCD153617DF82582CF27B8E64BBF919E183BD0CB78753813A01CD5E
-D3ED931E4670B05C39B66CB35DD93E934B1239899566EAF7D7524E8105DC2BAB
-6C43CB4BD23DF98F3CA2E88F0E40A3BB65C1D0A7CE7735F95AE5A86495C3EB27
-8AC9F070FED1E50936B0CE6E9D3DD56FF394F45646F02AD19885072FF5DF07E2
-2E7B8709D23473FE3E62E0150DB7233D69E31E4AC822FC58DB253EE9737B9237
-3000784F4883FD2BC7C7646F48BE10DCED395D7BB6DB8B1AE3ADCBE3FCC23EB0
-E7BC01AE7960B6B18B65A2820E788A4B47177012F5AFA3E5FBB8F593EAD2229B
-0CB1474FCC2039FE2DFA57D3DE16C6612658F7B7C27B5F3AD36739DE073DFF2D
-17A9351BF25DD24B4434C5D1B6277EB9BBAD895DCC727756DD588B65875304ED
-983C5F664FB658E0DF6D79DB3AC1806EF4D5F73FAF9651E738564CDCDA5BEF19
-53AF4498634A841D370BA07863C8B579466D5A329C8160B8695BEF1DF28527A9
-6DF41EA5016705F903D0A0D2268A27965CC888A8BAAABB5D4FE7EC8CC7816732
-2AAB7557AA7AF336BFB6B298299BB7B5CC89797B7A71F4D61F0609822CED2EC4
-85EB4E6FBA0199D538054B212F095A49B77F664E749D0AA899A877151669E89C
-EBEAB8A71BBFE65242FD53244194B5763260B87B0857072B0155000E5EBA5DB1
-68C21BED2AA9B60506E6873997A34909F6C8D5F9AC3B241A1496A2CC9B6FBB2A
-1D4084500426B3931F25B42B1422DB5444C4CCE842B6FCB545CD0357DFA6B867
-1CF9C7FDEFD67867D748267BFF9AEFAE4BBFEAF3E0F253570F84D5214B24C335
-947CB1E1C56F58B74F48103F1F690C543791BD85B5DF6344EB45EAAD771A4EB3
-1F0C7765F6BCCBF583371F56120579729F58322314C5C5746C2944099D7D38C8
-A03C7D64532B0FE23060EA277C1D71321D257FE0E07592FCC8B23334A92C4646
-E5900FC9EFDFDA95B9E183C582457B032F0878503E61CF24899569B85B194466
-412E10123D6725395A7BA8EA5CC88C8CF69F5386C0E615B7A33ADDE091348CB0
-966F9EC34A7ED43CAB8E50E6C454A36B96DEBBA1F7AF42A21572BDA70407A985
-6A1F582EA78A05DCB2E80D58B526E6473E3688143E8BCEF811D1D02F7565C564
-E8CF7801E98451A7FC541542F9490B5A3AFCAFE0C0C3989B7899045CDF262D24
-7579ACB8348FD249234092028397C92B3CB69AA206A94D70C2B78ED45534A65C
-07C396847EF4A6D9FE1590515C29B2A8FAD4E831BD2E4AE07F1E315CF8DCE669
-DE3FCAAA0DB0A2A518753D04F8DDB7129027BB94A0A1EA990F64FFA543F90FFB
-63944FDF5F6E29E821EA00A71912C9B1AA9426939A2FD08CCDDC1DE545B5B695
-09DA575BE8A9BA6D51584309687FCDE29128D7BC355CD03A09D1091C156392EC
-85393381BA2C006949DD93CC39B7A58BF101E0117E88B3CB4D954B79A86C632F
-38F5475C8559229155CD210AADB479F7FA83797FE211E342DBB6CF3060986C92
-9F946E65ADC67950903B99EEDE3E2EFACFF68C4BD90907ACA26C96E4E5A28101
-3517DA551C963D6DBA3B2A0B4432A6D364CB2BB2FD1B3DDFC1F514D4E7771D1B
-C4B406372269021E87B66B81D4AFCEA1316B755D65F7DEA5AE2FD2264CAF1B28
-1DD4764FFA33B22D2CCBB7208D7EEFAF36B86C0225535264733E237E055B58C8
-6FE717E4A6613D049D39E64A7F517C14CFDE8CACD53D96908B9DDE9DD88E5BBD
-FEA1DD01A0CB0E8C417EF1473183F39EA6FA2B47BB27D37381433050DF7C5F0F
-3FF6F2DE3C7BF989F617AB16AFEA89058C5E325FADF9B37E0F8565B433E82EB4
-F949AAFA60BD424FF49115CA76543F9757741A3C10440B4E5F0CD73AAE7F22A1
-13C4DCA7D6A55FDB020D14BAE8DB2600AE6CE26144CA0F83C82DF67C4E89914F
-4C4A89DEA5326DACE14766616AFF2E89FD7B25148819141D464E47D178514814
-E14C9A8A796739DC99C1220CA086326231E9136F61962303686CF360E9E5D058
-915AC25E7B8F56CD1C6092252091E4E25406C5F4B60C4AD01482F41B8DD29C91
-015E19D94A0B39836722CC3F19CB46D73930D06BE314583F6DDEA56A2B6A8B5D
-1C59BBBF8EF768F9B49B1BBB38B4F828BE4A73EB9315636DDE3AC610D7E0B65E
-32A8EEA63B1C734CFD0B52D09B418F6B33F03EE08A886FB6E52405C0403177AB
-A63EB20DA2865AA6441957F98CD7D64857ED614D59436450F33DD43EC7AFF4A2
-D3549DD174338FBCB4BE975E8CE41B34BE93C770940575AA1288F87FA400C650
-A4DDD573BF1F45EB97781044691B78BD64C3305FBCA02D9931EE3B8B7667777C
-1C0EFDA7E4E247DBD6C5D92737170BB9A86D862C0534A8436B1295861A7A2BD0
-CEE445EBC7F8251E4DEDD7173A82A39B8C3055FBB90FC42B550CB5CACC2D2972
-886E7AD2AE11626F4389AA07995055AED5AAD317FEBD47B498EB52AE15DB8440
-EAB1D16A826CA1ED54F20A990EB564FE9FBB2784EC4920FA479244CD24C7A635
-574DF33C73FCB1D2B6DF0CE6D214B464761B8B9B2EC88387F6E99A64A0B52271
-2E57D454E5B233F41FCE51D65BDC26C6BC18CE1B901048833533CC08AD60FA32
-FF65C5E06A710C206B78D6B9EBA4A81031BBAA88BD3EBCF1E795170EDD69C61E
-26AA502B47B8BCB9D9CE8A95D81BE25116B0B84A92BED585B4248CEC62676FB1
-2C6CEE3B2BCB5F7D6EA35A5E5725958DC772DB3E108F3AFA1CDD4586014A1296
-F92D49A8F9E0D19C80824733CDCADD36E8D6BF728A7EB38EC991B3E4F70BEF0B
-5F76DEFB25670F3E9F8833C015B2C68AB4C6D5B490C2A295F038E2A8706D243A
-1D4B2228CD1A2545EEDE67A85FEA536C9C32747B45CD81D01767FFE9A8F70958
-409C07CFCFA3D102707D1D6AA5EF7A8B25DDB8A7E416610F2D558BD3C9F1D3FC
-A3CCAB935FD1F57D42E2D32610A3069A15A31CB0F5357C00419F152AE3EB3CFC
-4B3FEA9ACB01F180495297B4A8A60A4D2EFFD3473C1C3AFA2221C67D90DC0DB9
-43EFDC47484D08335438CCE06EE75C7571007AD9E39E31BA5E2CE8DE96405063
-13BF3FEBB2AA0C997F303E056ABAE3F3C14DE8F472D60B6BF7B37A3488717BCB
-C6A20858B52045A7CBF4564806C1D71E6422839222C63598B7EE67A4359869FD
-C56BCA71E147E87F9F9D241F06EFD688A268CF0189BB9054231AF7764317C10C
-B625E4633DCBFA5114EDD89E44AFC560CF0DD1F8ECB356174BFDE7322A3C257F
-F6B9089DB9726AA7313D145A249AFE7EA43C3F1CEB9113C568D2162A515BC112
-7AD80BE6EB2ACD39260B65094039B95E1819FACB18A92E98F84E741409AAE641
-AF35BD026EF7140A7563505567E974A43554883949123C29AD3FDF20602B35AD
-3100F85FE00E091803D9D14037635C964A1A92390886B6CB72A915CAEAF847B9
-1ED0F1499BBF1BB8A906538E7F709F962DF50143B649BFB2C5A3719F95362BD4
-A892BD6984CBD362BB1261C5F0C1262B57C441B9349AAEA2995C87FFA20CA0F8
-E7C98D842026CFF8DB2258D7DA536B3609028340A0AB13D4371BBBEABDA877B6
-1551058522BAF2F47F34509275D422FBD83F51BEDF0D94EF10E95FD1A8B488A0
-0A81C7998BD9AF86C1A8E2175ED1AB40C96243687BBCDB793A08A5336F911834
-247462D693993386ECB467479997E7995AA90AC96AA68B78F21AC59BA618D886
-ABC7F0EE019F4146755A55BC38BF5461B1422E62E320937D056A62D7AF6D3F0D
-B2A2D09BAD44F46E97316A685CA21CC455AA8A061B88E3E64C64DDF93950E236
-B49749CEE474F8C38CA8468E6167C94B3678AA2E5262B69D4C04E5F36CBEC4A5
-029807DF9AB3E4A1B5360406EC39D519504E165D129B978225D2DD7BC4ED5982
-D67B4F1C134DF53B19CA76B00EC04967E7D057B246BB248F4ADCF9D4648E98F4
-4AA48C9112808A0F21F816E481543E5873AE2331E1B5256D027C48602EF09590
-18602EC3843E98554D304B92E5F1A531E61EF00E5809784C16D44E6783230C58
-4487C0B9DAFBEE1362F65E4555987D8810B49CAB8D53DE39DD0D49FC5C3BCE39
-6D4A8461C9F0B0B9B320365C7425D8503690204D0898EC34BFE37FBB5B6C86C7
-60AD9436D9331FE53A444F78DBCE00AF3CE5C80EDCE9A65CA837F948EF672280
-94FFFD6B176B98D66DE818E27E80327866936389AC4845FF059F996B83FBD151
-BADAF79C95CDC5375FFF1211A6C1C490344AD56BF6D9665B2388FD4BABF6EC3F
-3F1459DC589A99A7615D64D34FFF122770812E0E1C5FBAAE90B72F8845A996F3
-3E3276D41462DCF43C02D046EB6AF4A9101EF81D357FB21FC15D075F7BD67DE1
-26DF7DE2E6E21D578051967794B28592F27271AD34C9B81034D62FFC442DEF67
-77D174EC4335CA3552D85B0AF9D4A4011808FF1EB140D12491217C9C6D991395
-6581C91545A69417114B70FC4E021FABF564AB6D1DC37E456AFED772A1441E66
-63AB194A8D94A8FAD64CDA23AC28ABD8630D3B19CA93AE46B6D7F229E36254BB
-822529D754ECDB3989F803451F30793F0A8C4CD03F8A82185F484CE910334DDF
-F3376FC4AB870851E6B7C1C10337DF7865CBBF77B28A1189494313CD8D112C6E
-ADA1ECFDA1441E2F107DDE6BDFE74C50B89D6238492005C7B6AB5B77563F3209
-B6D5978E09ADCE0DACE3990764127584879AC061ED974925252983280A596AC8
-A0E581D4FF1446D3E25DEB2602680C4382605AA1CEF04A5231220F54449620D6
-E6705DB2D554A34B4A51B0243DBF506577753611F28C968AE743A7204ADE14B3
-6028881DC1AC19923B6ADE9DC01706ED6E635AD5049DFE52103F4411829E5F25
-B8DBE813719DC80195FE3707181931D1DA3D58F101E34205A9871C9DCE6D486C
-FD8A3764D1BDAA95C2788192C956F3514D28F001DEBF20A7802AFC168C1D3F83
-B5CB66DA709C80CB62E5BDD5094AFBC09AC43A6993CB587D79C1CD2ACA5D3904
-683F7AAEE380181F625CBAC1000028727EDD6D1C96A180539B4DB46A11D55FD1
-9BD5A991EEEB3125C8B022A4CBD34D6AEC5F4582731651D4A1C593EE4DC547C1
-9FCA888C406D3C6FEA0C398D91C8D6B56AB56737158C47A90D5B8311178D3170
-4C00D98282FB34C636633DED7A3D8566D647F2B3EE3C095CB0239B48C4A1C1F3
-BBE15C21A63A9E779738FFF6AE49081703B5716939C90AB9EB4E1696444CD60A
-4EFB17AD7FCB2610A9E3F903CCF938CEBBAD41DC25590B35F50A2CBEBA8FBEFC
-109DA0559B474A79A5DB4209D63D727EDCA5EA257143F90212E7D57BC1CF6EF1
-D1A1954A4F919209447477DA90F87FC1DFB199C117A434BCEC1BA10653A2C9B5
-9599AC25838540B3BBBEDFB597206DBC2A894D077F095C073733C805E045AAAD
-9442ACC465300DB1BF50C14F31F80769EEEB8EF1AC8FA42E123B7F98BE4D721F
-21AD4A9DAD63D515AF0EE749497EC58E45683BBBA63D7D06B717D9AD0A593B45
-6948F70A99A42B8A6F2B5CC578389A7D971B21C48571BCFFB16061A43215491A
-66BE45983EBE2E37BCDC7DCCC507470FB01711105EBF9578664D855434DBE98E
-0BAD017F64684E21FC3209CA6A02EA74E6FD7B3710CC09AC0C213E3226C0ADA2
-8EC7F6A960D7D75235A3B6CE240AD4101855F00748363F98A6DEC3D785F99377
-827EC9B43B5B7FDADDDED1C469812A5291F00705AC26BE98C5E9EF813C6E1438
-FEECAAD277718900E4F5A4B8CDE0BFBA1E0AF5E324CA9B4D9C06A2900B7E3029
-9A19D23E58BDEE72438CD10AACF155FFD0BA3A91E18B9FB23585B76A6D4D9873
-3CA358901612B5D7670B1B2B8911BE871853588247A647FB91C3E86A6F642EC4
-528A7A3C63D6C9C59B46A22340A887E9EA8754F3771797BED0A2D2ABC7E87886
-FD5D1850FC4C525A5CB4354C5F600F3DA2015A35A77841A8009796C88197D9C6
-7F4BC939FE15D1F91DD6A62720E90B7153C4D77A13061F9F6D732E05CAEE7E7E
-2EAC05082F0756507E7B6CEF9B559A5CC7EF7AD02C54E5DE6418EBED07FEADDE
-F28A240D66F004ADBF2B4C9E158F0FCD9950683ED6210ACFA65F2071E6B72AF8
-92E19D97ABACC701B24E7CDC9D4D8C0D17EB4C64A9DF75B765B1058B485A48B5
-3A92C9B0A1D13800EF704824E61C8D13E64ECEFC2321CC2343A9B59E6C8A0244
-E3C1AB84080AE28A51C7034F3EBF2BF8267E293F61AA10128510CD26C0E54C1E
-6C2C7BC8FF2F52AB1A603BE177A6EE39A5D5F77E9CB3F37B46DF0A134F0D47C8
-0B67F71B5AD0B206D3E78AC8146BA70ABC216F4F5CFAF55FE1803E4947297D7A
-8949E54FDB2A7246349952A2B585AF440FB9BA30C4A85083E5EA80E134A611E9
-E0275460E58C4680CDACD85D38938AD52D1CCD190D2D87241C91C75802ACE899
-2844DF49F6C532D4BE4C5CA2386BFC77A5C3D49A2D691EFD56C5EB2AA830CB8C
-03AF9B30D698BD58C43B20BAC134A895FDC42A0FE5C8CDD1110166A36CDA9874
-4FFA0D573A1414F05CA1EB5551FC456486A72A1B7853496B6F162E6A881368C1
-7C968BDA6B9DAE96801E87FB9D987057E4837E7450ED0C41E1AF1A14109C8F9B
-F20152D9E0924BD9723F73E23EE66FB01E2013CC83A25AAF37FF923C089E0F46
-EBAD3B42FE036F94EE078C9CD251A150E28578B2DF64720E7BA84F643CF8E500
-2AEF59F860E7EAD664E614E489E9E1DFD76CCE33702F25F5E6D7BD2734B0EF97
-4B13A1B666CDEEC6B1058D8951D00FFDD44D910D5308135B088E5E2B0B44F684
-82AFB0E87F64251CB664A130D6685DA57DFBAD8EE271002476AA8E0895E283ED
-970B130C0ACF264D8314E920BF308A44797572AF9B150352EB261DC86A8BEE7C
-92E4C5BE76E66476FBD2BB1B6079D4291F03932E92CE53DC37EC79D946DF12EC
-19D5E914C67F883C42BC5FC28FF200DE5A10A3B7308983880A5E5E37C457D515
-58921D0ABB91307DEBFC1C157D834C5F8FDD85589F17E28F99CC42E8AB3A7D2F
-0965E88C78AFAD9DBC56B76E85B707321D760580252D175DE28F46E2130EED6F
-3101D569B0C2745813D1D8F3C6A30AB77610CD50F5C8574DB097FFBEB2EC53D2
-D4887560B23710BC4BE049749C98CE066079D31AC800091119DE5C45673497AC
-1E7BB1DF4867C5098454A98863F196A20C74B8CD778F24AE06E92C08BE0A6A58
-EB7CD34A06CBFE6268A01E8360725534A8DF5F3F1074FC4BAA6BFF579DFD1E5A
-3C914F718EF07F4A1EDEF0E9B4B0188CDB3BC478C9202632212542C5CA144F71
-E76BC68F3C110742B61D20307AD2A4A0527A3FD8FCD7819B207B9037FCF53E3F
-C81BC00D428CD5A5EEC788BA2C974B550533A30A646FCFAAAAEAAA443B09510E
-A9D5FBF1E5DCF14BB0A116C91B4E760DCAD201020F63718AC3A8BE519232CF57
-1D2A077A95A5568D12FE61C78D6C1198D523AB1D604D92D0530434E4A5059F6D
-DEBB5AB57D473DBBFB3B1D08E4C1795658DE4D6106A746ABC371D90A6D31B36C
-6F950EB16996CA13104C356A77B7652471C811893A359E824BEBF8869EA13989
-3133DBEA5CD1A7447093A4B6500EBD5F434B7736D3BC909E6B51489A79F2D8B4
-6F8863EA0560F02557175460037899DFAF5A93871468F56D341680C0B8D2BD21
-709F35B66B57DE6B1446910F4EF5DDA5DDA3A4EF486354F087449F231326E4CE
-6E1019BA41FEB775ACFAB6CFB841FD1EBC0BFAA6BAAC3B72605CD8ED100643D6
-6FBAE3DA56F5B6CE1F66A572B71958FCCFA3D1A312FD8199CF30BF0383EB0802
-2824A093336EED72111148C8F94113DA68C6A267153171B00335B0D7927715D0
-7F372D2F946AB65E1B19CA318F04686891B6E09F0536CF77C24A8C8EF7A5FC05
-61127667715E4CD2A547CD92BBCC219C40F4E6537036BB416783D54CB182380E
-87F7E8D7DBD023ABF937085F12C81D92D65F97F70C017FD25E7A218D484D6A1C
-B490BE23B603F763C260BF5EE4F9D11879421C14801948F4EB0B613219FFB121
-A477496AA5F5C70025E15B198A54C38E32A3E65B5678944138F4D0FF07970A81
-B23DE2CF7B248E8960EA358A3ECD637F779EC73B614B5AAB0B72ED62B1FD5B7E
-45B9C587F327D28B042B31045D641D5B258702019FE50AC6A08A8FA828829CAE
-573F6084ADCD362C55D539C5ED40AB1468D037F6756E7C004514A07C4A4205F0
-62324119A96F357702B338446F1E338AFFF143B8CCA5ADBF7BE0A2A66C40FEDA
-15DA022E7575D9073E10B9F7A5B1A494FDE2826071EC40BA22AF17275874BE93
-7EEA3FEC5253C04B6060189C710FC7C5E2829F53B1746590B30BEB6C8C81CF15
-688A72C2A05B4D68FFA010A74E23B5B0B28C622B1C8D266100ABD3364AE21CCE
-1B3701120B83EAE149792C87D4A074C7F8B4EC81156FB9ED3D0246E2A8A8D418
-24308FFFADDD9D20DA7CCDF56093644F425D8399E8A3A06B571D7C80753F840E
-BCEA835E4094AFC6DFDE191E9045A115936F50B97DD73580D3B6FE91E48AF6AD
-0F1B8708CFCFC76712BE2079AA6140C830523CE0E58148B36AA7827882AB0ADF
-F5734E2AD66088AFFA6ED6A8582BDA670D979F8C23042E07502EB4A8506307E7
-B62510C729590B73804DBD2129D7EB17E2164FED0389E458BA053F5B24983019
-20D09AE5948A159990D9B47FBA323F2DFB7B782FC963AFB083EEF4C01F614ABB
-5F588236986323FAF367303458401379CD8AC7F7CAF65816FA4B45F98A875F10
-86581706C369911B1AAFC70B1B1E7D30F71C55C030E5FFF4FA5FFCE97E16A269
-7982CF88E407BCFE450DFB0D0D8270C2B5C91B4523899C637CC86D1542F2DC37
-342D6366195297B4A529F853B5F910902BC907BAE83CD5522F5A0F2E4666EB9A
-40083B1AB66C9BFB1DCAB26AF910B174AF933326AB131BC080BAE7B4FA30AB1F
-422B0C17648AB95E8188B76977DCB7B2D041847C82347BF6D2F729C9174F1230
-E8612F98D9EE77EF7898A449A7DF889D137D1691AA315E9F6F08046BBBB5937C
-529EE7FD23AEFB04603287FC991638FFF960D07BB5FB14F5B56ECD782EF84741
-7AED87F9E4D76F6CC4D01FD39D8AD05757C9B5B1C1775410F9A7BBE4D9438994
-BE02A1C81CE0BCAB1B080ADEA7DEC8EB2A9F5F1F2FCE0EDF006A54A6C1FC70A4
-51D3B2EF67FB6AFC68171CA31AFDB5B30C6D86E4B584B885EBE66344D499185C
-7265595A54E3AC090BE89424FC6ED53FA7C30A417AE374E46476169C0EF5A04C
-4D87EEADB08CEB3CF5C26B376461F8891BA72FB028B2088B81BA74CE27B2C455
-7DEC6A56DEF3406DD71AD214B9529BC80CD0AA95DEC7A074B785DC2192713A0D
-85D6A3017133F5820912523878E2CE0614513137B1D6A0E1CA1B31870AE10F48
-3DFA4E6FBE782AE1E7557D157F4AB92226C4DA3F70AD4EF49D3A19FAF0169B7B
-9464EAFFB3270787A6F02E86F8E3B56D00863A00C6C68C2AB375F08DC006FC97
-F060316F3385C66A7389B31DB5D3B7A5C5B73FD1C344ED9F40BEDFD82BAFD0F8
-87F6155F34FDD9BB4E928E5264B8AEF216C7D00EDEEA633E543954BE63A7A3D8
-34468AEF3C79DB66776E4C75A9C61C482B695F6384A7F8E8AC68913BCCA20221
-2A013A388798FD878DB9AB8802504236DC8147443D150D3C85F16E443B860C8C
-1D9260BA341471BD866790B288D08A643C3A915AF31CB885B10EED89BE07731D
-7936A1FF37B92CE6C953A9A6D2070CB9D1F8B4409E25F0D1289F445F2032D470
-A4DF4FDECA4AFE4656AB302CCE0DE4D9B9D665F56DF443DAC8E5A6F011C77811
-8D6075D72FFB6AD2E63FEFE1B8DF761DA09EF42D73EE725003628833E010CA9F
-76D69C341933ABA225A1D448D1B02A24C8EF54917559900C31CF4CF96AA1976C
-B75D49A191D647CB4062CD5D6591CF232B1FC7A1792787E97BE5F9F8BA3D4586
-5BB1D8ADFDEBA915CFE0D4585B4C7296B0E0B307DD245F8BC357D3700E187D75
-17C6440BCF624C8751D160BF9D351F49E1283AC4280DB84C36E593AEE0AEC473
-0DAA130274B8771D318283ED32165F26C31CA4602BD138DFA717957AB25423D8
-9D454DE676CC9A16C264CEF9B4038834762014B65AFA9841234FF8D6FB6CA9F2
-F719812D43D78077C82FE60B75CBA75B7C7E664BD116A68C1B92DDDD5ADF497C
-0E7DB07E3FBF45298FE4B9C994E55803FB965BFAD4C2BD156D34D79B41A950FB
-7DE8B2DEEA4440C93E94C9D3369C7DB4F297555AD10B1A8B003DCCCB94AA5232
-CFD2BBB5C223D8CA488EA15317D8284F97AC5E46144400797544EB86C2F7FB1F
-B806596973F2C8FFFD6C26E14C13DCBE138C48DE544CBCDBD16ADCF2E28D5319
-0DC91310740BCC46E657C806A1E3DED637C488384E05615E78C96FD0DDE0F5F0
-170A04AD520E0B9BEC13A133DD976794FD9A63FB22F495BBA2DCC7BD11FC8D65
-8A1D80B2CF25666D444FD09DD1650B542D894DB7547A03BB60A9F1C673073A0D
-789A66A3B41678579F42B2421878DDE27D4873D4FEC825685E90BBC6E9631A4B
-A5F6149B7C16962139338DF54857B590E9A39926B11D0DCEA8388E7336AF455C
-F5C39AB40504792DA3193B21BC793A63870CB7F6BAB8D0D51FF8125FD2BC72DE
-A210AAD804AFB1D41B2E8ECF2936E74C53532775F21EDA729AA902B3C8B2ACDE
-0578353AF3E9177C7906041C9360740841E64440F5815BD40FB1C41DFDF515CD
-D47837C9654689CD118714FD6D8E4CF21A02B01AC9AEBDC75341741DC5ED3C73
-1DD0EAFF35BABBCE1CF9C207C1DC79F47EFDF0EC07D6E85D7ACE2FA8F5AAE916
-C80B1010086AC1E91B957A6A61D91113C98F95BCFCECB3255DC548A03C37612D
-F9F47139A49B7236758A419D57E42694B0BDFDBB42EAF30E7F49421FB9563F72
-7036DB2C85AC91A83C37CD2EDE94B3EA82C45BFDC7E1696C76D15EF10141BBEB
-363C098591B35024AC9D304B348D028F573ADB949327370A0F6EE2B8C9EA50A9
-9BDD725A81BB626CC124E522E9D164E10671A93BC36DFBE6025C34783106052F
-142845026D6B18BEF2011E0BD47D03417EBD88F1D31FD36C61781735B5A1EAA5
-8C8E13BB206A6DE4584EDC53D0CEF8B91B59698106B9535D62BD88D80ECC85B6
-1F1CAC049843A88150359315F12D9940FC65DB61D8DBF588C707749E8823A53D
-E19F6C060759BEE9A19A7536599754FB587751047B3723001349EE3A23851B68
-C8F5933E766D5CEFC618C0E551069A00BBEF52DFC94A3E5F0E5391FCB97A21AD
-CF73E4EDDCF179730BFD8429DA97711A2A0B3853946026E6E8FD8F61C735946A
-25E44B958697B722B52F4DD3BCA1358E2AC87A81840F05D76AD90DFF2756E7B8
-79DD5D43F0CBB873F11A9B753EA79F44F62BCBDEE84CFE171AFAE64C236CFA05
-521638B4F8CB880491BBC67B7C84268106D74DEB6A1BD035D9E4359C9417C14B
-6EEE4AEBF574172122ECA13C800E178B7045C2D0B1BC92C07A5351C15C50BBDB
-E7703FE1BE7E668BC059F62533786F36820D2EC57668C53B7DABFFF06BFCF199
-268B68430F3FF275EC74EF46F991B3EBF9FEF1B86659F81809DAD9F0C00718E3
-7DF1DA8521316FB2333305D58BF90854C5A9AAADF7BBACAF0CDB9B687CBCDDAF
-30ED6E7778E4922B9766C461CF3D336B629980C3BD2CBCD246C0B21D0AFEAB5C
-B44885D1F82796B6B064715FA3FC41BE38D338ABD15B7C627FC2D067F96151FC
-8AF9EE0CFC15F16F4C8B6427926F17E612C2225274248B7B0809E1B08380FA9B
-DCADCD2D1B26D1BF6FEDCB13C54489ED3558ABBC9ADC7A6610C411AAAFA94367
-7452F9260211EF5CF2DDCADB27DC0BA52C4EE8E6F5D98CD6B495755A4B52FB65
-67366EB69F16A3530371944BBFA0C82AB9459D718D08F50C60DDDF5DCFA64B1D
-71DCCD8AA01FFB9387DD26DEFD30D97D5F9EE03F5DA165DBDB0D2052054DFD60
-DB8AD8A389940BA24F7F44C0307A9A446E3D53FB99A6E51A18B4700DF8F79D96
-1F3996630D3161EE5D119B6C0EBB57A1ED333DC8F18E35E5A715AC887257D37E
-EC3BF6DFE165B62401C3BCF3752386166372061F6CDF94689070432C283C2277
-A5652AAFDC83461E0B5960997AB5B7E8F6CEB6BA0E2D9AAD4506ABE0E7CB5379
-77CBB9113727093B1160DA55CB2E6F2727414E53D8F7F66F45F1B7191AE7113F
-FA7E11A2D144F27D3681258866A2B8F9C0BC12782CCC83AD847D5976FA7D4468
-78E55ED04B32B63B2324BEE7251FBC9C93223EFADB8946A267486F9863CAE636
-C602E5485628158238D5F6ED59D996E41A563B5641CBA250BAFADF44B4959C03
-838775AFB5CA6755A3C7DC78F1CB1154E63BA7370C4E0279CCED6D2E34695243
-6460A4F88C11842FF7B4BBD73711F2FD06888A02C0C5759C581DE1716C80DD56
-5C2B0223A20C56196D67F7A6D7B5F711743AA31B3D8B1CAFC649E1A3E227E32F
-8A7716BB8E919A4F14F2630FBB1662767A1348055E48050DA6547F2B45FCC664
-8771E58CBD281DD1070E045FA81DE783F831C50ADDC4FE239FE4FCB231BE3F4E
-2B6B75C719C88E69F8B3B38D25EA42F2B6A71B03FFB204076DEE53EB22812C36
-62A077A6097FF9687732C4B69F686406283AB883A2FDF4C5FE70A5472359E372
-DF28BB7DB8DA88E2399EB61FFEB037E484264561BB7A905DFDD110C5B110FE4A
-2FD2FF3A1E3E1FF6CDA888F2B27522FC367999D7DAD58A29DF8EB796F15487B5
-11FBF4A8F7F6C9905C1F4E5E18C9729EF6C6028D5AE027CA67C1DCAA4CCDBE44
-A7D74CA0F6ABEE0BAA08C4A5A3C35FB3CE59EAD3480307132D25522518FC2331
-A46F67B236C4F51C9852562BBABE2705AB619C4D4F52675459F184FDD59AFE95
-30B97EEE211D690643BE8126130F3FF6EAD41FD9B760139FAD1BFB429C8BCD66
-0D504B64A7C502E476FD6237A1BD7CBC187AC7A30CB39614573B795F1EC2AB5B
-47953B145DA8FB5990A80B515B4F9BFD32349F8F882E9BFEC8A321E3830A6379
-7595631C3E2E9B6711374532A8708CB0B554648DE5128FDB4D85445661AC950B
-ACE8D7EC9CC3D5C756EF7890041957B2F625075DCD762A04442C0C5EB983B820
-22E64D66C3974D031D6789096E7A7A0D2D2A43FD1ADD8BDC80F9D1B381D67E3B
-28B421336DD8812030E13FE79CEA71A9195BBC10EA5BCF2A446099ADF23C4310
-A7C0E296A311ABABE65AB2AF49BCAEABFA09CFDFC6C7B001B9CCAF252D6F76D8
-08DE4E08DD78DEA1FC92A5039BED5FEC5C276A1130EA569341765CC3EA94A4B0
-442244D7DFAA37B2DAEB640A4F014015CF54EA13CFD931517E3CBE786A6C4559
-182EA384C2113DE85A3EBF2B9B4E8356AEFB12FC9CDC11615CBAC7258A3D21C9
-F26CC170C3A3E774273032848D24267D0E7699445061B05BD5BBA4EBE4FC22F1
-9F0279CF940C39ABB756CEE674528B1E78D514C6D319F88B02152A425D4D2062
-7E798DDEA2149EB6D4F35D435C3777F9C6257D2A82930F540B119C7C3D0807AB
-E383C37AA4E09F708DF1FDFE2CC8A3BCCE624A0E0DFE6F7A8D76CE50CDEBBB1C
-6B61F75DBD9E52B8209495D00B7C01568F13AF0B5D812DEF37FF9896F83D7643
-A6A84920820A22BDCDBD9D5CB31A57C2BB67222ED05E71F061D79BF09A2651D8
-FA6ABE2FBB465F4310F1BF1BC5856984F5857398B636D1144F75202A4F9C4022
-0DFE3F18FD6043C381EA81B70DAFE2B776E88FAC1D482775AA6B452B81F5B396
-21A97D7214B5C1A766B62988330ED4CDFCDCAD8CC165CAD046278163046BF696
-BE49C3AFD83A0D6850CBC9FF1751D90433C03F373B89C31A0137EC9428A9C744
-72CE4653AB8B1CD3EC345C90879BCBB7C89B25AFE08A9FD880B78C9F6FD42186
-6103F6FCCC9E0FEFF506D56B5A98AC79F69DD7D60BDE46D29956E47396C7A15A
-76887359539D654B899B6C0FC8ED736C5DE7199AC10FDD15B4FECE94E4CFB473
-0422A29427D252C11ADD2778C3777254F58EC33BB24C82F559287F92083CF708
-38A9CCED1E5EAACADA0B4CF23D83F1B257DFBA2F83883496BC1D8766A4FEFD11
-A320AD84F04C029DA40E51DB8E0F82EE343EF7383B29786B90680FA8A108A94F
-E1CA201327F0E17C392C706CFB7515873582A090F93C9BA2BE6774B810FECD10
-01CDBFABEA808363A1374672AEDECAE03C783F7E2C85299E40F4B76AB7BF41CD
-B01EC583140F30817B5C9B4D22EA6D4233E7EA1AD32629BBC513F79E85A0EBB2
-1AC59E7BAF8EC2FCA88318C1DD72B1E1D899354DBD8AF5C39EF980CAB38141EC
-56C01860B90DCED2175947096C6D5AD7B56F4A5D0CF8569CCC1E0EAA454D696F
-1652453ADDD38ADC336F2BA06523BF8DE4BC77969135CFC485313118989B90BF
-B00E6A34AB57C871767EB52A9B970CD5D70D26164B6617F4D19C5C3DF977989C
-687CA9F67509CB0E261E9A8D18FD6F0D7C061212B8BD3CD876CFEFC50BC6569D
-5ED1FB4C56B4E0D3B2CC1117A90DB01802D36929E28F84C19ED6C83E65A0782B
-F5EB4A9F9AB020A1FAA6B7BA6CBBE0C071BB1FB61B2F9113042C5A8E2E131FA2
-5677554EC8EA45604BF7464C5137EE17634E8434020D90CB88B94A76A100077A
-21E031DFF68439EAB3381D1436E31452CD4D2E69914FD2E82E6D9AF2FBEF031B
-53AF448C21559598865550488FF2EE2F88E3027F6D1840D52497EBF96AFA6691
-64F0671E2E29C6EFB745ACDBE97709FD452FA6B2BA43E1B21320862B5019F8A9
-52B68BDCD53B35BDA09F1FC4C480CFA3B92719E360BF124D9A9E728BB8D4AD56
-3D1CBF8EA793F509CF59585D2443DD46F15B8C86BA6438272ACA57274895771D
-637365F5FB3361631F68CDE33A8E8B5E7FF3CAFAD3344FE57FB79115E2E67678
-B1ABFF4CCFB3540B6F7AD4189088EE0471DE1207E97945B4B74350A71852C0C8
-2EE1BA9E58C467B3234985794B04C91F6A857D5DE23F7B71CAFC182C7153EF1F
-E353F897E22851A621E1D60FB5BA7FB0FCFFD4032F714F30B69609C9FB9B1032
-CE7F88EA8C488D55F9ABD713B603273830D45026A5A4D6E8E235E6772B43DC75
-59BA22ADC7382A89D5EC83D516B6B067DC0321FE435AD294787DC7A736CAE106
-FE2DB1162B182B1C9AEBA01BDF7A13934F796F7D5962D53C90084E5C5B0F54B1
-C50BEC8A2B11841E08B0B3E4F57ED0227298F2FC5F7553B0F3D522A1FD5DB5AD
-261D7E37FA8AF178BB9F57531D728D266335807E68D6D7BA036804F0CF9D6EF7
-E024A3E3E2CA30911E6F37352A381EBDE15276CC52A168FE21AC6F8078CD9E80
-0E4212AC2AB968B339C7C55BD52AB03A3D0A65A10652149B4B56687105F6B51B
-886A944C181310A86C7B824508A4614DA7EED2E942AFCA91C8685D9EFE369883
-021C308CE882836A5CD0A87C8F255ACC770B815F79EEF626A12618EA3AB0BF52
-AA35B2EF24789BDE3C8EF3E282882F3B7256CC2366A131AA8578FD14B369E5AF
-B6C94E61BCB7FEEE9AFB30FCFCC9BF85B0444056614F18F99E4D456E50B977BE
-E3D9996B9E817010678D3B6F733C4B3C48DB1E6475FA6E0E5C8D6A37517A1F56
-93819C842B090BE09DE6BC7E5D8BD3351DAB8469A27D9F5DFC4227EB534E8750
-695FBBFE39024507D5B7CFF063435E3EBEA0702CFEB563B3130AC0810A3BA1AB
-4597EC9A2487D8EF0FC7827474ED4ACCDE5F680CFD17651A21E3EDC15E9FB31A
-F9DC51FEB169A884F15732C1BF3948E8B96CC55563AADA8B3606B17218D86349
-470CC300E618135C404A8EEB551A10571A922B920945CCCF0F315D1A75F8C4EE
-1A0641A8915BFBCA53162BB40F6AD8E8FFE411E2FBE104EE488385551FB16217
-D7784722697D0891B966CB4019037D0F96A1F57EC50C4B27437BB8763A79A7B8
-F1F01F5F4BCC48F7F642C6EF1CA4AFF92EB674CF99222EA58FE888B737ABF9F9
-2D87CDB282F6A5E8C02DCA4D76A2913CE31272387E21EBDEF0D9E2F24C79A7E3
-EED0A7FBA3A8BBD9B525ADE096B4903D120144B333F0D702E0B166D433E30EE3
-D3B0659FB70A2538DF137545C312665AC28FC49DCE75DF71FA1FCA37C6D0E879
-264C6B9D2B218859507A648A9FE83A8785079FD581CCE122B918DCC74A3A33DD
-24589EE13017DC330385064B09E2C9B6E4A0E9D76A2ED29B68A547ED185D23E6
-730A46A85F80674E1F804216C1EFB747B7E9B8703CEB50C0206E0145969EF2CA
-22F2604DC3FA86B795FDBEC57D4772AE030923BBDFCEFAC1A516E5CB058DB83A
-BF6919BEBBB9B309E5E6263D6837FF36FAADD560BD7F2429CB4A5726923A683C
-DECA1F3583E08C77AA81FB8D8623187596489A8894E0A7D562911DD7AB819260
-CDE2C4EA96901F92B2BE7ED14947B9D2A949C547B8A5CF52D9D15C930DDB4E3C
-5E3B274198C2C80DD92CF75C28C74CEC39EE946A6047F6C056AB6E029A6E9654
-4A3E162AA204BCAD3B221288ED33DE3DA6095E85675A8105F5CC88CCEF4C85D8
-45F829A7EAF58B6B5D3DFA9FD708B82101C19895ADCD390B6C3723E8B3C42196
-F4AA43A125A1FCAFF10621AD0056B096C21C53D5C9B29D359A568F66C1F65A42
-7B76218410C0D4D47F64B3F625519D5443CAF0ACBCF6E45B59E9D7C4C6DF3545
-6D01216FFC11EACCA0FB29DC997CBA1E6B4408AB95CC3340C7BCAB683B7E62A8
-80D5FEC00070DB68043F8B95CFE064F09E62A2BC0C99138A5069E27C70F7FEF0
-DF3B98DE67070E05C0E3680DC1BFA10025DAF449B5E2FEE824B277DEB9489E63
-C27D82358933C1B103EB95AC38EA9F52F3D437C59DB47AA465DAC7EC07F731E0
-7F72C3868CD58DB46FB7839DE77F8B00B5ED53322DD03CFB2303C2CC1B26C78B
-B6F7624596B92939E8D6717F6C75139FCE87D549D311B8EE9A63EEB766D68A26
-689DD5EDBF8A9B8695EA4226437620AF7ABC90A5E19A1BCF9CE1B38F99CC6626
-651ED6388A1CAACD4CF505131B97B27F32F68E2F83882108598140218BE26381
-8C32D7FD29852913C5BFE5C65C0EAD586D801B0E5BBC6310FC50A92E18151EEC
-FDDC28F39FD1A323A3B5EB5DC12D263DD1D7D8B9A69B5CC156B041CA460D4055
-6B2F44057BECED5CF64C9DD3E5AF2B13053841C9FF55E28E21EE767EED5E16E9
-A033C6442737BD02C0BFC4E2137951ECD3C21F6CFFE5394D37DB260D5EA02F0F
-FE200F25E652110134711CB66547C6E3DEA4684233B3369CB975761CB81F91BF
-F6F1E4808276641AEF2F9D0577E8A6D4DE2AA8BD547A0EEF761E2C62DE6EE39D
-76CB24479232B1DCD7219BA499225B533791BF358610ED296656A3F95A44D564
-DAE42762CA32419A67501BCAAEB2360BE431E835A00CB7BF1B6E58CE1F6FE01D
-191A9117CFDD9AC1ABA5B616FA4CFF94EEBE9F84BC4338F66F86FC04EFC73548
-1F6D884F7A8837011A13127F58AB3F47F7C301F872550F558B462205726683AA
-B9AC359D635C6B7733DDB204D23AF4279CE7F5DC8BBB352B4B2F50E9721DC89C
-EE6CE994935C74AB296589C3C47F624972B7D92E0D1FFB7F5A30FD52E1B15126
-86D1595E064FACF2BCD55A5391F9AB38C3913B008491D7003782F95668735AB7
-56EFA837275E42856380E3F5B9F29C1F3C2EA94440A8C5399771065EB26DD940
-12C34F5DFE5AA595249CD08EC2B9C2E387DAECDF0E7878B9888D7630DCED1C9F
-D341C61C57B47C12CC7DFBC5AD8F2FE583A2378B0E111CFAB1891794FE65E2E2
-3CD1F5DC0A2D57F2B6E4F88B9298234756748DEB13AC2163147EDBFB9D44C614
-9606533420CC766AE517630E0B7BCF01F2B5A092CE86F3B0E69614C2E3867B9A
-99E05A128EF55B171C869616A1B4AA03D7EC61BF69D36ECE84BE11D888FEE73E
-C91C03CE9A752EE81E21E73E849931FE57D0AC6180D9884E5BBA81EA20B9C879
-31AC7E8B3B26A27D510E69512B9CCCAB31F41ABFA92CBC9972AA3B8612CD5440
-AD0C1FDAB86391E2358F209D7D6EB419D18BBF8EBBF13C7838B40625FB5461B6
-4AC315A975E6687D68504B1CEB3C507CD015A25689614B379F7EECCCB5EA7978
-DA58CE5562A85E0E5FF07FDA3E08088A8A0C8285E8B30A95FE7ED9C5C80B23C0
-F696683A43ADA8F6D1AE93AD9E95E05AA639EA487E19D2BC1377F611FCF62647
-E21F511B70CB659A0B120F64F98CB091B751A55376A60E34041011E5DE6C8ECE
-D124DCB9FA45029064DE7CA36F8CCE8FB149A220A29083CE2F7F56A665940958
-1B1384039664D4B1E3EC177CFC6DB6A98E162D89FEA3CE1C35803C4CB7593756
-CCAFFC04F2F41743D684EEFD4DB4B9B2E9C8DA8BD3EE4539405F2B1B2BC5AEEC
-F6B303C32892CDAD9E9F7B2B00175F9B45133D3317D87922D268C3CED1CD1C51
-FF4604002D6AEBC8E4784BD4E87979C9C5964962D6AF054DBE2B00FD08419C16
-9F3D7B2C70723BC7B0B5273AAFE83C2D0B1B96D7F0617FEACC78A584DFA8D253
-D71029C6884E70033922D3E2B2DD27231A0B9A9FC83A0D75349FDE08D60B9F6B
-76F0BE5614C22C5A3810DD19A8AF131DF61C98D739220243D6136A56B6ED09E1
-49C0CD780134E118D88C5AE22CD15128E00E5E47C27CFCD1E8201AE916F4881D
-EA3D220AC1798A571B4BE179A5BBB474508A1BF6C7415C6465602FF73FA78214
-D20E6F79BDB768C2F0AADB39088359DE6A5412885C21837E7B97A20BFCA2364A
-1FFCBBFD3FF10936C80448A2E8343247E552A5F082A5B2E44F72DCB3D0074D48
-BAE6C21FF654953B9E0A33AB9B33259044BDE76643833BE8588F50130087356B
-19EACBA029A1ACD80CD0DAB61094A8BDCE989D7B6BE57A58698079245DB6857C
-ABFFDE2F20116A134E2BFBFCD1A4790FA4B723142BB0745C755CFA493C33EF54
-60EACDC2AA25704B648E7A4D03127D49C68F79A3A6E74294CD7BF78C4003209C
-CED18AA524478D46D6286061E69975212175230477A59A6342A684A5955EA108
-98C38DB86533C293B419E2D7E5C4E15DC47BA14478ADF01D466DB7CF41E34196
-4A64
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049033t.pfa b/lib/fonts/l049033t.pfa
deleted file mode 100644
index 1c7e20513a..0000000000
--- a/lib/fonts/l049033t.pfa
+++ /dev/null
@@ -1,1735 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif-Oblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Oblique) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -30 def
-/UnderlineThickness 60 def
-end readonly def
-/FontName /LuxiSerif-Oblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-207 -211 1088 993} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078993 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E5A3EA27312D552EF3BA
-D64EAC97A2E691AD6D6E5E444CB2AB74100E0BBCD168621F404A2C17DAE2055C
-D93986BA853006BC4334F74072DB02FF011FB0F56FA0837770F4DCE07D798EDE
-1F4B52091BA76C81A45FBE15DB5A0D68D7A79A8DEA9E4CDC55A047442208C135
-341BDA8FC13603A79D99D9727F1E4DE02E48C52B5CE6F5562616B4BC9B244567
-46D53ED8EFAFD8C44F4FA1999EFB90044F1C32BC1F17875428F1B9282238D5E5
-F13485FC0BB836C0B07591955B070B64DE596BDBA674A31380AAD2387FDA4077
-F0C99DB67BC7E0D2F4A214F0297085D898A0B1B8F87EA37A22039BAA041A168F
-9A09FBDEF76C808DAB506A14BE209ECEDD52561A881096E9005665CD1F34B5A8
-CAA535FC82F7C2643B07D7A4DDA492AF2B82FF073FC79FCE68FE8BCA2C899AE9
-FD64352D010C7CEC4853C29EE8E9E1CFA01A58A75D91F09D51BE3D56BA37E8EB
-161BB620977C99673D3CD1D0B268F9CE2D8E5B0F95A8091634DE5B63E112F25A
-2D794D375AD81A716DFDDAAC5B40E5E127191A098317223EEE90186101A453B8
-4D60C9C1E5FEA43CBCCFA33DBD3AF962D9E9B6963667C49BD729B73F333BE4BB
-5009B89754383FAFEFBD007839B81AFCAE0661A3237B01B83ED6DF684272E95B
-A01B989947AFEFDD0DCD5E6A67D331EC60BE9B77C6C0586B6C57113D304AF5A5
-07C5766D0B19C4061E59A3EF4041F8E9CA4EFFDE2F48653B5EDBA25DC74FBAC4
-D6736D66890497C37B4DFB51CB2D7B6CDCD1D691548209BF599E149BCA092B1D
-2E8D1203CB0851C714FCD6777BCEBB26318D5C5E2E439C5CB17A93EDC9E48E10
-92166DCA43650ACBA389D3A55D38ED21951504CBD551FC7EAF5D3A8BFD48FFAF
-DB31CA6E7D0E1DDBA18569A6900A20A11A9B4B8B3383900B369A4A1C9859F828
-DC8BBC1BB653F92C1C78D24EB7D3CB97D6F1D5B63E099E68D065A9ABB7228B1D
-B6D17A5C3FC4255972A26B54AF5E9973BAC93A9F5E84220CA34E3C531D23DB43
-50001FC2BF3F62049435BBF3AC2FF0EA43B63EEC52D3AE060018CB3331882A9F
-6B05A69332C5DA24457DF7F2AFBA0FC7E512A28BF6C638FACBFFD54B90CF0768
-E5F2180D31C651B7F58EB26B484955D1156CD7F37BF812224950615DA203E923
-E07250619C784672066E8B36423A83E2BD4970F894AF6F52B2F0A6AA1A85137E
-056051067F2979EDA3EABF13255A3CE018FB7EDC0D3C7458FA67E63AB44F0E7A
-770E2D2A8309285D6B04701A53F44503AE64B9D572560E12B102ABFD762F3988
-AC2B39737A18F9A52A0BD10BE37CF64F5198600DB70B31F6A9DA9FD6B2AE82F0
-C745B5AFD6C2F650D5273516C4130052964AF5349D562BE851E4B604F60789A9
-C673EB95E8873A695BD37549F0C6F1CD390F5DBCD938320A0CBBC22A3CDE08A4
-F8D15B484B34DF6971A54B8F7FB1CF485EE80B16412EEAA55632C6148404D293
-2B574F96BC9405DA846B02C1EF69797A0ACC13E42BAA953827E28F17D57CE611
-683565E3627DC24E3B67D80E2C740E5941431F816F60249DBDE5755BC004157F
-7ADBBA7F7ACF01B405A87382189BF6540E6B53E52F772A05B23462D1E6B11F1D
-8462B8474CE66638DFA39DDC6BB35E06463312D4858418A49C71EDD693348F23
-E3B6C4BAAE2D228D1B45290A316721673C256B03378E998594847503606EE7C1
-5276590ABC466729F36F907A0B37B5F1BC381A115A65DC2B2C5B8439F85901B1
-BBD6EF263820E813F9E4BD65E9A29FFDD9178D22EA74552E22DE6362E465D698
-3795D8FD2487B2A624D5C535063F1B2BB3DEE07E7BA4A5936BB0DFA4377BA2F1
-FE555D347799403EFE551EFF30BE7468A471E902433EFBF02E4784B583B1C255
-BA90095E37CAEA6CBD0BAD59E3B9A14120190846B8AC02B9A6442B78E68BBC0B
-94F8E33387523D672BD366106A4BB62B1CF022364D011CF340BF08021FC70AE1
-D2B4714002FAD60CB843898B731FD401D41C25AC996A864B4848C0DAFFFC7383
-95EA07BCC6A7BD093D1ADB6E3D220AFF5669883F5C01B2820C82E07411488E7F
-66CB3CC2F58D0F867D9370FC82B6D231B37E5E6FF413669ADADF2264586D9E25
-AF180F49B79416618FECFA641018806471B0145DA023FFB1FC61A51D03B86C5E
-4EBEB9F7F5D5182C3075474B9CCE399CA11C9FA17EE469FE0481C253253FC03F
-A4562033ADBC19505B863A444C23F07B048A3DD044E8CD9F0BD77C9459D61FA8
-1AFD906843077AC6F878B099F776C0A4BB5460B3D1F81DC3871F3BD4C8379B08
-8309F47A42D923C153F7581EEC85AB756075CB465CC8F8301AC6D00764992DE9
-E0BF8A4D9C6B4B0EA012216797543DED1CC8AD8D89B277E586B1763F9004583D
-CF1EE2BBA82FF768EFD891834C0CED284F56580A4BBE440839A53F8636B1C99D
-89D65CEA7FCFFB44F9CAC913A52C81728800031F240A502B588F487AAE219D97
-CED1BCD34096FA682B335FF362F87FA6D8A307CB9D796F1700CDFA3D21C5BB66
-FA221D737EAAD02208240E4B882CE67D19AE089380B0FEDAC4F97E7ED7629A20
-C7F8688BE4D5C0AF3326A66C1403E968E8963F4DDE599143D8C57CCF85B7887E
-980D75A2DD2B7AA28202635645D768C7121AC6D6FA7A6DDB06BE3AB1624D36C6
-C0F31E3B9BFED8691709D747DC2550915DE2A2486B7E74DD1665F350D2FFAA8E
-81E8671F67776964ED20C46E2FCD2CF7B3E0B559FD8C9A24C39611E930D0EB7F
-B28FAA043903F3E4A0E3C1856CF7EDFDA670FA030C2A78A99F4FC80207E17A20
-63C316F77D88676C3FB96B680B1A27180087FAA1FB5CBED05EC3BA0CC5566CBF
-496545871367621CC713131BD73F6C37064EF652DB3CF175AE9636ADFFF84259
-25A185AD1F4582845C8D4B095B4F7628F1D44C79FDD16E20638698C2D3AE2797
-04723053FD9ED7D54F2A64C09CA1FC60D3410E42196E42BB914E4C4A04C39599
-51BB33559A9EDDE6FD37E9876659831E92E1FC5FB389E5C89A0D59F792AC9D51
-2A27FD50F713B97D32D83A216241DA10B43928565CFA592C54A4288118B6989C
-8BC97A4A1E3C8EF78B1E17C18B4D36F48067C9746CE3109914324B9FFAB62B27
-603ECA751FE7AABFC5E38DE09BDE9E575EA00E8726C3918DB505D2264A510EFD
-117D3F834DCD09796193CC5D6911FC7BA69DBC8350468534353B20E8EBC077F0
-9CA9090C11E7FB960DF3596125E52411C38A7E5C36F88313F84FEA1916C5FCC9
-BD772A1B9DDD67BD21B117F9F2F00FB7B1EBA1B5DF9CD89CD46E0BFA65199E62
-FB5C7F1557C60A36D87898E8C2BCDEEF99040B45585C0ACAD8E573901AAD634D
-D2F69B4CB22412EDA3C74D5D6098E8BAA1D25A1B78D07FB93A58F84EAB79ADDE
-E84D39DAA5C0E94FE8951AD145AF05E9A2A4432B7BB6E853FE441EAD4DECD57D
-D8E96957622DBF00DF38825C428ADEE495F1CCB5B25F08CCA276DCB042A63CC8
-D610CF464BB435CF4716ABB81A7166EA48CD9855BAD9046C898390441B7435D2
-FFC98669E81324854E750F49F64FD19D69A10A92328F2A4B11DBC02EB1F7CC46
-54FD66F66A32B02C57488F8BB468D73DAB1B3982DF8405BA4F1CEA9C76D10F54
-F5481A0C3DECCF250DF79F6B614B3E7CDC0571E95FC4478A20CDB3E4D4B83ECD
-3C747CE9D175AF8F8E0E435A7D5C498BBD387D9041DBBA0EB62A5035838D7E45
-4B0717C5CC75BEF851558280983D72DEE80A0EC3F685A2467C6D22F4E33C4D6A
-494589594DB320011E40993D0942E3D26B507E61BFA17A3FE55157225468E2BC
-6C63EF000588FF08D4E0F8D244152FC03B35FA6C5F6BAEC28D34F3FDFDBDFB8F
-90DAE0DFD3D284A3E859AA4F79091E373D27C04A82819A2E91AF7736AA070F56
-2429F1077B9F32E7F1700AF99146863A82481D0E78729E9EAEA3C2FFDED364BA
-D88A837491D5A6428294F60C608A3483A2BFA25FE5E0FEA30E984C46E25D98B0
-28B708C01494CF33D00C0174E18E52F9B2EA7F921827505A980BCCDD191E1B8C
-D6BEDFA50F653B88CB0144871B2AE58835B15F7CE53F731CCBDD056672574ED0
-7BEF33FAC905EBCD9D47B82F749B30D14CED4D0907DCF3DFCF0185BA1CBE722C
-49D7186BF7981DFCE6B2679E177569941FCD563FC3B9B75610847279C1A01341
-AD3C35B4752799789DFC7D2A1F5F0DFAF89C498DE1A771DFCBE9816971C5313B
-5AA89B10C8C4094049570C394A837B031BE0A8AED0A74123CCBBCE2DE1671841
-397237C7827A5BC42574E2AD0605F84B77261DD7DEF10EDE93BA9D61FF8174BD
-3BA0A966728BBBAA807DABFC3108209752FCEAD24BEBC8B22603C9E7B158E86E
-8873BB01E6D25A09F5FDFBB6EDD3FAF6C672461644BF76ADFDE82DE718BF11F9
-A75433926E4B37556EF4BE8110D82A385C324DAEC3F37D89434C5EC8CA3286F3
-A0819C04DA7E4E48CEFBA97BCFB6005D3B3DF4A8880D3349FB15EB7A614FCAB6
-806ED53B9BA76C02E89D161E8A880ACE8E4201029C62DF57099634EEFE3FC7C5
-A755374ACCBCA10435F24D5F649EC05D4CBF39150A893984A177ECB0D3956D88
-798954C873DFCE8F57D13D6652CC928E9F80B4B6D47C5CF9B17BF89456C7B91F
-4717C990911E19C595B52D19C4E5DD70AB3183C4165A4217ABCE21EBF6115E53
-8A1774E1A998893F0668FDF637A05178F5F1CC675CFE42E67D56C3365A762FE6
-DB7B670A60C81104B9237F5BE835B38184D56DEFCA72130240A2C543035B4418
-384ECD8189CD5B7966663EC5B42A83406D06210A37C65D02F7C6CDC3C499C574
-4A4E719EB0F14EAF5786A385D9BA4A04D3B7EDCF1BB35D3243264DE8AEA06AA7
-28DEBC7B95023FE76C18E9CE32FBF3AB800F3F8C9FB5211BDCF93469DF59BDD0
-662345D4D57D9A56BAB5A145DCBCE29521E30DE7C6637A812E64253584D66BD3
-83BBDB9B8A1AC464FB53009D543B74F07B234B4E1D523DAB41EEFCD319465AE1
-BEFF3DC939164B65A06C6F60AFC0126E093166A842B40F8C39693AEAE9BCDAC9
-758B1163F4AEB042E8AE1385672B62B161D83CEDD0889080CE8F76900B82F82D
-B84192D470A0C3C80C5E15C1E3ED8FD582825FC18A055C40FAE681E1EC4B16B6
-53A1723815E7D7E8C65553F97D7577859E4E63FD7EA4508825B75FD8FF0F49D8
-03047786DD59110FB7F422C6C625992E86C719F6932ADBA81CBE1C43C63DD43C
-50D79466C8AA5166B8C664D8F6E90F1A807E8EF26A1B69DC6314B72F20A390A2
-98599D640CC42ECD583F6405828CA8408EAEBE5997D15BA79060AD9C8E5FFF57
-8B64D12E6AD37373570EDCD19FFD63951EA8BA780A2D01F1B9670BB636088C3C
-4B1A8706556D8EB05F15B34A549905C330004A66083B88D6D6D3B538B93F7090
-4719658F96F98FA64F2D8773ED8BA488CDA55ED6D75AD2B8E9AF47AC86FC2FB8
-29CF1A792379143993D9E20240DCA56D3E7EFEA9466B0138175CDF149DBB6872
-565A8D48C7233A6AE4780373014CC5CD045CA08EB63631A50B8C05AA893A6128
-FAAFFAE38FC5C81D9320B116864DAEA14ECBF347953510B494993E459483D0E7
-7699A329D0EF527230463543C583EDD4D5C05CE0E81D1A51723300EA987314B2
-3352F4D19439CB60D500EBDDE5B3A293D4771A4AA137E76DF5688C50A65258EC
-DD90D1060DB86A881F858ED21DE81E407FE74E9904E98BF659282B89D9ED0240
-535995B68AEA47B05601AC9BEF4735CF94BD905324CE61374AA17FC0AB3CE14D
-23D28C1DDB70E9EB283ECBF96BC601C7B16810C46D996DEE582A41C995208793
-F88378EA764446F9AF8939AF830CC14D62345B40264362CAC8DA7D59953FC1EA
-6DDCF2142D534C0D3C3EA587503BDF46F76C459772A60C5CC4716235B0EE1576
-690C4F6E9D1C6825253BDB9CE0C710D1F0BAD5193878AF0D3EE7D51D54C7E0FA
-AFC54104158E7D0B6B9F7F83E7371AF8D278D861B91974135818DB29D89F1501
-A00CE9CCCA2662A93B447E9A5EBA74A719C811598CB09AA94CEE7D9EE8880967
-443D806099915D25D63021B4E57F359AC43911D42E07F6E8E3CBEC19B6C0496A
-24C383E14E8CC8B664EDA0248B047951DFAF98D8D8F2FB531FC408FC123606ED
-86788DBD7D42DA61B976B263685297224FEE5BBD981C5A45194046016A8B26E6
-F54EE7FD496AC4DEFA514BDA54EABDF41F1619C4E533363C5CF5914B25890331
-9A7F821F784004AEE9D10D4B47F75D0531F80AE71097B4DDE3B8BBD360EE2727
-3892959E0C7480895DDFE0A8999E18302F60979F5B2FC794F5AAEE205BE8FDB8
-84684F7B35DD6F88CF8C5AD2B982E6EFACCBBB7A4700A67CE00998252AD0B287
-E20D5AFA935A49B1ED106E71FA16355F1A54D64E0F8D2545D98FD99690C40B96
-1A9162AD79EBB7B613A015EF486FC56F2EEA41FA772EDA87137606EEBDB64E04
-E24856C6E819063B2CE246F7223C6330A36D624A597707D2385F43CC17D529AE
-4997634BA6BC9090AB520E2C45EB729612B12F9D3FD91DC4C9EE74CFC552E56C
-4D672D1306407D690974E5B3DE86C7EFE946DC7ACA248718FE3B2F699E01CEF2
-B70DCFB81F24AA2A2C220E14006B8D6E09C5101F6724E9D75BA1F465E211B1D5
-177E9F83AAC3F0DF18EB7454E61F76CB700DD59D8ABB42B1AEE8FD5565F85D70
-240B724E6D3C5935D8F42638DC82D9773CA3B78954ED6533F1D0BBAF1BCACBF8
-E0CDF3032CE880780EE8F56AC2182A46A319798C9C60D398BE16E654490428B5
-A480805FD3E59D75A2E154C1016D210D4DD3E11639E9F2AE510694FE5F7D9733
-F594EBB8A17B5A2A2471C571D481E8C04D072511753927376F97F1E3009D3B31
-ABCD1C6DE64D19D471E39E7FABFD7978ECFA08E611A9932EAB8AFC7A4A1AB516
-6315B8363C62D112A9FCE8489156E6164BE073C1FA98E9D55E975B86ACD9CC87
-03542B3B79EACDDC0F525ADF9922868CF31F3D83D1E392ADF522E46D9E71EDF5
-25C3FF53ACCB292A8604CC32E8B3051AC8BBACD05948612D337DED7C027E4EB8
-F5ED77D4966D1A6B32722613F9BE146E5D7A61ACEEC0B8472E95B4E8266DB146
-8B1991DFEC19482C9E1D4058016E0EE9B2545B07CB4810F564B10D0EA86BD066
-41F027E003DEC79F80D11E9452035B4093FDB920B535C18EF20305534855287F
-DCECDAD9A1CBCD79CCADBAB8F3B55B0E59001E587A81B5D02EE45FC1672C411E
-FBEB21598F9FFCD05C55AAAA281AACA5193DA116B1F46ACB96F728D40476BD89
-542BD47C984849AB998D6DA2AF989EC1BB9A26F4361C610919969F7DA2771B7B
-055F44BF8DED74CDD91CA5609918ED52354ABEFF2DA73C1DE643FA90FE4FF2B3
-830743AB648D2A108FF8CBBEEC1DCB62A71490A6D574AB2C36792CC00CE631D1
-984014A7B9508C3FC71CEEDD417F6E31F5BBC6F1FC0AE55155F9D56A1AA196C3
-A696F91CDEA58317BE9E8B37F112E6076C765B1C25F0CC6F671428C91A57C63A
-1A69F5931B1875664D489A65698A2BCD637965FA5001F2AAE617BD5AE2DF9B9D
-0E230D097AEBEA7551245B5F6B4D98EBB1DD23C6ACBE887FAB49E9F271051F15
-E6EE147FA3B91FCBB5F0D571D69E1C942BAD057F13E4D44B4C3BCDA1A34B4A1B
-FC1B3938C1A20FF5F3C2F479FA651F015C4BB08BC019A692462F15CF9DA72D1B
-04DB4C99E145218840246E4337700D009123F528AB89469B888C9DFA38E032B2
-7E2256BFB68648EB06197B1DA3F73AE3DBF313A8C661499CC0693C8D3557F0EE
-B9479448E1A85B014F1D178C6BE2B625EE25EB51CDC71B9510793AA5D823CF6D
-7328E54584076DF26B858C9836077C4A2381F4A6EE19F4E801772C0DBA42508A
-3D92EA34CD0921CDD2C56A1D9ACEC3CEB200626FE3CAF033E24800DBD51E6C82
-FA0F7E37F3DA97A83227358C5B20549859645E819C193B303A957229F66896EB
-225922A128B1333C3AC8C616D348C1FE225DE03782E6E5719F13DB747D0846E9
-C3C66728C9099069DEF69A4F254188C46177757DEACB597E8CEDE41658FA405D
-921E8F71F91F455C0A11B8B517BEE363690C14FBB31232239F5A095CBFC7941A
-95815705868B3BE129F81BEE586F90983A28C04543E049BE4A6CB0EDC3EF4929
-D2499DD08DF2A3BCC55CAF2AEB42695A8016A4A1A52D4688AE0C4867363AFA12
-3EED7AF3200320C1EA166FBE2A42BE3157AB633610FAF827666C239F5E6310EF
-BBC01419156AB3022DC29B5C64E8F676150AB1A5CB91AE6E9453A60A5A24607D
-AC7F2B5790429364E4E6BC6F3731610769EA645101C3329C77CC30D7E7742FA9
-6E47A1F4A95E5B9A9DF448B03C764390C74B6CE38FD8A43E0FD49B19E5508491
-4A47FDA43F186BDECD6D9FD0F1D592FE384F09D4415EA6FB9AAD57F11465E56B
-CC7CF0F78A498F3B63985EE28F4E18557DB38101282E3FF5827569B33DE8510D
-9ACB69C2D3F13D791A4E095B77A92081D8943E3027F6A8AE7DF75A8946CBCC5D
-D397485BF27B974A5708AB8C06AF9B9C695725B49D670891EB0C87A4B650F117
-381EDC200C8172A35F37542F207FEFE29ED8337427230C2B16536FAC2C89B550
-6F714AC7D8870775AB79A072355DE4A5B4D1B4520FF18D626A8BD3F6BEA2A17A
-8EA40E7A82494F7C063830B6B81779212BE325569F482C0239E11CAD51B49207
-012F36787400AEED36BC61A6DA3B497E86D4BE1E849E577C89A72EF77A6E252E
-153E83DBBBE61BD4AE74D470F8A729E385628C9B60D12A999C345C19348A0F95
-6EE4379A54C267466537316ED4BC409483351B747C91241C1CF777B72491D418
-8BD37616222529F07681FE0F43B3ADA4847A612C7C56B5B32D8011D13A9DC226
-116C53C017F2E54C5D2EAB0047BC9B01A9A414D2EF9F51D9E9861615CFD729B4
-FCADE9B5C9EEC3D84C9F97B2528CDE18C4B461FD56A5327771C977B13E967091
-B8B375C0E7A63D93681104AA2D00161D1A9FC91457DEAB8114A9EA93EF9AC7CD
-B292CA7EB423DF2EA9183A267953D4B431A5C532B26B12A4D2D681804DB2A908
-4E15E30372E42740E3E04E044BB9E97252B95A7BEE944E3840A4E9A327ECD640
-38194D75C20F80497DB572929D7B1DE23C5150A242A5D042988C83F39BB55958
-E3BFAEC4582969F5690715B30A44B6CFBF33DF363400A52191EB2BBCC599F2B2
-F4FABAE2BADBA0731D59F1B2E43C97769BFD3B9CD210018080BB38A06DE7A42B
-D717CFA65D48118E5FFB29C2DC85E1D3068261EA15CD6F851C4DE7FBE2D6B4C7
-A6EB8752F6B4BF9C5DFB7C3282D56FD0E1036F3D74C2A96B4D308D91C1D83F93
-E59BB92411EE3CFA1169E5C92A94A32CBAEC1B570CC34F14B1810C1144283402
-F6021537D75F7B98DA7459921CAF5DE5323C1C1400C79B1E9BAFE971F7F21268
-4AC50D4D0DEF6E15F2DCB9541C04FE993AF7982AE5F9C4C6CBCA302B76EA1A6F
-DFC4D325A8CBF550FFA5D9298B4DC9D016A66FC44D3ACD5F26C980F61AC2A49E
-B738EFA01CFA1ACC7F251E87195F70385CC3B19D3D7701CDF9E4CD52FAB6AC67
-C86FEAA4A793FBA499A7601F95F9F934495FE5AF5EC8CCB8F1C061E9733EC0C4
-845364B1F0A232EAF557C293EE11704617B82DB310FB50B152A711EDAA13182F
-6AB5B07064C07CCEBCB7ED57669150C74A2E72E95CB979EB18E439D8C2C55C23
-3A66A30F43B2C40B939592405EACE804CF149A667DD795016439668BF538913D
-A46FE03F8A45B348EFB1F5A454BD392390225351099E12068DBD8EFC37365FB2
-899734B4D85E0AD8D98F18EDB76389713CE43C0DD27D4E0AD99BD3CED8359325
-CDFFB957B75D05325AF1FE0532260F41AD9C37E5533019AD8ED57A1D7214A0B7
-FE158F9A5DB18CBDB2CEF1829C6DC6CDE3A14D2E7BE72648EE28C088EE03CD66
-EEE9C566F8380473199F069C73C621C8A8FA0A3E606730A2A6E3B0C72C09B0AF
-46803CA2D1134E117D38C827AB65BE4F5F8B1E43F1294E07C38924243796B797
-4F27F3124FFEB4609518D629C0FCCDF235363A523C0F6AC3D37BCEB1DCD10231
-6ED57B4137242BBAD3F625CB0D79AF1A46DFD85232CC90F5EAB36E950CC5D7FC
-345A443B7F1CCF0028A6759F37F7356EBEC1B1271FA22BB0A72DE74EED1F8E5C
-C9A20D9D2115C7FEA8EC01F15FA28A2F4537A3C21EF9A168017327BC03FB37EE
-FA1E0ED6BD673F79CC1DC21B88C26550A14AEEEBDDB1E61CCC504157E461E29C
-7BDB3D919A2986B5EC8EB2D732B0B4BFF561DAA1E9618CD256E219C4DE36B69F
-4B6DFCF81B78F00D14145F21FFE675850CDDB32D499BDFBC1EC0D35787225CD3
-DEDD89FDAEE89501C4E5850F06BD948E95FAA06BFD2556BDB16259D19086598D
-DA982F4D7593DC56130F818CB25DD92F2388520E730C8B3ACA4E03A3CF8CF205
-FFCF113E4278F0B5869E37AF3460C9BD1DE520D277AE1A09F85E276D6F16D7DE
-C04E12DA6EB6FEE8F9285E888ECA6B408A8EE929ED51F5A7CAF5FF5F87579604
-889BFC328A4E43D308DF7B6F89C059DBDD4458D521A4FFD66E8339D883E1B7D5
-951E32532F60D1B75845DAE58332BDDE7A72A8FAD548E31202130EE23E730ABE
-C9007226F3C24AD929158D6A266A045C715B293A3D7E8447CBE6062BFEBD7956
-9088865031AD88B5329D104969A1FAD918F828208B743B650ABA1F345D9D6227
-5E4AF25448CCBB425DAE77E2CB9B73C73E0247C3DBE67F7BC3401433DBE53E08
-561295690C9F93A07D10093DC2AE953174ACA5358B40F3BA9DCF0710C49976A3
-C482B698FA107B25B246789B91473B63B4C9396997BBE4C8A5821E9F6C48598F
-41FBEBA01C031E5B3107A5D20839907D62D51F721ABD116A40692084A06818D6
-19470FE3BF24062BA7E62A27841DDC319496790E027DBCD4EB1B87810F936D5A
-D33212E5CD654BDF7E245D04A555640DBD89A6A998A6A2377CA8AC615734035E
-44ACD5BCBDAF14DD345D8D6B8A34AE91A6AFA2A7FE4B09761A732DB70692691C
-774659E2768D84943091417976A6ABE11095605C8269813BB4811F0F47A8F669
-34E3168FA6A02E4DA5335ECFFC0077F7D3D4573BFDE1D22E5FC066AB27579763
-422F27362794478CA59D87E9B4049F7CCBF47854774BE273A6B6F0638F897E92
-741F3144F7BDAC4010929BD605D3C52234F5EAA239A68FA7C52CE2B184538C06
-E0A90BE79DD5FDAD372D95213E30F9C2A999E21F598BDEAF6315F5C3BCDD6044
-92733C0B012F610C25E146CB6F17AA6CBDCA88116E7B551B3B882179441E0568
-852F3E714BAFDE7ABDB93BBA3F1C04E4FFE87D786B38CDE07FC9797AE301F3BC
-70013745A652EA5A8DB0265E846BE240D4A456E3B1953553D1D36781FBF11C50
-90C2236FC2CAECBC91C0FC04FC9F3B86BA31684BE56309027044EDAC9997EC57
-247D28A677AEE4B0844EEC683A2227969EF18F52D1E9C926569AFB482CC0C475
-E0217037378CFF3B701A798074AE248751A7DDA18EC1138BEB5E57FFED63B920
-D9BE59FE503DD1EE2909A7FDE826B40A419CB0089C91D6A134EAC709CAC514CD
-DA21620C37994A81709C97314C1A09BA6AF7206122BC143310CF7D9CDE96AFFD
-ABF6B7400862212ED910F90C9E9B90BA2F7AE0364472576AE09C193D7F327016
-D9C68AF2F55C13FE4AB71C2B4C7D9A9A58AA097B69447DFCD98219A2998BDA74
-00807ADFFF265B30D1A9A2D967856C911A15D89A147016F70099D7AA84E661A3
-64EE3A3E379ACF29DDE519099453FF94441B19405D7C873F6DDCAB0EA55E8271
-ABF2B29FE36B9D3B2461D01DEDDEA93EE39BA85B6424D70A72AA4B05B19B6D42
-D46298C7D23E94A88FACA6D476DC37E379F537B80454A61678262B39B84E0530
-F21082CD5EA2D11623EBB27340297A0311BC422690758E11E6A2D14668C3FED6
-FF932118DCFBB0E4E8B723A2EB58367A96B16B9E3E466F9ABBD458C866CEB4EB
-D326D8BBAC28163105F537220F240FFCDB3CC8D35F60AEF379B3679ACF3F86A3
-C0E32746EA9F67C084B2A80866DC1564CD4118E13D0E3842B623191E849EBD64
-8E89ED9377F700D60B0FB5A4248156A1D5E8400C21A2EF623730FE9530382652
-705E3C9228D9963BE6AA380A98574C52EB657B6F2E142AF3F0250FE04EA1E913
-BF95A78EC7A6A68FFFE15FE8128F3EAEFD692A17CA5F779C705FD1896B1C9BE2
-09E8D23F3BE13C3761DCAC7D89679EB558BFE8BF9A03B30D8790B7247E0C094A
-A0E14581C633C41987F33D225F9ABE5E1547310A2F2C755CF580485D7328E451
-95D7C240A674262ADFE530034D164B066204358E87699216995BEDF3C437A77A
-6D9DEAA3B088DBE3C510FAF44F92D11A9795B81682F992318675B181532BAD48
-7C30BFF33FFC7B0D756EB2FF171DD0FB853178FDB08A48418A8494C4538D8300
-50A48E926152E47B225932AA491D20754B115C867C40930F85ECF5D82F43FD4A
-E1FB09A16485AA8DE8481E2344C8BD2EC4C3EE82BDBD4EF12B793B74454BEB72
-10DE166D7941C0AE41D9822B8B1A5BFF31A411A95321D4B3F81922E711C2C594
-7C8D17D535A289F32F573F5435EF81F7A6E15D2A27E6020CA9602DCE96520A5E
-91043C649E41950750AC2B991524FE956D3A5AD964D1313C2EA55D4B5355F7D0
-49C8838BBF2C970A150F272805E66AAE44582A5840D7F0E206D82A411E7BFDCD
-8C52A9BE758D312192DDC8FF3C4B3900879307282815E4BF9511AA1810509CF7
-14AA4025436A8E20702E2BBE02E0060C875D1B25FA984A3165B00F5CB82962C6
-6D2C2B594AC551828A416536FB02BCD49090FA6C7AB58AD771D02F6895374768
-4FCFE729D2827DF513E1C60E4716CC859E4D87B049ECC8986B68E7E5C0FD1C04
-AF1DA089D0FB03897D48E7D4F2277B8AEAD3A24147D0936C54D487B434C48B19
-E38A0109C9CB131359FB2FE6DBEBDF180CA8C12C2ABCCB46931C662DB2D3DB5C
-0CCBDB6F00EC033C9F923DBBAAAC0BBBF4A35ABA8F2D4AE7F868213721F10D51
-42BABD11720505345566C5E2594867DE91E81DE20709BAC6888CF96B4728E2DA
-9CB5032F3FA434B95F6E55F484E1570565C0424087D1FE65A7BA94459FDECB20
-02A522FE8ED23D6EBB943F185E966F7F027C183AB1127A0A7EE43A9EFB4A127B
-43FCE7527CA6D3C753626DD9D35137B7BEFB4D0C7A0428D6E12512E63BA0B82A
-D8E22C7D40477131568FD5B9E01F4C23022190578DF4B596FCAE21A6CAC7D573
-BAF887E02FD103350C0C6483732E94B507718B8A9A378DF180A41EC67BDA506E
-4D8FB98046D97A626284261FF30F456D211D5C384A16887706B8C659B2281B9E
-AD07F74DC327C12AD6B828AB0CB757A83BD9D135BD0799B5F8969F5E00DBADE8
-5A8D191228CB014330CF17720C5C2B8564BF78F396B9F518F96A92CE80D9D64A
-4DE45FA6DB005EC8CAFC6C997E9F3B1688BAE40F0FA54A7F5E9B7AB6664F2E94
-1A653398F4B3E45854D3EF1789E8F769BA3816D5EF896A997FB64E0A8D06365A
-ADF839A43899B0FD2411D851E273B4B0BFB5A1174AD6D0CEB05915F1A8229547
-F9220EF578AA6A561D949B48D1B6185F2058F800BBD758317E4D555869BDE73A
-A5B130A31718C787A4302B76297F94C503A442412CD263F5510A39E6F9494664
-724329E58CF259950CD1579297B9956BB9435B6D44801C058E28DA4911C19CB5
-368397D382C4C6BED80E1AC6CB7716E9C83CBACB87173CAF0A7B56A657BBCEE2
-8D252EFC0FF59ADAFC582146D2074BC71A3BC55D2B6694842C0AC9DE6FC0BA58
-C67AA00F8BE31EF69343479C04F1E4718A99EDEF7C54EA07F6FDB1673B515CB7
-90BD510B6915016564A3C69C7DD10D2896C21E1893C441243AC3D3223F878DB3
-D98A58573D71008F7B5A574AE8AFF1D9BE4BDFA755459A0AFA87EB60BA40E9E3
-86ACE3DC9C8C83CB780B705390EF58C22AD86E3AF8AE9EC7B098E3A4CB7A20C2
-364844C91C9B092F3C80E5F0C0875C87CAB85005893837D2A84288F50F595A2A
-C6F7524DA556249A48B1D6E407AAECEC725E46A22EB1B0CB8A03D1C853396D14
-8135A883BF18DF240F8B19CB176B064E685B60B93B16C74B6E988AA18E610FC0
-150AE778A8AC1043B75F43D477BD8B5EFF5BEBE679AE42571C7A8974CF07F55D
-1FDBE94C2B83D8D50C6B1FB66178051BF1C42EB489C0EBC39DE09549DADFC50C
-8140F04C4D065549800E1DCCFE65BF708B09D177C19D3AB5AEC42DD4CB645A7E
-C52A360D67920A2F379DF0796DB1D31B2BB681E759279CB093F545262152EF1A
-EBC19FAB38F4649CE126E4051AC6258C6C301A2285DEE5605FA2B337356E0B36
-2D927CB3361B895447EE897BADC86B875E28679DAA7A23C71590BA5F59BE94B1
-18670F3934CD9A3402A4C8A154EF6A8C9A0238F2F2BA7C4CC5C8CBB774923CC1
-2F12543FECCB1635680275A48309AA322D43CDA5109EE8E6E7E8472EF199785D
-9E84A5D50E433A860494349B55CF38808CB51851F21281959CE4A43781AE9250
-54011F5849FD5B45940616AC942483A87C1165D191B856C9D8479501E9A59E8C
-13B9FBF1083FA716AB4D7FC885186C551085354D17684BB7B0F0E9EB9C4A1205
-3383639CED121ED2BDB7A52356806A46954A06C00894DC228F22E704FA3E30B9
-204B85BADD5411B313F7FD01E02FC927682DF3E8EB3BD0EAF002448154C8DAA9
-8B2691D0AF9A6E6DB9DFEF0FAA136AE9A99EEF6F3A9B55EF49C85A083EC02514
-05C8B5D5FE8A273C8FD656ED257F11D49504F91CBA6933DA45AE47F7AA3013CD
-23825CD92D445B052A383CCE81EFC50927C94D9C1C29D6EF54E5BE20D876A751
-32339988D4D440EB7561E5B90F4EA7586010566272E81FA73289981CB2166E79
-4FB33F7CA98FD016ED602C78529173B3B976F11A9CA86437F942ED0AA26B5EDD
-D089AFCA5E3285B85D390031D1A942BE38B826BA08E36E6A275C87DC5477FC15
-1ACCA330651DD43750D3B0332C55197D91345D491DF96764DE969F55E6612354
-A540402879BE16BB2A08E45EA16DDF58645B86F3884E5A2669DA970E01156162
-D74A3AC0104DCF86C11C4F19236C586FE659844F0200868570BB4BCE1B529C2C
-A216F27DD9EC638F671B049CBA7F96D0DC3402478CC833E3CE19D4B42C1FF119
-39268958A932BCAF36DC99B83061149B18C800E4196291DAA2E5D6983353EC41
-966F9303327A7DDA28D041555320E4B3B5DEBAD49CBC043DF4D92C2E5F82F3E8
-5C79AAA7C3B9CAFD96A39F58914D24E1B815EA03B238FF763763DBE885E8AD8A
-C58A31E220ED192C61D9E1F3C5C13730744A2343B9BE703EDAEB42C9A53B0CA9
-BE6910779D1F94BB4789D3611A1D51F555448B8661249459CA515AFD0640D3CE
-A564907F819B3752DFDD134FC5978398AF0C57B969D5B24A92CF99F2A0DFC447
-751F988B3AC1E5E55382673EDEB9CBCDB9825E7998F332A04EEA0BD207143EFD
-BA2A4EDAFB487EACF8B4753A7343915C0EED8E9831BDD37BE699F32F0D09206B
-FF1CE2BFEC49DEBD085733DAEB2720E03CC19A8B995FD2FFAE293C720A59DE13
-D7181515582AF67F9B51A1F8531A5B0A63BBCE4BB6146DAA1CD4281CD4166F38
-012F72EBD053D5DB3D2AF3D84EF7B38EC4E6845395395DC12F97526437F7B839
-F6633DC3CBAEC03D5391314E6C2B94B8392B1848527544E28F808A50CFE94745
-B6C2E7BEB710279420E2284F37657B59248DDE57C149E34BD2B9BF6F41207188
-22D28A609D2EFEC2F04B22DA370761E1C8FB04A7A132A157F25593FBF6A62F88
-4697C4E6C2E70B57443D08F5FAD9DB2AB398D2C47B039573C85546FCDBCBB5FB
-453B9CC6D93DDA6D58B495099B5D204AC291074CDF0319957383AD958390FD8E
-BF768029B92022E9E7CD009620AB491330B8270FB8B94202C94E41397357167F
-5BD8BBEA013F3278EA0A1EA4A6CB25527C92F5BF9A2F67A38FF2488B09C89B8E
-A5BBAF61E672FECFF5511AA05A3AE001463483D86B60C7E61939FDF6306093C5
-E621F084D993ED0D4ADD7F58F9D0FD05932E2E4DF4C2CEB1B0401F6254DD0899
-B87E41C1CAA87981E7E2E94BEF85F5FF3C260710408B536EDAF78189E816F2FF
-2ABA6F132830117F95DFE7C0CFD740E20826E875DAE1F6E7AE8333B1C20ADF8B
-B882B45CCEC42A6EA5F2A50F100987D50A1F8E5FA9C00AE132D77740F48B6D3B
-E6E12B534A97663A3695491CF4E42E66DA66FB2EC1531AB292E3D8238BDEEBE9
-DBBBABA1498310DCE5B1B7B99464C463637218A766F1B731CCDB17AB17F4FBEF
-47E7FF5962EAAF1320C667A645E25FBFEE4D882DDF31C9785628D32988F00F4D
-87FF88DBCD2370661F85A16B82125D753CD02688FFF8FCC59D318EDEB5E56010
-16BFB2A8E8A151898F548C6C69BD17857F6427DB8102711103BDB2BD1C0A8F63
-31A1167EFF41E0E5B814AEBD022E941109E8BE0987FD33EDBBDDD203A18A3FAB
-2A720481F15233739E1E882A191ACA4B051BF6549A0FE597041B33DFA55BC396
-A3D200D46DEB2071C756FC050132CF58BC768224387C4B53F646EF9972266FDC
-210F24A85881F5EFCA127055FB69324B377802CC1CEF29C1A5D1C894337D0ADF
-7B5EAB50B40D91D3B0A2C3698D1603FE27CAB713502ECC3BE3A543802BB18627
-1F3148A1F9F31C8905205B6348E39498BE0E24B558ED3D061CC47D7544FB10CA
-EE4B5F5FC8161C9A341AC7CDC83F9D506AD6704554A31D20C26DBA17B6F011DD
-71232C8BB6C1EC2993160ED28B5C15A330FC1EB37FDB83C2B7FF9857138A1F75
-3D91CEB5BFC8CE44159EC17B0462D274D75C4EA3C7A519067B8B817A9C6E63C0
-33989FAB825455369FA87EB7BBC8E80A9387E0772B22B2AE50A2EBCBD0E087A8
-18026C8BE1110F88E341751A56DE4D00B3EFC3207488097453DA8FCFA4A551E5
-5CC41FF1571C73BC0FD6ABC360E406713DA218331CA552B23B33F5C689DD2356
-17D4A4AB5E0983DBA0287557E477CBEA196CC9D04D7F101AF7D15EB52A3B8F9B
-0BAB6EAFE12C85DC36A106DBA34997E9C669DBA7F2FADBE2DA80725736E5D681
-9E03E69A866ECDFB07FF17E0BA3F9270C633C1E8FA8C259DAA9407A9C8EA2208
-E0B22230BF8A84CA23386B55C5DD8E5DF685541A0BF372FB76C9F65835B339A3
-74E10EFDDF2E84872899B3C2ED02BBBD466EF25660E416575F8D01B6A191AFFA
-51897804456707B70534647A4C09D849309102336B5D6F66CC544B2A37E1D8A2
-01F71DEDB222D2A42D74C99B14C8E834F831BC6BDD4348A514D35B666CA56ED2
-D93BABAEF353159474732E67F45199411CF000C7D4B1AB7BB569DC5F3F9EB893
-13FF595AD8F1A41B50CDDA27778C68BEFDE28CC79AB8B94377919B318E32F7B4
-7B3850320E1509452AA99F6F65E1C5C79CF67B4753528D07DD8BCAABC5BCCDA4
-76759D0343C3D4566270EC7F2665BB459A9FBB81A85F7343A5E14C7B7D262072
-FC37886F1CCC8F17DC5122F4978DB35E157310E6C355414DF6CC4532BEA621F2
-14426EEF4D7BCA2BD46419AF7E01B659F04F3C663FD10B4F09EF9F9ADB946319
-EF6C61A97667B2898256575DC116363B892DC5509652A1166C3D235A0CFF2135
-60675E209ACC3E057A38BD343EA5C01DAA61AFA53584C3E76C24212FD2DB65E9
-B2D99F97874228101DD2F38D85AB8E394B0C93076AE8310A6370BD12074EED63
-39C6160DFB49AE01E384825CABE01674B9AD61FB7EE61BBEF839C40E0B9E1081
-5F50BF8BDB6244230F2C06C421847031E5378874BC3CEED207DF0DA572FB92A9
-24C312CC4FEBE8AC67117837A6689B9A4C1CF677EE4B74BC60C12C3796FC5D3B
-259907D399538B1E207BA2170472980AD2713092513D67D8A475410884883A96
-176D772793DD06855DEDADE128239C387D36CD8DB2E1D3174102BFD70BF8B2E1
-7F68744226293C8CD39C99D939EB6A4E635C19929FBA4D49B3F576B53FCF7257
-EADBA531A9316496118352BFEEAB3862370148E1A20E07D93C7958EA113DC037
-5A99A7C8658CE77F01C1B769618205E86D966F5D0F3A276732CBA6800576B5C5
-F31E739B709D75526F32B6E796E7F659AB80AB86A3986742441EB99B8EA3614D
-880F9F37671E5BC3F8CE19B38EA6EE0693CECA57A6D7158EDCEBBECC70E1E429
-C1CBCD515EDC5AD996E877CA88B290E342D82F56ACAD5465790A46DDB20C5D81
-9C70A24BFEAA39A9155532380036451E1CB48ED7B7DBCCB686BF9A32041072F3
-3879D310C2E50A6646271800B2422E0C29974D6A02337B2BE484CA0D266F8F0D
-5B5E13C2595509B03FC95C8E37A20BC8FCF0A4B6CB6AD6C1F9FAFA02BA37B969
-2E0E8036EAE531074039D62ADDCB67F7A28B1815C04EB22F8234EAE30E773A54
-5F04842B429034472097D2852282BD77A39101904B505825616B09A9F5BC1377
-678FCBBF4689E4A980A46C83AB17E2AE5C222BE8A967D448AA9492C106D259F4
-17B5AC04797F36B2BBFF569CB8F0E48CE727F7741A1B57A71655E77736CE6D26
-4A6B86E078016BAE886E069F6FD040315C89C3A441EE0A92EBFDB02D81AD44DF
-F4F29AEFE0390448CE106B5A23143E9C34DC75C157C759CBCCF87E47CFEC0C03
-3148060FCDFFCD94B034DCB302FE796F06649C209DE276FC313D6A10189862B7
-D1C21075D80C30BA1F21AF907F0A9F38BD87F485F9DF469C8C9A9ADBB85F3679
-9839E5403BD31457AB9DB726DAC9CFF72EE7C3DFB0DA829DD28F50701FFD3B3D
-7203F36E2E5142A210B695BFAEE814274CBA880DDEFDEE86FC499D203FD205E5
-6A11E5571369718AD1E56508C161A48A059098E7FF3D2BD0898A17F591635391
-B81544B0FF21B57B5D6507F57EFEB2DEC894970513304FADF02D78747E900164
-56C90030E3E8F2D728128C19410E0D2CC1A34257F371A856D0B5DED3C887DCB9
-76C65ACCEC3089352636F977026767AF681F829435E68124FDC3F4F22C1A18EE
-9501478B1627E6E8C9E0F0737107EF242AC54676AB4F632DFB1FD1DE937EC35C
-64A0E35DB72A5B524449F65AE9054EEB9315971A43A48A12B82B81258D355979
-F50E3F34B4BF541FB2FE7B31190705BF86D1B7DDE8B8CF9433A6474A0B82CA9F
-03ECA76DDE98DCC703EC6ECAA8589374B9B58C648D0B644D652EE872CFA2B9F4
-767DBC4D8DDD8E69172D8FC9E12D4A30380EFDBAF3C0210B881F1069D17456F0
-B6F4A005A1E9F8B5C673A91F52FE95FB8BE9DCCF76465BDC26BC7C29FD2D13D9
-EE86AC85C3F1526FD495A120FBD5AAC5238AB1AD736206128ED0D1755A5F7098
-8B91636223E9666726FB36AAA4B02C3FC1E37CDA969175596B571B7D792EE705
-F72DBC6BB24E6D5E592AAF9B9D6CCC2469C389D25549A1E9FFC3B549C12BB96B
-66299ECA3C0E9E2AE6DDD699E07A59593F8DD214897C22214C7300A517F7CD1E
-D2144B07851F5E38E70886C9F06AD8CE90C35BBD91334EDE8A627735A4E8AFB4
-843D624A11113B8EBA95B1C55452D5A1D1E37532DFE8004F021A919AC07C5906
-090BB1AE3AD8B590686265C5E73FA528D9DCD44CABC78A392967031A08E12F7D
-5E70778013B30559D74E4C6BA2B551500CF1071B722234DE8B4F6EBABA2988E9
-B67E527FFA26B606977B273B6555CD0B9DDDB4913B1D233933B1ACBD74EB59AB
-BAD67D6047E712C4C144EC5EDC74F53D94A790806FACBAA02E7E2F3CFA6CDA93
-F337ADE914C9DC9937CE95F823931CCA1DFD7B2BB3B4E057EDEC6373F8B6E3A2
-2F547929D2083E6795A032AC0E892EA1E4DE0F5A97785B067CBF04C86BFB4B1A
-911BD9E498A3C3E11BCF09EA0CB1AEB8B966C7504AC1FA2765D172E0A026F215
-4BB374CF5AF876BB152546EA55BAD5E3ED4504AB544200A703EAC71DCEA9F09F
-B64AD56380576FE8F72C4147AF39BC522C9B13E8DBC11EEE1B216FA638604D49
-5A5417B6B9BB23A006983E01BF51884024AB44C8A0426FE01A1428E70478DD8F
-EEA0EF6474E3F999F3F0BDA5B3C2368A618238706D1B4732E6E24368AEA068E9
-1345142CBD56044541347286877D92CDB2E42426F59D405791E7A17019260769
-0A0BF66417658C49261985D15092EA239DCDBFAB358B37FA22D6C91E34EFAFEF
-824D6FECF0BDAA2C2FFB1ED169266318AFCA0509EDDC9F9F41C5ECB18A2C2BFC
-824F82D4FECA753CD4A07A11BBF92A19525031F8A01AE2D2DA04611C4DB764B9
-39DF94E9FD03F0074840DD609F1058BC2FD065828FB587D38C8447EFF2FD999A
-341E1F3201504B3123E7B19DA117BE5648B03E7964F6652148EBBCBDB3B5F167
-0187A61C00EDBA395538CD1C92D2C0AA9AD68A2BC0881E8F2A025E763B0C0EE2
-3E3E8A9E02DB95BCF2326CF8C9AEB14BDE8288D8992EF921A947970657F605C9
-E0B90DB7C5D16EC535F5830FAE43BE9488203705041635645A2A958A04FBE6AA
-47CA6AE7952B5C944734178C9B86015C9D440C6D1A2D45834CDAAC19120EA2C9
-13C2790137B35075012779BE0249EEE679FFB95FBD04030845803CB299080F51
-BFA09748A6708C48964052C7D8502433AB1777EC4328140F7784DE3614C5024B
-5351C63AE6DC3C064E126335F968067DE981706B3E907EFA1A73537F0B268E33
-521AF616B2B6EDCFA9B0FAB31B7AE7DC3A870D1968D0D4D1466AA7C923A923C4
-F86B6F4692B6B637322297221C69EEA47E9D7B46E726EE2FB8BD9866153BB505
-C1ADFB6545B6EC4E3ECE12EAD2B0CF05A0EC1CA8188991E90E3BD7151C234F11
-0EE146C0B9383B1FEA8C66D140EF9B4CECDD3B92C3E2633A0F6218D42A60CBB1
-01375E99A55510B06E4C307A91986A70AC40F11BAADABFEFF1E2D11AC9F791C4
-4AAB4546C037AC8200216F73E2626060D3817596C588D86D2E1105C0CF2845FD
-8F1E084E431E651B5C90DC97FA78DF49F90AE9F923D889047FC7EFD70399FB5A
-3FC6A2F5AC4C6BA217CAC25F0E01C65ED9A88A58429E396C9C0AF8D001EB1E1F
-5E7E1CF6C5DCE293F84E96C6D004CB0D19827D5AEADBEB37E818B664381EE6D5
-270A60FFFD4857A695C480F6F2EA24E37A69B4A47B9D62A9E2831999C590E50D
-7716AB8BA00DA97889DADDFE6D8AA93668C03CACFB051C8BB9226713D1E9BC75
-86CE9BB8059900D038CD0B31BD8230DEBF34FE8B6C9DEFC531B21D90FE4B6DCA
-257C9410BA9CB32711BD79A11EC587921FE57B095DFD07F051F2892A1B6AA72C
-34596217E819502427387BAA7E7C324C8C36E0E1EA3F3A3D16BD71486206FD5F
-E881F999449812050164148E0776E1E84A1901C49BB4AB89845DC1082EB048C4
-1E8300F8474A3F5BF28C96AADA6A3AE3EDFBCFF9FF44254B41C9AAB0AF34E0B9
-6551C23F6371C135A2F6EC9239D949BFB5C27F3A46C5BF6E214CD9A24FCCE358
-E3DF152004AE936538E4E54B88F1A8D02646DF74CD50E205C68B3587CE090EEA
-CB287AE009B551DF09FB77FCFB36973A68383E92575BF05387DEBA273ABD7579
-C772FA8F32B221EFA1A246EEFAE8B9354FE5C5B0583D37FB53B839BE68E80D91
-DA146A6DC4C8BB34D140EBDC678AC25B79B6BBFD37C9D73E57DB38ABF84C9A1B
-BFD558468EBC5B96912E91FA3F4205F5ABFD7246D749900436B7C4D9D4C6F78B
-7695E53781E9D7976937D21DA26F4A4C4EE02565AD55CC77798F86DC49D6136F
-88182A88FD5CF4FC3D0B4ABD7C268C1B90BB850DC034C5B32B3605A07E9371A2
-B750C4F8B3B862221BB0F4AF1DB6AE3E77652F33FE9D95439F536B4EA4D4D226
-2A8E09AE1C980DB20855283DCA5410A62514842388A4127E93D304C350EBB09A
-DC693B1D90AE851957DA25E06C795CE6C3090F5AA6AF587CB39405FA90316AAC
-F980CE1041C8DCB55786D2A47C499B5CE0947546A588BBCF1149206967B15CDC
-355EF3E9B9BF4ABE679EEE80187FBC57B317C194C9DF20BF344859567B8AA537
-B92E5196AD7B7F2C427EABED44C59FCAAEEAE18C3B518A39A1CAD14FEBDC311C
-02EF80CCBBB3B023B5708920C91B2A835775D0E7AB0A0DF2E249F2AC0D2435EE
-3BAA4A853E37F80C7EFFA56C6DA23BA618C5B259618460923EA12527D779BC05
-D3C20C410AD476F416D04489A2F4C82A4E583B3C5980A33BE766BC84CEEBC1E3
-FF77CBED10B8534A7540522E1D1D92A973700053D51DA6F89B10EB0EFADC289D
-EC8B53E81B095B5599E77EB443CBAD4074FDCF7085D7645980894419447EF8E1
-945A692E3721B90B580518ABE6BEACE7BE71B920A6FB704E25321624A8D1A37C
-9B01D6BFF2689A65B237ABAB3114112B7BEA16B66AFBC9E9D89F36CD4E638F18
-8926101C2B86A60EE12F6F432AAD3F5CCF22981DA0072DBDB1AB687F6E7ABED9
-84308AAA4662C8B9BC4A630E5FA5389EE050A9E4DF53B35D86C50150FAA3C0BA
-465E05FD1CA77AA3E78B19A5DDD60E4CE308C0DD115CA303D7D105D33F9F252B
-1D6C5764BDED6609EEF2400557658BD92C650DF037B7733FF5F5639E1B2973E3
-F673AA2E0319B4F0399D9784A25C08EED747CE2FC5AC3A8DCE5397BB03943E50
-866C1BB1FB0AFB847EE73DC3CC6B93BC7342DAC3D88727CFC0284A8FC2AD8B99
-DC7D6397043E8C5340B31E0568861EFADFC08212AF630E015E24C21AAF77F259
-089CF6C8D1E2D0136BA22707D9959981981CDEDEAC3375C1C9CFF0BF91785B8D
-44EBCF873DDE5F6A4C590156BDC278B6910087262BC808A4409323E465FC7BE7
-847A33796D20B116B205C2B2888E02957520B5034EA2C4644F2E99CAB4330924
-71D1A7A65290E8D13D37C7A778116F16FD8A2B93F78601EE0E28CEE0B83FAFAD
-B52146A221B9F011D167AE9644BE125FFF4F8A2228E21CF447DE42FEC6810352
-6C7DFF028D84DE6BB86C1B62A062A969B5BB1333D3E3BD95DE87E756D7098390
-2AE560996D9557A0C1D19F901A324656E3AFBFA1AB348FC923264E744954CF08
-B799CE46F1487B3188306BAAFB8D16B07B8B4AC37E11A6A5ACA1D5C7CB5FC3C6
-212AA74DF2EFD557BB3664366AF289F88FDBBADA3A6CD43756AB8DF2E30E7704
-DE96DCE521E0F9F23F2C5C299DC1345DBF1E9EB0A50231B02C53230131B67649
-B8422865DC9CE8CD2345FACFD59F8A0A13B4B4752DDA9258232C3BB537F44FFB
-A39DE8755B381C88D94A07B561879B3AC97FD8AB89953516769C44CCB5EA2CC3
-68156538A8F8D46EE1DF6E42B31D283868E5716AE0A9DBC518A2D19826032C05
-34A8563294BF6B4A5657CA7440BFCEA23BA55F4DCE15A036B0B30A4CC283CEF9
-056E9F7DDFCFF1BFF0CEE33DDD1BE8640443D2E9A9193A55D17766E6803E6C00
-57646B20920BDA09F080FD41D11B73CA536CE6835BCEE1D7ADE4DD4FCC849CEB
-3A4F4C808B2A1EDA914D469BA709AE3663CE715776A3C6893023FD59120FECAC
-2BB5E1A0278B4804B8A5A08ADE396027120D4855DF5408B7CFF13FC94981D448
-4EA46332569AA8A6121DFA55FB6310E86C95AE03AF0656317CEE6D8ABE6DED51
-140070B89F8FDA351D7520AEF9331649BC4FD2B96433951290573014594AFF53
-E1D59C2257C38DB5F89C2D84D47F9463F6B79D4FB06F4D994D475EAC02B40590
-A2A6EEE9CE8FF2A05ACC51694AA14E9DE73E688099E5E4297322399284EB456A
-0CC3EB28F470193CA13DCB82B8A72BF0DA06843DC95C17AB25512CF75E410B53
-01D4470B5910503400E1FB0088068CC4A753DFD5F725B0883E667185DC04DFA0
-22721F7C43F301155719E4AC651C0E9DC3106AB600C9F34408E6286E265B837F
-E977906953BA864E3CEB19BE1E7472CD6C0FEBC2F552A1EC207C1DA42B88E271
-3C76D77C01705EF06D90918E9F02A8619AA10100D32636F4DB188EFE516A3CED
-5BA74EC79C63824BC1BC0A8E7914AFD6BD14DE2F5A6FB7F3D0AB1B991D568760
-B056BD18C1967E6042D161C8F4A9E536B8EC49F1AA354437662332203A574906
-2698C5954EA3842D8CA8EA5018C64B49C0CEE3CE8157D1A54037831431073FBB
-23BDB5A15B6936D772C5B9E21963BD6FE868BF7174DA2E24FAD983B3C106864D
-E7E6540574F1FD6CD5C8442635637676D99986DC0A810709C3D3BF40458DDBFA
-456DB2EB44FA75C83AA70566C9F4A95DC1DFD8F820F1161ADBE4FE65CE040E65
-864D5D56F4D93D796493042A5EBDA7BCD6283DAC18DA5A87342C165D69118843
-0E8470A2D7137E4899DF3DAFA8A27D2273BB401A7A5C24A6243D1CE9930B0D3B
-4119F0588F822318FA154E5C882B677D8DA3359E0EF21BDAAC9262504C6D4714
-5426139CA31164F05FEDFE85368A8E087D65343C75EC07CEC25DE4F0F95A127C
-29C930F7ADFE463D8B64DE535E77F36C4A84DC6C0B158C3B0E1CFA30BAF3D834
-525DD3D8F39D755B95FC306923A9771CC3161B72888FCAE7F62137B030F6DECD
-1AE4FDF62A5C586204352359C639C9DF7D1A57482707EB0FDC5C687878329AD9
-1EDBB83D3E373D5812AC6B98DEB87EA382F10CE7E282360236EB97A006967B1F
-1BA105A48DD051FEA8E9E9DFC221549E71216EF16A28469BB9A296E6061277E0
-DDA7500023F51C416ADC9AFDC0A45A94D568556E9E25AE3383BB89F311F316F3
-EF7272EF3BE368B0ABF145AE097FFA7BCBCCA46CCF460916FD0F7B4840D36CAB
-B47BF1CC0D4E406ECA0C3E349C4D7443855BC48D56F5C7B53F69AC2602F02AA3
-A430E9215121108C6287012D3079969000DE04D0085B7BDC7B3EE1F16D659195
-7E695E20D5AC8F2D32CDD9D88E21B23B5E2E0A776E35F8EB759DD20B01D3DDDE
-77B7273192442C270ECE3422DEA9E52EE99542D636AFB83AA225B35DDB5E6384
-8DC6B5FBF7EE518377B4B2A8E01468E568B20DC79F2AE5A178E37FE67719CBF2
-C0C1F12B06F646E97998A5D6A36447BE87C94533E04071DC4C818A46C98482D5
-5F557B92F3B5A592B675F0395CDC05349F49E0B2878A0AD4F2C1473AD30DF752
-1ACA29B9520EC066319191D8B14DAE7685B5DB3C85C10685EA0C5158E049EBDA
-B204C1F73E78699268C9C336B8C0D54AB4B6D20E34F5F3CD6AEBB3CCA179689F
-8DFC5B4973346B98689E6AB25D251EB83CA6DD6DBF8EEA0AE66D7957B15CC773
-4F9C26A5BD0BCF65D7303AD381963B584E7CDDC6DA9B572BE655B7601BF1482D
-CAC527069E33038F77639810D403BAE1ACD1F9CEA544F8CE81F5D78582A24F54
-B1AF188BBE247053D3F09EAB56A65214432AD104E1E588A49DA1D26E5A31E7EF
-68625B55F1B366292993E186142FF99862DE9AE40032AB70A053B003D3C19953
-0BEF3A5F6C16F8FDEEF0F2303F004EFE8E3DD7148D0B9D2C393D4226CD841E69
-4E131E7DCB3FE6D2979ED1DAB5BD7A91F97AC79FC4FB82C125B69AA9BABCA9BF
-A04AAF364A4AD81E33626B682BEE85A84D882B9C0713FF7CFDACC4BFFB6B3BB0
-E9FC25F52747B88D33935FBAE5712461093EE2BD224FD7A85BC9704F960EF2A1
-60BAE279B5EA1076BEAC60905D07B921A8F001B9D287603B04EB7B02DBFC1E7D
-132FA456CD85FE50509DB3549013A8F88949FDA83275150A58C9A6E480D5A8C0
-DC7C88445966C9DE70CE6A910628883102C1A56B386039EEF0549B7A78120649
-5421D166460E4B21BE9415E0AE0BD368BD0B9A90DF4EB85845F26F7A32E2C37F
-570F67173339084B317A22FC9157DE2B384AD6363AE9420166D72E7313B10885
-75BA9EB86C588374434557D10D456E6FCE7F024721C4C2F8E4EF9CAAC22F06E5
-013AA1026802276A8F4E1724740943AECD35F6DE0B9B229541A3B56B08F30998
-D4C5AABC03B40DC85B1F5BA7C6F699B3E4891FF8FFF91B77EFE1241A21EDEB42
-408D18E39A3C39604BFD2C5124A79AE7546B176F22BFEC91542D2F83AD5981CB
-B02B8C521B5E93236CF74B33F1262E1A504AD22EC8F0D2942121AA8C627DE60F
-B8E290A73C446BA83A97BE7ECCAC79CC97F574DE7D15C7424F6D873B367F3C59
-754854D2F0B183A13F28C3EBEC1EF32EFF18930BC635783D011A26D4B3F1764B
-05C97B9B681EEAC6B8F3922C700279E12E630497431706790100EA191C81B146
-0B412CFBADE7A563CF37E48DB5C7758CEDEEB96E25B9C7B28E8507361ECB3D08
-FB007AC448D980295DB91A8817557E4CB0E6B614C079FB93062C95470D0A32F6
-D281F0F9C45F0FDAC9539B375C2B9C9B0B5BF6CCB2D9AB8E80E4549C0F8E5A68
-2A0A246C81C9F147F9F21D98F75EDC6A3A293DBA61A8255B3E42999E281FA099
-12062B882543AA988E743EFE5311A7AEB8C51F5E3A13C935B4FD1A371F8FAED1
-7794722BFC34883350A3FB39BEE9C5FA8C6A59D8652BA6C34DD958A9352E7170
-711CDD510350D910B2BE3A9771C191818C3E81582A8F6DE8A01ED72462EBB883
-718E75731C2CEC9BAC03AF799A664D62DE91ABCBC8BDF2B39177D18B5DC26825
-F73562547130271B8C1AACCE769778738EE03B74276984BF67298021478D71E4
-590B9AA09E0C6D2B59468022F86CE4C6ADA15C3543F48F380FB260676B6E8488
-97E9884A3F3682D3E7086E8CD1484DF32C5D3DFCF0FF06B245F44A03BEDB568D
-86893E393FCDB7DF54D0DC1F5E628DC9B6FDAC156FF3A8C7097D1F49666E4400
-FF3EF4CDB5BBDE55A39F0A67854518CABE1B1EBDAFAE5FC34D1D45FAEA59D992
-716B91F73AE51DFDB14E1032F68CF751AF805A41C99AB161EF7DB88DA4B01611
-4779DD94D5BE1D8F9554D21649F5E18A5664A5F4638F939FFDEC9D65BEEB097F
-F31C13D001DDD0F94C33D2C7BAFF8681874CEF7C44D75A691F15E3D90EE7BF19
-3C9F447B2CE43B95C05D54B0755B676228F094045C56DFD70F70F0B1A04C1807
-3784289A1FDDE55B751AC021A410FB735AF90D1793F98D7EAE87D3330C63A85E
-5DCBB8E087B11BE030023BB83AD994D6C54FDF104508235070E96271E643CA72
-25002205BDF49DE412FC2DCECF3D1364090484DDA5290CADE2BE843CE0C726FE
-C54419F2DD1307E2742B115F4FA7FD8EA222CCB89B6808763D60EAADF8529B15
-C89061F75917B22B603EDB02AC709D6E705D2F3D84C31B09D08A4C188E1C8A92
-1062A38AC7F4CC83F55B974F1F394362B8D3E8777BE3D244C53856BF373727AC
-618C224C5B7CF8D94C9674EAA106C3F30817AEBF0386D3F07D6A9296417867A5
-5B9B9CFEC845A461357685A95AD0630B2C0DC9EE8963128132B4874C861DBA02
-1E1D7BE9259713E343989E16859F5E4275DD3BFAE96F382B8F31247EEF86212F
-0D577D0221B9B8965D0C2FC396FF5F38FF95B56D071E432931CD324FB790FBFC
-C6CE521D85FF14E8815E9D4425909D6C312C7A2FE077E4B1FD5F8ADEFF72173E
-9AEBA065002EEC149758F3016625256F37AD2055AAE3FDCEA074A8DD0311328F
-5CBF4CA5D62CBF21C9A5883685B8F7265F10AF6F5D464CFD13C9B40A620FF21B
-DA5F4801C8D5357C49D5B401F51DE0923D0D96ED6DBC57C6E77569FB69FA198A
-2029DF8A5F3CFABCCE3A5FF87E5A4877D0F8887EF0F4F0FEB51091894A946A18
-84EFAC78A32C7EE6082A51BB01AEAF4FC9066367AE9B5A5B74EB4A4231F1FEAC
-B7B76BEF33551AB4893958462B0CACEBBD48CEA3174BDB86322383CE32D8EF35
-BA9E1B7F4994220250359EE3C5AE78C1492833F71701D0C6B0B4B46B8641373F
-5193B8FCCDE73F2F56333AD23422273ECB807AC49D9A79DBB88FA987F34B278D
-39AE097E8D664414FEF8C2B0EA3F7BD43D38E964AD7709BE0923BA5DE504D56E
-7F8256969F12A9149F1C9D7DB5FF20425C47D68C15F0F1F492F0FDB01C1EC138
-4F3DF82B0C1BC7A8FF3CEE5AEE3992586A2B53B425118546D9314170B3877D74
-BCDEB2790C9EB08C21FE6A3FB8D567F39429F2DD066754C18E026539EA88A94D
-D643E27E8F8E071AB6EC8A30951504B93FC59CF0E801D3F920509AC2E6823635
-9ECB917546C50906C3A2F61D6BEB4E887C6C9272FAD0AED7ABDF73EE841FBE28
-FB5DE55F4ED965252883CC567C96DE4EDB781EC82E4AF9E04ACCC2160598C2BF
-60140942123DAC1D457F947CAE5E0654D38117D261F4EC69ABA52543D215C011
-F72B148E55104DD3A872B9C01B47B02398C0848FB0FF5D4C9F557D51449CD16C
-9D7AB623BC300CF38DEE6CDF4596F5B288C577814C19403220C343B11AC0770A
-920B257185D738BB7CE4B535EA0EA8F9446D8D7A35F10ED1D98F1DB7771268F4
-4ABBC51CBB2CE7F48FEED3446467A9A04A826AB7688F8525671BB3A5DFED3954
-3BEA36C1301291EC0784D413A324237445E85FABE6565A058A89E19C25CC8359
-3623738C4292091CE48959C0ABC289CD0CA5316AF2756B31B5218091D094331D
-CC294D876D57E3D5B36D96C0F444D9270B297149FC8C607DD5AACB8CFEB91704
-3930AE21ABF7C4E3C524BF33F4F4CE4EE4BC1566342BCB5B7C937902D6C4CAF7
-62539819195853646B73E749B06C59109B4EB288FDACC61CC962CD5AAFC24B15
-FEA2E8286298F767ADC5D1CE787B26E7C25B20765DD831363F228099E4125168
-7C3E64BCAB5A40D1D17150A8BC43E66D4D03712C370DA6128784F1E15BB3816C
-F38C845066DAA046C038D54A3FCDF3939D0A39123854C93F1E635E0EF053B84B
-012B3F64398194A21A5AA2A15CA473EF99F8C67DEBE79C747E5CDEEDB6AF41B9
-511ACAF55ABA8FD1495345148A34869A0F52D647C861D22E0F03EC217227E270
-8FBDA95B4F70519FFE4371F2187A70E9323E5671299F358C02D7CAC76B0C253D
-269A43C27FC6F4132E8E8F2C0FCC103143E21A4EE3E5D3E6062FA1E0054E4E49
-3CAC42D8A9B3AF467F9AEB84E0C12AC9E0F529AC18C6EE1D02A29A0D86800884
-AEE0DAAC7890621BB42E531BC53BE80439093EE80A72CEBE746C4D0BEA66A685
-E56FD9378BB056BE0DD465A145A8148C3F5E54E5B9F11F4F9202EA28EF9396C8
-2958636AF404023AD5A9D4A19163A285CBA7D0FCFEE888268D4BF46C9DA49AE6
-DEEBFB4B4B2072CA7B0B8E62A85CE2ECF876610A161B76D43D67A73C67C70124
-6BCE8FFF02272DB067916FF0A5F157BD73BAEC3456CEA84AE21A4936B4983780
-4D7116570CFA46045B4E98E65931DCACE943C83B7BD30A60575C9D34F480A179
-CDAD619F8B084FDE54EBE09D95C0433109202CC0E32BB8AD1EC3CED55DF0E3D3
-4DB701AAFD59F6D4BC29F3A533E34E45E0613A6619BCC9300223380440FBB8B3
-3BD3FFD5C7F76407076E4A791528AFA58926DC581F5C3CB53ADA019813B1FF1C
-01C14DF03B1F77458F1D33A59889DFEE4E1C99BA0CF4B04F7B11BA530B154E64
-F5E4C2BF964C12A5ADF102B4EA55D46AECC430C1162DACA9985BDD7910F446C2
-C41DBAC7C809E2058C2CEADEF4CC7BAD936B660A6E6AB17B5F52F2346171B63A
-5D642852B7046CBCF7B2E9B8CCCDCBDAEAB267A48E3C8218CFC5129BA1404253
-1B01C19EDAE3092F99BF5864427CAEC6A3F7C00AFC4328D3732EC4CD4A051F2A
-FC6E419DAC820B082C7CEDA6F19AB2CE97BDBC45708798DD2E38BC27D4CE044B
-85323D6BD9141DE647AD8EFA76D21B899F28896E73AC9C2616F46DDA50B17387
-F5CC63F90FABD2716E5548BDC01BC6D798F7311169AC071B2326D156A66BC649
-7976BA04BF4743442CB5898BA927BDA218070A5D03E543EEFE4C93D1C9503655
-10591B89D07DE1A0A3B57F1651701C5479ECA1D8C9B7FDB02CD351AB975094F5
-D4544D0712690DEB7DDA59998E13B656B38F57816E8E4EF2CEE0D3506A1D8D3C
-28AB4918BBC3079DC7436C20600EC9ECFE4A7424BB3299ED0E9E39B977023DFB
-4E1FA6007CA8C1D86D7181E078DB2516CE3F18011E15E436940291808FF64806
-8AAEEA70E5FC56A02F87E38C7CF06FE80DF9930F63E633B67EF6093296CEAD28
-0B150EF111A6D20104AF1746CA1CD02BF2DE14546CECB44BF33E239FB7185A9C
-738414D921AAF0CAD72B2425B19A0BE3063FAE017C404DB6CD8A2335B62CA1D8
-9A742A632035DB0132EB2463C9CFD4F806FFA93EC90AFFC4F6AD2852F52F0F6F
-1FAE527B45679B55EF87934A396B331352920491B04F9FC364C0182E4C693885
-DD52CB9E6F7BBBF49066852F9850B1E071372B6B77D4912B8D0299C314E34638
-C079305798A0F654EE711F28A4917BE210CBD0614329FBA0B638E6CFDD0E10E8
-64EEE1C52F077F43ED14AE2E87FE3163C3DC62BBAFD7DCABABD75F0229858FE6
-29F198374EE6E28A4C729688D7D345D95DF513F85319F7ECC40F6477E8B73EC3
-5437C673F57AADBCC35B08A271288E1DA43287140AD1AFDBBD0F7C5A0A761178
-271F0E587F04C5A2F9D026E0B92F942FE7BB27A9605B6924545EE82090FEE9B7
-DBF60FD0870068A2082B5B22BEC698460E3D452A5F92F0CD727F75317A528635
-F883F3EA161BAD1CC81820A36978666899D28126C1BBCB4C08121E248CD1D0D5
-DDD043B58012277B03F1706E8313BBB4142A10F8F775871B340C83378431849B
-E4E8F4A18BD703409EE58DD8618F94D70A57D1D13188A16BE8A5F6383C1EBED1
-6CCDF1B01EC33E4C57ECAAD2E292120F2CB157A3C6BF62EB41B9A8299728BE8A
-E03A17183E7C2B3BAF9864C762A60C414F693450F952B48AD049527468A9A8F3
-731DB86A622A3C2E5BF3468B8A3115BBA8170FDA23A6A0F1C38DC1FE1004F7E8
-443EC7E4474E19259072E47AF8771288D76EDF91F8697595B8A8C08AA5C4BA35
-2E581250F1A3610EC9D5991EAFF6938C0EC16ECC43E4CFDBA8BA42A7BAC738A1
-B29563E2D7283D106F4AB176C617A6F1B1F9076E564F67819159F7D3AA4123D3
-B8A7E922AB52D0C63819D6A95ED6A3A63E82A6947098FEB9A2F1221F962DF9DB
-5DE56A57214E4B84FA855475BAF474EC9A53501BD5542CECCFE81A4136A78ED7
-12B834881BFAFAE2A890E598EE2E11D1CBD44B6B66DD384DB7F21F30842673F4
-50619BA185CA3925AE1D922430FA6B3EFA985E50A3371A6B8C2D7B907C63FB81
-6FE0CA8233E4620050EA197E05A42930856FE8FC0257C1FF4B6706E4F9BC770B
-987BFF7CEA0EADAEA356B750134819B4BD68FA0C36A65681686E5437E8F09282
-E89F8990B705E5A0C215CCED16CA5E663C46D5164AB439F73EE640D6DA70C155
-3F69C1BE1FFA5B6FD443F9336DE031A4C9607C706B7571FFFEEC8D8FCE91FD5A
-C999821E81425432805A253C573F614895CE3570A39753B36A357F21759F1498
-A1236B1D1790B12D471D917699C19A963B866FFFFA37EFD74E0B811AB6832346
-ADCF181D963C812F18E141681EBD36482E7D29853D91683B9ACCC3B8055EFC55
-E4DB09030C38C5520E4562932C9E9AC675CEAAF41D8868F7A4E1D38193669EC8
-62E2B2AA3E597455D3FB186205210BCCD1E9B3A3564AF82997E238669AD833A0
-D53B951CB550EC7FF5FDE4A5E7C7499A889EDD8C453D99349FC4F65130849E4E
-7D76D3C9A153B8522FCBF0E8C80F6C9BEB419E501A891D9E03A807E5D8C9EC9D
-AAAD2A86F0D360DEA694784376800E32EF4DB045B32B78988CF798EA7CBD3351
-CB60C6C775B0E7B4D8C1CBDABF6841618296A94876573E9693A39DF47564C29D
-27C0CCEAC55E0339F134B45B1403D2DD491C81BD3F1127164D6DC4DA058EB7C2
-50F8C910A005CFC6990D6C2911656677D26E557AEB420B8FD91DF224F01458C1
-0E8CD85189635A3E237F605F5C8A751AFB0E8FF920B1094166C152C9AD7F4D5E
-D3074664ADDC3E807FDDDAC2393FCF48CC76AD84ABFEF4DA6465008499EF0F52
-37B408058365334FFDC0AB15C8988D58E62E7CF50A199481832968BE04CE1301
-75BD2CF84588645A9123982C8E20189D264E1FEBEB22605B20082B37502C7F2A
-BFC371277B10FF89AD4A78405E76D1220E38F9F2FA8CBD9115C11B30BB9CA9C7
-4A996AFD108D2A3B860AA8C3E9FF6676597AD9B1F6F9AD92CDAEABBC510E7995
-6BC046674A9EEF946A294F4A1D4F0BF8CF73ECE930DEA3DF887EEEC94B5526B7
-12CF09476D5EE9D7E9F570D29D6D4CE9507F26E7EE794EB9AFEFE7E89EE1E32F
-C48959A2FCCD7AC5C5C15C81198235E3C0A216CEEF1E6EC1267B74DC19498B25
-12C869A068D9E94598923D7E63E336BFF1C40025548AC0EA3DD2BCCE0B483631
-6ED3545427FF3E9E9460789BE0D6A9E39ED20F8BEC133EF4E5F4F577FE93FE35
-0BDEF6C35B34D3A3FD2815798BC64B9508A8B86DA0F0424352E872B943B6A8B7
-C0631B9083F57EE7D0D2BA76FD3AF87CD0C0F106180EB8E1C50840EBD968ABD1
-4728D49F9A4531B890E97F8BCA0589248B8E7F60F7B2CC612EF540244E0DBBEA
-828F57E5E5BBFFE0E2AA7E46FA16A45484BA795D4862AADB29874C4EA6CA5EF6
-A61306112EB3023047F31E1C16DED2D5600A1A30F7370BC707672CA411F3347D
-734D41CC60AB436577659B9C256C56019FBE476CBA18DEFE9DBED04334E9A6CF
-AFE56EEC626AD03ED98E488E02ADB02BB677163255DF5D029636C4D077583725
-B60C7DC3F886913B8BC6738C662BE0A74AE9F94286114AEC6A82E824C468570E
-C3D2514801ABA14EF94B9470FC684774543F95701FF7C6EEC3233DA5DEBBF56D
-9349174E5D0BF48986D549FBD758B3D123E8D694FDFB95BD9B94417BD070CB8F
-71992B2BE2AE0C9A36822E4E8D85DD3B337B0A9E13DE07679346C55145F38012
-AB566C38CAD0C63D0491EFAA2CE1CD8FD4938331CAD9C7E87149B8E90E6EC1F3
-55D5DBAF807BF2482A99B02BDC8BF10EFE5309D54FA108D379393BFF8AE59C70
-0409DB0D558A48892A20FC6418F2F9F56CA50878146F222A656B0E9B1C346577
-5E2B5F79094386CF535C145B5459158D74845BECB76E02D53EF9FEE8B23BD8BA
-59969C7FAF44CB5E5D217DA9E19634DF2E2A653A50F7D4C564AA875454612BD8
-B01356EF6F620D202612E424A1B0FE9B0B740C344E96F6F9EC0199BF3B3FB4F3
-9330124AA725E21021B82B845B25707A56D25FBCC138EBF0FE757DD1DCA7D3F2
-5285256F32C2BF27FD47D283E44D8BFE63CE9E9E9DE2288E9A1BBFFFCE006201
-187335A534958F32C1999C8D75FFDDA244B5A530390897449A4AC5DC6D64F5F4
-9D32AB0A9376F819356705A799EE20D2196993BAB8A58AAEBD0CFB2D9477B162
-0BE6BC4A665B5AE6E1765CF427F0CEE173BD948D2BCEC5E63BA15DD808AC37E8
-27AFE857EE793FC34C1989560E809FD94A462B0E4A5EB5C655BF6D45BB65EA04
-67ABF18D255B6407510F1D65DE2F93F2349B218DAFABD923C937F1BC70B9DF64
-FDA4CED24854859D721D78E8A21BD565F05E8179E3BEAC804931EE7499BE55D6
-0EEE411DFB1705C1D0D7AA13FDD13235C649506E111045CABC12BD36A7409923
-CB2A2CE48FF0DB470A746348F2F8B5AD886298062D76ABC0365195E6926D123B
-414699E9BA9783B6792C284146448D785FC8ABAEF70C59740ABDF18DB7B08203
-8C9684A23C234ED1C7C6315B7F9F517A2241534B1DDFC8B7EBAC878C3FE542A7
-013DA7DE6E70927D5B47F53F90BC5A580E3AC286D1062FD4653F070A070FD397
-7F88828313821C2B1FC062E544E42F0585115A6B19F32C2EADE89E31D279E54F
-8544054CA49F7368C94A1939266C344B012EC9800955A89E832F9E59E50DAE60
-AC0364A43C400B8F62815FF6CA864E59327B89A8BFB5435B0F0F5BE4F9F544AE
-332C19DC75CC3461F388472A5764ED36FE91F8710FAB141022883091894D45ED
-294BEBB897D36694334F3E968FFC4EA6B073493C32827351FC6F323D0FF9380D
-804B12F01BE6B926690A68F1F9ED129C390BC240DA061C341F0D09D9210409C4
-3C5E9696A5BDDFD5393AC9D7AB9F82E919F808317679DB70D674F46877F83C95
-52DC2EADDDA7DF9AD79B9BCB28C2BE897C9E9378657B39046A929D23E7ED0AE3
-7925F1B184573115299AE2E11D43FDA75E4A1DFE14F80F05EC57303DA964AA35
-9462759CA36DDFF3B43F3CEDDE73BCE859484AF34F6B1EF90FCBF49D34722571
-A2CC337ADD4F4EDBA0C20B673D68A3150E378BA0DFA81F6ECB97CD9BFBCC13BA
-F89762B850DD34A51092D9E4D39D6EAF8E5B401F34F07D2CFEAB932A066F220E
-869F2D19EE55663BBA117EE3E13463FFCAB2EE730F840DDDC82C5AC69C64B203
-675F11DBC40186A2E5CD1B346DA37E8D3B3C518D9480201A9C598DEBE0035A14
-355C3D66F06C4A7ED75A72DEC787ABD39FB77D3CC27FA505F8A4865117FEFEB9
-98D774B3268803E7D586FB8F5276B405680841C7EDBD1AB4D055FBA696139B75
-D1839E542902660144559D613D162E217283E112CD4B11C13A3AD04C161B154E
-AD5E2EA101FC279B83B8F313F18FEE59B20876FB99AA1587AD45CF9E294CC653
-C0128353B6644F5D01339143F692EE2DA2C640EE0423E0E0C524407387262CA5
-728D9BF533A5DA8B4B24579476FE77B263A611DCCC6C893CDB7FA087820DE632
-A7E72EE945AE53FFB7FABF66C8D7A9E4FE5FC76FAA7B8474C6DFA527032EBD00
-11742B09CF9364FA679CFC5B7751BBEEE7CE5983C32AB245884170697841CA95
-9B781839232EFFC2C7CE51FAE5C3117B6C5A6EBFEB8CD5C17AE1F50F322325ED
-2C42751E03BF9C602FFE7651F8EAC796F22AEB025024EA9D3C6839C5D78446E9
-8286E802ED412857CA42FB01A78B15B908F7CE8BE1C419254998C35C790368BD
-8B8CC75818C190AA8B52B75F2532630CE54DF5D40C04EA7C764BA3F54657FC55
-390A118C2B74B34CDA77D2B4808F068FF11A3C3DCEBE799FA2CA3D9B7AA54E48
-2306EDDD3809DEE1CB37EBAC8AD6419A27738071492B3E89E32052CD2A3516A1
-E742FAD7E97F019C0A3E6066F6E065ED5152C0C078D314C3BE3F8DE49AEE7D71
-3A53A6D2F528499F10B2D0FEF019FD05C4F57F07C1241AE208DCCA9B74604871
-4C6C13C4CAB543F890259BE362AACDE5B69BDF373E7CFC60FB3DEBD243F2626C
-793933011C0125630471B7AAF3839AED975EA581558B53BB330021054A7784EF
-0EB98D56C807A4327FDB846E51725AF217563D6BFE0726A3FFDFA377A3635891
-F3A8FB69F1522676D6E01984ABB5C655964B00A05A499EAFED034513085755C3
-F54402B658E24D4A57913C4C4D1CA2335FE0A4F658BA773962F393FF5FEF8BF6
-8D6166014FBEDE0287BFCDD725639BFEDAECD06E57488F5BF30BCC2B3AE9E878
-F2AD3575FD043C6397A82F27D6E5A98B9BBAF8C78279D1A78809FBE9D56FE7D8
-306090DC00DA55AB9624FC4E4A279849AB4D5B7E7E125ED292B125C34FCE6C5B
-66ADC813BEBDDC1E91CBA09751DD13ED696B5629234AAA990C467DE668CF1D29
-556A24B3D5EAD78CC38A3282E46C884C802C0C0B010840CA8D454034D3E479FA
-F9B9394A89924F66E106AEBE1156337BA80303F111AACD622F9B0C79E463F1B6
-E7ADFCE41A9E7C962A96016418824569861A8B2A426AA86A3BA4AEB5CA11916D
-2F6AE0C03BFB90E5B6081BCB7348C8B74A20EF87D04A91B5EAED48B7917240F4
-EF91A3A1F77DBDB81D8D95080E4EC1DC67AE3788ADA00E8CF885A13DA34F525F
-9552BFA79FC0967C2AB66E42F9245CB380EB196C927E3279DE96FB8606FA9F13
-1DAC5442B25B461C586203D9ABE024569996131F178B1302624A4E78EF2F82BE
-E9A0B83549FE5275E85C176B7D3F44AA19A0025032BBAE7B2BD928270028C866
-3358A8B2058383FF2FF7A41B4D90F4425F40557BBC907D8C8F835412EF0DC6BC
-CE6FE967D55770C0EAC8EB190D7B8D355EAD9408050795BAEB5149114CF377E2
-9A6E11C422F51705EB921F95B548C79775525D0C4D6CB5F9101B99F4C712ED50
-ECB12BC53FE3C703B505A12C8824804ECC3F66F8BCFE740E36CACC94C7E76B50
-A8C037E81731F40AA1DEFAFE6673BAD83EED23B4D1829A6343C1FA7118CA9C31
-C08EECF55F2E5682A445561D7EF396239C25C013AB9B0E3CAC0CCA451846E611
-8D17C7ECFFAF85013BA136C056381F4CBFF31FA4A30A19FFA8BC4F29A8C4FEDB
-670E4B65C5FC2AFD7B12DB24B6B26E9A2328AE47204D35E8D981B2D90C47F768
-53AF1FE5A271FB05C3258A280676594255E53410299DF24F4574BF72FFDE081B
-A1D2DDB7E42C91C7CF3E7AF0A28630BA772057A39265A74CF07790257403623B
-755C99198D679FFC403886A1216EF0DB21BC39BA11BA1910C4599641007227FB
-07B7BED0F7B334C4409CA8E46414996E89C99A848AAAF1BD80510470BCB2E5F1
-8D2A32099AEB23EACCDB07ED46641500E3577C561F5834F90C353B03A1556DC1
-355AADAF4F16C5BABC1126699459018ABDEE8117A30F1FF0327DDE29E8F679E3
-F44188845CC71A694285A0061030DE452D5EB85B0286D1CB19077EA18FEAA2E2
-493910C0194C37E859CAC47FFCA73FEF03C42FAD09EEEC4E57647B8A1725406E
-1686835E81E7F2D621D6B2FF972904B7BC529DB1912C6B788869E3C3578A0B6B
-7A15160577F1545F50294D006AE862A89CEB65DB36E68013A3B71D99CD45EF05
-942296CCC7338ADFBE0C14E6E800DAE58873FEB18428B59298C6B6331AD79F1D
-6E4B8F925E5497E4760EBC2AA946DEF442FE076F75D96497FEC6E539D7EC13E6
-368AFCCCDC03A73C1AD82B3BF06D294EEC6908FD9C1E2F8935ABE200B3D4EB33
-A76EF754D2359192B75970B235FC6F59CF2E1B99F35FDEC3309C0978F597EED4
-75655F2533DDF000A53E02630DB8CCF0CA83D305F1CA78428B09E181CFAB40DB
-AB63E6796CBCDD7CDBCDFF14A6934BC5C02073F0A317DC0A6FB9C607B9B49FE9
-E102DCD3AEFB7ED4805E028AAB641D0E0EC6AE09D7FFF3A4F594098D03139D61
-AC6DBCCED93EA94E3142299CE717CA0D77597801CF5D01ADF5304D52750C4EE8
-66804AFE77229D54649931E1765BB9AAD54DE84E5E8A49A1CCC80E94D009EC63
-F5CB056A88A3E2D0E0C78CF31754EFA654746F33236478BF53B8A56FE0B51A19
-9D1E51E21B92C158069A59F8AE0F11ABAAF2AC3394DE03389F538958CD709639
-26086A53C600E8D4B2A1E9F65A9982D3FD0AEDEA1272126EB2FF08E06C5A14B8
-263561B5192332798EE1FAC70F4FA20E9257A186277D80E2325A8CC9C650F374
-9EE7200AA82D05D7CA5D4C6D7ED6D38462AF2EA35C1F6679B1767EBBA6F62769
-383C4C5D7A3C0924BF850BD0EC1FA16606A973BD45A0F2AF86018A4B57AB4334
-82FFCF17BFD39CA87D25E36D028E7E35B6FC3DD850184BED63C2E3843A6FB26C
-65EC1A1F562591747AC1656BE602CAAF7D24E678A5834D33B4F25EE8EA40D88A
-C87860F8F6CF38B3AC16E525C7CB7B19183FA62C6941CC8FC771A5C87BD45F2A
-BEC03A4FC754608A6CB3AD74F88327B260914E0B325C246057B013E0E8018FD9
-55FC00A741CFFF655AF36098211D7756F1BA8776EB391E73B8AE402814F8824F
-571C0255B878A0CEA097CC8732FBDF57F56A3C36A4C792D16875E88A03207B22
-49F60658A2519300C1887A8C3A64BA08603860DF48302E54261ADD2F23FDFFDC
-DC8D44DD1D24B7D0C693263AC1CB7793192C5BB7619C3FA526E3D44832676038
-B2AA7E7F80B1F190E83534DDABC07D4A8C312C25080FEE4AA75F17616616E53D
-500D0A9EE43DA70ACCB163A463BCF0255826DEF676C383C5137DA065FC1FDBE5
-AAEC7415E6C5309AD238C4B77A809BA02385B03378AD562D1C3227CD0D376CA1
-57818FA2A81DFA677865A17880B66BE988043AFC0B431B238508266BC074B742
-5C2118FEBC282096246631E897ADB907DFECD2C7569293A5EF0DEDA5B8B287E5
-53017E1CB1FF124EB57676EE5CE07467B8CCED2B63B70E303EE474596F3D8450
-C39893423406A654217C1439A7C4000946378A3504AD3F2C820DC818B48CB651
-6921E0A29A0BA2C332690BA7626451E234E4DDBD744DD801E335D9DB4EED3F87
-7C4347F874D7F15882960CEAC7039E1064E7C9A264A1C6D966260754736FFC04
-B3462E87FCB084E2FD1F53FED1E493C298926B26855280C154A17164C32F6079
-046A2CAC71FFF007E7B84DBD42DA2F4E15209CF8194383B5F0B47F47A6E95EDA
-A161F214BB90B548F2C1458F1034AE071633A9105C09DD9EA1DB23CC13611B3C
-D3B67EF45E4057C865C0A271F974D9615F0AEDE45A4AF7B1623F725A7A60EBF5
-82D0B59987C89D848F6195788ECDA22F9E39400615C8D287E75300A295431ADB
-83D0F4ED026C188E6B57C9A90E5655DA0F56A65385A46DE73E7E1F7482BFDD88
-4F4570C318026366791AAED812B4BE31F3D130C46E45A699C843E09C24945C8F
-806F3DBF476D3DC8D7261570C54EB79905AC4F4524C9B3100BC5470160BB0587
-BB04E4C7090B090B769E654DE50D771EE270825F28CA00D86B6814DE04D02304
-9742A33ACAD2D718843F882D06755E0FC71B5B92A1AAE92E1167F867E895BCCF
-A5BA73AA8CFB9BE0BD2E4A16523198B21B664B1D41E4BC0E18BD709923EEAC97
-501C90138C493F8E1E229481B00A2A1E4940A8002A2401DBDA64C86B61C760EF
-DEA4C7A8EF665E03D0FB63939DB9B6D8FC78B20D882FBEC7A9EEFA6A91E0322E
-387252FF8770C9A2F5E2A3818EF6CCCCDCC5F5F21B855F489898A13080983705
-977416594B8B0428FEF03A554CF07FB3B59E5F3E027AD38799533C5960C826E9
-95C6F25B15B802D96D975D8621AD10E0DE65C3B8F09CCFD12CEC98F71EAD2E69
-2AB13A9F2183C9B035704EDCC8930860B48DBB68B8E3111E26A8FF216E80D082
-F6CF064967B1233D711C076D2F3680D9586A87694ED8FCD0BEE0A8C338A11728
-D658C224D94045D9528BD888275E17B50F9A72005130EE5149B8FE243B2F428E
-81F8F5602D3E3EB89395E590A1253A9C28D4140DB9769A5F986325A29BCFBACC
-9ADFBAC34FFA3DDB5859B9DE3311790882EE64EDD02B79E15406D945E6B454CC
-9E658F0ACFF0D13B58C75E395E0BEBFF5317C0610DDF07D18900919DF6F7AF17
-7FBC6BDD3488C1E140DA40049190E4F718AAEB9B1990F1F8FEB61FF5EDDF3055
-4A747292CBDE3C33372450568D371D342F8371E7F9DA016B5039810D053F7871
-A211EAC5AE13E808F44711906806FF0284FA51F97934B41B4E320DB211E33E32
-64321927CBB5E97A82274EBDA4D88FB255791A70A0A2E651F141D3CD1DAE553C
-94AEC8B6B2F4E337A7074B7E40BAFD0EB0202C9F77EAA4183208D539A15B94E8
-127C767800748416332A9FDFE6DEC86EE0273FEC43152C064B7C6C24A0389ACE
-95DC88E06E1ED02B277A4CB3500B6822E969E36F0F0709ECB4A53949965FE907
-6B9E95142869B12750FE639B9B5AEC8C28F70722049617EF0BAA248D559AD505
-29C89B1B14E68E3E47427A636090A417A74B2FD20C209ECCC88C1F93E75568BF
-D1D32921C4BF2B1B999C86E331DDF26BE549161C272235EF9A62E2F04BDEE6DA
-123C84DAA783A4A9A179C344DE77CEBDE3291006D04DAFBAACE06FC66FED9259
-AC036F7554276923F8CA84952B8524F73786497344A8210D72777A3F0F402461
-DAA6FF1C3918B8690C409A718C3DDC9326D14D27FA35C25CC13FE4955AE7F19E
-FA40A395917DC43A1BA33B7A21DB8971D5258BB07B14E587C3B8C0BF6D186719
-BA375629266754D560240F4C642A20DD6540283828B260F7BB04057D9773887F
-30E3D0DC8F26CAE5BC74CF2599C55C7D53A866C9E56450A0C9E8F295C3956F04
-62944690147B5098D87C3315972ED1972EB3681E2141CA1AE9D54F1E37EC8EAF
-3B7B27D54223C95CBCF3F200694343771860B4C59B2F74BD3EF3C20A3361824B
-C178234D9B87F2831726735E054C48B57705C254DE978FD66B8FED99C179E3A6
-CFD55E11231275614024B0CA241EA4618430F62E93D5702AC09472BF682EB92B
-F83B7B99EBD3736CD543F7C02E7F42AC083B75F5C28B4D0AF596BDC1BC90D7D2
-58DF44752BD362E7896C8A9C0320F226DFE7400946754A5F518596BF0CB2A307
-00C276C5A4A7DEDAC773F40FED1463FD62CC21CFF7CB7A850DDA434473866023
-0146E94958A21EF632671B71FE474F1915DBEBA6F6521A2A18382144E3B4CD87
-AC655DACF75CCC795C24241C851A05FB942FD8FD05E434EDDA3EF804B1363BE9
-504F346D6E23AF4193A93930B1E605FE73A96BF9C6778BDD25980D671C75FEA4
-700186F9F1F54814C73B69D66FB36B4DDCE39F3E5908B9E73E385EB116C21BCB
-2322A225EC338C82C422ADEA0F8605A8F382D115B1243B0A2CA19EFB2ADE474B
-6641F564C6003FE42639E7D862F8F3B691F566D454BB781B45EFC163969493D8
-857468480DA8967235BB2DF1E4B1070DFE9FEEF51F3BFD6B6909E0B19DB09F09
-921E9ADF59D3C3ED0B3383A3CF17A4633738A781B55E43C650A79CA2B2297867
-EC4A4C7012615840E816AFE169DE32DCD6C91159E97C0CD550DEFE597596CCC1
-9DC7CA2907DF60E74B7076ECD61345A90993D198B4442B42103C6A0F7BFF05A7
-D927C4452D15A983CFC306A3FB4D19A5A54D581409183CF749F58F64749AA350
-20BD27B2A702F72A98D584DF32984302EB1804B4EB5CD2BAFBB482E3DF8129E4
-8F4F44C221A1F2C862CAB51EA2DABF24AF42D64DB8829E30076385677719564E
-B5658DB1086E0052BC1FC562F7F9894B46734DA15B142E7165F3519B36D4FBE9
-4220A60BE1E30FBFFB67FD2DE4286276CC9A341E21558A3BD8B729B667784C8D
-97981ED0612FE2DB733F7E46CBADDCC6A3BA7AA53C6CB34B021FC4545C1EB139
-58EDBD8D2E98A9CBFA4B72F52F1C1B72AF8A99BF78CB6E2F19F5458CD4A538DF
-17C18A80F62BBCDCD5B789A7DF3544F9C6DA2C22C580C41EEF179A9E9514BBE7
-4F15B7687C5ACEEBCF6D2229238EAAE66AC13027D20DEE7FB7652731200B1E21
-B2D72B3053C47132594A48501C9BFC7DB924B4810299B3581C1DAFF03B0658D5
-BDBC8E7F6C15B26FC872BBE0595D1A0E764C632B766C33D33F5A423AE987ACF7
-974B18F39F85F7A063D99B451B7DDA3C24B0FE4E7FE6FCED2A231B27EC109962
-EB7439AB63D48FD4813CCAE4D3F53B0C3471ACB52A5DB323FF4E1EE8373FABF2
-6D844FC2DD98598B9647BB4DBE12454CE24FE162C3B4583D593E67EEE093EFA3
-B8EA96E3D20B182F8C836B676B1CF4CDA0B5C283E2E2A7992453B9C09684C5D0
-9FF000F41DE580FD799E7663F918E7BCE5CEC8CE05473B660B343C5564BCB7E5
-9F4DA3B7991EC910F0DDE4002D54D459AB33770ECB111C25B0D327194D3DA61C
-2CA2BDCC78DDA1F3A51F3D7EFF922D3C9A7D5E88D3F718D4224A0A34A4B91A12
-EC7AFA2472E8977F1C299380AF7D02E2423D880CAE31A610E0158C318DFF3802
-9BAEA372D8168F5D631B7CCA290C93314D3B96CA1EAAEB29D308499CB4AFDCDC
-49429DA85225B0429998746B2B2D4A4D45BAA8575416631386AA7B620FB272F4
-69ACE1610BB6F651B154ADEF7F8EA3C51BC62A081F547181A3A18703D01E020A
-5DC4C1C934D2AC4A0B67F545B521D9B40F3255E5E9DE9322FA51652337A405E4
-5F0CF9FFD3FDD10AE339AA2D91BB9D3637E72738620E8CB14CD87363AA04D4FB
-79B0127EC187E8767D3C06404CCDABF583404809EEBE86DD8365E5A61BFEB1AE
-492423B4E5F9CA962357444AFB75AC7AD2F387107AD76171F194606042072B9F
-18B341BA7D01A6EDB28297DACDEA900F301D95D33A89248EF42C3264F8A1B47A
-5CFA54118803E5B57CE7C0068C6732B60A741E20C981BD7C4BB1717F5774AC58
-92CB5C82DE1D1DF4A9E4B945D7ECF90E9086BBC455244C51E7F6A9AB801CDD0E
-7E5BC63515FEAFA4238F4765AC04F3E09F1279FF3943D77A06C0EA2E52EE75FA
-834963A8FD2929735CBA89073CF651DFAF18FA8D91BC1022FF345C3E6705899D
-13A63FFE22DBF6AF2150887E12D9C7C55FE026F763D3D15D6F5DDE550E21ACD7
-91E9F7937D3F2FFC2438EAD533076BC5003E4CF3CC4A98777B0615A2D20CB825
-93C60EB16B5BBB653C91B8DA49BA774C81C3AE8F12D5E84D49C431055B9442FC
-27BAF5F30D341BB3329CFBCCB09CF1A2FBAE92525E9D3CF5E099C0A72E1629F8
-D08CDF8A6B50CBD76FF67250631D13EBE30787D2B912AAC23C6973439C1980A4
-676D23FC0E90644BD0FB6176322D94EC8B2C32DD0A12065019F0E8926A14B7AE
-C9D8905D9B79EF23446388D9005CBF63EE7A197BC4C5FD2E3470DA7D46DC2977
-B4C6FE57865E1C0448F393E0AE7D44FE616F129D7A0EB9ED1B78773EE54032ED
-1DD3672B6923D188014A61F67ECE29D913F6CE37D014AD2FB1CF07CB8AB70530
-FC5D413407B6E01A3DDE44613B8A7AF8FBA104D0E03DDEE4684F73E97118F4CC
-F74A503462C96F866366C2950BE3F19CE061EC7834C0E732FBE592DB5AC2E088
-683CEBB978E109F198E2D39FD2E690C390DF290F7709DEB6EE64F8B88D3993DF
-03452F2C314C04807A63AB766F940667FA3B6BBF887EECB96B3E29424B3DA03E
-80E7045A2578BD70F50E0F20BB6C3341560A2C9D5241936269C36A9C1D71500B
-9C048AB6B9A5E0B50E4D3E0F63B4369B7A0AF6E1DF6C8CF5CA4111DBFFC325C9
-41F28237A7F731F99D5CC15F3AA14E5B4B4E6F7C617AF408275091BE72E98AF6
-456F9A83F05B21CA0429EAA3BA48CC5CD29A087D96B1279B9EF5551794BA809D
-6927420E8DBC16CAB46450F1C0D5C8C8B3041C22390F9F6390067EACFC174AF3
-C9782CBEE35675872C4C68D3FBF78C8ADFC284E82C52C64477D228181C8697C9
-5E98D430816AB96DB01299654FB097DC281F0A60D9F03F84C973A6AB85EA5889
-AF3E8C64327D25D06B766F88973D5C75449D258D8F7A8F1976867644EC49D2B2
-AD765695B57D3EF8B8ACF005EC4A6083E30406C4887134314AF75BC66239B2C6
-44D663071AA7858CEA822B1F1DF09F4099D3B0F7A40809E08C0417BC05AC45BA
-30776357774331D19C0937E7DA9B93E490CD9E58D68B227579A840563DD0B5FC
-A6FF6D2B9DDE5A86AFB467395A2DE7F0F17494907B5658E29B518078C19D6E49
-E9FA0BDBCD3CE2579F20608BB5E9F6FBD30BA9A9A7BBEB411F348F69680DE209
-2D450CAD4AA515EF0744A9AF866BF129E92C57D523DC7FDECB9495F3CB72DA82
-5C3C50BBFA161BF93955972BDE0B44AD8483B519388A72717F6CF2D96F806F5A
-204141542454453EA24A95A4B7BB7EC8530CFA497732F57CBC4F6A778EC05F81
-4D479F48F6CEE8E893DDF75B3C6429D1F593659E55267744E046627EF474337A
-996F2FD56F2109879BD8A98B4C7EAE060F1770DABFA0973030CCCF297AA2B3A7
-5AE3C82E164304E43212390C4BBDE2606B124AEF5BF5DC9405F39F76C7448574
-589A6074EBC89C5FDE3542D723ADE4ACAF83C617D73BDC4CF4670E414A0F7C17
-7C0EDE2CCB0D5A10F0EED3CDF41CB790BB8EA61CF1AD9FF3EB39CEFA61CB13DB
-378DD50F477C9A5FF24448A750699CC73739254AAE0E26886195B1CD7501DE9D
-B60CAD2D5539BEABA6FA7BDFEB572CA0FB6A8FE46C6C219834BC23B3E4DE6BD0
-522028E9B7EBC83FF1E17E28A3C9C1BE0227536B3E917E6C2523121B7A6D32E6
-A007CCAFEEBE1633D1B8ED9C0F2C9D6E23141E75707FBA37897E4C0CAD0E1BEA
-603DBCDD7747690BEFF6314A18186703C62FE2903C7D782C677AAFA105ADD4CE
-C91EB6BCF2D327A3A6406C626A07A18473043F3E1B8038F873048F25B228187D
-7226BBA7763E9DC0B43895C088EDA7A6A1E367D905E477F41ED43EF267B86CDA
-481C8FBB1BAC6E6E0AA4FD2E979BEB703BC7366ABEDC18F71942D87928155C75
-1C8B4EC74C2CD9ECB7B19D9864271F8A4AA5F57D5B684471F273095A07892C91
-C946F615723E17E8025FBBFBAF16687DF65BDE23B92BA8FEDC894427C91AC4E2
-A3605B5D49E1C13AE8CC26902E92378104577A188B45EBF878875FF1B574F34B
-9C2BA7781078F7A9CA7228E781D70A9FEFBAE5AE8319AACDA99A2E368706A2F8
-D068FBEF3A103ED7D71223DDA428F36A07DE9A9B6C26F3728296CFC3272A8E1E
-7B372F5D9CA4FB010ADB189075DDEFB7488F481E6BF8490DA0C23DA26E2F582B
-1E0433F5F019AEB91C663C7B4BA4FBDCD53CE9FEB02D5261CD78A1C17C30FE54
-EA8455AAC1204908C191698FF7E1CD58B6C766A6DD9E68AFCB0D2EEE7FA1338D
-E0D8072E2838DC80FF6A028581CAB8E03A59B1BC7280EF55B97DD4365A28905A
-5D0D198E6930333FA1013A152F5DBCD8A36DA7B52CC1BF296D768CDC7079588F
-407DB466E7B70BFFBF82FC6751B65347A9523823E992354233DB98E838EC8933
-45C0C3181EA91C8CEFF04937B63D0DFE2B46A421820BA8CA5F5499D481868E51
-CDC4596D648F23F5AD603154996304A2C27EA1CA6E415C2F15BDFC6B01D2FDAB
-638DAE9355FDF19780A42ED36A33E9D6A216D455253BC4EA831C1419F5DF7159
-9772F00CF17AC084B10C4F11860E31702C911EE925B93D994F67E2926B73213D
-68AB7A0B7B42E150F3CA1E30BA0ACDF4DC74931E6009334B33035201C698F185
-57B132858F43B7A1DA50415E3D883342665118C3CB952B74BFC7BCE4E613A0C2
-E73A167648E282D8235FD84203EDFEB2A8899B4C9818D91483715F894657C032
-A5CBEEBBFC10B7C5AA59F8883FF4E799E0C4728E568F46CEBB4AB0929DA6D001
-A8FA70332C827535F8F05CBDDCCEE7178C007E60CA1AC783741307D5CD9C3199
-E673C480D0BEAE9DA98ECCEF3BC798AE5286FBCD3B9C0D4BCED845E41BE0AEF1
-763D293C78622EE9818DA386CB77A060B5296E06A44661F1B2289B7857C73425
-C28CA50441AEC8DE567D8504355E34ACBFECAD86A95E82F0D5A09C402EFDB239
-2A499DB371B08634CC07C592CF407738A667DF57D8417C4CFA790619309C5179
-82160A93C4841844CEEB8030B65CE23CFFDBBC0E9A48272A53A9DEB47C991A44
-5600168B35F73748C7EBB2460CB56FD313054E15F564254B074C68489BE6EC8A
-A4C16F287CADFEC52FB61BDAD3E1AC87518DE6CDD7921A166B800C03E8F1243A
-2B094B68EBE2691D726CAA51E554F96B8ADE6D019C24DD75C7A4F038686C45A7
-2268359BC73D4F0154DED87B863937AFC3EDE0C56507256C0230C43213650D07
-93BADABD4A9C066EB2B3D9BD43FA8169D87791C3A9287DAD03CDE950FBB3676F
-D3605535B5D7C9BD0118308F5A94C4EB29E842D1FBE49670FD7AF78DC31610E2
-4EF86FF61693FAF103AA56DA7A920A25B394A461423EEE8231A1DD3FC34F927E
-26A717BE37CAAD64E883E2E22C1718C1E9A4E69C977DB13411D427AA96569E9B
-D7522FF889462400293E2FA2F4100340578D19519CD9ABF77EF8CAC1571FE000
-1080AA77E574DD6BACFEAC54A1FEE5CF9B6F7E1E7429C4E3B20C4F492D8B3B91
-9FFC3B6FAA8AC36FC882AD4BF6171C5147177DA06295A82E24C3AFB404C200E8
-6103733C515894B0FB2AEC498FFEB5A20A8E020D29A807CBB9C3F7FE0CBC7175
-89BBA2230D6013A3C42588DC018714BF4FAADADFA6E31397FBFBA428F91F79C6
-9A757C636CDFD43E3F6214CD4FC2B56F10C542D7C53FE0268D8D30AC95A2AE51
-3A6401231B8D18A9C57571086CD8F58FF109E7AE7BEDAF804A6263A439D4BE3F
-94CFAFB9848B4903970B58DD4DE26F629AD2E2A2183CB3054ECC4B9962A89661
-64F15BD83E84AE8AD4958115B00E557FFB569EB78EFE95042FC0D73CF577C624
-ECE57E45F135BC904D5C6722D791040A426C9766C4607CD5CA7AE54298ED38FE
-60ACA2735BDD35A88F5B394990BF320D533CBFEEEF0FC0077300E6FB3D808EEA
-BE8C4416E964A5D673093480166B503E7C86431DE792F71B0025541659E26667
-BF303598A53CA0400DA9FF896D6114F5293FB6AE8A1481EF79C044AFFD1C3DE4
-8A06216AEE80BD03D1C579767C296C49A9B4434C3317A19268E3FB8162198D56
-3611EC062C551FFC5E17A76DD094B1BF2DC29FB49E08537224389B666D105539
-091F8CAE03B5C33AFCC39F0ED3E0B154005BB452E76C73BFC3C79DD85E11A59C
-95289C023A19DB7F061AB2A39BA47E1A9E81547C73796CB226BB8A55AD2268E4
-5564A217DD47C2E21AB9D1D816E47A9D195022251B0D82989D0F4DC19CD954DF
-B1B5BDEC1D7DFF81988967A834D6236549F4D4F484A7E173B2400CBD6E5839D8
-B5C5EF5DBFA5717F8A8FD61B0319067B908795C08BE68961161D7B898A80D9AE
-9434D738EC57737E9B2DE0A7CD1289629D94F21F872442EF3D0267A4424C1398
-309295B259BCC8F2C37A1894F347478DB2A7D4A4505942CC5F7ECF884C5D885D
-ACE1EA5883050D0FB58AD394F96AA583074ED9BE783D6B7C1B12A02DB2CCCFC4
-EEFA4E50C8FA241CF4BB972C19900F5B0FA8E6CE6F2C2B1495C996D5B8D1C4EC
-26100C8E5A4338685050DD2D2A8E5395BCAD3D9064805E85AEC31A8B90EE0978
-680998678A2D5522316D7D1F5B2EE30353CB249E7DF0646D07E0202DD1B7BD9A
-66B151FA113C809DF13EB798BFF29818C2CE867E32EF3FEB32BE7299DC51157F
-CD9F9059E4CA3A87DADFAB36F4881BD781EC929E9A728C9FD2FE76B839E84F35
-4B4353C08F1A95BEDA491F4379235C4DDBCBD70CBB2BC34B563129F506293EBE
-C5C516EF82B087695FA0F1DC412C3BEC7142E5D19368D904F8D2EAEF62FD0570
-DA36CA4EA8B866F9B017E7012F4A8AF1A13FEE0F9C568A7D6A92AC54679E9451
-D7BBDA3C9EB65A15BE4EF37F7C60569DA22F0BB241D7CBC4BCE3544C6C78AC67
-49226B987356C108626B7F07169F2B2CB49AF675AEA691D04496E36875C1D8E9
-C4E792D5F617835201531BD533CEF81C26D754A63460AD3927989ADB385BDBEC
-347219074B8E68FAF8D5EE8A26635251C6A59D1122C7FFC71C2D459AF4616E82
-23C0FB4FE06DD91ADCB2C8C1CBE7B2E7AA01414F38E93651A889D4379CD4BE45
-F709055A8BC91BEB8345A56ACCA76149A699E21AFA6F6D423A4A715D77DA669C
-51884704E172744920533D18E877EB348010C909946A2507E22A3CA3E3041EA4
-60294E8F205528062DDFC3562733BBF0922A87CD2D5F421FF9FC94AA2D380A8A
-BDF33CB17415CA97A74009E70B0A7DE15BF1C714C8D63B72EDCB0E8AE1C6986B
-208C9AA1D0B6E9453DB51E4054B0E4E4A544F713BCAF55B90FA84E5DDCE1F132
-3FC5DEE7BA419E006677D2ABC0E012385A049C3B9C51841FECEA0ECB262A0CA7
-CEE05A69BD5BBAA0F8EA06D878AC3B81829D3891A456BFE19B0D9B06B5D715FD
-1C0BCC3D304FE9F1C830DE89F6D526BDEE9E886621C13BEE2ED59169270F686D
-01A7440CB9165022FF6AFC8EC4FA7C17741FDB6D2FBDE95873DA69A4F8252B8F
-7978F7314A143F8C0414F532B504F6A6A42ECE5C0F09B9B3FFCCF68EE81CABD8
-0DE789A64AE3F3F7E3293411B15D1BBE264355F096FF90250D0D2D43C3016FFB
-2A59F70FFE9636208054ADC08C8D02F9DC2AE567FF26A95D67923343C169CEAF
-F14E4CC9FAF053DA5155520CFDEE63169924357A5C3158FC3D43A7A42E4C5E2C
-9A641E6E25FB2115C40A03472C5B06AC4D65A1854985F782B387EDC26ABCAF2C
-9837E7D331E57EACD575B3349D17706C398A79BC015A0B01A1977459B86ABC6D
-BE555CC7776C0C7DE01A158608A0AE3A3E9289A5D8F2CBA9D6C63EFBA892695E
-B7534C0453EC26B7743143F2F1002AD757C177F5D7F16436DFF4ED6AD12CECB9
-D9271BDE6ECA276C3B2AC065029563932B5D7E33CB1B71B996C947546900987C
-0E4490EDDD6EE78B6DF8D723C19771D36656F3ECCA752ADBD68951ED0E79D35E
-D38852D8AB1496E0960D14C1C8A687D31913589A491EAEA3D18696AEC361D483
-4FFEBCA1FB33A8C600EBC456137A7687F4DF40EDFB9A3B080466C4A470457538
-3823E06B9E6DFB287FA7BD7042203D0A6ECB0E47EDEBF97016D831E0569BB60B
-F2DFB207C631EA5AB58FEE4D5BDCBBC4B41CF0BB1F4ECA465242E509D145538D
-949C0233F71C27407E75B11891045C9F7801A973EA41AFD742DDEAAEB504ED4F
-64D6E0B7FB9263BC65823D51D593EC42CFCBC682CA4770C0CED5B238063DA5D2
-716A9205CC862023BAB6937D2A18FF5D618116B45623E06172EC30280C21388E
-4D53D077D5EEB77F2B300C57FC3ABAC1E89AD317B46F1883F5F83E7A8AB1891E
-8110ABC7FEEBA203BC9F2EE2982D77BEB0F23904EE340D6D6F72B1BBDC76FB3A
-8E69F3C5C04F29E2AD924C390DEEC073AFDF3784DC26B85B7F0528E3B61339DD
-1E341DF261CE097C3BB1769FA4C6E728D678ED7B928FB44E6BED81890CF233AD
-DF4A72B95F85BD95C5645D8A049E89D0F94AE88ABBC66F5ED01EE9141448C37B
-D47FF55ECF86E13B47EF1AB27C5CA26F7C2DA5841D47B3E602CDB2125DC345E5
-74A8E293DBF4032168983A6B439B189FCDFA5FCBA97E166C65FF0641E0B1A7D0
-9AF28005F1CAE32F1D95A27BCFF98C139911199AB6CAEAB49728AF2B0A0DB6D3
-7419EAD54E2EC55808C6C176EEC97477FD65C11BF88BFC0CC39BA742BF841FEF
-AB317723C3F95445BCCD5A3ECF82C78C262B200894C983AF871912E47342C0F3
-13AE004F1E05CD83125AA4AA5161B1DB9D3F1A960E682EF93123EF53145A9C24
-EBDBD744307F6AE52FF1D6D43C3F667360FF48673C59D04F12C3AD8FD361C4FC
-8F2A902193D4EEA3E9DDFAB0D323E2E49CA4B4FB691F9635AF026CE1DC94506C
-49D68F5899BFCD1B947C77A77B1598CAEDBB7AF0F13221B59604E91140959F92
-8C49E5AEAE03C019BF6D2FC50B5BEE2BACD955319BC969EE0FA1752BFBDB1380
-042B1C0FD79AC43B5452A1BA2281982E73F681FA76AF1C9C4F4FC38EBBEFD865
-4648D27D218C40BD2C1629E1DD79263FB7FC2005BB3D06C9EBFFB22F67F356C3
-D20EAE1DE1D11ED1DB1D0E6F2F20FE98A28EB737B6F5B3307620A0199A076B49
-05F16F4D4A9C39E1B806BA6ED58B24657C2427AA6C987619D213AEB93B3754F2
-E247612FDADA5F5AFEC1512AC93181F8DCF831DD78271F12D28B0250440AF081
-5C141B11585D8929ACE6C79BC97C804325EC5931EE393A7B964B14B376694460
-9C0858E833FD66D0DE9B7D6BA33AB8FEEC15C99E3E5D329676F0EC2FE5E539B6
-4957002C77505CEE1027AF7F1BA529B45942058EBF4EA22F1F7FE3C5DD93AA1D
-9F3A228EC45643CC629AF5EDF9A4A33EBDB7CDC0ACFF4A4326ED51BA05C88118
-ABC356B35D4DFCA057D8BB3D8ED04DA0CA49210F352E589748E63F2B3CDF7281
-6C3E8F46B9C2DF790FEAC41637366274C88DC4C6297F1501436602AC7CF94F17
-17812F8230CBF820885C3BD086289B845ED8F6B8B75015744DAE3981E8A1C691
-93B1D66ED2E41EFD86C74E12276CDE05A3A929E529F7781F1E49550B44A26FBE
-DE59A39FCF8CBA8F05862882D6AC13EB83C20D6115D4BF9509F8A506E5ADDAB1
-ECE74497A17AA12D1CFE36672C2D1A4F2DC52DE56E8AE6CD1E72B8A4F850D3B4
-1551EDEDA4FBA36379A26C3B3928AA8AC63B5FF9D24A893EF019E6FF0735FC60
-7E95D2F29AE0ED922BA57F85CABE2AA44498C160656779860006AFBC4BD6685E
-ADF006A4936E52637ABCBFDA6C8ADEBE083845A20B9978A2592F98A8E92F2541
-A84F2AD2DC12A81C071C0864A1510CC6BA44226B03E4DEFB70112B4EA34ACEF0
-0FAE9A6A783FD2911ABF67B974FBAAD4CAAB514DDC66C696C003E728262EF4C4
-4AF9AB3E23EC019EB66269B65CA53271B20CB71962FBBF8967293C1A81369021
-E89CBCFE25C124BD7A8A1F7C84DB681A545692C17C5A4C3D036B7E61C7C8976D
-A3071BA77FF9F7C9181AC0B09D02DA041981A7FED34879CD2AA43695CF8BF01C
-A92100BDF60720C5633E3047655240DFE1E96A85C1F021FC237F51318A9E82A4
-563725D2267D7ACD7C78B228D5A6114D77F9F055B885A279F7198F0993332786
-A3A6459FD9BFFDEDE996C0BEA951C2BFB14F7753C3599F630B00B6A44C46B2D6
-94E02C6E3CEAF82C3F730DA6486A47C2EC4722963ED34D3E982DB93A891A0789
-5CD8EE15405EC998AC29D6374356F8E4D8125EDD844183FE31A2E00102E276A3
-7F138310B428AD8D3BE683B8525524F14E6ED10AFF68127B617167F1CA432732
-081B87D78B6667E92BB1F5794C6A66DD830154311C59A43BF96100AA8A84BBB5
-7F201F4F25DD15E87F6A9BD20A34402E5757ABA204236C00541C68A52B8C6666
-FC3860679EB3C085B647796B424B598E97F6EDD31E1C1FDB740FD735A614B4F2
-93EC1CA3ABB24E4A2FA853AE8688E535FCC99160F55E28D542B2C48644ABF948
-168DA7AFFA42839CC7EBEC5068A78AD0468A6697D0848A6604CD020BD92F5362
-DFA41E55C003B702655FFA0315EEB6D622DEEA18126267998875C2F2CB9D6A0E
-4AAACF51EA44074ED7D625572DDCCC20982B43B7BF9488A5CE852CEAD090719B
-8C6A97257123E8EAAF13A06DFA4BC20801079D7636DF8B8D5F5B3C75968C441A
-F17903004DE8DBD08022CCA7C0CE9E0D784D7F571D4BC3DCE4AD4B4487CD7ED6
-7E4DD4516FEFEE7FF9D7190CFE093423D9FAB6D03D8C7607B9C8491AFFF1333C
-C4A5CA33C669A889D0C0F174E9AC7B2B81CA532D70F86D820A8E0BE35B21F16D
-C1099AB373DC1EEB63CABB00949B38DECC52B236AC8FF44E0F35858ACD325E14
-4A21CEB8281D10BF798F2B3E460E89E54A8B255A50623743E7C0797644C92832
-60F30A5B104827DDBCF075872DC910E480A48D73118D4541B19AC92B1086E48E
-CBDAA0C4BB3600E546D538145C6C449658ED66B292CB2B10431B5517DADC3269
-0652E4287731B70785C23D0A5A7BF2FCECD6481CA92758B74487C3D50FC8FF29
-FB973E1E518130D2662DDCDD6199422FF55521E0715AFD06C43AF2A99999A5F8
-B6EE78F74BFB8F845CA9FE3A03A50218495724850CC8A66C92A3C4827679B4E0
-02B86A7FCF82248A7ED56D5034A349F920FB25112CA8A84E7EBDE228DB05D009
-76B948FE201D9F56E64CF491A7DCE17ECD0EDFFA25E1EBA6A5B5F8B9D811F559
-9A341D65B51A32B2230FB689F0DB5E70967A2F333194FAC528AF2CBE72C31A47
-0902B69CEDB8BAA7BB1381A4D31EE1198324324E2373263CFBF2D56F7841E493
-90DEDC910506EA457385BD968786C753ACB24820E00D74F35BD07195E2959044
-0BB0B53AB9B29D14D0EC5A35ADB896440506D070D0341A5127241D914BD0F82B
-A8BE9416B728BA2BE4E0214A4CA7D354E229AA83BC5BBC744C811A5FE4994EED
-46C0103C40ACD7C5772F22EE718159A80C6ADE365F84E1327A5E8725D8618176
-7F331D3D3EF56CCE69F36DA9E620197E52CA7B818D4BADF758380F5B10764C7E
-C3B3ED839AB620B9555A2EA838CF5D2E9F014B9A3C96BB0EA054081EB07F604A
-E2B1A9758C336FD7EC9C7C2A1640725485C5C7B353D58FE00259EE1C709E07CF
-FD54165C87CFBACA6E3101C23601BF20C689BDDDB94BD6DEBA876E981CE95C45
-6543A8BCD8BCF2549C97401442E3ADAC213C1885CCDEBE8AAF47A58FEB1B15FF
-F2208DE4F031C8415E83CF7A6611464B491EDE2E9AC7D9AA84441F9A6532F44E
-3D142F77EBB3E8033F23C93923F0CE6848F5AFCA7AF0EEF8B8DE8FCE52CA1C92
-1BEDCD239C712A1E6CECD22EEF42A99B6640D59C848F9C630F52EB49CC6E881A
-0C2104A3ED2DB85AA79874C5072389A73878C01D45AF07B73ECD178FBFDA6EDD
-7380E9FD555E929D92876138934B8434B0774E378C1DFC1AA1E65EE9A4C69ECF
-0BA16C2B96CCC0F22C8CB492965A8F6AF7322E4142D8A40A9A3B291685B0BA10
-0EAC0E2A92B955B7A115FD3F75B0F081ECBBFC40B4E81B76BDD5F7CD3255E4B3
-2EC25E35718527CE70470C47D4D160871C8F7415F80EC718338E41FACFA607E3
-C29F11193EFDC1C96D24D9ECCDBDBC5A0541FF5ED2915623346D61A71BB2DDE4
-A273CE9CD37FBAF6903058C7FBA3CF4507DD723C983BFA5C2CE4651E2B3ADA8C
-28D1525C8A184140BA42C0B1878C5883581826D7F0C02E6753526FC538C0CE33
-CEFA24C86414F785D2F31A5BA161E696782396E117E6B3D21DF1EDCFF6930A8E
-4D8AB720D67F93D6F0FAA25894208574DF575EC31451CE3D196319119BD46767
-9E7B1C7E26CCDDB510E19A057209D1F8DDA77F830752735CA95B8B46EE230338
-F37D528BD533640FC7AA6F4CBCDD5F0154EED7625D9BC57ACAA90481BF18ACA4
-4CC17B1FA53AB188F6D4EBE0E89671BF9926B8B87A6EE17F782E1AA5289E1A12
-F791CF64CFA9BD842771237FCF330478A6AFE0D6BF9A80CE2CE48784D0F1FE7F
-E36517A0AF2778ADB4913DCBA5CCEA8F423CD59CFBEC56BEDDA8B3E03E048CD7
-4D670F5BEA7A44D309CAF775DF677EF3E6B5131E3F28CEE8F506990446D077C7
-8293B4F57F7FB2D175EE6A12A0E050802017311C15CABA6C5CC5D56F77F93CCB
-A25DE6C9DA9C304B98100B26C5BB88542CEC07C1C1AAC21501D933E2B2F74E8B
-5153D70756AFD54C0D1CEB3E70CB40270FB03CEA23CA0AB46BD904919A931769
-FDC333FA2B2D55CDD99148CD555C959BB511732A90DB1B986A3EC1F3251925CC
-985228C6BABCBEF2C59A590F22E1D1DF16D6654B35FAA7A1BD7ACC0EBB529437
-408628F19838384635676825548558554D6CF471178B8C0CAF16CC278F58AD3E
-1524989C16B63834A76133746B1A306E2F89C52A4209999F0E63DD7C85058894
-98C18F65DE1E03297C51BB581EAD46557BDE7155DAEB76F74E3F00A32271F5E2
-E7E909D1826303032047F61130FAF8BAEFC77D524C6D1F8F2DB87D1D36F1FAFF
-5030AF4E0BDFE670712B3F01DAEDFB76C93CE59B766295E1C766C1BB0552751D
-EFA83B7080B6156FCCF1796A68CD83B6BCD4DAF3353361F6A79DE994F0833A15
-638AE470FC6672593006E47301ED6A1C8727388AB31EEA34613CAE8E8AB07FD7
-6A18E36309FDCC4834F8CEBAE4AA648754D679DD4BDD86513C851A8102399740
-7792F8FF58081A0B4E84058E4C1A2D6BF680CFF926DCBDDC05D73627B7980E94
-D5E410848B1B6FC742315A2ED6F25635EB0D734C82480157DFD2F383E6508EAC
-EE70215C509B0B2A4DB87E6ABAF2E1AC115E6E24A55815703E0E054FC445CF86
-C1E0ACEF9AEAE22EB5D627D7E96701F93D080DB33240065D31745331D210830F
-DD0DDB83FCC6E4645D54012254EDA717ECDEB5C114D826D8F2E95FFC67948335
-2B0E77D7541876CB99594FA3C629FF182A7BDA378C823826AB0B24006F80406D
-5DA1BDD296992542E75B74CD79C2B4386016F415DAD1C183C3330252B1CDEA5E
-9129274519705F35769DF987B207CA0C68F3E6247F6119B01802A55CA056AF0D
-E8247CD5EE363A61D10855FF3A495861993440F77301477FB4EB0EFFA5D71568
-D708EC717428323DF6942FC660961D005CABA2388F00575F4649F9FCABA1779F
-88F964A301A6D5D1FC02B327B55730031CCF60ED2A15E6039471FE70B9C83C32
-A25E93184F3A994CCCBD2EF04491851D59DB819DA46DB076C3ED8230F0AF49C0
-A2224E5CA6ADEC27C15D0642EADB6A63628EEC98F6E941394C71DF59846ECBBA
-E7BF50E44E3D78994167B63641F8FB22460867CEB24CA37B08C91E49F0C47D13
-10F05348092FEBA6250C635FBA5C5962AFB24C950DFA5CDEDF063589804173B9
-EC2979D26993378BF16CB04F4EECB360182CCA00094A7E6C9D16630A1089B6C7
-B3E3FC864CFC613F2742065D4A57EF6559FA02C397AC666B8C9C35DBE5ACDC5C
-9624EB9A2219385CB8C83DE36D78ACB2B4A8A84D83C4DD8700534E00B4C4AE0C
-E431200DBC2C1BB217159174CF4EE41B6AC8746598A999F9F1CB98275D6D4CA0
-16C45FF79EF527AF3DB2FA45CE3BCB2E5D46D6A8CA3B7D81DC5679CC7D949CCE
-7D3F61F0FB9313FF41878D6C7058D8B2D3525D65C7FD7770D119E7C4E93898B1
-6844F80F0ADF8E84DD888594153238CA44CD3BB791186B47C66F6DA75F5E8FBC
-A623B5AA758C66F72C6E908E5490E95C1E73E674CC58B1ED4B385130382A2C48
-0D815DD704ACD6A68DDF70D5DD361ADCC1FC831C9680C02E77FF1413A025D992
-27C683ECDA0447F1A027DD1A47CCFDBC30AA59D35F731255609B509406D8C22C
-CB4A0BCF1654060D52EB4EDF21BE9F53CFEBDF408C5EA49B22A7909193FDD3F8
-DBF9F403B961F6412F2D27D7A1CF7E18F46630A0CA925CAE8CCB10CAAF42A5BD
-BF21F7845DDC89B892349BA7B4BAEF3B85593FB06A267075BFEEC3A857CB73F4
-402EDB98A70D15F48C2F61B3CBD7BF277304DE6EE36E9A55D2A1805B37CA9A13
-B37F00DF6FE4F8508305C3FBF257A7884A7C4D95B6A7DA6B2C4BC6465E0B8054
-77160504FC1976456543D6AA5B521E88A74E5B2FE7AE6CE5BEB4BCA8683AF38A
-7C6059764A7CF8E688EEBA0CC520F2AB06A61A07CD0222D2270ED4E17CED6C77
-565A18155B38795CD27D7001E06EFF2C41C80404884E878B64E60F13A901CEBD
-B0AB679183726D2808497859EE701055276F2F0F36763FD9F58FC1190A59B9A2
-65FFD2E0278ACFD8C6C575339D8B459C4DBDCBC4DD985F45AE1C7AD96FBEDD80
-60AF0F7FF0FB1C8960BB4BEA08B115BBB2B3CF7CA09B56622D59CD9403C2B2A4
-4E6A7E47B8CD864C07648D07AB07E8CE9173BB2B9C349A282AB8BA11076E1201
-69CC0C54AE2E893FA5D95E1A9440D9F991E29CAA259220DE5F3B99AC86DF417C
-0F50FC176CE4A0DC9EE549D2FA86D80629225D51F289674963CC78D11F8F7406
-85E67DD88CCC905FD02C0C7125D7F7C2029114E399489DCE1490EEE5DD8BDD16
-BCCF12ABA0D8E5D016874943E64EE48A0CF3B544662F1C107F8E75F32FBCB827
-6B905EC3F579BE9AAE714BCA85FE11E8B6E29DCE0044AB28A9175B0CF183A0F9
-A43D9742DD8E1AF097D3450F83D97855265B9F612D8A1C6165C339F0CE092652
-F3843DF0A898EA13374098110F461C42A17A10F73127ACA85EEBD115225B3FCD
-870CCF74E7103E305AD55C8D77B528000001B2593FEFCBE9014AACC6E83581FE
-E0B3C455B02970E509EC1C54120688DACB24517BAD30395B4261D3E266C55FC8
-5CA30725C79DA01BA71EAB826745A22DD24AAAA048039BEFC549538CCE9A4F3B
-75A50AF2F15BADC785E37D65A772D919482362A3E7A0EF75B61461CFBCD6AE1A
-7941F680FF7A0BD04182C21CAEF966A52DD4CCFCC22420CA5433D148A0D88EF6
-32AD0BF5CA6F3E031670EAD28609AB31E3EF73A4DC62C984CB953274C53F4F9F
-165ADAFCBACDAC894C0523646AC25509E65DDBC032E798EC31CE2608F1D89B9B
-3413911202DF9C0B291BCA78895AC01F4523C7FA4174E2747032E38B32716E23
-00A6F1EC49633898D4EEB694DA03E2E68E607DBEEFA851F685D6EA3F242140B0
-FE1C632CAEE6E741B9AD5D1D51C0D7D6DADEFD3C084E152F8D3341C3ACF52469
-256FE1C5C7ADDA51B355DF0CF42604C9840D6C01EDD1F5022BE5B15E1DB2420F
-44DE5B6E7D1CA024F1DA52AAE5F2B3E080B95D6B65914F1A8D7D6B235ACBE85E
-61493A5EB7C06CE2C3CE32A42D9508AF914D4ECA8EBFBAE318E6692DDB02C811
-DBD168004760E33BE0DACC8A5E77D7850795B7FBFFDD85A7A12DA088E0D04CE8
-5946CCDCD41C221A1E9729DDD097218CB4783DE0AE30E333EF00A8AD42DA7C06
-BD3BD7716C10EE6F801D3928277AA87225AA33E8141A47FD9BDD64FB6D29C60B
-F91DF1B8BBF9154811DE01AA799F5B9B1683A380429550192C09F052F027CCC1
-D42CC5B2E0C4A0FCE424D50AB5B82ACB7A9B1C7838722D3DC7E84A84BCB67061
-B204E8D1715A8EDDAD4EB4EFC2973EB418666C7F57580278514A6C5D0869AF3C
-0CB1D99BD5FE72A665380ED04AC4BD8379A1D5B2894B82B8A5EC319302DDF62B
-ACDEE383614D564D8FB8A7C6E6D1FC5C5B70C893ECCB540540C23EFCB7BFA574
-10D7C828495FFE4D7FEC9FF1F727F9CB0EFE9536989601F746CAD0EC97778E96
-D62380591A4B2F38CF1CD42A62B1DF45C760753E0E4AFEA5FB90309D412BBBC8
-6A1FE55FAF842BCD90BAD6D491061BCA6D8E589675B9418723FC18D3FAB84CEB
-4956C5868435D6DEE4D4F9172BF165C0C22BACE30A0E10B54D49B04AB0FA95C9
-921E11B6F12913966E2488EBD830CCB05F02AEA26A0E87C98ECC85660BA28C1E
-F9C2E577F087D8A844537008C8AED065EEF36CC3A5FBDACC6756EEECA8356873
-47EB1F955743F051D9FA4F51AAB900F7A8F656BD967FA52CDAE022EDB5BA2673
-C775BA4A6FAFAA1243CEEEA4414A1B2ECEF3B40BA6262135301CC62A355331FA
-1EB4009CFFE5CFC9DF8391D9BC92BF3E666A3B22696C567F6680ED5C4B5829B4
-8A6EF11B93D084AAF2DCE69B39BA46F28131C0B45EFA3BE521822CF75A528640
-661CCAF1B95560682208D24203D6DA466A4C4260AB717BB1656BA8846C4DD7C2
-5E8A48DE389DF43DE66BAA55789B20360D143F7D89F5A7906DCED9F51F8F18F5
-F1C5B170B883F7C389FE4F935D9EBB68F3EA8DF84E501C1F280F8849BC476181
-7950935420C6CB6C7FC4A470966C7762FDAB91FBA0D6DCF03CE97660B3F9E054
-A63216C80E878E319CDAC223EAD23BC143A921C6619B7E522362D6F37F5EEC98
-F7CB040FE694AB48051612955CCF098578AD99B26736D99E3792508507625070
-12881AB347B1ED8F489D4FCA2966944CBE0F62174E2B76E613EE541E940E8C49
-92AE79B2FA6FD6F5B16CA72F10CAB2A322A217C316E4B4CB99E888987BA0658C
-358EEDC1D85BA4486B479E2A2E6030786CF13889278949EE21B21D8F023B2CD1
-901FD514EFE94982A0C1AD2BD1C98E19848A4E36F4039EE0F4687FCD9C65EDE0
-5CD331D4BAA14998B24C0ABEB19CCEEB98611BA87F7BC01CCBD1AC749DECD76C
-6D3BAE9B89AE22653BE4482ACD59A35DD0DBE43406E57AC36C5307AF81CB00E0
-3E545F943565D0D925513E85041C16651313564518F604AD60C7F24B14DB7C25
-34D8E4C5A0121FA194AC14E86AAA4E14305F6948C6998B3ACF67CA8BF1B12744
-5E7EE111CA04335F78DCFC440E9A99AB34E60F9EFCBB233A9D20458DA9405D56
-57264169160682DDA15B1B19A2C599C1671D0702D3AEF14B2645C6500C07A7C2
-D4B95437F1EE7D8D0DA247F54D4E68399487CB01F031B63760511FCD2858F1BD
-AA7DDF5F3D0E4CDACAFBCA0610BF6DFCAF0046DA73542D5AF1E8EA8015D76A07
-7382A7B4F7419DBCE79A551D7A7CD12B1A8AB09174E5A3548BB56C0BCF4A87ED
-18B7B5A9B8375AD8535785C2DB59FE934A4BA33E8112C6FAA92CC683CE765D24
-6E6152964086CFD1A6CE9191D1C59521E98CCAAA407F093AF076F250AE02E0A8
-2835EF3FAF19B53EAB419E2677E1A58C742BE93A55D2E6FFB71144BABABA674C
-B972E811BF7857D3BDB809C0F23A51FFFF2E9160FBE2ACE2793EC2A381210CA9
-BFB1BA5F1576584EDFA3E904EF4A208350866A1CA232E6521018F245F33A9FBC
-BD3B09FACEBAB6CCE610CBDA6170F0D16E477CC664BD4FBEFAC52A887A1FEE93
-C0143336EF77A46748F464F1403791CF0EAE32CD4DDB4F298A17E9EAF1885666
-4E467059DEFEF575A9E0C4AFE7A3BE402CF79B2D02B79C42B06684CE5875A9DB
-DB64C03D668BB381B816A6F9813B2F5E2CBC194B93791F3BE0832AAA705D51F8
-1C0AE8829D844D5A1C5B9BE2519C921C6614D5DFF978A762B6D2F974B29AB353
-94166E26F6D86CBA714E47F84FF0A0CDF672271AF9E2AF7E2E8B743D7EE30E15
-C165FA7EE181ABED7981579A2D9999EAA208C7C8B33B9C6F95FD586CBD9354A8
-3B390D280A7D8FF96CE8A5C8F91DF9935F5A684133534C99A5918781F1B26C17
-E2436EE11DB1E3F104F7B3EBACA254B1FCE4B01FDE4183805ACB425FD8B46CC8
-04C1270FB3055101BB95EDF6E1D076A2A7FD3C2F97BC65802962E7EC127FB969
-C07E70F4D2F53AB08970C61BC6795CC95499F1A2C4BF9446FC4B65B123F81A0B
-60C6488F593594E6296844C0959E0AB0C386CC76E769C7D325E1BE46926DDDE5
-1EFFCC709F7998ABCF24DD1865D7C60C6527D0B06A4B50725D1C3384EB164111
-70D637D76C3E3EF63D0057B1A0F970EAE0613F3B94B025C1CB733A4BAE995E99
-3C1D5B00419B2AEC1300C1FC9A9E98F5AD5B92F11A90E07D32E8D6BD040E78F1
-48FFE3D337EE827CF632351057B0C568A3413ED28343E0F3029F76DFAC3C738E
-90B243F7D6039F6115845EE2EF471336C4D50FC48BC09EE001879FEA9B5BCEC0
-72EEC9FFE66C377390A5651677AEED0E1AE6800C495709B66C7F5FFC9974BF9E
-9DABFD11A00F87FC7861180133E09A718D7685953600600A669247AA8F25C483
-0C72735CEEDF3BF9BFA88C178994AF71A16D84630B0FA21369F5AFAF22527409
-3DF33589BC9C61041C8AF4879CEAA373523D99C34801809EF4160416A13F5D38
-14C0B9B4C95B5E7CFE6E70D61A8C847819A9D2AF78C329DC67C123E45E2E81B9
-A0EADF7B66B5D7524E6DC225BFF4364BA9DE24CBDE57667D694D6628D7841AAE
-49008D71ED25B845FD19B440E6AF9B5F140558AEFB89546BBF3B434E8ECCD005
-E8311C43B54F523A04B12D9B68400A6433AF4A8BF56A6E9EB36827DD1A5AC4BB
-724636815C3149AE97E24C03D9B7DF5F88343F26A7335F47265201ACEB998AD2
-AB922BDCA39EC2036EC2721EC4B4180257C931237635B0C395A73C0441C202DB
-9955C439043F04AF3125BB2FD696884E3FED05EDF1F5303D6BD60325CCED537C
-0995E73E9F2B962FE6B8816C5A68FCD4D325A6865FC7D57A992EDBD05FB6E92C
-C9725682A0CDC3214BD57988D001A5F62FD8A7C180C4F699A6EF7A804DC3863E
-DD7A20181CFBE117109A793F1EFBD99392E400F3DDD6C64BE64BA05FF710E605
-7D564C9BB7F666CFAE8076F2E4209DB688CD864BB58965B33CC7AD08A076FDF0
-3CE533959C33732D444D4ABCD35C73B6CDD1CD70CF072BFB175A0B5476B062B5
-3A637FC14D8DFD7C44DCBDC78EA108BCC4C8E094C4EEC35C9A399850BAAEC9C1
-C73E525076AB7EB6F5388ECD2962F7BC6137E78CBABD857C035EC03272BD12EE
-46692B841ABA2A1DCFCE4DD3D5E6883917D06659A523E0D3E3227516FCBE9AEB
-7F28DFF0707E0AD6BB92A9210EAD45F69A1ECA248D2883FEDFE8C52F75A73B7B
-9C7F07C4AA92537A2E9CE45F39FDEEA6C9FF6CA915E3D0AC4FC67BC6F0AFD108
-4810D67B320ADB50D4D37AD0C27A7564F6FAF3E6DB1CFC47CF9DA097AA269A80
-947043CBA10D93FFC7033C60A672C9D3F3999222D57492A97D5A4D10D99E437E
-0C0289A1BAA29D449B2C17C24D780E68354D874CEA9EA4E02FE0583A18C0667D
-4FEAB0CF5286FE487C95C969ED1CAECDD9F9BF5EC8A36C864190C73473C33162
-20296752CEBD6EB43144764E6FA12F60EA605290CCC3C69994BF0780A0BD9257
-A09FB9A9D3A5272C9FE2DAAB7975A5DCBD78A67E4F981E4EF224986C110F472E
-F86E07EEB1B2B8325D4DF7E4751215C7DEB987CC9662B92590889D64EA31A1CA
-55701D52590B3BAB4F0EA40D32CE6F98D6193BB6F843FD6FFEDFCD9C2CEA3A18
-917842BE0C2248B22D5AD817421748C36B4A10B6E65BED5686FCF26F4BA1C933
-1ADDBA36F99AD0F880DE81FA0C14AE93074C0D2F32AE2197ED43E3490C0A8FFA
-0D747D1622CFA8CCBD48E8DC112A1743AF9C7BCA93E5B5696C46A27A8815B167
-BF2896574824B20D9C1CADF443982E8B8ADF1F705AD3FD030478AA79D12DEA5D
-F5E3E9C309D9F3F360525044503A563F06AE33FC380C3DA0E0EACA854B23D030
-11897C208EFB2EFA86EE596420DE71B3ECCFDF3678888606031FDD301429AC82
-92CD38D8DE1C888EEEBAEFF6E5C9AFD6B2F8FB8B283E68EF1E12AEC79FA23D02
-908DDB7755C11E7DD339A1F2AB6AFCC27FBE797D03D01DFBEDB1460274C8BDBB
-57A48FF118324F231274183E0C00064893021BC8F3B52C7E784881A31D913F17
-19675260415F19D5CDBE742FA47668A6C3870553E3FA0CFE56CCF589767DDD20
-D4540E734169D2E1E1E979F74369EEFD66777BC54361CFF22291B76CE36FC987
-D78E9A4D17C75B8DB9740B72859A51B65E0985F1280983F224684E7300191D62
-D8248056727303B6FC6CB175EC5C6E372180995A44680EB012A97AF3B770BADB
-40FB89E4D1A48C46B1F56250382AFE36A674B92D132A56F5929260CDE410A744
-40E8B4262891CD7EB6CAF8DCBD3C58B46A5F0E9494651A2DF23EA1E3C80A2ABA
-0665C9562DE3719F15473F9138C66CC24BE1DD07C961F7F64E638496911F4FAA
-84BD95000B76D644EA13B94A73A1C41E1B08ED9A978AFF4BBF6567ECCB823D2F
-5FF935156F79A00BB188BCD617B6FB2541339E4CB82D196BA067DCFF9DC6D401
-3114E16A003D4722FAAD466AC7F0F932ACCBA5A7BCD038DF0C39DEE32E0CE33E
-16D59F60B06DC9561B40E328F8CFFA55042FE1C52BFD8A3273CBB02044CD01B1
-029A457EB8C8AD1CB1901140CCC5E8389416DCB7639D7D0A608F20ED96CAAC89
-F73DCB332055DBD161936E6A1EFB24CDBEB8AA69BFC7E2C4AA083B55D431235D
-21B65636385C41EFA278C440D24743FD2ADA13B62D53E7235A54760771C50DD3
-608ABA221A0724063C839E96306FF87344532D03EE2BC70A223CB6FA74964687
-82CC44EC76EBC8404A42644852197569B1711946ADF595E8A6C7789C7D8720B8
-371059305ED1ADE8B01C494FC1342154916EAEBE3F7732B595A840C7A0363839
-0977D1EB502C15D6FE8A368B398C4BD7977914B072DF30C4BD7DEF9EAB7AB5B7
-0327D5AE95CD10F79DD6844BA1CADED35FDFCB17B8C28D55EBCDF54FB943B39F
-0F9E98494B1654B1CA280350A03A9ECA8B00B59BF0D7015EF79C48A13662B7B8
-0547E2E3DAEDC268822F6DE7CD6F14AF71F7E546E12B4E11AFAADC34AEE5BDF7
-1E90DA341B6CD373009C6E774B0916787F637F6EA5AACC162582F1D10187FC56
-39349AB0AF7665252B5403E67686DF0973104F5B193D8CC9F673B3D9176A4B8C
-9C31382EBD5C1979493FAE6EF2056A346F656EFA5B31922C434BBFB892EFE8C0
-6230451A3F26B98DD8E62ED4757460B1F0F5C813901F351A93A7E11758798965
-EBDB3A22144A7782238284780A9263B561FF7F1CCAA4D24DD2F37B177FD24EC2
-B372252825D66DBA7941B096D85BAFFA5C2B9F8AA4A31A30AEF5273FCE05F36A
-75AC322BBC88C6B7D11CFD48D6D70408C664145D81130A2445D643E7118C6FB8
-48A01EECC93A45D37FAB6680D32FDF09E25481E18C388241D5ED823EE6FFEAA0
-90BA7638DE302486DD4F682CBCB33871FDCE16B67B158816960B52E75A1C28AA
-F4C27D521AFD7E74A51CFDE38340A368ACC89DE2FAD37E34F3858A5C2DC7BAFF
-F4CE85374EA40E25E959A9B74834DECBBFF9FAE1F39FDD5D0E8863D71D27CF04
-4AF357E77B565F5EA577466FD4138A5516E4624C7214E2BEDF1BB484D3425BD9
-ED34FD792F2F2B9BBB40FEA9D0056FDDBAE1CCC72FC101AC94859A9AAF2E37E2
-39BA606FEB4689E4E04642B70E58DDE5DA6608E318A70E24B6C7B88DD7E5BA52
-8FBE8B99BA85C5444FAFA046574C9160A0A920DB544419993BC4A1E9703A3D85
-A97827D2AF45C8379398A4D2A9DCE175DE7008A138BAE08B4B9A6B52D73D1B24
-6787C31875B04E35112F6A8AF5A2F8AE9155A80C36C6E8EA83642397717383F1
-EA877B01DFBAE379529D16D1E0CCCA4B8C8B94F979251914B958F0713859605E
-6DD76A27705012B089059F9490AB4238107EF9AE1A556CFE69360AE47F66AD68
-CB48D08CB5AEE83A3A9D77121D2A599746E7B7C839B4C5CDB41EA0ADF56A1375
-8BB21918F49B70AC01273EF2C388F118806FAE2743E1DB3164F4D5F7893ABA6C
-B5C122C9290394F2A216261845738E66B7650C8CEEAD7452BF6AFAF54C8EBDBF
-DA5876569BE294EEE5B54F23ABACEE7FD554998C84B6450BDD689A10FC20845D
-89F972F368648CB8CF864FF6648AF21FAB210BF101BFDB3B354C6659E761EEEA
-31892585C32A18FBE8E4883D9D5CC48D84EA2F9FDB73638E10CAE3F75C3D9E57
-6810FD5239352AF7DC7DDB3704CA7EC8FA4FA3EE75FDBBE9AF058FFA17A32A17
-AA578E1A1708E8CB257CA968EEB34140804C224B2FC49643E5B3A3F7CC5E6C75
-6EA9BFD9FF9067675CF025636875588F8C7CA7E41654D7D3BD7A388B8F517686
-4DD89A12B204251AD96E3FBB73B5BEFAE355E5BA81EA1A1F17DC49647224A9CC
-0CA44F3D25CF352E184544A710CF6EEEE3E73DDF1366A99B07F47E452623FF61
-B2D94549A80ED356E864D58BC00DE620D39A41C8CC18B5301CE74AE512F6B8A6
-72CD753E7161956C6BD11D375787797BEC1B061237307B0E1E08BBA7A94F422C
-A77335BEED64C6AA2E850801FBF083E1DB91776FE9F7C6EFA3278AE93AD6A58A
-193AAE6FDF8B15B529E7A5A543609E3CFF4D7CD3A121E0871CFBF0EF1D6E39CD
-552A2C1C3160D13787E0F01B2C405B8D46A802F8026C5CA738AADDA72AC9B78F
-5957ADCC3BC0A3C0A201089663D1FD6B68E1D2020E83BB50327141534336F1B0
-9B264841F663B1BFD914522EE29C20E22AB6141AE15090302ABAFF5CDBAB2B26
-84F3BEC919127A72C6E1E35A7D69B367D76481231A33AF2FEB9470F35872DE5C
-50F82702B55FB3BFE33CB165015BE9F7CB928769DE116F207DFB5F6E1EAE31FD
-000D15ED943A1A30C4B4048AE9E7D91BC1B1CD64EC2C24DAF572BEB3F0785AB0
-0D74341DB2D399B39FD5A6EF44DAFA7933EE532E6D4DF024EE9D4D27C88B25C6
-5CBA87237B30917F6F7D7EEC1BCFE774B4D7E0859EF5E07071B58EC2B074B288
-E0FE19979B84ACA7E6E7FA1889DEA18A119E2509CCFCE53D0AFA66020624CED0
-C55C31392AC12110FCB8C81BD289FE7B6330D7A5F9B07994AB79A494F370A732
-94776A8C2B5E557C2F5CE0CA852092F2181C4EC8ACFB01D197AF975B5DA482AC
-59BD5C70267E811E80525111D17BCA8D53EE95A843F1000BE05E93F507113ED5
-751D6970485082915C28A673008B4F9398EEE609E483D001296F181783423B9B
-7BD78EBBA0CEC7D10F35C23137BF69AF40DEEA478923AC289D554E6837D380F1
-5C3A29F97B3C2EADE26B9926D2B7F83289B723032C1385AA809D0B23B093D4D1
-A0A9087625FB595C017C1B0C1029511225AEBFE7A52AAB58A9BFB740DEC5AA88
-6F02290D37B03E3EB90A821E4BBDCD96A01A7A23FF3BEA2216A41BCFB63AF555
-8A7B9D2211DD290DCDE2A28BC6E1F96048CB9DF02F0471BB1F9E5EBA85E035B6
-3926CE1E1E97DA841FBA83D8C95717A23664FB840AF1DB06D0C47A989BBD5B9C
-3E710BAE7A7C5BFEADE6F96EB056E6E702AE6A84814E0043E61B5A03B7A717E2
-54CE4FABD79B8F2CBFE163F05B717A76BE430F459AB5EC6BE60F6EE1BBDCBA1F
-5DFCADAEFF23E029C48C33D5844673334FC54EB282C76357D93593A34E099E27
-0D29C79DC8B927266DC6E71FA8B2804AD0D00FDEC01917E7499F2706F6FE9EF5
-EEF6E24581BA11ED1E6405394C85E81E3ECA373279306298078DA538EBDBB62A
-62AD89EB75F19A810E7CA9C745A8910129B1DDF7C70B5853B6395871DF37E468
-73C456D0A83C17DF45B7B242A0FD09D2157EBD8B14D4B852766F11962EFD1B0C
-BBCD3C398DBBDDB157F80CDA579478A9689C720C026372B13B363CF23BA8D2F0
-0828BBE088A6DF3EE50886D5D79282B82145D5B1FBA13CCABF9C4E94F66A145D
-F1BCCE4FDB0AA925E131B4270A48D25365090B70EF23F92ED72E770744059753
-1AC58E87A3A8B5F75C39DAB382E14AA485194E650C3F268EF6DBA0B1A604DDAE
-7A151A21CB7D411E77289EF01A99A4332EEADB57372D43230B804C90FB1C08BF
-201C3B7ACECA45D6A1DE107A9E231BA5CEB149F40D71C67F1F7ACE8DE1271368
-FB5B447454BD37B8BC43C65F6E8733323AA43FB5F83C4FAAB164C3C2DB7A678B
-6454FF9EB6C0A4CB8186B895D1DBF0B5382BBAFBE484C5580CB354DD40AEF365
-E1DE1638E582CFB5C1E58EFDF0D3636C95BCB4DD9573F00AE7149371E0CB0969
-B3EC075D3D7ADF61E79E29F83144CFFBDDEB68DAA5E05D30508EECFC43B8B625
-5B533DCC9149E8770F4EFE85207CFA8C1E50D8B589E090DC84EBEF2360B5F3E4
-479E68779E5A24BB722A37A311F3AA39BB04530A2BDEEECB3BC9FBC889E66949
-797E3BFB3D1A1CE6A62CBB5CF5DB3CF99954F5D0CB096CEF2F5431994738CF1F
-97FF3260AD2D89FD819B16E53D59E9E0FDF6B56BAD6E0AAF557EFB6A48D029D8
-F70BA32DFC0779B353A4D476B86CF02A505D40815E2585FD03C07B32B14D2B58
-13BEB639824A1FC04E7336470DE07DADD4D25A641B430DD1336F3A1D0F1DB6D9
-453006DC947ED4F2D528C00BBA98BEBBF855AC8C133B68DD62E292063FCCDC1C
-0E390165DF8B85C94DEC13270D824E029046C892495BE1303C44FBD3BB36745C
-63ECE2B67D2B303DFC22E2FDD140E40775A99B1A8D11DB4ED1C625540E3CC640
-269F338D8B04A713CC3063EAC34AEA0AF725D31642877042C6DB4E7950DC8C0B
-61A322EA288F55B899F0A08F49E22791A2D55BBF89CBF0F1B97317C04216D616
-FCB5D100126A49DD94338D4DC08EAFBE1F08AB6B1792D358C50CFA58B5A66643
-6B801A2267C9843F9C06FD9F137AF780DE55D83F949F1B8CD025475779471377
-B8CF89B2765C0A9C41C186C586629C36C879F3A29D7A9F4E8B8919425F3B0C98
-45CC7A7AAFD70D88E2DE69200ADF0D263951718B2289DFAC4A38311519C07933
-9627F52FBEEE5B9619DE3BAC9B2791BD888B70AFDB75A1999540A1D16E9D4491
-FF5D3E5CE027E7700F1CC85F0BC64ABE5CADF8059C77CDBA5EB1AAD36B1C14DE
-1B30ADFDBEA34650116888C6714B1825E56406C96C06B1D37000AED2840743AF
-BC2F6F95E7917B32C3A5C7D36FB9F34626C0E61231599C2EE02EAB2DE0136081
-48A65E57FEDC0664DD2934ED21FC98BD568B4DD7BD55A251D16D2CB99C53C96C
-0A44BEB44D9714F33CEE323B0ACE7923AD307A8D3B0CE768240F0E8C15C2693A
-70BBBD740B3C410DAEFC933B324A3FFAF31C3D03516A6EEA22D2EAEF4D607FEA
-4E865D7F6A47EC9034D23464715127986B704A08EA781C5DC9096EA7A95F611F
-AEE6BF59FC2F3F67B20C70C7B187E0ADDC966BAB1258DC4B7C64E317BC97F2AE
-B07D61A535F51DB2C0A058174EA194DA4F0E44326A2BE85E31A81A2D1032BD4E
-945838B571BC43768226FD5171F01C24AF9654A8846AB32147D9E6F43F03DE47
-2E515D0A300BDE126FCF69A4C19DC8F13641C89A674E5B299DD875DD0CDADEFC
-54FDED84A2946C4992B9EFF20C93AB2EE98837456C5BE2D691E5BFAD21A297C6
-9FE7FCF5F91AFE1546DA4F96E0F437460B044CD9BB2CAB9422FB85C5E131866A
-B392515816F305001A0BBA51343572CB7B81356A0B45E33BC7BDF0F507F1A316
-BC9F6563A5BE869CEB87DE1051F1BE6AD6F267AC18B6A8289215D968BD467A24
-1F5F5233230CDE952ACF0B776D919520E70DBD5E1D5DF82C89DFAB421F98FB62
-8CCA29D0D223FAB23AA37B3609D1E15ADB7F680CB67097444672C9347E47E230
-B7A8E5D4FBC1C05DACD6CE17006D2150F6D378459E4BEDF9CFF363E564D63353
-C2C609C19DAF27C7DE9A91AF2F0664ECE84CF7A8C288F94EC8033A9176FABB14
-2B41009D02B6DC09CF9DEFE893386E3CD5E7331A35F481E18BE9CBB04951C4FF
-7F08F5A49566BD7142D20E1A42C875A0EF12892F404BBB128174F8979852151B
-E67D2D84151BF68E9C6427BC362CADFE532EDEAB49BCE2E5009030151BE5D2B3
-CEFE4F215E91DCE7D407FB57BD0FA8BED720E20E65FF4CC5BA32C867A1F9DCB3
-EAD136D0F7767485A604CC97D47A2320560D95E9315D04D72BDF9DA3F9E4836D
-1D24ED2D707DF128810F218425FCEA314852DD80D48BD08963976ACFB9C44CD2
-BAC78BEDE35470512463B5C6E877BA3AA4749680D05FA3959A0B2ECE7171F1EA
-9B963122A1A72DFC9E6FEC7E699A4C6BD742E3D4D570877231AF25FC17F598B6
-3777595305CAABA3696ECFCC725EB41E222403D84DA710D690C155978D93F389
-0F49E87EF135D19682BD2A2EA6FDF7CD3A2BEB6C087643ECB69252BB8678B21C
-33F85002D1C82BC7066BFA02EA5E7D671D6450E5297BC91B2121BF46DF58892B
-14D581DBF322E89E6BF24C6532CBA0C3897DC13C907EFA52142A018CA820A079
-52D7541D59D864C597D7ED9B9714A4422BCFE03AEE1EF4B6B565B40FF1EB4BCC
-ADD77668A46FA7CFAC18AFD4B92C8F76806F81A818663A4DA845DF15F6A2DA70
-67F165013514D26B51D958A57EEBA06114DA17B3A930FF23B0DEC464C8D2F915
-68700C34E684DECC3639BFAC26B22E277B1AF59112FC783B887F37A730766AD3
-F50CFBAC08E0B4050C1434241EDB33BDB3F97E1CDA67721899E4A7EF1DBB3E3D
-4AA90E615D06A805EFD26EB78A6F9FFC12E53D5E0FF49909F41E69D10C308EAE
-707F729147F4D375E461690B9DA00A94CCAEF8C039B1F6A911A2AFFDE3C954FF
-DA1FDC3C137433AD11A357F011594CCD9D1EEF0B976378F8CAF292E67662EF17
-AB786E90392DA9618E9D8DCF87C6C51C3B7371207C66D0B692FE7C290C0B51C9
-EE8B2670B63946EEB7FB9A7F66CD72EF1F890301173FFCE6B8FFED59895DAC93
-EDF39170D6D906FD2A462A1D2A85C1F19D77EBBC4CBAADAF49CE9462F23E1329
-8CD5B445800973B978A460921E8825014983943BCAA4D1019AB6627925B03E4D
-DD70D0A1B8694A0D47DE8DF8B89D079C9C14C6B804058B43B39780847D746616
-52ACC4AAFCF918C3D3135F7B82A38162BFBD112D581157A19DA30ACB74502FE4
-40D7EDC6EBCD9BB458F2668D727CBF2E53A9F0121F62678D113EAAB36C24F3FB
-831ED9761D907C5DCED84E6A9B242B041D26BB25A88136470F112DA1459657AC
-AF399CE6FF71A7CD29E40A19C2503D08372C2A770118ADFFD821159C067B98AE
-1170DBDA9AC3B3C31CEE8F6DC8B20C27295F362B52F1E309146EE975F9B41094
-BF28580EEF0DD850CE543A5D369676D7BB9AF94FBECDE2AE3F09848107BB9A89
-97EF34E79201D422622E36F78FA2B80E678FB154FE84D934FA7C8D9AA1A1AAF3
-33D0A40D2DCE86DE6380BF617ADE6C6E5C97A3F056BB062A9097293FDC0BD70B
-987E357AD571971CFF01E913BBC1D05F0A7205F1ABAF516E38C02CF41DBD399C
-E4B4648049569DE6DE43170DDF91A4BA23E398F82EB411194147528312F04F35
-9B8A36719E8CB6094DF7E2A14B1632CBDB2B1966B59CA5A778ABBBD66FD53571
-CD8B761D8BA11C0BFFA71C58FEF39ABA40A4D01974403D5076CB826315A24ED7
-3D207C528FAFB65B4861BF8AD2B53C748B0A4B34E57771278FC24E98AD52F34E
-04AA492C9815EBE676781D40239B3FB7E462DA782BFE82C1C43BD937D6C260B3
-29D6DF902006EA10A63DC2090C9484C6234AB78A45957087E65F0F8979D5A6DB
-C952E8721133F3D88316977789EB8CFCEE5085FA4741AA4090B920CE7849F9CD
-4DB2FCC872CAC7AF5FEF0257B4A0AD781B6B4F634F370F7F61DBF8BB66578E34
-4DF73EFC1C23CA11C7A6C336BAF988B37E55C20F4138A7B5D8FBDBFC70BE5D37
-AF6F7E6958E062C6344C14249958E8566571B9C79ECC
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/l049036t.pfa b/lib/fonts/l049036t.pfa
deleted file mode 100644
index df2250f90d..0000000000
--- a/lib/fonts/l049036t.pfa
+++ /dev/null
@@ -1,1613 +0,0 @@
-%!PS-AdobeFont-1.0: LuxiSerif-BoldOblique 1.1000
-%%CreationDate: Mon Nov 12 2001
-% Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-% Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.1000) readonly def
-/Notice (Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/Copyright (Copyright Copyright (c) 2001 by Bigelow & Holmes Inc. Instructions copyright (c) 2001 by URW++.) readonly def
-/FullName (Luxi Serif Bold Oblique) readonly def
-/FamilyName (Luxi Serif) readonly def
-/Weight (Bold) readonly def
-/ItalicAngle -11.3 def
-/isFixedPitch false def
-/UnderlinePosition -36 def
-/UnderlineThickness 72 def
-end readonly def
-/FontName /LuxiSerif-BoldOblique def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-221 -211 1138 1012} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding 256 array
-0 1 255 {1 index exch /.notdef put} for
-dup 65 /A put
-dup 66 /B put
-dup 67 /C put
-dup 68 /D put
-dup 69 /E put
-dup 70 /F put
-dup 71 /G put
-dup 72 /H put
-dup 73 /I put
-dup 74 /J put
-dup 75 /K put
-dup 76 /L put
-dup 77 /M put
-dup 78 /N put
-dup 79 /O put
-dup 80 /P put
-dup 81 /Q put
-dup 82 /R put
-dup 83 /S put
-dup 84 /T put
-dup 85 /U put
-dup 86 /V put
-dup 87 /W put
-dup 88 /X put
-dup 89 /Y put
-dup 90 /Z put
-dup 198 /AE put
-dup 140 /OE put
-dup 216 /Oslash put
-dup 196 /Adieresis put
-dup 193 /Aacute put
-dup 192 /Agrave put
-dup 194 /Acircumflex put
-dup 195 /Atilde put
-dup 197 /Aring put
-dup 199 /Ccedilla put
-dup 208 /Eth put
-dup 203 /Edieresis put
-dup 201 /Eacute put
-dup 200 /Egrave put
-dup 202 /Ecircumflex put
-dup 207 /Idieresis put
-dup 205 /Iacute put
-dup 204 /Igrave put
-dup 206 /Icircumflex put
-dup 209 /Ntilde put
-dup 214 /Odieresis put
-dup 211 /Oacute put
-dup 210 /Ograve put
-dup 212 /Ocircumflex put
-dup 213 /Otilde put
-dup 138 /Scaron put
-dup 220 /Udieresis put
-dup 218 /Uacute put
-dup 217 /Ugrave put
-dup 219 /Ucircumflex put
-dup 221 /Yacute put
-dup 222 /Thorn put
-dup 159 /Ydieresis put
-dup 97 /a put
-dup 98 /b put
-dup 99 /c put
-dup 100 /d put
-dup 101 /e put
-dup 102 /f put
-dup 103 /g put
-dup 104 /h put
-dup 105 /i put
-dup 106 /j put
-dup 107 /k put
-dup 108 /l put
-dup 109 /m put
-dup 110 /n put
-dup 111 /o put
-dup 112 /p put
-dup 113 /q put
-dup 114 /r put
-dup 115 /s put
-dup 116 /t put
-dup 117 /u put
-dup 118 /v put
-dup 119 /w put
-dup 120 /x put
-dup 121 /y put
-dup 122 /z put
-dup 230 /ae put
-dup 156 /oe put
-dup 248 /oslash put
-dup 223 /germandbls put
-dup 228 /adieresis put
-dup 225 /aacute put
-dup 224 /agrave put
-dup 226 /acircumflex put
-dup 227 /atilde put
-dup 229 /aring put
-dup 231 /ccedilla put
-dup 235 /edieresis put
-dup 233 /eacute put
-dup 232 /egrave put
-dup 234 /ecircumflex put
-dup 239 /idieresis put
-dup 237 /iacute put
-dup 236 /igrave put
-dup 238 /icircumflex put
-dup 241 /ntilde put
-dup 246 /odieresis put
-dup 243 /oacute put
-dup 242 /ograve put
-dup 244 /ocircumflex put
-dup 245 /otilde put
-dup 154 /scaron put
-dup 252 /udieresis put
-dup 250 /uacute put
-dup 249 /ugrave put
-dup 251 /ucircumflex put
-dup 253 /yacute put
-dup 240 /eth put
-dup 254 /thorn put
-dup 255 /ydieresis put
-dup 49 /one put
-dup 50 /two put
-dup 51 /three put
-dup 52 /four put
-dup 53 /five put
-dup 54 /six put
-dup 55 /seven put
-dup 56 /eight put
-dup 57 /nine put
-dup 48 /zero put
-dup 163 /sterling put
-dup 36 /dollar put
-dup 162 /cent put
-dup 131 /florin put
-dup 128 /Euro put
-dup 165 /yen put
-dup 185 /onesuperior put
-dup 178 /twosuperior put
-dup 179 /threesuperior put
-dup 46 /period put
-dup 58 /colon put
-dup 133 /ellipsis put
-dup 44 /comma put
-dup 59 /semicolon put
-dup 145 /quoteleft put
-dup 148 /quotedblright put
-dup 147 /quotedblleft put
-dup 132 /quotedblbase put
-dup 33 /exclam put
-dup 161 /exclamdown put
-dup 63 /question put
-dup 191 /questiondown put
-dup 187 /guillemotright put
-dup 171 /guillemotleft put
-dup 155 /guilsinglright put
-dup 139 /guilsinglleft put
-dup 47 /slash put
-dup 45 /hyphen put
-dup 173 /sfthyphen put
-dup 150 /endash put
-dup 151 /emdash put
-dup 40 /parenleft put
-dup 41 /parenright put
-dup 91 /bracketleft put
-dup 93 /bracketright put
-dup 38 /ampersand put
-dup 167 /section put
-dup 134 /dagger put
-dup 135 /daggerdbl put
-dup 42 /asterisk put
-dup 39 /quotesingle put
-dup 34 /quotedbl put
-dup 64 /at put
-dup 35 /numbersign put
-dup 176 /degree put
-dup 43 /plus put
-dup 215 /multiply put
-dup 247 /divide put
-dup 61 /equal put
-dup 153 /trademark put
-dup 182 /paragraph put
-dup 164 /currency put
-dup 130 /quotesinglbase put
-dup 146 /quoteright put
-dup 123 /braceleft put
-dup 125 /braceright put
-dup 170 /ordfeminine put
-dup 186 /ordmasculine put
-dup 177 /plusminus put
-dup 189 /onehalf put
-dup 188 /onequarter put
-dup 190 /threequarters put
-dup 37 /percent put
-dup 137 /perthousand put
-dup 92 /backslash put
-dup 168 /dieresis put
-dup 180 /acute put
-dup 96 /grave put
-dup 136 /circumflex put
-dup 152 /tilde put
-dup 184 /cedilla put
-dup 169 /copyright put
-dup 174 /registered put
-dup 32 /space put
-dup 160 /nbspace put
-dup 149 /bullet put
-dup 60 /less put
-dup 62 /greater put
-dup 172 /logicalnot put
-dup 94 /asciicircum put
-dup 124 /bar put
-dup 166 /brokenbar put
-dup 95 /underscore put
-dup 126 /asciitilde put
-dup 181 /mu put
-readonly def
-/UniqueID 5078994 def
-currentdict end
-currentfile eexec E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942B
-F7D6DD84F1664B89699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED
-2AC419FF2B2BDE605B8EE3264EDD66412D4F21C64AC522BDFC7C5502F9C3F3E5
-592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A25032519D1868816E
-44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8F1232D9E237CD60D35F0FD179FB
-1219B605B80A36CDE0BAAFFA5D97DF370655785FB236544DF1E7A00B7E8AA37F
-C23C6BDAB4E3F9BC5EE40602171D028423D88D16F57168C9631090E451FA196B
-8B446947EE6233FF652CF41C03ACCD60952FE06298CA4E207FAAA38F192D2D8E
-E528AD9B647706997722D73A9203CF7377792AE5780299EB8DBF2C0CBE5E1572
-982D74F81C32E627DF120AE53A1BFC783FAA74AEE3920D208F8AF826AE684F6D
-CA41AED94655B6A9E0D60C34C318C7E76F5A52F373693DF3ABC03A72E8DB5E66
-CF5DAD37C9CB9EE42DA592D9DB876C6E62DAC02F1B126C59D1703D3A685C617B
-F5A8FD9A630D8746ACEA7B41E9DBD4C47B30163DE05B34AAC3337965660BAA0B
-CC2BAFFC0F3446E268C9BB27CE08456549C2DFD8812DAF308024973D7C38E8D1
-30C198D253136F3478334600EBF8C0196ACA6E350182B387FCFEB559F62ADD64
-D9B3C78A9832FA4EB023B07719B4D8A173274C388446C99C63F7C6313DCE4118
-8D2127184AFC17D5651DC1F2B7A763052FDDE142C714658009F5407B20F1D30D
-FC978A2FBD8CCE7523A2A62EAF38D6485FD62C13D444DCEC7DBC79CF9258B502
-67CE30E2032F03718CACA3A28F71B941923F52B6FC4EE1731D9BCDEB5F456423
-52BC72B85C92AA0A7EEB5E7BD6470B7FF3C9A68EB479102C6F790F27266B67A8
-59AD2EB5CF5A20B6A39274BAF31E02E1C487F59EA0AD622DD509438C43E7F935
-C21E6FE887846ADF1D3071DB5C1A7868787F92F46D6AB19D56CCC3742B646AEA
-2D24DDA6E00C6EC895103BBFB6D67B0C902E176F84AED3A0999C2C99A65F1A64
-A362CFD2DB6885F1EF150D828BA5C685A3A0183963102723AAC166BEBF18CF62
-D0C26D613CA8AF740822182523B26060E255124B1F9C70511B9D338A6AE2D837
-2492D7A67A371CD3E757A8130F8FC9D6B13BFF690257B7D41C012CDEFF5BFCAB
-B511D068C9183BC0983E09341008C9717C20DE26E61CF7CA45E59433E58FE1B7
-C6884418C26663988693B995BF1EE3842EFC3E33976C988D6CD724D3B81A942C
-2B0BB08F65A08BF768138C8A750A892DDAEF502823D4D6706CCC05451652D896
-38C09DB8EABA368FCF8AAC4E482942DD3D784D9C57675577F107594C0D2E07EA
-36553A9785E0FE26534DF886F2B5A906018C48F1A0CFAB7E373476BCF98E7CDD
-18A11D8F2FD16699FAEC22754E53EE9C972FF4A3901F94E58E23823A78F40439
-B709D90F48348B8B8E78569C77326B684E4DE7AE9192877076BE05932E8D3FCF
-DA09EAADBDDBA35290E3FBC6AF2FDBD178AC051807027BABD733B54DA6E6ADA8
-350D3FF874041333CF88705C96F55CBE46A4D6DB68FFD447996A124603F3E29D
-4673137D87A8B33A430F18ECA5DE4ACCF88AA16294BD9A3A98C5081C2112E3A9
-FC7C9FBB704BAD222B07D0D7E9F52BFB316992C7ED6AA618163D2268734D7B22
-3991A8C256CC17087E844BB8FB806A66B9EBA4DCD9FE4DDA936CC61229492253
-2922EDB5B12AEF0F77D693C51D616EA252BF6CF515C5CC737495F33CA41D9F8E
-34572232EB422CFDAB03BC194E42DC669948235E0BDA96E50A3B78FD24A8F859
-61B560D847BE4A63E97358DECFA6BE9B86E026176DFDAFB470D57AAD803FBD38
-714DC319655DDAF6BF3E085819C456BCA734BC479A22BB6E8C9FE3E747A5E47E
-0FD73B4AF5A80AC230DCB02818AF68A251998462E6DE10AB7FCA5FED041B32A8
-382B480F30400DB936DE1665D9D7592110AACF516FD0F68026AFC371458BACD7
-BB9F0A7C5B399DF9E7B02249526C555137B5A2B8BD3FC2A5055ACF2A983C54FC
-5D4862F8867C39DF18824D457F222918FACD5EFE01982CEB5E75643EB7C61F77
-5ACFF22D54B58EB7F0BB14210CBB8A8B562B188E04164F46DCD915E428BA6137
-08420B83F3ABEE130C92EBE3A7C55FE7AAA126F2E9D450350F6331D4FCA8554D
-2A0D48865FFB3E0CB9E97847D82F8EA1218B5DF5A9966DF6B7622A0BC06531C2
-54F0589991E10C95A5D1CD2BF64E248D3BFDF25F88A405E95FA254D2E4B70160
-9C8153A5504EE22BFB83C771616044B55E0B9676CB234B0054EB8B3B073AAD22
-B7E7A89C15A80E3344ADCAB949955641E1785EAB2D62B843DDFE4D5974FB03A2
-8E9CD8E6B10A98611126BCACF813843C92AC35DAFB9F14055EEC42E01028431F
-2456598FD76BB66F1309B1DA0F7077D86BDCFBC6B628B895011B8D74935F5419
-8902392C6D35EC29225CDC7D49712D1D9FDD66C24C5340C1E05646631902B92C
-516F67ECD172F882CDCFE2F957E4F6395D79E9F08E0EF64C7FC0B3118E3BFBA4
-FB752619779BC1645969558BA349F8868B3A3CAB48ACA78FC8BBF33198F03AFF
-3862063C0BD73AA486316E28F948E31B89CEA0A0F9F10311483EC0676F597458
-8943317514B3B0D47274A499CBA6F76415D22ABF9AF5AE9A164D3444BD3A3CBA
-17682AED8A11DEE04EF6965C07849C06970829560793B5E422DD801B4AD94CCE
-AB73562530310B79FCD6F2F93182C05C509C0B2163F9F24A7BD06DED8D50C955
-1C9012158313AA8A548B79D495DAEDFC651D4A6110B98A88047A6893FFFCF00F
-03D6848F15412C9200C5AA0525397806CEBF448F92E9EB110EBAF17CB2856DC7
-8C22DA7487B9E55B6DF23F345CB478689FB8522A1FEB34EE58AD8A4805B7CABB
-58EA56D1FCCEF7869901EA0229908C74EDE80E2CD07B0E33D17389A434C54E07
-039EC17E27A56847CFE4FA04D65AF20650F8C58D24745FFD76F443843B7ACF94
-01528C2F046C2F8598C36367E9FD009B2B73F52AD9DCB49DF76DF74597AF9AE7
-B43E4988D7CAA34ED694CF0D3F67B9C21680DFD8E925FD4DC6E4458939C1F5A1
-1F0465493E0B8DD3F63034813F557C9B321E9265F4467E1BE3070101675A40E2
-36AF9F1D37162176B4B950A37EB1EFA3642B9E8AE6D5CC77DDBC6E5C0A172BC8
-4EDAD45A7502ACE290A9AB4D56E32245F7AF75D540485611CC79C813CCC61FCE
-E7C773F74E26BBCF5EAFC476AB031A04C1BEEEFC881843AC2438988CDDE7CF53
-C18FD1A9E1F1EC264DC2484BDF4867933422A75E0EAAD1AD55A408D81ACF6AC5
-D93D12EED180D56666BFF3479B7EFF185E39D4296C7C87F56A6C1B6B0A99DCCD
-F7032FF77585F4A1A22DDF46171A5A0C0601758F64CC10DD4EE4EAB0BCD05753
-76ED93EA50B176B36196DFDF5345E4BC934D9B6CF7ACAAE77A9B0BC66E460402
-87AC5F4CF69ABEC05B6DB517FE1059002B95E4245297272E552E6DFBAE1663E6
-1C37C0C90916037DB040BCE0BC1FCAF881461E0B5960997AB582942DF119F00A
-A58EF89B9CA549913721521F259B135EFA1C7E1A5F87550621E31BC7DB07FD3A
-85F024F2943F95D66503E8498D4B7038FD7F938950FF22310D1B49E61E395426
-B20B952D57983BF33A707C794895B082DBB035705F8DAE75EDD15A2F75C9DC04
-91A59777B2953CB4A1C8575C4FDC2DECE1737E9ABAF62637B0FB6471378E942F
-1141977AFC8032A13866589CDB087995F9F78EFF5713572E6F3F7FE4467E8313
-44D994CA7AE974124CA93BD83C9E8451C956BAF993F279AD7044ABBE7BB826A0
-2757ABB1135A21C9DDD3781A589F9252C51452458CB5C94C4FCD53D3ECCA36EE
-263C1ADECAAA22CCF6CE9DB923000BD7FA6B6B12032ED49A469BDE95C5903420
-CF275F03D3637C7A65A872F462F19C6EB25EE8F4E7A49C528806EF56ABF5468E
-BDFFAA111A3B5E5DC9C46340DB0563DEC9250C603439F656ECC6F8A5E344BCEC
-DAE02EE7F349175C35D8F8CA7715BEEBCD45D2980B707B3B2EE44FFF846C8B8B
-8A7C02A56DAF16192B3823283E9876E8079FA3EE07BC1EB30AD14DA63B80DAC8
-D1311AA303A9D56859A4169C20C7F279B7527741D44DC6AB31A2A048C2CCD362
-BAB152807E3F73A621579EAA2FA7EB2BD45AD89E170D4AFFE6ED94A395965E32
-09C600D9AF322B870B34068FB0706EAB341FEEA668275183D38C641A98EC2BB3
-0E6827F3A764DAF871DBF5D27D254FD78E5F99432C405E92178941EE9B1999AC
-3BC5E2D10BE76BC555C63167A0408A69A3B37A4D263204F6401A3AFF49398862
-C685EEB99C79D42A7859211B6C447462C894150469429C7E5315F575F8AAA66F
-C2DADD013A304894E50EAEE124C86E1AE87AF200C8DEA35027ECD102071F8FD8
-F3EFCE1A14AF5910C6CF5A5A8DC5F09A18285D0384717E4FA0232443D12130C4
-EBAFACCEB4A8AC281F8B4CB5136740A15E7184A2BE166ADD3B307E918D326769
-F99E923C3834EDBFAAA5A2BBA1CE952CC01804000E1BF0A4C80B35E0474FC985
-3F852E8AF570C542ECF37F4CBB940E278FD2AD1249144457ADED44359A90D3BC
-9022B23C46F25C74D22A61BA69F1BBDB4C5AEAC64AE8B6AE975822C08E416810
-310EA856B8FF8D17BC79AEB42808ACDDA673BE0BCE980C6A98CD5A0455A1A234
-BDD559C0B31A798D088BA0AD425DCD904E8C3013C388770DC9D03B6249E8A4ED
-A49B3A2EB11723B0D6FAC3BDE453E1F8DD6531BA42B6359F47A61B5762AFCDC6
-5AF5130792FE98C5FC024B1DA4887095413C6FBA16EE59F1C8CC43A9FCA40344
-2ED9359597B991AFD2D94BADCE1E96B676A5910BE322CA3BED9120062740AF03
-7DCCF5793E87E7C05D95C4F65466C2D1867518BBD4CA2CEF4F6299E122C2EF6F
-9301DE754D842D32BF4FF0C61001FA3929564A3935FF2C291B7E3B4425E9A0B8
-BD326EB5926EA0AC4FAC6D34F2A0715A68D38EAD576CB1FD774C30F0CDF2643B
-2DFDBE58F38F0589ADDB6BCA49E1280F5219F45B0FFCD574ECC51BCC8625B1D0
-8A710B796113F13B8115B3EE0267F25C595CDEC16A6E7A016436A5AC93783EBB
-443AF8DD342F6BD1F58C315973F9FE0B6D85C50D9BAC10A456CC83D8577032BC
-FFEDC71049EBC829D6A419DCC22ED0A3A2E230101CEDC64C67E4F442E36AFEC4
-EFD6AF959D4341CDD27830F364E85DEDEC69E1D375AEEA5805D45B4507275AC3
-95575B9C83CF9529A9050997D5235ACCEB4E79BC37515C7C0205D8C9B827A5F0
-04E21177207379699BDA9805FBC4CF0A9B6AEB09E1E21DCC693E985DDD79C45F
-A33322BF56FF7B91ECAED3E0E9C92729CE6894815DB7FF4C61E9F74AEFEBFCF4
-56FAB1681DD80EBE8D418B6B7BAAADF34E87EB5CD4AA2FFDA2E4F238035FC14F
-6239B152EF3232277E9AC710AAE11C310DFB02BA392A026C661EBA5669F33C22
-B850CC57351F9EF0D6237C36753FE0A63ABE7C6E11798C9CEB6602D8E33724D6
-CF700E1A9D09D6973C99EB520C3034F8B38EFD43FF71313950C1D44565EBB204
-A614DB50EBC153B59A366BC76F01E5C3E5B8BC09D2B68EA6C154F72D54AA4733
-A4FF05C6A82B0ACE40AC70343FC83133797AE8C6DBF3BE1F6E441D6BF809C71B
-D392A0CC32F1625D07869950F857E4E2B3B9979131C4432C44D8F6EFE9D01F80
-86D60FE915A474EAD180B21A24FCE69D511C011A8A6A39DF30F87FB2EFBB376B
-7CFB1EDA2447181948D01C49F3795ABCD52344B58ADC8A8DA554849C97E5ED97
-E42F571E5F2D060FFB9E1B012FDD38B53C3AA5172E280B319BB3AC47E4BAF2A1
-4F891DF034AAA2F2AECCCD8C23182B5535DAC76C151F7718C39D549B6610DCE6
-9E154606D564619BE796F85050CBCF8EAB4EABF17FFF4ED07A3BAD022C523621
-DE7FEE8172910DD5448D8F7456637A17ABE96218AA7B1665D361B7FE4427BA75
-8F9193B7B9A52D4AD3405B7DFB1FC79D235DDF354D321B293E5C269616A10E58
-722A50BB356379CE744B3839E7822455300AACB0AD45EC8761F560B8D1073C9A
-5BD7ED1BEE741282A92AF285BE80C6C65B2448E0A4A359851945AFFC91C9E578
-2C12D27B51BB4500CFB533051D055E7EE47BCC23D8F8DEE569A1FBE3419539F0
-8FA5CE4D8612AD404EB7E83D4E4A547C2C347D217979AC48E5C081CDE3671319
-7DB36C69C2A31B0F633EBC046CFE969448FF2A253CAC2B4FFDC14FC152BF83E5
-E517DE19FE1BDFFB7A3F276293E761C3B39AD3610E442AA58A7C25BE41C05141
-AC500ECB657643CB128E8AE36F4B37E8EF15CFEB1F8E3D334519A3609CDFAC3D
-362933B5A55559CC28DFA89182F89B2FD5013E08A2C583FCFF9CC53A2D5CD13B
-1C9786D1F39A02106517DD191D9E5169363FB01ED68C4CC13CD9CC257A2EE802
-C9E40E5C0BE5E65982AA15FBF0F04118EBE9DF64C279AFDFB1197AF62F6E18C2
-3E95A13D6B6737C4579B24E33A0A14DC922EC4C7202A30A06A4596547A791955
-B3902033D6047AD6E44A90FAE4333D0891684A9B1895585D9E91985026F72BE9
-C216009AF01806AB043E51DA494644D61AD7379C7F93F17AD0F164D794DD82B9
-077118A0426BF267C12997090821C5E01202BE01A1BA5CF130557EAF84E2AEC0
-C83C03CBE7F14C63884CDF25E5248C45799F080D281E3F9FD932063E7EEDE22F
-0B2F478FF72D54E68FDBF6AF5A8BF8EE06EF6C30A5E061D14A512075A873AE5B
-5DF02D81390DD9597AA8E902459BDBE5A6A61BA2E6CEC7C563DEDB2BC950B307
-CF22643E985DE1D7CA84881D19CAE2A205FA5CDE59420353F3EF23FDBF391FB7
-38CE81218276B2960C3923B47EB52A8429A50E28A607D5242312ECA5536916E1
-8624CD1482AF8AD52857F38E4E689F774B55C3946C2012635B911205A760F77C
-8093298C200E220697E6F3D210C88B3E46F2B2E931952D42F51FB5426DEDE03A
-05004DDA3604F38CD65473D13877822CF615C299308395A213B5D666EE06B0F6
-C1ACC344BC1037B5C95D78BD424522F051CA1C03F9FD11EA355206230ADB90B8
-E274770F8DDCDA7C3910FB07CC477B04205A6434DB34E69F3B69EEA2ED6FBD58
-C6CA944822B44062ED2F5B0AE86AA5F40E0B171D158CA1A57E5C3240A1A721C9
-92AEBF5D4075D78D772E1364F9BB631CBE1086D4EEE58E6B4D6BFDD7581D2075
-EC0FF81EC590A69AB9EA6C38D91A3D763A1A85D9588741BB657A7CE31A9D8C55
-9AA83C9DD8321EAB44CA22827230A11FBC9CB12992204FD936401DCF9A71D190
-C9C7EFF35FA97ED1EA2DA3584CDF3D66C545AE37E2403C3945DFDFC3F08A6C76
-C6E3F7C9238492D7022B904C846CAF40F0D571A39FB05B7F359C869081274F4F
-3174CCD65045AFA181235224859AC3B5A708301033D0DD449D0F3315C59EDF26
-94B3AF8F8FCAD728C18B55A9A4283D0A257DE2C36F2066A31EB0E401C34A5861
-1E4DD5C81288469B625BDE1B3734804F726005071BED0BC518D0A1CB8C45CF5E
-01E344C48668D815DF1B3087DA5B063E9C6D1232D3337DF90E71D10A306211F8
-A360053722E799E182D22CE80F4B0A7E118806F6D99B4456C539DF049BAF6694
-A9EFC7B847D0C45BF90DEA76CC68BFF4F733D246715976AC5BC56AEEBF3783F1
-15A79B960289C4BE778BB63F8C46237A84D9881B40B9562E460ED08BC770F6B8
-97A739BC2A060A76F1F1280EB07487F42EDC0C9510388CFC618A311A3987F4F3
-B464489A974B2F8C2375351E70C95BE7A7E25777D78FE245195F9920C14688F2
-05F350B893547D619300D36C58A8FA419F310A38AEE84A714BC8D0ADC2166D13
-80BBCA7400C6AF8687E0F9690EE1B71538EA3534E43F035B24532305E07133AA
-F43680AAC2EBE60674F991234FCA58A01A4BCD9486599B2AB70FC48E0533CA06
-C2DF386E46617AF45A810EB56C610168AC4AED960EC344187934EAFC3E1FA3EF
-F5010ACD71A7A902FF0DD4CC41107189041A71DE11A6BFA37CB035F1C14B8161
-9D70DB95AF381AFB800C99D56A366ABC81B4B463DAB84ADFA5272FFEFB1DC405
-11A92D7CEB4D54CC1C682E3BE2C0C2E671DF073A96B9DBF014588B663BA73768
-A7C3D4D546D8B59BF7447DA941A52D295B8002E5F1C31ACA441F6F55DF69F515
-19212E4BA25B340E9740499986A387E9B379F341B3A2B4C0D0E79379C6A2606F
-744E13D2E415FCE686A2DA21195AC7431C9AD3F4165C7635DFAEFE5ECCAE5372
-BF7B107E6363B7C97CABF67A141A2B7ED27B415D2CD730FA62CA1C8900C673EC
-373485615ECAA7C4C7A187BA60AE6B4E6200EEBC4F421689E5578A29F16719AB
-154C41FAB20E9D262C2BFFC9F6C6394CB841E9AF84A48376BBB637EF6BF45330
-346CAEE1700DCBA3C1E0F2E75340B6FBA1721AB007CA80EBE1E66E785B2C9568
-E570A8101996903075E3E9816741BAD2A30EB96430A5710348109270BA7CE860
-C227023C77730D5CE4D23CE0D48707AA4C314D6E065EF55B5E0A83ED927D68A9
-0421AD3A6BB10F27DCB22DAFA033F15BBD985E2468490DCCBE677EE57061184C
-73F22395323818EFB3D0906537F0881FEA258E8ABA6F89758F21A47AB72A79E6
-59C9F0737C23D76F95B80BEF922C62502C533ECD80C618C1814F112EBD7616F5
-D9D42153E5DF0B4F844B66F5985A345E26E93C259D36FED6C9751BFDCC82A233
-6FA4A91926D768AB042278F2142C51997A27CC08DCE7985FDECC2F99C25F5F04
-C48C0C4F532256581490B27931E1A472C7895E90520ACC252E55709DCEB8D255
-45C0B5526F339CACFD8A94A1D58958B239FAB094424412FB699FB5A036BEFBA0
-572D5738B2167771B29D3ACD92667C57B07D7AFC1AB676E600823FEC83003E43
-49F0D3F7CBCA7D7BD764C70247299783EAE00B03C09ED5A6330F1516600BA52D
-E1832F3268D38396776D36166E26BCA5252A59D3A9DE42A84969092761BBDACF
-6C5E83A69C03B53B10FCF95EF76F91F7A8EDE6E450CE253F373FB9382FC84BC7
-833F464126EFBD42A486308AD1A30680F7C423EBE1597FE234E510FB4F2F0F65
-E6CDCA4D2C5BF86E743A39BBE78D0E4A3D56B04588EB457D96629CE5AE95F268
-87E3B49D66C2BDDDD27E9F1986BBB313E33110F099C9F176D188B7594C965EAF
-AA4FEDAFCC7BC9E7BAD2E1C983D596844DFE6F321EE15F109150CAA6DCDA513B
-78D6D3B8260041367FA44C058C3EF84A37DDDDDEFFD35AB50664F7DD9C856D37
-D5C6569718DB3A6C869C9DE6257E06ADAFE2FED0A544F5023A4452AF73771AF3
-06B737395348ACCBDC9662EA92616D197226E424520F68D38E80537926DE94CF
-13DCCB715204C3DDD69DE77BB00334FD3086F8B961FD7FCE4B565BA524C8EDEA
-84EB69E3400A075561A19AC5D2AC8786A68EBFAC2860ADF804AC53BDA205AF27
-37D47F05DF295430915591AFCA00CFC65B428CB41EBD97F229F171C8995887F9
-8F99C0B45CFA0787C9B23EC73EEE85AF1ABCCA5DCADC9124A41671ADD3C33BC4
-2BF955421C3D563B1741C5BEC1F28D2011FC1FFECA792B31C208A9A02C950397
-74ED4874D55F2EC1655102672BF26012D747D46563CAD7C0BCF5D194B0EFBE73
-71C1D68F3AB20B63D083F45945E1C5B21C0FBA4FD11597548062C967CCCDF68F
-6578505652468F71B803C9A4DE8093A4D0FE29646D7F8737E565EAA3D9F6846F
-5AFAACD20B44F58F143E8CBF9C236938CFEA98EC19AC08DFB881F560A2ABA6C3
-45E6E8499338F1ECC0B7AACA6634485468C0BBED3F99D6A304BB5968EF8345B6
-AC1683C7E9D4EA6BDA3BB7D4EE9E819325D0BD1672B65C0D213DD9B988476936
-7948106DB8A26C2F6A511B771CD57462181CFA3B086CBB508270443C48EF7EEB
-7C7F0CAB757FE1A1E62C26C079AD2DF5C2A1DDC919F59D7AFEF92DA0B1B3A34E
-9B142C92E8EC6A370DB976E3D112458AB0580EB79E6253D01E59A015278698D6
-38684DCCFE13D476679E1CE55D565D5521684B4BE62D0CFD7FB961989C011660
-E79F7A051AA75872D48629E5A1598D29E8AE353757DACDC027C8408E3E027B8C
-2304B2F54CA64306776A2A82017F5C96BAE8DC9D7867857D772DC9F4AB8B45EF
-F3CDF3D58B91557E6D39CAEBAA8F3D81023C344B2471128BBB0632FC6F05E9C4
-95D16C636DB9858D1359FB36B301929881F09E5F29B0C2D5D13D4E598E1C086E
-70141315351EC33C15AEF4FD6519FFD5352CED5E5A878FBA466F1C0252660F79
-29B1428E9D0467FE26A3E1D22B7B47EE8929F87D906923BCB7192DD94E22DE58
-A49D4BAFF8DEF1078DFC049BB16420F6F968B2F6AE8CF8FFC65DB1AB9A6EE972
-C89FC33EDF480124696DE3FC43BCD111108C9FE08482A3BEC819FF71917C5118
-B38040F48D74E224B495B90667A7A678A9F55DEA4F70953B38F97FB2D3EA9B9A
-6E5B19CC035DCCEA31C8FACF62CFFE9DC86DE87815BBF5B7F9D4EC7322C3E658
-BDCE94C84A4D747531AF85676C5405242865E9086E77FD8C51C1A5984C9D8C1C
-7B29952094DC47D9062C89BB7AE2279B1B92DE43BFC54C8D236E546D0A3B9B24
-A143F5B47A70FDC724F45AB788E3FD7228D4991B7AB0DAC1588F290FA1884EDD
-5A895972F0E76446925A73E616C93E0DA74520929A053B730EE97CAE5FC04749
-18F8E2B87C210C799CB0AB651AD24D9749A2D41DAD03E94DC779312BFB90883E
-3628A822946BF8F81023F2C0B3DEF58D73B11493D6482FEB44DB9BAE0FFC52E9
-0BC04A6E50FEEE540E4E8C8BACDEDF32A3F09FADF274150134AB3D62AE0A711B
-0B30F3419615E7F6DC430C13E976246B470440E759117045A4CF8CCFDD9F0E2F
-E1EF1170FA6B80D192C34F01E472F8CA8978EF531C13D5BC6571F7C3196584E9
-06ED32F98FCF35B50BD2C4DEEC9AF9475B79FFB95024D3ECAB0522B19786E083
-5B86E984FF076AA82F707048BAEF3106EDA9317B42AC8D3CBAF0B9E21D0AB84C
-957D20D768C903AC512A947DA6119F151C1247B23CB1B52B7DCB17C5A6A5205C
-265B78795B1D00B361778BC7351787B9ABC1CE5E5A58D0B7EA5EEDC3EC71B1B5
-BEE69671010F9F22067E99B01575464E9F34574E1BB7464644968547382BE1B7
-891A84149F9A5F42CC21478EAEDC5567A0D430A296EAB205368B068AE66A1B0A
-78A65BD2C23B4039CEEEA7903B1CB11E476C1384A332FFB687F661A368001C71
-722E27B624DA1939FADBB5BC7086FDA5094001B50895C70159DA51BA742D540C
-2216A1C5BD55E2FEF4E71561612C02809C69C21A072F46FBEDD83935A9C850D8
-EBDA855336501173E29F765129023E86D29D6CB0F8BFEA01229DE5369B143A5A
-090B7315D36169A8E4704BDF62F93B949662CD574211CC8CEB59C02E1A061A44
-0CF5A59A05BF9D4E71F5FE55772FF327119B585635EA460B3AEE5965DE139421
-BF947637683431ED8EA28BF1FD43F8AAAD8FF22669DE5C867E388A30D0677B2A
-8168BF8243E3E7D7FE9DEEF929735B1708FD0685C575E96A621EBE96EA15C3BB
-888D276E8923D2F7C946B11D5E7AA212219475D90CA4114C879783235D636B29
-02E43A52803BF524F84603DA0D27C8A0EB4B3B84C66A0F270A49A0BF6E5148EC
-EF7C6BB67144ED456ADFF8EE21371FD8DEDDEDFA42B0738DB69E1BE864CBD632
-EBED5E9C457FBF80B2D1DADF31A63C86144A1AAE498162AC4DC9E04329792111
-C631C12CDB2281987C5F9E12625B8331C3355490C0139A306F7C0E8D9B3FD198
-D77A0D2980599D64829F5B509C5E88AC242BF2B0D6EABC04E8A25CE812352A6C
-8A5EA0335322C561559BD1172211A0A5F5B70A8711B2C277E668A47C1E254047
-298EA350947CB275DBC85B531DEB739A78C504FE2D679AD7D3811237D5349D6B
-454A0B44051150C0DDA3728510A321DD25BBFCC7CED07D88298C30225632C5E6
-627DB302E9AC30AE902B82DF0ABC2CDDB55EBE98D1213C397780931F58854D9B
-C355F7EE7BC6F526A5EEA043FAE8BD740D2713BCB352811DB18A253291A8D465
-EBD45B9E21447B5670D47815E7D04C00EA15AB089EE92683E6242C8948A3FC16
-50BB0BADA960157D20E3AD217C5DA1563A86FCFDDE2D274692A0EE47D41227C9
-1188D534C7F42858D0087713B9829DB97B31EDC82BD05AFAD4B4CEEB3554CDF5
-56F79FC410FD577693706CEA58F300F8158EAEC1ACDD7B0F2DEC83EFCF850B45
-40A00794BDAD3C43777EC8C9CCAB480D931093495BD55F39BC6D33DFF3ADA062
-EE643B9B84086693BB70A7AC9B290586403B43F4F930894FC0A3A4C9133E84D2
-7A144EE9A60A6EE3AA5076ED1BDE8B56AAB7AC243E8317343FC83ED2AB33D0BC
-6A130EE2087C0534521954E77121B2F34D00BD2C6D7B29E6B96D15CB1BE9D144
-6771C1CC311CDE1337E2122076006C84659022B235D597551AE45287BE7CA489
-1B0CCADE0B548A0850D29B6C1F38ECC3E534E37848032818CEB1962A7AD21DFC
-F4083B75C000F0A5D0FD565F1737AEFAEA0083F3066B540E93EA4C32BDC0D5C9
-4ACE4E5131877B46D2BAA122680620903552D738E225E3D89D41A391D7F492DE
-617FEBB74C31F3193275F2E456E705C0126654C36C9243135BED4ADBE26B01C9
-7366ACD0DF11A3C4DF0771007B319462E4396B8F644D67A5DAD7F747B9FBE502
-02D24645EF82BCFAB980F80933ED035D6E31549503126EC31B8D205EE4EBBF82
-56CC51748F061A4322593ADBFCDA9A704BE5FBEB0E733D025B4BD81056ED0A03
-4EA60DC8B3853A5AA4B3708F0A9786AABE370627C32A82E588C76F8DC6D99CF5
-ADBE29DA22EE31311031FD37408FBB7C160C2F9895DD2F2E40D498D25BB3FD71
-A28B9524619B60E7696833F73B5A20078A6330A62456C15EA5EF488094536156
-4ED0B6A26E6EADAAFE761BB8494E33B4D87820961BB5E38BC45055C5921BFBBA
-665611136B7400F3271A865138B1BDD4E6FC6871A4E9AA7E447DA991C4A894B6
-B3D2A552639CCC2EAD55A6367B500F7793F9DA332D5AA3B6A7DDC903B1E5C223
-A5843D031413ABDA79FC810E408C352A0FAD6401F612F78FE6601A45497F67A0
-E4047A1953BD656FBF31FF37789EDB624977D7D7EBD79DFB50EEC4EA3F89CBA1
-B88E2BB110C1BF48EFC58539F2E1B36A5B9CE6891B0DA32BF6CEE62DA5B9DAA9
-B9D6AE4D088A536F7C4AD89D079C9E4866073EEFC46C46C77255420F786D6AE3
-A8F397CA9C3DEE47594C109B794AC7E43001E6CFC374C415E62095C7FB05151D
-21675170547234C3B3EE974FE929C1FB4BB2405C28B844C82004F533F4BC6FFE
-F62BB9F778F81A3B28C7D26527ED751763B8FCD7EC02F565533433E11C1869A1
-E427023B1041B70252EF1C68758BC8EDC2046266EE0518264C8CA97D6996924C
-0EDB3446A9A7CB910CD8A2AEB08B1E35F71F9CE07773F3D2FBACB7D9A4FADEE5
-3B51F1468EFE1E9C7B51DE91BCB86733D77B9D11828F6ADD68F72B405C41CACC
-98076A626DB8F7AF19B919834DCE03391B7274D1B1D9838791D8276DF09401F5
-B130C9E744BCDB98D02A68BD1D860A54D8E6564144688C0B43BF0D56917A2AB2
-989EFA8F599520F2B19EF6D8D92138EEB8854546DB669CF14CD5ADC9C8F01DA8
-20F8C5D21D0617FCDC8B1A7D7BF6D880AA2B410A98CCC8F96AB191EE1F64C9E1
-C9AF753B04757489881B2D16459B7EF2F612E658C62C32CE17767209C5FE65DD
-38D736E96F29CF8F8B6AB28FE3D6F6F48FC05FDA95BE564B762B456DC4B86575
-014BA2B041B05FFCE349DA27064514CFCE004DB9E05F6C1E516B00A948EAD74C
-D2F1CEC1E150F5533B662CFCD8AD232C2666401BFB7679DC7530204AAF2FD7CB
-8114E3A2530EAB6F7C75EC5982B8816C7AEE1D69E567C0934EAAEA4B09604564
-B2F5416576945A152EFD7B85B0D1F53D4431524AEF0CCA43EE250C6FB1A6AFE8
-F92C3B67EF9DBD5F8739B064DD4826CDCDA3673FC41C521ABD1DE23EB0700C50
-3D202646191A6B031483AAA52BB73D98F17B361B8DF51B984EAE2FFE0B1F4D5F
-DBCA6362C76813086B3296D1AC387BDFAC50164525AD253A46F52792316FB237
-45EE6E4B3B4C56C2420AD3DE65421E5A90D4DA797599905558B336C01856BF9A
-F77354104FD93CB2E90B0E5D615A2E2CA4F12C3501D0863396290DD285DAB35E
-79A8C8DC6E340A0F32CCBA90FAE28FD3FC95710B0D0C5757D97102EA269A0A10
-652E8B9F9517ACDF09218926563F25B6151D1AA8D79732A403ED88ABFB0E7889
-543FE0D96A0E1245DB8337F8EA21EF2D948C0EE666B4EA53836B33359085AE96
-1709376A742AD8B181DB35FD583EA24A5B43B1294D9A144065767659C9DA490C
-29FF12165AE21AB10B49A5FF797E3F079A645648C687ED6F44EFFE79464D5696
-875EEBA4AFB09F3455EC2E0122A7E91DBF828906BC05E6DA2ED9D9BCEE5412C7
-3B6868267C29BE95D732BF9FF6CAF6084159425D3CC6AEDF7E552BAEE821A9CB
-1F806C46A138A2C5F6765F015C4C27F6521BAD1A582326333BC11D14F7F5C83D
-464109FC2BBA092FD6DB0FFE8C1408856DDA1D6F0A04F831CBBB9BA91D700396
-1F3503C4898EA49E922A556A085B9D50D1493176C9C740FCDDB1A313321B86E1
-E5C5A295BAE5C271D536FBF8B31C95B6F648FAC4DEDA02318904CA443DC63A16
-BFA0CDCA75245A4AE420CD20DD780F2AEA6388F84A8FB42BFF09F9996DCC5844
-FBD0850B5E46824C6C5452E34A39E0A0BFD082E2478E0A0B2AC9253B4326B21A
-DF20260F9E9D36004984C074B1419385A1C52B3606B9BFEC246E26EAF79C9964
-C34DA47CFF84D27DD210251C784578B1BEE835AA614695107A4CB67298C47886
-9FE67FEFBEAD028894151095F8D728CBE7AA066B03518E2EF6A0180D050F04FB
-12E9E7F3859A223303139EFA0CC71138FB807BD816B8D83AD3AF3B3F42B73F61
-F95A647C354C384BA91BDB1F80B1D756FA5C13BC4AF763EECCA28D2627C81EBE
-A34C6BDD97B0F3514F9B1A0E3A30D2B07CABB15EB3EE9E3F530019F5C749D314
-5CA78408F38325F93B97F5856445395F7C3D8B98AB1F11358F2CF97DD723ECB4
-7D9BE2DFC6C0E44AB939F235A1CBC300015BB9DDDF9A0AC9B7EB1EADE2E947DB
-BEEA69328ADA6C95EECB9FE886ADF89287461853571EBB307395E2058B2478F4
-703779C0516D8F56B021437EA62B26E57E6A023AEFBC3C263A0DE6F365BD527C
-531072303C7E6230266C34FD2C0041839B11D2ECB7274E7C30CC584C8C591F5F
-C8950B9A2CC207711B3045796B08C8A43D7E580E8089D0B63E4EFD0F188F26A5
-8EBF298E304C8C104E150950AAC8D6E2EC9F7926921FAD5ECEBC0FBA4E0862DE
-4E1E1754BA60C7C98DEFCEB707F12CC44947007D3D645F586A132A3A7228B5AA
-79081C76C88638543806730012023A16535D0FF1E28E1DED9989E3BED625BB7C
-E4C52162FD31C0540D5D73AA9EC196D29D39192BA969E221FF021DC69F379B3D
-06357B828D205E2C4D37DE3B88FECF77B3D533CB93AC8FFC16E8E5822433D678
-931FB87D23452D49ACB5680A3E7C3543D728413168441D4BFAAB9B7833A46023
-D971EAC42B2339992915C854A53C62B68F867122956DE5272FBE60C742B6E5E7
-C8821F723450B4579DAB198FAE97E500ACC86D78FD7248876ABF21B761B9E2A1
-7380FED4EFD79B47D3E1A31A7FE648301DD9F7F4F58784DF0B54AFF457AB34C2
-A493CCF0F735C1C9F3203E59348D53D65FBDB6E24B552DB3CF8509DF3930F641
-E6FCDB4A9F970C1FA4CF1A0F4717338835895255A1E3737A588A5EFFB8FCE73D
-7EB9C0908DFFA40F8723A9319A39548E8CA5533794F50F3B6AD6BA01D48A9929
-65261FE523320846602F4FBF5B4375D70D8BDB9A559867CAD2D047A8680B83DB
-0DD38FDFBACF3678E77CDAE128A19812625CC1CFA9BACE39E6CAFBE28098C380
-17225012670F963056EBBB2748634B343C0677B09C0ED1D4B33DEA7F07B03E87
-99E229A8364F326D8F80ED4A9095181FCBDE9BC4FA0104B28F9F8CE994F1B6F4
-1316B3B768C81CF7C38BD55AC7820BE48F949730167DE7AB0B62365A9F5A4E0B
-2ECFD6F04D3652B9C1BDA8176AF1146B91789BC2BE3664D906134D7723EA4EA5
-6DEBE02A75EE93E24583B1217A61521946F7BB69C2371151D2D44E3888C50FC9
-E49FA7705BD8800AE067630191AEBB2E78C4E3CFD62DE90683910856B7FA74C9
-312EFBC58534DA5656239BBA9E102D33D2E76DD8D170350C83663EFA6D07C076
-451AC8F5F034F69855DF60EC8A88BE7913502E562FB9B64FEDA4447AE1BF6F04
-1F366A5FD382142BA4CBBC451B5470EF3D51B57EAF791499A140BB10FA70A06A
-E0B18701CCFCCFA2DCBF92BB59376D462F9D59FE114D3538880F32B7F4140E13
-F386343F0C4074277153D61460AC6A392A0EE67F11C411D68E50C9CD2BC171E2
-E4E73A231FA6311B3D0062FA73B5F5563C0357EE52FA4B5CAA9B5EFB20617661
-9EEC6C742BEF43DB2CC2626A76D03FB70C959A24F269E1FE81AEBE54D4BFCB6F
-A56B6B8BDFD3E69788A32BA3072F373DD1AA6787704CB0F7EC710FEB08A82825
-50859DD1DDE613BED2F9F0891F5533816ED8137CBB3D7EE93D723EBBB3EB841D
-A4EB010D20B870CC5C2C95E722E77C639B189CD44285870666494C2C00639F56
-D91A6C2A45F4C45D7D904F1799EBC44720410E1A0E32F100FED8D696A7031FEF
-CF56C7774E4E568050487F1F78A86C968F82579D9EBEF42C500B23BA00A7099E
-275C9BAD491D22755B542FEAC98C1B1C42EABA3A39C1C312767820D264438F67
-1A65E314A633CF3E2FAD7F83DEADCF62117446FF4A4B099A183342916F8BF57F
-A3D0BF61D2DC3726FCDD3A4F7C723DAAAA40CA0D68460DC2D990B12C405FF111
-4F5B07278ABC51A7DFE18ED1596AAE6208F189D8CBBB50AB6577E2A635205E16
-F78C97714783DB67D467EDD804B062FA8463BCA130D5A0727BDA392C22FD94A2
-25C674C3B4435BF4436432249C48347B7382CAFFCEF88BEDAA614435269DF406
-B9D5011315265A9525B4919218D9B932F3043B3B2B4287F04F12DE69080CBB54
-A11A3BF8D59EDA74DD90EAC521976C7882CD8571E764B4FC566E3E08B1E7A1C0
-7F16BD8A1C1E4677415E9547DED46BC202BC1FEC8741D71E285B87F8C982EFD5
-C201155719E4AC66CBDC95012913031421A36455AEEAD59F24134B2A78C93812
-12B1826E250AB1987B31C6A20129A2EB557BC85FFCD1DD36C678B5F39388E7C4
-1D4B7BD640ED5EFEFE063C9D91308850548BEC011A487B9DDD5E4F032CE0F094
-D548572784220981B268A932922A79B9B8C16FBE12E6D7EA801EDAE92079407E
-00312D7BACBEB5C45B62BE9532A4C81D39658A187E1EA1F4C16624A6AD1A56CE
-5077F62EDEF7E3A07084B37731A237C746E6D89167EE41C278D2865055685107
-CF73CE1A574A47AB40792DD4A970204B8498C154CA1CBC5A23F270D44742EB64
-5A7A385B37BE67CC817019EA16BA310A19CC3AA2A5DCA5C010B76D985D4524A6
-3643492A26A249FF85944150DAA4343B30D77D7639F4076350D43D7E33C677CC
-8DDC7FC142D1D376E98C8E2AA0310287D51168F29612C4C421293E23C5F120E5
-268BC1932C4F9DD29CBBCC08734EFE71678BCB5CDE4B5BCD8635F3009B631D3B
-C2F00A38CF023D09AF6A832A32C7E78F1FB9232FB9AA5FAC477BEB54561F25A4
-BE1C23C41A6B1A8F49D4057050D846A50960E64246361DF2B1F829CAE8A81556
-5DF1055F9DA935D01D8071914AC2A89223C7F14AD4C36512B62BDE4FB699BDD3
-FBDC8628B9430467A2B79C4225F060419087B0CF614464F93AF3165A5366250F
-72778A1C0BBEAEA0DB639FD61F5680B6A2903EA8FD9F056F77A68D10B2C7B4B7
-C772FBE5D7E3DA169257F2B6F9E3A1F2ADACBC3A10E1A47E26A58B07101B541C
-E72012DEA2E1603BBC157C589791FD069E7EAD5EC41061B8034D22FF0EA7EA79
-87139328F4D74C18721E4773F841DF72B3BD044A7FF1EAC934BFDAB2ACCD0395
-B8635FF543B94CA4151C672719E68D1540047B466EDDA89D3FB44E2D75602F6A
-639D9F99EF31C5B04299DB9F3B51A574DDB9346BFF5C978F81246026991D38CA
-899CAC9A9E91BE864BAA95C082E6A89C7514FB6518341AAD562C3902A8EA5C9F
-413CB578D6712BF142F643FCADEF165E7ADCA15AFEA3A330CEAAECD393DCC91A
-75989E3B6D937101C344F859D53534B5CE55BBDE02C4DA5FD1B8350AA76A887A
-875ACAF58CFB7B1E755FD2011FEAF1DFE43928AC8E01C09B272503DFBD21F115
-2577A6C990FCFC9A42B020EFDA2E199613B0552B7765928F2EB3C4D7ED2B4D6E
-978CB8E88E1DDF4E61A50F34CCACA8DCBCDBB2CB1C747F70071ECFA1F31C9656
-22D28A21D48AA970CA6DB819810006C3037D4637E26B9760F7BB016EB4FE8125
-0B9D841ECE3D5A3704D93F448663998DE3FC8EBFB76CDCB79454DEF45256CD3A
-2D180C96F89882EAB95A97E5EE721959642B176298959B934141D00B6C7CF1A3
-B1CB3A19E4BE96C990CF77832C665E6F0828867F3859879D83FF45FC5C4489C2
-00A8FDF187E6723B23F760AFDFBA6A4830611C4755DCCCC43F8DECD983275642
-1BF5B6230D3123380AAD3D3A8A9A60F67DDE88254A13CF536A93B326329A4EB7
-BD5CBCFA582DAFF013E2A4F2A909A6DF1465F8C1DD7649C2222E0DE04BA3FF19
-31A0D71EE85F748F964D6D57EE57DD800F105282409FF2E27A08B059AA17A4B4
-E2D848EBF8C8FC23641E2B517710012ED40350615AEBC5C115D4777117440A73
-C4BE0F4F6D73EF7B35140AD9BBFAFB43FCC0764D82E3AA81F25794DB6ECD7A3A
-6B72ADBB483D979591D85D3002AF1B4956F3A7E083BE9D6ACFDF409852500ECD
-886D3C4E51169ECECE6297959B78B813586F2075701F256137C9F92399F3E5B1
-82FF6E10B5C4CE5078FA4A71841D9C3C01AD81A4F9D80969AD249DDF63FD9505
-6B152B2AF6D4CFFAE20C111756204BD7BBDDA81A9E3BF3024D31C90D1CBB4B7B
-BF83B8C033868615017CFDF7B2FB2DA13A7D65834652CF604DBF9412366D4823
-36486DEB84980FD65C2875281D0AFDFA70EE5011118D1CEFC78FC4D4AE20AD45
-AE7E74346B8897BD97630888CDAB0461B781997541F1C74E240623B1A7FB26FB
-C4FE22401B8A4A6239B10D9E897191D185270FC4F2DC7ED13E73F9B0A1F3F0D4
-31C739380EDC495827B4E81D7DCCF8BE6D384ABAEB6447B65FF319284F0DAA6F
-5ED58695628330CE770F62CA16248B1E0FB657214115DC760182CF062D97CA40
-BC683C923DF12BF39E725FAC6411359FD71DFB26E8FBDBECA81E03CDAA5FEC26
-07A5A8F6C925582E6C516FEA20488E24CD42A5DFD29DA96E6C9A12EC451D18DD
-9464DFE4FD5AB577FC667905D9BF08C7083850C3B3EC67DB8CAA3695DF32C256
-D54ED4483A53AD3AD376590BD1BEC8C5AD3E253B3EC721F4A71CAA6C906742D0
-AB1A043660F7679433F7354CF1A36E59B40ADFF929F87B03B951D1393F50387A
-B3E7185DD68CEE7C232EF44B747356D3C81D0A018CA61E48EFCDA4EFC203AEA2
-838B2885F7B626512C631538384A58C478AFCD28F4FEA7FE149D850182A270B8
-D899D8CF3730998BD517CA64AB0A9E40956D4755D455F5A56BE4DE02EBC29B49
-7B800445211A9150A9D09F8C285D67876F5C5925E12BF01A464049BC6BE89F5D
-807E9BE5B8EEC3E1EAC7CB602C673D0E2C64F79BAC2E963EFBEEDC5E1C6710DA
-290407E7C4B81E3B8BA1D40245A1081FD81E2DEFD90944A67EADAF922C269175
-99CFC6962F9409D9BCF1CB785CFC2B59B8E059CD2A184FAEF63A7E4708F82785
-E75B8EADD1C81D68908B09B9FE30E8EDA5AC37E2257D5C689B1AD942FFC30273
-2327B6A7A6F92B6BA207979CE10AEFA56075103807D6BDBE7397A64E9569C36C
-CC6AD742DC9D5E935A8E28101A68DA4AB6224BA4544DB47247A30F98B50D7211
-229703CBF5410F964A91FDA6DD4B0A603361C3EE0B65911A79DD7935BDE86032
-44A74B051ED27B31FBE4B501E20076AD67B32A6908D7614CA95B06DD64B01C93
-14D813CE0EDD0F2FDBCFB731995201F07483A8C5ED79C56CFFA3BA2EB734689B
-D0BA4DFE2F46E9325A9E7B6EE2FCA7825AF486E0A4606D4A1E6B8C8439AE7AE2
-347BD7656CC4F48DF8EE3074C98C3777E037E8E26C6369008778C331A0601077
-14EB598297507B9F2ED2BDC03C3E29EECADF0F5FFA1225DC5F27CD8EB7D7199E
-F496EAC3998FC12515E0E75A7952C6BB951C8E782145F445E917B19413C1F702
-AD9E0180E4941769351F4DED721C0089ADD66BAF9417F5CBD78BB53F12F14CD4
-71BC0BEDD7FDE799A9306D0885FCD40BF15DE837EAB5A40EBB52CB6B4ED299DB
-B12A2D1818F135706AE013BE70F3A60057B5A82D661ABAF018DFBDFE65AA8E47
-AC6C8A798D2F3C772C0BCDEF0A9CFB8BC638AA64F95D41715353D25B2143B4D3
-7BF3852091153F5732DEFAB4D4BE6199E13D1D9258142FAA82F3EA57CDE218C1
-41CBC59F5951625C556F6D38557082F300E341B0EF1AF38FBEC6BBF6EBD87FF5
-921FF53B6C78217355B9C1C17216DD5541FCD35123EA68D57904FB1BD7B9A7E7
-3BDC01113118854E5FD8E88712E1C916ADCB543B264D9573D2E96376A03250D5
-700A0CBDC1143FB85B69CD3455E5CAFD7AAF3D2A2154E2E19E9CC8C233AE6E94
-53A24290D61A03F7CD038D15317FDE765000BCE92199B728DF17AE8D540705FC
-237F527B4EE8EFA5A870BBC588090A087B108FB0ACFB705103D027DD942D8F7E
-CA2293C9C50DC0CDC960139CC4D6384A6BBAAED1D50EC10A261F22EBAFEB2876
-76BFE0D228A14D6DB2524801192D1F0EF49BFAE7667188B4827008D05406539A
-1AFE0979DE52C462D998F769FBF62A45552C6CF1B30059B26F3336DF19093DC8
-2C75A5A9022EA3A6A35C35965A96C673FBFEFEBC0EF188EA9B3B31036CA56634
-F7F89E88C7611B6007BCEE35E423B73A63028078FFA84E73490DF2F564423647
-8ED87859266AE96C56883B6AFA0A46AF1BE64F7A07F9B9A8A69BB47B83E904A3
-A6DB8B582311AA9C2A787CBAC2EB5823F6DA66D4CCF5B5016D179BB50D691517
-130D77A7C3205F27D4A15DDB0D2062C486B59C70D0969CA5F00687A0886CADBB
-CC06B136064F97A43BEC08811EA53CA13F190FC6F8F07FC498BFE128EBE6881F
-1A4913BD395DD85B683FC2A4290C2EA20125ECA194846444811B0F530D16B29A
-6CC24D9A7F3BD5888CEF45FB9BA8598B3F5032ECF39E2A1A3CBE122F100C72C5
-071FC086C9739482C8A19195D2CA3D041EC36C93FEFA520E94E01037567F0A57
-4CF1102DCBF9670740C273E2CCDA3553E267EF8ECBF31F1FAC3B1ED824DA935E
-9E52E9586ABBE45F3B5A6409C5E779B6A0768AD6323E76606F20F40F401AE6CD
-44F2F88CE5DE95B9CA1711A877EE203769B566E263AFD6360F1312A0AB9CB6AF
-2546F112C20A703A01AB255739647E46451EFF522204A0CE985A609083F52A1A
-9ABD0B01910B4FA3E4FE3A060791E1986BEF81F9150C2AEB6391AE1F09F1D94D
-9BEA9ECB59E7E9B116128DE2205D27D2EDDF96FB50F3E1CB742CED4FDAC545E4
-9F5B5BE0A88FE7B227332D171E14DDF89EC0BCECA370EFA73C40EBB1A20FAE8C
-C1B7EAE158B5BE22AA16F12952628B2FE8F086ACBC5F778A18E7B67963975550
-735D4CB5ACA7279379D2381BC97D1F2613F79C32742750006973C036BE035C5A
-BA17EA7BDB9A8F098B733DBC954574927A16961C2B7DF2D0ECBCF742FFD781DA
-3E0A3A1278178426F4592799264BAFDF16CB96EA4D1ABA4D806C9D264095EF6D
-1067FDF90690EFCF0146A1E143798F104534FF17AD762F0355DC69F821234018
-A042CDF7D7379DC718E0865FAA8B0C757D0A19498CEA30513FA12003629455AF
-B115BC2DBAC68D4937314FE10CBBB96AF8B3F4CB26CFDBA604A7865584AC0763
-BDA317AFC9906AD0B8DCC5A6A88A0B1ED4C6CBDF5F2BB5A5037C1999CCCF507D
-AD3F6E4ACDEA803B4104BD05889027E00B027715C1FFD9DE303C2758CC38AA7E
-9CC9AEF43DC69027ACE2AC9CB078FE8290FA53D3F6A2AB73EA241E7A53806998
-8ECC1327E41B13C1F5F79A1C963EB00EBAAC27D716206FE780323CA86495C3CD
-7EDE7B2A5753E0FD0E0B62960AA8CFEB2823BE0371EBAB60C6FE9F279133E88B
-2F2DC40BB446D7C3E955243C55956B7AA576879BE1EC0F2230796408D654A069
-A93FC77990E9C0D437535FCEB32D61DAD9EFAC776FF20A7110E1F3B3C4D89AC9
-759C25536A1604BBC08D52CD8B893A50C0490691960F833E421739B7BF232BE8
-2C53D766D04FF056E6AAFACA416D25696ED97D10175CD63BAAE9510FD1CCD8BD
-06A32D6CA296C24AF84692D043E5515C5C261D8C49306AABF81A6D6977EBE74C
-51A79CA47EC3017088019301ACAAB074AC3870BBCF2F7A24760CBD344753DB5D
-83C3CAB511E2BE890C2EF39DE85FD5778B70C0CCFB18A7717C794488B1D8D1BD
-1B23DA8388227ADCF12A251D7202928644FB9F97A97A48CEC170393E8B261E26
-99635A086A8BDE8DFFF1AB3E25F1A6AC7DFB45723AEC5A0DED5769F9AC15A4FF
-A951E7D42EB97247257479E3DEE9E695C3D544785B5C1E6BD0B5F4D1619BA7A1
-623A55DAFC29AA4502274386B438F23EF0A56561EC3DFA3F85A1011338B2E5AE
-40F075D94A3EF78CE49D514A237A459E4BEAE702222377581FE3A5A6EA51E701
-CDF405444E9CAAB052DEE3E7834DAC8988EC4558E03CD0D9935DAE536CD28ABD
-8BF2392B102D2DA4FC0D219DCC8AFCBEFFD823B324C539E5E8B76E006D596C46
-BD79ED7547ED1DA6E352FE2221170EA158E6717C745BF178252CFE4C75801C86
-95074789408C86526E3E872D606DCB4E37B035482471101D8F75CF415BB55E2B
-AD747464B5FDF829AAEE09A6823BAE96F66B1452FD4C25A88934F12F448177AD
-135818B74EFD6F812A11CD02561938195F7126DDB92455434EB548A5E1B28511
-DC14E3A398F9D8C08F23B2F89370594F0E6544DA432B9FB693F1265AD432CE20
-8123E5AAE03AC7D2C9D6C129B0C3B39CD79F035754854C2ED206791498E26C52
-79BC4C326BA7053582745DA47D6F8231CEADA2547CBDB6BCC2A0858758D65522
-8180BFA16671793B335DC33670B4C7C99BAB013CEB0913B1AA5D0288ED9D527D
-FBF2D7F780292D4EEA768D04580A1BF6D292FC886D00009EA6CEDF31D2D22E89
-4382CA2F0FB37686D30898A9EB923F0A181AC58A4A519DA05A5F8C7151F38709
-0831D20D980FCB1B760C636CA2AF619E226DBC0A68741B659D52635E0D1DCE57
-165B0E2ECE8F37B58AFCB15CEF1E23E0E71CEB8AFB3B5E1A59C886486FAAA210
-71B222001AEE2CE52CA68FC3E8ECD1F4692015206665088B3E52E6C33E31590F
-17A4E0FCD13A761752BF155A22AA0E1ED55B70BC00793756AAD810A10CA9C4AC
-A3804A9C4D27F10EF567F9592731C95E7AAB6F6CFF2E9413036CC9400E00442E
-05EDD9B298BFAD4834737E37910B74063BB1E3D5B0CB4CC774FAFECCAD9ACBEF
-EAC03D8EF0141885A587B64C83660E0AC8D9B2BE4BB8FDDE306A625DAAC314B7
-B9C359AA51715B2B0DFA7D7F671B1C5EC2B1BB5624D72B7AC0483F7F2837FF52
-2899193863B63E78A39D926940FC71F00FAEFF9751C0CF42A834F186D3549393
-7A052E9CE214054A6889AC95AC408032D305B1CD6C89083763722860F875F4FF
-640556DB2E770A449647988FDBA00083BEE2303682B28C8C7BC163777EB51A97
-A20A3F99A01D5B6F2C183048B5DD93A8D445C5DFD41C909B49D23BE41A60F01C
-1D6E704C8C5F9D783C224B70E56009569C54D5F64423D3BFF8DAC962FC050128
-965B9870AC96D51CA8420FA8420FD88F6C7B963822BB292F2B00297C40507A70
-2A32271F34B164F772763415FADDBE6ACF6EF3E791E69EB0557AE5693DB0A20B
-1DD6536F9D74BCF1C0265A4A88C31106E169732563B2EC5AAB3C0768AE2DBFA6
-4B2C5F7DC339B4BDBE3704DC48633BDBEA8AB3195E9C4677088C47F074D28ED9
-4ED5F03A635888050524C82BAF1087764A217B1E9585C6C38E41A7A26B355130
-9CD809919F9976192C46D2581F984E71B6BE7E626202B45B414A97BB4963E609
-DAA06B99E772BA4C6FA7DCFBB5E2AE2E8E02358DDDA48EDD8B46AD558C1E98FA
-D23EFAA66E98B1C49C08BE57FAF9DF8F246DCF7FF9DF21C48DADCE837A503D55
-BA201BDEEB84553DCE5A0C3E2EF0BED804315BB664EC9B8459E09A203AB28903
-9850DB3898EF211CB25C20ADD50EF5439DD13CBFD14000B15424054E0C2147CD
-02098784127BB9411E4C96D30C16706DBA484D3C2AEE11D693ABD7079EAD3AB1
-61EED1BDB6CB6FF66B9FF26D4BD79AFBA78FBC53E7F6AA1E103155B980EEAB9C
-ABFAF83A91206CC20932DC36910AD39DEB52E5C0539DC99C056A287AE661B13B
-1A2DDE0AEEE340A727006033BC6636C743D310130EDF6383747CFEAF9BEF1D60
-8E851A71F212CB203175FC6A58EFF38A833D588A1AE6457E269045C40E432127
-ACA54E03232ADBE5FF45C23E025665F43DF522F20E776163C6B7D069B0EA8D46
-FBE3A12ABCD9F5C249299B57ADEB9B9AB1444F42837B39B1BC6C4026F788CD51
-93E52D681F719ED741C7C9FFE946F665494F17C17501988A509EC377AEB8C87F
-8BB6348134BF9806C11669EC6A43DC9B8FD334416DB537D1AC9311E69417CFBC
-1565476D77E4C3A1C96FDF49E1F6D62302B571A6FC3037DB9C2ADA5CFF15A110
-83FEFFFC074621E9ABB9C62CC3969B6C0864C41B757F23E189788F0A0BE16026
-D1187D48AA190E42BA6ADF00B80E44AB5512DDD195C376CBE0825343DCA082CC
-411E26E3A71EFB7BCFA1B43BCE6F86720E7A0D2A60DA0ECBC4C3A0BF5FE07553
-16EF96247BD1BEDDF29ADEFFFB4B355ACE88CC5D4A37E7D7817B98B2B1E4A524
-C54434CCC39C7A5869BDE8C5D9E3098CA1B65AC57C9D81D1EAF711423A9FB92E
-C20F18C80E22E7731C56F60703C6604EDDEF15F234A46F8659C724595980259D
-35AA0847B7E96F0D3B3F4D9D1A82E8742CDD1FA2058770AAC4DDA727C506C700
-9A9F93144600628C46B6E5904B7CA98D21F4E08E6804D920AAF68293C4F0666B
-1742FA95AA85FBA95037D9FF7E65F6B503D22180437AAEBF65FA8901C1903EC3
-896B213EA46EF7B5541B74F72EFD07C752BFFD26B8746019D131ED8B94E23794
-A5973768AA9FB961394105930FDE07BF0D08218CB985079BA634D8029FE54CE3
-F758E2C8841D7E2D1D8DED3D2D69E437597B28CA971E8161949BF5B71BC1EC15
-910426E7C2855DC776AE87C7482DCDFB994608C0189B7E24E2F16269068812BB
-6F1E98EE8DF82468763810DAD7CE08EB0896F7D5342BDE3609522A4D6670016E
-A837BAFE7CA0E712D9C68580B5A30E544C25A956EBA242C73DCC40209CC0E557
-D16ECE17D18FEAD279B4143B5F3C69F7F5087D5CCCC6387CE3745FE9FA4FBF24
-A239EE87218BD2933BF6FDCEE282EEB8C709303B35D6A8D9279917E28FFE2CB7
-7F7843C0D4BC1A5A85818F3417B85B416A3EB78C00CB196CA920155690D58079
-33290BE8EF54AC6653D30FAA959DAE3D153426163119BBE5F4D6636AF877D304
-4E74FE984B62E07CD1BEEBF56A26B5B2CFD7E622EC2211DB6368086807F8CEF2
-259FE58C1AD88A982DA8CC8E3656769F2BEDC9B1A1A26985BC3F4AF421DCA42B
-2F70334F378D6ED76EDDB59B3B754EBCFB8B35FA47E9DF5CB209BE0518F9E6C7
-22A2A537A3209892448DF436370F0E5DC5E50EC7691C720B26B5027C2FD0DCF6
-BC303E8D72FAC731E2EDC1E2A70C0E51CA0103E7F97727583E65ED760FD724F9
-D318F10A6F16A98574ED667E810224241CE1E674C20EB3DAF738ED6BBD6360F5
-2BE448328D5279BC25C35F2509B2B77BEAADEB4C8F915C73888C953D40417510
-684D630CC51822F84466E3BD89BBE49D4F01D3A8AB9FA1A4A0095A76E95D6D1C
-222FA4123029FC4CF44F1E0BBDC820272D681B7540CB096976F01DB1F8F42B59
-1954DFEF62F91CF5D72849B987118BA52928C213EAC75A50B61A7C1BE41B1AB0
-0EC9DE839CB0657A17D9B40BFB7D1A9E101C359E27168A641AC1821760EDE5B3
-53BC6D9643E68F49F87B75AFF41236A9F59F9929BC6BFBD4344A325F5C6929F4
-B1B977F84ECFAD8F885A3D4CA3C8DA38536BB5B76ACBBDA57F882F372EC4220E
-1DE5276AB135BC50ACFE5080E281D2243CBCAB5465F18682B09942C56456A432
-7E6C3BFB691FAD4BD032FA4CEF24C1B06CB560AD996AD5C9DD766FD65D3A9C10
-534B84AF27525C7BB98302D952A4469A17F850AA95AC91962AED0C8FD8632BBF
-73D29C76285F9733EC29D5B6C7455ABC96BE7F4A3056364A329158F29A1B69DF
-AF0BEF221497937A09FAB0C4870C8EFA15303E8DF5B1451805AA50172FB1A797
-02EA9CAE6D6EF65020201A5A0DF800F80C02FF591D1BC9A4E504BA01F48CDE72
-EC8D0FF70B703E749B60A1589B1D80F9E71E8CDA61E7580C12F7F1410353FC3D
-0B1604AC55094DD12433E043D958B66E72B718697A209BEAC588407D4F89430C
-DF029CC69D52297D801E441FAD734ED519FB78BBF223A60624740CD10AAB1C38
-56534B7525561DD7776393CF031A5B71344809979D150E08BBEBADC84A7E0036
-870490909D120C9614974B2A06D30ACAB28BF9F812889932DEDD470BF2D1874A
-106489BE6CE558BCEAB2B0685EE12F7F8099854ACACC27738BEDC39F1034B1DD
-08B9D6A0EFE43CE60FB97E9B4C0A2DC5B9B61944ECCBEEA72915C03FD7E467CB
-FCB568DD452C729492D0ADB06452F78E8F619A6D4BE8FAC82B3F3BF301830D6D
-2773D4E95DA7FD8C38D69AC9BDE1A779AB5B170120F4B8BCAE745FF4F56266B6
-ED9D14509CBD0CC4DF264613B1B021E8029CC0D22F06074E174B635C4C0DD15B
-1C2BB2B53CDE374E4E6520D38D8664E9EF753B1E4D7244E071912547E0275504
-C0266420D5F18027CABF3061B054AE9127C7D13007B03C0A4FF7D71ACB26D732
-FD54BD1227C94BB259D8AC8B246F666D3452BC92CF4264664A28C6A744C13AA5
-11BC7801E7956F4E5113500AA535BD7B5225EB693E8A0A8FA7038F789035EAA7
-B5E227C1CB68C3A4AFBB516DABB82592D5FEB58529BED646E3A0E8C0BAFD87EB
-CEF8B46FB294B2EBF7720628A3711AF55CDBE85C92A7B0AB3F1820D6568B0FDD
-DDFC91A440CADBC88ED53DA9E7C408BFBF59CC87853203E3FF707C55BB314805
-C0E9695DAE783943C37CCC94C7387974A5C88F1B9FE40CCDC5535A48DA86CBF6
-A6A155F451AA39CDF4C010C66ED11E3F4AC9FF5F78721512E8757B77A301400E
-6FDEF7FF640B85EB573BE8D3CF834E45B944B22A01DF1F657DBB58A071584A08
-D6943D1E1A712EB23E749BD181C8FDE4C27CA25B9EEFC1BEDE9E99062D83C20B
-8CEF0E7E7A7D40983B8C09871B41CA0B3D414E6B503DFEEBEAFB224D1F129914
-67889FBE3BA7C43423D2851045E70369EF98E0FAA1DAD562894C6C93D76B3A20
-B73E4C54E735613973E6E19700ACFF7ECBBDC340EAD2AF295A2F070AC4433E32
-5678B6F710C5545BF2721D3FF8A895F05F7F5D8BA3FA244CCF3EE68544098667
-EF8DCCFA2BE9DE5342D1FEBB4F074A1DAC4CA2DBC82EF2B85E7C1C3E750AFCCA
-1FC22A49350D891C052F46D2C04C50BA7260B0B975C0996820BF66F9DD100B26
-1BF9CAA3DAC323CBE5BD11B75020AD3932499ACE1C5350EFEEACD5334252EAF8
-04B2A70F1027AF7D0CADC3AECD739C9CA5653426CE0104D5A1D5D5893EE0B068
-D5F6AC8F6413214052045D650997D30927FC5283F35F6ABCB5BC05D92A241271
-52E1293BD8720727D530A4B368DF0AC5529CD334BADB1F8677D25593AA974489
-2F9F548874FECC35FC83814651A33BF12C79C53A35108C45AD8B0C1B1EE0333A
-61F52F2FD2367D066F3CCB15595B21031EE2C1AA1A76E103978447A34E977FD9
-664B7470201E0B68B4206CF910FB57A357DC43923B0D7E29E7B4B2245097D593
-DCCD25A270E762567ED47BF94B6301D7A996B13CB258872DF5302FDF7F0E7BEE
-0BFAB7FB65F0DB0503FBD7C66371305DCF168797BE81DECAC68FF3942C9ED677
-427BC47B7AB628A989B8BE079A81B2CA513D69944B03A21C59E99D1B38E65AFF
-392A9E10AE8C6094EFCCA5B4D2CAAACF88B6DD46420FE2858794BAB331A31466
-28D371C206865FE867912F5A7249AB90095B075A2184D676A5C7E257A581F693
-FDD8B34A77CA78F06B674E06E3C4596AE9DBE770A51A2FC5D50DE3744F858F63
-2A810996C917F1DAC470CA7B462684908FA48884514D67ED5BDC043CD53021D5
-9C701A1D62D9791506430BB45CF1362B4E8364A43E7E59EF5F44F78CFF4C2ABC
-00CAD79E6C2A9ED58156E27D74959BBBD262EB44271651D95FADCC6993C4F789
-008648C1282411014B9F1EB5EA7F0880A80B3B24860073C2EBFEF40CD1AA93C4
-154CA5BD37CDCCABE50C7EB3E5933124E2B3B5451226CCC20EB0611F509CA7F5
-5B2783812F6F4C1F9119485933D8E441B9CD7B18C88E193114613F1B55BBD2EA
-3083766C3123D53F2A968F4E0F4D48D31C3B9DAE4FBCB8CA79C5B53EFA185F2A
-12E74835F5DE5CBCF32353991DCAFE8A45336264D7C1DC55EC1249FE846B9998
-2E47E6D855E6C56E18CBBC60B84B0AB44A4028CF9AB16F03740EB584E81491AB
-00845F21486A1F903378CBABB122FB199E33C89DAFA54F3AD43EB6A4A3B9759D
-454E8E3C14FADB4DEC10C64810D3427F1EB144E47A429C8350A99391C82BB82F
-29BA08A51D727FF0FC6E7D0823A4ADB2B40D00A96F00FA7CA1D5C8ABB86B3F25
-5CA86D9C55020908DC2C8371F5BA6D999338C7C9E06B28FC1B1B3E5FEF3AF0AF
-FF412A76E841CCE583CAB8B89C0ABFC585D365B7D071E6E35E40002A0F654689
-BD1D5647A800FC5AD97C20F84E9A608F9BB348EE0D3E9A542B4262BF1F424558
-D3E455268D042F048B4760A6C2E6BB9A783C849787F9F02B98C356C1BAD94634
-2485F033A0CA885570C419818C8203CAB7B9FA6290F8A62EF9033713D1257064
-0E305EE5170A4DE71CAD89EE2C0BA62E9E69A9870DE74CF52D0DEAD65DE2A291
-2282FAFEEBC0B936E91595F7C6E0BBD33E79FEB2ECBE04891F1071D631B3C9EC
-6305879468CBCA461AF927A3561AE15A463B24461B9960474005F98892057048
-6419A27D3A51461C9BB9A0E8E621ED1F536937FD0BFCA77A3C33C35E11F3C367
-554833F4252C036D579F32DDCD7F4081B4BA73AF51A2488EFD7877D917B2D4D9
-C239AB6DF1638C9BD14BFC9964A0C65963F6B79D40CA9E44A301F437B8E03B73
-0A52683FAA4CB2620D7426916F89BF72052DCC7E24509A893B715C4515E740F4
-55EC935779A22EEF3207C657A6833F73F04206D147F5E427B0414D8F6F3DDCCD
-BC895E1FDCD3A7E76D4B21669D5C4C5113959CC62F0B7023F58D771229C2A3A4
-00FA0B6760C8B77E356410A854B23C9BE8F4BAB75482495E621F83045452DD46
-B5F299871544E4E922780FCF0BB6DB666B9EDBCA62703ABD4F3CC69E15728DBB
-6C2DF999717533FF7F98ED6934826FC7569A4020DE4B06147865178D420E8CBF
-FACACBDA128C17B635329AD9995E6E2033E6CC702D5CEF1F0DE1F25322BF58FD
-9041EE0D904200FE87E2D5A672FF0B3C63575D5F7E07F01202FCB8C42EDD0296
-6E657B5D703AF68D26FCA74FBC8076ADBA7F5A4BC58C10D91FCBCB628AA9F313
-71CD61BBAE0B6A6C7B774DE4903676BB3D210F220B413F0B95F43121741523F2
-F65DBBC09B04BE87A030C607A545A9D5791FE4FD8F479BB213662ECA9103027C
-01D85141DC897832816392AA1F49056AAE3EFAB417AEA3C79E49E68EE9CBE8B5
-717FB5C3C5E811F51BA685A178DA6DC3DAD589ABB4F8A0A27A5DDCBBB11A5E76
-94B6320110123C630857538E620AF88BD8ED5B5B8A10F1F28A15BE1ADB196F40
-CB04E8A50ED5322AEC3CBF8881D32160209E8FB6F7ECFA70AC58F94CE3810BE5
-8597D5657E39AB15B3E35DDD508F74069DCFBF0CC70A6399C3AF7B04D4975FA9
-31698D10B8E9CEB89DFDEC2989C37FDD417360F39FC6802EEE5E3CFE7DF63361
-758BF4861385D4931323EF38E7348EB98633C83EF9BF627A29219E9F75A1D341
-5C8091A908ACCCFC01395AD91DDB82EB58BD88D5387994A74F35BA04265BC32C
-4DF225782658BDAF63E8EC8B5B4DB6CEA66F83961D5B41C8FB62CEBA3DBEDC69
-B6DAF5BC4B541FDCA54825918B9C84E7122D9718D28BF9E9066C8B122072225A
-1B79B4A73C235DF52511CCC1E0A3420B35A5598230CBF3C6EBF09AEB6265B481
-304D9325DC8AB8F6853D4111D42724C558761991E953F114019169BD632E6639
-037344F1B767B0DAB524847DCAE3C5CAEB864973F3A3FFC06312A7753F571888
-957ED07CAD5EDC9D04497FCB48446F6C44C6083BE9A31821BFAF1046F89985DA
-009025D4AA91058EA366244ED8E64601B374DE230A90463AE4E57D5D995BDC18
-F621E2B31F79439BF5A4984BB6A02833ADFDF4AC0DD58F53BADEF74BB1D4AB88
-90AC403AEB53313D51303384053A941B0AA32C3868582180868D7B6822533E61
-A4C1E26794A2D9F505EA75EA790BA944FCF61B5314DB14FBBB6252495103C7CB
-8E355F9193D5ABC556F3E4D5B6CD2B8FCE08570B3B69075E241E06CD9AB790B5
-948176080294D56000A0B7ED21D906169D052EFC220767178ABE60759E148036
-388530AFD262244BFDCC980D432DF470C4243BE84EAE322C4D8EED4C2242F490
-93639E49E5548FAE9DBAA2826176756D46BE3449E33E8C1F4CEB4720D0667DC4
-EF9D390416E580ECB81029054635C6DB6D8A1B7B964CCE4B15B632416804C805
-0BBB666A4AA5038D4ADBA00ECF22EB59FE9E6E4F801CDAFE3E35C44EB6C098D8
-093AF18BF4FAFBC3CF7562B90029D395D58383E75039003351E35057489BB5A1
-6AEBC03506289C918E6AFEF280E437299C2ACA7E6D5D52AA3EA2509A1758EA51
-637645F7CE54EE87093AE38B8FBCAAAEAA2452AC65FE2C68235840BE62B91742
-96AFCBCF4AA8300FDAACB55FAB27B2B29C488628347E9262464EEBC8D13855F4
-56D9775DB23F069E9CF9C84813F0CFF1391D72DB08B0C9A3FE409D8D08C00562
-DAEC5022E11EEF099724E648BDD73DEFF8E1FFBB3F80042554CB0C03158793D8
-CEBB320F8E0A86CC95E5860355F00DBB146380CD6BA35F93F5B8FBAA54280262
-31CB7998DA8B43473EE8D1895D5D85ADB6E5C8D2B5109E57DE3697F541C7B27D
-12650F96FC01E3D56F457FFDC3BC2668F8E6FFE82B94D81A648046D7CC71C4F7
-E218F5D5D9F899E5A3A33EEF7EE7C8CBDC9F239BD2C12612519ED9D4E89CA4CF
-348C0EA704B46E56FD9EEE336494CF103C93CDADA00AC0CB74DCCBF4737A481A
-F330C6969D9925BB1CAAFF8A2D857245B8E4C82A7915D97F7466501EE7195D8D
-C35D2B5DFAF50C78686CD5F5717ADC8047B7877FB15E84961F372D03C0679375
-88E4A9A5D2492D28D55FB00ED000E2B8DCF24AB3EB4519CDF68E3FF98B54A1E8
-E4DF661329FC27BDFD47BE63E85A469191E476D0406774727EE99EEE6C2A1C0A
-EDCE20F13FD1838EDF3C1E5FD764723276ED5D853E609B0800197BD8E59C1265
-4092D1D76BF60B1FB675B25344D65C0F79C3064CB634970B5ED680EA710FF884
-8078F9E050655644617690A3EA66AF2D9AB40D187B46E22E72001E2A9D3541C3
-5BECA48A812700501568565A8D37A2159A51A89BC59D4ECA20F3328CF48838F2
-B6BB50D0DFF3039160FE2E278D178B673361A3D412BF3ED1554540F1F0A9A1F5
-67C7C4B257B97C6BD1FAC85ABC9E86B175DBA1FD0E9BB7C0DED0D47956AF2389
-64EB6C4CBB3A03A8DA5AEEEA4422F432EEE66860BECFF5BC5752147BBE75D0D4
-BED50695E88D2E9F01FDE0FFB409CCA801EB16F6471181E62EE70AE4AE06B9CE
-91079CB5ED83BD82A88C835CA82612A4431EB7979FCF8A7D1ECED31CBD1A2C3F
-A586804D66B8A86997A05D349FC01A2796F1892A42979F50B0DB1175B42EFC58
-0B1D3CB8DC992ECF5BA9A6DBD1756C20DBEA6948499F0D245F2CD8D121A8F916
-C0D41F5FD5414C12EA4FFC688344F7EEA2DA6BF2795D4D479851DC004555E3D6
-0AAB1969509FFEE0390AEAA3D631B78EED9370B286B5D2F871EAC4F14FC32B7E
-5571510C3C9BE1467125B7EB3C9E161B0254213733C6992062A63C6904575107
-3395A27167787044056BF09BA5BB742AEC0D7546E9D092D2F66D3BF9564F838E
-FAB5EBFE6FE458D8FB9BE05800AFFF6924270F06FA0DB61E48F36417F2B84ED6
-27076B8B6EC6F7DECD29DED0DEB9D51DE150938B7E94D09D19F28E3608DE37BA
-FEA6BBB3BA06C13F39BFB5268D4BA8D8009E41D5DD8F5C0171FE2859A78C8F16
-8A98E12F32F867DBFB07EB5404B6092C7B04BC47118E3B3FB66F981FF9642C15
-A4A63362DD5D20EC4EBF415D79626385EF9D7ED7B18A41A4C33F3C70553B31A7
-01EC23459FAC1A5B9D320B962D966C43887CF3BEF40D2DC83E843E51C9870C2F
-43CB49080C3C477358867A4FE87FB6E9F79C7C7D573B0D65F155B2656F4D33E7
-0C6049E8C46513CC500CC600D7EE5D30D32B9324C89AA10A9D676EAD04C9728F
-4A4CEF9925A294F26E6AC63730B4520C43BA5AB4EDD6441DBC3F2B4EF8FC4AFB
-1ACA19E714C1CBC4AD114FD0744F84C85F4F3293BBD036EBD4CC29B3B9609F46
-E856F37EC8E33396C89DDEBC43C0A78A3FA67A155E1DCF82148893C418531769
-CB82B1B6357335742E7F712A182C413E8D8192BE6584A907969A48EEBBE5C0F7
-95C7219652F28F3306DE1F83315BFF09D66E3C31CDAB730DABB8ABC1A33C2BCF
-046D3FC7E0084877999B7D2A8AA3880006B9D63BFA9F82F26AF0B93372E55EF1
-DBF53C7494E42794097DF15DDBF43180CD643589E2F3A40AF0A1A0D7EAC3373A
-B94B1C375A45DF21509C3D094F230B8EF207F4D7EE1B6096FA047D0AEB83D12F
-E3AE9ECBDF2C24F3D553DEFFC93ECC63A2479AC22A209FAE85E34D7A6855C386
-C611D60159CBE8A9595DB541849FEDDA99DB09BEEE9499A6CCEE6A0BDB150B11
-6DF9A795156BF845FB89ECD6939D6EBC8615D8FC47911BB34107E71FB3E4507D
-215C1A8476E75BDD1B3D87321852AB6A94D21027D35A2199F25DE7F7BDC4C865
-98DD84C89BA03D5498AA3AD62135F0B1390613421D52E2869B87579EA5AEE7BE
-6804CDF29BC99A9F7355ABC9E42D21E706B97091AB73D3CB9184013C6D8980B4
-CD5C8D5D13973F342E8FB4467260B23340BF1254E3D9195B1D6AA566976C0CB3
-62B492B2C8D4EC481C5756496FC54DD7A6EF6A209F1E15FE2C3F57821E9E19AD
-0A563DD390A89A6722513345EF58F98D65450541A0C5C093E69D749E0759FB1C
-DFCA7A4782EDBC030B9D692B3EB1003487863549585E94245D9ED36D5576245E
-C189F5E31A033C68BD21D5A477B756ABBD830CEA8D7F0FC73F93352CF95D584C
-2593F7389DFFED1A40E6B14BBDEBC5368FE10962FF7A8938227FE9C44AF54602
-3EE2AA0B6D7B4044F906480199E49B3F2AC6ADEAD76C88DC8D22A417C8A4BCEA
-D0812F1F513068E700040A9F3B6678B1F51A48592437C79E2BEA709B92669764
-8A058E234468B01F498B5A51E2021BFDC09784C706024DACCA6EC0DF8F9039B9
-02EDE264D7BF8381A66751F4B9FC4734CF608898828B5CC3483C688132FF61EC
-E7BA899F45C3530ABDAD48A5B5930DA1BE15ACDA0522A33E87127C559F551896
-40348DF2CA4651C51475B1B611957E11D787F05CA436BBF1655999F1DBE03AF2
-3C83746EF137EE71ACA97CFA6969D1CE5ACBF61900A452D630011FC3E85FE0FF
-AB5AFB57483E7ED55221A7735E5F89CB4EC92D5A8C9CD73FFEF46D62F8DE207F
-D4DBAD9EEE001DDF0750125FBC59A5E13A921955C6D7CCB1CF8F89F3E00F7B12
-5D358163ECD0CF38A118064862EA04B50B6AC7B95D531C2065BF2CDBBCE887F1
-70650E0772EE5AE10AD67FF178EB51F8AFA0CB0213BBF9757976621EE0058B0C
-3AF602DBCC7ABFF5F467B7854904BD7F7E89BD19EEF9A2F7B8E557283AC672B2
-92BD96D87365C681463A6FDF56DADFE485E1B81A7766EDFDAE58F92E33CB12AF
-EABC9D80CF4514D8BEBDC6433B990B0AB267D378438D738025AD340FD602C441
-A5A4C63510DED267FEFBF9787BABFDB79804F56C89A602470AFC0E541B46666A
-1C167AB82E06BFA1814E22B65355F40813BCA02BFECC086C7E8FCBD845191C28
-7FA8F4BE3F1B4057D192AF55AAE787B0C654468600ECE8A763BF3B5A7324F7F5
-62F7F596204F0A50A5A7E1911418C00849DF24E00AADFBBEBB6D10180E9B5FC7
-BF839E08691661836B5DE3E5041DA4D3B4A458E270B274C82EC58617A98F0341
-C4D379C508B3DA7F2C20A1E7CA5DC9505795944BD83EBF02022F31E50A3FAE52
-7259693253A45AD3AC1D1E40D694D4B33E8A5A09C405B52BEE5EC132C9B27B8F
-4C45B3EBA9CF34BAFF627AB8D86755D31472CE8ED453F01E96F74851862DDEB6
-0A8B4C6A0D69783E632065B095924AD3D5B98A8100E52F2058E795639BF91C8C
-CF10E8F4DBAC1F9BD167FCB399BCEC1652C81DBAC4B0E37DDAC9998105397E3D
-73FC7E53E70028314EFEED71A935C9792CCEAE794608DC13C6D14A069A02FB43
-8A05187E9EE03AC908DBCC7551F1E933B4FCE961926D5B81CC885D8CF3F4CD3F
-EEB5DEE1769A5C5D8E86C7DB3E96FA500A2EB89735C55AC3252CC280ECD07AE4
-64EC4F4BF687A866CD8A9806BF96FCB8AD9BA0972F3DBC2971F50CCB4E1A2979
-480341DC01E58273F4086B4FB7C98D4271829AC9255598669F26F5B59F3DE2F8
-9BD2FB9BF3AD79C02B8199C952D7135933BFF1A3B3D04EEE52CA1CB9A15413F2
-158BA8D689AE2F93EF3EE2AA055B2CF2CB6D077AC8F72126FCE95F30471F7AF4
-6267671B6EF1D3F5A932D94B700CF3FD7777FE123129E874DA871CC6F54D69AF
-CFB6E499F50025567B58595509CBE1300AB209CD88FC472BBE9C5F8124AEF8D6
-3288921A3932D0374333DF8D0F77881B9012D75EADEBD2F80DA17B5B1CF8DCDC
-C71A7E217FBC07ABE2395653552742AD35C5B3A99045B92B320711B18E9580B7
-071C0C1598A58D0CFBA46370CC8111237545DB6353BDFBBA45128109B9311523
-F493DA4EAFC9D6FF5B73A486A8D4E39C582280BE7569C1B272F2942782C52F6E
-C26A3904E0EF2926B98038E35113D0D1E6B91A310F30B0BB7971E5EF0D4511D4
-888AC76E95D810A7CF7EAD44883DF3CBD91F1452F901F6448EB8914C3FE434A9
-60166AF573EB5D77DA5A16A33E5ACB089C8E0F8FEACE1F9C48C83F18B685A3B0
-027007A99175E59A6C9609A363748E53C44A1602A39E96776738B54690E9E4EE
-A3104B25F24E3F3B77316CED31ED193B4A33C5E8E1CC3B2492319BDE215C1AA1
-DD86D2622627C483F831DC8FF17D9125974521EF53760CEA854F0E8DCEE92856
-7E9364B786F6E7995A3CC87196162C734CED436832DF7F10CBBD7726A1A9FE74
-5AF7E934B5418F210BACAA8C3023598DBEEB4DD2B4C92652B61C76FB1433B9EC
-163099EA47869D3BA7C97B1D27503C4C8CA20E2735B650C7A18B57B8E960F8B8
-42E06826FAD393BAF7DE0D21AD910ECCC2D9D5FF7A260F2E88345617B09EB029
-432AB4ABAF89680F39FFF1722917F6EFDA157A5B5158C8A6261CE4FF77D4E971
-D892554EE4D3E1AED976FF227FA98944D159972872D6DBB6E0805F0D7F267D18
-26ACA6D4BB463E6D288CEE66B08BDDB4FC916718B3A497CA632CE6E8FC9AB174
-8EA17C8E6F053F81AFD6D42382AD9AFE8D64B2A4C7D91181A73AC25F06E5DB71
-4506F66FD51B010AE1AE5E82A3ACB0CC3D5BD1224A28B05D2470209C182FA991
-A9F2DBBF7CB018CE87D3EB1D9FF744099C62169EC03A45DF7994D8F42C326A4D
-5F320EFB7ADB34F2CF4031455F5D42949CB30B925BD9C5D7F8F0D85877FA7A42
-DC6B98FBBCD08BC4A760453B73CDE333CC60A6A8F2BF2785B457CD11878F84F2
-8FE44CB9E828A5AD27EB965ED94BE35BDD3C6D6FC4027CBB93508F3116A0D4C0
-0E75B6E94219DA65169079555947CF73645A516B0B779D4342A4E65B0C8DE843
-4858368B3EAAA38BA9750EFCD7864D6F931240E80E49A8FB2ACCD96C67282060
-B4751BD16AC3232A53AC9B4DD68839A36615642E76607A784ADF74DB11E2C67B
-3966754103EB44767F5DF32FB7BFD4ABD89789E9B5D23E51ACFE4E5ADEE1D4AE
-26385ABF6CC8B432096689A9CAC71E086FF2F5A5111EB0F631703C7851538CD0
-D6EB492CD25F666697B3B6C184BC91B05371345FA185AEE6A5AF301128F4B4CD
-75597F9ED3B7823282CD05655F3BEB5BD4BFFCD0F0199E2FDB6C9F8FB3818747
-6738C4F7610C3A2F46314B90C0DB9A4ADC56D955FF6AA22574B727D8857F2B24
-8B5D884511ED7190EEA9A71E9708D4AA1B06222D5FE5A4E25314388A959FBDDF
-1EA0C85E01169B2AAD698AC73A65400E87B7A9E7EB43E022817C7392CEC3FC67
-D6663DC750D40671F0337A49F2ABDB10AE3EAB8EB746980BDEB2E69D762C19E7
-440F5275C396C3B56C6FE9196ACDE6159F41CB9A554D8320A4D71BE0F7AACC4F
-466397A75E981E1A215EEEED4F3A8482A686FA7C695B6D40AE92B4150BD00DE1
-E4FFFA42AAA059FFFC4AC9491C33C05E4D27808B69E9FAE08A86FBD01A35ACCF
-46E967E862960EC4FC2704B507FBDF00FB02494D7059E429E80761626678AC74
-0BF0108F8B03A95ED783A10FC5938D9E42D64E914E9A4F04EA06BE4C8D79AF99
-25B19DFCE00972D45CA59A8BA41E349840ACA3124E8F3297C26A6D1BB1B02DE6
-C52F047B55DC672DDB9BC73BE4B39410E9CFEAB0A4B1C55DEA46746AB52CA9FA
-761C8C8A2D34944E904879403B0686521C9CFDC8FBC32F4AE659FDA262B41F54
-4D5D69DB0D26B43B68EAFF8C8997A267477ABFCC6FB829632BACD3129BA0127B
-1B9164BB9AB6EBFDE99D84FEEC3F04533B07117AF9ECC0BE6845F0854805296C
-03C11A27AF920E36D28152A50418A9EDA2F14940BFBD9ABF2F31E84D5D0EE3E1
-94F32CEDFA821CC1FEAFA56758D269643383A613B466305C21A87E58C9296CB5
-DB8DC4EEAEEA89A1E84D5DF6041A12563A0EB66C2A0F59581FA47099D429E615
-1FABC2046BFC23C7E848F53D118239D666F058113C865B01A8D4AEDD8AC89F60
-819C1A3A051AA665A43D3552760D9410843CA004B1F2CD998A3FBED3A7CA2277
-E1FEAA9AD910849B10145FC2E0D6346666DE2FF7C2AF38E2F84CE0DF16D0B90D
-03E00EC3C55E5C05AD3A120CB1879E84898995AE5A205721E2AC6F88E5B57FF2
-7CD9D37EAE28F3461181FBBC340BE35601D0CDD0FCAC181EC6E2CCCA00ADEDB3
-6867BA1627D730CA71566C9388C6F0E069BFED8968B67AD465645798D18A49CE
-1C34EA0A2DAE4C7D13FBA180C50EEF9827FE456C27BF25FEC28ADD3AD94486D9
-9A697024609611947D03EB461FC8D17B2EED155A46C0825FF872C1AAD02CE9D9
-A2FC62A38F4784B40CC33C298B4E8F7C3E8A3018ED0F497B054DEF36487213C6
-116F39D64454F11B0EBEA532DC3F72A16454A5EFD2A0A702139F6F6647338E06
-773E301EE8FB984CE226025F597DF0B44A73629E50D39DBE28DE1852B0C79E6A
-1FBB78BCE132753A07F858898522ED3420F671D4EC657B1363D88433F155911E
-991DFCD39AF4523716AB392E40BA705784376CA58F5C5F06C71EAB6734C12F8C
-C6E8D698345483D4DC9194204501A98315E44C43B38D7F30C00E01F0D1024052
-D3E0C5FB320D54FF4ED525133C55CE2021F9B06130DAECE83115C5E4CA7A5E60
-78A5AB40B902EA0315651E07B8FA6367F01701B9F5460AEFCC9F591678A12F90
-A8CD4150876FBA33C30AC006B8D168BCB4B4D63259127268C996A5A59D12872B
-EA4304B8A5A08ADE39604C14416F9B327ABBF977BA56FF620A97FE4F2D4D4181
-ECC349BF0776276405F54C882128121AEA5A07478E2AD6C10742FF6430EC0EAD
-752F3541B1CB283CB24D7E37445D4BF42C8BC632D41C4A168EEBD0B086BDA9FA
-3D17F6ADE5D0D70BEDCF0A50B1E16055999018B459146125D16689CF811CDC42
-E1563D331618A22EE81DB417DB13ABDB475396B02F8FDB041DF6B099074AE073
-202B439C5956EA33C15AA8F1F6BB27F0160337203EB289BF55D613ED95A97685
-5F86C5FC55B627453171F5BF641E5B6DCCAA31E67DFD68F968EC79BFA39B178A
-D3EA21270631FD29031F64621061E60C7E2269645A51A239A207A51DB86CD07E
-3BB35993A95FEAB12FF6BA96EE231F1B2935E979AC69CB0CF2416938F5FAEE48
-E813DFFB95D13BB6A92A7A6E2CC08E3789462092F4E72626279E5C8257EACE5D
-B3CDF6D4704A729D020C278BF8BBD6474912424702ED4DD0368F30CAE5977FDB
-3541ACD80981D99B54976936DA5AA9975B84F7F2A2B2CAC6EAADC5B2BF652891
-FF8BD1DC5BFE7033D9D2A2C79FCFCBE44D84513D542373A9CC8CC6267A6C8BFE
-F2FAAF8AE6C30153EE9F280A063D05A9443DC3B99AF1C9C1F2B0D4BBC6804F99
-5167D5481B434092E61F7F6120C743597D4CC8F7F158622C87E0D7FE7595DEBE
-2EE42174102C99FE6092CD19A8E424B6DF432EAFC0046595DD05EA58D034F4FC
-FD90B00AA18C3CA05F03445DDD30A6F040B51DAD4F04EBCECB1D5482301978D5
-DFED67774A1C1251F2003FBF6C4E2913B259D99C55B25C3173F41AC40933CA99
-2CE8EB0145F68130A4B2960C2BE2CC89AAAF8AE833982768B321DEC8FC8EAA8F
-B64A9868E32D1914C46C8A2EBFA46F7C1CF199D24DE24339661F7272A6E34829
-E62E11A0924988177435DA106D7C524C0C2BC1C2AF99D496859326FA74FABDF3
-83FD82C9144B6F03F082E20EAD92284139E45C994018F889A1FFDA5FA2B19B90
-38B9EF87D2B34A7F46AE27BB95E2195F958798982E96979BF23BC7EAFAD3F1D5
-AE454252A06C5953A6553FD93ED295F86F419D15FC76F05B0C15EECD70D0C784
-21CAD58C34FF8689CA2D0A2C9A204D99C2378421A0F57EE9A3E6C9358F3AEEE4
-E9B6A0CC3AB9DB260D68D35E66376A74B26F925F1578737AE6539575B969F269
-872A97EB9E0181BEA5241F9DB74F212F81249B71B82D547D1C9CB6FCDDCFFA1E
-700FF34E08147F6E29F10F0CBEF09CD254EB5F9F8D8099C56D859AE9EBA5D4D8
-256B90DE65747C78D14B4FB8E39A67FB1039914026E0CEB6FEF629E1C024CC37
-037DA8F073991235541F09CCAD292E4F7574ED126C99628F6B208661C2EA782F
-C74AE7FF1F486B781D89357F70ECDE3F36FF6580E6A0F43F9CEA95BE57AA3AE9
-D82F4D141B9F92F22466637CA739BF9397BB94F60A6F4197C6DF0C4A9F348C46
-29FDEEB9DB680EF7EA71037C2C42D15A966D378AB2192B56D24E2EFFE4421B53
-1930203249DAC898FCBB90EF4FF10B95B01E4CA59B25CBC1517740BF94243B52
-E8B96AD886C9D9EDEE636A4F8722956674D838F57A2B049E0DAAD8731CA7331E
-6D5F3CBE866174B949D87043C4686B226AFAB0BC6878D1693D849CDF52B2D498
-729734641F6F8A63D0FCF3139C55D9ECABB27508613C1997A8D8AFD78C8E789A
-D7C30F6C58E84FB564093D7A589F4181EEE55EEBF39F369396ECD59D90D44965
-1E267F20B980A4359B462F692E86E04E0167B965B6D958A52CD880FB69F6C60F
-F0F76F5DEABE3B0E21592258BC83BD9AD7C087B9028D3F1941A2873FE5D6911C
-7D353B921FEA42816DD49B48450049B8F31D7078D0AE7CD7DB8765A8781D9B75
-0547884A23E8DF7778571C650490A77F1124639AA7554AFE3D8589DDFE5D7141
-43B8AF5E82E9098B95F395C2B9988068260570B288D1882D1EEFEBD9E9B0FFD9
-331503DBF1ACAAE998CF3F3452518B30469A6C72C23D3344C4FC1DF7A8A01148
-73FD5F56F95BC98CB2278B583574471BD2E97E95E8EE1860E74300D302602DCB
-74D548F0D7377C0A1887D5FB27534A5560DE1D1211F52963AC6C7523FDA0104E
-72121BA9D2CF1D84B299F2826B5105F140B890484CD2D5AE03C69BC056786534
-2BAFBEB8D80273CA0395EBE9A3BF3263C1F46093C5B3F17771D7AC85CD72DFA7
-CD767C726E7BF2196380E57453AC511C99DF297E4A7D01ECB22A095355C30E6D
-CAC1B1F0FC955478F0953EF9CF88940D6FBF6D77BE921BEA61F3F1C939EE6351
-C2F6A29D1F1FE4383BFBA53ECC232C6535151EA9E1E81355FA9E72847EBE8B9B
-11B229BE65DFE9774B9B2970C8C08431943ED09CD1A09CD6EFF896F43EE81FF8
-69C777498FC421ADBC40DA7AB46E3C65998092017F8B6BF96FADD768770E8219
-71D03657047E0E6E154CA34E4013D724A8F78B53CE623DDD13A5F7B7FBDCB909
-455CD4AB2062AE859FEC2F78116EC8583A2B002C2D9258FE3DF659855CD98E65
-876383D0F67C2BA1DBDDC0F652875EE767025C2EC6FDDF5CDC440577D5F9ED91
-8F6593731D04B25C2868B3356C87A9ACC98AA052932E01C509DA912B44AC538C
-DB92D01A4AD932CF0D48E6DC067795416BF0A4E5B9500977DA66E4B346394D3E
-D27939A56887239B7FC7F15F564E51116B615A4900CF3A67F33EAED29CF39528
-2BBF2827BDAF3616AA1740B7CF12854CB51175B088CC6A697B5D5462C15B49D5
-D4E58A406B51EFF8CABDBE91FFCB58E9C8101178FFD0833FF612DF7F99891F97
-6E994A80EFC41B863696FE7EB6787E4AEDF21E8BB6D5270927CE9AD669261255
-4D345A92D79F62F15454A661B4470310C0C7F85545806CAA0CC180B957846895
-BA04D4ABDF3D89D321D9B9C7DBAE4C690F4625EEF664CD0BFE548E057E484610
-1839E6F5C8662BA539813EA1011E77B85B859E5C2D30C27E19CE1FD55E2953C0
-6C9D5E733BBF99B3FEF8EA202DCDB64B8588E0F0A5EE6D3F214321FE15C3C9D5
-9DDCFEF830B4A0C458962EDA665A95F4779CB7C6F3A1FE80C8C9EC1542EC2D9E
-B583B37FAF62443FBB3E5A7F6BFE6596DF1E9651216FEBF11803FAE1CDDF8756
-A55D19B3B1898C71ACA59364386B4912DC634E04151A443C6B6C307AA2D3BDE3
-7AC16A5B39744FAE7E9BD225E04A466BEB4F9F51959F3188325DECB6CDE15C2D
-66F4C612224BA6A9FC70787FF17B7E0E31F556E2E088DF214ABF9F27C39EE495
-1EE163A644106E1C1C7CF6BEF07009B38022CB5B9C33CA4C62E69DA01BA25CF0
-BCA87377622FF3C96C68D4FF09BE24612DC788F0ED2910FBB1AE8C023B7CEBF5
-86196213453251BF1231B5BDCE182503C9B0E06724133CAD069E14C36DEBF9A2
-5661BFE61BE51624F42EB5717CAE7F05DF20A27F0CD37D268BD50286E891311C
-D55744A29736BEA554B466A7AEB02C5C0575EF05CCB1F69D37EC144458048245
-01EA846682850F97310FD68190044E4CE798D51699058F03F5B0035A83F96E99
-A5F7112737D436EFE6A7C60627B700D4B539288D2006CCA437D0AD04106AC8BC
-9E411030E00CBCDC3F9357ACA9CE3E6A63203DF968AC474F722B889A4EC10DBB
-39295354F28BD8A3A770BCE14091561583447E29292174A067DDBC4A7C638A50
-7A0F05863F435AA2C763BA5CFCF6DF8E39189E79A9178E80A305E8F03534999D
-532CA867B055AFB2077A0C7B5D1B738DC0494871F707B12D1EF469EE4FFD9C63
-78FE05E1DA7E188E997AD2C03EEB2CCFDAB1019581FA9C57C8F1DA051A60B02B
-C76A5F7419B32AEC483D1EE2E7512BA83AB78C796CF06D6A01AF6C1A517F8643
-141D48E3344B15CC483395CE83BB56762A423322A0AE12786626E541F85C5A2A
-79DFBBE6DAC3A2754AEAE562523A5788C3B548B6DA59D3DA207E5628017BFDD0
-A9DE4072882788AA1177C695DBF0BB784F480F831C4FD4B67365B15CDBA909D5
-F83B44B360609163287D7F315CF95B8090B2BA45518F9BCD3884CA9641704A05
-37D4CEDBCF7F3208C7580AD987F7424C459333F2C7B11937BC3AD70EE12EA881
-FBAFDCCDB80A1C05D129E0C0DAA23909BC56AFEA730F64F93FF369928C40F0E5
-CBDB410CF2EF47D49B0F04841B268F954E225ADA644566B2E2A7B93A6C6EBEDF
-F6CCD83C4BDD1AF12A016D640CA9CF1BCB0FA48213C25E7359294857E16A8326
-400C324F4D6D15FD011EA1D345CC8585B06A5D34A0F2103FEEDECC9D3D5C65D5
-620710092A213AC8E1C8C5AED11E350F0760D1CD7062BC1FA480A15DE733FFEE
-5F428FBF94488CDBCE85D4B65593362AFCD83A782A03F80672257A67EEE33940
-89F04CEE35C0B418BF33F65357EFBA4E3839D5CA447BE8D1E7C14C99A1866A13
-115E858073E68F259F48908E980C8335F9ABEF1109A93C20164161EE5DFFCC18
-3B913D65D9ED29CE5688A0078454080BB624DAF959BF30ABD78B1964C0D38D81
-BBEE68F8C31A647B75194980EADAE5AA18609FCCFFFC73D55212DB091A812A65
-1C62893A54B9E9214A6223EF22E663B0076192EAA8338FEBD91498B875DA25C7
-DB83A8D36542F0818F02717973F1FBF55811A03592A5778CCCC941CB636E6C8C
-0159AD962BBB6951D36FE9966DF8111AD385EAA574BF225F06DC016443CDEF40
-632709C6ADDA1A90DC99DC0C4AF29CD4722CC759C1E811676F12D58148FE7DE0
-6FE2C004CA06AB171D171B21D3F01BC76C5BF9C95B7BDED1E82C0DABA460AD4C
-B434BFB99978D079BB31CE9B6961CDBED6BC7601A99A1F811E5A1384107A9E79
-4CD84EBBA899EEF9F33583490C3767041B9DC600FB7311C8C606F1A3C3A30630
-6C6B2E51637DD48659A31BAAD4CED67A90B9D8FC4B548320CF65C66E5D0B0726
-B2047D77C71A385C3A77DEB598E24CFAEB307185D6CF4DB6985EA47290BB4191
-F5A5700F9070499C56DE417EFCA43AAB5AA92D1620E38D9ED6E01230409EA873
-F16CF19C67466306F8D5A442B9C619D5108E77DCABFB71F3F5222D46DE8B5103
-EA329DC77AB50E9F8C73455354851AB748246C351B313D14292DCF639D80AF65
-2E765CB7C1CD67DCB2B1FFB4C7C16FF06E22229C6CA1B90DF3BC04F43DE4F520
-604F5459B3E77FD1448F38E411CF8890DFA4625A9A70018DB43BE1C83DF0715E
-769DA23B17BFAC15285413BAC8B44E0B8ED023B4CC9F65427E922F7AFFD419CA
-20F0E82EB61C0EE762F546EDF4F6C3BF91F991CEC5751CE393A8A1B5A740E47E
-208BA82AD0AD81FB31FBDF64A44AECE390218F22B94F4912735351875810351D
-7DADE83748BC01453FA6CCB00DB1F253694EFA2F906121935E446568F9C36D74
-22518EDB8490CBFC2A03E3F7C143EC67BE7758D7E018B9D17328E842A71A6DB4
-5653AD77807334DA683403FDF3909AB57EE261D12038D277D445B4AD4B9D0943
-9E1787ADA6156861B188646A3A065A2BBD52DD92CCEC0121BB56AC8961E67A21
-C6C56FAD0A430B0EAFBCEE41F8D7EFA3D1CF92A5A26AB7B1ADFCE7B43BE20CED
-4721BDDD06BAFF6F0D44EAAACF15D4BEE561E4702B525EC62BCF202D52EAD25C
-90F6F53F4F37E45B94C0E707B426F5D598DF95372790BACB881E0C817FB3CE27
-A8E31CBE57FDF91582510DBAF8CED1E042D592C18ED85C646507E39D28C8A6DD
-073FA1DE452C4AC40489B68FD3343DC637070716DA198EC36C2A7283604B99B7
-3389D0F2D1F95455105A3B7C18400F55C617A2EB7EA84CA48F770953AF9FFF9A
-B00A4C6DC1A5BB278129E7B98E1124B396DF750E2C4470DF3AB074602CF55478
-F2DD0FED01D5989EE6E52B3728E9D5EDFACAD462187C310B04914E2F34580E9F
-D2D9939D2E18753A313CEFE1C6C4EC368E199D5569DAC78B62B967E2A01537E9
-6288410DADE218305D5FDC8B96F258964BEA24E3FFC3C092F7FF5A8ED7005939
-CBD7594BFACAECA3A650BB2D2BB41A9146C83BDF84CD8349989B0B7C46264EEE
-B0AB0F2EA1D9911B68E9709D2AA3772094EF0A8774A4ED4B93B45EC22B6D8616
-66D1CB9EA64AE4500209113975CBE220A83B6C74EDDAC5FBC11190A44223611E
-C2829BD6E3443F5938C20761F9B1EDF84D060FE45B20C86C3CCB8C7B83D74235
-598FADECA175DD7AC9C301C875DDB055AA7950C93DE8D7016A3D5D2BE2A0CF82
-94AF5DFFD81BB8E7A8B0664EF4426A765AD48C168965DBBCB4A5292E99E329E4
-3B68419B564858738F4419D2AC492DA601D7D4FB8082F16E104F507B503BF9CB
-7F40A15D1D6B1BCF03D5630E16249ABE6DF0EDDB568CC19FD9F785F3F7417334
-8738B91915C553906EE1B378AFA358CFD6FA3C815F4EF44DD5BA6D26C6E17CEA
-0A29B307C857D5D2CD8C3E506660D7950B82F1DE12E141F4740DE728900709C0
-696AF057305E6670C23DA0BBA5C64A111206219FF2C1CF6FE7B0EF257D5D99AB
-C60AEC3AED73831760CC5D22E74727BFCBFE6810EDF4F48AB39121A82DD5821F
-DE6F8A10AA6CDECFE7D4BD8E2388631D5941C5DA0F61640103E5C68F6CC413A8
-EAA7D2419F2B6A643E8F9A95F66A1ACBCAFCC7443F4E01B62320EE7DE0689EF6
-B8397698925233490BC6C4B90243E9A72770FC68CBD3854821DF66B785087743
-9058E6DE7D1D932ED00A1AB57D21067A5411DD097EB0065B1EABEB209C5B69BE
-87F33EA9E280B71D4B8C8CB8C99123B8282AB57848A99699402FFF93B755ACEA
-DC15E0383422646F3F80BA0698A6A51AB1A28169E38340B303950B69B881030B
-1EF221BD8E44BB2549234CABFC545DE97DCBF12F75655BC523A2371D5E680BBB
-82CC1D799C451E8B3C8AFF0AE63EE353520A2EAF5C4E815352BB98ED6162F08F
-E2EBE7F408BECA380891A40FE3691F984D498935B11F7F295E98A256E77BD0BB
-4492D8CE904D9CFF530B5A26D14A0B49DEDFA9B19DD80FFE4A56CCF3AC87C651
-FBE675846EE0A998B2BA26234849C4F95B0C5DC2D3E84A26961B1175928BCF7A
-730B085C42FEB713C58A2E335CCCA1A5DA7A88F6E2BB015961C14848F61AB3DC
-DA874008FE811F38B13959D227AE5B3E358F1D2BB8E2D7FEC13DF0CC79DB6D25
-5C7BC76C29CF9A0F688A0ADCF3D902FB7E9269837D1C59976F19012919F67E3A
-6094482E0EB91FA4B137FE4F07CBE4557F414E60EF225666F9648AC754A28E43
-629F1F070299834C1309BC28F0659B8FA58C133F403D61BAFE7F40B6E31D6C83
-EB980B5AD4CE3F01D8547DA7FE177C1D230480F771183B302FF5C3683FC2F628
-8A9E6E5DC9C029E7957CFAB8C1C9C4B2B604812854153C683618749FBDD5FB05
-3F743A4FB268B84ACF1D9ED1283A7DB64A31B78636B4574B8A473679C3A881AC
-F7858416D29D3EDB3C2A62604C0A666188BF9287118F092485FF10AC343C31B7
-66C761AE8DF4634B448201A9DB85B0BF06A2E8BE1A762ED37127DF2245084B93
-FB078BC50ABD8980CEE021547ECEC6751B2295819D5F39BC3B210560C383D887
-A4B179D0ECE8C1AC8E0A2F97DF032D1EE28F3C835D7BFA2DB9AEE349E65B73D9
-3C9A367A6C655174DC8180663D37E19C6B5C44031067CCBC577B786828DBB23A
-C076FD672CD32D1AED09BF9F38834E6B16F1BDA5A34F063C64AB8EB8864E7D5F
-C74EE517DC915F0C77A2DD5923A50AD8A4DC39344635AED890A5DF3E461AEE3F
-E362DA67E73CD14B200DF449FBF2D92C27FAF4B895C45F370C93AF5F429A4303
-4CD0D65D1FB3EC103BB5A48C04D675928B6FCE127AB32BF205F2EDAC29B327FF
-A10489744E27D249753E5661634753915059E6E2702C2F58905DE3AFCF2D4272
-9BA4DA3E6781EC67AA39B77B6DDE3968AFCAF99554580AF408293DD5CA032713
-CA5B5D28AA46606E627F53F27628FA563C4759D84697781600DE99D895B402BA
-870E5427BCD0FC02B9090770CD84BC9061B76A051F6CB4921990A0DB13C2E333
-8CA0E378EBF8E9E507E22979D9B694FEC20378CBC11560FADFE040DA63FA4E56
-9D7D12D7005DFFB82D17C87C9EF63CFBA5CA887B88BDAD23B4816CDF4BAEA528
-E269CE1DB32E79840D3569ECF356984326C1E4B7C20B268FE955E9BD3884EE01
-4BD7CD21031F7623DBE183EEF39AED664EE4A94156DD0887D85F19A27C90B834
-4FC4FEC2F39029872023186B6CFCBFE065D9ED6B332D63847E5EA8DC91C8C668
-2026FAD8E24C00B2AED44466AF5BFD3FF9255EB05F7CDD90826D88D6830BE8CF
-2AD621CBC121437726CFCE345418CAE44DE21AA3711E4F9DF7AB331C5B074BF7
-3FD41C21F642266E799450F7D0EBA2DBCCB9D9DF3F331602FE0FC18225BAB14E
-26D1A7E72290E42B39172B949F58258D96DC335CAE79C3B583BEAF9F36AF6DE1
-67213D403790B505E753A10C277A6FAAD5327B738517D57BC130A486BC8B4746
-1D46DED8FDDB9C917B1E8D1D6E4DE551B412DBA2FFC1E35473DF49D9CBB20666
-9ED63C06DD802CA9A81BA3631F1CD8671744267037EEF17A82CF746591C63A7E
-8BA5F822B443BFEEF8BB6C0717AE87D880BAD61A1A478FFF5883C463DD83CA43
-793AE5C407FA4C66A56592862EA0F626822AA8AADC651E6010A652477E63AC80
-0F32336858B94F8D40E9F9FCAC69E8813C76B5491F4CA8B291CE1E7BCD138383
-E02AE5A5C8A8B13569D813A947CC46F321029906C5DEED777724A1B34A684E60
-90F8205B446B5D744D622DE3632F31DA8EA4E412D8E65E45FF964A545CB8CB3E
-654A99A1C4E6CBB8D8C61961403D12CF6BD20E99765BB5E239E8357620DA54B2
-61BC00063389228BCB59EE9565B3BB99F1AAF30D296DF5D34D86B543B41308FC
-B5E55F4B0DCB6D3D5D5A027BA1E23566997C78B477E67F00A57F67414ACF113C
-877AE58946253165E92084BDAA4D40250ECA51BCBD9EBFF9EBFD6369DFF081A2
-2DE96084D718C88C6DF2D167C11805CC839C7CC393C052FD4959399A9B4330EB
-88CC19F2B480CF088E338708B643279D35D68C3679A6EC577997A54FEE8086D4
-94BA562BF63777FCE8EA4E0E59068A8433EF8B64BF8ED59CCE16B7916D9F1E57
-322E144D245577C69E99E84DF2367B1865CA3B5FAA34F4B00D059D09FDAF9EE6
-F57C0D4F73F17D9136F873F1A8A7D2880E7319B3188CDF8451B66E5D08E20BAE
-C106696379B76C44832F51B7BFA28572850DC31EA2512E1BC3888224F96A75A0
-8B7738C1B2981A3B89D8D5ED4B7F6C3F6995C893D6C174F4E3A38268228FEDFA
-A72E14856DA96125C4217DF38DA9DED696C4D62DBF37FA9FC1466A31047A6223
-DDA2F118E90B180B45D0A6D20EB1BEF9FF0C561BA1D870A01349AC1E42A6E9BE
-FDA106D48928D65EC46F2CCE64D61019ECF22E75F743E9E1D0FE98FBF5729A93
-86D9AE0309816B8C5DF3E9698D51BED760CC637FDD3D8516E36B036E7D784D69
-E3512F9AD76F7C3BFC32CE40EAF7C0B7A0B1729E986790DEBD13E2DEADF92C41
-528C9DD1E835CF18CB8489B4CAB7E105CE9D16CE645599199F1D2A58BA2AFF59
-AECDF574F7C2944699ED630718FEF049139CA3F4ED5C0C5702A0DBBFAD074AC1
-78C70DD53C12EC599A5F1B2AEE886DC46426B8A21E059D78AA51E4AB57F8B4CE
-5CEEB784C7FF980C36B2DE62BCFF37CF378A7017D8144AB88CCE45F3A07680B8
-32101BC312A020F621AAFC524C5F86BBC48BCF4F7C81B4B2E82CF585F06F2481
-2F8EA6A1BC2D580617140EFBC6B8F7EB7D7E323A27BE3D5AD599C6BEFBB2CDA4
-3BA86E0E16D7264833827DD01E7B4FFE6EE2454820E939066B988DD2345D97E1
-88ED2DE120992C40A3A5A073C1371662E3DE05CEAB8B438E47057EC5139AE5F9
-7CC2A859CEE5F0EB7F062946327FDC5BA33A7E1358142DC5E7B5476BD1AA7AD0
-1C024E313D070A8D7A3D62FB6B64A5FD562263B79BC832D87C60489FA0A2C4A8
-BAC86DFB78D38A6EDDB47D21A596969093A36BF8185535D3D5C987160188B6D0
-5719D2FB8C8F0F76A5A0A8562E34E7A4543863874E81CDEE68C57068734270B3
-EA9FEC6514B36D5F2484079464CAAC1E8BC82B9708E7355FA8F78C9271ED294E
-146EDCF66FA86CDD1D47D5590B633CDAAC3E559609D270BB7CEB794F48B5DDDB
-EF716CDDD85A9E39CC640E1232BA4E057518B0876B3491AB21CBD1ED1BF51F0E
-5B171D6DEB1A7C292F2FAA36E3AAE7C21548BA6A5D681407613CE614A81AB209
-198C5F7A36F2EE329A3B3BC98B1DC8A8D30EED1D7D0F62D187225BB3224247FD
-67EDFA0A6C417B3411533CA4B6BC54FACFA7D4D8377647AF0C9D562080BA8221
-B1371213B8B1E28C69C6DDB4448B8A5FED0F15656FC6A229715BF71EEDDCCE88
-146243275714C6C27476BB6AF2DDF878F223318B1ECDC0B8FC4D1010C1299A14
-83169C33DB33166F1BBBA3197AEF05A8600891D61947E919A0002297CFABF727
-0204E391480B6C4ECDFB94567478AE392F34CFA124CD2D2637ECD95197F371F4
-92CC9A34BE0FC2EC3E7A05E25D1D76157E0F59734C3969EEE34E164C7BA3829D
-EB3404CA60DEDA0EB05C66D78234729EFDC442BCB0878530CAA0B8EFFF57F74B
-9D3F8361A24E3ACEC3A1AC34766ED8C043B6FB579E873758C501F81939E79C76
-BA612E0F349E8DC891303776A7702C082D91CB23D2F77E08FB2EC60EE73070C6
-4E033D300A5D26F59C51241BDBBEE8DD113EE54CF6DB8642063EB84ED1CFE531
-D9E90C0A972CFA4674937455B30ED726FB98C786CBFE0CEC95EB60D2AA279F64
-C723DBDD83BFFC077DB57F399F2C6731145390B4DAFBAB65A25E0B41E617C71F
-9ADD86B4CC8312E8AEC23ADF1096031DF225F59D890AB7AD5DA0CC8EFE1BC2E1
-A5360CD6799FA342B89290EA741B84A37CA3D64297C8DC6B5ADC401329873763
-E227DD032DBF2164DD14408EB89FE313988FD9335BFF72AE9A5982ADFEE44A08
-D75DD38EB950C579CB6BA4B381FC43354CD9FDCB691C413BA246F07E81764507
-E20F37B02E320E2E086179CC60350B236E249FF196DAFB94242CA7FDA746228E
-1EB82BDB89AE60C453081FC2D1D9E546376F4464E9AEFF63E8CB8D6B47A4D499
-6BB3A0A8744679D7D1C05AE44E98D7325A6402228B87AA3A410367E956D24807
-07581F6AD7932EB450EB16449E1A40E7F250A989FEC92E27AC6AF78826FA6885
-ADC87FD6C0697F41BA2C7C79D777B344037BACB220B1A9A657030A5965E025A1
-F953185214804459E96A586BACC62FBEF3CE5954EF1C61467F5514ACE043D448
-5D038438250F1B85463F8A324962144F9D7E1C328816994DD3A9B31231871091
-5552844DF707EFC3F81FDF4169CEC3A1C38E24FF0F0AFACDFEFE7F745CAAEDE4
-04A092E5809AC0EA02C3F06E384B0FD60AF369F9A9EA85667035DF87C5858BF1
-603E9A419D4D8DB73AEF26F7AD52E9E394557E1B2B257F0DF026A431A192ADAD
-00BD4836B2C8B54D646E8EF9E52B0FB19C4FA322409D09BF167CAC5ED3A82A48
-C8FF640CFE6D091EB6032DDCBC50F9A593B5FEF9976C67CCF409F64207FBA557
-77340CDBCA6F7380B9E2B3243FE805C4B69A3BA2FE1830139F10A403CAAA7ED0
-BF5386C7D3BC998BCA4ACD968401DF751A7EE9492A690BF0D521932FB4E63761
-DB383CDC362D8E5A563BDC4BD8D2A1DB5D900B8FDFB5329CFB85603967C42502
-0947B3FAA5AB0A96FB08A464817136A4F5BF988080CC0085CEB42879D650466E
-1B972B717B18D5CDD21AE47FA495641374CD156A4F726A291D4E7C5CBC042DD6
-3D119BBA7E7163F6AFCDAA9AF22A83569D2FD35969143D992570D905A90F247B
-475E253081579D0B75467A329E5B5F124DDCB602D34D12D72ABEB65E41C5C919
-BB9B1638E41165C33D20797C3755AD71F53FBB70A0FCA76D52B33097C3ADD50C
-7CE5AEECB9C3378538FCA2D0C5928150FCAD751DE3611F9E84ED2A0C6DFE70FC
-4AE33F879129C961929BAB02BE32CF4070F8F4F0BB0158834FB0C605A3CF5490
-4BED0B1E98A2FC5399924C4D554E41E74CB58A21200E6DD2AA0A734679EACF7B
-97D1030EECA997D2371712690F8D8CFC9A4EBCBFFBB9F4E4BFD790A0F961B95B
-700A2877241797ADB1CEF48AE70DE669C8A8E990F7EF38F24C269734C4E230CC
-FA6B080559B635F5D5F78972786469291A062617CC8919F2C8CE94845E955DE1
-F668AAE68051854B3766B7D14962EA3C322845BCD8A00341B20A2A6A90A77DE3
-EB2757A5DF3D6292033C869AFBF5E58F4E4C0819504B93F88E6F116F39200A19
-FBF1236080BF69C9F77C53413323BC8250901D87175E2402926C33726D68FF1F
-AC4C38FB4CF0EC80BF1147AEC15B05F580E4C51B2F5F01EAAF8095B02DECB458
-C2B6D8D951BB2E7DE70C31E4FA5A4FDE49AE7E89DD82B217D6579A00EFCBBA91
-14E991022833D0DF8CF05A1BD852C1879779176564B121F6FC64A795666A8920
-24DB2D57D0AC1341F032403EB030CA99BBB31BF216A87FCDD7282C4497A99AF1
-EF9E7DA614FDE80B811D62C995F5178588FFA0DE8C76E18CA223BE296CED4016
-A8B92C2C727C4E5AEC2F0C56E1D4E004FC3414502FD82A29EB4B87D8FEB92155
-F56C4C27BC1EECDDDF5F224F935CC45D2509E4AF6227C89C20C250F7C823911F
-0E1CF6B31C793BAE12A61A6BF5C8DAA299201D9514267D54A2D201E4257AFD7A
-8BC070BABCBA91F449CB6F546A92F87ACE058EC39AA84EBFD8FAD238EBCE0D63
-0007EB216406BA29C84FD6B9385577D04222C305114F3B59C186604F67C5AC8F
-4546B1B55348E1E2CE449D3A28562FE514F36A77F66A71CA91EED86EADEED4D1
-07F36C67AB83B0BC344FB9DF4960D11FE02EECDBB829B0F2AF39FC9D02E75C5C
-5D3C1BE00FD913F35AB9B9F693E7C9BE6B315B35D035585ACA19CF2C7CCAE105
-349E30AA4F57A63149D9262028C53EB8129E0F15EDCC7CFC2CDB5FC190B1010D
-9F198949F56402888E3C7892E48408B34D9EE3E9418CFF92B8418498297E2449
-E7F92E983348CB30D76BDAA84DD2797D822D6F26A582F8A338B9D4D370581CDD
-34D0D334CA8D7616E448C86374B65CC0131010CEF730785F3DD5ED2E26F27011
-CCC7B554FEDB02B6DEDF48CE76591CC110C65FC5CC72E7272FF63F07516AFE39
-11202DC05097DEDBE384E8DAAA2F2A422565FF426715A849EC159220C8CEBF65
-1E4FDE87CED9414AE86D6D2066F8CE0AFD31FE5A839EAF3092C2974FA170835C
-31E8F1883E82EDF30AA1BD6AE0C5FD22DB9B1A53F27E404E2B8595E241843B95
-A9B16F40CAE8F8712E1BEC901165E4B64AABEAA93A544682298C5703620E42E5
-F8536D0DACD0274B1B13805CDC0ACFD5A242AACF29B8881EAF29780B65CFD8EE
-21524F3F845BE6D7E8D5CF594B0B15C50A9B5A2620907241DF6100DF4AD96AE1
-9BF9254162CA6386079FB93F1F88A94BCFD6E47B1CA020129EA7F34E9A261581
-615C23C8D52AFA37AF575417C814E74D56F08AB575D44B2D0C17274BAA5611BB
-8C61D49D7BA9343D8998110796E4E060523BB6B22F1D5DEA9CF8620D29A5CEF8
-5EDC173ED7142A121F0E472BDFDB29E721A825FEC5013E8794B8D132E994D583
-412370CCA2DCB10E3A5B49778AA5B4489AAC9918D4658F0E43F10558EC41D454
-FF56C8261842EB93FF326EE3856FD0A25AEDC72CF966CF6FF46383C39C44836A
-22485CE993E3A0578466FC77106CCD2195126567E11E54EFFEAF8F40BC0D1B97
-634F8C121D9B62648DD61752005891596F40EFCF13A2276A4C187CB66F0B7949
-BE95486034B3E66445AEB24A084F8E535C754892FFC156AF7EA8315A1997D3D3
-FDAB4CD7C426F839FCC9BF4506C3A9430F6963AA8215E44D86ACEF423291375F
-F6242DDF87980A9A5E55DFB668C74F123656CB625E5E335D2CE989FDBB269F18
-432F91A9E4D62B32E6B9BC8AB5CA32649C98597DDCDE2F343AD7E61F0F54A21B
-449DCD1FECBA7CCFFFB5B2090D90251DF0E92CFF6FCB89B5A4FE39F78E9B817B
-90FC9CCC283011B96319FA61E5C1BB9E2A633CB9BC346D08ECB3AEC5A4E36A75
-CF8843027E2B411B4410B5C06F3B83A37442D06B4BA57316A7C9DA5956B0AEB1
-C7A221C939DFB559CF0FD174C3E9D917DAAEF97391558C48DD1BB7992B14A8AE
-55B1CFB6678C44305C03297D61D45A23A162A71873ACC77FDE7501DEEA302144
-11A8EC2224408B7B4159154C4B1CDE75D5A80FEC50C1E123B6E0ABB523B90F07
-91E363150E451670DF047132CB503719485BA8058750DF7E7961AC02B84FC89E
-B8D57BCC582C6D9754CB90691F65EA57AE3D8A7F61B70AB95FD6C05B0E0D107C
-7560C1C8AC53A0C5588A14412A264BD84DF2A164B1BC8CA599C58A8C581DF0CD
-C9B9719A9CB243B95A41402C29F2F56C71D253FC699BBDC4F2D2FAEAC42AFA75
-DB38A8EE0398BFAB528832A80D3ED42E9E3F3375F7DA493A936EAD1162DB55F8
-79F31A554D8BF98B5E1CD6F1ED1FF319B61F5743E24FD64F42873E0BAAE0754D
-13634CDB4BB284979BA95CA517BCD14F2BC5B7ADF3C105B5FEC0C9A9FC25D662
-0237C84F75CD28D122E5BA85BAC7CD5D8A520DF718AF068A62E2B9D20DFD2E16
-B9DB0234564337ED27C69DE8881A6493AF8FDBB5920CCE09D5C1FB480540C2F1
-980A6D87A4105B168D570BF0CB65E2E03860C838011393C9AF6F6D688FC52770
-EA668A2F714A1F61F77AE35A1F55FF065B799C1028ED8A5E0111581FB14E3CD6
-BE1A98601BDB8B3AB76C58D31A1EC0C72EB5965CA5ACE2E42C73DD7DF21F82D0
-1A3331DFA06E332B68858574FE9CAD3E3D720C17A2D92C53EEE6B58B230316A7
-5AA30C60CC672E473ED311E7D38C4EE2809C29F2E76EA3F5A474E6AEBA84862E
-7BD677B6D9AB0C2B501BD929354DF6A3CBA66FE0FCA49EDDD22D6E660085C421
-533D735684BA3BDA798AB2CF9E8523B16389BD242E0D19953D83FEEEA8ACB5CE
-5EAA4BD530D3F8C8CD72D3EF90DC038E2307A58D51800A5F9C62025039CCA4D3
-07DA0A0A0263FCB71E20C9DDC7F26718A2D1B5882C7BBDD3244701B62D890C48
-5FAF33407E9A5E4EA5D1C6910815BEECBC69FDD837E51154E84FF784896EF91E
-DC45F60F9C2FB8C376B5728C7EA835A807DA811A64C3F8C7043FCECD580B0B02
-F0E23F84CF6335F261F030FB1CEA8C261EB1934C750B34039A5799356B79F65B
-1CA31F02BE58D8AA229FD20CDD1BDFCF6199B6C5B9FF6D63C3585D3475C58E79
-8FCC21AFEDD5D5CB5ACC9B0F6AE689BEA23DD30F02858CA6806DB4248C837B60
-09D96D24C0E2CD5F4CD2ED50E60D03CC760D996B108017B26563E5E8FB203D96
-15FA47459C2CCF99556D0F91E5E6DE0051FB6914EA99F0016627491BA5176383
-AA37E3A49B58E488F1D6D37CE2EDA15AC652164007171D4BB2E1EC06F7ED225D
-71AD96534DC26F8E167179AF8714137383561BD7EC9C5F8ABB64C334F1AF280C
-4E70CA3751C2ABF7FBA2821B286A9F6DDA9E769646D5878F8860F02B8FABA6CC
-A82EADF9A45A30889AD551894A018B81093344C6CB0D59D09D6DFE91112DFC9B
-5F0387D8727D1963415748D482FDD5AFB001FC249FF5B02DCE1D62F011E553B2
-E767E48A1CAB27FA0237E35464C55CBC199F7596FC2F60BD9D853D825498D381
-D52C5FECDED23525AE02234F8AB609EB0339B06A46BE7AD7DC67A08FFF568B3F
-25C071294F839F96C2AE03BC57DCE13855AD7400D7BE881DC5E34720F408DD31
-B6B5A33E2BE89889F0F5868C71602B086EFF8DA6554640A822B59D547C1DA709
-E29964B2E321E2E803684C8E5D64384228714509E618BFFCE97B1298203E144E
-FD4E16F8C2B37AD390CA7A59E3ABDD281B2B41738C96478DEFF7DFDF45BD60B4
-BFF2C7E57027AD51112808DF8E36F0423391C8328E17AE3D71B3EA2958720539
-5182BF85FB826E5119E4D56BD5C0100647B190B3F2F671012AC37165C85962B6
-E1679413DE6F824482AACAE6301C9311BBCE073B1349BE7A287D9B6486A683C4
-4D4C541CF4667B55EC959511E0FB0DD4BFDE5F7F71341598CDD86CFD646C22C1
-A2919208944AA9C75A62F1DEF2AB80DF12023564EEF49D56B0D6D05FE2757BA8
-66F35AB485083ABE685486B81B68082FFE98C89CF09D0171A1FD0CB866E94AAF
-AEEEC73F2AADC9F1B1ACD6545BCDA0CE039891B541FC674F2D6831ABFFF143A6
-8CBB10ACE99ADAC14E99ACDA73CF808B10E87B42DF4AE186BA18FBF828D0BC09
-A4A1C10FE4C47233B57CAB00B6EDD73A38F345609EA860C884E22597A1AF21A2
-4EEA28727C1A92FEF237B84507B38CAA4C66BF72CB2CF1C7F94562029B286AAD
-BF01AB7FFA13A1E0D33494802667C5A3EEF5D51BE02AC508A997B5F09B747089
-2D7C3145EE5A9E7C15DB5AEC8304FB776F15122DF7B939265D4FCC43488EB42B
-699CE8F68E943B035FA1F378E5621BCC00C810163737632CAB6826161D90448F
-3403C32EB1B52D7FB65149EED419A765D56A05FE6A2706D998DBC84125D617A3
-37351C9C547ABB6F1AB4FADEA5A265AF4D9B45BEC4147B6CC5110251A426350E
-60F3172C40805292170B850FB347DD98793AFB38E475AD2BF38F8628987E3F50
-651114D1527F030ADA4D61944E677977BB8EEE0C1EF98679246CB1D43403311F
-5F09BCB30445487F82ED268577F22479EFE87DD0022D42D3328990B88601C3A0
-D5A8389C4578C3DA01F653EEF9EB5D83A98A6939320FCD6F5B6A5A60FADBBCD7
-E5A7DE5A95D1CC7DCF5A051C652B767FCBC59D61AB9FB5141F393F2028879995
-4AB737BD26D81232CA8D64DAFF989F878537C305BB5C09889235BE3727BDEE32
-EC5A4D06A68746CA33CCED3F1D456DFF0118E993C802AF0C3136FDA8B93BC16C
-E22A5C124972517594A82850CDC000F6505A7C5AE9E75800EFEC3815C130EE25
-547A326325271049D9B178E23FC5FDE8880CDA9C903EB4B8A44F85620465FF4A
-D097A6D89A8B644E7D9944E180A3E1EC6D2581715EADFBF3C2BE3B330B1D208F
-B84C4B98E999C5684E9843E6AA2F932D1813DAF4931D12AF17FD2CB2387751D2
-5D14CEA4C66C48C7E6FD61BA6D09E591188E7CFC0F5C306672481FC77B5C6D84
-F589673C4F4EE90E2D3D1345196A10907A22585E7D55A9620FD7D191956DF340
-4C98AB5A8A3D98798F2581D409FBACC2419A031666DC9967DD10A1A565A98672
-BDCDD345FCEC9BC08698949C887E90EAF94B7CB450A9C45FCCF289DEF3380309
-D7644EF509BCFF5628ED51E056FD7848A2A36E30551E13B2A2921AE2028B2C4D
-902F7C901BC54F945AA1AA018EBA00AB9A2FB36159147C74880C06A26092B54C
-D3E6DD432A3507FA11384F0C08C68942C26ADD98DBE948D854199B19B0421687
-7FC55F9284AF035C5C9DB4269FE72FB251030F9A5A31A75FBBB0DBB1151EC785
-08F8CD88D6FD5A700AC0F6E0F37536C2F1228052846C3ADF9DDB7D56A57F19C1
-B8382EB996D8FECE8F8B130B89037F9FD4D58426049F99B840F337BE6A9427DE
-B68BA69B32A301263F8881F35332FF35ED6BC15FBD4A8915C8CC37839BE3944E
-A15701B8FABC6D533FF5D8C96B1D599DF7E2738996520A0702307E3C91A476E5
-C76AA881695D7400238B4EDC669BE334B84A66B9427432A3AB970D55A899DFCC
-81F7C68D637F77121B75C0D6C073CD14A7311799CAD07684A5C0F662CB10CF9B
-FDC4CB98B6E7892BFE731360E35AD6008F8154E419FE86FCAB0264173127B1C7
-92D6DAC832571CB2771F9EBF2486F61FBA0D94DBF0795D5653EDBA2F7441B683
-C3E77B314D02C049282E7B749B80C326DE8DA52D632A1A9C3C84198785161129
-D527239F456F6FA14CC264ACA06DCDF408278CF105A3786073709E365A85BBA4
-74A20C47CF495A0913CE079F33B71BAAE3928C18D59B2DB6A38E54EAD9FB87B4
-EA6D147D264E48E665A4DFB466A948811DE66770B0774C80BC2C54EB7452017A
-52AC312508C6FB6A4DE3570A3DF50EB00540003382B91E06067A3D11E1DDC023
-5EF8787F1F1015152BE7F3D5F88EDE778E946768E4E333288F4DE66D604822A7
-5F2D5069B6CAB613145652E07F608A093645EB6DA6A9B231EB5EB31C097354B4
-AF54E8AF3455011E51ECC74FEB9847FEE3C42DB441DC3E39DC1650E80BB2D530
-823B1246699B391341E7D7BBE42DE15092EE2FACECE3B8290FBFE4567E4E3B09
-973088770EC250F55AB5FB3E7ECC7537909622252E7967AE84368FE204800BC5
-6C51A8DBB2DF121FD04225015DB5A39A1D6241C9874215D115A58D8329E752B4
-D5CE3B1BE30D1703A044BA14B6C71F406733E771E8F9FC662C6DDEE86BAB4F68
-DAFB63D8870938C3149CC07F6660AEC0296885F64905B8BC82B317DE4DD729C9
-5989533686291EE980EA2470794FB3DEBEBE9E41F9BD793CE4DE37D9821D44EF
-803651668599D59FA7D44526F67C73C954BBB28BB25BF8606340755D02B23C42
-094CEF3CD30B04B9AE08FCDAC339FC1A9DD2008B0FF3C1F68C328541FDE6FBA9
-98DE24C4C3B3FC7D3B0D86FE89B6716E57BF46CB201F6A5EF73F05444D024D34
-639BA30B6D6F1A25D7CDB89D79FFD826663A3DCE5E9F4C72F06DD6C32A34CD22
-A7A1B7E3CD27707F4F09EAF284ACB3D960A530D4932D08028CFEB3AFC2D59170
-730ECD5D19B4D23108944CB7649AB0F1F3C286863A6A34A964A879D63CE05F1D
-FC11C5B69374F1993DCCFFC99D0E597C3BC99DE67E5059FF0672F79938F4CC4E
-4C66D6DCB0239444F2E614D09692297C7329411AA1CD5A540F9D61EBE2AF8B58
-DF46F4065672539C326B50BA1CB54DE5603D0799534ED0BE40AD5C72B4EBEF40
-A5EEBD414F1639AB6C955557FF9BAA0B62DBD32895B0DE12FDB66694F3CABABD
-7D54F0B29F8EA32CE746B652CC9E44EA64C3F8847053D8E50CE044C990A7BA13
-7B1B0F4B2FA68D08A82C30E800F8B26CC84495B222ABB5E41824953315CE7F22
-6D8FB5AA10A3EAE16A1B5BA8A283854C5A1735D5F628DB64C8DA6E51C727EA1E
-C3CF188BBE2473E9112529AA6A8DA151DBABCC26973531DD69B4A14D9783FF33
-FCD1672B629CD4DAB4EF573DFE9C3BC550C446A34940BE4437F43CCD16CFA3C0
-537ECBB7DCE1E76D9FCC2EA5E9E5656F7C7A3FE1611BA6A8AFF0667450A4A8CE
-0706CDF854B4DEA79C5FC25A0556F44CA3593E89ED5881ECB5BB3EE6572F8F2D
-4D31466C9AC2350898349C3208636F43D1EBF5BB2F01DCF827AD6C205F3B381F
-800D5F4B827107AC881BD66BF5CEED3205535C8C3704A02614E6233344667C48
-570C4B5A3326D2F58A6111AC9B0CA7F3A48DEC898FD5AA05929492B8FF061E1C
-990E08AADA5E9711658E30F71BA41A7806BEB51BE0949777E1550F54C66B8AFF
-DF4129B42B71DE6101C57DAFA63FAA169145C0D6A0D6279658431E874C32250B
-AB0B09056CF7A096E7E644B5B629F275194CB0CCEFC7A802F123A587156AB136
-513A7362EFC4C0EC330E11C3E25B9A943D2BDFDC1EA5C19DA64B47E690C2726A
-0C0708F7A1DB146B80C6E8B4D30D28F6E8B7A7505EAC296258485AFF374652EF
-ED73EFC04C6CFD28890F035DBB7A0CFCECE8AA68FA622390B782E595D4157106
-802499D76B0351617B5CDFF4F7F758DAD993DB5628B346240DF540E821144C5B
-D7FAC2C00B22D8DD374C6FED26F619FF150AA2292A9D03AC7F5F6A20B3283890
-C80DB07E6923B6C485819A849BA8A3F18F7B4D309802AB3D489587721417A2DD
-0B1A4D9994E3C611E3289465E657939EC06D752330EDD2D475E67F345C3527BF
-0175182934D53176D5877D064F6FE1C1D559DC657E4C2CC83FB022A38E6E406F
-E8F85B556F9A771F4DDA35AAE7C76DE0CCF5C2A9D9F4AC946C1A836553D792C3
-F2F8FEFF9A6D7DAB2FA5F0C9973FF8E3206680D96ACF9CAF54FB6274B99E3F9D
-7E2B64C85EFDE220C15BF9F4AB5CB772197464078AE34FFEA9095DDBE6B0EFE7
-4AFCCEA58D12EB46648093EF927A8E600F0D4E239BCDDE8DD5AB6A651018E932
-746F18584378B3B4899B6E5E7B3C742835BBDE2D9271AA95E1E1C714F51B8D08
-562CFF8AC79F495578993955611AD98303AAD37FEA8CF9AF63543C1B4DC0281E
-1269CECEAE77D660AB8800EAF547ADA30278345A189EB7CE9B03B936F3511496
-84E87A395C9012C66EE994141779E4282AE968FFC1E764C45751CCB23049BEED
-069E6AC75A8CA8D115B4C269C8E6EB3047E0A17251D46D389F43809423BC2A8D
-1730A54F8ED38019DDC4BC752539AA8FE9514EBC42F74FC8B50A850D09829810
-4CF7546878A85B8A9CCCFC866B5C30E1E5295E50D2E05F02B414B04830756970
-09BE8D4898B2CB6D2E95FA6890A620DD863B30C1EC77C08AFA711EF6C0D45878
-2E93BB6E2B4B44A5D24C55C22E6D58E4AE93A566B5545783E1B54B937D68BF21
-45A1CFA44CA87DBCEC8EF7A309015EB883D14BFD9DC89DF814697740C100B0E2
-1A5DD11DEE47681B153C4CFA026451660213253618E16F5C3B2D590363786BF0
-83E23B438E0FE85597F74C40611C5D3BB944108416AE0960432B8E59D8B64197
-81DAC51D615971E976768826B90CE2C563E498B8EE3A2D28546814F3D7E6DA78
-217C56ABD4CD323029CDB3C01B1885A9E12D5F92E773F31B50E2DC680708B37A
-F234AB215B75DE93E7912E20DC4937EBE1208B476DD8BCF68F115B72FA76AF8B
-B14AAC4AC7097D55B469262970369AC25526BDF3EFA81563066A37A4A71C19C2
-27611CF279C483B6C0CDE8B302C531E8F776CD557D91F348494088D6AC9CBD93
-7D0935EB5CE4C558247EFE669A39C56DC5F683337235E405BDB83CCAC1EA995A
-7E437ADB4B9576683D8E6776830D570699D696B0C233BDA475B1909197F57B04
-92A0A6F9D72F4E8A56A71CC7F4729C06A5C4F9915FBA4857276A50D2A4B857D5
-3F20433EB0098D714E526D288CB0F36B88B989FF98EAA2AC2FD44DE6E0159E98
-341459E97C035442EE8974C465ED07924FE76933E6C6B2D0D632EFE2FDCEDF92
-6D1B58D9266F961916E0B21C7EDA8533638DE541728C38225C8EDBA3DF56D9DF
-7CEE29D9EF955215974AB20AC024439A3730BA9227B1DBDABAA2D83443CC2F57
-21F0ADCFB8C2AF6FC327F9AB05C646C7BBFF81F3C3DAD7840CB477A2584695AC
-45BA0AB785FF4C993900136B6139E4D26B5EABF1BF17A80C6370CC2BC3540A0E
-4A4914C8F61A9608DE06BC8DABAB1492482AE665460981F4258B05E8F3A197C5
-30350BEA2DC89BA16224E570290845A6C7096C0C7707DAECFC85F9C853B8D65A
-616E3323082033D542C13FCB10BCBDA0BA71445145A511641BD12B35AB5D8E74
-11D5EFEDE88EF9392103EC087932CF217CB44935FC6F99353CEC68F814950518
-EF919470486379FD02265F766244436BD290C65600D964044989C7F6A9672EF7
-803021A9E4AA6818125000EAE5F90D382AAE0908A26FC6083A90B88FEEC0746A
-9F008C010CA98EEA7AAEA307037D2CA7200CA9BB68916CCAAB05E57FE7164A7D
-C3D820303340D49EB29E6EF22A023F2D42D67A664F38C4FBDFC9A31A28A02145
-E38CC211BC73DF5F661EE9A3CAA076E43EB233583865289F66A7ACBE315AF81B
-AFA2CFDE8A20549941EAE2E73E33BD0EB8D075F492724BC444FE8953F5F77B2B
-4E7378CE552F79C360EEBA56B64CAA47DF10D14402EBEDFFF7069444AE3EBE3A
-E96201E14EF892868F9AA982E738DCFE7E8DBE41C8F43A227EFC9EED795F5D6B
-40D3A08D867F363232B20C71CF2E44B884A8CF28D96A028BE7C67DE00765793A
-B1C867F0DF3E1D578D96428CF1E66632EB746C4B71314D5D009BEC8CA52A7518
-89B9255BDF988262A4BAF717FAB90525C81C223D4936F0AEE0E40908CC9E0DF3
-17AD71C0F5009CA00E1E6F8CD308501356235F63CB112C6760963857B6B20A94
-7FC16C899A7EA6743267F889D070698554DECE912C6052E04DF59FC85E67561B
-3C7345EA3E21DB7206A14EAC4F46F457A83C1E2877B56EC49EF87B9B363F4B77
-BB6F51C3F1454325010AD71E28E935E74924A6ADA4A08C6C723276CBD4DA333E
-C3590B7FB914E25828CEAC502704BB4C8C0C64395EED986F91D8C940D3F0ADEF
-1F2749400B4D9A8BEA50CF4732DCBE21A6BA4DC17762BABC34DFA16EBF988574
-6B6363A6075CD4784CB799E35D29425D55AF001F51E565FCF4D18E98EF3C94C8
-5B88BC96A9157BED2529803EDE8E42BB57FD504764175EAED257D6E62CF9A17F
-3E08727A38A0A43221BD62CBC2818ED5DDABD2E2FA6141D986229528AAEE7C73
-532A8D78FB8FDF433022F0EA43B63EEC52D3829E84AF010A2A19742296D91415
-42F9E632FFB3F0D8457AF426F0CA3B9A1D56DABD0537C9B5A9CA82E42A647CF9
-BA8D38F49445387AC896F16D85708BD8CE4BAA625EA09621EC17FD1A1377807E
-DD68854483E84C181532D3B70680773CFE5D580712FD948F5D34354394D4E502
-6AD35AB042519E82177E06284CCAE4AF2C6D918FB32DFF205E9D9C88E31143FC
-66DC0572961089CD0F2AD2EF82CF204E8AAB1F0122130232ACE276B134A9BB0E
-91FF8020FBF69B32C93F1C10026F6B2E1D40796313D974E066BF799311595012
-59886A161B669C22EFD773802ED9321BE23DFC3240D170BE8499E1735623A130
-054EB5EC958884699867E3C94FFE49CBC9AD6C3C935E56C0712CDEB13BA92E2A
-AA843CD9A30BA3C01ECC284DA4AEE6689A1A9E3D7D0F6A144C658F9441E730FC
-24831893520FB7D2C69104E56D5D49DD6A86152C9BFE88F6166104AEF80B992D
-406205CEA63C31A7B46D6B8C9A1782A0A0A30DD52066642554735406851F863B
-BF981B4C8DC4882A03BCB160A06D18D72E61A49A23163BF92D091C35CEE0CB85
-04E3D95F3E98CBCC53B0015AD136FC481078ECF65B62EDD8EA3EF1B938119D10
-36D6D85412D1104BFAD6A4589C17B40EEEC5C3FC90933D9095B49A6956CF9F61
-E54384137A39A509200B0E51C1625CB599A91B287744677E059E6BA039B6146E
-791EAE2676D2E233F2659C92A10D32A055935A193D4480B4E7069D3DDEEAC166
-1D24FE041BDD02D1A84CD43C43331AFE821B4ACC22F165DC53890D66606FA10C
-B83E2BBA03C826B958FA79C31E081B5396297013A70E1FE82E76C8512402EAE6
-840E5943B19623473FF8F215D6332EC26D1DD0760142E4296287F98A30CB2A82
-8A639137E8BB018AE16F54FFB9100F533587B4812B5A7EBB0C2DD22D20F1B55B
-D241DAA8614240F2B528CD48CD2F71496F181A94F181F7E85D07E4180CEFAB87
-57090401893BD680891ED7E7C9218409DD4995F3DF56E77F79CD06B9207328C1
-1427488F5876672E3806D8B8E0BB95AABA421B6629EA9A5A5FC811D43209610B
-F729AA30565DC4C4A2CA67721FF1F87A4C4B26BBFB2B68766840DD148024FB21
-F2750EFD0F31FE624CAC5D606B6C14C15B1FD7D4DFF182F436399C19F22C9F57
-F243086E319BFFD7412871031E5226D494B41EB70093103C606ACD02F6B2737A
-31C6DC7E3617F617471C37861161C799646C1CF8B60E9A5366C3A9EA785ADFE5
-2AA75D252775300DDF7F463E15FF6EAD513BC042837243F8514AF04586F5E451
-AEAA68E3C96574415497576D010A6D68148DE883083070DAD871E8F151C1C1F2
-2E82F50EEDEE298EE66699BADAA6677586F59AE3DA5038F513FDCFD7978B2829
-794271AD63CA26EA8970DCA4F32B57C09799C9B8D78BFBC50FD36A3F3F254799
-B313915C9640A27AF3530C68FA3053AEF80B2659AD152CAC44BEFDCA211EFD6B
-1DC6A25A08183879CDB74DD95EE2779416C0B3EA306720FABA153F3BD94B0DC2
-A429050A7D6B7B5A54C2AF4F45194667C3CF2EC4014444717DC6C7100035C504
-216661A97B632FA32FC1E021AFB75B395ABF844C558122C416F3CAB82B4ED56F
-15589E9F34CCB7C0C7F7B5FBBF48169105355F6EFF2F41A212C24A81BB9A466C
-598B921E0CF721A525187BC75CB3B2DE6A94205517B2CAA504F351BA0DC5C26A
-28CF5AC9DF3C81B888AA3C930DE00DA50DB0422A0D85A00C7E2AE3061E1E17DA
-55B3E3C998466DB8337E81059214406CC58CC1C204EB3D435C50B52E14B91905
-CC33F6D9C78342EBDD3033EB6A8D41530105CDB05B2E67606A022D366284CEC8
-6BB9FF090261A42EDE521B2BD2D955050F3BD2EDE7976A68F17F889943C369FD
-564CC15CC19D082B2EF4FDCB95E835A0CA799B4F8B68215006ECC332955837F1
-9118D86E07EA5D7815F66D3907EFAC1A2B76845B90B1D385EB08434B5DB96FC0
-59A97A94E4C21015EE22E04BA4A962F5ED4BF157A6
-0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark
diff --git a/lib/fonts/micro_40_50.qpf b/lib/fonts/micro_40_50.qpf
deleted file mode 100644
index eae4a5bc80..0000000000
--- a/lib/fonts/micro_40_50.qpf
+++ /dev/null
Binary files differ
diff --git a/lib/fonts/unifont_160_50.qpf b/lib/fonts/unifont_160_50.qpf
deleted file mode 100644
index 2288575d78..0000000000
--- a/lib/fonts/unifont_160_50.qpf
+++ /dev/null
Binary files differ
diff --git a/mkspecs/common/g++-base.conf b/mkspecs/common/g++-base.conf
index 4254551994..c42c46b0ec 100644
--- a/mkspecs/common/g++-base.conf
+++ b/mkspecs/common/g++-base.conf
@@ -27,10 +27,10 @@ QMAKE_CFLAGS_USE_PRECOMPILE = -include ${QMAKE_PCH_OUTPUT_BASE}
QMAKE_CXXFLAGS_PRECOMPILE = -x c++-header -c ${QMAKE_PCH_INPUT} -o ${QMAKE_PCH_OUTPUT}
QMAKE_CXXFLAGS_USE_PRECOMPILE = $$QMAKE_CFLAGS_USE_PRECOMPILE
-QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
-QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_LFLAGS_CXX11 =
diff --git a/mkspecs/common/gcc-base.conf b/mkspecs/common/gcc-base.conf
index 27e812b3a1..6e043f558f 100644
--- a/mkspecs/common/gcc-base.conf
+++ b/mkspecs/common/gcc-base.conf
@@ -86,6 +86,15 @@ QMAKE_CFLAGS_SSE4_1 += -msse4.1
QMAKE_CFLAGS_SSE4_2 += -msse4.2
QMAKE_CFLAGS_AVX += -mavx
QMAKE_CFLAGS_AVX2 += -mavx2
+QMAKE_CFLAGS_AVX512F += -mavx512f
+QMAKE_CFLAGS_AVX512ER += -mavx512er
+QMAKE_CFLAGS_AVX512CD += -mavx512cd
+QMAKE_CFLAGS_AVX512PF += -mavx512pf
+QMAKE_CFLAGS_AVX512DQ += -mavx512dq
+QMAKE_CFLAGS_AVX512BW += -mavx512bw
+QMAKE_CFLAGS_AVX512VL += -mavx512vl
+QMAKE_CFLAGS_AVX512IFMA += -mavx512ifma
+QMAKE_CFLAGS_AVX512VBMI += -mavx512vbmi
QMAKE_CFLAGS_NEON += -mfpu=neon
# Wrapper tools that understand .o/.a files with GIMPLE instead of machine code
diff --git a/mkspecs/common/qcc-base-qnx.conf b/mkspecs/common/qcc-base-qnx.conf
index 156ba0ddd8..bf404e52df 100644
--- a/mkspecs/common/qcc-base-qnx.conf
+++ b/mkspecs/common/qcc-base-qnx.conf
@@ -45,7 +45,7 @@ QMAKE_INCDIR = $${QNX_DIR}/usr/include $${QNX_DIR}/usr/include/freety
QMAKE_LIBDIR = $${QNX_DIR}/$${QNX_CPUDIR}/lib $${QNX_DIR}/$${QNX_CPUDIR}/usr/lib
QMAKE_LFLAGS += -Wl,-rpath-link,$${QNX_DIR}/$${QNX_CPUDIR}/lib -Wl,-rpath-link,$${QNX_DIR}/$${QNX_CPUDIR}/usr/lib
-QMAKE_CXXFLAGS_CXX11 = -Wc,-std=gnu++0x
+QMAKE_CXXFLAGS_CXX11 = -Wc,-std=gnu++11
QMAKE_CXXFLAGS_CXX14 = -Wc,-std=gnu++1y
QMAKE_CXXFLAGS_CXX1Z = -Wc,-std=gnu++1z
diff --git a/mkspecs/devices/linux-imx53qsb-g++/qmake.conf b/mkspecs/devices/linux-imx53qsb-g++/qmake.conf
index 39462d83d9..8572978cb6 100644
--- a/mkspecs/devices/linux-imx53qsb-g++/qmake.conf
+++ b/mkspecs/devices/linux-imx53qsb-g++/qmake.conf
@@ -11,7 +11,7 @@
# export PATH=/opt/imx53qsb/x86_64-linux/usr/bin/armv7a-vfp-neon-poky-linux-gnueabi:$PATH
#
# ./configure -prefix /usr/local/qt5-imx53 -hostprefix /opt/imx53qsb/x86_64-linux/usr/local/qt5-imx53 -release -device linux-imx53qsb-g++
-# -opensource -confirm-license -no-gtkstyle -device-option CROSS_COMPILE=arm-poky-linux-gnueabi- -sysroot /opt/imx53qsb/sysroot
+# -opensource -confirm-license -device-option CROSS_COMPILE=arm-poky-linux-gnueabi- -sysroot /opt/imx53qsb/sysroot
# -eglfs -no-pch -opengl es2 -no-xcb -silent
include(../common/linux_device_pre.conf)
diff --git a/mkspecs/features/configure.prf b/mkspecs/features/configure.prf
index 6b37a04450..92c288cdb6 100644
--- a/mkspecs/features/configure.prf
+++ b/mkspecs/features/configure.prf
@@ -67,7 +67,9 @@ defineTest(qtCompileTest) {
mkpath($$test_out_dir)|error("Aborting.")
- qtRunLoggedCommand("$$test_cmd_base $$system_quote($$system_path($$QMAKE_QMAKE)) -spec $$QMAKESPEC $$qmake_configs $$shell_quote($$test_dir)") {
+ !isEmpty (QMAKE_QTCONF): qtconfarg = -qtconf $$QMAKE_QTCONF
+
+ qtRunLoggedCommand("$$test_cmd_base $$system_quote($$system_path($$QMAKE_QMAKE)) $$qtconfarg -spec $$QMAKESPEC $$qmake_configs $$shell_quote($$test_dir)") {
qtRunLoggedCommand("$$test_cmd_base $$QMAKE_MAKE") {
log("yes$$escape_expand(\\n)")
msg = "test $$1 succeeded"
diff --git a/mkspecs/features/device_config.prf b/mkspecs/features/device_config.prf
index e0383ef530..9281d3e407 100644
--- a/mkspecs/features/device_config.prf
+++ b/mkspecs/features/device_config.prf
@@ -1,16 +1,15 @@
# This file is loaded by some qmakespecs to get early configuration data.
-# Load generated qdevice.pri
-DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/qdevice.pri
+host_build: \
+ PRI_FILE_NAME = qhost.pri
+else: \
+ PRI_FILE_NAME = qdevice.pri
+DEVICE_PRI = $$[QT_HOST_DATA/get]/mkspecs/$$PRI_FILE_NAME
exists($$DEVICE_PRI):include($$DEVICE_PRI)
unset(DEVICE_PRI)
-host_build {
- CROSS_COMPILE =
-} else: isEmpty(CROSS_COMPILE) {
- #this variable can be persisted via qmake -set CROSS_COMPILE /foo
- CROSS_COMPILE = $$[CROSS_COMPILE]
-}
+# this variable can be persisted via qmake -set CROSS_COMPILE /foo
+!host_build:isEmpty(CROSS_COMPILE): CROSS_COMPILE = $$[CROSS_COMPILE]
# Provide a function to be used by mkspecs
defineTest(deviceSanityCheckCompiler) {
diff --git a/mkspecs/features/qt_module_headers.prf b/mkspecs/features/qt_module_headers.prf
index 3f2383c120..f8ac561317 100644
--- a/mkspecs/features/qt_module_headers.prf
+++ b/mkspecs/features/qt_module_headers.prf
@@ -92,7 +92,7 @@ headersclean:!internal_module {
-DQT_NO_URL_CAST_FROM_STRING=1 \
-DQT_NO_CAST_FROM_BYTEARRAY=1 \
-DQT_NO_KEYWORDS=1 \
- -DQT_USE_FAST_CONCATENATION \
+ -DQT_USE_QSTRINGBUILDER \
-DQT_USE_FAST_OPERATOR_PLUS \
-Dsignals=int \
-Dslots=int \
diff --git a/mkspecs/features/qt_tool.prf b/mkspecs/features/qt_tool.prf
index 3f0301a292..56970adae9 100644
--- a/mkspecs/features/qt_tool.prf
+++ b/mkspecs/features/qt_tool.prf
@@ -17,39 +17,51 @@ DEFINES *= QT_USE_QSTRINGBUILDER
# If we are doing a prefix build, create a "module" pri which enables
# qtPrepareTool() to work with the non-installed build.
# Non-bootstrapped tools always need this because of the environment setup.
-!build_pass:if(!host_build|!force_bootstrap|force_independent) {
+!build_pass:if(!host_build|!force_bootstrap|force_independent|!isEmpty(HOST_QT_TOOLS)) {
isEmpty(MODULE):MODULE = $$TARGET
- !host_build|!force_bootstrap: MODULE_DEPENDS = $$replace(QT, -private$, _private)
-
load(qt_build_paths)
- load(resolve_target)
-
TOOL_PRI = $$MODULE_QMAKE_OUTDIR/mkspecs/modules/qt_tool_$${MODULE}.pri
- vars = binary depends
- !isEmpty(QT_TOOL_ENV) {
- vars += envvars
- module_var_names =
- module_var_sets =
- for(var, QT_TOOL_ENV) {
- vars += env.$${var}.name env.$${var}.value
- module_var_names += QT_TOOL.$${MODULE}.env.$${var}
- module_var_sets += \
- "QT_TOOL.$${MODULE}.env.$${var}.name = $$val_escape($${var}.name)" \
- "QT_TOOL.$${MODULE}.env.$${var}.value = $$val_escape($${var}.value)"
+ vars = binary
+
+ isEmpty(HOST_QT_TOOLS) {
+ load(resolve_target)
+
+ vars += depends
+ depends_var = "QT_TOOL.$${MODULE}.depends =$$join(MODULE_DEPENDS, " ", " ")"
+
+ !host_build|!force_bootstrap: MODULE_DEPENDS = $$replace(QT, -private$, _private)
+
+ !isEmpty(QT_TOOL_ENV) {
+ vars += envvars
+ module_var_names =
+ module_var_sets =
+ for(var, QT_TOOL_ENV) {
+ vars += env.$${var}.name env.$${var}.value
+ module_var_names += QT_TOOL.$${MODULE}.env.$${var}
+ module_var_sets += \
+ "QT_TOOL.$${MODULE}.env.$${var}.name = $$val_escape($${var}.name)" \
+ "QT_TOOL.$${MODULE}.env.$${var}.value = $$val_escape($${var}.value)"
+ }
+ module_envvars = \
+ "QT_TOOL.$${MODULE}.envvars = $$module_var_names" \
+ $$module_var_sets
+ } else {
+ module_envvars =
}
- module_envvars = \
- "QT_TOOL.$${MODULE}.envvars = $$module_var_names" \
- $$module_var_sets
+
+ bin = $$system_path($$QMAKE_RESOLVED_TARGET)
} else {
- module_envvars =
+ bin = $${HOST_QT_TOOLS}/$${TARGET}
+ equals(QMAKE_HOST.os, Windows): bin = $${bin}.exe
+ bin = $$system_path($$bin)
}
- bin = $$system_path($$QMAKE_RESOLVED_TARGET)
+
TOOL_PRI_CONT = \
"QT_TOOL.$${MODULE}.binary = $$val_escape(bin)" \
- "QT_TOOL.$${MODULE}.depends =$$join(MODULE_DEPENDS, " ", " ")" \
+ $$depends_var \
$$module_envvars
write_file($$TOOL_PRI, TOOL_PRI_CONT)|error("Aborting.")
diff --git a/mkspecs/features/resources.prf b/mkspecs/features/resources.prf
index 7a38ff8f38..1f04c8b0d7 100644
--- a/mkspecs/features/resources.prf
+++ b/mkspecs/features/resources.prf
@@ -49,9 +49,15 @@ for(resource, RESOURCES) {
for(file, $${resource}.files) {
abs_path = $$absolute_path($$file, $$_PRO_FILE_PWD_)
- alias = $$relative_path($$abs_path, $$abs_base)
- resource_file_content += \
- "<file alias=\"$$xml_escape($$alias)\">$$xml_escape($$abs_path)</file>"
+ files = $$files($$abs_path/*, true)
+ isEmpty(files): \
+ files = $$abs_path
+ for (file, files) {
+ exists($$file/*): next() # exclude directories
+ alias = $$relative_path($$file, $$abs_base)
+ resource_file_content += \
+ "<file alias=\"$$xml_escape($$alias)\">$$xml_escape($$file)</file>"
+ }
}
resource_file_content += \
diff --git a/mkspecs/features/simd.prf b/mkspecs/features/simd.prf
index 700d79a1b5..4aafdbe5ed 100644
--- a/mkspecs/features/simd.prf
+++ b/mkspecs/features/simd.prf
@@ -95,6 +95,47 @@ addSimdCompiler(sse4_1)
addSimdCompiler(sse4_2)
addSimdCompiler(avx)
addSimdCompiler(avx2)
+addSimdCompiler(avx512f)
+addSimdCompiler(avx512cd)
+addSimdCompiler(avx512er)
+addSimdCompiler(avx512pf)
+addSimdCompiler(avx512dq)
+addSimdCompiler(avx512bw)
+addSimdCompiler(avx512vl)
+addSimdCompiler(avx512ifma)
+addSimdCompiler(avx512vbmi)
addSimdCompiler(neon)
addSimdCompiler(mips_dsp)
addSimdCompiler(mips_dspr2)
+
+# Follow the Intel compiler's lead and define profiles of AVX512 instructions
+defineTest(addAvx512Profile) {
+ name = $$1
+ dependencies = $$2
+ upname = $$upper($$name)
+ varname = QMAKE_CFLAGS_$$upname
+
+ cpu_features_missing =
+ cflags = $$QMAKE_CFLAGS_AVX512F
+ for(part, dependencies) {
+ !CONFIG($$part): return() # Profile isn't supported by the compiler
+
+ uppart = $$upper($$part)
+ cflags *= $$eval(QMAKE_CFLAGS_$${uppart})
+ !contains(QT_CPU_FEATURES, $$uppart): cpu_features_missing += $$uppart
+ }
+
+ CONFIG += $$name
+ isEmpty(cpu_features_missing): QT_CPU_FEATURES += $$name
+ $$varname = $$cflags
+
+ export(QT_CPU_FEATURES)
+ export(CONFIG)
+ export($$varname)
+ addSimdCompiler($$name)
+}
+addAvx512Profile(avx512common, avx512cd)
+addAvx512Profile(avx512mic, avx512cd avx512er avx512pf)
+addAvx512Profile(avx512core, avx512cd avx512bw avx512dq avx512vl)
+addAvx512Profile(avx512ifmavl, avx512ifma avx512vl)
+addAvx512Profile(avx512vbmivl, avx512vbmi avx512vl)
diff --git a/mkspecs/linux-icc/qmake.conf b/mkspecs/linux-icc/qmake.conf
index 57f6c45ac1..495fd15e80 100644
--- a/mkspecs/linux-icc/qmake.conf
+++ b/mkspecs/linux-icc/qmake.conf
@@ -35,6 +35,13 @@ QMAKE_CFLAGS_SSE4_1 += -xSSE4.1
QMAKE_CFLAGS_SSE4_2 += -xSSE4.2
QMAKE_CFLAGS_AVX += -xAVX
QMAKE_CFLAGS_AVX2 += -xCORE-AVX2
+QMAKE_CFLAGS_AVX512F += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512CD += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512ER += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512PF += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512DQ += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512BW += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512VL += -xCORE-AVX512
QMAKE_CXX = icpc
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
@@ -51,10 +58,10 @@ QMAKE_CXXFLAGS_THREAD = $$QMAKE_CFLAGS_THREAD
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
# Disabling exceptions disabled - workaround for QTBUG-36577
#QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
-QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
-QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_LTCG = $$QMAKE_CFLAGS_LTCG
diff --git a/mkspecs/macx-icc/qmake.conf b/mkspecs/macx-icc/qmake.conf
index 70ea5ee80f..35e55f799e 100644
--- a/mkspecs/macx-icc/qmake.conf
+++ b/mkspecs/macx-icc/qmake.conf
@@ -33,6 +33,13 @@ QMAKE_CFLAGS_SSE4_1 += -msse4.1
QMAKE_CFLAGS_SSE4_2 += -msse4.2
QMAKE_CFLAGS_AVX += -mavx
QMAKE_CFLAGS_AVX2 += -march=core-avx2
+QMAKE_CFLAGS_AVX512F += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512CD += -xCOMMON-AVX512
+QMAKE_CFLAGS_AVX512ER += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512PF += -xMIC-AVX512
+QMAKE_CFLAGS_AVX512DQ += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512BW += -xCORE-AVX512
+QMAKE_CFLAGS_AVX512VL += -xCORE-AVX512
QMAKE_CXX = icpc
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS
diff --git a/mkspecs/win32-g++/qmake.conf b/mkspecs/win32-g++/qmake.conf
index c00b4cd5ff..63f491b9e5 100644
--- a/mkspecs/win32-g++/qmake.conf
+++ b/mkspecs/win32-g++/qmake.conf
@@ -55,10 +55,10 @@ QMAKE_CXXFLAGS_RTTI_ON = -frtti
QMAKE_CXXFLAGS_RTTI_OFF = -fno-rtti
QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads
QMAKE_CXXFLAGS_EXCEPTIONS_OFF = -fno-exceptions
-QMAKE_CXXFLAGS_CXX11 = -std=c++0x
+QMAKE_CXXFLAGS_CXX11 = -std=c++11
QMAKE_CXXFLAGS_CXX14 = -std=c++1y
QMAKE_CXXFLAGS_CXX1Z = -std=c++1z
-QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++0x
+QMAKE_CXXFLAGS_GNUCXX11 = -std=gnu++11
QMAKE_CXXFLAGS_GNUCXX14 = -std=gnu++1y
QMAKE_CXXFLAGS_GNUCXX1Z = -std=gnu++1z
QMAKE_CXXFLAGS_SPLIT_SECTIONS = $$QMAKE_CFLAGS_SPLIT_SECTIONS
diff --git a/mkspecs/win32-icc/qmake.conf b/mkspecs/win32-icc/qmake.conf
index 3b440d143f..c9f6748b6c 100644
--- a/mkspecs/win32-icc/qmake.conf
+++ b/mkspecs/win32-icc/qmake.conf
@@ -32,6 +32,13 @@ QMAKE_CFLAGS_SSE4_1 = -QxSSE4.1
QMAKE_CFLAGS_SSE4_2 = -QxSSE4.2
QMAKE_CFLAGS_AVX = -QxAVX
QMAKE_CFLAGS_AVX2 = -QxCORE-AVX2
+QMAKE_CFLAGS_AVX512F += -QxCOMMON-AVX512
+QMAKE_CFLAGS_AVX512CD += -QxCOMMON-AVX512
+QMAKE_CFLAGS_AVX512ER += -QxMIC-AVX512
+QMAKE_CFLAGS_AVX512PF += -QxMIC-AVX512
+QMAKE_CFLAGS_AVX512DQ += -QxCORE-AVX512
+QMAKE_CFLAGS_AVX512BW += -QxCORE-AVX512
+QMAKE_CFLAGS_AVX512VL += -QxCORE-AVX512
QMAKE_CXX = $$QMAKE_CC
QMAKE_CXXFLAGS = $$QMAKE_CFLAGS /Zc:forScope
diff --git a/qmake/Makefile.win32 b/qmake/Makefile.win32
index e61e9503f3..1e8c5129be 100644
--- a/qmake/Makefile.win32
+++ b/qmake/Makefile.win32
@@ -13,7 +13,7 @@ QMKSRC = $(SOURCE_PATH)\qmake
!if "$(QMAKESPEC)" == "win32-icc"
CXX = icl
LINKER = link
-CFLAGS_EXTRA = /Zc:forScope
+CFLAGS_EXTRA = /Zc:forScope /Qstd=c++11
!else
CXX = cl
LINKER = link
diff --git a/qmake/doc/src/qmake-manual.qdoc b/qmake/doc/src/qmake-manual.qdoc
index 6915c2e5c1..ff7b7fe1da 100644
--- a/qmake/doc/src/qmake-manual.qdoc
+++ b/qmake/doc/src/qmake-manual.qdoc
@@ -28,7 +28,7 @@
/*!
\page qmake-manual.html
\title qmake Manual
- \startpage {index.html}{Qt Reference Documentation}
+ \startpage {Qt Reference Documentation}
\nextpage Overview
\ingroup qttools
diff --git a/qmake/library/qmakeevaluator.cpp b/qmake/library/qmakeevaluator.cpp
index e220d59517..d7fba6b227 100644
--- a/qmake/library/qmakeevaluator.cpp
+++ b/qmake/library/qmakeevaluator.cpp
@@ -1000,6 +1000,8 @@ void QMakeEvaluator::loadDefaults()
vars[ProKey("QMAKE_QMAKE")] << ProString(m_option->qmake_abslocation);
if (!m_option->qmake_args.isEmpty())
vars[ProKey("QMAKE_ARGS")] = ProStringList(m_option->qmake_args);
+ if (!m_option->qtconf.isEmpty())
+ vars[ProKey("QMAKE_QTCONF")] = ProString(m_option->qtconf);
vars[ProKey("QMAKE_HOST.cpu_count")] = ProString(QString::number(idealThreadCount()));
#if defined(Q_OS_WIN32)
vars[ProKey("QMAKE_HOST.os")] << ProString("Windows");
diff --git a/qmake/library/qmakeglobals.cpp b/qmake/library/qmakeglobals.cpp
index 8bb5199519..ff59bdb303 100644
--- a/qmake/library/qmakeglobals.cpp
+++ b/qmake/library/qmakeglobals.cpp
@@ -109,7 +109,7 @@ QString QMakeGlobals::cleanSpec(QMakeCmdLineParserState &state, const QString &s
QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
QMakeCmdLineParserState &state, QStringList &args, int *pos)
{
- enum { ArgNone, ArgConfig, ArgSpec, ArgXSpec, ArgTmpl, ArgTmplPfx, ArgCache } argState = ArgNone;
+ enum { ArgNone, ArgConfig, ArgSpec, ArgXSpec, ArgTmpl, ArgTmplPfx, ArgCache, ArgQtConf } argState = ArgNone;
for (; *pos < args.count(); (*pos)++) {
QString arg = args.at(*pos);
switch (argState) {
@@ -134,6 +134,9 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
case ArgCache:
cachefile = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
break;
+ case ArgQtConf:
+ qtconf = args[*pos] = QDir::cleanPath(QDir(state.pwd).absoluteFilePath(arg));
+ break;
default:
if (arg.startsWith(QLatin1Char('-'))) {
if (arg == QLatin1String("-after"))
@@ -144,6 +147,8 @@ QMakeGlobals::ArgumentReturn QMakeGlobals::addCommandLineArguments(
do_cache = false;
else if (arg == QLatin1String("-cache"))
argState = ArgCache;
+ else if (arg == QLatin1String("-qtconf"))
+ argState = ArgQtConf;
else if (arg == QLatin1String("-platform") || arg == QLatin1String("-spec"))
argState = ArgSpec;
else if (arg == QLatin1String("-xplatform") || arg == QLatin1String("-xspec"))
diff --git a/qmake/library/qmakeglobals.h b/qmake/library/qmakeglobals.h
index de46ebbe74..87fc9d4b4e 100644
--- a/qmake/library/qmakeglobals.h
+++ b/qmake/library/qmakeglobals.h
@@ -112,6 +112,7 @@ public:
QString qmake_abslocation;
QStringList qmake_args;
+ QString qtconf;
QString qmakespec, xqmakespec;
QString user_template, user_template_prefix;
QString precmds, postcmds;
diff --git a/qmake/option.cpp b/qmake/option.cpp
index da59616e5c..1d1aece626 100644
--- a/qmake/option.cpp
+++ b/qmake/option.cpp
@@ -172,6 +172,7 @@ bool usage(const char *a0)
" -set <prop> <value> Set persistent property\n"
" -unset <prop> Unset persistent property\n"
" -query <prop> Query persistent property. Show all if <prop> is empty.\n"
+ " -qtconf file Use file instead of looking for qt.conf\n"
" -cache file Use file as cache [makefile mode only]\n"
" -spec spec Use spec as QMAKESPEC [makefile mode only]\n"
" -nocache Don't use a cache file [makefile mode only]\n"
@@ -642,6 +643,8 @@ qmakeAddCacheClear(qmakeCacheClearFunc func, void **data)
QString qmake_libraryInfoFile()
{
+ if (!Option::globals->qtconf.isEmpty())
+ return Option::globals->qtconf;
if (!Option::globals->qmake_abslocation.isEmpty())
return QDir(QFileInfo(Option::globals->qmake_abslocation).absolutePath()).filePath("qt.conf");
return QString();
diff --git a/qmake/qmake-aux.pro b/qmake/qmake-aux.pro
new file mode 100644
index 0000000000..33a7fbfd2d
--- /dev/null
+++ b/qmake/qmake-aux.pro
@@ -0,0 +1,11 @@
+option(host_build)
+TEMPLATE = aux
+
+# qmake documentation
+QMAKE_DOCS = $$PWD/doc/qmake.qdocconf
+
+# qmake binary
+win32: EXTENSION = .exe
+qmake.path = $$[QT_HOST_BINS]
+qmake.files = $$OUT_PWD/../bin/qmake$$EXTENSION
+INSTALLS += qmake
diff --git a/qmake/qmake-docs.pro b/qmake/qmake-docs.pro
deleted file mode 100644
index 3123f7c5d8..0000000000
--- a/qmake/qmake-docs.pro
+++ /dev/null
@@ -1,2 +0,0 @@
-TEMPLATE = aux
-QMAKE_DOCS = $$PWD/doc/qmake.qdocconf
diff --git a/qtbase.pro b/qtbase.pro
index 24d0f5287b..5b709864c7 100644
--- a/qtbase.pro
+++ b/qtbase.pro
@@ -4,7 +4,7 @@
load(qt_parts)
-SUBDIRS += qmake/qmake-docs.pro
+SUBDIRS += qmake/qmake-aux.pro
cross_compile: CONFIG += nostrip
@@ -37,15 +37,6 @@ CONFIG -= qt
### installations ####
-#qmake
-qmake.path = $$[QT_HOST_BINS]
-equals(QMAKE_HOST.os, Windows) {
- qmake.files = $$OUT_PWD/bin/qmake.exe
-} else {
- qmake.files = $$OUT_PWD/bin/qmake
-}
-INSTALLS += qmake
-
#licheck
licheck.path = $$[QT_HOST_BINS]
licheck.files = $$PWD/bin/$$QT_LICHECK
diff --git a/src/3rdparty/double-conversion/LICENSE b/src/3rdparty/double-conversion/LICENSE
new file mode 100644
index 0000000000..933718a9ef
--- /dev/null
+++ b/src/3rdparty/double-conversion/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2006-2011, the V8 project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+ * Neither the name of Google Inc. nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"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 COPYRIGHT
+OWNER OR CONTRIBUTORS 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.
diff --git a/src/3rdparty/double-conversion/README b/src/3rdparty/double-conversion/README
new file mode 100644
index 0000000000..75d08df5fe
--- /dev/null
+++ b/src/3rdparty/double-conversion/README
@@ -0,0 +1,8 @@
+This is a copy of the library for binary-decimal and decimal-binary
+conversion routines for IEEE doubles, available from
+
+ https://github.com/google/double-conversion
+
+commit 2fb03de56faa32bbba5e02222528e7b760f71d77
+
+See the LICENSE file for license information.
diff --git a/src/3rdparty/double-conversion/bignum-dtoa.cc b/src/3rdparty/double-conversion/bignum-dtoa.cc
new file mode 100644
index 0000000000..f1ad7a5ae8
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum-dtoa.cc
@@ -0,0 +1,641 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#include <math.h>
+
+#include "bignum-dtoa.h"
+
+#include "bignum.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+static int NormalizedExponent(uint64_t significand, int exponent) {
+ ASSERT(significand != 0);
+ while ((significand & Double::kHiddenBit) == 0) {
+ significand = significand << 1;
+ exponent = exponent - 1;
+ }
+ return exponent;
+}
+
+
+// Forward declarations:
+// Returns an estimation of k such that 10^(k-1) <= v < 10^k.
+static int EstimatePower(int exponent);
+// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator
+// and denominator.
+static void InitialScaledStartValues(uint64_t significand,
+ int exponent,
+ bool lower_boundary_is_closer,
+ int estimated_power,
+ bool need_boundary_deltas,
+ Bignum* numerator,
+ Bignum* denominator,
+ Bignum* delta_minus,
+ Bignum* delta_plus);
+// Multiplies numerator/denominator so that its values lies in the range 1-10.
+// Returns decimal_point s.t.
+// v = numerator'/denominator' * 10^(decimal_point-1)
+// where numerator' and denominator' are the values of numerator and
+// denominator after the call to this function.
+static void FixupMultiply10(int estimated_power, bool is_even,
+ int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus);
+// Generates digits from the left to the right and stops when the generated
+// digits yield the shortest decimal representation of v.
+static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus,
+ bool is_even,
+ Vector<char> buffer, int* length);
+// Generates 'requested_digits' after the decimal point.
+static void BignumToFixed(int requested_digits, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char>(buffer), int* length);
+// Generates 'count' digits of numerator/denominator.
+// Once 'count' digits have been produced rounds the result depending on the
+// remainder (remainders of exactly .5 round upwards). Might update the
+// decimal_point when rounding up (for example for 0.9999).
+static void GenerateCountedDigits(int count, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char>(buffer), int* length);
+
+
+void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
+ Vector<char> buffer, int* length, int* decimal_point) {
+ ASSERT(v > 0);
+ ASSERT(!Double(v).IsSpecial());
+ uint64_t significand;
+ int exponent;
+ bool lower_boundary_is_closer;
+ if (mode == BIGNUM_DTOA_SHORTEST_SINGLE) {
+ float f = static_cast<float>(v);
+ ASSERT(f == v);
+ significand = Single(f).Significand();
+ exponent = Single(f).Exponent();
+ lower_boundary_is_closer = Single(f).LowerBoundaryIsCloser();
+ } else {
+ significand = Double(v).Significand();
+ exponent = Double(v).Exponent();
+ lower_boundary_is_closer = Double(v).LowerBoundaryIsCloser();
+ }
+ bool need_boundary_deltas =
+ (mode == BIGNUM_DTOA_SHORTEST || mode == BIGNUM_DTOA_SHORTEST_SINGLE);
+
+ bool is_even = (significand & 1) == 0;
+ int normalized_exponent = NormalizedExponent(significand, exponent);
+ // estimated_power might be too low by 1.
+ int estimated_power = EstimatePower(normalized_exponent);
+
+ // Shortcut for Fixed.
+ // The requested digits correspond to the digits after the point. If the
+ // number is much too small, then there is no need in trying to get any
+ // digits.
+ if (mode == BIGNUM_DTOA_FIXED && -estimated_power - 1 > requested_digits) {
+ buffer[0] = '\0';
+ *length = 0;
+ // Set decimal-point to -requested_digits. This is what Gay does.
+ // Note that it should not have any effect anyways since the string is
+ // empty.
+ *decimal_point = -requested_digits;
+ return;
+ }
+
+ Bignum numerator;
+ Bignum denominator;
+ Bignum delta_minus;
+ Bignum delta_plus;
+ // Make sure the bignum can grow large enough. The smallest double equals
+ // 4e-324. In this case the denominator needs fewer than 324*4 binary digits.
+ // The maximum double is 1.7976931348623157e308 which needs fewer than
+ // 308*4 binary digits.
+ ASSERT(Bignum::kMaxSignificantBits >= 324*4);
+ InitialScaledStartValues(significand, exponent, lower_boundary_is_closer,
+ estimated_power, need_boundary_deltas,
+ &numerator, &denominator,
+ &delta_minus, &delta_plus);
+ // We now have v = (numerator / denominator) * 10^estimated_power.
+ FixupMultiply10(estimated_power, is_even, decimal_point,
+ &numerator, &denominator,
+ &delta_minus, &delta_plus);
+ // We now have v = (numerator / denominator) * 10^(decimal_point-1), and
+ // 1 <= (numerator + delta_plus) / denominator < 10
+ switch (mode) {
+ case BIGNUM_DTOA_SHORTEST:
+ case BIGNUM_DTOA_SHORTEST_SINGLE:
+ GenerateShortestDigits(&numerator, &denominator,
+ &delta_minus, &delta_plus,
+ is_even, buffer, length);
+ break;
+ case BIGNUM_DTOA_FIXED:
+ BignumToFixed(requested_digits, decimal_point,
+ &numerator, &denominator,
+ buffer, length);
+ break;
+ case BIGNUM_DTOA_PRECISION:
+ GenerateCountedDigits(requested_digits, decimal_point,
+ &numerator, &denominator,
+ buffer, length);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ buffer[*length] = '\0';
+}
+
+
+// The procedure starts generating digits from the left to the right and stops
+// when the generated digits yield the shortest decimal representation of v. A
+// decimal representation of v is a number lying closer to v than to any other
+// double, so it converts to v when read.
+//
+// This is true if d, the decimal representation, is between m- and m+, the
+// upper and lower boundaries. d must be strictly between them if !is_even.
+// m- := (numerator - delta_minus) / denominator
+// m+ := (numerator + delta_plus) / denominator
+//
+// Precondition: 0 <= (numerator+delta_plus) / denominator < 10.
+// If 1 <= (numerator+delta_plus) / denominator < 10 then no leading 0 digit
+// will be produced. This should be the standard precondition.
+static void GenerateShortestDigits(Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus,
+ bool is_even,
+ Vector<char> buffer, int* length) {
+ // Small optimization: if delta_minus and delta_plus are the same just reuse
+ // one of the two bignums.
+ if (Bignum::Equal(*delta_minus, *delta_plus)) {
+ delta_plus = delta_minus;
+ }
+ *length = 0;
+ for (;;) {
+ uint16_t digit;
+ digit = numerator->DivideModuloIntBignum(*denominator);
+ ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
+ // digit = numerator / denominator (integer division).
+ // numerator = numerator % denominator.
+ buffer[(*length)++] = static_cast<char>(digit + '0');
+
+ // Can we stop already?
+ // If the remainder of the division is less than the distance to the lower
+ // boundary we can stop. In this case we simply round down (discarding the
+ // remainder).
+ // Similarly we test if we can round up (using the upper boundary).
+ bool in_delta_room_minus;
+ bool in_delta_room_plus;
+ if (is_even) {
+ in_delta_room_minus = Bignum::LessEqual(*numerator, *delta_minus);
+ } else {
+ in_delta_room_minus = Bignum::Less(*numerator, *delta_minus);
+ }
+ if (is_even) {
+ in_delta_room_plus =
+ Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
+ } else {
+ in_delta_room_plus =
+ Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
+ }
+ if (!in_delta_room_minus && !in_delta_room_plus) {
+ // Prepare for next iteration.
+ numerator->Times10();
+ delta_minus->Times10();
+ // We optimized delta_plus to be equal to delta_minus (if they share the
+ // same value). So don't multiply delta_plus if they point to the same
+ // object.
+ if (delta_minus != delta_plus) {
+ delta_plus->Times10();
+ }
+ } else if (in_delta_room_minus && in_delta_room_plus) {
+ // Let's see if 2*numerator < denominator.
+ // If yes, then the next digit would be < 5 and we can round down.
+ int compare = Bignum::PlusCompare(*numerator, *numerator, *denominator);
+ if (compare < 0) {
+ // Remaining digits are less than .5. -> Round down (== do nothing).
+ } else if (compare > 0) {
+ // Remaining digits are more than .5 of denominator. -> Round up.
+ // Note that the last digit could not be a '9' as otherwise the whole
+ // loop would have stopped earlier.
+ // We still have an assert here in case the preconditions were not
+ // satisfied.
+ ASSERT(buffer[(*length) - 1] != '9');
+ buffer[(*length) - 1]++;
+ } else {
+ // Halfway case.
+ // TODO(floitsch): need a way to solve half-way cases.
+ // For now let's round towards even (since this is what Gay seems to
+ // do).
+
+ if ((buffer[(*length) - 1] - '0') % 2 == 0) {
+ // Round down => Do nothing.
+ } else {
+ ASSERT(buffer[(*length) - 1] != '9');
+ buffer[(*length) - 1]++;
+ }
+ }
+ return;
+ } else if (in_delta_room_minus) {
+ // Round down (== do nothing).
+ return;
+ } else { // in_delta_room_plus
+ // Round up.
+ // Note again that the last digit could not be '9' since this would have
+ // stopped the loop earlier.
+ // We still have an ASSERT here, in case the preconditions were not
+ // satisfied.
+ ASSERT(buffer[(*length) -1] != '9');
+ buffer[(*length) - 1]++;
+ return;
+ }
+ }
+}
+
+
+// Let v = numerator / denominator < 10.
+// Then we generate 'count' digits of d = x.xxxxx... (without the decimal point)
+// from left to right. Once 'count' digits have been produced we decide wether
+// to round up or down. Remainders of exactly .5 round upwards. Numbers such
+// as 9.999999 propagate a carry all the way, and change the
+// exponent (decimal_point), when rounding upwards.
+static void GenerateCountedDigits(int count, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char> buffer, int* length) {
+ ASSERT(count >= 0);
+ for (int i = 0; i < count - 1; ++i) {
+ uint16_t digit;
+ digit = numerator->DivideModuloIntBignum(*denominator);
+ ASSERT(digit <= 9); // digit is a uint16_t and therefore always positive.
+ // digit = numerator / denominator (integer division).
+ // numerator = numerator % denominator.
+ buffer[i] = static_cast<char>(digit + '0');
+ // Prepare for next iteration.
+ numerator->Times10();
+ }
+ // Generate the last digit.
+ uint16_t digit;
+ digit = numerator->DivideModuloIntBignum(*denominator);
+ if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) {
+ digit++;
+ }
+ ASSERT(digit <= 10);
+ buffer[count - 1] = static_cast<char>(digit + '0');
+ // Correct bad digits (in case we had a sequence of '9's). Propagate the
+ // carry until we hat a non-'9' or til we reach the first digit.
+ for (int i = count - 1; i > 0; --i) {
+ if (buffer[i] != '0' + 10) break;
+ buffer[i] = '0';
+ buffer[i - 1]++;
+ }
+ if (buffer[0] == '0' + 10) {
+ // Propagate a carry past the top place.
+ buffer[0] = '1';
+ (*decimal_point)++;
+ }
+ *length = count;
+}
+
+
+// Generates 'requested_digits' after the decimal point. It might omit
+// trailing '0's. If the input number is too small then no digits at all are
+// generated (ex.: 2 fixed digits for 0.00001).
+//
+// Input verifies: 1 <= (numerator + delta) / denominator < 10.
+static void BignumToFixed(int requested_digits, int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Vector<char>(buffer), int* length) {
+ // Note that we have to look at more than just the requested_digits, since
+ // a number could be rounded up. Example: v=0.5 with requested_digits=0.
+ // Even though the power of v equals 0 we can't just stop here.
+ if (-(*decimal_point) > requested_digits) {
+ // The number is definitively too small.
+ // Ex: 0.001 with requested_digits == 1.
+ // Set decimal-point to -requested_digits. This is what Gay does.
+ // Note that it should not have any effect anyways since the string is
+ // empty.
+ *decimal_point = -requested_digits;
+ *length = 0;
+ return;
+ } else if (-(*decimal_point) == requested_digits) {
+ // We only need to verify if the number rounds down or up.
+ // Ex: 0.04 and 0.06 with requested_digits == 1.
+ ASSERT(*decimal_point == -requested_digits);
+ // Initially the fraction lies in range (1, 10]. Multiply the denominator
+ // by 10 so that we can compare more easily.
+ denominator->Times10();
+ if (Bignum::PlusCompare(*numerator, *numerator, *denominator) >= 0) {
+ // If the fraction is >= 0.5 then we have to include the rounded
+ // digit.
+ buffer[0] = '1';
+ *length = 1;
+ (*decimal_point)++;
+ } else {
+ // Note that we caught most of similar cases earlier.
+ *length = 0;
+ }
+ return;
+ } else {
+ // The requested digits correspond to the digits after the point.
+ // The variable 'needed_digits' includes the digits before the point.
+ int needed_digits = (*decimal_point) + requested_digits;
+ GenerateCountedDigits(needed_digits, decimal_point,
+ numerator, denominator,
+ buffer, length);
+ }
+}
+
+
+// Returns an estimation of k such that 10^(k-1) <= v < 10^k where
+// v = f * 2^exponent and 2^52 <= f < 2^53.
+// v is hence a normalized double with the given exponent. The output is an
+// approximation for the exponent of the decimal approimation .digits * 10^k.
+//
+// The result might undershoot by 1 in which case 10^k <= v < 10^k+1.
+// Note: this property holds for v's upper boundary m+ too.
+// 10^k <= m+ < 10^k+1.
+// (see explanation below).
+//
+// Examples:
+// EstimatePower(0) => 16
+// EstimatePower(-52) => 0
+//
+// Note: e >= 0 => EstimatedPower(e) > 0. No similar claim can be made for e<0.
+static int EstimatePower(int exponent) {
+ // This function estimates log10 of v where v = f*2^e (with e == exponent).
+ // Note that 10^floor(log10(v)) <= v, but v <= 10^ceil(log10(v)).
+ // Note that f is bounded by its container size. Let p = 53 (the double's
+ // significand size). Then 2^(p-1) <= f < 2^p.
+ //
+ // Given that log10(v) == log2(v)/log2(10) and e+(len(f)-1) is quite close
+ // to log2(v) the function is simplified to (e+(len(f)-1)/log2(10)).
+ // The computed number undershoots by less than 0.631 (when we compute log3
+ // and not log10).
+ //
+ // Optimization: since we only need an approximated result this computation
+ // can be performed on 64 bit integers. On x86/x64 architecture the speedup is
+ // not really measurable, though.
+ //
+ // Since we want to avoid overshooting we decrement by 1e10 so that
+ // floating-point imprecisions don't affect us.
+ //
+ // Explanation for v's boundary m+: the computation takes advantage of
+ // the fact that 2^(p-1) <= f < 2^p. Boundaries still satisfy this requirement
+ // (even for denormals where the delta can be much more important).
+
+ const double k1Log10 = 0.30102999566398114; // 1/lg(10)
+
+ // For doubles len(f) == 53 (don't forget the hidden bit).
+ const int kSignificandSize = Double::kSignificandSize;
+ double estimate = ceil((exponent + kSignificandSize - 1) * k1Log10 - 1e-10);
+ return static_cast<int>(estimate);
+}
+
+
+// See comments for InitialScaledStartValues.
+static void InitialScaledStartValuesPositiveExponent(
+ uint64_t significand, int exponent,
+ int estimated_power, bool need_boundary_deltas,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ // A positive exponent implies a positive power.
+ ASSERT(estimated_power >= 0);
+ // Since the estimated_power is positive we simply multiply the denominator
+ // by 10^estimated_power.
+
+ // numerator = v.
+ numerator->AssignUInt64(significand);
+ numerator->ShiftLeft(exponent);
+ // denominator = 10^estimated_power.
+ denominator->AssignPowerUInt16(10, estimated_power);
+
+ if (need_boundary_deltas) {
+ // Introduce a common denominator so that the deltas to the boundaries are
+ // integers.
+ denominator->ShiftLeft(1);
+ numerator->ShiftLeft(1);
+ // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
+ // denominator (of 2) delta_plus equals 2^e.
+ delta_plus->AssignUInt16(1);
+ delta_plus->ShiftLeft(exponent);
+ // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
+ delta_minus->AssignUInt16(1);
+ delta_minus->ShiftLeft(exponent);
+ }
+}
+
+
+// See comments for InitialScaledStartValues
+static void InitialScaledStartValuesNegativeExponentPositivePower(
+ uint64_t significand, int exponent,
+ int estimated_power, bool need_boundary_deltas,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ // v = f * 2^e with e < 0, and with estimated_power >= 0.
+ // This means that e is close to 0 (have a look at how estimated_power is
+ // computed).
+
+ // numerator = significand
+ // since v = significand * 2^exponent this is equivalent to
+ // numerator = v * / 2^-exponent
+ numerator->AssignUInt64(significand);
+ // denominator = 10^estimated_power * 2^-exponent (with exponent < 0)
+ denominator->AssignPowerUInt16(10, estimated_power);
+ denominator->ShiftLeft(-exponent);
+
+ if (need_boundary_deltas) {
+ // Introduce a common denominator so that the deltas to the boundaries are
+ // integers.
+ denominator->ShiftLeft(1);
+ numerator->ShiftLeft(1);
+ // Let v = f * 2^e, then m+ - v = 1/2 * 2^e; With the common
+ // denominator (of 2) delta_plus equals 2^e.
+ // Given that the denominator already includes v's exponent the distance
+ // to the boundaries is simply 1.
+ delta_plus->AssignUInt16(1);
+ // Same for delta_minus. The adjustments if f == 2^p-1 are done later.
+ delta_minus->AssignUInt16(1);
+ }
+}
+
+
+// See comments for InitialScaledStartValues
+static void InitialScaledStartValuesNegativeExponentNegativePower(
+ uint64_t significand, int exponent,
+ int estimated_power, bool need_boundary_deltas,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ // Instead of multiplying the denominator with 10^estimated_power we
+ // multiply all values (numerator and deltas) by 10^-estimated_power.
+
+ // Use numerator as temporary container for power_ten.
+ Bignum* power_ten = numerator;
+ power_ten->AssignPowerUInt16(10, -estimated_power);
+
+ if (need_boundary_deltas) {
+ // Since power_ten == numerator we must make a copy of 10^estimated_power
+ // before we complete the computation of the numerator.
+ // delta_plus = delta_minus = 10^estimated_power
+ delta_plus->AssignBignum(*power_ten);
+ delta_minus->AssignBignum(*power_ten);
+ }
+
+ // numerator = significand * 2 * 10^-estimated_power
+ // since v = significand * 2^exponent this is equivalent to
+ // numerator = v * 10^-estimated_power * 2 * 2^-exponent.
+ // Remember: numerator has been abused as power_ten. So no need to assign it
+ // to itself.
+ ASSERT(numerator == power_ten);
+ numerator->MultiplyByUInt64(significand);
+
+ // denominator = 2 * 2^-exponent with exponent < 0.
+ denominator->AssignUInt16(1);
+ denominator->ShiftLeft(-exponent);
+
+ if (need_boundary_deltas) {
+ // Introduce a common denominator so that the deltas to the boundaries are
+ // integers.
+ numerator->ShiftLeft(1);
+ denominator->ShiftLeft(1);
+ // With this shift the boundaries have their correct value, since
+ // delta_plus = 10^-estimated_power, and
+ // delta_minus = 10^-estimated_power.
+ // These assignments have been done earlier.
+ // The adjustments if f == 2^p-1 (lower boundary is closer) are done later.
+ }
+}
+
+
+// Let v = significand * 2^exponent.
+// Computes v / 10^estimated_power exactly, as a ratio of two bignums, numerator
+// and denominator. The functions GenerateShortestDigits and
+// GenerateCountedDigits will then convert this ratio to its decimal
+// representation d, with the required accuracy.
+// Then d * 10^estimated_power is the representation of v.
+// (Note: the fraction and the estimated_power might get adjusted before
+// generating the decimal representation.)
+//
+// The initial start values consist of:
+// - a scaled numerator: s.t. numerator/denominator == v / 10^estimated_power.
+// - a scaled (common) denominator.
+// optionally (used by GenerateShortestDigits to decide if it has the shortest
+// decimal converting back to v):
+// - v - m-: the distance to the lower boundary.
+// - m+ - v: the distance to the upper boundary.
+//
+// v, m+, m-, and therefore v - m- and m+ - v all share the same denominator.
+//
+// Let ep == estimated_power, then the returned values will satisfy:
+// v / 10^ep = numerator / denominator.
+// v's boundarys m- and m+:
+// m- / 10^ep == v / 10^ep - delta_minus / denominator
+// m+ / 10^ep == v / 10^ep + delta_plus / denominator
+// Or in other words:
+// m- == v - delta_minus * 10^ep / denominator;
+// m+ == v + delta_plus * 10^ep / denominator;
+//
+// Since 10^(k-1) <= v < 10^k (with k == estimated_power)
+// or 10^k <= v < 10^(k+1)
+// we then have 0.1 <= numerator/denominator < 1
+// or 1 <= numerator/denominator < 10
+//
+// It is then easy to kickstart the digit-generation routine.
+//
+// The boundary-deltas are only filled if the mode equals BIGNUM_DTOA_SHORTEST
+// or BIGNUM_DTOA_SHORTEST_SINGLE.
+
+static void InitialScaledStartValues(uint64_t significand,
+ int exponent,
+ bool lower_boundary_is_closer,
+ int estimated_power,
+ bool need_boundary_deltas,
+ Bignum* numerator,
+ Bignum* denominator,
+ Bignum* delta_minus,
+ Bignum* delta_plus) {
+ if (exponent >= 0) {
+ InitialScaledStartValuesPositiveExponent(
+ significand, exponent, estimated_power, need_boundary_deltas,
+ numerator, denominator, delta_minus, delta_plus);
+ } else if (estimated_power >= 0) {
+ InitialScaledStartValuesNegativeExponentPositivePower(
+ significand, exponent, estimated_power, need_boundary_deltas,
+ numerator, denominator, delta_minus, delta_plus);
+ } else {
+ InitialScaledStartValuesNegativeExponentNegativePower(
+ significand, exponent, estimated_power, need_boundary_deltas,
+ numerator, denominator, delta_minus, delta_plus);
+ }
+
+ if (need_boundary_deltas && lower_boundary_is_closer) {
+ // The lower boundary is closer at half the distance of "normal" numbers.
+ // Increase the common denominator and adapt all but the delta_minus.
+ denominator->ShiftLeft(1); // *2
+ numerator->ShiftLeft(1); // *2
+ delta_plus->ShiftLeft(1); // *2
+ }
+}
+
+
+// This routine multiplies numerator/denominator so that its values lies in the
+// range 1-10. That is after a call to this function we have:
+// 1 <= (numerator + delta_plus) /denominator < 10.
+// Let numerator the input before modification and numerator' the argument
+// after modification, then the output-parameter decimal_point is such that
+// numerator / denominator * 10^estimated_power ==
+// numerator' / denominator' * 10^(decimal_point - 1)
+// In some cases estimated_power was too low, and this is already the case. We
+// then simply adjust the power so that 10^(k-1) <= v < 10^k (with k ==
+// estimated_power) but do not touch the numerator or denominator.
+// Otherwise the routine multiplies the numerator and the deltas by 10.
+static void FixupMultiply10(int estimated_power, bool is_even,
+ int* decimal_point,
+ Bignum* numerator, Bignum* denominator,
+ Bignum* delta_minus, Bignum* delta_plus) {
+ bool in_range;
+ if (is_even) {
+ // For IEEE doubles half-way cases (in decimal system numbers ending with 5)
+ // are rounded to the closest floating-point number with even significand.
+ in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) >= 0;
+ } else {
+ in_range = Bignum::PlusCompare(*numerator, *delta_plus, *denominator) > 0;
+ }
+ if (in_range) {
+ // Since numerator + delta_plus >= denominator we already have
+ // 1 <= numerator/denominator < 10. Simply update the estimated_power.
+ *decimal_point = estimated_power + 1;
+ } else {
+ *decimal_point = estimated_power;
+ numerator->Times10();
+ if (Bignum::Equal(*delta_minus, *delta_plus)) {
+ delta_minus->Times10();
+ delta_plus->AssignBignum(*delta_minus);
+ } else {
+ delta_minus->Times10();
+ delta_plus->Times10();
+ }
+ }
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/bignum-dtoa.h b/src/3rdparty/double-conversion/bignum-dtoa.h
new file mode 100644
index 0000000000..34b961992d
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum-dtoa.h
@@ -0,0 +1,84 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_BIGNUM_DTOA_H_
+#define DOUBLE_CONVERSION_BIGNUM_DTOA_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+enum BignumDtoaMode {
+ // Return the shortest correct representation.
+ // For example the output of 0.299999999999999988897 is (the less accurate but
+ // correct) 0.3.
+ BIGNUM_DTOA_SHORTEST,
+ // Same as BIGNUM_DTOA_SHORTEST but for single-precision floats.
+ BIGNUM_DTOA_SHORTEST_SINGLE,
+ // Return a fixed number of digits after the decimal point.
+ // For instance fixed(0.1, 4) becomes 0.1000
+ // If the input number is big, the output will be big.
+ BIGNUM_DTOA_FIXED,
+ // Return a fixed number of digits, no matter what the exponent is.
+ BIGNUM_DTOA_PRECISION
+};
+
+// Converts the given double 'v' to ascii.
+// The result should be interpreted as buffer * 10^(point-length).
+// The buffer will be null-terminated.
+//
+// The input v must be > 0 and different from NaN, and Infinity.
+//
+// The output depends on the given mode:
+// - SHORTEST: produce the least amount of digits for which the internal
+// identity requirement is still satisfied. If the digits are printed
+// (together with the correct exponent) then reading this number will give
+// 'v' again. The buffer will choose the representation that is closest to
+// 'v'. If there are two at the same distance, than the number is round up.
+// In this mode the 'requested_digits' parameter is ignored.
+// - FIXED: produces digits necessary to print a given number with
+// 'requested_digits' digits after the decimal point. The produced digits
+// might be too short in which case the caller has to fill the gaps with '0's.
+// Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
+// Halfway cases are rounded up. The call toFixed(0.15, 2) thus returns
+// buffer="2", point=0.
+// Note: the length of the returned buffer has no meaning wrt the significance
+// of its digits. That is, just because it contains '0's does not mean that
+// any other digit would not satisfy the internal identity requirement.
+// - PRECISION: produces 'requested_digits' where the first digit is not '0'.
+// Even though the length of produced digits usually equals
+// 'requested_digits', the function is allowed to return fewer digits, in
+// which case the caller has to fill the missing digits with '0's.
+// Halfway cases are again rounded up.
+// 'BignumDtoa' expects the given buffer to be big enough to hold all digits
+// and a terminating null-character.
+void BignumDtoa(double v, BignumDtoaMode mode, int requested_digits,
+ Vector<char> buffer, int* length, int* point);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_BIGNUM_DTOA_H_
diff --git a/src/3rdparty/double-conversion/bignum.cc b/src/3rdparty/double-conversion/bignum.cc
new file mode 100644
index 0000000000..2743d67e8d
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum.cc
@@ -0,0 +1,766 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#include "bignum.h"
+#include "utils.h"
+
+namespace double_conversion {
+
+Bignum::Bignum()
+ : bigits_(bigits_buffer_, kBigitCapacity), used_digits_(0), exponent_(0) {
+ for (int i = 0; i < kBigitCapacity; ++i) {
+ bigits_[i] = 0;
+ }
+}
+
+
+template<typename S>
+static int BitSize(S value) {
+ (void) value; // Mark variable as used.
+ return 8 * sizeof(value);
+}
+
+// Guaranteed to lie in one Bigit.
+void Bignum::AssignUInt16(uint16_t value) {
+ ASSERT(kBigitSize >= BitSize(value));
+ Zero();
+ if (value == 0) return;
+
+ EnsureCapacity(1);
+ bigits_[0] = value;
+ used_digits_ = 1;
+}
+
+
+void Bignum::AssignUInt64(uint64_t value) {
+ const int kUInt64Size = 64;
+
+ Zero();
+ if (value == 0) return;
+
+ int needed_bigits = kUInt64Size / kBigitSize + 1;
+ EnsureCapacity(needed_bigits);
+ for (int i = 0; i < needed_bigits; ++i) {
+ bigits_[i] = value & kBigitMask;
+ value = value >> kBigitSize;
+ }
+ used_digits_ = needed_bigits;
+ Clamp();
+}
+
+
+void Bignum::AssignBignum(const Bignum& other) {
+ exponent_ = other.exponent_;
+ for (int i = 0; i < other.used_digits_; ++i) {
+ bigits_[i] = other.bigits_[i];
+ }
+ // Clear the excess digits (if there were any).
+ for (int i = other.used_digits_; i < used_digits_; ++i) {
+ bigits_[i] = 0;
+ }
+ used_digits_ = other.used_digits_;
+}
+
+
+static uint64_t ReadUInt64(Vector<const char> buffer,
+ int from,
+ int digits_to_read) {
+ uint64_t result = 0;
+ for (int i = from; i < from + digits_to_read; ++i) {
+ int digit = buffer[i] - '0';
+ ASSERT(0 <= digit && digit <= 9);
+ result = result * 10 + digit;
+ }
+ return result;
+}
+
+
+void Bignum::AssignDecimalString(Vector<const char> value) {
+ // 2^64 = 18446744073709551616 > 10^19
+ const int kMaxUint64DecimalDigits = 19;
+ Zero();
+ int length = value.length();
+ int pos = 0;
+ // Let's just say that each digit needs 4 bits.
+ while (length >= kMaxUint64DecimalDigits) {
+ uint64_t digits = ReadUInt64(value, pos, kMaxUint64DecimalDigits);
+ pos += kMaxUint64DecimalDigits;
+ length -= kMaxUint64DecimalDigits;
+ MultiplyByPowerOfTen(kMaxUint64DecimalDigits);
+ AddUInt64(digits);
+ }
+ uint64_t digits = ReadUInt64(value, pos, length);
+ MultiplyByPowerOfTen(length);
+ AddUInt64(digits);
+ Clamp();
+}
+
+
+static int HexCharValue(char c) {
+ if ('0' <= c && c <= '9') return c - '0';
+ if ('a' <= c && c <= 'f') return 10 + c - 'a';
+ ASSERT('A' <= c && c <= 'F');
+ return 10 + c - 'A';
+}
+
+
+void Bignum::AssignHexString(Vector<const char> value) {
+ Zero();
+ int length = value.length();
+
+ int needed_bigits = length * 4 / kBigitSize + 1;
+ EnsureCapacity(needed_bigits);
+ int string_index = length - 1;
+ for (int i = 0; i < needed_bigits - 1; ++i) {
+ // These bigits are guaranteed to be "full".
+ Chunk current_bigit = 0;
+ for (int j = 0; j < kBigitSize / 4; j++) {
+ current_bigit += HexCharValue(value[string_index--]) << (j * 4);
+ }
+ bigits_[i] = current_bigit;
+ }
+ used_digits_ = needed_bigits - 1;
+
+ Chunk most_significant_bigit = 0; // Could be = 0;
+ for (int j = 0; j <= string_index; ++j) {
+ most_significant_bigit <<= 4;
+ most_significant_bigit += HexCharValue(value[j]);
+ }
+ if (most_significant_bigit != 0) {
+ bigits_[used_digits_] = most_significant_bigit;
+ used_digits_++;
+ }
+ Clamp();
+}
+
+
+void Bignum::AddUInt64(uint64_t operand) {
+ if (operand == 0) return;
+ Bignum other;
+ other.AssignUInt64(operand);
+ AddBignum(other);
+}
+
+
+void Bignum::AddBignum(const Bignum& other) {
+ ASSERT(IsClamped());
+ ASSERT(other.IsClamped());
+
+ // If this has a greater exponent than other append zero-bigits to this.
+ // After this call exponent_ <= other.exponent_.
+ Align(other);
+
+ // There are two possibilities:
+ // aaaaaaaaaaa 0000 (where the 0s represent a's exponent)
+ // bbbbb 00000000
+ // ----------------
+ // ccccccccccc 0000
+ // or
+ // aaaaaaaaaa 0000
+ // bbbbbbbbb 0000000
+ // -----------------
+ // cccccccccccc 0000
+ // In both cases we might need a carry bigit.
+
+ EnsureCapacity(1 + Max(BigitLength(), other.BigitLength()) - exponent_);
+ Chunk carry = 0;
+ int bigit_pos = other.exponent_ - exponent_;
+ ASSERT(bigit_pos >= 0);
+ for (int i = 0; i < other.used_digits_; ++i) {
+ Chunk sum = bigits_[bigit_pos] + other.bigits_[i] + carry;
+ bigits_[bigit_pos] = sum & kBigitMask;
+ carry = sum >> kBigitSize;
+ bigit_pos++;
+ }
+
+ while (carry != 0) {
+ Chunk sum = bigits_[bigit_pos] + carry;
+ bigits_[bigit_pos] = sum & kBigitMask;
+ carry = sum >> kBigitSize;
+ bigit_pos++;
+ }
+ used_digits_ = Max(bigit_pos, used_digits_);
+ ASSERT(IsClamped());
+}
+
+
+void Bignum::SubtractBignum(const Bignum& other) {
+ ASSERT(IsClamped());
+ ASSERT(other.IsClamped());
+ // We require this to be bigger than other.
+ ASSERT(LessEqual(other, *this));
+
+ Align(other);
+
+ int offset = other.exponent_ - exponent_;
+ Chunk borrow = 0;
+ int i;
+ for (i = 0; i < other.used_digits_; ++i) {
+ ASSERT((borrow == 0) || (borrow == 1));
+ Chunk difference = bigits_[i + offset] - other.bigits_[i] - borrow;
+ bigits_[i + offset] = difference & kBigitMask;
+ borrow = difference >> (kChunkSize - 1);
+ }
+ while (borrow != 0) {
+ Chunk difference = bigits_[i + offset] - borrow;
+ bigits_[i + offset] = difference & kBigitMask;
+ borrow = difference >> (kChunkSize - 1);
+ ++i;
+ }
+ Clamp();
+}
+
+
+void Bignum::ShiftLeft(int shift_amount) {
+ if (used_digits_ == 0) return;
+ exponent_ += shift_amount / kBigitSize;
+ int local_shift = shift_amount % kBigitSize;
+ EnsureCapacity(used_digits_ + 1);
+ BigitsShiftLeft(local_shift);
+}
+
+
+void Bignum::MultiplyByUInt32(uint32_t factor) {
+ if (factor == 1) return;
+ if (factor == 0) {
+ Zero();
+ return;
+ }
+ if (used_digits_ == 0) return;
+
+ // The product of a bigit with the factor is of size kBigitSize + 32.
+ // Assert that this number + 1 (for the carry) fits into double chunk.
+ ASSERT(kDoubleChunkSize >= kBigitSize + 32 + 1);
+ DoubleChunk carry = 0;
+ for (int i = 0; i < used_digits_; ++i) {
+ DoubleChunk product = static_cast<DoubleChunk>(factor) * bigits_[i] + carry;
+ bigits_[i] = static_cast<Chunk>(product & kBigitMask);
+ carry = (product >> kBigitSize);
+ }
+ while (carry != 0) {
+ EnsureCapacity(used_digits_ + 1);
+ bigits_[used_digits_] = carry & kBigitMask;
+ used_digits_++;
+ carry >>= kBigitSize;
+ }
+}
+
+
+void Bignum::MultiplyByUInt64(uint64_t factor) {
+ if (factor == 1) return;
+ if (factor == 0) {
+ Zero();
+ return;
+ }
+ ASSERT(kBigitSize < 32);
+ uint64_t carry = 0;
+ uint64_t low = factor & 0xFFFFFFFF;
+ uint64_t high = factor >> 32;
+ for (int i = 0; i < used_digits_; ++i) {
+ uint64_t product_low = low * bigits_[i];
+ uint64_t product_high = high * bigits_[i];
+ uint64_t tmp = (carry & kBigitMask) + product_low;
+ bigits_[i] = tmp & kBigitMask;
+ carry = (carry >> kBigitSize) + (tmp >> kBigitSize) +
+ (product_high << (32 - kBigitSize));
+ }
+ while (carry != 0) {
+ EnsureCapacity(used_digits_ + 1);
+ bigits_[used_digits_] = carry & kBigitMask;
+ used_digits_++;
+ carry >>= kBigitSize;
+ }
+}
+
+
+void Bignum::MultiplyByPowerOfTen(int exponent) {
+ const uint64_t kFive27 = UINT64_2PART_C(0x6765c793, fa10079d);
+ const uint16_t kFive1 = 5;
+ const uint16_t kFive2 = kFive1 * 5;
+ const uint16_t kFive3 = kFive2 * 5;
+ const uint16_t kFive4 = kFive3 * 5;
+ const uint16_t kFive5 = kFive4 * 5;
+ const uint16_t kFive6 = kFive5 * 5;
+ const uint32_t kFive7 = kFive6 * 5;
+ const uint32_t kFive8 = kFive7 * 5;
+ const uint32_t kFive9 = kFive8 * 5;
+ const uint32_t kFive10 = kFive9 * 5;
+ const uint32_t kFive11 = kFive10 * 5;
+ const uint32_t kFive12 = kFive11 * 5;
+ const uint32_t kFive13 = kFive12 * 5;
+ const uint32_t kFive1_to_12[] =
+ { kFive1, kFive2, kFive3, kFive4, kFive5, kFive6,
+ kFive7, kFive8, kFive9, kFive10, kFive11, kFive12 };
+
+ ASSERT(exponent >= 0);
+ if (exponent == 0) return;
+ if (used_digits_ == 0) return;
+
+ // We shift by exponent at the end just before returning.
+ int remaining_exponent = exponent;
+ while (remaining_exponent >= 27) {
+ MultiplyByUInt64(kFive27);
+ remaining_exponent -= 27;
+ }
+ while (remaining_exponent >= 13) {
+ MultiplyByUInt32(kFive13);
+ remaining_exponent -= 13;
+ }
+ if (remaining_exponent > 0) {
+ MultiplyByUInt32(kFive1_to_12[remaining_exponent - 1]);
+ }
+ ShiftLeft(exponent);
+}
+
+
+void Bignum::Square() {
+ ASSERT(IsClamped());
+ int product_length = 2 * used_digits_;
+ EnsureCapacity(product_length);
+
+ // Comba multiplication: compute each column separately.
+ // Example: r = a2a1a0 * b2b1b0.
+ // r = 1 * a0b0 +
+ // 10 * (a1b0 + a0b1) +
+ // 100 * (a2b0 + a1b1 + a0b2) +
+ // 1000 * (a2b1 + a1b2) +
+ // 10000 * a2b2
+ //
+ // In the worst case we have to accumulate nb-digits products of digit*digit.
+ //
+ // Assert that the additional number of bits in a DoubleChunk are enough to
+ // sum up used_digits of Bigit*Bigit.
+ if ((1 << (2 * (kChunkSize - kBigitSize))) <= used_digits_) {
+ UNIMPLEMENTED();
+ }
+ DoubleChunk accumulator = 0;
+ // First shift the digits so we don't overwrite them.
+ int copy_offset = used_digits_;
+ for (int i = 0; i < used_digits_; ++i) {
+ bigits_[copy_offset + i] = bigits_[i];
+ }
+ // We have two loops to avoid some 'if's in the loop.
+ for (int i = 0; i < used_digits_; ++i) {
+ // Process temporary digit i with power i.
+ // The sum of the two indices must be equal to i.
+ int bigit_index1 = i;
+ int bigit_index2 = 0;
+ // Sum all of the sub-products.
+ while (bigit_index1 >= 0) {
+ Chunk chunk1 = bigits_[copy_offset + bigit_index1];
+ Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+ accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
+ bigit_index1--;
+ bigit_index2++;
+ }
+ bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+ accumulator >>= kBigitSize;
+ }
+ for (int i = used_digits_; i < product_length; ++i) {
+ int bigit_index1 = used_digits_ - 1;
+ int bigit_index2 = i - bigit_index1;
+ // Invariant: sum of both indices is again equal to i.
+ // Inner loop runs 0 times on last iteration, emptying accumulator.
+ while (bigit_index2 < used_digits_) {
+ Chunk chunk1 = bigits_[copy_offset + bigit_index1];
+ Chunk chunk2 = bigits_[copy_offset + bigit_index2];
+ accumulator += static_cast<DoubleChunk>(chunk1) * chunk2;
+ bigit_index1--;
+ bigit_index2++;
+ }
+ // The overwritten bigits_[i] will never be read in further loop iterations,
+ // because bigit_index1 and bigit_index2 are always greater
+ // than i - used_digits_.
+ bigits_[i] = static_cast<Chunk>(accumulator) & kBigitMask;
+ accumulator >>= kBigitSize;
+ }
+ // Since the result was guaranteed to lie inside the number the
+ // accumulator must be 0 now.
+ ASSERT(accumulator == 0);
+
+ // Don't forget to update the used_digits and the exponent.
+ used_digits_ = product_length;
+ exponent_ *= 2;
+ Clamp();
+}
+
+
+void Bignum::AssignPowerUInt16(uint16_t base, int power_exponent) {
+ ASSERT(base != 0);
+ ASSERT(power_exponent >= 0);
+ if (power_exponent == 0) {
+ AssignUInt16(1);
+ return;
+ }
+ Zero();
+ int shifts = 0;
+ // We expect base to be in range 2-32, and most often to be 10.
+ // It does not make much sense to implement different algorithms for counting
+ // the bits.
+ while ((base & 1) == 0) {
+ base >>= 1;
+ shifts++;
+ }
+ int bit_size = 0;
+ int tmp_base = base;
+ while (tmp_base != 0) {
+ tmp_base >>= 1;
+ bit_size++;
+ }
+ int final_size = bit_size * power_exponent;
+ // 1 extra bigit for the shifting, and one for rounded final_size.
+ EnsureCapacity(final_size / kBigitSize + 2);
+
+ // Left to Right exponentiation.
+ int mask = 1;
+ while (power_exponent >= mask) mask <<= 1;
+
+ // The mask is now pointing to the bit above the most significant 1-bit of
+ // power_exponent.
+ // Get rid of first 1-bit;
+ mask >>= 2;
+ uint64_t this_value = base;
+
+ bool delayed_multipliciation = false;
+ const uint64_t max_32bits = 0xFFFFFFFF;
+ while (mask != 0 && this_value <= max_32bits) {
+ this_value = this_value * this_value;
+ // Verify that there is enough space in this_value to perform the
+ // multiplication. The first bit_size bits must be 0.
+ if ((power_exponent & mask) != 0) {
+ uint64_t base_bits_mask =
+ ~((static_cast<uint64_t>(1) << (64 - bit_size)) - 1);
+ bool high_bits_zero = (this_value & base_bits_mask) == 0;
+ if (high_bits_zero) {
+ this_value *= base;
+ } else {
+ delayed_multipliciation = true;
+ }
+ }
+ mask >>= 1;
+ }
+ AssignUInt64(this_value);
+ if (delayed_multipliciation) {
+ MultiplyByUInt32(base);
+ }
+
+ // Now do the same thing as a bignum.
+ while (mask != 0) {
+ Square();
+ if ((power_exponent & mask) != 0) {
+ MultiplyByUInt32(base);
+ }
+ mask >>= 1;
+ }
+
+ // And finally add the saved shifts.
+ ShiftLeft(shifts * power_exponent);
+}
+
+
+// Precondition: this/other < 16bit.
+uint16_t Bignum::DivideModuloIntBignum(const Bignum& other) {
+ ASSERT(IsClamped());
+ ASSERT(other.IsClamped());
+ ASSERT(other.used_digits_ > 0);
+
+ // Easy case: if we have less digits than the divisor than the result is 0.
+ // Note: this handles the case where this == 0, too.
+ if (BigitLength() < other.BigitLength()) {
+ return 0;
+ }
+
+ Align(other);
+
+ uint16_t result = 0;
+
+ // Start by removing multiples of 'other' until both numbers have the same
+ // number of digits.
+ while (BigitLength() > other.BigitLength()) {
+ // This naive approach is extremely inefficient if `this` divided by other
+ // is big. This function is implemented for doubleToString where
+ // the result should be small (less than 10).
+ ASSERT(other.bigits_[other.used_digits_ - 1] >= ((1 << kBigitSize) / 16));
+ ASSERT(bigits_[used_digits_ - 1] < 0x10000);
+ // Remove the multiples of the first digit.
+ // Example this = 23 and other equals 9. -> Remove 2 multiples.
+ result += static_cast<uint16_t>(bigits_[used_digits_ - 1]);
+ SubtractTimes(other, bigits_[used_digits_ - 1]);
+ }
+
+ ASSERT(BigitLength() == other.BigitLength());
+
+ // Both bignums are at the same length now.
+ // Since other has more than 0 digits we know that the access to
+ // bigits_[used_digits_ - 1] is safe.
+ Chunk this_bigit = bigits_[used_digits_ - 1];
+ Chunk other_bigit = other.bigits_[other.used_digits_ - 1];
+
+ if (other.used_digits_ == 1) {
+ // Shortcut for easy (and common) case.
+ int quotient = this_bigit / other_bigit;
+ bigits_[used_digits_ - 1] = this_bigit - other_bigit * quotient;
+ ASSERT(quotient < 0x10000);
+ result += static_cast<uint16_t>(quotient);
+ Clamp();
+ return result;
+ }
+
+ int division_estimate = this_bigit / (other_bigit + 1);
+ ASSERT(division_estimate < 0x10000);
+ result += static_cast<uint16_t>(division_estimate);
+ SubtractTimes(other, division_estimate);
+
+ if (other_bigit * (division_estimate + 1) > this_bigit) {
+ // No need to even try to subtract. Even if other's remaining digits were 0
+ // another subtraction would be too much.
+ return result;
+ }
+
+ while (LessEqual(other, *this)) {
+ SubtractBignum(other);
+ result++;
+ }
+ return result;
+}
+
+
+template<typename S>
+static int SizeInHexChars(S number) {
+ ASSERT(number > 0);
+ int result = 0;
+ while (number != 0) {
+ number >>= 4;
+ result++;
+ }
+ return result;
+}
+
+
+static char HexCharOfValue(int value) {
+ ASSERT(0 <= value && value <= 16);
+ if (value < 10) return static_cast<char>(value + '0');
+ return static_cast<char>(value - 10 + 'A');
+}
+
+
+bool Bignum::ToHexString(char* buffer, int buffer_size) const {
+ ASSERT(IsClamped());
+ // Each bigit must be printable as separate hex-character.
+ ASSERT(kBigitSize % 4 == 0);
+ const int kHexCharsPerBigit = kBigitSize / 4;
+
+ if (used_digits_ == 0) {
+ if (buffer_size < 2) return false;
+ buffer[0] = '0';
+ buffer[1] = '\0';
+ return true;
+ }
+ // We add 1 for the terminating '\0' character.
+ int needed_chars = (BigitLength() - 1) * kHexCharsPerBigit +
+ SizeInHexChars(bigits_[used_digits_ - 1]) + 1;
+ if (needed_chars > buffer_size) return false;
+ int string_index = needed_chars - 1;
+ buffer[string_index--] = '\0';
+ for (int i = 0; i < exponent_; ++i) {
+ for (int j = 0; j < kHexCharsPerBigit; ++j) {
+ buffer[string_index--] = '0';
+ }
+ }
+ for (int i = 0; i < used_digits_ - 1; ++i) {
+ Chunk current_bigit = bigits_[i];
+ for (int j = 0; j < kHexCharsPerBigit; ++j) {
+ buffer[string_index--] = HexCharOfValue(current_bigit & 0xF);
+ current_bigit >>= 4;
+ }
+ }
+ // And finally the last bigit.
+ Chunk most_significant_bigit = bigits_[used_digits_ - 1];
+ while (most_significant_bigit != 0) {
+ buffer[string_index--] = HexCharOfValue(most_significant_bigit & 0xF);
+ most_significant_bigit >>= 4;
+ }
+ return true;
+}
+
+
+Bignum::Chunk Bignum::BigitAt(int index) const {
+ if (index >= BigitLength()) return 0;
+ if (index < exponent_) return 0;
+ return bigits_[index - exponent_];
+}
+
+
+int Bignum::Compare(const Bignum& a, const Bignum& b) {
+ ASSERT(a.IsClamped());
+ ASSERT(b.IsClamped());
+ int bigit_length_a = a.BigitLength();
+ int bigit_length_b = b.BigitLength();
+ if (bigit_length_a < bigit_length_b) return -1;
+ if (bigit_length_a > bigit_length_b) return +1;
+ for (int i = bigit_length_a - 1; i >= Min(a.exponent_, b.exponent_); --i) {
+ Chunk bigit_a = a.BigitAt(i);
+ Chunk bigit_b = b.BigitAt(i);
+ if (bigit_a < bigit_b) return -1;
+ if (bigit_a > bigit_b) return +1;
+ // Otherwise they are equal up to this digit. Try the next digit.
+ }
+ return 0;
+}
+
+
+int Bignum::PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c) {
+ ASSERT(a.IsClamped());
+ ASSERT(b.IsClamped());
+ ASSERT(c.IsClamped());
+ if (a.BigitLength() < b.BigitLength()) {
+ return PlusCompare(b, a, c);
+ }
+ if (a.BigitLength() + 1 < c.BigitLength()) return -1;
+ if (a.BigitLength() > c.BigitLength()) return +1;
+ // The exponent encodes 0-bigits. So if there are more 0-digits in 'a' than
+ // 'b' has digits, then the bigit-length of 'a'+'b' must be equal to the one
+ // of 'a'.
+ if (a.exponent_ >= b.BigitLength() && a.BigitLength() < c.BigitLength()) {
+ return -1;
+ }
+
+ Chunk borrow = 0;
+ // Starting at min_exponent all digits are == 0. So no need to compare them.
+ int min_exponent = Min(Min(a.exponent_, b.exponent_), c.exponent_);
+ for (int i = c.BigitLength() - 1; i >= min_exponent; --i) {
+ Chunk chunk_a = a.BigitAt(i);
+ Chunk chunk_b = b.BigitAt(i);
+ Chunk chunk_c = c.BigitAt(i);
+ Chunk sum = chunk_a + chunk_b;
+ if (sum > chunk_c + borrow) {
+ return +1;
+ } else {
+ borrow = chunk_c + borrow - sum;
+ if (borrow > 1) return -1;
+ borrow <<= kBigitSize;
+ }
+ }
+ if (borrow == 0) return 0;
+ return -1;
+}
+
+
+void Bignum::Clamp() {
+ while (used_digits_ > 0 && bigits_[used_digits_ - 1] == 0) {
+ used_digits_--;
+ }
+ if (used_digits_ == 0) {
+ // Zero.
+ exponent_ = 0;
+ }
+}
+
+
+bool Bignum::IsClamped() const {
+ return used_digits_ == 0 || bigits_[used_digits_ - 1] != 0;
+}
+
+
+void Bignum::Zero() {
+ for (int i = 0; i < used_digits_; ++i) {
+ bigits_[i] = 0;
+ }
+ used_digits_ = 0;
+ exponent_ = 0;
+}
+
+
+void Bignum::Align(const Bignum& other) {
+ if (exponent_ > other.exponent_) {
+ // If "X" represents a "hidden" digit (by the exponent) then we are in the
+ // following case (a == this, b == other):
+ // a: aaaaaaXXXX or a: aaaaaXXX
+ // b: bbbbbbX b: bbbbbbbbXX
+ // We replace some of the hidden digits (X) of a with 0 digits.
+ // a: aaaaaa000X or a: aaaaa0XX
+ int zero_digits = exponent_ - other.exponent_;
+ EnsureCapacity(used_digits_ + zero_digits);
+ for (int i = used_digits_ - 1; i >= 0; --i) {
+ bigits_[i + zero_digits] = bigits_[i];
+ }
+ for (int i = 0; i < zero_digits; ++i) {
+ bigits_[i] = 0;
+ }
+ used_digits_ += zero_digits;
+ exponent_ -= zero_digits;
+ ASSERT(used_digits_ >= 0);
+ ASSERT(exponent_ >= 0);
+ }
+}
+
+
+void Bignum::BigitsShiftLeft(int shift_amount) {
+ ASSERT(shift_amount < kBigitSize);
+ ASSERT(shift_amount >= 0);
+ Chunk carry = 0;
+ for (int i = 0; i < used_digits_; ++i) {
+ Chunk new_carry = bigits_[i] >> (kBigitSize - shift_amount);
+ bigits_[i] = ((bigits_[i] << shift_amount) + carry) & kBigitMask;
+ carry = new_carry;
+ }
+ if (carry != 0) {
+ bigits_[used_digits_] = carry;
+ used_digits_++;
+ }
+}
+
+
+void Bignum::SubtractTimes(const Bignum& other, int factor) {
+ ASSERT(exponent_ <= other.exponent_);
+ if (factor < 3) {
+ for (int i = 0; i < factor; ++i) {
+ SubtractBignum(other);
+ }
+ return;
+ }
+ Chunk borrow = 0;
+ int exponent_diff = other.exponent_ - exponent_;
+ for (int i = 0; i < other.used_digits_; ++i) {
+ DoubleChunk product = static_cast<DoubleChunk>(factor) * other.bigits_[i];
+ DoubleChunk remove = borrow + product;
+ Chunk difference = bigits_[i + exponent_diff] - (remove & kBigitMask);
+ bigits_[i + exponent_diff] = difference & kBigitMask;
+ borrow = static_cast<Chunk>((difference >> (kChunkSize - 1)) +
+ (remove >> kBigitSize));
+ }
+ for (int i = other.used_digits_ + exponent_diff; i < used_digits_; ++i) {
+ if (borrow == 0) return;
+ Chunk difference = bigits_[i] - borrow;
+ bigits_[i] = difference & kBigitMask;
+ borrow = difference >> (kChunkSize - 1);
+ }
+ Clamp();
+}
+
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/bignum.h b/src/3rdparty/double-conversion/bignum.h
new file mode 100644
index 0000000000..5ec3544f57
--- /dev/null
+++ b/src/3rdparty/double-conversion/bignum.h
@@ -0,0 +1,145 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_BIGNUM_H_
+#define DOUBLE_CONVERSION_BIGNUM_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+class Bignum {
+ public:
+ // 3584 = 128 * 28. We can represent 2^3584 > 10^1000 accurately.
+ // This bignum can encode much bigger numbers, since it contains an
+ // exponent.
+ static const int kMaxSignificantBits = 3584;
+
+ Bignum();
+ void AssignUInt16(uint16_t value);
+ void AssignUInt64(uint64_t value);
+ void AssignBignum(const Bignum& other);
+
+ void AssignDecimalString(Vector<const char> value);
+ void AssignHexString(Vector<const char> value);
+
+ void AssignPowerUInt16(uint16_t base, int exponent);
+
+ void AddUInt16(uint16_t operand);
+ void AddUInt64(uint64_t operand);
+ void AddBignum(const Bignum& other);
+ // Precondition: this >= other.
+ void SubtractBignum(const Bignum& other);
+
+ void Square();
+ void ShiftLeft(int shift_amount);
+ void MultiplyByUInt32(uint32_t factor);
+ void MultiplyByUInt64(uint64_t factor);
+ void MultiplyByPowerOfTen(int exponent);
+ void Times10() { return MultiplyByUInt32(10); }
+ // Pseudocode:
+ // int result = this / other;
+ // this = this % other;
+ // In the worst case this function is in O(this/other).
+ uint16_t DivideModuloIntBignum(const Bignum& other);
+
+ bool ToHexString(char* buffer, int buffer_size) const;
+
+ // Returns
+ // -1 if a < b,
+ // 0 if a == b, and
+ // +1 if a > b.
+ static int Compare(const Bignum& a, const Bignum& b);
+ static bool Equal(const Bignum& a, const Bignum& b) {
+ return Compare(a, b) == 0;
+ }
+ static bool LessEqual(const Bignum& a, const Bignum& b) {
+ return Compare(a, b) <= 0;
+ }
+ static bool Less(const Bignum& a, const Bignum& b) {
+ return Compare(a, b) < 0;
+ }
+ // Returns Compare(a + b, c);
+ static int PlusCompare(const Bignum& a, const Bignum& b, const Bignum& c);
+ // Returns a + b == c
+ static bool PlusEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
+ return PlusCompare(a, b, c) == 0;
+ }
+ // Returns a + b <= c
+ static bool PlusLessEqual(const Bignum& a, const Bignum& b, const Bignum& c) {
+ return PlusCompare(a, b, c) <= 0;
+ }
+ // Returns a + b < c
+ static bool PlusLess(const Bignum& a, const Bignum& b, const Bignum& c) {
+ return PlusCompare(a, b, c) < 0;
+ }
+ private:
+ typedef uint32_t Chunk;
+ typedef uint64_t DoubleChunk;
+
+ static const int kChunkSize = sizeof(Chunk) * 8;
+ static const int kDoubleChunkSize = sizeof(DoubleChunk) * 8;
+ // With bigit size of 28 we loose some bits, but a double still fits easily
+ // into two chunks, and more importantly we can use the Comba multiplication.
+ static const int kBigitSize = 28;
+ static const Chunk kBigitMask = (1 << kBigitSize) - 1;
+ // Every instance allocates kBigitLength chunks on the stack. Bignums cannot
+ // grow. There are no checks if the stack-allocated space is sufficient.
+ static const int kBigitCapacity = kMaxSignificantBits / kBigitSize;
+
+ void EnsureCapacity(int size) {
+ if (size > kBigitCapacity) {
+ UNREACHABLE();
+ }
+ }
+ void Align(const Bignum& other);
+ void Clamp();
+ bool IsClamped() const;
+ void Zero();
+ // Requires this to have enough capacity (no tests done).
+ // Updates used_digits_ if necessary.
+ // shift_amount must be < kBigitSize.
+ void BigitsShiftLeft(int shift_amount);
+ // BigitLength includes the "hidden" digits encoded in the exponent.
+ int BigitLength() const { return used_digits_ + exponent_; }
+ Chunk BigitAt(int index) const;
+ void SubtractTimes(const Bignum& other, int factor);
+
+ Chunk bigits_buffer_[kBigitCapacity];
+ // A vector backed by bigits_buffer_. This way accesses to the array are
+ // checked for out-of-bounds errors.
+ Vector<Chunk> bigits_;
+ int used_digits_;
+ // The Bignum's value equals value(bigits_) * 2^(exponent_ * kBigitSize).
+ int exponent_;
+
+ DISALLOW_COPY_AND_ASSIGN(Bignum);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_BIGNUM_H_
diff --git a/src/3rdparty/double-conversion/cached-powers.cc b/src/3rdparty/double-conversion/cached-powers.cc
new file mode 100644
index 0000000000..9536f26927
--- /dev/null
+++ b/src/3rdparty/double-conversion/cached-powers.cc
@@ -0,0 +1,178 @@
+// Copyright 2006-2008 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#include <stdarg.h>
+#include <limits.h>
+#include <math.h>
+
+#include "utils.h"
+
+#include "cached-powers.h"
+
+namespace double_conversion {
+
+struct CachedPower {
+ uint64_t significand;
+ int16_t binary_exponent;
+ int16_t decimal_exponent;
+};
+
+static const CachedPower kCachedPowers[] = {
+ {UINT64_2PART_C(0xfa8fd5a0, 081c0288), -1220, -348},
+ {UINT64_2PART_C(0xbaaee17f, a23ebf76), -1193, -340},
+ {UINT64_2PART_C(0x8b16fb20, 3055ac76), -1166, -332},
+ {UINT64_2PART_C(0xcf42894a, 5dce35ea), -1140, -324},
+ {UINT64_2PART_C(0x9a6bb0aa, 55653b2d), -1113, -316},
+ {UINT64_2PART_C(0xe61acf03, 3d1a45df), -1087, -308},
+ {UINT64_2PART_C(0xab70fe17, c79ac6ca), -1060, -300},
+ {UINT64_2PART_C(0xff77b1fc, bebcdc4f), -1034, -292},
+ {UINT64_2PART_C(0xbe5691ef, 416bd60c), -1007, -284},
+ {UINT64_2PART_C(0x8dd01fad, 907ffc3c), -980, -276},
+ {UINT64_2PART_C(0xd3515c28, 31559a83), -954, -268},
+ {UINT64_2PART_C(0x9d71ac8f, ada6c9b5), -927, -260},
+ {UINT64_2PART_C(0xea9c2277, 23ee8bcb), -901, -252},
+ {UINT64_2PART_C(0xaecc4991, 4078536d), -874, -244},
+ {UINT64_2PART_C(0x823c1279, 5db6ce57), -847, -236},
+ {UINT64_2PART_C(0xc2109436, 4dfb5637), -821, -228},
+ {UINT64_2PART_C(0x9096ea6f, 3848984f), -794, -220},
+ {UINT64_2PART_C(0xd77485cb, 25823ac7), -768, -212},
+ {UINT64_2PART_C(0xa086cfcd, 97bf97f4), -741, -204},
+ {UINT64_2PART_C(0xef340a98, 172aace5), -715, -196},
+ {UINT64_2PART_C(0xb23867fb, 2a35b28e), -688, -188},
+ {UINT64_2PART_C(0x84c8d4df, d2c63f3b), -661, -180},
+ {UINT64_2PART_C(0xc5dd4427, 1ad3cdba), -635, -172},
+ {UINT64_2PART_C(0x936b9fce, bb25c996), -608, -164},
+ {UINT64_2PART_C(0xdbac6c24, 7d62a584), -582, -156},
+ {UINT64_2PART_C(0xa3ab6658, 0d5fdaf6), -555, -148},
+ {UINT64_2PART_C(0xf3e2f893, dec3f126), -529, -140},
+ {UINT64_2PART_C(0xb5b5ada8, aaff80b8), -502, -132},
+ {UINT64_2PART_C(0x87625f05, 6c7c4a8b), -475, -124},
+ {UINT64_2PART_C(0xc9bcff60, 34c13053), -449, -116},
+ {UINT64_2PART_C(0x964e858c, 91ba2655), -422, -108},
+ {UINT64_2PART_C(0xdff97724, 70297ebd), -396, -100},
+ {UINT64_2PART_C(0xa6dfbd9f, b8e5b88f), -369, -92},
+ {UINT64_2PART_C(0xf8a95fcf, 88747d94), -343, -84},
+ {UINT64_2PART_C(0xb9447093, 8fa89bcf), -316, -76},
+ {UINT64_2PART_C(0x8a08f0f8, bf0f156b), -289, -68},
+ {UINT64_2PART_C(0xcdb02555, 653131b6), -263, -60},
+ {UINT64_2PART_C(0x993fe2c6, d07b7fac), -236, -52},
+ {UINT64_2PART_C(0xe45c10c4, 2a2b3b06), -210, -44},
+ {UINT64_2PART_C(0xaa242499, 697392d3), -183, -36},
+ {UINT64_2PART_C(0xfd87b5f2, 8300ca0e), -157, -28},
+ {UINT64_2PART_C(0xbce50864, 92111aeb), -130, -20},
+ {UINT64_2PART_C(0x8cbccc09, 6f5088cc), -103, -12},
+ {UINT64_2PART_C(0xd1b71758, e219652c), -77, -4},
+ {UINT64_2PART_C(0x9c400000, 00000000), -50, 4},
+ {UINT64_2PART_C(0xe8d4a510, 00000000), -24, 12},
+ {UINT64_2PART_C(0xad78ebc5, ac620000), 3, 20},
+ {UINT64_2PART_C(0x813f3978, f8940984), 30, 28},
+ {UINT64_2PART_C(0xc097ce7b, c90715b3), 56, 36},
+ {UINT64_2PART_C(0x8f7e32ce, 7bea5c70), 83, 44},
+ {UINT64_2PART_C(0xd5d238a4, abe98068), 109, 52},
+ {UINT64_2PART_C(0x9f4f2726, 179a2245), 136, 60},
+ {UINT64_2PART_C(0xed63a231, d4c4fb27), 162, 68},
+ {UINT64_2PART_C(0xb0de6538, 8cc8ada8), 189, 76},
+ {UINT64_2PART_C(0x83c7088e, 1aab65db), 216, 84},
+ {UINT64_2PART_C(0xc45d1df9, 42711d9a), 242, 92},
+ {UINT64_2PART_C(0x924d692c, a61be758), 269, 100},
+ {UINT64_2PART_C(0xda01ee64, 1a708dea), 295, 108},
+ {UINT64_2PART_C(0xa26da399, 9aef774a), 322, 116},
+ {UINT64_2PART_C(0xf209787b, b47d6b85), 348, 124},
+ {UINT64_2PART_C(0xb454e4a1, 79dd1877), 375, 132},
+ {UINT64_2PART_C(0x865b8692, 5b9bc5c2), 402, 140},
+ {UINT64_2PART_C(0xc83553c5, c8965d3d), 428, 148},
+ {UINT64_2PART_C(0x952ab45c, fa97a0b3), 455, 156},
+ {UINT64_2PART_C(0xde469fbd, 99a05fe3), 481, 164},
+ {UINT64_2PART_C(0xa59bc234, db398c25), 508, 172},
+ {UINT64_2PART_C(0xf6c69a72, a3989f5c), 534, 180},
+ {UINT64_2PART_C(0xb7dcbf53, 54e9bece), 561, 188},
+ {UINT64_2PART_C(0x88fcf317, f22241e2), 588, 196},
+ {UINT64_2PART_C(0xcc20ce9b, d35c78a5), 614, 204},
+ {UINT64_2PART_C(0x98165af3, 7b2153df), 641, 212},
+ {UINT64_2PART_C(0xe2a0b5dc, 971f303a), 667, 220},
+ {UINT64_2PART_C(0xa8d9d153, 5ce3b396), 694, 228},
+ {UINT64_2PART_C(0xfb9b7cd9, a4a7443c), 720, 236},
+ {UINT64_2PART_C(0xbb764c4c, a7a44410), 747, 244},
+ {UINT64_2PART_C(0x8bab8eef, b6409c1a), 774, 252},
+ {UINT64_2PART_C(0xd01fef10, a657842c), 800, 260},
+ {UINT64_2PART_C(0x9b10a4e5, e9913129), 827, 268},
+ {UINT64_2PART_C(0xe7109bfb, a19c0c9d), 853, 276},
+ {UINT64_2PART_C(0xac2820d9, 623bf429), 880, 284},
+ {UINT64_2PART_C(0x80444b5e, 7aa7cf85), 907, 292},
+ {UINT64_2PART_C(0xbf21e440, 03acdd2d), 933, 300},
+ {UINT64_2PART_C(0x8e679c2f, 5e44ff8f), 960, 308},
+ {UINT64_2PART_C(0xd433179d, 9c8cb841), 986, 316},
+ {UINT64_2PART_C(0x9e19db92, b4e31ba9), 1013, 324},
+ {UINT64_2PART_C(0xeb96bf6e, badf77d9), 1039, 332},
+ {UINT64_2PART_C(0xaf87023b, 9bf0ee6b), 1066, 340},
+};
+
+static const int kCachedPowersLength = ARRAY_SIZE(kCachedPowers);
+static const int kCachedPowersOffset = 348; // -1 * the first decimal_exponent.
+static const double kD_1_LOG2_10 = 0.30102999566398114; // 1 / lg(10)
+// Difference between the decimal exponents in the table above.
+const int PowersOfTenCache::kDecimalExponentDistance = 8;
+const int PowersOfTenCache::kMinDecimalExponent = -348;
+const int PowersOfTenCache::kMaxDecimalExponent = 340;
+
+void PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+ int min_exponent,
+ int max_exponent,
+ DiyFp* power,
+ int* decimal_exponent) {
+ (void)max_exponent; // Silence unused parameter warning in release builds
+ (void)kCachedPowersLength; // Silence unused parameter warning in release builds
+ int kQ = DiyFp::kSignificandSize;
+ double k = ceil((min_exponent + kQ - 1) * kD_1_LOG2_10);
+ int foo = kCachedPowersOffset;
+ int index =
+ (foo + static_cast<int>(k) - 1) / kDecimalExponentDistance + 1;
+ ASSERT(0 <= index && index < kCachedPowersLength);
+ CachedPower cached_power = kCachedPowers[index];
+ ASSERT(min_exponent <= cached_power.binary_exponent);
+ (void) max_exponent; // Mark variable as used.
+ ASSERT(cached_power.binary_exponent <= max_exponent);
+ *decimal_exponent = cached_power.decimal_exponent;
+ *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
+}
+
+
+void PowersOfTenCache::GetCachedPowerForDecimalExponent(int requested_exponent,
+ DiyFp* power,
+ int* found_exponent) {
+ ASSERT(kMinDecimalExponent <= requested_exponent);
+ ASSERT(requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance);
+ int index =
+ (requested_exponent + kCachedPowersOffset) / kDecimalExponentDistance;
+ CachedPower cached_power = kCachedPowers[index];
+ *power = DiyFp(cached_power.significand, cached_power.binary_exponent);
+ *found_exponent = cached_power.decimal_exponent;
+ ASSERT(*found_exponent <= requested_exponent);
+ ASSERT(requested_exponent < *found_exponent + kDecimalExponentDistance);
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/cached-powers.h b/src/3rdparty/double-conversion/cached-powers.h
new file mode 100644
index 0000000000..61a50614cf
--- /dev/null
+++ b/src/3rdparty/double-conversion/cached-powers.h
@@ -0,0 +1,64 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_CACHED_POWERS_H_
+#define DOUBLE_CONVERSION_CACHED_POWERS_H_
+
+#include "diy-fp.h"
+
+namespace double_conversion {
+
+class PowersOfTenCache {
+ public:
+
+ // Not all powers of ten are cached. The decimal exponent of two neighboring
+ // cached numbers will differ by kDecimalExponentDistance.
+ static const int kDecimalExponentDistance;
+
+ static const int kMinDecimalExponent;
+ static const int kMaxDecimalExponent;
+
+ // Returns a cached power-of-ten with a binary exponent in the range
+ // [min_exponent; max_exponent] (boundaries included).
+ static void GetCachedPowerForBinaryExponentRange(int min_exponent,
+ int max_exponent,
+ DiyFp* power,
+ int* decimal_exponent);
+
+ // Returns a cached power of ten x ~= 10^k such that
+ // k <= decimal_exponent < k + kCachedPowersDecimalDistance.
+ // The given decimal_exponent must satisfy
+ // kMinDecimalExponent <= requested_exponent, and
+ // requested_exponent < kMaxDecimalExponent + kDecimalExponentDistance.
+ static void GetCachedPowerForDecimalExponent(int requested_exponent,
+ DiyFp* power,
+ int* found_exponent);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_CACHED_POWERS_H_
diff --git a/src/3rdparty/double-conversion/diy-fp.cc b/src/3rdparty/double-conversion/diy-fp.cc
new file mode 100644
index 0000000000..ddd1891b16
--- /dev/null
+++ b/src/3rdparty/double-conversion/diy-fp.cc
@@ -0,0 +1,57 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+
+#include "diy-fp.h"
+#include "utils.h"
+
+namespace double_conversion {
+
+void DiyFp::Multiply(const DiyFp& other) {
+ // Simply "emulates" a 128 bit multiplication.
+ // However: the resulting number only contains 64 bits. The least
+ // significant 64 bits are only used for rounding the most significant 64
+ // bits.
+ const uint64_t kM32 = 0xFFFFFFFFU;
+ uint64_t a = f_ >> 32;
+ uint64_t b = f_ & kM32;
+ uint64_t c = other.f_ >> 32;
+ uint64_t d = other.f_ & kM32;
+ uint64_t ac = a * c;
+ uint64_t bc = b * c;
+ uint64_t ad = a * d;
+ uint64_t bd = b * d;
+ uint64_t tmp = (bd >> 32) + (ad & kM32) + (bc & kM32);
+ // By adding 1U << 31 to tmp we round the final result.
+ // Halfway cases will be round up.
+ tmp += 1U << 31;
+ uint64_t result_f = ac + (ad >> 32) + (bc >> 32) + (tmp >> 32);
+ e_ += other.e_ + 64;
+ f_ = result_f;
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/diy-fp.h b/src/3rdparty/double-conversion/diy-fp.h
new file mode 100644
index 0000000000..9dcf8fbdba
--- /dev/null
+++ b/src/3rdparty/double-conversion/diy-fp.h
@@ -0,0 +1,118 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_DIY_FP_H_
+#define DOUBLE_CONVERSION_DIY_FP_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+// This "Do It Yourself Floating Point" class implements a floating-point number
+// with a uint64 significand and an int exponent. Normalized DiyFp numbers will
+// have the most significant bit of the significand set.
+// Multiplication and Subtraction do not normalize their results.
+// DiyFp are not designed to contain special doubles (NaN and Infinity).
+class DiyFp {
+ public:
+ static const int kSignificandSize = 64;
+
+ DiyFp() : f_(0), e_(0) {}
+ DiyFp(uint64_t f, int e) : f_(f), e_(e) {}
+
+ // this = this - other.
+ // The exponents of both numbers must be the same and the significand of this
+ // must be bigger than the significand of other.
+ // The result will not be normalized.
+ void Subtract(const DiyFp& other) {
+ ASSERT(e_ == other.e_);
+ ASSERT(f_ >= other.f_);
+ f_ -= other.f_;
+ }
+
+ // Returns a - b.
+ // The exponents of both numbers must be the same and this must be bigger
+ // than other. The result will not be normalized.
+ static DiyFp Minus(const DiyFp& a, const DiyFp& b) {
+ DiyFp result = a;
+ result.Subtract(b);
+ return result;
+ }
+
+
+ // this = this * other.
+ void Multiply(const DiyFp& other);
+
+ // returns a * b;
+ static DiyFp Times(const DiyFp& a, const DiyFp& b) {
+ DiyFp result = a;
+ result.Multiply(b);
+ return result;
+ }
+
+ void Normalize() {
+ ASSERT(f_ != 0);
+ uint64_t f = f_;
+ int e = e_;
+
+ // This method is mainly called for normalizing boundaries. In general
+ // boundaries need to be shifted by 10 bits. We thus optimize for this case.
+ const uint64_t k10MSBits = UINT64_2PART_C(0xFFC00000, 00000000);
+ while ((f & k10MSBits) == 0) {
+ f <<= 10;
+ e -= 10;
+ }
+ while ((f & kUint64MSB) == 0) {
+ f <<= 1;
+ e--;
+ }
+ f_ = f;
+ e_ = e;
+ }
+
+ static DiyFp Normalize(const DiyFp& a) {
+ DiyFp result = a;
+ result.Normalize();
+ return result;
+ }
+
+ uint64_t f() const { return f_; }
+ int e() const { return e_; }
+
+ void set_f(uint64_t new_value) { f_ = new_value; }
+ void set_e(int new_value) { e_ = new_value; }
+
+ private:
+ static const uint64_t kUint64MSB = UINT64_2PART_C(0x80000000, 00000000);
+
+ uint64_t f_;
+ int e_;
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_DIY_FP_H_
diff --git a/src/3rdparty/double-conversion/double-conversion.cc b/src/3rdparty/double-conversion/double-conversion.cc
new file mode 100644
index 0000000000..909985be82
--- /dev/null
+++ b/src/3rdparty/double-conversion/double-conversion.cc
@@ -0,0 +1,975 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#include <limits.h>
+#include <math.h>
+
+#include "double-conversion.h"
+
+#include "bignum-dtoa.h"
+#include "fast-dtoa.h"
+#include "fixed-dtoa.h"
+#include "ieee.h"
+#include "strtod.h"
+#include "utils.h"
+
+namespace double_conversion {
+
+const DoubleToStringConverter& DoubleToStringConverter::EcmaScriptConverter() {
+ int flags = UNIQUE_ZERO | EMIT_POSITIVE_EXPONENT_SIGN;
+ static DoubleToStringConverter converter(flags,
+ "Infinity",
+ "NaN",
+ 'e',
+ -6, 21,
+ 6, 0);
+ return converter;
+}
+
+
+bool DoubleToStringConverter::HandleSpecialValues(
+ double value,
+ StringBuilder* result_builder) const {
+ Double double_inspect(value);
+ if (double_inspect.IsInfinite()) {
+ if (infinity_symbol_ == NULL) return false;
+ if (value < 0) {
+ result_builder->AddCharacter('-');
+ }
+ result_builder->AddString(infinity_symbol_);
+ return true;
+ }
+ if (double_inspect.IsNan()) {
+ if (nan_symbol_ == NULL) return false;
+ result_builder->AddString(nan_symbol_);
+ return true;
+ }
+ return false;
+}
+
+
+void DoubleToStringConverter::CreateExponentialRepresentation(
+ const char* decimal_digits,
+ int length,
+ int exponent,
+ StringBuilder* result_builder) const {
+ ASSERT(length != 0);
+ result_builder->AddCharacter(decimal_digits[0]);
+ if (length != 1) {
+ result_builder->AddCharacter('.');
+ result_builder->AddSubstring(&decimal_digits[1], length-1);
+ }
+ result_builder->AddCharacter(exponent_character_);
+ if (exponent < 0) {
+ result_builder->AddCharacter('-');
+ exponent = -exponent;
+ } else {
+ if ((flags_ & EMIT_POSITIVE_EXPONENT_SIGN) != 0) {
+ result_builder->AddCharacter('+');
+ }
+ }
+ if (exponent == 0) {
+ result_builder->AddCharacter('0');
+ return;
+ }
+ ASSERT(exponent < 1e4);
+ const int kMaxExponentLength = 5;
+ char buffer[kMaxExponentLength + 1];
+ buffer[kMaxExponentLength] = '\0';
+ int first_char_pos = kMaxExponentLength;
+ while (exponent > 0) {
+ buffer[--first_char_pos] = '0' + (exponent % 10);
+ exponent /= 10;
+ }
+ result_builder->AddSubstring(&buffer[first_char_pos],
+ kMaxExponentLength - first_char_pos);
+}
+
+
+void DoubleToStringConverter::CreateDecimalRepresentation(
+ const char* decimal_digits,
+ int length,
+ int decimal_point,
+ int digits_after_point,
+ StringBuilder* result_builder) const {
+ // Create a representation that is padded with zeros if needed.
+ if (decimal_point <= 0) {
+ // "0.00000decimal_rep".
+ result_builder->AddCharacter('0');
+ if (digits_after_point > 0) {
+ result_builder->AddCharacter('.');
+ result_builder->AddPadding('0', -decimal_point);
+ ASSERT(length <= digits_after_point - (-decimal_point));
+ result_builder->AddSubstring(decimal_digits, length);
+ int remaining_digits = digits_after_point - (-decimal_point) - length;
+ result_builder->AddPadding('0', remaining_digits);
+ }
+ } else if (decimal_point >= length) {
+ // "decimal_rep0000.00000" or "decimal_rep.0000"
+ result_builder->AddSubstring(decimal_digits, length);
+ result_builder->AddPadding('0', decimal_point - length);
+ if (digits_after_point > 0) {
+ result_builder->AddCharacter('.');
+ result_builder->AddPadding('0', digits_after_point);
+ }
+ } else {
+ // "decima.l_rep000"
+ ASSERT(digits_after_point > 0);
+ result_builder->AddSubstring(decimal_digits, decimal_point);
+ result_builder->AddCharacter('.');
+ ASSERT(length - decimal_point <= digits_after_point);
+ result_builder->AddSubstring(&decimal_digits[decimal_point],
+ length - decimal_point);
+ int remaining_digits = digits_after_point - (length - decimal_point);
+ result_builder->AddPadding('0', remaining_digits);
+ }
+ if (digits_after_point == 0) {
+ if ((flags_ & EMIT_TRAILING_DECIMAL_POINT) != 0) {
+ result_builder->AddCharacter('.');
+ }
+ if ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) {
+ result_builder->AddCharacter('0');
+ }
+ }
+}
+
+
+bool DoubleToStringConverter::ToShortestIeeeNumber(
+ double value,
+ StringBuilder* result_builder,
+ DoubleToStringConverter::DtoaMode mode) const {
+ ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE);
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ int decimal_point;
+ bool sign;
+ const int kDecimalRepCapacity = kBase10MaximalLength + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ DoubleToAscii(value, mode, 0, decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+
+ bool unique_zero = (flags_ & UNIQUE_ZERO) != 0;
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ int exponent = decimal_point - 1;
+ if ((decimal_in_shortest_low_ <= exponent) &&
+ (exponent < decimal_in_shortest_high_)) {
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length,
+ decimal_point,
+ Max(0, decimal_rep_length - decimal_point),
+ result_builder);
+ } else {
+ CreateExponentialRepresentation(decimal_rep, decimal_rep_length, exponent,
+ result_builder);
+ }
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToFixed(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const {
+ ASSERT(kMaxFixedDigitsBeforePoint == 60);
+ const double kFirstNonFixed = 1e60;
+
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (requested_digits > kMaxFixedDigitsAfterPoint) return false;
+ if (value >= kFirstNonFixed || value <= -kFirstNonFixed) return false;
+
+ // Find a sufficiently precise decimal representation of n.
+ int decimal_point;
+ bool sign;
+ // Add space for the '\0' byte.
+ const int kDecimalRepCapacity =
+ kMaxFixedDigitsBeforePoint + kMaxFixedDigitsAfterPoint + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+ DoubleToAscii(value, FIXED, requested_digits,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+ requested_digits, result_builder);
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToExponential(
+ double value,
+ int requested_digits,
+ StringBuilder* result_builder) const {
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (requested_digits < -1) return false;
+ if (requested_digits > kMaxExponentialDigits) return false;
+
+ int decimal_point;
+ bool sign;
+ // Add space for digit before the decimal point and the '\0' character.
+ const int kDecimalRepCapacity = kMaxExponentialDigits + 2;
+ ASSERT(kDecimalRepCapacity > kBase10MaximalLength);
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ if (requested_digits == -1) {
+ DoubleToAscii(value, SHORTEST, 0,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ } else {
+ DoubleToAscii(value, PRECISION, requested_digits + 1,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ ASSERT(decimal_rep_length <= requested_digits + 1);
+
+ for (int i = decimal_rep_length; i < requested_digits + 1; ++i) {
+ decimal_rep[i] = '0';
+ }
+ decimal_rep_length = requested_digits + 1;
+ }
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ int exponent = decimal_point - 1;
+ CreateExponentialRepresentation(decimal_rep,
+ decimal_rep_length,
+ exponent,
+ result_builder);
+ return true;
+}
+
+
+bool DoubleToStringConverter::ToPrecision(double value,
+ int precision,
+ StringBuilder* result_builder) const {
+ if (Double(value).IsSpecial()) {
+ return HandleSpecialValues(value, result_builder);
+ }
+
+ if (precision < kMinPrecisionDigits || precision > kMaxPrecisionDigits) {
+ return false;
+ }
+
+ // Find a sufficiently precise decimal representation of n.
+ int decimal_point;
+ bool sign;
+ // Add one for the terminating null character.
+ const int kDecimalRepCapacity = kMaxPrecisionDigits + 1;
+ char decimal_rep[kDecimalRepCapacity];
+ int decimal_rep_length;
+
+ DoubleToAscii(value, PRECISION, precision,
+ decimal_rep, kDecimalRepCapacity,
+ &sign, &decimal_rep_length, &decimal_point);
+ ASSERT(decimal_rep_length <= precision);
+
+ bool unique_zero = ((flags_ & UNIQUE_ZERO) != 0);
+ if (sign && (value != 0.0 || !unique_zero)) {
+ result_builder->AddCharacter('-');
+ }
+
+ // The exponent if we print the number as x.xxeyyy. That is with the
+ // decimal point after the first digit.
+ int exponent = decimal_point - 1;
+
+ int extra_zero = ((flags_ & EMIT_TRAILING_ZERO_AFTER_POINT) != 0) ? 1 : 0;
+ if ((-decimal_point + 1 > max_leading_padding_zeroes_in_precision_mode_) ||
+ (decimal_point - precision + extra_zero >
+ max_trailing_padding_zeroes_in_precision_mode_)) {
+ // Fill buffer to contain 'precision' digits.
+ // Usually the buffer is already at the correct length, but 'DoubleToAscii'
+ // is allowed to return less characters.
+ for (int i = decimal_rep_length; i < precision; ++i) {
+ decimal_rep[i] = '0';
+ }
+
+ CreateExponentialRepresentation(decimal_rep,
+ precision,
+ exponent,
+ result_builder);
+ } else {
+ CreateDecimalRepresentation(decimal_rep, decimal_rep_length, decimal_point,
+ Max(0, precision - decimal_point),
+ result_builder);
+ }
+ return true;
+}
+
+
+static BignumDtoaMode DtoaToBignumDtoaMode(
+ DoubleToStringConverter::DtoaMode dtoa_mode) {
+ switch (dtoa_mode) {
+ case DoubleToStringConverter::SHORTEST: return BIGNUM_DTOA_SHORTEST;
+ case DoubleToStringConverter::SHORTEST_SINGLE:
+ return BIGNUM_DTOA_SHORTEST_SINGLE;
+ case DoubleToStringConverter::FIXED: return BIGNUM_DTOA_FIXED;
+ case DoubleToStringConverter::PRECISION: return BIGNUM_DTOA_PRECISION;
+ default:
+ UNREACHABLE();
+ }
+}
+
+
+void DoubleToStringConverter::DoubleToAscii(double v,
+ DtoaMode mode,
+ int requested_digits,
+ char* buffer,
+ int buffer_length,
+ bool* sign,
+ int* length,
+ int* point) {
+ Vector<char> vector(buffer, buffer_length);
+ ASSERT(!Double(v).IsSpecial());
+ ASSERT(mode == SHORTEST || mode == SHORTEST_SINGLE || requested_digits >= 0);
+
+ if (Double(v).Sign() < 0) {
+ *sign = true;
+ v = -v;
+ } else {
+ *sign = false;
+ }
+
+ if (mode == PRECISION && requested_digits == 0) {
+ vector[0] = '\0';
+ *length = 0;
+ return;
+ }
+
+ if (v == 0) {
+ vector[0] = '0';
+ vector[1] = '\0';
+ *length = 1;
+ *point = 1;
+ return;
+ }
+
+ bool fast_worked;
+ switch (mode) {
+ case SHORTEST:
+ fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST, 0, vector, length, point);
+ break;
+ case SHORTEST_SINGLE:
+ fast_worked = FastDtoa(v, FAST_DTOA_SHORTEST_SINGLE, 0,
+ vector, length, point);
+ break;
+ case FIXED:
+ fast_worked = FastFixedDtoa(v, requested_digits, vector, length, point);
+ break;
+ case PRECISION:
+ fast_worked = FastDtoa(v, FAST_DTOA_PRECISION, requested_digits,
+ vector, length, point);
+ break;
+ default:
+ fast_worked = false;
+ UNREACHABLE();
+ }
+ if (fast_worked) return;
+
+ // If the fast dtoa didn't succeed use the slower bignum version.
+ BignumDtoaMode bignum_mode = DtoaToBignumDtoaMode(mode);
+ BignumDtoa(v, bignum_mode, requested_digits, vector, length, point);
+ vector[*length] = '\0';
+}
+
+
+// Consumes the given substring from the iterator.
+// Returns false, if the substring does not match.
+template <class Iterator>
+static bool ConsumeSubString(Iterator* current,
+ Iterator end,
+ const char* substring) {
+ ASSERT(**current == *substring);
+ for (substring++; *substring != '\0'; substring++) {
+ ++*current;
+ if (*current == end || **current != *substring) return false;
+ }
+ ++*current;
+ return true;
+}
+
+
+// Maximum number of significant digits in decimal representation.
+// The longest possible double in decimal representation is
+// (2^53 - 1) * 2 ^ -1074 that is (2 ^ 53 - 1) * 5 ^ 1074 / 10 ^ 1074
+// (768 digits). If we parse a number whose first digits are equal to a
+// mean of 2 adjacent doubles (that could have up to 769 digits) the result
+// must be rounded to the bigger one unless the tail consists of zeros, so
+// we don't need to preserve all the digits.
+const int kMaxSignificantDigits = 772;
+
+
+static const char kWhitespaceTable7[] = { 32, 13, 10, 9, 11, 12 };
+static const int kWhitespaceTable7Length = ARRAY_SIZE(kWhitespaceTable7);
+
+
+static const uc16 kWhitespaceTable16[] = {
+ 160, 8232, 8233, 5760, 6158, 8192, 8193, 8194, 8195,
+ 8196, 8197, 8198, 8199, 8200, 8201, 8202, 8239, 8287, 12288, 65279
+};
+static const int kWhitespaceTable16Length = ARRAY_SIZE(kWhitespaceTable16);
+
+
+static bool isWhitespace(int x) {
+ if (x < 128) {
+ for (int i = 0; i < kWhitespaceTable7Length; i++) {
+ if (kWhitespaceTable7[i] == x) return true;
+ }
+ } else {
+ for (int i = 0; i < kWhitespaceTable16Length; i++) {
+ if (kWhitespaceTable16[i] == x) return true;
+ }
+ }
+ return false;
+}
+
+
+// Returns true if a nonspace found and false if the end has reached.
+template <class Iterator>
+static inline bool AdvanceToNonspace(Iterator* current, Iterator end) {
+ while (*current != end) {
+ if (!isWhitespace(**current)) return true;
+ ++*current;
+ }
+ return false;
+}
+
+
+static bool isDigit(int x, int radix) {
+ return (x >= '0' && x <= '9' && x < '0' + radix)
+ || (radix > 10 && x >= 'a' && x < 'a' + radix - 10)
+ || (radix > 10 && x >= 'A' && x < 'A' + radix - 10);
+}
+
+
+static double SignedZero(bool sign) {
+ return sign ? -0.0 : 0.0;
+}
+
+
+// Returns true if 'c' is a decimal digit that is valid for the given radix.
+//
+// The function is small and could be inlined, but VS2012 emitted a warning
+// because it constant-propagated the radix and concluded that the last
+// condition was always true. By moving it into a separate function the
+// compiler wouldn't warn anymore.
+static bool IsDecimalDigitForRadix(int c, int radix) {
+ return '0' <= c && c <= '9' && (c - '0') < radix;
+}
+
+// Returns true if 'c' is a character digit that is valid for the given radix.
+// The 'a_character' should be 'a' or 'A'.
+//
+// The function is small and could be inlined, but VS2012 emitted a warning
+// because it constant-propagated the radix and concluded that the first
+// condition was always false. By moving it into a separate function the
+// compiler wouldn't warn anymore.
+static bool IsCharacterDigitForRadix(int c, int radix, char a_character) {
+ return radix > 10 && c >= a_character && c < a_character + radix - 10;
+}
+
+
+// Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end.
+template <int radix_log_2, class Iterator>
+static double RadixStringToIeee(Iterator* current,
+ Iterator end,
+ bool sign,
+ bool allow_trailing_junk,
+ double junk_string_value,
+ bool read_as_double,
+ bool* result_is_junk) {
+ ASSERT(*current != end);
+
+ const int kDoubleSize = Double::kSignificandSize;
+ const int kSingleSize = Single::kSignificandSize;
+ const int kSignificandSize = read_as_double? kDoubleSize: kSingleSize;
+
+ *result_is_junk = true;
+
+ // Skip leading 0s.
+ while (**current == '0') {
+ ++(*current);
+ if (*current == end) {
+ *result_is_junk = false;
+ return SignedZero(sign);
+ }
+ }
+
+ int64_t number = 0;
+ int exponent = 0;
+ const int radix = (1 << radix_log_2);
+
+ do {
+ int digit;
+ if (IsDecimalDigitForRadix(**current, radix)) {
+ digit = static_cast<char>(**current) - '0';
+ } else if (IsCharacterDigitForRadix(**current, radix, 'a')) {
+ digit = static_cast<char>(**current) - 'a' + 10;
+ } else if (IsCharacterDigitForRadix(**current, radix, 'A')) {
+ digit = static_cast<char>(**current) - 'A' + 10;
+ } else {
+ if (allow_trailing_junk || !AdvanceToNonspace(current, end)) {
+ break;
+ } else {
+ return junk_string_value;
+ }
+ }
+
+ number = number * radix + digit;
+ int overflow = static_cast<int>(number >> kSignificandSize);
+ if (overflow != 0) {
+ // Overflow occurred. Need to determine which direction to round the
+ // result.
+ int overflow_bits_count = 1;
+ while (overflow > 1) {
+ overflow_bits_count++;
+ overflow >>= 1;
+ }
+
+ int dropped_bits_mask = ((1 << overflow_bits_count) - 1);
+ int dropped_bits = static_cast<int>(number) & dropped_bits_mask;
+ number >>= overflow_bits_count;
+ exponent = overflow_bits_count;
+
+ bool zero_tail = true;
+ for (;;) {
+ ++(*current);
+ if (*current == end || !isDigit(**current, radix)) break;
+ zero_tail = zero_tail && **current == '0';
+ exponent += radix_log_2;
+ }
+
+ if (!allow_trailing_junk && AdvanceToNonspace(current, end)) {
+ return junk_string_value;
+ }
+
+ int middle_value = (1 << (overflow_bits_count - 1));
+ if (dropped_bits > middle_value) {
+ number++; // Rounding up.
+ } else if (dropped_bits == middle_value) {
+ // Rounding to even to consistency with decimals: half-way case rounds
+ // up if significant part is odd and down otherwise.
+ if ((number & 1) != 0 || !zero_tail) {
+ number++; // Rounding up.
+ }
+ }
+
+ // Rounding up may cause overflow.
+ if ((number & ((int64_t)1 << kSignificandSize)) != 0) {
+ exponent++;
+ number >>= 1;
+ }
+ break;
+ }
+ ++(*current);
+ } while (*current != end);
+
+ ASSERT(number < ((int64_t)1 << kSignificandSize));
+ ASSERT(static_cast<int64_t>(static_cast<double>(number)) == number);
+
+ *result_is_junk = false;
+
+ if (exponent == 0) {
+ if (sign) {
+ if (number == 0) return -0.0;
+ number = -number;
+ }
+ return static_cast<double>(number);
+ }
+
+ ASSERT(number != 0);
+ return Double(DiyFp(number, exponent)).value();
+}
+
+
+template <class Iterator>
+double StringToDoubleConverter::StringToIeee(
+ Iterator input,
+ int length,
+ bool read_as_double,
+ int* processed_characters_count) const {
+ Iterator current = input;
+ Iterator end = input + length;
+
+ *processed_characters_count = 0;
+
+ const bool allow_trailing_junk = (flags_ & ALLOW_TRAILING_JUNK) != 0;
+ const bool allow_leading_spaces = (flags_ & ALLOW_LEADING_SPACES) != 0;
+ const bool allow_trailing_spaces = (flags_ & ALLOW_TRAILING_SPACES) != 0;
+ const bool allow_spaces_after_sign = (flags_ & ALLOW_SPACES_AFTER_SIGN) != 0;
+
+ // To make sure that iterator dereferencing is valid the following
+ // convention is used:
+ // 1. Each '++current' statement is followed by check for equality to 'end'.
+ // 2. If AdvanceToNonspace returned false then current == end.
+ // 3. If 'current' becomes equal to 'end' the function returns or goes to
+ // 'parsing_done'.
+ // 4. 'current' is not dereferenced after the 'parsing_done' label.
+ // 5. Code before 'parsing_done' may rely on 'current != end'.
+ if (current == end) return empty_string_value_;
+
+ if (allow_leading_spaces || allow_trailing_spaces) {
+ if (!AdvanceToNonspace(&current, end)) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return empty_string_value_;
+ }
+ if (!allow_leading_spaces && (input != current)) {
+ // No leading spaces allowed, but AdvanceToNonspace moved forward.
+ return junk_string_value_;
+ }
+ }
+
+ // The longest form of simplified number is: "-<significant digits>.1eXXX\0".
+ const int kBufferSize = kMaxSignificantDigits + 10;
+ char buffer[kBufferSize]; // NOLINT: size is known at compile time.
+ int buffer_pos = 0;
+
+ // Exponent will be adjusted if insignificant digits of the integer part
+ // or insignificant leading zeros of the fractional part are dropped.
+ int exponent = 0;
+ int significant_digits = 0;
+ int insignificant_digits = 0;
+ bool nonzero_digit_dropped = false;
+
+ bool sign = false;
+
+ if (*current == '+' || *current == '-') {
+ sign = (*current == '-');
+ ++current;
+ Iterator next_non_space = current;
+ // Skip following spaces (if allowed).
+ if (!AdvanceToNonspace(&next_non_space, end)) return junk_string_value_;
+ if (!allow_spaces_after_sign && (current != next_non_space)) {
+ return junk_string_value_;
+ }
+ current = next_non_space;
+ }
+
+ if (infinity_symbol_ != NULL) {
+ if (*current == infinity_symbol_[0]) {
+ if (!ConsumeSubString(&current, end, infinity_symbol_)) {
+ return junk_string_value_;
+ }
+
+ if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+ return junk_string_value_;
+ }
+ if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+ return junk_string_value_;
+ }
+
+ ASSERT(buffer_pos == 0);
+ *processed_characters_count = static_cast<int>(current - input);
+ return sign ? -Double::Infinity() : Double::Infinity();
+ }
+ }
+
+ if (nan_symbol_ != NULL) {
+ if (*current == nan_symbol_[0]) {
+ if (!ConsumeSubString(&current, end, nan_symbol_)) {
+ return junk_string_value_;
+ }
+
+ if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+ return junk_string_value_;
+ }
+ if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+ return junk_string_value_;
+ }
+
+ ASSERT(buffer_pos == 0);
+ *processed_characters_count = static_cast<int>(current - input);
+ return sign ? -Double::NaN() : Double::NaN();
+ }
+ }
+
+ bool leading_zero = false;
+ if (*current == '0') {
+ ++current;
+ if (current == end) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return SignedZero(sign);
+ }
+
+ leading_zero = true;
+
+ // It could be hexadecimal value.
+ if ((flags_ & ALLOW_HEX) && (*current == 'x' || *current == 'X')) {
+ ++current;
+ if (current == end || !isDigit(*current, 16)) {
+ return junk_string_value_; // "0x".
+ }
+
+ bool result_is_junk;
+ double result = RadixStringToIeee<4>(&current,
+ end,
+ sign,
+ allow_trailing_junk,
+ junk_string_value_,
+ read_as_double,
+ &result_is_junk);
+ if (!result_is_junk) {
+ if (allow_trailing_spaces) AdvanceToNonspace(&current, end);
+ *processed_characters_count = static_cast<int>(current - input);
+ }
+ return result;
+ }
+
+ // Ignore leading zeros in the integer part.
+ while (*current == '0') {
+ ++current;
+ if (current == end) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return SignedZero(sign);
+ }
+ }
+ }
+
+ bool octal = leading_zero && (flags_ & ALLOW_OCTALS) != 0;
+
+ // Copy significant digits of the integer part (if any) to the buffer.
+ while (*current >= '0' && *current <= '9') {
+ if (significant_digits < kMaxSignificantDigits) {
+ ASSERT(buffer_pos < kBufferSize);
+ buffer[buffer_pos++] = static_cast<char>(*current);
+ significant_digits++;
+ // Will later check if it's an octal in the buffer.
+ } else {
+ insignificant_digits++; // Move the digit into the exponential part.
+ nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
+ }
+ octal = octal && *current < '8';
+ ++current;
+ if (current == end) goto parsing_done;
+ }
+
+ if (significant_digits == 0) {
+ octal = false;
+ }
+
+ if (*current == '.') {
+ if (octal && !allow_trailing_junk) return junk_string_value_;
+ if (octal) goto parsing_done;
+
+ ++current;
+ if (current == end) {
+ if (significant_digits == 0 && !leading_zero) {
+ return junk_string_value_;
+ } else {
+ goto parsing_done;
+ }
+ }
+
+ if (significant_digits == 0) {
+ // octal = false;
+ // Integer part consists of 0 or is absent. Significant digits start after
+ // leading zeros (if any).
+ while (*current == '0') {
+ ++current;
+ if (current == end) {
+ *processed_characters_count = static_cast<int>(current - input);
+ return SignedZero(sign);
+ }
+ exponent--; // Move this 0 into the exponent.
+ }
+ }
+
+ // There is a fractional part.
+ // We don't emit a '.', but adjust the exponent instead.
+ while (*current >= '0' && *current <= '9') {
+ if (significant_digits < kMaxSignificantDigits) {
+ ASSERT(buffer_pos < kBufferSize);
+ buffer[buffer_pos++] = static_cast<char>(*current);
+ significant_digits++;
+ exponent--;
+ } else {
+ // Ignore insignificant digits in the fractional part.
+ nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
+ }
+ ++current;
+ if (current == end) goto parsing_done;
+ }
+ }
+
+ if (!leading_zero && exponent == 0 && significant_digits == 0) {
+ // If leading_zeros is true then the string contains zeros.
+ // If exponent < 0 then string was [+-]\.0*...
+ // If significant_digits != 0 the string is not equal to 0.
+ // Otherwise there are no digits in the string.
+ return junk_string_value_;
+ }
+
+ // Parse exponential part.
+ if (*current == 'e' || *current == 'E') {
+ if (octal && !allow_trailing_junk) return junk_string_value_;
+ if (octal) goto parsing_done;
+ ++current;
+ if (current == end) {
+ if (allow_trailing_junk) {
+ goto parsing_done;
+ } else {
+ return junk_string_value_;
+ }
+ }
+ char sign = '+';
+ if (*current == '+' || *current == '-') {
+ sign = static_cast<char>(*current);
+ ++current;
+ if (current == end) {
+ if (allow_trailing_junk) {
+ goto parsing_done;
+ } else {
+ return junk_string_value_;
+ }
+ }
+ }
+
+ if (current == end || *current < '0' || *current > '9') {
+ if (allow_trailing_junk) {
+ goto parsing_done;
+ } else {
+ return junk_string_value_;
+ }
+ }
+
+ const int max_exponent = INT_MAX / 2;
+ ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2);
+ int num = 0;
+ do {
+ // Check overflow.
+ int digit = *current - '0';
+ if (num >= max_exponent / 10
+ && !(num == max_exponent / 10 && digit <= max_exponent % 10)) {
+ num = max_exponent;
+ } else {
+ num = num * 10 + digit;
+ }
+ ++current;
+ } while (current != end && *current >= '0' && *current <= '9');
+
+ exponent += (sign == '-' ? -num : num);
+ }
+
+ if (!(allow_trailing_spaces || allow_trailing_junk) && (current != end)) {
+ return junk_string_value_;
+ }
+ if (!allow_trailing_junk && AdvanceToNonspace(&current, end)) {
+ return junk_string_value_;
+ }
+ if (allow_trailing_spaces) {
+ AdvanceToNonspace(&current, end);
+ }
+
+ parsing_done:
+ exponent += insignificant_digits;
+
+ if (octal) {
+ double result;
+ bool result_is_junk;
+ char* start = buffer;
+ result = RadixStringToIeee<3>(&start,
+ buffer + buffer_pos,
+ sign,
+ allow_trailing_junk,
+ junk_string_value_,
+ read_as_double,
+ &result_is_junk);
+ ASSERT(!result_is_junk);
+ *processed_characters_count = static_cast<int>(current - input);
+ return result;
+ }
+
+ if (nonzero_digit_dropped) {
+ buffer[buffer_pos++] = '1';
+ exponent--;
+ }
+
+ ASSERT(buffer_pos < kBufferSize);
+ buffer[buffer_pos] = '\0';
+
+ double converted;
+ if (read_as_double) {
+ converted = Strtod(Vector<const char>(buffer, buffer_pos), exponent);
+ } else {
+ converted = Strtof(Vector<const char>(buffer, buffer_pos), exponent);
+ }
+ *processed_characters_count = static_cast<int>(current - input);
+ return sign? -converted: converted;
+}
+
+
+double StringToDoubleConverter::StringToDouble(
+ const char* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return StringToIeee(buffer, length, true, processed_characters_count);
+}
+
+
+double StringToDoubleConverter::StringToDouble(
+ const uc16* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return StringToIeee(buffer, length, true, processed_characters_count);
+}
+
+
+float StringToDoubleConverter::StringToFloat(
+ const char* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return static_cast<float>(StringToIeee(buffer, length, false,
+ processed_characters_count));
+}
+
+
+float StringToDoubleConverter::StringToFloat(
+ const uc16* buffer,
+ int length,
+ int* processed_characters_count) const {
+ return static_cast<float>(StringToIeee(buffer, length, false,
+ processed_characters_count));
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/double-conversion.pri b/src/3rdparty/double-conversion/double-conversion.pri
new file mode 100644
index 0000000000..3207169689
--- /dev/null
+++ b/src/3rdparty/double-conversion/double-conversion.pri
@@ -0,0 +1,24 @@
+INCLUDEPATH += $$PWD/include $$PWD/include/double-conversion
+SOURCES += \
+ $$PWD/bignum.cc \
+ $$PWD/bignum-dtoa.cc \
+ $$PWD/cached-powers.cc \
+ $$PWD/diy-fp.cc \
+ $$PWD/double-conversion.cc \
+ $$PWD/fast-dtoa.cc \
+ $$PWD/fixed-dtoa.cc \
+ $$PWD/strtod.cc
+
+HEADERS += \
+ $$PWD/bignum-dtoa.h \
+ $$PWD/bignum.h \
+ $$PWD/cached-powers.h \
+ $$PWD/diy-fp.h \
+ $$PWD/include/double-conversion/double-conversion.h \
+ $$PWD/fast-dtoa.h \
+ $$PWD/fixed-dtoa.h \
+ $$PWD/ieee.h \
+ $$PWD/strtod.h \
+ $$PWD/include/double-conversion/utils.h
+
+OTHER_FILES += README
diff --git a/src/3rdparty/double-conversion/fast-dtoa.cc b/src/3rdparty/double-conversion/fast-dtoa.cc
new file mode 100644
index 0000000000..61350383a9
--- /dev/null
+++ b/src/3rdparty/double-conversion/fast-dtoa.cc
@@ -0,0 +1,665 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#include "fast-dtoa.h"
+
+#include "cached-powers.h"
+#include "diy-fp.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+// The minimal and maximal target exponent define the range of w's binary
+// exponent, where 'w' is the result of multiplying the input by a cached power
+// of ten.
+//
+// A different range might be chosen on a different platform, to optimize digit
+// generation, but a smaller range requires more powers of ten to be cached.
+static const int kMinimalTargetExponent = -60;
+static const int kMaximalTargetExponent = -32;
+
+
+// Adjusts the last digit of the generated number, and screens out generated
+// solutions that may be inaccurate. A solution may be inaccurate if it is
+// outside the safe interval, or if we cannot prove that it is closer to the
+// input than a neighboring representation of the same length.
+//
+// Input: * buffer containing the digits of too_high / 10^kappa
+// * the buffer's length
+// * distance_too_high_w == (too_high - w).f() * unit
+// * unsafe_interval == (too_high - too_low).f() * unit
+// * rest = (too_high - buffer * 10^kappa).f() * unit
+// * ten_kappa = 10^kappa * unit
+// * unit = the common multiplier
+// Output: returns true if the buffer is guaranteed to contain the closest
+// representable number to the input.
+// Modifies the generated digits in the buffer to approach (round towards) w.
+static bool RoundWeed(Vector<char> buffer,
+ int length,
+ uint64_t distance_too_high_w,
+ uint64_t unsafe_interval,
+ uint64_t rest,
+ uint64_t ten_kappa,
+ uint64_t unit) {
+ uint64_t small_distance = distance_too_high_w - unit;
+ uint64_t big_distance = distance_too_high_w + unit;
+ // Let w_low = too_high - big_distance, and
+ // w_high = too_high - small_distance.
+ // Note: w_low < w < w_high
+ //
+ // The real w (* unit) must lie somewhere inside the interval
+ // ]w_low; w_high[ (often written as "(w_low; w_high)")
+
+ // Basically the buffer currently contains a number in the unsafe interval
+ // ]too_low; too_high[ with too_low < w < too_high
+ //
+ // too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ // ^v 1 unit ^ ^ ^ ^
+ // boundary_high --------------------- . . . .
+ // ^v 1 unit . . . .
+ // - - - - - - - - - - - - - - - - - - - + - - + - - - - - - . .
+ // . . ^ . .
+ // . big_distance . . .
+ // . . . . rest
+ // small_distance . . . .
+ // v . . . .
+ // w_high - - - - - - - - - - - - - - - - - - . . . .
+ // ^v 1 unit . . . .
+ // w ---------------------------------------- . . . .
+ // ^v 1 unit v . . .
+ // w_low - - - - - - - - - - - - - - - - - - - - - . . .
+ // . . v
+ // buffer --------------------------------------------------+-------+--------
+ // . .
+ // safe_interval .
+ // v .
+ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .
+ // ^v 1 unit .
+ // boundary_low ------------------------- unsafe_interval
+ // ^v 1 unit v
+ // too_low - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+ //
+ //
+ // Note that the value of buffer could lie anywhere inside the range too_low
+ // to too_high.
+ //
+ // boundary_low, boundary_high and w are approximations of the real boundaries
+ // and v (the input number). They are guaranteed to be precise up to one unit.
+ // In fact the error is guaranteed to be strictly less than one unit.
+ //
+ // Anything that lies outside the unsafe interval is guaranteed not to round
+ // to v when read again.
+ // Anything that lies inside the safe interval is guaranteed to round to v
+ // when read again.
+ // If the number inside the buffer lies inside the unsafe interval but not
+ // inside the safe interval then we simply do not know and bail out (returning
+ // false).
+ //
+ // Similarly we have to take into account the imprecision of 'w' when finding
+ // the closest representation of 'w'. If we have two potential
+ // representations, and one is closer to both w_low and w_high, then we know
+ // it is closer to the actual value v.
+ //
+ // By generating the digits of too_high we got the largest (closest to
+ // too_high) buffer that is still in the unsafe interval. In the case where
+ // w_high < buffer < too_high we try to decrement the buffer.
+ // This way the buffer approaches (rounds towards) w.
+ // There are 3 conditions that stop the decrementation process:
+ // 1) the buffer is already below w_high
+ // 2) decrementing the buffer would make it leave the unsafe interval
+ // 3) decrementing the buffer would yield a number below w_high and farther
+ // away than the current number. In other words:
+ // (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high
+ // Instead of using the buffer directly we use its distance to too_high.
+ // Conceptually rest ~= too_high - buffer
+ // We need to do the following tests in this order to avoid over- and
+ // underflows.
+ ASSERT(rest <= unsafe_interval);
+ while (rest < small_distance && // Negated condition 1
+ unsafe_interval - rest >= ten_kappa && // Negated condition 2
+ (rest + ten_kappa < small_distance || // buffer{-1} > w_high
+ small_distance - rest >= rest + ten_kappa - small_distance)) {
+ buffer[length - 1]--;
+ rest += ten_kappa;
+ }
+
+ // We have approached w+ as much as possible. We now test if approaching w-
+ // would require changing the buffer. If yes, then we have two possible
+ // representations close to w, but we cannot decide which one is closer.
+ if (rest < big_distance &&
+ unsafe_interval - rest >= ten_kappa &&
+ (rest + ten_kappa < big_distance ||
+ big_distance - rest > rest + ten_kappa - big_distance)) {
+ return false;
+ }
+
+ // Weeding test.
+ // The safe interval is [too_low + 2 ulp; too_high - 2 ulp]
+ // Since too_low = too_high - unsafe_interval this is equivalent to
+ // [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp]
+ // Conceptually we have: rest ~= too_high - buffer
+ return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit);
+}
+
+
+// Rounds the buffer upwards if the result is closer to v by possibly adding
+// 1 to the buffer. If the precision of the calculation is not sufficient to
+// round correctly, return false.
+// The rounding might shift the whole buffer in which case the kappa is
+// adjusted. For example "99", kappa = 3 might become "10", kappa = 4.
+//
+// If 2*rest > ten_kappa then the buffer needs to be round up.
+// rest can have an error of +/- 1 unit. This function accounts for the
+// imprecision and returns false, if the rounding direction cannot be
+// unambiguously determined.
+//
+// Precondition: rest < ten_kappa.
+static bool RoundWeedCounted(Vector<char> buffer,
+ int length,
+ uint64_t rest,
+ uint64_t ten_kappa,
+ uint64_t unit,
+ int* kappa) {
+ ASSERT(rest < ten_kappa);
+ // The following tests are done in a specific order to avoid overflows. They
+ // will work correctly with any uint64 values of rest < ten_kappa and unit.
+ //
+ // If the unit is too big, then we don't know which way to round. For example
+ // a unit of 50 means that the real number lies within rest +/- 50. If
+ // 10^kappa == 40 then there is no way to tell which way to round.
+ if (unit >= ten_kappa) return false;
+ // Even if unit is just half the size of 10^kappa we are already completely
+ // lost. (And after the previous test we know that the expression will not
+ // over/underflow.)
+ if (ten_kappa - unit <= unit) return false;
+ // If 2 * (rest + unit) <= 10^kappa we can safely round down.
+ if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) {
+ return true;
+ }
+ // If 2 * (rest - unit) >= 10^kappa, then we can safely round up.
+ if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) {
+ // Increment the last digit recursively until we find a non '9' digit.
+ buffer[length - 1]++;
+ for (int i = length - 1; i > 0; --i) {
+ if (buffer[i] != '0' + 10) break;
+ buffer[i] = '0';
+ buffer[i - 1]++;
+ }
+ // If the first digit is now '0'+ 10 we had a buffer with all '9's. With the
+ // exception of the first digit all digits are now '0'. Simply switch the
+ // first digit to '1' and adjust the kappa. Example: "99" becomes "10" and
+ // the power (the kappa) is increased.
+ if (buffer[0] == '0' + 10) {
+ buffer[0] = '1';
+ (*kappa) += 1;
+ }
+ return true;
+ }
+ return false;
+}
+
+// Returns the biggest power of ten that is less than or equal to the given
+// number. We furthermore receive the maximum number of bits 'number' has.
+//
+// Returns power == 10^(exponent_plus_one-1) such that
+// power <= number < power * 10.
+// If number_bits == 0 then 0^(0-1) is returned.
+// The number of bits must be <= 32.
+// Precondition: number < (1 << (number_bits + 1)).
+
+// Inspired by the method for finding an integer log base 10 from here:
+// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10
+static unsigned int const kSmallPowersOfTen[] =
+ {0, 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000,
+ 1000000000};
+
+static void BiggestPowerTen(uint32_t number,
+ int number_bits,
+ uint32_t* power,
+ int* exponent_plus_one) {
+ ASSERT(number < (1u << (number_bits + 1)));
+ // 1233/4096 is approximately 1/lg(10).
+ int exponent_plus_one_guess = ((number_bits + 1) * 1233 >> 12);
+ // We increment to skip over the first entry in the kPowersOf10 table.
+ // Note: kPowersOf10[i] == 10^(i-1).
+ exponent_plus_one_guess++;
+ // We don't have any guarantees that 2^number_bits <= number.
+ if (number < kSmallPowersOfTen[exponent_plus_one_guess]) {
+ exponent_plus_one_guess--;
+ }
+ *power = kSmallPowersOfTen[exponent_plus_one_guess];
+ *exponent_plus_one = exponent_plus_one_guess;
+}
+
+// Generates the digits of input number w.
+// w is a floating-point number (DiyFp), consisting of a significand and an
+// exponent. Its exponent is bounded by kMinimalTargetExponent and
+// kMaximalTargetExponent.
+// Hence -60 <= w.e() <= -32.
+//
+// Returns false if it fails, in which case the generated digits in the buffer
+// should not be used.
+// Preconditions:
+// * low, w and high are correct up to 1 ulp (unit in the last place). That
+// is, their error must be less than a unit of their last digits.
+// * low.e() == w.e() == high.e()
+// * low < w < high, and taking into account their error: low~ <= high~
+// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
+// Postconditions: returns false if procedure fails.
+// otherwise:
+// * buffer is not null-terminated, but len contains the number of digits.
+// * buffer contains the shortest possible decimal digit-sequence
+// such that LOW < buffer * 10^kappa < HIGH, where LOW and HIGH are the
+// correct values of low and high (without their error).
+// * if more than one decimal representation gives the minimal number of
+// decimal digits then the one closest to W (where W is the correct value
+// of w) is chosen.
+// Remark: this procedure takes into account the imprecision of its input
+// numbers. If the precision is not enough to guarantee all the postconditions
+// then false is returned. This usually happens rarely (~0.5%).
+//
+// Say, for the sake of example, that
+// w.e() == -48, and w.f() == 0x1234567890abcdef
+// w's value can be computed by w.f() * 2^w.e()
+// We can obtain w's integral digits by simply shifting w.f() by -w.e().
+// -> w's integral part is 0x1234
+// w's fractional part is therefore 0x567890abcdef.
+// Printing w's integral part is easy (simply print 0x1234 in decimal).
+// In order to print its fraction we repeatedly multiply the fraction by 10 and
+// get each digit. Example the first digit after the point would be computed by
+// (0x567890abcdef * 10) >> 48. -> 3
+// The whole thing becomes slightly more complicated because we want to stop
+// once we have enough digits. That is, once the digits inside the buffer
+// represent 'w' we can stop. Everything inside the interval low - high
+// represents w. However we have to pay attention to low, high and w's
+// imprecision.
+static bool DigitGen(DiyFp low,
+ DiyFp w,
+ DiyFp high,
+ Vector<char> buffer,
+ int* length,
+ int* kappa) {
+ ASSERT(low.e() == w.e() && w.e() == high.e());
+ ASSERT(low.f() + 1 <= high.f() - 1);
+ ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+ // low, w and high are imprecise, but by less than one ulp (unit in the last
+ // place).
+ // If we remove (resp. add) 1 ulp from low (resp. high) we are certain that
+ // the new numbers are outside of the interval we want the final
+ // representation to lie in.
+ // Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield
+ // numbers that are certain to lie in the interval. We will use this fact
+ // later on.
+ // We will now start by generating the digits within the uncertain
+ // interval. Later we will weed out representations that lie outside the safe
+ // interval and thus _might_ lie outside the correct interval.
+ uint64_t unit = 1;
+ DiyFp too_low = DiyFp(low.f() - unit, low.e());
+ DiyFp too_high = DiyFp(high.f() + unit, high.e());
+ // too_low and too_high are guaranteed to lie outside the interval we want the
+ // generated number in.
+ DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low);
+ // We now cut the input number into two parts: the integral digits and the
+ // fractionals. We will not write any decimal separator though, but adapt
+ // kappa instead.
+ // Reminder: we are currently computing the digits (stored inside the buffer)
+ // such that: too_low < buffer * 10^kappa < too_high
+ // We use too_high for the digit_generation and stop as soon as possible.
+ // If we stop early we effectively round down.
+ DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
+ // Division by one is a shift.
+ uint32_t integrals = static_cast<uint32_t>(too_high.f() >> -one.e());
+ // Modulo by one is an and.
+ uint64_t fractionals = too_high.f() & (one.f() - 1);
+ uint32_t divisor;
+ int divisor_exponent_plus_one;
+ BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
+ &divisor, &divisor_exponent_plus_one);
+ *kappa = divisor_exponent_plus_one;
+ *length = 0;
+ // Loop invariant: buffer = too_high / 10^kappa (integer division)
+ // The invariant holds for the first iteration: kappa has been initialized
+ // with the divisor exponent + 1. And the divisor is the biggest power of ten
+ // that is smaller than integrals.
+ while (*kappa > 0) {
+ int digit = integrals / divisor;
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ integrals %= divisor;
+ (*kappa)--;
+ // Note that kappa now equals the exponent of the divisor and that the
+ // invariant thus holds again.
+ uint64_t rest =
+ (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
+ // Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e())
+ // Reminder: unsafe_interval.e() == one.e()
+ if (rest < unsafe_interval.f()) {
+ // Rounding down (by not emitting the remaining digits) yields a number
+ // that lies within the unsafe interval.
+ return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(),
+ unsafe_interval.f(), rest,
+ static_cast<uint64_t>(divisor) << -one.e(), unit);
+ }
+ divisor /= 10;
+ }
+
+ // The integrals have been generated. We are at the point of the decimal
+ // separator. In the following loop we simply multiply the remaining digits by
+ // 10 and divide by one. We just need to pay attention to multiply associated
+ // data (like the interval or 'unit'), too.
+ // Note that the multiplication by 10 does not overflow, because w.e >= -60
+ // and thus one.e >= -60.
+ ASSERT(one.e() >= -60);
+ ASSERT(fractionals < one.f());
+ ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+ for (;;) {
+ fractionals *= 10;
+ unit *= 10;
+ unsafe_interval.set_f(unsafe_interval.f() * 10);
+ // Integer division by one.
+ int digit = static_cast<int>(fractionals >> -one.e());
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ fractionals &= one.f() - 1; // Modulo by one.
+ (*kappa)--;
+ if (fractionals < unsafe_interval.f()) {
+ return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit,
+ unsafe_interval.f(), fractionals, one.f(), unit);
+ }
+ }
+}
+
+
+
+// Generates (at most) requested_digits digits of input number w.
+// w is a floating-point number (DiyFp), consisting of a significand and an
+// exponent. Its exponent is bounded by kMinimalTargetExponent and
+// kMaximalTargetExponent.
+// Hence -60 <= w.e() <= -32.
+//
+// Returns false if it fails, in which case the generated digits in the buffer
+// should not be used.
+// Preconditions:
+// * w is correct up to 1 ulp (unit in the last place). That
+// is, its error must be strictly less than a unit of its last digit.
+// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
+//
+// Postconditions: returns false if procedure fails.
+// otherwise:
+// * buffer is not null-terminated, but length contains the number of
+// digits.
+// * the representation in buffer is the most precise representation of
+// requested_digits digits.
+// * buffer contains at most requested_digits digits of w. If there are less
+// than requested_digits digits then some trailing '0's have been removed.
+// * kappa is such that
+// w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2.
+//
+// Remark: This procedure takes into account the imprecision of its input
+// numbers. If the precision is not enough to guarantee all the postconditions
+// then false is returned. This usually happens rarely, but the failure-rate
+// increases with higher requested_digits.
+static bool DigitGenCounted(DiyFp w,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* kappa) {
+ ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
+ ASSERT(kMinimalTargetExponent >= -60);
+ ASSERT(kMaximalTargetExponent <= -32);
+ // w is assumed to have an error less than 1 unit. Whenever w is scaled we
+ // also scale its error.
+ uint64_t w_error = 1;
+ // We cut the input number into two parts: the integral digits and the
+ // fractional digits. We don't emit any decimal separator, but adapt kappa
+ // instead. Example: instead of writing "1.2" we put "12" into the buffer and
+ // increase kappa by 1.
+ DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
+ // Division by one is a shift.
+ uint32_t integrals = static_cast<uint32_t>(w.f() >> -one.e());
+ // Modulo by one is an and.
+ uint64_t fractionals = w.f() & (one.f() - 1);
+ uint32_t divisor;
+ int divisor_exponent_plus_one;
+ BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
+ &divisor, &divisor_exponent_plus_one);
+ *kappa = divisor_exponent_plus_one;
+ *length = 0;
+
+ // Loop invariant: buffer = w / 10^kappa (integer division)
+ // The invariant holds for the first iteration: kappa has been initialized
+ // with the divisor exponent + 1. And the divisor is the biggest power of ten
+ // that is smaller than 'integrals'.
+ while (*kappa > 0) {
+ int digit = integrals / divisor;
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ requested_digits--;
+ integrals %= divisor;
+ (*kappa)--;
+ // Note that kappa now equals the exponent of the divisor and that the
+ // invariant thus holds again.
+ if (requested_digits == 0) break;
+ divisor /= 10;
+ }
+
+ if (requested_digits == 0) {
+ uint64_t rest =
+ (static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
+ return RoundWeedCounted(buffer, *length, rest,
+ static_cast<uint64_t>(divisor) << -one.e(), w_error,
+ kappa);
+ }
+
+ // The integrals have been generated. We are at the point of the decimal
+ // separator. In the following loop we simply multiply the remaining digits by
+ // 10 and divide by one. We just need to pay attention to multiply associated
+ // data (the 'unit'), too.
+ // Note that the multiplication by 10 does not overflow, because w.e >= -60
+ // and thus one.e >= -60.
+ ASSERT(one.e() >= -60);
+ ASSERT(fractionals < one.f());
+ ASSERT(UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
+ while (requested_digits > 0 && fractionals > w_error) {
+ fractionals *= 10;
+ w_error *= 10;
+ // Integer division by one.
+ int digit = static_cast<int>(fractionals >> -one.e());
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ requested_digits--;
+ fractionals &= one.f() - 1; // Modulo by one.
+ (*kappa)--;
+ }
+ if (requested_digits != 0) return false;
+ return RoundWeedCounted(buffer, *length, fractionals, one.f(), w_error,
+ kappa);
+}
+
+
+// Provides a decimal representation of v.
+// Returns true if it succeeds, otherwise the result cannot be trusted.
+// There will be *length digits inside the buffer (not null-terminated).
+// If the function returns true then
+// v == (double) (buffer * 10^decimal_exponent).
+// The digits in the buffer are the shortest representation possible: no
+// 0.09999999999999999 instead of 0.1. The shorter representation will even be
+// chosen even if the longer one would be closer to v.
+// The last digit will be closest to the actual v. That is, even if several
+// digits might correctly yield 'v' when read again, the closest will be
+// computed.
+static bool Grisu3(double v,
+ FastDtoaMode mode,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_exponent) {
+ DiyFp w = Double(v).AsNormalizedDiyFp();
+ // boundary_minus and boundary_plus are the boundaries between v and its
+ // closest floating-point neighbors. Any number strictly between
+ // boundary_minus and boundary_plus will round to v when convert to a double.
+ // Grisu3 will never output representations that lie exactly on a boundary.
+ DiyFp boundary_minus, boundary_plus;
+ if (mode == FAST_DTOA_SHORTEST) {
+ Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
+ } else {
+ ASSERT(mode == FAST_DTOA_SHORTEST_SINGLE);
+ float single_v = static_cast<float>(v);
+ Single(single_v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
+ }
+ ASSERT(boundary_plus.e() == w.e());
+ DiyFp ten_mk; // Cached power of ten: 10^-k
+ int mk; // -k
+ int ten_mk_minimal_binary_exponent =
+ kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ int ten_mk_maximal_binary_exponent =
+ kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+ ten_mk_minimal_binary_exponent,
+ ten_mk_maximal_binary_exponent,
+ &ten_mk, &mk);
+ ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize) &&
+ (kMaximalTargetExponent >= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize));
+ // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
+ // 64 bit significand and ten_mk is thus only precise up to 64 bits.
+
+ // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
+ // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
+ // off by a small amount.
+ // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
+ // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
+ // (f-1) * 2^e < w*10^k < (f+1) * 2^e
+ DiyFp scaled_w = DiyFp::Times(w, ten_mk);
+ ASSERT(scaled_w.e() ==
+ boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize);
+ // In theory it would be possible to avoid some recomputations by computing
+ // the difference between w and boundary_minus/plus (a power of 2) and to
+ // compute scaled_boundary_minus/plus by subtracting/adding from
+ // scaled_w. However the code becomes much less readable and the speed
+ // enhancements are not terriffic.
+ DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk);
+ DiyFp scaled_boundary_plus = DiyFp::Times(boundary_plus, ten_mk);
+
+ // DigitGen will generate the digits of scaled_w. Therefore we have
+ // v == (double) (scaled_w * 10^-mk).
+ // Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an
+ // integer than it will be updated. For instance if scaled_w == 1.23 then
+ // the buffer will be filled with "123" und the decimal_exponent will be
+ // decreased by 2.
+ int kappa;
+ bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,
+ buffer, length, &kappa);
+ *decimal_exponent = -mk + kappa;
+ return result;
+}
+
+
+// The "counted" version of grisu3 (see above) only generates requested_digits
+// number of digits. This version does not generate the shortest representation,
+// and with enough requested digits 0.1 will at some point print as 0.9999999...
+// Grisu3 is too imprecise for real halfway cases (1.5 will not work) and
+// therefore the rounding strategy for halfway cases is irrelevant.
+static bool Grisu3Counted(double v,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_exponent) {
+ DiyFp w = Double(v).AsNormalizedDiyFp();
+ DiyFp ten_mk; // Cached power of ten: 10^-k
+ int mk; // -k
+ int ten_mk_minimal_binary_exponent =
+ kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ int ten_mk_maximal_binary_exponent =
+ kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
+ PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
+ ten_mk_minimal_binary_exponent,
+ ten_mk_maximal_binary_exponent,
+ &ten_mk, &mk);
+ ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize) &&
+ (kMaximalTargetExponent >= w.e() + ten_mk.e() +
+ DiyFp::kSignificandSize));
+ // Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
+ // 64 bit significand and ten_mk is thus only precise up to 64 bits.
+
+ // The DiyFp::Times procedure rounds its result, and ten_mk is approximated
+ // too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
+ // off by a small amount.
+ // In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
+ // In other words: let f = scaled_w.f() and e = scaled_w.e(), then
+ // (f-1) * 2^e < w*10^k < (f+1) * 2^e
+ DiyFp scaled_w = DiyFp::Times(w, ten_mk);
+
+ // We now have (double) (scaled_w * 10^-mk).
+ // DigitGen will generate the first requested_digits digits of scaled_w and
+ // return together with a kappa such that scaled_w ~= buffer * 10^kappa. (It
+ // will not always be exactly the same since DigitGenCounted only produces a
+ // limited number of digits.)
+ int kappa;
+ bool result = DigitGenCounted(scaled_w, requested_digits,
+ buffer, length, &kappa);
+ *decimal_exponent = -mk + kappa;
+ return result;
+}
+
+
+bool FastDtoa(double v,
+ FastDtoaMode mode,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_point) {
+ ASSERT(v > 0);
+ ASSERT(!Double(v).IsSpecial());
+
+ bool result = false;
+ int decimal_exponent = 0;
+ switch (mode) {
+ case FAST_DTOA_SHORTEST:
+ case FAST_DTOA_SHORTEST_SINGLE:
+ result = Grisu3(v, mode, buffer, length, &decimal_exponent);
+ break;
+ case FAST_DTOA_PRECISION:
+ result = Grisu3Counted(v, requested_digits,
+ buffer, length, &decimal_exponent);
+ break;
+ default:
+ UNREACHABLE();
+ }
+ if (result) {
+ *decimal_point = *length + decimal_exponent;
+ buffer[*length] = '\0';
+ }
+ return result;
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/fast-dtoa.h b/src/3rdparty/double-conversion/fast-dtoa.h
new file mode 100644
index 0000000000..5f1e8eee5e
--- /dev/null
+++ b/src/3rdparty/double-conversion/fast-dtoa.h
@@ -0,0 +1,88 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_FAST_DTOA_H_
+#define DOUBLE_CONVERSION_FAST_DTOA_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+enum FastDtoaMode {
+ // Computes the shortest representation of the given input. The returned
+ // result will be the most accurate number of this length. Longer
+ // representations might be more accurate.
+ FAST_DTOA_SHORTEST,
+ // Same as FAST_DTOA_SHORTEST but for single-precision floats.
+ FAST_DTOA_SHORTEST_SINGLE,
+ // Computes a representation where the precision (number of digits) is
+ // given as input. The precision is independent of the decimal point.
+ FAST_DTOA_PRECISION
+};
+
+// FastDtoa will produce at most kFastDtoaMaximalLength digits. This does not
+// include the terminating '\0' character.
+static const int kFastDtoaMaximalLength = 17;
+// Same for single-precision numbers.
+static const int kFastDtoaMaximalSingleLength = 9;
+
+// Provides a decimal representation of v.
+// The result should be interpreted as buffer * 10^(point - length).
+//
+// Precondition:
+// * v must be a strictly positive finite double.
+//
+// Returns true if it succeeds, otherwise the result can not be trusted.
+// There will be *length digits inside the buffer followed by a null terminator.
+// If the function returns true and mode equals
+// - FAST_DTOA_SHORTEST, then
+// the parameter requested_digits is ignored.
+// The result satisfies
+// v == (double) (buffer * 10^(point - length)).
+// The digits in the buffer are the shortest representation possible. E.g.
+// if 0.099999999999 and 0.1 represent the same double then "1" is returned
+// with point = 0.
+// The last digit will be closest to the actual v. That is, even if several
+// digits might correctly yield 'v' when read again, the buffer will contain
+// the one closest to v.
+// - FAST_DTOA_PRECISION, then
+// the buffer contains requested_digits digits.
+// the difference v - (buffer * 10^(point-length)) is closest to zero for
+// all possible representations of requested_digits digits.
+// If there are two values that are equally close, then FastDtoa returns
+// false.
+// For both modes the buffer must be large enough to hold the result.
+bool FastDtoa(double d,
+ FastDtoaMode mode,
+ int requested_digits,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_point);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_FAST_DTOA_H_
diff --git a/src/3rdparty/double-conversion/fixed-dtoa.cc b/src/3rdparty/double-conversion/fixed-dtoa.cc
new file mode 100644
index 0000000000..aef65fdc21
--- /dev/null
+++ b/src/3rdparty/double-conversion/fixed-dtoa.cc
@@ -0,0 +1,404 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#include <math.h>
+
+#include "fixed-dtoa.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+// Represents a 128bit type. This class should be replaced by a native type on
+// platforms that support 128bit integers.
+class UInt128 {
+ public:
+ UInt128() : high_bits_(0), low_bits_(0) { }
+ UInt128(uint64_t high, uint64_t low) : high_bits_(high), low_bits_(low) { }
+
+ void Multiply(uint32_t multiplicand) {
+ uint64_t accumulator;
+
+ accumulator = (low_bits_ & kMask32) * multiplicand;
+ uint32_t part = static_cast<uint32_t>(accumulator & kMask32);
+ accumulator >>= 32;
+ accumulator = accumulator + (low_bits_ >> 32) * multiplicand;
+ low_bits_ = (accumulator << 32) + part;
+ accumulator >>= 32;
+ accumulator = accumulator + (high_bits_ & kMask32) * multiplicand;
+ part = static_cast<uint32_t>(accumulator & kMask32);
+ accumulator >>= 32;
+ accumulator = accumulator + (high_bits_ >> 32) * multiplicand;
+ high_bits_ = (accumulator << 32) + part;
+ ASSERT((accumulator >> 32) == 0);
+ }
+
+ void Shift(int shift_amount) {
+ ASSERT(-64 <= shift_amount && shift_amount <= 64);
+ if (shift_amount == 0) {
+ return;
+ } else if (shift_amount == -64) {
+ high_bits_ = low_bits_;
+ low_bits_ = 0;
+ } else if (shift_amount == 64) {
+ low_bits_ = high_bits_;
+ high_bits_ = 0;
+ } else if (shift_amount <= 0) {
+ high_bits_ <<= -shift_amount;
+ high_bits_ += low_bits_ >> (64 + shift_amount);
+ low_bits_ <<= -shift_amount;
+ } else {
+ low_bits_ >>= shift_amount;
+ low_bits_ += high_bits_ << (64 - shift_amount);
+ high_bits_ >>= shift_amount;
+ }
+ }
+
+ // Modifies *this to *this MOD (2^power).
+ // Returns *this DIV (2^power).
+ int DivModPowerOf2(int power) {
+ if (power >= 64) {
+ int result = static_cast<int>(high_bits_ >> (power - 64));
+ high_bits_ -= static_cast<uint64_t>(result) << (power - 64);
+ return result;
+ } else {
+ uint64_t part_low = low_bits_ >> power;
+ uint64_t part_high = high_bits_ << (64 - power);
+ int result = static_cast<int>(part_low + part_high);
+ high_bits_ = 0;
+ low_bits_ -= part_low << power;
+ return result;
+ }
+ }
+
+ bool IsZero() const {
+ return high_bits_ == 0 && low_bits_ == 0;
+ }
+
+ int BitAt(int position) {
+ if (position >= 64) {
+ return static_cast<int>(high_bits_ >> (position - 64)) & 1;
+ } else {
+ return static_cast<int>(low_bits_ >> position) & 1;
+ }
+ }
+
+ private:
+ static const uint64_t kMask32 = 0xFFFFFFFF;
+ // Value == (high_bits_ << 64) + low_bits_
+ uint64_t high_bits_;
+ uint64_t low_bits_;
+};
+
+
+static const int kDoubleSignificandSize = 53; // Includes the hidden bit.
+
+
+static void FillDigits32FixedLength(uint32_t number, int requested_length,
+ Vector<char> buffer, int* length) {
+ for (int i = requested_length - 1; i >= 0; --i) {
+ buffer[(*length) + i] = '0' + number % 10;
+ number /= 10;
+ }
+ *length += requested_length;
+}
+
+
+static void FillDigits32(uint32_t number, Vector<char> buffer, int* length) {
+ int number_length = 0;
+ // We fill the digits in reverse order and exchange them afterwards.
+ while (number != 0) {
+ int digit = number % 10;
+ number /= 10;
+ buffer[(*length) + number_length] = static_cast<char>('0' + digit);
+ number_length++;
+ }
+ // Exchange the digits.
+ int i = *length;
+ int j = *length + number_length - 1;
+ while (i < j) {
+ char tmp = buffer[i];
+ buffer[i] = buffer[j];
+ buffer[j] = tmp;
+ i++;
+ j--;
+ }
+ *length += number_length;
+}
+
+
+static void FillDigits64FixedLength(uint64_t number,
+ Vector<char> buffer, int* length) {
+ const uint32_t kTen7 = 10000000;
+ // For efficiency cut the number into 3 uint32_t parts, and print those.
+ uint32_t part2 = static_cast<uint32_t>(number % kTen7);
+ number /= kTen7;
+ uint32_t part1 = static_cast<uint32_t>(number % kTen7);
+ uint32_t part0 = static_cast<uint32_t>(number / kTen7);
+
+ FillDigits32FixedLength(part0, 3, buffer, length);
+ FillDigits32FixedLength(part1, 7, buffer, length);
+ FillDigits32FixedLength(part2, 7, buffer, length);
+}
+
+
+static void FillDigits64(uint64_t number, Vector<char> buffer, int* length) {
+ const uint32_t kTen7 = 10000000;
+ // For efficiency cut the number into 3 uint32_t parts, and print those.
+ uint32_t part2 = static_cast<uint32_t>(number % kTen7);
+ number /= kTen7;
+ uint32_t part1 = static_cast<uint32_t>(number % kTen7);
+ uint32_t part0 = static_cast<uint32_t>(number / kTen7);
+
+ if (part0 != 0) {
+ FillDigits32(part0, buffer, length);
+ FillDigits32FixedLength(part1, 7, buffer, length);
+ FillDigits32FixedLength(part2, 7, buffer, length);
+ } else if (part1 != 0) {
+ FillDigits32(part1, buffer, length);
+ FillDigits32FixedLength(part2, 7, buffer, length);
+ } else {
+ FillDigits32(part2, buffer, length);
+ }
+}
+
+
+static void RoundUp(Vector<char> buffer, int* length, int* decimal_point) {
+ // An empty buffer represents 0.
+ if (*length == 0) {
+ buffer[0] = '1';
+ *decimal_point = 1;
+ *length = 1;
+ return;
+ }
+ // Round the last digit until we either have a digit that was not '9' or until
+ // we reached the first digit.
+ buffer[(*length) - 1]++;
+ for (int i = (*length) - 1; i > 0; --i) {
+ if (buffer[i] != '0' + 10) {
+ return;
+ }
+ buffer[i] = '0';
+ buffer[i - 1]++;
+ }
+ // If the first digit is now '0' + 10, we would need to set it to '0' and add
+ // a '1' in front. However we reach the first digit only if all following
+ // digits had been '9' before rounding up. Now all trailing digits are '0' and
+ // we simply switch the first digit to '1' and update the decimal-point
+ // (indicating that the point is now one digit to the right).
+ if (buffer[0] == '0' + 10) {
+ buffer[0] = '1';
+ (*decimal_point)++;
+ }
+}
+
+
+// The given fractionals number represents a fixed-point number with binary
+// point at bit (-exponent).
+// Preconditions:
+// -128 <= exponent <= 0.
+// 0 <= fractionals * 2^exponent < 1
+// The buffer holds the result.
+// The function will round its result. During the rounding-process digits not
+// generated by this function might be updated, and the decimal-point variable
+// might be updated. If this function generates the digits 99 and the buffer
+// already contained "199" (thus yielding a buffer of "19999") then a
+// rounding-up will change the contents of the buffer to "20000".
+static void FillFractionals(uint64_t fractionals, int exponent,
+ int fractional_count, Vector<char> buffer,
+ int* length, int* decimal_point) {
+ ASSERT(-128 <= exponent && exponent <= 0);
+ // 'fractionals' is a fixed-point number, with binary point at bit
+ // (-exponent). Inside the function the non-converted remainder of fractionals
+ // is a fixed-point number, with binary point at bit 'point'.
+ if (-exponent <= 64) {
+ // One 64 bit number is sufficient.
+ ASSERT(fractionals >> 56 == 0);
+ int point = -exponent;
+ for (int i = 0; i < fractional_count; ++i) {
+ if (fractionals == 0) break;
+ // Instead of multiplying by 10 we multiply by 5 and adjust the point
+ // location. This way the fractionals variable will not overflow.
+ // Invariant at the beginning of the loop: fractionals < 2^point.
+ // Initially we have: point <= 64 and fractionals < 2^56
+ // After each iteration the point is decremented by one.
+ // Note that 5^3 = 125 < 128 = 2^7.
+ // Therefore three iterations of this loop will not overflow fractionals
+ // (even without the subtraction at the end of the loop body). At this
+ // time point will satisfy point <= 61 and therefore fractionals < 2^point
+ // and any further multiplication of fractionals by 5 will not overflow.
+ fractionals *= 5;
+ point--;
+ int digit = static_cast<int>(fractionals >> point);
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ fractionals -= static_cast<uint64_t>(digit) << point;
+ }
+ // If the first bit after the point is set we have to round up.
+ if (((fractionals >> (point - 1)) & 1) == 1) {
+ RoundUp(buffer, length, decimal_point);
+ }
+ } else { // We need 128 bits.
+ ASSERT(64 < -exponent && -exponent <= 128);
+ UInt128 fractionals128 = UInt128(fractionals, 0);
+ fractionals128.Shift(-exponent - 64);
+ int point = 128;
+ for (int i = 0; i < fractional_count; ++i) {
+ if (fractionals128.IsZero()) break;
+ // As before: instead of multiplying by 10 we multiply by 5 and adjust the
+ // point location.
+ // This multiplication will not overflow for the same reasons as before.
+ fractionals128.Multiply(5);
+ point--;
+ int digit = fractionals128.DivModPowerOf2(point);
+ ASSERT(digit <= 9);
+ buffer[*length] = static_cast<char>('0' + digit);
+ (*length)++;
+ }
+ if (fractionals128.BitAt(point - 1) == 1) {
+ RoundUp(buffer, length, decimal_point);
+ }
+ }
+}
+
+
+// Removes leading and trailing zeros.
+// If leading zeros are removed then the decimal point position is adjusted.
+static void TrimZeros(Vector<char> buffer, int* length, int* decimal_point) {
+ while (*length > 0 && buffer[(*length) - 1] == '0') {
+ (*length)--;
+ }
+ int first_non_zero = 0;
+ while (first_non_zero < *length && buffer[first_non_zero] == '0') {
+ first_non_zero++;
+ }
+ if (first_non_zero != 0) {
+ for (int i = first_non_zero; i < *length; ++i) {
+ buffer[i - first_non_zero] = buffer[i];
+ }
+ *length -= first_non_zero;
+ *decimal_point -= first_non_zero;
+ }
+}
+
+
+bool FastFixedDtoa(double v,
+ int fractional_count,
+ Vector<char> buffer,
+ int* length,
+ int* decimal_point) {
+ const uint32_t kMaxUInt32 = 0xFFFFFFFF;
+ uint64_t significand = Double(v).Significand();
+ int exponent = Double(v).Exponent();
+ // v = significand * 2^exponent (with significand a 53bit integer).
+ // If the exponent is larger than 20 (i.e. we may have a 73bit number) then we
+ // don't know how to compute the representation. 2^73 ~= 9.5*10^21.
+ // If necessary this limit could probably be increased, but we don't need
+ // more.
+ if (exponent > 20) return false;
+ if (fractional_count > 20) return false;
+ *length = 0;
+ // At most kDoubleSignificandSize bits of the significand are non-zero.
+ // Given a 64 bit integer we have 11 0s followed by 53 potentially non-zero
+ // bits: 0..11*..0xxx..53*..xx
+ if (exponent + kDoubleSignificandSize > 64) {
+ // The exponent must be > 11.
+ //
+ // We know that v = significand * 2^exponent.
+ // And the exponent > 11.
+ // We simplify the task by dividing v by 10^17.
+ // The quotient delivers the first digits, and the remainder fits into a 64
+ // bit number.
+ // Dividing by 10^17 is equivalent to dividing by 5^17*2^17.
+ const uint64_t kFive17 = UINT64_2PART_C(0xB1, A2BC2EC5); // 5^17
+ uint64_t divisor = kFive17;
+ int divisor_power = 17;
+ uint64_t dividend = significand;
+ uint32_t quotient;
+ uint64_t remainder;
+ // Let v = f * 2^e with f == significand and e == exponent.
+ // Then need q (quotient) and r (remainder) as follows:
+ // v = q * 10^17 + r
+ // f * 2^e = q * 10^17 + r
+ // f * 2^e = q * 5^17 * 2^17 + r
+ // If e > 17 then
+ // f * 2^(e-17) = q * 5^17 + r/2^17
+ // else
+ // f = q * 5^17 * 2^(17-e) + r/2^e
+ if (exponent > divisor_power) {
+ // We only allow exponents of up to 20 and therefore (17 - e) <= 3
+ dividend <<= exponent - divisor_power;
+ quotient = static_cast<uint32_t>(dividend / divisor);
+ remainder = (dividend % divisor) << divisor_power;
+ } else {
+ divisor <<= divisor_power - exponent;
+ quotient = static_cast<uint32_t>(dividend / divisor);
+ remainder = (dividend % divisor) << exponent;
+ }
+ FillDigits32(quotient, buffer, length);
+ FillDigits64FixedLength(remainder, buffer, length);
+ *decimal_point = *length;
+ } else if (exponent >= 0) {
+ // 0 <= exponent <= 11
+ significand <<= exponent;
+ FillDigits64(significand, buffer, length);
+ *decimal_point = *length;
+ } else if (exponent > -kDoubleSignificandSize) {
+ // We have to cut the number.
+ uint64_t integrals = significand >> -exponent;
+ uint64_t fractionals = significand - (integrals << -exponent);
+ if (integrals > kMaxUInt32) {
+ FillDigits64(integrals, buffer, length);
+ } else {
+ FillDigits32(static_cast<uint32_t>(integrals), buffer, length);
+ }
+ *decimal_point = *length;
+ FillFractionals(fractionals, exponent, fractional_count,
+ buffer, length, decimal_point);
+ } else if (exponent < -128) {
+ // This configuration (with at most 20 digits) means that all digits must be
+ // 0.
+ ASSERT(fractional_count <= 20);
+ buffer[0] = '\0';
+ *length = 0;
+ *decimal_point = -fractional_count;
+ } else {
+ *decimal_point = 0;
+ FillFractionals(significand, exponent, fractional_count,
+ buffer, length, decimal_point);
+ }
+ TrimZeros(buffer, length, decimal_point);
+ buffer[*length] = '\0';
+ if ((*length) == 0) {
+ // The string is empty and the decimal_point thus has no importance. Mimick
+ // Gay's dtoa and and set it to -fractional_count.
+ *decimal_point = -fractional_count;
+ }
+ return true;
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/fixed-dtoa.h b/src/3rdparty/double-conversion/fixed-dtoa.h
new file mode 100644
index 0000000000..3bdd08e21f
--- /dev/null
+++ b/src/3rdparty/double-conversion/fixed-dtoa.h
@@ -0,0 +1,56 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_FIXED_DTOA_H_
+#define DOUBLE_CONVERSION_FIXED_DTOA_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+// Produces digits necessary to print a given number with
+// 'fractional_count' digits after the decimal point.
+// The buffer must be big enough to hold the result plus one terminating null
+// character.
+//
+// The produced digits might be too short in which case the caller has to fill
+// the gaps with '0's.
+// Example: FastFixedDtoa(0.001, 5, ...) is allowed to return buffer = "1", and
+// decimal_point = -2.
+// Halfway cases are rounded towards +/-Infinity (away from 0). The call
+// FastFixedDtoa(0.15, 2, ...) thus returns buffer = "2", decimal_point = 0.
+// The returned buffer may contain digits that would be truncated from the
+// shortest representation of the input.
+//
+// This method only works for some parameters. If it can't handle the input it
+// returns false. The output is null-terminated when the function succeeds.
+bool FastFixedDtoa(double v, int fractional_count,
+ Vector<char> buffer, int* length, int* decimal_point);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_FIXED_DTOA_H_
diff --git a/src/3rdparty/double-conversion/ieee.h b/src/3rdparty/double-conversion/ieee.h
new file mode 100644
index 0000000000..661141d1a8
--- /dev/null
+++ b/src/3rdparty/double-conversion/ieee.h
@@ -0,0 +1,402 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_DOUBLE_H_
+#define DOUBLE_CONVERSION_DOUBLE_H_
+
+#include "diy-fp.h"
+
+namespace double_conversion {
+
+// We assume that doubles and uint64_t have the same endianness.
+static uint64_t double_to_uint64(double d) { return BitCast<uint64_t>(d); }
+static double uint64_to_double(uint64_t d64) { return BitCast<double>(d64); }
+static uint32_t float_to_uint32(float f) { return BitCast<uint32_t>(f); }
+static float uint32_to_float(uint32_t d32) { return BitCast<float>(d32); }
+
+// Helper functions for doubles.
+class Double {
+ public:
+ static const uint64_t kSignMask = UINT64_2PART_C(0x80000000, 00000000);
+ static const uint64_t kExponentMask = UINT64_2PART_C(0x7FF00000, 00000000);
+ static const uint64_t kSignificandMask = UINT64_2PART_C(0x000FFFFF, FFFFFFFF);
+ static const uint64_t kHiddenBit = UINT64_2PART_C(0x00100000, 00000000);
+ static const int kPhysicalSignificandSize = 52; // Excludes the hidden bit.
+ static const int kSignificandSize = 53;
+
+ Double() : d64_(0) {}
+ explicit Double(double d) : d64_(double_to_uint64(d)) {}
+ explicit Double(uint64_t d64) : d64_(d64) {}
+ explicit Double(DiyFp diy_fp)
+ : d64_(DiyFpToUint64(diy_fp)) {}
+
+ // The value encoded by this Double must be greater or equal to +0.0.
+ // It must not be special (infinity, or NaN).
+ DiyFp AsDiyFp() const {
+ ASSERT(Sign() > 0);
+ ASSERT(!IsSpecial());
+ return DiyFp(Significand(), Exponent());
+ }
+
+ // The value encoded by this Double must be strictly greater than 0.
+ DiyFp AsNormalizedDiyFp() const {
+ ASSERT(value() > 0.0);
+ uint64_t f = Significand();
+ int e = Exponent();
+
+ // The current double could be a denormal.
+ while ((f & kHiddenBit) == 0) {
+ f <<= 1;
+ e--;
+ }
+ // Do the final shifts in one go.
+ f <<= DiyFp::kSignificandSize - kSignificandSize;
+ e -= DiyFp::kSignificandSize - kSignificandSize;
+ return DiyFp(f, e);
+ }
+
+ // Returns the double's bit as uint64.
+ uint64_t AsUint64() const {
+ return d64_;
+ }
+
+ // Returns the next greater double. Returns +infinity on input +infinity.
+ double NextDouble() const {
+ if (d64_ == kInfinity) return Double(kInfinity).value();
+ if (Sign() < 0 && Significand() == 0) {
+ // -0.0
+ return 0.0;
+ }
+ if (Sign() < 0) {
+ return Double(d64_ - 1).value();
+ } else {
+ return Double(d64_ + 1).value();
+ }
+ }
+
+ double PreviousDouble() const {
+ if (d64_ == (kInfinity | kSignMask)) return -Double::Infinity();
+ if (Sign() < 0) {
+ return Double(d64_ + 1).value();
+ } else {
+ if (Significand() == 0) return -0.0;
+ return Double(d64_ - 1).value();
+ }
+ }
+
+ int Exponent() const {
+ if (IsDenormal()) return kDenormalExponent;
+
+ uint64_t d64 = AsUint64();
+ int biased_e =
+ static_cast<int>((d64 & kExponentMask) >> kPhysicalSignificandSize);
+ return biased_e - kExponentBias;
+ }
+
+ uint64_t Significand() const {
+ uint64_t d64 = AsUint64();
+ uint64_t significand = d64 & kSignificandMask;
+ if (!IsDenormal()) {
+ return significand + kHiddenBit;
+ } else {
+ return significand;
+ }
+ }
+
+ // Returns true if the double is a denormal.
+ bool IsDenormal() const {
+ uint64_t d64 = AsUint64();
+ return (d64 & kExponentMask) == 0;
+ }
+
+ // We consider denormals not to be special.
+ // Hence only Infinity and NaN are special.
+ bool IsSpecial() const {
+ uint64_t d64 = AsUint64();
+ return (d64 & kExponentMask) == kExponentMask;
+ }
+
+ bool IsNan() const {
+ uint64_t d64 = AsUint64();
+ return ((d64 & kExponentMask) == kExponentMask) &&
+ ((d64 & kSignificandMask) != 0);
+ }
+
+ bool IsInfinite() const {
+ uint64_t d64 = AsUint64();
+ return ((d64 & kExponentMask) == kExponentMask) &&
+ ((d64 & kSignificandMask) == 0);
+ }
+
+ int Sign() const {
+ uint64_t d64 = AsUint64();
+ return (d64 & kSignMask) == 0? 1: -1;
+ }
+
+ // Precondition: the value encoded by this Double must be greater or equal
+ // than +0.0.
+ DiyFp UpperBoundary() const {
+ ASSERT(Sign() > 0);
+ return DiyFp(Significand() * 2 + 1, Exponent() - 1);
+ }
+
+ // Computes the two boundaries of this.
+ // The bigger boundary (m_plus) is normalized. The lower boundary has the same
+ // exponent as m_plus.
+ // Precondition: the value encoded by this Double must be greater than 0.
+ void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
+ ASSERT(value() > 0.0);
+ DiyFp v = this->AsDiyFp();
+ DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
+ DiyFp m_minus;
+ if (LowerBoundaryIsCloser()) {
+ m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
+ } else {
+ m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
+ }
+ m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
+ m_minus.set_e(m_plus.e());
+ *out_m_plus = m_plus;
+ *out_m_minus = m_minus;
+ }
+
+ bool LowerBoundaryIsCloser() const {
+ // The boundary is closer if the significand is of the form f == 2^p-1 then
+ // the lower boundary is closer.
+ // Think of v = 1000e10 and v- = 9999e9.
+ // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
+ // at a distance of 1e8.
+ // The only exception is for the smallest normal: the largest denormal is
+ // at the same distance as its successor.
+ // Note: denormals have the same exponent as the smallest normals.
+ bool physical_significand_is_zero = ((AsUint64() & kSignificandMask) == 0);
+ return physical_significand_is_zero && (Exponent() != kDenormalExponent);
+ }
+
+ double value() const { return uint64_to_double(d64_); }
+
+ // Returns the significand size for a given order of magnitude.
+ // If v = f*2^e with 2^p-1 <= f <= 2^p then p+e is v's order of magnitude.
+ // This function returns the number of significant binary digits v will have
+ // once it's encoded into a double. In almost all cases this is equal to
+ // kSignificandSize. The only exceptions are denormals. They start with
+ // leading zeroes and their effective significand-size is hence smaller.
+ static int SignificandSizeForOrderOfMagnitude(int order) {
+ if (order >= (kDenormalExponent + kSignificandSize)) {
+ return kSignificandSize;
+ }
+ if (order <= kDenormalExponent) return 0;
+ return order - kDenormalExponent;
+ }
+
+ static double Infinity() {
+ return Double(kInfinity).value();
+ }
+
+ static double NaN() {
+ return Double(kNaN).value();
+ }
+
+ private:
+ static const int kExponentBias = 0x3FF + kPhysicalSignificandSize;
+ static const int kDenormalExponent = -kExponentBias + 1;
+ static const int kMaxExponent = 0x7FF - kExponentBias;
+ static const uint64_t kInfinity = UINT64_2PART_C(0x7FF00000, 00000000);
+ static const uint64_t kNaN = UINT64_2PART_C(0x7FF80000, 00000000);
+
+ const uint64_t d64_;
+
+ static uint64_t DiyFpToUint64(DiyFp diy_fp) {
+ uint64_t significand = diy_fp.f();
+ int exponent = diy_fp.e();
+ while (significand > kHiddenBit + kSignificandMask) {
+ significand >>= 1;
+ exponent++;
+ }
+ if (exponent >= kMaxExponent) {
+ return kInfinity;
+ }
+ if (exponent < kDenormalExponent) {
+ return 0;
+ }
+ while (exponent > kDenormalExponent && (significand & kHiddenBit) == 0) {
+ significand <<= 1;
+ exponent--;
+ }
+ uint64_t biased_exponent;
+ if (exponent == kDenormalExponent && (significand & kHiddenBit) == 0) {
+ biased_exponent = 0;
+ } else {
+ biased_exponent = static_cast<uint64_t>(exponent + kExponentBias);
+ }
+ return (significand & kSignificandMask) |
+ (biased_exponent << kPhysicalSignificandSize);
+ }
+
+ DISALLOW_COPY_AND_ASSIGN(Double);
+};
+
+class Single {
+ public:
+ static const uint32_t kSignMask = 0x80000000;
+ static const uint32_t kExponentMask = 0x7F800000;
+ static const uint32_t kSignificandMask = 0x007FFFFF;
+ static const uint32_t kHiddenBit = 0x00800000;
+ static const int kPhysicalSignificandSize = 23; // Excludes the hidden bit.
+ static const int kSignificandSize = 24;
+
+ Single() : d32_(0) {}
+ explicit Single(float f) : d32_(float_to_uint32(f)) {}
+ explicit Single(uint32_t d32) : d32_(d32) {}
+
+ // The value encoded by this Single must be greater or equal to +0.0.
+ // It must not be special (infinity, or NaN).
+ DiyFp AsDiyFp() const {
+ ASSERT(Sign() > 0);
+ ASSERT(!IsSpecial());
+ return DiyFp(Significand(), Exponent());
+ }
+
+ // Returns the single's bit as uint64.
+ uint32_t AsUint32() const {
+ return d32_;
+ }
+
+ int Exponent() const {
+ if (IsDenormal()) return kDenormalExponent;
+
+ uint32_t d32 = AsUint32();
+ int biased_e =
+ static_cast<int>((d32 & kExponentMask) >> kPhysicalSignificandSize);
+ return biased_e - kExponentBias;
+ }
+
+ uint32_t Significand() const {
+ uint32_t d32 = AsUint32();
+ uint32_t significand = d32 & kSignificandMask;
+ if (!IsDenormal()) {
+ return significand + kHiddenBit;
+ } else {
+ return significand;
+ }
+ }
+
+ // Returns true if the single is a denormal.
+ bool IsDenormal() const {
+ uint32_t d32 = AsUint32();
+ return (d32 & kExponentMask) == 0;
+ }
+
+ // We consider denormals not to be special.
+ // Hence only Infinity and NaN are special.
+ bool IsSpecial() const {
+ uint32_t d32 = AsUint32();
+ return (d32 & kExponentMask) == kExponentMask;
+ }
+
+ bool IsNan() const {
+ uint32_t d32 = AsUint32();
+ return ((d32 & kExponentMask) == kExponentMask) &&
+ ((d32 & kSignificandMask) != 0);
+ }
+
+ bool IsInfinite() const {
+ uint32_t d32 = AsUint32();
+ return ((d32 & kExponentMask) == kExponentMask) &&
+ ((d32 & kSignificandMask) == 0);
+ }
+
+ int Sign() const {
+ uint32_t d32 = AsUint32();
+ return (d32 & kSignMask) == 0? 1: -1;
+ }
+
+ // Computes the two boundaries of this.
+ // The bigger boundary (m_plus) is normalized. The lower boundary has the same
+ // exponent as m_plus.
+ // Precondition: the value encoded by this Single must be greater than 0.
+ void NormalizedBoundaries(DiyFp* out_m_minus, DiyFp* out_m_plus) const {
+ ASSERT(value() > 0.0);
+ DiyFp v = this->AsDiyFp();
+ DiyFp m_plus = DiyFp::Normalize(DiyFp((v.f() << 1) + 1, v.e() - 1));
+ DiyFp m_minus;
+ if (LowerBoundaryIsCloser()) {
+ m_minus = DiyFp((v.f() << 2) - 1, v.e() - 2);
+ } else {
+ m_minus = DiyFp((v.f() << 1) - 1, v.e() - 1);
+ }
+ m_minus.set_f(m_minus.f() << (m_minus.e() - m_plus.e()));
+ m_minus.set_e(m_plus.e());
+ *out_m_plus = m_plus;
+ *out_m_minus = m_minus;
+ }
+
+ // Precondition: the value encoded by this Single must be greater or equal
+ // than +0.0.
+ DiyFp UpperBoundary() const {
+ ASSERT(Sign() > 0);
+ return DiyFp(Significand() * 2 + 1, Exponent() - 1);
+ }
+
+ bool LowerBoundaryIsCloser() const {
+ // The boundary is closer if the significand is of the form f == 2^p-1 then
+ // the lower boundary is closer.
+ // Think of v = 1000e10 and v- = 9999e9.
+ // Then the boundary (== (v - v-)/2) is not just at a distance of 1e9 but
+ // at a distance of 1e8.
+ // The only exception is for the smallest normal: the largest denormal is
+ // at the same distance as its successor.
+ // Note: denormals have the same exponent as the smallest normals.
+ bool physical_significand_is_zero = ((AsUint32() & kSignificandMask) == 0);
+ return physical_significand_is_zero && (Exponent() != kDenormalExponent);
+ }
+
+ float value() const { return uint32_to_float(d32_); }
+
+ static float Infinity() {
+ return Single(kInfinity).value();
+ }
+
+ static float NaN() {
+ return Single(kNaN).value();
+ }
+
+ private:
+ static const int kExponentBias = 0x7F + kPhysicalSignificandSize;
+ static const int kDenormalExponent = -kExponentBias + 1;
+ static const int kMaxExponent = 0xFF - kExponentBias;
+ static const uint32_t kInfinity = 0x7F800000;
+ static const uint32_t kNaN = 0x7FC00000;
+
+ const uint32_t d32_;
+
+ DISALLOW_COPY_AND_ASSIGN(Single);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_DOUBLE_H_
diff --git a/src/3rdparty/double-conversion/include/double-conversion/double-conversion.h b/src/3rdparty/double-conversion/include/double-conversion/double-conversion.h
new file mode 100644
index 0000000000..6bdfa8d25d
--- /dev/null
+++ b/src/3rdparty/double-conversion/include/double-conversion/double-conversion.h
@@ -0,0 +1,543 @@
+// Copyright 2012 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
+#define DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+class DoubleToStringConverter {
+ public:
+ // When calling ToFixed with a double > 10^kMaxFixedDigitsBeforePoint
+ // or a requested_digits parameter > kMaxFixedDigitsAfterPoint then the
+ // function returns false.
+ static const int kMaxFixedDigitsBeforePoint = 60;
+ static const int kMaxFixedDigitsAfterPoint = 60;
+
+ // When calling ToExponential with a requested_digits
+ // parameter > kMaxExponentialDigits then the function returns false.
+ static const int kMaxExponentialDigits = 120;
+
+ // When calling ToPrecision with a requested_digits
+ // parameter < kMinPrecisionDigits or requested_digits > kMaxPrecisionDigits
+ // then the function returns false.
+ static const int kMinPrecisionDigits = 1;
+ static const int kMaxPrecisionDigits = 120;
+
+ enum Flags {
+ NO_FLAGS = 0,
+ EMIT_POSITIVE_EXPONENT_SIGN = 1,
+ EMIT_TRAILING_DECIMAL_POINT = 2,
+ EMIT_TRAILING_ZERO_AFTER_POINT = 4,
+ UNIQUE_ZERO = 8
+ };
+
+ // Flags should be a bit-or combination of the possible Flags-enum.
+ // - NO_FLAGS: no special flags.
+ // - EMIT_POSITIVE_EXPONENT_SIGN: when the number is converted into exponent
+ // form, emits a '+' for positive exponents. Example: 1.2e+2.
+ // - EMIT_TRAILING_DECIMAL_POINT: when the input number is an integer and is
+ // converted into decimal format then a trailing decimal point is appended.
+ // Example: 2345.0 is converted to "2345.".
+ // - EMIT_TRAILING_ZERO_AFTER_POINT: in addition to a trailing decimal point
+ // emits a trailing '0'-character. This flag requires the
+ // EXMIT_TRAILING_DECIMAL_POINT flag.
+ // Example: 2345.0 is converted to "2345.0".
+ // - UNIQUE_ZERO: "-0.0" is converted to "0.0".
+ //
+ // Infinity symbol and nan_symbol provide the string representation for these
+ // special values. If the string is NULL and the special value is encountered
+ // then the conversion functions return false.
+ //
+ // The exponent_character is used in exponential representations. It is
+ // usually 'e' or 'E'.
+ //
+ // When converting to the shortest representation the converter will
+ // represent input numbers in decimal format if they are in the interval
+ // [10^decimal_in_shortest_low; 10^decimal_in_shortest_high[
+ // (lower boundary included, greater boundary excluded).
+ // Example: with decimal_in_shortest_low = -6 and
+ // decimal_in_shortest_high = 21:
+ // ToShortest(0.000001) -> "0.000001"
+ // ToShortest(0.0000001) -> "1e-7"
+ // ToShortest(111111111111111111111.0) -> "111111111111111110000"
+ // ToShortest(100000000000000000000.0) -> "100000000000000000000"
+ // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+ //
+ // When converting to precision mode the converter may add
+ // max_leading_padding_zeroes before returning the number in exponential
+ // format.
+ // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+ // ToPrecision(0.0000012345, 2) -> "0.0000012"
+ // ToPrecision(0.00000012345, 2) -> "1.2e-7"
+ // Similarily the converter may add up to
+ // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+ // returning an exponential representation. A zero added by the
+ // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+ // ToPrecision(230.0, 2) -> "230"
+ // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
+ // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+ DoubleToStringConverter(int flags,
+ const char* infinity_symbol,
+ const char* nan_symbol,
+ char exponent_character,
+ int decimal_in_shortest_low,
+ int decimal_in_shortest_high,
+ int max_leading_padding_zeroes_in_precision_mode,
+ int max_trailing_padding_zeroes_in_precision_mode)
+ : flags_(flags),
+ infinity_symbol_(infinity_symbol),
+ nan_symbol_(nan_symbol),
+ exponent_character_(exponent_character),
+ decimal_in_shortest_low_(decimal_in_shortest_low),
+ decimal_in_shortest_high_(decimal_in_shortest_high),
+ max_leading_padding_zeroes_in_precision_mode_(
+ max_leading_padding_zeroes_in_precision_mode),
+ max_trailing_padding_zeroes_in_precision_mode_(
+ max_trailing_padding_zeroes_in_precision_mode) {
+ // When 'trailing zero after the point' is set, then 'trailing point'
+ // must be set too.
+ ASSERT(((flags & EMIT_TRAILING_DECIMAL_POINT) != 0) ||
+ !((flags & EMIT_TRAILING_ZERO_AFTER_POINT) != 0));
+ }
+
+ // Returns a converter following the EcmaScript specification.
+ static const DoubleToStringConverter& EcmaScriptConverter();
+
+ // Computes the shortest string of digits that correctly represent the input
+ // number. Depending on decimal_in_shortest_low and decimal_in_shortest_high
+ // (see constructor) it then either returns a decimal representation, or an
+ // exponential representation.
+ // Example with decimal_in_shortest_low = -6,
+ // decimal_in_shortest_high = 21,
+ // EMIT_POSITIVE_EXPONENT_SIGN activated, and
+ // EMIT_TRAILING_DECIMAL_POINT deactived:
+ // ToShortest(0.000001) -> "0.000001"
+ // ToShortest(0.0000001) -> "1e-7"
+ // ToShortest(111111111111111111111.0) -> "111111111111111110000"
+ // ToShortest(100000000000000000000.0) -> "100000000000000000000"
+ // ToShortest(1111111111111111111111.0) -> "1.1111111111111111e+21"
+ //
+ // Note: the conversion may round the output if the returned string
+ // is accurate enough to uniquely identify the input-number.
+ // For example the most precise representation of the double 9e59 equals
+ // "899999999999999918767229449717619953810131273674690656206848", but
+ // the converter will return the shorter (but still correct) "9e59".
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except when the input value is special and no infinity_symbol or
+ // nan_symbol has been given to the constructor.
+ bool ToShortest(double value, StringBuilder* result_builder) const {
+ return ToShortestIeeeNumber(value, result_builder, SHORTEST);
+ }
+
+ // Same as ToShortest, but for single-precision floats.
+ bool ToShortestSingle(float value, StringBuilder* result_builder) const {
+ return ToShortestIeeeNumber(value, result_builder, SHORTEST_SINGLE);
+ }
+
+
+ // Computes a decimal representation with a fixed number of digits after the
+ // decimal point. The last emitted digit is rounded.
+ //
+ // Examples:
+ // ToFixed(3.12, 1) -> "3.1"
+ // ToFixed(3.1415, 3) -> "3.142"
+ // ToFixed(1234.56789, 4) -> "1234.5679"
+ // ToFixed(1.23, 5) -> "1.23000"
+ // ToFixed(0.1, 4) -> "0.1000"
+ // ToFixed(1e30, 2) -> "1000000000000000019884624838656.00"
+ // ToFixed(0.1, 30) -> "0.100000000000000005551115123126"
+ // ToFixed(0.1, 17) -> "0.10000000000000001"
+ //
+ // If requested_digits equals 0, then the tail of the result depends on
+ // the EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT.
+ // Examples, for requested_digits == 0,
+ // let EMIT_TRAILING_DECIMAL_POINT and EMIT_TRAILING_ZERO_AFTER_POINT be
+ // - false and false: then 123.45 -> 123
+ // 0.678 -> 1
+ // - true and false: then 123.45 -> 123.
+ // 0.678 -> 1.
+ // - true and true: then 123.45 -> 123.0
+ // 0.678 -> 1.0
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - 'value' > 10^kMaxFixedDigitsBeforePoint, or
+ // - 'requested_digits' > kMaxFixedDigitsAfterPoint.
+ // The last two conditions imply that the result will never contain more than
+ // 1 + kMaxFixedDigitsBeforePoint + 1 + kMaxFixedDigitsAfterPoint characters
+ // (one additional character for the sign, and one for the decimal point).
+ bool ToFixed(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const;
+
+ // Computes a representation in exponential format with requested_digits
+ // after the decimal point. The last emitted digit is rounded.
+ // If requested_digits equals -1, then the shortest exponential representation
+ // is computed.
+ //
+ // Examples with EMIT_POSITIVE_EXPONENT_SIGN deactivated, and
+ // exponent_character set to 'e'.
+ // ToExponential(3.12, 1) -> "3.1e0"
+ // ToExponential(5.0, 3) -> "5.000e0"
+ // ToExponential(0.001, 2) -> "1.00e-3"
+ // ToExponential(3.1415, -1) -> "3.1415e0"
+ // ToExponential(3.1415, 4) -> "3.1415e0"
+ // ToExponential(3.1415, 3) -> "3.142e0"
+ // ToExponential(123456789000000, 3) -> "1.235e14"
+ // ToExponential(1000000000000000019884624838656.0, -1) -> "1e30"
+ // ToExponential(1000000000000000019884624838656.0, 32) ->
+ // "1.00000000000000001988462483865600e30"
+ // ToExponential(1234, 0) -> "1e3"
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - 'requested_digits' > kMaxExponentialDigits.
+ // The last condition implies that the result will never contain more than
+ // kMaxExponentialDigits + 8 characters (the sign, the digit before the
+ // decimal point, the decimal point, the exponent character, the
+ // exponent's sign, and at most 3 exponent digits).
+ bool ToExponential(double value,
+ int requested_digits,
+ StringBuilder* result_builder) const;
+
+ // Computes 'precision' leading digits of the given 'value' and returns them
+ // either in exponential or decimal format, depending on
+ // max_{leading|trailing}_padding_zeroes_in_precision_mode (given to the
+ // constructor).
+ // The last computed digit is rounded.
+ //
+ // Example with max_leading_padding_zeroes_in_precision_mode = 6.
+ // ToPrecision(0.0000012345, 2) -> "0.0000012"
+ // ToPrecision(0.00000012345, 2) -> "1.2e-7"
+ // Similarily the converter may add up to
+ // max_trailing_padding_zeroes_in_precision_mode in precision mode to avoid
+ // returning an exponential representation. A zero added by the
+ // EMIT_TRAILING_ZERO_AFTER_POINT flag is counted for this limit.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 1:
+ // ToPrecision(230.0, 2) -> "230"
+ // ToPrecision(230.0, 2) -> "230." with EMIT_TRAILING_DECIMAL_POINT.
+ // ToPrecision(230.0, 2) -> "2.3e2" with EMIT_TRAILING_ZERO_AFTER_POINT.
+ // Examples for max_trailing_padding_zeroes_in_precision_mode = 3, and no
+ // EMIT_TRAILING_ZERO_AFTER_POINT:
+ // ToPrecision(123450.0, 6) -> "123450"
+ // ToPrecision(123450.0, 5) -> "123450"
+ // ToPrecision(123450.0, 4) -> "123500"
+ // ToPrecision(123450.0, 3) -> "123000"
+ // ToPrecision(123450.0, 2) -> "1.2e5"
+ //
+ // Returns true if the conversion succeeds. The conversion always succeeds
+ // except for the following cases:
+ // - the input value is special and no infinity_symbol or nan_symbol has
+ // been provided to the constructor,
+ // - precision < kMinPericisionDigits
+ // - precision > kMaxPrecisionDigits
+ // The last condition implies that the result will never contain more than
+ // kMaxPrecisionDigits + 7 characters (the sign, the decimal point, the
+ // exponent character, the exponent's sign, and at most 3 exponent digits).
+ bool ToPrecision(double value,
+ int precision,
+ StringBuilder* result_builder) const;
+
+ enum DtoaMode {
+ // Produce the shortest correct representation.
+ // For example the output of 0.299999999999999988897 is (the less accurate
+ // but correct) 0.3.
+ SHORTEST,
+ // Same as SHORTEST, but for single-precision floats.
+ SHORTEST_SINGLE,
+ // Produce a fixed number of digits after the decimal point.
+ // For instance fixed(0.1, 4) becomes 0.1000
+ // If the input number is big, the output will be big.
+ FIXED,
+ // Fixed number of digits (independent of the decimal point).
+ PRECISION
+ };
+
+ // The maximal number of digits that are needed to emit a double in base 10.
+ // A higher precision can be achieved by using more digits, but the shortest
+ // accurate representation of any double will never use more digits than
+ // kBase10MaximalLength.
+ // Note that DoubleToAscii null-terminates its input. So the given buffer
+ // should be at least kBase10MaximalLength + 1 characters long.
+ static const int kBase10MaximalLength = 17;
+
+ // Converts the given double 'v' to ascii. 'v' must not be NaN, +Infinity, or
+ // -Infinity. In SHORTEST_SINGLE-mode this restriction also applies to 'v'
+ // after it has been casted to a single-precision float. That is, in this
+ // mode static_cast<float>(v) must not be NaN, +Infinity or -Infinity.
+ //
+ // The result should be interpreted as buffer * 10^(point-length).
+ //
+ // The output depends on the given mode:
+ // - SHORTEST: produce the least amount of digits for which the internal
+ // identity requirement is still satisfied. If the digits are printed
+ // (together with the correct exponent) then reading this number will give
+ // 'v' again. The buffer will choose the representation that is closest to
+ // 'v'. If there are two at the same distance, than the one farther away
+ // from 0 is chosen (halfway cases - ending with 5 - are rounded up).
+ // In this mode the 'requested_digits' parameter is ignored.
+ // - SHORTEST_SINGLE: same as SHORTEST but with single-precision.
+ // - FIXED: produces digits necessary to print a given number with
+ // 'requested_digits' digits after the decimal point. The produced digits
+ // might be too short in which case the caller has to fill the remainder
+ // with '0's.
+ // Example: toFixed(0.001, 5) is allowed to return buffer="1", point=-2.
+ // Halfway cases are rounded towards +/-Infinity (away from 0). The call
+ // toFixed(0.15, 2) thus returns buffer="2", point=0.
+ // The returned buffer may contain digits that would be truncated from the
+ // shortest representation of the input.
+ // - PRECISION: produces 'requested_digits' where the first digit is not '0'.
+ // Even though the length of produced digits usually equals
+ // 'requested_digits', the function is allowed to return fewer digits, in
+ // which case the caller has to fill the missing digits with '0's.
+ // Halfway cases are again rounded away from 0.
+ // DoubleToAscii expects the given buffer to be big enough to hold all
+ // digits and a terminating null-character. In SHORTEST-mode it expects a
+ // buffer of at least kBase10MaximalLength + 1. In all other modes the
+ // requested_digits parameter and the padding-zeroes limit the size of the
+ // output. Don't forget the decimal point, the exponent character and the
+ // terminating null-character when computing the maximal output size.
+ // The given length is only used in debug mode to ensure the buffer is big
+ // enough.
+ static void DoubleToAscii(double v,
+ DtoaMode mode,
+ int requested_digits,
+ char* buffer,
+ int buffer_length,
+ bool* sign,
+ int* length,
+ int* point);
+
+ private:
+ // Implementation for ToShortest and ToShortestSingle.
+ bool ToShortestIeeeNumber(double value,
+ StringBuilder* result_builder,
+ DtoaMode mode) const;
+
+ // If the value is a special value (NaN or Infinity) constructs the
+ // corresponding string using the configured infinity/nan-symbol.
+ // If either of them is NULL or the value is not special then the
+ // function returns false.
+ bool HandleSpecialValues(double value, StringBuilder* result_builder) const;
+ // Constructs an exponential representation (i.e. 1.234e56).
+ // The given exponent assumes a decimal point after the first decimal digit.
+ void CreateExponentialRepresentation(const char* decimal_digits,
+ int length,
+ int exponent,
+ StringBuilder* result_builder) const;
+ // Creates a decimal representation (i.e 1234.5678).
+ void CreateDecimalRepresentation(const char* decimal_digits,
+ int length,
+ int decimal_point,
+ int digits_after_point,
+ StringBuilder* result_builder) const;
+
+ const int flags_;
+ const char* const infinity_symbol_;
+ const char* const nan_symbol_;
+ const char exponent_character_;
+ const int decimal_in_shortest_low_;
+ const int decimal_in_shortest_high_;
+ const int max_leading_padding_zeroes_in_precision_mode_;
+ const int max_trailing_padding_zeroes_in_precision_mode_;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(DoubleToStringConverter);
+};
+
+
+class StringToDoubleConverter {
+ public:
+ // Enumeration for allowing octals and ignoring junk when converting
+ // strings to numbers.
+ enum Flags {
+ NO_FLAGS = 0,
+ ALLOW_HEX = 1,
+ ALLOW_OCTALS = 2,
+ ALLOW_TRAILING_JUNK = 4,
+ ALLOW_LEADING_SPACES = 8,
+ ALLOW_TRAILING_SPACES = 16,
+ ALLOW_SPACES_AFTER_SIGN = 32
+ };
+
+ // Flags should be a bit-or combination of the possible Flags-enum.
+ // - NO_FLAGS: no special flags.
+ // - ALLOW_HEX: recognizes the prefix "0x". Hex numbers may only be integers.
+ // Ex: StringToDouble("0x1234") -> 4660.0
+ // In StringToDouble("0x1234.56") the characters ".56" are trailing
+ // junk. The result of the call is hence dependent on
+ // the ALLOW_TRAILING_JUNK flag and/or the junk value.
+ // With this flag "0x" is a junk-string. Even with ALLOW_TRAILING_JUNK,
+ // the string will not be parsed as "0" followed by junk.
+ //
+ // - ALLOW_OCTALS: recognizes the prefix "0" for octals:
+ // If a sequence of octal digits starts with '0', then the number is
+ // read as octal integer. Octal numbers may only be integers.
+ // Ex: StringToDouble("01234") -> 668.0
+ // StringToDouble("012349") -> 12349.0 // Not a sequence of octal
+ // // digits.
+ // In StringToDouble("01234.56") the characters ".56" are trailing
+ // junk. The result of the call is hence dependent on
+ // the ALLOW_TRAILING_JUNK flag and/or the junk value.
+ // In StringToDouble("01234e56") the characters "e56" are trailing
+ // junk, too.
+ // - ALLOW_TRAILING_JUNK: ignore trailing characters that are not part of
+ // a double literal.
+ // - ALLOW_LEADING_SPACES: skip over leading whitespace, including spaces,
+ // new-lines, and tabs.
+ // - ALLOW_TRAILING_SPACES: ignore trailing whitespace.
+ // - ALLOW_SPACES_AFTER_SIGN: ignore whitespace after the sign.
+ // Ex: StringToDouble("- 123.2") -> -123.2.
+ // StringToDouble("+ 123.2") -> 123.2
+ //
+ // empty_string_value is returned when an empty string is given as input.
+ // If ALLOW_LEADING_SPACES or ALLOW_TRAILING_SPACES are set, then a string
+ // containing only spaces is converted to the 'empty_string_value', too.
+ //
+ // junk_string_value is returned when
+ // a) ALLOW_TRAILING_JUNK is not set, and a junk character (a character not
+ // part of a double-literal) is found.
+ // b) ALLOW_TRAILING_JUNK is set, but the string does not start with a
+ // double literal.
+ //
+ // infinity_symbol and nan_symbol are strings that are used to detect
+ // inputs that represent infinity and NaN. They can be null, in which case
+ // they are ignored.
+ // The conversion routine first reads any possible signs. Then it compares the
+ // following character of the input-string with the first character of
+ // the infinity, and nan-symbol. If either matches, the function assumes, that
+ // a match has been found, and expects the following input characters to match
+ // the remaining characters of the special-value symbol.
+ // This means that the following restrictions apply to special-value symbols:
+ // - they must not start with signs ('+', or '-'),
+ // - they must not have the same first character.
+ // - they must not start with digits.
+ //
+ // Examples:
+ // flags = ALLOW_HEX | ALLOW_TRAILING_JUNK,
+ // empty_string_value = 0.0,
+ // junk_string_value = NaN,
+ // infinity_symbol = "infinity",
+ // nan_symbol = "nan":
+ // StringToDouble("0x1234") -> 4660.0.
+ // StringToDouble("0x1234K") -> 4660.0.
+ // StringToDouble("") -> 0.0 // empty_string_value.
+ // StringToDouble(" ") -> NaN // junk_string_value.
+ // StringToDouble(" 1") -> NaN // junk_string_value.
+ // StringToDouble("0x") -> NaN // junk_string_value.
+ // StringToDouble("-123.45") -> -123.45.
+ // StringToDouble("--123.45") -> NaN // junk_string_value.
+ // StringToDouble("123e45") -> 123e45.
+ // StringToDouble("123E45") -> 123e45.
+ // StringToDouble("123e+45") -> 123e45.
+ // StringToDouble("123E-45") -> 123e-45.
+ // StringToDouble("123e") -> 123.0 // trailing junk ignored.
+ // StringToDouble("123e-") -> 123.0 // trailing junk ignored.
+ // StringToDouble("+NaN") -> NaN // NaN string literal.
+ // StringToDouble("-infinity") -> -inf. // infinity literal.
+ // StringToDouble("Infinity") -> NaN // junk_string_value.
+ //
+ // flags = ALLOW_OCTAL | ALLOW_LEADING_SPACES,
+ // empty_string_value = 0.0,
+ // junk_string_value = NaN,
+ // infinity_symbol = NULL,
+ // nan_symbol = NULL:
+ // StringToDouble("0x1234") -> NaN // junk_string_value.
+ // StringToDouble("01234") -> 668.0.
+ // StringToDouble("") -> 0.0 // empty_string_value.
+ // StringToDouble(" ") -> 0.0 // empty_string_value.
+ // StringToDouble(" 1") -> 1.0
+ // StringToDouble("0x") -> NaN // junk_string_value.
+ // StringToDouble("0123e45") -> NaN // junk_string_value.
+ // StringToDouble("01239E45") -> 1239e45.
+ // StringToDouble("-infinity") -> NaN // junk_string_value.
+ // StringToDouble("NaN") -> NaN // junk_string_value.
+ StringToDoubleConverter(int flags,
+ double empty_string_value,
+ double junk_string_value,
+ const char* infinity_symbol,
+ const char* nan_symbol)
+ : flags_(flags),
+ empty_string_value_(empty_string_value),
+ junk_string_value_(junk_string_value),
+ infinity_symbol_(infinity_symbol),
+ nan_symbol_(nan_symbol) {
+ }
+
+ // Performs the conversion.
+ // The output parameter 'processed_characters_count' is set to the number
+ // of characters that have been processed to read the number.
+ // Spaces than are processed with ALLOW_{LEADING|TRAILING}_SPACES are included
+ // in the 'processed_characters_count'. Trailing junk is never included.
+ double StringToDouble(const char* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToDouble above but for 16 bit characters.
+ double StringToDouble(const uc16* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToDouble but reads a float.
+ // Note that this is not equivalent to static_cast<float>(StringToDouble(...))
+ // due to potential double-rounding.
+ float StringToFloat(const char* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ // Same as StringToFloat above but for 16 bit characters.
+ float StringToFloat(const uc16* buffer,
+ int length,
+ int* processed_characters_count) const;
+
+ private:
+ const int flags_;
+ const double empty_string_value_;
+ const double junk_string_value_;
+ const char* const infinity_symbol_;
+ const char* const nan_symbol_;
+
+ template <class Iterator>
+ double StringToIeee(Iterator start_pointer,
+ int length,
+ bool read_as_double,
+ int* processed_characters_count) const;
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(StringToDoubleConverter);
+};
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_DOUBLE_CONVERSION_H_
diff --git a/src/3rdparty/double-conversion/include/double-conversion/utils.h b/src/3rdparty/double-conversion/include/double-conversion/utils.h
new file mode 100644
index 0000000000..53eec64282
--- /dev/null
+++ b/src/3rdparty/double-conversion/include/double-conversion/utils.h
@@ -0,0 +1,330 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_UTILS_H_
+#define DOUBLE_CONVERSION_UTILS_H_
+
+#include <stdlib.h>
+#include <string.h>
+
+#include <assert.h>
+#ifndef ASSERT
+# if defined(WINCE) || defined(_WIN32_WCE)
+# define ASSERT(condition)
+# else
+# define ASSERT(condition) \
+ assert(condition);
+# endif
+#endif
+#ifndef UNIMPLEMENTED
+# define UNIMPLEMENTED() (exit(-1))
+#endif
+#ifndef UNREACHABLE
+# define UNREACHABLE() (exit(-1))
+#endif
+
+// Double operations detection based on target architecture.
+// Linux uses a 80bit wide floating point stack on x86. This induces double
+// rounding, which in turn leads to wrong results.
+// An easy way to test if the floating-point operations are correct is to
+// evaluate: 89255.0/1e22. If the floating-point stack is 64 bits wide then
+// the result is equal to 89255e-22.
+// The best way to test this, is to create a division-function and to compare
+// the output of the division with the expected result. (Inlining must be
+// disabled.)
+// On Linux,x86 89255e-22 != Div_double(89255.0/1e22)
+#if defined(_M_X64) || defined(__x86_64__) || \
+ defined(__ARMEL__) || defined(__avr32__) || _M_ARM_FP || \
+ defined(__hppa__) || defined(__ia64__) || \
+ defined(__mips__) || \
+ defined(__powerpc__) || defined(__ppc__) || defined(__ppc64__) || \
+ defined(__sparc__) || defined(__sparc) || defined(__s390__) || \
+ defined(__SH4__) || defined(__alpha__) || \
+ defined(_MIPS_ARCH_MIPS32R2) || \
+ defined(__AARCH64EL__)
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#elif defined(_M_IX86) || defined(__i386__) || defined(__i386)
+#if defined(_WIN32)
+// Windows uses a 64bit wide floating point stack.
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#else
+#undef DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS
+#endif // _WIN32
+#elif defined(WINCE) || defined(_WIN32_WCE)
+#define DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS 1
+#else
+#error Target architecture was not detected as supported by Double-Conversion.
+#endif
+
+#if defined(__GNUC__)
+#define DOUBLE_CONVERSION_UNUSED __attribute__((unused))
+#else
+#define DOUBLE_CONVERSION_UNUSED
+#endif
+
+#if defined(_WIN32) && !defined(__MINGW32__)
+
+typedef signed char int8_t;
+typedef unsigned char uint8_t;
+typedef short int16_t; // NOLINT
+typedef unsigned short uint16_t; // NOLINT
+typedef int int32_t;
+typedef unsigned int uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+// intptr_t and friends are defined in crtdefs.h through stdio.h.
+
+#else
+
+#include <stdint.h>
+
+#endif
+
+typedef uint16_t uc16;
+
+// The following macro works on both 32 and 64-bit platforms.
+// Usage: instead of writing 0x1234567890123456
+// write UINT64_2PART_C(0x12345678,90123456);
+#define UINT64_2PART_C(a, b) (((static_cast<uint64_t>(a) << 32) + 0x##b##u))
+
+
+// The expression ARRAY_SIZE(a) is a compile-time constant of type
+// size_t which represents the number of elements of the given
+// array. You should only use ARRAY_SIZE on statically allocated
+// arrays.
+#ifndef ARRAY_SIZE
+#define ARRAY_SIZE(a) \
+ ((sizeof(a) / sizeof(*(a))) / \
+ static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
+#endif
+
+// A macro to disallow the evil copy constructor and operator= functions
+// This should be used in the private: declarations for a class
+#ifndef DISALLOW_COPY_AND_ASSIGN
+#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&); \
+ void operator=(const TypeName&)
+#endif
+
+// A macro to disallow all the implicit constructors, namely the
+// default constructor, copy constructor and operator= functions.
+//
+// This should be used in the private: declarations for a class
+// that wants to prevent anyone from instantiating it. This is
+// especially useful for classes containing only static methods.
+#ifndef DISALLOW_IMPLICIT_CONSTRUCTORS
+#define DISALLOW_IMPLICIT_CONSTRUCTORS(TypeName) \
+ TypeName(); \
+ DISALLOW_COPY_AND_ASSIGN(TypeName)
+#endif
+
+namespace double_conversion {
+
+static const int kCharSize = sizeof(char);
+
+// Returns the maximum of the two parameters.
+template <typename T>
+static T Max(T a, T b) {
+ return a < b ? b : a;
+}
+
+
+// Returns the minimum of the two parameters.
+template <typename T>
+static T Min(T a, T b) {
+ return a < b ? a : b;
+}
+
+
+inline int StrLength(const char* string) {
+ size_t length = strlen(string);
+ ASSERT(length == static_cast<size_t>(static_cast<int>(length)));
+ return static_cast<int>(length);
+}
+
+// This is a simplified version of V8's Vector class.
+template <typename T>
+class Vector {
+ public:
+ Vector() : start_(NULL), length_(0) {}
+ Vector(T* data, int length) : start_(data), length_(length) {
+ ASSERT(length == 0 || (length > 0 && data != NULL));
+ }
+
+ // Returns a vector using the same backing storage as this one,
+ // spanning from and including 'from', to but not including 'to'.
+ Vector<T> SubVector(int from, int to) {
+ ASSERT(to <= length_);
+ ASSERT(from < to);
+ ASSERT(0 <= from);
+ return Vector<T>(start() + from, to - from);
+ }
+
+ // Returns the length of the vector.
+ int length() const { return length_; }
+
+ // Returns whether or not the vector is empty.
+ bool is_empty() const { return length_ == 0; }
+
+ // Returns the pointer to the start of the data in the vector.
+ T* start() const { return start_; }
+
+ // Access individual vector elements - checks bounds in debug mode.
+ T& operator[](int index) const {
+ ASSERT(0 <= index && index < length_);
+ return start_[index];
+ }
+
+ T& first() { return start_[0]; }
+
+ T& last() { return start_[length_ - 1]; }
+
+ private:
+ T* start_;
+ int length_;
+};
+
+
+// Helper class for building result strings in a character buffer. The
+// purpose of the class is to use safe operations that checks the
+// buffer bounds on all operations in debug mode.
+class StringBuilder {
+ public:
+ StringBuilder(char* buffer, int size)
+ : buffer_(buffer, size), position_(0) { }
+
+ ~StringBuilder() { if (!is_finalized()) Finalize(); }
+
+ int size() const { return buffer_.length(); }
+
+ // Get the current position in the builder.
+ int position() const {
+ ASSERT(!is_finalized());
+ return position_;
+ }
+
+ // Reset the position.
+ void Reset() { position_ = 0; }
+
+ // Add a single character to the builder. It is not allowed to add
+ // 0-characters; use the Finalize() method to terminate the string
+ // instead.
+ void AddCharacter(char c) {
+ ASSERT(c != '\0');
+ ASSERT(!is_finalized() && position_ < buffer_.length());
+ buffer_[position_++] = c;
+ }
+
+ // Add an entire string to the builder. Uses strlen() internally to
+ // compute the length of the input string.
+ void AddString(const char* s) {
+ AddSubstring(s, StrLength(s));
+ }
+
+ // Add the first 'n' characters of the given string 's' to the
+ // builder. The input string must have enough characters.
+ void AddSubstring(const char* s, int n) {
+ ASSERT(!is_finalized() && position_ + n < buffer_.length());
+ ASSERT(static_cast<size_t>(n) <= strlen(s));
+ memmove(&buffer_[position_], s, n * kCharSize);
+ position_ += n;
+ }
+
+
+ // Add character padding to the builder. If count is non-positive,
+ // nothing is added to the builder.
+ void AddPadding(char c, int count) {
+ for (int i = 0; i < count; i++) {
+ AddCharacter(c);
+ }
+ }
+
+ // Finalize the string by 0-terminating it and returning the buffer.
+ char* Finalize() {
+ ASSERT(!is_finalized() && position_ < buffer_.length());
+ buffer_[position_] = '\0';
+ // Make sure nobody managed to add a 0-character to the
+ // buffer while building the string.
+ ASSERT(strlen(buffer_.start()) == static_cast<size_t>(position_));
+ position_ = -1;
+ ASSERT(is_finalized());
+ return buffer_.start();
+ }
+
+ private:
+ Vector<char> buffer_;
+ int position_;
+
+ bool is_finalized() const { return position_ < 0; }
+
+ DISALLOW_IMPLICIT_CONSTRUCTORS(StringBuilder);
+};
+
+// The type-based aliasing rule allows the compiler to assume that pointers of
+// different types (for some definition of different) never alias each other.
+// Thus the following code does not work:
+//
+// float f = foo();
+// int fbits = *(int*)(&f);
+//
+// The compiler 'knows' that the int pointer can't refer to f since the types
+// don't match, so the compiler may cache f in a register, leaving random data
+// in fbits. Using C++ style casts makes no difference, however a pointer to
+// char data is assumed to alias any other pointer. This is the 'memcpy
+// exception'.
+//
+// Bit_cast uses the memcpy exception to move the bits from a variable of one
+// type of a variable of another type. Of course the end result is likely to
+// be implementation dependent. Most compilers (gcc-4.2 and MSVC 2005)
+// will completely optimize BitCast away.
+//
+// There is an additional use for BitCast.
+// Recent gccs will warn when they see casts that may result in breakage due to
+// the type-based aliasing rule. If you have checked that there is no breakage
+// you can use BitCast to cast one pointer type to another. This confuses gcc
+// enough that it can no longer see that you have cast one pointer type to
+// another thus avoiding the warning.
+template <class Dest, class Source>
+inline Dest BitCast(const Source& source) {
+ // Compile time assertion: sizeof(Dest) == sizeof(Source)
+ // A compile error here means your Dest and Source have different sizes.
+ DOUBLE_CONVERSION_UNUSED
+ typedef char VerifySizesAreEqual[sizeof(Dest) == sizeof(Source) ? 1 : -1];
+
+ Dest dest;
+ memmove(&dest, &source, sizeof(dest));
+ return dest;
+}
+
+template <class Dest, class Source>
+inline Dest BitCast(Source* source) {
+ return BitCast<Dest>(reinterpret_cast<uintptr_t>(source));
+}
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_UTILS_H_
diff --git a/src/3rdparty/double-conversion/strtod.cc b/src/3rdparty/double-conversion/strtod.cc
new file mode 100644
index 0000000000..34717562bd
--- /dev/null
+++ b/src/3rdparty/double-conversion/strtod.cc
@@ -0,0 +1,555 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#include <stdarg.h>
+#include <limits.h>
+
+#include "strtod.h"
+#include "bignum.h"
+#include "cached-powers.h"
+#include "ieee.h"
+
+namespace double_conversion {
+
+// 2^53 = 9007199254740992.
+// Any integer with at most 15 decimal digits will hence fit into a double
+// (which has a 53bit significand) without loss of precision.
+static const int kMaxExactDoubleIntegerDecimalDigits = 15;
+// 2^64 = 18446744073709551616 > 10^19
+static const int kMaxUint64DecimalDigits = 19;
+
+// Max double: 1.7976931348623157 x 10^308
+// Min non-zero double: 4.9406564584124654 x 10^-324
+// Any x >= 10^309 is interpreted as +infinity.
+// Any x <= 10^-324 is interpreted as 0.
+// Note that 2.5e-324 (despite being smaller than the min double) will be read
+// as non-zero (equal to the min non-zero double).
+static const int kMaxDecimalPower = 309;
+static const int kMinDecimalPower = -324;
+
+// 2^64 = 18446744073709551616
+static const uint64_t kMaxUint64 = UINT64_2PART_C(0xFFFFFFFF, FFFFFFFF);
+
+
+static const double exact_powers_of_ten[] = {
+ 1.0, // 10^0
+ 10.0,
+ 100.0,
+ 1000.0,
+ 10000.0,
+ 100000.0,
+ 1000000.0,
+ 10000000.0,
+ 100000000.0,
+ 1000000000.0,
+ 10000000000.0, // 10^10
+ 100000000000.0,
+ 1000000000000.0,
+ 10000000000000.0,
+ 100000000000000.0,
+ 1000000000000000.0,
+ 10000000000000000.0,
+ 100000000000000000.0,
+ 1000000000000000000.0,
+ 10000000000000000000.0,
+ 100000000000000000000.0, // 10^20
+ 1000000000000000000000.0,
+ // 10^22 = 0x21e19e0c9bab2400000 = 0x878678326eac9 * 2^22
+ 10000000000000000000000.0
+};
+static const int kExactPowersOfTenSize = ARRAY_SIZE(exact_powers_of_ten);
+
+// Maximum number of significant digits in the decimal representation.
+// In fact the value is 772 (see conversions.cc), but to give us some margin
+// we round up to 780.
+static const int kMaxSignificantDecimalDigits = 780;
+
+static Vector<const char> TrimLeadingZeros(Vector<const char> buffer) {
+ for (int i = 0; i < buffer.length(); i++) {
+ if (buffer[i] != '0') {
+ return buffer.SubVector(i, buffer.length());
+ }
+ }
+ return Vector<const char>(buffer.start(), 0);
+}
+
+
+static Vector<const char> TrimTrailingZeros(Vector<const char> buffer) {
+ for (int i = buffer.length() - 1; i >= 0; --i) {
+ if (buffer[i] != '0') {
+ return buffer.SubVector(0, i + 1);
+ }
+ }
+ return Vector<const char>(buffer.start(), 0);
+}
+
+
+static void CutToMaxSignificantDigits(Vector<const char> buffer,
+ int exponent,
+ char* significant_buffer,
+ int* significant_exponent) {
+ for (int i = 0; i < kMaxSignificantDecimalDigits - 1; ++i) {
+ significant_buffer[i] = buffer[i];
+ }
+ // The input buffer has been trimmed. Therefore the last digit must be
+ // different from '0'.
+ ASSERT(buffer[buffer.length() - 1] != '0');
+ // Set the last digit to be non-zero. This is sufficient to guarantee
+ // correct rounding.
+ significant_buffer[kMaxSignificantDecimalDigits - 1] = '1';
+ *significant_exponent =
+ exponent + (buffer.length() - kMaxSignificantDecimalDigits);
+}
+
+
+// Trims the buffer and cuts it to at most kMaxSignificantDecimalDigits.
+// If possible the input-buffer is reused, but if the buffer needs to be
+// modified (due to cutting), then the input needs to be copied into the
+// buffer_copy_space.
+static void TrimAndCut(Vector<const char> buffer, int exponent,
+ char* buffer_copy_space, int space_size,
+ Vector<const char>* trimmed, int* updated_exponent) {
+ Vector<const char> left_trimmed = TrimLeadingZeros(buffer);
+ Vector<const char> right_trimmed = TrimTrailingZeros(left_trimmed);
+ exponent += left_trimmed.length() - right_trimmed.length();
+ if (right_trimmed.length() > kMaxSignificantDecimalDigits) {
+ (void) space_size; // Mark variable as used.
+ ASSERT(space_size >= kMaxSignificantDecimalDigits);
+ CutToMaxSignificantDigits(right_trimmed, exponent,
+ buffer_copy_space, updated_exponent);
+ *trimmed = Vector<const char>(buffer_copy_space,
+ kMaxSignificantDecimalDigits);
+ } else {
+ *trimmed = right_trimmed;
+ *updated_exponent = exponent;
+ }
+}
+
+
+// Reads digits from the buffer and converts them to a uint64.
+// Reads in as many digits as fit into a uint64.
+// When the string starts with "1844674407370955161" no further digit is read.
+// Since 2^64 = 18446744073709551616 it would still be possible read another
+// digit if it was less or equal than 6, but this would complicate the code.
+static uint64_t ReadUint64(Vector<const char> buffer,
+ int* number_of_read_digits) {
+ uint64_t result = 0;
+ int i = 0;
+ while (i < buffer.length() && result <= (kMaxUint64 / 10 - 1)) {
+ int digit = buffer[i++] - '0';
+ ASSERT(0 <= digit && digit <= 9);
+ result = 10 * result + digit;
+ }
+ *number_of_read_digits = i;
+ return result;
+}
+
+
+// Reads a DiyFp from the buffer.
+// The returned DiyFp is not necessarily normalized.
+// If remaining_decimals is zero then the returned DiyFp is accurate.
+// Otherwise it has been rounded and has error of at most 1/2 ulp.
+static void ReadDiyFp(Vector<const char> buffer,
+ DiyFp* result,
+ int* remaining_decimals) {
+ int read_digits;
+ uint64_t significand = ReadUint64(buffer, &read_digits);
+ if (buffer.length() == read_digits) {
+ *result = DiyFp(significand, 0);
+ *remaining_decimals = 0;
+ } else {
+ // Round the significand.
+ if (buffer[read_digits] >= '5') {
+ significand++;
+ }
+ // Compute the binary exponent.
+ int exponent = 0;
+ *result = DiyFp(significand, exponent);
+ *remaining_decimals = buffer.length() - read_digits;
+ }
+}
+
+
+static bool DoubleStrtod(Vector<const char> trimmed,
+ int exponent,
+ double* result) {
+#if !defined(DOUBLE_CONVERSION_CORRECT_DOUBLE_OPERATIONS)
+ // On x86 the floating-point stack can be 64 or 80 bits wide. If it is
+ // 80 bits wide (as is the case on Linux) then double-rounding occurs and the
+ // result is not accurate.
+ // We know that Windows32 uses 64 bits and is therefore accurate.
+ // Note that the ARM simulator is compiled for 32bits. It therefore exhibits
+ // the same problem.
+ return false;
+#endif
+ if (trimmed.length() <= kMaxExactDoubleIntegerDecimalDigits) {
+ int read_digits;
+ // The trimmed input fits into a double.
+ // If the 10^exponent (resp. 10^-exponent) fits into a double too then we
+ // can compute the result-double simply by multiplying (resp. dividing) the
+ // two numbers.
+ // This is possible because IEEE guarantees that floating-point operations
+ // return the best possible approximation.
+ if (exponent < 0 && -exponent < kExactPowersOfTenSize) {
+ // 10^-exponent fits into a double.
+ *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
+ ASSERT(read_digits == trimmed.length());
+ *result /= exact_powers_of_ten[-exponent];
+ return true;
+ }
+ if (0 <= exponent && exponent < kExactPowersOfTenSize) {
+ // 10^exponent fits into a double.
+ *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
+ ASSERT(read_digits == trimmed.length());
+ *result *= exact_powers_of_ten[exponent];
+ return true;
+ }
+ int remaining_digits =
+ kMaxExactDoubleIntegerDecimalDigits - trimmed.length();
+ if ((0 <= exponent) &&
+ (exponent - remaining_digits < kExactPowersOfTenSize)) {
+ // The trimmed string was short and we can multiply it with
+ // 10^remaining_digits. As a result the remaining exponent now fits
+ // into a double too.
+ *result = static_cast<double>(ReadUint64(trimmed, &read_digits));
+ ASSERT(read_digits == trimmed.length());
+ *result *= exact_powers_of_ten[remaining_digits];
+ *result *= exact_powers_of_ten[exponent - remaining_digits];
+ return true;
+ }
+ }
+ return false;
+}
+
+
+// Returns 10^exponent as an exact DiyFp.
+// The given exponent must be in the range [1; kDecimalExponentDistance[.
+static DiyFp AdjustmentPowerOfTen(int exponent) {
+ ASSERT(0 < exponent);
+ ASSERT(exponent < PowersOfTenCache::kDecimalExponentDistance);
+ // Simply hardcode the remaining powers for the given decimal exponent
+ // distance.
+ ASSERT(PowersOfTenCache::kDecimalExponentDistance == 8);
+ switch (exponent) {
+ case 1: return DiyFp(UINT64_2PART_C(0xa0000000, 00000000), -60);
+ case 2: return DiyFp(UINT64_2PART_C(0xc8000000, 00000000), -57);
+ case 3: return DiyFp(UINT64_2PART_C(0xfa000000, 00000000), -54);
+ case 4: return DiyFp(UINT64_2PART_C(0x9c400000, 00000000), -50);
+ case 5: return DiyFp(UINT64_2PART_C(0xc3500000, 00000000), -47);
+ case 6: return DiyFp(UINT64_2PART_C(0xf4240000, 00000000), -44);
+ case 7: return DiyFp(UINT64_2PART_C(0x98968000, 00000000), -40);
+ default:
+ UNREACHABLE();
+ }
+}
+
+
+// If the function returns true then the result is the correct double.
+// Otherwise it is either the correct double or the double that is just below
+// the correct double.
+static bool DiyFpStrtod(Vector<const char> buffer,
+ int exponent,
+ double* result) {
+ DiyFp input;
+ int remaining_decimals;
+ ReadDiyFp(buffer, &input, &remaining_decimals);
+ // Since we may have dropped some digits the input is not accurate.
+ // If remaining_decimals is different than 0 than the error is at most
+ // .5 ulp (unit in the last place).
+ // We don't want to deal with fractions and therefore keep a common
+ // denominator.
+ const int kDenominatorLog = 3;
+ const int kDenominator = 1 << kDenominatorLog;
+ // Move the remaining decimals into the exponent.
+ exponent += remaining_decimals;
+ int error = (remaining_decimals == 0 ? 0 : kDenominator / 2);
+
+ int old_e = input.e();
+ input.Normalize();
+ error <<= old_e - input.e();
+
+ ASSERT(exponent <= PowersOfTenCache::kMaxDecimalExponent);
+ if (exponent < PowersOfTenCache::kMinDecimalExponent) {
+ *result = 0.0;
+ return true;
+ }
+ DiyFp cached_power;
+ int cached_decimal_exponent;
+ PowersOfTenCache::GetCachedPowerForDecimalExponent(exponent,
+ &cached_power,
+ &cached_decimal_exponent);
+
+ if (cached_decimal_exponent != exponent) {
+ int adjustment_exponent = exponent - cached_decimal_exponent;
+ DiyFp adjustment_power = AdjustmentPowerOfTen(adjustment_exponent);
+ input.Multiply(adjustment_power);
+ if (kMaxUint64DecimalDigits - buffer.length() >= adjustment_exponent) {
+ // The product of input with the adjustment power fits into a 64 bit
+ // integer.
+ ASSERT(DiyFp::kSignificandSize == 64);
+ } else {
+ // The adjustment power is exact. There is hence only an error of 0.5.
+ error += kDenominator / 2;
+ }
+ }
+
+ input.Multiply(cached_power);
+ // The error introduced by a multiplication of a*b equals
+ // error_a + error_b + error_a*error_b/2^64 + 0.5
+ // Substituting a with 'input' and b with 'cached_power' we have
+ // error_b = 0.5 (all cached powers have an error of less than 0.5 ulp),
+ // error_ab = 0 or 1 / kDenominator > error_a*error_b/ 2^64
+ int error_b = kDenominator / 2;
+ int error_ab = (error == 0 ? 0 : 1); // We round up to 1.
+ int fixed_error = kDenominator / 2;
+ error += error_b + error_ab + fixed_error;
+
+ old_e = input.e();
+ input.Normalize();
+ error <<= old_e - input.e();
+
+ // See if the double's significand changes if we add/subtract the error.
+ int order_of_magnitude = DiyFp::kSignificandSize + input.e();
+ int effective_significand_size =
+ Double::SignificandSizeForOrderOfMagnitude(order_of_magnitude);
+ int precision_digits_count =
+ DiyFp::kSignificandSize - effective_significand_size;
+ if (precision_digits_count + kDenominatorLog >= DiyFp::kSignificandSize) {
+ // This can only happen for very small denormals. In this case the
+ // half-way multiplied by the denominator exceeds the range of an uint64.
+ // Simply shift everything to the right.
+ int shift_amount = (precision_digits_count + kDenominatorLog) -
+ DiyFp::kSignificandSize + 1;
+ input.set_f(input.f() >> shift_amount);
+ input.set_e(input.e() + shift_amount);
+ // We add 1 for the lost precision of error, and kDenominator for
+ // the lost precision of input.f().
+ error = (error >> shift_amount) + 1 + kDenominator;
+ precision_digits_count -= shift_amount;
+ }
+ // We use uint64_ts now. This only works if the DiyFp uses uint64_ts too.
+ ASSERT(DiyFp::kSignificandSize == 64);
+ ASSERT(precision_digits_count < 64);
+ uint64_t one64 = 1;
+ uint64_t precision_bits_mask = (one64 << precision_digits_count) - 1;
+ uint64_t precision_bits = input.f() & precision_bits_mask;
+ uint64_t half_way = one64 << (precision_digits_count - 1);
+ precision_bits *= kDenominator;
+ half_way *= kDenominator;
+ DiyFp rounded_input(input.f() >> precision_digits_count,
+ input.e() + precision_digits_count);
+ if (precision_bits >= half_way + error) {
+ rounded_input.set_f(rounded_input.f() + 1);
+ }
+ // If the last_bits are too close to the half-way case than we are too
+ // inaccurate and round down. In this case we return false so that we can
+ // fall back to a more precise algorithm.
+
+ *result = Double(rounded_input).value();
+ if (half_way - error < precision_bits && precision_bits < half_way + error) {
+ // Too imprecise. The caller will have to fall back to a slower version.
+ // However the returned number is guaranteed to be either the correct
+ // double, or the next-lower double.
+ return false;
+ } else {
+ return true;
+ }
+}
+
+
+// Returns
+// - -1 if buffer*10^exponent < diy_fp.
+// - 0 if buffer*10^exponent == diy_fp.
+// - +1 if buffer*10^exponent > diy_fp.
+// Preconditions:
+// buffer.length() + exponent <= kMaxDecimalPower + 1
+// buffer.length() + exponent > kMinDecimalPower
+// buffer.length() <= kMaxDecimalSignificantDigits
+static int CompareBufferWithDiyFp(Vector<const char> buffer,
+ int exponent,
+ DiyFp diy_fp) {
+ ASSERT(buffer.length() + exponent <= kMaxDecimalPower + 1);
+ ASSERT(buffer.length() + exponent > kMinDecimalPower);
+ ASSERT(buffer.length() <= kMaxSignificantDecimalDigits);
+ // Make sure that the Bignum will be able to hold all our numbers.
+ // Our Bignum implementation has a separate field for exponents. Shifts will
+ // consume at most one bigit (< 64 bits).
+ // ln(10) == 3.3219...
+ ASSERT(((kMaxDecimalPower + 1) * 333 / 100) < Bignum::kMaxSignificantBits);
+ Bignum buffer_bignum;
+ Bignum diy_fp_bignum;
+ buffer_bignum.AssignDecimalString(buffer);
+ diy_fp_bignum.AssignUInt64(diy_fp.f());
+ if (exponent >= 0) {
+ buffer_bignum.MultiplyByPowerOfTen(exponent);
+ } else {
+ diy_fp_bignum.MultiplyByPowerOfTen(-exponent);
+ }
+ if (diy_fp.e() > 0) {
+ diy_fp_bignum.ShiftLeft(diy_fp.e());
+ } else {
+ buffer_bignum.ShiftLeft(-diy_fp.e());
+ }
+ return Bignum::Compare(buffer_bignum, diy_fp_bignum);
+}
+
+
+// Returns true if the guess is the correct double.
+// Returns false, when guess is either correct or the next-lower double.
+static bool ComputeGuess(Vector<const char> trimmed, int exponent,
+ double* guess) {
+ if (trimmed.length() == 0) {
+ *guess = 0.0;
+ return true;
+ }
+ if (exponent + trimmed.length() - 1 >= kMaxDecimalPower) {
+ *guess = Double::Infinity();
+ return true;
+ }
+ if (exponent + trimmed.length() <= kMinDecimalPower) {
+ *guess = 0.0;
+ return true;
+ }
+
+ if (DoubleStrtod(trimmed, exponent, guess) ||
+ DiyFpStrtod(trimmed, exponent, guess)) {
+ return true;
+ }
+ if (*guess == Double::Infinity()) {
+ return true;
+ }
+ return false;
+}
+
+double Strtod(Vector<const char> buffer, int exponent) {
+ char copy_buffer[kMaxSignificantDecimalDigits];
+ Vector<const char> trimmed;
+ int updated_exponent;
+ TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits,
+ &trimmed, &updated_exponent);
+ exponent = updated_exponent;
+
+ double guess;
+ bool is_correct = ComputeGuess(trimmed, exponent, &guess);
+ if (is_correct) return guess;
+
+ DiyFp upper_boundary = Double(guess).UpperBoundary();
+ int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary);
+ if (comparison < 0) {
+ return guess;
+ } else if (comparison > 0) {
+ return Double(guess).NextDouble();
+ } else if ((Double(guess).Significand() & 1) == 0) {
+ // Round towards even.
+ return guess;
+ } else {
+ return Double(guess).NextDouble();
+ }
+}
+
+float Strtof(Vector<const char> buffer, int exponent) {
+ char copy_buffer[kMaxSignificantDecimalDigits];
+ Vector<const char> trimmed;
+ int updated_exponent;
+ TrimAndCut(buffer, exponent, copy_buffer, kMaxSignificantDecimalDigits,
+ &trimmed, &updated_exponent);
+ exponent = updated_exponent;
+
+ double double_guess;
+ bool is_correct = ComputeGuess(trimmed, exponent, &double_guess);
+
+ float float_guess = static_cast<float>(double_guess);
+ if (float_guess == double_guess) {
+ // This shortcut triggers for integer values.
+ return float_guess;
+ }
+
+ // We must catch double-rounding. Say the double has been rounded up, and is
+ // now a boundary of a float, and rounds up again. This is why we have to
+ // look at previous too.
+ // Example (in decimal numbers):
+ // input: 12349
+ // high-precision (4 digits): 1235
+ // low-precision (3 digits):
+ // when read from input: 123
+ // when rounded from high precision: 124.
+ // To do this we simply look at the neigbors of the correct result and see
+ // if they would round to the same float. If the guess is not correct we have
+ // to look at four values (since two different doubles could be the correct
+ // double).
+
+ double double_next = Double(double_guess).NextDouble();
+ double double_previous = Double(double_guess).PreviousDouble();
+
+ float f1 = static_cast<float>(double_previous);
+ float f2 = float_guess;
+ float f3 = static_cast<float>(double_next);
+ float f4;
+ if (is_correct) {
+ f4 = f3;
+ } else {
+ double double_next2 = Double(double_next).NextDouble();
+ f4 = static_cast<float>(double_next2);
+ }
+ (void) f2; // Mark variable as used.
+ ASSERT(f1 <= f2 && f2 <= f3 && f3 <= f4);
+
+ // If the guess doesn't lie near a single-precision boundary we can simply
+ // return its float-value.
+ if (f1 == f4) {
+ return float_guess;
+ }
+
+ ASSERT((f1 != f2 && f2 == f3 && f3 == f4) ||
+ (f1 == f2 && f2 != f3 && f3 == f4) ||
+ (f1 == f2 && f2 == f3 && f3 != f4));
+
+ // guess and next are the two possible canditates (in the same way that
+ // double_guess was the lower candidate for a double-precision guess).
+ float guess = f1;
+ float next = f4;
+ DiyFp upper_boundary;
+ if (guess == 0.0f) {
+ float min_float = 1e-45f;
+ upper_boundary = Double(static_cast<double>(min_float) / 2).AsDiyFp();
+ } else {
+ upper_boundary = Single(guess).UpperBoundary();
+ }
+ int comparison = CompareBufferWithDiyFp(trimmed, exponent, upper_boundary);
+ if (comparison < 0) {
+ return guess;
+ } else if (comparison > 0) {
+ return next;
+ } else if ((Single(guess).Significand() & 1) == 0) {
+ // Round towards even.
+ return guess;
+ } else {
+ return next;
+ }
+}
+
+} // namespace double_conversion
diff --git a/src/3rdparty/double-conversion/strtod.h b/src/3rdparty/double-conversion/strtod.h
new file mode 100644
index 0000000000..ed0293b8f5
--- /dev/null
+++ b/src/3rdparty/double-conversion/strtod.h
@@ -0,0 +1,45 @@
+// Copyright 2010 the V8 project authors. All rights reserved.
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following
+// disclaimer in the documentation and/or other materials provided
+// with the distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived
+// from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "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 COPYRIGHT
+// OWNER OR CONTRIBUTORS 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.
+
+#ifndef DOUBLE_CONVERSION_STRTOD_H_
+#define DOUBLE_CONVERSION_STRTOD_H_
+
+#include "utils.h"
+
+namespace double_conversion {
+
+// The buffer must only contain digits in the range [0-9]. It must not
+// contain a dot or a sign. It must not start with '0', and must not be empty.
+double Strtod(Vector<const char> buffer, int exponent);
+
+// The buffer must only contain digits in the range [0-9]. It must not
+// contain a dot or a sign. It must not start with '0', and must not be empty.
+float Strtof(Vector<const char> buffer, int exponent);
+
+} // namespace double_conversion
+
+#endif // DOUBLE_CONVERSION_STRTOD_H_
diff --git a/src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch b/src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch
new file mode 100644
index 0000000000..2d92cfffa7
--- /dev/null
+++ b/src/3rdparty/sqlite/0001-Fixing-the-SQLite3-build-for-WEC2013-again.patch
@@ -0,0 +1,33 @@
+From c7bbe85015995c1e0627d88bac6fd5715b1338a0 Mon Sep 17 00:00:00 2001
+From: Bjoern Breitmeyer <bjoern.breitmeyer@kdab.com>
+Date: Fri, 3 Jul 2015 14:08:04 +0200
+Subject: [PATCH] Fixing the SQLite3 build for WEC2013 again.
+
+The new version broke the build again
+-> fix it again.
+
+Change-Id: I75761d134d97a2784f1de5076412aa814fdf9bcd
+---
+ src/3rdparty/sqlite/sqlite3.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c
+index 71f6c10..040a9e1 100644
+--- a/src/3rdparty/sqlite/sqlite3.c
++++ b/src/3rdparty/sqlite/sqlite3.c
+@@ -15474,9 +15474,11 @@ static void clearYMD_HMS_TZ(DateTime *p){
+ #define HAVE_LOCALTIME_S 1
+ #endif
+
+-#if defined(_WIN32_WCE)
++#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
+ #undef HAVE_LOCALTIME_S
+ struct tm *__cdecl localtime(const time_t *t);
++#elif defined(_WIN32_WCE) && _WIN32_WCE >= 0x800
++# define SQLITE_MSVC_LOCALTIME_API 1
+ #endif
+
+ #ifndef SQLITE_OMIT_LOCALTIME
+--
+1.8.1.msysgit.1
+
diff --git a/src/3rdparty/sqlite/sqlite3.c b/src/3rdparty/sqlite/sqlite3.c
index 06f6d154f1..65379a822d 100644
--- a/src/3rdparty/sqlite/sqlite3.c
+++ b/src/3rdparty/sqlite/sqlite3.c
@@ -15742,9 +15742,11 @@ static void clearYMD_HMS_TZ(DateTime *p){
#define HAVE_LOCALTIME_S 1
#endif
-#if defined(_WIN32_WCE)
+#if defined(_WIN32_WCE) && _WIN32_WCE < 0x800
#undef HAVE_LOCALTIME_S
struct tm *__cdecl localtime(const time_t *t);
+#elif defined(_WIN32_WCE) && _WIN32_WCE >= 0x800
+# define SQLITE_MSVC_LOCALTIME_API 1
#endif
#ifndef SQLITE_OMIT_LOCALTIME
diff --git a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
index 445896622a..f1a5e105ad 100644
--- a/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
+++ b/src/android/jar/src/org/qtproject/qt5/android/QtActivityDelegate.java
@@ -887,6 +887,23 @@ public class QtActivityDelegate
} catch (Exception e) {
e.printStackTrace();
}
+
+ // if splash screen is defined, then show it
+ // Note: QtActivity handles settting the splash screen
+ // in onCreate, change that too if you are changing
+ // how the splash screen should be displayed
+ try {
+ if (m_surfaces.size() == 0) {
+ ActivityInfo info = m_activity.getPackageManager().getActivityInfo(m_activity.getComponentName(), PackageManager.GET_META_DATA);
+ if (info.metaData.containsKey("android.app.splash_screen_drawable"))
+ m_activity.getWindow().setBackgroundDrawableResource(info.metaData.getInt("android.app.splash_screen_drawable"));
+ else
+ m_activity.getWindow().setBackgroundDrawable(new ColorDrawable(0xff000000));
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
int rotation = m_activity.getWindowManager().getDefaultDisplay().getRotation();
if (rotation != m_currentRotation) {
QtNative.handleOrientationChanged(rotation, m_nativeOrientation);
diff --git a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
index 146d6b34f2..e6527c440a 100644
--- a/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
+++ b/src/android/java/src/org/qtproject/qt5/android/bindings/QtActivity.java
@@ -886,6 +886,9 @@ public class QtActivity extends Activity
if (null == getLastNonConfigurationInstance()) {
// if splash screen is defined, then show it
+ // Note: QtActivityDelegate handles updating the splash screen
+ // in onConfigurationChanged, change that too if you are changing
+ // how the splash screen should be displayed
if (m_activityInfo.metaData.containsKey("android.app.splash_screen_drawable"))
getWindow().setBackgroundDrawableResource(m_activityInfo.metaData.getInt("android.app.splash_screen_drawable"));
else
diff --git a/src/corelib/global/qcompilerdetection.h b/src/corelib/global/qcompilerdetection.h
index 2ff75d7561..57745a2fdf 100644
--- a/src/corelib/global/qcompilerdetection.h
+++ b/src/corelib/global/qcompilerdetection.h
@@ -1112,6 +1112,37 @@
#endif
/*
+ * SG10's SD-6 feature detection and some useful extensions from Clang and GCC
+ * https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations
+ * http://clang.llvm.org/docs/LanguageExtensions.html#feature-checking-macros
+ */
+#ifdef __has_builtin
+# define QT_HAS_BUILTIN(x) __has_builtin(x)
+#else
+# define QT_HAS_BUILTIN(x) 0
+#endif
+#ifdef __has_attribute
+# define QT_HAS_ATTRIBUTE(x) __has_attribute(x)
+#else
+# define QT_HAS_ATTRIBUTE(x) 0
+#endif
+#ifdef __has_cpp_attribute
+# define QT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
+#else
+# define QT_HAS_CPP_ATTRIBUTE(x) 0
+#endif
+#ifdef __has_include
+# define QT_HAS_INCLUDE(x) __has_include(x)
+#else
+# define QT_HAS_INCLUDE(x) 0
+#endif
+#ifdef __has_include_next
+# define QT_HAS_INCLUDE_NEXT(x) __has_include_next(x)
+#else
+# define QT_HAS_INCLUDE_NEXT(x) 0
+#endif
+
+/*
* Warning/diagnostic handling
*/
diff --git a/src/corelib/global/qendian.h b/src/corelib/global/qendian.h
index 2ddefaec8b..dd0e5a7e5a 100644
--- a/src/corelib/global/qendian.h
+++ b/src/corelib/global/qendian.h
@@ -87,12 +87,6 @@ template <typename T> inline T qFromUnaligned(const uchar *src)
*/
template <typename T> T qbswap(T source);
-#ifdef __has_builtin
-# define QT_HAS_BUILTIN(x) __has_builtin(x)
-#else
-# define QT_HAS_BUILTIN(x) 0
-#endif
-
// GCC 4.3 implemented all the intrinsics, but the 16-bit one only got implemented in 4.8;
// Clang 2.6 implemented the 32- and 64-bit but waited until 3.2 to implement the 16-bit one
#if (defined(Q_CC_GNU) && Q_CC_GNU >= 403) || QT_HAS_BUILTIN(__builtin_bswap32)
@@ -154,8 +148,6 @@ template <> inline quint16 qbswap<quint16>(quint16 source)
}
#endif // GCC & Clang intrinsics
-#undef QT_HAS_BUILTIN
-
// signed specializations
template <> inline qint64 qbswap<qint64>(qint64 source)
{
diff --git a/src/corelib/global/qglobal.cpp b/src/corelib/global/qglobal.cpp
index ed8a9163d4..8397b31818 100644
--- a/src/corelib/global/qglobal.cpp
+++ b/src/corelib/global/qglobal.cpp
@@ -1183,30 +1183,35 @@ bool qSharedBuild() Q_DECL_NOTHROW
\macro Q_OS_DARWIN
\relates <QtGlobal>
- Defined on Darwin-based operating systems such as OS X and iOS,
- including any open source version(s) of Darwin.
+ Defined on Darwin-based operating systems such as OS X, iOS, watchOS, and tvOS.
*/
/*!
- \macro Q_OS_MAC
+ \macro Q_OS_OSX
\relates <QtGlobal>
- Defined on Darwin-based operating systems distributed by Apple, which
- currently includes OS X and iOS, but not the open source versions of Darwin.
+ Defined on OS X.
*/
/*!
- \macro Q_OS_OSX
+ \macro Q_OS_IOS
\relates <QtGlobal>
- Defined on OS X.
+ Defined on iOS.
*/
/*!
- \macro Q_OS_IOS
+ \macro Q_OS_WATCHOS
\relates <QtGlobal>
- Defined on iOS.
+ Defined on watchOS.
+ */
+
+/*!
+ \macro Q_OS_TVOS
+ \relates <QtGlobal>
+
+ Defined on tvOS.
*/
/*!
diff --git a/src/corelib/global/qhooks.cpp b/src/corelib/global/qhooks.cpp
index 382f45f592..40a7c88f13 100644
--- a/src/corelib/global/qhooks.cpp
+++ b/src/corelib/global/qhooks.cpp
@@ -37,7 +37,7 @@ QT_BEGIN_NAMESPACE
// Only add to the end, and bump version if you do.
quintptr Q_CORE_EXPORT qtHookData[] = {
- 2, // hook data version
+ 3, // hook data version
QHooks::LastHookIndex, // size of qtHookData
QT_VERSION,
@@ -52,6 +52,15 @@ quintptr Q_CORE_EXPORT qtHookData[] = {
0,
// Startup, void(*)(), called once QCoreApplication is operational
+ 0,
+
+ // TypeInformationVersion, an integral value, bumped whenever private
+ // object sizes or member offsets that are used in Qt Creator's
+ // data structure "pretty printing" change.
+ //
+ // The required sizes and offsets are tested in tests/auto/other/toolsupport.
+ // When this fails and the change was intentional, adjust the test and
+ // adjust this value here.
0
};
diff --git a/src/corelib/global/qhooks_p.h b/src/corelib/global/qhooks_p.h
index 3ff4980abe..2beb58f8a7 100644
--- a/src/corelib/global/qhooks_p.h
+++ b/src/corelib/global/qhooks_p.h
@@ -61,6 +61,7 @@ enum HookIndex {
AddQObject = 3,
RemoveQObject = 4,
Startup = 5,
+ TypeInformationVersion = 6,
LastHookIndex
};
diff --git a/src/corelib/global/qlogging.cpp b/src/corelib/global/qlogging.cpp
index 20c31f7ef8..47591a3fa8 100644
--- a/src/corelib/global/qlogging.cpp
+++ b/src/corelib/global/qlogging.cpp
@@ -75,17 +75,13 @@
# include "private/qcore_unix_p.h"
#endif
-#ifndef __has_include
-# define __has_include(x) 0
-#endif
-
#ifndef QT_BOOTSTRAPPED
#if !defined QT_NO_REGULAREXPRESSION
# ifdef __UCLIBC__
# if __UCLIBC_HAS_BACKTRACE__
# define QLOGGING_HAVE_BACKTRACE
# endif
-# elif (defined(__GLIBC__) && defined(__GLIBCXX__)) || (__has_include(<cxxabi.h>) && __has_include(<execinfo.h>))
+# elif (defined(__GLIBC__) && defined(__GLIBCXX__)) || (QT_HAS_INCLUDE(<cxxabi.h>) && QT_HAS_INCLUDE(<execinfo.h>))
# define QLOGGING_HAVE_BACKTRACE
# endif
#endif
@@ -94,7 +90,7 @@
extern char *__progname;
#endif
-#if defined(Q_OS_LINUX) && (defined(__GLIBC__) || __has_include(<sys/syscall.h>))
+#if defined(Q_OS_LINUX) && (defined(__GLIBC__) || QT_HAS_INCLUDE(<sys/syscall.h>))
# include <sys/syscall.h>
static long qt_gettid()
{
diff --git a/src/corelib/global/qnamespace.h b/src/corelib/global/qnamespace.h
index c4f5415a01..45594d1914 100644
--- a/src/corelib/global/qnamespace.h
+++ b/src/corelib/global/qnamespace.h
@@ -482,7 +482,8 @@ public:
AA_DontShowIconsInMenus = 2,
AA_NativeWindows = 3,
AA_DontCreateNativeWidgetSiblings = 4,
- AA_MacPluginApplication = 5,
+ AA_PluginApplication = 5,
+ AA_MacPluginApplication = AA_PluginApplication, // ### Qt 6: remove me
AA_DontUseNativeMenuBar = 6,
AA_MacDontSwapCtrlAndMeta = 7,
AA_Use96Dpi = 8,
@@ -498,6 +499,7 @@ public:
AA_SetPalette = 19,
AA_EnableHighDpiScaling = 20,
AA_DisableHighDpiScaling = 21,
+ AA_UseStyleSheetPropagationInWidgetStyles = 22, // ### Qt 6: remove me
// Add new attributes before this line
AA_AttributeCount
diff --git a/src/corelib/global/qnamespace.qdoc b/src/corelib/global/qnamespace.qdoc
index e789daafbd..df376405e0 100644
--- a/src/corelib/global/qnamespace.qdoc
+++ b/src/corelib/global/qnamespace.qdoc
@@ -120,13 +120,21 @@
widgets stay non-native unless specifically set by the
Qt::WA_NativeWindow attribute.
- \value AA_MacPluginApplication Stops the Qt mac application from doing
- specific initializations that do not necessarily make sense when using Qt
- to author a plugin. This includes avoiding loading our nib for the main
- menu and not taking possession of the native menu bar. When setting this
+ \value AA_PluginApplication Indicates that Qt is used to author a plugin. Depending
+ on the operating system, it suppresses specific initializations that do not
+ necessarily make sense in the plugin case.
+
+ For example on OS X, this includes avoiding loading our nib for the main
+ menu and not taking possession of the native menu bar. Setting this
attribute to true will also set the AA_DontUseNativeMenuBar attribute
to true. It also disables native event filters.
+ This attribute has been added in Qt 5.7. It must be set before
+ \l {QGuiApplication}{Q(Gui)Application} is constructed.
+
+ \value AA_MacPluginApplication This attribute has been deprecated.
+ Use AA_PluginApplication instead.
+
\value AA_DontUseNativeMenuBar All menubars created while this attribute is
set to true won't be used as a native menubar (e.g, the menubar at
the top of the main screen on OS X or at the bottom in Windows CE).
@@ -217,6 +225,13 @@
environment variable to 0. This value has been added in Qt 5.6. This
attribute must be set before Q(Gui)Application is constructed.
+ \value AA_UseStyleSheetPropagationInWidgetStyles By default, Qt Style Sheets
+ disable regular QWidget palette and font propagation. When this flag
+ is enabled, font and palette changes propagate as though the user had
+ manually called the corresponding QWidget methods. See
+ \l{The Style Sheet Syntax#Inheritance}{The Style Sheet Syntax - Inheritance}
+ for more details. This value has been added in Qt 5.7.
+
The following values are obsolete:
\value AA_ImmediateWidgetCreation This attribute is no longer fully
diff --git a/src/corelib/global/qnumeric_p.h b/src/corelib/global/qnumeric_p.h
index e5f9d8e13e..b56cdef939 100644
--- a/src/corelib/global/qnumeric_p.h
+++ b/src/corelib/global/qnumeric_p.h
@@ -47,7 +47,7 @@
//
#include "QtCore/qglobal.h"
-
+#include <cmath>
#include <limits>
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE)
@@ -56,12 +56,57 @@
# include <immintrin.h> // for _addcarry_u<nn>
#endif
-#ifndef __has_builtin
-# define __has_builtin(x) 0
+#if defined(Q_CC_MSVC)
+#include <float.h>
+#endif
+
+#if !defined(Q_CC_MSVC) && (defined(Q_OS_QNX) || !defined(__cplusplus) || __cplusplus < 201103L)
+#include <math.h>
+QT_BEGIN_NAMESPACE
+namespace qnumeric_std_wrapper {
+// the 'using namespace std' below is cases where the stdlib already put the math.h functions in the std namespace and undefined the macros.
+static inline bool math_h_isnan(double d) { using namespace std; return isnan(d); }
+static inline bool math_h_isinf(double d) { using namespace std; return isinf(d); }
+static inline bool math_h_isfinite(double d) { using namespace std; return isfinite(d); }
+static inline bool math_h_isnan(float f) { using namespace std; return isnan(f); }
+static inline bool math_h_isinf(float f) { using namespace std; return isinf(f); }
+static inline bool math_h_isfinite(float f) { using namespace std; return isfinite(f); }
+}
+QT_END_NAMESPACE
+// These macros from math.h conflict with the real functions in the std namespace.
+#undef signbit
+#undef isnan
+#undef isinf
+#undef isfinite
#endif
QT_BEGIN_NAMESPACE
+namespace qnumeric_std_wrapper {
+#if defined(Q_CC_MSVC) && _MSC_VER < 1800
+static inline bool isnan(double d) { return !!_isnan(d); }
+static inline bool isinf(double d) { return !_finite(d) && !_isnan(d); }
+static inline bool isfinite(double d) { return !!_finite(d); }
+static inline bool isnan(float f) { return !!_isnanf(f); }
+static inline bool isinf(float f) { return !_finitef(f) && !_isnan(f); }
+static inline bool isfinite(float f) { return !!_finite(f); }
+#elif !defined(Q_CC_MSVC) && (defined(Q_OS_QNX) || !defined(__cplusplus) || __cplusplus < 201103L)
+static inline bool isnan(double d) { return math_h_isnan(d); }
+static inline bool isinf(double d) { return math_h_isinf(d); }
+static inline bool isfinite(double d) { return math_h_isfinite(d); }
+static inline bool isnan(float f) { return math_h_isnan(f); }
+static inline bool isinf(float f) { return math_h_isinf(f); }
+static inline bool isfinite(float f) { return math_h_isfinite(f); }
+#else
+static inline bool isnan(double d) { return std::isnan(d); }
+static inline bool isinf(double d) { return std::isinf(d); }
+static inline bool isfinite(double d) { return std::isfinite(d); }
+static inline bool isnan(float f) { return std::isnan(f); }
+static inline bool isinf(float f) { return std::isinf(f); }
+static inline bool isfinite(float f) { return std::isfinite(f); }
+#endif
+}
+
#if !defined(Q_CC_MIPS)
static const union { unsigned char c[8]; double d; } qt_be_inf_bytes = { { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 } };
@@ -143,62 +188,32 @@ static inline double qt_qnan()
static inline bool qt_is_inf(double d)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] == 0xf0;
- } else {
- return (ch[7] & 0x7f) == 0x7f && ch[6] == 0xf0;
- }
+ return qnumeric_std_wrapper::isinf(d);
}
static inline bool qt_is_nan(double d)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] > 0xf0;
- } else {
- return (ch[7] & 0x7f) == 0x7f && ch[6] > 0xf0;
- }
+ return qnumeric_std_wrapper::isnan(d);
}
static inline bool qt_is_finite(double d)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) != 0x7f || (ch[1] & 0xf0) != 0xf0;
- } else {
- return (ch[7] & 0x7f) != 0x7f || (ch[6] & 0xf0) != 0xf0;
- }
+ return qnumeric_std_wrapper::isfinite(d);
}
-static inline bool qt_is_inf(float d)
+static inline bool qt_is_inf(float f)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] == 0x80;
- } else {
- return (ch[3] & 0x7f) == 0x7f && ch[2] == 0x80;
- }
+ return qnumeric_std_wrapper::isinf(f);
}
-static inline bool qt_is_nan(float d)
+static inline bool qt_is_nan(float f)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) == 0x7f && ch[1] > 0x80;
- } else {
- return (ch[3] & 0x7f) == 0x7f && ch[2] > 0x80;
- }
+ return qnumeric_std_wrapper::isnan(f);
}
-static inline bool qt_is_finite(float d)
+static inline bool qt_is_finite(float f)
{
- uchar *ch = (uchar *)&d;
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ch[0] & 0x7f) != 0x7f || (ch[1] & 0x80) != 0x80;
- } else {
- return (ch[3] & 0x7f) != 0x7f || (ch[2] & 0x80) != 0x80;
- }
+ return qnumeric_std_wrapper::isfinite(f);
}
//
@@ -230,28 +245,28 @@ mul_overflow(T v1, T v2, T *r)
#endif
// GCC 5 and Clang have builtins to detect overflows
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_uadd_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_uadd_overflow)
template <> inline bool add_overflow(unsigned v1, unsigned v2, unsigned *r)
{ return __builtin_uadd_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_uaddl_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_uaddl_overflow)
template <> inline bool add_overflow(unsigned long v1, unsigned long v2, unsigned long *r)
{ return __builtin_uaddl_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_uaddll_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_uaddll_overflow)
template <> inline bool add_overflow(unsigned long long v1, unsigned long long v2, unsigned long long *r)
{ return __builtin_uaddll_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_umul_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_umul_overflow)
template <> inline bool mul_overflow(unsigned v1, unsigned v2, unsigned *r)
{ return __builtin_umul_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_umull_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_umull_overflow)
template <> inline bool mul_overflow(unsigned long v1, unsigned long v2, unsigned long *r)
{ return __builtin_umull_overflow(v1, v2, r); }
#endif
-#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || __has_builtin(__builtin_umulll_overflow)
+#if (defined(Q_CC_GNU) && !defined(Q_CC_INTEL) && Q_CC_GNU >= 500) || QT_HAS_BUILTIN(__builtin_umulll_overflow)
template <> inline bool mul_overflow(unsigned long long v1, unsigned long long v2, unsigned long long *r)
{ return __builtin_umulll_overflow(v1, v2, r); }
# define HAVE_MUL64_OVERFLOW
diff --git a/src/corelib/global/qsystemdetection.h b/src/corelib/global/qsystemdetection.h
index 751c6a9a0e..9ca376b84a 100644
--- a/src/corelib/global/qsystemdetection.h
+++ b/src/corelib/global/qsystemdetection.h
@@ -41,10 +41,11 @@
/*
The operating system, must be one of: (Q_OS_x)
- DARWIN - Any Darwin system
- MAC - OS X and iOS
+ DARWIN - Any Darwin system (OS X, iOS, watchOS, tvOS)
OSX - OS X
IOS - iOS
+ WATCHOS - watchOS
+ TVOS - tvOS
MSDOS - MS-DOS and Windows
OS2 - OS/2
OS2EMX - XFree86 on OS/2 (not PM)
@@ -87,12 +88,32 @@
*/
#if defined(__APPLE__) && (defined(__GNUC__) || defined(__xlC__) || defined(__xlc__))
-# define Q_OS_DARWIN
-# define Q_OS_BSD4
-# ifdef __LP64__
-# define Q_OS_DARWIN64
+# include <TargetConditionals.h>
+# if defined(TARGET_OS_MAC) && TARGET_OS_MAC
+# define Q_OS_DARWIN
+# define Q_OS_BSD4
+# ifdef __LP64__
+# define Q_OS_DARWIN64
+# else
+# define Q_OS_DARWIN32
+# endif
+# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
+# if defined(TARGET_OS_TV) && TARGET_OS_TV
+# define Q_OS_TVOS
+# elif defined(TARGET_OS_WATCH) && TARGET_OS_WATCH
+# define Q_OS_WATCHOS
+# else
+# // TARGET_OS_IOS is only available in newer SDKs,
+# // so assume any other iOS-based platform is iOS for now
+# define Q_OS_IOS
+# endif
+# else
+# // there is no "real" OS X define (rdar://22640089),
+# // assume any non iOS-based platform is OS X for now
+# define Q_OS_OSX
+# endif
# else
-# define Q_OS_DARWIN32
+# error "Qt has not been ported to this Apple platform - see http://www.qt.io/developers"
# endif
#elif defined(__ANDROID__) || defined(ANDROID)
# define Q_OS_ANDROID
@@ -181,28 +202,26 @@
# define Q_OS_WIN
#endif
-#if defined(Q_OS_DARWIN)
-# define Q_OS_MAC
-# if defined(Q_OS_DARWIN64)
-# define Q_OS_MAC64
-# elif defined(Q_OS_DARWIN32)
-# define Q_OS_MAC32
-# endif
-# include <TargetConditionals.h>
-# if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
-# define Q_OS_IOS
-# elif defined(TARGET_OS_MAC) && TARGET_OS_MAC
-# define Q_OS_OSX
-# define Q_OS_MACX // compatibility synonym
-# endif
-#endif
-
#if defined(Q_OS_WIN)
# undef Q_OS_UNIX
#elif !defined(Q_OS_UNIX)
# define Q_OS_UNIX
#endif
+// Compatibility synonyms
+#ifdef Q_OS_DARWIN
+#define Q_OS_MAC
+#endif
+#ifdef Q_OS_DARWIN32
+#define Q_OS_MAC32
+#endif
+#ifdef Q_OS_DARWIN64
+#define Q_OS_MAC64
+#endif
+#ifdef Q_OS_OSX
+#define Q_OS_MACX
+#endif
+
#ifdef Q_OS_DARWIN
# include <Availability.h>
# include <AvailabilityMacros.h>
diff --git a/src/corelib/global/qtypeinfo.h b/src/corelib/global/qtypeinfo.h
index b42e5998fc..cd0a83ae80 100644
--- a/src/corelib/global/qtypeinfo.h
+++ b/src/corelib/global/qtypeinfo.h
@@ -276,13 +276,25 @@ Q_DECLARE_TYPEINFO(double, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(long double, Q_PRIMITIVE_TYPE);
#endif
+
#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)
-// We can't do it now because it would break BC on QList<char32_t>
+// ### Qt 6: remove the other branch
+// This was required so that QList<T> for these types allocates out of the array storage
+# ifdef Q_COMPILER_UNICODE_STRINGS
Q_DECLARE_TYPEINFO(char16_t, Q_PRIMITIVE_TYPE);
Q_DECLARE_TYPEINFO(char32_t, Q_PRIMITIVE_TYPE);
+# endif
# if !defined(Q_CC_MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
Q_DECLARE_TYPEINFO(wchar_t, Q_PRIMITIVE_TYPE);
# endif
+#else
+# ifdef Q_COMPILER_UNICODE_STRINGS
+Q_DECLARE_TYPEINFO(char16_t, Q_RELOCATABLE_TYPE);
+Q_DECLARE_TYPEINFO(char32_t, Q_RELOCATABLE_TYPE);
+# endif
+# if !defined(Q_CC_MSVC) || defined(_NATIVE_WCHAR_T_DEFINED)
+Q_DECLARE_TYPEINFO(wchar_t, Q_RELOCATABLE_TYPE);
+# endif
#endif // Qt 6
QT_END_NAMESPACE
diff --git a/src/corelib/io/io.pri b/src/corelib/io/io.pri
index b2bcbdf727..7be1e5883e 100644
--- a/src/corelib/io/io.pri
+++ b/src/corelib/io/io.pri
@@ -149,20 +149,14 @@ win32 {
}
freebsd: LIBS_PRIVATE += -lutil # qlockfile_unix.cpp requires this
mac {
+ SOURCES += io/qstorageinfo_mac.cpp
+ OBJECTIVE_SOURCES += io/qstandardpaths_mac.mm
osx {
OBJECTIVE_SOURCES += io/qfilesystemwatcher_fsevents.mm
HEADERS += io/qfilesystemwatcher_fsevents_p.h
- }
- macx {
- SOURCES += io/qstorageinfo_mac.cpp
- OBJECTIVE_SOURCES += io/qstandardpaths_mac.mm
LIBS += -framework DiskArbitration -framework IOKit
} else:ios {
- OBJECTIVE_SOURCES += io/qstandardpaths_ios.mm
- SOURCES += io/qstorageinfo_mac.cpp
LIBS += -framework MobileCoreServices
- } else {
- SOURCES += io/qstandardpaths_unix.cpp
}
} else:blackberry {
SOURCES += \
diff --git a/src/corelib/io/qdatastream.cpp b/src/corelib/io/qdatastream.cpp
index 675178ea80..c32df4c8a6 100644
--- a/src/corelib/io/qdatastream.cpp
+++ b/src/corelib/io/qdatastream.cpp
@@ -527,6 +527,7 @@ void QDataStream::setByteOrder(ByteOrder bo)
\value Qt_5_4 Version 16 (Qt 5.4)
\value Qt_5_5 Same as Qt_5_4
\value Qt_5_6 Version 17 (Qt 5.6)
+ \value Qt_5_7 Same as Qt_5_6
\omitvalue Qt_DefaultCompiledVersion
\sa setVersion(), version()
diff --git a/src/corelib/io/qdatastream.h b/src/corelib/io/qdatastream.h
index 5730c12907..744829c659 100644
--- a/src/corelib/io/qdatastream.h
+++ b/src/corelib/io/qdatastream.h
@@ -84,10 +84,11 @@ public:
Qt_5_4 = 16,
Qt_5_5 = Qt_5_4,
Qt_5_6 = 17,
-#if QT_VERSION >= 0x050700
+ Qt_5_7 = Qt_5_6,
+#if QT_VERSION >= 0x050800
#error Add the datastream version for this Qt version and update Qt_DefaultCompiledVersion
#endif
- Qt_DefaultCompiledVersion = Qt_5_6
+ Qt_DefaultCompiledVersion = Qt_5_7
};
enum ByteOrder {
diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp
index 3b1cd196d2..ce6225266a 100644
--- a/src/corelib/io/qiodevice.cpp
+++ b/src/corelib/io/qiodevice.cpp
@@ -670,7 +670,7 @@ bool QIODevice::seek(qint64 pos)
// operation will then refill the buffer. We can optimize this, if we
// find that seeking backwards becomes a significant performance hit.
d->buffer.clear();
- else if (!d->buffer.isEmpty())
+ else
d->buffer.skip(offset);
#if defined QIODEVICE_DEBUG
diff --git a/src/corelib/io/qprocess.cpp b/src/corelib/io/qprocess.cpp
index 8fbe96adb9..3539c75548 100644
--- a/src/corelib/io/qprocess.cpp
+++ b/src/corelib/io/qprocess.cpp
@@ -1186,7 +1186,7 @@ bool QProcessPrivate::_q_startupNotification()
}
q->setProcessState(QProcess::NotRunning);
- setErrorAndEmit(QProcess::FailedToStart);
+ setErrorAndEmit(QProcess::FailedToStart, errorString); // the error string was already set
#ifdef Q_OS_UNIX
// make sure the process manager removes this entry
waitForDeadChild();
diff --git a/src/corelib/io/qprocess_unix.cpp b/src/corelib/io/qprocess_unix.cpp
index 63480dfc6b..a958aa4322 100644
--- a/src/corelib/io/qprocess_unix.cpp
+++ b/src/corelib/io/qprocess_unix.cpp
@@ -672,6 +672,7 @@ void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv
qt_safe_close(childStartedPipe[0]);
// enter the working directory
+ const char *callthatfailed = "chdir: ";
if (workingDir && QT_CHDIR(workingDir) == -1) {
// failed, stop the process
goto report_errno;
@@ -683,6 +684,7 @@ void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv
// execute the process
if (!envp) {
qt_safe_execvp(argv[0], argv);
+ callthatfailed = "execvp: ";
} else {
if (path) {
char **arg = path;
@@ -700,15 +702,19 @@ void QProcessPrivate::execChild(const char *workingDir, char **path, char **argv
#endif
qt_safe_execve(argv[0], argv, envp);
}
+ callthatfailed = "execve: ";
}
// notify failure
+ // we're running in the child process, so we don't need to be thread-safe;
+ // we can use strerror
report_errno:
- QString error = qt_error_string(errno);
+ const char *msg = strerror(errno);
#if defined (QPROCESS_DEBUG)
- fprintf(stderr, "QProcessPrivate::execChild() failed (%s), notifying parent process\n", qPrintable(error));
+ fprintf(stderr, "QProcessPrivate::execChild() failed (%s), notifying parent process\n", msg);
#endif
- qt_safe_write(childStartedPipe[1], error.data(), error.length() * sizeof(QChar));
+ qt_safe_write(childStartedPipe[1], callthatfailed, strlen(callthatfailed));
+ qt_safe_write(childStartedPipe[1], msg, strlen(msg));
qt_safe_close(childStartedPipe[1]);
childStartedPipe[1] = -1;
}
@@ -716,8 +722,15 @@ report_errno:
bool QProcessPrivate::processStarted()
{
- ushort buf[errorBufferMax];
- int i = qt_safe_read(childStartedPipe[0], &buf, sizeof buf);
+ char buf[errorBufferMax];
+ int i = 0;
+ int ret;
+ do {
+ ret = qt_safe_read(childStartedPipe[0], buf + i, sizeof buf - i);
+ if (ret > 0)
+ i += ret;
+ } while (ret > 0 && i < int(sizeof buf));
+
if (startupSocketNotifier) {
startupSocketNotifier->setEnabled(false);
startupSocketNotifier->deleteLater();
@@ -732,7 +745,7 @@ bool QProcessPrivate::processStarted()
// did we read an error message?
if (i > 0)
- q_func()->setErrorString(QString((const QChar *)buf, i / sizeof(QChar)));
+ q_func()->setErrorString(QString::fromLocal8Bit(buf, i));
return i <= 0;
}
diff --git a/src/corelib/io/qsettings.cpp b/src/corelib/io/qsettings.cpp
index 0c44582af8..3460753fbe 100644
--- a/src/corelib/io/qsettings.cpp
+++ b/src/corelib/io/qsettings.cpp
@@ -2413,14 +2413,24 @@ void QConfFileSettingsPrivate::ensureSectionParsed(QConfFile *confFile,
This enum type specifies the storage format used by QSettings.
- \value NativeFormat Store the settings using the most
- appropriate storage format for the platform.
- On Windows, this means the system registry;
- on OS X and iOS, this means the CFPreferences
- API; on Unix, this means textual
- configuration files in INI format.
- \value IniFormat Store the settings in INI files.
- \value InvalidFormat Special value returned by registerFormat().
+ \value NativeFormat Store the settings using the most
+ appropriate storage format for the platform.
+ On Windows, this means the system registry;
+ on OS X and iOS, this means the CFPreferences
+ API; on Unix, this means textual
+ configuration files in INI format.
+ \value Registry32Format Windows only: Explicitly access the 32-bit system registry
+ from a 64-bit application running on 64-bit Windows.
+ On 32-bit Windows or from a 32-bit application on 64-bit Windows,
+ this works the same as specifying NativeFormat.
+ This enum value was added in Qt 5.7.
+ \value Registry64Format Windows only: Explicitly access the 64-bit system registry
+ from a 32-bit application running on 64-bit Windows.
+ On 32-bit Windows or from a 64-bit application on 64-bit Windows,
+ this works the same as specifying NativeFormat.
+ This enum value was added in Qt 5.7.
+ \value IniFormat Store the settings in INI files.
+ \value InvalidFormat Special value returned by registerFormat().
\omitvalue CustomFormat1
\omitvalue CustomFormat2
\omitvalue CustomFormat3
diff --git a/src/corelib/io/qsettings.h b/src/corelib/io/qsettings.h
index 8f41273ffa..dd0c4a9bfb 100644
--- a/src/corelib/io/qsettings.h
+++ b/src/corelib/io/qsettings.h
@@ -79,6 +79,11 @@ public:
NativeFormat,
IniFormat,
+#ifdef Q_OS_WIN
+ Registry32Format,
+ Registry64Format,
+#endif
+
InvalidFormat = 16,
CustomFormat1,
CustomFormat2,
diff --git a/src/corelib/io/qsettings_win.cpp b/src/corelib/io/qsettings_win.cpp
index 1546219c3b..88f58422a8 100644
--- a/src/corelib/io/qsettings_win.cpp
+++ b/src/corelib/io/qsettings_win.cpp
@@ -41,6 +41,18 @@
#include "qdebug.h"
#include <qt_windows.h>
+// See "Accessing an Alternate Registry View" at:
+// http://msdn.microsoft.com/en-us/library/aa384129%28VS.85%29.aspx
+#ifndef KEY_WOW64_64KEY
+ // Access a 32-bit key from either a 32-bit or 64-bit application.
+# define KEY_WOW64_64KEY 0x0100
+#endif
+
+#ifndef KEY_WOW64_32KEY
+ // Access a 64-bit key from either a 32-bit or 64-bit application.
+# define KEY_WOW64_32KEY 0x0200
+#endif
+
QT_BEGIN_NAMESPACE
/* Keys are stored in QStrings. If the variable name starts with 'u', this is a "user"
@@ -135,12 +147,13 @@ static QString errorCodeToString(DWORD errorCode)
return result;
}
-// Open a key with the specified perms
-static HKEY openKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey)
+// Open a key with the specified "perms".
+// "access" is to explicitly use the 32- or 64-bit branch.
+static HKEY openKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey, REGSAM access = 0)
{
HKEY resultHandle = 0;
LONG res = RegOpenKeyEx(parentHandle, reinterpret_cast<const wchar_t *>(rSubKey.utf16()),
- 0, perms, &resultHandle);
+ 0, perms | access, &resultHandle);
if (res == ERROR_SUCCESS)
return resultHandle;
@@ -148,17 +161,18 @@ static HKEY openKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey)
return 0;
}
-// Open a key with the specified perms, create it if it does not exist
-static HKEY createOrOpenKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey)
+// Open a key with the specified "perms", create it if it does not exist.
+// "access" is to explicitly use the 32- or 64-bit branch.
+static HKEY createOrOpenKey(HKEY parentHandle, REGSAM perms, const QString &rSubKey, REGSAM access = 0)
{
// try to open it
- HKEY resultHandle = openKey(parentHandle, perms, rSubKey);
+ HKEY resultHandle = openKey(parentHandle, perms, rSubKey, access);
if (resultHandle != 0)
return resultHandle;
// try to create it
LONG res = RegCreateKeyEx(parentHandle, reinterpret_cast<const wchar_t *>(rSubKey.utf16()), 0, 0,
- REG_OPTION_NON_VOLATILE, perms, 0, &resultHandle, 0);
+ REG_OPTION_NON_VOLATILE, perms | access, 0, &resultHandle, 0);
if (res == ERROR_SUCCESS)
return resultHandle;
@@ -169,11 +183,12 @@ static HKEY createOrOpenKey(HKEY parentHandle, REGSAM perms, const QString &rSub
return 0;
}
-// Open or create a key in read-write mode if possible, otherwise read-only
-static HKEY createOrOpenKey(HKEY parentHandle, const QString &rSubKey, bool *readOnly)
+// Open or create a key in read-write mode if possible, otherwise read-only.
+// "access" is to explicitly use the 32- or 64-bit branch.
+static HKEY createOrOpenKey(HKEY parentHandle, const QString &rSubKey, bool *readOnly, REGSAM access = 0)
{
// try to open or create it read/write
- HKEY resultHandle = createOrOpenKey(parentHandle, registryPermissions, rSubKey);
+ HKEY resultHandle = createOrOpenKey(parentHandle, registryPermissions, rSubKey, access);
if (resultHandle != 0) {
if (readOnly != 0)
*readOnly = false;
@@ -181,7 +196,7 @@ static HKEY createOrOpenKey(HKEY parentHandle, const QString &rSubKey, bool *rea
}
// try to open or create it read/only
- resultHandle = createOrOpenKey(parentHandle, KEY_READ, rSubKey);
+ resultHandle = createOrOpenKey(parentHandle, KEY_READ, rSubKey, access);
if (resultHandle != 0) {
if (readOnly != 0)
*readOnly = true;
@@ -247,9 +262,9 @@ static QStringList childKeysOrGroups(HKEY parentHandle, QSettingsPrivate::ChildS
return result;
}
-static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result)
+static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result, REGSAM access = 0)
{
- HKEY handle = openKey(parentHandle, KEY_READ, rSubKey);
+ HKEY handle = openKey(parentHandle, KEY_READ, rSubKey, access);
if (handle == 0)
return;
@@ -270,11 +285,11 @@ static void allKeys(HKEY parentHandle, const QString &rSubKey, NameSet *result)
if (!s.isEmpty())
s += QLatin1Char('\\');
s += childGroups.at(i);
- allKeys(parentHandle, s, result);
+ allKeys(parentHandle, s, result, access);
}
}
-static void deleteChildGroups(HKEY parentHandle)
+static void deleteChildGroups(HKEY parentHandle, REGSAM access = 0)
{
QStringList childGroups = childKeysOrGroups(parentHandle, QSettingsPrivate::ChildGroups);
@@ -282,10 +297,10 @@ static void deleteChildGroups(HKEY parentHandle)
QString group = childGroups.at(i);
// delete subgroups in group
- HKEY childGroupHandle = openKey(parentHandle, registryPermissions, group);
+ HKEY childGroupHandle = openKey(parentHandle, registryPermissions, group, access);
if (childGroupHandle == 0)
continue;
- deleteChildGroups(childGroupHandle);
+ deleteChildGroups(childGroupHandle, access);
RegCloseKey(childGroupHandle);
// delete group itself
@@ -305,7 +320,7 @@ static void deleteChildGroups(HKEY parentHandle)
class RegistryKey
{
public:
- RegistryKey(HKEY parent_handle = 0, const QString &key = QString(), bool read_only = true);
+ RegistryKey(HKEY parent_handle = 0, const QString &key = QString(), bool read_only = true, REGSAM access = 0);
QString key() const;
HKEY handle() const;
HKEY parentHandle() const;
@@ -316,13 +331,15 @@ private:
mutable HKEY m_handle;
QString m_key;
mutable bool m_read_only;
+ REGSAM m_access;
};
-RegistryKey::RegistryKey(HKEY parent_handle, const QString &key, bool read_only)
+RegistryKey::RegistryKey(HKEY parent_handle, const QString &key, bool read_only, REGSAM access)
: m_parent_handle(parent_handle),
m_handle(0),
m_key(key),
- m_read_only(read_only)
+ m_read_only(read_only),
+ m_access(access)
{
}
@@ -337,9 +354,9 @@ HKEY RegistryKey::handle() const
return m_handle;
if (m_read_only)
- m_handle = openKey(m_parent_handle, KEY_READ, m_key);
+ m_handle = openKey(m_parent_handle, KEY_READ, m_key, m_access);
else
- m_handle = createOrOpenKey(m_parent_handle, m_key, &m_read_only);
+ m_handle = createOrOpenKey(m_parent_handle, m_key, &m_read_only, m_access);
return m_handle;
}
@@ -371,8 +388,8 @@ class QWinSettingsPrivate : public QSettingsPrivate
{
public:
QWinSettingsPrivate(QSettings::Scope scope, const QString &organization,
- const QString &application);
- QWinSettingsPrivate(QString rKey);
+ const QString &application, REGSAM access = 0);
+ QWinSettingsPrivate(QString rKey, REGSAM access = 0);
~QWinSettingsPrivate();
void remove(const QString &uKey);
@@ -390,11 +407,13 @@ public:
private:
RegistryKeyList regList; // list of registry locations to search for keys
bool deleteWriteHandleOnExit;
+ REGSAM access;
};
QWinSettingsPrivate::QWinSettingsPrivate(QSettings::Scope scope, const QString &organization,
- const QString &application)
- : QSettingsPrivate(QSettings::NativeFormat, scope, organization, application)
+ const QString &application, REGSAM access)
+ : QSettingsPrivate(QSettings::NativeFormat, scope, organization, application),
+ access(access)
{
deleteWriteHandleOnExit = false;
@@ -405,23 +424,24 @@ QWinSettingsPrivate::QWinSettingsPrivate(QSettings::Scope scope, const QString &
if (scope == QSettings::UserScope) {
if (!application.isEmpty())
- regList.append(RegistryKey(HKEY_CURRENT_USER, appPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_CURRENT_USER, appPrefix, !regList.isEmpty(), access));
- regList.append(RegistryKey(HKEY_CURRENT_USER, orgPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_CURRENT_USER, orgPrefix, !regList.isEmpty(), access));
}
if (!application.isEmpty())
- regList.append(RegistryKey(HKEY_LOCAL_MACHINE, appPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_LOCAL_MACHINE, appPrefix, !regList.isEmpty(), access));
- regList.append(RegistryKey(HKEY_LOCAL_MACHINE, orgPrefix, !regList.isEmpty()));
+ regList.append(RegistryKey(HKEY_LOCAL_MACHINE, orgPrefix, !regList.isEmpty(), access));
}
if (regList.isEmpty())
setStatus(QSettings::AccessError);
}
-QWinSettingsPrivate::QWinSettingsPrivate(QString rPath)
- : QSettingsPrivate(QSettings::NativeFormat)
+QWinSettingsPrivate::QWinSettingsPrivate(QString rPath, REGSAM access)
+ : QSettingsPrivate(QSettings::NativeFormat),
+ access(access)
{
deleteWriteHandleOnExit = false;
@@ -460,9 +480,9 @@ QWinSettingsPrivate::QWinSettingsPrivate(QString rPath)
}
if (rPath.length() == keyLength)
- regList.append(RegistryKey(keyName, QString(), false));
+ regList.append(RegistryKey(keyName, QString(), false, access));
else if (rPath[keyLength] == QLatin1Char('\\'))
- regList.append(RegistryKey(keyName, rPath.mid(keyLength+1), false));
+ regList.append(RegistryKey(keyName, rPath.mid(keyLength+1), false, access));
}
bool QWinSettingsPrivate::readKey(HKEY parentHandle, const QString &rSubKey, QVariant *value) const
@@ -471,7 +491,7 @@ bool QWinSettingsPrivate::readKey(HKEY parentHandle, const QString &rSubKey, QVa
QString rSubkeyPath = keyPath(rSubKey);
// open a handle on the subkey
- HKEY handle = openKey(parentHandle, KEY_READ, rSubkeyPath);
+ HKEY handle = openKey(parentHandle, KEY_READ, rSubkeyPath, access);
if (handle == 0)
return false;
@@ -604,16 +624,16 @@ void QWinSettingsPrivate::remove(const QString &uKey)
// try to delete value bar in key foo
LONG res;
- HKEY handle = openKey(writeHandle(), registryPermissions, keyPath(rKey));
+ HKEY handle = openKey(writeHandle(), registryPermissions, keyPath(rKey), access);
if (handle != 0) {
res = RegDeleteValue(handle, reinterpret_cast<const wchar_t *>(keyName(rKey).utf16()));
RegCloseKey(handle);
}
// try to delete key foo/bar and all subkeys
- handle = openKey(writeHandle(), registryPermissions, rKey);
+ handle = openKey(writeHandle(), registryPermissions, rKey, access);
if (handle != 0) {
- deleteChildGroups(handle);
+ deleteChildGroups(handle, access);
if (rKey.isEmpty()) {
QStringList childKeys = childKeysOrGroups(handle, QSettingsPrivate::ChildKeys);
@@ -661,7 +681,7 @@ void QWinSettingsPrivate::set(const QString &uKey, const QVariant &value)
QString rKey = escapedKey(uKey);
- HKEY handle = createOrOpenKey(writeHandle(), registryPermissions, keyPath(rKey));
+ HKEY handle = createOrOpenKey(writeHandle(), registryPermissions, keyPath(rKey), access);
if (handle == 0) {
setStatus(QSettings::AccessError);
return;
@@ -775,13 +795,13 @@ QStringList QWinSettingsPrivate::children(const QString &uKey, ChildSpec spec) c
HKEY parent_handle = regList.at(i).handle();
if (parent_handle == 0)
continue;
- HKEY handle = openKey(parent_handle, KEY_READ, rKey);
+ HKEY handle = openKey(parent_handle, KEY_READ, rKey, access);
if (handle == 0)
continue;
if (spec == AllKeys) {
NameSet keys;
- allKeys(handle, QLatin1String(""), &keys);
+ allKeys(handle, QLatin1String(""), &keys, access);
mergeKeySets(&result, keys);
} else { // ChildGroups or ChildKeys
QStringList names = childKeysOrGroups(handle, spec);
@@ -836,20 +856,26 @@ bool QWinSettingsPrivate::isWritable() const
QSettingsPrivate *QSettingsPrivate::create(QSettings::Format format, QSettings::Scope scope,
const QString &organization, const QString &application)
{
- if (format == QSettings::NativeFormat) {
+ if (format == QSettings::NativeFormat)
return new QWinSettingsPrivate(scope, organization, application);
- } else {
+ else if (format == QSettings::Registry32Format)
+ return new QWinSettingsPrivate(scope, organization, application, KEY_WOW64_32KEY);
+ else if (format == QSettings::Registry64Format)
+ return new QWinSettingsPrivate(scope, organization, application, KEY_WOW64_64KEY);
+ else
return new QConfFileSettingsPrivate(format, scope, organization, application);
- }
}
QSettingsPrivate *QSettingsPrivate::create(const QString &fileName, QSettings::Format format)
{
- if (format == QSettings::NativeFormat) {
+ if (format == QSettings::NativeFormat)
return new QWinSettingsPrivate(fileName);
- } else {
+ else if (format == QSettings::Registry32Format)
+ return new QWinSettingsPrivate(fileName, KEY_WOW64_32KEY);
+ else if (format == QSettings::Registry64Format)
+ return new QWinSettingsPrivate(fileName, KEY_WOW64_64KEY);
+ else
return new QConfFileSettingsPrivate(fileName, format);
- }
}
QT_END_NAMESPACE
diff --git a/src/corelib/io/qstandardpaths.cpp b/src/corelib/io/qstandardpaths.cpp
index 8828e09e8f..0137e859e7 100644
--- a/src/corelib/io/qstandardpaths.cpp
+++ b/src/corelib/io/qstandardpaths.cpp
@@ -277,13 +277,13 @@ QT_BEGIN_NAMESPACE
\header \li Path type \li Android \li iOS
\row \li DesktopLocation
\li "<APPROOT>/files"
- \li "<APPROOT>/<APPDIR>" (not writable)
+ \li "<APPROOT>/Documents/Desktop"
\row \li DocumentsLocation
\li "<USER>/Documents", "<USER>/<APPNAME>/Documents"
\li "<APPROOT>/Documents"
\row \li FontsLocation
\li "/system/fonts" (not writable)
- \li "<APPROOT>/Documents/.fonts"
+ \li "<APPROOT>/Library/Fonts"
\row \li ApplicationsLocation
\li not supported (directory not readable)
\li not supported
@@ -301,7 +301,7 @@ QT_BEGIN_NAMESPACE
\li "<APPROOT>/tmp"
\row \li HomeLocation
\li "<APPROOT>/files"
- \li "<APPROOT>/<APPDIR>" (not writable)
+ \li "<APPROOT>" (not writable)
\row \li DataLocation
\li "<APPROOT>/files", "<USER>/<APPNAME>/files"
\li "<APPROOT>/Library/Application Support"
@@ -316,13 +316,13 @@ QT_BEGIN_NAMESPACE
\li not supported
\row \li ConfigLocation
\li "<APPROOT>/files/settings"
- \li "<APPROOT>/Documents"
+ \li "<APPROOT>/Library/Preferences"
\row \li GenericConfigLocation
\li "<APPROOT>/files/settings" (there is no shared settings)
- \li "<APPROOT>/Documents"
+ \li "<APPROOT>/Library/Preferences"
\row \li DownloadLocation
\li "<USER>/Downloads", "<USER>/<APPNAME>/Downloads"
- \li "<APPROOT>/Documents/Download"
+ \li "<APPROOT>/Documents/Downloads"
\row \li GenericCacheLocation
\li "<APPROOT>/cache" (there is no shared cache)
\li "<APPROOT>/Library/Caches"
@@ -331,7 +331,7 @@ QT_BEGIN_NAMESPACE
\li "<APPROOT>/Library/Application Support"
\row \li AppConfigLocation
\li "<APPROOT>/files/settings"
- \li "<APPROOT>/Documents"
+ \li "<APPROOT>/Library/Preferences/<APPNAME>"
\row \li AppLocalDataLocation
\li "<APPROOT>/files", "<USER>/<APPNAME>/files"
\li "<APPROOT>/Library/Application Support"
@@ -555,7 +555,7 @@ QString QStandardPaths::findExecutable(const QString &executableName, const QStr
an empty QString if no relevant location can be found.
*/
-#if !defined(Q_OS_OSX) && !defined(QT_BOOTSTRAPPED)
+#if !defined(Q_OS_MAC) && !defined(QT_BOOTSTRAPPED)
QString QStandardPaths::displayName(StandardLocation type)
{
switch (type) {
diff --git a/src/corelib/io/qstandardpaths_ios.mm b/src/corelib/io/qstandardpaths_ios.mm
deleted file mode 100644
index eb85e2fd23..0000000000
--- a/src/corelib/io/qstandardpaths_ios.mm
+++ /dev/null
@@ -1,133 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtCore module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#import <UIKit/UIKit.h>
-
-#include "qstandardpaths.h"
-
-#ifndef QT_NO_STANDARDPATHS
-
-QT_BEGIN_NAMESPACE
-
-static QString pathForDirectory(NSSearchPathDirectory directory)
-{
- return QString::fromNSString(
- [NSSearchPathForDirectoriesInDomains(directory, NSUserDomainMask, YES) lastObject]);
-}
-
-static QString bundlePath()
-{
- return QString::fromNSString([[NSBundle mainBundle] bundlePath]);
-}
-
-QString QStandardPaths::writableLocation(StandardLocation type)
-{
- QString location;
-
- switch (type) {
- case DocumentsLocation:
- location = pathForDirectory(NSDocumentDirectory);
- break;
- case FontsLocation:
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/.fonts");
- break;
- case ApplicationsLocation:
- // NSApplicationDirectory points to a non-existing write-protected path.
- break;
- case MusicLocation:
- // NSMusicDirectory points to a non-existing write-protected path. Use sensible fallback.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Music");
- break;
- case MoviesLocation:
- // NSMoviesDirectory points to a non-existing write-protected path. Use sensible fallback.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Movies");
- break;
- case PicturesLocation:
- // NSPicturesDirectory points to a non-existing write-protected path. Use sensible fallback.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Pictures");
- break;
- case TempLocation:
- location = QString::fromNSString(NSTemporaryDirectory());
- break;
- case DesktopLocation:
- case HomeLocation:
- location = bundlePath();
- break;
- case AppDataLocation:
- case AppLocalDataLocation:
- location = pathForDirectory(NSApplicationSupportDirectory);
- break;
- case GenericDataLocation:
- location = pathForDirectory(NSDocumentDirectory);
- break;
- case CacheLocation:
- case GenericCacheLocation:
- location = pathForDirectory(NSCachesDirectory);
- break;
- case ConfigLocation:
- case GenericConfigLocation:
- case AppConfigLocation:
- location = pathForDirectory(NSDocumentDirectory);
- break;
- case DownloadLocation:
- // NSDownloadsDirectory points to a non-existing write-protected path.
- location = pathForDirectory(NSDocumentDirectory) + QLatin1String("/Download");
- break;
- case RuntimeLocation:
- break;
- default:
- break;
- }
-
- return location;
-}
-
-QStringList QStandardPaths::standardLocations(StandardLocation type)
-{
- QStringList dirs;
-
- switch (type) {
- case PicturesLocation:
- dirs << writableLocation(PicturesLocation) << QLatin1String("assets-library://");
- break;
- default:
- dirs << writableLocation(type);
- break;
- }
-
- return dirs;
-}
-
-QT_END_NAMESPACE
-
-#endif // QT_NO_STANDARDPATHS
diff --git a/src/corelib/io/qstandardpaths_mac.mm b/src/corelib/io/qstandardpaths_mac.mm
index d6126ce1c3..57d365e916 100644
--- a/src/corelib/io/qstandardpaths_mac.mm
+++ b/src/corelib/io/qstandardpaths_mac.mm
@@ -32,6 +32,9 @@
****************************************************************************/
#include "qstandardpaths.h"
+
+#ifndef QT_NO_STANDARDPATHS
+
#include <qdir.h>
#include <qurl.h>
#include <private/qcore_mac_p.h>
@@ -40,63 +43,47 @@
#include <qcoreapplication.h>
#endif
-#include <CoreFoundation/CoreFoundation.h>
-#include <ApplicationServices/ApplicationServices.h>
+#import <Foundation/Foundation.h>
QT_BEGIN_NAMESPACE
-/*
- Translates a QStandardPaths::StandardLocation into the mac equivalent.
-*/
-OSType translateLocation(QStandardPaths::StandardLocation type)
+static QString pathForDirectory(NSSearchPathDirectory directory,
+ NSSearchPathDomainMask mask)
+{
+ return QString::fromNSString(
+ [NSSearchPathForDirectoriesInDomains(directory, mask, YES) lastObject]);
+}
+
+static NSSearchPathDirectory searchPathDirectory(QStandardPaths::StandardLocation type)
{
switch (type) {
- case QStandardPaths::ConfigLocation:
- case QStandardPaths::GenericConfigLocation:
- case QStandardPaths::AppConfigLocation:
- return kPreferencesFolderType;
case QStandardPaths::DesktopLocation:
- return kDesktopFolderType;
+ return NSDesktopDirectory;
case QStandardPaths::DocumentsLocation:
- return kDocumentsFolderType;
- case QStandardPaths::FontsLocation:
- // There are at least two different font directories on the mac: /Library/Fonts and ~/Library/Fonts.
- // To select a specific one we have to specify a different first parameter when calling FSFindFolder.
- return kFontsFolderType;
+ return NSDocumentDirectory;
case QStandardPaths::ApplicationsLocation:
- return kApplicationsFolderType;
+ return NSApplicationDirectory;
case QStandardPaths::MusicLocation:
- return kMusicDocumentsFolderType;
+ return NSMusicDirectory;
case QStandardPaths::MoviesLocation:
- return kMovieDocumentsFolderType;
+ return NSMoviesDirectory;
case QStandardPaths::PicturesLocation:
- return kPictureDocumentsFolderType;
- case QStandardPaths::TempLocation:
- return kTemporaryFolderType;
+ return NSPicturesDirectory;
case QStandardPaths::GenericDataLocation:
case QStandardPaths::RuntimeLocation:
case QStandardPaths::AppDataLocation:
case QStandardPaths::AppLocalDataLocation:
- return kApplicationSupportFolderType;
+ return NSApplicationSupportDirectory;
case QStandardPaths::GenericCacheLocation:
case QStandardPaths::CacheLocation:
- return kCachedDataFolderType;
+ return NSCachesDirectory;
+ case QStandardPaths::DownloadLocation:
+ return NSDownloadsDirectory;
default:
- return kDesktopFolderType;
+ return (NSSearchPathDirectory)0;
}
}
-/*
- Constructs a full unicode path from a FSRef.
-*/
-static QString getFullPath(const FSRef &ref)
-{
- QByteArray ba(2048, 0);
- if (FSRefMakePath(&ref, reinterpret_cast<UInt8 *>(ba.data()), ba.size()) == noErr)
- return QString::fromUtf8(ba.constData()).normalized(QString::NormalizationForm_C);
- return QString();
-}
-
static void appendOrganizationAndApp(QString &path)
{
#ifndef QT_BOOTSTRAPPED
@@ -111,28 +98,65 @@ static void appendOrganizationAndApp(QString &path)
#endif
}
-static QString macLocation(QStandardPaths::StandardLocation type, short domain)
+static QString baseWritableLocation(QStandardPaths::StandardLocation type,
+ NSSearchPathDomainMask mask = NSUserDomainMask,
+ bool appendOrgAndApp = false)
{
- // https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/index.html
- if (type == QStandardPaths::DownloadLocation) {
- NSFileManager *fileManager = [NSFileManager defaultManager];
- NSURL *url = [fileManager URLForDirectory:NSDownloadsDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
- if (!url)
- return QString();
- return QString::fromNSString([url path]);
+ QString path;
+ const NSSearchPathDirectory dir = searchPathDirectory(type);
+ switch (type) {
+ case QStandardPaths::HomeLocation:
+ path = QDir::homePath();
+ break;
+ case QStandardPaths::TempLocation:
+ path = QDir::tempPath();
+ break;
+#ifdef Q_OS_IOS
+ // These locations point to non-existing write-protected paths. Use sensible fallbacks.
+ case QStandardPaths::MusicLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Music");
+ break;
+ case QStandardPaths::MoviesLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Movies");
+ break;
+ case QStandardPaths::PicturesLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Pictures");
+ break;
+ case QStandardPaths::DownloadLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Downloads");
+ break;
+ case QStandardPaths::DesktopLocation:
+ path = pathForDirectory(NSDocumentDirectory, mask) + QLatin1String("/Desktop");
+ break;
+ case QStandardPaths::ApplicationsLocation:
+ break;
+#endif
+ case QStandardPaths::FontsLocation:
+ path = pathForDirectory(NSLibraryDirectory, mask) + QLatin1String("/Fonts");
+ break;
+ case QStandardPaths::ConfigLocation:
+ case QStandardPaths::GenericConfigLocation:
+ case QStandardPaths::AppConfigLocation:
+ path = pathForDirectory(NSLibraryDirectory, mask) + QLatin1String("/Preferences");
+ break;
+ default:
+ path = pathForDirectory(dir, mask);
+ break;
}
- // http://developer.apple.com/documentation/Carbon/Reference/Folder_Manager/Reference/reference.html
- FSRef ref;
- OSErr err = FSFindFolder(domain, translateLocation(type), false, &ref);
- if (err)
- return QString();
-
- QString path = getFullPath(ref);
+ if (appendOrgAndApp) {
+ switch (type) {
+ case QStandardPaths::AppDataLocation:
+ case QStandardPaths::AppLocalDataLocation:
+ case QStandardPaths::AppConfigLocation:
+ case QStandardPaths::CacheLocation:
+ appendOrganizationAndApp(path);
+ break;
+ default:
+ break;
+ }
+ }
- if (type == QStandardPaths::AppDataLocation || type == QStandardPaths::AppLocalDataLocation ||
- type == QStandardPaths::CacheLocation || type == QStandardPaths::AppConfigLocation)
- appendOrganizationAndApp(path);
return path;
}
@@ -167,31 +191,32 @@ QString QStandardPaths::writableLocation(StandardLocation type)
}
}
- switch (type) {
- case HomeLocation:
- return QDir::homePath();
- case TempLocation:
- return QDir::tempPath();
- case GenericDataLocation:
- case AppDataLocation:
- case AppLocalDataLocation:
- case GenericCacheLocation:
- case CacheLocation:
- case RuntimeLocation:
- return macLocation(type, kUserDomain);
- default:
- return macLocation(type, kOnAppropriateDisk);
- }
+ return baseWritableLocation(type, NSUserDomainMask, true);
}
QStringList QStandardPaths::standardLocations(StandardLocation type)
{
QStringList dirs;
- if (type == GenericDataLocation || type == AppDataLocation || type == AppLocalDataLocation || type == GenericCacheLocation || type == CacheLocation) {
- const QString path = macLocation(type, kOnAppropriateDisk);
- if (!path.isEmpty())
- dirs.append(path);
+#ifdef Q_OS_IOS
+ if (type == PicturesLocation)
+ dirs << writableLocation(PicturesLocation) << QLatin1String("assets-library://");
+#endif
+
+ if (type == GenericDataLocation || type == FontsLocation || type == ApplicationsLocation
+ || type == AppDataLocation || type == AppLocalDataLocation
+ || type == GenericCacheLocation || type == CacheLocation) {
+ QList<NSSearchPathDomainMask> masks;
+ masks << NSLocalDomainMask;
+ if (type == FontsLocation || type == GenericCacheLocation)
+ masks << NSSystemDomainMask;
+
+ for (QList<NSSearchPathDomainMask>::const_iterator it = masks.begin();
+ it != masks.end(); ++it) {
+ const QString path = baseWritableLocation(type, *it, true);
+ if (!path.isEmpty() && !dirs.contains(path))
+ dirs.append(path);
+ }
}
if (type == AppDataLocation || type == AppLocalDataLocation) {
@@ -219,28 +244,41 @@ QStringList QStandardPaths::standardLocations(StandardLocation type)
}
}
const QString localDir = writableLocation(type);
- dirs.prepend(localDir);
+ if (!localDir.isEmpty())
+ dirs.prepend(localDir);
return dirs;
}
#ifndef QT_BOOTSTRAPPED
QString QStandardPaths::displayName(StandardLocation type)
{
+ // Use "Home" instead of the user's Unix username
if (QStandardPaths::HomeLocation == type)
return QCoreApplication::translate("QStandardPaths", "Home");
- FSRef ref;
- OSErr err = FSFindFolder(kOnAppropriateDisk, translateLocation(type), false, &ref);
- if (err)
- return QString();
+ // The temporary directory returned by the old Carbon APIs is ~/Library/Caches/TemporaryItems,
+ // the display name of which ("TemporaryItems") isn't translated by the system. The standard
+ // temporary directory has no reasonable display name either, so use something more sensible.
+ if (QStandardPaths::TempLocation == type)
+ return QCoreApplication::translate("QStandardPaths", "Temporary Items");
- QCFString displayName;
- err = LSCopyDisplayNameForRef(&ref, &displayName);
- if (err)
- return QString();
+ // standardLocations() may return an empty list on some platforms
+ if (QStandardPaths::ApplicationsLocation == type)
+ return QCoreApplication::translate("QStandardPaths", "Applications");
- return static_cast<QString>(displayName);
+ if (QCFType<CFURLRef> url = CFURLCreateWithFileSystemPath(kCFAllocatorDefault,
+ standardLocations(type).first().toCFString(),
+ kCFURLPOSIXPathStyle, true)) {
+ QCFString name;
+ CFURLCopyResourcePropertyForKey(url, kCFURLLocalizedNameKey, &name, NULL);
+ if (name && CFStringGetLength(name))
+ return QString::fromCFString(name);
+ }
+
+ return QFileInfo(baseWritableLocation(type)).fileName();
}
#endif
QT_END_NAMESPACE
+
+#endif // QT_NO_STANDARDPATHS
diff --git a/src/corelib/kernel/qcoreapplication.cpp b/src/corelib/kernel/qcoreapplication.cpp
index 2719019d30..53725c7f90 100644
--- a/src/corelib/kernel/qcoreapplication.cpp
+++ b/src/corelib/kernel/qcoreapplication.cpp
@@ -2686,7 +2686,7 @@ void QCoreApplication::removeLibraryPath(const QString &path)
i.e. MSG or XCB event structs.
\note Native event filters will be disabled when the application the
- Qt::AA_MacPluginApplication attribute is set.
+ Qt::AA_PluginApplication attribute is set.
For maximum portability, you should always try to use QEvent
and QObject::installEventFilter() whenever possible.
@@ -2697,8 +2697,8 @@ void QCoreApplication::removeLibraryPath(const QString &path)
*/
void QCoreApplication::installNativeEventFilter(QAbstractNativeEventFilter *filterObj)
{
- if (QCoreApplication::testAttribute(Qt::AA_MacPluginApplication)) {
- qWarning("Native event filters are not applied when the Qt::AA_MacPluginApplication attribute is set");
+ if (QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
+ qWarning("Native event filters are not applied when the Qt::AA_PluginApplication attribute is set");
return;
}
diff --git a/src/corelib/kernel/qcoreevent.h b/src/corelib/kernel/qcoreevent.h
index 53da4a849b..d9de828fa1 100644
--- a/src/corelib/kernel/qcoreevent.h
+++ b/src/corelib/kernel/qcoreevent.h
@@ -276,6 +276,8 @@ public:
PlatformSurface = 217, // Platform surface created or about to be destroyed
+ Pointer = 218, // QQuickPointerEvent; ### Qt 6: QPointerEvent
+
// 512 reserved for Qt Jambi's MetaCall event
// 513 reserved for Qt Jambi's DeleteOnMainThread event
diff --git a/src/corelib/kernel/qmetaobjectbuilder.cpp b/src/corelib/kernel/qmetaobjectbuilder.cpp
index 021e137273..c2302cbc5e 100644
--- a/src/corelib/kernel/qmetaobjectbuilder.cpp
+++ b/src/corelib/kernel/qmetaobjectbuilder.cpp
@@ -36,6 +36,7 @@
#include "qobject_p.h"
#include "qmetaobject_p.h"
+#include <vector>
#include <stdlib.h>
QT_BEGIN_NAMESPACE
@@ -88,7 +89,6 @@ static inline Q_DECL_UNUSED const QMetaObjectPrivate *priv(const uint* data)
class QMetaMethodBuilderPrivate
{
public:
- QMetaMethodBuilderPrivate() {} // for QVector, don't use
QMetaMethodBuilderPrivate
(QMetaMethod::MethodType _methodType,
const QByteArray& _signature,
@@ -145,7 +145,6 @@ Q_DECLARE_TYPEINFO(QMetaMethodBuilderPrivate, Q_MOVABLE_TYPE);
class QMetaPropertyBuilderPrivate
{
public:
- QMetaPropertyBuilderPrivate() {} // for QVector, don't use
QMetaPropertyBuilderPrivate
(const QByteArray& _name, const QByteArray& _type, int notifierIdx=-1,
int _revision = 0)
@@ -184,7 +183,6 @@ Q_DECLARE_TYPEINFO(QMetaPropertyBuilderPrivate, Q_MOVABLE_TYPE);
class QMetaEnumBuilderPrivate
{
public:
- QMetaEnumBuilderPrivate() {} // for QVector, don't use
QMetaEnumBuilderPrivate(const QByteArray& _name)
: name(_name), isFlag(false)
{
@@ -213,20 +211,20 @@ public:
QByteArray className;
const QMetaObject *superClass;
QMetaObjectBuilder::StaticMetacallFunction staticMetacallFunction;
- QVector<QMetaMethodBuilderPrivate> methods;
- QVector<QMetaMethodBuilderPrivate> constructors;
- QVector<QMetaPropertyBuilderPrivate> properties;
+ std::vector<QMetaMethodBuilderPrivate> methods;
+ std::vector<QMetaMethodBuilderPrivate> constructors;
+ std::vector<QMetaPropertyBuilderPrivate> properties;
QList<QByteArray> classInfoNames;
QList<QByteArray> classInfoValues;
- QVector<QMetaEnumBuilderPrivate> enumerators;
+ std::vector<QMetaEnumBuilderPrivate> enumerators;
QList<const QMetaObject *> relatedMetaObjects;
int flags;
};
bool QMetaObjectBuilderPrivate::hasRevisionedProperties() const
{
- for (int i = 0; i < properties.size(); ++i) {
- if (properties.at(i).revision)
+ for (const auto &property : properties) {
+ if (property.revision)
return true;
}
return false;
@@ -234,8 +232,8 @@ bool QMetaObjectBuilderPrivate::hasRevisionedProperties() const
bool QMetaObjectBuilderPrivate::hasRevisionedMethods() const
{
- for (int i = 0; i < methods.size(); ++i) {
- if (methods.at(i).revision)
+ for (const auto &method : methods) {
+ if (method.revision)
return true;
}
return false;
@@ -353,7 +351,7 @@ void QMetaObjectBuilder::setFlags(MetaObjectFlags flags)
*/
int QMetaObjectBuilder::methodCount() const
{
- return d->methods.size();
+ return int(d->methods.size());
}
/*!
@@ -363,7 +361,7 @@ int QMetaObjectBuilder::methodCount() const
*/
int QMetaObjectBuilder::constructorCount() const
{
- return d->constructors.size();
+ return int(d->constructors.size());
}
/*!
@@ -374,7 +372,7 @@ int QMetaObjectBuilder::constructorCount() const
*/
int QMetaObjectBuilder::propertyCount() const
{
- return d->properties.size();
+ return int(d->properties.size());
}
/*!
@@ -386,7 +384,7 @@ int QMetaObjectBuilder::propertyCount() const
*/
int QMetaObjectBuilder::enumeratorCount() const
{
- return d->enumerators.size();
+ return int(d->enumerators.size());
}
/*!
@@ -427,8 +425,8 @@ int QMetaObjectBuilder::relatedMetaObjectCount() const
*/
QMetaMethodBuilder QMetaObjectBuilder::addMethod(const QByteArray& signature)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate(QMetaMethod::Method, signature));
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate(QMetaMethod::Method, signature));
return QMetaMethodBuilder(this, index);
}
@@ -444,8 +442,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addMethod(const QByteArray& signature)
QMetaMethodBuilder QMetaObjectBuilder::addMethod
(const QByteArray& signature, const QByteArray& returnType)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate
(QMetaMethod::Method, signature, returnType));
return QMetaMethodBuilder(this, index);
}
@@ -491,8 +489,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addMethod(const QMetaMethod& prototype)
*/
QMetaMethodBuilder QMetaObjectBuilder::addSlot(const QByteArray& signature)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate(QMetaMethod::Slot, signature));
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate(QMetaMethod::Slot, signature));
return QMetaMethodBuilder(this, index);
}
@@ -506,8 +504,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addSlot(const QByteArray& signature)
*/
QMetaMethodBuilder QMetaObjectBuilder::addSignal(const QByteArray& signature)
{
- int index = d->methods.size();
- d->methods.append(QMetaMethodBuilderPrivate
+ int index = int(d->methods.size());
+ d->methods.push_back(QMetaMethodBuilderPrivate
(QMetaMethod::Signal, signature, QByteArray("void"), QMetaMethod::Public));
return QMetaMethodBuilder(this, index);
}
@@ -523,9 +521,9 @@ QMetaMethodBuilder QMetaObjectBuilder::addSignal(const QByteArray& signature)
*/
QMetaMethodBuilder QMetaObjectBuilder::addConstructor(const QByteArray& signature)
{
- int index = d->constructors.size();
- d->constructors.append(QMetaMethodBuilderPrivate(QMetaMethod::Constructor, signature,
- /*returnType=*/QByteArray()));
+ int index = int(d->constructors.size());
+ d->constructors.push_back(QMetaMethodBuilderPrivate(QMetaMethod::Constructor, signature,
+ /*returnType=*/QByteArray()));
return QMetaMethodBuilder(this, -(index + 1));
}
@@ -564,8 +562,8 @@ QMetaMethodBuilder QMetaObjectBuilder::addConstructor(const QMetaMethod& prototy
QMetaPropertyBuilder QMetaObjectBuilder::addProperty
(const QByteArray& name, const QByteArray& type, int notifierId)
{
- int index = d->properties.size();
- d->properties.append(QMetaPropertyBuilderPrivate(name, type, notifierId));
+ int index = int(d->properties.size());
+ d->properties.push_back(QMetaPropertyBuilderPrivate(name, type, notifierId));
return QMetaPropertyBuilder(this, index);
}
@@ -615,8 +613,8 @@ QMetaPropertyBuilder QMetaObjectBuilder::addProperty(const QMetaProperty& protot
*/
QMetaEnumBuilder QMetaObjectBuilder::addEnumerator(const QByteArray& name)
{
- int index = d->enumerators.size();
- d->enumerators.append(QMetaEnumBuilderPrivate(name));
+ int index = int(d->enumerators.size());
+ d->enumerators.push_back(QMetaEnumBuilderPrivate(name));
return QMetaEnumBuilder(this, index);
}
@@ -762,7 +760,7 @@ void QMetaObjectBuilder::addMetaObject
*/
QMetaMethodBuilder QMetaObjectBuilder::method(int index) const
{
- if (index >= 0 && index < d->methods.size())
+ if (uint(index) < d->methods.size())
return QMetaMethodBuilder(this, index);
else
return QMetaMethodBuilder();
@@ -775,7 +773,7 @@ QMetaMethodBuilder QMetaObjectBuilder::method(int index) const
*/
QMetaMethodBuilder QMetaObjectBuilder::constructor(int index) const
{
- if (index >= 0 && index < d->constructors.size())
+ if (uint(index) < d->constructors.size())
return QMetaMethodBuilder(this, -(index + 1));
else
return QMetaMethodBuilder();
@@ -788,7 +786,7 @@ QMetaMethodBuilder QMetaObjectBuilder::constructor(int index) const
*/
QMetaPropertyBuilder QMetaObjectBuilder::property(int index) const
{
- if (index >= 0 && index < d->properties.size())
+ if (uint(index) < d->properties.size())
return QMetaPropertyBuilder(this, index);
else
return QMetaPropertyBuilder();
@@ -802,7 +800,7 @@ QMetaPropertyBuilder QMetaObjectBuilder::property(int index) const
*/
QMetaEnumBuilder QMetaObjectBuilder::enumerator(int index) const
{
- if (index >= 0 && index < d->enumerators.size())
+ if (uint(index) < d->enumerators.size())
return QMetaEnumBuilder(this, index);
else
return QMetaEnumBuilder();
@@ -866,15 +864,15 @@ QByteArray QMetaObjectBuilder::classInfoValue(int index) const
*/
void QMetaObjectBuilder::removeMethod(int index)
{
- if (index >= 0 && index < d->methods.size()) {
- d->methods.removeAt(index);
- for (int prop = 0; prop < d->properties.size(); ++prop) {
+ if (uint(index) < d->methods.size()) {
+ d->methods.erase(d->methods.begin() + index);
+ for (auto &property : d->properties) {
// Adjust the indices of property notify signal references.
- if (d->properties[prop].notifySignal == index) {
- d->properties[prop].notifySignal = -1;
- d->properties[prop].setFlag(Notify, false);
- } else if (d->properties[prop].notifySignal > index)
- (d->properties[prop].notifySignal)--;
+ if (property.notifySignal == index) {
+ property.notifySignal = -1;
+ property.setFlag(Notify, false);
+ } else if (property.notifySignal > index)
+ property.notifySignal--;
}
}
}
@@ -888,8 +886,8 @@ void QMetaObjectBuilder::removeMethod(int index)
*/
void QMetaObjectBuilder::removeConstructor(int index)
{
- if (index >= 0 && index < d->constructors.size())
- d->constructors.removeAt(index);
+ if (uint(index) < d->constructors.size())
+ d->constructors.erase(d->constructors.begin() + index);
}
/*!
@@ -900,8 +898,8 @@ void QMetaObjectBuilder::removeConstructor(int index)
*/
void QMetaObjectBuilder::removeProperty(int index)
{
- if (index >= 0 && index < d->properties.size())
- d->properties.removeAt(index);
+ if (uint(index) < d->properties.size())
+ d->properties.erase(d->properties.begin() + index);
}
/*!
@@ -913,8 +911,8 @@ void QMetaObjectBuilder::removeProperty(int index)
*/
void QMetaObjectBuilder::removeEnumerator(int index)
{
- if (index >= 0 && index < d->enumerators.size())
- d->enumerators.removeAt(index);
+ if (uint(index) < d->enumerators.size())
+ d->enumerators.erase(d->enumerators.begin() + index);
}
/*!
@@ -959,9 +957,9 @@ void QMetaObjectBuilder::removeRelatedMetaObject(int index)
int QMetaObjectBuilder::indexOfMethod(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->methods.size(); ++index) {
- if (sig == d->methods[index].signature)
- return index;
+ for (const auto &method : d->methods) {
+ if (sig == method.signature)
+ return int(&method - &d->methods.front());
}
return -1;
}
@@ -975,10 +973,9 @@ int QMetaObjectBuilder::indexOfMethod(const QByteArray& signature)
int QMetaObjectBuilder::indexOfSignal(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->methods.size(); ++index) {
- if (sig == d->methods[index].signature &&
- d->methods[index].methodType() == QMetaMethod::Signal)
- return index;
+ for (const auto &method : d->methods) {
+ if (method.methodType() == QMetaMethod::Signal && sig == method.signature)
+ return int(&method - &d->methods.front());
}
return -1;
}
@@ -992,10 +989,9 @@ int QMetaObjectBuilder::indexOfSignal(const QByteArray& signature)
int QMetaObjectBuilder::indexOfSlot(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->methods.size(); ++index) {
- if (sig == d->methods[index].signature &&
- d->methods[index].methodType() == QMetaMethod::Slot)
- return index;
+ for (const auto &method : d->methods) {
+ if (method.methodType() == QMetaMethod::Slot && sig == method.signature)
+ return int(&method - &d->methods.front());
}
return -1;
}
@@ -1009,9 +1005,9 @@ int QMetaObjectBuilder::indexOfSlot(const QByteArray& signature)
int QMetaObjectBuilder::indexOfConstructor(const QByteArray& signature)
{
QByteArray sig = QMetaObject::normalizedSignature(signature);
- for (int index = 0; index < d->constructors.size(); ++index) {
- if (sig == d->constructors[index].signature)
- return index;
+ for (const auto &constructor : d->constructors) {
+ if (sig == constructor.signature)
+ return int(&constructor - &d->constructors.front());
}
return -1;
}
@@ -1024,9 +1020,9 @@ int QMetaObjectBuilder::indexOfConstructor(const QByteArray& signature)
*/
int QMetaObjectBuilder::indexOfProperty(const QByteArray& name)
{
- for (int index = 0; index < d->properties.size(); ++index) {
- if (name == d->properties[index].name)
- return index;
+ for (const auto &property : d->properties) {
+ if (name == property.name)
+ return int(&property - &d->properties.front());
}
return -1;
}
@@ -1039,9 +1035,9 @@ int QMetaObjectBuilder::indexOfProperty(const QByteArray& name)
*/
int QMetaObjectBuilder::indexOfEnumerator(const QByteArray& name)
{
- for (int index = 0; index < d->enumerators.size(); ++index) {
- if (name == d->enumerators[index].name)
- return index;
+ for (const auto &enumerator : d->enumerators) {
+ if (name == enumerator.name)
+ return int(&enumerator - &d->enumerators.front());
}
return -1;
}
@@ -1155,11 +1151,11 @@ void QMetaStringTable::writeBlob(char *out) const
// Returns the sum of all parameters (including return type) for the given
// \a methods. This is needed for calculating the size of the methods'
// parameter type/name meta-data.
-static int aggregateParameterCount(const QVector<QMetaMethodBuilderPrivate> &methods)
+static int aggregateParameterCount(const std::vector<QMetaMethodBuilderPrivate> &methods)
{
int sum = 0;
- for (int i = 0; i < methods.size(); ++i)
- sum += methods.at(i).parameterCount() + 1; // +1 for return type
+ for (const auto &method : methods)
+ sum += method.parameterCount() + 1; // +1 for return type
return sum;
}
@@ -1200,8 +1196,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
= reinterpret_cast<QMetaObjectPrivate *>(buf + size);
int pmetaSize = size;
dataIndex = MetaObjectPrivateFieldCount;
- for (index = 0; index < d->properties.size(); ++index) {
- if (d->properties[index].notifySignal != -1) {
+ for (const auto &property : d->properties) {
+ if (property.notifySignal != -1) {
hasNotifySignals = true;
break;
}
@@ -1209,8 +1205,8 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
int methodParametersDataSize =
((aggregateParameterCount(d->methods)
+ aggregateParameterCount(d->constructors)) * 2) // types and parameter names
- - d->methods.size() // return "parameters" don't have names
- - d->constructors.size(); // "this" parameters don't have names
+ - int(d->methods.size()) // return "parameters" don't have names
+ - int(d->constructors.size()); // "this" parameters don't have names
if (buf) {
Q_STATIC_ASSERT_X(QMetaObjectPrivate::OutputRevision == 7, "QMetaObjectBuilder should generate the same version as moc");
pmeta->revision = QMetaObjectPrivate::OutputRevision;
@@ -1222,51 +1218,49 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
pmeta->classInfoData = dataIndex;
dataIndex += 2 * d->classInfoNames.size();
- pmeta->methodCount = d->methods.size();
+ pmeta->methodCount = int(d->methods.size());
pmeta->methodData = dataIndex;
- dataIndex += 5 * d->methods.size();
+ dataIndex += 5 * int(d->methods.size());
if (hasRevisionedMethods)
- dataIndex += d->methods.size();
+ dataIndex += int(d->methods.size());
paramsIndex = dataIndex;
dataIndex += methodParametersDataSize;
- pmeta->propertyCount = d->properties.size();
+ pmeta->propertyCount = int(d->properties.size());
pmeta->propertyData = dataIndex;
- dataIndex += 3 * d->properties.size();
+ dataIndex += 3 * int(d->properties.size());
if (hasNotifySignals)
- dataIndex += d->properties.size();
+ dataIndex += int(d->properties.size());
if (hasRevisionedProperties)
- dataIndex += d->properties.size();
+ dataIndex += int(d->properties.size());
- pmeta->enumeratorCount = d->enumerators.size();
+ pmeta->enumeratorCount = int(d->enumerators.size());
pmeta->enumeratorData = dataIndex;
- dataIndex += 4 * d->enumerators.size();
+ dataIndex += 4 * int(d->enumerators.size());
- pmeta->constructorCount = d->constructors.size();
+ pmeta->constructorCount = int(d->constructors.size());
pmeta->constructorData = dataIndex;
- dataIndex += 5 * d->constructors.size();
+ dataIndex += 5 * int(d->constructors.size());
} else {
- dataIndex += 2 * d->classInfoNames.size();
- dataIndex += 5 * d->methods.size();
+ dataIndex += 2 * int(d->classInfoNames.size());
+ dataIndex += 5 * int(d->methods.size());
if (hasRevisionedMethods)
- dataIndex += d->methods.size();
+ dataIndex += int(d->methods.size());
paramsIndex = dataIndex;
dataIndex += methodParametersDataSize;
- dataIndex += 3 * d->properties.size();
+ dataIndex += 3 * int(d->properties.size());
if (hasNotifySignals)
- dataIndex += d->properties.size();
+ dataIndex += int(d->properties.size());
if (hasRevisionedProperties)
- dataIndex += d->properties.size();
- dataIndex += 4 * d->enumerators.size();
- dataIndex += 5 * d->constructors.size();
+ dataIndex += int(d->properties.size());
+ dataIndex += 4 * int(d->enumerators.size());
+ dataIndex += 5 * int(d->constructors.size());
}
// Allocate space for the enumerator key names and values.
enumIndex = dataIndex;
- for (index = 0; index < d->enumerators.size(); ++index) {
- QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- dataIndex += 2 * enumerator->keys.size();
- }
+ for (const auto &enumerator : d->enumerators)
+ dataIndex += 2 * enumerator.keys.size();
// Zero terminator at the end of the data offset table.
++dataIndex;
@@ -1305,44 +1299,41 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Output the methods in the class.
Q_ASSERT(!buf || dataIndex == pmeta->methodData);
- for (index = 0; index < d->methods.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(d->methods[index]);
- int name = strings.enter(method->name());
- int argc = method->parameterCount();
- int tag = strings.enter(method->tag);
- int attrs = method->attributes;
+ for (const auto &method : d->methods) {
+ int name = strings.enter(method.name());
+ int argc = method.parameterCount();
+ int tag = strings.enter(method.tag);
+ int attrs = method.attributes;
if (buf) {
data[dataIndex] = name;
data[dataIndex + 1] = argc;
data[dataIndex + 2] = paramsIndex;
data[dataIndex + 3] = tag;
data[dataIndex + 4] = attrs;
- if (method->methodType() == QMetaMethod::Signal)
+ if (method.methodType() == QMetaMethod::Signal)
pmeta->signalCount++;
}
dataIndex += 5;
paramsIndex += 1 + argc * 2;
}
if (hasRevisionedMethods) {
- for (index = 0; index < d->methods.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(d->methods[index]);
+ for (const auto &method : d->methods) {
if (buf)
- data[dataIndex] = method->revision;
+ data[dataIndex] = method.revision;
++dataIndex;
}
}
// Output the method parameters in the class.
- Q_ASSERT(!buf || dataIndex == pmeta->methodData + d->methods.size() * 5
- + (hasRevisionedMethods ? d->methods.size() : 0));
+ Q_ASSERT(!buf || dataIndex == pmeta->methodData + int(d->methods.size()) * 5
+ + (hasRevisionedMethods ? int(d->methods.size()) : 0));
for (int x = 0; x < 2; ++x) {
- QVector<QMetaMethodBuilderPrivate> &methods = (x == 0) ? d->methods : d->constructors;
- for (index = 0; index < methods.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(methods[index]);
- QList<QByteArray> paramTypeNames = method->parameterTypes();
+ const std::vector<QMetaMethodBuilderPrivate> &methods = (x == 0) ? d->methods : d->constructors;
+ for (const auto &method : methods) {
+ const QList<QByteArray> paramTypeNames = method.parameterTypes();
int paramCount = paramTypeNames.size();
for (int i = -1; i < paramCount; ++i) {
- const QByteArray &typeName = (i < 0) ? method->returnType : paramTypeNames.at(i);
+ const QByteArray &typeName = (i < 0) ? method.returnType : paramTypeNames.at(i);
int typeInfo;
if (QtPrivate::isBuiltinType(typeName))
typeInfo = QMetaType::type(typeName);
@@ -1353,7 +1344,7 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
++dataIndex;
}
- QList<QByteArray> paramNames = method->parameterNames;
+ QList<QByteArray> paramNames = method.parameterNames;
while (paramNames.size() < paramCount)
paramNames.append(QByteArray());
for (int i = 0; i < paramCount; ++i) {
@@ -1367,19 +1358,18 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Output the properties in the class.
Q_ASSERT(!buf || dataIndex == pmeta->propertyData);
- for (index = 0; index < d->properties.size(); ++index) {
- QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
- int name = strings.enter(prop->name);
+ for (const auto &prop : d->properties) {
+ int name = strings.enter(prop.name);
int typeInfo;
- if (QtPrivate::isBuiltinType(prop->type))
- typeInfo = QMetaType::type(prop->type);
+ if (QtPrivate::isBuiltinType(prop.type))
+ typeInfo = QMetaType::type(prop.type);
else
- typeInfo = IsUnresolvedType | strings.enter(prop->type);
+ typeInfo = IsUnresolvedType | strings.enter(prop.type);
- int flags = prop->flags;
+ int flags = prop.flags;
- if (!QtPrivate::isBuiltinType(prop->type))
+ if (!QtPrivate::isBuiltinType(prop.type))
flags |= EnumOrFlag;
if (buf) {
@@ -1390,11 +1380,10 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
dataIndex += 3;
}
if (hasNotifySignals) {
- for (index = 0; index < d->properties.size(); ++index) {
- QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
+ for (const auto &prop : d->properties) {
if (buf) {
- if (prop->notifySignal != -1)
- data[dataIndex] = prop->notifySignal;
+ if (prop.notifySignal != -1)
+ data[dataIndex] = prop.notifySignal;
else
data[dataIndex] = 0;
}
@@ -1402,21 +1391,19 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
}
}
if (hasRevisionedProperties) {
- for (index = 0; index < d->properties.size(); ++index) {
- QMetaPropertyBuilderPrivate *prop = &(d->properties[index]);
+ for (const auto &prop : d->properties) {
if (buf)
- data[dataIndex] = prop->revision;
+ data[dataIndex] = prop.revision;
++dataIndex;
}
}
// Output the enumerators in the class.
Q_ASSERT(!buf || dataIndex == pmeta->enumeratorData);
- for (index = 0; index < d->enumerators.size(); ++index) {
- QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- int name = strings.enter(enumerator->name);
- int isFlag = (int)(enumerator->isFlag);
- int count = enumerator->keys.size();
+ for (const auto &enumerator : d->enumerators) {
+ int name = strings.enter(enumerator.name);
+ int isFlag = (int)(enumerator.isFlag);
+ int count = enumerator.keys.size();
int enumOffset = enumIndex;
if (buf) {
data[dataIndex] = name;
@@ -1425,10 +1412,10 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
data[dataIndex + 3] = enumOffset;
}
for (int key = 0; key < count; ++key) {
- int keyIndex = strings.enter(enumerator->keys[key]);
+ int keyIndex = strings.enter(enumerator.keys[key]);
if (buf) {
data[enumOffset++] = keyIndex;
- data[enumOffset++] = enumerator->values[key];
+ data[enumOffset++] = enumerator.values[key];
}
}
dataIndex += 4;
@@ -1437,12 +1424,11 @@ static int buildMetaObject(QMetaObjectBuilderPrivate *d, char *buf,
// Output the constructors in the class.
Q_ASSERT(!buf || dataIndex == pmeta->constructorData);
- for (index = 0; index < d->constructors.size(); ++index) {
- QMetaMethodBuilderPrivate *method = &(d->constructors[index]);
- int name = strings.enter(method->name());
- int argc = method->parameterCount();
- int tag = strings.enter(method->tag);
- int attrs = method->attributes;
+ for (const auto &ctor : d->constructors) {
+ int name = strings.enter(ctor.name());
+ int argc = ctor.parameterCount();
+ int tag = strings.enter(ctor.tag);
+ int attrs = ctor.attributes;
if (buf) {
data[dataIndex] = name;
data[dataIndex + 1] = argc;
@@ -1612,10 +1598,10 @@ void QMetaObjectBuilder::serialize(QDataStream& stream) const
// Write the counts for each type of class member.
stream << d->classInfoNames.size();
- stream << d->methods.size();
- stream << d->properties.size();
- stream << d->enumerators.size();
- stream << d->constructors.size();
+ stream << int(d->methods.size());
+ stream << int(d->properties.size());
+ stream << int(d->enumerators.size());
+ stream << int(d->constructors.size());
stream << d->relatedMetaObjects.size();
// Write the items of class information.
@@ -1625,45 +1611,41 @@ void QMetaObjectBuilder::serialize(QDataStream& stream) const
}
// Write the methods.
- for (index = 0; index < d->methods.size(); ++index) {
- const QMetaMethodBuilderPrivate *method = &(d->methods[index]);
- stream << method->signature;
- stream << method->returnType;
- stream << method->parameterNames;
- stream << method->tag;
- stream << method->attributes;
- if (method->revision)
- stream << method->revision;
+ for (const auto &method : d->methods) {
+ stream << method.signature;
+ stream << method.returnType;
+ stream << method.parameterNames;
+ stream << method.tag;
+ stream << method.attributes;
+ if (method.revision)
+ stream << method.revision;
}
// Write the properties.
- for (index = 0; index < d->properties.size(); ++index) {
- const QMetaPropertyBuilderPrivate *property = &(d->properties[index]);
- stream << property->name;
- stream << property->type;
- stream << property->flags;
- stream << property->notifySignal;
- if (property->revision)
- stream << property->revision;
+ for (const auto &property : d->properties) {
+ stream << property.name;
+ stream << property.type;
+ stream << property.flags;
+ stream << property.notifySignal;
+ if (property.revision)
+ stream << property.revision;
}
// Write the enumerators.
- for (index = 0; index < d->enumerators.size(); ++index) {
- const QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- stream << enumerator->name;
- stream << enumerator->isFlag;
- stream << enumerator->keys;
- stream << enumerator->values;
+ for (const auto &enumerator : d->enumerators) {
+ stream << enumerator.name;
+ stream << enumerator.isFlag;
+ stream << enumerator.keys;
+ stream << enumerator.values;
}
// Write the constructors.
- for (index = 0; index < d->constructors.size(); ++index) {
- const QMetaMethodBuilderPrivate *method = &(d->constructors[index]);
- stream << method->signature;
- stream << method->returnType;
- stream << method->parameterNames;
- stream << method->tag;
- stream << method->attributes;
+ for (const auto &ctor : d->constructors) {
+ stream << ctor.signature;
+ stream << ctor.returnType;
+ stream << ctor.parameterNames;
+ stream << ctor.tag;
+ stream << ctor.attributes;
}
// Write the related meta objects.
@@ -1770,14 +1752,14 @@ void QMetaObjectBuilder::deserialize
return;
stream >> name;
addMethod(name);
- QMetaMethodBuilderPrivate *method = &(d->methods[index]);
- stream >> method->returnType;
- stream >> method->parameterNames;
- stream >> method->tag;
- stream >> method->attributes;
- if (method->attributes & MethodRevisioned)
- stream >> method->revision;
- if (method->methodType() == QMetaMethod::Constructor) {
+ QMetaMethodBuilderPrivate &method = d->methods[index];
+ stream >> method.returnType;
+ stream >> method.parameterNames;
+ stream >> method.tag;
+ stream >> method.attributes;
+ if (method.attributes & MethodRevisioned)
+ stream >> method.revision;
+ if (method.methodType() == QMetaMethod::Constructor) {
// Cannot add a constructor in this set of methods.
stream.setStatus(QDataStream::ReadCorruptData);
return;
@@ -1792,23 +1774,23 @@ void QMetaObjectBuilder::deserialize
stream >> name;
stream >> type;
addProperty(name, type);
- QMetaPropertyBuilderPrivate *property = &(d->properties[index]);
- stream >> property->flags;
- stream >> property->notifySignal;
- if (property->notifySignal < -1 ||
- property->notifySignal >= d->methods.size()) {
+ QMetaPropertyBuilderPrivate &property = d->properties[index];
+ stream >> property.flags;
+ stream >> property.notifySignal;
+ if (property.notifySignal < -1 ||
+ property.notifySignal >= int(d->methods.size())) {
// Notify signal method index is out of range.
stream.setStatus(QDataStream::ReadCorruptData);
return;
}
- if (property->notifySignal >= 0 &&
- d->methods[property->notifySignal].methodType() != QMetaMethod::Signal) {
+ if (property.notifySignal >= 0 &&
+ d->methods[property.notifySignal].methodType() != QMetaMethod::Signal) {
// Notify signal method index does not refer to a signal.
stream.setStatus(QDataStream::ReadCorruptData);
return;
}
- if (property->flags & Revisioned)
- stream >> property->revision;
+ if (property.flags & Revisioned)
+ stream >> property.revision;
}
// Read the enumerators.
@@ -1817,11 +1799,11 @@ void QMetaObjectBuilder::deserialize
return;
stream >> name;
addEnumerator(name);
- QMetaEnumBuilderPrivate *enumerator = &(d->enumerators[index]);
- stream >> enumerator->isFlag;
- stream >> enumerator->keys;
- stream >> enumerator->values;
- if (enumerator->keys.size() != enumerator->values.size()) {
+ QMetaEnumBuilderPrivate &enumerator = d->enumerators[index];
+ stream >> enumerator.isFlag;
+ stream >> enumerator.keys;
+ stream >> enumerator.values;
+ if (enumerator.keys.size() != enumerator.values.size()) {
// Mismatch between number of keys and number of values.
stream.setStatus(QDataStream::ReadCorruptData);
return;
@@ -1834,12 +1816,12 @@ void QMetaObjectBuilder::deserialize
return;
stream >> name;
addConstructor(name);
- QMetaMethodBuilderPrivate *method = &(d->constructors[index]);
- stream >> method->returnType;
- stream >> method->parameterNames;
- stream >> method->tag;
- stream >> method->attributes;
- if (method->methodType() != QMetaMethod::Constructor) {
+ QMetaMethodBuilderPrivate &method = d->constructors[index];
+ stream >> method.returnType;
+ stream >> method.parameterNames;
+ stream >> method.tag;
+ stream >> method.attributes;
+ if (method.methodType() != QMetaMethod::Constructor) {
// The type must be Constructor.
stream.setStatus(QDataStream::ReadCorruptData);
return;
@@ -1875,9 +1857,9 @@ void QMetaObjectBuilder::deserialize
QMetaMethodBuilderPrivate *QMetaMethodBuilder::d_func() const
{
// Positive indices indicate methods, negative indices indicate constructors.
- if (_mobj && _index >= 0 && _index < _mobj->d->methods.size())
+ if (_mobj && _index >= 0 && _index < int(_mobj->d->methods.size()))
return &(_mobj->d->methods[_index]);
- else if (_mobj && -_index >= 1 && -_index <= _mobj->d->constructors.size())
+ else if (_mobj && -_index >= 1 && -_index <= int(_mobj->d->constructors.size()))
return &(_mobj->d->constructors[(-_index) - 1]);
else
return 0;
@@ -2116,7 +2098,7 @@ void QMetaMethodBuilder::setRevision(int revision)
QMetaPropertyBuilderPrivate *QMetaPropertyBuilder::d_func() const
{
- if (_mobj && _index >= 0 && _index < _mobj->d->properties.size())
+ if (_mobj && _index >= 0 && _index < int(_mobj->d->properties.size()))
return &(_mobj->d->properties[_index]);
else
return 0;
@@ -2588,7 +2570,7 @@ void QMetaPropertyBuilder::setRevision(int revision)
QMetaEnumBuilderPrivate *QMetaEnumBuilder::d_func() const
{
- if (_mobj && _index >= 0 && _index < _mobj->d->enumerators.size())
+ if (_mobj && _index >= 0 && _index < int(_mobj->d->enumerators.size()))
return &(_mobj->d->enumerators[_index]);
else
return 0;
diff --git a/src/corelib/plugin/qfactoryloader.cpp b/src/corelib/plugin/qfactoryloader.cpp
index cc5aa1394a..f7545b5bcb 100644
--- a/src/corelib/plugin/qfactoryloader.cpp
+++ b/src/corelib/plugin/qfactoryloader.cpp
@@ -33,7 +33,7 @@
#include "qfactoryloader_p.h"
-#ifndef QT_NO_LIBRARY
+#ifndef QT_NO_QOBJECT
#include "qfactoryinterface.h"
#include "qmap.h"
#include <qdir.h>
@@ -50,10 +50,6 @@
QT_BEGIN_NAMESPACE
-Q_GLOBAL_STATIC(QList<QFactoryLoader *>, qt_factory_loaders)
-
-Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qt_factoryloader_mutex, (QMutex::Recursive))
-
namespace {
// avoid duplicate QStringLiteral data:
@@ -69,18 +65,24 @@ class QFactoryLoaderPrivate : public QObjectPrivate
Q_DECLARE_PUBLIC(QFactoryLoader)
public:
QFactoryLoaderPrivate(){}
+ QByteArray iid;
+#ifndef QT_NO_LIBRARY
~QFactoryLoaderPrivate();
mutable QMutex mutex;
- QByteArray iid;
QList<QLibraryPrivate*> libraryList;
QMap<QString,QLibraryPrivate*> keyMap;
QString suffix;
Qt::CaseSensitivity cs;
QStringList loadedPaths;
-
- void unloadPath(const QString &path);
+#endif
};
+#ifndef QT_NO_LIBRARY
+
+Q_GLOBAL_STATIC(QList<QFactoryLoader *>, qt_factory_loaders)
+
+Q_GLOBAL_STATIC_WITH_ARGS(QMutex, qt_factoryloader_mutex, (QMutex::Recursive))
+
QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
{
for (int i = 0; i < libraryList.count(); ++i) {
@@ -90,25 +92,6 @@ QFactoryLoaderPrivate::~QFactoryLoaderPrivate()
}
}
-QFactoryLoader::QFactoryLoader(const char *iid,
- const QString &suffix,
- Qt::CaseSensitivity cs)
- : QObject(*new QFactoryLoaderPrivate)
-{
- moveToThread(QCoreApplicationPrivate::mainThread());
- Q_D(QFactoryLoader);
- d->iid = iid;
- d->cs = cs;
- d->suffix = suffix;
-
-
- QMutexLocker locker(qt_factoryloader_mutex());
- update();
- qt_factory_loaders()->append(this);
-}
-
-
-
void QFactoryLoader::update()
{
#ifdef QT_SHARED
@@ -229,13 +212,56 @@ QFactoryLoader::~QFactoryLoader()
qt_factory_loaders()->removeAll(this);
}
+#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
+QLibraryPrivate *QFactoryLoader::library(const QString &key) const
+{
+ Q_D(const QFactoryLoader);
+ return d->keyMap.value(d->cs ? key : key.toLower());
+}
+#endif
+
+void QFactoryLoader::refreshAll()
+{
+ QMutexLocker locker(qt_factoryloader_mutex());
+ QList<QFactoryLoader *> *loaders = qt_factory_loaders();
+ for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
+ it != loaders->constEnd(); ++it) {
+ (*it)->update();
+ }
+}
+
+#endif // QT_NO_LIBRARY
+
+QFactoryLoader::QFactoryLoader(const char *iid,
+ const QString &suffix,
+ Qt::CaseSensitivity cs)
+ : QObject(*new QFactoryLoaderPrivate)
+{
+ moveToThread(QCoreApplicationPrivate::mainThread());
+ Q_D(QFactoryLoader);
+ d->iid = iid;
+#ifndef QT_NO_LIBRARY
+ d->cs = cs;
+ d->suffix = suffix;
+
+ QMutexLocker locker(qt_factoryloader_mutex());
+ update();
+ qt_factory_loaders()->append(this);
+#else
+ Q_UNUSED(suffix);
+ Q_UNUSED(cs);
+#endif
+}
+
QList<QJsonObject> QFactoryLoader::metaData() const
{
Q_D(const QFactoryLoader);
- QMutexLocker locker(&d->mutex);
QList<QJsonObject> metaData;
+#ifndef QT_NO_LIBRARY
+ QMutexLocker locker(&d->mutex);
for (int i = 0; i < d->libraryList.size(); ++i)
metaData.append(d->libraryList.at(i)->metaData);
+#endif
foreach (const QStaticPlugin &plugin, QPluginLoader::staticPlugins()) {
const QJsonObject object = plugin.metaData();
@@ -252,6 +278,7 @@ QObject *QFactoryLoader::instance(int index) const
if (index < 0)
return 0;
+#ifndef QT_NO_LIBRARY
if (index < d->libraryList.size()) {
QLibraryPrivate *library = d->libraryList.at(index);
if (library->instance || library->loadPlugin()) {
@@ -266,8 +293,9 @@ QObject *QFactoryLoader::instance(int index) const
}
return 0;
}
-
index -= d->libraryList.size();
+#endif
+
QVector<QStaticPlugin> staticPlugins = QPluginLoader::staticPlugins();
for (int i = 0; i < staticPlugins.count(); ++i) {
const QJsonObject object = staticPlugins.at(i).metaData();
@@ -282,24 +310,6 @@ QObject *QFactoryLoader::instance(int index) const
return 0;
}
-#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
-QLibraryPrivate *QFactoryLoader::library(const QString &key) const
-{
- Q_D(const QFactoryLoader);
- return d->keyMap.value(d->cs ? key : key.toLower());
-}
-#endif
-
-void QFactoryLoader::refreshAll()
-{
- QMutexLocker locker(qt_factoryloader_mutex());
- QList<QFactoryLoader *> *loaders = qt_factory_loaders();
- for (QList<QFactoryLoader *>::const_iterator it = loaders->constBegin();
- it != loaders->constEnd(); ++it) {
- (*it)->update();
- }
-}
-
QMultiMap<int, QString> QFactoryLoader::keyMap() const
{
QMultiMap<int, QString> result;
@@ -335,4 +345,4 @@ int QFactoryLoader::indexOf(const QString &needle) const
QT_END_NAMESPACE
-#endif // QT_NO_LIBRARY
+#endif // QT_NO_QOBJECT
diff --git a/src/corelib/plugin/qfactoryloader_p.h b/src/corelib/plugin/qfactoryloader_p.h
index 1c48491b0d..ee07084180 100644
--- a/src/corelib/plugin/qfactoryloader_p.h
+++ b/src/corelib/plugin/qfactoryloader_p.h
@@ -45,17 +45,18 @@
// We mean it.
//
+#include "QtCore/qglobal.h"
+#ifndef QT_NO_QOBJECT
+
#include "QtCore/qobject.h"
#include "QtCore/qstringlist.h"
#include "QtCore/qjsonobject.h"
#include "QtCore/qmap.h"
#include "private/qlibrary_p.h"
-#ifndef QT_NO_LIBRARY
QT_BEGIN_NAMESPACE
class QFactoryLoaderPrivate;
-
class Q_CORE_EXPORT QFactoryLoader : public QObject
{
Q_OBJECT
@@ -65,21 +66,23 @@ public:
explicit QFactoryLoader(const char *iid,
const QString &suffix = QString(),
Qt::CaseSensitivity = Qt::CaseSensitive);
+
+#ifndef QT_NO_LIBRARY
~QFactoryLoader();
- QList<QJsonObject> metaData() const;
- QObject *instance(int index) const;
+ void update();
+ static void refreshAll();
#if defined(Q_OS_UNIX) && !defined (Q_OS_MAC)
QLibraryPrivate *library(const QString &key) const;
-#endif
+#endif // Q_OS_UNIX && !Q_OS_MAC
+#endif // !QT_NO_LIBRARY
QMultiMap<int, QString> keyMap() const;
int indexOf(const QString &needle) const;
- void update();
-
- static void refreshAll();
+ QList<QJsonObject> metaData() const;
+ QObject *instance(int index) const;
};
template <class PluginInterface, class FactoryInterface>
@@ -112,6 +115,6 @@ PluginInterface *qLoadPlugin1(const QFactoryLoader *loader,
QT_END_NAMESPACE
-#endif // QT_NO_LIBRARY
+#endif // QT_NO_QOBJECT
#endif // QFACTORYLOADER_P_H
diff --git a/src/corelib/plugin/qlibrary.cpp b/src/corelib/plugin/qlibrary.cpp
index 920e02ae5a..763f0fb1e9 100644
--- a/src/corelib/plugin/qlibrary.cpp
+++ b/src/corelib/plugin/qlibrary.cpp
@@ -302,7 +302,7 @@ static bool findPatternUnloaded(const QString &library, QLibraryPrivate *lib)
if (pos >= 0) {
if (hasMetaData) {
const char *data = filedata + pos;
- QJsonDocument doc = QLibraryPrivate::fromRawMetaData(data);
+ QJsonDocument doc = qJsonFromRawLibraryMetaData(data);
lib->metaData = doc.object();
if (qt_debug_component())
qWarning("Found metadata in lib %s, metadata=\n%s\n",
@@ -677,7 +677,7 @@ static bool qt_get_metadata(QtPluginQueryVerificationDataFunction pfn, QLibraryP
if (!szData)
return false;
- QJsonDocument doc = QLibraryPrivate::fromRawMetaData(szData);
+ QJsonDocument doc = qJsonFromRawLibraryMetaData(szData);
if (doc.isNull())
return false;
priv->metaData = doc.object();
diff --git a/src/corelib/plugin/qlibrary_p.h b/src/corelib/plugin/qlibrary_p.h
index ada90d7bfd..11b0cb1eb9 100644
--- a/src/corelib/plugin/qlibrary_p.h
+++ b/src/corelib/plugin/qlibrary_p.h
@@ -57,9 +57,20 @@
# include "QtCore/qt_windows.h"
#endif
+QT_BEGIN_NAMESPACE
+
+// Needed also in case of QT_NO_LIBRARY, for static plugin loading.
+inline QJsonDocument qJsonFromRawLibraryMetaData(const char *raw)
+{
+ raw += strlen("QTMETADATA ");
+ // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
+ // but doesn't include the size of the header (8 bytes)
+ QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
+ return QJsonDocument::fromBinaryData(json);
+}
+
#ifndef QT_NO_LIBRARY
-QT_BEGIN_NAMESPACE
bool qt_debug_component();
@@ -104,14 +115,6 @@ public:
void updatePluginState();
bool isPlugin();
- static inline QJsonDocument fromRawMetaData(const char *raw) {
- raw += strlen("QTMETADATA ");
- // the size of the embedded JSON object can be found 8 bytes into the data (see qjson_p.h),
- // but doesn't include the size of the header (8 bytes)
- QByteArray json(raw, qFromLittleEndian<uint>(*(const uint *)(raw + 8)) + 8);
- return QJsonDocument::fromBinaryData(json);
- }
-
private:
explicit QLibraryPrivate(const QString &canonicalFileName, const QString &version, QLibrary::LoadHints loadHints);
~QLibraryPrivate();
@@ -132,8 +135,8 @@ private:
friend class QLibraryStore;
};
-QT_END_NAMESPACE
-
#endif // QT_NO_LIBRARY
+QT_END_NAMESPACE
+
#endif // QLIBRARY_P_H
diff --git a/src/corelib/plugin/qpluginloader.cpp b/src/corelib/plugin/qpluginloader.cpp
index 24101be87b..8264a27842 100644
--- a/src/corelib/plugin/qpluginloader.cpp
+++ b/src/corelib/plugin/qpluginloader.cpp
@@ -41,10 +41,10 @@
#include "qdebug.h"
#include "qdir.h"
-#ifndef QT_NO_LIBRARY
-
QT_BEGIN_NAMESPACE
+#ifndef QT_NO_LIBRARY
+
/*!
\class QPluginLoader
\inmodule QtCore
@@ -382,9 +382,6 @@ QString QPluginLoader::errorString() const
return (!d || d->errorString.isEmpty()) ? tr("Unknown error") : d->errorString;
}
-typedef QVector<QStaticPlugin> StaticPluginList;
-Q_GLOBAL_STATIC(StaticPluginList, staticPluginList)
-
/*! \since 4.4
\property QPluginLoader::loadHints
@@ -413,6 +410,11 @@ QLibrary::LoadHints QPluginLoader::loadHints() const
return d ? d->loadHints() : QLibrary::LoadHints();
}
+#endif // QT_NO_LIBRARY
+
+typedef QVector<QStaticPlugin> StaticPluginList;
+Q_GLOBAL_STATIC(StaticPluginList, staticPluginList)
+
/*!
\relates QPluginLoader
\since 5.0
@@ -465,9 +467,8 @@ QVector<QStaticPlugin> QPluginLoader::staticPlugins()
*/
QJsonObject QStaticPlugin::metaData() const
{
- return QLibraryPrivate::fromRawMetaData(rawMetaData()).object();
+ return qJsonFromRawLibraryMetaData(rawMetaData()).object();
}
QT_END_NAMESPACE
-#endif // QT_NO_LIBRARY
diff --git a/src/corelib/plugin/qpluginloader.h b/src/corelib/plugin/qpluginloader.h
index 0ab25bbb07..5dc7d1b66c 100644
--- a/src/corelib/plugin/qpluginloader.h
+++ b/src/corelib/plugin/qpluginloader.h
@@ -37,10 +37,10 @@
#include <QtCore/qlibrary.h>
#include <QtCore/qplugin.h>
-#ifndef QT_NO_LIBRARY
-
QT_BEGIN_NAMESPACE
+#ifndef QT_NO_LIBRARY
+
class QLibraryPrivate;
class QJsonObject;
@@ -78,8 +78,17 @@ private:
Q_DISABLE_COPY(QPluginLoader)
};
-QT_END_NAMESPACE
+#else
+
+class Q_CORE_EXPORT QPluginLoader
+{
+public:
+ static QObjectList staticInstances();
+ static QVector<QStaticPlugin> staticPlugins();
+};
#endif // QT_NO_LIBRARY
+QT_END_NAMESPACE
+
#endif //QPLUGINLOADER_H
diff --git a/src/corelib/tools/qbytearray.cpp b/src/corelib/tools/qbytearray.cpp
index a9f361c205..3a6f5afa60 100644
--- a/src/corelib/tools/qbytearray.cpp
+++ b/src/corelib/tools/qbytearray.cpp
@@ -39,6 +39,7 @@
#include "qlist.h"
#include "qlocale.h"
#include "qlocale_p.h"
+#include "qlocale_tools_p.h"
#include "qstringalgorithms_p.h"
#include "qscopedpointer.h"
#include "qbytearray_p.h"
@@ -1713,6 +1714,14 @@ QByteArray &QByteArray::prepend(const char *str, int len)
return *this;
}
+/*! \fn QByteArray &QByteArray::prepend(int count, char ch)
+
+ \overload
+ \since 5.7
+
+ Prepends \a count copies of character \a ch to this byte array.
+*/
+
/*!
\overload
@@ -1825,6 +1834,17 @@ QByteArray &QByteArray::append(const char *str, int len)
return *this;
}
+/*! \fn QByteArray &QByteArray::append(int count, char ch)
+
+ \overload
+ \since 5.7
+
+ Appends \a count copies of character \a ch to this byte
+ array and returns a reference to this byte array.
+
+ If \a count is negative or zero nothing is appended to the byte array.
+*/
+
/*!
\overload
@@ -1941,6 +1961,33 @@ QByteArray &QByteArray::insert(int i, char ch)
return qbytearray_insert(this, i, &ch, 1);
}
+/*! \fn QByteArray &QByteArray::insert(int i, int count, char ch)
+
+ \overload
+ \since 5.7
+
+ Inserts \a count copies of character \a ch at index position \a i in the
+ byte array.
+
+ If \a i is greater than size(), the array is first extended using resize().
+*/
+
+QByteArray &QByteArray::insert(int i, int count, char ch)
+{
+ if (i < 0 || count <= 0)
+ return *this;
+
+ int oldsize = size();
+ resize(qMax(i, oldsize) + count);
+ char *dst = d->data();
+ if (i > oldsize)
+ ::memset(dst + oldsize, 0x20, i - oldsize);
+ else if (i < oldsize)
+ ::memmove(dst + i + count, dst + i, oldsize - i);
+ ::memset(dst + i, ch, count);
+ return *this;
+}
+
/*!
Removes \a len bytes from the array, starting at index position \a
pos, and returns a reference to the array.
@@ -3648,7 +3695,13 @@ ushort QByteArray::toUShort(bool *ok, int base) const
double QByteArray::toDouble(bool *ok) const
{
- return QLocaleData::bytearrayToDouble(nulTerminated().constData(), ok);
+ QByteArray nulled = nulTerminated();
+ bool nonNullOk = false;
+ int processed = 0;
+ double d = asciiToDouble(nulled.constData(), nulled.length(), nonNullOk, processed);
+ if (ok)
+ *ok = nonNullOk;
+ return d;
}
/*!
diff --git a/src/corelib/tools/qbytearray.h b/src/corelib/tools/qbytearray.h
index f0032227e8..6c79a603d3 100644
--- a/src/corelib/tools/qbytearray.h
+++ b/src/corelib/tools/qbytearray.h
@@ -255,21 +255,21 @@ public:
# define Q_REQUIRED_RESULT
# define Q_REQUIRED_RESULT_pushed
# endif
- QByteArray toLower() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toLower() const & Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QByteArray toLower() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toLower() && Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QByteArray toUpper() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toUpper() const & Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QByteArray toUpper() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray toUpper() && Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QByteArray trimmed() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray trimmed() const & Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QByteArray trimmed() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray trimmed() && Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QByteArray simplified() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray simplified() const & Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
- QByteArray simplified() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QByteArray simplified() && Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
# ifdef Q_REQUIRED_RESULT_pushed
# pragma pop_macro("Q_REQUIRED_RESULT")
@@ -285,14 +285,17 @@ public:
QByteArray rightJustified(int width, char fill = ' ', bool truncate = false) const Q_REQUIRED_RESULT;
QByteArray &prepend(char c);
+ QByteArray &prepend(int count, char c);
QByteArray &prepend(const char *s);
QByteArray &prepend(const char *s, int len);
QByteArray &prepend(const QByteArray &a);
QByteArray &append(char c);
+ QByteArray &append(int count, char c);
QByteArray &append(const char *s);
QByteArray &append(const char *s, int len);
QByteArray &append(const QByteArray &a);
QByteArray &insert(int i, char c);
+ QByteArray &insert(int i, int count, char c);
QByteArray &insert(int i, const char *s);
QByteArray &insert(int i, const char *s, int len);
QByteArray &insert(int i, const QByteArray &a);
@@ -568,6 +571,10 @@ inline QByteArray::const_iterator QByteArray::cend() const
{ return d->data() + d->size; }
inline QByteArray::const_iterator QByteArray::constEnd() const
{ return d->data() + d->size; }
+inline QByteArray &QByteArray::append(int n, char ch)
+{ return insert(d->size, n, ch); }
+inline QByteArray &QByteArray::prepend(int n, char ch)
+{ return insert(0, n, ch); }
inline QByteArray &QByteArray::operator+=(char c)
{ return append(c); }
inline QByteArray &QByteArray::operator+=(const char *s)
diff --git a/src/corelib/tools/qdoublescanprint_p.h b/src/corelib/tools/qdoublescanprint_p.h
new file mode 100644
index 0000000000..30ac584d06
--- /dev/null
+++ b/src/corelib/tools/qdoublescanprint_p.h
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the QtCore module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QDOUBLESCANPRINT_P_H
+#define QDOUBLESCANPRINT_P_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists for the convenience
+// of internal files. This header file may change from version to version
+// without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include <qglobal.h>
+
+#if defined(Q_CC_MSVC) && (defined(QT_BOOTSTRAPPED) || defined(QT_NO_DOUBLECONVERSION))
+# include <stdio.h>
+# include <locale.h>
+
+QT_BEGIN_NAMESPACE
+
+// We can always use _sscanf_l and _snprintf_l on MSVC as those were introduced in 2005.
+
+// MSVC doesn't document what it will do with a NULL locale passed to _sscanf_l or _snprintf_l.
+// The documentation for _create_locale() does not formally document "C" to be valid, but an example
+// code snippet in the same documentation shows it.
+
+struct QCLocaleT {
+ QCLocaleT() : locale(_create_locale(LC_ALL, "C"))
+ {
+ }
+
+ ~QCLocaleT()
+ {
+ _free_locale(locale);
+ }
+
+ const _locale_t locale;
+};
+
+# define QT_CLOCALE_HOLDER Q_GLOBAL_STATIC(QCLocaleT, cLocaleT)
+# define QT_CLOCALE cLocaleT()->locale
+
+inline int qDoubleSscanf(const char *buf, _locale_t locale, const char *format, double *d,
+ int *processed)
+{
+ return _sscanf_l(buf, format, locale, d, processed);
+}
+
+inline int qDoubleSnprintf(char *buf, size_t buflen, _locale_t locale, const char *format, double d)
+{
+ return _snprintf_l(buf, buflen, format, locale, d);
+}
+
+QT_END_NAMESPACE
+
+#elif defined(QT_BOOTSTRAPPED)
+# include <stdio.h>
+
+QT_BEGIN_NAMESPACE
+
+// When bootstrapping we don't have libdouble-conversion available, yet. We can also not use locale
+// aware snprintf and sscanf variants in the general case because those are only available on select
+// platforms. We can use the regular snprintf and sscanf because we don't do setlocale(3) when
+// bootstrapping and the locale is always "C" then.
+
+# define QT_CLOCALE_HOLDER
+# define QT_CLOCALE 0
+
+inline int qDoubleSscanf(const char *buf, int, const char *format, double *d, int *processed)
+{
+ return sscanf(buf, format, d, processed);
+}
+inline int qDoubleSnprintf(char *buf, size_t buflen, int, const char *format, double d)
+{
+ return snprintf(buf, buflen, format, d);
+}
+
+QT_END_NAMESPACE
+
+#else // !QT_BOOTSTRAPPED && (!Q_CC_MSVC || !QT_NO_DOUBLECONVERSION)
+# ifdef QT_NO_DOUBLECONVERSION
+# include <stdio.h>
+# include <xlocale.h>
+
+QT_BEGIN_NAMESPACE
+
+// OS X and FreeBSD both treat NULL as the "C" locale for snprintf_l and sscanf_l.
+// When other implementations with different behavior show up, we'll have to do newlocale(3) and
+// freelocale(3) here. The arguments to those will depend on what the other implementations will
+// offer. OS X and FreeBSD again interpret a locale name of NULL as "C", but "C" itself is not
+// documented as valid locale name. Mind that the names of the LC_* constants differ between e.g.
+// BSD variants and linux.
+
+# define QT_CLOCALE_HOLDER
+# define QT_CLOCALE NULL
+
+inline int qDoubleSscanf(const char *buf, locale_t locale, const char *format, double *d,
+ int *processed)
+{
+ return sscanf_l(buf, locale, format, d, processed);
+}
+inline int qDoubleSnprintf(char *buf, size_t buflen, locale_t locale, const char *format, double d)
+{
+ return snprintf_l(buf, buflen, locale, format, d);
+}
+
+QT_END_NAMESPACE
+
+# else // !QT_NO_DOUBLECONVERSION
+# include <double-conversion/double-conversion.h>
+# define QT_CLOCALE_HOLDER
+# endif // QT_NO_DOUBLECONVERSION
+#endif // QT_BOOTSTRAPPED
+
+#endif // QDOUBLESCANPRINT_P_H
diff --git a/src/corelib/tools/qlocale.cpp b/src/corelib/tools/qlocale.cpp
index b1f53dc7a2..dcb77a2c1b 100644
--- a/src/corelib/tools/qlocale.cpp
+++ b/src/corelib/tools/qlocale.cpp
@@ -2749,51 +2749,30 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
width = 0;
bool negative = false;
- bool special_number = false; // nan, +/-inf
QString num_str;
- // Detect special numbers (nan, +/-inf)
- if (qt_is_inf(d)) {
- num_str = QString::fromLatin1("inf");
- special_number = true;
- negative = d < 0;
- } else if (qt_is_nan(d)) {
- num_str = QString::fromLatin1("nan");
- special_number = true;
- }
-
- // Handle normal numbers
- if (!special_number) {
- int decpt, sign;
- QString digits;
-
- int mode;
- if (form == DFDecimal)
- mode = 3;
- else
- mode = 2;
-
- /* This next bit is a bit quirky. In DFExponent form, the precision
- is the number of digits after decpt. So that would suggest using
- mode=3 for qdtoa. But qdtoa behaves strangely when mode=3 and
- precision=0. So we get around this by using mode=2 and reasoning
- that we want precision+1 significant digits, since the decimal
- point in this mode is always after the first digit. */
- int pr = precision;
- if (form == DFExponent)
- ++pr;
-
- char *rve = 0;
- char *buff = 0;
- QT_TRY {
- digits = QLatin1String(qdtoa(d, mode, pr, &decpt, &sign, &rve, &buff));
- } QT_CATCH(...) {
- if (buff != 0)
- free(buff);
- QT_RETHROW;
- }
- if (buff != 0)
- free(buff);
+ int decpt;
+ int bufSize = 1;
+ if (form == DFDecimal) // optimize for numbers smaller than 512k
+ bufSize += ((d > (1 << 19) || d < -(1 << 19)) ? DoubleMaxDigitsBeforeDecimal : 6) +
+ precision;
+ else // Add extra digit due to different interpretations of precision. Also, "nan" has to fit.
+ bufSize += qMax(2, precision) + 1;
+
+ QVarLengthArray<char> buf(bufSize);
+ int length;
+
+ doubleToAscii(d, form, precision, buf.data(), bufSize, negative, length, decpt);
+
+ if (qstrncmp(buf.data(), "inf", 3) == 0 || qstrncmp(buf.data(), "nan", 3) == 0) {
+ num_str = QString::fromLatin1(buf.data(), length);
+ } else { // Handle normal numbers
+
+ // Chop trailing zeros
+ int last_nonzero_idx = length - 1;
+ while (last_nonzero_idx > 0 && buf[last_nonzero_idx] == '0')
+ --last_nonzero_idx;
+ QString digits = QString::fromLatin1(buf.data(), last_nonzero_idx + 1);
if (_zero.unicode() != '0') {
ushort z = _zero.unicode() - '0';
@@ -2831,23 +2810,22 @@ QString QLocaleData::doubleToString(const QChar _zero, const QChar plus, const Q
}
}
- negative = sign != 0 && !isZero(d);
- }
-
- // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
- // pad special numbers
- if (flags & QLocaleData::ZeroPadded
- && !(flags & QLocaleData::LeftAdjusted)
- && !special_number) {
- int num_pad_chars = width - num_str.length();
- // leave space for the sign
- if (negative
- || flags & QLocaleData::AlwaysShowSign
- || flags & QLocaleData::BlankBeforePositive)
- --num_pad_chars;
-
- for (int i = 0; i < num_pad_chars; ++i)
- num_str.prepend(_zero);
+ if (isZero(d))
+ negative = false;
+
+ // pad with zeros. LeftAdjusted overrides this flag). Also, we don't
+ // pad special numbers
+ if (flags & QLocaleData::ZeroPadded && !(flags & QLocaleData::LeftAdjusted)) {
+ int num_pad_chars = width - num_str.length();
+ // leave space for the sign
+ if (negative
+ || flags & QLocaleData::AlwaysShowSign
+ || flags & QLocaleData::BlankBeforePositive)
+ --num_pad_chars;
+
+ for (int i = 0; i < num_pad_chars; ++i)
+ num_str.prepend(_zero);
+ }
}
// add sign
@@ -3243,7 +3221,12 @@ double QLocaleData::stringToDouble(const QChar *begin, int len, bool *ok,
*ok = false;
return 0.0;
}
- return bytearrayToDouble(buff.constData(), ok);
+ int processed = 0;
+ bool nonNullOk = false;
+ double d = asciiToDouble(buff.constData(), buff.length() - 1, nonNullOk, processed);
+ if (ok)
+ *ok = nonNullOk;
+ return d;
}
qlonglong QLocaleData::stringToLongLong(const QChar *begin, int len, int base,
@@ -3274,53 +3257,15 @@ qulonglong QLocaleData::stringToUnsLongLong(const QChar *begin, int len, int bas
double QLocaleData::bytearrayToDouble(const char *num, bool *ok, bool *overflow)
{
- if (ok != 0)
- *ok = true;
- if (overflow != 0)
- *overflow = false;
-
- if (*num == '\0') {
- if (ok != 0)
- *ok = false;
- return 0.0;
- }
-
- if (qstrcmp(num, "nan") == 0)
- return qt_snan();
-
- if (qstrcmp(num, "+inf") == 0 || qstrcmp(num, "inf") == 0)
- return qt_inf();
-
- if (qstrcmp(num, "-inf") == 0)
- return -qt_inf();
-
- bool _ok;
- const char *endptr;
- double d = qstrtod(num, &endptr, &_ok);
-
- if (!_ok) {
- // the only way strtod can fail with *endptr != '\0' on a non-empty
- // input string is overflow
- if (ok != 0)
- *ok = false;
- if (overflow != 0)
- *overflow = *endptr != '\0';
- return 0.0;
- }
-
- if (*endptr != '\0') {
- // we stopped at a non-digit character after converting some digits
- if (ok != 0)
- *ok = false;
- if (overflow != 0)
- *overflow = false;
- return 0.0;
- }
-
- if (ok != 0)
- *ok = true;
- if (overflow != 0)
- *overflow = false;
+ bool nonNullOk = false;
+ int len = static_cast<int>(strlen(num));
+ Q_ASSERT(len >= 0);
+ int processed = 0;
+ double d = asciiToDouble(num, len, nonNullOk, processed);
+ if (ok)
+ *ok = nonNullOk;
+ if (overflow)
+ *overflow = processed < len;
return d;
}
diff --git a/src/corelib/tools/qlocale_p.h b/src/corelib/tools/qlocale_p.h
index b3fd7a96b8..d943612ff1 100644
--- a/src/corelib/tools/qlocale_p.h
+++ b/src/corelib/tools/qlocale_p.h
@@ -165,6 +165,17 @@ public:
QLocale::Country country);
static const QLocaleData *c();
+ // Maximum number of significant digits needed to represent a double.
+ // We cannot use std::numeric_limits here without constexpr.
+ static const int DoubleMantissaBits = 53;
+ static const int Log10_2_100000 = 30103; // log10(2) * 100000
+ // same as C++11 std::numeric_limits<T>::max_digits10
+ static const int DoubleMaxSignificant = (DoubleMantissaBits * Log10_2_100000) / 100000 + 2;
+
+ // Maximum number of digits before decimal point to represent a double
+ // Same as std::numeric_limits<double>::max_exponent10 + 1
+ static const int DoubleMaxDigitsBeforeDecimal = 309;
+
enum DoubleForm {
DFExponent = 0,
DFDecimal,
diff --git a/src/corelib/tools/qlocale_tools.cpp b/src/corelib/tools/qlocale_tools.cpp
index 03b911c4b3..18d1096c12 100644
--- a/src/corelib/tools/qlocale_tools.cpp
+++ b/src/corelib/tools/qlocale_tools.cpp
@@ -33,9 +33,12 @@
****************************************************************************/
#include "qlocale_tools_p.h"
+#include "qdoublescanprint_p.h"
#include "qlocale_p.h"
#include "qstring.h"
+#include <private/qnumeric_p.h>
+
#include <ctype.h>
#include <errno.h>
#include <float.h>
@@ -44,10 +47,6 @@
#include <stdlib.h>
#include <time.h>
-#ifdef Q_OS_WINCE
-# include "qfunctions_wince.h" // for _control87
-#endif
-
#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
# include <fenv.h>
#endif
@@ -68,6 +67,297 @@ QT_BEGIN_NAMESPACE
#include "../../3rdparty/freebsd/strtoull.c"
#include "../../3rdparty/freebsd/strtoll.c"
+QT_CLOCALE_HOLDER
+
+void doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+ bool &sign, int &length, int &decpt)
+{
+ if (bufSize == 0) {
+ decpt = 0;
+ sign = d < 0;
+ length = 0;
+ return;
+ }
+
+ // Detect special numbers (nan, +/-inf)
+ // We cannot use the high-level API of libdouble-conversion as we need to apply locale-specific
+ // formatting, such as decimal points, thousands-separators, etc. Because of this, we have to
+ // check for infinity and NaN before calling DoubleToAscii.
+ if (qt_is_inf(d)) {
+ sign = d < 0;
+ if (bufSize >= 3) {
+ buf[0] = 'i';
+ buf[1] = 'n';
+ buf[2] = 'f';
+ length = 3;
+ } else {
+ length = 0;
+ }
+ return;
+ } else if (qt_is_nan(d)) {
+ if (bufSize >= 3) {
+ buf[0] = 'n';
+ buf[1] = 'a';
+ buf[2] = 'n';
+ length = 3;
+ } else {
+ length = 0;
+ }
+ return;
+ }
+
+ if (form == QLocaleData::DFSignificantDigits && precision == 0)
+ precision = 1; // 0 significant digits is silently converted to 1
+
+#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
+ // one digit before the decimal dot, counts as significant digit for DoubleToStringConverter
+ if (form == QLocaleData::DFExponent && precision >= 0)
+ ++precision;
+
+ double_conversion::DoubleToStringConverter::DoubleToAscii(d,
+ form == QLocaleData::DFDecimal ? double_conversion::DoubleToStringConverter::FIXED :
+ double_conversion::DoubleToStringConverter::PRECISION,
+ precision, buf, bufSize, &sign, &length, &decpt);
+#else // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
+
+ // Cut the precision at 999, to fit it into the format string. We can't get more than 17
+ // significant digits, so anything after that is mostly noise. You do get closer to the "middle"
+ // of the range covered by the given double with more digits, so to a degree it does make sense
+ // to honor higher precisions. We define that at more than 999 digits that is not the case.
+ if (precision > 999)
+ precision = 999;
+
+ if (isZero(d)) {
+ // Negative zero is expected as simple "0", not "-0". We cannot do d < 0, though.
+ sign = false;
+ buf[0] = '0';
+ length = 1;
+ decpt = 1;
+ return;
+ } else if (d < 0) {
+ sign = true;
+ d = -d;
+ } else {
+ sign = false;
+ }
+
+ const int formatLength = 7; // '%', '.', 3 digits precision, 'f', '\0'
+ char format[formatLength];
+ format[formatLength - 1] = '\0';
+ format[0] = '%';
+ format[1] = '.';
+ format[2] = char((precision / 100) % 10) + '0';
+ format[3] = char((precision / 10) % 10) + '0';
+ format[4] = char(precision % 10) + '0';
+ int extraChars;
+ switch (form) {
+ case QLocaleData::DFDecimal:
+ format[formatLength - 2] = 'f';
+ // <anything> '.' <precision> '\0' - optimize for numbers smaller than 512k
+ extraChars = (d > (1 << 19) ? QLocaleData::DoubleMaxDigitsBeforeDecimal : 6) + 2;
+ break;
+ case QLocaleData::DFExponent:
+ format[formatLength - 2] = 'e';
+ // '.', 'e', '-', <exponent> '\0'
+ extraChars = 7;
+ break;
+ case QLocaleData::DFSignificantDigits:
+ format[formatLength - 2] = 'g';
+
+ // either the same as in the 'e' case, or '.' and '\0'
+ // precision covers part before '.'
+ extraChars = 7;
+ break;
+ default:
+ Q_UNREACHABLE();
+ }
+
+ QVarLengthArray<char> target(precision + extraChars);
+
+ length = qDoubleSnprintf(target.data(), target.size(), QT_CLOCALE, format, d);
+ int firstSignificant = 0;
+ int decptInTarget = length;
+
+ // Find the first significant digit (not 0), and note any '.' we encounter.
+ // There is no '-' at the front of target because we made sure d > 0 above.
+ while (firstSignificant < length) {
+ if (target[firstSignificant] == '.')
+ decptInTarget = firstSignificant;
+ else if (target[firstSignificant] != '0')
+ break;
+ ++firstSignificant;
+ }
+
+ // If no '.' found so far, search the rest of the target buffer for it.
+ if (decptInTarget == length)
+ decptInTarget = std::find(target.data() + firstSignificant, target.data() + length, '.') -
+ target.data();
+
+ int eSign = length;
+ if (form != QLocaleData::DFDecimal) {
+ // In 'e' or 'g' form, look for the 'e'.
+ eSign = std::find(target.data() + firstSignificant, target.data() + length, 'e') -
+ target.data();
+
+ if (eSign < length) {
+ // If 'e' is found, the final decimal point is determined by the number after 'e'.
+ // Mind that the final decimal point, decpt, is the offset of the decimal point from the
+ // start of the resulting string in buf. It may be negative or larger than bufSize, in
+ // which case the missing digits are zeroes. In the 'e' case decptInTarget is always 1,
+ // as variants of snprintf always generate numbers with one digit before the '.' then.
+ // This is why the final decimal point is offset by 1, relative to the number after 'e'.
+ bool ok;
+ const char *endptr;
+ decpt = qstrtoll(target.data() + eSign + 1, &endptr, 10, &ok) + 1;
+ Q_ASSERT(ok);
+ Q_ASSERT(endptr - target.data() <= length - eSign -1);
+ } else {
+ // No 'e' found, so it's the 'f' form. Variants of snprintf generate numbers with
+ // potentially multiple digits before the '.', but without decimal exponent then. So we
+ // get the final decimal point from the position of the '.'. The '.' itself takes up one
+ // character. We adjust by 1 below if that gets in the way.
+ decpt = decptInTarget - firstSignificant;
+ }
+ } else {
+ // In 'f' form, there can not be an 'e', so it's enough to look for the '.'
+ // (and possibly adjust by 1 below)
+ decpt = decptInTarget - firstSignificant;
+ }
+
+ // Move the actual digits from the snprintf target to the actual buffer.
+ if (decptInTarget > firstSignificant) {
+ // First move the digits before the '.', if any
+ int lengthBeforeDecpt = decptInTarget - firstSignificant;
+ memcpy(buf, target.data() + firstSignificant, qMin(lengthBeforeDecpt, bufSize));
+ if (eSign > decptInTarget && lengthBeforeDecpt < bufSize) {
+ // Then move any remaining digits, until 'e'
+ memcpy(buf + lengthBeforeDecpt, target.data() + decptInTarget + 1,
+ qMin(eSign - decptInTarget - 1, bufSize - lengthBeforeDecpt));
+ // The final length of the output is the distance between the first significant digit
+ // and 'e' minus 1, for the '.', except if the buffer is smaller.
+ length = qMin(eSign - firstSignificant - 1, bufSize);
+ } else {
+ // 'e' was before the decpt or things didn't fit. Don't subtract the '.' from the length.
+ length = qMin(eSign - firstSignificant, bufSize);
+ }
+ } else {
+ if (eSign > firstSignificant) {
+ // If there are any significant digits at all, they are all after the '.' now.
+ // Just copy them straight away.
+ memcpy(buf, target.data() + firstSignificant, qMin(eSign - firstSignificant, bufSize));
+
+ // The decimal point was before the first significant digit, so we were one off above.
+ // Consider 0.1 - buf will be just '1', and decpt should be 0. But
+ // "decptInTarget - firstSignificant" will yield -1.
+ ++decpt;
+ length = qMin(eSign - firstSignificant, bufSize);
+ } else {
+ // No significant digits means the number is just 0.
+ buf[0] = '0';
+ length = 1;
+ decpt = 1;
+ }
+ }
+#endif // QT_NO_DOUBLECONVERSION || QT_BOOTSTRAPPED
+}
+
+double asciiToDouble(const char *num, int numLen, bool &ok, int &processed)
+{
+ if (*num == '\0') {
+ ok = false;
+ processed = 0;
+ return 0.0;
+ }
+
+ ok = true;
+
+ // We have to catch NaN before because we need NaN as marker for "garbage" in the
+ // libdouble-conversion case and, in contrast to libdouble-conversion or sscanf, we don't allow
+ // "-nan" or "+nan"
+ if (qstrcmp(num, "nan") == 0) {
+ processed = 3;
+ return qt_snan();
+ } else if ((num[0] == '-' || num[0] == '+') && qstrcmp(num + 1, "nan") == 0) {
+ processed = 0;
+ ok = false;
+ return 0.0;
+ }
+
+ // Infinity values are implementation defined in the sscanf case. In the libdouble-conversion
+ // case we need infinity as overflow marker.
+ if (qstrcmp(num, "+inf") == 0) {
+ processed = 4;
+ return qt_inf();
+ } else if (qstrcmp(num, "inf") == 0) {
+ processed = 3;
+ return qt_inf();
+ } else if (qstrcmp(num, "-inf") == 0) {
+ processed = 4;
+ return -qt_inf();
+ }
+
+ double d = 0.0;
+#if !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
+ int conv_flags = double_conversion::StringToDoubleConverter::NO_FLAGS;
+ double_conversion::StringToDoubleConverter conv(conv_flags, 0.0, qt_snan(), 0, 0);
+ d = conv.StringToDouble(num, numLen, &processed);
+
+ if (!qIsFinite(d)) {
+ ok = false;
+ if (qIsNaN(d)) {
+ // Garbage found. We don't accept it and return 0.
+ processed = 0;
+ return 0.0;
+ } else {
+ // Overflow. That's not OK, but we still return infinity.
+ return d;
+ }
+ }
+#else
+ if (qDoubleSscanf(num, QT_CLOCALE, "%lf%n", &d, &processed) < 1)
+ processed = 0;
+
+ if (processed != numLen || qIsNaN(d)) {
+ // Implementation defined nan symbol or garbage found. We don't accept it.
+ processed = 0;
+ ok = false;
+ return 0.0;
+ }
+
+ if (!qIsFinite(d)) {
+ // Overflow. Check for implementation-defined infinity symbols and reject them.
+ // We assume that any infinity symbol has to contain a character that cannot be part of a
+ // "normal" number (that is 0-9, ., -, +, e).
+ ok = false;
+ for (int i = 0; i < numLen; ++i) {
+ char c = num[i];
+ if ((c < '0' || c > '9') && c != '.' && c != '-' && c != '+' && c != 'e') {
+ // Garbage found
+ processed = 0;
+ return 0.0;
+ }
+ }
+ return d;
+ }
+#endif // !defined(QT_NO_DOUBLECONVERSION) && !defined(QT_BOOTSTRAPPED)
+
+ Q_ASSERT(processed == numLen); // Otherwise we would have gotten NaN or sorted it out above.
+
+ // Check if underflow has occurred.
+ if (isZero(d)) {
+ for (int i = 0; i < numLen; ++i) {
+ if (num[i] >= '1' && num[i] <= '9') {
+ // if a digit before any 'e' is not 0, then a non-zero number was intended.
+ ok = false;
+ return 0.0;
+ } else if (num[i] == 'e') {
+ break;
+ }
+ }
+ }
+ return d;
+}
+
unsigned long long
qstrtoull(const char * nptr, const char **endptr, int base, bool *ok)
{
@@ -114,9 +404,6 @@ qstrtoll(const char * nptr, const char **endptr, int base, bool *ok)
return result;
}
-static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt,
- int *sign, char **rve, char **digits_str);
-
QString qulltoa(qulonglong l, int base, const QChar _zero)
{
ushort buff[65]; // length of MAX_ULLONG in base 2
@@ -225,2393 +512,41 @@ QString &exponentForm(QChar zero, QChar decimal, QChar exponential,
return digits;
}
-/* From: NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp */
-/* $FreeBSD: src/lib/libc/stdlib/netbsd_strtod.c,v 1.2.2.2 2001/03/02 17:14:15 tegge Exp $ */
-
-/* Please send bug reports to
- David M. Gay
- AT&T Bell Laboratories, Room 2C-463
- 600 Mountain Avenue
- Murray Hill, NJ 07974-2070
- U.S.A.
- dmg@research.att.com or research!dmg
- */
-
-/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
- *
- * This strtod returns a nearest machine number to the input decimal
- * string (or sets errno to ERANGE). With IEEE arithmetic, ties are
- * broken by the IEEE round-even rule. Otherwise ties are broken by
- * biased rounding (add half and chop).
- *
- * Inspired loosely by William D. Clinger's paper "How to Read Floating
- * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- *
- * 1. We only require IEEE, IBM, or VAX double-precision
- * arithmetic (not IEEE double-extended).
- * 2. We get by with floating-point arithmetic in a case that
- * Clinger missed -- when we're computing d * 10^n
- * for a small integer d and the integer n is not too
- * much larger than 22 (the maximum integer k for which
- * we can represent 10^k exactly), we may be able to
- * compute (d*10^k) * 10^(e-k) with just one roundoff.
- * 3. Rather than a bit-at-a-time adjustment of the binary
- * result in the hard case, we use floating-point
- * arithmetic to determine the adjustment to within
- * one bit; only in really hard cases do we need to
- * compute a second residual.
- * 4. Because of 3., we don't need a large table of powers of 10
- * for ten-to-e (just some small tables, e.g. of 10^k
- * for 0 <= k <= 22).
- */
-
-/*
- * #define IEEE_LITTLE_ENDIAN for IEEE-arithmetic machines where the least
- * significant byte has the lowest address.
- * #define IEEE_BIG_ENDIAN for IEEE-arithmetic machines where the most
- * significant byte has the lowest address.
- * #define Long int on machines with 32-bit ints and 64-bit longs.
- * #define Sudden_Underflow for IEEE-format machines without gradual
- * underflow (i.e., that flush to zero on underflow).
- * #define IBM for IBM mainframe-style floating-point arithmetic.
- * #define VAX for VAX-style floating-point arithmetic.
- * #define Unsigned_Shifts if >> does treats its left operand as unsigned.
- * #define No_leftright to omit left-right logic in fast floating-point
- * computation of dtoa.
- * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
- * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
- * that use extended-precision instructions to compute rounded
- * products and quotients) with IBM.
- * #define ROUND_BIASED for IEEE-format with biased rounding.
- * #define Inaccurate_Divide for IEEE-format with correctly rounded
- * products but inaccurate quotients, e.g., for Intel i860.
- * #define Just_16 to store 16 bits per 32-bit Long when doing high-precision
- * integer arithmetic. Whether this speeds things up or slows things
- * down depends on the machine and the number being converted.
- * #define KR_headers for old-style C function headers.
- * #define Bad_float_h if your system lacks a float.h or if it does not
- * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
- * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
- * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
- * if memory is available and otherwise does something you deem
- * appropriate. If MALLOC is undefined, malloc will be invoked
- * directly -- and assumed always to succeed.
- */
-
-#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: strtod.c,v 1.26 1998/02/03 18:44:21 perry Exp $");
-#endif /* LIBC_SCCS and not lint */
-
-/*
-#if defined(__m68k__) || defined(__sparc__) || defined(__i386__) || \
- defined(__mips__) || defined(__ns32k__) || defined(__alpha__) || \
- defined(__powerpc__) || defined(Q_OS_WIN) || defined(Q_OS_DARWIN) || defined(Q_OS_MAC) || \
- defined(mips) || defined(Q_OS_AIX) || defined(Q_OS_SOLARIS)
-# define IEEE_BIG_OR_LITTLE_ENDIAN 1
-#endif
-*/
-
-// *All* of our architectures have IEEE arithmetic, don't they?
-#define IEEE_BIG_OR_LITTLE_ENDIAN 1
-
-#ifdef __arm32__
-/*
- * Although the CPU is little endian the FP has different
- * byte and word endianness. The byte order is still little endian
- * but the word order is big endian.
- */
-#define IEEE_BIG_OR_LITTLE_ENDIAN
-#endif
-
-#ifdef vax
-#define VAX
-#endif
-
-#define Long qint32
-#define ULong quint32
-
-#define MALLOC malloc
-
-#ifdef BSD_QDTOA_DEBUG
-QT_BEGIN_INCLUDE_NAMESPACE
-#include <stdio.h>
-QT_END_INCLUDE_NAMESPACE
-
-#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
-#endif
-
-#ifdef Unsigned_Shifts
-#define Sign_Extend(a,b) if (b < 0) a |= 0xffff0000;
-#else
-#define Sign_Extend(a,b) /*no-op*/
-#endif
-
-#if (defined(IEEE_BIG_OR_LITTLE_ENDIAN) + defined(VAX) + defined(IBM)) != 1
-#error Exactly one of IEEE_BIG_OR_LITTLE_ENDIAN, VAX, or IBM should be defined.
-#endif
-
-static inline ULong getWord0(const NEEDS_VOLATILE double x)
-{
- const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ptr[0]<<24) + (ptr[1]<<16) + (ptr[2]<<8) + ptr[3];
- } else {
- return (ptr[7]<<24) + (ptr[6]<<16) + (ptr[5]<<8) + ptr[4];
- }
-}
-
-static inline void setWord0(NEEDS_VOLATILE double *x, ULong l)
-{
- NEEDS_VOLATILE uchar *ptr = reinterpret_cast<NEEDS_VOLATILE uchar *>(x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- ptr[0] = uchar(l>>24);
- ptr[1] = uchar(l>>16);
- ptr[2] = uchar(l>>8);
- ptr[3] = uchar(l);
- } else {
- ptr[7] = uchar(l>>24);
- ptr[6] = uchar(l>>16);
- ptr[5] = uchar(l>>8);
- ptr[4] = uchar(l);
- }
-}
-
-static inline ULong getWord1(const NEEDS_VOLATILE double x)
-{
- const NEEDS_VOLATILE uchar *ptr = reinterpret_cast<const NEEDS_VOLATILE uchar *>(&x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- return (ptr[4]<<24) + (ptr[5]<<16) + (ptr[6]<<8) + ptr[7];
- } else {
- return (ptr[3]<<24) + (ptr[2]<<16) + (ptr[1]<<8) + ptr[0];
- }
-}
-static inline void setWord1(NEEDS_VOLATILE double *x, ULong l)
-{
- NEEDS_VOLATILE uchar *ptr = reinterpret_cast<uchar NEEDS_VOLATILE *>(x);
- if (QSysInfo::ByteOrder == QSysInfo::BigEndian) {
- ptr[4] = uchar(l>>24);
- ptr[5] = uchar(l>>16);
- ptr[6] = uchar(l>>8);
- ptr[7] = uchar(l);
- } else {
- ptr[3] = uchar(l>>24);
- ptr[2] = uchar(l>>16);
- ptr[1] = uchar(l>>8);
- ptr[0] = uchar(l);
- }
-}
-
-static inline void Storeinc(ULong *&a, const ULong &b, const ULong &c)
-{
-
- *a = (ushort(b) << 16) | ushort(c);
- ++a;
-}
-
-/* #define P DBL_MANT_DIG */
-/* Ten_pmax = floor(P*log(2)/log(5)) */
-/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
-/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
-/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
-
-#if defined(IEEE_BIG_OR_LITTLE_ENDIAN)
-#define Exp_shift 20
-#define Exp_shift1 20
-#define Exp_msk1 0x100000
-#define Exp_msk11 0x100000
-#define Exp_mask 0x7ff00000
-#define P 53
-#define Bias 1023
-#define IEEE_Arith
-#define Emin (-1022)
-#define Exp_1 0x3ff00000
-#define Exp_11 0x3ff00000
-#define Ebits 11
-#define Frac_mask 0xfffff
-#define Frac_mask1 0xfffff
-#define Ten_pmax 22
-#define Bletch 0x10
-#define Bndry_mask 0xfffff
-#define Bndry_mask1 0xfffff
-#if defined(LSB) && defined(Q_OS_VXWORKS)
-#undef LSB
-#endif
-#define LSB 1
-#define Sign_bit 0x80000000
-#define Log2P 1
-#define Tiny0 0
-#define Tiny1 1
-#define Quick_max 14
-#define Int_max 14
-#define Infinite(x) (getWord0(x) == 0x7ff00000) /* sufficient test for here */
-#else
-#undef Sudden_Underflow
-#define Sudden_Underflow
-#ifdef IBM
-#define Exp_shift 24
-#define Exp_shift1 24
-#define Exp_msk1 0x1000000
-#define Exp_msk11 0x1000000
-#define Exp_mask 0x7f000000
-#define P 14
-#define Bias 65
-#define Exp_1 0x41000000
-#define Exp_11 0x41000000
-#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
-#define Frac_mask 0xffffff
-#define Frac_mask1 0xffffff
-#define Bletch 4
-#define Ten_pmax 22
-#define Bndry_mask 0xefffff
-#define Bndry_mask1 0xffffff
-#define LSB 1
-#define Sign_bit 0x80000000
-#define Log2P 4
-#define Tiny0 0x100000
-#define Tiny1 0
-#define Quick_max 14
-#define Int_max 15
-#else /* VAX */
-#define Exp_shift 23
-#define Exp_shift1 7
-#define Exp_msk1 0x80
-#define Exp_msk11 0x800000
-#define Exp_mask 0x7f80
-#define P 56
-#define Bias 129
-#define Exp_1 0x40800000
-#define Exp_11 0x4080
-#define Ebits 8
-#define Frac_mask 0x7fffff
-#define Frac_mask1 0xffff007f
-#define Ten_pmax 24
-#define Bletch 2
-#define Bndry_mask 0xffff007f
-#define Bndry_mask1 0xffff007f
-#define LSB 0x10000
-#define Sign_bit 0x8000
-#define Log2P 1
-#define Tiny0 0x80
-#define Tiny1 0
-#define Quick_max 15
-#define Int_max 15
-#endif
-#endif
-
-#ifndef IEEE_Arith
-#define ROUND_BIASED
-#endif
-
-#ifdef RND_PRODQUOT
-#define rounded_product(a,b) a = rnd_prod(a, b)
-#define rounded_quotient(a,b) a = rnd_quot(a, b)
-extern double rnd_prod(double, double), rnd_quot(double, double);
-#else
-#define rounded_product(a,b) a *= b
-#define rounded_quotient(a,b) a /= b
-#endif
-
-#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
-#define Big1 0xffffffff
-
-#ifndef Just_16
-/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
- * This makes some inner loops simpler and sometimes saves work
- * during multiplications, but it often seems to make things slightly
- * slower. Hence the default is now to store 32 bits per Long.
- */
-#ifndef Pack_32
-#define Pack_32
-#endif
-#endif
-
-#define Kmax 15
-
-struct
-Bigint {
- struct Bigint *next;
- int k, maxwds, sign, wds;
- ULong x[1];
-};
-
- typedef struct Bigint Bigint;
-
-static Bigint *Balloc(int k)
-{
- int x;
- Bigint *rv;
-
- x = 1 << k;
- rv = static_cast<Bigint *>(MALLOC(sizeof(Bigint) + (x-1)*sizeof(Long)));
- Q_CHECK_PTR(rv);
- rv->k = k;
- rv->maxwds = x;
- rv->sign = rv->wds = 0;
- return rv;
-}
-
-static void Bfree(Bigint *v)
-{
- free(v);
-}
-
-#define Bcopy(x,y) memcpy(reinterpret_cast<char *>(&x->sign), reinterpret_cast<char *>(&y->sign), \
-y->wds*sizeof(Long) + 2*sizeof(int))
-
-/* multiply by m and add a */
-static Bigint *multadd(Bigint *b, int m, int a)
-{
- int i, wds;
- ULong *x, y;
-#ifdef Pack_32
- ULong xi, z;
-#endif
- Bigint *b1;
-
- wds = b->wds;
- x = b->x;
- i = 0;
- do {
-#ifdef Pack_32
- xi = *x;
- y = (xi & 0xffff) * m + a;
- z = (xi >> 16) * m + (y >> 16);
- a = (z >> 16);
- *x++ = (z << 16) + (y & 0xffff);
-#else
- y = *x * m + a;
- a = (y >> 16);
- *x++ = y & 0xffff;
-#endif
- }
- while(++i < wds);
- if (a) {
- if (wds >= b->maxwds) {
- b1 = Balloc(b->k+1);
- Bcopy(b1, b);
- Bfree(b);
- b = b1;
- }
- b->x[wds++] = a;
- b->wds = wds;
- }
- return b;
-}
-
-static Bigint *s2b(const char *s, int nd0, int nd, ULong y9)
-{
- Bigint *b;
- int i, k;
- Long x, y;
-
- x = (nd + 8) / 9;
- for(k = 0, y = 1; x > y; y <<= 1, k++) ;
-#ifdef Pack_32
- b = Balloc(k);
- b->x[0] = y9;
- b->wds = 1;
-#else
- b = Balloc(k+1);
- b->x[0] = y9 & 0xffff;
- b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
-#endif
-
- i = 9;
- if (9 < nd0) {
- s += 9;
- do b = multadd(b, 10, *s++ - '0');
- while(++i < nd0);
- s++;
- }
- else
- s += 10;
- for(; i < nd; i++)
- b = multadd(b, 10, *s++ - '0');
- return b;
-}
-
-static int hi0bits(ULong x)
-{
- int k = 0;
-
- if (!(x & 0xffff0000)) {
- k = 16;
- x <<= 16;
- }
- if (!(x & 0xff000000)) {
- k += 8;
- x <<= 8;
- }
- if (!(x & 0xf0000000)) {
- k += 4;
- x <<= 4;
- }
- if (!(x & 0xc0000000)) {
- k += 2;
- x <<= 2;
- }
- if (!(x & 0x80000000)) {
- k++;
- if (!(x & 0x40000000))
- return 32;
- }
- return k;
-}
-
-static int lo0bits(ULong *y)
-{
- int k;
- ULong x = *y;
-
- if (x & 7) {
- if (x & 1)
- return 0;
- if (x & 2) {
- *y = x >> 1;
- return 1;
- }
- *y = x >> 2;
- return 2;
- }
- k = 0;
- if (!(x & 0xffff)) {
- k = 16;
- x >>= 16;
- }
- if (!(x & 0xff)) {
- k += 8;
- x >>= 8;
- }
- if (!(x & 0xf)) {
- k += 4;
- x >>= 4;
- }
- if (!(x & 0x3)) {
- k += 2;
- x >>= 2;
- }
- if (!(x & 1)) {
- k++;
- x >>= 1;
- if (!x & 1)
- return 32;
- }
- *y = x;
- return k;
-}
-
-static Bigint *i2b(int i)
-{
- Bigint *b;
-
- b = Balloc(1);
- b->x[0] = i;
- b->wds = 1;
- return b;
-}
-
-static Bigint *mult(Bigint *a, Bigint *b)
-{
- Bigint *c;
- int k, wa, wb, wc;
- ULong carry, y, z;
- ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
-#ifdef Pack_32
- ULong z2;
-#endif
-
- if (a->wds < b->wds) {
- c = a;
- a = b;
- b = c;
- }
- k = a->k;
- wa = a->wds;
- wb = b->wds;
- wc = wa + wb;
- if (wc > a->maxwds)
- k++;
- c = Balloc(k);
- for(x = c->x, xa = x + wc; x < xa; x++)
- *x = 0;
- xa = a->x;
- xae = xa + wa;
- xb = b->x;
- xbe = xb + wb;
- xc0 = c->x;
-#ifdef Pack_32
- for(; xb < xbe; xb++, xc0++) {
- if ((y = *xb & 0xffff) != 0) {
- x = xa;
- xc = xc0;
- carry = 0;
- do {
- z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
- carry = z >> 16;
- z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
- carry = z2 >> 16;
- Storeinc(xc, z2, z);
- }
- while(x < xae);
- *xc = carry;
- }
- if ((y = *xb >> 16) != 0) {
- x = xa;
- xc = xc0;
- carry = 0;
- z2 = *xc;
- do {
- z = (*x & 0xffff) * y + (*xc >> 16) + carry;
- carry = z >> 16;
- Storeinc(xc, z, z2);
- z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
- carry = z2 >> 16;
- }
- while(x < xae);
- *xc = z2;
- }
- }
-#else
- for(; xb < xbe; xc0++) {
- if (y = *xb++) {
- x = xa;
- xc = xc0;
- carry = 0;
- do {
- z = *x++ * y + *xc + carry;
- carry = z >> 16;
- *xc++ = z & 0xffff;
- }
- while(x < xae);
- *xc = carry;
- }
- }
-#endif
- for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
- c->wds = wc;
- return c;
-}
-
-static Bigint *p5s;
-
-struct p5s_deleter
-{
- ~p5s_deleter()
- {
- while (p5s) {
- Bigint *next = p5s->next;
- Bfree(p5s);
- p5s = next;
- }
- }
-};
-
-static Bigint *pow5mult(Bigint *b, int k)
-{
- Bigint *b1, *p5, *p51;
- int i;
- static const int p05[3] = { 5, 25, 125 };
-
- if ((i = k & 3) != 0)
- b = multadd(b, p05[i-1], 0);
-
- if (!(k >>= 2))
- return b;
- if (!(p5 = p5s)) {
- /* first time */
- static p5s_deleter deleter;
- p5 = p5s = i2b(625);
- p5->next = 0;
- }
- for(;;) {
- if (k & 1) {
- b1 = mult(b, p5);
- Bfree(b);
- b = b1;
- }
- if (!(k >>= 1))
- break;
- if (!(p51 = p5->next)) {
- p51 = p5->next = mult(p5,p5);
- p51->next = 0;
- }
- p5 = p51;
- }
- return b;
-}
-
-static Bigint *lshift(Bigint *b, int k)
-{
- int i, k1, n, n1;
- Bigint *b1;
- ULong *x, *x1, *xe, z;
-
-#ifdef Pack_32
- n = k >> 5;
-#else
- n = k >> 4;
-#endif
- k1 = b->k;
- n1 = n + b->wds + 1;
- for(i = b->maxwds; n1 > i; i <<= 1)
- k1++;
- b1 = Balloc(k1);
- x1 = b1->x;
- for(i = 0; i < n; i++)
- *x1++ = 0;
- x = b->x;
- xe = x + b->wds;
-#ifdef Pack_32
- if (k &= 0x1f) {
- k1 = 32 - k;
- z = 0;
- do {
- *x1++ = *x << k | z;
- z = *x++ >> k1;
- }
- while(x < xe);
- if ((*x1 = z) != 0)
- ++n1;
- }
-#else
- if (k &= 0xf) {
- k1 = 16 - k;
- z = 0;
- do {
- *x1++ = *x << k & 0xffff | z;
- z = *x++ >> k1;
- }
- while(x < xe);
- if (*x1 = z)
- ++n1;
- }
-#endif
- else do
- *x1++ = *x++;
- while(x < xe);
- b1->wds = n1 - 1;
- Bfree(b);
- return b1;
-}
-
-static int cmp(Bigint *a, Bigint *b)
-{
- ULong *xa, *xa0, *xb, *xb0;
- int i, j;
-
- i = a->wds;
- j = b->wds;
-#ifdef BSD_QDTOA_DEBUG
- if (i > 1 && !a->x[i-1])
- Bug("cmp called with a->x[a->wds-1] == 0");
- if (j > 1 && !b->x[j-1])
- Bug("cmp called with b->x[b->wds-1] == 0");
-#endif
- if (i -= j)
- return i;
- xa0 = a->x;
- xa = xa0 + j;
- xb0 = b->x;
- xb = xb0 + j;
- for(;;) {
- if (*--xa != *--xb)
- return *xa < *xb ? -1 : 1;
- if (xa <= xa0)
- break;
- }
- return 0;
-}
-
-static Bigint *diff(Bigint *a, Bigint *b)
-{
- Bigint *c;
- int i, wa, wb;
- Long borrow, y; /* We need signed shifts here. */
- ULong *xa, *xae, *xb, *xbe, *xc;
-#ifdef Pack_32
- Long z;
-#endif
-
- i = cmp(a,b);
- if (!i) {
- c = Balloc(0);
- c->wds = 1;
- c->x[0] = 0;
- return c;
- }
- if (i < 0) {
- c = a;
- a = b;
- b = c;
- i = 1;
- }
- else
- i = 0;
- c = Balloc(a->k);
- c->sign = i;
- wa = a->wds;
- xa = a->x;
- xae = xa + wa;
- wb = b->wds;
- xb = b->x;
- xbe = xb + wb;
- xc = c->x;
- borrow = 0;
-#ifdef Pack_32
- do {
- y = (*xa & 0xffff) - (*xb & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*xa++ >> 16) - (*xb++ >> 16) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(xc, z, y);
- }
- while(xb < xbe);
- while(xa < xae) {
- y = (*xa & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*xa++ >> 16) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(xc, z, y);
- }
-#else
- do {
- y = *xa++ - *xb++ + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *xc++ = y & 0xffff;
- }
- while(xb < xbe);
- while(xa < xae) {
- y = *xa++ + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *xc++ = y & 0xffff;
- }
-#endif
- while(!*--xc)
- wa--;
- c->wds = wa;
- return c;
-}
-
-static double ulp(double x)
+double qstrtod(const char *s00, const char **se, bool *ok)
{
- Long L;
- double a;
-
- L = (getWord0(x) & Exp_mask) - (P-1)*Exp_msk1;
-#ifndef Sudden_Underflow
- if (L > 0) {
-#endif
-#ifdef IBM
- L |= Exp_msk1 >> 4;
-#endif
- setWord0(&a, L);
- setWord1(&a, 0);
-#ifndef Sudden_Underflow
- }
- else {
- L = -L >> Exp_shift;
- if (L < Exp_shift) {
- setWord0(&a, 0x80000 >> L);
- setWord1(&a, 0);
- }
- else {
- setWord0(&a, 0);
- L -= Exp_shift;
- setWord1(&a, L >= 31 ? 1U : 1U << (31 - L));
- }
- }
-#endif
- return a;
-}
-
-static double b2d(Bigint *a, int *e)
-{
- ULong *xa, *xa0, w, y, z;
- int k;
- double d;
-
- xa0 = a->x;
- xa = xa0 + a->wds;
- y = *--xa;
-#ifdef BSD_QDTOA_DEBUG
- if (!y) Bug("zero y in b2d");
-#endif
- k = hi0bits(y);
- *e = 32 - k;
-#ifdef Pack_32
- if (k < Ebits) {
- setWord0(&d, Exp_1 | y >> (Ebits - k));
- w = xa > xa0 ? *--xa : 0;
- setWord1(&d, y << ((32-Ebits) + k) | w >> (Ebits - k));
- goto ret_d;
- }
- z = xa > xa0 ? *--xa : 0;
- if (k -= Ebits) {
- setWord0(&d, Exp_1 | y << k | z >> (32 - k));
- y = xa > xa0 ? *--xa : 0;
- setWord1(&d, z << k | y >> (32 - k));
- }
- else {
- setWord0(&d, Exp_1 | y);
- setWord1(&d, z);
- }
-#else
- if (k < Ebits + 16) {
- z = xa > xa0 ? *--xa : 0;
- setWord0(&d, Exp_1 | y << k - Ebits | z >> Ebits + 16 - k);
- w = xa > xa0 ? *--xa : 0;
- y = xa > xa0 ? *--xa : 0;
- setWord1(&d, z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k);
- goto ret_d;
- }
- z = xa > xa0 ? *--xa : 0;
- w = xa > xa0 ? *--xa : 0;
- k -= Ebits + 16;
- setWord0(&d, Exp_1 | y << k + 16 | z << k | w >> 16 - k);
- y = xa > xa0 ? *--xa : 0;
- setWord1(&d, w << k + 16 | y << k);
-#endif
- ret_d:
- return d;
-}
-
-static Bigint *d2b(double d, int *e, int *bits)
-{
- Bigint *b;
- int de, i, k;
- ULong *x, y, z;
-
-#ifdef Pack_32
- b = Balloc(1);
-#else
- b = Balloc(2);
-#endif
- x = b->x;
-
- z = getWord0(d) & Frac_mask;
- setWord0(&d, getWord0(d) & 0x7fffffff); /* clear sign bit, which we ignore */
-#ifdef Sudden_Underflow
- de = (int)(getWord0(d) >> Exp_shift);
-#ifndef IBM
- z |= Exp_msk11;
-#endif
-#else
- if ((de = int(getWord0(d) >> Exp_shift)) != 0)
- z |= Exp_msk1;
-#endif
-#ifdef Pack_32
- if ((y = getWord1(d)) != 0) {
- if ((k = lo0bits(&y)) != 0) {
- x[0] = y | z << (32 - k);
- z >>= k;
- }
- else
- x[0] = y;
- i = b->wds = (x[1] = z) ? 2 : 1;
- }
- else {
-#ifdef BSD_QDTOA_DEBUG
- if (!z)
- Bug("Zero passed to d2b");
-#endif
- k = lo0bits(&z);
- x[0] = z;
- i = b->wds = 1;
- k += 32;
- }
-#else
- if (y = getWord1(d)) {
- if (k = lo0bits(&y))
- if (k >= 16) {
- x[0] = y | z << 32 - k & 0xffff;
- x[1] = z >> k - 16 & 0xffff;
- x[2] = z >> k;
- i = 2;
- }
- else {
- x[0] = y & 0xffff;
- x[1] = y >> 16 | z << 16 - k & 0xffff;
- x[2] = z >> k & 0xffff;
- x[3] = z >> k+16;
- i = 3;
- }
- else {
- x[0] = y & 0xffff;
- x[1] = y >> 16;
- x[2] = z & 0xffff;
- x[3] = z >> 16;
- i = 3;
- }
- }
- else {
-#ifdef BSD_QDTOA_DEBUG
- if (!z)
- Bug("Zero passed to d2b");
-#endif
- k = lo0bits(&z);
- if (k >= 16) {
- x[0] = z;
- i = 0;
- }
- else {
- x[0] = z & 0xffff;
- x[1] = z >> 16;
- i = 1;
- }
- k += 32;
- }
- while(!x[i])
- --i;
- b->wds = i + 1;
-#endif
-#ifndef Sudden_Underflow
- if (de) {
-#endif
-#ifdef IBM
- *e = (de - Bias - (P-1) << 2) + k;
- *bits = 4*P + 8 - k - hi0bits(getWord0(d) & Frac_mask);
-#else
- *e = de - Bias - (P-1) + k;
- *bits = P - k;
-#endif
-#ifndef Sudden_Underflow
- }
- else {
- *e = de - Bias - (P-1) + 1 + k;
-#ifdef Pack_32
- *bits = 32*i - hi0bits(x[i-1]);
-#else
- *bits = (i+2)*16 - hi0bits(x[i]);
-#endif
- }
-#endif
- return b;
-}
-
-static double ratio(Bigint *a, Bigint *b)
-{
- double da, db;
- int k, ka, kb;
-
- da = b2d(a, &ka);
- db = b2d(b, &kb);
-#ifdef Pack_32
- k = ka - kb + 32*(a->wds - b->wds);
-#else
- k = ka - kb + 16*(a->wds - b->wds);
-#endif
-#ifdef IBM
- if (k > 0) {
- setWord0(&da, getWord0(da) + (k >> 2)*Exp_msk1);
- if (k &= 3)
- da *= 1 << k;
- }
- else {
- k = -k;
- setWord0(&db, getWord0(db) + (k >> 2)*Exp_msk1);
- if (k &= 3)
- db *= 1 << k;
- }
-#else
- if (k > 0)
- setWord0(&da, getWord0(da) + k*Exp_msk1);
- else {
- k = -k;
- setWord0(&db, getWord0(db) + k*Exp_msk1);
- }
-#endif
- return da / db;
-}
-
-static const double tens[] = {
- 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
- 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
- 1e20, 1e21, 1e22
-#ifdef VAX
- , 1e23, 1e24
-#endif
-};
-
-#ifdef IEEE_Arith
-static const double bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
-static const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
-#define n_bigtens 5
-#else
-#ifdef IBM
-static const double bigtens[] = { 1e16, 1e32, 1e64 };
-static const double tinytens[] = { 1e-16, 1e-32, 1e-64 };
-#define n_bigtens 3
-#else
-static const double bigtens[] = { 1e16, 1e32 };
-static const double tinytens[] = { 1e-16, 1e-32 };
-#define n_bigtens 2
-#endif
-#endif
-
-/*
- The pre-release gcc3.3 shipped with SuSE 8.2 has a bug which causes
- the comparison 1e-100 == 0.0 to return true. As a workaround, we
- compare it to a global variable containing 0.0, which produces
- correct assembler output.
-
- ### consider detecting the broken compilers and using the static
- ### double for these, and use a #define for all working compilers
-*/
-static double g_double_zero = 0.0;
-
-Q_CORE_EXPORT double qstrtod(const char *s00, const char **se, bool *ok)
-{
- int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
- e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
- const char *s, *s0, *s1;
- double aadj, aadj1, adj, rv, rv0;
- Long L;
- ULong y, z;
- Bigint *bb1, *bd0;
- Bigint *bb = NULL, *bd = NULL, *bs = NULL, *delta = NULL;/* pacify gcc */
-
- /*
- #ifndef KR_headers
- const char decimal_point = localeconv()->decimal_point[0];
- #else
- const char decimal_point = '.';
- #endif */
- if (ok != 0)
- *ok = true;
-
- const char decimal_point = '.';
-
- sign = nz0 = nz = 0;
- rv = 0.;
-
-
- for(s = s00; ascii_isspace(uchar(*s)); s++)
- ;
-
- if (*s == '-') {
- sign = 1;
- s++;
- } else if (*s == '+') {
- s++;
- }
-
- if (*s == '\0') {
- s = s00;
- goto ret;
- }
-
- if (*s == '0') {
- nz0 = 1;
- while(*++s == '0') ;
- if (!*s)
- goto ret;
- }
- s0 = s;
- y = z = 0;
- for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
- if (nd < 9)
- y = 10*y + c - '0';
- else if (nd < 16)
- z = 10*z + c - '0';
- nd0 = nd;
- if (c == decimal_point) {
- c = *++s;
- if (!nd) {
- for(; c == '0'; c = *++s)
- nz++;
- if (c > '0' && c <= '9') {
- s0 = s;
- nf += nz;
- nz = 0;
- goto have_dig;
- }
- goto dig_done;
- }
- for(; c >= '0' && c <= '9'; c = *++s) {
- have_dig:
- nz++;
- if (c -= '0') {
- nf += nz;
- for(i = 1; i < nz; i++)
- if (nd++ < 9)
- y *= 10;
- else if (nd <= DBL_DIG + 1)
- z *= 10;
- if (nd++ < 9)
- y = 10*y + c;
- else if (nd <= DBL_DIG + 1)
- z = 10*z + c;
- nz = 0;
- }
- }
- }
- dig_done:
- e = 0;
- if (c == 'e' || c == 'E') {
- if (!nd && !nz && !nz0) {
- s = s00;
- goto ret;
- }
- s00 = s;
- esign = 0;
- switch(c = *++s) {
- case '-':
- esign = 1;
- case '+':
- c = *++s;
- }
- if (c >= '0' && c <= '9') {
- while(c == '0')
- c = *++s;
- if (c > '0' && c <= '9') {
- L = c - '0';
- s1 = s;
- while((c = *++s) >= '0' && c <= '9')
- L = 10*L + c - '0';
- if (s - s1 > 8 || L > 19999)
- /* Avoid confusion from exponents
- * so large that e might overflow.
- */
- e = 19999; /* safe for 16 bit ints */
- else
- e = int(L);
- if (esign)
- e = -e;
- }
- else
- e = 0;
- }
- else
- s = s00;
- }
- if (!nd) {
- if (!nz && !nz0)
- s = s00;
- goto ret;
- }
- e1 = e -= nf;
-
- /* Now we have nd0 digits, starting at s0, followed by a
- * decimal point, followed by nd-nd0 digits. The number we're
- * after is the integer represented by those digits times
- * 10**e */
-
- if (!nd0)
- nd0 = nd;
- k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
- rv = y;
- if (k > 9)
- rv = tens[k - 9] * rv + z;
-
- bd0 = 0;
- if (nd <= DBL_DIG
-#ifndef RND_PRODQUOT
- && FLT_ROUNDS == 1
-#endif
- ) {
- if (!e)
- goto ret;
- if (e > 0) {
- if (e <= Ten_pmax) {
-#ifdef VAX
- goto vax_ovfl_check;
-#else
- /* rv = */ rounded_product(rv, tens[e]);
- goto ret;
-#endif
- }
- i = DBL_DIG - nd;
- if (e <= Ten_pmax + i) {
- /* A fancier test would sometimes let us do
- * this for larger i values.
- */
- e -= i;
- rv *= tens[i];
-#ifdef VAX
- /* VAX exponent range is so narrow we must
- * worry about overflow here...
- */
- vax_ovfl_check:
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- /* rv = */ rounded_product(rv, tens[e]);
- if ((getWord0(rv) & Exp_mask)
- > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
- goto ovfl;
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
-#else
- /* rv = */ rounded_product(rv, tens[e]);
-#endif
- goto ret;
- }
- }
-#ifndef Inaccurate_Divide
- else if (e >= -Ten_pmax) {
- /* rv = */ rounded_quotient(rv, tens[-e]);
- goto ret;
- }
-#endif
- }
- e1 += nd - k;
-
- /* Get starting approximation = rv * 10**e1 */
-
- if (e1 > 0) {
- if ((i = e1 & 15) != 0)
- rv *= tens[i];
- if (e1 &= ~15) {
- if (e1 > DBL_MAX_10_EXP) {
- ovfl:
- // errno = ERANGE;
- if (ok != 0)
- *ok = false;
-#ifdef __STDC__
- rv = HUGE_VAL;
-#else
- /* Can't trust HUGE_VAL */
-#ifdef IEEE_Arith
- setWord0(&rv, Exp_mask);
- setWord1(&rv, 0);
-#else
- setWord0(&rv, Big0);
- setWord1(&rv, Big1);
-#endif
-#endif
- if (bd0)
- goto retfree;
- goto ret;
- }
- if (e1 >>= 4) {
- for(j = 0; e1 > 1; j++, e1 >>= 1)
- if (e1 & 1)
- rv *= bigtens[j];
- /* The last multiplication could overflow. */
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- rv *= bigtens[j];
- if ((z = getWord0(rv) & Exp_mask)
- > Exp_msk1*(DBL_MAX_EXP+Bias-P))
- goto ovfl;
- if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
- /* set to largest number */
- /* (Can't trust DBL_MAX) */
- setWord0(&rv, Big0);
- setWord1(&rv, Big1);
- }
- else
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
- }
-
- }
- }
- else if (e1 < 0) {
- e1 = -e1;
- if ((i = e1 & 15) != 0)
- rv /= tens[i];
- if (e1 &= ~15) {
- e1 >>= 4;
- if (e1 >= 1 << n_bigtens)
- goto undfl;
- for(j = 0; e1 > 1; j++, e1 >>= 1)
- if (e1 & 1)
- rv *= tinytens[j];
- /* The last multiplication could underflow. */
- rv0 = rv;
- rv *= tinytens[j];
- if (rv == g_double_zero)
- {
- rv = 2.*rv0;
- rv *= tinytens[j];
- if (rv == g_double_zero)
- {
- undfl:
- rv = 0.;
- // errno = ERANGE;
- if (ok != 0)
- *ok = false;
- if (bd0)
- goto retfree;
- goto ret;
- }
- setWord0(&rv, Tiny0);
- setWord1(&rv, Tiny1);
- /* The refinement below will clean
- * this approximation up.
- */
- }
- }
- }
-
- /* Now the hard part -- adjusting rv to the correct value.*/
-
- /* Put digits into bd: true value = bd * 10^e */
-
- bd0 = s2b(s0, nd0, nd, y);
-
- for(;;) {
- bd = Balloc(bd0->k);
- Bcopy(bd, bd0);
- bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */
- bs = i2b(1);
-
- if (e >= 0) {
- bb2 = bb5 = 0;
- bd2 = bd5 = e;
- }
- else {
- bb2 = bb5 = -e;
- bd2 = bd5 = 0;
- }
- if (bbe >= 0)
- bb2 += bbe;
- else
- bd2 -= bbe;
- bs2 = bb2;
-#ifdef Sudden_Underflow
-#ifdef IBM
- j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
-#else
- j = P + 1 - bbbits;
-#endif
-#else
- i = bbe + bbbits - 1; /* logb(rv) */
- if (i < Emin) /* denormal */
- j = bbe + (P-Emin);
- else
- j = P + 1 - bbbits;
-#endif
- bb2 += j;
- bd2 += j;
- i = bb2 < bd2 ? bb2 : bd2;
- if (i > bs2)
- i = bs2;
- if (i > 0) {
- bb2 -= i;
- bd2 -= i;
- bs2 -= i;
- }
- if (bb5 > 0) {
- bs = pow5mult(bs, bb5);
- bb1 = mult(bs, bb);
- Bfree(bb);
- bb = bb1;
- }
- if (bb2 > 0)
- bb = lshift(bb, bb2);
- if (bd5 > 0)
- bd = pow5mult(bd, bd5);
- if (bd2 > 0)
- bd = lshift(bd, bd2);
- if (bs2 > 0)
- bs = lshift(bs, bs2);
- delta = diff(bb, bd);
- dsign = delta->sign;
- delta->sign = 0;
- i = cmp(delta, bs);
- if (i < 0) {
- /* Error is less than half an ulp -- check for
- * special case of mantissa a power of two.
- */
- if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask)
- break;
- delta = lshift(delta,Log2P);
- if (cmp(delta, bs) > 0)
- goto drop_down;
- break;
- }
- if (i == 0) {
- /* exactly half-way between */
- if (dsign) {
- if ((getWord0(rv) & Bndry_mask1) == Bndry_mask1
- && getWord1(rv) == 0xffffffff) {
- /*boundary case -- increment exponent*/
- setWord0(&rv, (getWord0(rv) & Exp_mask)
- + Exp_msk1
-#ifdef IBM
- | Exp_msk1 >> 4
-#endif
- );
- setWord1(&rv, 0);
- break;
- }
- }
- else if (!(getWord0(rv) & Bndry_mask) && !getWord1(rv)) {
- drop_down:
- /* boundary case -- decrement exponent */
-#ifdef Sudden_Underflow
- L = getWord0(rv) & Exp_mask;
-#ifdef IBM
- if (L < Exp_msk1)
-#else
- if (L <= Exp_msk1)
-#endif
- goto undfl;
- L -= Exp_msk1;
-#else
- L = (getWord0(rv) & Exp_mask) - Exp_msk1;
-#endif
- setWord0(&rv, L | Bndry_mask1);
- setWord1(&rv, 0xffffffff);
-#ifdef IBM
- goto cont;
-#else
- break;
-#endif
- }
-#ifndef ROUND_BIASED
- if (!(getWord1(rv) & LSB))
- break;
-#endif
- if (dsign)
- rv += ulp(rv);
-#ifndef ROUND_BIASED
- else {
- rv -= ulp(rv);
-#ifndef Sudden_Underflow
- if (rv == g_double_zero)
- goto undfl;
-#endif
- }
-#endif
- break;
- }
- if ((aadj = ratio(delta, bs)) <= 2.) {
- if (dsign)
- aadj = aadj1 = 1.;
- else if (getWord1(rv) || getWord0(rv) & Bndry_mask) {
-#ifndef Sudden_Underflow
- if (getWord1(rv) == Tiny1 && !getWord0(rv))
- goto undfl;
-#endif
- aadj = 1.;
- aadj1 = -1.;
- }
- else {
- /* special case -- power of FLT_RADIX to be */
- /* rounded down... */
-
- if (aadj < 2./FLT_RADIX)
- aadj = 1./FLT_RADIX;
- else
- aadj *= 0.5;
- aadj1 = -aadj;
- }
- }
- else {
- aadj *= 0.5;
- aadj1 = dsign ? aadj : -aadj;
-#ifdef Check_FLT_ROUNDS
- switch(FLT_ROUNDS) {
- case 2: /* towards +infinity */
- aadj1 -= 0.5;
- break;
- case 0: /* towards 0 */
- case 3: /* towards -infinity */
- aadj1 += 0.5;
- }
-#else
- if (FLT_ROUNDS == 0)
- aadj1 += 0.5;
-#endif
- }
- y = getWord0(rv) & Exp_mask;
-
- /* Check for overflow */
-
- if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
- rv0 = rv;
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- adj = aadj1 * ulp(rv);
- rv += adj;
- if ((getWord0(rv) & Exp_mask) >=
- Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
- if (getWord0(rv0) == Big0 && getWord1(rv0) == Big1)
- goto ovfl;
- setWord0(&rv, Big0);
- setWord1(&rv, Big1);
- goto cont;
- }
- else
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
- }
- else {
-#ifdef Sudden_Underflow
- if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1) {
- rv0 = rv;
- setWord0(&rv, getWord0(rv) + P*Exp_msk1);
- adj = aadj1 * ulp(rv);
- rv += adj;
-#ifdef IBM
- if ((getWord0(rv) & Exp_mask) < P*Exp_msk1)
-#else
- if ((getWord0(rv) & Exp_mask) <= P*Exp_msk1)
-#endif
- {
- if (getWord0(rv0) == Tiny0
- && getWord1(rv0) == Tiny1)
- goto undfl;
- setWord0(&rv, Tiny0);
- setWord1(&rv, Tiny1);
- goto cont;
- }
- else
- setWord0(&rv, getWord0(rv) - P*Exp_msk1);
- }
- else {
- adj = aadj1 * ulp(rv);
- rv += adj;
- }
-#else
- /* Compute adj so that the IEEE rounding rules will
- * correctly round rv + adj in some half-way cases.
- * If rv * ulp(rv) is denormalized (i.e.,
- * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
- * trouble from bits lost to denormalization;
- * example: 1.2e-307 .
- */
- if (y <= (P-1)*Exp_msk1 && aadj >= 1.) {
- aadj1 = int(aadj + 0.5);
- if (!dsign)
- aadj1 = -aadj1;
- }
- adj = aadj1 * ulp(rv);
- rv += adj;
-#endif
- }
- z = getWord0(rv) & Exp_mask;
- if (y == z) {
- /* Can we stop now? */
- L = Long(aadj);
- aadj -= L;
- /* The tolerances below are conservative. */
- if (dsign || getWord1(rv) || getWord0(rv) & Bndry_mask) {
- if (aadj < .4999999 || aadj > .5000001)
- break;
- }
- else if (aadj < .4999999/FLT_RADIX)
- break;
- }
- cont:
- Bfree(bb);
- Bfree(bd);
- Bfree(bs);
- Bfree(delta);
- }
- retfree:
- Bfree(bb);
- Bfree(bd);
- Bfree(bs);
- Bfree(bd0);
- Bfree(delta);
- ret:
+ int processed = 0;
+ bool nonNullOk = false;
+ int len = static_cast<int>(strlen(s00));
+ Q_ASSERT(len >= 0);
+ double d = asciiToDouble(s00, len, nonNullOk, processed);
if (se)
- *se = s;
- return sign ? -rv : rv;
-}
-
-static int quorem(Bigint *b, Bigint *S)
-{
- int n;
- Long borrow, y;
- ULong carry, q, ys;
- ULong *bx, *bxe, *sx, *sxe;
-#ifdef Pack_32
- Long z;
- ULong si, zs;
-#endif
-
- n = S->wds;
-#ifdef BSD_QDTOA_DEBUG
- /*debug*/ if (b->wds > n)
- /*debug*/ Bug("oversize b in quorem");
-#endif
- if (b->wds < n)
- return 0;
- sx = S->x;
- sxe = sx + --n;
- bx = b->x;
- bxe = bx + n;
- q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
-#ifdef BSD_QDTOA_DEBUG
- /*debug*/ if (q > 9)
- /*debug*/ Bug("oversized quotient in quorem");
-#endif
- if (q) {
- borrow = 0;
- carry = 0;
- do {
-#ifdef Pack_32
- si = *sx++;
- ys = (si & 0xffff) * q + carry;
- zs = (si >> 16) * q + (ys >> 16);
- carry = zs >> 16;
- y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*bx >> 16) - (zs & 0xffff) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(bx, z, y);
-#else
- ys = *sx++ * q + carry;
- carry = ys >> 16;
- y = *bx - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *bx++ = y & 0xffff;
-#endif
- }
- while(sx <= sxe);
- if (!*bxe) {
- bx = b->x;
- while(--bxe > bx && !*bxe)
- --n;
- b->wds = n;
- }
- }
- if (cmp(b, S) >= 0) {
- q++;
- borrow = 0;
- carry = 0;
- bx = b->x;
- sx = S->x;
- do {
-#ifdef Pack_32
- si = *sx++;
- ys = (si & 0xffff) + carry;
- zs = (si >> 16) + (ys >> 16);
- carry = zs >> 16;
- y = (*bx & 0xffff) - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- z = (*bx >> 16) - (zs & 0xffff) + borrow;
- borrow = z >> 16;
- Sign_Extend(borrow, z);
- Storeinc(bx, z, y);
-#else
- ys = *sx++ + carry;
- carry = ys >> 16;
- y = *bx - (ys & 0xffff) + borrow;
- borrow = y >> 16;
- Sign_Extend(borrow, y);
- *bx++ = y & 0xffff;
-#endif
- }
- while(sx <= sxe);
- bx = b->x;
- bxe = bx + n;
- if (!*bxe) {
- while(--bxe > bx && !*bxe)
- --n;
- b->wds = n;
- }
- }
- return q;
-}
-
-/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
- *
- * Inspired by "How to Print Floating-Point Numbers Accurately" by
- * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 92-101].
- *
- * Modifications:
- * 1. Rather than iterating, we use a simple numeric overestimate
- * to determine k = floor(log10(d)). We scale relevant
- * quantities using O(log2(k)) rather than O(k) multiplications.
- * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
- * try to generate digits strictly left to right. Instead, we
- * compute with fewer bits and propagate the carry if necessary
- * when rounding the final digit up. This is often faster.
- * 3. Under the assumption that input will be rounded nearest,
- * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
- * That is, we allow equality in stopping tests when the
- * round-nearest rule will give the same floating-point value
- * as would satisfaction of the stopping test with strict
- * inequality.
- * 4. We remove common factors of powers of 2 from relevant
- * quantities.
- * 5. When converting floating-point integers less than 1e16,
- * we use floating-point arithmetic rather than resorting
- * to multiple-precision integers.
- * 6. When asked to produce fewer than 15 digits, we first try
- * to get by with floating-point arithmetic; we resort to
- * multiple-precision integer arithmetic only if we cannot
- * guarantee that the floating-point calculation has given
- * the correctly rounded result. For k requested digits and
- * "uniformly" distributed input, the probability is
- * something like 10^(k-15) that we must resort to the Long
- * calculation.
- */
-
-#if defined(Q_OS_WIN) && defined (Q_CC_GNU) && !defined(_clear87) // See QTBUG-7576
-extern "C" {
-__attribute__ ((dllimport)) unsigned int __cdecl __MINGW_NOTHROW _control87 (unsigned int unNew, unsigned int unMask);
-__attribute__ ((dllimport)) unsigned int __cdecl __MINGW_NOTHROW _clearfp (void); /* Clear the FPU status word */
-}
-# define _clear87 _clearfp
-#endif
-
-/* This actually sometimes returns a pointer to a string literal
- cast to a char*. Do NOT try to modify the return value. */
-
-Q_CORE_EXPORT char *qdtoa ( double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
-{
- // Some values of the floating-point control word can cause _qdtoa to crash with an underflow.
- // We set a safe value here.
-#ifdef Q_OS_WIN
- _clear87();
- unsigned int oldbits = _control87(0, 0);
-#ifndef MCW_EM
-# ifdef _MCW_EM
-# define MCW_EM _MCW_EM
-# else
-# define MCW_EM 0x0008001F
-# endif
-#endif
- _control87(MCW_EM, MCW_EM);
-#endif
-
-#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
- fenv_t envp;
- feholdexcept(&envp);
-#endif
-
- char *s = _qdtoa(d, mode, ndigits, decpt, sign, rve, resultp);
-
-#ifdef Q_OS_WIN
- _clear87();
-#ifndef _M_X64
- _control87(oldbits, 0xFFFFF);
-#else
-# ifndef _MCW_EM // Potentially missing on MinGW
-# define _MCW_EM 0x0008001f
-# endif
-# ifndef _MCW_RC
-# define _MCW_RC 0x00000300
-# endif
-# ifndef _MCW_DN
-# define _MCW_DN 0x03000000
-# endif
- _control87(oldbits, _MCW_EM|_MCW_DN|_MCW_RC);
-#endif //_M_X64
-#endif //Q_OS_WIN
-
-#if defined(Q_OS_LINUX) && !defined(__UCLIBC__)
- fesetenv(&envp);
-#endif
-
- return s;
+ *se = s00 + processed;
+ if (ok)
+ *ok = nonNullOk;
+ return d;
}
-static char *_qdtoa( NEEDS_VOLATILE double d, int mode, int ndigits, int *decpt, int *sign, char **rve, char **resultp)
+QString qdtoa(qreal d, int *decpt, int *sign)
{
- /*
- Arguments ndigits, decpt, sign are similar to those
- of ecvt and fcvt; trailing zeros are suppressed from
- the returned string. If not null, *rve is set to point
- to the end of the return value. If d is +-Infinity or NaN,
- then *decpt is set to 9999.
-
- mode:
- 0 ==> shortest string that yields d when read in
- and rounded to nearest.
- 1 ==> like 0, but with Steele & White stopping rule;
- e.g. with IEEE P754 arithmetic , mode 0 gives
- 1e23 whereas mode 1 gives 9.999999999999999e22.
- 2 ==> max(1,ndigits) significant digits. This gives a
- return value similar to that of ecvt, except
- that trailing zeros are suppressed.
- 3 ==> through ndigits past the decimal point. This
- gives a return value similar to that from fcvt,
- except that trailing zeros are suppressed, and
- ndigits can be negative.
- 4-9 should give the same return values as 2-3, i.e.,
- 4 <= mode <= 9 ==> same return as mode
- 2 + (mode & 1). These modes are mainly for
- debugging; often they run slower but sometimes
- faster than modes 2-3.
- 4,5,8,9 ==> left-to-right digit generation.
- 6-9 ==> don't try fast floating-point estimate
- (if applicable).
-
- Values of mode other than 0-9 are treated as mode 0.
-
- Sufficient space is allocated to the return value
- to hold the suppressed trailing zeros.
- */
-
- int bbits, b2, b5, be, dig, i, ieps, ilim0,
- j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
- try_quick;
- int ilim = 0, ilim1 = 0, spec_case = 0; /* pacify gcc */
- Long L;
-#ifndef Sudden_Underflow
- int denorm;
- ULong x;
-#endif
- Bigint *b, *b1, *delta, *mhi, *S;
- Bigint *mlo = NULL; /* pacify gcc */
- double d2;
- double ds, eps;
- char *s, *s0;
-
- if (getWord0(d) & Sign_bit) {
- /* set sign for everything, including 0's and NaNs */
- *sign = 1;
- setWord0(&d, getWord0(d) & ~Sign_bit); /* clear sign bit */
- }
- else
- *sign = 0;
-
-#if defined(IEEE_Arith) + defined(VAX)
-#ifdef IEEE_Arith
- if ((getWord0(d) & Exp_mask) == Exp_mask)
-#else
- if (getWord0(d) == 0x8000)
-#endif
- {
- /* Infinity or NaN */
- *decpt = 9999;
- s =
-#ifdef IEEE_Arith
- !getWord1(d) && !(getWord0(d) & 0xfffff) ? const_cast<char*>("Infinity") :
-#endif
- const_cast<char*>("NaN");
- if (rve)
- *rve =
-#ifdef IEEE_Arith
- s[3] ? s + 8 :
-#endif
- s + 3;
- return s;
- }
-#endif
-#ifdef IBM
- d += 0; /* normalize */
-#endif
- if (d == g_double_zero)
- {
- *decpt = 1;
- s = const_cast<char*>("0");
- if (rve)
- *rve = s + 1;
- return s;
- }
-
- b = d2b(d, &be, &bbits);
- i = (int)(getWord0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
-#ifndef Sudden_Underflow
- if (i != 0) {
-#endif
- d2 = d;
- setWord0(&d2, getWord0(d2) & Frac_mask1);
- setWord0(&d2, getWord0(d2) | Exp_11);
-#ifdef IBM
- if (j = 11 - hi0bits(getWord0(d2) & Frac_mask))
- d2 /= 1 << j;
-#endif
-
- /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
- * log10(x) = log(x) / log(10)
- * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
- * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
- *
- * This suggests computing an approximation k to log10(d) by
- *
- * k = (i - Bias)*0.301029995663981
- * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
- *
- * We want k to be too large rather than too small.
- * The error in the first-order Taylor series approximation
- * is in our favor, so we just round up the constant enough
- * to compensate for any error in the multiplication of
- * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
- * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
- * adding 1e-13 to the constant term more than suffices.
- * Hence we adjust the constant term to 0.1760912590558.
- * (We could get a more accurate k by invoking log10,
- * but this is probably not worthwhile.)
- */
-
- i -= Bias;
-#ifdef IBM
- i <<= 2;
- i += j;
-#endif
-#ifndef Sudden_Underflow
- denorm = 0;
- }
- else {
- /* d is denormalized */
-
- i = bbits + be + (Bias + (P-1) - 1);
- x = i > 32 ? getWord0(d) << (64 - i) | getWord1(d) >> (i - 32)
- : getWord1(d) << (32 - i);
- d2 = x;
- setWord0(&d2, getWord0(d2) - 31*Exp_msk1); /* adjust exponent */
- i -= (Bias + (P-1) - 1) + 1;
- denorm = 1;
- }
-#endif
- ds = (d2-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
- k = int(ds);
- if (ds < 0. && ds != k)
- k--; /* want k = floor(ds) */
- k_check = 1;
- if (k >= 0 && k <= Ten_pmax) {
- if (d < tens[k])
- k--;
- k_check = 0;
- }
- j = bbits - i - 1;
- if (j >= 0) {
- b2 = 0;
- s2 = j;
- }
- else {
- b2 = -j;
- s2 = 0;
- }
- if (k >= 0) {
- b5 = 0;
- s5 = k;
- s2 += k;
- }
- else {
- b2 -= k;
- b5 = -k;
- s5 = 0;
- }
- if (mode < 0 || mode > 9)
- mode = 0;
- try_quick = 1;
- if (mode > 5) {
- mode -= 4;
- try_quick = 0;
- }
- leftright = 1;
- switch(mode) {
- case 0:
- case 1:
- ilim = ilim1 = -1;
- i = 18;
- ndigits = 0;
- break;
- case 2:
- leftright = 0;
- /* no break */
- case 4:
- if (ndigits <= 0)
- ndigits = 1;
- ilim = ilim1 = i = ndigits;
- break;
- case 3:
- leftright = 0;
- /* no break */
- case 5:
- i = ndigits + k + 1;
- ilim = i;
- ilim1 = i - 1;
- if (i <= 0)
- i = 1;
- }
- QT_TRY {
- *resultp = static_cast<char *>(malloc(i + 1));
- Q_CHECK_PTR(*resultp);
- } QT_CATCH(...) {
- Bfree(b);
- QT_RETHROW;
- }
- s = s0 = *resultp;
-
- if (ilim >= 0 && ilim <= Quick_max && try_quick) {
-
- /* Try to get by with floating-point arithmetic. */
-
- i = 0;
- d2 = d;
- k0 = k;
- ilim0 = ilim;
- ieps = 2; /* conservative */
- if (k > 0) {
- ds = tens[k&0xf];
- j = k >> 4;
- if (j & Bletch) {
- /* prevent overflows */
- j &= Bletch - 1;
- d /= bigtens[n_bigtens-1];
- ieps++;
- }
- for(; j; j >>= 1, i++)
- if (j & 1) {
- ieps++;
- ds *= bigtens[i];
- }
- d /= ds;
- }
- else if ((j1 = -k) != 0) {
- d *= tens[j1 & 0xf];
- for(j = j1 >> 4; j; j >>= 1, i++)
- if (j & 1) {
- ieps++;
- d *= bigtens[i];
- }
- }
- if (k_check && d < 1. && ilim > 0) {
- if (ilim1 <= 0)
- goto fast_failed;
- ilim = ilim1;
- k--;
- d *= 10.;
- ieps++;
- }
- eps = ieps*d + 7.;
- setWord0(&eps, getWord0(eps) - (P-1)*Exp_msk1);
- if (ilim == 0) {
- S = mhi = 0;
- d -= 5.;
- if (d > eps)
- goto one_digit;
- if (d < -eps)
- goto no_digits;
- goto fast_failed;
- }
-#ifndef No_leftright
- if (leftright) {
- /* Use Steele & White method of only
- * generating digits needed.
- */
- eps = 0.5/tens[ilim-1] - eps;
- for(i = 0;;) {
- L = Long(d);
- d -= L;
- *s++ = '0' + int(L);
- if (d < eps)
- goto ret1;
- if (1. - d < eps)
- goto bump_up;
- if (++i >= ilim)
- break;
- eps *= 10.;
- d *= 10.;
- }
- }
- else {
-#endif
- /* Generate ilim digits, then fix them up. */
- eps *= tens[ilim-1];
- for(i = 1;; i++, d *= 10.) {
- L = Long(d);
- d -= L;
- *s++ = '0' + int(L);
- if (i == ilim) {
- if (d > 0.5 + eps)
- goto bump_up;
- else if (d < 0.5 - eps) {
- while(*--s == '0') {}
- s++;
- goto ret1;
- }
- break;
- }
- }
-#ifndef No_leftright
- }
-#endif
- fast_failed:
- s = s0;
- d = d2;
- k = k0;
- ilim = ilim0;
- }
-
- /* Do we have a "small" integer? */
-
- if (be >= 0 && k <= Int_max) {
- /* Yes. */
- ds = tens[k];
- if (ndigits < 0 && ilim <= 0) {
- S = mhi = 0;
- if (ilim < 0 || d <= 5*ds)
- goto no_digits;
- goto one_digit;
- }
- for(i = 1;; i++) {
- L = Long(d / ds);
- d -= L*ds;
-#ifdef Check_FLT_ROUNDS
- /* If FLT_ROUNDS == 2, L will usually be high by 1 */
- if (d < 0) {
- L--;
- d += ds;
- }
-#endif
- *s++ = '0' + int(L);
- if (i == ilim) {
- d += d;
- if (d > ds || (d == ds && L & 1)) {
- bump_up:
- while(*--s == '9')
- if (s == s0) {
- k++;
- *s = '0';
- break;
- }
- ++*s++;
- }
- break;
- }
- if ((d *= 10.) == g_double_zero)
- break;
- }
- goto ret1;
- }
-
- m2 = b2;
- m5 = b5;
- mhi = mlo = 0;
- if (leftright) {
- if (mode < 2) {
- i =
-#ifndef Sudden_Underflow
- denorm ? be + (Bias + (P-1) - 1 + 1) :
-#endif
-#ifdef IBM
- 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
-#else
- 1 + P - bbits;
-#endif
- }
- else {
- j = ilim - 1;
- if (m5 >= j)
- m5 -= j;
- else {
- s5 += j -= m5;
- b5 += j;
- m5 = 0;
- }
- if ((i = ilim) < 0) {
- m2 -= i;
- i = 0;
- }
- }
- b2 += i;
- s2 += i;
- mhi = i2b(1);
- }
- if (m2 > 0 && s2 > 0) {
- i = m2 < s2 ? m2 : s2;
- b2 -= i;
- m2 -= i;
- s2 -= i;
- }
- if (b5 > 0) {
- if (leftright) {
- if (m5 > 0) {
- mhi = pow5mult(mhi, m5);
- b1 = mult(mhi, b);
- Bfree(b);
- b = b1;
- }
- if ((j = b5 - m5) != 0)
- b = pow5mult(b, j);
- }
- else
- b = pow5mult(b, b5);
- }
- S = i2b(1);
- if (s5 > 0)
- S = pow5mult(S, s5);
+ bool nonNullSign = false;
+ int nonNullDecpt = 0;
+ int length = 0;
- /* Check for special case that d is a normalized power of 2. */
+ // Some versions of libdouble-conversion like an extra digit, probably for '\0'
+ char result[QLocaleData::DoubleMaxSignificant + 1];
+ doubleToAscii(d, QLocaleData::DFSignificantDigits, QLocaleData::DoubleMaxSignificant, result,
+ QLocaleData::DoubleMaxSignificant + 1, nonNullSign, length, nonNullDecpt);
- if (mode < 2) {
- if (!getWord1(d) && !(getWord0(d) & Bndry_mask)
-#ifndef Sudden_Underflow
- && getWord0(d) & Exp_mask
-#endif
- ) {
- /* The special case */
- b2 += Log2P;
- s2 += Log2P;
- spec_case = 1;
- }
- else
- spec_case = 0;
- }
+ // Skip trailing zeroes. The DoubleMaxSignificant precision is the worst case.
+ while (length > 0 && result[length - 1] == '0')
+ --length;
- /* Arrange for convenient computation of quotients:
- * shift left if necessary so divisor has 4 leading 0 bits.
- *
- * Perhaps we should just compute leading 28 bits of S once
- * and for all and pass them and a shift to quorem, so it
- * can do shifts and ors to compute the numerator for q.
- */
-#ifdef Pack_32
- if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f) != 0)
- i = 32 - i;
-#else
- if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
- i = 16 - i;
-#endif
- if (i > 4) {
- i -= 4;
- b2 += i;
- m2 += i;
- s2 += i;
- }
- else if (i < 4) {
- i += 28;
- b2 += i;
- m2 += i;
- s2 += i;
- }
- if (b2 > 0)
- b = lshift(b, b2);
- if (s2 > 0)
- S = lshift(S, s2);
- if (k_check) {
- if (cmp(b,S) < 0) {
- k--;
- b = multadd(b, 10, 0); /* we botched the k estimate */
- if (leftright)
- mhi = multadd(mhi, 10, 0);
- ilim = ilim1;
- }
- }
- if (ilim <= 0 && mode > 2) {
- if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
- /* no digits, fcvt style */
- no_digits:
- k = -1 - ndigits;
- goto ret;
- }
- one_digit:
- *s++ = '1';
- k++;
- goto ret;
- }
- if (leftright) {
- if (m2 > 0)
- mhi = lshift(mhi, m2);
-
- /* Compute mlo -- check for special case
- * that d is a normalized power of 2.
- */
-
- mlo = mhi;
- if (spec_case) {
- mhi = Balloc(mhi->k);
- Bcopy(mhi, mlo);
- mhi = lshift(mhi, Log2P);
- }
+ if (sign)
+ *sign = nonNullSign ? 1 : 0;
+ if (decpt)
+ *decpt = nonNullDecpt;
- for(i = 1;;i++) {
- dig = quorem(b,S) + '0';
- /* Do we yet have the shortest decimal string
- * that will round to d?
- */
- j = cmp(b, mlo);
- delta = diff(S, mhi);
- j1 = delta->sign ? 1 : cmp(b, delta);
- Bfree(delta);
-#ifndef ROUND_BIASED
- if (j1 == 0 && !mode && !(getWord1(d) & 1)) {
- if (dig == '9')
- goto round_9_up;
- if (j > 0)
- dig++;
- *s++ = dig;
- goto ret;
- }
-#endif
- if (j < 0 || (j == 0 && !mode
-#ifndef ROUND_BIASED
- && !(getWord1(d) & 1)
-#endif
- )) {
- if (j1 > 0) {
- b = lshift(b, 1);
- j1 = cmp(b, S);
- if ((j1 > 0 || (j1 == 0 && dig & 1))
- && dig++ == '9')
- goto round_9_up;
- }
- *s++ = dig;
- goto ret;
- }
- if (j1 > 0) {
- if (dig == '9') { /* possible if i == 1 */
- round_9_up:
- *s++ = '9';
- goto roundoff;
- }
- *s++ = dig + 1;
- goto ret;
- }
- *s++ = dig;
- if (i == ilim)
- break;
- b = multadd(b, 10, 0);
- if (mlo == mhi)
- mlo = mhi = multadd(mhi, 10, 0);
- else {
- mlo = multadd(mlo, 10, 0);
- mhi = multadd(mhi, 10, 0);
- }
- }
- }
- else
- for(i = 1;; i++) {
- *s++ = dig = quorem(b,S) + '0';
- if (i >= ilim)
- break;
- b = multadd(b, 10, 0);
- }
-
- /* Round off last digit */
-
- b = lshift(b, 1);
- j = cmp(b, S);
- if (j > 0 || (j == 0 && dig & 1)) {
- roundoff:
- while(*--s == '9')
- if (s == s0) {
- k++;
- *s++ = '1';
- goto ret;
- }
- ++*s++;
- }
- else {
- while(*--s == '0') {}
- s++;
- }
- ret:
- Bfree(S);
- if (mhi) {
- if (mlo && mlo != mhi)
- Bfree(mlo);
- Bfree(mhi);
- }
- ret1:
- Bfree(b);
- if (s == s0) { /* don't return empty string */
- *s++ = '0';
- k = 0;
- }
- *s = 0;
- *decpt = k + 1;
- if (rve)
- *rve = s;
- return s0;
+ return QLatin1String(result, length);
}
QT_END_NAMESPACE
diff --git a/src/corelib/tools/qlocale_tools_p.h b/src/corelib/tools/qlocale_tools_p.h
index 03f35209b4..840ae8f163 100644
--- a/src/corelib/tools/qlocale_tools_p.h
+++ b/src/corelib/tools/qlocale_tools_p.h
@@ -66,8 +66,13 @@
QT_BEGIN_NAMESPACE
+double asciiToDouble(const char *num, int numLen, bool &ok, int &processed);
+void doubleToAscii(double d, QLocaleData::DoubleForm form, int precision, char *buf, int bufSize,
+ bool &sign, int &length, int &decpt);
+
QString qulltoa(qulonglong l, int base, const QChar _zero);
QString qlltoa(qlonglong l, int base, const QChar zero);
+Q_CORE_EXPORT QString qdtoa(qreal d, int *decpt, int *sign);
enum PrecisionMode {
PMDecimalDigits = 0x01,
@@ -96,8 +101,6 @@ inline bool isZero(double d)
}
}
-Q_CORE_EXPORT char *qdtoa(double d, int mode, int ndigits, int *decpt,
- int *sign, char **rve, char **digits_str);
Q_CORE_EXPORT double qstrtod(const char *s00, char const **se, bool *ok);
qlonglong qstrtoll(const char *nptr, const char **endptr, int base, bool *ok);
qulonglong qstrtoull(const char *nptr, const char **endptr, int base, bool *ok);
diff --git a/src/corelib/tools/qregexp.h b/src/corelib/tools/qregexp.h
index f384e6c51f..9c68c194e0 100644
--- a/src/corelib/tools/qregexp.h
+++ b/src/corelib/tools/qregexp.h
@@ -68,10 +68,9 @@ public:
~QRegExp();
QRegExp &operator=(const QRegExp &rx);
#ifdef Q_COMPILER_RVALUE_REFS
- inline QRegExp &operator=(QRegExp &&other)
- { qSwap(priv,other.priv); return *this; }
+ QRegExp &operator=(QRegExp &&other) Q_DECL_NOTHROW { swap(other); return *this; }
#endif
- inline void swap(QRegExp &other) { qSwap(priv, other.priv); }
+ void swap(QRegExp &other) Q_DECL_NOTHROW { qSwap(priv, other.priv); }
bool operator==(const QRegExp &rx) const;
inline bool operator!=(const QRegExp &rx) const { return !operator==(rx); }
diff --git a/src/corelib/tools/qringbuffer.cpp b/src/corelib/tools/qringbuffer.cpp
index 85cfdaf129..e9b655c01e 100644
--- a/src/corelib/tools/qringbuffer.cpp
+++ b/src/corelib/tools/qringbuffer.cpp
@@ -65,6 +65,8 @@ const char *QRingBuffer::readPointerAtPosition(qint64 pos, qint64 &length) const
void QRingBuffer::free(qint64 bytes)
{
+ Q_ASSERT(bytes <= bufferSize);
+
while (bytes > 0) {
const qint64 blockSize = buffers.first().size() - head;
@@ -100,20 +102,25 @@ char *QRingBuffer::reserve(qint64 bytes)
if (bytes <= 0 || bytes >= MaxByteArraySize)
return 0;
- const qint64 newSize = bytes + tail;
- // if need buffer reallocation
- if (newSize > buffers.last().size()) {
- if (newSize > buffers.last().capacity() && (tail >= basicBlockSize
- || newSize >= MaxByteArraySize)) {
- // shrink this buffer to its current size
- buffers.last().resize(tail);
-
- // create a new QByteArray
- buffers.append(QByteArray());
- ++tailBuffer;
- tail = 0;
+ if (buffers.isEmpty()) {
+ buffers.append(QByteArray());
+ buffers.first().resize(qMax(basicBlockSize, int(bytes)));
+ } else {
+ const qint64 newSize = bytes + tail;
+ // if need buffer reallocation
+ if (newSize > buffers.last().size()) {
+ if (newSize > buffers.last().capacity() && (tail >= basicBlockSize
+ || newSize >= MaxByteArraySize)) {
+ // shrink this buffer to its current size
+ buffers.last().resize(tail);
+
+ // create a new QByteArray
+ buffers.append(QByteArray());
+ ++tailBuffer;
+ tail = 0;
+ }
+ buffers.last().resize(qMax(basicBlockSize, tail + int(bytes)));
}
- buffers.last().resize(qMax(basicBlockSize, tail + int(bytes)));
}
char *writePtr = buffers.last().data() + tail;
@@ -134,9 +141,13 @@ char *QRingBuffer::reserveFront(qint64 bytes)
return 0;
if (head < bytes) {
- buffers.first().remove(0, head);
- if (tailBuffer == 0)
- tail -= head;
+ if (buffers.isEmpty()) {
+ buffers.append(QByteArray());
+ } else {
+ buffers.first().remove(0, head);
+ if (tailBuffer == 0)
+ tail -= head;
+ }
head = qMax(basicBlockSize, int(bytes));
if (bufferSize == 0) {
@@ -155,6 +166,8 @@ char *QRingBuffer::reserveFront(qint64 bytes)
void QRingBuffer::chop(qint64 bytes)
{
+ Q_ASSERT(bytes <= bufferSize);
+
while (bytes > 0) {
if (tailBuffer == 0 || tail > bytes) {
// keep a single block around if it does not exceed
@@ -185,6 +198,9 @@ void QRingBuffer::chop(qint64 bytes)
void QRingBuffer::clear()
{
+ if (buffers.isEmpty())
+ return;
+
buffers.erase(buffers.begin() + 1, buffers.end());
buffers.first().clear();
@@ -193,20 +209,32 @@ void QRingBuffer::clear()
bufferSize = 0;
}
-qint64 QRingBuffer::indexOf(char c, qint64 maxLength) const
+qint64 QRingBuffer::indexOf(char c, qint64 maxLength, qint64 pos) const
{
- qint64 index = 0;
- qint64 j = head;
- for (int i = 0; index < maxLength && i < buffers.size(); ++i) {
- const char *ptr = buffers[i].constData() + j;
- j = qMin(index + (i == tailBuffer ? tail : buffers[i].size()) - j, maxLength);
-
- while (index < j) {
- if (*ptr++ == c)
- return index;
- ++index;
+ if (maxLength <= 0 || pos < 0)
+ return -1;
+
+ qint64 index = -(pos + head);
+ for (int i = 0; i < buffers.size(); ++i) {
+ const qint64 nextBlockIndex = qMin(index + (i == tailBuffer ? tail : buffers[i].size()),
+ maxLength);
+
+ if (nextBlockIndex > 0) {
+ const char *ptr = buffers[i].constData();
+ if (index < 0) {
+ ptr -= index;
+ index = 0;
+ }
+
+ const char *findPtr = reinterpret_cast<const char *>(memchr(ptr, c,
+ nextBlockIndex - index));
+ if (findPtr)
+ return qint64(findPtr - ptr) + index + pos;
+
+ if (nextBlockIndex == maxLength)
+ return -1;
}
- j = 0;
+ index = nextBlockIndex;
}
return -1;
}
@@ -288,7 +316,10 @@ qint64 QRingBuffer::peek(char *data, qint64 maxLength, qint64 pos) const
void QRingBuffer::append(const QByteArray &qba)
{
if (tail == 0) {
- buffers.last() = qba;
+ if (buffers.isEmpty())
+ buffers.append(qba);
+ else
+ buffers.last() = qba;
} else {
buffers.last().resize(tail);
buffers.append(qba);
diff --git a/src/corelib/tools/qringbuffer_p.h b/src/corelib/tools/qringbuffer_p.h
index 68509a6a80..96c4f9acb6 100644
--- a/src/corelib/tools/qringbuffer_p.h
+++ b/src/corelib/tools/qringbuffer_p.h
@@ -54,9 +54,7 @@ class QRingBuffer
{
public:
explicit inline QRingBuffer(int growth = 4096) :
- head(0), tail(0), tailBuffer(0), basicBlockSize(growth), bufferSize(0) {
- buffers.append(QByteArray());
- }
+ head(0), tail(0), tailBuffer(0), basicBlockSize(growth), bufferSize(0) { }
inline qint64 nextDataBlockSize() const {
return (tailBuffer == 0 ? tail : buffers.first().size()) - head;
@@ -114,14 +112,17 @@ public:
Q_CORE_EXPORT void clear();
inline qint64 indexOf(char c) const { return indexOf(c, size()); }
- Q_CORE_EXPORT qint64 indexOf(char c, qint64 maxLength) const;
+ Q_CORE_EXPORT qint64 indexOf(char c, qint64 maxLength, qint64 pos = 0) const;
Q_CORE_EXPORT qint64 read(char *data, qint64 maxLength);
Q_CORE_EXPORT QByteArray read();
Q_CORE_EXPORT qint64 peek(char *data, qint64 maxLength, qint64 pos = 0) const;
Q_CORE_EXPORT void append(const QByteArray &qba);
inline qint64 skip(qint64 length) {
- return read(0, length);
+ qint64 bytesToSkip = qMin(length, bufferSize);
+
+ free(bytesToSkip);
+ return bytesToSkip;
}
Q_CORE_EXPORT qint64 readLine(char *data, qint64 maxLength);
diff --git a/src/corelib/tools/qsharedpointer.cpp b/src/corelib/tools/qsharedpointer.cpp
index 86f4c6a268..4d30396cb6 100644
--- a/src/corelib/tools/qsharedpointer.cpp
+++ b/src/corelib/tools/qsharedpointer.cpp
@@ -1292,6 +1292,17 @@
compile. Use qSharedPointerConstCast to cast away the constness.
*/
+/*!
+ \fn QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr)
+ \relates QSharedPointer
+ \since 5.7
+
+ Writes the pointer tracked by \a ptr into the debug object \a debug for
+ debugging purposes.
+
+ \sa {Debugging Techniques}
+*/
+
#include <qset.h>
#include <qmutex.h>
diff --git a/src/corelib/tools/qsharedpointer.h b/src/corelib/tools/qsharedpointer.h
index 279ec36a28..56e13d500f 100644
--- a/src/corelib/tools/qsharedpointer.h
+++ b/src/corelib/tools/qsharedpointer.h
@@ -153,6 +153,8 @@ template <class X, class T> QSharedPointer<X> qSharedPointerObjectCast(const QWe
template <class X, class T> QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src);
+template <class T> QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr);
+
QT_END_NAMESPACE
#endif // Q_QDOC
diff --git a/src/corelib/tools/qsharedpointer_impl.h b/src/corelib/tools/qsharedpointer_impl.h
index 1323dd6b1c..ace6c5d093 100644
--- a/src/corelib/tools/qsharedpointer_impl.h
+++ b/src/corelib/tools/qsharedpointer_impl.h
@@ -55,6 +55,7 @@ QT_END_NAMESPACE
#include <new>
#include <QtCore/qatomic.h>
#include <QtCore/qobject.h> // for qobject_cast
+#include <QtCore/qdebug.h>
#if QT_DEPRECATED_SINCE(5, 5)
#include <QtCore/qhash.h>
#endif
@@ -305,7 +306,7 @@ public:
inline T &operator*() const { return *data(); }
inline T *operator->() const { return data(); }
- QSharedPointer() : value(Q_NULLPTR), d(Q_NULLPTR) { }
+ QSharedPointer() Q_DECL_NOTHROW : value(Q_NULLPTR), d(Q_NULLPTR) {}
~QSharedPointer() { deref(); }
inline explicit QSharedPointer(T *ptr) : value(ptr) // noexcept
@@ -315,22 +316,22 @@ public:
inline QSharedPointer(T *ptr, Deleter deleter) : value(ptr) // throws
{ internalConstruct(ptr, deleter); }
- inline QSharedPointer(const QSharedPointer &other) : value(other.value), d(other.d)
+ QSharedPointer(const QSharedPointer &other) Q_DECL_NOTHROW : value(other.value), d(other.d)
{ if (d) ref(); }
- inline QSharedPointer &operator=(const QSharedPointer &other)
+ QSharedPointer &operator=(const QSharedPointer &other) Q_DECL_NOTHROW
{
QSharedPointer copy(other);
swap(copy);
return *this;
}
#ifdef Q_COMPILER_RVALUE_REFS
- inline QSharedPointer(QSharedPointer &&other)
+ QSharedPointer(QSharedPointer &&other) Q_DECL_NOTHROW
: value(other.value), d(other.d)
{
other.d = Q_NULLPTR;
other.value = Q_NULLPTR;
}
- inline QSharedPointer &operator=(QSharedPointer &&other)
+ QSharedPointer &operator=(QSharedPointer &&other) Q_DECL_NOTHROW
{
QSharedPointer moved(std::move(other));
swap(moved);
@@ -596,7 +597,7 @@ public:
inline bool operator !() const { return isNull(); }
inline T *data() const { return d == Q_NULLPTR || d->strongref.load() == 0 ? Q_NULLPTR : value; }
- inline QWeakPointer() : d(Q_NULLPTR), value(Q_NULLPTR) { }
+ inline QWeakPointer() Q_DECL_NOTHROW : d(Q_NULLPTR), value(Q_NULLPTR) { }
inline ~QWeakPointer() { if (d && !d->weakref.deref()) delete d; }
#ifndef QT_NO_QOBJECT
@@ -614,15 +615,26 @@ public:
{ return *this = QWeakPointer(ptr); }
#endif
- inline QWeakPointer(const QWeakPointer &o) : d(o.d), value(o.value)
+ QWeakPointer(const QWeakPointer &other) Q_DECL_NOTHROW : d(other.d), value(other.value)
{ if (d) d->weakref.ref(); }
- inline QWeakPointer &operator=(const QWeakPointer &o)
+#ifdef Q_COMPILER_RVALUE_REFS
+ QWeakPointer(QWeakPointer &&other) Q_DECL_NOTHROW
+ : d(other.d), value(other.value)
{
- internalSet(o.d, o.value);
+ other.d = Q_NULLPTR;
+ other.value = Q_NULLPTR;
+ }
+ QWeakPointer &operator=(QWeakPointer &&other) Q_DECL_NOTHROW
+ { QWeakPointer moved(std::move(other)); swap(moved); return *this; }
+#endif
+ QWeakPointer &operator=(const QWeakPointer &other) Q_DECL_NOTHROW
+ {
+ QWeakPointer copy(other);
+ swap(copy);
return *this;
}
- inline void swap(QWeakPointer &other)
+ void swap(QWeakPointer &other) Q_DECL_NOTHROW
{
qSwap(this->d, other.d);
qSwap(this->value, other.value);
@@ -858,6 +870,16 @@ inline void qSwap(QSharedPointer<T> &p1, QSharedPointer<T> &p2)
p1.swap(p2);
}
+#ifndef QT_NO_DEBUG_STREAM
+template <class T>
+Q_INLINE_TEMPLATE QDebug operator<<(QDebug debug, const QSharedPointer<T> &ptr)
+{
+ QDebugStateSaver saver(debug);
+ debug.nospace() << "QSharedPointer(" << ptr.data() << ")";
+ return debug;
+}
+#endif
+
QT_END_NAMESPACE
namespace std {
template <class T>
diff --git a/src/corelib/tools/qsimd_p.h b/src/corelib/tools/qsimd_p.h
index 1e8b3420cf..96f5419af6 100644
--- a/src/corelib/tools/qsimd_p.h
+++ b/src/corelib/tools/qsimd_p.h
@@ -73,6 +73,7 @@
* SSE4_2 | x86 | I & C | I & C | I only |
* AVX | x86 | I & C | I & C | I & C |
* AVX2 | x86 | I & C | I & C | I only |
+ * AVX512xx | x86 | I & C | I & C | I only |
* I = intrinsics; C = code generation
*
* Code can use the following constructs to determine compiler support & status:
diff --git a/src/corelib/tools/qstring.h b/src/corelib/tools/qstring.h
index d21708efb9..ba07259e77 100644
--- a/src/corelib/tools/qstring.h
+++ b/src/corelib/tools/qstring.h
@@ -387,25 +387,25 @@ public:
# define Q_REQUIRED_RESULT
# define Q_REQUIRED_RESULT_pushed
# endif
- QString toLower() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toLower() const & Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QString toLower() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toLower() && Q_REQUIRED_RESULT
{ return toLower_helper(*this); }
- QString toUpper() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toUpper() const & Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QString toUpper() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toUpper() && Q_REQUIRED_RESULT
{ return toUpper_helper(*this); }
- QString toCaseFolded() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toCaseFolded() const & Q_REQUIRED_RESULT
{ return toCaseFolded_helper(*this); }
- QString toCaseFolded() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString toCaseFolded() && Q_REQUIRED_RESULT
{ return toCaseFolded_helper(*this); }
- QString trimmed() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString trimmed() const & Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QString trimmed() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString trimmed() && Q_REQUIRED_RESULT
{ return trimmed_helper(*this); }
- QString simplified() const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString simplified() const & Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
- QString simplified() && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QString simplified() && Q_REQUIRED_RESULT
{ return simplified_helper(*this); }
# ifdef Q_REQUIRED_RESULT_pushed
# pragma pop_macro("Q_REQUIRED_RESULT")
diff --git a/src/corelib/tools/qversionnumber.h b/src/corelib/tools/qversionnumber.h
index ebf1844f38..6a2718ca28 100644
--- a/src/corelib/tools/qversionnumber.h
+++ b/src/corelib/tools/qversionnumber.h
@@ -273,7 +273,7 @@ public:
Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber commonPrefix(const QVersionNumber &v1, const QVersionNumber &v2) Q_REQUIRED_RESULT;
Q_CORE_EXPORT QString toString() const Q_REQUIRED_RESULT;
- Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(const QString &string, int *suffixIndex = 0) Q_REQUIRED_RESULT;
+ Q_CORE_EXPORT static Q_DECL_PURE_FUNCTION QVersionNumber fromString(const QString &string, int *suffixIndex = Q_NULLPTR) Q_REQUIRED_RESULT;
private:
#ifndef QT_NO_DATASTREAM
diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri
index c43fd761d8..d8c704f304 100644
--- a/src/corelib/tools/tools.pri
+++ b/src/corelib/tools/tools.pri
@@ -24,6 +24,7 @@ HEADERS += \
tools/qdatetime.h \
tools/qdatetime_p.h \
tools/qdatetimeparser_p.h \
+ tools/qdoublescanprint_p.h \
tools/qeasingcurve.h \
tools/qfreelist_p.h \
tools/qhash.h \
@@ -202,6 +203,14 @@ INCLUDEPATH += ../3rdparty/md5 \
../3rdparty/md4 \
../3rdparty/sha3
+contains(QT_CONFIG, doubleconversion) {
+ include($$PWD/../../3rdparty/double-conversion/double-conversion.pri)
+} else:contains(QT_CONFIG, system-doubleconversion) {
+ LIBS_PRIVATE += -ldouble-conversion
+} else {
+ DEFINES += QT_NO_DOUBLECONVERSION
+}
+
# Note: libm should be present by default becaue this is C++
!macx-icc:!vxworks:!haiku:unix:LIBS_PRIVATE += -lm
diff --git a/src/dbus/qdbusconnection.cpp b/src/dbus/qdbusconnection.cpp
index e9196173ad..d0f5c06ee5 100644
--- a/src/dbus/qdbusconnection.cpp
+++ b/src/dbus/qdbusconnection.cpp
@@ -1177,8 +1177,8 @@ void QDBusConnectionPrivate::createBusService()
ref.deref(); // busService has increased the refcounting to us
// avoid cyclic refcounting
- QObject::connect(this, SIGNAL(callWithCallbackFailed(QDBusError,QDBusMessage)),
- busService, SIGNAL(callWithCallbackFailed(QDBusError,QDBusMessage)),
+ QObject::connect(this, &QDBusConnectionPrivate::callWithCallbackFailed,
+ busService, emit &QDBusConnectionInterface::callWithCallbackFailed,
Qt::QueuedConnection);
}
diff --git a/src/dbus/qdbusconnectioninterface.cpp b/src/dbus/qdbusconnectioninterface.cpp
index ff923ba282..9dc0b3f9bd 100644
--- a/src/dbus/qdbusconnectioninterface.cpp
+++ b/src/dbus/qdbusconnectioninterface.cpp
@@ -158,10 +158,10 @@ QDBusConnectionInterface::QDBusConnectionInterface(const QDBusConnection &connec
QDBusUtil::dbusPath(),
DBUS_INTERFACE_DBUS, connection, parent)
{
- connect(this, SIGNAL(NameAcquired(QString)), this, SIGNAL(serviceRegistered(QString)));
- connect(this, SIGNAL(NameLost(QString)), this, SIGNAL(serviceUnregistered(QString)));
- connect(this, SIGNAL(NameOwnerChanged(QString,QString,QString)),
- this, SIGNAL(serviceOwnerChanged(QString,QString,QString)));
+ connect(this, &QDBusConnectionInterface::NameAcquired, this, emit &QDBusConnectionInterface::serviceRegistered);
+ connect(this, &QDBusConnectionInterface::NameLost, this, emit &QDBusConnectionInterface::serviceUnregistered);
+ connect(this, &QDBusConnectionInterface::NameOwnerChanged,
+ this, emit &QDBusConnectionInterface::serviceOwnerChanged);
}
/*!
diff --git a/src/dbus/qdbusintegrator.cpp b/src/dbus/qdbusintegrator.cpp
index c465706913..d3f899676b 100644
--- a/src/dbus/qdbusintegrator.cpp
+++ b/src/dbus/qdbusintegrator.cpp
@@ -208,14 +208,14 @@ static dbus_bool_t qDBusAddWatch(DBusWatch *watch, void *data)
watcher.watch = watch;
watcher.read = new QSocketNotifier(fd, QSocketNotifier::Read, d);
watcher.read->setEnabled(q_dbus_watch_get_enabled(watch));
- d->connect(watcher.read, SIGNAL(activated(int)), SLOT(socketRead(int)));
+ d->connect(watcher.read, &QSocketNotifier::activated, d, &QDBusConnectionPrivate::socketRead);
}
if (flags & DBUS_WATCH_WRITABLE) {
//qDebug("addWriteWatch %d", fd);
watcher.watch = watch;
watcher.write = new QSocketNotifier(fd, QSocketNotifier::Write, d);
watcher.write->setEnabled(q_dbus_watch_get_enabled(watch));
- d->connect(watcher.write, SIGNAL(activated(int)), SLOT(socketWrite(int)));
+ d->connect(watcher.write, &QSocketNotifier::activated, d, &QDBusConnectionPrivate::socketWrite);
}
d->watchers.insertMulti(fd, watcher);
@@ -1892,8 +1892,8 @@ QDBusMessage QDBusConnectionPrivate::sendWithReply(const QDBusMessage &message,
if (sendMode == QDBus::BlockWithGui) {
pcall->watcherHelper = new QDBusPendingCallWatcherHelper;
QEventLoop loop;
- loop.connect(pcall->watcherHelper, SIGNAL(reply(QDBusMessage)), SLOT(quit()));
- loop.connect(pcall->watcherHelper, SIGNAL(error(QDBusError,QDBusMessage)), SLOT(quit()));
+ loop.connect(pcall->watcherHelper, &QDBusPendingCallWatcherHelper::reply, &loop, &QEventLoop::quit);
+ loop.connect(pcall->watcherHelper, &QDBusPendingCallWatcherHelper::error, &loop, &QEventLoop::quit);
// enter the event loop and wait for a reply
loop.exec(QEventLoop::ExcludeUserInputEvents | QEventLoop::WaitForMoreEvents);
@@ -2078,7 +2078,7 @@ void QDBusConnectionPrivate::addSignalHook(const QString &key, const SignalHook
}
signalHooks.insertMulti(key, hook);
- connect(hook.obj, SIGNAL(destroyed(QObject*)), SLOT(objectDestroyed(QObject*)),
+ connect(hook.obj, &QObject::destroyed, this, &QDBusConnectionPrivate::objectDestroyed,
Qt::ConnectionType(Qt::BlockingQueuedConnection | Qt::UniqueConnection));
MatchRefCountHash::iterator mit = matchRefCounts.find(hook.matchRule);
@@ -2204,7 +2204,7 @@ QDBusConnectionPrivate::removeSignalHookNoLock(SignalHookHash::Iterator it)
void QDBusConnectionPrivate::registerObject(const ObjectTreeNode *node)
{
- connect(node->obj, SIGNAL(destroyed(QObject*)), SLOT(objectDestroyed(QObject*)),
+ connect(node->obj, &QObject::destroyed, this, &QDBusConnectionPrivate::objectDestroyed,
Qt::ConnectionType(Qt::BlockingQueuedConnection | Qt::UniqueConnection));
if (node->flags & (QDBusConnection::ExportAdaptors
diff --git a/src/gui/accessible/accessible.pri b/src/gui/accessible/accessible.pri
index 86ed4c3a71..b7f341d5b7 100644
--- a/src/gui/accessible/accessible.pri
+++ b/src/gui/accessible/accessible.pri
@@ -17,5 +17,9 @@ contains(QT_CONFIG, accessibility) {
HEADERS += accessible/qaccessiblebridge.h
SOURCES += accessible/qaccessiblebridge.cpp
- OBJECTIVE_SOURCES += accessible/qaccessiblecache_mac.mm
+ mac {
+ OBJECTIVE_SOURCES += accessible/qaccessiblecache_mac.mm
+
+ LIBS_PRIVATE += -framework Foundation
+ }
}
diff --git a/src/gui/gui.pro b/src/gui/gui.pro
index aa05d72a3d..55837bcf3b 100644
--- a/src/gui/gui.pro
+++ b/src/gui/gui.pro
@@ -33,7 +33,7 @@ testcocoon {
load(testcocoon)
}
-mac:!ios: LIBS_PRIVATE += -framework Cocoa
+osx: LIBS_PRIVATE += -framework AppKit
CONFIG += simd optimize_full
diff --git a/src/gui/image/qicon.cpp b/src/gui/image/qicon.cpp
index af3af516db..cebe5ce5f9 100644
--- a/src/gui/image/qicon.cpp
+++ b/src/gui/image/qicon.cpp
@@ -919,7 +919,7 @@ void QIcon::paint(QPainter *painter, const QRect &rect, Qt::Alignment alignment,
*/
bool QIcon::isNull() const
{
- return !d;
+ return !d || d->engine->isNull();
}
/*!\internal
@@ -934,7 +934,12 @@ bool QIcon::isDetached() const
void QIcon::detach()
{
if (d) {
- if (d->ref.load() != 1) {
+ if (d->engine->isNull()) {
+ if (!d->ref.deref())
+ delete d;
+ d = 0;
+ return;
+ } else if (d->ref.load() != 1) {
QIconPrivate *x = new QIconPrivate;
x->engine = d->engine->clone();
if (!d->ref.deref())
@@ -958,11 +963,10 @@ void QIcon::addPixmap(const QPixmap &pixmap, Mode mode, State state)
{
if (pixmap.isNull())
return;
+ detach();
if (!d) {
d = new QIconPrivate;
d->engine = new QPixmapIconEngine;
- } else {
- detach();
}
d->engine->addPixmap(pixmap, mode, state);
}
@@ -1002,6 +1006,7 @@ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State
{
if (fileName.isEmpty())
return;
+ detach();
if (!d) {
#ifndef QT_NO_LIBRARY
QFileInfo info(fileName);
@@ -1024,8 +1029,6 @@ void QIcon::addFile(const QString &fileName, const QSize &size, Mode mode, State
d = new QIconPrivate;
d->engine = new QPixmapIconEngine;
}
- } else {
- detach();
}
d->engine->addFile(fileName, size, mode, state);
@@ -1135,8 +1138,7 @@ QString QIcon::themeName()
\since 4.6
Returns the QIcon corresponding to \a name in the current
- icon theme. If no such icon is found in the current theme
- \a fallback is returned instead.
+ icon theme.
The latest version of the freedesktop icon specification and naming
specification can be obtained here:
@@ -1150,19 +1152,18 @@ QString QIcon::themeName()
\snippet code/src_gui_image_qicon.cpp 3
- Or if you want to provide a guaranteed fallback for platforms that
- do not support theme icons, you can use the second argument:
-
- \snippet code/src_gui_image_qicon.cpp 4
-
\note By default, only X11 will support themed icons. In order to
use themed icons on Mac and Windows, you will have to bundle a
compliant theme in one of your themeSearchPaths() and set the
appropriate themeName().
+ \note Qt will make use of GTK's icon-theme.cache if present to speed up
+ the lookup. These caches can be generated using gtk-update-icon-cache:
+ \l{https://developer.gnome.org/gtk3/stable/gtk-update-icon-cache.html}.
+
\sa themeName(), setThemeName(), themeSearchPaths()
*/
-QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)
+QIcon QIcon::fromTheme(const QString &name)
{
QIcon icon;
@@ -1178,7 +1179,26 @@ QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)
qtIconCache()->insert(name, cachedIcon);
}
- if (qApp && icon.availableSizes().isEmpty())
+ return icon;
+}
+
+/*!
+ \overload
+
+ Returns the QIcon corresponding to \a name in the current
+ icon theme. If no such icon is found in the current theme
+ \a fallback is returned instead.
+
+ If you want to provide a guaranteed fallback for platforms that
+ do not support theme icons, you can use the second argument:
+
+ \snippet code/src_gui_image_qicon.cpp 4
+*/
+QIcon QIcon::fromTheme(const QString &name, const QIcon &fallback)
+{
+ QIcon icon = fromTheme(name);
+
+ if (icon.isNull() || icon.availableSizes().isEmpty())
return fallback;
return icon;
diff --git a/src/gui/image/qicon.h b/src/gui/image/qicon.h
index 8c72f54629..6808bc2828 100644
--- a/src/gui/image/qicon.h
+++ b/src/gui/image/qicon.h
@@ -105,7 +105,8 @@ public:
void setIsMask(bool isMask);
bool isMask() const;
- static QIcon fromTheme(const QString &name, const QIcon &fallback = QIcon());
+ static QIcon fromTheme(const QString &name);
+ static QIcon fromTheme(const QString &name, const QIcon &fallback);
static bool hasThemeIcon(const QString &name);
static QStringList themeSearchPaths();
diff --git a/src/gui/image/qiconengine.cpp b/src/gui/image/qiconengine.cpp
index c09933d45f..7411dbb054 100644
--- a/src/gui/image/qiconengine.cpp
+++ b/src/gui/image/qiconengine.cpp
@@ -150,6 +150,11 @@ void QIconEngine::addFile(const QString &/*fileName*/, const QSize &/*size*/, QI
icon, for example when instantiating an icon using
QIcon::fromTheme().
+ \value IsNullHook Allow to query if this engine represents a null
+ icon. The \a data argument of the virtual_hook() is a pointer to a
+ bool that can be set to true if the icon is null. This enum value
+ was added in Qt 5.7.
+
\sa virtual_hook()
*/
@@ -283,4 +288,16 @@ QString QIconEngine::iconName() const
return name;
}
+/*!
+ \since 5.7
+
+ Returns true if this icon engine represent a null QIcon.
+ */
+bool QIconEngine::isNull() const
+{
+ bool isNull = false;
+ const_cast<QIconEngine *>(this)->virtual_hook(QIconEngine::IsNullHook, &isNull);
+ return isNull;
+}
+
QT_END_NAMESPACE
diff --git a/src/gui/image/qiconengine.h b/src/gui/image/qiconengine.h
index 9977113054..6c45cd216f 100644
--- a/src/gui/image/qiconengine.h
+++ b/src/gui/image/qiconengine.h
@@ -58,7 +58,7 @@ public:
virtual bool read(QDataStream &in);
virtual bool write(QDataStream &out) const;
- enum IconEngineHook { AvailableSizesHook = 1, IconNameHook };
+ enum IconEngineHook { AvailableSizesHook = 1, IconNameHook, IsNullHook };
struct AvailableSizesArgument
{
@@ -71,6 +71,7 @@ public:
QIcon::State state = QIcon::Off) const;
virtual QString iconName() const;
+ bool isNull() const; // ### Qt6 make virtual
virtual void virtual_hook(int id, void *data);
};
diff --git a/src/gui/image/qiconloader.cpp b/src/gui/image/qiconloader.cpp
index 3ead72dfbb..ecce7f9967 100644
--- a/src/gui/image/qiconloader.cpp
+++ b/src/gui/image/qiconloader.cpp
@@ -155,6 +155,141 @@ QStringList QIconLoader::themeSearchPaths() const
return m_iconDirs;
}
+/*!
+ \class QIconCacheGtkReader
+ \internal
+ Helper class that reads and looks up into the icon-theme.cache generated with
+ gtk-update-icon-cache. If at any point we detect a corruption in the file
+ (because the offsets point at wrong locations for example), the reader
+ is marked as invalid.
+*/
+class QIconCacheGtkReader
+{
+public:
+ explicit QIconCacheGtkReader(const QString &themeDir);
+ QVector<const char *> lookup(const QString &);
+ bool isValid() const { return m_isValid; }
+private:
+ QFile m_file;
+ const unsigned char *m_data;
+ quint64 m_size;
+ bool m_isValid;
+
+ quint16 read16(uint offset)
+ {
+ if (offset > m_size - 2 || (offset & 0x1)) {
+ m_isValid = false;
+ return 0;
+ }
+ return m_data[offset+1] | m_data[offset] << 8;
+ }
+ quint32 read32(uint offset)
+ {
+ if (offset > m_size - 4 || (offset & 0x3)) {
+ m_isValid = false;
+ return 0;
+ }
+ return m_data[offset+3] | m_data[offset+2] << 8
+ | m_data[offset+1] << 16 | m_data[offset] << 24;
+ }
+};
+
+
+QIconCacheGtkReader::QIconCacheGtkReader(const QString &dirName)
+ : m_isValid(false)
+{
+ QFileInfo info(dirName + QLatin1Literal("/icon-theme.cache"));
+ if (!info.exists() || info.lastModified() < QFileInfo(dirName).lastModified())
+ return;
+ m_file.setFileName(info.absoluteFilePath());
+ if (!m_file.open(QFile::ReadOnly))
+ return;
+ m_size = m_file.size();
+ m_data = m_file.map(0, m_size);
+ if (!m_data)
+ return;
+ if (read16(0) != 1) // VERSION_MAJOR
+ return;
+
+ m_isValid = true;
+
+ // Check that all the directories are older than the cache
+ auto lastModified = info.lastModified();
+ quint32 dirListOffset = read32(8);
+ quint32 dirListLen = read32(dirListOffset);
+ for (uint i = 0; i < dirListLen; ++i) {
+ quint32 offset = read32(dirListOffset + 4 + 4 * i);
+ if (!m_isValid || offset >= m_size || lastModified < QFileInfo(dirName + QLatin1Char('/')
+ + QString::fromUtf8(reinterpret_cast<const char*>(m_data + offset))).lastModified()) {
+ m_isValid = false;
+ return;
+ }
+ }
+}
+
+static quint32 icon_name_hash(const char *p)
+{
+ quint32 h = static_cast<signed char>(*p);
+ for (p += 1; *p != '\0'; p++)
+ h = (h << 5) - h + *p;
+ return h;
+}
+
+/*! \internal
+ lookup the icon name and return the list of subdirectories in which an icon
+ with this name is present. The char* are pointers to the mapped data.
+ For example, this would return { "32x32/apps", "24x24/apps" , ... }
+ */
+QVector<const char *> QIconCacheGtkReader::lookup(const QString &name)
+{
+ QVector<const char *> ret;
+ if (!isValid())
+ return ret;
+
+ QByteArray nameUtf8 = name.toUtf8();
+ quint32 hash = icon_name_hash(nameUtf8);
+
+ quint32 hashOffset = read32(4);
+ quint32 hashBucketCount = read32(hashOffset);
+
+ if (!isValid() || hashBucketCount == 0) {
+ m_isValid = false;
+ return ret;
+ }
+
+ quint32 bucketIndex = hash % hashBucketCount;
+ quint32 bucketOffset = read32(hashOffset + 4 + bucketIndex * 4);
+ while (bucketOffset > 0 && bucketOffset <= m_size - 12) {
+ quint32 nameOff = read32(bucketOffset + 4);
+ if (nameOff < m_size && strcmp(reinterpret_cast<const char*>(m_data + nameOff), nameUtf8) == 0) {
+ quint32 dirListOffset = read32(8);
+ quint32 dirListLen = read32(dirListOffset);
+
+ quint32 listOffset = read32(bucketOffset+8);
+ quint32 listLen = read32(listOffset);
+
+ if (!m_isValid || listOffset + 4 + 8 * listLen > m_size) {
+ m_isValid = false;
+ return ret;
+ }
+
+ ret.reserve(listLen);
+ for (uint j = 0; j < listLen && m_isValid; ++j) {
+ quint32 dirIndex = read16(listOffset + 4 + 8 * j);
+ quint32 o = read32(dirListOffset + 4 + dirIndex*4);
+ if (!m_isValid || dirIndex >= dirListLen || o >= m_size) {
+ m_isValid = false;
+ return ret;
+ }
+ ret.append(reinterpret_cast<const char*>(m_data) + o);
+ }
+ return ret;
+ }
+ bucketOffset = read32(bucketOffset);
+ }
+ return ret;
+}
+
QIconTheme::QIconTheme(const QString &themeName)
: m_valid(false)
{
@@ -166,8 +301,10 @@ QIconTheme::QIconTheme(const QString &themeName)
QString themeDir = iconDir.path() + QLatin1Char('/') + themeName;
QFileInfo themeDirInfo(themeDir);
- if (themeDirInfo.isDir())
+ if (themeDirInfo.isDir()) {
m_contentDirs << themeDir;
+ m_gtkCaches << QSharedPointer<QIconCacheGtkReader>::create(themeDir);
+ }
if (!m_valid) {
themeIndex.setFileName(themeDir + QLatin1String("/index.theme"));
@@ -257,7 +394,6 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName,
}
const QStringList contentDirs = theme.contentDirs();
- const QVector<QIconDirInfo> subDirs = theme.keyList();
QString iconNameFallback = iconName;
@@ -268,6 +404,29 @@ QThemeIconInfo QIconLoader::findIconHelper(const QString &themeName,
// Add all relevant files
for (int i = 0; i < contentDirs.size(); ++i) {
+ QVector<QIconDirInfo> subDirs = theme.keyList();
+
+ // Try to reduce the amount of subDirs by looking in the GTK+ cache in order to save
+ // a massive amount of file stat (especially if the icon is not there)
+ auto cache = theme.m_gtkCaches.at(i);
+ if (cache->isValid()) {
+ auto result = cache->lookup(iconNameFallback);
+ if (cache->isValid()) {
+ const QVector<QIconDirInfo> subDirsCopy = subDirs;
+ subDirs.clear();
+ subDirs.reserve(result.count());
+ foreach (const char *s, result) {
+ QString path = QString::fromUtf8(s);
+ auto it = std::find_if(subDirsCopy.cbegin(), subDirsCopy.cend(),
+ [&](const QIconDirInfo &info) {
+ return info.path == path; } );
+ if (it != subDirsCopy.cend()) {
+ subDirs.append(*it);
+ }
+ }
+ }
+ }
+
QString contentDir = contentDirs.at(i) + QLatin1Char('/');
for (int j = 0; j < subDirs.size() ; ++j) {
const QIconDirInfo &dirInfo = subDirs.at(j);
@@ -587,6 +746,11 @@ void QIconLoaderEngine::virtual_hook(int id, void *data)
name = m_info.iconName;
}
break;
+ case QIconEngine::IsNullHook:
+ {
+ *reinterpret_cast<bool*>(data) = m_info.entries.isEmpty();
+ }
+ break;
default:
QIconEngine::virtual_hook(id, data);
}
diff --git a/src/gui/image/qiconloader_p.h b/src/gui/image/qiconloader_p.h
index ccf0a9d438..193154e44e 100644
--- a/src/gui/image/qiconloader_p.h
+++ b/src/gui/image/qiconloader_p.h
@@ -139,6 +139,8 @@ private:
friend class QIconLoader;
};
+class QIconCacheGtkReader;
+
class QIconTheme
{
public:
@@ -148,12 +150,13 @@ public:
QVector<QIconDirInfo> keyList() { return m_keyList; }
QStringList contentDirs() { return m_contentDirs; }
bool isValid() { return m_valid; }
-
private:
QStringList m_contentDirs;
QVector<QIconDirInfo> m_keyList;
QStringList m_parents;
bool m_valid;
+public:
+ QVector<QSharedPointer<QIconCacheGtkReader>> m_gtkCaches;
};
class Q_GUI_EXPORT QIconLoader
diff --git a/src/gui/image/qimage.h b/src/gui/image/qimage.h
index 888c7beb32..9d8e3efcc4 100644
--- a/src/gui/image/qimage.h
+++ b/src/gui/image/qimage.h
@@ -168,9 +168,9 @@ public:
Format format() const;
#if defined(Q_COMPILER_REF_QUALIFIERS) && !defined(QT_COMPILING_QIMAGE_COMPAT_CPP)
- QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) const & Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) const & Q_REQUIRED_RESULT
{ return convertToFormat_helper(f, flags); }
- QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) && Q_REQUIRED_RESULT
+ Q_ALWAYS_INLINE QImage convertToFormat(Format f, Qt::ImageConversionFlags flags = Qt::AutoColor) && Q_REQUIRED_RESULT
{
if (convertToFormat_inplace(f, flags))
return std::move(*this);
diff --git a/src/gui/image/qpixmapcache.cpp b/src/gui/image/qpixmapcache.cpp
index d29ddcf978..6265a0c16d 100644
--- a/src/gui/image/qpixmapcache.cpp
+++ b/src/gui/image/qpixmapcache.cpp
@@ -156,6 +156,16 @@ bool QPixmapCache::Key::operator ==(const Key &key) const
*/
/*!
+ Returns \c true if there is a cached pixmap associated with this key.
+ Otherwise, if pixmap was flushed, the key is no longer valid.
+ \since 5.7
+*/
+bool QPixmapCache::Key::isValid() const Q_DECL_NOTHROW
+{
+ return d && d->isValid;
+}
+
+/*!
\internal
*/
QPixmapCache::Key &QPixmapCache::Key::operator =(const Key &other)
diff --git a/src/gui/image/qpixmapcache.h b/src/gui/image/qpixmapcache.h
index 37a0588e06..ca18f299a7 100644
--- a/src/gui/image/qpixmapcache.h
+++ b/src/gui/image/qpixmapcache.h
@@ -59,6 +59,7 @@ public:
Key &operator =(const Key &other);
void swap(Key &other) Q_DECL_NOTHROW { qSwap(d, other.d); }
+ bool isValid() const Q_DECL_NOTHROW;
private:
KeyData *d;
diff --git a/src/gui/kernel/qdrag.cpp b/src/gui/kernel/qdrag.cpp
index 2736fac8e0..36527966b7 100644
--- a/src/gui/kernel/qdrag.cpp
+++ b/src/gui/kernel/qdrag.cpp
@@ -33,6 +33,8 @@
#include <qdrag.h>
#include "private/qguiapplication_p.h"
+#include "qpa/qplatformintegration.h"
+#include "qpa/qplatformdrag.h"
#include <qpixmap.h>
#include <qpoint.h>
#include "qdnd_p.h"
@@ -223,6 +225,8 @@ QObject *QDrag::target() const
loop. Other events are still delivered to the application while
the operation is performed. On Windows, the Qt event loop is
blocked during the operation.
+
+ \sa cancel()
*/
Qt::DropAction QDrag::exec(Qt::DropActions supportedActions)
@@ -377,6 +381,21 @@ Qt::DropAction QDrag::defaultAction() const
Q_D(const QDrag);
return d->default_action;
}
+
+/*!
+ Cancels a drag operation initiated by Qt.
+
+ \note This is currently implemented on Windows and X11.
+
+ \since 5.6
+ \sa exec()
+*/
+void QDrag::cancel()
+{
+ if (QPlatformDrag *platformDrag = QGuiApplicationPrivate::platformIntegration()->drag())
+ platformDrag->cancelDrag();
+}
+
/*!
\fn void QDrag::actionChanged(Qt::DropAction action)
diff --git a/src/gui/kernel/qdrag.h b/src/gui/kernel/qdrag.h
index 0672cb00f9..961d7c89d9 100644
--- a/src/gui/kernel/qdrag.h
+++ b/src/gui/kernel/qdrag.h
@@ -77,6 +77,8 @@ public:
Qt::DropActions supportedActions() const;
Qt::DropAction defaultAction() const;
+ static void cancel();
+
Q_SIGNALS:
void actionChanged(Qt::DropAction action);
void targetChanged(QObject *newTarget);
diff --git a/src/gui/kernel/qevent.cpp b/src/gui/kernel/qevent.cpp
index 0bb21752bc..233b9ef3f7 100644
--- a/src/gui/kernel/qevent.cpp
+++ b/src/gui/kernel/qevent.cpp
@@ -37,6 +37,7 @@
#include "qpa/qplatformintegration.h"
#include "qpa/qplatformdrag.h"
#include "private/qevent_p.h"
+#include "qfile.h"
#include "qmetaobject.h"
#include "qmimedata.h"
#include "private/qdnd_p.h"
@@ -3948,9 +3949,11 @@ QDebug operator<<(QDebug dbg, const QEvent *e)
QtDebugUtils::formatQEnum(dbg, static_cast<const QApplicationStateChangeEvent *>(e)->applicationState());
dbg << ')';
break;
+# ifndef QT_NO_CONTEXTMENU
case QEvent::ContextMenu:
dbg << "QContextMenuEvent(" << static_cast<const QContextMenuEvent *>(e)->pos() << ')';
break;
+# endif // !QT_NO_CONTEXTMENU
# ifndef QT_NO_TABLETEVENT
case QEvent::TabletEnterProximity:
case QEvent::TabletLeaveProximity:
diff --git a/src/gui/kernel/qevent.h b/src/gui/kernel/qevent.h
index b90fce97e0..66e650c42d 100644
--- a/src/gui/kernel/qevent.h
+++ b/src/gui/kernel/qevent.h
@@ -35,20 +35,19 @@
#define QEVENT_H
#include <QtGui/qwindowdefs.h>
-#include <QtCore/qobject.h>
#include <QtGui/qregion.h>
#include <QtCore/qnamespace.h>
#include <QtCore/qstring.h>
#include <QtGui/qkeysequence.h>
#include <QtCore/qcoreevent.h>
#include <QtCore/qvariant.h>
-#include <QtCore/qmap.h>
+#include <QtCore/qmap.h> // ### Qt 6: Remove
#include <QtCore/qvector.h>
-#include <QtCore/qset.h>
+#include <QtCore/qset.h> // ### Qt 6: Remove
#include <QtCore/qurl.h>
-#include <QtCore/qfile.h>
+#include <QtCore/qfile.h> // ### Qt 6: Replace by <qiodevice.h> and forward declare QFile
#include <QtGui/qvector2d.h>
-#include <QtGui/qtouchdevice.h>
+#include <QtGui/qtouchdevice.h> // ### Qt 6: Replace by forward declaration
QT_BEGIN_NAMESPACE
diff --git a/src/gui/kernel/qgenericplugin.cpp b/src/gui/kernel/qgenericplugin.cpp
index 47f3ea5811..ae423b93e3 100644
--- a/src/gui/kernel/qgenericplugin.cpp
+++ b/src/gui/kernel/qgenericplugin.cpp
@@ -33,8 +33,6 @@
#include "qgenericplugin.h"
-#ifndef QT_NO_LIBRARY
-
QT_BEGIN_NAMESPACE
/*!
@@ -90,5 +88,3 @@ QGenericPlugin::~QGenericPlugin()
*/
QT_END_NAMESPACE
-
-#endif // QT_NO_LIBRARY
diff --git a/src/gui/kernel/qgenericplugin.h b/src/gui/kernel/qgenericplugin.h
index 03c1df7fba..21ae97f045 100644
--- a/src/gui/kernel/qgenericplugin.h
+++ b/src/gui/kernel/qgenericplugin.h
@@ -39,9 +39,6 @@
QT_BEGIN_NAMESPACE
-
-#ifndef QT_NO_LIBRARY
-
#define QGenericPluginFactoryInterface_iid "org.qt-project.Qt.QGenericPluginFactoryInterface"
class Q_GUI_EXPORT QGenericPlugin : public QObject
@@ -54,8 +51,6 @@ public:
virtual QObject* create(const QString& name, const QString &spec) = 0;
};
-#endif // QT_NO_LIBRARY
-
QT_END_NAMESPACE
#endif // QGENERICPLUGIN_H
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 216537e51a..12e5dbd66c 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -37,6 +37,7 @@
#include <qpa/qplatformintegrationfactory_p.h>
#include "private/qevent_p.h"
#include "qfont.h"
+#include "qtouchdevice.h"
#include <qpa/qplatformfontdatabase.h>
#include <qpa/qplatformwindow.h>
#include <qpa/qplatformnativeinterface.h>
@@ -148,6 +149,7 @@ QIcon *QGuiApplicationPrivate::app_icon = 0;
QString *QGuiApplicationPrivate::platform_name = 0;
QString *QGuiApplicationPrivate::displayName = 0;
+QString *QGuiApplicationPrivate::desktopFileName = 0;
QPalette *QGuiApplicationPrivate::app_pal = 0; // default application palette
@@ -608,6 +610,8 @@ QGuiApplication::~QGuiApplication()
QGuiApplicationPrivate::platform_name = 0;
delete QGuiApplicationPrivate::displayName;
QGuiApplicationPrivate::displayName = 0;
+ delete QGuiApplicationPrivate::desktopFileName;
+ QGuiApplicationPrivate::desktopFileName = 0;
}
QGuiApplicationPrivate::QGuiApplicationPrivate(int &argc, char **argv, int flags)
@@ -649,6 +653,34 @@ QString QGuiApplication::applicationDisplayName()
}
/*!
+ \property QGuiApplication::desktopFileName
+ \brief the base name of the desktop entry for this application
+ \since 5.7
+
+ This is the file name, without the full path, of the desktop entry
+ that represents this application according to the freedesktop desktop
+ entry specification.
+
+ This property gives a precise indication of what desktop entry represents
+ the application and it is needed by the windowing system to retrieve
+ such information without resorting to imprecise heuristics.
+
+ The latest version of the freedesktop desktop entry specification can be obtained
+ \l{http://standards.freedesktop.org/desktop-entry-spec/latest/}{here}.
+*/
+void QGuiApplication::setDesktopFileName(const QString &name)
+{
+ if (!QGuiApplicationPrivate::desktopFileName)
+ QGuiApplicationPrivate::desktopFileName = new QString;
+ *QGuiApplicationPrivate::desktopFileName = name;
+}
+
+QString QGuiApplication::desktopFileName()
+{
+ return QGuiApplicationPrivate::desktopFileName ? *QGuiApplicationPrivate::desktopFileName : QString();
+}
+
+/*!
Returns the most recently shown modal window. If no modal windows are
visible, this function returns zero.
diff --git a/src/gui/kernel/qguiapplication.h b/src/gui/kernel/qguiapplication.h
index d995387d66..a773122d3e 100644
--- a/src/gui/kernel/qguiapplication.h
+++ b/src/gui/kernel/qguiapplication.h
@@ -67,6 +67,7 @@ class Q_GUI_EXPORT QGuiApplication : public QCoreApplication
Q_OBJECT
Q_PROPERTY(QIcon windowIcon READ windowIcon WRITE setWindowIcon)
Q_PROPERTY(QString applicationDisplayName READ applicationDisplayName WRITE setApplicationDisplayName)
+ Q_PROPERTY(QString desktopFileName READ desktopFileName WRITE setDesktopFileName)
Q_PROPERTY(Qt::LayoutDirection layoutDirection READ layoutDirection WRITE setLayoutDirection NOTIFY layoutDirectionChanged)
Q_PROPERTY(QString platformName READ platformName STORED false)
Q_PROPERTY(bool quitOnLastWindowClosed READ quitOnLastWindowClosed WRITE setQuitOnLastWindowClosed)
@@ -83,6 +84,9 @@ public:
static void setApplicationDisplayName(const QString &name);
static QString applicationDisplayName();
+ static void setDesktopFileName(const QString &name);
+ static QString desktopFileName();
+
static QWindowList allWindows();
static QWindowList topLevelWindows();
static QWindow *topLevelAt(const QPoint &pos);
diff --git a/src/gui/kernel/qguiapplication_p.h b/src/gui/kernel/qguiapplication_p.h
index c3c5acf17c..7d8deab507 100644
--- a/src/gui/kernel/qguiapplication_p.h
+++ b/src/gui/kernel/qguiapplication_p.h
@@ -183,6 +183,7 @@ public:
static QIcon *app_icon;
static QString *platform_name;
static QString *displayName;
+ static QString *desktopFileName;
QWindowList modalWindowList;
static void showModalWindow(QWindow *window);
diff --git a/src/gui/kernel/qinputdevicemanager_p.h b/src/gui/kernel/qinputdevicemanager_p.h
index d64793c23c..4c24b1bc93 100644
--- a/src/gui/kernel/qinputdevicemanager_p.h
+++ b/src/gui/kernel/qinputdevicemanager_p.h
@@ -61,7 +61,8 @@ public:
DeviceTypeUnknown,
DeviceTypePointer,
DeviceTypeKeyboard,
- DeviceTypeTouch
+ DeviceTypeTouch,
+ DeviceTypeTablet
};
QInputDeviceManager(QObject *parent = 0);
diff --git a/src/gui/kernel/qplatformdrag.cpp b/src/gui/kernel/qplatformdrag.cpp
index d789c75d1d..11230194fc 100644
--- a/src/gui/kernel/qplatformdrag.cpp
+++ b/src/gui/kernel/qplatformdrag.cpp
@@ -155,6 +155,20 @@ Qt::DropAction QPlatformDrag::defaultAction(Qt::DropActions possibleActions,
}
/*!
+ \brief Cancels the currently active drag (only for drags of
+ the current application initiated by QPlatformDrag::drag()).
+
+ The default implementation does nothing.
+
+ \since 5.6
+ */
+
+void QPlatformDrag::cancelDrag()
+{
+ Q_UNIMPLEMENTED();
+}
+
+/*!
\brief Called to notify QDrag about changes of the current action.
*/
diff --git a/src/gui/kernel/qplatformdrag.h b/src/gui/kernel/qplatformdrag.h
index 10ee88477f..72e28d2745 100644
--- a/src/gui/kernel/qplatformdrag.h
+++ b/src/gui/kernel/qplatformdrag.h
@@ -92,6 +92,7 @@ public:
virtual QMimeData *platformDropData() = 0;
virtual Qt::DropAction drag(QDrag *m_drag) = 0;
+ virtual void cancelDrag();
void updateAction(Qt::DropAction action);
virtual Qt::DropAction defaultAction(Qt::DropActions possibleActions, Qt::KeyboardModifiers modifiers) const;
diff --git a/src/gui/kernel/qplatformintegration.cpp b/src/gui/kernel/qplatformintegration.cpp
index 14633d8b30..0968c9deed 100644
--- a/src/gui/kernel/qplatformintegration.cpp
+++ b/src/gui/kernel/qplatformintegration.cpp
@@ -149,13 +149,11 @@ QPlatformServices *QPlatformIntegration::services() const
/*!
\fn QPlatformWindow *QPlatformIntegration::createPlatformWindow(QWindow *window) const
- Factory function for QPlatformWindow. The \a window parameter is a pointer to the top level
- window which the QPlatformWindow is supposed to be created for.
+ Factory function for QPlatformWindow. The \a window parameter is a pointer to the window
+ which the QPlatformWindow is supposed to be created for.
- All top level windows have to have a QPlatformWindow, and it will be created when the
- QPlatformWindow is set to be visible for the first time. If the top level window's flags are
- changed, or if the top level window's QPlatformWindowFormat is changed, then the top level
- window's QPlatformWindow is deleted and a new one is created.
+ All windows have to have a QPlatformWindow, and it will be created on-demand when the
+ QWindow is made visible for the first time, or explicitly through calling QWindow::create().
In the constructor, of the QPlatformWindow, the window flags, state, title and geometry
of the \a window should be applied to the underlying window. If the resulting flags or state
diff --git a/src/gui/kernel/qplatformintegrationfactory.cpp b/src/gui/kernel/qplatformintegrationfactory.cpp
index 5a1fb3ca83..d109ceb2f0 100644
--- a/src/gui/kernel/qplatformintegrationfactory.cpp
+++ b/src/gui/kernel/qplatformintegrationfactory.cpp
@@ -42,11 +42,13 @@
QT_BEGIN_NAMESPACE
-#ifndef QT_NO_LIBRARY
Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
(QPlatformIntegrationFactoryInterface_iid, QLatin1String("/platforms"), Qt::CaseInsensitive))
+
+#ifndef QT_NO_LIBRARY
Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, directLoader,
(QPlatformIntegrationFactoryInterface_iid, QLatin1String(""), Qt::CaseInsensitive))
+#endif // !QT_NO_LIBRARY
static inline QPlatformIntegration *loadIntegration(QFactoryLoader *loader, const QString &key, const QStringList &parameters, int &argc, char ** argv)
{
@@ -59,8 +61,6 @@ static inline QPlatformIntegration *loadIntegration(QFactoryLoader *loader, cons
return 0;
}
-#endif // !QT_NO_LIBRARY
-
QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platform, const QStringList &paramList, int &argc, char **argv, const QString &platformPluginPath)
{
#ifndef QT_NO_LIBRARY
@@ -70,16 +70,10 @@ QPlatformIntegration *QPlatformIntegrationFactory::create(const QString &platfor
if (QPlatformIntegration *ret = loadIntegration(directLoader(), platform, paramList, argc, argv))
return ret;
}
- if (QPlatformIntegration *ret = loadIntegration(loader(), platform, paramList, argc, argv))
- return ret;
#else
- Q_UNUSED(platform);
- Q_UNUSED(paramList);
- Q_UNUSED(argc);
- Q_UNUSED(argv);
Q_UNUSED(platformPluginPath);
#endif
- return 0;
+ return loadIntegration(loader(), platform, paramList, argc, argv);
}
/*!
diff --git a/src/gui/kernel/qplatformtheme.cpp b/src/gui/kernel/qplatformtheme.cpp
index ce8548f628..61dacfa076 100644
--- a/src/gui/kernel/qplatformtheme.cpp
+++ b/src/gui/kernel/qplatformtheme.cpp
@@ -682,6 +682,41 @@ QString QPlatformTheme::defaultStandardButtonText(int button)
return QString();
}
+QString QPlatformTheme::removeMnemonics(const QString &original)
+{
+ QString returnText(original.size(), 0);
+ int finalDest = 0;
+ int currPos = 0;
+ int l = original.length();
+ while (l) {
+ if (original.at(currPos) == QLatin1Char('&')
+ && (l == 1 || original.at(currPos + 1) != QLatin1Char('&'))) {
+ ++currPos;
+ --l;
+ if (l == 0)
+ break;
+ } else if (original.at(currPos) == QLatin1Char('(') && l >= 4 &&
+ original.at(currPos + 1) == QLatin1Char('&') &&
+ original.at(currPos + 2) != QLatin1Char('&') &&
+ original.at(currPos + 3) == QLatin1Char(')')) {
+ /* remove mnemonics its format is "\s*(&X)" */
+ int n = 0;
+ while (finalDest > n && returnText.at(finalDest - n - 1).isSpace())
+ ++n;
+ finalDest -= n;
+ currPos += 4;
+ l -= 4;
+ continue;
+ }
+ returnText[finalDest] = original.at(currPos);
+ ++currPos;
+ ++finalDest;
+ --l;
+ }
+ returnText.truncate(finalDest);
+ return returnText;
+}
+
unsigned QPlatformThemePrivate::currentKeyPlatforms()
{
const uint keyboardScheme = QGuiApplicationPrivate::platformTheme()->themeHint(QPlatformTheme::KeyboardScheme).toInt();
diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h
index 69cc2f90af..9355e83491 100644
--- a/src/gui/kernel/qplatformtheme.h
+++ b/src/gui/kernel/qplatformtheme.h
@@ -301,6 +301,7 @@ public:
static QVariant defaultThemeHint(ThemeHint hint);
static QString defaultStandardButtonText(int button);
+ static QString removeMnemonics(const QString &original);
protected:
explicit QPlatformTheme(QPlatformThemePrivate *priv);
diff --git a/src/gui/kernel/qsimpledrag.cpp b/src/gui/kernel/qsimpledrag.cpp
index 9f38c9b78a..706786385b 100644
--- a/src/gui/kernel/qsimpledrag.cpp
+++ b/src/gui/kernel/qsimpledrag.cpp
@@ -191,6 +191,14 @@ Qt::DropAction QBasicDrag::drag(QDrag *o)
return m_executed_drop_action;
}
+void QBasicDrag::cancelDrag()
+{
+ if (m_eventLoop) {
+ cancel();
+ m_eventLoop->quit();
+ }
+}
+
void QBasicDrag::restoreCursor()
{
if (m_restoreCursor) {
diff --git a/src/gui/kernel/qsimpledrag_p.h b/src/gui/kernel/qsimpledrag_p.h
index 055136c436..d5dacd8fd2 100644
--- a/src/gui/kernel/qsimpledrag_p.h
+++ b/src/gui/kernel/qsimpledrag_p.h
@@ -66,6 +66,7 @@ public:
virtual ~QBasicDrag();
virtual Qt::DropAction drag(QDrag *drag) Q_DECL_OVERRIDE;
+ void cancelDrag() Q_DECL_OVERRIDE;
virtual bool eventFilter(QObject *o, QEvent *e) Q_DECL_OVERRIDE;
diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp
index e262f3f8a4..3f971d700e 100644
--- a/src/gui/kernel/qwindow.cpp
+++ b/src/gui/kernel/qwindow.cpp
@@ -392,6 +392,9 @@ void QWindowPrivate::create(bool recursive)
if (platformWindow)
return;
+ if (q->parent())
+ q->parent()->create();
+
platformWindow = QGuiApplicationPrivate::platformIntegration()->createPlatformWindow(q);
Q_ASSERT(platformWindow);
@@ -403,13 +406,21 @@ void QWindowPrivate::create(bool recursive)
QObjectList childObjects = q->children();
for (int i = 0; i < childObjects.size(); i ++) {
QObject *object = childObjects.at(i);
- if (object->isWindowType()) {
- QWindow *window = static_cast<QWindow *>(object);
- if (recursive)
- window->d_func()->create(true);
- if (window->d_func()->platformWindow)
- window->d_func()->platformWindow->setParent(platformWindow);
- }
+ if (!object->isWindowType())
+ continue;
+
+ QWindow *childWindow = static_cast<QWindow *>(object);
+ if (recursive)
+ childWindow->d_func()->create(recursive);
+
+ // The child may have had deferred creation due to this window not being created
+ // at the time setVisible was called, so we re-apply the visible state, which
+ // may result in creating the child, and emitting the appropriate signals.
+ if (childWindow->isVisible())
+ childWindow->setVisible(true);
+
+ if (QPlatformWindow *childPlatformWindow = childWindow->d_func()->platformWindow)
+ childPlatformWindow->setParent(this->platformWindow);
}
QPlatformSurfaceEvent e(QPlatformSurfaceEvent::SurfaceCreated);
@@ -474,14 +485,23 @@ void QWindow::setVisible(bool visible)
{
Q_D(QWindow);
- if (d->visible == visible)
+ if (d->visible != visible) {
+ d->visible = visible;
+ emit visibleChanged(visible);
+ d->updateVisibility();
+ } else if (d->platformWindow) {
+ // Visibility hasn't changed, and the platform window is in sync
return;
- d->visible = visible;
- emit visibleChanged(visible);
- d->updateVisibility();
+ }
- if (!d->platformWindow)
- create();
+ if (!d->platformWindow) {
+ // If we have a parent window, but the parent hasn't been created yet, we
+ // can defer creation until the parent is created or we're re-parented.
+ if (parent() && !parent()->handle())
+ return;
+ else
+ create();
+ }
if (visible) {
// remove posted quit events when showing a new window
@@ -520,6 +540,7 @@ void QWindow::setVisible(bool visible)
if (visible && (d->hasCursor || QGuiApplication::overrideCursor()))
d->applyCursor();
#endif
+
d->platformWindow->setVisible(visible);
if (!visible) {
@@ -609,20 +630,25 @@ void QWindow::setParent(QWindow *parent)
}
QObject::setParent(parent);
+ d->parentWindow = parent;
+
if (parent)
d->disconnectFromScreen();
else
d->connectToScreen(newScreen);
+ // If we were set visible, but not created because we were a child, and we're now
+ // re-parented into a created parent, or to being a top level, we need re-apply the
+ // visibility state, which will also create.
+ if (isVisible() && (!parent || parent->handle()))
+ setVisible(true);
+
if (d->platformWindow) {
- if (parent && parent->d_func()->platformWindow) {
- d->platformWindow->setParent(parent->d_func()->platformWindow);
- } else {
- d->platformWindow->setParent(0);
- }
- }
+ if (parent)
+ parent->create();
- d->parentWindow = parent;
+ d->platformWindow->setParent(parent ? parent->d_func()->platformWindow : 0);
+ }
QGuiApplicationPrivate::updateBlockedStatus(this);
}
diff --git a/src/gui/opengl/qtriangulator_p.h b/src/gui/opengl/qtriangulator_p.h
index 0ab3f7496c..4e13e5bdd0 100644
--- a/src/gui/opengl/qtriangulator_p.h
+++ b/src/gui/opengl/qtriangulator_p.h
@@ -88,12 +88,13 @@ public:
inline QVertexIndexVector &operator = (const QVertexIndexVector &other)
{
- if (t == UnsignedInt)
- indices32 = other.indices32;
- else
- indices16 = other.indices16;
+ if (t == UnsignedInt)
+ indices32 = other.indices32;
+ else
+ indices16 = other.indices16;
- return *this;
+ t = other.t;
+ return *this;
}
private:
diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp
index 0fd5f510c7..0e8771b0ac 100644
--- a/src/gui/text/qrawfont.cpp
+++ b/src/gui/text/qrawfont.cpp
@@ -44,6 +44,7 @@
#include <qpa/qplatformfontdatabase.h>
#include <QtCore/qendian.h>
+#include <QtCore/qfile.h>
QT_BEGIN_NAMESPACE
diff --git a/src/gui/text/qtexthtmlparser.cpp b/src/gui/text/qtexthtmlparser.cpp
index f8f41bb53d..a09ed2c040 100644
--- a/src/gui/text/qtexthtmlparser.cpp
+++ b/src/gui/text/qtexthtmlparser.cpp
@@ -1140,6 +1140,7 @@ void QTextHtmlParserNode::setListStyle(const QVector<QCss::Value> &cssValues)
for (int i = 0; i < cssValues.count(); ++i) {
if (cssValues.at(i).type == QCss::Value::KnownIdentifier) {
switch (static_cast<QCss::KnownValue>(cssValues.at(i).variant.toInt())) {
+ case QCss::Value_None: hasOwnListStyle = true; listStyle = QTextListFormat::ListStyleUndefined; break;
case QCss::Value_Disc: hasOwnListStyle = true; listStyle = QTextListFormat::ListDisc; break;
case QCss::Value_Square: hasOwnListStyle = true; listStyle = QTextListFormat::ListSquare; break;
case QCss::Value_Circle: hasOwnListStyle = true; listStyle = QTextListFormat::ListCircle; break;
@@ -1495,6 +1496,8 @@ void QTextHtmlParser::applyAttributes(const QStringList &attributes)
node->listStyle = QTextListFormat::ListDisc;
else if (value == QLatin1String("circle"))
node->listStyle = QTextListFormat::ListCircle;
+ else if (value == QLatin1String("none"))
+ node->listStyle = QTextListFormat::ListStyleUndefined;
}
}
break;
diff --git a/src/gui/text/qtextimagehandler.cpp b/src/gui/text/qtextimagehandler.cpp
index 747ed90281..686a00e42a 100644
--- a/src/gui/text/qtextimagehandler.cpp
+++ b/src/gui/text/qtextimagehandler.cpp
@@ -38,6 +38,7 @@
#include <qtextformat.h>
#include <qpainter.h>
#include <qdebug.h>
+#include <qfile.h>
#include <private/qtextengine_p.h>
#include <qpalette.h>
#include <qthread.h>
diff --git a/src/gui/util/qvalidator.cpp b/src/gui/util/qvalidator.cpp
index 31dfd20d1a..4a92b7ea3a 100644
--- a/src/gui/util/qvalidator.cpp
+++ b/src/gui/util/qvalidator.cpp
@@ -38,6 +38,7 @@
#ifndef QT_NO_VALIDATOR
#include "private/qobject_p.h"
#include "private/qlocale_p.h"
+#include "private/qnumeric_p.h"
#include <limits.h>
#include <cmath>
@@ -676,9 +677,9 @@ QValidator::State QDoubleValidatorPrivate::validateWithLocale(QString &input, QL
if (q->t < 0 && buff.startsWith('+'))
return QValidator::Invalid;
- bool ok, overflow;
- double i = QLocaleData::bytearrayToDouble(buff.constData(), &ok, &overflow);
- if (overflow)
+ bool ok = false;
+ double i = buff.toDouble(&ok); // returns 0.0 if !ok
+ if (i == qt_qnan())
return QValidator::Invalid;
if (!ok)
return QValidator::Intermediate;
diff --git a/src/network/access/access.pri b/src/network/access/access.pri
index e829d52cbe..42c7c80f3b 100644
--- a/src/network/access/access.pri
+++ b/src/network/access/access.pri
@@ -78,6 +78,8 @@ ios {
OBJECTIVE_SOURCES += \
access/qnetworkreplynsurlconnectionimpl.mm
+
+ LIBS_PRIVATE += -framework Foundation
}
include($$PWD/../../3rdparty/zlib_dependency.pri)
diff --git a/src/network/access/qnetworkreplyhttpimpl.cpp b/src/network/access/qnetworkreplyhttpimpl.cpp
index ad8a5321b4..2c31afc225 100644
--- a/src/network/access/qnetworkreplyhttpimpl.cpp
+++ b/src/network/access/qnetworkreplyhttpimpl.cpp
@@ -1733,7 +1733,7 @@ void QNetworkReplyHttpImplPrivate::_q_startOperation()
// ensure this function is only being called once
if (state == Working) {
- qDebug("QNetworkReplyImpl::_q_startOperation was called more than once");
+ qDebug() << "QNetworkReplyHttpImplPrivate::_q_startOperation was called more than once" << url;
return;
}
state = Working;
diff --git a/src/network/access/qnetworkreplyimpl.cpp b/src/network/access/qnetworkreplyimpl.cpp
index c73e6162d1..3df39c9bdc 100644
--- a/src/network/access/qnetworkreplyimpl.cpp
+++ b/src/network/access/qnetworkreplyimpl.cpp
@@ -67,7 +67,7 @@ void QNetworkReplyImplPrivate::_q_startOperation()
{
// ensure this function is only being called once
if (state == Working || state == Finished) {
- qDebug("QNetworkReplyImpl::_q_startOperation was called more than once");
+ qDebug() << "QNetworkReplyImpl::_q_startOperation was called more than once" << url;
return;
}
state = Working;
diff --git a/src/network/kernel/qnetworkinterface.cpp b/src/network/kernel/qnetworkinterface.cpp
index 4a527052d1..81906edc47 100644
--- a/src/network/kernel/qnetworkinterface.cpp
+++ b/src/network/kernel/qnetworkinterface.cpp
@@ -519,6 +519,31 @@ QList<QNetworkAddressEntry> QNetworkInterface::addressEntries() const
}
/*!
+ \since 5.7
+
+ Returns the index of the interface whose name is \a name or 0 if there is
+ no interface with that name. This function should produce the same result
+ as the following code, but will probably execute faster.
+
+ \code
+ QNetworkInterface::interfaceFromName(name).index()
+ \endcode
+
+ \sa interfaceFromName(), interfaceNameFromIndex(), QUdpDatagram::interfaceIndex()
+*/
+int QNetworkInterface::interfaceIndexFromName(const QString &name)
+{
+ if (name.isEmpty())
+ return 0;
+
+ bool ok;
+ uint id = name.toUInt(&ok);
+ if (!ok)
+ id = QNetworkInterfaceManager::interfaceIndexFromName(name);
+ return int(id);
+}
+
+/*!
Returns a QNetworkInterface object for the interface named \a
name. If no such interface exists, this function returns an
invalid QNetworkInterface object.
@@ -553,6 +578,27 @@ QNetworkInterface QNetworkInterface::interfaceFromIndex(int index)
}
/*!
+ \since 5.7
+
+ Returns the name of the interface whose index is \a index or an empty
+ string if there is no interface with that index. This function should
+ produce the same result as the following code, but will probably execute
+ faster.
+
+ \code
+ QNetworkInterface::interfaceFromIndex(index).name()
+ \endcode
+
+ \sa interfaceFromIndex(), interfaceIndexFromName(), QUdpDatagram::interfaceIndex()
+*/
+QString QNetworkInterface::interfaceNameFromIndex(int index)
+{
+ if (!index)
+ return QString();
+ return QNetworkInterfaceManager::interfaceNameFromIndex(index);
+}
+
+/*!
Returns a listing of all the network interfaces found on the host
machine. In case of failure it returns a list with zero elements.
*/
diff --git a/src/network/kernel/qnetworkinterface.h b/src/network/kernel/qnetworkinterface.h
index b3daa3d4a0..bd57aea1cb 100644
--- a/src/network/kernel/qnetworkinterface.h
+++ b/src/network/kernel/qnetworkinterface.h
@@ -113,8 +113,10 @@ public:
QString hardwareAddress() const;
QList<QNetworkAddressEntry> addressEntries() const;
+ static int interfaceIndexFromName(const QString &name);
static QNetworkInterface interfaceFromName(const QString &name);
static QNetworkInterface interfaceFromIndex(int index);
+ static QString interfaceNameFromIndex(int index);
static QList<QNetworkInterface> allInterfaces();
static QList<QHostAddress> allAddresses();
diff --git a/src/network/kernel/qnetworkinterface_p.h b/src/network/kernel/qnetworkinterface_p.h
index 140a28c536..146ba7820c 100644
--- a/src/network/kernel/qnetworkinterface_p.h
+++ b/src/network/kernel/qnetworkinterface_p.h
@@ -100,6 +100,9 @@ public:
QSharedDataPointer<QNetworkInterfacePrivate> interfaceFromIndex(int index);
QList<QSharedDataPointer<QNetworkInterfacePrivate> > allInterfaces();
+ static uint interfaceIndexFromName(const QString &name);
+ static QString interfaceNameFromIndex(uint index);
+
// convenience:
QSharedDataPointer<QNetworkInterfacePrivate> empty;
diff --git a/src/network/kernel/qnetworkinterface_unix.cpp b/src/network/kernel/qnetworkinterface_unix.cpp
index cc53087024..541c78d838 100644
--- a/src/network/kernel/qnetworkinterface_unix.cpp
+++ b/src/network/kernel/qnetworkinterface_unix.cpp
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
+** Copyright (C) 2015 Intel Corporation.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtNetwork module of the Qt Toolkit.
@@ -93,14 +94,8 @@ static QHostAddress addressFromSockaddr(sockaddr *sa, int ifindex = 0, const QSt
// this is the most likely scenario:
// a scope ID in a socket is that of the interface this address came from
address.setScopeId(ifname);
- } else if (scope) {
-#ifndef QT_NO_IPV6IFNAME
- char scopeid[IFNAMSIZ];
- if (::if_indextoname(scope, scopeid)) {
- address.setScopeId(QLatin1String(scopeid));
- } else
-#endif
- address.setScopeId(QString::number(uint(scope)));
+ } else if (scope) {
+ address.setScopeId(QNetworkInterfaceManager::interfaceNameFromIndex(scope));
}
}
return address;
@@ -124,6 +119,53 @@ static QNetworkInterface::InterfaceFlags convertFlags(uint rawFlags)
return flags;
}
+uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
+{
+#ifndef QT_NO_IPV6IFNAME
+ return ::if_nametoindex(name.toLatin1());
+#elif defined(SIOCGIFINDEX)
+ struct ifreq req;
+ int socket = qt_safe_socket(AF_INET, SOCK_STREAM, 0);
+ if (socket < 0)
+ return 0;
+
+ QByteArray name8bit = name.toLatin1();
+ memset(&req, 0, sizeof(ifreq));
+ memcpy(req.ifr_name, name8bit, qMin<int>(name8bit.length() + 1, sizeof(req.ifr_name) - 1));
+
+ uint id = 0;
+ if (qt_safe_ioctl(socket, SIOCGIFINDEX, &req) >= 0)
+ id = req.ifr_ifindex;
+ qt_safe_close(socket);
+ return id;
+#else
+ return 0;
+#endif
+}
+
+QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
+{
+#ifndef QT_NO_IPV6IFNAME
+ char buf[IF_NAMESIZE];
+ if (::if_indextoname(index, buf))
+ return QString::fromLatin1(buf);
+#elif defined(SIOCGIFNAME)
+ struct ifreq req;
+ int socket = qt_safe_socket(AF_INET, SOCK_STREAM, 0);
+ if (socket >= 0) {
+ memset(&req, 0, sizeof(ifreq));
+ req.ifr_ifindex = index;
+
+ if (qt_safe_ioctl(socket, SIOCGIFNAME, &req) >= 0) {
+ qt_safe_close(socket);
+ return QString::fromLatin1(req.ifr_name);
+ }
+ qt_safe_close(socket);
+ }
+#endif
+ return QString::number(uint(index));
+}
+
#ifdef QT_NO_GETIFADDRS
// getifaddrs not available
diff --git a/src/network/kernel/qnetworkinterface_win.cpp b/src/network/kernel/qnetworkinterface_win.cpp
index 907638f73e..238f913846 100644
--- a/src/network/kernel/qnetworkinterface_win.cpp
+++ b/src/network/kernel/qnetworkinterface_win.cpp
@@ -57,8 +57,14 @@
QT_BEGIN_NAMESPACE
+typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceIndexToLuid)(NET_IFINDEX, PNET_LUID);
typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceLuidToName)(const NET_LUID *, PWSTR, SIZE_T);
+typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceLuidToIndex)(const NET_LUID *, PNET_IFINDEX);
+typedef NETIO_STATUS (WINAPI *PtrConvertInterfaceNameToLuid)(const WCHAR *, PNET_LUID);
+static PtrConvertInterfaceIndexToLuid ptrConvertInterfaceIndexToLuid = 0;
static PtrConvertInterfaceLuidToName ptrConvertInterfaceLuidToName = 0;
+static PtrConvertInterfaceLuidToIndex ptrConvertInterfaceLuidToIndex = 0;
+static PtrConvertInterfaceNameToLuid ptrConvertInterfaceNameToLuid = 0;
static void resolveLibs()
{
@@ -71,10 +77,16 @@ static void resolveLibs()
#if defined(Q_OS_WINCE)
// since Windows Embedded Compact 7
+ ptrConvertInterfaceIndexToLuid = (PtrConvertInterfaceIndexToLuid)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceIndexToLuid");
ptrConvertInterfaceLuidToName = (PtrConvertInterfaceLuidToName)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceLuidToNameW");
+ ptrConvertInterfaceLuidToIndex = (PtrConvertInterfaceLuidToIndex)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceLuidToIndex");
+ ptrConvertInterfaceNameToLuid = (PtrConvertInterfaceNameToLuid)GetProcAddress(iphlpapiHnd, L"ConvertInterfaceNameToLuidW");
#else
// since Windows Vista
+ ptrConvertInterfaceIndexToLuid = (PtrConvertInterfaceIndexToLuid)GetProcAddress(iphlpapiHnd, "ConvertInterfaceIndexToLuid");
ptrConvertInterfaceLuidToName = (PtrConvertInterfaceLuidToName)GetProcAddress(iphlpapiHnd, "ConvertInterfaceLuidToNameW");
+ ptrConvertInterfaceLuidToIndex = (PtrConvertInterfaceLuidToIndex)GetProcAddress(iphlpapiHnd, "ConvertInterfaceLuidToIndex");
+ ptrConvertInterfaceNameToLuid = (PtrConvertInterfaceNameToLuid)GetProcAddress(iphlpapiHnd, "ConvertInterfaceNameToLuidW");
#endif
done = true;
}
@@ -92,13 +104,42 @@ static QHostAddress addressFromSockaddr(sockaddr *sa)
address.setAddress(((sockaddr_in6 *)sa)->sin6_addr.s6_addr);
int scope = ((sockaddr_in6 *)sa)->sin6_scope_id;
if (scope)
- address.setScopeId(QString::number(scope));
+ address.setScopeId(QNetworkInterfaceManager::interfaceNameFromIndex(scope));
} else
qWarning("Got unknown socket family %d", sa->sa_family);
return address;
}
+uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
+{
+ resolveLibs();
+ if (!ptrConvertInterfaceNameToLuid || !ptrConvertInterfaceLuidToIndex)
+ return 0;
+
+ NET_IFINDEX id;
+ NET_LUID luid;
+ if (ptrConvertInterfaceNameToLuid(reinterpret_cast<const wchar_t *>(name.constData()), &luid) == NO_ERROR
+ && ptrConvertInterfaceLuidToIndex(&luid, &id) == NO_ERROR)
+ return uint(id);
+ return 0;
+}
+
+QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
+{
+ resolveLibs();
+ if (ptrConvertInterfaceIndexToLuid && ptrConvertInterfaceLuidToName) {
+ NET_LUID luid;
+ if (ptrConvertInterfaceIndexToLuid(index, &luid) == NO_ERROR) {
+ WCHAR buf[IF_MAX_STRING_SIZE + 1];
+ if (ptrConvertInterfaceLuidToName(&luid, buf, sizeof(buf)/sizeof(buf[0])) == NO_ERROR)
+ return QString::fromWCharArray(buf);
+ }
+ }
+
+ return QString::number(index);
+}
+
static QHash<QHostAddress, QHostAddress> ipv4Netmasks()
{
//Retrieve all the IPV4 addresses & netmasks
diff --git a/src/network/kernel/qnetworkinterface_winrt.cpp b/src/network/kernel/qnetworkinterface_winrt.cpp
index 0234154427..88c0eae2f7 100644
--- a/src/network/kernel/qnetworkinterface_winrt.cpp
+++ b/src/network/kernel/qnetworkinterface_winrt.cpp
@@ -59,6 +59,20 @@ struct HostNameInfo {
QString address;
};
+uint QNetworkInterfaceManager::interfaceIndexFromName(const QString &name)
+{
+ // TBD - may not be possible
+ Q_UNUSED(name);
+ return 0;
+}
+
+QString QNetworkInterfaceManager::interfaceNameFromIndex(uint index)
+{
+ // TBD - may not be possible
+ return QString::number(index);
+}
+
+
static QList<QNetworkInterfacePrivate *> interfaceListing()
{
QList<QNetworkInterfacePrivate *> interfaces;
diff --git a/src/network/socket/qabstractsocket.cpp b/src/network/socket/qabstractsocket.cpp
index 1831d25718..08ccff83fa 100644
--- a/src/network/socket/qabstractsocket.cpp
+++ b/src/network/socket/qabstractsocket.cpp
@@ -722,7 +722,7 @@ bool QAbstractSocketPrivate::canReadNotification()
}
}
- // only emit readyRead() when not recursing, and only if there is data available
+ // Only emit readyRead() if there is data available.
bool hasData = newBytes > 0
#ifndef QT_NO_UDPSOCKET
|| (!isBuffered && socketType != QAbstractSocket::TcpSocket && socketEngine && socketEngine->hasPendingDatagrams())
@@ -730,11 +730,8 @@ bool QAbstractSocketPrivate::canReadNotification()
|| (!isBuffered && socketType == QAbstractSocket::TcpSocket && socketEngine)
;
- if (!emittedReadyRead && hasData) {
- QScopedValueRollback<bool> r(emittedReadyRead);
- emittedReadyRead = true;
- emit q->readyRead();
- }
+ if (hasData)
+ emitReadyRead();
// If we were closed as a result of the readyRead() signal,
// return.
@@ -792,12 +789,12 @@ void QAbstractSocketPrivate::canCloseNotification()
// then occur when we read from the socket again and fail
// in canReadNotification or by the manually created
// closeNotification below.
- emit q->readyRead();
+ emitReadyRead();
QMetaObject::invokeMethod(socketEngine, "closeNotification", Qt::QueuedConnection);
}
} else if (socketType == QAbstractSocket::TcpSocket && socketEngine) {
- emit q->readyRead();
+ emitReadyRead();
}
}
@@ -817,8 +814,7 @@ bool QAbstractSocketPrivate::canWriteNotification()
#if defined (QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocketPrivate::canWriteNotification() flushing");
#endif
- qint64 tmp = writeBuffer.size();
- flush();
+ bool dataWasWritten = writeToSocket();
if (socketEngine) {
#if defined (Q_OS_WIN)
@@ -830,7 +826,7 @@ bool QAbstractSocketPrivate::canWriteNotification()
#endif
}
- return (writeBuffer.size() < tmp);
+ return dataWasWritten;
}
/*! \internal
@@ -852,21 +848,20 @@ void QAbstractSocketPrivate::connectionNotification()
/*! \internal
- Writes pending data in the write buffers to the socket. The
- function writes as much as it can without blocking.
+ Writes one pending data block in the write buffer to the socket.
It is usually invoked by canWriteNotification after one or more
calls to write().
Emits bytesWritten().
*/
-bool QAbstractSocketPrivate::flush()
+bool QAbstractSocketPrivate::writeToSocket()
{
Q_Q(QAbstractSocket);
if (!socketEngine || !socketEngine->isValid() || (writeBuffer.isEmpty()
&& socketEngine->bytesToWrite() == 0)) {
#if defined (QABSTRACTSOCKET_DEBUG)
- qDebug("QAbstractSocketPrivate::flush() nothing to do: valid ? %s, writeBuffer.isEmpty() ? %s",
+ qDebug("QAbstractSocketPrivate::writeToSocket() nothing to do: valid ? %s, writeBuffer.isEmpty() ? %s",
(socketEngine && socketEngine->isValid()) ? "yes" : "no", writeBuffer.isEmpty() ? "yes" : "no");
#endif
@@ -884,7 +879,8 @@ bool QAbstractSocketPrivate::flush()
qint64 written = socketEngine->write(ptr, nextSize);
if (written < 0) {
#if defined (QABSTRACTSOCKET_DEBUG)
- qDebug() << "QAbstractSocketPrivate::flush() write error, aborting." << socketEngine->errorString();
+ qDebug() << "QAbstractSocketPrivate::writeToSocket() write error, aborting."
+ << socketEngine->errorString();
#endif
setErrorAndEmit(socketEngine->error(), socketEngine->errorString());
// an unexpected error so close the socket.
@@ -893,7 +889,7 @@ bool QAbstractSocketPrivate::flush()
}
#if defined (QABSTRACTSOCKET_DEBUG)
- qDebug("QAbstractSocketPrivate::flush() %lld bytes written to the network",
+ qDebug("QAbstractSocketPrivate::writeToSocket() %lld bytes written to the network",
written);
#endif
@@ -914,7 +910,23 @@ bool QAbstractSocketPrivate::flush()
if (state == QAbstractSocket::ClosingState)
q->disconnectFromHost();
- return true;
+ return written > 0;
+}
+
+/*! \internal
+
+ Writes pending data in the write buffers to the socket. The function
+ writes as much as it can without blocking. If any data was written,
+ this function returns true; otherwise false is returned.
+*/
+bool QAbstractSocketPrivate::flush()
+{
+ bool dataWasWritten = false;
+
+ while (!writeBuffer.isEmpty() && writeToSocket())
+ dataWasWritten = true;
+
+ return dataWasWritten;
}
#ifndef QT_NO_NETWORKPROXY
@@ -1248,10 +1260,7 @@ void QAbstractSocketPrivate::_q_forceDisconnect()
*/
bool QAbstractSocketPrivate::readFromSocket()
{
-#ifdef QABSTRACTSOCKET_DEBUG
Q_Q(QAbstractSocket);
-#endif
-
// Find how many bytes we can read from the socket layer.
qint64 bytesToRead = socketEngine->bytesAvailable();
if (bytesToRead == 0) {
@@ -1280,7 +1289,7 @@ bool QAbstractSocketPrivate::readFromSocket()
buffer.chop(bytesToRead);
return true;
}
- buffer.chop(bytesToRead - (readBytes < 0 ? qint64(0) : readBytes));
+ buffer.chop(bytesToRead - ((readBytes < 0 || !q->isReadable()) ? qint64(0) : readBytes));
#if defined(QABSTRACTSOCKET_DEBUG)
qDebug("QAbstractSocketPrivate::readFromSocket() got %lld bytes, buffer size = %lld",
readBytes, buffer.size());
@@ -1301,6 +1310,21 @@ bool QAbstractSocketPrivate::readFromSocket()
/*! \internal
+ Prevents from the recursive readyRead() emission.
+*/
+void QAbstractSocketPrivate::emitReadyRead()
+{
+ Q_Q(QAbstractSocket);
+ // Only emit readyRead() when not recursing.
+ if (!emittedReadyRead) {
+ QScopedValueRollback<bool> r(emittedReadyRead);
+ emittedReadyRead = true;
+ emit q->readyRead();
+ }
+}
+
+/*! \internal
+
Sets up the internal state after the connection has succeeded.
*/
void QAbstractSocketPrivate::fetchConnectionParameters()
@@ -2378,7 +2402,7 @@ bool QAbstractSocket::isSequential() const
*/
bool QAbstractSocket::atEnd() const
{
- return QIODevice::atEnd() && (!isOpen() || d_func()->buffer.isEmpty());
+ return QIODevice::atEnd();
}
/*!
diff --git a/src/network/socket/qabstractsocket.h b/src/network/socket/qabstractsocket.h
index 23f0d26cbd..f8edc74a24 100644
--- a/src/network/socket/qabstractsocket.h
+++ b/src/network/socket/qabstractsocket.h
@@ -176,7 +176,7 @@ public:
// from QIODevice
void close() Q_DECL_OVERRIDE;
bool isSequential() const Q_DECL_OVERRIDE;
- bool atEnd() const Q_DECL_OVERRIDE;
+ bool atEnd() const Q_DECL_OVERRIDE; // ### Qt6: remove me
bool flush();
// for synchronous access
diff --git a/src/network/socket/qabstractsocket_p.h b/src/network/socket/qabstractsocket_p.h
index a905625b19..ba129b48df 100644
--- a/src/network/socket/qabstractsocket_p.h
+++ b/src/network/socket/qabstractsocket_p.h
@@ -135,6 +135,8 @@ public:
void fetchConnectionParameters();
void setupSocketNotifiers();
bool readFromSocket();
+ bool writeToSocket();
+ void emitReadyRead();
void setError(QAbstractSocket::SocketError errorCode, const QString &errorString);
void setErrorAndEmit(QAbstractSocket::SocketError errorCode, const QString &errorString);
diff --git a/src/network/socket/qnativesocketengine_p.h b/src/network/socket/qnativesocketengine_p.h
index 0fa1d8f96e..5cc5e529fc 100644
--- a/src/network/socket/qnativesocketengine_p.h
+++ b/src/network/socket/qnativesocketengine_p.h
@@ -45,6 +45,7 @@
// We mean it.
//
#include "QtNetwork/qhostaddress.h"
+#include "QtNetwork/qnetworkinterface.h"
#include "private/qabstractsocketengine_p.h"
#ifndef Q_OS_WIN
# include "qplatformdefs.h"
@@ -264,7 +265,8 @@ public:
bool checkProxy(const QHostAddress &address);
bool fetchConnectionParameters();
- static uint scopeIdFromString(const QString &scopeid);
+ static uint scopeIdFromString(const QString &scopeid)
+ { return QNetworkInterface::interfaceIndexFromName(scopeid); }
/*! \internal
Sets \a address and \a port in the \a aa sockaddr structure and the size in \a sockAddrSize.
diff --git a/src/network/socket/qnativesocketengine_unix.cpp b/src/network/socket/qnativesocketengine_unix.cpp
index f1845f31f3..cba1ac52be 100644
--- a/src/network/socket/qnativesocketengine_unix.cpp
+++ b/src/network/socket/qnativesocketengine_unix.cpp
@@ -107,15 +107,8 @@ static inline void qt_socket_getPortAndAddress(const qt_sockaddr *s, quint16 *po
QHostAddress tmpAddress;
tmpAddress.setAddress(tmp);
*addr = tmpAddress;
- if (s->a6.sin6_scope_id) {
-#ifndef QT_NO_IPV6IFNAME
- char scopeid[IFNAMSIZ];
- if (::if_indextoname(s->a6.sin6_scope_id, scopeid)) {
- addr->setScopeId(QLatin1String(scopeid));
- } else
-#endif
- addr->setScopeId(QString::number(s->a6.sin6_scope_id));
- }
+ if (s->a6.sin6_scope_id)
+ addr->setScopeId(QNetworkInterface::interfaceNameFromIndex(s->a6.sin6_scope_id));
}
if (port)
*port = ntohs(s->a6.sin6_port);
@@ -131,21 +124,6 @@ static inline void qt_socket_getPortAndAddress(const qt_sockaddr *s, quint16 *po
}
}
-// inline on purpose
-inline uint QNativeSocketEnginePrivate::scopeIdFromString(const QString &scopeid)
-{
- if (scopeid.isEmpty())
- return 0;
-
- bool ok;
- uint id = scopeid.toUInt(&ok);
-#ifndef QT_NO_IPV6IFNAME
- if (!ok)
- id = ::if_nametoindex(scopeid.toLatin1());
-#endif
- return id;
-}
-
static void convertToLevelAndOption(QNativeSocketEngine::SocketOption opt,
QAbstractSocket::NetworkLayerProtocol socketProtocol, int &level, int &n)
{
diff --git a/src/network/socket/qnativesocketengine_win.cpp b/src/network/socket/qnativesocketengine_win.cpp
index 9aed0caa25..a7fb5f5502 100644
--- a/src/network/socket/qnativesocketengine_win.cpp
+++ b/src/network/socket/qnativesocketengine_win.cpp
@@ -322,12 +322,6 @@ static inline int qt_socket_getMaxMsgSize(qintptr socketDescriptor)
# define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
#endif
-// inline on purpose
-inline uint QNativeSocketEnginePrivate::scopeIdFromString(const QString &scopeid)
-{
- return scopeid.toUInt();
-}
-
bool QNativeSocketEnginePrivate::createNewSocket(QAbstractSocket::SocketType socketType, QAbstractSocket::NetworkLayerProtocol &socketProtocol)
{
diff --git a/src/network/ssl/qsslsocket_mac.cpp b/src/network/ssl/qsslsocket_mac.cpp
index 06c707f271..a8f7b7320e 100644
--- a/src/network/ssl/qsslsocket_mac.cpp
+++ b/src/network/ssl/qsslsocket_mac.cpp
@@ -589,6 +589,9 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
case TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384:
ciph.d->name = QLatin1String("ECDHE-RSA-AES256-SHA384");
break;
+ case TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:
+ ciph.d->name = QLatin1String("ECDHE-RSA-AES256-GCM-SHA384");
+ break;
default:
return ciph;
}
@@ -636,6 +639,10 @@ QSslCipher QSslSocketBackendPrivate::QSslCipher_from_SSLCipherSuite(SSLCipherSui
ciph.d->encryptionMethod = QLatin1String("AES(128)");
ciph.d->bits = 128;
ciph.d->supportedBits = 128;
+ } else if (ciph.d->name.contains("AES256-GCM")) {
+ ciph.d->encryptionMethod = QLatin1String("AESGCM(256)");
+ ciph.d->bits = 256;
+ ciph.d->supportedBits = 256;
} else if (ciph.d->name.contains("AES256-")) {
ciph.d->encryptionMethod = QLatin1String("AES(256)");
ciph.d->bits = 256;
diff --git a/src/platformsupport/cglconvenience/cglconvenience.mm b/src/platformsupport/cglconvenience/cglconvenience.mm
index 6b0a91e13f..b20f324442 100644
--- a/src/platformsupport/cglconvenience/cglconvenience.mm
+++ b/src/platformsupport/cglconvenience/cglconvenience.mm
@@ -34,7 +34,7 @@
#include "cglconvenience_p.h"
#include <QtCore/qglobal.h>
#include <QtCore/private/qcore_mac_p.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QVector>
void (*qcgl_getProcAddress(const QByteArray &procName))()
diff --git a/src/platformsupport/cglconvenience/cglconvenience.pri b/src/platformsupport/cglconvenience/cglconvenience.pri
index 0e86ddb208..1de38bbd08 100644
--- a/src/platformsupport/cglconvenience/cglconvenience.pri
+++ b/src/platformsupport/cglconvenience/cglconvenience.pri
@@ -1,4 +1,4 @@
-mac:!ios {
+osx {
INCLUDEPATH += $$PWD
HEADERS += \
@@ -7,5 +7,5 @@ mac:!ios {
OBJECTIVE_SOURCES += \
$$PWD/cglconvenience.mm
- LIBS_PRIVATE += -framework Cocoa -framework OpenGL
+ LIBS_PRIVATE += -framework AppKit -framework OpenGL
}
diff --git a/src/platformsupport/clipboard/qmacmime.mm b/src/platformsupport/clipboard/qmacmime.mm
index ffa548bf83..5fec32c650 100644
--- a/src/platformsupport/clipboard/qmacmime.mm
+++ b/src/platformsupport/clipboard/qmacmime.mm
@@ -32,10 +32,13 @@
****************************************************************************/
#include <QtCore/qsystemdetection.h>
+
+#if defined(Q_OS_OSX)
+#import <AppKit/AppKit.h>
+#endif
+
#if defined(Q_OS_IOS)
#import <UIKit/UIKit.h>
-#elif defined(Q_OS_OSX)
-#import <Cocoa/Cocoa.h>
#endif
#include "qmacmime_p.h"
diff --git a/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp b/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp
index 3aab785b34..de2f3415af 100644
--- a/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp
+++ b/src/platformsupport/devicediscovery/qdevicediscovery_static.cpp
@@ -56,6 +56,12 @@
#ifndef ABS_CNT
#define ABS_CNT (ABS_MAX+1)
#endif
+#ifndef ABS_MT_POSITION_X
+#define ABS_MT_POSITION_X 0x35
+#endif
+#ifndef ABS_MT_POSITION_Y
+#define ABS_MT_POSITION_Y 0x36
+#endif
#define LONG_BITS (sizeof(long) * 8 )
#define LONG_FIELD_SIZE(bits) ((bits / LONG_BITS) + 1)
@@ -113,67 +119,71 @@ QStringList QDeviceDiscoveryStatic::scanConnectedDevices()
bool QDeviceDiscoveryStatic::checkDeviceType(const QString &device)
{
- bool ret = false;
int fd = QT_OPEN(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
if (!fd) {
qWarning() << "Device discovery cannot open device" << device;
return false;
}
+ qCDebug(lcDD) << "doing static device discovery for " << device;
+
+ if ((m_types & Device_DRM) && device.contains(QString::fromLatin1(QT_DRM_DEVICE_PREFIX)))
+ return true;
+
+ long bitsAbs[LONG_FIELD_SIZE(ABS_CNT)];
long bitsKey[LONG_FIELD_SIZE(KEY_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(bitsKey)), bitsKey) >= 0 ) {
- if (!ret && (m_types & Device_Keyboard)) {
- if (testBit(KEY_Q, bitsKey)) {
- qCDebug(lcDD) << "Found keyboard at" << device;
- ret = true;
- }
- }
+ long bitsRel[LONG_FIELD_SIZE(REL_CNT)];
+ memset(bitsAbs, 0, sizeof(bitsAbs));
+ memset(bitsKey, 0, sizeof(bitsKey));
+ memset(bitsRel, 0, sizeof(bitsRel));
- if (!ret && (m_types & Device_Mouse)) {
- long bitsRel[LONG_FIELD_SIZE(REL_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(bitsRel)), bitsRel) >= 0 ) {
- if (testBit(REL_X, bitsRel) && testBit(REL_Y, bitsRel) && testBit(BTN_MOUSE, bitsKey)) {
- qCDebug(lcDD) << "Found mouse at" << device;
- ret = true;
- }
- }
+ ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitsAbs)), bitsAbs);
+ ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(bitsKey)), bitsKey);
+ ioctl(fd, EVIOCGBIT(EV_REL, sizeof(bitsRel)), bitsRel);
+
+ QT_CLOSE(fd);
+
+ if ((m_types & Device_Keyboard)) {
+ if (testBit(KEY_Q, bitsKey)) {
+ qCDebug(lcDD) << "Found keyboard at" << device;
+ return true;
}
+ }
- if (!ret && (m_types & (Device_Touchpad | Device_Touchscreen))) {
- long bitsAbs[LONG_FIELD_SIZE(ABS_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitsAbs)), bitsAbs) >= 0 ) {
- if (testBit(ABS_X, bitsAbs) && testBit(ABS_Y, bitsAbs)) {
- if ((m_types & Device_Touchpad) && testBit(BTN_TOOL_FINGER, bitsKey)) {
- qCDebug(lcDD) << "Found touchpad at" << device;
- ret = true;
- } else if ((m_types & Device_Touchscreen) && testBit(BTN_TOUCH, bitsKey)) {
- qCDebug(lcDD) << "Found touchscreen at" << device;
- ret = true;
- } else if ((m_types & Device_Tablet) && (testBit(BTN_STYLUS, bitsKey) || testBit(BTN_TOOL_PEN, bitsKey))) {
- qCDebug(lcDD) << "Found tablet at" << device;
- ret = true;
- }
- }
- }
+ if ((m_types & Device_Mouse)) {
+ if (testBit(REL_X, bitsRel) && testBit(REL_Y, bitsRel) && testBit(BTN_MOUSE, bitsKey)) {
+ qCDebug(lcDD) << "Found mouse at" << device;
+ return true;
}
+ }
- if (!ret && (m_types & Device_Joystick)) {
- long bitsAbs[LONG_FIELD_SIZE(ABS_CNT)];
- if (ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(bitsAbs)), bitsAbs) >= 0 ) {
- if ((m_types & Device_Joystick)
- && (testBit(BTN_A, bitsKey) || testBit(BTN_TRIGGER, bitsKey) || testBit(ABS_RX, bitsAbs))) {
- qCDebug(lcDD) << "Found joystick/gamepad at" << device;
- ret = true;
- }
+ if ((m_types & (Device_Touchpad | Device_Touchscreen))) {
+ if (testBit(ABS_X, bitsAbs) && testBit(ABS_Y, bitsAbs)) {
+ if ((m_types & Device_Touchpad) && testBit(BTN_TOOL_FINGER, bitsKey)) {
+ qCDebug(lcDD) << "Found touchpad at" << device;
+ return true;
+ } else if ((m_types & Device_Touchscreen) && testBit(BTN_TOUCH, bitsKey)) {
+ qCDebug(lcDD) << "Found touchscreen at" << device;
+ return true;
+ } else if ((m_types & Device_Tablet) && (testBit(BTN_STYLUS, bitsKey) || testBit(BTN_TOOL_PEN, bitsKey))) {
+ qCDebug(lcDD) << "Found tablet at" << device;
+ return true;
}
+ } else if (testBit(ABS_MT_POSITION_X, bitsAbs) &&
+ testBit(ABS_MT_POSITION_Y, bitsAbs)) {
+ qCDebug(lcDD) << "Found new-style touchscreen at" << device;
+ return true;
}
}
- if (!ret && (m_types & Device_DRM) && device.contains(QString::fromLatin1(QT_DRM_DEVICE_PREFIX)))
- ret = true;
+ if ((m_types & Device_Joystick)) {
+ if (testBit(BTN_A, bitsKey) || testBit(BTN_TRIGGER, bitsKey) || testBit(ABS_RX, bitsAbs)) {
+ qCDebug(lcDD) << "Found joystick/gamepad at" << device;
+ return true;
+ }
+ }
- QT_CLOSE(fd);
- return ret;
+ return false;
}
QT_END_NAMESPACE
diff --git a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp
index f285e61a9f..334eb51a86 100644
--- a/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp
+++ b/src/platformsupport/devicediscovery/qdevicediscovery_udev.cpp
@@ -185,11 +185,11 @@ void QDeviceDiscoveryUDev::handleUDevNotification()
// if we cannot determine a type, walk up the device tree
if (!checkDeviceType(dev)) {
// does not increase the refcount
- dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);
- if (!dev)
+ struct udev_device *parent_dev = udev_device_get_parent_with_subsystem_devtype(dev, subsystem, 0);
+ if (!parent_dev)
goto cleanup;
- if (!checkDeviceType(dev))
+ if (!checkDeviceType(parent_dev))
goto cleanup;
}
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
index 022bc8bec2..8e7a393613 100644
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
@@ -36,6 +36,7 @@
#include <QtCore/QList>
#include <QtCore/QElapsedTimer>
+#include <QtCore/QFile>
#include <qpa/qplatformnativeinterface.h>
#include <qpa/qplatformscreen.h>
diff --git a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
index 0af779097c..a87443cc85 100644
--- a/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
+++ b/src/platformsupport/fontdatabases/mac/qcoretextfontdatabase.mm
@@ -35,8 +35,8 @@
#include <sys/param.h>
-#if defined(Q_OS_MACX)
-#import <Cocoa/Cocoa.h>
+#if defined(Q_OS_OSX)
+#import <AppKit/AppKit.h>
#import <IOKit/graphics/IOGraphicsLib.h>
#elif defined(Q_OS_IOS)
#import <UIKit/UIFont.h>
diff --git a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp
index 06751de0ef..d467a62abd 100644
--- a/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp
+++ b/src/platformsupport/input/evdevkeyboard/qevdevkeyboardhandler.cpp
@@ -35,6 +35,7 @@
#include <qplatformdefs.h>
+#include <QFile>
#include <QSocketNotifier>
#include <QStringList>
#include <QCoreApplication>
diff --git a/src/platformsupport/input/evdevtablet/evdevtablet.pri b/src/platformsupport/input/evdevtablet/evdevtablet.pri
index 5ace0df61d..fb9489353c 100644
--- a/src/platformsupport/input/evdevtablet/evdevtablet.pri
+++ b/src/platformsupport/input/evdevtablet/evdevtablet.pri
@@ -1,8 +1,10 @@
HEADERS += \
- $$PWD/qevdevtablet_p.h
+ $$PWD/qevdevtablethandler_p.h \
+ $$PWD/qevdevtabletmanager_p.h
SOURCES += \
- $$PWD/qevdevtablet.cpp
+ $$PWD/qevdevtablethandler.cpp \
+ $$PWD/qevdevtabletmanager.cpp
contains(QT_CONFIG, libudev) {
LIBS_PRIVATE += $$QMAKE_LIBS_LIBUDEV
diff --git a/src/platformsupport/input/evdevtablet/qevdevtablet.cpp b/src/platformsupport/input/evdevtablet/qevdevtablethandler.cpp
index c6f952c64d..aa87340112 100644
--- a/src/platformsupport/input/evdevtablet/qevdevtablet.cpp
+++ b/src/platformsupport/input/evdevtablet/qevdevtablethandler.cpp
@@ -31,14 +31,14 @@
**
****************************************************************************/
-#include "qevdevtablet_p.h"
-#include <qpa/qwindowsysteminterface.h>
+#include "qevdevtablethandler_p.h"
+
#include <QStringList>
#include <QSocketNotifier>
#include <QGuiApplication>
#include <QLoggingCategory>
#include <QtCore/private/qcore_unix_p.h>
-#include <QtPlatformSupport/private/qdevicediscovery_p.h>
+#include <qpa/qwindowsysteminterface.h>
#include <linux/input.h>
QT_BEGIN_NAMESPACE
@@ -49,16 +49,11 @@ class QEvdevTabletData
{
public:
QEvdevTabletData(QEvdevTabletHandler *q_ptr);
- bool queryLimits();
- void testGrab();
+
void processInputEvent(input_event *ev);
- void reportProximityEnter();
- void reportProximityLeave();
void report();
QEvdevTabletHandler *q;
- QSocketNotifier *notifier;
- int fd;
int lastEventType;
QString devName;
struct {
@@ -73,57 +68,13 @@ public:
};
QEvdevTabletData::QEvdevTabletData(QEvdevTabletHandler *q_ptr)
- : q(q_ptr), notifier(0), fd(-1), lastEventType(0)
+ : q(q_ptr), lastEventType(0)
{
memset(&minValues, 0, sizeof(minValues));
memset(&maxValues, 0, sizeof(maxValues));
memset(&state, 0, sizeof(state));
}
-bool QEvdevTabletData::queryLimits()
-{
- bool ok = true;
- input_absinfo absInfo;
- memset(&absInfo, 0, sizeof(input_absinfo));
- ok &= ioctl(fd, EVIOCGABS(ABS_X), &absInfo) >= 0;
- if (ok) {
- minValues.x = absInfo.minimum;
- maxValues.x = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min X: %d max X: %d", minValues.x, maxValues.x);
- }
- ok &= ioctl(fd, EVIOCGABS(ABS_Y), &absInfo) >= 0;
- if (ok) {
- minValues.y = absInfo.minimum;
- maxValues.y = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min Y: %d max Y: %d", minValues.y, maxValues.y);
- }
- if (ioctl(fd, EVIOCGABS(ABS_PRESSURE), &absInfo) >= 0) {
- minValues.p = absInfo.minimum;
- maxValues.p = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min pressure: %d max pressure: %d", minValues.p, maxValues.p);
- }
- if (ioctl(fd, EVIOCGABS(ABS_DISTANCE), &absInfo) >= 0) {
- minValues.d = absInfo.minimum;
- maxValues.d = absInfo.maximum;
- qCDebug(qLcEvdevTablet, "evdevtablet: min distance: %d max distance: %d", minValues.d, maxValues.d);
- }
- char name[128];
- if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), name) >= 0) {
- devName = QString::fromLocal8Bit(name);
- qCDebug(qLcEvdevTablet, "evdevtablet: device name: %s", name);
- }
- return ok;
-}
-
-void QEvdevTabletData::testGrab()
-{
- bool grabSuccess = !ioctl(fd, EVIOCGRAB, (void *) 1);
- if (grabSuccess)
- ioctl(fd, EVIOCGRAB, (void *) 0);
- else
- qWarning("evdevtablet: ERROR: The device is grabbed by another process. No events will be read.");
-}
-
void QEvdevTabletData::processInputEvent(input_event *ev)
{
if (ev->type == EV_ABS) {
@@ -167,20 +118,10 @@ void QEvdevTabletData::processInputEvent(input_event *ev)
lastEventType = ev->type;
}
-void QEvdevTabletData::reportProximityEnter()
-{
- QWindowSystemInterface::handleTabletEnterProximityEvent(QTabletEvent::Stylus, state.tool, 1);
-}
-
-void QEvdevTabletData::reportProximityLeave()
-{
- QWindowSystemInterface::handleTabletLeaveProximityEvent(QTabletEvent::Stylus, state.tool, 1);
-}
-
void QEvdevTabletData::report()
{
if (!state.lastReportTool && state.tool)
- reportProximityEnter();
+ QWindowSystemInterface::handleTabletEnterProximityEvent(QTabletEvent::Stylus, state.tool, q->deviceId());
qreal nx = (state.x - minValues.x) / qreal(maxValues.x - minValues.x);
qreal ny = (state.y - minValues.y) / qreal(maxValues.y - minValues.y);
@@ -194,16 +135,17 @@ void QEvdevTabletData::report()
pointer = state.lastReportTool;
}
- qreal pressure = (state.p - minValues.p) / qreal(maxValues.p - minValues.p);
+ int pressureRange = maxValues.p - minValues.p;
+ qreal pressure = pressureRange ? (state.p - minValues.p) / qreal(pressureRange) : qreal(1);
if (state.down || state.lastReportDown) {
QWindowSystemInterface::handleTabletEvent(0, state.down, QPointF(), globalPos,
QTabletEvent::Stylus, pointer,
- pressure, 0, 0, 0, 0, 0, 1, qGuiApp->keyboardModifiers());
+ pressure, 0, 0, 0, 0, 0, q->deviceId(), qGuiApp->keyboardModifiers());
}
if (state.lastReportTool && !state.tool)
- reportProximityLeave();
+ QWindowSystemInterface::handleTabletLeaveProximityEvent(QTabletEvent::Stylus, state.tool, q->deviceId());
state.lastReportDown = state.down;
state.lastReportTool = state.tool;
@@ -211,69 +153,104 @@ void QEvdevTabletData::report()
}
-QEvdevTabletHandler::QEvdevTabletHandler(const QString &spec, QObject *parent)
- : QObject(parent), d(0)
+QEvdevTabletHandler::QEvdevTabletHandler(const QString &device, const QString &spec, QObject *parent)
+ : QObject(parent), m_fd(-1), m_device(device), m_notifier(0), d(0)
{
+ Q_UNUSED(spec)
+
setObjectName(QLatin1String("Evdev Tablet Handler"));
- d = new QEvdevTabletData(this);
- QString dev;
- QStringList args = spec.split(QLatin1Char(':'));
- for (int i = 0; i < args.count(); ++i) {
- if (args.at(i).startsWith(QLatin1String("/dev/"))) {
- dev = args.at(i);
- break;
- }
- }
- if (dev.isEmpty()) {
- QScopedPointer<QDeviceDiscovery> deviceDiscovery(
- QDeviceDiscovery::create(QDeviceDiscovery::Device_Tablet, this));
- if (deviceDiscovery) {
- QStringList devices = deviceDiscovery->scanConnectedDevices();
- if (!devices.isEmpty())
- dev = devices.at(0);
- }
- }
- if (!dev.isEmpty()) {
- qCDebug(qLcEvdevTablet, "evdevtablet: using %s", qPrintable(dev));
- d->fd = QT_OPEN(dev.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
- if (d->fd >= 0) {
- d->testGrab();
- if (d->queryLimits()) {
- d->notifier = new QSocketNotifier(d->fd, QSocketNotifier::Read, this);
- connect(d->notifier, SIGNAL(activated(int)), this, SLOT(readData()));
- }
- } else {
- qErrnoWarning(errno, "evdevtablet: Cannot open input device");
- }
+
+ qCDebug(qLcEvdevTablet, "evdevtablet: using %s", qPrintable(device));
+
+ m_fd = QT_OPEN(device.toLocal8Bit().constData(), O_RDONLY | O_NDELAY, 0);
+ if (m_fd < 0) {
+ qErrnoWarning(errno, "evdevtablet: Cannot open input device %s", qPrintable(device));
+ return;
}
+
+ bool grabSuccess = !ioctl(m_fd, EVIOCGRAB, (void *) 1);
+ if (grabSuccess)
+ ioctl(m_fd, EVIOCGRAB, (void *) 0);
+ else
+ qWarning("evdevtablet: %s: The device is grabbed by another process. No events will be read.", qPrintable(device));
+
+ d = new QEvdevTabletData(this);
+ if (!queryLimits())
+ qWarning("evdevtablet: %s: Unset or invalid ABS limits. Behavior will be unspecified.", qPrintable(device));
+
+ m_notifier = new QSocketNotifier(m_fd, QSocketNotifier::Read, this);
+ connect(m_notifier, &QSocketNotifier::activated, this, &QEvdevTabletHandler::readData);
}
QEvdevTabletHandler::~QEvdevTabletHandler()
{
- delete d->notifier;
- if (d->fd >= 0)
- QT_CLOSE(d->fd);
+ if (m_fd >= 0)
+ QT_CLOSE(m_fd);
delete d;
}
+qint64 QEvdevTabletHandler::deviceId() const
+{
+ return m_fd;
+}
+
+bool QEvdevTabletHandler::queryLimits()
+{
+ bool ok = true;
+ input_absinfo absInfo;
+ memset(&absInfo, 0, sizeof(input_absinfo));
+ ok &= ioctl(m_fd, EVIOCGABS(ABS_X), &absInfo) >= 0;
+ if (ok) {
+ d->minValues.x = absInfo.minimum;
+ d->maxValues.x = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min X: %d max X: %d", qPrintable(m_device),
+ d->minValues.x, d->maxValues.x);
+ }
+ ok &= ioctl(m_fd, EVIOCGABS(ABS_Y), &absInfo) >= 0;
+ if (ok) {
+ d->minValues.y = absInfo.minimum;
+ d->maxValues.y = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min Y: %d max Y: %d", qPrintable(m_device),
+ d->minValues.y, d->maxValues.y);
+ }
+ if (ioctl(m_fd, EVIOCGABS(ABS_PRESSURE), &absInfo) >= 0) {
+ d->minValues.p = absInfo.minimum;
+ d->maxValues.p = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min pressure: %d max pressure: %d", qPrintable(m_device),
+ d->minValues.p, d->maxValues.p);
+ }
+ if (ioctl(m_fd, EVIOCGABS(ABS_DISTANCE), &absInfo) >= 0) {
+ d->minValues.d = absInfo.minimum;
+ d->maxValues.d = absInfo.maximum;
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: min distance: %d max distance: %d", qPrintable(m_device),
+ d->minValues.d, d->maxValues.d);
+ }
+ char name[128];
+ if (ioctl(m_fd, EVIOCGNAME(sizeof(name) - 1), name) >= 0) {
+ d->devName = QString::fromLocal8Bit(name);
+ qCDebug(qLcEvdevTablet, "evdevtablet: %s: device name: %s", qPrintable(m_device), name);
+ }
+ return ok;
+}
+
void QEvdevTabletHandler::readData()
{
static input_event buffer[32];
int n = 0;
for (; ;) {
- int result = QT_READ(d->fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
+ int result = QT_READ(m_fd, reinterpret_cast<char*>(buffer) + n, sizeof(buffer) - n);
if (!result) {
- qWarning("evdevtablet: Got EOF from input device");
+ qWarning("evdevtablet: %s: Got EOF from input device", qPrintable(m_device));
return;
} else if (result < 0) {
if (errno != EINTR && errno != EAGAIN) {
- qErrnoWarning(errno, "evdevtablet: Could not read from input device");
+ qErrnoWarning(errno, "evdevtablet: %s: Could not read from input device", qPrintable(m_device));
if (errno == ENODEV) { // device got disconnected -> stop reading
- delete d->notifier;
- d->notifier = 0;
- QT_CLOSE(d->fd);
- d->fd = -1;
+ delete m_notifier;
+ m_notifier = 0;
+ QT_CLOSE(m_fd);
+ m_fd = -1;
}
return;
}
@@ -291,8 +268,8 @@ void QEvdevTabletHandler::readData()
}
-QEvdevTabletHandlerThread::QEvdevTabletHandlerThread(const QString &spec, QObject *parent)
- : QDaemonThread(parent), m_spec(spec), m_handler(0)
+QEvdevTabletHandlerThread::QEvdevTabletHandlerThread(const QString &device, const QString &spec, QObject *parent)
+ : QDaemonThread(parent), m_device(device), m_spec(spec), m_handler(0)
{
start();
}
@@ -305,7 +282,7 @@ QEvdevTabletHandlerThread::~QEvdevTabletHandlerThread()
void QEvdevTabletHandlerThread::run()
{
- m_handler = new QEvdevTabletHandler(m_spec);
+ m_handler = new QEvdevTabletHandler(m_device, m_spec);
exec();
delete m_handler;
m_handler = 0;
diff --git a/src/platformsupport/input/evdevtablet/qevdevtablet_p.h b/src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h
index f546f9a88a..4a9b2bab34 100644
--- a/src/platformsupport/input/evdevtablet/qevdevtablet_p.h
+++ b/src/platformsupport/input/evdevtablet/qevdevtablethandler_p.h
@@ -31,8 +31,8 @@
**
****************************************************************************/
-#ifndef QEVDEVTABLET_P_H
-#define QEVDEVTABLET_P_H
+#ifndef QEVDEVTABLETHANDLER_P_H
+#define QEVDEVTABLETHANDLER_P_H
//
// W A R N I N G
@@ -52,6 +52,7 @@
QT_BEGIN_NAMESPACE
+class QSocketNotifier;
class QEvdevTabletData;
class QEvdevTabletHandler : public QObject
@@ -59,29 +60,37 @@ class QEvdevTabletHandler : public QObject
Q_OBJECT
public:
- explicit QEvdevTabletHandler(const QString &spec = QString(), QObject *parent = 0);
+ explicit QEvdevTabletHandler(const QString &device, const QString &spec = QString(), QObject *parent = 0);
~QEvdevTabletHandler();
+ qint64 deviceId() const;
+
private slots:
void readData();
private:
+ bool queryLimits();
+
+ int m_fd;
+ QString m_device;
+ QSocketNotifier *m_notifier;
QEvdevTabletData *d;
};
class QEvdevTabletHandlerThread : public QDaemonThread
{
public:
- explicit QEvdevTabletHandlerThread(const QString &spec, QObject *parent = 0);
+ explicit QEvdevTabletHandlerThread(const QString &device, const QString &spec, QObject *parent = 0);
~QEvdevTabletHandlerThread();
void run() Q_DECL_OVERRIDE;
QEvdevTabletHandler *handler() { return m_handler; }
private:
+ QString m_device;
QString m_spec;
QEvdevTabletHandler *m_handler;
};
QT_END_NAMESPACE
-#endif // QEVDEVTABLET_P_H
+#endif // QEVDEVTABLETHANDLER_P_H
diff --git a/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp b/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp
new file mode 100644
index 0000000000..05fd6e655c
--- /dev/null
+++ b/src/platformsupport/input/evdevtablet/qevdevtabletmanager.cpp
@@ -0,0 +1,122 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the plugins module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qevdevtabletmanager_p.h"
+#include "qevdevtablethandler_p.h"
+
+#include <QStringList>
+#include <QGuiApplication>
+#include <QLoggingCategory>
+#include <QtPlatformSupport/private/qdevicediscovery_p.h>
+#include <private/qguiapplication_p.h>
+#include <private/qinputdevicemanager_p_p.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_DECLARE_LOGGING_CATEGORY(qLcEvdevTablet)
+
+QEvdevTabletManager::QEvdevTabletManager(const QString &key, const QString &specification, QObject *parent)
+ : QObject(parent)
+{
+ Q_UNUSED(key);
+
+ if (qEnvironmentVariableIsSet("QT_QPA_EVDEV_DEBUG"))
+ const_cast<QLoggingCategory &>(qLcEvdevTablet()).setEnabled(QtDebugMsg, true);
+
+ QString spec = QString::fromLocal8Bit(qgetenv("QT_QPA_EVDEV_TABLET_PARAMETERS"));
+
+ if (spec.isEmpty())
+ spec = specification;
+
+ QStringList args = spec.split(QLatin1Char(':'));
+ QStringList devices;
+
+ foreach (const QString &arg, args) {
+ if (arg.startsWith(QLatin1String("/dev/"))) {
+ devices.append(arg);
+ args.removeAll(arg);
+ }
+ }
+
+ // build new specification without /dev/ elements
+ m_spec = args.join(QLatin1Char(':'));
+
+ foreach (const QString &device, devices)
+ addDevice(device);
+
+ // when no devices specified, use device discovery to scan and monitor
+ if (devices.isEmpty()) {
+ qCDebug(qLcEvdevTablet) << "evdevtablet: Using device discovery";
+ m_deviceDiscovery = QDeviceDiscovery::create(QDeviceDiscovery::Device_Tablet, this);
+ if (m_deviceDiscovery) {
+ QStringList devices = m_deviceDiscovery->scanConnectedDevices();
+ foreach (const QString &device, devices)
+ addDevice(device);
+ connect(m_deviceDiscovery, SIGNAL(deviceDetected(QString)), this, SLOT(addDevice(QString)));
+ connect(m_deviceDiscovery, SIGNAL(deviceRemoved(QString)), this, SLOT(removeDevice(QString)));
+ }
+ }
+}
+
+QEvdevTabletManager::~QEvdevTabletManager()
+{
+ qDeleteAll(m_activeDevices);
+}
+
+void QEvdevTabletManager::addDevice(const QString &deviceNode)
+{
+ qCDebug(qLcEvdevTablet) << "Adding device at" << deviceNode;
+ QEvdevTabletHandlerThread *handler;
+ handler = new QEvdevTabletHandlerThread(deviceNode, m_spec);
+ if (handler) {
+ m_activeDevices.insert(deviceNode, handler);
+ QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount(
+ QInputDeviceManager::DeviceTypeTablet, m_activeDevices.count());
+ } else {
+ qWarning("evdevtablet: Failed to open tablet device %s", qPrintable(deviceNode));
+ }
+}
+
+void QEvdevTabletManager::removeDevice(const QString &deviceNode)
+{
+ if (m_activeDevices.contains(deviceNode)) {
+ qCDebug(qLcEvdevTablet) << "Removing device at" << deviceNode;
+ QEvdevTabletHandlerThread *handler = m_activeDevices.value(deviceNode);
+ m_activeDevices.remove(deviceNode);
+ QInputDeviceManagerPrivate::get(QGuiApplicationPrivate::inputDeviceManager())->setDeviceCount(
+ QInputDeviceManager::DeviceTypeTablet, m_activeDevices.count());
+ delete handler;
+ }
+}
+
+QT_END_NAMESPACE
diff --git a/src/widgets/styles/qgtkglobal_p.h b/src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h
index 7d729d7fc0..893ff03fa7 100644
--- a/src/widgets/styles/qgtkglobal_p.h
+++ b/src/platformsupport/input/evdevtablet/qevdevtabletmanager_p.h
@@ -3,7 +3,7 @@
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
-** This file is part of the QtWidgets module of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL21$
** Commercial License Usage
@@ -31,8 +31,8 @@
**
****************************************************************************/
-#ifndef QGTKGLOBAL_P_H
-#define QGTKGLOBAL_P_H
+#ifndef QEVDEVTABLETMANAGER_P_H
+#define QEVDEVTABLETMANAGER_P_H
//
// W A R N I N G
@@ -45,38 +45,32 @@
// We mean it.
//
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
+#include <QObject>
+#include <QHash>
+#include <QSocketNotifier>
-#undef signals // Collides with GTK symbols
-#include <gtk/gtk.h>
-
-typedef unsigned long XID;
+QT_BEGIN_NAMESPACE
-#undef GTK_OBJECT_FLAGS
-#define GTK_OBJECT_FLAGS(obj)(((GtkObject*)(obj))->flags)
+class QDeviceDiscovery;
+class QEvdevTabletHandlerThread;
-#define QLS(x) QLatin1String(x)
+class QEvdevTabletManager : public QObject
+{
+ Q_OBJECT
+public:
+ QEvdevTabletManager(const QString &key, const QString &spec, QObject *parent = 0);
+ ~QEvdevTabletManager();
-QT_BEGIN_NAMESPACE
+private slots:
+ void addDevice(const QString &deviceNode);
+ void removeDevice(const QString &deviceNode);
-#if Q_BYTE_ORDER == Q_BIG_ENDIAN
-# define QT_RED 3
-# define QT_GREEN 2
-# define QT_BLUE 1
-# define QT_ALPHA 0
-#else
-# define QT_RED 0
-# define QT_GREEN 1
-# define QT_BLUE 2
-# define QT_ALPHA 3
-#endif
-# define GTK_RED 2
-# define GTK_GREEN 1
-# define GTK_BLUE 0
-# define GTK_ALPHA 3
+private:
+ QString m_spec;
+ QDeviceDiscovery *m_deviceDiscovery;
+ QHash<QString, QEvdevTabletHandlerThread *> m_activeDevices;
+};
QT_END_NAMESPACE
-#endif // !QT_NO_STYLE_GTK
-#endif // QGTKGLOBAL_P_H
+#endif // QEVDEVTABLETMANAGER_P_H
diff --git a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
index ad348cc083..dc40f728e1 100644
--- a/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
+++ b/src/platformsupport/input/evdevtouch/qevdevtouchhandler.cpp
@@ -36,6 +36,7 @@
#include <QHash>
#include <QSocketNotifier>
#include <QGuiApplication>
+#include <QTouchDevice>
#include <QLoggingCategory>
#include <QtCore/private/qcore_unix_p.h>
#include <QtGui/private/qhighdpiscaling_p.h>
diff --git a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
index a369747a64..26d815d7ff 100644
--- a/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
+++ b/src/platformsupport/themes/genericunix/qgenericunixthemes.cpp
@@ -615,7 +615,7 @@ QVariant QGnomeTheme::themeHint(QPlatformTheme::ThemeHint hint) const
return QVariant(QGenericUnixTheme::xdgIconThemePaths());
case QPlatformTheme::StyleNames: {
QStringList styleNames;
- styleNames << QStringLiteral("GTK+") << QStringLiteral("fusion") << QStringLiteral("windows");
+ styleNames << QStringLiteral("fusion") << QStringLiteral("windows");
return QVariant(styleNames);
}
case QPlatformTheme::KeyboardScheme:
diff --git a/src/plugins/generic/evdevtablet/main.cpp b/src/plugins/generic/evdevtablet/main.cpp
index 62524e8f33..3a9fd4f1dd 100644
--- a/src/plugins/generic/evdevtablet/main.cpp
+++ b/src/plugins/generic/evdevtablet/main.cpp
@@ -32,7 +32,7 @@
****************************************************************************/
#include <QtGui/qgenericplugin.h>
-#include <QtPlatformSupport/private/qevdevtablet_p.h>
+#include <QtPlatformSupport/private/qevdevtabletmanager_p.h>
QT_BEGIN_NAMESPACE
@@ -44,7 +44,6 @@ class QEvdevTabletPlugin : public QGenericPlugin
public:
QEvdevTabletPlugin();
- QStringList keys() const;
QObject* create(const QString &key, const QString &specification) Q_DECL_OVERRIDE;
};
@@ -52,16 +51,11 @@ QEvdevTabletPlugin::QEvdevTabletPlugin()
{
}
-QStringList QEvdevTabletPlugin::keys() const
-{
- return QStringList() << "EvdevTablet";
-}
-
-QObject *QEvdevTabletPlugin::create(const QString &key,
+QObject* QEvdevTabletPlugin::create(const QString &key,
const QString &spec)
{
if (!key.compare(QLatin1String("EvdevTablet"), Qt::CaseInsensitive))
- return new QEvdevTabletHandlerThread(spec);
+ return new QEvdevTabletManager(key, spec);
return 0;
}
diff --git a/src/plugins/generic/tuiotouch/qtuiohandler.cpp b/src/plugins/generic/tuiotouch/qtuiohandler.cpp
index 2b42889cb1..2598bc5caf 100644
--- a/src/plugins/generic/tuiotouch/qtuiohandler.cpp
+++ b/src/plugins/generic/tuiotouch/qtuiohandler.cpp
@@ -36,6 +36,7 @@
#include <QRect>
#include <QWindow>
#include <QGuiApplication>
+#include <QTouchDevice>
#include <qpa/qwindowsysteminterface.h>
diff --git a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
index a952123576..0148d36a6c 100644
--- a/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
+++ b/src/plugins/platforminputcontexts/ibus/qibusplatforminputcontext.cpp
@@ -397,6 +397,7 @@ void QIBusPlatformInputContext::filterEventFinished(QDBusPendingCallWatcher *cal
bool retval = reply.value();
qCDebug(qtQpaInputMethods) << "filterEventFinished return" << code << sym << state << retval;
if (!retval) {
+#ifndef QT_NO_CONTEXTMENU
if (type == QEvent::KeyPress && qtcode == Qt::Key_Menu
&& window != NULL) {
const QPoint globalPos = window->screen()->handle()->cursor()->pos();
@@ -404,6 +405,7 @@ void QIBusPlatformInputContext::filterEventFinished(QDBusPendingCallWatcher *cal
QWindowSystemInterface::handleContextMenuEvent(window, false, pos,
globalPos, modifiers);
}
+#endif // QT_NO_CONTEXTMENU
QWindowSystemInterface::handleExtendedKeyEvent(window, time, type, qtcode, modifiers,
code, sym, state, string, isAutoRepeat);
diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro
index ba0e6b001a..fec1da334f 100644
--- a/src/plugins/platforms/cocoa/cocoa.pro
+++ b/src/plugins/platforms/cocoa/cocoa.pro
@@ -84,7 +84,7 @@ contains(QT_CONFIG, opengl.*) {
RESOURCES += qcocoaresources.qrc
-LIBS += -framework Cocoa -framework Carbon -framework IOKit -lcups
+LIBS += -framework AppKit -framework Carbon -framework IOKit -lcups
QT += core-private gui-private platformsupport-private
diff --git a/src/plugins/platforms/cocoa/main.mm b/src/plugins/platforms/cocoa/main.mm
index 43ff715161..4ec2b4ffc4 100644
--- a/src/plugins/platforms/cocoa/main.mm
+++ b/src/plugins/platforms/cocoa/main.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <qpa/qplatformintegrationplugin.h>
#include <qpa/qplatformthemeplugin.h>
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibility.h b/src/plugins/platforms/cocoa/qcocoaaccessibility.h
index 228643ab26..2d1aa41a9a 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibility.h
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibility.h
@@ -33,7 +33,7 @@
#ifndef QCOCOAACCESIBILITY_H
#define QCOCOAACCESIBILITY_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtGui>
#include <qpa/qplatformaccessibility.h>
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm
index 4e901ba015..f83d15f48e 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibility.mm
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibility.mm
@@ -334,6 +334,7 @@ bool hasValueAttribute(QAccessibleInterface *interface)
Q_ASSERT(interface);
const QAccessible::Role qtrole = interface->role();
if (qtrole == QAccessible::EditableText
+ || qtrole == QAccessible::StaticText
|| interface->valueInterface()
|| interface->state().checkable) {
return true;
@@ -345,6 +346,9 @@ bool hasValueAttribute(QAccessibleInterface *interface)
id getValueAttribute(QAccessibleInterface *interface)
{
const QAccessible::Role qtrole = interface->role();
+ if (qtrole == QAccessible::StaticText) {
+ return QCFString::toNSString(interface->text(QAccessible::Name));
+ }
if (qtrole == QAccessible::EditableText) {
if (QAccessibleTextInterface *textInterface = interface->textInterface()) {
// VoiceOver will read out the entire text string at once when returning
diff --git a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
index b55393c7dc..5b2ee1c284 100644
--- a/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
+++ b/src/plugins/platforms/cocoa/qcocoaaccessibilityelement.mm
@@ -292,6 +292,8 @@ static void convertLineOffset(QAccessibleTextInterface *text, int &line, int &of
QSize qtSize = iface->rect().size();
return [NSValue valueWithSize: NSMakeSize(qtSize.width(), qtSize.height())];
} else if ([attribute isEqualToString:NSAccessibilityTitleAttribute]) {
+ if (iface->role() == QAccessible::StaticText)
+ return nil;
return QCFString::toNSString(iface->text(QAccessible::Name));
} else if ([attribute isEqualToString:NSAccessibilityDescriptionAttribute]) {
return QCFString::toNSString(iface->text(QAccessible::Description));
diff --git a/src/plugins/platforms/cocoa/qcocoaapplication.mm b/src/plugins/platforms/cocoa/qcocoaapplication.mm
index d9919f1120..7d0018a595 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplication.mm
+++ b/src/plugins/platforms/cocoa/qcocoaapplication.mm
@@ -181,7 +181,7 @@ QT_BEGIN_NAMESPACE
void qt_redirectNSApplicationSendEvent()
{
- if (QCoreApplication::testAttribute(Qt::AA_MacPluginApplication))
+ if (QCoreApplication::testAttribute(Qt::AA_PluginApplication))
// In a plugin we cannot chain sendEvent hooks: a second plugin could
// store the implementation of the first, which during the program flow
// can be unloaded.
@@ -207,7 +207,7 @@ void qt_redirectNSApplicationSendEvent()
void qt_resetNSApplicationSendEvent()
{
- if (QCoreApplication::testAttribute(Qt::AA_MacPluginApplication))
+ if (QCoreApplication::testAttribute(Qt::AA_PluginApplication))
return;
diff --git a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h
index abaaba91a5..a0eb8cc6fd 100644
--- a/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h
+++ b/src/plugins/platforms/cocoa/qcocoaapplicationdelegate.h
@@ -79,7 +79,7 @@
//
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <qglobal.h>
#include <private/qcore_mac_p.h>
diff --git a/src/plugins/platforms/cocoa/qcocoabackingstore.h b/src/plugins/platforms/cocoa/qcocoabackingstore.h
index 5a199de4a5..839b536863 100644
--- a/src/plugins/platforms/cocoa/qcocoabackingstore.h
+++ b/src/plugins/platforms/cocoa/qcocoabackingstore.h
@@ -34,7 +34,7 @@
#ifndef QBACKINGSTORE_COCOA_H
#define QBACKINGSTORE_COCOA_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoawindow.h"
#include "qnsview.h"
diff --git a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
index 8843e009a2..ddc2938855 100644
--- a/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoacolordialoghelper.mm
@@ -31,13 +31,13 @@
**
****************************************************************************/
-#include "qcocoacolordialoghelper.h"
-
#ifndef QT_NO_COLORDIALOG
#include <QtCore/qdebug.h>
#include <QtCore/qtimer.h>
+#include <qpa/qplatformtheme.h>
+#include "qcocoacolordialoghelper.h"
#include "qcocoahelpers.h"
#import <AppKit/AppKit.h>
@@ -52,7 +52,7 @@ static NSButton *macCreateButton(const char *text, NSView *superview)
[button setButtonType:NSMomentaryLightButton];
[button setBezelStyle:NSRoundedBezelStyle];
[button setTitle:(NSString*)(CFStringRef)QCFString(
- qt_mac_removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
+ QPlatformTheme::removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
[[button cell] setFont:[NSFont systemFontOfSize:
[NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
[superview addSubview:button];
diff --git a/src/plugins/platforms/cocoa/qcocoacursor.h b/src/plugins/platforms/cocoa/qcocoacursor.h
index d104939f0c..58be5414f1 100644
--- a/src/plugins/platforms/cocoa/qcocoacursor.h
+++ b/src/plugins/platforms/cocoa/qcocoacursor.h
@@ -34,7 +34,7 @@
#ifndef QWINDOWSCURSOR_H
#define QWINDOWSCURSOR_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtCore>
#include <qpa/qplatformcursor.h>
diff --git a/src/plugins/platforms/cocoa/qcocoadrag.h b/src/plugins/platforms/cocoa/qcocoadrag.h
index c1eeb34679..51de5dd5ed 100644
--- a/src/plugins/platforms/cocoa/qcocoadrag.h
+++ b/src/plugins/platforms/cocoa/qcocoadrag.h
@@ -34,7 +34,7 @@
#ifndef QCOCOADRAG_H
#define QCOCOADRAG_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtGui>
#include <qpa/qplatformdrag.h>
#include <private/qsimpledrag_p.h>
diff --git a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
index 1865624d57..117eba1b2a 100644
--- a/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
+++ b/src/plugins/platforms/cocoa/qcocoaeventdispatcher.mm
@@ -80,7 +80,7 @@
#include <qdebug.h>
#undef slots
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <Carbon/Carbon.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
index 9dc013ba4d..0bfb105a5d 100644
--- a/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafiledialoghelper.mm
@@ -31,6 +31,8 @@
**
****************************************************************************/
+#include <qpa/qplatformtheme.h>
+
#include "qcocoafiledialoghelper.h"
#ifndef QT_NO_FILEDIALOG
@@ -180,7 +182,7 @@ QT_NAMESPACE_ALIAS_OBJC_CLASS(QNSOpenSavePanelDelegate);
static QString strippedText(QString s)
{
s.remove( QString::fromLatin1("...") );
- return qt_mac_removeMnemonics(s).trimmed();
+ return QPlatformTheme::removeMnemonics(s).trimmed();
}
- (NSString *)strip:(const QString &)label
diff --git a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
index d1802fe4f9..c1c871f02b 100644
--- a/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
+++ b/src/plugins/platforms/cocoa/qcocoafontdialoghelper.mm
@@ -31,17 +31,17 @@
**
****************************************************************************/
-#include "qcocoafontdialoghelper.h"
-
#ifndef QT_NO_FONTDIALOG
#include <QtCore/qtimer.h>
#include <QtGui/qfontdatabase.h>
+#include <qpa/qplatformtheme.h>
#include <private/qfont_p.h>
#include <private/qfontengine_p.h>
#include <private/qfontengine_coretext_p.h>
+#include "qcocoafontdialoghelper.h"
#include "qcocoahelpers.h"
#import <AppKit/AppKit.h>
@@ -72,7 +72,7 @@ static NSButton *macCreateButton(const char *text, NSView *superview)
[button setButtonType:NSMomentaryLightButton];
[button setBezelStyle:NSRoundedBezelStyle];
[button setTitle:(NSString*)(CFStringRef)QCFString(
- qt_mac_removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
+ QPlatformTheme::removeMnemonics(QCoreApplication::translate("QDialogButtonBox", text)))];
[[button cell] setFont:[NSFont systemFontOfSize:
[NSFont systemFontSizeForControlSize:NSRegularControlSize]]];
[superview addSubview:button];
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.h b/src/plugins/platforms/cocoa/qcocoaglcontext.h
index fa6db018a7..cac53b14f9 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.h
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.h
@@ -40,7 +40,7 @@
#include <QtGui/QWindow>
#undef slots
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoaglcontext.mm b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
index 0f9b8b900d..d43c8e5ee9 100644
--- a/src/plugins/platforms/cocoa/qcocoaglcontext.mm
+++ b/src/plugins/platforms/cocoa/qcocoaglcontext.mm
@@ -39,7 +39,7 @@
#include <QtPlatformSupport/private/cglconvenience_p.h>
#include <QtPlatformHeaders/qcocoanativecontext.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.h b/src/plugins/platforms/cocoa/qcocoahelpers.h
index b86a17ca12..a75316acba 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.h
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.h
@@ -90,7 +90,6 @@ Qt::DropActions qt_mac_mapNSDragOperations(NSDragOperation nsActions);
// Misc
void qt_mac_transformProccessToForegroundApplication();
-QString qt_mac_removeMnemonics(const QString &original);
CGColorSpaceRef qt_mac_genericColorSpace();
CGColorSpaceRef qt_mac_displayColorSpace(const QWidget *widget);
CGColorSpaceRef qt_mac_colorSpaceForDeviceType(const QPaintDevice *paintDevice);
diff --git a/src/plugins/platforms/cocoa/qcocoahelpers.mm b/src/plugins/platforms/cocoa/qcocoahelpers.mm
index f51c21ee9b..61ececc93a 100644
--- a/src/plugins/platforms/cocoa/qcocoahelpers.mm
+++ b/src/plugins/platforms/cocoa/qcocoahelpers.mm
@@ -31,6 +31,8 @@
**
****************************************************************************/
+#include <qpa/qplatformtheme.h>
+
#include "qcocoahelpers.h"
@@ -485,42 +487,6 @@ void qt_mac_transformProccessToForegroundApplication()
}
}
}
-
-QString qt_mac_removeMnemonics(const QString &original)
-{
- QString returnText(original.size(), 0);
- int finalDest = 0;
- int currPos = 0;
- int l = original.length();
- while (l) {
- if (original.at(currPos) == QLatin1Char('&')
- && (l == 1 || original.at(currPos + 1) != QLatin1Char('&'))) {
- ++currPos;
- --l;
- if (l == 0)
- break;
- } else if (original.at(currPos) == QLatin1Char('(') && l >= 4 &&
- original.at(currPos + 1) == QLatin1Char('&') &&
- original.at(currPos + 2) != QLatin1Char('&') &&
- original.at(currPos + 3) == QLatin1Char(')')) {
- /* remove mnemonics its format is "\s*(&X)" */
- int n = 0;
- while (finalDest > n && returnText.at(finalDest - n - 1).isSpace())
- ++n;
- finalDest -= n;
- currPos += 4;
- l -= 4;
- continue;
- }
- returnText[finalDest] = original.at(currPos);
- ++currPos;
- ++finalDest;
- --l;
- }
- returnText.truncate(finalDest);
- return returnText;
-}
-
static CGColorSpaceRef m_genericColorSpace = 0;
static QHash<CGDirectDisplayID, CGColorSpaceRef> m_displayColorSpaceHash;
static bool m_postRoutineRegistered = false;
@@ -774,7 +740,7 @@ bool qt_mac_execute_apple_script(const QString &script, AEDesc *ret)
QString qt_mac_removeAmpersandEscapes(QString s)
{
- return qt_mac_removeMnemonics(s).trimmed();
+ return QPlatformTheme::removeMnemonics(s).trimmed();
}
/*! \internal
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.h b/src/plugins/platforms/cocoa/qcocoaintegration.h
index e7e21c356a..c7875af83e 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.h
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.h
@@ -34,7 +34,7 @@
#ifndef QPLATFORMINTEGRATION_COCOA_H
#define QPLATFORMINTEGRATION_COCOA_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoacursor.h"
#include "qcocoawindow.h"
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index 6bec6b191d..e469ec5c74 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -317,7 +317,7 @@ QCocoaIntegration::QCocoaIntegration(const QStringList &paramList)
// ### For AA_MacPluginApplication we don't want to load the menu nib.
// Qt 4 also does not set the application delegate, so that behavior
// is matched here.
- if (!QCoreApplication::testAttribute(Qt::AA_MacPluginApplication)) {
+ if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
// Set app delegate, link to the current delegate (if any)
QCocoaApplicationDelegate *newDelegate = [QCocoaApplicationDelegate sharedDelegate];
@@ -344,7 +344,7 @@ QCocoaIntegration::~QCocoaIntegration()
qt_resetNSApplicationSendEvent();
QMacAutoReleasePool pool;
- if (!QCoreApplication::testAttribute(Qt::AA_MacPluginApplication)) {
+ if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
// remove the apple event handlers installed by QCocoaApplicationDelegate
QCocoaApplicationDelegate *delegate = [QCocoaApplicationDelegate sharedDelegate];
[delegate removeAppleEventHandlers];
diff --git a/src/plugins/platforms/cocoa/qcocoakeymapper.h b/src/plugins/platforms/cocoa/qcocoakeymapper.h
index 11bbdc5426..9e79d634ab 100644
--- a/src/plugins/platforms/cocoa/qcocoakeymapper.h
+++ b/src/plugins/platforms/cocoa/qcocoakeymapper.h
@@ -36,7 +36,7 @@
#include <qcocoahelpers.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <Carbon/Carbon.h>
#include <QtCore/QList>
diff --git a/src/plugins/platforms/cocoa/qcocoamenubar.mm b/src/plugins/platforms/cocoa/qcocoamenubar.mm
index 7775cdbde6..af5905f846 100644
--- a/src/plugins/platforms/cocoa/qcocoamenubar.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenubar.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoamenubar.h"
#include "qcocoawindow.h"
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
index 0fc1bff325..76406539c3 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
@@ -31,6 +31,8 @@
**
****************************************************************************/
+#include <qpa/qplatformtheme.h>
+
#include "qcocoamenuitem.h"
#include "qcocoamenu.h"
@@ -318,7 +320,7 @@ NSMenuItem *QCocoaMenuItem::sync()
if (accel.count() > 1)
text += QLatin1String(" (") + accel.toString(QKeySequence::NativeText) + QLatin1String(")");
- QString finalString = qt_mac_removeMnemonics(text);
+ QString finalString = QPlatformTheme::removeMnemonics(text);
bool useAttributedTitle = false;
// Cocoa Font and title
if (m_font.resolve()) {
diff --git a/src/plugins/platforms/cocoa/qcocoamenuloader.h b/src/plugins/platforms/cocoa/qcocoamenuloader.h
index bdc943f78a..a3eea8bc15 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuloader.h
+++ b/src/plugins/platforms/cocoa/qcocoamenuloader.h
@@ -45,7 +45,7 @@
// We mean it.
//
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QtCore/private/qcore_mac_p.h>
@interface QT_MANGLE_NAMESPACE(QCocoaMenuLoader) : NSResponder
diff --git a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
index 41ea1fa49c..d2d3a7d562 100644
--- a/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
+++ b/src/plugins/platforms/cocoa/qcocoanativeinterface.mm
@@ -60,7 +60,7 @@
#include <QtPlatformHeaders/qcocoawindowfunctions.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoaservices.mm b/src/plugins/platforms/cocoa/qcocoaservices.mm
index 6f3f6c4e1d..75fc32f338 100644
--- a/src/plugins/platforms/cocoa/qcocoaservices.mm
+++ b/src/plugins/platforms/cocoa/qcocoaservices.mm
@@ -33,8 +33,6 @@
#include "qcocoaservices.h"
-#include "qt_mac_p.h"
-
#include <AppKit/NSWorkspace.h>
#include <Foundation/NSURL.h>
@@ -47,7 +45,7 @@ bool QCocoaServices::openUrl(const QUrl &url)
const QString scheme = url.scheme();
if (scheme.isEmpty())
return openDocument(url);
- return [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:QCFString::toNSString(url.toString(QUrl::FullyEncoded))]];
+ return [[NSWorkspace sharedWorkspace] openURL:url.toNSURL()];
}
bool QCocoaServices::openDocument(const QUrl &url)
@@ -55,7 +53,7 @@ bool QCocoaServices::openDocument(const QUrl &url)
if (!url.isValid())
return false;
- return [[NSWorkspace sharedWorkspace] openFile:QCFString::toNSString(url.toLocalFile())];
+ return [[NSWorkspace sharedWorkspace] openFile:url.toLocalFile().toNSString()];
}
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm
index 4b73d0af08..42ddce6e23 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.mm
+++ b/src/plugins/platforms/cocoa/qcocoatheme.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qcocoatheme.h"
#include "messages.h"
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.h b/src/plugins/platforms/cocoa/qcocoawindow.h
index 05e6cf3c9e..e830be212a 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.h
+++ b/src/plugins/platforms/cocoa/qcocoawindow.h
@@ -34,7 +34,7 @@
#ifndef QCOCOAWINDOW_H
#define QCOCOAWINDOW_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <qpa/qplatformwindow.h>
#include <QRect>
diff --git a/src/plugins/platforms/cocoa/qcocoawindow.mm b/src/plugins/platforms/cocoa/qcocoawindow.mm
index a545dbddd5..4c6b1bac9f 100644
--- a/src/plugins/platforms/cocoa/qcocoawindow.mm
+++ b/src/plugins/platforms/cocoa/qcocoawindow.mm
@@ -47,7 +47,7 @@
#include <qpa/qwindowsysteminterface.h>
#include <qpa/qplatformscreen.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <Carbon/Carbon.h>
#include <QDebug>
@@ -685,7 +685,16 @@ void QCocoaWindow::setVisible(bool visible)
cocoaEventDispatcherPrivate->beginModalSession(window());
m_hasModalSession = true;
} else if ([m_nsWindow canBecomeKeyWindow]) {
- [m_nsWindow makeKeyAndOrderFront:nil];
+ QCocoaEventDispatcher *cocoaEventDispatcher = qobject_cast<QCocoaEventDispatcher *>(QGuiApplication::instance()->eventDispatcher());
+ QCocoaEventDispatcherPrivate *cocoaEventDispatcherPrivate = 0;
+ if (cocoaEventDispatcher)
+ cocoaEventDispatcherPrivate = static_cast<QCocoaEventDispatcherPrivate *>(QObjectPrivate::get(cocoaEventDispatcher));
+
+ if (!(cocoaEventDispatcherPrivate && cocoaEventDispatcherPrivate->currentModalSession()))
+ [m_nsWindow makeKeyAndOrderFront:nil];
+ else
+ [m_nsWindow orderFront:nil];
+
foreach (QCocoaWindow *childWindow, m_childWindows)
childWindow->show(true);
} else {
@@ -1341,6 +1350,9 @@ void QCocoaWindow::recreateWindow(const QPlatformWindow *parentWindow)
}
} else {
// Child windows have no NSWindow, link the NSViews instead.
+ if ([m_contentView superview])
+ [m_contentView removeFromSuperview];
+
[m_parentCocoaWindow->m_contentView addSubview : m_contentView];
QRect rect = windowGeometry();
// Prevent setting a (0,0) window size; causes opengl context
diff --git a/src/plugins/platforms/cocoa/qmacclipboard.h b/src/plugins/platforms/cocoa/qmacclipboard.h
index 0d1f195f48..8b290866c6 100644
--- a/src/plugins/platforms/cocoa/qmacclipboard.h
+++ b/src/plugins/platforms/cocoa/qmacclipboard.h
@@ -39,7 +39,7 @@
#undef slots
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
QT_BEGIN_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/qmacdefines_mac.h b/src/plugins/platforms/cocoa/qmacdefines_mac.h
index b2773a2b9f..fd540e7c34 100644
--- a/src/plugins/platforms/cocoa/qmacdefines_mac.h
+++ b/src/plugins/platforms/cocoa/qmacdefines_mac.h
@@ -92,7 +92,7 @@ typedef signed long OSStatus;
# define old_slots slots
# undef slots
# endif
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
# ifdef old_slots
# undef slots
# define slots
diff --git a/src/plugins/platforms/cocoa/qmultitouch_mac_p.h b/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
index e4eec41295..0af0505a47 100644
--- a/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
+++ b/src/plugins/platforms/cocoa/qmultitouch_mac_p.h
@@ -47,7 +47,7 @@
#include <QtCore/qglobal.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <qpa/qwindowsysteminterface.h>
#include <qhash.h>
diff --git a/src/plugins/platforms/cocoa/qnsview.h b/src/plugins/platforms/cocoa/qnsview.h
index de28b8d74a..be7602a815 100644
--- a/src/plugins/platforms/cocoa/qnsview.h
+++ b/src/plugins/platforms/cocoa/qnsview.h
@@ -34,7 +34,7 @@
#ifndef QNSVIEW_H
#define QNSVIEW_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <QtCore/QPointer>
#include <QtGui/QImage>
diff --git a/src/plugins/platforms/cocoa/qnswindowdelegate.h b/src/plugins/platforms/cocoa/qnswindowdelegate.h
index b8d344aa0e..794059bc68 100644
--- a/src/plugins/platforms/cocoa/qnswindowdelegate.h
+++ b/src/plugins/platforms/cocoa/qnswindowdelegate.h
@@ -34,7 +34,7 @@
#ifndef QNSWINDOWDELEGATE_H
#define QNSWINDOWDELEGATE_H
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qcocoawindow.h"
diff --git a/src/plugins/platforms/cocoa/qt_mac_p.h b/src/plugins/platforms/cocoa/qt_mac_p.h
index 576e0f9729..c59e0941b2 100644
--- a/src/plugins/platforms/cocoa/qt_mac_p.h
+++ b/src/plugins/platforms/cocoa/qt_mac_p.h
@@ -48,7 +48,7 @@
#include "qmacdefines_mac.h"
#ifdef __OBJC__
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include <objc/runtime.h>
#endif
@@ -103,8 +103,6 @@ public:
}
};
-QString qt_mac_removeMnemonics(const QString &original); //implemented in qmacstyle_mac.cpp
-
class Q_WIDGETS_EXPORT QMacWindowChangeEvent
{
private:
diff --git a/src/plugins/platforms/eglfs/qeglfscursor.cpp b/src/plugins/platforms/eglfs/qeglfscursor.cpp
index eea130a754..bfb69d3e8f 100644
--- a/src/plugins/platforms/eglfs/qeglfscursor.cpp
+++ b/src/plugins/platforms/eglfs/qeglfscursor.cpp
@@ -38,6 +38,7 @@
#include <qpa/qwindowsysteminterface.h>
#include <QtGui/QOpenGLContext>
#include <QtGui/QOpenGLShaderProgram>
+#include <QtCore/QFile>
#include <QtCore/QJsonDocument>
#include <QtCore/QJsonArray>
#include <QtCore/QJsonObject>
diff --git a/src/plugins/platforms/ios/qiosmenu.h b/src/plugins/platforms/ios/qiosmenu.h
index ec23b55507..3beb58b503 100644
--- a/src/plugins/platforms/ios/qiosmenu.h
+++ b/src/plugins/platforms/ios/qiosmenu.h
@@ -74,9 +74,6 @@ public:
bool m_separator;
QIOSMenu *m_menu;
QKeySequence m_shortcut;
-
-private:
- QString removeMnemonics(const QString &original);
};
typedef QList<QIOSMenuItem *> QIOSMenuItemList;
diff --git a/src/plugins/platforms/ios/qiosmenu.mm b/src/plugins/platforms/ios/qiosmenu.mm
index 7aea3729fd..f68321fb3b 100644
--- a/src/plugins/platforms/ios/qiosmenu.mm
+++ b/src/plugins/platforms/ios/qiosmenu.mm
@@ -33,6 +33,7 @@
#include <qglobal.h>
#include <qguiapplication.h>
+#include <qpa/qplatformtheme.h>
#include "qiosglobal.h"
#include "qiosmenu.h"
@@ -254,7 +255,7 @@ quintptr QIOSMenuItem::tag() const
void QIOSMenuItem::setText(const QString &text)
{
- m_text = removeMnemonics(text);
+ m_text = QPlatformTheme::removeMnemonics(text);
}
void QIOSMenuItem::setMenu(QPlatformMenu *menu)
@@ -287,41 +288,6 @@ void QIOSMenuItem::setEnabled(bool enabled)
m_enabled = enabled;
}
-QString QIOSMenuItem::removeMnemonics(const QString &original)
-{
- // Copied from qcocoahelpers
- QString returnText(original.size(), 0);
- int finalDest = 0;
- int currPos = 0;
- int l = original.length();
- while (l) {
- if (original.at(currPos) == QLatin1Char('&')
- && (l == 1 || original.at(currPos + 1) != QLatin1Char('&'))) {
- ++currPos;
- --l;
- if (l == 0)
- break;
- } else if (original.at(currPos) == QLatin1Char('(') && l >= 4 &&
- original.at(currPos + 1) == QLatin1Char('&') &&
- original.at(currPos + 2) != QLatin1Char('&') &&
- original.at(currPos + 3) == QLatin1Char(')')) {
- /* remove mnemonics its format is "\s*(&X)" */
- int n = 0;
- while (finalDest > n && returnText.at(finalDest - n - 1).isSpace())
- ++n;
- finalDest -= n;
- currPos += 4;
- l -= 4;
- continue;
- }
- returnText[finalDest] = original.at(currPos);
- ++currPos;
- ++finalDest;
- --l;
- }
- returnText.truncate(finalDest);
- return returnText;
-}
QIOSMenu::QIOSMenu()
: QPlatformMenu()
diff --git a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
index 91708c0a47..45f66db75d 100644
--- a/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
+++ b/src/plugins/platforms/linuxfb/qlinuxfbscreen.cpp
@@ -34,6 +34,7 @@
#include "qlinuxfbscreen.h"
#include <QtPlatformSupport/private/qfbcursor_p.h>
#include <QtPlatformSupport/private/qfbwindow_p.h>
+#include <QtCore/QFile>
#include <QtCore/QRegularExpression>
#include <QtGui/QPainter>
diff --git a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
index bfba5051e5..bbd7f5ee75 100644
--- a/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
+++ b/src/plugins/platforms/mirclient/qmirclientglcontext.cpp
@@ -39,6 +39,7 @@
#include "qmirclientwindow.h"
#include "qmirclientlogging.h"
#include <QtPlatformSupport/private/qeglconvenience_p.h>
+#include <QtGui/private/qopenglcontext_p.h>
#if !defined(QT_NO_DEBUG)
static void printOpenGLESConfig() {
@@ -103,6 +104,15 @@ bool QMirClientOpenGLContext::makeCurrent(QPlatformSurface* surface)
ASSERT(eglMakeCurrent(mEglDisplay, eglSurface, eglSurface, mEglContext) == EGL_TRUE);
printOpenGLESConfig();
#endif
+
+ // When running on the emulator, shaders will be compiled using a thin wrapper around the desktop drivers.
+ // These wrappers might not support the precision qualifiers, so set the workaround flag to true.
+ const char *rendererString = reinterpret_cast<const char *>(glGetString(GL_RENDERER));
+ if (rendererString != 0 && qstrncmp(rendererString, "Android Emulator", 16) == 0) {
+ QOpenGLContextPrivate *ctx_d = QOpenGLContextPrivate::get(context());
+ ctx_d->workaround_missingPrecisionQualifiers = true;
+ }
+
return true;
}
diff --git a/src/plugins/platforms/windows/qwindowsdrag.cpp b/src/plugins/platforms/windows/qwindowsdrag.cpp
index 870e7fec07..fcd9911a56 100644
--- a/src/plugins/platforms/windows/qwindowsdrag.cpp
+++ b/src/plugins/platforms/windows/qwindowsdrag.cpp
@@ -239,8 +239,6 @@ private:
};
typedef QMap<Qt::DropAction, CursorEntry> ActionCursorMap;
- typedef ActionCursorMap::Iterator ActionCursorMapIt;
- typedef ActionCursorMap::ConstIterator ActionCursorMapConstIt;
const Mode m_mode;
QWindowsDrag *m_drag;
@@ -318,7 +316,7 @@ void QWindowsOleDropSource::createCursors()
if (cursorPixmap.isNull())
cursorPixmap = m_drag->defaultCursor(action);
const qint64 cacheKey = cursorPixmap.cacheKey();
- const ActionCursorMapIt it = m_cursors.find(action);
+ const auto it = m_cursors.find(action);
if (it != m_cursors.end() && it.value().cacheKey == cacheKey)
continue;
if (cursorPixmap.isNull()) {
@@ -399,7 +397,7 @@ QWindowsOleDropSource::QueryContinueDrag(BOOL fEscapePressed, DWORD grfKeyState)
{
HRESULT hr = S_OK;
do {
- if (fEscapePressed) {
+ if (fEscapePressed || QWindowsDrag::isCanceled()) {
hr = ResultFromScode(DRAGDROP_S_CANCEL);
break;
}
@@ -447,7 +445,7 @@ QWindowsOleDropSource::GiveFeedback(DWORD dwEffect)
m_drag->updateAction(action);
const qint64 currentCacheKey = m_drag->currentDrag()->dragCursor(action).cacheKey();
- ActionCursorMapConstIt it = m_cursors.constFind(action);
+ auto it = m_cursors.constFind(action);
// If a custom drag cursor is set, check its cache key to detect changes.
if (it == m_cursors.constEnd() || (currentCacheKey && currentCacheKey != it.value().cacheKey)) {
createCursors();
@@ -679,6 +677,8 @@ QWindowsOleDropTarget::Drop(LPDATAOBJECT pDataObj, DWORD grfKeyState,
\ingroup qt-lighthouse-win
*/
+bool QWindowsDrag::m_canceled = false;
+
QWindowsDrag::QWindowsDrag() :
m_dropDataObject(0), m_cachedDropTargetHelper(0)
{
@@ -808,6 +808,7 @@ Qt::DropAction QWindowsDrag::drag(QDrag *drag)
Qt::DropAction dragResult = Qt::IgnoreAction;
DWORD resultEffect;
+ QWindowsDrag::m_canceled = false;
QWindowsOleDropSource *windowDropSource = new QWindowsOleDropSource(this);
windowDropSource->createCursors();
QWindowsOleDataObject *dropDataObject = new QWindowsOleDataObject(dropData);
diff --git a/src/plugins/platforms/windows/qwindowsdrag.h b/src/plugins/platforms/windows/qwindowsdrag.h
index 9a5e0b17f2..b031faa884 100644
--- a/src/plugins/platforms/windows/qwindowsdrag.h
+++ b/src/plugins/platforms/windows/qwindowsdrag.h
@@ -87,6 +87,8 @@ public:
Qt::DropAction drag(QDrag *drag) Q_DECL_OVERRIDE;
static QWindowsDrag *instance();
+ void cancelDrag() Q_DECL_OVERRIDE { QWindowsDrag::m_canceled = true; }
+ static bool isCanceled() { return QWindowsDrag::m_canceled; }
IDataObject *dropDataObject() const { return m_dropDataObject; }
void setDropDataObject(IDataObject *dataObject) { m_dropDataObject = dataObject; }
@@ -98,6 +100,8 @@ public:
QPixmap defaultCursor(Qt::DropAction action) const;
private:
+ static bool m_canceled;
+
QWindowsDropMimeData m_dropData;
IDataObject *m_dropDataObject;
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
index c8eaccd956..a30e545807 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase.cpp
@@ -44,6 +44,7 @@
#include <QtCore/qmath.h>
#include <QtCore/QDebug>
+#include <QtCore/QFile>
#include <QtCore/QtEndian>
#include <QtCore/QThreadStorage>
diff --git a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
index 16cc2afef6..361e7f4445 100644
--- a/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontdatabase_ft.cpp
@@ -145,10 +145,8 @@ static FontKeys &fontKeys()
static const FontKey *findFontKey(const QString &name, int *indexIn = Q_NULLPTR)
{
- typedef FontKeys::ConstIterator ConstIt;
-
const FontKeys &keys = fontKeys();
- for (ConstIt it = keys.constBegin(), cend = keys.constEnd(); it != cend; ++it) {
+ for (auto it = keys.constBegin(), cend = keys.constEnd(); it != cend; ++it) {
const int index = it->fontNames.indexOf(name);
if (index >= 0) {
if (indexIn)
diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp
index 3685197430..ca3e2527e9 100644
--- a/src/plugins/platforms/windows/qwindowsfontengine.cpp
+++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp
@@ -54,6 +54,7 @@
#include <QtGui/private/qpaintengine_raster_p.h>
#include <QtCore/QtEndian>
+#include <QtCore/QFile>
#include <QtCore/qmath.h>
#include <QtCore/QThreadStorage>
#include <QtCore/private/qsystemlibrary_p.h>
diff --git a/src/plugins/platforms/windows/qwindowsintegration.cpp b/src/plugins/platforms/windows/qwindowsintegration.cpp
index b67e0b859f..2f61baa8a1 100644
--- a/src/plugins/platforms/windows/qwindowsintegration.cpp
+++ b/src/plugins/platforms/windows/qwindowsintegration.cpp
@@ -62,6 +62,7 @@
#if !defined(Q_OS_WINCE) && !defined(QT_NO_SESSIONMANAGER)
# include "qwindowssessionmanager.h"
#endif
+#include <QtGui/qtouchdevice.h>
#include <QtGui/private/qguiapplication_p.h>
#include <QtGui/private/qhighdpiscaling_p.h>
#include <QtGui/qpa/qplatforminputcontextfactory_p.h>
@@ -220,11 +221,13 @@ QWindowsIntegrationPrivate::QWindowsIntegrationPrivate(const QStringList &paramL
if (tabletAbsoluteRange >= 0)
m_context.setTabletAbsoluteRange(tabletAbsoluteRange);
if (!dpiAwarenessSet) { // Set only once in case of repeated instantiations of QGuiApplication.
- m_context.setProcessDpiAwareness(dpiAwareness);
+ if (!QCoreApplication::testAttribute(Qt::AA_PluginApplication)) {
+ m_context.setProcessDpiAwareness(dpiAwareness);
+ qCDebug(lcQpaWindows)
+ << __FUNCTION__ << "DpiAwareness=" << dpiAwareness;
+ }
dpiAwarenessSet = true;
}
- qCDebug(lcQpaWindows)
- << __FUNCTION__ << "DpiAwareness=" << dpiAwareness;
m_context.initTouch(m_options);
}
diff --git a/src/plugins/platforms/windows/qwindowsmousehandler.cpp b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
index e26010b5c4..80f3d3e2b8 100644
--- a/src/plugins/platforms/windows/qwindowsmousehandler.cpp
+++ b/src/plugins/platforms/windows/qwindowsmousehandler.cpp
@@ -41,6 +41,7 @@
#include <qpa/qwindowsysteminterface.h>
#include <QtGui/QGuiApplication>
#include <QtGui/QScreen>
+#include <QtGui/QTouchDevice>
#include <QtGui/QWindow>
#include <QtGui/QCursor>
diff --git a/src/plugins/platforms/xcb/qxcbkeyboard.cpp b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
index 2e088d3ca5..0bfefc962e 100644
--- a/src/plugins/platforms/xcb/qxcbkeyboard.cpp
+++ b/src/plugins/platforms/xcb/qxcbkeyboard.cpp
@@ -1511,11 +1511,13 @@ void QXcbKeyboard::handleKeyEvent(xcb_window_t sourceWindow, QEvent::Type type,
QWindow *window = targetWindow->window();
if (!filtered) {
+#ifndef QT_NO_CONTEXTMENU
if (type == QEvent::KeyPress && qtcode == Qt::Key_Menu) {
const QPoint globalPos = window->screen()->handle()->cursor()->pos();
const QPoint pos = window->mapFromGlobal(globalPos);
QWindowSystemInterface::handleContextMenuEvent(window, false, pos, globalPos, modifiers);
}
+#endif // QT_NO_CONTEXTMENU
QWindowSystemInterface::handleExtendedKeyEvent(window, time, type, qtcode, modifiers,
code, sym, state, string, isAutoRepeat);
}
diff --git a/src/plugins/platforms/xcb/qxcbscreen.cpp b/src/plugins/platforms/xcb/qxcbscreen.cpp
index 0aa5810a72..4f71ac8693 100644
--- a/src/plugins/platforms/xcb/qxcbscreen.cpp
+++ b/src/plugins/platforms/xcb/qxcbscreen.cpp
@@ -141,8 +141,6 @@ QXcbScreen::QXcbScreen(QXcbConnection *connection, QXcbVirtualDesktop *virtualDe
updateRefreshRate(crtc->mode);
free(crtc);
}
- } else {
- updateGeometry(output ? output->timestamp : 0);
}
if (m_geometry.isEmpty()) {
diff --git a/src/plugins/printsupport/cocoa/cocoa.pro b/src/plugins/printsupport/cocoa/cocoa.pro
index a3b9e2dfcf..c993b42574 100644
--- a/src/plugins/printsupport/cocoa/cocoa.pro
+++ b/src/plugins/printsupport/cocoa/cocoa.pro
@@ -5,7 +5,7 @@ PLUGIN_CLASS_NAME = QCocoaPrinterSupportPlugin
load(qt_plugin)
QT += gui-private printsupport-private
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
SOURCES += main.cpp
diff --git a/src/printsupport/dialogs/dialogs.pri b/src/printsupport/dialogs/dialogs.pri
index bb07167f68..7b520a05de 100644
--- a/src/printsupport/dialogs/dialogs.pri
+++ b/src/printsupport/dialogs/dialogs.pri
@@ -8,10 +8,10 @@ HEADERS += \
dialogs/qprintdialog.h \
dialogs/qprintpreviewdialog.h
-mac:!ios {
+osx {
OBJECTIVE_SOURCES += dialogs/qpagesetupdialog_mac.mm \
dialogs/qprintdialog_mac.mm
- LIBS_PRIVATE += -framework Cocoa
+ LIBS_PRIVATE += -framework AppKit
}
win32 {
diff --git a/src/printsupport/dialogs/qpagesetupdialog_mac.mm b/src/printsupport/dialogs/qpagesetupdialog_mac.mm
index b86de31883..3147ccb58e 100644
--- a/src/printsupport/dialogs/qpagesetupdialog_mac.mm
+++ b/src/printsupport/dialogs/qpagesetupdialog_mac.mm
@@ -32,7 +32,7 @@
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qpagesetupdialog.h"
diff --git a/src/printsupport/dialogs/qprintdialog_mac.mm b/src/printsupport/dialogs/qprintdialog_mac.mm
index 030526954d..e7948c2a37 100644
--- a/src/printsupport/dialogs/qprintdialog_mac.mm
+++ b/src/printsupport/dialogs/qprintdialog_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qprintdialog.h"
#include "qabstractprintdialog_p.h"
diff --git a/src/testlib/qplaintestlogger.cpp b/src/testlib/qplaintestlogger.cpp
index d820e87ccb..80b93886bb 100644
--- a/src/testlib/qplaintestlogger.cpp
+++ b/src/testlib/qplaintestlogger.cpp
@@ -348,16 +348,17 @@ void QPlainTestLogger::startLogging()
void QPlainTestLogger::stopLogging()
{
char buf[1024];
+ const int timeMs = qRound(QTestLog::msecsTotalTime());
if (QTestLog::verboseLevel() < 0) {
- qsnprintf(buf, sizeof(buf), "Totals: %d passed, %d failed, %d skipped, %d blacklisted\n",
+ qsnprintf(buf, sizeof(buf), "Totals: %d passed, %d failed, %d skipped, %d blacklisted, %dms\n",
QTestLog::passCount(), QTestLog::failCount(),
- QTestLog::skipCount(), QTestLog::blacklistCount());
+ QTestLog::skipCount(), QTestLog::blacklistCount(), timeMs);
} else {
qsnprintf(buf, sizeof(buf),
- "Totals: %d passed, %d failed, %d skipped, %d blacklisted\n"
+ "Totals: %d passed, %d failed, %d skipped, %d blacklisted, %dms\n"
"********* Finished testing of %s *********\n",
QTestLog::passCount(), QTestLog::failCount(),
- QTestLog::skipCount(), QTestLog::blacklistCount(),
+ QTestLog::skipCount(), QTestLog::blacklistCount(), timeMs,
QTestResult::currentTestObjectName());
}
outputMessage(buf);
diff --git a/src/testlib/qtestblacklist.cpp b/src/testlib/qtestblacklist.cpp
index c2643a2304..fe69e097e7 100644
--- a/src/testlib/qtestblacklist.cpp
+++ b/src/testlib/qtestblacklist.cpp
@@ -121,6 +121,13 @@ static QSet<QByteArray> keywords()
#endif
#endif
+#ifdef Q_PROCESSOR_X86
+ << "x86"
+#endif
+#ifdef Q_PROCESSOR_ARM
+ << "arm"
+#endif
+
#ifdef Q_AUTOTEST_EXPORT
<< "developer-build"
#endif
diff --git a/src/tools/moc/preprocessor.cpp b/src/tools/moc/preprocessor.cpp
index a2a1a958cf..590f17c24f 100644
--- a/src/tools/moc/preprocessor.cpp
+++ b/src/tools/moc/preprocessor.cpp
@@ -154,6 +154,11 @@ bool Preprocessor::skipBranch()
Symbols Preprocessor::tokenize(const QByteArray& input, int lineNum, Preprocessor::TokenizeMode mode)
{
Symbols symbols;
+ // Preallocate some space to speed up the code below.
+ // The magic divisor value was found by calculating the average ratio between
+ // input size and the final size of symbols.
+ // This yielded a value of 16.x when compiling Qt Base.
+ symbols.reserve(input.size() / 16);
const char *begin = input.constData();
const char *data = begin;
while (*data) {
diff --git a/src/widgets/dialogs/qfilesystemmodel.cpp b/src/widgets/dialogs/qfilesystemmodel.cpp
index b1e77540e7..d0c3edcd69 100644
--- a/src/widgets/dialogs/qfilesystemmodel.cpp
+++ b/src/widgets/dialogs/qfilesystemmodel.cpp
@@ -251,6 +251,21 @@ QModelIndex QFileSystemModel::index(int row, int column, const QModelIndex &pare
}
/*!
+ \reimp
+*/
+QModelIndex QFileSystemModel::sibling(int row, int column, const QModelIndex &idx) const
+{
+ if (row == idx.row() && column < QFileSystemModelPrivate::NumColumns) {
+ // cheap sibling operation: just adjust the column:
+ return createIndex(row, column, idx.internalPointer());
+ } else {
+ // for anything else: call the default implementation
+ // (this could probably be optimized, too):
+ return QAbstractItemModel::sibling(row, column, idx);
+ }
+}
+
+/*!
\overload
Returns the model item index for the given \a path and \a column.
diff --git a/src/widgets/dialogs/qfilesystemmodel.h b/src/widgets/dialogs/qfilesystemmodel.h
index f749c97bcb..cef85a0c8c 100644
--- a/src/widgets/dialogs/qfilesystemmodel.h
+++ b/src/widgets/dialogs/qfilesystemmodel.h
@@ -75,6 +75,7 @@ public:
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
QModelIndex index(const QString &path, int column = 0) const;
QModelIndex parent(const QModelIndex &child) const Q_DECL_OVERRIDE;
+ QModelIndex sibling(int row, int column, const QModelIndex &idx) const Q_DECL_OVERRIDE;
bool hasChildren(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE;
bool canFetchMore(const QModelIndex &parent) const Q_DECL_OVERRIDE;
void fetchMore(const QModelIndex &parent) Q_DECL_OVERRIDE;
diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp
index 8a48100ea7..4ad235051c 100644
--- a/src/widgets/dialogs/qmessagebox.cpp
+++ b/src/widgets/dialogs/qmessagebox.cpp
@@ -89,16 +89,14 @@ public:
{
public:
TextEdit(QWidget *parent=0) : QTextEdit(parent) { }
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent * e) Q_DECL_OVERRIDE
{
-#ifndef QT_NO_CONTEXTMENU
QMenu *menu = createStandardContextMenu();
menu->setAttribute(Qt::WA_DeleteOnClose);
menu->popup(e->globalPos());
-#else
- Q_UNUSED(e);
-#endif
}
+#endif // QT_NO_CONTEXTMENU
};
QMessageBoxDetailsText(QWidget *parent=0)
diff --git a/src/widgets/doc/images/gtk-calendarwidget.png b/src/widgets/doc/images/gtk-calendarwidget.png
deleted file mode 100644
index 568cd1a5da..0000000000
--- a/src/widgets/doc/images/gtk-calendarwidget.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-checkbox.png b/src/widgets/doc/images/gtk-checkbox.png
deleted file mode 100644
index 1fd5fc77bf..0000000000
--- a/src/widgets/doc/images/gtk-checkbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-combobox.png b/src/widgets/doc/images/gtk-combobox.png
deleted file mode 100644
index 3b4544df13..0000000000
--- a/src/widgets/doc/images/gtk-combobox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-dateedit.png b/src/widgets/doc/images/gtk-dateedit.png
deleted file mode 100644
index 25229f0b3b..0000000000
--- a/src/widgets/doc/images/gtk-dateedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-datetimeedit.png b/src/widgets/doc/images/gtk-datetimeedit.png
deleted file mode 100644
index 0c934a4d0d..0000000000
--- a/src/widgets/doc/images/gtk-datetimeedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-dial.png b/src/widgets/doc/images/gtk-dial.png
deleted file mode 100644
index 18e14b3650..0000000000
--- a/src/widgets/doc/images/gtk-dial.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-doublespinbox.png b/src/widgets/doc/images/gtk-doublespinbox.png
deleted file mode 100644
index 3a69043c0b..0000000000
--- a/src/widgets/doc/images/gtk-doublespinbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-fontcombobox.png b/src/widgets/doc/images/gtk-fontcombobox.png
deleted file mode 100644
index 4cb1bc1343..0000000000
--- a/src/widgets/doc/images/gtk-fontcombobox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-frame.png b/src/widgets/doc/images/gtk-frame.png
deleted file mode 100644
index c1bf52f6a6..0000000000
--- a/src/widgets/doc/images/gtk-frame.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-groupbox.png b/src/widgets/doc/images/gtk-groupbox.png
deleted file mode 100644
index 6d217c89f9..0000000000
--- a/src/widgets/doc/images/gtk-groupbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-horizontalscrollbar.png b/src/widgets/doc/images/gtk-horizontalscrollbar.png
deleted file mode 100644
index 2887730c13..0000000000
--- a/src/widgets/doc/images/gtk-horizontalscrollbar.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-label.png b/src/widgets/doc/images/gtk-label.png
deleted file mode 100644
index 006d0133d8..0000000000
--- a/src/widgets/doc/images/gtk-label.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-lcdnumber.png b/src/widgets/doc/images/gtk-lcdnumber.png
deleted file mode 100644
index 142d298ffc..0000000000
--- a/src/widgets/doc/images/gtk-lcdnumber.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-lineedit.png b/src/widgets/doc/images/gtk-lineedit.png
deleted file mode 100644
index 8fb513c39f..0000000000
--- a/src/widgets/doc/images/gtk-lineedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-listview.png b/src/widgets/doc/images/gtk-listview.png
deleted file mode 100644
index d32f8e8aee..0000000000
--- a/src/widgets/doc/images/gtk-listview.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-progressbar.png b/src/widgets/doc/images/gtk-progressbar.png
deleted file mode 100644
index 6162484bf3..0000000000
--- a/src/widgets/doc/images/gtk-progressbar.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-pushbutton.png b/src/widgets/doc/images/gtk-pushbutton.png
deleted file mode 100644
index f4f4d7c1e4..0000000000
--- a/src/widgets/doc/images/gtk-pushbutton.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-radiobutton.png b/src/widgets/doc/images/gtk-radiobutton.png
deleted file mode 100644
index b3620fa054..0000000000
--- a/src/widgets/doc/images/gtk-radiobutton.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-slider.png b/src/widgets/doc/images/gtk-slider.png
deleted file mode 100644
index 3d8e0ee89e..0000000000
--- a/src/widgets/doc/images/gtk-slider.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-spinbox.png b/src/widgets/doc/images/gtk-spinbox.png
deleted file mode 100644
index a39eb3aa93..0000000000
--- a/src/widgets/doc/images/gtk-spinbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-tableview.png b/src/widgets/doc/images/gtk-tableview.png
deleted file mode 100644
index a025193188..0000000000
--- a/src/widgets/doc/images/gtk-tableview.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-tabwidget.png b/src/widgets/doc/images/gtk-tabwidget.png
deleted file mode 100644
index 089c76dad2..0000000000
--- a/src/widgets/doc/images/gtk-tabwidget.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-textedit.png b/src/widgets/doc/images/gtk-textedit.png
deleted file mode 100644
index e4b91c01c9..0000000000
--- a/src/widgets/doc/images/gtk-textedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-timeedit.png b/src/widgets/doc/images/gtk-timeedit.png
deleted file mode 100644
index acf6730a86..0000000000
--- a/src/widgets/doc/images/gtk-timeedit.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-toolbox.png b/src/widgets/doc/images/gtk-toolbox.png
deleted file mode 100644
index 25e6137699..0000000000
--- a/src/widgets/doc/images/gtk-toolbox.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-toolbutton.png b/src/widgets/doc/images/gtk-toolbutton.png
deleted file mode 100644
index f0eb86efc5..0000000000
--- a/src/widgets/doc/images/gtk-toolbutton.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/images/gtk-treeview.png b/src/widgets/doc/images/gtk-treeview.png
deleted file mode 100644
index 7b4e3044be..0000000000
--- a/src/widgets/doc/images/gtk-treeview.png
+++ /dev/null
Binary files differ
diff --git a/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp b/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp
index a937498fe5..01f4c528a2 100644
--- a/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp
+++ b/src/widgets/doc/snippets/code/doc_src_stylesheet.cpp
@@ -138,3 +138,7 @@ emailEdit->setProperty("mandatoryField", true);
QSpinBox *ageSpinBox = new QSpinBox(this);
ageSpinBox->setProperty("mandatoryField", true);
//! [95]
+
+//! [96]
+qApp->setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);
+//! [97]
diff --git a/src/widgets/doc/snippets/macmainwindow.mm b/src/widgets/doc/snippets/macmainwindow.mm
index d0d74631ab..17aff45fa0 100644
--- a/src/widgets/doc/snippets/macmainwindow.mm
+++ b/src/widgets/doc/snippets/macmainwindow.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
#include "macmainwindow.h"
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QtGui>
diff --git a/src/widgets/doc/snippets/qmacnativewidget/main.mm b/src/widgets/doc/snippets/qmacnativewidget/main.mm
index e541aac1f8..38701917c0 100644
--- a/src/widgets/doc/snippets/qmacnativewidget/main.mm
+++ b/src/widgets/doc/snippets/qmacnativewidget/main.mm
@@ -40,7 +40,7 @@
#include <QtGui/QtGui>
#include <QtGui/qmacnativewidget_mac.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
int main(int argc, char **argv)
{
diff --git a/src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc b/src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc
deleted file mode 100644
index 5c3ae8cb97..0000000000
--- a/src/widgets/doc/src/widgets-and-layouts/gallery-gtk.qdoc
+++ /dev/null
@@ -1,142 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the documentation of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:FDL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Free Documentation License Usage
-** Alternatively, this file may be used under the terms of the GNU Free
-** Documentation License version 1.3 as published by the Free Software
-** Foundation and appearing in the file included in the packaging of
-** this file. Please review the following information to ensure
-** the GNU Free Documentation License version 1.3 requirements
-** will be met: http://www.gnu.org/copyleft/fdl.html.
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-/*!
- \page gallery-gtk.html
-
- \title GTK Style Widget Gallery
- \ingroup gallery
-
- This page shows some of the widgets available in Qt
- when configured to use the "gtk" style. This style is
- only available on desktop environments with GTK runtime
- support. This style provides native look'n'feel by
- integrating to the GTK platform theme. Thus, the final
- appearance varies depending on the active GTK theme.
-
-\section2 Buttons
-
-\table 100%
-\row
-\li \image gtk-pushbutton.png
- \caption The QPushButton widget provides a command button.
-\li \image gtk-toolbutton.png
- \caption The QToolButton class provides a quick-access button to commands
- or options, usually used inside a QToolBar.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-checkbox.png
- \caption The QCheckBox widget provides a checkbox with a text label.
-\li \image gtk-radiobutton.png
- \caption The QRadioButton widget provides a radio button with a text or pixmap label.
-\endtable
-
-\section2 Containers
-
-\table 100%
-\row
-\li \image gtk-groupbox.png
- The QGroupBox widget provides a group box frame with a title.
-\li \image gtk-tabwidget.png
- The QTabWidget class provides a stack of tabbed widgets.
-\li \image gtk-frame.png
- The QFrame widget provides a simple decorated container for other widgets.
-\li \image gtk-toolbox.png
- The QToolBox class provides a column of tabbed widget items.
-\endtable
-
-\section2 Item Views
-
-\table 100%
-\row
-\li \image gtk-listview.png
- The QListView class provides a default model/view implementation of a list/icon view. The QListWidget class provides a classic item-based list/icon view.
-\li \image gtk-treeview.png
- The QTreeView class provides a default model/view implementation of a tree view. The QTreeWidget class provides a classic item-based tree view.
-\li \image gtk-tableview.png
- The QTableView class provides a default model/view implementation of a table view. The QTableWidget class provides a classic item-based table view.\li
-\li
-\endtable
-
-\section2 Display Widgets
-
-\table 100%
-\row
-\li \image gtk-progressbar.png
- The QProgressBar widget provides a horizontal progress bar.
-\li \image gtk-label.png
- The QLabel widget provides a text or image display.
-\li \image gtk-lcdnumber.png
- The QLCDNumber widget displays a number with LCD-like digits.
-\endtable
-
-\section2 Input Widgets
-
-\table 100%
-\row
-\li \image gtk-lineedit.png
- The QLineEdit widget is a one-line text editor.
-\li \image gtk-dateedit.png
- The QDateEdit class provides a widget for editing dates.
-\li \image gtk-timeedit.png
- The QTimeEdit class provides a widget for editing times.
-\li \image gtk-datetimeedit.png
- The QDateTimeEdit class provides a widget for editing dates and times.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-slider.png
- The QSlider widget provides a vertical or horizontal slider.
-\li \image gtk-combobox.png
- The QComboBox widget is a combined button and pop-up list.
-\li \image gtk-spinbox.png
- The QSpinBox class provides a spin box widget.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-fontcombobox.png
- The QFontComboBox widget is a specialized combobox that enables fonts to be selected from a pop-up list containing previews of available fonts.
-\li \image gtk-doublespinbox.png
- The QDoubleSpinBox class provides a spin box widget that allows double precision floating point numbers to be entered.
-\li \image gtk-horizontalscrollbar.png
- The QScrollBar widget provides a vertical or horizontal scroll bar. Here, we show a scroll bar with horizontal orientation.
-\endtable
-
-\table 100%
-\row
-\li \image gtk-dial.png
- The QDial class provides a rounded range control (like a speedometer or potentiometer).
-\li \image gtk-textedit.png
- The QTextEdit class provides a widget that is used to edit and display both plain and rich text.
-\li \image gtk-calendarwidget.png
- The QCalendarWidget class provides a monthly calendar widget that can be used to select dates.
-\endtable
-*/
diff --git a/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc b/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc
index cc6446b8a5..c32eceb558 100644
--- a/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc
+++ b/src/widgets/doc/src/widgets-and-layouts/gallery.qdoc
@@ -54,10 +54,6 @@
\caption \l{Macintosh Style Widget Gallery}
The Macintosh style is provided by QMacStyle.
- \li \image gtk-tabwidget.png GTK Style Widget Gallery
- \caption \l{GTK Style Widget Gallery}
-
- The GTK style is provided by QGtkStyle.
\li \image fusion-tabwidget.png Fusion Style Widget Gallery
\caption \l{Fusion Style Widget Gallery}
diff --git a/src/widgets/doc/src/widgets-and-layouts/styles.qdoc b/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
index 7d1bffd0b4..a42ee0db61 100644
--- a/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
+++ b/src/widgets/doc/src/widgets-and-layouts/styles.qdoc
@@ -38,7 +38,7 @@
native widgets.
Qt comes with a selection of built-in styles. Some styles are only
- available on specific platforms (such as the Mac, GTK+ and Windows
+ available on specific platforms (such as the Mac and Windows
Vista styles). Custom styles are made available as plugins or by
creating an instance of a specific style class with
QStyleFactory::create() and setting it with QApplication::setStyle().
diff --git a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc
index 0547c4f64a..8f0f0f32c7 100644
--- a/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc
+++ b/src/widgets/doc/src/widgets-and-layouts/stylesheet.qdoc
@@ -492,9 +492,9 @@
\section1 Inheritance
In classic CSS, when font and color of an item is not explicitly set,
- it gets automatically inherited from the parent. When using Qt Style Sheets,
- a widget does \b{not} automatically inherit its font and color setting
- from its parent widget.
+ it gets automatically inherited from the parent. By default, when using
+ Qt Style Sheets, a widget does \b{not} automatically inherit its font
+ and color setting from its parent widget.
For example, consider a QPushButton inside a QGroupBox:
@@ -507,9 +507,23 @@
\snippet code/doc_src_stylesheet.cpp 25
- In contrast, setting a font and propagate using QWidget::setFont() and
+ In contrast, setting a font and palette using QWidget::setFont() and
QWidget::setPalette() propagates to child widgets.
+ If you would prefer that the font and palette propagate to child widgets,
+ you can set the Qt::AA_UseStyleSheetPropagationInWidgetStyles flag, like
+ this:
+
+ Usage:
+ \snippet code/doc_src_stylesheet.cpp 96
+
+ When the widget-style font and palette propagation is enabled, font and
+ palette changes made through Qt Style Sheets will behave as though the
+ user had manually called the corresponding QWidget::setPalette() and
+ QWidget::setFont() methods on all of the QWidgets targeted by the style
+ sheet. If this would have caused propagation in C++, it will cause
+ propagation in style sheets and visa versa.
+
\section1 Widgets Inside C++ Namespaces
The Type Selector can be used to style widgets of a particular type. For
diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp
index ad58aeb488..df810064c7 100644
--- a/src/widgets/graphicsview/qgraphicsscene.cpp
+++ b/src/widgets/graphicsview/qgraphicsscene.cpp
@@ -232,6 +232,7 @@
#include <QtGui/qpainter.h>
#include <QtGui/qpixmapcache.h>
#include <QtGui/qpolygon.h>
+#include <QtGui/qtouchdevice.h>
#include <QtWidgets/qstyleoption.h>
#include <QtWidgets/qtooltip.h>
#include <QtGui/qtransform.h>
diff --git a/src/widgets/itemviews/qfileiconprovider.cpp b/src/widgets/itemviews/qfileiconprovider.cpp
index f43bcd5d5a..18b9755477 100644
--- a/src/widgets/itemviews/qfileiconprovider.cpp
+++ b/src/widgets/itemviews/qfileiconprovider.cpp
@@ -52,10 +52,6 @@
# endif
#endif
-#if defined(Q_OS_UNIX) && !defined(QT_NO_STYLE_GTK)
-# include <private/qgtkstyle_p_p.h>
-#endif
-
QT_BEGIN_NAMESPACE
static bool isCacheable(const QFileInfo &fi);
@@ -358,15 +354,6 @@ QIcon QFileIconProvider::icon(const QFileInfo &info) const
{
Q_D(const QFileIconProvider);
-#if defined(Q_OS_UNIX) && !defined(QT_NO_STYLE_GTK)
- const QByteArray desktopEnvironment = QGuiApplicationPrivate::platformIntegration()->services()->desktopEnvironment();
- if (desktopEnvironment != QByteArrayLiteral("KDE")) {
- QIcon gtkIcon = QGtkStylePrivate::getFilesystemIcon(info);
- if (!gtkIcon.isNull())
- return gtkIcon;
- }
-#endif
-
QIcon retIcon = d->getIcon(info);
if (!retIcon.isNull())
return retIcon;
diff --git a/src/widgets/itemviews/qitemeditorfactory.cpp b/src/widgets/itemviews/qitemeditorfactory.cpp
index e966c83fe7..701e7ab79b 100644
--- a/src/widgets/itemviews/qitemeditorfactory.cpp
+++ b/src/widgets/itemviews/qitemeditorfactory.cpp
@@ -47,6 +47,7 @@
#include <qapplication.h>
#include <qdebug.h>
+#include <algorithm>
QT_BEGIN_NAMESPACE
@@ -202,7 +203,7 @@ void QItemEditorFactory::registerEditor(int userType, QItemEditorCreatorBase *cr
QItemEditorCreatorBase *oldCreator = it.value();
Q_ASSERT(oldCreator);
creatorMap.erase(it);
- if (!creatorMap.values().contains(oldCreator))
+ if (std::find(creatorMap.cbegin(), creatorMap.cend(), oldCreator) == creatorMap.cend())
delete oldCreator; // if it is no more in use we can delete it
}
diff --git a/src/widgets/kernel/mac.pri b/src/widgets/kernel/mac.pri
index 4c507ae80e..129fdebe1b 100644
--- a/src/widgets/kernel/mac.pri
+++ b/src/widgets/kernel/mac.pri
@@ -1,4 +1,4 @@
-!x11:mac:!ios {
- LIBS_PRIVATE += -framework Carbon -framework Cocoa -lz
+!x11:osx {
+ LIBS_PRIVATE += -framework Carbon -framework AppKit -lz
*-mwerks:INCLUDEPATH += compat
}
diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp
index 148ed61424..7b51028e6e 100644
--- a/src/widgets/kernel/qapplication.cpp
+++ b/src/widgets/kernel/qapplication.cpp
@@ -65,6 +65,7 @@
#include <QtGui/qstylehints.h>
#include <QtGui/qinputmethod.h>
#include <QtGui/private/qwindow_p.h>
+#include <QtGui/qtouchdevice.h>
#include <qpa/qplatformtheme.h>
#ifndef QT_NO_WHATSTHIS
#include <QtWidgets/QWhatsThis>
diff --git a/src/widgets/kernel/qgesturemanager.cpp b/src/widgets/kernel/qgesturemanager.cpp
index fb2914d53a..51cffc6321 100644
--- a/src/widgets/kernel/qgesturemanager.cpp
+++ b/src/widgets/kernel/qgesturemanager.cpp
@@ -106,7 +106,7 @@ QGestureManager::QGestureManager(QObject *parent)
QGestureManager::~QGestureManager()
{
- qDeleteAll(m_recognizers.values());
+ qDeleteAll(m_recognizers);
foreach (QGestureRecognizer *recognizer, m_obsoleteGestures.keys()) {
qDeleteAll(m_obsoleteGestures.value(recognizer));
delete recognizer;
diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp
index 029f0f3425..efa032453f 100644
--- a/src/widgets/kernel/qwidget.cpp
+++ b/src/widgets/kernel/qwidget.cpp
@@ -1957,11 +1957,14 @@ void QWidgetPrivate::propagatePaletteChange()
}
int mask = data.pal.resolve() | inheritedPaletteResolveMask;
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
QEvent pc(QEvent::PaletteChange);
QApplication::sendEvent(q, &pc);
for (int i = 0; i < children.size(); ++i) {
QWidget *w = qobject_cast<QWidget*>(children.at(i));
- if (w && !w->testAttribute(Qt::WA_StyleSheet)
+ if (w && (!w->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles)
&& (!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))) {
QWidgetPrivate *wd = w->d_func();
wd->inheritedPaletteResolveMask = mask;
@@ -4546,15 +4549,19 @@ void QWidget::setPalette(const QPalette &palette)
QPalette QWidgetPrivate::naturalWidgetPalette(uint inheritedMask) const
{
Q_Q(const QWidget);
+
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
QPalette naturalPalette = QApplication::palette(q);
- if (!q->testAttribute(Qt::WA_StyleSheet)
+ if ((!q->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles)
&& (!q->isWindow() || q->testAttribute(Qt::WA_WindowPropagation)
#ifndef QT_NO_GRAPHICSVIEW
|| (extra && extra->proxyWidget)
#endif //QT_NO_GRAPHICSVIEW
)) {
if (QWidget *p = q->parentWidget()) {
- if (!p->testAttribute(Qt::WA_StyleSheet)) {
+ if (!p->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles) {
if (!naturalPalette.isCopyOf(QApplication::palette())) {
QPalette inheritedPalette = p->palette();
inheritedPalette.resolve(inheritedMask);
@@ -4690,15 +4697,19 @@ void QWidget::setFont(const QFont &font)
QFont QWidgetPrivate::naturalWidgetFont(uint inheritedMask) const
{
Q_Q(const QWidget);
+
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
QFont naturalFont = QApplication::font(q);
- if (!q->testAttribute(Qt::WA_StyleSheet)
+ if ((!q->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles)
&& (!q->isWindow() || q->testAttribute(Qt::WA_WindowPropagation)
#ifndef QT_NO_GRAPHICSVIEW
|| (extra && extra->proxyWidget)
#endif //QT_NO_GRAPHICSVIEW
)) {
if (QWidget *p = q->parentWidget()) {
- if (!p->testAttribute(Qt::WA_StyleSheet)) {
+ if (!p->testAttribute(Qt::WA_StyleSheet) || useStyleSheetPropagationInWidgetStyles) {
if (!naturalFont.isCopyOf(QApplication::font())) {
QFont inheritedFont = p->font();
inheritedFont.resolve(inheritedMask);
@@ -4750,6 +4761,8 @@ void QWidgetPrivate::updateFont(const QFont &font)
#ifndef QT_NO_STYLE_STYLESHEET
const QStyleSheetStyle* cssStyle;
cssStyle = extra ? qobject_cast<const QStyleSheetStyle*>(extra->style) : 0;
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
#endif
data.fnt = QFont(font, q);
@@ -4774,7 +4787,7 @@ void QWidgetPrivate::updateFont(const QFont &font)
if (w) {
if (0) {
#ifndef QT_NO_STYLE_STYLESHEET
- } else if (w->testAttribute(Qt::WA_StyleSheet)) {
+ } else if (!useStyleSheetPropagationInWidgetStyles && w->testAttribute(Qt::WA_StyleSheet)) {
// Style sheets follow a different font propagation scheme.
if (cssStyle)
cssStyle->updateStyleSheetFont(w);
@@ -4789,7 +4802,7 @@ void QWidgetPrivate::updateFont(const QFont &font)
}
#ifndef QT_NO_STYLE_STYLESHEET
- if (cssStyle) {
+ if (!useStyleSheetPropagationInWidgetStyles && cssStyle) {
cssStyle->updateStyleSheetFont(q);
}
#endif
@@ -5143,9 +5156,9 @@ void QWidget::render(QPainter *painter, const QPoint &targetOffset,
d->render(target, targetOffset, toBePainted, renderFlags);
// Restore system clip, viewport and transform.
- enginePriv->systemClip = oldSystemClip;
enginePriv->setSystemViewport(oldSystemViewport);
enginePriv->setSystemTransform(oldTransform);
+ enginePriv->systemClip = oldSystemClip;
// Restore shared painter.
d->setSharedPainter(oldPainter);
@@ -10451,7 +10464,11 @@ void QWidget::setParent(QWidget *parent, Qt::WindowFlags f)
d->reparentFocusWidgets(oldtlw);
setAttribute(Qt::WA_Resized, resized);
- if (!testAttribute(Qt::WA_StyleSheet)
+
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
+ if (!useStyleSheetPropagationInWidgetStyles && !testAttribute(Qt::WA_StyleSheet)
&& (!parent || !parent->testAttribute(Qt::WA_StyleSheet))) {
d->resolveFont();
d->resolvePalette();
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp
index a194993328..e3c40ef95e 100644
--- a/src/widgets/kernel/qwidgetwindow.cpp
+++ b/src/widgets/kernel/qwidgetwindow.cpp
@@ -283,7 +283,7 @@ bool QWidgetWindow::event(QEvent *event)
case QEvent::ContextMenu:
handleContextMenuEvent(static_cast<QContextMenuEvent *>(event));
return true;
-#endif
+#endif // QT_NO_CONTEXTMENU
// Handing show events to widgets (see below) here would cause them to be triggered twice
case QEvent::Show:
@@ -510,8 +510,12 @@ void QWidgetWindow::handleMouseEvent(QMouseEvent *event)
popupEvent = popupChild;
QContextMenuEvent e(QContextMenuEvent::Mouse, mapped, event->globalPos(), event->modifiers());
QApplication::sendSpontaneousEvent(popupEvent, &e);
-#endif
}
+#else
+ Q_UNUSED(contextMenuTrigger)
+ Q_UNUSED(oldOpenPopupCount)
+ }
+#endif
if (releaseAfter) {
qt_button_down = 0;
diff --git a/src/widgets/styles/qgtk2painter.cpp b/src/widgets/styles/qgtk2painter.cpp
deleted file mode 100644
index ea8afbc93c..0000000000
--- a/src/widgets/styles/qgtk2painter.cpp
+++ /dev/null
@@ -1,699 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgtk2painter_p.h"
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-// This class is primarily a wrapper around the gtk painter functions
-// and takes care of converting all such calls into cached Qt pixmaps.
-
-#include <private/qgtkstyle_p_p.h>
-#include <private/qhexstring_p.h>
-#include <QtWidgets/QWidget>
-#include <QtGui/QPixmapCache>
-#include <QtCore/QLibrary>
-
-QT_BEGIN_NAMESPACE
-
-typedef GdkPixbuf* (*Ptr_gdk_pixbuf_get_from_drawable) (GdkPixbuf *, GdkDrawable *, GdkColormap *, int, int, int, int, int, int);
-typedef GdkPixmap* (*Ptr_gdk_pixmap_new) (GdkDrawable *, gint, gint, gint);
-typedef void (*Ptr_gdk_draw_rectangle) (GdkDrawable *, GdkGC *, gboolean, gint, gint, gint, gint);
-typedef void (*Ptr_gdk_drawable_unref)(GdkDrawable *);
-
-typedef void (*Ptr_gtk_paint_check) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_box) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_box_gap) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint , gint, GtkPositionType, gint, gint);
-typedef void (*Ptr_gtk_paint_resize_grip) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, GdkWindowEdge, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_focus) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_shadow) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_slider) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint, GtkOrientation);
-typedef void (*Ptr_gtk_paint_expander) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , GtkExpanderStyle );
-typedef void (*Ptr_gtk_paint_handle) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint, GtkOrientation);
-typedef void (*Ptr_gtk_paint_arrow) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, GtkArrowType, gboolean, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_option) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_flat_box) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint , gint , gint , gint);
-typedef void (*Ptr_gtk_paint_extension) (GtkStyle *, GdkWindow *, GtkStateType, GtkShadowType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint, gint, GtkPositionType);
-typedef void (*Ptr_gtk_paint_hline) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint y);
-typedef void (*Ptr_gtk_paint_vline) (GtkStyle *, GdkWindow *, GtkStateType, const GdkRectangle *, GtkWidget *, const gchar *, gint, gint, gint);
-
-namespace QGtk2PainterPrivate {
- static Ptr_gdk_pixmap_new gdk_pixmap_new = 0;
- static Ptr_gdk_pixbuf_get_from_drawable gdk_pixbuf_get_from_drawable = 0;
- static Ptr_gdk_draw_rectangle gdk_draw_rectangle = 0;
- static Ptr_gdk_drawable_unref gdk_drawable_unref = 0;
-
- static Ptr_gtk_paint_check gtk_paint_check = 0;
- static Ptr_gtk_paint_box gtk_paint_box = 0;
- static Ptr_gtk_paint_box_gap gtk_paint_box_gap = 0;
- static Ptr_gtk_paint_flat_box gtk_paint_flat_box = 0;
- static Ptr_gtk_paint_option gtk_paint_option = 0;
- static Ptr_gtk_paint_extension gtk_paint_extension = 0;
- static Ptr_gtk_paint_slider gtk_paint_slider = 0;
- static Ptr_gtk_paint_shadow gtk_paint_shadow = 0;
- static Ptr_gtk_paint_resize_grip gtk_paint_resize_grip = 0;
- static Ptr_gtk_paint_focus gtk_paint_focus = 0;
- static Ptr_gtk_paint_arrow gtk_paint_arrow = 0;
- static Ptr_gtk_paint_handle gtk_paint_handle = 0;
- static Ptr_gtk_paint_expander gtk_paint_expander = 0;
- static Ptr_gtk_paint_vline gtk_paint_vline = 0;
- static Ptr_gtk_paint_hline gtk_paint_hline = 0;
-}
-
-static void initGtk()
-{
-#ifndef QT_NO_LIBRARY
- static bool initialized = false;
- if (!initialized) {
- // enforce the "0" suffix, so we'll open libgtk-x11-2.0.so.0
- QLibrary libgtk(QLS("gtk-x11-2.0"), 0, 0);
-
- QGtk2PainterPrivate::gdk_pixmap_new = (Ptr_gdk_pixmap_new)libgtk.resolve("gdk_pixmap_new");
- QGtk2PainterPrivate::gdk_pixbuf_get_from_drawable = (Ptr_gdk_pixbuf_get_from_drawable)libgtk.resolve("gdk_pixbuf_get_from_drawable");
- QGtk2PainterPrivate::gdk_draw_rectangle = (Ptr_gdk_draw_rectangle)libgtk.resolve("gdk_draw_rectangle");
- QGtk2PainterPrivate::gdk_drawable_unref = (Ptr_gdk_drawable_unref)libgtk.resolve("gdk_drawable_unref");
-
- QGtk2PainterPrivate::gtk_paint_check = (Ptr_gtk_paint_check)libgtk.resolve("gtk_paint_check");
- QGtk2PainterPrivate::gtk_paint_box = (Ptr_gtk_paint_box)libgtk.resolve("gtk_paint_box");
- QGtk2PainterPrivate::gtk_paint_flat_box = (Ptr_gtk_paint_flat_box)libgtk.resolve("gtk_paint_flat_box");
- QGtk2PainterPrivate::gtk_paint_check = (Ptr_gtk_paint_check)libgtk.resolve("gtk_paint_check");
- QGtk2PainterPrivate::gtk_paint_box = (Ptr_gtk_paint_box)libgtk.resolve("gtk_paint_box");
- QGtk2PainterPrivate::gtk_paint_resize_grip = (Ptr_gtk_paint_resize_grip)libgtk.resolve("gtk_paint_resize_grip");
- QGtk2PainterPrivate::gtk_paint_focus = (Ptr_gtk_paint_focus)libgtk.resolve("gtk_paint_focus");
- QGtk2PainterPrivate::gtk_paint_shadow = (Ptr_gtk_paint_shadow)libgtk.resolve("gtk_paint_shadow");
- QGtk2PainterPrivate::gtk_paint_slider = (Ptr_gtk_paint_slider)libgtk.resolve("gtk_paint_slider");
- QGtk2PainterPrivate::gtk_paint_expander = (Ptr_gtk_paint_expander)libgtk.resolve("gtk_paint_expander");
- QGtk2PainterPrivate::gtk_paint_handle = (Ptr_gtk_paint_handle)libgtk.resolve("gtk_paint_handle");
- QGtk2PainterPrivate::gtk_paint_option = (Ptr_gtk_paint_option)libgtk.resolve("gtk_paint_option");
- QGtk2PainterPrivate::gtk_paint_arrow = (Ptr_gtk_paint_arrow)libgtk.resolve("gtk_paint_arrow");
- QGtk2PainterPrivate::gtk_paint_box_gap = (Ptr_gtk_paint_box_gap)libgtk.resolve("gtk_paint_box_gap");
- QGtk2PainterPrivate::gtk_paint_extension = (Ptr_gtk_paint_extension)libgtk.resolve("gtk_paint_extension");
- QGtk2PainterPrivate::gtk_paint_hline = (Ptr_gtk_paint_hline)libgtk.resolve("gtk_paint_hline");
- QGtk2PainterPrivate::gtk_paint_vline = (Ptr_gtk_paint_vline)libgtk.resolve("gtk_paint_vline");
-
- initialized = true;
- }
-#endif // !QT_NO_LIBRARY
-}
-
-// To recover alpha we apply the gtk painting function two times to
-// white, and black window backgrounds. This can be used to
-// recover the premultiplied alpha channel
-QPixmap QGtk2Painter::renderTheme(uchar *bdata, uchar *wdata, const QRect &rect) const
-{
- const int bytecount = rect.width() * rect.height() * 4;
- for (int index = 0; index < bytecount ; index += 4) {
- uchar val = bdata[index + GTK_BLUE];
- if (m_alpha) {
- int alphaval = qMax(bdata[index + GTK_BLUE] - wdata[index + GTK_BLUE],
- bdata[index + GTK_GREEN] - wdata[index + GTK_GREEN]);
- alphaval = qMax(alphaval, bdata[index + GTK_RED] - wdata[index + GTK_RED]) + 255;
- bdata[index + QT_ALPHA] = alphaval;
- }
- bdata[index + QT_RED] = bdata[index + GTK_RED];
- bdata[index + QT_GREEN] = bdata[index + GTK_GREEN];
- bdata[index + QT_BLUE] = val;
- }
- QImage converted((const uchar*)bdata, rect.width(), rect.height(), m_alpha ?
- QImage::Format_ARGB32_Premultiplied : QImage::Format_RGB32);
-
- if (m_hflipped || m_vflipped) {
- return QPixmap::fromImage(converted.mirrored(m_hflipped, m_vflipped));
- } else {
- // on raster graphicssystem we need to do a copy here, because
- // we intend to deallocate the qimage bits shortly after...
- return QPixmap::fromImage(converted.copy());
- }
-}
-
-// This macro is responsible for painting any GtkStyle painting function onto a QPixmap
-#define DRAW_TO_CACHE(draw_func) \
- if (rect.width() > QWIDGETSIZE_MAX || rect.height() > QWIDGETSIZE_MAX) \
- return; \
- QRect pixmapRect(0, 0, rect.width(), rect.height()); \
- { \
- GdkPixmap *pixmap = QGtk2PainterPrivate::gdk_pixmap_new((GdkDrawable*)(m_window->window), \
- rect.width(), rect.height(), -1); \
- if (!pixmap) \
- return; \
- style = QGtkStylePrivate::gtk_style_attach (style, m_window->window); \
- QGtk2PainterPrivate::gdk_draw_rectangle(pixmap, m_alpha ? style->black_gc : *style->bg_gc, \
- true, 0, 0, rect.width(), rect.height()); \
- draw_func; \
- GdkPixbuf *imgb = QGtkStylePrivate::gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, \
- rect.width(), rect.height()); \
- if (!imgb) \
- return; \
- imgb = QGtk2PainterPrivate::gdk_pixbuf_get_from_drawable(imgb, pixmap, NULL, 0, 0, 0, 0, \
- rect.width(), rect.height()); \
- uchar* bdata = (uchar*)QGtkStylePrivate::gdk_pixbuf_get_pixels(imgb); \
- if (m_alpha) { \
- QGtk2PainterPrivate::gdk_draw_rectangle(pixmap, style->white_gc, true, 0, 0, \
- rect.width(), rect.height()); \
- draw_func; \
- GdkPixbuf *imgw = QGtkStylePrivate::gdk_pixbuf_new(GDK_COLORSPACE_RGB, true, 8, \
- rect.width(), rect.height()); \
- if (!imgw) \
- return; \
- imgw = QGtk2PainterPrivate::gdk_pixbuf_get_from_drawable(imgw, pixmap, NULL, 0, 0, 0, 0,\
- rect.width(), rect.height()); \
- uchar* wdata = (uchar*)QGtkStylePrivate::gdk_pixbuf_get_pixels(imgw); \
- cache = renderTheme(bdata, wdata, rect); \
- QGtkStylePrivate::gdk_pixbuf_unref(imgw); \
- } else { \
- cache = renderTheme(bdata, 0, rect); \
- } \
- QGtk2PainterPrivate::gdk_drawable_unref(pixmap); \
- QGtkStylePrivate::gdk_pixbuf_unref(imgb); \
- }
-
-QGtk2Painter::QGtk2Painter() : QGtkPainter(), m_window(QGtkStylePrivate::gtkWidget("GtkWindow"))
-{
- initGtk();
-}
-
-// Note currently painted without alpha for performance reasons
-void QGtk2Painter::paintBoxGap(GtkWidget *gtkWidget, const gchar* part,
- const QRect &paintRect, GtkStateType state,
- GtkShadowType shadow, GtkPositionType gap_side,
- gint x, gint width,
- GtkStyle *style)
-{
- if (!paintRect.isValid())
- return;
-
- QPixmap cache;
- QRect rect = paintRect;
-
- // To avoid exhausting cache on large tabframes we cheat a bit by
- // tiling the center part.
-
- const int maxHeight = 256;
- const int border = 16;
- if (rect.height() > maxHeight && (gap_side == GTK_POS_TOP || gap_side == GTK_POS_BOTTOM))
- rect.setHeight(2 * border + 1);
-
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget)
- % HexString<uchar>(gap_side)
- % HexString<gint>(width)
- % HexString<gint>(x);
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_box_gap (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- (const gchar*)part,
- 0, 0,
- rect.width(),
- rect.height(),
- gap_side,
- x,
- width));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- if (rect.size() != paintRect.size()) {
- // We assume we can stretch the middle tab part
- // Note: the side effect of this is that pinstripe patterns will get fuzzy
- const QSize size = cache.size();
- // top part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top(),
- paintRect.width(), border), cache,
- QRect(0, 0, size.width(), border));
-
- // tiled center part
- QPixmap tilePart(cache.width(), 1);
- QPainter scanLinePainter(&tilePart);
- scanLinePainter.drawPixmap(QRect(0, 0, tilePart.width(), tilePart.height()), cache, QRect(0, border, size.width(), 1));
- scanLinePainter.end();
- m_painter->drawTiledPixmap(QRect(paintRect.left(), paintRect.top() + border,
- paintRect.width(), paintRect.height() - 2*border), tilePart);
-
- // bottom part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top() + paintRect.height() - border,
- paintRect.width(), border), cache,
- QRect(0, size.height() - border, size.width(), border));
- } else
- m_painter->drawPixmap(paintRect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &paintRect, GtkStateType state,
- GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey)
-{
- if (!paintRect.isValid())
- return;
-
- QPixmap cache;
- QRect rect = paintRect;
-
- // To avoid exhausting cache on large tabframes we cheat a bit by
- // tiling the center part.
-
- const int maxHeight = 256;
- const int maxArea = 256*512;
- const int border = 32;
- if (rect.height() > maxHeight && (rect.width()*rect.height() > maxArea))
- rect.setHeight(2 * border + 1);
-
- QString pixmapName = uniqueName(QLS(part), state, shadow,
- rect.size(), gtkWidget) % pmKey;
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_box (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part,
- 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- if (rect.size() != paintRect.size()) {
- // We assume we can stretch the middle tab part
- // Note: the side effect of this is that pinstripe patterns will get fuzzy
- const QSize size = cache.size();
- // top part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top(),
- paintRect.width(), border), cache,
- QRect(0, 0, size.width(), border));
-
- // tiled center part
- QPixmap tilePart(cache.width(), 1);
- QPainter scanLinePainter(&tilePart);
- scanLinePainter.drawPixmap(QRect(0, 0, tilePart.width(), tilePart.height()), cache, QRect(0, border, size.width(), 1));
- scanLinePainter.end();
- m_painter->drawTiledPixmap(QRect(paintRect.left(), paintRect.top() + border,
- paintRect.width(), paintRect.height() - 2*border), tilePart);
-
- // bottom part
- m_painter->drawPixmap(QRect(paintRect.left(), paintRect.top() + paintRect.height() - border,
- paintRect.width(), border), cache,
- QRect(0, size.height() - border, size.width(), border));
- } else
- m_painter->drawPixmap(paintRect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintHline(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkStyle *style, int x1, int x2, int y,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget)
- % HexString<int>(x1)
- % HexString<int>(x2)
- % HexString<int>(y)
- % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_hline (style,
- pixmap,
- state,
- NULL,
- gtkWidget,
- part,
- x1, x2, y));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintVline(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkStyle *style, int y1, int y2, int x,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget)
- % HexString<int>(y1)
- % HexString<int>(y2)
- % HexString<int>(x)
- % pmKey;
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_vline (style,
- pixmap,
- state,
- NULL,
- gtkWidget,
- part,
- y1, y2,
- x));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintExpander(GtkWidget *gtkWidget,
- const gchar* part, const QRect &rect,
- GtkStateType state, GtkExpanderStyle expander_state,
- GtkStyle *style, const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget)
- % HexString<uchar>(expander_state)
- % pmKey;
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_expander (style, pixmap,
- state, NULL,
- gtkWidget, part,
- rect.width()/2,
- rect.height()/2,
- expander_state));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintFocus(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkStyle *style, const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, GTK_SHADOW_NONE, rect.size(), gtkWidget) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_focus (style, pixmap, state, NULL,
- gtkWidget,
- part,
- 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintResizeGrip(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkShadowType shadow, GdkWindowEdge edge,
- GtkStyle *style, const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_resize_grip (style, pixmap, state,
- NULL, gtkWidget,
- part, edge, 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintArrow(GtkWidget *gtkWidget, const gchar* part,
- const QRect &arrowrect, GtkArrowType arrow_type,
- GtkStateType state, GtkShadowType shadow,
- gboolean fill, GtkStyle *style, const QString &pmKey)
-{
- QRect rect = m_cliprect.isValid() ? m_cliprect : arrowrect;
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size())
- % HexString<uchar>(arrow_type)
- % pmKey;
-
- GdkRectangle gtkCliprect = {0, 0, rect.width(), rect.height()};
- int xOffset = m_cliprect.isValid() ? arrowrect.x() - m_cliprect.x() : 0;
- int yOffset = m_cliprect.isValid() ? arrowrect.y() - m_cliprect.y() : 0;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_arrow (style, pixmap, state, shadow,
- &gtkCliprect,
- gtkWidget,
- part,
- arrow_type, fill,
- xOffset, yOffset,
- arrowrect.width(),
- arrowrect.height()))
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintHandle(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow,
- GtkOrientation orientation, GtkStyle *style)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size())
- % HexString<uchar>(orientation);
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_handle (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part, 0, 0,
- rect.width(),
- rect.height(),
- orientation));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintSlider(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, GtkOrientation orientation,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_slider (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part,
- 0, 0,
- rect.width(),
- rect.height(),
- orientation));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-
-void QGtk2Painter::paintShadow(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey)
-
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_shadow(style, pixmap, state, shadow, NULL,
- gtkWidget, part, 0, 0, rect.width(), rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintFlatBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state,
- GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey)
-{
- if (!rect.isValid())
- return;
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size()) % pmKey;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_flat_box (style,
- pixmap,
- state,
- shadow,
- NULL,
- gtkWidget,
- part, 0, 0,
- rect.width(),
- rect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintExtention(GtkWidget *gtkWidget,
- const gchar *part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow,
- GtkPositionType gap_pos, GtkStyle *style)
-{
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(QLS(part), state, shadow, rect.size(), gtkWidget)
- % HexString<uchar>(gap_pos);
-
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_extension (style, pixmap, state, shadow,
- NULL, gtkWidget,
- (const gchar*)part, 0, 0,
- rect.width(),
- rect.height(),
- gap_pos));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintOption(GtkWidget *gtkWidget, const QRect &radiorect,
- GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &detail)
-
-{
- QRect rect = m_cliprect.isValid() ? m_cliprect : radiorect;
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(detail, state, shadow, rect.size());
- GdkRectangle gtkCliprect = {0, 0, rect.width(), rect.height()};
- int xOffset = m_cliprect.isValid() ? radiorect.x() - m_cliprect.x() : 0;
- int yOffset = m_cliprect.isValid() ? radiorect.y() - m_cliprect.y() : 0;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_option(style, pixmap,
- state, shadow,
- &gtkCliprect,
- gtkWidget,
- detail.toLatin1(),
- xOffset, yOffset,
- radiorect.width(),
- radiorect.height()));
-
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-void QGtk2Painter::paintCheckbox(GtkWidget *gtkWidget, const QRect &checkrect,
- GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &detail)
-
-{
- QRect rect = m_cliprect.isValid() ? m_cliprect : checkrect;
- if (!rect.isValid())
- return;
-
- QPixmap cache;
- QString pixmapName = uniqueName(detail, state, shadow, rect.size());
- GdkRectangle gtkCliprect = {0, 0, rect.width(), rect.height()};
- int xOffset = m_cliprect.isValid() ? checkrect.x() - m_cliprect.x() : 0;
- int yOffset = m_cliprect.isValid() ? checkrect.y() - m_cliprect.y() : 0;
- if (!m_usePixmapCache || !QPixmapCache::find(pixmapName, cache)) {
- DRAW_TO_CACHE(QGtk2PainterPrivate::gtk_paint_check (style,
- pixmap,
- state,
- shadow,
- &gtkCliprect,
- gtkWidget,
- detail.toLatin1(),
- xOffset, yOffset,
- checkrect.width(),
- checkrect.height()));
- if (m_usePixmapCache)
- QPixmapCache::insert(pixmapName, cache);
- }
-
- m_painter->drawPixmap(rect.topLeft(), cache);
-}
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_GTK)
diff --git a/src/widgets/styles/qgtk2painter_p.h b/src/widgets/styles/qgtk2painter_p.h
deleted file mode 100644
index 1e489b5bf9..0000000000
--- a/src/widgets/styles/qgtk2painter_p.h
+++ /dev/null
@@ -1,100 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTK2PAINTER_P_H
-#define QGTK2PAINTER_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qgtkpainter_p.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGtk2Painter : public QGtkPainter
-{
-public:
- QGtk2Painter();
-
- void paintBoxGap(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkPositionType gap_side, gint x,
- gint width, GtkStyle *style) Q_DECL_OVERRIDE;
- void paintBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintHline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int x1, int x2, int y, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintVline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int y1, int y2, int x, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintExpander(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state,
- GtkExpanderStyle expander_state, GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintFocus(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintResizeGrip(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GdkWindowEdge edge, GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintArrow(GtkWidget *gtkWidget, const gchar* part, const QRect &arrowrect, GtkArrowType arrow_type, GtkStateType state, GtkShadowType shadow,
- gboolean fill, GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintHandle(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkOrientation orientation, GtkStyle *style) Q_DECL_OVERRIDE;
- void paintSlider(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, GtkOrientation orientation, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintShadow(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &pmKey = QString()) Q_DECL_OVERRIDE;
- void paintFlatBox(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString & = QString()) Q_DECL_OVERRIDE;
- void paintExtention(GtkWidget *gtkWidget, const gchar *part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkPositionType gap_pos, GtkStyle *style) Q_DECL_OVERRIDE;
- void paintOption(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) Q_DECL_OVERRIDE;
- void paintCheckbox(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) Q_DECL_OVERRIDE;
-
-private:
- QPixmap renderTheme(uchar *bdata, uchar *wdata, const QRect &rect) const;
-
- GtkWidget *m_window;
-};
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_QGTK)
-
-#endif // QGTK2PAINTER_P_H
diff --git a/src/widgets/styles/qgtkpainter.cpp b/src/widgets/styles/qgtkpainter.cpp
deleted file mode 100644
index e86fee079e..0000000000
--- a/src/widgets/styles/qgtkpainter.cpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgtkpainter_p.h"
-
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qhexstring_p.h>
-
-QT_BEGIN_NAMESPACE
-
-QGtkPainter::QGtkPainter()
-{
- reset(0);
-}
-
-QGtkPainter::~QGtkPainter()
-{
-}
-
-void QGtkPainter::reset(QPainter *painter)
-{
- m_painter = painter;
- m_alpha = true;
- m_hflipped = false;
- m_vflipped = false;
- m_usePixmapCache = true;
- m_cliprect = QRect();
-}
-
-QString QGtkPainter::uniqueName(const QString &key, GtkStateType state, GtkShadowType shadow,
- const QSize &size, GtkWidget *widget)
-{
- // Note the widget arg should ideally use the widget path, though would compromise performance
- QString tmp = key
- % HexString<uint>(state)
- % HexString<uint>(shadow)
- % HexString<uint>(size.width())
- % HexString<uint>(size.height())
- % HexString<quint64>(quint64(widget));
- return tmp;
-}
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_GTK)
diff --git a/src/widgets/styles/qgtkpainter_p.h b/src/widgets/styles/qgtkpainter_p.h
deleted file mode 100644
index bfe97ccaef..0000000000
--- a/src/widgets/styles/qgtkpainter_p.h
+++ /dev/null
@@ -1,119 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTKPAINTER_H
-#define QGTKPAINTER_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qgtkglobal_p.h>
-#include <QtCore/qsize.h>
-#include <QtCore/qrect.h>
-#include <QtCore/qpoint.h>
-#include <QtGui/qpixmap.h>
-#include <QtGui/qpainter.h>
-
-QT_BEGIN_NAMESPACE
-
-class QGtkPainter
-{
-public:
- QGtkPainter();
- virtual ~QGtkPainter();
-
- void reset(QPainter *painter = 0);
-
- void setAlphaSupport(bool value) { m_alpha = value; }
- void setClipRect(const QRect &rect) { m_cliprect = rect; }
- void setFlipHorizontal(bool value) { m_hflipped = value; }
- void setFlipVertical(bool value) { m_vflipped = value; }
- void setUsePixmapCache(bool value) { m_usePixmapCache = value; }
-
- virtual void paintBoxGap(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkPositionType gap_side, gint x,
- gint width, GtkStyle *style) = 0;
- virtual void paintBox(GtkWidget *gtkWidget, const gchar* part,
- const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style,
- const QString &pmKey = QString()) = 0;
- virtual void paintHline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int x1, int x2, int y, const QString &pmKey = QString()) = 0;
- virtual void paintVline(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- int y1, int y2, int x, const QString &pmKey = QString()) = 0;
- virtual void paintExpander(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state,
- GtkExpanderStyle expander_state, GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintFocus(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkStyle *style,
- const QString &pmKey = QString()) = 0;
- virtual void paintResizeGrip(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GdkWindowEdge edge, GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintArrow(GtkWidget *gtkWidget, const gchar* part, const QRect &arrowrect, GtkArrowType arrow_type, GtkStateType state, GtkShadowType shadow,
- gboolean fill, GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintHandle(GtkWidget *gtkWidget, const gchar* part, const QRect &rect,
- GtkStateType state, GtkShadowType shadow, GtkOrientation orientation, GtkStyle *style) = 0;
- virtual void paintSlider(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, GtkOrientation orientation, const QString &pmKey = QString()) = 0;
- virtual void paintShadow(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkStyle *style, const QString &pmKey = QString()) = 0;
- virtual void paintFlatBox(GtkWidget *gtkWidget, const gchar* part, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString & = QString()) = 0;
- virtual void paintExtention(GtkWidget *gtkWidget, const gchar *part, const QRect &rect, GtkStateType state, GtkShadowType shadow,
- GtkPositionType gap_pos, GtkStyle *style) = 0;
- virtual void paintOption(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) = 0;
- virtual void paintCheckbox(GtkWidget *gtkWidget, const QRect &rect, GtkStateType state, GtkShadowType shadow, GtkStyle *style, const QString &detail) = 0;
-
-protected:
- static QString uniqueName(const QString &key, GtkStateType state, GtkShadowType shadow, const QSize &size, GtkWidget *widget = 0);
-
- QPainter *m_painter;
- bool m_alpha;
- bool m_hflipped;
- bool m_vflipped;
- bool m_usePixmapCache;
- QRect m_cliprect;
-};
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_QGTK)
-
-#endif // QGTKPAINTER_H
diff --git a/src/widgets/styles/qgtkstyle.cpp b/src/widgets/styles/qgtkstyle.cpp
deleted file mode 100644
index 7ed0dce91d..0000000000
--- a/src/widgets/styles/qgtkstyle.cpp
+++ /dev/null
@@ -1,4257 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#include "qgtkstyle_p.h"
-
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <private/qapplication_p.h>
-#include <QtCore/QLibrary>
-#include <QtCore/QSettings>
-#include <QtWidgets/QDialogButtonBox>
-#include <QtWidgets/QStatusBar>
-#include <QtWidgets/QLineEdit>
-#include <QtWidgets/QWidget>
-#include <QtWidgets/QListView>
-#include <QtWidgets/QApplication>
-#include <QtWidgets/QStyleOption>
-#include <QtWidgets/QPushButton>
-#include <QtGui/QPainter>
-#include <QtWidgets/QMainWindow>
-#include <QtWidgets/QToolBar>
-#include <QtWidgets/QHeaderView>
-#include <QtWidgets/QMenuBar>
-#include <QtWidgets/QComboBox>
-#include <QtWidgets/QSpinBox>
-#include <QtWidgets/QScrollBar>
-#include <QtWidgets/QAbstractButton>
-#include <QtWidgets/QToolButton>
-#include <QtWidgets/QGroupBox>
-#include <QtWidgets/QRadioButton>
-#include <QtWidgets/QCheckBox>
-#include <QtWidgets/QTreeView>
-#include <QtWidgets/QStyledItemDelegate>
-#include <QtWidgets/QWizard>
-
-#include <qpixmapcache.h>
-#include <private/qstyleanimation_p.h>
-#undef signals // Collides with GTK stymbols
-#include <private/qgtkpainter_p.h>
-#include <private/qstylehelper_p.h>
-#include <private/qgtkstyle_p_p.h>
-
-QT_BEGIN_NAMESPACE
-
-static GtkStateType qt_gtk_state(const QStyleOption *option)
-{
- GtkStateType state = GTK_STATE_NORMAL;
- if (!(option->state & QStyle::State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & QStyle::State_MouseOver)
- state = GTK_STATE_PRELIGHT;
-
- return state;
-}
-
-static QPixmap qt_gtk_get_icon(const char* iconName, GtkIconSize size = GTK_ICON_SIZE_BUTTON)
-{
- GtkStyle *style = QGtkStylePrivate::gtkStyle();
- GtkIconSet* iconSet = QGtkStylePrivate::gtk_icon_factory_lookup_default (iconName);
- GdkPixbuf* icon = QGtkStylePrivate::gtk_icon_set_render_icon(iconSet,
- style,
- GTK_TEXT_DIR_LTR,
- GTK_STATE_NORMAL,
- size,
- NULL,
- "button");
- uchar* data = (uchar*)QGtkStylePrivate::gdk_pixbuf_get_pixels(icon);
- int width = QGtkStylePrivate::gdk_pixbuf_get_width(icon);
- int height = QGtkStylePrivate::gdk_pixbuf_get_height(icon);
- QImage converted(width, height, QImage::Format_ARGB32);
- uchar* tdata = (uchar*)converted.bits();
-
- for ( int index = 0 ; index < height * width*4 ; index +=4 ) {
- //int index = y * rowstride + x;
- tdata[index + QT_RED] = data[index + GTK_RED];
- tdata[index + QT_GREEN] = data[index + GTK_GREEN];
- tdata[index + QT_BLUE] = data[index + GTK_BLUE];
- tdata[index + QT_ALPHA] = data[index + GTK_ALPHA];
- }
-
- QGtkStylePrivate::gdk_pixbuf_unref(icon);
-
- // should we free iconset?
- return QPixmap::fromImage(converted);
-}
-
-static void qt_gtk_draw_mdibutton(QPainter *painter, const QStyleOptionTitleBar *option, const QRect &tmp, bool hover, bool sunken)
-{
- QColor dark;
- dark.setHsv(option->palette.button().color().hue(),
- qMin(255, (int)(option->palette.button().color().saturation()*1.9)),
- qMin(255, (int)(option->palette.button().color().value()*0.7)));
-
- QColor highlight = option->palette.highlight().color();
-
- bool active = (option->titleBarState & QStyle::State_Active);
- QColor titleBarHighlight(255, 255, 255, 60);
-
- if (sunken)
- painter->fillRect(tmp.adjusted(1, 1, -1, -1), option->palette.highlight().color().darker(120));
- else if (hover)
- painter->fillRect(tmp.adjusted(1, 1, -1, -1), QColor(255, 255, 255, 20));
-
- QColor mdiButtonGradientStartColor;
- QColor mdiButtonGradientStopColor;
-
- mdiButtonGradientStartColor = QColor(0, 0, 0, 40);
- mdiButtonGradientStopColor = QColor(255, 255, 255, 60);
-
- if (sunken)
- titleBarHighlight = highlight.darker(130);
-
- QLinearGradient gradient(tmp.center().x(), tmp.top(), tmp.center().x(), tmp.bottom());
- gradient.setColorAt(0, mdiButtonGradientStartColor);
- gradient.setColorAt(1, mdiButtonGradientStopColor);
- QColor mdiButtonBorderColor(active ? option->palette.highlight().color().darker(180): dark.darker(110));
-
- painter->setPen(QPen(mdiButtonBorderColor, 1));
- const QLine lines[4] = {
- QLine(tmp.left() + 2, tmp.top(), tmp.right() - 2, tmp.top()),
- QLine(tmp.left() + 2, tmp.bottom(), tmp.right() - 2, tmp.bottom()),
- QLine(tmp.left(), tmp.top() + 2, tmp.left(), tmp.bottom() - 2),
- QLine(tmp.right(), tmp.top() + 2, tmp.right(), tmp.bottom() - 2)
- };
- painter->drawLines(lines, 4);
- const QPoint points[4] = {
- QPoint(tmp.left() + 1, tmp.top() + 1),
- QPoint(tmp.right() - 1, tmp.top() + 1),
- QPoint(tmp.left() + 1, tmp.bottom() - 1),
- QPoint(tmp.right() - 1, tmp.bottom() - 1)
- };
- painter->drawPoints(points, 4);
-
- painter->setPen(titleBarHighlight);
- painter->drawLine(tmp.left() + 2, tmp.top() + 1, tmp.right() - 2, tmp.top() + 1);
- painter->drawLine(tmp.left() + 1, tmp.top() + 2, tmp.left() + 1, tmp.bottom() - 2);
-
- painter->setPen(QPen(gradient, 1));
- painter->drawLine(tmp.right() + 1, tmp.top() + 2, tmp.right() + 1, tmp.bottom() - 2);
- painter->drawPoint(tmp.right() , tmp.top() + 1);
-
- painter->drawLine(tmp.left() + 2, tmp.bottom() + 1, tmp.right() - 2, tmp.bottom() + 1);
- painter->drawPoint(tmp.left() + 1, tmp.bottom());
- painter->drawPoint(tmp.right() - 1, tmp.bottom());
- painter->drawPoint(tmp.right() , tmp.bottom() - 1);
-}
-
-static const char * const dock_widget_close_xpm[] =
- {
- "11 13 5 1",
- " c None",
- ". c #D5CFCB",
- "+ c #6C6A67",
- "@ c #6C6A67",
- "$ c #B5B0AC",
- " ",
- " @@@@@@@@@ ",
- "@+ +@",
- "@ +@ @+ @",
- "@ @@@ @@@ @",
- "@ @@@@@ @",
- "@ @@@ @",
- "@ @@@@@ @",
- "@ @@@ @@@ @",
- "@ +@ @+ @",
- "@+ +@",
- " @@@@@@@@@ ",
- " "
- };
-
-static const char * const dock_widget_restore_xpm[] =
- {
- "11 13 5 1",
- " c None",
- ". c #D5CFCB",
- "+ c #6C6A67",
- "@ c #6C6A67",
- "# c #6C6A67",
- " ",
- " @@@@@@@@@ ",
- "@+ +@",
- "@ #@@@# @",
- "@ @ @ @",
- "@ #@@@# @ @",
- "@ @ @ @ @",
- "@ @ @@@ @",
- "@ @ @ @",
- "@ #@@@@ @",
- "@+ +@",
- " @@@@@@@@@ ",
- " "
- };
-
-static const char * const qt_titlebar_context_help[] = {
- "10 10 3 1",
- " c None",
- "# c #000000",
- "+ c #444444",
- " +####+ ",
- " ### ### ",
- " ## ## ",
- " +##+ ",
- " +## ",
- " ## ",
- " ## ",
- " ",
- " ## ",
- " ## "};
-
-static const char * const qt_scrollbar_button_arrow_up[] = {
- "7 4 2 1",
- " c None",
- "* c #BFBFBF",
- " * ",
- " *** ",
- " ***** ",
- "*******"};
-
-static const char * const qt_scrollbar_button_arrow_down[] = {
- "7 4 2 1",
- " c None",
- "* c #BFBFBF",
- "*******",
- " ***** ",
- " *** ",
- " * "};
-
-static const int groupBoxBottomMargin = 2; // space below the groupbox
-static const int groupBoxTitleMargin = 6; // space between contents and title
-static const int groupBoxTopMargin = 2;
-
-/*!
- Returns the configuration string for \a value.
- Returns \a fallback if \a value is not found.
- */
-QString QGtkStyle::getGConfString(const QString &value, const QString &fallback)
-{
- return QGtkStylePrivate::getGConfString(value, fallback);
-}
-
-/*!
- Returns the configuration boolean for \a key.
- Returns \a fallback if \a key is not found.
- */
-bool QGtkStyle::getGConfBool(const QString &key, bool fallback)
-{
- return QGtkStylePrivate::getGConfBool(key, fallback);
-}
-
-static QColor mergedColors(const QColor &colorA, const QColor &colorB, int factor = 50)
-{
- const int maxFactor = 100;
- QColor tmp = colorA;
- tmp.setRed((tmp.red() * factor) / maxFactor + (colorB.red() * (maxFactor - factor)) / maxFactor);
- tmp.setGreen((tmp.green() * factor) / maxFactor + (colorB.green() * (maxFactor - factor)) / maxFactor);
- tmp.setBlue((tmp.blue() * factor) / maxFactor + (colorB.blue() * (maxFactor - factor)) / maxFactor);
- return tmp;
-}
-
-static GdkColor fromQColor(const QColor &color)
-{
- GdkColor retval;
- retval.pixel = 0;
- retval.red = color.red() * 255;
- retval.green = color.green() * 255;
- retval.blue = color.blue() * 255;
- return retval;
-}
-
-/*!
- \class QGtkStyle
- \brief The QGtkStyle class provides a widget style rendered by GTK+
- \since 4.5
-
- \internal
- \inmodule QtWidgets
-
- The QGtkStyle style provides a look and feel that integrates well
- into GTK-based desktop environments such as the XFCe and GNOME.
-
- It does this by making use of the GTK+ theme engine, ensuring
- that Qt applications look and feel native on these platforms.
-
- Note: The style requires GTK+ version 2.18 or later.
- The Qt3-based "Qt" GTK+ theme engine will not work with QGtkStyle.
-
- \sa QWindowsXPStyle, QMacStyle, QWindowsStyle, QFusionStyle
-*/
-
-/*!
- Constructs a QGtkStyle object.
-*/
-QGtkStyle::QGtkStyle()
- : QCommonStyle(*new QGtkStylePrivate)
-{
- Q_D(QGtkStyle);
- d->init();
-}
-
-/*!
- \internal
-
- Constructs a QGtkStyle object.
-*/
-QGtkStyle::QGtkStyle(QGtkStylePrivate &dd)
- : QCommonStyle(dd)
-{
- Q_D(QGtkStyle);
- d->init();
-}
-
-
-/*!
- Destroys the QGtkStyle object.
-*/
-QGtkStyle::~QGtkStyle()
-{
-}
-
-/*!
- \reimp
-*/
-QPalette QGtkStyle::standardPalette() const
-{
- Q_D(const QGtkStyle);
-
- QPalette palette = QCommonStyle::standardPalette();
- if (d->isThemeAvailable()) {
- GtkStyle *style = d->gtkStyle();
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- GtkWidget *gtkEntry = d->getTextColorWidget();
- GdkColor gdkBg, gdkBase, gdkText, gdkForeground, gdkSbg, gdkSfg, gdkaSbg, gdkaSfg;
- QColor bg, base, text, fg, highlight, highlightText, inactiveHighlight, inactiveHighlightedTExt;
- gdkBg = style->bg[GTK_STATE_NORMAL];
- gdkForeground = d->gtk_widget_get_style(gtkButton)->fg[GTK_STATE_NORMAL];
-
- // Our base and selected color is primarily used for text
- // so we assume a gtkEntry will have the most correct value
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- gdkBase = gtkEntryStyle->base[GTK_STATE_NORMAL];
- gdkText = gtkEntryStyle->text[GTK_STATE_NORMAL];
- gdkSbg = gtkEntryStyle->base[GTK_STATE_SELECTED];
- gdkSfg = gtkEntryStyle->text[GTK_STATE_SELECTED];
-
- // The ACTIVE base color is really used for inactive windows
- gdkaSbg = gtkEntryStyle->base[GTK_STATE_ACTIVE];
- gdkaSfg = gtkEntryStyle->text[GTK_STATE_ACTIVE];
-
- bg = QColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
- text = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- fg = QColor(gdkForeground.red>>8, gdkForeground.green>>8, gdkForeground.blue>>8);
- base = QColor(gdkBase.red>>8, gdkBase.green>>8, gdkBase.blue>>8);
- highlight = QColor(gdkSbg.red>>8, gdkSbg.green>>8, gdkSbg.blue>>8);
- highlightText = QColor(gdkSfg.red>>8, gdkSfg.green>>8, gdkSfg.blue>>8);
- inactiveHighlight = QColor(gdkaSbg.red>>8, gdkaSbg.green>>8, gdkaSbg.blue>>8);
- inactiveHighlightedTExt = QColor(gdkaSfg.red>>8, gdkaSfg.green>>8, gdkaSfg.blue>>8);
-
- palette.setColor(QPalette::HighlightedText, highlightText);
-
-
- palette.setColor(QPalette::Light, bg.lighter(125));
- palette.setColor(QPalette::Shadow, bg.darker(130));
- palette.setColor(QPalette::Dark, bg.darker(120));
- palette.setColor(QPalette::Text, text);
- palette.setColor(QPalette::WindowText, fg);
- palette.setColor(QPalette::ButtonText, fg);
- palette.setColor(QPalette::Base, base);
-
- QColor alternateRowColor = palette.base().color().lighter(93); // ref gtkstyle.c draw_flat_box
- GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView");
- GdkColor *gtkAltBase = NULL;
- d->gtk_widget_style_get(gtkTreeView, "odd-row-color", &gtkAltBase, NULL);
- if (gtkAltBase) {
- alternateRowColor = QColor(gtkAltBase->red>>8, gtkAltBase->green>>8, gtkAltBase->blue>>8);
- d->gdk_color_free(gtkAltBase);
- }
- palette.setColor(QPalette::AlternateBase, alternateRowColor);
-
- palette.setColor(QPalette::Window, bg);
- palette.setColor(QPalette::Button, bg);
- palette.setColor(QPalette::Background, bg);
- QColor disabled((fg.red() + bg.red()) / 2,
- (fg.green() + bg.green())/ 2,
- (fg.blue() + bg.blue()) / 2);
- palette.setColor(QPalette::Disabled, QPalette::Text, disabled);
- palette.setColor(QPalette::Disabled, QPalette::WindowText, disabled);
- palette.setColor(QPalette::Disabled, QPalette::Foreground, disabled);
- palette.setColor(QPalette::Disabled, QPalette::ButtonText, disabled);
- palette.setColor(QPalette::Highlight, highlight);
- // calculate disabled colors by removing saturation
- highlight.setHsv(highlight.hue(), 0, highlight.value(), highlight.alpha());
- highlightText.setHsv(highlightText.hue(), 0, highlightText.value(), highlightText.alpha());
- palette.setColor(QPalette::Disabled, QPalette::Highlight, highlight);
- palette.setColor(QPalette::Disabled, QPalette::HighlightedText, highlightText);
-
- palette.setColor(QPalette::Inactive, QPalette::HighlightedText, inactiveHighlightedTExt);
- palette.setColor(QPalette::Inactive, QPalette::Highlight, inactiveHighlight);
-
- style = d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(), "gtk-tooltips", "GtkWindow",
- d->gtk_window_get_type());
- if (style) {
- gdkText = style->fg[GTK_STATE_NORMAL];
- text = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- palette.setColor(QPalette::ToolTipText, text);
- }
- }
- return palette;
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::polish(QPalette &palette)
-{
- Q_D(QGtkStyle);
-
- if (!d->isThemeAvailable())
- QCommonStyle::polish(palette);
- else
- palette = palette.resolve(standardPalette());
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::polish(QApplication *app)
-{
- Q_D(QGtkStyle);
-
- QCommonStyle::polish(app);
- // Custom fonts and palettes with QtConfig are intentionally
- // not supported as these should be entirely determined by
- // current Gtk settings
- if (app->desktopSettingsAware() && d->isThemeAvailable()) {
- QApplicationPrivate::setSystemPalette(standardPalette());
- QApplicationPrivate::setSystemFont(d->getThemeFont());
- d->applyCustomPaletteHash();
- if (!d->isKDE4Session())
- qApp->installEventFilter(&d->filter);
- }
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::unpolish(QApplication *app)
-{
- Q_D(QGtkStyle);
-
- QCommonStyle::unpolish(app);
- QPixmapCache::clear();
-
- if (app->desktopSettingsAware() && d->isThemeAvailable() && !d->isKDE4Session())
- qApp->removeEventFilter(&d->filter);
-}
-
-/*!
- \reimp
-*/
-
-void QGtkStyle::polish(QWidget *widget)
-{
- Q_D(QGtkStyle);
-
- QCommonStyle::polish(widget);
- if (!d->isThemeAvailable())
- return;
- if (qobject_cast<QAbstractButton*>(widget)
- || qobject_cast<QToolButton*>(widget)
- || qobject_cast<QComboBox*>(widget)
- || qobject_cast<QGroupBox*>(widget)
- || qobject_cast<QScrollBar*>(widget)
- || qobject_cast<QSlider*>(widget)
- || qobject_cast<QAbstractSpinBox*>(widget)
- || qobject_cast<QSpinBox*>(widget)
- || qobject_cast<QHeaderView*>(widget))
- widget->setAttribute(Qt::WA_Hover);
-#ifndef QT_NO_TREEVIEW
- else if (QTreeView *tree = qobject_cast<QTreeView *> (widget))
- tree->viewport()->setAttribute(Qt::WA_Hover);
-#endif
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::unpolish(QWidget *widget)
-{
- QCommonStyle::unpolish(widget);
-}
-
-/*!
- \reimp
-*/
-int QGtkStyle::pixelMetric(PixelMetric metric,
- const QStyleOption *option,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::pixelMetric(metric, option, widget);
-
- switch (metric) {
- case PM_DefaultFrameWidth:
- if (qobject_cast<const QFrame*>(widget)) {
- if (GtkStyle *style =
- d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(),
- "*.GtkScrolledWindow",
- "*.GtkScrolledWindow",
- d->gtk_window_get_type()))
- return qMax(style->xthickness, style->ythickness);
- }
- return 2;
-
- case PM_MenuButtonIndicator:
- return 20;
-
- case PM_TabBarBaseOverlap:
- return 1;
-
- case PM_ToolBarSeparatorExtent:
- return 11;
-
- case PM_ToolBarFrameWidth:
- return 1;
-
- case PM_ToolBarItemSpacing:
- return 0;
-
- case PM_ButtonShiftHorizontal: {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- guint horizontal_shift;
- d->gtk_widget_style_get(gtkButton, "child-displacement-x", &horizontal_shift, NULL);
- return horizontal_shift;
- }
-
- case PM_ButtonShiftVertical: {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- guint vertical_shift;
- d->gtk_widget_style_get(gtkButton, "child-displacement-y", &vertical_shift, NULL);
- return vertical_shift;
- }
-
- case PM_MenuBarPanelWidth:
- return 0;
-
- case PM_MenuPanelWidth: {
- GtkWidget *gtkMenu = d->gtkWidget("GtkMenu");
- guint horizontal_padding = 0;
- // horizontal-padding is used by Maemo to get thicker borders
- if (!d->gtk_check_version(2, 10, 0))
- d->gtk_widget_style_get(gtkMenu, "horizontal-padding", &horizontal_padding, NULL);
- int padding = qMax<int>(d->gtk_widget_get_style(gtkMenu)->xthickness, horizontal_padding);
- return padding;
- }
-
- case PM_ButtonIconSize: {
- int retVal = 24;
- GtkSettings *settings = d->gtk_settings_get_default();
- gchararray icon_sizes;
- g_object_get(settings, "gtk-icon-sizes", &icon_sizes, NULL);
- QStringList values = QString(QLS(icon_sizes)).split(QLatin1Char(':'));
- g_free(icon_sizes);
- QChar splitChar(QLatin1Char(','));
- foreach (const QString &value, values) {
- if (value.startsWith(QLS("gtk-button="))) {
- QString iconSize = value.right(value.size() - 11);
-
- if (iconSize.contains(splitChar))
- retVal = iconSize.split(splitChar)[0].toInt();
- break;
- }
- }
- return retVal;
- }
-
- case PM_MenuVMargin:
-
- case PM_MenuHMargin:
- return 0;
-
- case PM_DockWidgetTitleMargin:
- return 0;
-
- case PM_DockWidgetTitleBarButtonMargin:
- return 5;
-
- case PM_TabBarTabVSpace:
- return 12;
-
- case PM_TabBarTabHSpace:
- return 14;
-
- case PM_TabBarTabShiftVertical:
- return 2;
-
- case PM_ToolBarHandleExtent:
- return 9;
-
- case PM_SplitterWidth:
- return 6;
-
- case PM_SliderThickness:
- case PM_SliderControlThickness: {
- GtkWidget *gtkScale = d->gtkWidget("GtkHScale");
- gint val;
- d->gtk_widget_style_get(gtkScale, "slider-width", &val, NULL);
- if (metric == PM_SliderControlThickness)
- return val + 2*d->gtk_widget_get_style(gtkScale)->ythickness;
- return val;
- }
-
- case PM_ScrollBarExtent: {
- gint sliderLength;
- gint trough_border;
- GtkWidget *hScrollbar = d->gtkWidget("GtkHScrollbar");
- d->gtk_widget_style_get(hScrollbar,
- "trough-border", &trough_border,
- "slider-width", &sliderLength,
- NULL);
- return sliderLength + trough_border*2;
- }
-
- case PM_ScrollBarSliderMin:
- return 34;
-
- case PM_SliderLength:
- gint val;
- d->gtk_widget_style_get(d->gtkWidget("GtkHScale"), "slider-length", &val, NULL);
- return val;
-
- case PM_ExclusiveIndicatorWidth:
- case PM_ExclusiveIndicatorHeight:
- case PM_IndicatorWidth:
- case PM_IndicatorHeight: {
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
- gint size, spacing;
- d->gtk_widget_style_get(gtkCheckButton, "indicator-spacing", &spacing, "indicator-size", &size, NULL);
- return size + 2 * spacing;
- }
-
- case PM_MenuBarVMargin: {
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
- return qMax(0, d->gtk_widget_get_style(gtkMenubar)->ythickness);
- }
- case PM_ScrollView_ScrollBarSpacing:
- {
- gint spacing = 3;
- GtkWidget *gtkScrollWindow = d->gtkWidget("GtkScrolledWindow");
- Q_ASSERT(gtkScrollWindow);
- d->gtk_widget_style_get(gtkScrollWindow, "scrollbar-spacing", &spacing, NULL);
- return spacing;
- }
- case PM_SubMenuOverlap: {
- gint offset = 0;
- GtkWidget *gtkMenu = d->gtkWidget("GtkMenu");
- d->gtk_widget_style_get(gtkMenu, "horizontal-offset", &offset, NULL);
- return offset;
- }
- case PM_ToolTipLabelFrameWidth:
- return 2;
- case PM_ButtonDefaultIndicator:
- return 0;
- case PM_ListViewIconSize:
- return 24;
- case PM_DialogButtonsSeparator:
- return 6;
- case PM_TitleBarHeight:
- return 24;
- case PM_SpinBoxFrameWidth:
- return 3;
- case PM_MenuBarItemSpacing:
- return 6;
- case PM_MenuBarHMargin:
- return 0;
- case PM_ToolBarItemMargin:
- return 1;
- case PM_SmallIconSize:
- return 16;
- case PM_MaximumDragDistance:
- return -1;
- case PM_TabCloseIndicatorWidth:
- case PM_TabCloseIndicatorHeight:
- return 20;
- default:
- return QCommonStyle::pixelMetric(metric, option, widget);
- }
-}
-
-/*!
- \reimp
-*/
-int QGtkStyle::styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget,
-
- QStyleHintReturn *returnData = 0) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::styleHint(hint, option, widget, returnData);
-
- switch (hint) {
- case SH_ItemView_ChangeHighlightOnFocus:
- return true;
- case SH_ScrollBar_MiddleClickAbsolutePosition:
- return true;
- case SH_Menu_AllowActiveAndDisabled:
- return false;
- case SH_MainWindow_SpaceBelowMenuBar:
- return false;
- case SH_MenuBar_MouseTracking:
- return true;
- case SH_Menu_MouseTracking:
- return true;
- case SH_TitleBar_AutoRaise:
- return true;
- case SH_TitleBar_NoBorder:
- return true;
- case SH_ItemView_ShowDecorationSelected:
- return true;
- case SH_Table_GridLineColor:
- if (option)
- return option->palette.background().color().darker(120).rgb();
- break;
- case SH_WindowFrame_Mask:
- if (QStyleHintReturnMask *mask = qstyleoption_cast<QStyleHintReturnMask *>(returnData)) {
- //left rounded corner
- mask->region = option->rect;
- mask->region -= QRect(option->rect.left(), option->rect.top(), 5, 1);
- mask->region -= QRect(option->rect.left(), option->rect.top() + 1, 3, 1);
- mask->region -= QRect(option->rect.left(), option->rect.top() + 2, 2, 1);
- mask->region -= QRect(option->rect.left(), option->rect.top() + 3, 1, 2);
-
- //right rounded corner
- mask->region -= QRect(option->rect.right() - 4, option->rect.top(), 5, 1);
- mask->region -= QRect(option->rect.right() - 2, option->rect.top() + 1, 3, 1);
- mask->region -= QRect(option->rect.right() - 1, option->rect.top() + 2, 2, 1);
- mask->region -= QRect(option->rect.right() , option->rect.top() + 3, 1, 2);
- }
- return QCommonStyle::styleHint(hint, option, widget, returnData);
- case SH_MessageBox_TextInteractionFlags:
- return Qt::TextSelectableByMouse | Qt::LinksAccessibleByMouse;
- case SH_MessageBox_CenterButtons:
- return false;
-#ifndef QT_NO_WIZARD
- case SH_WizardStyle:
- return QWizard::ClassicStyle;
-#endif
- case SH_ItemView_ArrowKeysNavigateIntoChildren:
- return false;
- case SH_DialogButtonLayout: {
- int ret = QDialogButtonBox::GnomeLayout;
- gboolean alternateOrder = 0;
- GtkSettings *settings = d->gtk_settings_get_default();
- g_object_get(settings, "gtk-alternative-button-order", &alternateOrder, NULL);
-
- if (alternateOrder)
- ret = QDialogButtonBox::WinLayout;
-
- return ret;
- }
- break;
-
- case SH_ToolButtonStyle:
- {
- if (d->isKDE4Session())
- return QCommonStyle::styleHint(hint, option, widget, returnData);
- GtkWidget *gtkToolbar = d->gtkWidget("GtkToolbar");
- GtkToolbarStyle toolbar_style = GTK_TOOLBAR_ICONS;
- g_object_get(gtkToolbar, "toolbar-style", &toolbar_style, NULL);
- switch (toolbar_style) {
- case GTK_TOOLBAR_TEXT:
- return Qt::ToolButtonTextOnly;
- case GTK_TOOLBAR_BOTH:
- return Qt::ToolButtonTextUnderIcon;
- case GTK_TOOLBAR_BOTH_HORIZ:
- return Qt::ToolButtonTextBesideIcon;
- case GTK_TOOLBAR_ICONS:
- default:
- return Qt::ToolButtonIconOnly;
- }
- }
- break;
- case SH_SpinControls_DisableOnBounds:
- return int(true);
-
- case SH_DitherDisabledText:
- return int(false);
-
- case SH_ComboBox_Popup: {
- GtkWidget *gtkComboBox = d->gtkWidget("GtkComboBox");
- gboolean appears_as_list;
- d->gtk_widget_style_get((GtkWidget*)gtkComboBox, "appears-as-list", &appears_as_list, NULL);
- return appears_as_list ? 0 : 1;
- }
-
- case SH_MenuBar_AltKeyNavigation:
- return int(false);
-
- case SH_EtchDisabledText:
- return int(false);
-
- case SH_Menu_SubMenuPopupDelay: {
- gint delay = 225;
- GtkSettings *settings = d->gtk_settings_get_default();
- g_object_get(settings, "gtk-menu-popup-delay", &delay, NULL);
- return delay;
- }
-
- case SH_ScrollView_FrameOnlyAroundContents: {
- gboolean scrollbars_within_bevel = false;
- if (widget && widget->isWindow())
- scrollbars_within_bevel = true;
- else if (!d->gtk_check_version(2, 12, 0)) {
- GtkWidget *gtkScrollWindow = d->gtkWidget("GtkScrolledWindow");
- d->gtk_widget_style_get(gtkScrollWindow, "scrollbars-within-bevel", &scrollbars_within_bevel, NULL);
- }
- return !scrollbars_within_bevel;
- }
-
- case SH_DialogButtonBox_ButtonsHaveIcons: {
- static bool buttonsHaveIcons = d->getGConfBool(QLS("/desktop/gnome/interface/buttons_have_icons"));
- return buttonsHaveIcons;
- }
-
- case SH_UnderlineShortcut: {
- gboolean underlineShortcut = true;
- if (!d->gtk_check_version(2, 12, 0)) {
- GtkSettings *settings = d->gtk_settings_get_default();
- g_object_get(settings, "gtk-enable-mnemonics", &underlineShortcut, NULL);
- }
- return underlineShortcut;
- }
-
- default:
- break;
- }
- return QCommonStyle::styleHint(hint, option, widget, returnData);
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawPrimitive(PrimitiveElement element,
- const QStyleOption *option,
- QPainter *painter,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable()) {
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- return;
- }
-
- GtkStyle* style = d->gtkStyle();
- QGtkPainter* gtkPainter = d->gtkPainter(painter);
-
- switch (element) {
- case PE_Frame: {
- if (widget && widget->inherits("QComboBoxPrivateContainer")){
- QStyleOption copy = *option;
- copy.state |= State_Raised;
- proxy()->drawPrimitive(PE_PanelMenu, &copy, painter, widget);
- break;
- }
- // Drawing the entire itemview frame is very expensive, especially on the native X11 engine
- // Instead we cheat a bit and draw a border image without the center part, hence only scaling
- // thin rectangular images
- const int pmSize = 64;
- const int border = proxy()->pixelMetric(PM_DefaultFrameWidth, option, widget);
- const QString pmKey = QLatin1String("windowframe") % HexString<uint>(option->state);
-
- QPixmap pixmap;
- QRect pmRect(QPoint(0,0), QSize(pmSize, pmSize));
-
- // Only draw through style once
- if (!QPixmapCache::find(pmKey, pixmap)) {
- pixmap = QPixmap(pmSize, pmSize);
- pixmap.fill(Qt::transparent);
- QPainter pmPainter(&pixmap);
- gtkPainter->reset(&pmPainter);
- gtkPainter->setUsePixmapCache(false); // Don't cache twice
-
- GtkShadowType shadow_type = GTK_SHADOW_NONE;
- if (option->state & State_Sunken)
- shadow_type = GTK_SHADOW_IN;
- else if (option->state & State_Raised)
- shadow_type = GTK_SHADOW_OUT;
-
- GtkStyle *style = d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(),
- "*.GtkScrolledWindow", "*.GtkScrolledWindow", d->gtk_window_get_type());
- if (style)
- gtkPainter->paintShadow(d->gtkWidget("GtkFrame"), "viewport", pmRect,
- option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- shadow_type, style);
- QPixmapCache::insert(pmKey, pixmap);
- gtkPainter->reset(painter);
- }
-
- QRect rect = option->rect;
- const int rw = rect.width() - border;
- const int rh = rect.height() - border;
- const int pw = pmRect.width() - border;
- const int ph = pmRect.height() - border;
-
- // Sidelines
- painter->drawPixmap(rect.adjusted(border, 0, -border, -rh), pixmap, pmRect.adjusted(border, 0, -border,-ph));
- painter->drawPixmap(rect.adjusted(border, rh, -border, 0), pixmap, pmRect.adjusted(border, ph,-border,0));
- painter->drawPixmap(rect.adjusted(0, border, -rw, -border), pixmap, pmRect.adjusted(0, border, -pw, -border));
- painter->drawPixmap(rect.adjusted(rw, border, 0, -border), pixmap, pmRect.adjusted(pw, border, 0, -border));
-
- // Corners
- painter->drawPixmap(rect.adjusted(0, 0, -rw, -rh), pixmap, pmRect.adjusted(0, 0, -pw,-ph));
- painter->drawPixmap(rect.adjusted(rw, 0, 0, -rh), pixmap, pmRect.adjusted(pw, 0, 0,-ph));
- painter->drawPixmap(rect.adjusted(0, rh, -rw, 0), pixmap, pmRect.adjusted(0, ph, -pw,0));
- painter->drawPixmap(rect.adjusted(rw, rh, 0, 0), pixmap, pmRect.adjusted(pw, ph, 0,0));
- }
- break;
- case PE_FrameWindow:
- painter->save();
- {
- QRect rect= option->rect;
- painter->setPen(QPen(option->palette.dark().color().darker(150), 0));
- painter->drawRect(option->rect.adjusted(0, 0, -1, -1));
- painter->setPen(QPen(option->palette.light(), 0));
- painter->drawLine(QPoint(rect.left() + 1, rect.top() + 1),
- QPoint(rect.left() + 1, rect.bottom() - 1));
- painter->setPen(QPen(option->palette.background().color().darker(120), 0));
- painter->drawLine(QPoint(rect.left() + 1, rect.bottom() - 1),
- QPoint(rect.right() - 2, rect.bottom() - 1));
- painter->drawLine(QPoint(rect.right() - 1, rect.top() + 1),
- QPoint(rect.right() - 1, rect.bottom() - 1));
- }
- painter->restore();
- break;
-
- case PE_PanelTipLabel: {
- GtkWidget *gtkWindow = d->gtkWidget("GtkWindow"); // The Murrine Engine currently assumes a widget is passed
- style = d->gtk_rc_get_style_by_paths(d->gtk_settings_get_default(), "gtk-tooltips", "GtkWindow",
- d->gtk_window_get_type());
- gtkPainter->paintFlatBox(gtkWindow, "tooltip", option->rect, GTK_STATE_NORMAL, GTK_SHADOW_NONE, style);
- }
- break;
-
- case PE_PanelStatusBar: {
- if (widget && widget->testAttribute(Qt::WA_SetPalette) &&
- option->palette.resolve() & (1 << QPalette::Window)) {
- // Respect custom palette
- painter->fillRect(option->rect, option->palette.window());
- break;
- }
- GtkShadowType shadow_type;
- GtkWidget *gtkStatusbarFrame = d->gtkWidget("GtkStatusbar.GtkFrame");
- d->gtk_widget_style_get(d->gtk_widget_get_parent(gtkStatusbarFrame), "shadow-type", &shadow_type, NULL);
- gtkPainter->paintShadow(gtkStatusbarFrame, "frame", option->rect, GTK_STATE_NORMAL,
- shadow_type, d->gtk_widget_get_style(gtkStatusbarFrame));
- }
- break;
-
- case PE_IndicatorHeaderArrow:
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- GtkWidget *gtkTreeHeader = d->gtkWidget("GtkTreeView.GtkButton");
- GtkStateType state = qt_gtk_state(option);
- style = d->gtk_widget_get_style(gtkTreeHeader);
- GtkArrowType type = GTK_ARROW_UP;
- // This sorting indicator inversion is intentional, and follows the GNOME HIG.
- // See http://library.gnome.org/devel/hig-book/stable/controls-lists.html.en#controls-lists-sortable
- if (header->sortIndicator & QStyleOptionHeader::SortUp)
- type = GTK_ARROW_UP;
- else if (header->sortIndicator & QStyleOptionHeader::SortDown)
- type = GTK_ARROW_DOWN;
-
- gtkPainter->paintArrow(gtkTreeHeader, "button", option->rect.adjusted(1, 1, -1, -1), type, state,
- GTK_SHADOW_NONE, false, style);
- }
- break;
-
- case PE_FrameDefaultButton: // fall through
- case PE_FrameFocusRect: {
- QRect frameRect = option->rect.adjusted(1, 1, -2, -2); // ### this mess should move to subcontrolrect
- if (qobject_cast<const QAbstractItemView*>(widget)) {
- // Don't draw anything
- } else if (qobject_cast<const QTabBar*>(widget)) {
- GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook");
- style = d->gtk_widget_get_style(gtkNotebook);
- gtkPainter->paintFocus(gtkNotebook, "tab", frameRect.adjusted(-1, 1, 1, 1), GTK_STATE_ACTIVE, style);
- } else {
- GtkWidget *gtkRadioButton = d->gtkWidget("GtkRadioButton");
- gtkPainter->paintFocus(gtkRadioButton, "radiobutton", frameRect, GTK_STATE_ACTIVE, style);
- }
- }
- break;
-
- case PE_IndicatorBranch:
- if (option->state & State_Children) {
- QRect rect = option->rect;
- rect = QRect(0, 0, 12, 12);
- rect.moveCenter(option->rect.center());
- rect.translate(2, 0);
- GtkExpanderStyle openState = GTK_EXPANDER_EXPANDED;
- GtkExpanderStyle closedState = GTK_EXPANDER_COLLAPSED;
- GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView");
-
- GtkStateType state = GTK_STATE_NORMAL;
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_MouseOver)
- state = GTK_STATE_PRELIGHT;
-
- gtkPainter->paintExpander(gtkTreeView, "treeview", rect, state,
- option->state & State_Open ? openState : closedState , d->gtk_widget_get_style(gtkTreeView));
- }
- break;
-
- case PE_PanelItemViewRow:
- // This primitive is only used to draw selection behind selected expander arrows.
- // We try not to decorate the tree branch background unless you inherit from StyledItemDelegate
- // The reason for this is that a lot of code that relies on custom item delegates will look odd having
- // a gradient on the branch but a flat shaded color on the item itself.
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- if (!(option->state & State_Selected)) {
- break;
- } else {
- if (const QAbstractItemView *view = qobject_cast<const QAbstractItemView*>(widget)) {
- if (!qobject_cast<QStyledItemDelegate*>(view->itemDelegate()))
- break;
- }
- } // fall through
-
- case PE_PanelItemViewItem:
- if (const QStyleOptionViewItem *vopt = qstyleoption_cast<const QStyleOptionViewItem *>(option)) {
- uint resolve_mask = vopt->palette.resolve();
- if (vopt->backgroundBrush.style() != Qt::NoBrush
- || (resolve_mask & (1 << QPalette::Base)))
- {
- QPointF oldBO = painter->brushOrigin();
- painter->setBrushOrigin(vopt->rect.topLeft());
- painter->fillRect(vopt->rect, vopt->backgroundBrush);
- painter->setBrushOrigin(oldBO);
- if (!(option->state & State_Selected))
- break;
- }
- if (GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView")) {
- const char *detail = "cell_even_ruled";
- if (vopt && vopt->features & QStyleOptionViewItem::Alternate)
- detail = "cell_odd_ruled";
- bool isActive = option->state & State_Active;
- QString key;
- if (isActive ) {
- // Required for active/non-active window appearance
- key = QLS("a");
- QGtkStylePrivate::gtkWidgetSetFocus(gtkTreeView, true);
- }
- bool isEnabled = (widget ? widget->isEnabled() : (vopt->state & QStyle::State_Enabled));
- gtkPainter->paintFlatBox(gtkTreeView, detail, option->rect,
- option->state & State_Selected ? GTK_STATE_SELECTED :
- isEnabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_OUT, d->gtk_widget_get_style(gtkTreeView), key);
- if (isActive )
- QGtkStylePrivate::gtkWidgetSetFocus(gtkTreeView, false);
- }
- }
- break;
- case PE_IndicatorToolBarSeparator:
- {
- const int margin = 6;
- GtkWidget *gtkSeparator = d->gtkWidget("GtkToolbar.GtkSeparatorToolItem");
- if (option->state & State_Horizontal) {
- const int offset = option->rect.width()/2;
- QRect rect = option->rect.adjusted(offset, margin, 0, -margin);
- painter->setPen(QPen(option->palette.background().color().darker(110)));
- gtkPainter->paintVline(gtkSeparator, "vseparator",
- rect, GTK_STATE_NORMAL, d->gtk_widget_get_style(gtkSeparator),
- 0, rect.height(), 0);
- } else { //Draw vertical separator
- const int offset = option->rect.height()/2;
- QRect rect = option->rect.adjusted(margin, offset, -margin, 0);
- painter->setPen(QPen(option->palette.background().color().darker(110)));
- gtkPainter->paintHline(gtkSeparator, "hseparator",
- rect, GTK_STATE_NORMAL, d->gtk_widget_get_style(gtkSeparator),
- 0, rect.width(), 0);
- }
- }
- break;
-
- case PE_IndicatorToolBarHandle: {
- GtkWidget *gtkToolbar = d->gtkWidget("GtkToolbar");
- GtkShadowType shadow_type;
- d->gtk_widget_style_get(gtkToolbar, "shadow-type", &shadow_type, NULL);
- //Note when the toolbar is horizontal, the handle is vertical
- painter->setClipRect(option->rect);
- gtkPainter->paintHandle(gtkToolbar, "toolbar", option->rect.adjusted(-1, -1 ,0 ,1),
- GTK_STATE_NORMAL, shadow_type, !(option->state & State_Horizontal) ?
- GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL, d->gtk_widget_get_style(gtkToolbar));
- }
- break;
-
- case PE_IndicatorArrowUp:
- case PE_IndicatorArrowDown:
- case PE_IndicatorArrowLeft:
- case PE_IndicatorArrowRight: {
-
-
- GtkArrowType type = GTK_ARROW_UP;
-
- switch (element) {
-
- case PE_IndicatorArrowDown:
- type = GTK_ARROW_DOWN;
- break;
-
- case PE_IndicatorArrowLeft:
- type = GTK_ARROW_LEFT;
- break;
-
- case PE_IndicatorArrowRight:
- type = GTK_ARROW_RIGHT;
- break;
-
- default:
- break;
- }
- int size = qMin(option->rect.height(), option->rect.width());
- int border = (size > 9) ? (size/4) : 0; //Allow small arrows to have exact dimensions
- int bsx = 0, bsy = 0;
- if (option->state & State_Sunken) {
- bsx = proxy()->pixelMetric(PM_ButtonShiftHorizontal);
- bsy = proxy()->pixelMetric(PM_ButtonShiftVertical);
- }
- QRect arrowRect = option->rect.adjusted(border + bsx, border + bsy, -border + bsx, -border + bsy);
- GtkShadowType shadow = option->state & State_Sunken ? GTK_SHADOW_IN : GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- QColor arrowColor = option->palette.buttonText().color();
- GtkWidget *gtkArrow = d->gtkWidget("GtkArrow");
- GdkColor color = fromQColor(arrowColor);
- d->gtk_widget_modify_fg (gtkArrow, state, &color);
- gtkPainter->paintArrow(gtkArrow, "button", arrowRect,
- type, state, shadow, false, d->gtk_widget_get_style(gtkArrow),
- QString::number(arrowColor.rgba(), 16));
- // Passing NULL will revert the color change
- d->gtk_widget_modify_fg (gtkArrow, state, NULL);
- }
- break;
-
- case PE_FrameGroupBox:
- // Do nothing here, the GNOME groupboxes are flat
- break;
-
- case PE_PanelMenu: {
- GtkWidget *gtkMenu = d->gtkWidget("GtkMenu");
- gtkPainter->setAlphaSupport(false); // Note, alpha disabled for performance reasons
- gtkPainter->paintBox(gtkMenu, "menu", option->rect, GTK_STATE_NORMAL, GTK_SHADOW_OUT, d->gtk_widget_get_style(gtkMenu), QString());
- }
- break;
-
- case PE_FrameMenu:
- //This is actually done by PE_Widget due to a clipping issue
- //Otherwise Menu items will not be able to span the entire menu width
-
- // This is only used by floating tool bars
- if (qobject_cast<const QToolBar *>(widget)) {
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
- gtkPainter->paintBox(gtkMenubar, "toolbar", option->rect,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT, style);
- gtkPainter->paintBox(gtkMenubar, "menu", option->rect,
- GTK_STATE_NORMAL, GTK_SHADOW_OUT, style);
- }
- break;
-
- case PE_FrameLineEdit: {
- GtkWidget *gtkEntry = d->gtkWidget("GtkEntry");
-
-
- gboolean interior_focus;
- gint focus_line_width;
- QRect rect = option->rect;
- d->gtk_widget_style_get(gtkEntry,
- "interior-focus", &interior_focus,
- "focus-line-width", &focus_line_width, NULL);
-
- // See https://bugzilla.mozilla.org/show_bug.cgi?id=405421 for info about this hack
- g_object_set_data(G_OBJECT(gtkEntry), "transparent-bg-hint", GINT_TO_POINTER(true));
-
- if (!interior_focus && option->state & State_HasFocus)
- rect.adjust(focus_line_width, focus_line_width, -focus_line_width, -focus_line_width);
-
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, true);
- gtkPainter->paintShadow(gtkEntry, "entry", rect, option->state & State_Enabled ?
- GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_IN, d->gtk_widget_get_style(gtkEntry),
- option->state & State_HasFocus ? QLS("focus") : QString());
- if (!interior_focus && option->state & State_HasFocus)
- gtkPainter->paintShadow(gtkEntry, "entry", option->rect, option->state & State_Enabled ?
- GTK_STATE_ACTIVE : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_IN, d->gtk_widget_get_style(gtkEntry), QLS("GtkEntryShadowIn"));
-
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, false);
- }
- break;
-
- case PE_PanelLineEdit:
- if (const QStyleOptionFrame *panel = qstyleoption_cast<const QStyleOptionFrame *>(option)) {
- GtkWidget *gtkEntry = d->gtkWidget("GtkEntry");
- if (panel->lineWidth > 0)
- proxy()->drawPrimitive(PE_FrameLineEdit, option, painter, widget);
- uint resolve_mask = option->palette.resolve();
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- QRect textRect = option->rect.adjusted(gtkEntryStyle->xthickness, gtkEntryStyle->ythickness,
- -gtkEntryStyle->xthickness, -gtkEntryStyle->ythickness);
-
- if (widget && widget->testAttribute(Qt::WA_SetPalette) &&
- resolve_mask & (1 << QPalette::Base)) // Palette overridden by user
- painter->fillRect(textRect, option->palette.base());
- else
- gtkPainter->paintFlatBox(gtkEntry, "entry_bg", textRect,
- option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, GTK_SHADOW_NONE, gtkEntryStyle);
- }
- break;
-
- case PE_FrameTabWidget:
- if (const QStyleOptionTabWidgetFrame *frame = qstyleoption_cast<const QStyleOptionTabWidgetFrame*>(option)) {
- GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook");
- style = d->gtk_widget_get_style(gtkNotebook);
- gtkPainter->setAlphaSupport(false);
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL; // Only state supported by gtknotebook
- bool reverse = (option->direction == Qt::RightToLeft);
- QGtkStylePrivate::gtk_widget_set_direction(gtkNotebook, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- if (const QStyleOptionTabWidgetFrameV2 *tabframe = qstyleoption_cast<const QStyleOptionTabWidgetFrameV2*>(option)) {
- GtkPositionType frameType = GTK_POS_TOP;
- QTabBar::Shape shape = frame->shape;
- int gapStart = 0;
- int gapSize = 0;
- if (shape == QTabBar::RoundedNorth || shape == QTabBar::RoundedSouth) {
- frameType = (shape == QTabBar::RoundedNorth) ? GTK_POS_TOP : GTK_POS_BOTTOM;
- gapStart = tabframe->selectedTabRect.left();
- gapSize = tabframe->selectedTabRect.width();
- } else {
- frameType = (shape == QTabBar::RoundedWest) ? GTK_POS_LEFT : GTK_POS_RIGHT;
- gapStart = tabframe->selectedTabRect.y();
- gapSize = tabframe->selectedTabRect.height();
- }
- gtkPainter->paintBoxGap(gtkNotebook, "notebook", option->rect, state, shadow, frameType,
- gapStart, gapSize, style);
- break; // done
- }
-
- // Note this is only the fallback option
- gtkPainter->paintBox(gtkNotebook, "notebook", option->rect, state, shadow, style);
- }
- break;
-
- case PE_PanelButtonCommand:
- case PE_PanelButtonTool: {
- bool isDefault = false;
- bool isTool = (element == PE_PanelButtonTool);
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton*>(option))
- isDefault = btn->features & QStyleOptionButton::DefaultButton;
-
- // don't draw a frame for tool buttons that have the autoRaise flag and are not enabled or on
- if (isTool && !(option->state & State_Enabled || option->state & State_On) && (option->state & State_AutoRaise))
- break;
- // don't draw a frame for dock widget buttons, unless we are hovering
- if (widget && widget->inherits("QDockWidgetTitleButton") && !(option->state & State_MouseOver))
- break;
-
- GtkStateType state = qt_gtk_state(option);
- if (option->state & State_On || option->state & State_Sunken)
- state = GTK_STATE_ACTIVE;
- GtkWidget *gtkButton = isTool ? d->gtkWidget("GtkToolButton.GtkButton") : d->gtkWidget("GtkButton");
- gint focusWidth, focusPad;
- gboolean interiorFocus = false;
- d->gtk_widget_style_get (gtkButton,
- "focus-line-width", &focusWidth,
- "focus-padding", &focusPad,
- "interior-focus", &interiorFocus, NULL);
-
- style = d->gtk_widget_get_style(gtkButton);
-
- QRect buttonRect = option->rect;
-
- QString key;
- if (isDefault) {
- key += QLS("def");
- QGtkStylePrivate::gtk_widget_set_can_default(gtkButton, true);
- QGtkStylePrivate::gtk_window_set_default((GtkWindow*)QGtkStylePrivate::gtk_widget_get_toplevel(gtkButton), gtkButton);
- gtkPainter->paintBox(gtkButton, "buttondefault", buttonRect, state, GTK_SHADOW_IN,
- style, isDefault ? QLS("d") : QString());
- }
-
- bool hasFocus = option->state & State_HasFocus;
-
- if (hasFocus) {
- key += QLS("def");
- QGtkStylePrivate::gtkWidgetSetFocus(gtkButton, true);
- }
-
- if (!interiorFocus)
- buttonRect = buttonRect.adjusted(focusWidth, focusWidth, -focusWidth, -focusWidth);
-
- GtkShadowType shadow = (option->state & State_Sunken || option->state & State_On ) ?
- GTK_SHADOW_IN : GTK_SHADOW_OUT;
-
- gtkPainter->paintBox(gtkButton, "button", buttonRect, state, shadow,
- style, key);
- if (isDefault)
- QGtkStylePrivate::gtk_window_set_default((GtkWindow*)QGtkStylePrivate::gtk_widget_get_toplevel(gtkButton), 0);
- if (hasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkButton, false);
- }
- break;
-
- case PE_IndicatorRadioButton: {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (option->state & State_Sunken)
- state = GTK_STATE_ACTIVE;
-
- if (option->state & State_NoChange)
- shadow = GTK_SHADOW_ETCHED_IN;
- else if (option->state & State_On)
- shadow = GTK_SHADOW_IN;
- else
- shadow = GTK_SHADOW_OUT;
-
- GtkWidget *gtkRadioButton = d->gtkWidget("GtkRadioButton");
- gint spacing;
- d->gtk_widget_style_get(gtkRadioButton, "indicator-spacing", &spacing, NULL);
- QRect buttonRect = option->rect.adjusted(spacing, spacing, -spacing, -spacing);
- gtkPainter->setClipRect(option->rect);
- // ### Note: Ubuntulooks breaks when the proper widget is passed
- // Murrine engine requires a widget not to get RGBA check - warnings
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
- QString key(QLS("radiobutton"));
- if (option->state & State_HasFocus) { // Themes such as Nodoka check this flag
- key += QLatin1Char('f');
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, true);
- }
- gtkPainter->paintOption(gtkCheckButton , buttonRect, state, shadow, d->gtk_widget_get_style(gtkRadioButton), key);
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, false);
- }
- break;
-
- case PE_IndicatorCheckBox: {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (option->state & State_Sunken)
- state = GTK_STATE_ACTIVE;
-
- if (option->state & State_NoChange)
- shadow = GTK_SHADOW_ETCHED_IN;
- else if (option->state & State_On)
- shadow = GTK_SHADOW_IN;
- else
- shadow = GTK_SHADOW_OUT;
-
- int spacing;
-
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
- QString key(QLS("checkbutton"));
- if (option->state & State_HasFocus) { // Themes such as Nodoka checks this flag
- key += QLatin1Char('f');
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, true);
- }
-
- // Some styles such as aero-clone assume they can paint in the spacing area
- gtkPainter->setClipRect(option->rect);
-
- d->gtk_widget_style_get(gtkCheckButton, "indicator-spacing", &spacing, NULL);
-
- QRect checkRect = option->rect.adjusted(spacing, spacing, -spacing, -spacing);
-
- gtkPainter->paintCheckbox(gtkCheckButton, checkRect, state, shadow, d->gtk_widget_get_style(gtkCheckButton),
- key);
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkCheckButton, false);
-
- }
- break;
-
-#ifndef QT_NO_TABBAR
-
- case PE_FrameTabBarBase:
- if (const QStyleOptionTabBarBase *tbb
- = qstyleoption_cast<const QStyleOptionTabBarBase *>(option)) {
- QRect tabRect = tbb->rect;
- painter->save();
- painter->setPen(QPen(option->palette.dark().color().dark(110), 0));
- switch (tbb->shape) {
-
- case QTabBar::RoundedNorth:
- painter->drawLine(tabRect.topLeft(), tabRect.topRight());
- break;
-
- case QTabBar::RoundedWest:
- painter->drawLine(tabRect.left(), tabRect.top(), tabRect.left(), tabRect.bottom());
- break;
-
- case QTabBar::RoundedSouth:
- painter->drawLine(tbb->rect.left(), tbb->rect.bottom(),
- tabRect.right(), tabRect.bottom());
- break;
-
- case QTabBar::RoundedEast:
- painter->drawLine(tabRect.topRight(), tabRect.bottomRight());
- break;
-
- case QTabBar::TriangularNorth:
- case QTabBar::TriangularEast:
- case QTabBar::TriangularWest:
- case QTabBar::TriangularSouth:
- painter->restore();
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- return;
- }
-
- painter->restore();
- }
- return;
-
-#endif // QT_NO_TABBAR
-
- case PE_Widget:
- break;
-
- default:
- QCommonStyle::drawPrimitive(element, option, painter, widget);
- }
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
-
- QPainter *painter, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable()) {
- QCommonStyle::drawComplexControl(control, option, painter, widget);
- return;
- }
-
- GtkStyle* style = d->gtkStyle();
- QGtkPainter* gtkPainter = d->gtkPainter(painter);
- QColor button = option->palette.button().color();
- QColor dark;
- QColor grooveColor;
- QColor darkOutline;
- dark.setHsv(button.hue(),
- qMin(255, (int)(button.saturation()*1.9)),
- qMin(255, (int)(button.value()*0.7)));
- grooveColor.setHsv(button.hue(),
- qMin(255, (int)(button.saturation()*2.6)),
- qMin(255, (int)(button.value()*0.9)));
- darkOutline.setHsv(button.hue(),
- qMin(255, (int)(button.saturation()*3.0)),
- qMin(255, (int)(button.value()*0.6)));
-
- QColor alphaCornerColor;
-
- if (widget)
- alphaCornerColor = mergedColors(option->palette.color(widget->backgroundRole()), darkOutline);
- else
- alphaCornerColor = mergedColors(option->palette.background().color(), darkOutline);
-
- switch (control) {
-
- case CC_TitleBar:
- painter->save();
- if (const QStyleOptionTitleBar *titleBar = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
- // Since this is drawn by metacity and not Gtk we
- // have to do custom drawing
-
- GdkColor gdkBg = style->bg[GTK_STATE_SELECTED];
- QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
-
- const int buttonMargin = 5;
- bool active = (titleBar->titleBarState & State_Active);
- QRect fullRect = titleBar->rect;
- QPalette palette = option->palette;
- QColor highlight = bgColor;
-
- QColor titleBarFrameBorder(active ? highlight.darker(180): dark.darker(110));
- QColor titleBarHighlight(active ? highlight.lighter(120): palette.background().color().lighter(120));
- QColor textColor(active ? 0xffffff : 0xff000000);
- QColor textAlphaColor(active ? 0xffffff : 0xff000000 );
-
- {
- // Fill title bar gradient
- QColor titlebarColor = QColor(active ? highlight: palette.background().color());
- QLinearGradient gradient(option->rect.center().x(), option->rect.top(),
- option->rect.center().x(), option->rect.bottom());
-
- gradient.setColorAt(0, titlebarColor.lighter(114));
- gradient.setColorAt(0.5, titlebarColor.lighter(102));
- gradient.setColorAt(0.51, titlebarColor.darker(104));
- gradient.setColorAt(1, titlebarColor);
- painter->fillRect(option->rect.adjusted(1, 1, -1, 0), gradient);
-
- // Frame and rounded corners
- painter->setPen(titleBarFrameBorder);
-
- // top outline
- painter->drawLine(fullRect.left() + 5, fullRect.top(), fullRect.right() - 5, fullRect.top());
- painter->drawLine(fullRect.left(), fullRect.top() + 4, fullRect.left(), fullRect.bottom());
- const QPoint points[5] = {
- QPoint(fullRect.left() + 4, fullRect.top() + 1),
- QPoint(fullRect.left() + 3, fullRect.top() + 1),
- QPoint(fullRect.left() + 2, fullRect.top() + 2),
- QPoint(fullRect.left() + 1, fullRect.top() + 3),
- QPoint(fullRect.left() + 1, fullRect.top() + 4)
- };
- painter->drawPoints(points, 5);
-
- painter->drawLine(fullRect.right(), fullRect.top() + 4, fullRect.right(), fullRect.bottom());
- const QPoint points2[5] = {
- QPoint(fullRect.right() - 3, fullRect.top() + 1),
- QPoint(fullRect.right() - 4, fullRect.top() + 1),
- QPoint(fullRect.right() - 2, fullRect.top() + 2),
- QPoint(fullRect.right() - 1, fullRect.top() + 3),
- QPoint(fullRect.right() - 1, fullRect.top() + 4)
- };
- painter->drawPoints(points2, 5);
-
- // draw bottomline
- painter->drawLine(fullRect.right(), fullRect.bottom(), fullRect.left(), fullRect.bottom());
-
- // top highlight
- painter->setPen(titleBarHighlight);
- painter->drawLine(fullRect.left() + 6, fullRect.top() + 1, fullRect.right() - 6, fullRect.top() + 1);
- }
- // draw title
- QRect textRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarLabel, widget);
- QFont font = painter->font();
- font.setBold(true);
- painter->setFont(font);
- painter->setPen(active? (titleBar->palette.text().color().lighter(120)) :
- titleBar->palette.text().color() );
- // Note workspace also does elliding but it does not use the correct font
- QString title = QFontMetrics(font).elidedText(titleBar->text, Qt::ElideRight, textRect.width() - 14);
- painter->drawText(textRect.adjusted(1, 1, 1, 1), title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
- painter->setPen(Qt::white);
- if (active)
- painter->drawText(textRect, title, QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
- // min button
- if ((titleBar->subControls & SC_TitleBarMinButton) && (titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) &&
- !(titleBar->titleBarState& Qt::WindowMinimized)) {
- QRect minButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMinButton, widget);
- if (minButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarMinButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, minButtonRect, hover, sunken);
- QRect minButtonIconRect = minButtonRect.adjusted(buttonMargin ,buttonMargin , -buttonMargin, -buttonMargin);
- painter->setPen(textColor);
- painter->drawLine(minButtonIconRect.center().x() - 2, minButtonIconRect.center().y() + 3,
- minButtonIconRect.center().x() + 3, minButtonIconRect.center().y() + 3);
- painter->drawLine(minButtonIconRect.center().x() - 2, minButtonIconRect.center().y() + 4,
- minButtonIconRect.center().x() + 3, minButtonIconRect.center().y() + 4);
- painter->setPen(textAlphaColor);
- painter->drawLine(minButtonIconRect.center().x() - 3, minButtonIconRect.center().y() + 3,
- minButtonIconRect.center().x() - 3, minButtonIconRect.center().y() + 4);
- painter->drawLine(minButtonIconRect.center().x() + 4, minButtonIconRect.center().y() + 3,
- minButtonIconRect.center().x() + 4, minButtonIconRect.center().y() + 4);
- }
- }
- // max button
- if ((titleBar->subControls & SC_TitleBarMaxButton) && (titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) &&
- !(titleBar->titleBarState & Qt::WindowMaximized)) {
- QRect maxButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarMaxButton, widget);
- if (maxButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarMaxButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, maxButtonRect, hover, sunken);
-
- QRect maxButtonIconRect = maxButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
-
- painter->setPen(textColor);
- painter->drawRect(maxButtonIconRect.adjusted(0, 0, -1, -1));
- painter->drawLine(maxButtonIconRect.left() + 1, maxButtonIconRect.top() + 1,
- maxButtonIconRect.right() - 1, maxButtonIconRect.top() + 1);
- painter->setPen(textAlphaColor);
- const QPoint points[4] = {
- maxButtonIconRect.topLeft(),
- maxButtonIconRect.topRight(),
- maxButtonIconRect.bottomLeft(),
- maxButtonIconRect.bottomRight()
- };
- painter->drawPoints(points, 4);
- }
- }
-
- // close button
- if ((titleBar->subControls & SC_TitleBarCloseButton) && (titleBar->titleBarFlags & Qt::WindowSystemMenuHint)) {
- QRect closeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarCloseButton, widget);
- if (closeButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarCloseButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, closeButtonRect, hover, sunken);
- QRect closeIconRect = closeButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
- painter->setPen(textAlphaColor);
- const QLine lines[4] = {
- QLine(closeIconRect.left() + 1, closeIconRect.top(),
- closeIconRect.right(), closeIconRect.bottom() - 1),
- QLine(closeIconRect.left(), closeIconRect.top() + 1,
- closeIconRect.right() - 1, closeIconRect.bottom()),
- QLine(closeIconRect.right() - 1, closeIconRect.top(),
- closeIconRect.left(), closeIconRect.bottom() - 1),
- QLine(closeIconRect.right(), closeIconRect.top() + 1,
- closeIconRect.left() + 1, closeIconRect.bottom())
- };
- painter->drawLines(lines, 4);
- const QPoint points[4] = {
- closeIconRect.topLeft(),
- closeIconRect.topRight(),
- closeIconRect.bottomLeft(),
- closeIconRect.bottomRight()
- };
- painter->drawPoints(points, 4);
-
- painter->setPen(textColor);
- painter->drawLine(closeIconRect.left() + 1, closeIconRect.top() + 1,
- closeIconRect.right() - 1, closeIconRect.bottom() - 1);
- painter->drawLine(closeIconRect.left() + 1, closeIconRect.bottom() - 1,
- closeIconRect.right() - 1, closeIconRect.top() + 1);
- }
- }
-
- // normalize button
- if ((titleBar->subControls & SC_TitleBarNormalButton) &&
- (((titleBar->titleBarFlags & Qt::WindowMinimizeButtonHint) &&
- (titleBar->titleBarState & Qt::WindowMinimized)) ||
- ((titleBar->titleBarFlags & Qt::WindowMaximizeButtonHint) &&
- (titleBar->titleBarState & Qt::WindowMaximized)))) {
- QRect normalButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarNormalButton, widget);
- if (normalButtonRect.isValid()) {
-
- bool hover = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarNormalButton) && (titleBar->state & State_Sunken);
- QRect normalButtonIconRect = normalButtonRect.adjusted(buttonMargin, buttonMargin, -buttonMargin, -buttonMargin);
- qt_gtk_draw_mdibutton(painter, titleBar, normalButtonRect, hover, sunken);
-
- QRect frontWindowRect = normalButtonIconRect.adjusted(0, 3, -3, 0);
- painter->setPen(textColor);
- painter->drawRect(frontWindowRect.adjusted(0, 0, -1, -1));
- painter->drawLine(frontWindowRect.left() + 1, frontWindowRect.top() + 1,
- frontWindowRect.right() - 1, frontWindowRect.top() + 1);
- painter->setPen(textAlphaColor);
- const QPoint points[4] = {
- frontWindowRect.topLeft(),
- frontWindowRect.topRight(),
- frontWindowRect.bottomLeft(),
- frontWindowRect.bottomRight()
- };
- painter->drawPoints(points, 4);
-
- QRect backWindowRect = normalButtonIconRect.adjusted(3, 0, 0, -3);
- QRegion clipRegion = backWindowRect;
- clipRegion -= frontWindowRect;
- painter->save();
- painter->setClipRegion(clipRegion);
- painter->setPen(textColor);
- painter->drawRect(backWindowRect.adjusted(0, 0, -1, -1));
- painter->drawLine(backWindowRect.left() + 1, backWindowRect.top() + 1,
- backWindowRect.right() - 1, backWindowRect.top() + 1);
- painter->setPen(textAlphaColor);
- const QPoint points2[4] = {
- backWindowRect.topLeft(),
- backWindowRect.topRight(),
- backWindowRect.bottomLeft(),
- backWindowRect.bottomRight()
- };
- painter->drawPoints(points2, 4);
- painter->restore();
- }
- }
-
- // context help button
- if (titleBar->subControls & SC_TitleBarContextHelpButton
- && (titleBar->titleBarFlags & Qt::WindowContextHelpButtonHint)) {
- QRect contextHelpButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarContextHelpButton, widget);
- if (contextHelpButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarContextHelpButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, contextHelpButtonRect, hover, sunken);
-
- QColor blend;
- QImage image(qt_titlebar_context_help);
- QColor alpha = textColor;
- alpha.setAlpha(128);
- image.setColor(1, textColor.rgba());
- image.setColor(2, alpha.rgba());
- painter->setRenderHint(QPainter::SmoothPixmapTransform);
- painter->drawImage(contextHelpButtonRect.adjusted(4, 4, -4, -4), image);
- }
- }
-
- // shade button
- if (titleBar->subControls & SC_TitleBarShadeButton && (titleBar->titleBarFlags & Qt::WindowShadeButtonHint)) {
- QRect shadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarShadeButton, widget);
- if (shadeButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarShadeButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, shadeButtonRect, hover, sunken);
- QImage image(qt_scrollbar_button_arrow_up);
- image.setColor(1, textColor.rgba());
- painter->drawImage(shadeButtonRect.adjusted(5, 7, -5, -7), image);
- }
- }
-
- // unshade button
- if (titleBar->subControls & SC_TitleBarUnshadeButton && (titleBar->titleBarFlags & Qt::WindowShadeButtonHint)) {
- QRect unshadeButtonRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarUnshadeButton, widget);
- if (unshadeButtonRect.isValid()) {
- bool hover = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_MouseOver);
- bool sunken = (titleBar->activeSubControls & SC_TitleBarUnshadeButton) && (titleBar->state & State_Sunken);
- qt_gtk_draw_mdibutton(painter, titleBar, unshadeButtonRect, hover, sunken);
- QImage image(qt_scrollbar_button_arrow_down);
- image.setColor(1, textColor.rgba());
- painter->drawImage(unshadeButtonRect.adjusted(5, 7, -5, -7), image);
- }
- }
-
- if ((titleBar->subControls & SC_TitleBarSysMenu) && (titleBar->titleBarFlags & Qt::WindowSystemMenuHint)) {
- QRect iconRect = proxy()->subControlRect(CC_TitleBar, titleBar, SC_TitleBarSysMenu, widget);
- if (iconRect.isValid()) {
- if (!titleBar->icon.isNull()) {
- titleBar->icon.paint(painter, iconRect);
- } else {
- QStyleOption tool(0);
- tool.palette = titleBar->palette;
- QPixmap pm = proxy()->standardIcon(SP_TitleBarMenuButton, &tool, widget).pixmap(16, 16);
- tool.rect = iconRect;
- painter->save();
- proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pm);
- painter->restore();
- }
- }
- }
- }
- painter->restore();
- break;
-
-#ifndef QT_NO_GROUPBOX
-
- case CC_GroupBox:
- painter->save();
-
- if (const QStyleOptionGroupBox *groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
- QRect textRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxLabel, widget);
- QRect checkBoxRect = proxy()->subControlRect(CC_GroupBox, groupBox, SC_GroupBoxCheckBox, widget);
- // Draw title
-
- if ((groupBox->subControls & QStyle::SC_GroupBoxLabel) && !groupBox->text.isEmpty()) {
- // Draw prelight background
- GtkWidget *gtkCheckButton = d->gtkWidget("GtkCheckButton");
-
- if (option->state & State_MouseOver) {
- QRect bgRect = textRect | checkBoxRect;
- gtkPainter->paintFlatBox(gtkCheckButton, "checkbutton", bgRect.adjusted(0, 0, 0, -2),
- GTK_STATE_PRELIGHT, GTK_SHADOW_ETCHED_OUT, d->gtk_widget_get_style(gtkCheckButton));
- }
-
- if (!groupBox->text.isEmpty()) {
- int alignment = int(groupBox->textAlignment);
- if (!proxy()->styleHint(QStyle::SH_UnderlineShortcut, option, widget))
- alignment |= Qt::TextHideMnemonic;
- QColor textColor = groupBox->textColor; // Note: custom textColor is currently ignored
- int labelState = GTK_STATE_INSENSITIVE;
-
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver) ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkCheckButton)->fg[labelState];
- textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- painter->setPen(textColor);
- QFont font = painter->font();
- font.setBold(true);
- painter->setFont(font);
- painter->drawText(textRect, Qt::TextShowMnemonic | Qt::AlignLeft| alignment, groupBox->text);
-
- if (option->state & State_HasFocus)
- gtkPainter->paintFocus(gtkCheckButton, "checkbutton", textRect.adjusted(-4, -1, 0, -3), GTK_STATE_ACTIVE, style);
- }
- }
-
- if (groupBox->subControls & SC_GroupBoxCheckBox) {
- QStyleOptionButton box;
- box.QStyleOption::operator=(*groupBox);
- box.rect = checkBoxRect;
- proxy()->drawPrimitive(PE_IndicatorCheckBox, &box, painter, widget);
- }
- }
-
- painter->restore();
- break;
-#endif // QT_NO_GROUPBOX
-
-#ifndef QT_NO_COMBOBOX
-
- case CC_ComboBox:
- // See: http://live.gnome.org/GnomeArt/Tutorials/GtkThemes/GtkComboBox
- // and http://live.gnome.org/GnomeArt/Tutorials/GtkThemes/GtkComboBoxEntry
- if (const QStyleOptionComboBox *comboBox = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- bool sunken = comboBox->state & State_On; // play dead, if combobox has no items
- BEGIN_STYLE_PIXMAPCACHE(QString::fromLatin1("cb-%0-%1").arg(sunken).arg(comboBox->editable));
- gtkPainter->reset(p);
- gtkPainter->setUsePixmapCache(false); // cached externally
-
- bool isEnabled = (comboBox->state & State_Enabled);
- bool focus = isEnabled && (comboBox->state & State_HasFocus);
- GtkStateType state = qt_gtk_state(option);
- int appears_as_list = !proxy()->styleHint(QStyle::SH_ComboBox_Popup, comboBox, widget);
- QStyleOptionComboBox comboBoxCopy = *comboBox;
- comboBoxCopy.rect = option->rect;
-
- bool reverse = (option->direction == Qt::RightToLeft);
- QRect rect = option->rect;
- QRect arrowButtonRect = proxy()->subControlRect(CC_ComboBox, &comboBoxCopy,
- SC_ComboBoxArrow, widget);
-
- GtkShadowType shadow = (option->state & State_Sunken || option->state & State_On ) ?
- GTK_SHADOW_IN : GTK_SHADOW_OUT;
- const QHashableLatin1Literal comboBoxPath = comboBox->editable ? QHashableLatin1Literal("GtkComboBoxEntry") : QHashableLatin1Literal("GtkComboBox");
-
- // We use the gtk widget to position arrows and separators for us
- GtkWidget *gtkCombo = d->gtkWidget(comboBoxPath);
- GtkAllocation geometry = {0, 0, option->rect.width(), option->rect.height()};
- d->gtk_widget_set_direction(gtkCombo, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- d->gtk_widget_size_allocate(gtkCombo, &geometry);
-
- QHashableLatin1Literal buttonPath = comboBox->editable ? QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton")
- : QHashableLatin1Literal("GtkComboBox.GtkToggleButton");
- GtkWidget *gtkToggleButton = d->gtkWidget(buttonPath);
- d->gtk_widget_set_direction(gtkToggleButton, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- if (gtkToggleButton && (appears_as_list || comboBox->editable)) {
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, true);
- // Draw the combo box as a line edit with a button next to it
- if (comboBox->editable || appears_as_list) {
- GtkStateType frameState = (state == GTK_STATE_PRELIGHT) ? GTK_STATE_NORMAL : state;
- QHashableLatin1Literal entryPath = comboBox->editable ? QHashableLatin1Literal("GtkComboBoxEntry.GtkEntry") : QHashableLatin1Literal("GtkComboBox.GtkFrame");
- GtkWidget *gtkEntry = d->gtkWidget(entryPath);
- d->gtk_widget_set_direction(gtkEntry, reverse ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- QRect frameRect = option->rect;
-
- if (reverse)
- frameRect.setLeft(arrowButtonRect.right());
- else
- frameRect.setRight(arrowButtonRect.left());
-
- // Fill the line edit background
- // We could have used flat_box with "entry_bg" but that is probably not worth the overhead
- uint resolve_mask = option->palette.resolve();
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- QRect contentRect = frameRect.adjusted(gtkEntryStyle->xthickness, gtkEntryStyle->ythickness,
- -gtkEntryStyle->xthickness, -gtkEntryStyle->ythickness);
- // Required for inner blue highlight with clearlooks
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, true);
-
- if (widget && widget->testAttribute(Qt::WA_SetPalette) &&
- resolve_mask & (1 << QPalette::Base)) // Palette overridden by user
- p->fillRect(contentRect, option->palette.base().color());
- else {
- gtkPainter->paintFlatBox(gtkEntry, "entry_bg", contentRect,
- option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE,
- GTK_SHADOW_NONE, gtkEntryStyle, entryPath.toString() + QString::number(focus));
- }
-
- gtkPainter->paintShadow(gtkEntry, comboBox->editable ? "entry" : "frame", frameRect, frameState,
- GTK_SHADOW_IN, gtkEntryStyle, entryPath.toString() +
- QString::number(focus) + QString::number(comboBox->editable) +
- QString::number(option->direction));
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkEntry, false);
- }
-
- GtkStateType buttonState = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled))
- buttonState = GTK_STATE_INSENSITIVE;
- else if (option->state & State_Sunken || option->state & State_On)
- buttonState = GTK_STATE_ACTIVE;
- else if (option->state & State_MouseOver && comboBox->activeSubControls & SC_ComboBoxArrow)
- buttonState = GTK_STATE_PRELIGHT;
-
- Q_ASSERT(gtkToggleButton);
- gtkPainter->paintBox(gtkToggleButton, "button", arrowButtonRect, buttonState,
- shadow, d->gtk_widget_get_style(gtkToggleButton), buttonPath.toString() +
- QString::number(focus) + QString::number(option->direction));
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, false);
- } else {
- // Draw combo box as a button
- QRect buttonRect = option->rect;
- GtkStyle *gtkToggleButtonStyle = d->gtk_widget_get_style(gtkToggleButton);
-
- if (focus) // Clearlooks actually check the widget for the default state
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, true);
- gtkPainter->paintBox(gtkToggleButton, "button",
- buttonRect, state,
- shadow, gtkToggleButtonStyle,
- buttonPath.toString() + QString::number(focus));
- if (focus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkToggleButton, false);
-
-
- // Draw the separator between label and arrows
- QHashableLatin1Literal vSeparatorPath = comboBox->editable
- ? QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton.GtkHBox.GtkVSeparator")
- : QHashableLatin1Literal("GtkComboBox.GtkToggleButton.GtkHBox.GtkVSeparator");
-
- if (GtkWidget *gtkVSeparator = d->gtkWidget(vSeparatorPath)) {
- GtkAllocation allocation;
- d->gtk_widget_get_allocation(gtkVSeparator, &allocation);
- QRect vLineRect(allocation.x, allocation.y, allocation.width, allocation.height);
-
- gtkPainter->paintVline(gtkVSeparator, "vseparator",
- vLineRect, state, d->gtk_widget_get_style(gtkVSeparator),
- 0, vLineRect.height(), 0, vSeparatorPath.toString());
-
-
- gint interiorFocus = true;
- d->gtk_widget_style_get(gtkToggleButton, "interior-focus", &interiorFocus, NULL);
- int xt = interiorFocus ? gtkToggleButtonStyle->xthickness : 0;
- int yt = interiorFocus ? gtkToggleButtonStyle->ythickness : 0;
- if (focus && ((option->state & State_KeyboardFocusChange) || styleHint(SH_UnderlineShortcut, option, widget)))
- gtkPainter->paintFocus(gtkToggleButton, "button",
- option->rect.adjusted(xt, yt, -xt, -yt),
- option->state & State_Sunken ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL,
- gtkToggleButtonStyle);
- }
- }
-
- if (comboBox->subControls & SC_ComboBoxArrow) {
- if (!isEnabled)
- state = GTK_STATE_INSENSITIVE;
- else if (sunken)
- state = GTK_STATE_ACTIVE;
- else if (option->state & State_MouseOver)
- state = GTK_STATE_PRELIGHT;
- else
- state = GTK_STATE_NORMAL;
-
- QHashableLatin1Literal arrowPath("");
- if (comboBox->editable) {
- if (appears_as_list)
- arrowPath = QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton.GtkArrow");
- else
- arrowPath = QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton.GtkHBox.GtkArrow");
- } else {
- if (appears_as_list)
- arrowPath = QHashableLatin1Literal("GtkComboBox.GtkToggleButton.GtkArrow");
- else
- arrowPath = QHashableLatin1Literal("GtkComboBox.GtkToggleButton.GtkHBox.GtkArrow");
- }
-
- GtkWidget *gtkArrow = d->gtkWidget(arrowPath);
- gfloat scale = 0.7;
- gint minSize = 15;
- QRect arrowWidgetRect;
-
- if (gtkArrow && !d->gtk_check_version(2, 12, 0)) {
- d->gtk_widget_style_get(gtkArrow, "arrow-scaling", &scale, NULL);
- d->gtk_widget_style_get(gtkCombo, "arrow-size", &minSize, NULL);
- }
- if (gtkArrow) {
- GtkAllocation allocation;
- d->gtk_widget_get_allocation(gtkArrow, &allocation);
- arrowWidgetRect = QRect(allocation.x, allocation.y, allocation.width, allocation.height);
- style = d->gtk_widget_get_style(gtkArrow);
- }
-
- // Note that for some reason the arrow-size is not properly respected with Hildon
- // Hence we enforce the minimum "arrow-size" ourselves
- int arrowSize = qMax(qMin(rect.height() - d->gtk_widget_get_style(gtkCombo)->ythickness * 2, minSize),
- qMin(arrowWidgetRect.width(), arrowWidgetRect.height()));
- QRect arrowRect(0, 0, static_cast<int>(arrowSize * scale), static_cast<int>(arrowSize * scale));
-
- arrowRect.moveCenter(arrowWidgetRect.center());
-
- if (sunken) {
- int xoff, yoff;
- const QHashableLatin1Literal toggleButtonPath = comboBox->editable
- ? QHashableLatin1Literal("GtkComboBoxEntry.GtkToggleButton")
- : QHashableLatin1Literal("GtkComboBox.GtkToggleButton");
-
- GtkWidget *gtkButton = d->gtkWidget(toggleButtonPath);
- d->gtk_widget_style_get(gtkButton, "child-displacement-x", &xoff, NULL);
- d->gtk_widget_style_get(gtkButton, "child-displacement-y", &yoff, NULL);
- arrowRect = arrowRect.adjusted(xoff, yoff, xoff, yoff);
- }
-
- // Some styles such as Nimbus paint outside the arrowRect
- // hence we have provide the whole widget as the cliprect
- if (gtkArrow) {
- gtkPainter->setClipRect(option->rect);
- gtkPainter->paintArrow(gtkArrow, "arrow", arrowRect,
- GTK_ARROW_DOWN, state, GTK_SHADOW_NONE, true,
- style, arrowPath.toString() + QString::number(option->direction));
- }
- }
- END_STYLE_PIXMAPCACHE;
- }
- break;
-#endif // QT_NO_COMBOBOX
-#ifndef QT_NO_TOOLBUTTON
-
- case CC_ToolButton:
- if (const QStyleOptionToolButton *toolbutton
- = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
- QRect button, menuarea;
- button = proxy()->subControlRect(control, toolbutton, SC_ToolButton, widget);
- menuarea = proxy()->subControlRect(control, toolbutton, SC_ToolButtonMenu, widget);
- State bflags = toolbutton->state & ~(State_Sunken | State_MouseOver);
-
- if (bflags & State_AutoRaise)
- if (!(bflags & State_MouseOver))
- bflags &= ~State_Raised;
-
- State mflags = bflags;
-
- if (toolbutton->state & State_Sunken) {
- if (toolbutton->activeSubControls & SC_ToolButton)
- bflags |= State_Sunken;
- if (toolbutton->activeSubControls & SC_ToolButtonMenu)
- mflags |= State_Sunken;
- } else if (toolbutton->state & State_MouseOver) {
- if (toolbutton->activeSubControls & SC_ToolButton)
- bflags |= State_MouseOver;
- if (toolbutton->activeSubControls & SC_ToolButtonMenu)
- mflags |= State_MouseOver;
- }
-
- QStyleOption tool(0);
-
- tool.palette = toolbutton->palette;
-
- if (toolbutton->subControls & SC_ToolButton) {
- if (bflags & (State_Sunken | State_On | State_Raised | State_MouseOver)) {
- tool.rect = button;
- tool.state = bflags;
- proxy()->drawPrimitive(PE_PanelButtonTool, &tool, painter, widget);
- }
- }
-
- bool drawMenuArrow = toolbutton->features & QStyleOptionToolButton::HasMenu &&
- !(toolbutton->features & QStyleOptionToolButton::MenuButtonPopup);
- int popupArrowSize = drawMenuArrow ? 7 : 0;
-
- if (toolbutton->state & State_HasFocus) {
- QStyleOptionFocusRect fr;
- fr.QStyleOption::operator=(*toolbutton);
- fr.rect = proxy()->subControlRect(CC_ToolButton, toolbutton, SC_ToolButton, widget);
- fr.rect.adjust(1, 1, -1, -1);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fr, painter, widget);
- }
-
- QStyleOptionToolButton label = *toolbutton;
- label.state = bflags;
- GtkWidget *gtkButton = d->gtkWidget("GtkToolButton.GtkButton");
- QPalette pal = toolbutton->palette;
- if (option->state & State_Enabled &&
- option->state & State_MouseOver && !(widget && widget->testAttribute(Qt::WA_SetPalette))) {
- GdkColor gdkText = d->gtk_widget_get_style(gtkButton)->fg[GTK_STATE_PRELIGHT];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- pal.setBrush(QPalette::All, QPalette::ButtonText, textColor);
- label.palette = pal;
- }
- label.rect = button.adjusted(style->xthickness, style->ythickness,
- -style->xthickness - popupArrowSize, -style->ythickness);
- proxy()->drawControl(CE_ToolButtonLabel, &label, painter, widget);
-
- if (toolbutton->subControls & SC_ToolButtonMenu) {
- tool.rect = menuarea;
- tool.state = mflags;
- if ((mflags & State_Enabled && (mflags & (State_Sunken | State_Raised | State_MouseOver))) || !(mflags & State_AutoRaise))
- proxy()->drawPrimitive(PE_IndicatorButtonDropDown, &tool, painter, widget);
-
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &tool, painter, widget);
-
- } else if (drawMenuArrow) {
- QRect ir = toolbutton->rect;
- QStyleOptionToolButton newBtn = *toolbutton;
- newBtn.rect = QRect(ir.right() - popupArrowSize - style->xthickness - 3, ir.height()/2 - 1, popupArrowSize, popupArrowSize);
- proxy()->drawPrimitive(PE_IndicatorArrowDown, &newBtn, painter, widget);
- }
- }
- break;
-
-#endif // QT_NO_TOOLBUTTON
-#ifndef QT_NO_SCROLLBAR
-
- case CC_ScrollBar:
- if (const QStyleOptionSlider *scrollBar = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- GtkWidget *gtkHScrollBar = d->gtkWidget("GtkHScrollbar");
- GtkWidget *gtkVScrollBar = d->gtkWidget("GtkVScrollbar");
-
- // Fill background in case the scrollbar is partially transparent
- painter->fillRect(option->rect, option->palette.background());
-
- QRect rect = scrollBar->rect;
- QRect scrollBarSubLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSubLine, widget);
- QRect scrollBarAddLine = proxy()->subControlRect(control, scrollBar, SC_ScrollBarAddLine, widget);
- QRect scrollBarSlider = proxy()->subControlRect(control, scrollBar, SC_ScrollBarSlider, widget);
- QRect grooveRect = proxy()->subControlRect(control, scrollBar, SC_ScrollBarGroove, widget);
- bool horizontal = scrollBar->orientation == Qt::Horizontal;
- GtkWidget * scrollbarWidget = horizontal ? gtkHScrollBar : gtkVScrollBar;
- style = d->gtk_widget_get_style(scrollbarWidget);
- gboolean trough_under_steppers = true;
- gboolean trough_side_details = false;
- gboolean activate_slider = false;
- gboolean stepper_size = 14;
- gint trough_border = 1;
- if (!d->gtk_check_version(2, 10, 0)) {
- d->gtk_widget_style_get((GtkWidget*)(scrollbarWidget),
- "trough-border", &trough_border,
- "trough-side-details", &trough_side_details,
- "trough-under-steppers", &trough_under_steppers,
- "activate-slider", &activate_slider,
- "stepper-size", &stepper_size, NULL);
- }
- if (trough_under_steppers) {
- scrollBarAddLine.adjust(trough_border, trough_border, -trough_border, -trough_border);
- scrollBarSubLine.adjust(trough_border, trough_border, -trough_border, -trough_border);
- scrollBarSlider.adjust(horizontal ? -trough_border : 0, horizontal ? 0 : -trough_border,
- horizontal ? trough_border : 0, horizontal ? 0 : trough_border);
- }
-
- // Some styles check the position of scrollbars in order to determine
- // if lines should be painted when the scrollbar is in max or min positions.
- int maximum = 2;
- int fakePos = 0;
- bool reverse = (option->direction == Qt::RightToLeft);
- if (scrollBar->minimum == scrollBar->maximum)
- maximum = 0;
- if (scrollBar->sliderPosition == scrollBar->maximum)
- fakePos = maximum;
- else if (scrollBar->sliderPosition > scrollBar->minimum)
- fakePos = maximum - 1;
-
-
- GtkRange *range = (GtkRange*)(horizontal ? gtkHScrollBar : gtkVScrollBar);
- GtkAdjustment *adjustment = 0;
-
- if (d->gtk_adjustment_configure)
- adjustment = d->gtk_range_get_adjustment(range);
- if (adjustment) {
- d->gtk_adjustment_configure(adjustment, fakePos, 0, maximum, 0, 0, 0);
- } else {
- adjustment = (GtkAdjustment*)d->gtk_adjustment_new(fakePos, 0, maximum, 0, 0, 0);
- d->gtk_range_set_adjustment(range, adjustment);
- }
-
- if (scrollBar->subControls & SC_ScrollBarGroove) {
- GtkStateType state = GTK_STATE_ACTIVE;
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
-
- if (trough_under_steppers)
- grooveRect = option->rect;
-
- gtkPainter->paintBox(scrollbarWidget, "trough", grooveRect, state, GTK_SHADOW_IN, style);
- }
-
- //paint slider
- if (scrollBar->subControls & SC_ScrollBarSlider) {
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (activate_slider &&
- option->state & State_Sunken && (scrollBar->activeSubControls & SC_ScrollBarSlider))
- state = GTK_STATE_ACTIVE;
- else if (option->state & State_MouseOver && (scrollBar->activeSubControls & SC_ScrollBarSlider))
- state = GTK_STATE_PRELIGHT;
-
- GtkShadowType shadow = GTK_SHADOW_OUT;
-
- if (trough_under_steppers) {
- if (!horizontal)
- scrollBarSlider.adjust(trough_border, 0, -trough_border, 0);
- else
- scrollBarSlider.adjust(0, trough_border, 0, -trough_border);
- }
-
- gtkPainter->paintSlider(scrollbarWidget, "slider", scrollBarSlider, state, shadow, style,
- horizontal ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL, QString(QLS("%0%1")).arg(fakePos).arg(maximum));
- }
-
- if (scrollBar->subControls & SC_ScrollBarAddLine) {
- GtkAllocation vAllocation;
- vAllocation.y = scrollBarAddLine.top();
- vAllocation.height = scrollBarAddLine.height() - rect.height() + 6;
- d->gtk_widget_set_allocation(gtkVScrollBar, &vAllocation);
-
- GtkAllocation hAllocation;
- hAllocation.x = scrollBarAddLine.right();
- hAllocation.width = scrollBarAddLine.width() - rect.width();
- d->gtk_widget_set_allocation(gtkHScrollBar, &hAllocation);
-
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled) || (fakePos == maximum))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_Sunken && (scrollBar->activeSubControls & SC_ScrollBarAddLine)) {
- state = GTK_STATE_ACTIVE;
- shadow = GTK_SHADOW_IN;
-
- } else if (option->state & State_MouseOver && (scrollBar->activeSubControls & SC_ScrollBarAddLine))
- state = GTK_STATE_PRELIGHT;
-
- gtkPainter->paintBox(scrollbarWidget,
- horizontal ? "hscrollbar" : "vscrollbar", scrollBarAddLine,
- state, shadow, style, QLS("add"));
-
- gtkPainter->paintArrow(scrollbarWidget, horizontal ? "hscrollbar" : "vscrollbar", scrollBarAddLine.adjusted(4, 4, -4, -4),
- horizontal ? (reverse ? GTK_ARROW_LEFT : GTK_ARROW_RIGHT) :
- GTK_ARROW_DOWN, state, GTK_SHADOW_NONE, false, style);
- }
-
- if (scrollBar->subControls & SC_ScrollBarSubLine) {
- GtkAllocation vAllocation;
- vAllocation.y = 0;
- vAllocation.height = scrollBarSubLine.height();
- d->gtk_widget_set_allocation(gtkVScrollBar, &vAllocation);
-
- GtkAllocation hAllocation;
- hAllocation.x = 0;
- hAllocation.width = scrollBarSubLine.width();
- d->gtk_widget_set_allocation(gtkHScrollBar, &hAllocation);
-
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled) || (fakePos == 0))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_Sunken && (scrollBar->activeSubControls & SC_ScrollBarSubLine)) {
- shadow = GTK_SHADOW_IN;
- state = GTK_STATE_ACTIVE;
-
- } else if (option->state & State_MouseOver && (scrollBar->activeSubControls & SC_ScrollBarSubLine))
- state = GTK_STATE_PRELIGHT;
-
- gtkPainter->paintBox(scrollbarWidget, horizontal ? "hscrollbar" : "vscrollbar", scrollBarSubLine,
- state, shadow, style, QLS("sub"));
-
- gtkPainter->paintArrow(scrollbarWidget, horizontal ? "hscrollbar" : "vscrollbar", scrollBarSubLine.adjusted(4, 4, -4, -4),
- horizontal ? (reverse ? GTK_ARROW_RIGHT : GTK_ARROW_LEFT) :
- GTK_ARROW_UP, state, GTK_SHADOW_NONE, false, style);
- }
- }
- break;
-
-#endif //QT_NO_SCROLLBAR
-#ifndef QT_NO_SPINBOX
-
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinBox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
-
- GtkWidget *gtkSpinButton = spinBox->buttonSymbols == QAbstractSpinBox::NoButtons
- ? d->gtkWidget("GtkEntry")
- : d->gtkWidget("GtkSpinButton");
- bool isEnabled = (spinBox->state & State_Enabled);
- bool hover = isEnabled && (spinBox->state & State_MouseOver);
- bool sunken = (spinBox->state & State_Sunken);
- bool upIsActive = (spinBox->activeSubControls == SC_SpinBoxUp);
- bool downIsActive = (spinBox->activeSubControls == SC_SpinBoxDown);
- bool reverse = (spinBox->direction == Qt::RightToLeft);
-
- QRect editArea = option->rect;
- QRect editRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxEditField, widget);
- QRect upRect, downRect, buttonRect;
- if (spinBox->buttonSymbols != QAbstractSpinBox::NoButtons) {
- upRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxUp, widget);
- downRect = proxy()->subControlRect(CC_SpinBox, option, SC_SpinBoxDown, widget);
-
- //### Move this to subControlRect
- upRect.setTop(option->rect.top());
-
- if (reverse)
- upRect.setLeft(option->rect.left());
- else
- upRect.setRight(option->rect.right());
-
- downRect.setBottom(option->rect.bottom());
-
- if (reverse)
- downRect.setLeft(option->rect.left());
- else
- downRect.setRight(option->rect.right());
-
- buttonRect = upRect | downRect;
-
- if (reverse)
- editArea.setLeft(upRect.right());
- else
- editArea.setRight(upRect.left());
- }
- if (spinBox->frame) {
- GtkStateType state = qt_gtk_state(option);
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_HasFocus)
- state = GTK_STATE_NORMAL;
- else if (state == GTK_STATE_PRELIGHT)
- state = GTK_STATE_NORMAL;
-
- style = d->gtk_widget_get_style(gtkSpinButton);
-
-
- QString key;
-
- if (option->state & State_HasFocus) {
- key += QLatin1Char('f');
- QGtkStylePrivate::gtkWidgetSetFocus(gtkSpinButton, true);
- }
-
- uint resolve_mask = option->palette.resolve();
-
- if (resolve_mask & (1 << QPalette::Base)) // Palette overridden by user
- painter->fillRect(editRect, option->palette.base().color());
- else
- gtkPainter->paintFlatBox(gtkSpinButton, "entry_bg", editArea.adjusted(style->xthickness, style->ythickness,
- -style->xthickness, -style->ythickness),
- option->state & State_Enabled ?
- GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE, GTK_SHADOW_NONE, style, key);
-
- gtkPainter->paintShadow(gtkSpinButton, "entry", editArea, state, GTK_SHADOW_IN, d->gtk_widget_get_style(gtkSpinButton), key);
- if (spinBox->buttonSymbols != QAbstractSpinBox::NoButtons) {
- gtkPainter->paintBox(gtkSpinButton, "spinbutton", buttonRect, state, GTK_SHADOW_IN, style, key);
-
- upRect.setSize(downRect.size());
- if (!(option->state & State_Enabled))
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_INSENSITIVE, GTK_SHADOW_IN, style, key);
- else if (upIsActive && sunken)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_ACTIVE, GTK_SHADOW_IN, style, key);
- else if (upIsActive && hover)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, style, key);
- else
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_up", upRect, GTK_STATE_NORMAL, GTK_SHADOW_OUT, style, key);
-
- if (!(option->state & State_Enabled))
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_INSENSITIVE, GTK_SHADOW_IN, style, key);
- else if (downIsActive && sunken)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_ACTIVE, GTK_SHADOW_IN, style, key);
- else if (downIsActive && hover)
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, style, key);
- else
- gtkPainter->paintBox(gtkSpinButton, "spinbutton_down", downRect, GTK_STATE_NORMAL, GTK_SHADOW_OUT, style, key);
-
- if (option->state & State_HasFocus)
- QGtkStylePrivate::gtkWidgetSetFocus(gtkSpinButton, false);
- }
- }
-
- if (spinBox->buttonSymbols == QAbstractSpinBox::PlusMinus) {
- int centerX = upRect.center().x();
- int centerY = upRect.center().y();
- // plus/minus
-
- if (spinBox->activeSubControls == SC_SpinBoxUp && sunken) {
- painter->drawLine(1 + centerX - 2, 1 + centerY, 1 + centerX + 2, 1 + centerY);
- painter->drawLine(1 + centerX, 1 + centerY - 2, 1 + centerX, 1 + centerY + 2);
-
- } else {
- painter->drawLine(centerX - 2, centerY, centerX + 2, centerY);
- painter->drawLine(centerX, centerY - 2, centerX, centerY + 2);
- }
- centerX = downRect.center().x();
- centerY = downRect.center().y();
-
- if (spinBox->activeSubControls == SC_SpinBoxDown && sunken) {
- painter->drawLine(1 + centerX - 2, 1 + centerY, 1 + centerX + 2, 1 + centerY);
- } else {
- painter->drawLine(centerX - 2, centerY, centerX + 2, centerY);
- }
-
- } else if (spinBox->buttonSymbols == QAbstractSpinBox::UpDownArrows) {
- int size = d->getSpinboxArrowSize();
- int w = size / 2 - 1;
- w -= w % 2 - 1; // force odd
- int h = (w + 1)/2;
- QRect arrowRect(0, 0, w, h);
- arrowRect.moveCenter(upRect.center());
- // arrows
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled) || !(spinBox->stepEnabled & QAbstractSpinBox::StepUpEnabled))
- state = GTK_STATE_INSENSITIVE;
-
- gtkPainter->paintArrow(gtkSpinButton, "spinbutton", arrowRect, GTK_ARROW_UP, state,
- GTK_SHADOW_NONE, false, style);
-
- arrowRect.moveCenter(downRect.center());
-
- if (!(option->state & State_Enabled) || !(spinBox->stepEnabled & QAbstractSpinBox::StepDownEnabled))
- state = GTK_STATE_INSENSITIVE;
-
- gtkPainter->paintArrow(gtkSpinButton, "spinbutton", arrowRect, GTK_ARROW_DOWN, state,
- GTK_SHADOW_NONE, false, style);
- }
- }
- break;
-
-#endif // QT_NO_SPINBOX
-
-#ifndef QT_NO_SLIDER
-
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- GtkWidget *hScaleWidget = d->gtkWidget("GtkHScale");
- GtkWidget *vScaleWidget = d->gtkWidget("GtkVScale");
-
- QRect groove = proxy()->subControlRect(CC_Slider, option, SC_SliderGroove, widget);
- QRect handle = proxy()->subControlRect(CC_Slider, option, SC_SliderHandle, widget);
-
- bool horizontal = slider->orientation == Qt::Horizontal;
- bool ticksAbove = slider->tickPosition & QSlider::TicksAbove;
- bool ticksBelow = slider->tickPosition & QSlider::TicksBelow;
-
- QBrush oldBrush = painter->brush();
- QPen oldPen = painter->pen();
-
- QColor shadowAlpha(Qt::black);
- shadowAlpha.setAlpha(10);
- QColor highlightAlpha(Qt::white);
- highlightAlpha.setAlpha(80);
-
- QGtkStylePrivate::gtk_widget_set_direction(hScaleWidget, slider->upsideDown ?
- GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- GtkWidget *scaleWidget = horizontal ? hScaleWidget : vScaleWidget;
- style = d->gtk_widget_get_style(scaleWidget);
-
- if ((option->subControls & SC_SliderGroove) && groove.isValid()) {
-
- GtkRange *range = (GtkRange*)scaleWidget;
- GtkAdjustment *adjustment = 0;
- if (d->gtk_adjustment_configure)
- adjustment = d->gtk_range_get_adjustment(range);
- if (adjustment) {
- d->gtk_adjustment_configure(adjustment,
- slider->sliderPosition,
- slider->minimum,
- slider->maximum,
- slider->singleStep,
- slider->singleStep,
- slider->pageStep);
- } else {
- adjustment = (GtkAdjustment*)d->gtk_adjustment_new(slider->sliderPosition,
- slider->minimum,
- slider->maximum,
- slider->singleStep,
- slider->singleStep,
- slider->pageStep);
- d->gtk_range_set_adjustment(range, adjustment);
- }
-
- int outerSize;
- d->gtk_range_set_inverted(range, !horizontal);
- d->gtk_widget_style_get(scaleWidget, "trough-border", &outerSize, NULL);
- outerSize++;
-
- GtkStateType state = qt_gtk_state(option);
- int focusFrameMargin = 2;
- QRect grooveRect = option->rect.adjusted(focusFrameMargin, outerSize + focusFrameMargin,
- -focusFrameMargin, -outerSize - focusFrameMargin);
-
- gboolean trough_side_details = false; // Indicates if the upper or lower scale background differs
- if (!d->gtk_check_version(2, 10, 0))
- d->gtk_widget_style_get((GtkWidget*)(scaleWidget), "trough-side-details", &trough_side_details, NULL);
-
- if (!trough_side_details) {
- gtkPainter->paintBox(scaleWidget, "trough", grooveRect, state,
- GTK_SHADOW_IN, style, QString(QLS("p%0")).arg(slider->sliderPosition));
- } else {
- QRect upperGroove = grooveRect;
- QRect lowerGroove = grooveRect;
-
- if (horizontal) {
- if (slider->upsideDown) {
- lowerGroove.setLeft(handle.center().x());
- upperGroove.setRight(handle.center().x());
- } else {
- upperGroove.setLeft(handle.center().x());
- lowerGroove.setRight(handle.center().x());
- }
- } else {
- if (!slider->upsideDown) {
- lowerGroove.setBottom(handle.center().y());
- upperGroove.setTop(handle.center().y());
- } else {
- upperGroove.setBottom(handle.center().y());
- lowerGroove.setTop(handle.center().y());
- }
- }
-
- gtkPainter->paintBox(scaleWidget, "trough-upper", upperGroove, state,
- GTK_SHADOW_IN, style, QString(QLS("p%0")).arg(slider->sliderPosition));
- gtkPainter->paintBox(scaleWidget, "trough-lower", lowerGroove, state,
- GTK_SHADOW_IN, style, QString(QLS("p%0")).arg(slider->sliderPosition));
- }
- }
-
- if (option->subControls & SC_SliderTickmarks) {
- painter->setPen(darkOutline);
- int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget);
- int available = proxy()->pixelMetric(PM_SliderSpaceAvailable, slider, widget);
- int interval = slider->tickInterval;
-
- if (interval <= 0) {
- interval = slider->singleStep;
-
- if (QStyle::sliderPositionFromValue(slider->minimum, slider->maximum, interval,
- available)
- - QStyle::sliderPositionFromValue(slider->minimum, slider->maximum,
- 0, available) < 3)
- interval = slider->pageStep;
- }
-
- if (interval <= 0)
- interval = 1;
-
- int v = slider->minimum;
- int len = proxy()->pixelMetric(PM_SliderLength, slider, widget);
- while (v <= slider->maximum + 1) {
- if (v == slider->maximum + 1 && interval == 1)
- break;
- const int v_ = qMin(v, slider->maximum);
- int pos = sliderPositionFromValue(slider->minimum, slider->maximum,
- v_, (horizontal
- ? slider->rect.width()
- : slider->rect.height()) - len,
- slider->upsideDown) + len / 2;
- int extra = 2 - ((v_ == slider->minimum || v_ == slider->maximum) ? 1 : 0);
- if (horizontal) {
- if (ticksAbove)
- painter->drawLine(pos, slider->rect.top() + extra,
- pos, slider->rect.top() + tickSize);
- if (ticksBelow)
- painter->drawLine(pos, slider->rect.bottom() - extra,
- pos, slider->rect.bottom() - tickSize);
-
- } else {
- if (ticksAbove)
- painter->drawLine(slider->rect.left() + extra, pos,
- slider->rect.left() + tickSize, pos);
- if (ticksBelow)
- painter->drawLine(slider->rect.right() - extra, pos,
- slider->rect.right() - tickSize, pos);
- }
-
- // In the case where maximum is max int
- int nextInterval = v + interval;
- if (nextInterval < v)
- break;
- v = nextInterval;
- }
- }
-
- // Draw slider handle
- if (option->subControls & SC_SliderHandle) {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_NORMAL;
-
- if (!(option->state & State_Enabled))
- state = GTK_STATE_INSENSITIVE;
- else if (option->state & State_MouseOver && option->activeSubControls & SC_SliderHandle)
- state = GTK_STATE_PRELIGHT;
-
- bool horizontal = option->state & State_Horizontal;
-
- if (slider->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*slider);
- fropt.rect = slider->rect.adjusted(-1, -1 ,1, 1);
-
- if (horizontal) {
- fropt.rect.setTop(handle.top() - 3);
- fropt.rect.setBottom(handle.bottom() + 4);
-
- } else {
- fropt.rect.setLeft(handle.left() - 3);
- fropt.rect.setRight(handle.right() + 3);
- }
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
- }
- gtkPainter->paintSlider(scaleWidget, horizontal ? "hscale" : "vscale", handle, state, shadow, style,
- horizontal ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL);
- }
- painter->setBrush(oldBrush);
- painter->setPen(oldPen);
- }
- break;
- case CC_Dial:
- if (const QStyleOptionSlider *dial = qstyleoption_cast<const QStyleOptionSlider *>(option))
- QStyleHelper::drawDial(dial, painter);
- break;
-
-#endif // QT_NO_SLIDER
-
- default:
- QCommonStyle::drawComplexControl(control, option, painter, widget);
-
- break;
- }
-}
-
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawControl(ControlElement element,
- const QStyleOption *option,
- QPainter *painter,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable()) {
- QCommonStyle::drawControl(element, option, painter, widget);
- return;
- }
-
- GtkStyle* style = d->gtkStyle();
- QGtkPainter* gtkPainter = d->gtkPainter(painter);
-
- switch (element) {
- case CE_ProgressBarLabel:
- if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- GtkWidget *gtkProgressBar = d->gtkWidget("GtkProgressBar");
- if (!gtkProgressBar)
- return;
-
- QRect leftRect;
- QRect rect = bar->rect;
- GtkStyle *gtkProgressBarStyle = d->gtk_widget_get_style(gtkProgressBar);
- GdkColor gdkText = gtkProgressBarStyle->fg[GTK_STATE_NORMAL];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- gdkText = gtkProgressBarStyle->fg[GTK_STATE_PRELIGHT];
- QColor alternateTextColor= QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
-
- painter->save();
- bool vertical = false, inverted = false;
- if (const QStyleOptionProgressBarV2 *bar2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) {
- vertical = (bar2->orientation == Qt::Vertical);
- inverted = bar2->invertedAppearance;
- }
- if (vertical)
- rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // flip width and height
- const int progressIndicatorPos = (bar->progress - qreal(bar->minimum)) * rect.width() /
- qMax(qreal(1.0), qreal(bar->maximum) - bar->minimum);
- if (progressIndicatorPos >= 0 && progressIndicatorPos <= rect.width())
- leftRect = QRect(rect.left(), rect.top(), progressIndicatorPos, rect.height());
- if (vertical)
- leftRect.translate(rect.width() - progressIndicatorPos, 0);
-
- bool flip = (!vertical && (((bar->direction == Qt::RightToLeft) && !inverted) ||
- ((bar->direction == Qt::LeftToRight) && inverted)));
-
- QRegion rightRect = rect;
- rightRect = rightRect.subtracted(leftRect);
- painter->setClipRegion(rightRect);
- painter->setPen(flip ? alternateTextColor : textColor);
- painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter));
- if (!leftRect.isNull()) {
- painter->setPen(flip ? textColor : alternateTextColor);
- painter->setClipRect(leftRect);
- painter->drawText(rect, bar->text, QTextOption(Qt::AlignAbsolute | Qt::AlignHCenter | Qt::AlignVCenter));
- }
- painter->restore();
- }
- break;
- case CE_PushButtonLabel:
- if (const QStyleOptionButton *button = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- QRect ir = button->rect;
- uint tf = Qt::AlignVCenter | Qt::TextShowMnemonic;
- QPoint buttonShift;
-
- if (option->state & State_Sunken)
- buttonShift = QPoint(pixelMetric(PM_ButtonShiftHorizontal, option, widget),
- proxy()->pixelMetric(PM_ButtonShiftVertical, option, widget));
-
- if (proxy()->styleHint(SH_UnderlineShortcut, button, widget))
- tf |= Qt::TextShowMnemonic;
- else
- tf |= Qt::TextHideMnemonic;
-
- if (!button->icon.isNull()) {
- //Center both icon and text
- QPoint point;
-
- QIcon::Mode mode = button->state & State_Enabled ? QIcon::Normal : QIcon::Disabled;
- if (mode == QIcon::Normal && button->state & State_HasFocus)
- mode = QIcon::Active;
-
- QIcon::State state = QIcon::Off;
-
- if (button->state & State_On)
- state = QIcon::On;
-
- QPixmap pixmap = button->icon.pixmap(button->iconSize, mode, state);
- int w = pixmap.width();
- int h = pixmap.height();
-
- if (!button->text.isEmpty())
- w += button->fontMetrics.boundingRect(option->rect, tf, button->text).width() + 4;
-
- point = QPoint(ir.x() + ir.width() / 2 - w / 2,
- ir.y() + ir.height() / 2 - h / 2);
-
- if (button->direction == Qt::RightToLeft)
- point.rx() += pixmap.width();
-
- painter->drawPixmap(visualPos(button->direction, button->rect, point + buttonShift), pixmap);
-
- if (button->direction == Qt::RightToLeft)
- ir.translate(-point.x() - 2, 0);
- else
- ir.translate(point.x() + pixmap.width() + 2, 0);
-
- // left-align text if there is
- if (!button->text.isEmpty())
- tf |= Qt::AlignLeft;
-
- } else {
- tf |= Qt::AlignHCenter;
- }
-
- ir.translate(buttonShift);
-
- if (button->features & QStyleOptionButton::HasMenu)
- ir = ir.adjusted(0, 0, -pixelMetric(PM_MenuButtonIndicator, button, widget), 0);
-
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- QPalette pal = button->palette;
- int labelState = GTK_STATE_INSENSITIVE;
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver && !(option->state & State_Sunken)) ?
- GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkButton)->fg[labelState];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- pal.setBrush(QPalette::ButtonText, textColor);
- proxy()->drawItemText(painter, ir, tf, pal, (button->state & State_Enabled),
- button->text, QPalette::ButtonText);
- }
- break;
-
- case CE_RadioButton: // Fall through
- case CE_CheckBox:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- bool isRadio = (element == CE_RadioButton);
-
- // Draw prelight background
- GtkWidget *gtkRadioButton = d->gtkWidget("GtkRadioButton");
-
- if (option->state & State_MouseOver) {
- gtkPainter->paintFlatBox(gtkRadioButton, "checkbutton", option->rect,
- GTK_STATE_PRELIGHT, GTK_SHADOW_ETCHED_OUT, d->gtk_widget_get_style(gtkRadioButton));
- }
-
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonIndicator
- : SE_CheckBoxIndicator, btn, widget);
- proxy()->drawPrimitive(isRadio ? PE_IndicatorRadioButton : PE_IndicatorCheckBox,
- &subopt, painter, widget);
- subopt.rect = subElementRect(isRadio ? SE_RadioButtonContents
- : SE_CheckBoxContents, btn, widget);
- // Get label text color
- QPalette pal = subopt.palette;
- int labelState = GTK_STATE_INSENSITIVE;
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver) ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkRadioButton)->fg[labelState];
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- pal.setBrush(QPalette::WindowText, textColor);
- subopt.palette = pal;
- proxy()->drawControl(isRadio ? CE_RadioButtonLabel : CE_CheckBoxLabel, &subopt, painter, widget);
-
- if (btn->state & State_HasFocus) {
- QStyleOptionFocusRect fropt;
- fropt.QStyleOption::operator=(*btn);
- fropt.rect = subElementRect(isRadio ? SE_RadioButtonFocusRect
- : SE_CheckBoxFocusRect, btn, widget);
- proxy()->drawPrimitive(PE_FrameFocusRect, &fropt, painter, widget);
- }
- }
- break;
-
-#ifndef QT_NO_COMBOBOX
-
- case CE_ComboBoxLabel:
- if (const QStyleOptionComboBox *cb = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- QRect editRect = proxy()->subControlRect(CC_ComboBox, cb, SC_ComboBoxEditField, widget);
- bool appearsAsList = !proxy()->styleHint(QStyle::SH_ComboBox_Popup, cb, widget);
- painter->save();
- painter->setClipRect(editRect);
-
- if (!cb->currentIcon.isNull()) {
- QIcon::Mode mode = cb->state & State_Enabled ? QIcon::Normal
- : QIcon::Disabled;
- QPixmap pixmap = cb->currentIcon.pixmap(cb->iconSize, mode);
- QRect iconRect(editRect);
- iconRect.setWidth(cb->iconSize.width() + 4);
-
- iconRect = alignedRect(cb->direction,
- Qt::AlignLeft | Qt::AlignVCenter,
- iconRect.size(), editRect);
-
- if (cb->editable)
- painter->fillRect(iconRect, option->palette.brush(QPalette::Base));
-
- proxy()->drawItemPixmap(painter, iconRect, Qt::AlignCenter, pixmap);
-
- if (cb->direction == Qt::RightToLeft)
- editRect.translate(-4 - cb->iconSize.width(), 0);
- else
- editRect.translate(cb->iconSize.width() + 4, 0);
- }
-
- if (!cb->currentText.isEmpty() && !cb->editable) {
- GtkWidget *gtkCombo = d->gtkWidget("GtkComboBox");
- QPalette pal = cb->palette;
- int labelState = GTK_STATE_INSENSITIVE;
-
- if (option->state & State_Enabled)
- labelState = (option->state & State_MouseOver && !appearsAsList) ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL;
-
- GdkColor gdkText = d->gtk_widget_get_style(gtkCombo)->fg[labelState];
-
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
-
- pal.setBrush(QPalette::ButtonText, textColor);
-
- proxy()->drawItemText(painter, editRect.adjusted(1, 0, -1, 0),
- visualAlignment(cb->direction, Qt::AlignLeft | Qt::AlignVCenter),
- pal, cb->state & State_Enabled, cb->currentText, QPalette::ButtonText);
- }
-
- painter->restore();
- }
- break;
-
-#endif // QT_NO_COMBOBOX
-
- case CE_DockWidgetTitle:
- painter->save();
- if (const QStyleOptionDockWidget *dwOpt = qstyleoption_cast<const QStyleOptionDockWidget *>(option)) {
- const QStyleOptionDockWidgetV2 *v2
- = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(dwOpt);
- bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;
-
- QRect rect = dwOpt->rect;
- QRect titleRect = subElementRect(SE_DockWidgetTitleBarText, option, widget).adjusted(-2, 0, -2, 0);
- QRect r = rect.adjusted(0, 0, -1, -1);
- if (verticalTitleBar)
- r.adjust(0, 0, 0, -1);
-
- if (verticalTitleBar) {
- QRect r = rect;
- r.setSize(r.size().transposed());
-
- titleRect = QRect(r.left() + rect.bottom()
- - titleRect.bottom(),
- r.top() + titleRect.left() - rect.left(),
- titleRect.height(), titleRect.width());
-
- painter->translate(r.left(), r.top() + r.width());
- painter->rotate(-90);
- painter->translate(-r.left(), -r.top());
-
- rect = r;
- }
-
- if (!dwOpt->title.isEmpty()) {
- QString titleText
- = painter->fontMetrics().elidedText(dwOpt->title,
- Qt::ElideRight, titleRect.width());
- proxy()->drawItemText(painter,
- titleRect,
- Qt::AlignLeft | Qt::AlignVCenter | Qt::TextShowMnemonic, dwOpt->palette,
- dwOpt->state & State_Enabled, titleText,
- QPalette::WindowText);
- }
- }
- painter->restore();
- break;
-
-
-
- case CE_HeaderSection:
- painter->save();
-
- // Draws the header in tables.
- if (const QStyleOptionHeader *header = qstyleoption_cast<const QStyleOptionHeader *>(option)) {
- Q_UNUSED(header);
- GtkWidget *gtkTreeView = d->gtkWidget("GtkTreeView");
- // Get the middle column
- GtkTreeViewColumn *column = d->gtk_tree_view_get_column((GtkTreeView*)gtkTreeView, 1);
- Q_ASSERT(column);
-
- GtkWidget *gtkTreeHeader = column->button;
- GtkStateType state = qt_gtk_state(option);
- GtkShadowType shadow = GTK_SHADOW_OUT;
-
- if (option->state & State_Sunken)
- shadow = GTK_SHADOW_IN;
-
- gtkPainter->paintBox(gtkTreeHeader, "button", option->rect.adjusted(-1, 0, 0, 0), state, shadow, d->gtk_widget_get_style(gtkTreeHeader));
- }
-
- painter->restore();
- break;
-
-#ifndef QT_NO_SIZEGRIP
-
- case CE_SizeGrip: {
- GtkWidget *gtkStatusbar = d->gtkWidget("GtkStatusbar.GtkFrame");
- GtkStyle *gtkStatusbarStyle = d->gtk_widget_get_style(gtkStatusbar);
- QRect gripRect = option->rect.adjusted(0, 0, -gtkStatusbarStyle->xthickness, -gtkStatusbarStyle->ythickness);
- gtkPainter->paintResizeGrip(gtkStatusbar, "statusbar", gripRect, GTK_STATE_NORMAL,
- GTK_SHADOW_OUT, option->direction == Qt::RightToLeft ?
- GDK_WINDOW_EDGE_SOUTH_WEST : GDK_WINDOW_EDGE_SOUTH_EAST,
- gtkStatusbarStyle);
- }
- break;
-
-#endif // QT_NO_SIZEGRIP
-
- case CE_MenuBarEmptyArea: {
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
- GdkColor gdkBg = d->gtk_widget_get_style(gtkMenubar)->bg[GTK_STATE_NORMAL]; // Theme can depend on transparency
- painter->fillRect(option->rect, QColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8));
- if (widget) { // See CE_MenuBarItem
- QRect menuBarRect = widget->rect();
- QPixmap pixmap(menuBarRect.size());
- pixmap.fill(Qt::transparent);
- QPainter pmPainter(&pixmap);
- gtkPainter->reset(&pmPainter);
- GtkShadowType shadow_type;
- d->gtk_widget_style_get(gtkMenubar, "shadow-type", &shadow_type, NULL);
- gtkPainter->paintBox(gtkMenubar, "menubar", menuBarRect,
- GTK_STATE_NORMAL, shadow_type, d->gtk_widget_get_style(gtkMenubar));
- pmPainter.end();
- painter->drawPixmap(option->rect, pixmap, option->rect);
- gtkPainter->reset(painter);
- }
- }
- break;
-
- case CE_MenuBarItem:
- painter->save();
-
- if (const QStyleOptionMenuItem *mbi = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- GtkWidget *gtkMenubarItem = d->gtkWidget("GtkMenuBar.GtkMenuItem");
- GtkWidget *gtkMenubar = d->gtkWidget("GtkMenuBar");
-
- style = d->gtk_widget_get_style(gtkMenubarItem);
-
- if (widget) {
- // Since Qt does not currently allow filling the entire background
- // we use a hack for this by making a complete menubar each time and
- // paint with the correct offset inside it. Pixmap caching should resolve
- // most of the performance penalty.
- QRect menuBarRect = widget->rect();
- QPixmap pixmap(menuBarRect.size());
- pixmap.fill(Qt::transparent);
- QPainter pmPainter(&pixmap);
- gtkPainter->reset(&pmPainter);
- GtkShadowType shadow_type;
- d->gtk_widget_style_get(gtkMenubar, "shadow-type", &shadow_type, NULL);
- GdkColor gdkBg = d->gtk_widget_get_style(gtkMenubar)->bg[GTK_STATE_NORMAL]; // Theme can depend on transparency
- painter->fillRect(option->rect, QColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8));
- gtkPainter->paintBox(gtkMenubar, "menubar", menuBarRect,
- GTK_STATE_NORMAL, shadow_type, d->gtk_widget_get_style(gtkMenubar));
- pmPainter.end();
- painter->drawPixmap(option->rect, pixmap, option->rect);
- gtkPainter->reset(painter);
- }
-
- QStyleOptionMenuItem item = *mbi;
- bool act = mbi->state & State_Selected && mbi->state & State_Sunken;
- bool dis = !(mbi->state & State_Enabled);
- item.rect = mbi->rect;
- GdkColor gdkText = style->fg[dis ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL];
- GdkColor gdkHText = style->fg[GTK_STATE_PRELIGHT];
- QColor normalTextColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- QColor highlightedTextColor = QColor(gdkHText.red>>8, gdkHText.green>>8, gdkHText.blue>>8);
- item.palette.setBrush(QPalette::HighlightedText, highlightedTextColor);
- item.palette.setBrush(QPalette::Text, normalTextColor);
- item.palette.setBrush(QPalette::ButtonText, normalTextColor);
- QCommonStyle::drawControl(element, &item, painter, widget);
-
- if (act) {
- GtkShadowType shadowType = GTK_SHADOW_NONE;
- d->gtk_widget_style_get (gtkMenubarItem, "selected-shadow-type", &shadowType, NULL);
- gtkPainter->paintBox(gtkMenubarItem, "menuitem", option->rect.adjusted(0, 0, 0, 3),
- GTK_STATE_PRELIGHT, shadowType, style);
- //draw text
- QPalette::ColorRole textRole = dis ? QPalette::Text : QPalette::HighlightedText;
- uint alignment = Qt::AlignCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
-
- if (!proxy()->styleHint(SH_UnderlineShortcut, mbi, widget))
- alignment |= Qt::TextHideMnemonic;
-
- proxy()->drawItemText(painter, item.rect, alignment, item.palette, mbi->state & State_Enabled, mbi->text, textRole);
- }
- }
- painter->restore();
- break;
-
- case CE_Splitter: {
- GtkWidget *gtkWindow = d->gtkWidget("GtkWindow"); // The Murrine Engine currently assumes a widget is passed
- gtkPainter->paintHandle(gtkWindow, "splitter", option->rect, qt_gtk_state(option), GTK_SHADOW_NONE,
- !(option->state & State_Horizontal) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL,
- style);
- }
- break;
-
-#ifndef QT_NO_TOOLBAR
-
- case CE_ToolBar:
- if (const QStyleOptionToolBar *toolbar = qstyleoption_cast<const QStyleOptionToolBar *>(option)) {
- // Reserve the beveled appearance only for mainwindow toolbars
- if (!(widget && qobject_cast<const QMainWindow*> (widget->parentWidget())))
- break;
-
- QRect rect = option->rect;
- // There is a 1 pixel gap between toolbar lines in some styles (i.e Human)
- if (toolbar->positionWithinLine != QStyleOptionToolBar::End)
- rect.adjust(0, 0, 1, 0);
-
- GtkWidget *gtkToolbar = d->gtkWidget("GtkToolbar");
- GtkShadowType shadow_type = GTK_SHADOW_NONE;
- d->gtk_widget_style_get(gtkToolbar, "shadow-type", &shadow_type, NULL);
- gtkPainter->paintBox(gtkToolbar, "toolbar", rect,
- GTK_STATE_NORMAL, shadow_type, d->gtk_widget_get_style(gtkToolbar));
- }
- break;
-
-#endif // QT_NO_TOOLBAR
-
- case CE_MenuItem:
- painter->save();
-
- // Draws one item in a popup menu.
- if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- const int windowsItemHMargin = 3; // menu item hor text margin
- const int windowsItemVMargin = 26; // menu item ver text margin
- GtkWidget *gtkMenuItem = menuItem->checked ? d->gtkWidget("GtkMenu.GtkCheckMenuItem") :
- d->gtkWidget("GtkMenu.GtkMenuItem");
-
- style = d->gtk_widget_get_style(gtkMenuItem);
- QColor shadow = option->palette.dark().color();
-
- if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
- GtkWidget *gtkMenuSeparator = d->gtkWidget("GtkMenu.GtkSeparatorMenuItem");
- painter->setPen(shadow.lighter(106));
- gboolean wide_separators = 0;
- gint separator_height = 0;
- guint horizontal_padding = 3;
- QRect separatorRect = option->rect;
- if (!d->gtk_check_version(2, 10, 0)) {
- d->gtk_widget_style_get(gtkMenuSeparator,
- "wide-separators", &wide_separators,
- "separator-height", &separator_height,
- "horizontal-padding", &horizontal_padding,
- NULL);
- }
- GtkStyle *gtkMenuSeparatorStyle = d->gtk_widget_get_style(gtkMenuSeparator);
- separatorRect.setHeight(option->rect.height() - 2 * gtkMenuSeparatorStyle->ythickness);
- separatorRect.setWidth(option->rect.width() - 2 * (horizontal_padding + gtkMenuSeparatorStyle->xthickness));
- separatorRect.moveCenter(option->rect.center());
- if (wide_separators)
- gtkPainter->paintBox(gtkMenuSeparator, "hseparator",
- separatorRect, GTK_STATE_NORMAL, GTK_SHADOW_NONE, gtkMenuSeparatorStyle);
- else
- gtkPainter->paintHline(gtkMenuSeparator, "hseparator",
- separatorRect, GTK_STATE_NORMAL, gtkMenuSeparatorStyle,
- 0, option->rect.right() - 1, 1);
- painter->restore();
- break;
- }
-
- bool selected = menuItem->state & State_Selected && menuItem->state & State_Enabled;
-
- if (selected) {
- QRect rect = option->rect;
-#ifndef QT_NO_COMBOBOX
- if (qobject_cast<const QComboBox*>(widget))
- rect = option->rect;
-#endif
- gtkPainter->paintBox(gtkMenuItem, "menuitem", rect, GTK_STATE_PRELIGHT, GTK_SHADOW_OUT, style);
- }
-
- bool checkable = menuItem->checkType != QStyleOptionMenuItem::NotCheckable;
- bool checked = menuItem->checked;
- bool enabled = menuItem->state & State_Enabled;
- bool ignoreCheckMark = false;
-
- gint checkSize;
- d->gtk_widget_style_get(d->gtkWidget("GtkMenu.GtkCheckMenuItem"), "indicator-size", &checkSize, NULL);
-
- int checkcol = qMax(menuItem->maxIconWidth, qMax(20, checkSize));
-
-#ifndef QT_NO_COMBOBOX
-
- if (qobject_cast<const QComboBox*>(widget) ||
- (option->styleObject && option->styleObject->property("_q_isComboBoxPopupItem").toBool()))
- ignoreCheckMark = true; // Ignore the checkmarks provided by the QComboMenuDelegate
-
-#endif
- if (!ignoreCheckMark) {
- // Check
- QRect checkRect(option->rect.left() + 7, option->rect.center().y() - checkSize/2 + 1, checkSize, checkSize);
- checkRect = visualRect(menuItem->direction, menuItem->rect, checkRect);
-
- if (checkable && menuItem->icon.isNull()) {
- // Some themes such as aero-clone draw slightly outside the paint rect
- int spacing = 1; // ### Consider using gtkCheckBox : "indicator-spacing" instead
-
- if (menuItem->checkType & QStyleOptionMenuItem::Exclusive) {
- // Radio button
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (selected)
- state = GTK_STATE_PRELIGHT;
- if (checked)
- shadow = GTK_SHADOW_IN;
-
- gtkPainter->setClipRect(checkRect.adjusted(-spacing, -spacing, spacing, spacing));
- gtkPainter->paintOption(gtkMenuItem, checkRect.translated(-spacing, -spacing), state, shadow,
- style, QLS("option"));
- gtkPainter->setClipRect(QRect());
-
- } else {
- // Check box
- if (menuItem->icon.isNull()) {
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = qt_gtk_state(option);
-
- if (selected)
- state = GTK_STATE_PRELIGHT;
- if (checked)
- shadow = GTK_SHADOW_IN;
-
- gtkPainter->setClipRect(checkRect.adjusted(-spacing, -spacing, -spacing, -spacing));
- gtkPainter->paintCheckbox(gtkMenuItem, checkRect.translated(-spacing, -spacing), state, shadow,
- style, QLS("check"));
- gtkPainter->setClipRect(QRect());
- }
- }
- }
-
- } else {
- // Ignore checkmark
- if (menuItem->icon.isNull())
- checkcol = 0;
- else
- checkcol = menuItem->maxIconWidth;
- }
-
- bool dis = !(menuItem->state & State_Enabled);
- bool act = menuItem->state & State_Selected;
- const QStyleOption *opt = option;
- const QStyleOptionMenuItem *menuitem = menuItem;
- QPainter *p = painter;
- QRect vCheckRect = visualRect(opt->direction, menuitem->rect,
- QRect(menuitem->rect.x() + 3, menuitem->rect.y(),
- checkcol, menuitem->rect.height()));
-
- if (!menuItem->icon.isNull()) {
- QIcon::Mode mode = dis ? QIcon::Disabled : QIcon::Normal;
-
- if (act && !dis)
- mode = QIcon::Active;
-
- QPixmap pixmap;
- int smallIconSize = proxy()->pixelMetric(PM_SmallIconSize, option, widget);
- QSize iconSize(smallIconSize, smallIconSize);
-
-#ifndef QT_NO_COMBOBOX
- if (const QComboBox *combo = qobject_cast<const QComboBox*>(widget))
- iconSize = combo->iconSize();
-
-#endif // QT_NO_COMBOBOX
- if (checked)
- pixmap = menuItem->icon.pixmap(iconSize, mode, QIcon::On);
- else
- pixmap = menuItem->icon.pixmap(iconSize, mode);
-
- const int pixw = pixmap.width() / pixmap.devicePixelRatio();
- const int pixh = pixmap.height() / pixmap.devicePixelRatio();
- QRect pmr(0, 0, pixw, pixh);
- pmr.moveCenter(vCheckRect.center() - QPoint(0, 1));
- painter->setPen(menuItem->palette.text().color());
- if (!ignoreCheckMark && checkable && checked) {
- QStyleOption opt = *option;
-
- if (act) {
- QColor activeColor = mergedColors(option->palette.background().color(),
- option->palette.highlight().color());
- opt.palette.setBrush(QPalette::Button, activeColor);
- }
- opt.state |= State_Sunken;
- opt.rect = vCheckRect;
- proxy()->drawPrimitive(PE_PanelButtonCommand, &opt, painter, widget);
- }
- painter->drawPixmap(pmr.topLeft(), pixmap);
- }
-
- GdkColor gdkText = style->fg[GTK_STATE_NORMAL];
- GdkColor gdkDText = style->fg[GTK_STATE_INSENSITIVE];
- GdkColor gdkHText = style->fg[GTK_STATE_PRELIGHT];
- uint resolve_mask = option->palette.resolve();
- QColor textColor = QColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- QColor disabledTextColor = QColor(gdkDText.red>>8, gdkDText.green>>8, gdkDText.blue>>8);
- if (resolve_mask & (1 << QPalette::ButtonText)) {
- textColor = option->palette.buttonText().color();
- disabledTextColor = option->palette.brush(QPalette::Disabled, QPalette::ButtonText).color();
- }
-
- QColor highlightedTextColor = QColor(gdkHText.red>>8, gdkHText.green>>8, gdkHText.blue>>8);
- if (resolve_mask & (1 << QPalette::HighlightedText)) {
- highlightedTextColor = option->palette.highlightedText().color();
- }
-
- if (selected)
- painter->setPen(highlightedTextColor);
- else
- painter->setPen(textColor);
-
- int x, y, w, h;
- menuitem->rect.getRect(&x, &y, &w, &h);
- int tab = menuitem->tabWidth;
- int xm = QGtkStylePrivate::menuItemFrame + checkcol + windowsItemHMargin;
- int xpos = menuitem->rect.x() + xm + 1;
- QRect textRect(xpos, y + windowsItemVMargin, w - xm - QGtkStylePrivate::menuRightBorder - tab + 1, h - 2 * windowsItemVMargin);
- QRect vTextRect = visualRect(opt->direction, menuitem->rect, textRect);
- QString s = menuitem->text;
-
- if (!s.isEmpty()) { // Draw text
- p->save();
- int t = s.indexOf(QLatin1Char('\t'));
- int text_flags = Qt::AlignVCenter | Qt::TextShowMnemonic | Qt::TextDontClip | Qt::TextSingleLine;
-
- if (!proxy()->styleHint(SH_UnderlineShortcut, menuitem, widget))
- text_flags |= Qt::TextHideMnemonic;
-
- // Draw shortcut right aligned
- text_flags |= Qt::AlignRight;
-
- if (t >= 0) {
- int rightMargin = 12; // Hardcode for now
- QRect vShortcutRect = visualRect(opt->direction, menuitem->rect,
- QRect(textRect.topRight(), QPoint(menuitem->rect.right() - rightMargin, textRect.bottom())));
-
- if (dis)
- p->setPen(disabledTextColor);
- p->drawText(vShortcutRect, text_flags , s.mid(t + 1));
- s = s.left(t);
- }
-
- text_flags &= ~Qt::AlignRight;
- text_flags |= Qt::AlignLeft;
- QFont font = menuitem->font;
- if (menuitem->menuItemType == QStyleOptionMenuItem::DefaultItem)
- font.setBold(true);
- p->setFont(font);
-
- if (dis)
- p->setPen(disabledTextColor);
- p->drawText(vTextRect, text_flags, s.left(t));
- p->restore();
- }
-
- // Arrow
- if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu) {// draw sub menu arrow
-
- QFontMetrics fm(menuitem->font);
- int arrow_size = fm.ascent() + fm.descent() - 2 * style->ythickness;
- gfloat arrow_scaling = 0.8;
- int extra = 0;
- if (!d->gtk_check_version(2, 16, 0)) {
- // "arrow-scaling" is actually hardcoded and fails on hardy (see gtk+-2.12/gtkmenuitem.c)
- // though the current documentation states otherwise
- d->gtk_widget_style_get(gtkMenuItem, "arrow-scaling", &arrow_scaling, NULL);
- // in versions < 2.16 ythickness was previously subtracted from the arrow_size
- extra = 2 * style->ythickness;
- }
-
- int horizontal_padding;
- d->gtk_widget_style_get(gtkMenuItem, "horizontal-padding", &horizontal_padding, NULL);
-
- const int dim = static_cast<int>(arrow_size * arrow_scaling) + extra;
- int xpos = menuItem->rect.left() + menuItem->rect.width() - horizontal_padding - dim;
- QRect vSubMenuRect = visualRect(option->direction, menuItem->rect,
- QRect(xpos, menuItem->rect.top() +
- menuItem->rect.height() / 2 - dim / 2, dim, dim));
- GtkStateType state = enabled ? (act ? GTK_STATE_PRELIGHT: GTK_STATE_NORMAL) : GTK_STATE_INSENSITIVE;
- GtkShadowType shadowType = (state == GTK_STATE_PRELIGHT) ? GTK_SHADOW_OUT : GTK_SHADOW_IN;
- gtkPainter->paintArrow(gtkMenuItem, "menuitem", vSubMenuRect, option->direction == Qt::RightToLeft ? GTK_ARROW_LEFT : GTK_ARROW_RIGHT, state,
- shadowType, false, style);
- }
- }
- painter->restore();
- break;
-
- case CE_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- proxy()->drawControl(CE_PushButtonBevel, btn, painter, widget);
- QStyleOptionButton subopt = *btn;
- subopt.rect = subElementRect(SE_PushButtonContents, btn, widget);
- gint interiorFocus = true;
- d->gtk_widget_style_get(gtkButton, "interior-focus", &interiorFocus, NULL);
- GtkStyle *gtkButtonStyle = d->gtk_widget_get_style(gtkButton);
- int xt = interiorFocus ? gtkButtonStyle->xthickness : 0;
- int yt = interiorFocus ? gtkButtonStyle->ythickness : 0;
-
- if (btn->features & QStyleOptionButton::Flat && btn->state & State_HasFocus)
- // The normal button focus rect does not work well for flat buttons in Clearlooks
- proxy()->drawPrimitive(PE_FrameFocusRect, option, painter, widget);
- else if (btn->state & State_HasFocus)
- gtkPainter->paintFocus(gtkButton, "button",
- option->rect.adjusted(xt, yt, -xt, -yt),
- btn->state & State_Sunken ? GTK_STATE_ACTIVE : GTK_STATE_NORMAL,
- gtkButtonStyle);
-
- proxy()->drawControl(CE_PushButtonLabel, &subopt, painter, widget);
- }
- break;
-
-#ifndef QT_NO_TABBAR
-
- case CE_TabBarTabShape:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
- GtkWidget *gtkNotebook = d->gtkWidget("GtkNotebook");
- style = d->gtk_widget_get_style(gtkNotebook);
-
- QRect rect = option->rect;
- GtkShadowType shadow = GTK_SHADOW_OUT;
- GtkStateType state = GTK_STATE_ACTIVE;
- if (tab->state & State_Selected)
- state = GTK_STATE_NORMAL;
-
- bool selected = (tab->state & State_Selected);
- bool first = false, last = false;
- if (widget) {
- // This is most accurate and avoids resizing tabs while moving
- first = tab->rect.left() == widget->rect().left();
- last = tab->rect.right() == widget->rect().right();
- } else if (option->direction == Qt::RightToLeft) {
- bool tmp = first;
- first = last;
- last = tmp;
- }
- int topIndent = 3;
- int bottomIndent = 1;
- int tabOverlap = 1;
- painter->save();
-
- switch (tab->shape) {
- case QTabBar::RoundedNorth:
- if (!selected)
- rect.adjust(first ? 0 : -tabOverlap, topIndent, last ? 0 : tabOverlap, -bottomIndent);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect,
- state, shadow, GTK_POS_BOTTOM, style);
- break;
-
- case QTabBar::RoundedSouth:
- if (!selected)
- rect.adjust(first ? 0 : -tabOverlap, 0, last ? 0 : tabOverlap, -topIndent);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect.adjusted(0, 1, 0, 0),
- state, shadow, GTK_POS_TOP, style);
- break;
-
- case QTabBar::RoundedWest:
- if (!selected)
- rect.adjust(topIndent, 0, -bottomIndent, 0);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect, state, shadow, GTK_POS_RIGHT, style);
- break;
-
- case QTabBar::RoundedEast:
- if (!selected)
- rect.adjust(bottomIndent, 0, -topIndent, 0);
- gtkPainter->paintExtention(gtkNotebook, "tab", rect, state, shadow, GTK_POS_LEFT, style);
- break;
-
- default:
- QCommonStyle::drawControl(element, option, painter, widget);
- break;
- }
-
- painter->restore();
- }
-
- break;
-
-#endif //QT_NO_TABBAR
-
- case CE_ProgressBarGroove:
- if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- Q_UNUSED(bar);
- GtkWidget *gtkProgressBar = d->gtkWidget("GtkProgressBar");
- GtkStateType state = qt_gtk_state(option);
- gtkPainter->paintBox(gtkProgressBar, "trough", option->rect, state, GTK_SHADOW_IN, d->gtk_widget_get_style(gtkProgressBar));
- }
-
- break;
-
- case CE_ProgressBarContents:
- if (const QStyleOptionProgressBar *bar = qstyleoption_cast<const QStyleOptionProgressBar *>(option)) {
- GtkStateType state = option->state & State_Enabled ? GTK_STATE_NORMAL : GTK_STATE_INSENSITIVE;
- GtkWidget *gtkProgressBar = d->gtkWidget("GtkProgressBar");
- style = d->gtk_widget_get_style(gtkProgressBar);
- gtkPainter->paintBox(gtkProgressBar, "trough", option->rect, state, GTK_SHADOW_IN, style);
- int xt = style->xthickness;
- int yt = style->ythickness;
- QRect rect = bar->rect.adjusted(xt, yt, -xt, -yt);
- bool vertical = false;
- bool inverted = false;
- bool indeterminate = (bar->minimum == 0 && bar->maximum == 0);
- // Get extra style options if version 2
-
- if (const QStyleOptionProgressBarV2 *bar2 = qstyleoption_cast<const QStyleOptionProgressBarV2 *>(option)) {
- vertical = (bar2->orientation == Qt::Vertical);
- inverted = bar2->invertedAppearance;
- }
-
- // If the orientation is vertical, we use a transform to rotate
- // the progress bar 90 degrees clockwise. This way we can use the
- // same rendering code for both orientations.
- if (vertical) {
- rect.translate(xt, -yt * 2);
- rect = QRect(rect.left(), rect.top(), rect.height(), rect.width()); // Flip width and height
- QTransform m = QTransform::fromTranslate(rect.height(), 0);
- m.rotate(90.0);
- painter->setTransform(m);
- }
-
- int maxWidth = rect.width();
- int minWidth = 4;
-
- qint64 progress = (qint64)qMax(bar->progress, bar->minimum); // Workaround for bug in QProgressBar
- double vc6_workaround = ((progress - qint64(bar->minimum)) / double(qint64(bar->maximum) - qint64(bar->minimum))) * maxWidth;
- int progressBarWidth = (int(vc6_workaround) > minWidth ) ? int(vc6_workaround) : minWidth;
- int width = indeterminate ? maxWidth : progressBarWidth;
- bool reverse = (!vertical && (bar->direction == Qt::RightToLeft)) || vertical;
-
- if (inverted)
- reverse = !reverse;
-
- int maximum = 2;
- int fakePos = 0;
- if (bar->minimum == bar->maximum)
- maximum = 0;
- if (bar->progress == bar->maximum)
- fakePos = maximum;
- else if (bar->progress > bar->minimum)
- fakePos = maximum - 1;
-
- QRect progressBar;
-
- if (!indeterminate) {
- if (!reverse)
- progressBar.setRect(rect.left(), rect.top(), width, rect.height());
- else
- progressBar.setRect(rect.right() - width, rect.top(), width, rect.height());
-#ifndef QT_NO_ANIMATION
- d->stopAnimation(option->styleObject);
-#endif
- } else {
- Q_D(const QGtkStyle);
- int slideWidth = ((rect.width() - 4) * 2) / 3;
- int step = 0;
-#ifndef QT_NO_ANIMATION
- if (QProgressStyleAnimation *animation = qobject_cast<QProgressStyleAnimation*>(d->animation(option->styleObject)))
- step = animation->progressStep(slideWidth);
- else
- d->startAnimation(new QProgressStyleAnimation(d->animationFps, option->styleObject));
-#endif
- progressBar.setRect(rect.left() + step, rect.top(), slideWidth / 2, rect.height());
- }
-
- QString key = QString(QLS("%0")).arg(fakePos);
- if (inverted) {
- key += QLatin1String("inv");
- gtkPainter->setFlipHorizontal(true);
- }
- gtkPainter->paintBox(gtkProgressBar, "bar", progressBar, GTK_STATE_SELECTED, GTK_SHADOW_OUT, style, key);
- }
-
- break;
-
- default:
- QCommonStyle::drawControl(element, option, painter, widget);
- }
-}
-
-/*!
- \reimp
-*/
-QRect QGtkStyle::subControlRect(ComplexControl control, const QStyleOptionComplex *option,
- SubControl subControl, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- QRect rect = QCommonStyle::subControlRect(control, option, subControl, widget);
- if (!d->isThemeAvailable())
- return QCommonStyle::subControlRect(control, option, subControl, widget);
-
- switch (control) {
- case CC_ScrollBar:
- break;
- case CC_Slider:
- if (const QStyleOptionSlider *slider = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
- int tickSize = proxy()->pixelMetric(PM_SliderTickmarkOffset, option, widget);
- switch (subControl) {
- case SC_SliderHandle: {
- if (slider->orientation == Qt::Horizontal) {
- rect.setHeight(proxy()->pixelMetric(PM_SliderThickness));
- rect.setWidth(proxy()->pixelMetric(PM_SliderLength));
- int centerY = slider->rect.center().y() - rect.height() / 2;
- if (slider->tickPosition & QSlider::TicksAbove)
- centerY += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- centerY -= tickSize;
- rect.moveTop(centerY);
- } else {
- rect.setWidth(proxy()->pixelMetric(PM_SliderThickness));
- rect.setHeight(proxy()->pixelMetric(PM_SliderLength));
- int centerX = slider->rect.center().x() - rect.width() / 2;
- if (slider->tickPosition & QSlider::TicksAbove)
- centerX += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- centerX -= tickSize;
- rect.moveLeft(centerX);
- }
- }
- break;
- case SC_SliderGroove: {
- QPoint grooveCenter = slider->rect.center();
- if (slider->orientation == Qt::Horizontal) {
- rect.setHeight(7);
- if (slider->tickPosition & QSlider::TicksAbove)
- grooveCenter.ry() += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- grooveCenter.ry() -= tickSize;
- } else {
- rect.setWidth(7);
- if (slider->tickPosition & QSlider::TicksAbove)
- grooveCenter.rx() += tickSize;
- if (slider->tickPosition & QSlider::TicksBelow)
- grooveCenter.rx() -= tickSize;
- }
- rect.moveCenter(grooveCenter);
- break;
- }
- default:
- break;
- }
- }
- break;
-
-#ifndef QT_NO_GROUPBOX
-
- case CC_GroupBox:
- if (const QStyleOptionGroupBox * groupBox = qstyleoption_cast<const QStyleOptionGroupBox *>(option)) {
- rect = option->rect.adjusted(0, groupBoxTopMargin, 0, -groupBoxBottomMargin);
- int topMargin = 0;
- int topHeight = 0;
- topHeight = 10;
- QRect frameRect = rect;
- frameRect.setTop(topMargin);
-
- if (subControl == SC_GroupBoxFrame)
- return rect;
- else if (subControl == SC_GroupBoxContents) {
- int margin = 0;
- int leftMarginExtension = 8;
- return frameRect.adjusted(leftMarginExtension + margin, margin + topHeight + groupBoxTitleMargin, -margin, -margin);
- }
-
- QFontMetrics fontMetrics = option->fontMetrics;
- if (qobject_cast<const QGroupBox *>(widget)) {
- //Prepare metrics for a bold font
- QFont font = widget->font();
- font.setBold(true);
- fontMetrics = QFontMetrics(font);
-#ifndef QT_NO_ACCESSIBILITY
- } else if (QStyleHelper::isInstanceOf(groupBox->styleObject, QAccessible::Grouping)) {
- QVariant var = groupBox->styleObject->property("font");
- if (var.isValid() && var.canConvert<QFont>()) {
- QFont font = var.value<QFont>();
- font.setBold(true);
- fontMetrics = QFontMetrics(font);
- }
-#endif // QT_NO_ACCESSIBILITY
- }
-
- QSize textRect = fontMetrics.boundingRect(groupBox->text).size() + QSize(4, 4);
- int indicatorWidth = proxy()->pixelMetric(PM_IndicatorWidth, option, widget);
- int indicatorHeight = proxy()->pixelMetric(PM_IndicatorHeight, option, widget);
-
- if (subControl == SC_GroupBoxCheckBox) {
- rect.setWidth(indicatorWidth);
- rect.setHeight(indicatorHeight);
- rect.moveTop((textRect.height() - indicatorHeight) / 2);
-
- } else if (subControl == SC_GroupBoxLabel) {
- if (groupBox->subControls & SC_GroupBoxCheckBox)
- rect.adjust(indicatorWidth + 4, 0, 0, 0);
- rect.setSize(textRect);
- }
- rect = visualRect(option->direction, option->rect, rect);
- }
-
- return rect;
-
-#endif
-#ifndef QT_NO_SPINBOX
-
- case CC_SpinBox:
- if (const QStyleOptionSpinBox *spinbox = qstyleoption_cast<const QStyleOptionSpinBox *>(option)) {
- GtkWidget *gtkSpinButton = d->gtkWidget("GtkSpinButton");
- int center = spinbox->rect.height() / 2;
- GtkStyle *gtkSpinButtonStyle = d->gtk_widget_get_style(gtkSpinButton);
- int xt = spinbox->frame ? gtkSpinButtonStyle->xthickness : 0;
- int yt = spinbox->frame ? gtkSpinButtonStyle->ythickness : 0;
- int y = yt;
-
- QSize bs;
- bs.setHeight(qMax(8, spinbox->rect.height()/2 - y));
- bs.setWidth(d->getSpinboxArrowSize());
- int x, lx, rx;
- x = spinbox->rect.width() - y - bs.width() + 2;
- lx = xt;
- rx = x - xt;
-
- switch (subControl) {
-
- case SC_SpinBoxUp:
- if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
- return QRect();
- rect = QRect(x, xt, bs.width(), center - yt);
- break;
-
- case SC_SpinBoxDown:
- if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
- return QRect();
- rect = QRect(x, center, bs.width(), spinbox->rect.bottom() - center - yt + 1);
- break;
-
- case SC_SpinBoxEditField:
- if (spinbox->buttonSymbols == QAbstractSpinBox::NoButtons)
- rect = QRect(lx, yt, spinbox->rect.width() - 2*xt, spinbox->rect.height() - 2*yt);
- else
- rect = QRect(lx, yt, rx - qMax(xt - 1, 0), spinbox->rect.height() - 2*yt);
- break;
-
- case SC_SpinBoxFrame:
- rect = spinbox->rect;
-
- default:
- break;
- }
-
- rect = visualRect(spinbox->direction, spinbox->rect, rect);
- }
-
- break;
-
-#endif // Qt_NO_SPINBOX
-#ifndef QT_NO_COMBOBOX
-
- case CC_TitleBar:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(option)) {
- SubControl sc = subControl;
- QRect &ret = rect;
- const int indent = 3;
- const int controlTopMargin = 3;
- const int controlBottomMargin = 3;
- const int controlWidthMargin = 2;
- const int controlHeight = tb->rect.height() - controlTopMargin - controlBottomMargin ;
- const int delta = controlHeight + controlWidthMargin;
- int offset = 0;
-
- bool isMinimized = tb->titleBarState & Qt::WindowMinimized;
- bool isMaximized = tb->titleBarState & Qt::WindowMaximized;
-
- switch (sc) {
- case SC_TitleBarLabel:
- if (tb->titleBarFlags & (Qt::WindowTitleHint | Qt::WindowSystemMenuHint)) {
- ret = tb->rect;
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- ret.adjust(delta, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowMinimizeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowMaximizeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowShadeButtonHint)
- ret.adjust(0, 0, -delta, 0);
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- ret.adjust(0, 0, -delta, 0);
- }
- break;
- case SC_TitleBarContextHelpButton:
- if (tb->titleBarFlags & Qt::WindowContextHelpButtonHint)
- offset += delta;
- case SC_TitleBarMinButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMinButton)
- break;
- case SC_TitleBarNormalButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowMinimizeButtonHint))
- offset += delta;
- else if (isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarNormalButton)
- break;
- case SC_TitleBarMaxButton:
- if (!isMaximized && (tb->titleBarFlags & Qt::WindowMaximizeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarMaxButton)
- break;
- case SC_TitleBarShadeButton:
- if (!isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarShadeButton)
- break;
- case SC_TitleBarUnshadeButton:
- if (isMinimized && (tb->titleBarFlags & Qt::WindowShadeButtonHint))
- offset += delta;
- else if (sc == SC_TitleBarUnshadeButton)
- break;
- case SC_TitleBarCloseButton:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- offset += delta;
- else if (sc == SC_TitleBarCloseButton)
- break;
- ret.setRect(tb->rect.right() - indent - offset, tb->rect.top() + controlTopMargin,
- controlHeight, controlHeight);
- break;
- case SC_TitleBarSysMenu:
- if (tb->titleBarFlags & Qt::WindowSystemMenuHint) {
- ret.setRect(tb->rect.left() + controlWidthMargin + indent, tb->rect.top() + controlTopMargin,
- controlHeight, controlHeight);
- }
- break;
- default:
- break;
- }
- ret = visualRect(tb->direction, tb->rect, ret);
- }
- break;
- case CC_ComboBox:
- if (const QStyleOptionComboBox *box = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- // We employ the gtk widget to position arrows and separators for us
- GtkWidget *gtkCombo = box->editable ? d->gtkWidget("GtkComboBoxEntry")
- : d->gtkWidget("GtkComboBox");
- d->gtk_widget_set_direction(gtkCombo, (option->direction == Qt::RightToLeft) ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
- GtkAllocation geometry = {0, 0, qMax(0, option->rect.width()), qMax(0, option->rect.height())};
- d->gtk_widget_size_allocate(gtkCombo, &geometry);
- int appears_as_list = !proxy()->styleHint(QStyle::SH_ComboBox_Popup, option, widget);
- QHashableLatin1Literal arrowPath("GtkComboBoxEntry.GtkToggleButton");
- if (!box->editable) {
- if (appears_as_list)
- arrowPath = "GtkComboBox.GtkToggleButton";
- else
- arrowPath = "GtkComboBox.GtkToggleButton.GtkHBox.GtkArrow";
- }
-
- GtkWidget *arrowWidget = d->gtkWidget(arrowPath);
- if (!arrowWidget)
- return QCommonStyle::subControlRect(control, option, subControl, widget);
-
- GtkAllocation allocation;
- d->gtk_widget_get_allocation(arrowWidget, &allocation);
- QRect buttonRect(option->rect.left() + allocation.x,
- option->rect.top() + allocation.y,
- allocation.width, allocation.height);
-
- switch (subControl) {
-
- case SC_ComboBoxArrow: // Note: this indicates the arrowbutton for editable combos
- rect = buttonRect;
- break;
-
- case SC_ComboBoxEditField: {
- rect = visualRect(option->direction, option->rect, rect);
- int xMargin = box->editable ? 1 : 4, yMargin = 2;
- GtkStyle *gtkComboStyle = d->gtk_widget_get_style(gtkCombo);
- rect.setRect(option->rect.left() + gtkComboStyle->xthickness + xMargin,
- option->rect.top() + gtkComboStyle->ythickness + yMargin,
- option->rect.width() - buttonRect.width() - 2*(gtkComboStyle->xthickness + xMargin),
- option->rect.height() - 2*(gtkComboStyle->ythickness + yMargin));
- rect = visualRect(option->direction, option->rect, rect);
- break;
- }
-
- default:
- break;
- }
- }
-
- break;
-#endif // QT_NO_COMBOBOX
-
- default:
- break;
- }
-
- return rect;
-}
-
-/*!
- \reimp
-*/
-QSize QGtkStyle::sizeFromContents(ContentsType type, const QStyleOption *option,
- const QSize &size, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- QSize newSize = QCommonStyle::sizeFromContents(type, option, size, widget);
- if (!d->isThemeAvailable())
- return newSize;
-
- switch (type) {
- case CT_GroupBox:
- // Since we use a bold font we have to recalculate base width
- if (const QGroupBox *gb = qobject_cast<const QGroupBox*>(widget)) {
- QFont font = gb->font();
- font.setBold(true);
- QFontMetrics metrics(font);
- int baseWidth = metrics.width(gb->title()) + metrics.width(QLatin1Char(' '));
- if (gb->isCheckable()) {
- baseWidth += proxy()->pixelMetric(QStyle::PM_IndicatorWidth, option, widget);
- baseWidth += proxy()->pixelMetric(QStyle::PM_CheckBoxLabelSpacing, option, widget);
- }
- newSize.setWidth(qMax(baseWidth, newSize.width()));
- }
- newSize += QSize(4, 1 + groupBoxBottomMargin + groupBoxTopMargin + groupBoxTitleMargin); // Add some space below the groupbox
- break;
- case CT_ToolButton:
- if (const QStyleOptionToolButton *toolbutton = qstyleoption_cast<const QStyleOptionToolButton *>(option)) {
- GtkWidget *gtkButton = d->gtkWidget("GtkToolButton.GtkButton");
- GtkStyle *gtkButtonStyle = d->gtk_widget_get_style(gtkButton);
- newSize = size + QSize(2 * gtkButtonStyle->xthickness, 2 + 2 * gtkButtonStyle->ythickness);
- if (widget && qobject_cast<QToolBar *>(widget->parentWidget())) {
- QSize minSize(0, 25);
- if (toolbutton->toolButtonStyle != Qt::ToolButtonTextOnly)
- minSize = toolbutton->iconSize + QSize(12, 12);
- newSize = newSize.expandedTo(minSize);
- }
-
- if (toolbutton->features & QStyleOptionToolButton::HasMenu)
- newSize += QSize(6, 0);
- }
- break;
- case CT_SpinBox:
- // QSpinBox does some nasty things that depends on CT_LineEdit
- newSize = newSize + QSize(0, -d->gtk_widget_get_style(d->gtkWidget("GtkSpinButton"))->ythickness * 2);
- break;
- case CT_RadioButton:
- case CT_CheckBox:
- newSize += QSize(0, 1);
- break;
- case CT_PushButton:
- if (const QStyleOptionButton *btn = qstyleoption_cast<const QStyleOptionButton *>(option)) {
- if (!btn->icon.isNull() && btn->iconSize.height() > 16)
- newSize -= QSize(0, 2); // From cleanlooksstyle
- newSize += QSize(0, 1);
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- gint focusPadding, focusWidth;
- d->gtk_widget_style_get(gtkButton, "focus-padding", &focusPadding, NULL);
- d->gtk_widget_style_get(gtkButton, "focus-line-width", &focusWidth, NULL);
- newSize = size;
- GtkStyle *gtkButtonStyle = d->gtk_widget_get_style(gtkButton);
- newSize += QSize(2*gtkButtonStyle->xthickness + 4, 2*gtkButtonStyle->ythickness);
- newSize += QSize(2*(focusWidth + focusPadding + 2), 2*(focusWidth + focusPadding));
-
- GtkWidget *gtkButtonBox = d->gtkWidget("GtkHButtonBox");
- gint minWidth = 85, minHeight = 0;
- d->gtk_widget_style_get(gtkButtonBox, "child-min-width", &minWidth,
- "child-min-height", &minHeight, NULL);
- if (!btn->text.isEmpty() && newSize.width() < minWidth)
- newSize.setWidth(minWidth);
- if (newSize.height() < minHeight)
- newSize.setHeight(minHeight);
- }
- break;
- case CT_Slider: {
- GtkWidget *gtkSlider = d->gtkWidget("GtkHScale");
- GtkStyle *gtkSliderStyle = d->gtk_widget_get_style(gtkSlider);
- newSize = size + QSize(2*gtkSliderStyle->xthickness, 2*gtkSliderStyle->ythickness); }
- break;
- case CT_LineEdit: {
- GtkWidget *gtkEntry = d->gtkWidget("GtkEntry");
- GtkStyle *gtkEntryStyle = d->gtk_widget_get_style(gtkEntry);
- newSize = size + QSize(2*gtkEntryStyle->xthickness, 2 + 2*gtkEntryStyle->ythickness); }
- break;
- case CT_ItemViewItem:
- newSize += QSize(0, 2);
- break;
- case CT_ComboBox:
- if (const QStyleOptionComboBox *combo = qstyleoption_cast<const QStyleOptionComboBox *>(option)) {
- GtkWidget *gtkCombo = d->gtkWidget("GtkComboBox");
- QRect arrowButtonRect = proxy()->subControlRect(CC_ComboBox, combo, SC_ComboBoxArrow, widget);
- GtkStyle *gtkComboStyle = d->gtk_widget_get_style(gtkCombo);
- newSize = size + QSize(12 + arrowButtonRect.width() + 2*gtkComboStyle->xthickness, 4 + 2*gtkComboStyle->ythickness);
-
- if (!(widget && qobject_cast<QToolBar *>(widget->parentWidget())))
- newSize += QSize(0, 2);
- }
- break;
- case CT_TabBarTab:
- if (const QStyleOptionTab *tab = qstyleoption_cast<const QStyleOptionTab *>(option)) {
- if (!tab->icon.isNull())
- newSize += QSize(6, 0);
- }
- newSize += QSize(1, 1);
- break;
- case CT_MenuBarItem:
- newSize += QSize(QGtkStylePrivate::menuItemHMargin * 4, QGtkStylePrivate::menuItemVMargin * 2 + 2);
- break;
- case CT_SizeGrip:
- newSize += QSize(4, 4);
- break;
- case CT_MdiControls:
- if (const QStyleOptionComplex *styleOpt = qstyleoption_cast<const QStyleOptionComplex *>(option)) {
- int width = 0;
- if (styleOpt->subControls & SC_MdiMinButton)
- width += 19 + 1;
- if (styleOpt->subControls & SC_MdiNormalButton)
- width += 19 + 1;
- if (styleOpt->subControls & SC_MdiCloseButton)
- width += 19 + 1;
- newSize = QSize(width, 19);
- } else {
- newSize = QSize(60, 19);
- }
- break;
- case CT_MenuItem:
- if (const QStyleOptionMenuItem *menuItem = qstyleoption_cast<const QStyleOptionMenuItem *>(option)) {
- int w = newSize.width();
- int maxpmw = menuItem->maxIconWidth;
- int tabSpacing = 20;
- if (menuItem->text.contains(QLatin1Char('\t')))
- w += tabSpacing;
- else if (menuItem->menuItemType == QStyleOptionMenuItem::SubMenu)
- w += 2 * QGtkStylePrivate::menuArrowHMargin;
- else if (menuItem->menuItemType == QStyleOptionMenuItem::DefaultItem) {
- // adjust the font and add the difference in size.
- // it would be better if the font could be adjusted in the initStyleOption qmenu func!!
- QFontMetrics fm(menuItem->font);
- QFont fontBold = menuItem->font;
- fontBold.setBold(true);
- QFontMetrics fmBold(fontBold);
- w += fmBold.width(menuItem->text) - fm.width(menuItem->text);
- }
-
- int checkcol = qMax<int>(maxpmw, QGtkStylePrivate::menuCheckMarkWidth); // Windows always shows a check column
- w += checkcol;
- w += int(QGtkStylePrivate::menuRightBorder) + 10;
-
- newSize.setWidth(w);
-
- int textMargin = 8;
- if (menuItem->menuItemType == QStyleOptionMenuItem::Separator) {
- GtkWidget *gtkMenuSeparator = d->gtkWidget("GtkMenu.GtkSeparatorMenuItem");
- GtkRequisition sizeReq = {0, 0};
- d->gtk_widget_size_request(gtkMenuSeparator, &sizeReq);
- newSize = QSize(newSize.width(), sizeReq.height);
- break;
- }
-
- GtkWidget *gtkMenuItem = d->gtkWidget("GtkMenu.GtkCheckMenuItem");
- GtkStyle* style = d->gtk_widget_get_style(gtkMenuItem);
-
- // Note we get the perfect height for the default font since we
- // set a fake text label on the gtkMenuItem
- // But if custom fonts are used on the widget we need a minimum size
- GtkRequisition sizeReq = {0, 0};
- d->gtk_widget_size_request(gtkMenuItem, &sizeReq);
- newSize.setHeight(qMax(newSize.height() - 4, sizeReq.height));
- newSize += QSize(textMargin + style->xthickness - 1, 0);
-
- gint checkSize;
- d->gtk_widget_style_get(gtkMenuItem, "indicator-size", &checkSize, NULL);
- newSize.setWidth(newSize.width() + qMax(0, checkSize - 20));
- }
- break;
- default:
- break;
- }
-
- return newSize;
-}
-
-
-/*! \reimp */
-QPixmap QGtkStyle::standardPixmap(StandardPixmap sp, const QStyleOption *option,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::standardPixmap(sp, option, widget);
-
- QPixmap pixmap;
- switch (sp) {
-
- case SP_TitleBarNormalButton: {
- QImage restoreButton(dock_widget_restore_xpm);
- QColor alphaCorner = restoreButton.color(2);
- alphaCorner.setAlpha(80);
- restoreButton.setColor(2, alphaCorner.rgba());
- alphaCorner.setAlpha(180);
- restoreButton.setColor(4, alphaCorner.rgba());
- return QPixmap::fromImage(restoreButton);
- }
- break;
-
- case SP_TitleBarCloseButton: // Fall through
- case SP_DockWidgetCloseButton: {
-
- QImage closeButton(dock_widget_close_xpm);
- QColor alphaCorner = closeButton.color(2);
- alphaCorner.setAlpha(80);
- closeButton.setColor(2, alphaCorner.rgba());
- return QPixmap::fromImage(closeButton);
- }
- break;
-
- case SP_DialogDiscardButton:
- return qt_gtk_get_icon(GTK_STOCK_DELETE);
- case SP_DialogOkButton:
- return qt_gtk_get_icon(GTK_STOCK_OK);
- case SP_DialogCancelButton:
- return qt_gtk_get_icon(GTK_STOCK_CANCEL);
- case SP_DialogYesButton:
- return qt_gtk_get_icon(GTK_STOCK_YES);
- case SP_DialogNoButton:
- return qt_gtk_get_icon(GTK_STOCK_NO);
- case SP_DialogOpenButton:
- return qt_gtk_get_icon(GTK_STOCK_OPEN);
- case SP_DialogCloseButton:
- return qt_gtk_get_icon(GTK_STOCK_CLOSE);
- case SP_DialogApplyButton:
- return qt_gtk_get_icon(GTK_STOCK_APPLY);
- case SP_DialogSaveButton:
- return qt_gtk_get_icon(GTK_STOCK_SAVE);
- case SP_MessageBoxWarning:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxQuestion:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxInformation:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxCritical:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
- default:
- return QCommonStyle::standardPixmap(sp, option, widget);
- }
- return pixmap;
-}
-
-/*!
- \reimp
-*/
-QIcon QGtkStyle::standardIcon(StandardPixmap standardIcon,
- const QStyleOption *option,
- const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- if (!d->isThemeAvailable())
- return QCommonStyle::standardIcon(standardIcon, option, widget);
- switch (standardIcon) {
- case SP_DialogDiscardButton:
- return qt_gtk_get_icon(GTK_STOCK_DELETE);
- case SP_DialogOkButton:
- return qt_gtk_get_icon(GTK_STOCK_OK);
- case SP_DialogCancelButton:
- return qt_gtk_get_icon(GTK_STOCK_CANCEL);
- case SP_DialogYesButton:
- return qt_gtk_get_icon(GTK_STOCK_YES);
- case SP_DialogNoButton:
- return qt_gtk_get_icon(GTK_STOCK_NO);
- case SP_DialogOpenButton:
- return qt_gtk_get_icon(GTK_STOCK_OPEN);
- case SP_DialogCloseButton:
- return qt_gtk_get_icon(GTK_STOCK_CLOSE);
- case SP_DialogApplyButton:
- return qt_gtk_get_icon(GTK_STOCK_APPLY);
- case SP_DialogSaveButton:
- return qt_gtk_get_icon(GTK_STOCK_SAVE);
- case SP_MessageBoxWarning:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxQuestion:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_QUESTION, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxInformation:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
- case SP_MessageBoxCritical:
- return qt_gtk_get_icon(GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
- default:
- return QCommonStyle::standardIcon(standardIcon, option, widget);
- }
-}
-
-
-/*! \reimp */
-QRect QGtkStyle::subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const
-{
- Q_D(const QGtkStyle);
-
- QRect r = QCommonStyle::subElementRect(element, option, widget);
- if (!d->isThemeAvailable())
- return r;
-
- switch (element) {
- case SE_PushButtonFocusRect:
- r.adjust(0, 1, 0, -1);
- break;
- case SE_DockWidgetTitleBarText: {
- const QStyleOptionDockWidgetV2 *v2
- = qstyleoption_cast<const QStyleOptionDockWidgetV2*>(option);
- bool verticalTitleBar = v2 == 0 ? false : v2->verticalTitleBar;
- if (verticalTitleBar) {
- r.adjust(0, 0, 0, -4);
- } else {
- if (option->direction == Qt::LeftToRight)
- r.adjust(4, 0, 0, 0);
- else
- r.adjust(0, 0, -4, 0);
- }
-
- break;
- }
- case SE_ProgressBarLabel:
- case SE_ProgressBarContents:
- case SE_ProgressBarGroove:
- return option->rect;
- case SE_PushButtonContents:
- if (!d->gtk_check_version(2, 10, 0)) {
- GtkWidget *gtkButton = d->gtkWidget("GtkButton");
- GtkBorder *border = 0;
- d->gtk_widget_style_get(gtkButton, "inner-border", &border, NULL);
- if (border) {
- r = option->rect.adjusted(border->left, border->top, -border->right, -border->bottom);
- d->gtk_border_free(border);
- } else {
- r = option->rect.adjusted(1, 1, -1, -1);
- }
- r = visualRect(option->direction, option->rect, r);
- }
- break;
- default:
- break;
- }
-
- return r;
-}
-
-/*!
- \reimp
-*/
-QRect QGtkStyle::itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const
-{
- return QCommonStyle::itemPixmapRect(r, flags, pixmap);
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawItemPixmap(QPainter *painter, const QRect &rect,
- int alignment, const QPixmap &pixmap) const
-{
- QCommonStyle::drawItemPixmap(painter, rect, alignment, pixmap);
-}
-
-/*!
- \reimp
-*/
-QStyle::SubControl QGtkStyle::hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
- const QPoint &pt, const QWidget *w) const
-{
- return QCommonStyle::hitTestComplexControl(cc, opt, pt, w);
-}
-
-/*!
- \reimp
-*/
-QPixmap QGtkStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
- const QStyleOption *opt) const
-{
- return QCommonStyle::generatedIconPixmap(iconMode, pixmap, opt);
-}
-
-/*!
- \reimp
-*/
-void QGtkStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal,
- bool enabled, const QString& text, QPalette::ColorRole textRole) const
-{
- return QCommonStyle::drawItemText(painter, rect, alignment, pal, enabled, text, textRole);
-}
-
-QT_END_NAMESPACE
-
-#endif //!defined(QT_NO_STYLE_QGTK)
diff --git a/src/widgets/styles/qgtkstyle_p.cpp b/src/widgets/styles/qgtkstyle_p.cpp
deleted file mode 100644
index 00682c1c0f..0000000000
--- a/src/widgets/styles/qgtkstyle_p.cpp
+++ /dev/null
@@ -1,891 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgtkstyle_p_p.h"
-
-// This file is responsible for resolving all GTK functions we use
-// dynamically. This is done to avoid link-time dependancy on GTK
-// as well as crashes occurring due to usage of the GTK_QT engines
-//
-// Additionally we create a map of common GTK widgets that we can pass
-// to the GTK theme engine as many engines resort to querying the
-// actual widget pointers for details that are not covered by the
-// state flags
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <QtCore/QEvent>
-#include <QtCore/QFile>
-#include <QtCore/QStringList>
-#include <QtCore/QTextStream>
-#include <QtCore/QHash>
-#include <QtCore/QUrl>
-#include <QtCore/QLibrary>
-#include <QtCore/QDebug>
-
-#include <private/qgtk2painter_p.h>
-#include <private/qapplication_p.h>
-#include <private/qiconloader_p.h>
-#include <qpa/qplatformfontdatabase.h>
-
-#include <QtWidgets/QMenu>
-#include <QtWidgets/QStyle>
-#include <QtWidgets/QApplication>
-#include <QtGui/QPixmapCache>
-#include <QtWidgets/QStatusBar>
-#include <QtWidgets/QMenuBar>
-#include <QtWidgets/QToolBar>
-#include <QtWidgets/QToolButton>
-
-#ifndef Q_OS_MAC
-// X11 Includes:
-
-// the following is necessary to work around breakage in many versions
-// of XFree86's Xlib.h still in use
-// ### which versions?
-#if defined(_XLIB_H_) // crude hack, but...
-#error "cannot include <X11/Xlib.h> before this file"
-#endif
-#define XRegisterIMInstantiateCallback qt_XRegisterIMInstantiateCallback
-#define XUnregisterIMInstantiateCallback qt_XUnregisterIMInstantiateCallback
-#define XSetIMValues qt_XSetIMValues
-#include <X11/Xlib.h>
-#undef XRegisterIMInstantiateCallback
-#undef XUnregisterIMInstantiateCallback
-#undef XSetIMValues
-#endif
-
-QT_BEGIN_NAMESPACE
-
-Q_GLOBAL_STATIC(QGtkStyleUpdateScheduler, styleScheduler)
-
-Ptr_gtk_container_forall QGtkStylePrivate::gtk_container_forall = 0;
-Ptr_gtk_init QGtkStylePrivate::gtk_init = 0;
-Ptr_gtk_style_attach QGtkStylePrivate::gtk_style_attach = 0;
-Ptr_gtk_window_new QGtkStylePrivate::gtk_window_new = 0;
-Ptr_gtk_widget_destroy QGtkStylePrivate::gtk_widget_destroy = 0;
-Ptr_gtk_widget_realize QGtkStylePrivate::gtk_widget_realize = 0;
-Ptr_gtk_widget_set_default_direction QGtkStylePrivate::gtk_widget_set_default_direction = 0;
-Ptr_gtk_widget_modify_color QGtkStylePrivate::gtk_widget_modify_fg = 0;
-Ptr_gtk_widget_modify_color QGtkStylePrivate::gtk_widget_modify_bg = 0;
-Ptr_gtk_arrow_new QGtkStylePrivate::gtk_arrow_new = 0;
-Ptr_gtk_menu_item_new_with_label QGtkStylePrivate::gtk_menu_item_new_with_label = 0;
-Ptr_gtk_check_menu_item_new_with_label QGtkStylePrivate::gtk_check_menu_item_new_with_label = 0;
-Ptr_gtk_menu_bar_new QGtkStylePrivate::gtk_menu_bar_new = 0;
-Ptr_gtk_menu_new QGtkStylePrivate::gtk_menu_new = 0;
-Ptr_gtk_button_new QGtkStylePrivate::gtk_button_new = 0;
-Ptr_gtk_tool_button_new QGtkStylePrivate::gtk_tool_button_new = 0;
-Ptr_gtk_hbutton_box_new QGtkStylePrivate::gtk_hbutton_box_new = 0;
-Ptr_gtk_check_button_new QGtkStylePrivate::gtk_check_button_new = 0;
-Ptr_gtk_radio_button_new QGtkStylePrivate::gtk_radio_button_new = 0;
-Ptr_gtk_spin_button_new QGtkStylePrivate::gtk_spin_button_new = 0;
-Ptr_gtk_frame_new QGtkStylePrivate::gtk_frame_new = 0;
-Ptr_gtk_expander_new QGtkStylePrivate::gtk_expander_new = 0;
-Ptr_gtk_statusbar_new QGtkStylePrivate::gtk_statusbar_new = 0;
-Ptr_gtk_entry_new QGtkStylePrivate::gtk_entry_new = 0;
-Ptr_gtk_hscale_new QGtkStylePrivate::gtk_hscale_new = 0;
-Ptr_gtk_vscale_new QGtkStylePrivate::gtk_vscale_new = 0;
-Ptr_gtk_hscrollbar_new QGtkStylePrivate::gtk_hscrollbar_new = 0;
-Ptr_gtk_vscrollbar_new QGtkStylePrivate::gtk_vscrollbar_new = 0;
-Ptr_gtk_scrolled_window_new QGtkStylePrivate::gtk_scrolled_window_new = 0;
-Ptr_gtk_notebook_new QGtkStylePrivate::gtk_notebook_new = 0;
-Ptr_gtk_toolbar_new QGtkStylePrivate::gtk_toolbar_new = 0;
-Ptr_gtk_toolbar_insert QGtkStylePrivate::gtk_toolbar_insert = 0;
-Ptr_gtk_separator_tool_item_new QGtkStylePrivate::gtk_separator_tool_item_new = 0;
-Ptr_gtk_tree_view_new QGtkStylePrivate::gtk_tree_view_new = 0;
-Ptr_gtk_combo_box_new QGtkStylePrivate::gtk_combo_box_new = 0;
-Ptr_gtk_combo_box_entry_new QGtkStylePrivate::gtk_combo_box_entry_new = 0;
-Ptr_gtk_progress_bar_new QGtkStylePrivate::gtk_progress_bar_new = 0;
-Ptr_gtk_container_add QGtkStylePrivate::gtk_container_add = 0;
-Ptr_gtk_menu_shell_append QGtkStylePrivate::gtk_menu_shell_append = 0;
-Ptr_gtk_range_get_adjustment QGtkStylePrivate::gtk_range_get_adjustment = 0;
-Ptr_gtk_range_set_adjustment QGtkStylePrivate::gtk_range_set_adjustment = 0;
-Ptr_gtk_range_set_inverted QGtkStylePrivate::gtk_range_set_inverted = 0;
-Ptr_gtk_icon_factory_lookup_default QGtkStylePrivate::gtk_icon_factory_lookup_default = 0;
-Ptr_gtk_icon_theme_get_default QGtkStylePrivate::gtk_icon_theme_get_default = 0;
-Ptr_gtk_widget_get_style QGtkStylePrivate::gtk_widget_get_style = 0;
-Ptr_gtk_widget_style_get QGtkStylePrivate::gtk_widget_style_get = 0;
-Ptr_gtk_icon_set_render_icon QGtkStylePrivate::gtk_icon_set_render_icon = 0;
-Ptr_gtk_fixed_new QGtkStylePrivate::gtk_fixed_new = 0;
-Ptr_gtk_tree_view_column_new QGtkStylePrivate::gtk_tree_view_column_new = 0;
-Ptr_gtk_tree_view_get_column QGtkStylePrivate::gtk_tree_view_get_column = 0;
-Ptr_gtk_tree_view_append_column QGtkStylePrivate::gtk_tree_view_append_column = 0;
-Ptr_gtk_adjustment_configure QGtkStylePrivate::gtk_adjustment_configure = 0;
-Ptr_gtk_adjustment_new QGtkStylePrivate::gtk_adjustment_new = 0;
-Ptr_gtk_menu_item_set_submenu QGtkStylePrivate::gtk_menu_item_set_submenu = 0;
-Ptr_gtk_settings_get_default QGtkStylePrivate::gtk_settings_get_default = 0;
-Ptr_gtk_separator_menu_item_new QGtkStylePrivate::gtk_separator_menu_item_new = 0;
-Ptr_gtk_widget_size_allocate QGtkStylePrivate::gtk_widget_size_allocate = 0;
-Ptr_gtk_widget_size_request QGtkStylePrivate::gtk_widget_size_request = 0;
-Ptr_gtk_widget_set_direction QGtkStylePrivate::gtk_widget_set_direction = 0;
-Ptr_gtk_widget_path QGtkStylePrivate::gtk_widget_path = 0;
-Ptr_gtk_container_get_type QGtkStylePrivate::gtk_container_get_type = 0;
-Ptr_gtk_window_get_type QGtkStylePrivate::gtk_window_get_type = 0;
-Ptr_gtk_widget_get_type QGtkStylePrivate::gtk_widget_get_type = 0;
-Ptr_gtk_widget_get_parent QGtkStylePrivate::gtk_widget_get_parent = 0;
-Ptr_gtk_widget_is_toplevel QGtkStylePrivate::gtk_widget_is_toplevel = 0;
-Ptr_gtk_widget_get_toplevel QGtkStylePrivate::gtk_widget_get_toplevel = 0;
-Ptr_gtk_rc_get_style_by_paths QGtkStylePrivate::gtk_rc_get_style_by_paths = 0;
-Ptr_gtk_check_version QGtkStylePrivate::gtk_check_version = 0;
-Ptr_gtk_border_free QGtkStylePrivate::gtk_border_free = 0;
-Ptr_gtk_widget_get_allocation QGtkStylePrivate::gtk_widget_get_allocation = 0;
-Ptr_gtk_widget_set_allocation QGtkStylePrivate::gtk_widget_set_allocation = 0;
-Ptr_gtk_widget_set_can_default QGtkStylePrivate::gtk_widget_set_can_default = 0;
-Ptr_gtk_window_set_default QGtkStylePrivate::gtk_window_set_default = 0;
-
-Ptr_gdk_event_new QGtkStylePrivate::gdk_event_new = 0;
-Ptr_gdk_event_free QGtkStylePrivate::gdk_event_free = 0;
-Ptr_gtk_widget_send_focus_change QGtkStylePrivate::gtk_widget_send_focus_change = 0;
-
-Ptr_pango_font_description_get_size QGtkStylePrivate::pango_font_description_get_size = 0;
-Ptr_pango_font_description_get_weight QGtkStylePrivate::pango_font_description_get_weight = 0;
-Ptr_pango_font_description_get_family QGtkStylePrivate::pango_font_description_get_family = 0;
-Ptr_pango_font_description_get_style QGtkStylePrivate::pango_font_description_get_style = 0;
-
-Ptr_gdk_pixbuf_get_pixels QGtkStylePrivate::gdk_pixbuf_get_pixels = 0;
-Ptr_gdk_pixbuf_get_width QGtkStylePrivate::gdk_pixbuf_get_width = 0;
-Ptr_gdk_pixbuf_get_height QGtkStylePrivate::gdk_pixbuf_get_height = 0;
-Ptr_gdk_pixbuf_new QGtkStylePrivate::gdk_pixbuf_new = 0;
-Ptr_gdk_pixbuf_unref QGtkStylePrivate::gdk_pixbuf_unref = 0;
-Ptr_gdk_color_free QGtkStylePrivate::gdk_color_free = 0;
-Ptr_gdk_x11_window_set_user_time QGtkStylePrivate::gdk_x11_window_set_user_time = 0;
-Ptr_gdk_x11_drawable_get_xid QGtkStylePrivate::gdk_x11_drawable_get_xid = 0;
-Ptr_gdk_x11_drawable_get_xdisplay QGtkStylePrivate::gdk_x11_drawable_get_xdisplay = 0;
-
-Ptr_gconf_client_get_default QGtkStylePrivate::gconf_client_get_default = 0;
-Ptr_gconf_client_get_string QGtkStylePrivate::gconf_client_get_string = 0;
-Ptr_gconf_client_get_bool QGtkStylePrivate::gconf_client_get_bool = 0;
-
-Ptr_gnome_icon_lookup_sync QGtkStylePrivate::gnome_icon_lookup_sync = 0;
-Ptr_gnome_vfs_init QGtkStylePrivate::gnome_vfs_init = 0;
-
-#ifndef Q_OS_MAC
-typedef int (*x11ErrorHandler)(Display*, XErrorEvent*);
-#endif
-
-QT_END_NAMESPACE
-
-Q_DECLARE_METATYPE(QGtkStylePrivate*);
-
-QT_BEGIN_NAMESPACE
-
-static void gtkStyleSetCallback(GtkWidget*)
-{
- qRegisterMetaType<QGtkStylePrivate *>();
-
- // We have to let this function return and complete the event
- // loop to ensure that all gtk widgets have been styled before
- // updating
- QMetaObject::invokeMethod(styleScheduler(), "updateTheme", Qt::QueuedConnection);
-}
-
-static void update_toolbar_style(GtkWidget *gtkToolBar, GParamSpec *, gpointer)
-{
- GtkToolbarStyle toolbar_style = GTK_TOOLBAR_ICONS;
- g_object_get(gtkToolBar, "toolbar-style", &toolbar_style, NULL);
- QWidgetList widgets = QApplication::allWidgets();
- for (int i = 0; i < widgets.size(); ++i) {
- QWidget *widget = widgets.at(i);
- if (qobject_cast<QToolButton*>(widget)) {
- QEvent event(QEvent::StyleChange);
- QApplication::sendEvent(widget, &event);
- }
- }
-}
-
-static QHashableLatin1Literal classPath(GtkWidget *widget)
-{
- char *class_path;
- QGtkStylePrivate::gtk_widget_path (widget, NULL, &class_path, NULL);
-
- char *copy = class_path;
- if (strncmp(copy, "GtkWindow.", 10) == 0)
- copy += 10;
- if (strncmp(copy, "GtkFixed.", 9) == 0)
- copy += 9;
-
- copy = strdup(copy);
-
- g_free(class_path);
-
- return QHashableLatin1Literal::fromData(copy);
-}
-
-
-
-bool QGtkStyleFilter::eventFilter(QObject *obj, QEvent *e)
-{
- if (e->type() == QEvent::ApplicationPaletteChange) {
- // Only do this the first time since this will also
- // generate applicationPaletteChange events
- if (!qt_app_palettes_hash() || qt_app_palettes_hash()->isEmpty()) {
- stylePrivate->applyCustomPaletteHash();
- }
- }
- return QObject::eventFilter(obj, e);
-}
-
-QList<QGtkStylePrivate *> QGtkStylePrivate::instances;
-QGtkStylePrivate::WidgetMap *QGtkStylePrivate::widgetMap = 0;
-
-QGtkStylePrivate::QGtkStylePrivate()
- : QCommonStylePrivate()
- , filter(this)
-{
- instances.append(this);
- animationFps = 60;
-}
-
-QGtkStylePrivate::~QGtkStylePrivate()
-{
- instances.removeOne(this);
-}
-
-void QGtkStylePrivate::init()
-{
- resolveGtk();
- initGtkWidgets();
-}
-
-QGtkPainter* QGtkStylePrivate::gtkPainter(QPainter *painter)
-{
- // TODO: choose between gtk2 and gtk3
- static QGtk2Painter instance;
- instance.reset(painter);
- return &instance;
-}
-
-GtkWidget* QGtkStylePrivate::gtkWidget(const QHashableLatin1Literal &path)
-{
- GtkWidget *widget = gtkWidgetMap()->value(path);
- if (!widget) {
- // Theme might have rearranged widget internals
- widget = gtkWidgetMap()->value(path);
- }
- return widget;
-}
-
-GtkStyle* QGtkStylePrivate::gtkStyle(const QHashableLatin1Literal &path)
-{
- if (GtkWidget *w = gtkWidgetMap()->value(path))
- return QGtkStylePrivate::gtk_widget_get_style(w);
- return 0;
-}
-
-void QGtkStylePrivate::gtkWidgetSetFocus(GtkWidget *widget, bool focus)
-{
- if (QGtkStylePrivate::gtk_widget_send_focus_change) {
- GdkEvent *event = QGtkStylePrivate::gdk_event_new(GDK_FOCUS_CHANGE);
- event->focus_change.type = GDK_FOCUS_CHANGE;
- event->focus_change.in = focus;
- QGtkStylePrivate::gtk_widget_send_focus_change(widget, event);
- QGtkStylePrivate::gdk_event_free(event);
- } else {
-#if defined(GTK_WIDGET_SET_FLAGS) && defined(GTK_WIDGET_UNSET_FLAGS)
- if (focus)
- GTK_WIDGET_SET_FLAGS(widget, GTK_HAS_FOCUS);
- else
- GTK_WIDGET_UNSET_FLAGS(widget, GTK_HAS_FOCUS);
-#endif
- }
-}
-
-/*! \internal
- * Get references to gtk functions after we dynamically load the library.
- */
-void QGtkStylePrivate::resolveGtk() const
-{
-#ifndef QT_NO_LIBRARY
- // enforce the "0" suffix, so we'll open libgtk-x11-2.0.so.0
- QLibrary libgtk(QLS("gtk-x11-2.0"), 0, 0);
-
- gtk_init = (Ptr_gtk_init)libgtk.resolve("gtk_init");
- gtk_window_new = (Ptr_gtk_window_new)libgtk.resolve("gtk_window_new");
- gtk_style_attach = (Ptr_gtk_style_attach)libgtk.resolve("gtk_style_attach");
- gtk_widget_destroy = (Ptr_gtk_widget_destroy)libgtk.resolve("gtk_widget_destroy");
- gtk_widget_realize = (Ptr_gtk_widget_realize)libgtk.resolve("gtk_widget_realize");
-
- gdk_pixbuf_get_pixels = (Ptr_gdk_pixbuf_get_pixels)libgtk.resolve("gdk_pixbuf_get_pixels");
- gdk_pixbuf_get_width = (Ptr_gdk_pixbuf_get_width)libgtk.resolve("gdk_pixbuf_get_width");
- gdk_pixbuf_get_height = (Ptr_gdk_pixbuf_get_height)libgtk.resolve("gdk_pixbuf_get_height");
- gdk_pixbuf_new = (Ptr_gdk_pixbuf_new)libgtk.resolve("gdk_pixbuf_new");
- gdk_pixbuf_unref = (Ptr_gdk_pixbuf_unref)libgtk.resolve("gdk_pixbuf_unref");
- gdk_color_free = (Ptr_gdk_color_free)libgtk.resolve("gdk_color_free");
- gdk_x11_window_set_user_time = (Ptr_gdk_x11_window_set_user_time)libgtk.resolve("gdk_x11_window_set_user_time");
- gdk_x11_drawable_get_xid = (Ptr_gdk_x11_drawable_get_xid)libgtk.resolve("gdk_x11_drawable_get_xid");
- gdk_x11_drawable_get_xdisplay = (Ptr_gdk_x11_drawable_get_xdisplay)libgtk.resolve("gdk_x11_drawable_get_xdisplay");
-
- gtk_widget_set_default_direction = (Ptr_gtk_widget_set_default_direction)libgtk.resolve("gtk_widget_set_default_direction");
- gtk_widget_modify_fg = (Ptr_gtk_widget_modify_color)libgtk.resolve("gtk_widget_modify_fg");
- gtk_widget_modify_bg = (Ptr_gtk_widget_modify_color)libgtk.resolve("gtk_widget_modify_bg");
- gtk_arrow_new = (Ptr_gtk_arrow_new)libgtk.resolve("gtk_arrow_new");
- gtk_menu_item_new_with_label = (Ptr_gtk_menu_item_new_with_label)libgtk.resolve("gtk_menu_item_new_with_label");
- gtk_check_menu_item_new_with_label = (Ptr_gtk_check_menu_item_new_with_label)libgtk.resolve("gtk_check_menu_item_new_with_label");
- gtk_menu_bar_new = (Ptr_gtk_menu_bar_new)libgtk.resolve("gtk_menu_bar_new");
- gtk_menu_new = (Ptr_gtk_menu_new)libgtk.resolve("gtk_menu_new");
- gtk_toolbar_new = (Ptr_gtk_toolbar_new)libgtk.resolve("gtk_toolbar_new");
- gtk_separator_tool_item_new = (Ptr_gtk_separator_tool_item_new)libgtk.resolve("gtk_separator_tool_item_new");
- gtk_toolbar_insert = (Ptr_gtk_toolbar_insert)libgtk.resolve("gtk_toolbar_insert");
- gtk_button_new = (Ptr_gtk_button_new)libgtk.resolve("gtk_button_new");
- gtk_tool_button_new = (Ptr_gtk_tool_button_new)libgtk.resolve("gtk_tool_button_new");
- gtk_hbutton_box_new = (Ptr_gtk_hbutton_box_new)libgtk.resolve("gtk_hbutton_box_new");
- gtk_check_button_new = (Ptr_gtk_check_button_new)libgtk.resolve("gtk_check_button_new");
- gtk_radio_button_new = (Ptr_gtk_radio_button_new)libgtk.resolve("gtk_radio_button_new");
- gtk_notebook_new = (Ptr_gtk_notebook_new)libgtk.resolve("gtk_notebook_new");
- gtk_progress_bar_new = (Ptr_gtk_progress_bar_new)libgtk.resolve("gtk_progress_bar_new");
- gtk_spin_button_new = (Ptr_gtk_spin_button_new)libgtk.resolve("gtk_spin_button_new");
- gtk_hscale_new = (Ptr_gtk_hscale_new)libgtk.resolve("gtk_hscale_new");
- gtk_vscale_new = (Ptr_gtk_vscale_new)libgtk.resolve("gtk_vscale_new");
- gtk_hscrollbar_new = (Ptr_gtk_hscrollbar_new)libgtk.resolve("gtk_hscrollbar_new");
- gtk_vscrollbar_new = (Ptr_gtk_vscrollbar_new)libgtk.resolve("gtk_vscrollbar_new");
- gtk_scrolled_window_new = (Ptr_gtk_scrolled_window_new)libgtk.resolve("gtk_scrolled_window_new");
- gtk_menu_shell_append = (Ptr_gtk_menu_shell_append)libgtk.resolve("gtk_menu_shell_append");
- gtk_entry_new = (Ptr_gtk_entry_new)libgtk.resolve("gtk_entry_new");
- gtk_tree_view_new = (Ptr_gtk_tree_view_new)libgtk.resolve("gtk_tree_view_new");
- gtk_combo_box_new = (Ptr_gtk_combo_box_new)libgtk.resolve("gtk_combo_box_new");
- gtk_combo_box_entry_new = (Ptr_gtk_combo_box_entry_new)libgtk.resolve("gtk_combo_box_entry_new");
- gtk_range_get_adjustment = (Ptr_gtk_range_get_adjustment)libgtk.resolve("gtk_range_get_adjustment");
- gtk_range_set_adjustment = (Ptr_gtk_range_set_adjustment)libgtk.resolve("gtk_range_set_adjustment");
- gtk_range_set_inverted = (Ptr_gtk_range_set_inverted)libgtk.resolve("gtk_range_set_inverted");
- gtk_container_add = (Ptr_gtk_container_add)libgtk.resolve("gtk_container_add");
- gtk_icon_factory_lookup_default = (Ptr_gtk_icon_factory_lookup_default)libgtk.resolve("gtk_icon_factory_lookup_default");
- gtk_icon_theme_get_default = (Ptr_gtk_icon_theme_get_default)libgtk.resolve("gtk_icon_theme_get_default");
- gtk_widget_get_style = (Ptr_gtk_widget_get_style)libgtk.resolve("gtk_widget_get_style");
- gtk_widget_style_get = (Ptr_gtk_widget_style_get)libgtk.resolve("gtk_widget_style_get");
- gtk_icon_set_render_icon = (Ptr_gtk_icon_set_render_icon)libgtk.resolve("gtk_icon_set_render_icon");
- gtk_fixed_new = (Ptr_gtk_fixed_new)libgtk.resolve("gtk_fixed_new");
- gtk_tree_view_column_new = (Ptr_gtk_tree_view_column_new)libgtk.resolve("gtk_tree_view_column_new");
- gtk_tree_view_append_column= (Ptr_gtk_tree_view_append_column )libgtk.resolve("gtk_tree_view_append_column");
- gtk_tree_view_get_column = (Ptr_gtk_tree_view_get_column )libgtk.resolve("gtk_tree_view_get_column");
- gtk_adjustment_configure = (Ptr_gtk_adjustment_configure)libgtk.resolve("gtk_adjustment_configure");
- gtk_adjustment_new = (Ptr_gtk_adjustment_new)libgtk.resolve("gtk_adjustment_new");
- gtk_menu_item_set_submenu = (Ptr_gtk_menu_item_set_submenu)libgtk.resolve("gtk_menu_item_set_submenu");
- gtk_settings_get_default = (Ptr_gtk_settings_get_default)libgtk.resolve("gtk_settings_get_default");
- gtk_separator_menu_item_new = (Ptr_gtk_separator_menu_item_new)libgtk.resolve("gtk_separator_menu_item_new");
- gtk_frame_new = (Ptr_gtk_frame_new)libgtk.resolve("gtk_frame_new");
- gtk_expander_new = (Ptr_gtk_expander_new)libgtk.resolve("gtk_expander_new");
- gtk_statusbar_new = (Ptr_gtk_statusbar_new)libgtk.resolve("gtk_statusbar_new");
- gtk_container_forall = (Ptr_gtk_container_forall)libgtk.resolve("gtk_container_forall");
- gtk_widget_size_allocate =(Ptr_gtk_widget_size_allocate)libgtk.resolve("gtk_widget_size_allocate");
- gtk_widget_size_request =(Ptr_gtk_widget_size_request)libgtk.resolve("gtk_widget_size_request");
- gtk_widget_set_direction =(Ptr_gtk_widget_set_direction)libgtk.resolve("gtk_widget_set_direction");
- gtk_widget_path =(Ptr_gtk_widget_path)libgtk.resolve("gtk_widget_path");
- gtk_container_get_type =(Ptr_gtk_container_get_type)libgtk.resolve("gtk_container_get_type");
- gtk_window_get_type =(Ptr_gtk_window_get_type)libgtk.resolve("gtk_window_get_type");
- gtk_widget_get_type =(Ptr_gtk_widget_get_type)libgtk.resolve("gtk_widget_get_type");
- gtk_widget_get_parent =(Ptr_gtk_widget_get_parent)libgtk.resolve("gtk_widget_get_parent");
- gtk_widget_is_toplevel =(Ptr_gtk_widget_is_toplevel)libgtk.resolve("gtk_widget_is_toplevel");
- gtk_widget_get_toplevel =(Ptr_gtk_widget_get_toplevel)libgtk.resolve("gtk_widget_get_toplevel");
-
- gtk_rc_get_style_by_paths =(Ptr_gtk_rc_get_style_by_paths)libgtk.resolve("gtk_rc_get_style_by_paths");
- gtk_check_version =(Ptr_gtk_check_version)libgtk.resolve("gtk_check_version");
- gtk_border_free =(Ptr_gtk_border_free)libgtk.resolve("gtk_border_free");
- gtk_widget_get_allocation = (Ptr_gtk_widget_get_allocation)libgtk.resolve("gtk_widget_get_allocation");
- gtk_widget_set_allocation = (Ptr_gtk_widget_set_allocation)libgtk.resolve("gtk_widget_set_allocation");
-
- gtk_widget_set_can_default = (Ptr_gtk_widget_set_can_default)libgtk.resolve("gtk_widget_set_can_default");
- gtk_window_set_default = (Ptr_gtk_window_set_default)libgtk.resolve("gtk_window_set_default");
-
- gdk_event_new = (Ptr_gdk_event_new)libgtk.resolve("gdk_event_new");
- gdk_event_free = (Ptr_gdk_event_free)libgtk.resolve("gdk_event_free");
- gtk_widget_send_focus_change = (Ptr_gtk_widget_send_focus_change)libgtk.resolve("gtk_widget_send_focus_change");
-
- pango_font_description_get_size = (Ptr_pango_font_description_get_size)libgtk.resolve("pango_font_description_get_size");
- pango_font_description_get_weight = (Ptr_pango_font_description_get_weight)libgtk.resolve("pango_font_description_get_weight");
- pango_font_description_get_family = (Ptr_pango_font_description_get_family)libgtk.resolve("pango_font_description_get_family");
- pango_font_description_get_style = (Ptr_pango_font_description_get_style)libgtk.resolve("pango_font_description_get_style");
-
- gnome_icon_lookup_sync = (Ptr_gnome_icon_lookup_sync)QLibrary::resolve(QLS("gnomeui-2"), 0, "gnome_icon_lookup_sync");
- gnome_vfs_init= (Ptr_gnome_vfs_init)QLibrary::resolve(QLS("gnomevfs-2"), 0, "gnome_vfs_init");
-#endif // !QT_NO_LIBRARY
-}
-
-/* \internal
- * Initializes a number of gtk menu widgets.
- * The widgets are cached.
- */
-void QGtkStylePrivate::initGtkMenu() const
-{
- // Create menubar
- GtkWidget *gtkMenuBar = QGtkStylePrivate::gtk_menu_bar_new();
- setupGtkWidget(gtkMenuBar);
-
- GtkWidget *gtkMenuBarItem = QGtkStylePrivate::gtk_menu_item_new_with_label("X");
- gtk_menu_shell_append((GtkMenuShell*)(gtkMenuBar), gtkMenuBarItem);
- gtk_widget_realize(gtkMenuBarItem);
-
- // Create menu
- GtkWidget *gtkMenu = QGtkStylePrivate::gtk_menu_new();
- gtk_menu_item_set_submenu((GtkMenuItem*)(gtkMenuBarItem), gtkMenu);
- gtk_widget_realize(gtkMenu);
-
- GtkWidget *gtkMenuItem = QGtkStylePrivate::gtk_menu_item_new_with_label("X");
- gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkMenuItem);
- gtk_widget_realize(gtkMenuItem);
-
- GtkWidget *gtkCheckMenuItem = QGtkStylePrivate::gtk_check_menu_item_new_with_label("X");
- gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkCheckMenuItem);
- gtk_widget_realize(gtkCheckMenuItem);
-
- GtkWidget *gtkMenuSeparator = QGtkStylePrivate::gtk_separator_menu_item_new();
- gtk_menu_shell_append((GtkMenuShell*)gtkMenu, gtkMenuSeparator);
-
- addAllSubWidgets(gtkMenuBar);
- addAllSubWidgets(gtkMenu);
-}
-
-
-void QGtkStylePrivate::initGtkTreeview() const
-{
- GtkWidget *gtkTreeView = gtk_tree_view_new();
- gtk_tree_view_append_column((GtkTreeView*)gtkTreeView, gtk_tree_view_column_new());
- gtk_tree_view_append_column((GtkTreeView*)gtkTreeView, gtk_tree_view_column_new());
- gtk_tree_view_append_column((GtkTreeView*)gtkTreeView, gtk_tree_view_column_new());
- addWidget(gtkTreeView);
-}
-
-
-/* \internal
- * Initializes a number of gtk widgets that we can later on use to determine some of our styles.
- * The widgets are cached.
- */
-void QGtkStylePrivate::initGtkWidgets() const
-{
- // From gtkmain.c
- uid_t ruid = getuid ();
- uid_t rgid = getgid ();
- uid_t euid = geteuid ();
- uid_t egid = getegid ();
- if (ruid != euid || rgid != egid) {
- qWarning("\nThis process is currently running setuid or setgid.\nGTK+ does not allow this "
- "therefore Qt cannot use the GTK+ integration.\nTry launching your app using \'gksudo\', "
- "\'kdesudo\' or a similar tool.\n\n"
- "See http://www.gtk.org/setuid.html for more information.\n");
- return;
- }
-
- if (QGtkStylePrivate::gtk_init) {
-#ifndef Q_OS_MAC
- // Gtk will set the Qt error handler so we have to reset it afterwards
- x11ErrorHandler qt_x_errhandler = XSetErrorHandler(0);
-#endif
- QGtkStylePrivate::gtk_init (NULL, NULL);
-#ifndef Q_OS_MAC
- XSetErrorHandler(qt_x_errhandler);
-#endif
-
- // make a window
- GtkWidget* gtkWindow = QGtkStylePrivate::gtk_window_new(GTK_WINDOW_POPUP);
- QGtkStylePrivate::gtk_widget_realize(gtkWindow);
- QHashableLatin1Literal widgetPath = QHashableLatin1Literal::fromData(strdup("GtkWindow"));
- removeWidgetFromMap(widgetPath);
- gtkWidgetMap()->insert(widgetPath, gtkWindow);
-
-
- // Make all other widgets. respect the text direction
- if (qApp->layoutDirection() == Qt::RightToLeft)
- QGtkStylePrivate::gtk_widget_set_default_direction(GTK_TEXT_DIR_RTL);
-
- if (!gtkWidgetMap()->contains("GtkButton")) {
- GtkWidget *gtkButton = QGtkStylePrivate::gtk_button_new();
- addWidget(gtkButton);
- g_signal_connect(gtkButton, "style-set", G_CALLBACK(gtkStyleSetCallback), 0);
- addWidget(QGtkStylePrivate::gtk_tool_button_new(NULL, "Qt"));
- addWidget(QGtkStylePrivate::gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE));
- addWidget(QGtkStylePrivate::gtk_hbutton_box_new());
- addWidget(QGtkStylePrivate::gtk_check_button_new());
- addWidget(QGtkStylePrivate::gtk_radio_button_new(NULL));
- addWidget(QGtkStylePrivate::gtk_combo_box_new());
- addWidget(QGtkStylePrivate::gtk_combo_box_entry_new());
- GtkWidget *entry = QGtkStylePrivate::gtk_entry_new();
- // gtk-im-context-none is supported in gtk+ since 2.19.5
- // and also exists in gtk3
- // http://git.gnome.org/browse/gtk+/tree/gtk/gtkimmulticontext.c?id=2.19.5#n33
- // reason that we don't use gtk-im-context-simple here is,
- // gtk-im-context-none has less overhead, and 2.19.5 is
- // relatively old. and even for older gtk+, it will fallback
- // to gtk-im-context-simple if gtk-im-context-none doesn't
- // exists.
- g_object_set(entry, "im-module", "gtk-im-context-none", NULL);
- addWidget(entry);
- addWidget(QGtkStylePrivate::gtk_frame_new(NULL));
- addWidget(QGtkStylePrivate::gtk_expander_new(""));
- addWidget(QGtkStylePrivate::gtk_statusbar_new());
- addWidget(QGtkStylePrivate::gtk_hscale_new((QGtkStylePrivate::gtk_adjustment_new(1, 0, 1, 0, 0, 0))));
- addWidget(QGtkStylePrivate::gtk_hscrollbar_new(NULL));
- addWidget(QGtkStylePrivate::gtk_scrolled_window_new(NULL, NULL));
-
- initGtkMenu();
- addWidget(QGtkStylePrivate::gtk_notebook_new());
- addWidget(QGtkStylePrivate::gtk_progress_bar_new());
- addWidget(QGtkStylePrivate::gtk_spin_button_new((QGtkStylePrivate::gtk_adjustment_new(1, 0, 1, 0, 0, 0)), 0.1, 3));
- GtkWidget *toolbar = gtk_toolbar_new();
- g_signal_connect (toolbar, "notify::toolbar-style", G_CALLBACK (update_toolbar_style), toolbar);
- gtk_toolbar_insert((GtkToolbar*)toolbar, gtk_separator_tool_item_new(), -1);
- addWidget(toolbar);
- initGtkTreeview();
- addWidget(gtk_vscale_new((QGtkStylePrivate::gtk_adjustment_new(1, 0, 1, 0, 0, 0))));
- addWidget(gtk_vscrollbar_new(NULL));
- }
- else // Rebuild map
- {
- // When styles change subwidgets can get rearranged
- // as with the combo box. We need to update the widget map
- // to reflect this;
- QHash<QHashableLatin1Literal, GtkWidget*> oldMap = *gtkWidgetMap();
- gtkWidgetMap()->clear();
- QHashIterator<QHashableLatin1Literal, GtkWidget*> it(oldMap);
- while (it.hasNext()) {
- it.next();
- if (!strchr(it.key().data(), '.')) {
- addAllSubWidgets(it.value());
- }
- free(const_cast<char *>(it.key().data()));
- }
- }
- } else {
- qWarning("QGtkStyle could not resolve GTK. Make sure you have installed the proper libraries.");
- }
-}
-
-/*! \internal
- * destroys all previously buffered widgets.
- */
-void QGtkStylePrivate::cleanupGtkWidgets()
-{
- if (!widgetMap)
- return;
- if (widgetMap->contains("GtkWindow")) // Gtk will destroy all children
- gtk_widget_destroy(widgetMap->value("GtkWindow"));
- for (QHash<QHashableLatin1Literal, GtkWidget *>::const_iterator it = widgetMap->constBegin();
- it != widgetMap->constEnd(); ++it)
- free(const_cast<char *>(it.key().data()));
-}
-
-static bool resolveGConf()
-{
-#ifndef QT_NO_LIBRARY
- if (!QGtkStylePrivate::gconf_client_get_default) {
- QGtkStylePrivate::gconf_client_get_default = (Ptr_gconf_client_get_default)QLibrary::resolve(QLS("gconf-2"), 4, "gconf_client_get_default");
- QGtkStylePrivate::gconf_client_get_string = (Ptr_gconf_client_get_string)QLibrary::resolve(QLS("gconf-2"), 4, "gconf_client_get_string");
- QGtkStylePrivate::gconf_client_get_bool = (Ptr_gconf_client_get_bool)QLibrary::resolve(QLS("gconf-2"), 4, "gconf_client_get_bool");
- }
-#endif // !QT_NO_LIBRARY
- return (QGtkStylePrivate::gconf_client_get_default !=0);
-}
-
-QString QGtkStylePrivate::getGConfString(const QString &value, const QString &fallback)
-{
- QString retVal = fallback;
- if (resolveGConf()) {
-#if !defined(GLIB_VERSION_2_36)
- g_type_init();
-#endif
- GConfClient* client = gconf_client_get_default();
- GError *err = 0;
- char *str = gconf_client_get_string(client, qPrintable(value), &err);
- if (!err) {
- retVal = QString::fromUtf8(str);
- g_free(str);
- }
- g_object_unref(client);
- if (err)
- g_error_free (err);
- }
- return retVal;
-}
-
-bool QGtkStylePrivate::getGConfBool(const QString &key, bool fallback)
-{
- bool retVal = fallback;
- if (resolveGConf()) {
-#if !defined(GLIB_VERSION_2_36)
- g_type_init();
-#endif
- GConfClient* client = gconf_client_get_default();
- GError *err = 0;
- bool result = gconf_client_get_bool(client, qPrintable(key), &err);
- g_object_unref(client);
- if (!err)
- retVal = result;
- else
- g_error_free (err);
- }
- return retVal;
-}
-
-QString QGtkStylePrivate::getThemeName()
-{
- QString themeName;
- // Read the theme name from GtkSettings
- GtkSettings *settings = QGtkStylePrivate::gtk_settings_get_default();
- gchararray value;
- g_object_get(settings, "gtk-theme-name", &value, NULL);
- themeName = QString::fromUtf8(value);
- g_free(value);
- return themeName;
-}
-
-// Get size of the arrow controls in a GtkSpinButton
-int QGtkStylePrivate::getSpinboxArrowSize() const
-{
- const int MIN_ARROW_WIDTH = 6;
- GtkWidget *spinButton = gtkWidget("GtkSpinButton");
- GtkStyle *style = QGtkStylePrivate::gtk_widget_get_style(spinButton);
- gint size = pango_font_description_get_size (style->font_desc);
- gint arrow_size;
- arrow_size = qMax(PANGO_PIXELS (size), MIN_ARROW_WIDTH) + style->xthickness;
- arrow_size += arrow_size%2 + 1;
- return arrow_size;
-}
-
-
-bool QGtkStylePrivate::isKDE4Session()
-{
- static int version = -1;
- if (version == -1)
- version = qgetenv("KDE_SESSION_VERSION").toInt();
- return (version == 4);
-}
-
-void QGtkStylePrivate::applyCustomPaletteHash()
-{
- QPalette menuPal = gtkWidgetPalette("GtkMenu");
- GdkColor gdkBg = QGtkStylePrivate::gtk_widget_get_style(gtkWidget("GtkMenu"))->bg[GTK_STATE_NORMAL];
- QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
- menuPal.setBrush(QPalette::Base, bgColor);
- menuPal.setBrush(QPalette::Window, bgColor);
- qApp->setPalette(menuPal, "QMenu");
-
- QPalette toolbarPal = gtkWidgetPalette("GtkToolbar");
- qApp->setPalette(toolbarPal, "QToolBar");
-
- QPalette menuBarPal = gtkWidgetPalette("GtkMenuBar");
- qApp->setPalette(menuBarPal, "QMenuBar");
-}
-
-/*! \internal
- * Returns the gtk Widget that should be used to determine text foreground and background colors.
-*/
-GtkWidget* QGtkStylePrivate::getTextColorWidget() const
-{
- return gtkWidget("GtkEntry");
-}
-
-void QGtkStylePrivate::setupGtkWidget(GtkWidget* widget)
-{
- if (Q_GTK_IS_WIDGET(widget)) {
- GtkWidget *protoLayout = gtkWidgetMap()->value("GtkContainer");
- if (!protoLayout) {
- protoLayout = QGtkStylePrivate::gtk_fixed_new();
- QGtkStylePrivate::gtk_container_add((GtkContainer*)(gtkWidgetMap()->value("GtkWindow")), protoLayout);
- QHashableLatin1Literal widgetPath = QHashableLatin1Literal::fromData(strdup("GtkContainer"));
- gtkWidgetMap()->insert(widgetPath, protoLayout);
- }
- Q_ASSERT(protoLayout);
-
- if (!QGtkStylePrivate::gtk_widget_get_parent(widget) && !QGtkStylePrivate::gtk_widget_is_toplevel(widget))
- QGtkStylePrivate::gtk_container_add((GtkContainer*)(protoLayout), widget);
- QGtkStylePrivate::gtk_widget_realize(widget);
- }
-}
-
-void QGtkStylePrivate::removeWidgetFromMap(const QHashableLatin1Literal &path)
-{
- WidgetMap *map = gtkWidgetMap();
- WidgetMap::iterator it = map->find(path);
- if (it != map->end()) {
- char* keyData = const_cast<char *>(it.key().data());
- map->erase(it);
- free(keyData);
- }
-}
-
-void QGtkStylePrivate::addWidgetToMap(GtkWidget *widget)
-{
- if (Q_GTK_IS_WIDGET(widget)) {
- gtk_widget_realize(widget);
- QHashableLatin1Literal widgetPath = classPath(widget);
-
- removeWidgetFromMap(widgetPath);
- gtkWidgetMap()->insert(widgetPath, widget);
-#ifdef DUMP_GTK_WIDGET_TREE
- qWarning("Inserted Gtk Widget: %s", widgetPath.data());
-#endif
- }
- }
-
-void QGtkStylePrivate::addAllSubWidgets(GtkWidget *widget, gpointer v)
-{
- Q_UNUSED(v);
- addWidgetToMap(widget);
- if (G_TYPE_CHECK_INSTANCE_TYPE ((widget), gtk_container_get_type()))
- gtk_container_forall((GtkContainer*)widget, addAllSubWidgets, NULL);
-}
-
-// Updates window/windowtext palette based on the indicated gtk widget
-QPalette QGtkStylePrivate::gtkWidgetPalette(const QHashableLatin1Literal &gtkWidgetName) const
-{
- GtkWidget *gtkWidget = QGtkStylePrivate::gtkWidget(gtkWidgetName);
- Q_ASSERT(gtkWidget);
- QPalette pal = QApplication::palette();
- GdkColor gdkBg = gtk_widget_get_style(gtkWidget)->bg[GTK_STATE_NORMAL];
- GdkColor gdkText = gtk_widget_get_style(gtkWidget)->fg[GTK_STATE_NORMAL];
- GdkColor gdkDisabledText = gtk_widget_get_style(gtkWidget)->fg[GTK_STATE_INSENSITIVE];
- QColor bgColor(gdkBg.red>>8, gdkBg.green>>8, gdkBg.blue>>8);
- QColor textColor(gdkText.red>>8, gdkText.green>>8, gdkText.blue>>8);
- QColor disabledTextColor(gdkDisabledText.red>>8, gdkDisabledText.green>>8, gdkDisabledText.blue>>8);
- pal.setBrush(QPalette::Window, bgColor);
- pal.setBrush(QPalette::Button, bgColor);
- pal.setBrush(QPalette::All, QPalette::WindowText, textColor);
- pal.setBrush(QPalette::Disabled, QPalette::WindowText, disabledTextColor);
- pal.setBrush(QPalette::All, QPalette::ButtonText, textColor);
- pal.setBrush(QPalette::Disabled, QPalette::ButtonText, disabledTextColor);
- return pal;
-}
-
-
-void QGtkStyleUpdateScheduler::updateTheme()
-{
- static QString oldTheme(QLS("qt_not_set"));
- QPixmapCache::clear();
-
- QFont font = QGtkStylePrivate::getThemeFont();
- if (QApplication::font() != font)
- qApp->setFont(font);
-
- if (oldTheme != QGtkStylePrivate::getThemeName()) {
- oldTheme = QGtkStylePrivate::getThemeName();
- QPalette newPalette = qApp->style()->standardPalette();
- QApplicationPrivate::setSystemPalette(newPalette);
- QApplication::setPalette(newPalette);
- if (!QGtkStylePrivate::instances.isEmpty()) {
- QGtkStylePrivate::instances.last()->initGtkWidgets();
- QGtkStylePrivate::instances.last()->applyCustomPaletteHash();
- }
- QList<QWidget*> widgets = QApplication::allWidgets();
- // Notify all widgets that size metrics might have changed
- foreach (QWidget *widget, widgets) {
- QEvent e(QEvent::StyleChange);
- QApplication::sendEvent(widget, &e);
- }
- }
- QIconLoader::instance()->updateSystemTheme();
-}
-
-void QGtkStylePrivate::addWidget(GtkWidget *widget)
-{
- if (widget) {
- setupGtkWidget(widget);
- addAllSubWidgets(widget);
- }
-}
-
-
-// Fetch the application font from the pango font description
-// contained in the theme.
-QFont QGtkStylePrivate::getThemeFont()
-{
- QFont font;
- GtkStyle *style = gtkStyle();
- if (style && qApp->desktopSettingsAware())
- {
- PangoFontDescription *gtk_font = style->font_desc;
- font.setPointSizeF((float)(pango_font_description_get_size(gtk_font))/PANGO_SCALE);
-
- QString family = QString::fromLatin1(pango_font_description_get_family(gtk_font));
- if (!family.isEmpty())
- font.setFamily(family);
-
- const int weight = pango_font_description_get_weight(gtk_font);
- font.setWeight(QPlatformFontDatabase::weightFromInteger(weight));
-
- PangoStyle fontstyle = pango_font_description_get_style(gtk_font);
- if (fontstyle == PANGO_STYLE_ITALIC)
- font.setStyle(QFont::StyleItalic);
- else if (fontstyle == PANGO_STYLE_OBLIQUE)
- font.setStyle(QFont::StyleOblique);
- else
- font.setStyle(QFont::StyleNormal);
- }
- return font;
-}
-
-QIcon QGtkStylePrivate::getFilesystemIcon(const QFileInfo &info)
-{
- QIcon icon;
- if (isThemeAvailable() && gnome_vfs_init && gnome_icon_lookup_sync) {
- gnome_vfs_init();
- GtkIconTheme *theme = gtk_icon_theme_get_default();
- QByteArray fileurl = QUrl::fromLocalFile(info.absoluteFilePath()).toEncoded();
- char * icon_name = gnome_icon_lookup_sync(theme,
- NULL,
- fileurl.data(),
- NULL,
- GNOME_ICON_LOOKUP_FLAGS_NONE,
- NULL);
- QString iconName = QString::fromUtf8(icon_name);
- g_free(icon_name);
- if (iconName.startsWith(QLatin1Char('/')))
- return QIcon(iconName);
- return QIcon::fromTheme(iconName);
- }
- return icon;
-}
-
-bool operator==(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2)
-{
- return l1.size() == l2.size() || qstrcmp(l1.data(), l2.data()) == 0;
-}
-
-// copied from qHash.cpp
-uint qHash(const QHashableLatin1Literal &key)
-{
- int n = key.size();
- const uchar *p = reinterpret_cast<const uchar *>(key.data());
- uint h = 0;
- uint g;
-
- while (n--) {
- h = (h << 4) + *p++;
- if ((g = (h & 0xf0000000)) != 0)
- h ^= g >> 23;
- h &= ~g;
- }
- return h;
-}
-
-QT_END_NAMESPACE
-
-#endif // !defined(QT_NO_STYLE_GTK)
diff --git a/src/widgets/styles/qgtkstyle_p.h b/src/widgets/styles/qgtkstyle_p.h
deleted file mode 100644
index 3dcd7bf6ef..0000000000
--- a/src/widgets/styles/qgtkstyle_p.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTKSTYLE_P_H
-#define QGTKSTYLE_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <private/qwindowsstyle_p.h>
-#include <QtGui/QPalette>
-#include <QtGui/QFont>
-#include <QtWidgets/QFileDialog>
-
-QT_BEGIN_NAMESPACE
-
-
-#if !defined(QT_NO_STYLE_GTK)
-
-class QPainterPath;
-class QGtkStylePrivate;
-
-class QGtkStyle : public QCommonStyle
-{
- Q_OBJECT
- Q_DECLARE_PRIVATE(QGtkStyle)
-
-public:
- QGtkStyle();
- QGtkStyle(QGtkStylePrivate &dd);
-
- ~QGtkStyle();
-
- QPalette standardPalette() const Q_DECL_OVERRIDE;
-
- void drawPrimitive(PrimitiveElement element, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const Q_DECL_OVERRIDE;
- void drawControl(ControlElement control, const QStyleOption *option,
- QPainter *painter, const QWidget *widget) const Q_DECL_OVERRIDE;
- void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option,
- QPainter *painter, const QWidget *widget) const Q_DECL_OVERRIDE;
- void drawItemPixmap(QPainter *painter, const QRect &rect, int alignment,
- const QPixmap &pixmap) const Q_DECL_OVERRIDE;
- void drawItemText(QPainter *painter, const QRect &rect, int alignment, const QPalette &pal,
- bool enabled, const QString& text, QPalette::ColorRole textRole) const Q_DECL_OVERRIDE;
-
- int pixelMetric(PixelMetric metric, const QStyleOption *option = 0,
- const QWidget *widget = 0) const Q_DECL_OVERRIDE;
- int styleHint(StyleHint hint, const QStyleOption *option,
- const QWidget *widget, QStyleHintReturn *returnData) const Q_DECL_OVERRIDE;
-
- QStyle::SubControl hitTestComplexControl(ComplexControl cc, const QStyleOptionComplex *opt,
- const QPoint &pt, const QWidget *w) const Q_DECL_OVERRIDE;
-
- QRect subControlRect(ComplexControl control, const QStyleOptionComplex *option,
- SubControl subControl, const QWidget *widget) const Q_DECL_OVERRIDE;
- QRect subElementRect(SubElement sr, const QStyleOption *opt, const QWidget *w) const Q_DECL_OVERRIDE;
- QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const Q_DECL_OVERRIDE;
-
-
- QSize sizeFromContents(ContentsType type, const QStyleOption *option,
- const QSize &size, const QWidget *widget) const Q_DECL_OVERRIDE;
- QIcon standardIcon(StandardPixmap standardIcon, const QStyleOption *option = 0,
- const QWidget *widget = 0) const Q_DECL_OVERRIDE;
- QPixmap standardPixmap(StandardPixmap sp, const QStyleOption *option,
- const QWidget *widget) const Q_DECL_OVERRIDE;
- QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap,
- const QStyleOption *opt) const Q_DECL_OVERRIDE;
-
- void polish(QWidget *widget) Q_DECL_OVERRIDE;
- void polish(QApplication *app) Q_DECL_OVERRIDE;
- void polish(QPalette &palette) Q_DECL_OVERRIDE;
-
- void unpolish(QWidget *widget) Q_DECL_OVERRIDE;
- void unpolish(QApplication *app) Q_DECL_OVERRIDE;
-
- static bool getGConfBool(const QString &key, bool fallback = 0);
- static QString getGConfString(const QString &key, const QString &fallback = QString());
-};
-
-#endif //!defined(QT_NO_STYLE_QGTK)
-
-QT_END_NAMESPACE
-
-#endif //QGTKSTYLE_P_H
diff --git a/src/widgets/styles/qgtkstyle_p_p.h b/src/widgets/styles/qgtkstyle_p_p.h
deleted file mode 100644
index 4cb03ed833..0000000000
--- a/src/widgets/styles/qgtkstyle_p_p.h
+++ /dev/null
@@ -1,449 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtWidgets module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL21$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 or version 3 as published by the Free
-** Software Foundation and appearing in the file LICENSE.LGPLv21 and
-** LICENSE.LGPLv3 included in the packaging of this file. Please review the
-** following information to ensure the GNU Lesser General Public License
-** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** As a special exception, The Qt Company gives you certain additional
-** rights. These rights are described in The Qt Company LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QGTKSTYLE_P_P_H
-#define QGTKSTYLE_P_P_H
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists purely as an
-// implementation detail. This header file may change from version to
-// version without notice, or even be removed.
-//
-// We mean it.
-//
-
-#include <QtCore/qglobal.h>
-#if !defined(QT_NO_STYLE_GTK)
-
-#include <QtCore/qstring.h>
-#include <QtCore/qstringbuilder.h>
-#include <QtCore/qcoreapplication.h>
-
-#include <QtWidgets/QFileDialog>
-
-#include <private/qgtkstyle_p.h>
-#include <private/qcommonstyle_p.h>
-#include <private/qgtkglobal_p.h>
-
-#define Q_GTK_IS_WIDGET(widget) widget && G_TYPE_CHECK_INSTANCE_TYPE ((widget), QGtkStylePrivate::gtk_widget_get_type())
-
-QT_BEGIN_NAMESPACE
-
-class QHashableLatin1Literal
-{
-public:
- int size() const { return m_size; }
- const char *data() const { return m_data; }
-
-#ifdef __SUNPRO_CC
- QHashableLatin1Literal(const char* str)
- : m_size(strlen(str)), m_data(str) {}
-#else
- template <int N>
- QHashableLatin1Literal(const char (&str)[N])
- : m_size(N - 1), m_data(str) {}
-#endif
-
- QHashableLatin1Literal(const QHashableLatin1Literal &other)
- : m_size(other.m_size), m_data(other.m_data)
- {}
-
- QHashableLatin1Literal &operator=(const QHashableLatin1Literal &other)
- {
- if (this == &other)
- return *this;
- *const_cast<int *>(&m_size) = other.m_size;
- *const_cast<char **>(&m_data) = const_cast<char *>(other.m_data);
- return *this;
- }
-
- QString toString() const { return QString::fromLatin1(m_data, m_size); }
-
- static QHashableLatin1Literal fromData(const char *str)
- {
- return QHashableLatin1Literal(str, qstrlen(str));
- }
-
-private:
- QHashableLatin1Literal(const char *str, int length)
- : m_size(length), m_data(str)
- {}
-
- const int m_size;
- const char *m_data;
-};
-
-bool operator==(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2);
-inline bool operator!=(const QHashableLatin1Literal &l1, const QHashableLatin1Literal &l2) { return !operator==(l1, l2); }
-uint qHash(const QHashableLatin1Literal &key);
-
-QT_END_NAMESPACE
-
-class GConf;
-class GConfClient;
-typedef struct _XDisplay Display;
-
-typedef GConfClient* (*Ptr_gconf_client_get_default)();
-typedef char* (*Ptr_gconf_client_get_string)(GConfClient*, const char*, GError **);
-typedef bool (*Ptr_gconf_client_get_bool)(GConfClient*, const char*, GError **);
-
-typedef void (*Ptr_gtk_init)(int *, char ***);
-typedef GtkWidget* (*Ptr_gtk_window_new) (GtkWindowType);
-typedef GtkStyle* (*Ptr_gtk_style_attach)(GtkStyle *, GdkWindow *);
-typedef void (*Ptr_gtk_widget_destroy) (GtkWidget *);
-typedef void (*Ptr_gtk_widget_realize) (GtkWidget *);
-typedef void (*Ptr_gtk_widget_set_default_direction) (GtkTextDirection);
-typedef void (*Ptr_gtk_widget_modify_color)(GtkWidget *widget, GtkStateType state, const GdkColor *color);
-typedef GtkWidget* (*Ptr_gtk_arrow_new)(GtkArrowType, GtkShadowType);
-typedef GtkWidget* (*Ptr_gtk_menu_item_new_with_label)(const gchar *);
-typedef GtkWidget* (*Ptr_gtk_separator_menu_item_new)(void);
-typedef GtkWidget* (*Ptr_gtk_check_menu_item_new_with_label)(const gchar *);
-typedef GtkWidget* (*Ptr_gtk_menu_bar_new)(void);
-typedef GtkWidget* (*Ptr_gtk_menu_new)(void);
-typedef GtkWidget* (*Ptr_gtk_combo_box_new)(void);
-typedef GtkWidget* (*Ptr_gtk_combo_box_entry_new)(void);
-typedef GtkWidget* (*Ptr_gtk_toolbar_new)(void);
-typedef GtkWidget* (*Ptr_gtk_spin_button_new)(GtkAdjustment*, double, int);
-typedef GtkWidget* (*Ptr_gtk_button_new)(void);
-typedef GtkWidget* (*Ptr_gtk_tool_button_new)(GtkWidget *, const gchar *);
-typedef GtkWidget* (*Ptr_gtk_hbutton_box_new)(void);
-typedef GtkWidget* (*Ptr_gtk_check_button_new)(void);
-typedef GtkWidget* (*Ptr_gtk_radio_button_new)(GSList *);
-typedef GtkWidget* (*Ptr_gtk_notebook_new)(void);
-typedef GtkWidget* (*Ptr_gtk_progress_bar_new)(void);
-typedef GtkWidget* (*Ptr_gtk_hscale_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_vscale_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_hscrollbar_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_vscrollbar_new)(GtkAdjustment*);
-typedef GtkWidget* (*Ptr_gtk_scrolled_window_new)(GtkAdjustment*, GtkAdjustment*);
-typedef gchar* (*Ptr_gtk_check_version)(guint, guint, guint);
-typedef GtkToolItem* (*Ptr_gtk_separator_tool_item_new) (void);
-typedef GtkWidget* (*Ptr_gtk_entry_new)(void);
-typedef GtkWidget* (*Ptr_gtk_tree_view_new)(void);
-typedef GtkTreeViewColumn* (*Ptr_gtk_tree_view_get_column)(GtkTreeView *, gint);
-typedef GtkWidget* (*Ptr_gtk_frame_new)(const gchar *);
-typedef GtkWidget* (*Ptr_gtk_expander_new)(const gchar*);
-typedef GtkWidget* (*Ptr_gtk_statusbar_new)(void);
-typedef GtkSettings* (*Ptr_gtk_settings_get_default)(void);
-typedef GtkAdjustment* (*Ptr_gtk_range_get_adjustment)(GtkRange *);
-typedef void (*Ptr_gtk_range_set_adjustment)(GtkRange *, GtkAdjustment *);
-typedef void (*Ptr_gtk_range_set_inverted)(GtkRange*, bool);
-typedef void (*Ptr_gtk_container_add)(GtkContainer *container, GtkWidget *widget);
-typedef GtkIconSet* (*Ptr_gtk_icon_factory_lookup_default) (const gchar*);
-typedef GtkIconTheme* (*Ptr_gtk_icon_theme_get_default) (void);
-typedef GtkStyle* (*Ptr_gtk_widget_get_style)(GtkWidget *);
-typedef void (*Ptr_gtk_widget_style_get)(GtkWidget *, const gchar *first_property_name, ...);
-typedef GtkTreeViewColumn* (*Ptr_gtk_tree_view_column_new)(void);
-typedef GtkWidget* (*Ptr_gtk_fixed_new)(void);
-typedef GdkPixbuf* (*Ptr_gtk_icon_set_render_icon)(GtkIconSet *, GtkStyle *, GtkTextDirection, GtkStateType, GtkIconSize, GtkWidget *,const char *);
-typedef void (*Ptr_gtk_tree_view_append_column) (GtkTreeView*, GtkTreeViewColumn*);
-typedef void (*Ptr_gtk_adjustment_configure) (GtkAdjustment *, double, double, double, double, double, double);
-typedef GtkAdjustment* (*Ptr_gtk_adjustment_new) (double, double, double, double, double, double);
-typedef void (*Ptr_gtk_menu_item_set_submenu) (GtkMenuItem *, GtkWidget *);
-typedef void (*Ptr_gtk_container_forall) (GtkContainer *, GtkCallback, gpointer);
-typedef void (*Ptr_gtk_widget_size_allocate) (GtkWidget *, GtkAllocation*);
-typedef void (*Ptr_gtk_widget_size_request) (GtkWidget *widget, GtkRequisition *requisition);
-typedef void (*Ptr_gtk_widget_set_direction) (GtkWidget *, GtkTextDirection);
-typedef void (*Ptr_gtk_widget_path) (GtkWidget *, guint *, gchar **, gchar**);
-
-typedef void (*Ptr_gtk_toolbar_insert) (GtkToolbar *toolbar, GtkToolItem *item, int pos);
-typedef void (*Ptr_gtk_menu_shell_append)(GtkMenuShell *, GtkWidget *);
-typedef GType (*Ptr_gtk_container_get_type) (void);
-typedef GType (*Ptr_gtk_window_get_type) (void);
-typedef GType (*Ptr_gtk_widget_get_type) (void);
-typedef GtkWidget* (*Ptr_gtk_widget_get_parent) (GtkWidget *);
-typedef gboolean (*Ptr_gtk_widget_is_toplevel) (GtkWidget *);
-typedef GtkWidget* (*Ptr_gtk_widget_get_toplevel) (GtkWidget *);
-typedef GtkStyle* (*Ptr_gtk_rc_get_style_by_paths) (GtkSettings *, const char *, const char *, GType);
-typedef gint (*Ptr_pango_font_description_get_size) (const PangoFontDescription *);
-typedef PangoWeight (*Ptr_pango_font_description_get_weight) (const PangoFontDescription *);
-typedef const char* (*Ptr_pango_font_description_get_family) (const PangoFontDescription *);
-typedef PangoStyle (*Ptr_pango_font_description_get_style) (const PangoFontDescription *desc);
-typedef void (*Ptr_gtk_border_free)(GtkBorder *);
-typedef void (*Ptr_gtk_widget_get_allocation) (GtkWidget*, GtkAllocation*);
-typedef void (*Ptr_gtk_widget_set_allocation) (GtkWidget*, const GtkAllocation*);
-
-typedef void (*Ptr_gtk_widget_set_can_default) (GtkWidget*, gboolean);
-typedef void (*Ptr_gtk_window_set_default) (GtkWindow*, GtkWidget*);
-
-typedef GdkEvent* (*Ptr_gdk_event_new) (GdkEventType);
-typedef void (*Ptr_gdk_event_free) (GdkEvent*);
-typedef void (*Ptr_gtk_widget_send_focus_change) (GtkWidget*, GdkEvent*);
-
-typedef guchar* (*Ptr_gdk_pixbuf_get_pixels) (const GdkPixbuf *pixbuf);
-typedef int (*Ptr_gdk_pixbuf_get_width) (const GdkPixbuf *pixbuf);
-typedef void (*Ptr_gdk_color_free) (const GdkColor *);
-typedef int (*Ptr_gdk_pixbuf_get_height) (const GdkPixbuf *pixbuf);
-typedef GdkPixbuf* (*Ptr_gdk_pixbuf_new) (GdkColorspace colorspace, gboolean has_alpha,
- int bits_per_sample, int width, int height);
-typedef void (*Ptr_gdk_pixbuf_unref)(GdkPixbuf *);
-typedef void (*Ptr_gdk_x11_window_set_user_time) (GdkWindow *window, guint32);
-typedef XID (*Ptr_gdk_x11_drawable_get_xid) (GdkDrawable *);
-typedef Display* (*Ptr_gdk_x11_drawable_get_xdisplay) ( GdkDrawable *);
-
-
-QT_BEGIN_NAMESPACE
-
-class QGtkPainter;
-class QGtkStylePrivate;
-
-class QGtkStyleFilter : public QObject
-{
-public:
- QGtkStyleFilter(QGtkStylePrivate* sp)
- : stylePrivate(sp)
- {}
-private:
- QGtkStylePrivate* stylePrivate;
- bool eventFilter(QObject *obj, QEvent *e) Q_DECL_OVERRIDE;
-};
-
-typedef enum {
- GNOME_ICON_LOOKUP_FLAGS_NONE = 0,
- GNOME_ICON_LOOKUP_FLAGS_EMBEDDING_TEXT = 1<<0,
- GNOME_ICON_LOOKUP_FLAGS_SHOW_SMALL_IMAGES_AS_THEMSELVES = 1<<1,
- GNOME_ICON_LOOKUP_FLAGS_ALLOW_SVG_AS_THEMSELVES = 1<<2
-} GnomeIconLookupFlags;
-
-typedef enum {
- GNOME_ICON_LOOKUP_RESULT_FLAGS_NONE = 0,
- GNOME_ICON_LOOKUP_RESULT_FLAGS_THUMBNAIL = 1<<0
-} GnomeIconLookupResultFlags;
-
-struct GnomeThumbnailFactory;
-typedef gboolean (*Ptr_gnome_vfs_init) (void);
-typedef char* (*Ptr_gnome_icon_lookup_sync) (
- GtkIconTheme *icon_theme,
- GnomeThumbnailFactory *,
- const char *file_uri,
- const char *custom_icon,
- GnomeIconLookupFlags flags,
- GnomeIconLookupResultFlags *result);
-
-class QGtkStylePrivate : public QCommonStylePrivate
-{
- Q_DECLARE_PUBLIC(QGtkStyle)
-public:
- QGtkStylePrivate();
- ~QGtkStylePrivate();
-
- QGtkStyleFilter filter;
-
- static QGtkPainter* gtkPainter(QPainter *painter = 0);
- static GtkWidget* gtkWidget(const QHashableLatin1Literal &path);
- static GtkStyle* gtkStyle(const QHashableLatin1Literal &path = QHashableLatin1Literal("GtkWindow"));
- static void gtkWidgetSetFocus(GtkWidget *widget, bool focus);
-
- virtual void resolveGtk() const;
- virtual void initGtkMenu() const;
- virtual void initGtkTreeview() const;
- virtual void initGtkWidgets() const;
-
- static void cleanupGtkWidgets();
-
- static bool isKDE4Session();
- void applyCustomPaletteHash();
- static QFont getThemeFont();
- static bool isThemeAvailable() { return gtkStyle() != 0; }
-
- static bool getGConfBool(const QString &key, bool fallback = 0);
- static QString getGConfString(const QString &key, const QString &fallback = QString());
-
- static QString getThemeName();
- virtual int getSpinboxArrowSize() const;
-
- static QIcon getFilesystemIcon(const QFileInfo &);
-
- static Ptr_gtk_container_forall gtk_container_forall;
- static Ptr_gtk_init gtk_init;
- static Ptr_gtk_style_attach gtk_style_attach;
- static Ptr_gtk_window_new gtk_window_new;
- static Ptr_gtk_widget_destroy gtk_widget_destroy;
- static Ptr_gtk_widget_realize gtk_widget_realize;
- static Ptr_gtk_widget_set_default_direction gtk_widget_set_default_direction;
- static Ptr_gtk_widget_modify_color gtk_widget_modify_fg;
- static Ptr_gtk_widget_modify_color gtk_widget_modify_bg;
- static Ptr_gtk_menu_item_new_with_label gtk_menu_item_new_with_label;
- static Ptr_gtk_arrow_new gtk_arrow_new;
- static Ptr_gtk_check_menu_item_new_with_label gtk_check_menu_item_new_with_label;
- static Ptr_gtk_menu_bar_new gtk_menu_bar_new;
- static Ptr_gtk_menu_new gtk_menu_new;
- static Ptr_gtk_expander_new gtk_expander_new;
- static Ptr_gtk_button_new gtk_button_new;
- static Ptr_gtk_tool_button_new gtk_tool_button_new;
- static Ptr_gtk_hbutton_box_new gtk_hbutton_box_new;
- static Ptr_gtk_check_button_new gtk_check_button_new;
- static Ptr_gtk_radio_button_new gtk_radio_button_new;
- static Ptr_gtk_spin_button_new gtk_spin_button_new;
- static Ptr_gtk_separator_tool_item_new gtk_separator_tool_item_new;
- static Ptr_gtk_toolbar_insert gtk_toolbar_insert;
- static Ptr_gtk_frame_new gtk_frame_new;
- static Ptr_gtk_statusbar_new gtk_statusbar_new;
- static Ptr_gtk_entry_new gtk_entry_new;
- static Ptr_gtk_hscale_new gtk_hscale_new;
- static Ptr_gtk_vscale_new gtk_vscale_new;
- static Ptr_gtk_hscrollbar_new gtk_hscrollbar_new;
- static Ptr_gtk_vscrollbar_new gtk_vscrollbar_new;
- static Ptr_gtk_scrolled_window_new gtk_scrolled_window_new;
- static Ptr_gtk_notebook_new gtk_notebook_new;
- static Ptr_gtk_toolbar_new gtk_toolbar_new;
- static Ptr_gtk_tree_view_new gtk_tree_view_new;
- static Ptr_gtk_tree_view_get_column gtk_tree_view_get_column;
- static Ptr_gtk_combo_box_new gtk_combo_box_new;
- static Ptr_gtk_combo_box_entry_new gtk_combo_box_entry_new;
- static Ptr_gtk_progress_bar_new gtk_progress_bar_new;
- static Ptr_gtk_container_add gtk_container_add;
- static Ptr_gtk_menu_shell_append gtk_menu_shell_append;
- static Ptr_gtk_range_get_adjustment gtk_range_get_adjustment;
- static Ptr_gtk_range_set_adjustment gtk_range_set_adjustment;
- static Ptr_gtk_range_set_inverted gtk_range_set_inverted;
- static Ptr_gtk_icon_factory_lookup_default gtk_icon_factory_lookup_default;
- static Ptr_gtk_icon_theme_get_default gtk_icon_theme_get_default;
- static Ptr_gtk_widget_get_style gtk_widget_get_style;
- static Ptr_gtk_widget_style_get gtk_widget_style_get;
- static Ptr_gtk_icon_set_render_icon gtk_icon_set_render_icon;
- static Ptr_gtk_fixed_new gtk_fixed_new;
- static Ptr_gtk_tree_view_column_new gtk_tree_view_column_new;
- static Ptr_gtk_tree_view_append_column gtk_tree_view_append_column;
- static Ptr_gtk_adjustment_configure gtk_adjustment_configure;
- static Ptr_gtk_adjustment_new gtk_adjustment_new;
- static Ptr_gtk_menu_item_set_submenu gtk_menu_item_set_submenu;
- static Ptr_gtk_settings_get_default gtk_settings_get_default;
- static Ptr_gtk_separator_menu_item_new gtk_separator_menu_item_new;
- static Ptr_gtk_widget_size_allocate gtk_widget_size_allocate;
- static Ptr_gtk_widget_size_request gtk_widget_size_request;
- static Ptr_gtk_widget_set_direction gtk_widget_set_direction;
- static Ptr_gtk_widget_path gtk_widget_path;
- static Ptr_gtk_container_get_type gtk_container_get_type;
- static Ptr_gtk_window_get_type gtk_window_get_type;
- static Ptr_gtk_widget_get_type gtk_widget_get_type;
- static Ptr_gtk_widget_get_parent gtk_widget_get_parent;
- static Ptr_gtk_widget_is_toplevel gtk_widget_is_toplevel;
- static Ptr_gtk_widget_get_toplevel gtk_widget_get_toplevel;
- static Ptr_gtk_rc_get_style_by_paths gtk_rc_get_style_by_paths;
- static Ptr_gtk_check_version gtk_check_version;
- static Ptr_gtk_border_free gtk_border_free;
- static Ptr_gtk_widget_get_allocation gtk_widget_get_allocation;
- static Ptr_gtk_widget_set_allocation gtk_widget_set_allocation;
- static Ptr_gtk_widget_set_can_default gtk_widget_set_can_default;
- static Ptr_gtk_window_set_default gtk_window_set_default;
-
- static Ptr_gdk_event_new gdk_event_new;
- static Ptr_gdk_event_free gdk_event_free;
- static Ptr_gtk_widget_send_focus_change gtk_widget_send_focus_change;
-
- static Ptr_pango_font_description_get_size pango_font_description_get_size;
- static Ptr_pango_font_description_get_weight pango_font_description_get_weight;
- static Ptr_pango_font_description_get_family pango_font_description_get_family;
- static Ptr_pango_font_description_get_style pango_font_description_get_style;
-
- static Ptr_gdk_pixbuf_get_pixels gdk_pixbuf_get_pixels;
- static Ptr_gdk_pixbuf_get_width gdk_pixbuf_get_width;
- static Ptr_gdk_pixbuf_get_height gdk_pixbuf_get_height;
- static Ptr_gdk_pixbuf_new gdk_pixbuf_new;
- static Ptr_gdk_pixbuf_unref gdk_pixbuf_unref;
- static Ptr_gdk_color_free gdk_color_free;
- static Ptr_gdk_x11_window_set_user_time gdk_x11_window_set_user_time;
- static Ptr_gdk_x11_drawable_get_xid gdk_x11_drawable_get_xid;
- static Ptr_gdk_x11_drawable_get_xdisplay gdk_x11_drawable_get_xdisplay;
-
- static Ptr_gconf_client_get_default gconf_client_get_default;
- static Ptr_gconf_client_get_string gconf_client_get_string;
- static Ptr_gconf_client_get_bool gconf_client_get_bool;
-
- static Ptr_gnome_icon_lookup_sync gnome_icon_lookup_sync;
- static Ptr_gnome_vfs_init gnome_vfs_init;
-
- virtual QPalette gtkWidgetPalette(const QHashableLatin1Literal &gtkWidgetName) const;
-
-protected:
- typedef QHash<QHashableLatin1Literal, GtkWidget*> WidgetMap;
-
- static inline void destroyWidgetMap()
- {
- cleanupGtkWidgets();
- delete widgetMap;
- widgetMap = 0;
- }
-
- static inline WidgetMap *gtkWidgetMap()
- {
- if (!widgetMap) {
- widgetMap = new WidgetMap();
- qAddPostRoutine(destroyWidgetMap);
- }
- return widgetMap;
- }
-
- static QStringList extract_filter(const QString &rawFilter);
-
- virtual GtkWidget* getTextColorWidget() const;
- static void setupGtkWidget(GtkWidget* widget);
- static void addWidgetToMap(GtkWidget* widget);
- static void addAllSubWidgets(GtkWidget *widget, gpointer v = 0);
- static void addWidget(GtkWidget *widget);
- static void removeWidgetFromMap(const QHashableLatin1Literal &path);
-
- virtual void init();
-
- enum {
- menuItemFrame = 2, // menu item frame width
- menuItemHMargin = 3, // menu item hor text margin
- menuArrowHMargin = 6, // menu arrow horizontal margin
- menuItemVMargin = 2, // menu item ver text margin
- menuRightBorder = 15, // right border on menus
- menuCheckMarkWidth = 12 // checkmarks width on menus
- };
-
-private:
- static QList<QGtkStylePrivate *> instances;
- static WidgetMap *widgetMap;
- friend class QGtkStyleUpdateScheduler;
-};
-
-// Helper to ensure that we have polished all our gtk widgets
-// before updating our own palettes
-class QGtkStyleUpdateScheduler : public QObject
-{
- Q_OBJECT
-public slots:
- void updateTheme();
-};
-
-QT_END_NAMESPACE
-
-#endif // !QT_NO_STYLE_GTK
-#endif // QGTKSTYLE_P_P_H
diff --git a/src/widgets/styles/qmacstyle_mac.mm b/src/widgets/styles/qmacstyle_mac.mm
index 7fc4093e81..c20639d20e 100644
--- a/src/widgets/styles/qmacstyle_mac.mm
+++ b/src/widgets/styles/qmacstyle_mac.mm
@@ -36,7 +36,7 @@
.../doc/src/qstyles.qdoc.
*/
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
#include "qmacstyle_mac_p.h"
#include "qmacstyle_mac_p_p.h"
@@ -1110,6 +1110,17 @@ static void qt_drawFocusRingOnPath(CGContextRef cg, NSBezierPath *focusRingPath)
CGContextRestoreGState(cg);
}
+QAquaWidgetSize QMacStylePrivate::effectiveAquaSizeConstrain(const QStyleOption *option,
+ const QWidget *widg,
+ QStyle::ContentsType ct,
+ QSize szHint, QSize *insz) const
+{
+ QAquaWidgetSize sz = aquaSizeConstrain(option, widg, ct, szHint, insz);
+ if (sz == QAquaSizeUnknown)
+ return QAquaSizeLarge;
+ return sz;
+}
+
QAquaWidgetSize QMacStylePrivate::aquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
QStyle::ContentsType ct, QSize szHint, QSize *insz) const
{
@@ -2475,32 +2486,9 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
ret = 0;
break;
case PM_TitleBarHeight:
- if (const QStyleOptionTitleBar *tb = qstyleoption_cast<const QStyleOptionTitleBar *>(opt)) {
- HIThemeWindowDrawInfo wdi;
- wdi.version = qt_mac_hitheme_version;
- wdi.state = kThemeStateActive;
- wdi.windowType = QtWinType;
- if (tb->titleBarState)
- wdi.attributes = kThemeWindowHasFullZoom | kThemeWindowHasCloseBox
- | kThemeWindowHasCollapseBox;
- else if (tb->titleBarFlags & Qt::WindowSystemMenuHint)
- wdi.attributes = kThemeWindowHasCloseBox;
- else
- wdi.attributes = 0;
- wdi.titleHeight = tb->rect.height();
- wdi.titleWidth = tb->rect.width();
- QCFType<HIShapeRef> region;
- HIRect hirect = qt_hirectForQRect(tb->rect);
- if (hirect.size.width <= 0)
- hirect.size.width = 100;
- if (hirect.size.height <= 0)
- hirect.size.height = 30;
-
- HIThemeGetWindowShape(&hirect, &wdi, kWindowTitleBarRgn, &region);
- HIRect rect;
- ptrHIShapeGetBounds(region, &rect);
- ret = int(rect.size.height);
- }
+ // Always use NSTitledWindowMask since we never need any other type of window here
+ ret = int([NSWindow frameRectForContentRect:NSZeroRect
+ styleMask:NSTitledWindowMask].size.height);
break;
case PM_TabBarTabVSpace:
ret = 4;
@@ -2530,29 +2518,10 @@ int QMacStyle::pixelMetric(PixelMetric metric, const QStyleOption *opt, const QW
}
break;
case PM_ScrollBarExtent: {
- if ([NSScroller preferredScrollerStyle] == NSScrollerStyleOverlay) {
- switch (d->aquaSizeConstrain(opt, widget)) {
- case QAquaSizeUnknown:
- case QAquaSizeLarge:
- ret = QSysInfo::macVersion() >= QSysInfo::MV_10_8 ? 16 : 9;
- break;
- case QAquaSizeMini:
- case QAquaSizeSmall:
- ret = QSysInfo::macVersion() >= QSysInfo::MV_10_8 ? 14 : 7;
- break;
- }
- break;
- }
- switch (d->aquaSizeConstrain(opt, widget)) {
- case QAquaSizeUnknown:
- case QAquaSizeLarge:
- GetThemeMetric(kThemeMetricScrollBarWidth, &ret);
- break;
- case QAquaSizeMini:
- case QAquaSizeSmall:
- GetThemeMetric(kThemeMetricSmallScrollBarWidth, &ret);
- break;
- }
+ const QAquaWidgetSize size = d->effectiveAquaSizeConstrain(opt, widget);
+ ret = static_cast<SInt32>([NSScroller
+ scrollerWidthForControlSize:static_cast<NSControlSize>(size)
+ scrollerStyle:[NSScroller preferredScrollerStyle]]);
break; }
case PM_IndicatorHeight: {
switch (d->aquaSizeConstrain(opt, widget)) {
diff --git a/src/widgets/styles/qmacstyle_mac_p_p.h b/src/widgets/styles/qmacstyle_mac_p_p.h
index 33818568ec..8e138ea887 100644
--- a/src/widgets/styles/qmacstyle_mac_p_p.h
+++ b/src/widgets/styles/qmacstyle_mac_p_p.h
@@ -172,6 +172,9 @@ public:
QAquaWidgetSize aquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
QStyle::ContentsType ct = QStyle::CT_CustomBase,
QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
+ QAquaWidgetSize effectiveAquaSizeConstrain(const QStyleOption *option, const QWidget *widg,
+ QStyle::ContentsType ct = QStyle::CT_CustomBase,
+ QSize szHint=QSize(-1, -1), QSize *insz = 0) const;
void getSliderInfo(QStyle::ComplexControl cc, const QStyleOptionSlider *slider,
HIThemeTrackDrawInfo *tdi, const QWidget *needToRemoveMe) const;
inline int animateSpeed(Animates) const { return 33; }
diff --git a/src/widgets/styles/qstyle.h b/src/widgets/styles/qstyle.h
index 1e9d15c993..43addb5eb7 100644
--- a/src/widgets/styles/qstyle.h
+++ b/src/widgets/styles/qstyle.h
@@ -134,7 +134,7 @@ public:
PE_FrameGroupBox,
PE_FrameLineEdit,
PE_FrameMenu,
- PE_FrameStatusBar, // obsolete
+ PE_FrameStatusBar, // ### Qt 6: remove
PE_FrameStatusBarItem = PE_FrameStatusBar,
PE_FrameTabWidget,
PE_FrameWindow,
@@ -155,7 +155,7 @@ public:
PE_IndicatorArrowUp,
PE_IndicatorBranch,
PE_IndicatorButtonDropDown,
- PE_IndicatorViewItemCheck,
+ PE_IndicatorViewItemCheck, // ### Qt 6: remove
PE_IndicatorItemViewItemCheck = PE_IndicatorViewItemCheck,
PE_IndicatorCheckBox,
PE_IndicatorDockWidgetResizeHandle,
@@ -298,7 +298,7 @@ public:
SE_TabWidgetLeftCorner,
SE_TabWidgetRightCorner,
- SE_ViewItemCheckIndicator,
+ SE_ViewItemCheckIndicator, // ### Qt 6: remove
SE_ItemViewItemCheckIndicator = SE_ViewItemCheckIndicator,
SE_TabBarTearIndicator,
@@ -491,9 +491,9 @@ public:
PM_DialogButtonsButtonHeight,
PM_MdiSubWindowFrameWidth,
- PM_MDIFrameWidth = PM_MdiSubWindowFrameWidth, //obsolete
+ PM_MDIFrameWidth = PM_MdiSubWindowFrameWidth, // ### Qt 6: remove
PM_MdiSubWindowMinimizedWidth,
- PM_MDIMinimizedWidth = PM_MdiSubWindowMinimizedWidth, //obsolete
+ PM_MDIMinimizedWidth = PM_MdiSubWindowMinimizedWidth, // ### Qt 6: remove
PM_HeaderMargin,
PM_HeaderMarkSize,
@@ -511,9 +511,9 @@ public:
PM_SpinBoxSliderHeight,
- PM_DefaultTopLevelMargin,
- PM_DefaultChildMargin,
- PM_DefaultLayoutSpacing,
+ PM_DefaultTopLevelMargin, // ### Qt 6: remove
+ PM_DefaultChildMargin, // ### Qt 6: remove
+ PM_DefaultLayoutSpacing, // ### Qt 6: remove
PM_ToolBarIconSize,
PM_ListViewIconSize,
@@ -631,7 +631,7 @@ public:
SH_ComboBox_Popup,
SH_TitleBar_NoBorder,
SH_Slider_StopMouseOverSlider,
- SH_ScrollBar_StopMouseOverSlider = SH_Slider_StopMouseOverSlider, // obsolete
+ SH_ScrollBar_StopMouseOverSlider = SH_Slider_StopMouseOverSlider, // ### Qt 6: remove
SH_BlinkCursorWhenTextSelected,
SH_RichText_FullWidthSelection,
SH_Menu_Scrollable,
diff --git a/src/widgets/styles/qstylefactory.cpp b/src/widgets/styles/qstylefactory.cpp
index 520e303d93..f651521cbd 100644
--- a/src/widgets/styles/qstylefactory.cpp
+++ b/src/widgets/styles/qstylefactory.cpp
@@ -44,9 +44,6 @@
#include "qandroidstyle_p.h"
#endif
#endif
-#ifndef QT_NO_STYLE_GTK
-#include "qgtkstyle_p.h"
-#endif
#ifndef QT_NO_STYLE_WINDOWSXP
#include "qwindowsxpstyle_p.h"
#endif
@@ -86,7 +83,7 @@ Q_GLOBAL_STATIC_WITH_ARGS(QFactoryLoader, loader,
The valid keys can be retrieved using the keys()
function. Typically they include "windows" and "fusion".
- Depending on the platform, "windowsxp", "windowsvista", "gtk"
+ Depending on the platform, "windowsxp", "windowsvista"
and "macintosh" may be available.
Note that keys are case insensitive.
@@ -143,11 +140,6 @@ QStyle *QStyleFactory::create(const QString& key)
ret = new QAndroidStyle;
else
#endif
-#ifndef QT_NO_STYLE_GTK
- if (style == QLatin1String("gtk") || style == QLatin1String("gtk+"))
- ret = new QGtkStyle;
- else
-#endif
#ifndef QT_NO_STYLE_MAC
if (style.startsWith(QLatin1String("macintosh"))) {
ret = new QMacStyle;
@@ -210,10 +202,6 @@ QStringList QStyleFactory::keys()
if (!list.contains(QLatin1String("Android")))
list << QLatin1String("Android");
#endif
-#ifndef QT_NO_STYLE_GTK
- if (!list.contains(QLatin1String("GTK+")))
- list << QLatin1String("GTK+");
-#endif
#ifndef QT_NO_STYLE_FUSION
if (!list.contains(QLatin1String("Fusion")))
list << QLatin1String("Fusion");
diff --git a/src/widgets/styles/qstylesheetstyle.cpp b/src/widgets/styles/qstylesheetstyle.cpp
index d3f667748e..0c255f231e 100644
--- a/src/widgets/styles/qstylesheetstyle.cpp
+++ b/src/widgets/styles/qstylesheetstyle.cpp
@@ -2556,7 +2556,13 @@ void QStyleSheetStyle::setPalette(QWidget *w)
{ PseudoClass_Enabled, QPalette::Inactive }
};
- QPalette p = w->palette();
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
+ QPalette p;
+ if (!useStyleSheetPropagationInWidgetStyles)
+ p = w->palette();
+
QWidget *ew = embeddedWidget(w);
for (int i = 0; i < 3; i++) {
@@ -2573,32 +2579,84 @@ void QStyleSheetStyle::setPalette(QWidget *w)
rule.configurePalette(&p, map[i].group, ew, ew != w);
}
- styleSheetCaches->customPaletteWidgets.insert(w, w->palette());
- w->setPalette(p);
- if (ew != w)
- ew->setPalette(p);
+ if (!useStyleSheetPropagationInWidgetStyles || p.resolve() != 0) {
+ QPalette wp = w->palette();
+ styleSheetCaches->customPaletteWidgets.insert(w, qMakePair(wp, p.resolve()));
+
+ if (useStyleSheetPropagationInWidgetStyles) {
+ p = p.resolve(wp);
+ p.resolve(p.resolve() | wp.resolve());
+ }
+
+ w->setPalette(p);
+ if (ew != w)
+ ew->setPalette(p);
+ }
}
void QStyleSheetStyle::unsetPalette(QWidget *w)
{
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
+
if (styleSheetCaches->customPaletteWidgets.contains(w)) {
- QPalette p = styleSheetCaches->customPaletteWidgets.value(w);
- w->setPalette(p);
+ QPair<QPalette, uint> p = styleSheetCaches->customPaletteWidgets.value(w);
+ styleSheetCaches->customPaletteWidgets.remove(w);
+
+ QPalette original = p.first;
+
+ if (useStyleSheetPropagationInWidgetStyles) {
+ original.resolve(original.resolve() & p.second);
+
+ QPalette wp = w->palette();
+ wp.resolve(wp.resolve() & ~p.second);
+ wp.resolve(original);
+ wp.resolve(wp.resolve() | original.resolve());
+ original = wp;
+ }
+
+ w->setPalette(original);
QWidget *ew = embeddedWidget(w);
if (ew != w)
- ew->setPalette(p);
- styleSheetCaches->customPaletteWidgets.remove(w);
+ ew->setPalette(original);
}
- QVariant oldFont = w->property("_q_styleSheetWidgetFont");
- if (oldFont.isValid()) {
- w->setFont(qvariant_cast<QFont>(oldFont));
+
+ if (useStyleSheetPropagationInWidgetStyles) {
+ unsetStyleSheetFont(w);
+ QWidget *ew = embeddedWidget(w);
+ if (ew != w)
+ unsetStyleSheetFont(ew);
+ } else {
+ QVariant oldFont = w->property("_q_styleSheetWidgetFont");
+ if (oldFont.isValid()) {
+ w->setFont(qvariant_cast<QFont>(oldFont));
+ }
}
+
if (styleSheetCaches->autoFillDisabledWidgets.contains(w)) {
embeddedWidget(w)->setAutoFillBackground(true);
styleSheetCaches->autoFillDisabledWidgets.remove(w);
}
}
+void QStyleSheetStyle::unsetStyleSheetFont(QWidget *w) const
+{
+ if (styleSheetCaches->customFontWidgets.contains(w)) {
+ QPair<QFont, uint> f = styleSheetCaches->customFontWidgets.value(w);
+ styleSheetCaches->customFontWidgets.remove(w);
+
+ QFont original = f.first;
+ original.resolve(original.resolve() & f.second);
+
+ QFont font = w->font();
+ font.resolve(font.resolve() & ~f.second);
+ font.resolve(original);
+ font.resolve(font.resolve() | original.resolve());
+
+ w->setFont(font);
+ }
+}
+
static void updateObjects(const QList<const QObject *>& objects)
{
if (!styleSheetCaches->styleRulesCache.isEmpty() || !styleSheetCaches->hasStyleRuleCache.isEmpty() || !styleSheetCaches->renderRulesCache.isEmpty()) {
@@ -2658,6 +2716,7 @@ void QStyleSheetStyleCaches::objectDestroyed(QObject *o)
hasStyleRuleCache.remove(o);
renderRulesCache.remove(o);
customPaletteWidgets.remove((const QWidget *)o);
+ customFontWidgets.remove(static_cast<QWidget *>(o));
styleSheetCache.remove(o);
autoFillDisabledWidgets.remove((const QWidget *)o);
}
@@ -5846,24 +5905,42 @@ void QStyleSheetStyle::updateStyleSheetFont(QWidget* w) const
// we should never override it.
if (w->objectName() == QLatin1String("qt_fontDialog_sampleEdit"))
return;
+
QWidget *container = containerWidget(w);
QRenderRule rule = renderRule(container, PseudoElement_None,
PseudoClass_Active | PseudoClass_Enabled | extendedPseudoClass(container));
- QFont font = rule.font.resolve(w->font());
- if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))
- && isNaturalChild(w) && qobject_cast<QWidget *>(w->parent())) {
+ const bool useStyleSheetPropagationInWidgetStyles =
+ QCoreApplication::testAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles);
- font = font.resolve(static_cast<QWidget *>(w->parent())->font());
- }
+ if (useStyleSheetPropagationInWidgetStyles) {
+ unsetStyleSheetFont(w);
- if (w->data->fnt == font)
- return;
+ if (rule.font.resolve()) {
+ QFont wf = w->font();
+ styleSheetCaches->customFontWidgets.insert(w, qMakePair(wf, rule.font.resolve()));
+
+ QFont font = rule.font.resolve(wf);
+ font.resolve(wf.resolve() | rule.font.resolve());
+ w->setFont(font);
+ }
+ } else {
+ QFont font = rule.font.resolve(w->font());
- w->data->fnt = font;
+ if ((!w->isWindow() || w->testAttribute(Qt::WA_WindowPropagation))
+ && isNaturalChild(w) && qobject_cast<QWidget *>(w->parent())) {
- QEvent e(QEvent::FontChange);
- QApplication::sendEvent(w, &e);
+ font = font.resolve(static_cast<QWidget *>(w->parent())->font());
+ }
+
+ if (w->data->fnt == font)
+ return;
+
+ w->data->fnt = font;
+
+ QEvent e(QEvent::FontChange);
+ QApplication::sendEvent(w, &e);
+ }
}
void QStyleSheetStyle::saveWidgetFont(QWidget* w, const QFont& font) const
diff --git a/src/widgets/styles/qstylesheetstyle_default.cpp b/src/widgets/styles/qstylesheetstyle_default.cpp
index c3d00f1883..a444be006d 100644
--- a/src/widgets/styles/qstylesheetstyle_default.cpp
+++ b/src/widgets/styles/qstylesheetstyle_default.cpp
@@ -149,8 +149,7 @@ StyleSheet QStyleSheetStyle::getDefaultStyleSheet() const
// pixmap based style doesn't support any features
bool styleIsPixmapBased = baseStyle()->inherits("QMacStyle")
- || baseStyle()->inherits("QWindowsXPStyle")
- || baseStyle()->inherits("QGtkStyle");
+ || baseStyle()->inherits("QWindowsXPStyle");
/*QLineEdit {
diff --git a/src/widgets/styles/qstylesheetstyle_p.h b/src/widgets/styles/qstylesheetstyle_p.h
index 9cd8cb889d..dd2a25aed3 100644
--- a/src/widgets/styles/qstylesheetstyle_p.h
+++ b/src/widgets/styles/qstylesheetstyle_p.h
@@ -42,6 +42,7 @@
#include "QtCore/qhash.h"
#include "QtGui/qevent.h"
#include "QtCore/qvector.h"
+#include "QtCore/qset.h"
#include "QtWidgets/qapplication.h"
#include "private/qcssparser_p.h"
#include "QtGui/qbrush.h"
@@ -149,6 +150,7 @@ private:
void unsetPalette(QWidget *);
void setProperties(QWidget *);
void setGeometry(QWidget *);
+ void unsetStyleSheetFont(QWidget *) const;
QVector<QCss::StyleRule> styleRules(const QObject *obj) const;
bool hasStyleRule(const QObject *obj, int part) const;
@@ -178,9 +180,12 @@ public:
QHash<const QObject *, QHash<int, bool> > hasStyleRuleCache;
typedef QHash<int, QHash<quint64, QRenderRule> > QRenderRules;
QHash<const QObject *, QRenderRules> renderRulesCache;
- QHash<const QWidget *, QPalette> customPaletteWidgets; // widgets whose palette we tampered
QHash<const void *, QCss::StyleSheet> styleSheetCache; // parsed style sheets
QSet<const QWidget *> autoFillDisabledWidgets;
+ // widgets whose palettes and fonts we have tampered. stored value pair is
+ // QPair<old widget value, resolve mask of stylesheet value>
+ QHash<const QWidget *, QPair<QPalette, uint> > customPaletteWidgets;
+ QHash<const QWidget *, QPair<QFont, uint> > customFontWidgets;
};
diff --git a/src/widgets/styles/styles.pri b/src/widgets/styles/styles.pri
index 3707090c4c..968429dc1e 100644
--- a/src/widgets/styles/styles.pri
+++ b/src/widgets/styles/styles.pri
@@ -42,13 +42,6 @@ contains( styles, all ) {
!macx:styles -= mac
-contains(QT_CONFIG, gtkstyle) {
- QMAKE_CXXFLAGS += $$QT_CFLAGS_QGTKSTYLE
- LIBS_PRIVATE += $$QT_LIBS_QGTKSTYLE
- styles += gtk
- CONFIG += x11
-}
-
contains( styles, mac ) {
HEADERS += \
styles/qmacstyle_mac_p.h \
@@ -90,19 +83,6 @@ contains( styles, windows ) {
DEFINES += QT_NO_STYLE_WINDOWS
}
-contains( styles, gtk ) {
- HEADERS += styles/qgtkglobal_p.h
- HEADERS += styles/qgtkstyle_p.h
- HEADERS += styles/qgtkpainter_p.h
- HEADERS += styles/qgtk2painter_p.h
- HEADERS += styles/qgtkstyle_p_p.h
- SOURCES += styles/qgtkstyle.cpp
- SOURCES += styles/qgtkpainter.cpp
- SOURCES += styles/qgtk2painter.cpp
- SOURCES += styles/qgtkstyle_p.cpp
-} else {
- DEFINES += QT_NO_STYLE_GTK
-}
contains( styles, fusion ) {
HEADERS += styles/qfusionstyle_p.h
HEADERS += styles/qfusionstyle_p_p.h
diff --git a/src/widgets/util/qflickgesture.cpp b/src/widgets/util/qflickgesture.cpp
index c7e0861a0f..6d23977dc0 100644
--- a/src/widgets/util/qflickgesture.cpp
+++ b/src/widgets/util/qflickgesture.cpp
@@ -40,6 +40,7 @@
#include "qgraphicssceneevent.h"
#include "qgraphicsview.h"
#include "qscroller.h"
+#include <QtGui/qtouchdevice.h>
#include "private/qapplication_p.h"
#include "private/qevent_p.h"
#include "private/qflickgesture_p.h"
diff --git a/src/widgets/util/qscroller_mac.mm b/src/widgets/util/qscroller_mac.mm
index 07de07de52..51485973b8 100644
--- a/src/widgets/util/qscroller_mac.mm
+++ b/src/widgets/util/qscroller_mac.mm
@@ -35,7 +35,7 @@
#ifdef Q_DEAD_CODE_FROM_QT4_MAC
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qscroller_p.h"
diff --git a/src/widgets/util/qsystemtrayicon_x11.cpp b/src/widgets/util/qsystemtrayicon_x11.cpp
index 9a69db1bc8..e50b0bd12c 100644
--- a/src/widgets/util/qsystemtrayicon_x11.cpp
+++ b/src/widgets/util/qsystemtrayicon_x11.cpp
@@ -170,7 +170,9 @@ void QSystemTrayIconSys::mousePressEvent(QMouseEvent *ev)
#ifndef QT_NO_CONTEXTMENU
if (ev->button() == Qt::RightButton && q->contextMenu())
q->contextMenu()->popup(globalPos);
-#endif
+#else
+ Q_UNUSED(globalPos)
+#endif // QT_NO_CONTEXTMENU
if (QBalloonTip::isBalloonVisible()) {
emit q->messageClicked();
diff --git a/src/widgets/widgets/qcalendarwidget.cpp b/src/widgets/widgets/qcalendarwidget.cpp
index 48b224fe13..5e6db46a63 100644
--- a/src/widgets/widgets/qcalendarwidget.cpp
+++ b/src/widgets/widgets/qcalendarwidget.cpp
@@ -53,6 +53,8 @@
#include <qbasictimer.h>
#include <qstylepainter.h>
+#include <vector>
+
QT_BEGIN_NAMESPACE
enum {
@@ -423,6 +425,17 @@ QString QCalendarYearValidator::text(const QDate &date, int repeat) const
///////////////////////////////////
+struct SectionToken {
+ Q_DECL_CONSTEXPR SectionToken(QCalendarDateSectionValidator *v, int rep)
+ : validator(v), repeat(rep) {}
+
+ QCalendarDateSectionValidator *validator;
+ int repeat;
+};
+} // unnamed namespace
+Q_DECLARE_TYPEINFO(SectionToken, Q_PRIMITIVE_TYPE);
+namespace {
+
class QCalendarDateValidator
{
public:
@@ -438,13 +451,6 @@ public:
void setLocale(const QLocale &locale);
private:
-
- struct SectionToken {
- SectionToken(QCalendarDateSectionValidator *val, int rep) : validator(val), repeat(rep) {}
- QCalendarDateSectionValidator *validator;
- int repeat;
- };
-
void toNextToken();
void toPreviousToken();
void applyToDate();
@@ -453,12 +459,12 @@ private:
void clear();
QStringList m_separators;
- QList<SectionToken *> m_tokens;
+ std::vector<SectionToken> m_tokens;
QCalendarYearValidator m_yearValidator;
QCalendarMonthValidator m_monthValidator;
QCalendarDayValidator m_dayValidator;
- SectionToken *m_currentToken;
+ int m_currentToken;
QDate m_initialDate;
QDate m_currentDate;
@@ -467,7 +473,7 @@ private:
};
QCalendarDateValidator::QCalendarDateValidator()
- : m_currentToken(Q_NULLPTR),
+ : m_currentToken(-1),
m_initialDate(QDate::currentDate()),
m_currentDate(m_initialDate),
m_lastSectionMove(QCalendarDateSectionValidator::ThisSection)
@@ -510,17 +516,16 @@ void QCalendarDateValidator::setInitialDate(const QDate &date)
QString QCalendarDateValidator::currentText() const
{
QString str;
- QStringListIterator itSep(m_separators);
- QListIterator<SectionToken *> itTok(m_tokens);
- while (itSep.hasNext()) {
- str += itSep.next();
- if (itTok.hasNext()) {
- SectionToken *token = itTok.next();
- QCalendarDateSectionValidator *validator = token->validator;
- if (m_currentToken == token)
- str += validator->text();
+ const int numSeps = m_separators.size();
+ const int numTokens = int(m_tokens.size());
+ for (int i = 0; i < numSeps; ++i) {
+ str += m_separators.at(i);
+ if (i < numTokens) {
+ const SectionToken &token = m_tokens[i];
+ if (i == m_currentToken)
+ str += token.validator->text();
else
- str += validator->text(m_currentDate, token->repeat);
+ str += token.validator->text(m_currentDate, token.repeat);
}
}
return str;
@@ -528,14 +533,10 @@ QString QCalendarDateValidator::currentText() const
void QCalendarDateValidator::clear()
{
- QListIterator<SectionToken *> it(m_tokens);
- while (it.hasNext())
- delete it.next();
-
m_tokens.clear();
m_separators.clear();
- m_currentToken = 0;
+ m_currentToken = -1;
}
void QCalendarDateValidator::setFormat(const QString &format)
@@ -558,25 +559,25 @@ void QCalendarDateValidator::setFormat(const QString &format)
separator += nextChar;
quoting = false;
} else {
- SectionToken *token = 0;
+ QCalendarDateSectionValidator *validator = 0;
if (nextChar == QLatin1Char('d')) {
offset = qMin(4, countRepeat(format, pos));
- token = new SectionToken(&m_dayValidator, offset);
+ validator = &m_dayValidator;
} else if (nextChar == QLatin1Char('M')) {
offset = qMin(4, countRepeat(format, pos));
- token = new SectionToken(&m_monthValidator, offset);
+ validator = &m_monthValidator;
} else if (nextChar == QLatin1Char('y')) {
offset = qMin(4, countRepeat(format, pos));
- token = new SectionToken(&m_yearValidator, offset);
+ validator = &m_yearValidator;
} else {
separator += nextChar;
}
- if (token) {
- m_tokens.append(token);
+ if (validator) {
+ m_tokens.push_back(SectionToken(validator, offset));
m_separators.append(separator);
separator = QString();
- if (!m_currentToken)
- m_currentToken = token;
+ if (m_currentToken < 0)
+ m_currentToken = int(m_tokens.size()) - 1;
}
}
@@ -595,29 +596,23 @@ void QCalendarDateValidator::applyToDate()
void QCalendarDateValidator::toNextToken()
{
- const int idx = m_tokens.indexOf(m_currentToken);
- if (idx == -1)
+ if (m_currentToken < 0)
return;
- if (idx + 1 >= m_tokens.count())
- m_currentToken = m_tokens.first();
- else
- m_currentToken = m_tokens.at(idx + 1);
+ ++m_currentToken;
+ m_currentToken %= m_tokens.size();
}
void QCalendarDateValidator::toPreviousToken()
{
- const int idx = m_tokens.indexOf(m_currentToken);
- if (idx == -1)
+ if (m_currentToken < 0)
return;
- if (idx - 1 < 0)
- m_currentToken = m_tokens.last();
- else
- m_currentToken = m_tokens.at(idx - 1);
+ --m_currentToken;
+ m_currentToken %= m_tokens.size();
}
void QCalendarDateValidator::handleKeyEvent(QKeyEvent *keyEvent)
{
- if (!m_currentToken)
+ if (m_currentToken < 0)
return;
int key = keyEvent->key();
@@ -630,7 +625,7 @@ void QCalendarDateValidator::handleKeyEvent(QKeyEvent *keyEvent)
else if (key == Qt::Key_Left)
toPreviousToken();
- m_lastSectionMove = m_currentToken->validator->handleKey(key);
+ m_lastSectionMove = m_tokens[m_currentToken].validator->handleKey(key);
applyToDate();
if (m_lastSectionMove == QCalendarDateSectionValidator::NextSection)
@@ -821,6 +816,41 @@ void QCalendarTextNavigator::setDateEditAcceptDelay(int delay)
class QCalendarView;
+// a small helper class that replaces a QMap<Qt::DayOfWeek, T>,
+// but requires T to have a member-swap and a default constructor
+// which should be cheap (no memory allocations)
+
+QT_WARNING_PUSH
+QT_WARNING_DISABLE_MSVC(4351) // "new behavior: elements of array ... will be default initialized"
+
+template <typename T>
+class StaticDayOfWeekAssociativeArray {
+ bool contained[7];
+ T data[7];
+
+ static Q_DECL_CONSTEXPR int day2idx(Qt::DayOfWeek day) Q_DECL_NOTHROW { return int(day) - 1; } // alt: day % 7
+public:
+ Q_DECL_CONSTEXPR StaticDayOfWeekAssociativeArray() Q_DECL_NOEXCEPT_EXPR(noexcept(T()))
+ : contained(), data() {}
+
+ Q_DECL_CONSTEXPR bool contains(Qt::DayOfWeek day) const Q_DECL_NOTHROW { return contained[day2idx(day)]; }
+ Q_DECL_CONSTEXPR const T &value(Qt::DayOfWeek day) const Q_DECL_NOTHROW { return data[day2idx(day)]; }
+
+ Q_DECL_RELAXED_CONSTEXPR T &operator[](Qt::DayOfWeek day) Q_DECL_NOTHROW
+ {
+ const int idx = day2idx(day);
+ contained[idx] = true;
+ return data[idx];
+ }
+
+ Q_DECL_RELAXED_CONSTEXPR void insert(Qt::DayOfWeek day, T v) Q_DECL_NOTHROW
+ {
+ operator[](day).swap(v);
+ }
+};
+
+QT_WARNING_POP
+
class QCalendarModel : public QAbstractTableModel
{
Q_OBJECT
@@ -899,7 +929,7 @@ public:
Qt::DayOfWeek m_firstDay;
QCalendarWidget::HorizontalHeaderFormat m_horizontalHeaderFormat;
bool m_weekNumbersShown;
- QMap<Qt::DayOfWeek, QTextCharFormat> m_dayFormats;
+ StaticDayOfWeekAssociativeArray<QTextCharFormat> m_dayFormats;
QMap<QDate, QTextCharFormat> m_dateFormats;
QTextCharFormat m_headerFormat;
QCalendarView *m_view;
diff --git a/src/widgets/widgets/qcombobox.cpp b/src/widgets/widgets/qcombobox.cpp
index aab28bf18a..2a1742b652 100644
--- a/src/widgets/widgets/qcombobox.cpp
+++ b/src/widgets/widgets/qcombobox.cpp
@@ -1770,7 +1770,9 @@ void QComboBox::setLineEdit(QLineEdit *edit)
delete d->lineEdit;
d->lineEdit = edit;
+#ifndef QT_NO_IM
qt_widget_private(d->lineEdit)->inheritsInputMethodHints = 1;
+#endif
if (d->lineEdit->parent() != this)
d->lineEdit->setParent(this);
connect(d->lineEdit, SIGNAL(returnPressed()), this, SLOT(_q_returnPressed()));
diff --git a/src/widgets/widgets/qcombobox.h b/src/widgets/widgets/qcombobox.h
index 3182a0a3aa..45b601788f 100644
--- a/src/widgets/widgets/qcombobox.h
+++ b/src/widgets/widgets/qcombobox.h
@@ -229,7 +229,9 @@ protected:
#ifndef QT_NO_WHEELEVENT
void wheelEvent(QWheelEvent *e) Q_DECL_OVERRIDE;
#endif
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *e) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
void inputMethodEvent(QInputMethodEvent *) Q_DECL_OVERRIDE;
void initStyleOption(QStyleOptionComboBox *option) const;
diff --git a/src/widgets/widgets/qgroupbox.cpp b/src/widgets/widgets/qgroupbox.cpp
index 0ff5dc8753..f1ebf91ad7 100644
--- a/src/widgets/widgets/qgroupbox.cpp
+++ b/src/widgets/widgets/qgroupbox.cpp
@@ -707,6 +707,8 @@ void QGroupBox::mousePressEvent(QMouseEvent *event)
if (d->checkable && (d->pressedControl & (QStyle::SC_GroupBoxCheckBox | QStyle::SC_GroupBoxLabel))) {
d->overCheckBox = true;
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));
+ } else {
+ event->ignore();
}
}
@@ -723,6 +725,8 @@ void QGroupBox::mouseMoveEvent(QMouseEvent *event)
if (d->checkable && (d->pressedControl == QStyle::SC_GroupBoxCheckBox || d->pressedControl == QStyle::SC_GroupBoxLabel)
&& (d->overCheckBox != oldOverCheckBox))
update(style()->subControlRect(QStyle::CC_GroupBox, &box, QStyle::SC_GroupBoxCheckBox, this));
+
+ event->ignore();
}
/*! \reimp */
diff --git a/src/widgets/widgets/qlabel.cpp b/src/widgets/widgets/qlabel.cpp
index 55e277026c..eeabd5db38 100644
--- a/src/widgets/widgets/qlabel.cpp
+++ b/src/widgets/widgets/qlabel.cpp
@@ -882,13 +882,11 @@ void QLabel::mouseReleaseEvent(QMouseEvent *ev)
d->sendControlEvent(ev);
}
+#ifndef QT_NO_CONTEXTMENU
/*!\reimp
*/
void QLabel::contextMenuEvent(QContextMenuEvent *ev)
{
-#ifdef QT_NO_CONTEXTMENU
- Q_UNUSED(ev);
-#else
Q_D(QLabel);
if (!d->isTextLabel) {
ev->ignore();
@@ -902,8 +900,8 @@ void QLabel::contextMenuEvent(QContextMenuEvent *ev)
ev->accept();
menu->setAttribute(Qt::WA_DeleteOnClose);
menu->popup(ev->globalPos());
-#endif
}
+#endif // QT_NO_CONTEXTMENU
/*!
\reimp
diff --git a/src/widgets/widgets/qlabel.h b/src/widgets/widgets/qlabel.h
index 1a3a68db60..6b6e15e0a8 100644
--- a/src/widgets/widgets/qlabel.h
+++ b/src/widgets/widgets/qlabel.h
@@ -132,7 +132,9 @@ protected:
void mousePressEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *ev) Q_DECL_OVERRIDE;
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QContextMenuEvent *ev) Q_DECL_OVERRIDE;
+#endif // QT_NO_CONTEXTMENU
void focusInEvent(QFocusEvent *ev) Q_DECL_OVERRIDE;
void focusOutEvent(QFocusEvent *ev) Q_DECL_OVERRIDE;
bool focusNextPrevChild(bool next) Q_DECL_OVERRIDE;
diff --git a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
index a384e41d1b..7dad6604b9 100644
--- a/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
+++ b/src/widgets/widgets/qmaccocoaviewcontainer_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qmaccocoaviewcontainer_mac.h"
#include <QtCore/QDebug>
diff --git a/src/widgets/widgets/qmacnativewidget_mac.mm b/src/widgets/widgets/qmacnativewidget_mac.mm
index 46a43c4110..f855777837 100644
--- a/src/widgets/widgets/qmacnativewidget_mac.mm
+++ b/src/widgets/widgets/qmacnativewidget_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qmacnativewidget_mac.h"
#include <QtCore/qdebug.h>
diff --git a/src/widgets/widgets/qmdiarea.cpp b/src/widgets/widgets/qmdiarea.cpp
index e683c48ad3..1864b42a80 100644
--- a/src/widgets/widgets/qmdiarea.cpp
+++ b/src/widgets/widgets/qmdiarea.cpp
@@ -380,7 +380,7 @@ void IconTiler::rearrange(QList<QWidget *> &widgets, const QRect &domain) const
return;
const int n = widgets.size();
- const int width = widgets.at(0)->width();
+ const int width = qMax(widgets.at(0)->width(), 1);
const int height = widgets.at(0)->height();
const int ncols = qMax(domain.width() / width, 1);
const int nrows = n / ncols + ((n % ncols) ? 1 : 0);
@@ -938,7 +938,7 @@ void QMdiAreaPrivate::rearrange(Rearranger *rearranger)
if (!sanityCheck(child, "QMdiArea::rearrange") || !child->isVisible())
continue;
if (rearranger->type() == Rearranger::IconTiler) {
- if (child->isMinimized() && !child->isShaded() && !(child->windowFlags() & Qt::FramelessWindowHint))
+ if (child->isMinimized() && !child->isShaded())
widgets.append(child);
} else {
if (child->isMinimized() && !child->isShaded())
diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp
index 14aeb73baf..be6cb7c54c 100644
--- a/src/widgets/widgets/qmdisubwindow.cpp
+++ b/src/widgets/widgets/qmdisubwindow.cpp
@@ -1000,7 +1000,9 @@ void QMdiSubWindowPrivate::removeBaseWidget()
q->setWindowModified(false);
}
lastChildWindowTitle.clear();
- baseWidget->setParent(0);
+ // QTBUG-47993: parent widget can be reset before this call
+ if (baseWidget->parentWidget() == q)
+ baseWidget->setParent(0);
baseWidget = 0;
isWidgetHiddenByUs = false;
}
@@ -2653,7 +2655,7 @@ void QMdiSubWindow::showShaded()
resize(d->internalMinimumSize);
// Hide the internal widget if not already hidden by the user.
- if (d->baseWidget && !d->baseWidget->isHidden()) {
+ if (d->baseWidget && !d->baseWidget->isHidden() && !(windowFlags() & Qt::FramelessWindowHint)) {
d->baseWidget->hide();
d->isWidgetHiddenByUs = true;
}
diff --git a/src/widgets/widgets/qmenu_mac.mm b/src/widgets/widgets/qmenu_mac.mm
index 8b29011178..9278099e18 100644
--- a/src/widgets/widgets/qmenu_mac.mm
+++ b/src/widgets/widgets/qmenu_mac.mm
@@ -32,7 +32,7 @@
****************************************************************************/
#import <Foundation/Foundation.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include "qmenu.h"
#include "qmenubar.h"
diff --git a/src/widgets/widgets/qtextedit.cpp b/src/widgets/widgets/qtextedit.cpp
index 7439005b92..ba6db2971a 100644
--- a/src/widgets/widgets/qtextedit.cpp
+++ b/src/widgets/widgets/qtextedit.cpp
@@ -1060,6 +1060,8 @@ bool QTextEdit::event(QEvent *e)
|| e->type() == QEvent::ToolTip) {
d->sendControlEvent(e);
}
+#else
+ Q_UNUSED(d)
#endif // QT_NO_CONTEXTMENU
#ifdef QT_KEYPAD_NAVIGATION
if (e->type() == QEvent::EnterEditFocus || e->type() == QEvent::LeaveEditFocus) {
diff --git a/tests/auto/auto.pro b/tests/auto/auto.pro
index 9cab3c9e42..e905a416a6 100644
--- a/tests/auto/auto.pro
+++ b/tests/auto/auto.pro
@@ -22,7 +22,7 @@ installed_cmake.depends = cmake
ios: SUBDIRS = corelib gui
wince: SUBDIRS -= printsupport
-cross_compile: SUBDIRS -= tools
+cross_compile: SUBDIRS -= tools cmake installed_cmake
!qtHaveModule(opengl): SUBDIRS -= opengl
!qtHaveModule(gui): SUBDIRS -= gui cmake
!qtHaveModule(widgets): SUBDIRS -= widgets
diff --git a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
index e82d101de0..f3684faa61 100644
--- a/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
+++ b/tests/auto/concurrent/qtconcurrentfilter/qtconcurrentfilter.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentfilter
QT = core testlib concurrent
SOURCES = tst_qtconcurrentfilter.cpp
diff --git a/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro b/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro
index 4cfebc0e3d..f599372c6f 100644
--- a/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro
+++ b/tests/auto/concurrent/qtconcurrentiteratekernel/qtconcurrentiteratekernel.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentiteratekernel
QT = core testlib concurrent
SOURCES = tst_qtconcurrentiteratekernel.cpp
diff --git a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
index 199e5ad4d6..3af207ae5a 100644
--- a/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
+++ b/tests/auto/concurrent/qtconcurrentmap/qtconcurrentmap.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentmap
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmap.cpp
diff --git a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
index 1eb27d825a..0d07642028 100644
--- a/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
+++ b/tests/auto/concurrent/qtconcurrentmedian/qtconcurrentmedian.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentmedian
QT = core testlib concurrent
SOURCES = tst_qtconcurrentmedian.cpp
diff --git a/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro b/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
index 03d77b33a2..f60462f9ed 100644
--- a/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
+++ b/tests/auto/concurrent/qtconcurrentrun/qtconcurrentrun.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentrun
QT = core testlib concurrent
SOURCES = tst_qtconcurrentrun.cpp
diff --git a/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro b/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro
index f6ddd33504..b98b8f56e8 100644
--- a/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro
+++ b/tests/auto/concurrent/qtconcurrentthreadengine/qtconcurrentthreadengine.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtconcurrentthreadengine
QT = core testlib concurrent
SOURCES = tst_qtconcurrentthreadengine.cpp
diff --git a/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro b/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro
index 7ec9c5f574..32701c2c9c 100644
--- a/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro
+++ b/tests/auto/corelib/animation/qabstractanimation/qabstractanimation.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qabstractanimation
QT = core testlib
SOURCES = tst_qabstractanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro b/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro
index a5e898b395..f4b5747216 100644
--- a/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro
+++ b/tests/auto/corelib/animation/qanimationgroup/qanimationgroup.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qanimationgroup
QT = core testlib
SOURCES = tst_qanimationgroup.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro b/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro
index 23343f27f5..5b4c6ab90a 100644
--- a/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro
+++ b/tests/auto/corelib/animation/qparallelanimationgroup/qparallelanimationgroup.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qparallelanimationgroup
QT = core testlib
SOURCES = tst_qparallelanimationgroup.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp b/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
index d963c5173e..640f58c532 100644
--- a/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qparallelanimationgroup/tst_qparallelanimationgroup.cpp
@@ -491,7 +491,7 @@ void tst_QParallelAnimationGroup::deleteChildrenWithRunningGroup()
QVERIFY(group.currentLoopTime() > 0);
delete anim1;
- QVERIFY(group.animationCount() == 0);
+ QCOMPARE(group.animationCount(), 0);
QCOMPARE(group.duration(), 0);
QCOMPARE(group.state(), QAnimationGroup::Stopped);
QCOMPARE(group.currentLoopTime(), 0); //that's the invariant
diff --git a/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro b/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro
index 4c2dd02951..7f19bc7545 100644
--- a/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro
+++ b/tests/auto/corelib/animation/qpauseanimation/qpauseanimation.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpauseanimation
QT = core-private testlib
SOURCES = tst_qpauseanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp b/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp
index db58c797d3..06667df489 100644
--- a/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp
+++ b/tests/auto/corelib/animation/qpauseanimation/tst_qpauseanimation.cpp
@@ -114,10 +114,10 @@ void tst_QPauseAnimation::changeDirectionWhileRunning()
animation.setDuration(400);
animation.start();
QTest::qWait(100);
- QVERIFY(animation.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
animation.setDirection(QAbstractAnimation::Backward);
QTest::qWait(animation.totalDuration() + 50);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
}
void tst_QPauseAnimation::noTimerUpdates_data()
@@ -149,7 +149,7 @@ void tst_QPauseAnimation::noTimerUpdates()
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
const int expectedLoopCount = 1 + loopCount;
#ifdef BAD_TIMER_RESOLUTION
@@ -177,13 +177,13 @@ void tst_QPauseAnimation::multiplePauseAnimations()
if (animation.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (animation2.state() != QAbstractAnimation::Running)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation2.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Running);
#ifdef BAD_TIMER_RESOLUTION
if (animation.m_updateCurrentTimeCount != 2)
@@ -203,7 +203,7 @@ void tst_QPauseAnimation::multiplePauseAnimations()
if (animation2.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (animation2.m_updateCurrentTimeCount != 3)
@@ -230,8 +230,8 @@ void tst_QPauseAnimation::pauseAndPropertyAnimations()
QTest::qWait(100);
animation.start();
- QVERIFY(animation.state() == QAbstractAnimation::Running);
- QVERIFY(pause.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
+ QCOMPARE(pause.state(), QAbstractAnimation::Running);
QCOMPARE(pause.m_updateCurrentTimeCount, 2);
QTest::qWait(animation.totalDuration() + 100);
@@ -240,8 +240,8 @@ void tst_QPauseAnimation::pauseAndPropertyAnimations()
if (animation.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
- QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(pause.state(), QAbstractAnimation::Stopped);
QVERIFY(pause.m_updateCurrentTimeCount > 3);
}
@@ -250,10 +250,10 @@ void tst_QPauseAnimation::pauseResume()
TestablePauseAnimation animation;
animation.setDuration(400);
animation.start();
- QVERIFY(animation.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
QTest::qWait(200);
animation.pause();
- QVERIFY(animation.state() == QAbstractAnimation::Paused);
+ QCOMPARE(animation.state(), QAbstractAnimation::Paused);
animation.start();
QTRY_COMPARE(animation.state(), QAbstractAnimation::Stopped);
@@ -281,39 +281,39 @@ void tst_QPauseAnimation::sequentialPauseGroup()
QCOMPARE(animation2.m_updateCurrentTimeCount, 0);
QCOMPARE(animation3.m_updateCurrentTimeCount, 0);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation1.state() == QAbstractAnimation::Running);
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Stopped);
group.setCurrentTime(250);
QCOMPARE(animation1.m_updateCurrentTimeCount, 2);
QCOMPARE(animation2.m_updateCurrentTimeCount, 1);
QCOMPARE(animation3.m_updateCurrentTimeCount, 0);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Stopped);
QCOMPARE((QAbstractAnimation*)&animation2, group.currentAnimation());
- QVERIFY(animation2.state() == QAbstractAnimation::Running);
- QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Stopped);
group.setCurrentTime(500);
QCOMPARE(animation1.m_updateCurrentTimeCount, 2);
QCOMPARE(animation2.m_updateCurrentTimeCount, 2);
QCOMPARE(animation3.m_updateCurrentTimeCount, 1);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
QCOMPARE((QAbstractAnimation*)&animation3, group.currentAnimation());
- QVERIFY(animation3.state() == QAbstractAnimation::Running);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Running);
group.setCurrentTime(750);
- QVERIFY(group.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation1.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation2.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation1.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation2.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation3.state(), QAbstractAnimation::Stopped);
QCOMPARE(animation1.m_updateCurrentTimeCount, 2);
QCOMPARE(animation2.m_updateCurrentTimeCount, 2);
@@ -334,22 +334,22 @@ void tst_QPauseAnimation::sequentialGroupWithPause()
group.start();
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation.state() == QAbstractAnimation::Running);
- QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Running);
+ QCOMPARE(pause.state(), QAbstractAnimation::Stopped);
group.setCurrentTime(300);
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
QCOMPARE((QAbstractAnimation*)&pause, group.currentAnimation());
- QVERIFY(pause.state() == QAbstractAnimation::Running);
+ QCOMPARE(pause.state(), QAbstractAnimation::Running);
group.setCurrentTime(600);
- QVERIFY(group.state() == QAbstractAnimation::Stopped);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
- QVERIFY(pause.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
+ QCOMPARE(pause.state(), QAbstractAnimation::Stopped);
QCOMPARE(pause.m_updateCurrentTimeCount, 2);
}
@@ -401,11 +401,11 @@ void tst_QPauseAnimation::multipleSequentialGroups()
group.start();
- QVERIFY(group.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup1.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup2.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup3.state() == QAbstractAnimation::Running);
- QVERIFY(subgroup4.state() == QAbstractAnimation::Running);
+ QCOMPARE(group.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup1.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup2.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup3.state(), QAbstractAnimation::Running);
+ QCOMPARE(subgroup4.state(), QAbstractAnimation::Running);
// This is a pretty long animation so it tends to get rather out of sync
// when using the consistent timer, so run for an extra half second for good
@@ -416,31 +416,31 @@ void tst_QPauseAnimation::multipleSequentialGroups()
if (group.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(group.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(group.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup1.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup1.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup1.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup2.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup2.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup2.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup3.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup3.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup3.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (subgroup4.state() != QAbstractAnimation::Stopped)
QEXPECT_FAIL("", timerError, Abort);
#endif
- QVERIFY(subgroup4.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(subgroup4.state(), QAbstractAnimation::Stopped);
#ifdef BAD_TIMER_RESOLUTION
if (pause5.m_updateCurrentTimeCount != 4)
@@ -455,7 +455,7 @@ void tst_QPauseAnimation::zeroDuration()
animation.setDuration(0);
animation.start();
QTest::qWait(animation.totalDuration() + 100);
- QVERIFY(animation.state() == QAbstractAnimation::Stopped);
+ QCOMPARE(animation.state(), QAbstractAnimation::Stopped);
QCOMPARE(animation.m_updateCurrentTimeCount, 1);
}
diff --git a/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro b/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
index 502e5aa428..bfeb183abf 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
+++ b/tests/auto/corelib/animation/qpropertyanimation/qpropertyanimation.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpropertyanimation
QT = core gui widgets testlib
SOURCES = tst_qpropertyanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
index 530d7777d8..d4a1a6db11 100644
--- a/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
+++ b/tests/auto/corelib/animation/qpropertyanimation/tst_qpropertyanimation.cpp
@@ -34,6 +34,7 @@
#include <QtTest/QtTest>
#include <QtCore/qpropertyanimation.h>
#include <QtCore/qvariantanimation.h>
+#include <QtGui/qtouchdevice.h>
#include <QtWidgets/qwidget.h>
Q_DECLARE_METATYPE(QAbstractAnimation::State)
@@ -369,7 +370,7 @@ void tst_QPropertyAnimation::deletion2()
QTimer::singleShot(0, object, SLOT(deleteLater()));
QTest::qWait(50);
- QVERIFY(anim->targetObject() == 0);
+ QVERIFY(!anim->targetObject());
}
void tst_QPropertyAnimation::deletion3()
diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro b/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro
index e53cde48f3..b0271e8ea2 100644
--- a/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro
+++ b/tests/auto/corelib/animation/qsequentialanimationgroup/qsequentialanimationgroup.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsequentialanimationgroup
QT = core testlib
SOURCES = tst_qsequentialanimationgroup.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
index c0fcb70ff3..067dcd705a 100644
--- a/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
+++ b/tests/auto/corelib/animation/qsequentialanimationgroup/tst_qsequentialanimationgroup.cpp
@@ -916,7 +916,7 @@ void tst_QSequentialAnimationGroup::startDelay()
QTest::qWait(500);
QTRY_COMPARE(group.state(), QAnimationGroup::Stopped);
- QVERIFY(group.currentLoopTime() == 375);
+ QCOMPARE(group.currentLoopTime(), 375);
}
void tst_QSequentialAnimationGroup::clearGroup()
@@ -1518,7 +1518,7 @@ void tst_QSequentialAnimationGroup::addRemoveAnimation()
void tst_QSequentialAnimationGroup::currentAnimation()
{
QSequentialAnimationGroup group;
- QVERIFY(group.currentAnimation() == 0);
+ QVERIFY(!group.currentAnimation());
QPropertyAnimation anim;
anim.setDuration(0);
@@ -1529,7 +1529,7 @@ void tst_QSequentialAnimationGroup::currentAnimation()
void tst_QSequentialAnimationGroup::currentAnimationWithZeroDuration()
{
QSequentialAnimationGroup group;
- QVERIFY(group.currentAnimation() == 0);
+ QVERIFY(!group.currentAnimation());
QPropertyAnimation zero1;
zero1.setDuration(0);
diff --git a/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro b/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro
index 1c882833fc..b82d3bc6e0 100644
--- a/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro
+++ b/tests/auto/corelib/animation/qvariantanimation/qvariantanimation.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qvariantanimation
QT = core testlib
SOURCES = tst_qvariantanimation.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp b/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp
index bd539296c2..5e223969e3 100644
--- a/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp
+++ b/tests/auto/corelib/animation/qvariantanimation/tst_qvariantanimation.cpp
@@ -77,9 +77,9 @@ void tst_QVariantAnimation::currentValue()
void tst_QVariantAnimation::easingCurve()
{
TestableQVariantAnimation anim;
- QVERIFY(anim.easingCurve() == QEasingCurve::Linear);
+ QCOMPARE(anim.easingCurve().type(), QEasingCurve::Linear);
anim.setEasingCurve(QEasingCurve::InQuad);
- QVERIFY(anim.easingCurve() == QEasingCurve::InQuad);
+ QCOMPARE(anim.easingCurve().type(), QEasingCurve::InQuad);
}
void tst_QVariantAnimation::endValue()
diff --git a/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro b/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro
index 500f123f61..bf791ffc61 100644
--- a/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro
+++ b/tests/auto/corelib/codecs/qtextcodec/echo/echo.pro
@@ -4,4 +4,3 @@ CONFIG -= app_bundle debug_and_release_target
CONFIG += console
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/codecs/qtextcodec/test/test.pro b/tests/auto/corelib/codecs/qtextcodec/test/test.pro
index 35b2b34690..e0a1bbd88e 100644
--- a/tests/auto/corelib/codecs/qtextcodec/test/test.pro
+++ b/tests/auto/corelib/codecs/qtextcodec/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT = core testlib
SOURCES = ../tst_qtextcodec.cpp
@@ -12,4 +11,3 @@ win32 {
}
}
TESTDATA += ../*.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
index 3aa06d237d..82ed655390 100644
--- a/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
+++ b/tests/auto/corelib/codecs/qtextcodec/tst_qtextcodec.cpp
@@ -156,7 +156,7 @@ void tst_QTextCodec::codecForName()
QTextCodec *codec = QTextCodec::codecForName(hint.toLatin1());
if (actualCodecName.isEmpty()) {
- QVERIFY(codec == 0);
+ QVERIFY(!codec);
} else {
QVERIFY(codec != 0);
QCOMPARE(QString(codec->name()), actualCodecName);
@@ -265,7 +265,7 @@ void tst_QTextCodec::fromUnicode()
array is correct (no off by one, no trailing '\0').
*/
QByteArray result = codec->fromUnicode(QString("abc"));
- if (result.startsWith("a")) {
+ if (result.startsWith('a')) {
QCOMPARE(result.size(), 3);
QCOMPARE(result, QByteArray("abc"));
} else {
@@ -573,7 +573,7 @@ void tst_QTextCodec::utf8Codec_data()
str = "Prohl";
str += QChar::ReplacementCharacter;
str += QChar::ReplacementCharacter;
- str += "e";
+ str += QLatin1Char('e');
str += QChar::ReplacementCharacter;
str += " plugin";
str += QChar::ReplacementCharacter;
@@ -2075,7 +2075,7 @@ void tst_QTextCodec::codecForUtfText()
if (detected)
QCOMPARE(codec->mibEnum(), mib);
else
- QVERIFY(codec == 0);
+ QVERIFY(!codec);
}
#if defined(Q_OS_UNIX)
diff --git a/tests/auto/corelib/codecs/utf8/utf8.pro b/tests/auto/corelib/codecs/utf8/utf8.pro
index 23f8b8894e..355d890824 100644
--- a/tests/auto/corelib/codecs/utf8/utf8.pro
+++ b/tests/auto/corelib/codecs/utf8/utf8.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_utf8
QT = core testlib
SOURCES += tst_utf8.cpp utf8data.cpp
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/q_func_info/q_func_info.pro b/tests/auto/corelib/global/q_func_info/q_func_info.pro
index aad0edf4ed..7663a880eb 100644
--- a/tests/auto/corelib/global/q_func_info/q_func_info.pro
+++ b/tests/auto/corelib/global/q_func_info/q_func_info.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_q_func_info
QT = core testlib
SOURCES = tst_q_func_info.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qflags/qflags.pro b/tests/auto/corelib/global/qflags/qflags.pro
index 3f78bc045b..c88a9da396 100644
--- a/tests/auto/corelib/global/qflags/qflags.pro
+++ b/tests/auto/corelib/global/qflags/qflags.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qflags
QT = core testlib
SOURCES = tst_qflags.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG, c++11): CONFIG += c++11 c++14
diff --git a/tests/auto/corelib/global/qgetputenv/qgetputenv.pro b/tests/auto/corelib/global/qgetputenv/qgetputenv.pro
index 34fb1a702b..c6d1100335 100644
--- a/tests/auto/corelib/global/qgetputenv/qgetputenv.pro
+++ b/tests/auto/corelib/global/qgetputenv/qgetputenv.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qgetputenv
QT = core testlib
SOURCES = tst_qgetputenv.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp
index 71a3419963..adf8172a68 100644
--- a/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp
+++ b/tests/auto/corelib/global/qgetputenv/tst_qgetputenv.cpp
@@ -80,7 +80,7 @@ void tst_QGetPutEnv::getSetCheck()
QCOMPARE(qEnvironmentVariableIntValue(varName, &ok), 0);
QVERIFY(!ok);
result = qgetenv(varName);
- QVERIFY(result == "supervalue");
+ QCOMPARE(result, QByteArrayLiteral("supervalue"));
qputenv(varName,QByteArray());
diff --git a/tests/auto/corelib/global/qglobal/qglobal.pro b/tests/auto/corelib/global/qglobal/qglobal.pro
index d1c02f80e9..b8ed7761f5 100644
--- a/tests/auto/corelib/global/qglobal/qglobal.pro
+++ b/tests/auto/corelib/global/qglobal/qglobal.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qglobal
QT = core testlib
SOURCES = tst_qglobal.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro b/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro
index 7b374505ce..056d940da7 100644
--- a/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro
+++ b/tests/auto/corelib/global/qglobalstatic/qglobalstatic.pro
@@ -10,4 +10,3 @@ CONFIG += exceptions
SOURCES += tst_qglobalstatic.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qhooks/qhooks.pro b/tests/auto/corelib/global/qhooks/qhooks.pro
index f886e7d49a..a5c0d63cb9 100644
--- a/tests/auto/corelib/global/qhooks/qhooks.pro
+++ b/tests/auto/corelib/global/qhooks/qhooks.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qhooks
QT = core-private testlib
SOURCES = tst_qhooks.cpp
diff --git a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
index b5930790e4..a38a396a5d 100644
--- a/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
+++ b/tests/auto/corelib/global/qhooks/tst_qhooks.cpp
@@ -46,7 +46,7 @@ private slots:
void tst_QHooks::testVersion()
{
- QVERIFY(qtHookData[QHooks::HookDataVersion] >= 1);
+ QVERIFY(qtHookData[QHooks::HookDataVersion] >= 3);
QCOMPARE(qtHookData[QHooks::HookDataSize], (quintptr)QHooks::LastHookIndex);
QCOMPARE(qtHookData[QHooks::QtVersion], (quintptr)QT_VERSION);
}
diff --git a/tests/auto/corelib/global/qlogging/app/app.pro b/tests/auto/corelib/global/qlogging/app/app.pro
index 4789efc478..8ada04acdc 100644
--- a/tests/auto/corelib/global/qlogging/app/app.pro
+++ b/tests/auto/corelib/global/qlogging/app/app.pro
@@ -9,7 +9,6 @@ CONFIG -= app_bundle
CONFIG += console
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
DEFINES += QT_MESSAGELOGCONTEXT
gcc:!mingw:!haiku: QMAKE_LFLAGS += -rdynamic
diff --git a/tests/auto/corelib/global/qlogging/test/test.pro b/tests/auto/corelib/global/qlogging/test/test.pro
index d4dce4a0c3..d382001296 100644
--- a/tests/auto/corelib/global/qlogging/test/test.pro
+++ b/tests/auto/corelib/global/qlogging/test/test.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
CONFIG -= app_bundle debug_and_release_target
contains(QT_CONFIG, c++11): CONFIG += c++11 c++14
TARGET = ../tst_qlogging
diff --git a/tests/auto/corelib/global/qlogging/tst_qlogging.cpp b/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
index a65a72313f..e2370665d8 100644
--- a/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
+++ b/tests/auto/corelib/global/qlogging/tst_qlogging.cpp
@@ -821,7 +821,7 @@ void tst_qmessagehandler::qMessagePattern()
// test QT_MESSAGE_PATTERN
//
QStringList environment = m_baseEnvironment;
- environment.prepend("QT_MESSAGE_PATTERN=\"" + pattern + "\"");
+ environment.prepend("QT_MESSAGE_PATTERN=\"" + pattern + QLatin1Char('"'));
process.setEnvironment(environment);
process.start(appExe);
diff --git a/tests/auto/corelib/global/qnumeric/qnumeric.pro b/tests/auto/corelib/global/qnumeric/qnumeric.pro
index 0772ce6aab..188bb5b463 100644
--- a/tests/auto/corelib/global/qnumeric/qnumeric.pro
+++ b/tests/auto/corelib/global/qnumeric/qnumeric.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qnumeric
QT = core-private testlib
SOURCES = tst_qnumeric.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
intel_icc: QMAKE_CXXFLAGS += -fp-model strict
intel_icl: QMAKE_CXXFLAGS += /fp:strict
diff --git a/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp b/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
index 6be8ff81cf..01ff3a6c7e 100644
--- a/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
+++ b/tests/auto/corelib/global/qnumeric/tst_qnumeric.cpp
@@ -105,6 +105,18 @@ void tst_QNumeric::qNan()
QVERIFY(qIsNaN(nan));
QVERIFY(qIsNaN(nan + 1));
QVERIFY(qIsNaN(-nan));
+
+ Q_STATIC_ASSERT(sizeof(double) == 8);
+#ifdef Q_LITTLE_ENDIAN
+ const uchar bytes[] = { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f };
+#else
+ const uchar bytes[] = { 0x7f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 };
+#endif
+ memcpy(&nan, bytes, 8);
+ QVERIFY(!qIsFinite(nan));
+ QVERIFY(!qIsInf(nan));
+ QVERIFY(qIsNaN(nan));
+
double inf = qInf();
QVERIFY(inf > 0);
QVERIFY(-inf < 0);
diff --git a/tests/auto/corelib/global/qrand/qrand.pro b/tests/auto/corelib/global/qrand/qrand.pro
index 7761b6721a..ee1430aea5 100644
--- a/tests/auto/corelib/global/qrand/qrand.pro
+++ b/tests/auto/corelib/global/qrand/qrand.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qrand
QT = core testlib
SOURCES = tst_qrand.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/global/qtendian/qtendian.pro b/tests/auto/corelib/global/qtendian/qtendian.pro
index 363b86988d..2b0af4fa4c 100644
--- a/tests/auto/corelib/global/qtendian/qtendian.pro
+++ b/tests/auto/corelib/global/qtendian/qtendian.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtendian
QT = core testlib
SOURCES = tst_qtendian.cpp
@@ -6,4 +6,3 @@ wince* { # QTBUG-37194 , internal compiler errors with MSVC2008 for Windows CE
QMAKE_CFLAGS_RELEASE -= -O2
QMAKE_CXXFLAGS_RELEASE -= -O2
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/largefile/largefile.pro b/tests/auto/corelib/io/largefile/largefile.pro
index d9938d07d5..caef116684 100644
--- a/tests/auto/corelib/io/largefile/largefile.pro
+++ b/tests/auto/corelib/io/largefile/largefile.pro
@@ -4,4 +4,3 @@ QT = core testlib
SOURCES = tst_largefile.cpp
wince: SOURCES += $$QT_SOURCE_TREE/src/corelib/kernel/qfunctions_wince.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro b/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro
index b950f8c062..641bb7341b 100644
--- a/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro
+++ b/tests/auto/corelib/io/qabstractfileengine/qabstractfileengine.pro
@@ -3,4 +3,3 @@ TARGET = tst_qabstractfileengine
QT = core-private core testlib
SOURCES = tst_qabstractfileengine.cpp
RESOURCES += qabstractfileengine.qrc
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qbuffer/qbuffer.pro b/tests/auto/corelib/io/qbuffer/qbuffer.pro
index 55d91f3cde..76b1088595 100644
--- a/tests/auto/corelib/io/qbuffer/qbuffer.pro
+++ b/tests/auto/corelib/io/qbuffer/qbuffer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbuffer
QT = core testlib
SOURCES = tst_qbuffer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp b/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp
index 3b730d97f9..c4800b4e10 100644
--- a/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp
+++ b/tests/auto/corelib/io/qbuffer/tst_qbuffer.cpp
@@ -378,7 +378,7 @@ void tst_QBuffer::read_rawdata()
for (int i = 0; i < (int)sizeof(mydata); ++i) {
QVERIFY(!buffer.atEnd());
in >> ch;
- QVERIFY(ch == (quint8)mydata[i]);
+ QCOMPARE(ch, (quint8)mydata[i]);
}
QVERIFY(buffer.atEnd());
}
diff --git a/tests/auto/corelib/io/qdatastream/qdatastream.pro b/tests/auto/corelib/io/qdatastream/qdatastream.pro
index 9ab2b0948d..961e1933de 100644
--- a/tests/auto/corelib/io/qdatastream/qdatastream.pro
+++ b/tests/auto/corelib/io/qdatastream/qdatastream.pro
@@ -4,7 +4,6 @@ QT += testlib
SOURCES = tst_qdatastream.cpp
TESTDATA += datastream.q42
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
index d9d3f55d4a..729cf6547e 100644
--- a/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
+++ b/tests/auto/corelib/io/qdatastream/tst_qdatastream.cpp
@@ -301,7 +301,7 @@ void tst_QDataStream::cleanupTestCase()
static int dataIndex(const QString &tag)
{
- int pos = tag.lastIndexOf("_");
+ int pos = tag.lastIndexOf(QLatin1Char('_'));
if (pos >= 0) {
int ret = 0;
QString count = tag.mid(pos + 1);
@@ -338,9 +338,9 @@ void tst_QDataStream::stream_data(int noOfElements)
for (int b=0; b<2; b++) {
QString byte_order = b == 0 ? "BigEndian" : "LittleEndian";
- QString tag = device + "_" + byte_order;
+ QString tag = device + QLatin1Char('_') + byte_order;
for (int e=0; e<noOfElements; e++) {
- QTest::newRow(qPrintable(tag + QString("_%1").arg(e))) << device << QString(byte_order);
+ QTest::newRow(qPrintable(tag + QLatin1Char('_') + QString::number(e))) << device << byte_order;
}
}
}
@@ -529,7 +529,7 @@ void tst_QDataStream::readQRegExp(QDataStream *s)
*s >> R;
QCOMPARE(R, test);
*s >> V;
- QVERIFY(V.type() == QVariant::RegExp);
+ QCOMPARE(V.type(), QVariant::RegExp);
QCOMPARE(V.toRegExp(), test);
}
@@ -797,7 +797,7 @@ void tst_QDataStream::readbool(QDataStream *s)
bool d1;
*s >> d1;
- QVERIFY(d1 == expected);
+ QCOMPARE(d1, expected);
}
// ************************************
@@ -860,7 +860,7 @@ void tst_QDataStream::readQBitArray(QDataStream *s)
QBitArray d1;
*s >> d1;
- QVERIFY(d1 == expected);
+ QCOMPARE(d1, expected);
}
// ************************************
@@ -919,7 +919,7 @@ void tst_QDataStream::readQBrush(QDataStream *s)
*s >> d2;
QBrush brush = qBrushData(dataIndex(QTest::currentDataTag()));
- QVERIFY(d2 == brush);
+ QCOMPARE(d2, brush);
}
// ************************************
@@ -961,7 +961,7 @@ void tst_QDataStream::readQColor(QDataStream *s)
QColor test(QColorData(dataIndex(QTest::currentDataTag())));
QColor d3;
*s >> d3;
- QVERIFY(d3 == test);
+ QCOMPARE(d3, test);
}
@@ -1057,7 +1057,7 @@ void tst_QDataStream::readQCursor(QDataStream *s)
*s >> d5;
QVERIFY(d5.shape() == test.shape()); //## lacks operator==
- QVERIFY(d5.hotSpot() == test.hotSpot());
+ QCOMPARE(d5.hotSpot(), test.hotSpot());
QVERIFY((d5.bitmap() != 0 && test.bitmap() != 0) || (d5.bitmap() == 0 && test.bitmap() == 0));
if (d5.bitmap() != 0) {
QPixmap actual = *(d5.bitmap());
@@ -1120,7 +1120,7 @@ void tst_QDataStream::readQDate(QDataStream *s)
QDate test(qDateData(dataIndex(QTest::currentDataTag())));
QDate d6;
*s >> d6;
- QVERIFY(d6 == test);
+ QCOMPARE(d6, test);
}
// ************************************
@@ -1214,7 +1214,7 @@ void tst_QDataStream::readQTime(QDataStream *s)
QTime test = qTimeData(dataIndex(QTest::currentDataTag()));
QTime d7;
*s >> d7;
- QVERIFY(d7 == test);
+ QCOMPARE(d7, test);
}
// ************************************
@@ -1264,7 +1264,7 @@ void tst_QDataStream::readQDateTime(QDataStream *s)
QDateTime test(qDateTimeData(dataIndex(QTest::currentDataTag())));
QDateTime d8;
*s >> d8;
- QVERIFY(d8 == test);
+ QCOMPARE(d8, test);
}
// ************************************
@@ -1415,16 +1415,16 @@ void tst_QDataStream::readQImage(QDataStream *s)
QImage d12;
*s >> d12;
- QVERIFY(d12 == ref);
+ QCOMPARE(d12, ref);
// do some extra neurotic tests
- QVERIFY(d12.size() == ref.size());
- QVERIFY(d12.isNull() == ref.isNull());
- QVERIFY(d12.width() == ref.width());
- QVERIFY(d12.height() == ref.height());
- QVERIFY(d12.depth() == ref.depth());
- QVERIFY(d12.colorCount() == ref.colorCount());
- QVERIFY(d12.hasAlphaChannel() == ref.hasAlphaChannel());
+ QCOMPARE(d12.size(), ref.size());
+ QCOMPARE(d12.isNull(), ref.isNull());
+ QCOMPARE(d12.width(), ref.width());
+ QCOMPARE(d12.height(), ref.height());
+ QCOMPARE(d12.depth(), ref.depth());
+ QCOMPARE(d12.colorCount(), ref.colorCount());
+ QCOMPARE(d12.hasAlphaChannel(), ref.hasAlphaChannel());
}
// ************************************
@@ -1518,9 +1518,9 @@ void tst_QDataStream::readQPen(QDataStream *s)
QCOMPARE(d15.style(), origPen.style());
QCOMPARE(d15.width(), origPen.width());
QCOMPARE(d15.color(), origPen.color());
- QVERIFY(d15.capStyle() == origPen.capStyle());
- QVERIFY(d15.joinStyle() == origPen.joinStyle());
- QVERIFY(d15 == origPen);
+ QCOMPARE(d15.capStyle(), origPen.capStyle());
+ QCOMPARE(d15.joinStyle(), origPen.joinStyle());
+ QCOMPARE(d15, origPen);
}
// ************************************
@@ -1568,11 +1568,11 @@ void tst_QDataStream::readQPixmap(QDataStream *s)
QPixmap d16;
*s >> d16;
QVERIFY(!d16.isNull() && !pm.isNull());
- QVERIFY(d16.width() == pm.width());
- QVERIFY(d16.height() == pm.height());
- QVERIFY(d16.size() == pm.size());
- QVERIFY(d16.rect() == pm.rect());
- QVERIFY(d16.depth() == pm.depth());
+ QCOMPARE(d16.width(), pm.width());
+ QCOMPARE(d16.height(), pm.height());
+ QCOMPARE(d16.size(), pm.size());
+ QCOMPARE(d16.rect(), pm.rect());
+ QCOMPARE(d16.depth(), pm.depth());
}
void tst_QDataStream::writeQIcon(QDataStream *s)
@@ -1639,11 +1639,11 @@ void tst_QDataStream::readQPoint(QDataStream *s)
QPoint ref(qPointData(dataIndex(QTest::currentDataTag())));
QPoint d17;
*s >> d17;
- QVERIFY(d17 == ref);
+ QCOMPARE(d17, ref);
QPointF d17f;
*s >> d17f;
- QVERIFY(d17f == QPointF(ref));
+ QCOMPARE(d17f, QPointF(ref));
}
// ************************************
@@ -1691,11 +1691,11 @@ void tst_QDataStream::readQRect(QDataStream *s)
QRect ref(qRectData(dataIndex(QTest::currentDataTag())));
QRect d18;
*s >> d18;
- QVERIFY(d18 == ref);
+ QCOMPARE(d18, ref);
QRectF d18f;
*s >> d18f;
- QVERIFY(d18f == QRectF(ref));
+ QCOMPARE(d18f, QRectF(ref));
}
// ************************************
@@ -1804,11 +1804,11 @@ void tst_QDataStream::readQPolygon(QDataStream *s)
QPolygon ref(qPolygonData(dataIndex(QTest::currentDataTag())));
QPolygon d19;
*s >> d19;
- QVERIFY(d19 == ref);
+ QCOMPARE(d19, ref);
QPolygonF d19f;
*s >> d19f;
- QVERIFY(d19f == QPolygonF(ref));
+ QCOMPARE(d19f, QPolygonF(ref));
}
// ************************************
@@ -1868,7 +1868,7 @@ void tst_QDataStream::readQRegion(QDataStream *s)
QRegion ref(qRegionData(dataIndex(QTest::currentDataTag())));
QRegion r;
*s >> r;
- QVERIFY(r == ref);
+ QCOMPARE(r, ref);
}
// ************************************
@@ -1916,11 +1916,11 @@ void tst_QDataStream::readQSize(QDataStream *s)
QSize ref(qSizeData(dataIndex(QTest::currentDataTag())));
QSize d21;
*s >> d21;
- QVERIFY(d21 == ref);
+ QCOMPARE(d21, ref);
QSizeF d21f;
*s >> d21f;
- QVERIFY(d21f == QSizeF(ref));
+ QCOMPARE(d21f, QSizeF(ref));
}
// *********************** atEnd ******************************
@@ -2072,7 +2072,7 @@ void tst_QDataStream::setVersion_data()
QDataStream latest;
for (int vers = 1; vers <= latest.version(); ++vers)
- QTest::newRow(qPrintable(QString("v_%1").arg(vers))) << vers;
+ QTest::newRow(("v_" + QByteArray::number(vers)).constData()) << vers;
}
void tst_QDataStream::setVersion()
@@ -2096,13 +2096,13 @@ void tst_QDataStream::setVersion()
QDataStream in(&ba1, QIODevice::ReadOnly);
in.setVersion(vers);
in >> keyseq1 >> keyseq2 >> deadbeef;
- QVERIFY(keyseq1 == QKeySequence(Qt::Key_A));
+ QCOMPARE(keyseq1, QKeySequence(Qt::Key_A));
if (vers >= 5) {
QVERIFY(keyseq2 == QKeySequence(Qt::Key_B, Qt::Key_C));
} else {
- QVERIFY(keyseq2 == QKeySequence(Qt::Key_B));
+ QCOMPARE(keyseq2, QKeySequence(Qt::Key_B));
}
- QVERIFY(deadbeef == 0xDEADBEEF);
+ QCOMPARE(deadbeef, 0xDEADBEEF);
}
/*
@@ -2111,7 +2111,7 @@ void tst_QDataStream::setVersion()
// revise the test if new color roles or color groups are added
QVERIFY(QPalette::NColorRoles == QPalette::ToolTipText + 1);
- QVERIFY(QPalette::NColorGroups == 3);
+ QCOMPARE(int(QPalette::NColorGroups), 3);
QByteArray ba2;
QPalette pal1, pal2;
@@ -2176,8 +2176,8 @@ void tst_QDataStream::setVersion()
}
}
}
- QVERIFY(pal1 == inPal1);
- QVERIFY(pal2 == inPal2);
+ QCOMPARE(pal1, inPal1);
+ QCOMPARE(pal2, inPal2);
}
}
}
@@ -3062,9 +3062,9 @@ void tst_QDataStream::compatibility_Qt3()
in >> in_palette;
in >> in_brush;
}
- QVERIFY(in_brush.style() == Qt::NoBrush);
- QVERIFY(in_palette.brush(QPalette::Button).style() == Qt::NoBrush);
- QVERIFY(in_palette.color(QPalette::Light) == Qt::green);
+ QCOMPARE(in_brush.style(), Qt::NoBrush);
+ QCOMPARE(in_palette.brush(QPalette::Button).style(), Qt::NoBrush);
+ QCOMPARE(in_palette.color(QPalette::Light), QColor(Qt::green));
}
}
@@ -3094,9 +3094,9 @@ void tst_QDataStream::compatibility_Qt2()
in >> in_palette;
in >> in_brush;
}
- QVERIFY(in_brush.style() == Qt::NoBrush);
- QVERIFY(in_palette.brush(QPalette::Button).style() == Qt::NoBrush);
- QVERIFY(in_palette.color(QPalette::Light) == Qt::green);
+ QCOMPARE(in_brush.style(), Qt::NoBrush);
+ QCOMPARE(in_palette.brush(QPalette::Button).style(), Qt::NoBrush);
+ QCOMPARE(in_palette.color(QPalette::Light), QColor(Qt::green));
}
void tst_QDataStream::floatingPointNaN()
diff --git a/tests/auto/corelib/io/qdataurl/qdataurl.pro b/tests/auto/corelib/io/qdataurl/qdataurl.pro
index d21fc4ed15..7085c9d881 100644
--- a/tests/auto/corelib/io/qdataurl/qdataurl.pro
+++ b/tests/auto/corelib/io/qdataurl/qdataurl.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdataurl
QT = core core-private testlib
SOURCES = tst_qdataurl.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qdebug/qdebug.pro b/tests/auto/corelib/io/qdebug/qdebug.pro
index 5e902bb105..45c0aa4061 100644
--- a/tests/auto/corelib/io/qdebug/qdebug.pro
+++ b/tests/auto/corelib/io/qdebug/qdebug.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdebug
QT = core testlib concurrent
SOURCES = tst_qdebug.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qdir/qdir.pro b/tests/auto/corelib/io/qdir/qdir.pro
index 0adc7e0450..26bc60a731 100644
--- a/tests/auto/corelib/io/qdir/qdir.pro
+++ b/tests/auto/corelib/io/qdir/qdir.pro
@@ -5,7 +5,6 @@ SOURCES = tst_qdir.cpp
RESOURCES += qdir.qrc
TESTDATA += testdir testData searchdir resources entrylist types tst_qdir.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android:!android-no-sdk {
RESOURCES += android_testdata.qrc
diff --git a/tests/auto/corelib/io/qdir/tst_qdir.cpp b/tests/auto/corelib/io/qdir/tst_qdir.cpp
index ae6fe7eaef..008293a15e 100644
--- a/tests/auto/corelib/io/qdir/tst_qdir.cpp
+++ b/tests/auto/corelib/io/qdir/tst_qdir.cpp
@@ -556,7 +556,7 @@ void tst_QDir::exists_data()
char drive = 'Z';
QString driv;
do {
- driv = QString::fromLatin1("%1:/").arg(drive);
+ driv = drive + QLatin1String(":/");
if (!driveLetters.contains(driv)) break;
--drive;
} while (drive >= 'A');
@@ -621,7 +621,7 @@ void tst_QDir::compare()
dir.makeAbsolute();
QVERIFY(dir == QDir::currentPath());
- QVERIFY(QDir() == QDir(QDir::currentPath()));
+ QCOMPARE(QDir(), QDir(QDir::currentPath()));
QVERIFY(QDir("../") == QDir(QDir::currentPath() + "/.."));
}
@@ -1058,7 +1058,7 @@ void tst_QDir::current()
if (!path.isEmpty()) {
bool b = QDir::setCurrent(path);
// If path is non existent, then setCurrent should be false (currentDir is empty in testData)
- QVERIFY(b == !currentDir.isEmpty());
+ QCOMPARE(b, !currentDir.isEmpty());
}
if (!currentDir.isEmpty()) {
QDir newCurrent = QDir::current();
@@ -1080,7 +1080,7 @@ void tst_QDir::cd_data()
QTest::addColumn<bool>("successExpected");
QTest::addColumn<QString>("newDir");
- int index = m_dataPath.lastIndexOf("/");
+ int index = m_dataPath.lastIndexOf(QLatin1Char('/'));
QTest::newRow("cdUp") << m_dataPath << ".." << true << m_dataPath.left(index==0?1:index);
QTest::newRow("cdUp non existent (relative dir)") << "anonexistingDir" << ".."
<< true << m_dataPath;
@@ -1124,11 +1124,11 @@ void tst_QDir::setNameFilters_data()
QTest::newRow("spaces2") << m_dataPath + "/testdir/spaces" << QStringList("*.bar")
<< QStringList("foo.bar");
QTest::newRow("spaces3") << m_dataPath + "/testdir/spaces" << QStringList("foo.*")
- << QString("foo. bar,foo.bar").split(",");
- QTest::newRow("files1") << m_dataPath + "/testdir/dir" << QString("*r.cpp *.pro").split(" ")
- << QString("qdir.pro,qrc_qdir.cpp,tst_qdir.cpp").split(",");
+ << QString("foo. bar,foo.bar").split(QLatin1Char(','));
+ QTest::newRow("files1") << m_dataPath + "/testdir/dir" << QString("*r.cpp *.pro").split(QLatin1Char(' '))
+ << QString("qdir.pro,qrc_qdir.cpp,tst_qdir.cpp").split(QLatin1Char(','));
QTest::newRow("resources1") << QString(":/tst_qdir/resources/entryList") << QStringList("*.data")
- << QString("file1.data,file2.data,file3.data").split(',');
+ << QString("file1.data,file2.data,file3.data").split(QLatin1Char(','));
}
void tst_QDir::setNameFilters()
@@ -1695,7 +1695,7 @@ void tst_QDir::searchPaths()
QDir::setSearchPaths(searchPathPrefixList.at(i), searchPathsList.at(i).split(","));
}
for (int i = 0; i < searchPathPrefixList.count(); ++i) {
- QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)) == searchPathsList.at(i).split(","));
+ QCOMPARE(QDir::searchPaths(searchPathPrefixList.at(i)), searchPathsList.at(i).split(","));
}
QCOMPARE(QFile(filename).exists(), exists);
@@ -1718,7 +1718,7 @@ void tst_QDir::searchPaths()
}
}
for (int i = 0; i < searchPathPrefixList.count(); ++i) {
- QVERIFY(QDir::searchPaths(searchPathPrefixList.at(i)) == searchPathsList.at(i).split(","));
+ QCOMPARE(QDir::searchPaths(searchPathPrefixList.at(i)), searchPathsList.at(i).split(","));
}
QCOMPARE(QFile(filename).exists(), exists);
diff --git a/tests/auto/corelib/io/qdiriterator/qdiriterator.pro b/tests/auto/corelib/io/qdiriterator/qdiriterator.pro
index a2429bf2f0..2b50f97ac5 100644
--- a/tests/auto/corelib/io/qdiriterator/qdiriterator.pro
+++ b/tests/auto/corelib/io/qdiriterator/qdiriterator.pro
@@ -7,6 +7,5 @@ RESOURCES += qdiriterator.qrc
TESTDATA += entrylist
wince*mips*|wincewm50smart-msvc200*: DEFINES += WINCE_BROKEN_ITERATE=1
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
win32: CONFIG += insignificant_test # Crashes on Windows in release builds
diff --git a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
index 6b1719ad53..9e368515e4 100644
--- a/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
+++ b/tests/auto/corelib/io/qdiriterator/tst_qdiriterator.cpp
@@ -538,7 +538,7 @@ void tst_QDirIterator::recurseWithFilters() const
QVERIFY(it.hasNext());
it.next();
actualEntries.insert(it.fileInfo().filePath());
- QVERIFY(actualEntries == expectedEntries);
+ QCOMPARE(actualEntries, expectedEntries);
QVERIFY(!it.hasNext());
}
diff --git a/tests/auto/corelib/io/qfile/qfile.pro b/tests/auto/corelib/io/qfile/qfile.pro
index e2c714c67f..10c8d918f7 100644
--- a/tests/auto/corelib/io/qfile/qfile.pro
+++ b/tests/auto/corelib/io/qfile/qfile.pro
@@ -5,4 +5,3 @@ wince* {
SUBDIRS = test stdinprocess
}
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro b/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro
index 51badce898..8e463e4cef 100644
--- a/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro
+++ b/tests/auto/corelib/io/qfile/stdinprocess/stdinprocess.pro
@@ -6,4 +6,3 @@ CONFIG += console
# This app is testdata for tst_qfile
target.path = $$[QT_INSTALL_TESTS]/tst_qfile/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfile/test/test.pro b/tests/auto/corelib/io/qfile/test/test.pro
index 9aa4119795..c9ba96cc1b 100644
--- a/tests/auto/corelib/io/qfile/test/test.pro
+++ b/tests/auto/corelib/io/qfile/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle debug_and_release_target
QT = core-private core testlib
qtHaveModule(network): QT += network
@@ -17,4 +16,3 @@ TESTDATA += ../dosfile.txt ../noendofline.txt ../testfile.txt \
../resources/file1.ext1
win32:!winrt: LIBS+=-lole32 -luuid
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfile/tst_qfile.cpp b/tests/auto/corelib/io/qfile/tst_qfile.cpp
index 1c695a1113..b4140e1115 100644
--- a/tests/auto/corelib/io/qfile/tst_qfile.cpp
+++ b/tests/auto/corelib/io/qfile/tst_qfile.cpp
@@ -849,7 +849,7 @@ void tst_QFile::readAll()
QByteArray a = file.readAll();
file.reset();
- QVERIFY(file.pos() == 0);
+ QCOMPARE(file.pos(), 0);
QVERIFY(file.bytesAvailable() > 7);
QByteArray b = file.read(1);
@@ -1195,7 +1195,7 @@ void tst_QFile::append()
f.close();
QVERIFY2(f.open(QIODevice::Append), msgOpenFailed(f).constData());
- QVERIFY(f.pos() == 1);
+ QCOMPARE(f.pos(), 1);
f.putChar('a');
f.close();
QCOMPARE(int(f.size()), 2);
@@ -2047,7 +2047,7 @@ void tst_QFile::longFileName()
QString line = ts.readLine();
QCOMPARE(line, fileName);
}
- QString newName = fileName + QLatin1String("1");
+ QString newName = fileName + QLatin1Char('1');
{
QVERIFY(QFile::copy(fileName, newName));
QFile file(newName);
@@ -2224,7 +2224,7 @@ void tst_QFile::removeOpenFile()
QVERIFY(removed);
QVERIFY(!f.isOpen());
QVERIFY(!f.exists());
- QVERIFY(f.error() == QFile::NoError);
+ QCOMPARE(f.error(), QFile::NoError);
}
{
@@ -2251,7 +2251,7 @@ void tst_QFile::removeOpenFile()
QVERIFY(removed);
QVERIFY(!f.isOpen());
QVERIFY(!f.exists());
- QVERIFY(f.error() == QFile::NoError);
+ QCOMPARE(f.error(), QFile::NoError);
}
}
@@ -2819,13 +2819,13 @@ void tst_QFile::readEof()
char buf[10];
int ret = file.read(buf, sizeof buf);
QCOMPARE(ret, 0);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.read(buf, sizeof buf);
QCOMPARE(ret, 0);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2840,13 +2840,13 @@ void tst_QFile::readEof()
QByteArray ret = file.read(10);
QVERIFY(ret.isEmpty());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.read(10);
QVERIFY(ret.isEmpty());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2862,13 +2862,13 @@ void tst_QFile::readEof()
char buf[10];
int ret = file.readLine(buf, sizeof buf);
QCOMPARE(ret, -1);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.readLine(buf, sizeof buf);
QCOMPARE(ret, -1);
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2883,13 +2883,13 @@ void tst_QFile::readEof()
QByteArray ret = file.readLine();
QVERIFY(ret.isNull());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
ret = file.readLine();
QVERIFY(ret.isNull());
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
@@ -2904,12 +2904,12 @@ void tst_QFile::readEof()
char c;
QVERIFY(!file.getChar(&c));
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
// Do it again to ensure that we get the same result
QVERIFY(!file.getChar(&c));
- QVERIFY(file.error() == QFile::NoError);
+ QCOMPARE(file.error(), QFile::NoError);
QVERIFY(file.atEnd());
}
}
@@ -2997,7 +2997,7 @@ void tst_QFile::map()
memory = file.map(offset, size);
QCOMPARE(file.error(), QFile::NoError);
QVERIFY(memory);
- QVERIFY(memory[0] == 'Q');
+ QCOMPARE(memory[0], uchar('Q'));
QVERIFY(file.unmap(memory));
QCOMPARE(file.error(), QFile::NoError);
diff --git a/tests/auto/corelib/io/qfileinfo/qfileinfo.pro b/tests/auto/corelib/io/qfileinfo/qfileinfo.pro
index 571637be37..8aa81896cc 100644
--- a/tests/auto/corelib/io/qfileinfo/qfileinfo.pro
+++ b/tests/auto/corelib/io/qfileinfo/qfileinfo.pro
@@ -6,6 +6,5 @@ RESOURCES += qfileinfo.qrc \
testdata.qrc
win32:!wince:!winrt:LIBS += -ladvapi32 -lnetapi32
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
win32: CONFIG += insignificant_test # Crashes on Windows in release builds
diff --git a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
index 210fdb5a12..1d49c8e3b9 100644
--- a/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
+++ b/tests/auto/corelib/io/qfileinfo/tst_qfileinfo.cpp
@@ -1097,7 +1097,7 @@ void tst_QFileInfo::consistent()
QFileInfo fi(file);
QCOMPARE(fi.filePath(), expected);
- QCOMPARE(fi.dir().path() + "/" + fi.fileName(), expected);
+ QCOMPARE(fi.dir().path() + QLatin1Char('/') + fi.fileName(), expected);
}
@@ -1429,7 +1429,7 @@ void tst_QFileInfo::refresh()
QCOMPARE(file.write("JOJOJO"), qint64(6));
file.flush();
- QVERIFY(info.lastModified() == lastModified);
+ QCOMPARE(info.lastModified(), lastModified);
QCOMPARE(info.size(), qint64(7));
#if defined(Q_OS_WIN) || defined(Q_OS_WINCE)
diff --git a/tests/auto/corelib/io/qfileselector/qfileselector.pro b/tests/auto/corelib/io/qfileselector/qfileselector.pro
index ded3d6502e..edcc91e8ed 100644
--- a/tests/auto/corelib/io/qfileselector/qfileselector.pro
+++ b/tests/auto/corelib/io/qfileselector/qfileselector.pro
@@ -1,4 +1,3 @@
-CONFIG += parallel_test
CONFIG += testcase
TARGET = tst_qfileselectors
QT = core-private testlib
diff --git a/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro b/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro
index 99d3af1848..474836fba2 100644
--- a/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro
+++ b/tests/auto/corelib/io/qfilesystementry/qfilesystementry.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfilesystementry
QT = core-private testlib
SOURCES = tst_qfilesystementry.cpp \
$$QT_SOURCE_TREE/src/corelib/io/qfilesystementry.cpp
HEADERS = $$QT_SOURCE_TREE/src/corelib/io/qfilesystementry_p.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro b/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
index 1faa089c6e..46dd70289b 100644
--- a/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
+++ b/tests/auto/corelib/io/qfilesystemwatcher/qfilesystemwatcher.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfilesystemwatcher
QT = core testlib
SOURCES = tst_qfilesystemwatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
index 026743257c..e8bbaa1b25 100644
--- a/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
+++ b/tests/auto/corelib/io/qfilesystemwatcher/tst_qfilesystemwatcher.cpp
@@ -731,9 +731,10 @@ void tst_QFileSystemWatcher::signalsEmittedAfterFileMoved()
QString movePath = testDir.filePath("movehere");
for (int i = 0; i < fileCount; ++i) {
- QFile f(testDir.filePath(QString("test%1.txt").arg(i)));
+ const QByteArray iB = QByteArray::number(i);
+ QFile f(testDir.filePath(QLatin1String("test") + QString::fromLatin1(iB) + QLatin1String(".txt")));
QVERIFY(f.open(QIODevice::WriteOnly));
- f.write(QByteArray("i am ") + QByteArray::number(i));
+ f.write(QByteArray("i am ") + iB);
f.close();
}
diff --git a/tests/auto/corelib/io/qiodevice/qiodevice.pro b/tests/auto/corelib/io/qiodevice/qiodevice.pro
index 9fd70fb177..78f5b5e75d 100644
--- a/tests/auto/corelib/io/qiodevice/qiodevice.pro
+++ b/tests/auto/corelib/io/qiodevice/qiodevice.pro
@@ -5,7 +5,6 @@ SOURCES = tst_qiodevice.cpp
TESTDATA += tst_qiodevice.cpp
MOC_DIR=tmp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android:!android-no-sdk: {
RESOURCES += \
diff --git a/tests/auto/corelib/io/qipaddress/qipaddress.pro b/tests/auto/corelib/io/qipaddress/qipaddress.pro
index ff569aa3d5..9c769052ed 100644
--- a/tests/auto/corelib/io/qipaddress/qipaddress.pro
+++ b/tests/auto/corelib/io/qipaddress/qipaddress.pro
@@ -1,5 +1,4 @@
SOURCES += tst_qipaddress.cpp
TARGET = tst_qipaddress
QT = core core-private testlib
-CONFIG += testcase parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+CONFIG += testcase
diff --git a/tests/auto/corelib/io/qnodebug/qnodebug.pro b/tests/auto/corelib/io/qnodebug/qnodebug.pro
index ff8e09b84b..7e35f92474 100644
--- a/tests/auto/corelib/io/qnodebug/qnodebug.pro
+++ b/tests/auto/corelib/io/qnodebug/qnodebug.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qnodebug
QT = core testlib
SOURCES = tst_qnodebug.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp b/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp
index 5ece9190a5..304cf7b551 100644
--- a/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp
+++ b/tests/auto/corelib/io/qnodebug/tst_qnodebug.cpp
@@ -69,8 +69,9 @@ void tst_QNoDebug::noDebugOutput() const
void tst_QNoDebug::streaming() const
{
QDateTime dt(QDate(1,2,3),QTime(4,5,6));
- const QString debugString = dt.toString(QStringLiteral("yyyy-MM-dd HH:mm:ss.zzz t"));
- QTest::ignoreMessage(QtWarningMsg, qPrintable(QString::fromLatin1("QDateTime(%1 Qt::TimeSpec(LocalTime))").arg(debugString)));
+ const QByteArray debugString = dt.toString(QStringLiteral("yyyy-MM-dd HH:mm:ss.zzz t")).toLatin1();
+ const QByteArray message = "QDateTime(" + debugString + " Qt::TimeSpec(LocalTime))";
+ QTest::ignoreMessage(QtWarningMsg, message.constData());
qWarning() << dt;
}
diff --git a/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro b/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro
index 2f409ebdbc..e46e7e1100 100644
--- a/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro
+++ b/tests/auto/corelib/io/qprocess-noapplication/qprocess-noapplication.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle debug_and_release_target
QT = core testlib
SOURCES = tst_qprocessnoapplication.cpp
diff --git a/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro b/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro
index 55e9b05d1a..947dc916f2 100644
--- a/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro
+++ b/tests/auto/corelib/io/qprocess/fileWriterProcess/fileWriterProcess.pro
@@ -3,4 +3,3 @@ CONFIG += console
CONFIG -= app_bundle
QT = core
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/test/test.pro b/tests/auto/corelib/io/qprocess/test/test.pro
index f77dacc87b..96d105a4b4 100644
--- a/tests/auto/corelib/io/qprocess/test/test.pro
+++ b/tests/auto/corelib/io/qprocess/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle debug_and_release_target
QT = core-private testlib network
SOURCES = ../tst_qprocess.cpp
@@ -19,4 +18,3 @@ TEST_HELPER_INSTALLS += \
"../testProcessSpacesArgs/one space" \
"../testProcessSpacesArgs/two space s" \
"../test Space In Name/testSpaceInName"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro b/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro
index 961b28ec7d..8d1fcba624 100644
--- a/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro
+++ b/tests/auto/corelib/io/qprocess/testDetached/testDetached.pro
@@ -4,4 +4,3 @@ CONFIG += console
CONFIG -= app_bundle
INSTALLS =
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro b/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro
index 049454abe2..b08371804f 100644
--- a/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro
+++ b/tests/auto/corelib/io/qprocess/testExitCodes/testExitCodes.pro
@@ -3,4 +3,3 @@ CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro b/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro
index d3439072bb..8778da7ffe 100644
--- a/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro
+++ b/tests/auto/corelib/io/qprocess/testGuiProcess/testGuiProcess.pro
@@ -3,4 +3,3 @@ QT += widgets
CONFIG += console
CONFIG -= app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro b/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro
index f7c57abc37..7ccc976efc 100644
--- a/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessCrash/testProcessCrash.pro
@@ -3,4 +3,3 @@ CONFIG += console
CONFIG -= qt app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro b/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro
index 56b4642bed..fbb3411d47 100644
--- a/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessDeadWhileReading/testProcessDeadWhileReading.pro
@@ -3,4 +3,3 @@ CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro b/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro
index 8f77e46f74..98fe78c8b9 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEOF/testProcessEOF.pro
@@ -4,4 +4,3 @@ CONFIG += console
win32:!mingw:!equals(TEMPLATE_PREFIX, "vc"):QMAKE_CXXFLAGS += /GS-
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro b/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro
index 3940ddbf98..e236e05c7d 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEcho/testProcessEcho.pro
@@ -2,4 +2,3 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro b/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro
index 3940ddbf98..e236e05c7d 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEcho2/testProcessEcho2.pro
@@ -2,4 +2,3 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro b/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro
index 3940ddbf98..e236e05c7d 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEcho3/testProcessEcho3.pro
@@ -2,4 +2,3 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro b/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro
index 962c1122c1..a07ae00605 100644
--- a/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessEnvironment/testProcessEnvironment.pro
@@ -6,4 +6,3 @@ DESTDIR = ./
mac {
CONFIG -= app_bundle
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro b/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro
index f7bb0985a3..c6db9d1bac 100644
--- a/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessNormal/testProcessNormal.pro
@@ -3,5 +3,4 @@ CONFIG += console
CONFIG -= qt app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro b/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro
index 2de4534896..95191098bd 100644
--- a/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro
+++ b/tests/auto/corelib/io/qprocess/testProcessOutput/testProcessOutput.pro
@@ -2,5 +2,4 @@ SOURCES = main.cpp
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro b/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro
index d425d5569e..21a115b536 100644
--- a/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro
+++ b/tests/auto/corelib/io/qprocess/testSetWorkingDirectory/testSetWorkingDirectory.pro
@@ -2,5 +2,4 @@ SOURCES = main.cpp
CONFIG += console
CONFIG -= app_bundle
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro b/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro
index b59241851f..d19a631cae 100644
--- a/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro
+++ b/tests/auto/corelib/io/qprocess/testSoftExit/testSoftExit.pro
@@ -9,5 +9,4 @@ unix {
CONFIG -= qt app_bundle
CONFIG += console
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro b/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro
index b7213ae507..afa4f32a85 100644
--- a/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro
+++ b/tests/auto/corelib/io/qprocess/testSpaceInName/testSpaceInName.pro
@@ -6,5 +6,4 @@ DESTDIR = "../test Space In Name"
mac {
CONFIG -= app_bundle
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
QT = core
diff --git a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
index 45d6cf3dcd..83da28767f 100644
--- a/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
+++ b/tests/auto/corelib/io/qprocess/tst_qprocess.cpp
@@ -845,11 +845,11 @@ void tst_QProcess::openModes()
{
QProcess proc;
QVERIFY(!proc.isOpen());
- QVERIFY(proc.openMode() == QProcess::NotOpen);
+ QCOMPARE(proc.openMode(), QProcess::NotOpen);
proc.start("testProcessEcho3/testProcessEcho3");
QVERIFY(proc.waitForStarted(5000));
QVERIFY(proc.isOpen());
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
QVERIFY(proc.isReadable());
QVERIFY(proc.isWritable());
@@ -858,7 +858,7 @@ void tst_QProcess::openModes()
proc.closeWriteChannel();
QVERIFY(proc.isWritable());
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
while (proc.bytesAvailable() < 4 && proc.waitForReadyRead(5000))
{ }
@@ -867,12 +867,12 @@ void tst_QProcess::openModes()
proc.closeReadChannel(QProcess::StandardOutput);
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
QVERIFY(proc.isReadable());
proc.closeReadChannel(QProcess::StandardError);
- QVERIFY(proc.openMode() == QProcess::ReadWrite);
+ QCOMPARE(proc.openMode(), QProcess::ReadWrite);
QVERIFY(proc.isReadable());
proc.close();
@@ -1444,11 +1444,11 @@ void tst_QProcess::spaceArgsTest()
QCOMPARE(actual, args);
#endif
- if (program.contains(" "))
- program = "\"" + program + "\"";
+ if (program.contains(QLatin1Char(' ')))
+ program = QLatin1Char('"') + program + QLatin1Char('"');
if (!stringArgs.isEmpty())
- program += QString::fromLatin1(" ") + stringArgs;
+ program += QLatin1Char(' ') + stringArgs;
errorMessage.clear();
process.start(program);
@@ -1501,9 +1501,9 @@ void tst_QProcess::nativeArguments()
char buf[256];
fgets(buf, 256, file);
fclose(file);
- QStringList actual = QString::fromLatin1(buf).split("|");
+ QStringList actual = QString::fromLatin1(buf).split(QLatin1Char('|'));
#else
- QStringList actual = QString::fromLatin1(proc.readAll()).split("|");
+ QStringList actual = QString::fromLatin1(proc.readAll()).split(QLatin1Char('|'));
#endif
QVERIFY(!actual.isEmpty());
// not interested in the program name, it might be different.
@@ -2302,6 +2302,13 @@ void tst_QProcess::setNonExistentWorkingDirectory()
QEXPECT_FAIL("", "QProcess cannot detect failure to start when using posix_spawn()", Continue);
#endif
QCOMPARE(int(process.error()), int(QProcess::FailedToStart));
+
+#ifdef Q_OS_UNIX
+# ifdef QPROCESS_USE_SPAWN
+ QEXPECT_FAIL("", "QProcess cannot detect failure to start when using posix_spawn()", Continue);
+# endif
+ QVERIFY2(process.errorString().startsWith("chdir:"), process.errorString().toLocal8Bit());
+#endif
}
#endif
diff --git a/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro b/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro
index 760fa11b9e..04cef29a64 100644
--- a/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro
+++ b/tests/auto/corelib/io/qprocessenvironment/qprocessenvironment.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qprocessenvironment
QT = core testlib
SOURCES = tst_qprocessenvironment.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp b/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp
index 2099101a91..2bf2696639 100644
--- a/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp
+++ b/tests/auto/corelib/io/qprocessenvironment/tst_qprocessenvironment.cpp
@@ -57,25 +57,25 @@ private slots:
void tst_QProcessEnvironment::operator_eq()
{
QProcessEnvironment e1;
- QVERIFY(e1 == e1);
+ QCOMPARE(e1, e1);
e1.clear();
- QVERIFY(e1 == e1);
+ QCOMPARE(e1, e1);
e1 = QProcessEnvironment();
QProcessEnvironment e2;
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e1.clear();
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e2.clear();
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e1.insert("FOO", "bar");
QVERIFY(e1 != e2);
e2.insert("FOO", "bar");
- QVERIFY(e1 == e2);
+ QCOMPARE(e1, e2);
e2.insert("FOO", "baz");
QVERIFY(e1 != e2);
@@ -212,7 +212,7 @@ void tst_QProcessEnvironment::insertEnv()
e3.insert(e3); // mustn't deadlock
- QVERIFY(e3 == e2);
+ QCOMPARE(e3, e2);
}
void tst_QProcessEnvironment::caseSensitivity()
diff --git a/tests/auto/corelib/io/qresourceengine/qresourceengine.pro b/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
index 64f5cb46e0..e8b82b4df7 100644
--- a/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
+++ b/tests/auto/corelib/io/qresourceengine/qresourceengine.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qresourceengine
load(resources)
QT = core testlib
@@ -16,7 +16,6 @@ TESTDATA += \
parentdir.txt \
testqrc/*
GENERATED_TESTDATA = $${runtime_resource.target}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android:!android-no-sdk {
RESOURCES += android_testdata.qrc
diff --git a/tests/auto/corelib/io/qsavefile/qsavefile.pro b/tests/auto/corelib/io/qsavefile/qsavefile.pro
index 36db000fa7..dd22d69ce6 100644
--- a/tests/auto/corelib/io/qsavefile/qsavefile.pro
+++ b/tests/auto/corelib/io/qsavefile/qsavefile.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsavefile
QT = core testlib
SOURCES = tst_qsavefile.cpp
diff --git a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
index 19155cc3ad..b0cb59a012 100644
--- a/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
+++ b/tests/auto/corelib/io/qsettings/tst_qsettings.cpp
@@ -121,6 +121,7 @@ private slots:
void testEmptyKey();
void testResourceFiles();
void testRegistryShortRootNames();
+ void testRegistry32And64Bit();
void trailingWhitespace();
#ifdef Q_OS_MAC
void fileName();
@@ -276,8 +277,8 @@ void tst_QSettings::initTestCase()
, Qt::CaseInsensitive
#endif
);
- QVERIFY(custom1 == QSettings::CustomFormat1);
- QVERIFY(custom2 == QSettings::CustomFormat2);
+ QCOMPARE(custom1, QSettings::CustomFormat1);
+ QCOMPARE(custom2, QSettings::CustomFormat2);
cleanupTestFiles();
}
@@ -357,27 +358,27 @@ void tst_QSettings::ctor()
QSettings settings8(format, QSettings::SystemScope, "software.org");
// test QSettings::format() while we're at it
- QVERIFY(settings1.format() == format);
- QVERIFY(settings2.format() == format);
- QVERIFY(settings3.format() == format);
- QVERIFY(settings4.format() == format);
+ QCOMPARE(settings1.format(), format);
+ QCOMPARE(settings2.format(), format);
+ QCOMPARE(settings3.format(), format);
+ QCOMPARE(settings4.format(), format);
// test QSettings::scope() while we're at it
- QVERIFY(settings1.scope() == QSettings::UserScope);
- QVERIFY(settings2.scope() == QSettings::UserScope);
- QVERIFY(settings3.scope() == QSettings::SystemScope);
- QVERIFY(settings4.scope() == QSettings::SystemScope);
+ QCOMPARE(settings1.scope(), QSettings::UserScope);
+ QCOMPARE(settings2.scope(), QSettings::UserScope);
+ QCOMPARE(settings3.scope(), QSettings::SystemScope);
+ QCOMPARE(settings4.scope(), QSettings::SystemScope);
// test QSettings::organizationName() while we're at it
- QVERIFY(settings1.organizationName() == "software.org");
- QVERIFY(settings2.organizationName() == "software.org");
- QVERIFY(settings3.organizationName() == "software.org");
- QVERIFY(settings4.organizationName() == "software.org");
+ QCOMPARE(settings1.organizationName(), QLatin1String("software.org"));
+ QCOMPARE(settings2.organizationName(), QLatin1String("software.org"));
+ QCOMPARE(settings3.organizationName(), QLatin1String("software.org"));
+ QCOMPARE(settings4.organizationName(), QLatin1String("software.org"));
// test QSettings::applicationName() while we're at it
QCOMPARE(settings1.applicationName(), QString("KillerAPP"));
QVERIFY(settings2.applicationName().isEmpty());
- QVERIFY(settings3.applicationName() == "KillerAPP");
+ QCOMPARE(settings3.applicationName(), QLatin1String("KillerAPP"));
QVERIFY(settings4.applicationName().isEmpty());
#if !defined(Q_OS_BLACKBERRY)
@@ -553,7 +554,7 @@ void tst_QSettings::ctor()
settings1.endGroup();
// test QSettings::scope() while we're at it
- QVERIFY(settings1.scope() == QSettings::UserScope);
+ QCOMPARE(settings1.scope(), QSettings::UserScope);
// test QSettings::organizationName() while we're at it
QVERIFY(settings1.organizationName().isEmpty());
@@ -628,20 +629,20 @@ void tst_QSettings::ctor()
QCOMPARE(settings2.status(), QSettings::NoError);
// test QSettings::format() while we're at it
- QVERIFY(settings.format() == format);
- QVERIFY(settings2.format() == format);
+ QCOMPARE(settings.format(), format);
+ QCOMPARE(settings2.format(), format);
// test QSettings::scope() while we're at it
- QVERIFY(settings.scope() == QSettings::UserScope);
- QVERIFY(settings2.scope() == QSettings::UserScope);
+ QCOMPARE(settings.scope(), QSettings::UserScope);
+ QCOMPARE(settings2.scope(), QSettings::UserScope);
// test QSettings::organizationName() while we're at it
QVERIFY(settings.organizationName().isEmpty());
- QVERIFY(settings2.organizationName() == "software.org");
+ QCOMPARE(settings2.organizationName(), QLatin1String("software.org"));
// test QSettings::applicationName() while we're at it
QVERIFY(settings.applicationName().isEmpty());
- QVERIFY(settings2.applicationName() == "KillerAPP");
+ QCOMPARE(settings2.applicationName(), QLatin1String("KillerAPP"));
}
}
@@ -1187,16 +1188,16 @@ void tst_QSettings::remove()
{
QSettings settings0(QSettings::UserScope, "software.org", "KillerAPP");
int initialNumKeys = settings0.allKeys().size();
- QCOMPARE(settings0.value("key 1", "123").toString(), QString("123"));
+ QCOMPARE(settings0.value("key 1", "123").toString(), QLatin1String("123"));
settings0.remove("key 1");
- QCOMPARE(settings0.value("key 1", "456").toString(), QString("456"));
+ QCOMPARE(settings0.value("key 1", "456").toString(), QLatin1String("456"));
settings0.setValue("key 1", "bubloo");
- QCOMPARE(settings0.value("key 1").toString(), QString("bubloo"));
+ QCOMPARE(settings0.value("key 1").toString(), QLatin1String("bubloo"));
settings0.remove("key 2");
- QCOMPARE(settings0.value("key 1").toString(), QString("bubloo"));
+ QCOMPARE(settings0.value("key 1").toString(), QLatin1String("bubloo"));
settings0.remove("key 1");
- QCOMPARE(settings0.value("key 1", "789").toString(), QString("789"));
+ QCOMPARE(settings0.value("key 1", "789").toString(), QLatin1String("789"));
/*
Make sure that removing a key removes all the subkeys.
@@ -1502,7 +1503,7 @@ void tst_QSettings::contains()
}
settings1.endGroup();
- QVERIFY(settings1.group() == "alpha");
+ QCOMPARE(settings1.group(), QLatin1String("alpha"));
keys = settings1.allKeys();
QCOMPARE(keys.size(), expectedResult.size() + 3);
for (i = 0; i < keys.size(); ++i) {
@@ -1794,26 +1795,26 @@ void tst_QSettings::testUpdateRequestEvent()
QSettings settings1("foo", QSettings::IniFormat);
QVERIFY(!QFile::exists("foo"));
- QVERIFY(QFileInfo("foo").size() == 0);
+ QCOMPARE(QFileInfo("foo").size(), qint64(0));
settings1.setValue("key1", 1);
- QVERIFY(QFileInfo("foo").size() == 0);
+ QCOMPARE(QFileInfo("foo").size(), qint64(0));
QTRY_VERIFY(QFileInfo("foo").size() > 0);
settings1.remove("key1");
QVERIFY(QFileInfo("foo").size() > 0);
- QTRY_VERIFY(QFileInfo("foo").size() == 0);
+ QTRY_COMPARE(QFileInfo("foo").size(), qint64(0));
settings1.setValue("key2", 2);
- QVERIFY(QFileInfo("foo").size() == 0);
+ QCOMPARE(QFileInfo("foo").size(), qint64(0));
QTRY_VERIFY(QFileInfo("foo").size() > 0);
settings1.clear();
QVERIFY(QFileInfo("foo").size() > 0);
- QTRY_VERIFY(QFileInfo("foo").size() == 0);
+ QTRY_COMPARE(QFileInfo("foo").size(), qint64(0));
#ifdef Q_OS_WINRT
QDir::setCurrent(oldCur);
@@ -1960,7 +1961,7 @@ void tst_QSettings::testEmptyData()
settings.setValue("vList", vList);
settings.setValue("vList2", vList2);
settings.setValue("vList3", vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
{
QSettings settings(filename, QSettings::IniFormat);
@@ -1973,7 +1974,7 @@ void tst_QSettings::testEmptyData()
QCOMPARE(settings.value("vList").toList(), vList);
QCOMPARE(settings.value("vList2").toList(), vList2);
QCOMPARE(settings.value("vList3").toList(), vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
{
@@ -1987,7 +1988,7 @@ void tst_QSettings::testEmptyData()
settings.setValue("vList", vList);
settings.setValue("vList2", vList2);
settings.setValue("vList3", vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
{
QSettings settings("QtProject", "tst_qsettings");
@@ -2000,7 +2001,7 @@ void tst_QSettings::testEmptyData()
QCOMPARE(settings.value("vList").toList(), vList);
QCOMPARE(settings.value("vList2").toList(), vList2);
QCOMPARE(settings.value("vList3").toList(), vList3);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
}
QFile::remove(filename);
}
@@ -2018,17 +2019,17 @@ void tst_QSettings::testEmptyKey()
void tst_QSettings::testResourceFiles()
{
QSettings settings(":/resourcefile.ini", QSettings::IniFormat);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
QVERIFY(!settings.isWritable());
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 89);
settings.setValue("Field 1/Bottom", 90);
// the next two lines check the statu quo; another behavior would be possible
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 90);
settings.sync();
- QVERIFY(settings.status() == QSettings::AccessError);
+ QCOMPARE(settings.status(), QSettings::AccessError);
QCOMPARE(settings.value("Field 1/Bottom").toInt(), 90);
}
@@ -2044,6 +2045,52 @@ void tst_QSettings::testRegistryShortRootNames()
#endif
}
+void tst_QSettings::testRegistry32And64Bit()
+{
+#if !defined (Q_OS_WIN) || defined(Q_OS_WINRT)
+ QSKIP("This test is specific to the Windows registry.", SkipAll);
+#else
+
+ const QString key("HKEY_LOCAL_MACHINE\\Software");
+ const QString keyWow("HKEY_LOCAL_MACHINE\\Software\\Wow6432Node");
+
+#ifndef Q_OS_WIN64
+ // This branch is taken at compile time if targeting 32-bit; it does not
+ // necessarily mean that the OS running the test is 32-bit (it could be
+ // e.g. 64-bit).
+ QCOMPARE(QSettings(key, QSettings::NativeFormat).childGroups(),
+ QSettings(key, QSettings::Registry32Format).childGroups());
+
+ // Detect whether we are running under 64-bit Windows.
+ typedef BOOL (WINAPI *IsWow64ProcessPtr)(HANDLE hProcess, PBOOL Wow64Process);
+ IsWow64ProcessPtr IsWow64Process = (IsWow64ProcessPtr)QLibrary::resolve(
+ "kernel32.dll", "IsWow64Process");
+
+ if (IsWow64Process) {
+ BOOL IsWow64 = FALSE;
+ if (IsWow64Process(GetCurrentProcess(), &IsWow64) && IsWow64) {
+ // The 64-bit registry's "Wow6432Node" key should match the 32-bit registry.
+ // If we are not on 32-bit Windows, these should never be the same,
+ // because the 64-bit registry has a "Wow6432Node" key.
+ QCOMPARE(QSettings(keyWow, QSettings::Registry64Format).childGroups(),
+ QSettings(key, QSettings::Registry32Format).childGroups());
+ }
+ }
+#else
+ // This branch is taken at compile time if targeting 64-bit; it does not
+ // necessarily mean that the OS running the test is 64-bit (it could be
+ // e.g. 128-bit).
+ QCOMPARE(QSettings(key, QSettings::NativeFormat).childGroups(),
+ QSettings(key, QSettings::Registry64Format).childGroups());
+
+ // The 64-bit registry's "Wow6432Node" key should match the 32-bit registry.
+ QCOMPARE(QSettings(keyWow, QSettings::Registry64Format).childGroups(),
+ QSettings(key, QSettings::Registry32Format).childGroups());
+#endif
+
+#endif
+}
+
void tst_QSettings::trailingWhitespace()
{
{
@@ -2539,7 +2586,7 @@ QString escapeWeirdChars(const QString &s)
QChar c = s.at(i);
if (c.unicode() < ' ' || c.unicode() > '~'
|| (escapeNextDigit && c.unicode() >= '0' && c.unicode() <= 'f')) {
- result += QString("\\x%1").arg(c.unicode(), 0, 16);
+ result += QLatin1String("\\x") + QString::number(c.unicode(), 16);
escapeNextDigit = true;
} else {
result += c;
@@ -3133,7 +3180,7 @@ void tst_QSettings::registerFormat()
// so we can test error handling
QSettings::Format custom3 = QSettings::registerFormat("custom3", readCustom3File, writeCustom3File);
- QVERIFY(custom3 == QSettings::CustomFormat3);
+ QCOMPARE(custom3, QSettings::CustomFormat3);
QDir dir(settingsPath());
QVERIFY(dir.mkpath("someDir"));
@@ -3225,23 +3272,23 @@ void tst_QSettings::setPath()
void tst_QSettings::setDefaultFormat()
{
- QVERIFY(QSettings::defaultFormat() == QSettings::NativeFormat);
+ QCOMPARE(QSettings::defaultFormat(), QSettings::NativeFormat);
QSettings::setDefaultFormat(QSettings::CustomFormat1);
QSettings settings1("org", "app");
QSettings settings2(QSettings::SystemScope, "org", "app");
QSettings settings3;
- QVERIFY(settings1.format() == QSettings::NativeFormat);
- QVERIFY(settings2.format() == QSettings::NativeFormat);
- QVERIFY(settings3.format() == QSettings::CustomFormat1);
+ QCOMPARE(settings1.format(), QSettings::NativeFormat);
+ QCOMPARE(settings2.format(), QSettings::NativeFormat);
+ QCOMPARE(settings3.format(), QSettings::CustomFormat1);
QSettings::setDefaultFormat(QSettings::NativeFormat);
- QVERIFY(QSettings::defaultFormat() == QSettings::NativeFormat);
+ QCOMPARE(QSettings::defaultFormat(), QSettings::NativeFormat);
- QVERIFY(settings1.format() == QSettings::NativeFormat);
- QVERIFY(settings2.format() == QSettings::NativeFormat);
- QVERIFY(settings3.format() == QSettings::CustomFormat1);
+ QCOMPARE(settings1.format(), QSettings::NativeFormat);
+ QCOMPARE(settings2.format(), QSettings::NativeFormat);
+ QCOMPARE(settings3.format(), QSettings::CustomFormat1);
}
void tst_QSettings::dontCreateNeedlessPaths()
@@ -3302,7 +3349,7 @@ void tst_QSettings::dontReorderIniKeysNeedlessly()
outFile.close();
QSettings settings(outFileName, QSettings::IniFormat);
- QVERIFY(settings.status() == QSettings::NoError);
+ QCOMPARE(settings.status(), QSettings::NoError);
QVERIFY(settings.isWritable());
settings.setValue("Field 1/Bottom", 90);
diff --git a/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro b/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
index 9fb6f9b31f..c72d9e4fad 100644
--- a/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
+++ b/tests/auto/corelib/io/qstandardpaths/qstandardpaths.pro
@@ -3,4 +3,3 @@ TARGET = tst_qstandardpaths
QT = core testlib
SOURCES = tst_qstandardpaths.cpp
TESTDATA += tst_qstandardpaths.cpp qstandardpaths.pro
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp b/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp
index efbcdc78e0..aaaa0d4949 100644
--- a/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp
+++ b/tests/auto/corelib/io/qstorageinfo/tst_qstorageinfo.cpp
@@ -61,9 +61,9 @@ void tst_QStorageInfo::defaultValues()
QVERIFY(!storage.isRoot());
QVERIFY(storage.device().isEmpty());
QVERIFY(storage.fileSystemType().isEmpty());
- QVERIFY(storage.bytesTotal() == -1);
- QVERIFY(storage.bytesFree() == -1);
- QVERIFY(storage.bytesAvailable() == -1);
+ QCOMPARE(storage.bytesTotal(), -1);
+ QCOMPARE(storage.bytesFree(), -1);
+ QCOMPARE(storage.bytesAvailable(), -1);
}
void tst_QStorageInfo::operatorEqual()
@@ -71,19 +71,19 @@ void tst_QStorageInfo::operatorEqual()
{
QStorageInfo storage1 = QStorageInfo::root();
QStorageInfo storage2(QDir::rootPath());
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
}
{
QStorageInfo storage1(QCoreApplication::applicationDirPath());
QStorageInfo storage2(QCoreApplication::applicationFilePath());
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
}
{
QStorageInfo storage1;
QStorageInfo storage2;
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
}
}
@@ -184,15 +184,15 @@ void tst_QStorageInfo::caching()
qint64 free = storage1.bytesFree();
QStorageInfo storage2(storage1);
- QVERIFY(free == storage2.bytesFree());
+ QCOMPARE(free, storage2.bytesFree());
file.write(QByteArray(1024*1024, '\0'));
file.flush();
- QVERIFY(free == storage1.bytesFree());
- QVERIFY(free == storage2.bytesFree());
+ QCOMPARE(free, storage1.bytesFree());
+ QCOMPARE(free, storage2.bytesFree());
storage2.refresh();
- QVERIFY(storage1 == storage2);
+ QCOMPARE(storage1, storage2);
QVERIFY(free != storage2.bytesFree());
}
#endif
diff --git a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
index 0908878514..4a69971f78 100644
--- a/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
+++ b/tests/auto/corelib/io/qtemporarydir/qtemporarydir.pro
@@ -3,4 +3,3 @@ TARGET = tst_qtemporarydir
SOURCES += tst_qtemporarydir.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro b/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro
index c16a729ad0..8f250e4568 100644
--- a/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro
+++ b/tests/auto/corelib/io/qtemporaryfile/qtemporaryfile.pro
@@ -1,10 +1,8 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtemporaryfile
QT = core testlib
SOURCES = tst_qtemporaryfile.cpp
TESTDATA += tst_qtemporaryfile.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
RESOURCES += qtemporaryfile.qrc
android:!android-no-sdk {
diff --git a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp
index 94e6bbaade..1a586af569 100644
--- a/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp
+++ b/tests/auto/corelib/io/qtemporaryfile/tst_qtemporaryfile.cpp
@@ -697,7 +697,7 @@ void tst_QTemporaryFile::createNativeFile()
f.seek(currentPos);
}
QTemporaryFile *tempFile = QTemporaryFile::createNativeFile(f);
- QVERIFY(valid == (bool)tempFile);
+ QCOMPARE(valid, (bool)tempFile);
if (currentPos != -1)
QCOMPARE(currentPos, f.pos());
if (valid) {
diff --git a/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro b/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro
index 578fa86f5c..4a4c091dcb 100644
--- a/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro
+++ b/tests/auto/corelib/io/qtextstream/readAllStdinProcess/readAllStdinProcess.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_qtextstream
target.path = $$[QT_INSTALL_TESTS]/tst_qtextstream/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro b/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro
index 578fa86f5c..4a4c091dcb 100644
--- a/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro
+++ b/tests/auto/corelib/io/qtextstream/readLineStdinProcess/readLineStdinProcess.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_qtextstream
target.path = $$[QT_INSTALL_TESTS]/tst_qtextstream/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro b/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro
index 578fa86f5c..4a4c091dcb 100644
--- a/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro
+++ b/tests/auto/corelib/io/qtextstream/stdinProcess/stdinProcess.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_qtextstream
target.path = $$[QT_INSTALL_TESTS]/tst_qtextstream/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/test/test.pro b/tests/auto/corelib/io/qtextstream/test/test.pro
index 39d181344f..93fb6d232f 100644
--- a/tests/auto/corelib/io/qtextstream/test/test.pro
+++ b/tests/auto/corelib/io/qtextstream/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = ../tst_qtextstream
QT = core network testlib
SOURCES = ../tst_qtextstream.cpp
@@ -20,4 +19,3 @@ TESTDATA += \
../qtextstream.qrc \
../tst_qtextstream.cpp \
../resources
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
index 6e58642eb6..24cde14459 100644
--- a/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
+++ b/tests/auto/corelib/io/qtextstream/tst_qtextstream.cpp
@@ -1617,18 +1617,18 @@ void tst_QTextStream::forcePoint()
{
QString str;
QTextStream stream(&str);
- stream << fixed << forcepoint << 1.0 << " " << 1 << " " << 0 << " " << -1.0 << " " << -1;
+ stream << fixed << forcepoint << 1.0 << ' ' << 1 << ' ' << 0 << ' ' << -1.0 << ' ' << -1;
QCOMPARE(str, QString("1.000000 1 0 -1.000000 -1"));
str.clear();
stream.seek(0);
- stream << scientific << forcepoint << 1.0 << " " << 1 << " " << 0 << " " << -1.0 << " " << -1;
+ stream << scientific << forcepoint << 1.0 << ' ' << 1 << ' ' << 0 << ' ' << -1.0 << ' ' << -1;
QCOMPARE(str, QString("1.000000e+00 1 0 -1.000000e+00 -1"));
str.clear();
stream.seek(0);
stream.setRealNumberNotation(QTextStream::SmartNotation);
- stream << forcepoint << 1.0 << " " << 1 << " " << 0 << " " << -1.0 << " " << -1;
+ stream << forcepoint << 1.0 << ' ' << 1 << ' ' << 0 << ' ' << -1.0 << ' ' << -1;
QCOMPARE(str, QString("1.00000 1 0 -1.00000 -1"));
}
@@ -1638,7 +1638,7 @@ void tst_QTextStream::forceSign()
{
QString str;
QTextStream stream(&str);
- stream << forcesign << 1.2 << " " << -1.2 << " " << 0;
+ stream << forcesign << 1.2 << ' ' << -1.2 << ' ' << 0;
QCOMPARE(str, QString("+1.2 -1.2 +0"));
}
@@ -1775,9 +1775,9 @@ void tst_QTextStream::nanInf()
QString s;
QTextStream out(&s);
- out << qInf() << " " << -qInf() << " " << qQNaN()
- << uppercasedigits << " "
- << qInf() << " " << -qInf() << " " << qQNaN()
+ out << qInf() << ' ' << -qInf() << ' ' << qQNaN()
+ << uppercasedigits << ' '
+ << qInf() << ' ' << -qInf() << ' ' << qQNaN()
<< flush;
QCOMPARE(s, QString("inf -inf nan INF -INF NAN"));
@@ -2583,7 +2583,7 @@ void tst_QTextStream::useCase1()
stream.setCodec(QTextCodec::codecForName("ISO-8859-1"));
stream.setAutoDetectUnicode(true);
- stream << 4.15 << " " << QByteArray("abc") << " " << QString("ole");
+ stream << 4.15 << ' ' << QByteArray("abc") << ' ' << QString("ole");
}
file.seek(0);
@@ -2619,7 +2619,7 @@ void tst_QTextStream::useCase2()
stream.setCodec(QTextCodec::codecForName("ISO-8859-1"));
stream.setAutoDetectUnicode(true);
- stream << 4.15 << " " << QByteArray("abc") << " " << QString("ole");
+ stream << 4.15 << ' ' << QByteArray("abc") << ' ' << QString("ole");
file.close();
QVERIFY(file.open(QFile::ReadWrite));
diff --git a/tests/auto/corelib/io/qurl/qurl.pro b/tests/auto/corelib/io/qurl/qurl.pro
index f65a9c688c..c046c75522 100644
--- a/tests/auto/corelib/io/qurl/qurl.pro
+++ b/tests/auto/corelib/io/qurl/qurl.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qurl
QT = core testlib concurrent
SOURCES = tst_qurl.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
mac: OBJECTIVE_SOURCES += tst_qurl_mac.mm
diff --git a/tests/auto/corelib/io/qurl/tst_qurl.cpp b/tests/auto/corelib/io/qurl/tst_qurl.cpp
index 7579c6713d..97dfac3062 100644
--- a/tests/auto/corelib/io/qurl/tst_qurl.cpp
+++ b/tests/auto/corelib/io/qurl/tst_qurl.cpp
@@ -226,7 +226,7 @@ void tst_QUrl::constructing()
QVERIFY(url.isEmpty());
QCOMPARE(url.port(), -1);
QCOMPARE(url.toString(), QString());
- QVERIFY(url == url);
+ QCOMPARE(url, url);
QVERIFY(!(url < url));
QUrl fromLocal = QUrl::fromLocalFile(QString());
@@ -254,7 +254,7 @@ void tst_QUrl::hashInPath()
QCOMPARE(withHashInPath.toDisplayString(QUrl::PreferLocalFile), QString("hi%23mum.txt"));
QUrl fromHashInPath = QUrl::fromEncoded(withHashInPath.toEncoded());
- QVERIFY(withHashInPath == fromHashInPath);
+ QCOMPARE(withHashInPath, fromHashInPath);
const QUrl localWithHash = QUrl::fromLocalFile("/hi#mum.txt");
QCOMPARE(localWithHash.path(), QString::fromLatin1("/hi#mum.txt"));
@@ -284,7 +284,7 @@ void tst_QUrl::assignment()
QUrl copy;
copy = url;
- QVERIFY(url == copy);
+ QCOMPARE(url, copy);
}
void tst_QUrl::comparison()
@@ -295,7 +295,7 @@ void tst_QUrl::comparison()
QUrl url2("http://qt-project.org/");
QVERIFY(url2.isValid());
- QVERIFY(url1 == url2);
+ QCOMPARE(url1, url2);
QVERIFY(!(url1 < url2));
QVERIFY(!(url2 < url1));
QVERIFY(url1.matches(url2, QUrl::None));
@@ -329,7 +329,7 @@ void tst_QUrl::comparison()
url5.setEncodedQuery("a=%2a");
QUrl url6;
url6.setEncodedQuery("a=%2A");
- QVERIFY(url5 == url6);
+ QCOMPARE(url5, url6);
QUrl url7;
url7.setEncodedQuery("a=C");
@@ -366,7 +366,7 @@ void tst_QUrl::comparison()
QUrl hostUrl1("file:/foo");
QUrl hostUrl2("file:///foo");
- QVERIFY(hostUrl1 == hostUrl2);
+ QCOMPARE(hostUrl1, hostUrl2);
QVERIFY(hostUrl1.matches(hostUrl2, QUrl::None));
QVERIFY(hostUrl1.matches(hostUrl2, QUrl::RemoveAuthority));
@@ -460,7 +460,7 @@ void tst_QUrl::copying()
QUrl copy(url);
- QVERIFY(url == copy);
+ QCOMPARE(url, copy);
}
void tst_QUrl::setUrl()
@@ -1635,9 +1635,9 @@ void tst_QUrl::percentEncoding()
QFETCH(QByteArray, encoded);
QCOMPARE(QUrl(original).toEncoded().constData(), encoded.constData());
- QVERIFY(QUrl::fromEncoded(QUrl(original).toEncoded()) == QUrl(original));
+ QCOMPARE(QUrl::fromEncoded(QUrl(original).toEncoded()), QUrl(original));
QCOMPARE(QUrl::fromEncoded(QUrl(original).toEncoded()).toString(), original);
- QVERIFY(QUrl::fromEncoded(encoded) == QUrl(original));
+ QCOMPARE(QUrl::fromEncoded(encoded), QUrl(original));
QCOMPARE(QUrl(QUrl(original).toString()).toString(), original);
}
@@ -2872,7 +2872,8 @@ void tst_QUrl::fromUserInput_data()
int c = 0;
while (it.hasNext()) {
it.next();
- QTest::newRow(QString("file-%1").arg(c++).toLatin1()) << it.filePath() << QUrl::fromLocalFile(it.filePath());
+ QTest::newRow(("file-" + QByteArray::number(c++)).constData())
+ << it.filePath() << QUrl::fromLocalFile(it.filePath());
}
// basic latin1
@@ -2960,7 +2961,8 @@ void tst_QUrl::fromUserInputWithCwd_data()
while (it.hasNext()) {
it.next();
QUrl url = QUrl::fromLocalFile(it.filePath());
- QTest::newRow(QString("file-%1").arg(c++).toLatin1()) << it.fileName() << QDir::currentPath() << url << url;
+ QTest::newRow(("file-" + QByteArray::number(c++)).constData())
+ << it.fileName() << QDir::currentPath() << url << url;
}
QDir parent = QDir::current();
QVERIFY(parent.cdUp());
@@ -3167,7 +3169,7 @@ void tst_QUrl::acceptEmptyAuthoritySegments()
// However, file:/bar is the same as file:///bar
QString file_triple_bar("file:///bar"), file_uni_bar("file:/bar");
- QVERIFY(QUrl(file_triple_bar) == QUrl(file_uni_bar));
+ QCOMPARE(QUrl(file_triple_bar), QUrl(file_uni_bar));
QCOMPARE(QUrl(file_uni_bar).toString(), file_triple_bar);
QCOMPARE(QUrl(file_uni_bar, QUrl::StrictMode).toString(), file_triple_bar);
diff --git a/tests/auto/corelib/io/qurlinternal/qurlinternal.pro b/tests/auto/corelib/io/qurlinternal/qurlinternal.pro
index c62cd045f3..ae5e023446 100644
--- a/tests/auto/corelib/io/qurlinternal/qurlinternal.pro
+++ b/tests/auto/corelib/io/qurlinternal/qurlinternal.pro
@@ -3,5 +3,3 @@ requires(contains(QT_CONFIG,private_tests))
TARGET = tst_qurlinternal
SOURCES += tst_qurlinternal.cpp ../../codecs/utf8/utf8data.cpp
QT = core core-private testlib
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qurlquery/qurlquery.pro b/tests/auto/corelib/io/qurlquery/qurlquery.pro
index 3284903d5b..68129f356f 100644
--- a/tests/auto/corelib/io/qurlquery/qurlquery.pro
+++ b/tests/auto/corelib/io/qurlquery/qurlquery.pro
@@ -1,6 +1,5 @@
QT = core core-private testlib
TARGET = tst_qurlquery
-CONFIG += parallel_test testcase
+CONFIG += testcase
SOURCES += tst_qurlquery.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp b/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp
index 769a96ac64..7df085df7c 100644
--- a/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp
+++ b/tests/auto/corelib/io/qurlquery/tst_qurlquery.cpp
@@ -103,7 +103,7 @@ static QByteArray prettyList(const T &items)
first = false;
result += prettyPair(it);
}
- result += ")";
+ result += QLatin1Char(')');
return result.toLocal8Bit();
}
@@ -176,20 +176,20 @@ void tst_QUrlQuery::constructing()
QUrlQuery copy(empty);
QVERIFY(copy.isEmpty());
QVERIFY(!copy.isDetached());
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
QCOMPARE(qHash(copy), qHash(empty));
QVERIFY(!(copy != empty));
copy = empty;
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
copy = QUrlQuery();
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
QCOMPARE(qHash(copy), qHash(empty));
}
{
QUrlQuery copy(emptyQuery());
- QVERIFY(copy == empty);
+ QCOMPARE(copy, empty);
}
QVERIFY(!empty.hasQueryItem("a"));
@@ -214,7 +214,7 @@ void tst_QUrlQuery::constructing()
QVERIFY(!(other == empty));
QUrlQuery copy(other);
- QVERIFY(copy == other);
+ QCOMPARE(copy, other);
copy.clear();
QVERIFY(copy.isEmpty());
@@ -222,7 +222,7 @@ void tst_QUrlQuery::constructing()
copy = other;
QVERIFY(!copy.isEmpty());
- QVERIFY(copy == other);
+ QCOMPARE(copy, other);
copy = QUrlQuery();
QVERIFY(copy.isEmpty());
@@ -298,7 +298,7 @@ void tst_QUrlQuery::addRemove()
QCOMPARE(allItems.at(0).first, QString("a"));
QCOMPARE(allItems.at(0).second, QString("b"));
- QVERIFY(query == original);
+ QCOMPARE(query, original);
QVERIFY(!(query != original));
QCOMPARE(qHash(query), qHash(original));
}
@@ -346,7 +346,7 @@ void tst_QUrlQuery::multiAddRemove()
QVERIFY(query.hasQueryItem("a"));
// returns the first one
- QVERIFY(query.queryItemValue("a") == "b");
+ QCOMPARE(query.queryItemValue("a"), QLatin1String("b"));
// order is the order we set them in
QVERIFY(query.allQueryItemValues("a") == QStringList() << "b" << "c");
@@ -359,9 +359,9 @@ void tst_QUrlQuery::multiAddRemove()
QVERIFY(query.hasQueryItem("A"));
QVERIFY(query.hasQueryItem("a"));
- QVERIFY(query.queryItemValue("a") == "b");
+ QCOMPARE(query.queryItemValue("a"), QLatin1String("b"));
QVERIFY(query.allQueryItemValues("a") == QStringList() << "b" << "c");
- QVERIFY(query.queryItemValue("A") == "B");
+ QCOMPARE(query.queryItemValue("A"), QLatin1String("B"));
QVERIFY(query.allQueryItemValues("A") == QStringList() << "B" << "C");
}
@@ -371,7 +371,7 @@ void tst_QUrlQuery::multiAddRemove()
QVERIFY(query.hasQueryItem("a"));
// it must have removed the first one
- QVERIFY(query.queryItemValue("a") == "c");
+ QCOMPARE(query.queryItemValue("a"), QLatin1String("c"));
}
{
@@ -720,7 +720,7 @@ void tst_QUrlQuery::old_queryItems()
QVERIFY(!url.isEmpty());
QList<QPair<QString, QString> > setItems = url.queryItems();
- QVERIFY(newItems == setItems);
+ QCOMPARE(newItems, setItems);
url.addQueryItem("1", "z");
@@ -746,18 +746,18 @@ void tst_QUrlQuery::old_queryItems()
url.removeAllQueryItems("1");
QVERIFY(!url.hasQueryItem("1"));
- QCOMPARE(url.queryItemValue("4").toLatin1().constData(), "a b");
- QCOMPARE(url.queryItemValue("5").toLatin1().constData(), "&");
- QCOMPARE(url.queryItemValue("tex").toLatin1().constData(), "a + b = c");
- QCOMPARE(url.queryItemValue("foo bar").toLatin1().constData(), "hello world");
+ QCOMPARE(url.queryItemValue("4"), QLatin1String("a b"));
+ QCOMPARE(url.queryItemValue("5"), QLatin1String("&"));
+ QCOMPARE(url.queryItemValue("tex"), QLatin1String("a + b = c"));
+ QCOMPARE(url.queryItemValue("foo bar"), QLatin1String("hello world"));
//url.setUrl("http://www.google.com/search?q=a+b");
url.setQuery("q=a+b");
- QCOMPARE(url.queryItemValue("q"), QString("a+b"));
+ QCOMPARE(url.queryItemValue("q"), QLatin1String("a+b"));
//url.setUrl("http://www.google.com/search?q=a=b"); // invalid, but should be tolerated
url.setQuery("q=a=b");
- QCOMPARE(url.queryItemValue("q"), QString("a=b"));
+ QCOMPARE(url.queryItemValue("q"), QLatin1String("a=b"));
}
void tst_QUrlQuery::old_hasQueryItem_data()
diff --git a/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro b/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro
index b7a36459f8..4f0e9da3c2 100644
--- a/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro
+++ b/tests/auto/corelib/io/qwinoverlappedionotifier/qwinoverlappedionotifier.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qwinoverlappedionotifier
QT = core-private testlib
SOURCES = tst_qwinoverlappedionotifier.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp b/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp
index 57a01e0a79..ad2aa0dfd3 100644
--- a/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp
+++ b/tests/auto/corelib/io/qwinoverlappedionotifier/tst_qwinoverlappedionotifier.cpp
@@ -199,7 +199,7 @@ void tst_QWinOverlappedIoNotifier::waitForAnyNotified()
NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
notifier.setHandle(hFile);
notifier.setEnabled(true);
- QVERIFY(notifier.waitForAnyNotified(100) == 0);
+ QVERIFY(!notifier.waitForAnyNotified(100));
OVERLAPPED overlapped1;
ZeroMemory(&overlapped1, sizeof(OVERLAPPED));
@@ -224,7 +224,7 @@ void tst_QWinOverlappedIoNotifier::waitForAnyNotified()
CloseHandle(hFile);
QVERIFY(overlappedObjects.isEmpty());
- QVERIFY(notifier.waitForAnyNotified(100) == 0);
+ QVERIFY(!notifier.waitForAnyNotified(100));
}
void tst_QWinOverlappedIoNotifier::brokenPipe()
diff --git a/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro b/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro
index ef571de192..7480bd45f6 100644
--- a/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro
+++ b/tests/auto/corelib/itemmodels/qabstractitemmodel/qabstractitemmodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractitemmodel
QT = core testlib
diff --git a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
index c4d2df7c3e..2570beb6c2 100644
--- a/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qabstractitemmodel/tst_qabstractitemmodel.cpp
@@ -157,9 +157,10 @@ QtTestModel::QtTestModel(int rows, int columns, QObject *parent)
{
table.resize(rows);
for (int r = 0; r < rows; ++r) {
+ const QString prefix = QString::number(r) + QLatin1Char('/');
table[r].resize(columns);
for (int c = 0; c < columns; ++c)
- table[r][c] = QString("%1/%2").arg(r).arg(c);
+ table[r][c] = prefix + QString::number(c);
}
}
@@ -1699,8 +1700,8 @@ void tst_QAbstractItemModel::testMoveToDescendants()
moveCommand->setDestRow(row);
moveCommand->doCommand();
- QVERIFY(beforeSpy.size() == 0);
- QVERIFY(afterSpy.size() == 0);
+ QCOMPARE(beforeSpy.size(), 0);
+ QCOMPARE(afterSpy.size(), 0);
}
}
}
@@ -1757,8 +1758,8 @@ void tst_QAbstractItemModel::testMoveWithinOwnRange()
moveCommand->setDestRow(destRow);
moveCommand->doCommand();
- QVERIFY(beforeSpy.size() == 0);
- QVERIFY(afterSpy.size() == 0);
+ QCOMPARE(beforeSpy.size(), 0);
+ QCOMPARE(afterSpy.size(), 0);
}
class ListenerObject : public QObject
@@ -1823,7 +1824,7 @@ void ListenerObject::slotAboutToBeReset()
// Nothing has been changed yet. All indexes should be the same.
for (int i = 0; i < m_persistentIndexes.size(); ++i) {
QModelIndex idx = m_persistentIndexes.at(i);
- QVERIFY(idx == m_nonPersistentIndexes.at(i));
+ QCOMPARE(idx, m_nonPersistentIndexes.at(i));
QVERIFY(m_model->mapToSource(idx).isValid());
}
}
@@ -1859,13 +1860,13 @@ void tst_QAbstractItemModel::testReset()
resetCommand->doCommand();
// Verify that the correct signals were emitted
- QVERIFY(beforeResetSpy.size() == 1);
- QVERIFY(afterResetSpy.size() == 1);
+ QCOMPARE(beforeResetSpy.size(), 1);
+ QCOMPARE(afterResetSpy.size(), 1);
// Verify that the move actually happened.
- QVERIFY(m_model->rowCount() == 9);
+ QCOMPARE(m_model->rowCount(), 9);
QModelIndex destIndex = m_model->index(4, 0);
- QVERIFY(m_model->rowCount(destIndex) == 11);
+ QCOMPARE(m_model->rowCount(destIndex), 11);
// Delete it because its slots test things which are not true after this point.
delete listener;
@@ -1877,14 +1878,14 @@ void tst_QAbstractItemModel::testReset()
QCOMPARE(nullProxy->roleNames().value(Qt::UserRole + 1), QByteArray());
nullProxy->setSourceModel(new ModelWithCustomRole(this));
- QVERIFY(proxyBeforeResetSpy.size() == 1);
- QVERIFY(proxyAfterResetSpy.size() == 1);
+ QCOMPARE(proxyBeforeResetSpy.size(), 1);
+ QCOMPARE(proxyAfterResetSpy.size(), 1);
QCOMPARE(nullProxy->roleNames().value(Qt::UserRole + 1), QByteArray("custom"));
nullProxy->setSourceModel(m_model);
- QVERIFY(proxyBeforeResetSpy.size() == 2);
- QVERIFY(proxyAfterResetSpy.size() == 2);
+ QCOMPARE(proxyBeforeResetSpy.size(), 2);
+ QCOMPARE(proxyAfterResetSpy.size(), 2);
// After being reset the proxy must be queried again.
QCOMPARE(nullProxy->roleNames().value(Qt::UserRole + 1), QByteArray());
@@ -2055,10 +2056,10 @@ void tst_QAbstractItemModel::testChildrenLayoutsChanged()
QVERIFY(afterParents.contains(p2));
// The first will be the last, and the lest will be the first.
- QVERIFY(p1FirstPersistent.row() == 1);
- QVERIFY(p1LastPersistent.row() == 0);
- QVERIFY(p2FirstPersistent.row() == 9);
- QVERIFY(p2LastPersistent.row() == 8);
+ QCOMPARE(p1FirstPersistent.row(), 1);
+ QCOMPARE(p1LastPersistent.row(), 0);
+ QCOMPARE(p2FirstPersistent.row(), 9);
+ QCOMPARE(p2LastPersistent.row(), 8);
}
insertCommand = new ModelInsertCommand(&model, this);
@@ -2115,8 +2116,8 @@ void tst_QAbstractItemModel::testChildrenLayoutsChanged()
QCOMPARE(beforeSignal.size(), 2);
QCOMPARE(afterSignal.size(), 2);
- QVERIFY(p1FirstPersistent.row() == 1);
- QVERIFY(p1LastPersistent.row() == 0);
+ QCOMPARE(p1FirstPersistent.row(), 1);
+ QCOMPARE(p1LastPersistent.row(), 0);
QCOMPARE(p2FirstPersistent.row(), 9);
QCOMPARE(p2LastPersistent.row(), 8);
}
diff --git a/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro b/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro
index 7209620b91..19aec43072 100644
--- a/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro
+++ b/tests/auto/corelib/itemmodels/qabstractproxymodel/qabstractproxymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractproxymodel
QT += testlib
SOURCES += tst_qabstractproxymodel.cpp
diff --git a/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp b/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp
index fb9d118d60..fbe123bca0 100644
--- a/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp
+++ b/tests/auto/corelib/itemmodels/qabstractproxymodel/tst_qabstractproxymodel.cpp
@@ -351,7 +351,7 @@ static void verifySubSetOf(const QHash<int, QByteArray> &superSet, const QHash<i
const QHash<int, QByteArray>::const_iterator end = subSet.constEnd();
for ( ; it != end; ++it ) {
QVERIFY(superSet.contains(it.key()));
- QVERIFY(it.value() == superSet.value(it.key()));
+ QCOMPARE(it.value(), superSet.value(it.key()));
}
}
diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro b/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro
index f57b419ae5..ba32f02962 100644
--- a/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro
+++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/qidentityproxymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qidentityproxymodel
mtdir = ../../../other/modeltest
@@ -7,4 +6,3 @@ INCLUDEPATH += $$PWD/$${mtdir}
QT += testlib
SOURCES += tst_qidentityproxymodel.cpp $${mtdir}/dynamictreemodel.cpp $${mtdir}/modeltest.cpp
HEADERS += $${mtdir}/dynamictreemodel.h $${mtdir}/modeltest.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
index 9eb3bc5113..fbab95c975 100644
--- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
+++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp
@@ -111,25 +111,25 @@ void tst_QIdentityProxyModel::verifyIdentity(QAbstractItemModel *model, const QM
const int columns = model->columnCount(parent);
const QModelIndex proxyParent = m_proxy->mapFromSource(parent);
- QVERIFY(m_proxy->mapToSource(proxyParent) == parent);
- QVERIFY(rows == m_proxy->rowCount(proxyParent));
- QVERIFY(columns == m_proxy->columnCount(proxyParent));
+ QCOMPARE(m_proxy->mapToSource(proxyParent), parent);
+ QCOMPARE(rows, m_proxy->rowCount(proxyParent));
+ QCOMPARE(columns, m_proxy->columnCount(proxyParent));
for (int row = 0; row < rows; ++row) {
for (int column = 0; column < columns; ++column) {
const QModelIndex idx = model->index(row, column, parent);
const QModelIndex proxyIdx = m_proxy->mapFromSource(idx);
- QVERIFY(proxyIdx.model() == m_proxy);
- QVERIFY(m_proxy->mapToSource(proxyIdx) == idx);
+ QCOMPARE(proxyIdx.model(), m_proxy);
+ QCOMPARE(m_proxy->mapToSource(proxyIdx), idx);
QVERIFY(proxyIdx.isValid());
- QVERIFY(proxyIdx.row() == row);
- QVERIFY(proxyIdx.column() == column);
- QVERIFY(proxyIdx.parent() == proxyParent);
- QVERIFY(proxyIdx.data() == idx.data());
- QVERIFY(proxyIdx.flags() == idx.flags());
+ QCOMPARE(proxyIdx.row(), row);
+ QCOMPARE(proxyIdx.column(), column);
+ QCOMPARE(proxyIdx.parent(), proxyParent);
+ QCOMPARE(proxyIdx.data(), idx.data());
+ QCOMPARE(proxyIdx.flags(), idx.flags());
const int childCount = m_proxy->rowCount(proxyIdx);
const bool hasChildren = m_proxy->hasChildren(proxyIdx);
- QVERIFY(model->hasChildren(idx) == hasChildren);
+ QCOMPARE(model->hasChildren(idx), hasChildren);
QVERIFY((childCount > 0) == hasChildren);
if (hasChildren)
@@ -146,7 +146,7 @@ void tst_QIdentityProxyModel::insertRows()
{
QStandardItem *parentItem = m_model->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -171,13 +171,13 @@ void tst_QIdentityProxyModel::insertRows()
QVERIFY(modelBeforeSpy.size() == 1 && 1 == proxyBeforeSpy.size());
QVERIFY(modelAfterSpy.size() == 1 && 1 == proxyAfterSpy.size());
- QVERIFY(modelBeforeSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(1) == proxyBeforeSpy.first().at(1));
- QVERIFY(modelBeforeSpy.first().at(2) == proxyBeforeSpy.first().at(2));
+ QCOMPARE(modelBeforeSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(1), proxyBeforeSpy.first().at(1));
+ QCOMPARE(modelBeforeSpy.first().at(2), proxyBeforeSpy.first().at(2));
- QVERIFY(modelAfterSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(1) == proxyAfterSpy.first().at(1));
- QVERIFY(modelAfterSpy.first().at(2) == proxyAfterSpy.first().at(2));
+ QCOMPARE(modelAfterSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(1), proxyAfterSpy.first().at(1));
+ QCOMPARE(modelAfterSpy.first().at(2), proxyAfterSpy.first().at(2));
verifyIdentity(m_model);
}
@@ -186,7 +186,7 @@ void tst_QIdentityProxyModel::removeRows()
{
QStandardItem *parentItem = m_model->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -216,13 +216,13 @@ void tst_QIdentityProxyModel::removeRows()
QVERIFY(modelBeforeSpy.size() == 1 && 1 == proxyBeforeSpy.size());
QVERIFY(modelAfterSpy.size() == 1 && 1 == proxyAfterSpy.size());
- QVERIFY(modelBeforeSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(1) == proxyBeforeSpy.first().at(1));
- QVERIFY(modelBeforeSpy.first().at(2) == proxyBeforeSpy.first().at(2));
+ QCOMPARE(modelBeforeSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(1), proxyBeforeSpy.first().at(1));
+ QCOMPARE(modelBeforeSpy.first().at(2), proxyBeforeSpy.first().at(2));
- QVERIFY(modelAfterSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(1) == proxyAfterSpy.first().at(1));
- QVERIFY(modelAfterSpy.first().at(2) == proxyAfterSpy.first().at(2));
+ QCOMPARE(modelAfterSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(1), proxyAfterSpy.first().at(1));
+ QCOMPARE(modelAfterSpy.first().at(2), proxyAfterSpy.first().at(2));
verifyIdentity(m_model);
}
@@ -271,17 +271,17 @@ void tst_QIdentityProxyModel::moveRows()
QVERIFY(modelBeforeSpy.size() == 1 && 1 == proxyBeforeSpy.size());
QVERIFY(modelAfterSpy.size() == 1 && 1 == proxyAfterSpy.size());
- QVERIFY(modelBeforeSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(1) == proxyBeforeSpy.first().at(1));
- QVERIFY(modelBeforeSpy.first().at(2) == proxyBeforeSpy.first().at(2));
- QVERIFY(modelBeforeSpy.first().at(3).value<QModelIndex>() == m_proxy->mapToSource(proxyBeforeSpy.first().at(3).value<QModelIndex>()));
- QVERIFY(modelBeforeSpy.first().at(4) == proxyBeforeSpy.first().at(4));
+ QCOMPARE(modelBeforeSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(1), proxyBeforeSpy.first().at(1));
+ QCOMPARE(modelBeforeSpy.first().at(2), proxyBeforeSpy.first().at(2));
+ QCOMPARE(modelBeforeSpy.first().at(3).value<QModelIndex>(), m_proxy->mapToSource(proxyBeforeSpy.first().at(3).value<QModelIndex>()));
+ QCOMPARE(modelBeforeSpy.first().at(4), proxyBeforeSpy.first().at(4));
- QVERIFY(modelAfterSpy.first().first().value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(1) == proxyAfterSpy.first().at(1));
- QVERIFY(modelAfterSpy.first().at(2) == proxyAfterSpy.first().at(2));
- QVERIFY(modelAfterSpy.first().at(3).value<QModelIndex>() == m_proxy->mapToSource(proxyAfterSpy.first().at(3).value<QModelIndex>()));
- QVERIFY(modelAfterSpy.first().at(4) == proxyAfterSpy.first().at(4));
+ QCOMPARE(modelAfterSpy.first().first().value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().first().value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(1), proxyAfterSpy.first().at(1));
+ QCOMPARE(modelAfterSpy.first().at(2), proxyAfterSpy.first().at(2));
+ QCOMPARE(modelAfterSpy.first().at(3).value<QModelIndex>(), m_proxy->mapToSource(proxyAfterSpy.first().at(3).value<QModelIndex>()));
+ QCOMPARE(modelAfterSpy.first().at(4), proxyAfterSpy.first().at(4));
verifyIdentity(&model);
@@ -352,7 +352,7 @@ void tst_QIdentityProxyModel::dataChanged()
model.changeData();
QCOMPARE(modelSpy.first().at(2).value<QVector<int> >(), QVector<int>() << 1);
- QVERIFY(modelSpy.first().at(2) == proxySpy.first().at(2));
+ QCOMPARE(modelSpy.first().at(2), proxySpy.first().at(2));
verifyIdentity(&model);
m_proxy->setSourceModel(0);
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp b/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp
index ba143a31f8..e47b2e2e69 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp
+++ b/tests/auto/corelib/itemmodels/qitemmodel/modelstotest.cpp
@@ -233,7 +233,7 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
{
if (QStringListModel *stringListModel = qobject_cast<QStringListModel *>(model)) {
QString alphabet = "a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z";
- stringListModel->setStringList( alphabet.split(",") );
+ stringListModel->setStringList( alphabet.split(QLatin1Char(',')) );
return QModelIndex();
}
@@ -311,7 +311,7 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
Q_FUNC_INFO,
qPrintable(QDir::toNativeSeparators(QDir::currentPath()+"/test")));
for (int i = 0; i < 26; ++i) {
- QString subdir = QString("test/foo_%1").arg(i);
+ QString subdir = QLatin1String("test/foo_") + QString::number(i);
if (!QDir::current().mkdir(subdir))
qFatal("%s: cannot create directory %s",
Q_FUNC_INFO,
@@ -350,7 +350,7 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
int items = 50;
#endif
while (items--)
- listWidget->addItem(QString("item %1").arg(items));
+ listWidget->addItem(QLatin1String("item ") + QString::number(items));
return QModelIndex();
}
@@ -365,9 +365,10 @@ QModelIndex ModelsToTest::populateTestArea(QAbstractItemModel *model)
treeWidget->setColumnCount(1);
QTreeWidgetItem *parent;
while (topItems--){
- parent = new QTreeWidgetItem(treeWidget, QStringList(QString("top %1").arg(topItems)));
+ const QString tS = QString::number(topItems);
+ parent = new QTreeWidgetItem(treeWidget, QStringList(QLatin1String("top ") + tS));
for (int i = 0; i < 20; ++i)
- new QTreeWidgetItem(parent, QStringList(QString("child %1").arg(topItems)));
+ new QTreeWidgetItem(parent, QStringList(QLatin1String("child ") + tS));
}
return QModelIndex();
}
@@ -387,7 +388,7 @@ void ModelsToTest::cleanupTestArea(QAbstractItemModel *model)
if (QDir(QDir::currentPath()+"/test").exists())
{
for (int i = 0; i < 26; ++i) {
- QString subdir(QString("test/foo_%1").arg(i));
+ QString subdir(QLatin1String("test/foo_") + QString::number(i));
if (!QDir::current().rmdir(subdir))
qFatal("%s: cannot remove directory %s",
Q_FUNC_INFO,
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro b/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro
index 42c9c8f9fb..ff21d6afa5 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro
+++ b/tests/auto/corelib/itemmodels/qitemmodel/qitemmodel.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qitemmodel
QT += widgets sql testlib
SOURCES = tst_qitemmodel.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
index 709b35b6e0..1531e0ac40 100644
--- a/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qitemmodel/tst_qitemmodel.cpp
@@ -351,7 +351,7 @@ void tst_QItemModel::index()
// Make sure that the same index is always returned
QModelIndex a = currentModel->index(0,0);
QModelIndex b = currentModel->index(0,0);
- QVERIFY(a == b);
+ QCOMPARE(a, b);
// index is tested more extensivly more later in checkChildren(),
// but this catches the big mistakes
@@ -415,7 +415,7 @@ void checkChildren(QAbstractItemModel *currentModel, const QModelIndex &parent,
// Make sure we get the same index if we request it twice in a row
QModelIndex a = currentModel->index(r, c, parent);
QModelIndex b = currentModel->index(r, c, parent);
- QVERIFY(a == b);
+ QCOMPARE(a, b);
{
const QModelIndex sibling = currentModel->sibling( r, c, topLeftChild );
@@ -427,7 +427,7 @@ void checkChildren(QAbstractItemModel *currentModel, const QModelIndex &parent,
}
// Some basic checking on the index that is returned
- QVERIFY(index.model() == currentModel);
+ QCOMPARE(index.model(), currentModel);
QCOMPARE(index.row(), r);
QCOMPARE(index.column(), c);
QCOMPARE(currentModel->data(index, Qt::DisplayRole).isValid(), true);
diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro b/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro
index 1b6279ba1b..4dcddc8feb 100644
--- a/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro
+++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/qitemselectionmodel.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qitemselectionmodel
QT += testlib
SOURCES += tst_qitemselectionmodel.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp
index 38e2900c25..7d5c30dfb5 100644
--- a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp
+++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp
@@ -1515,7 +1515,7 @@ class MyStandardItemModel: public QStandardItemModel
Q_OBJECT
public:
inline MyStandardItemModel(int i1, int i2): QStandardItemModel(i1, i2) {}
- inline void reset() { QStandardItemModel::reset(); }
+ inline void reset() { beginResetModel(); endResetModel(); }
};
void tst_QItemSelectionModel::resetModel()
@@ -1760,7 +1760,7 @@ void tst_QItemSelectionModel::modelLayoutChanged()
// verify that selection is as expected
QItemSelection selection = selectionModel.selection();
QCOMPARE(selection.count(), expectedSelectedRanges.count());
- QVERIFY(selectionModel.hasSelection() == !expectedSelectedRanges.isEmpty());
+ QCOMPARE(selectionModel.hasSelection(), !expectedSelectedRanges.isEmpty());
for (int i = 0; i < expectedSelectedRanges.count(); ++i) {
IntPairPair expectedRange = expectedSelectedRanges.at(i);
@@ -1974,8 +1974,9 @@ void tst_QItemSelectionModel::rowIntersectsSelection2()
{
QStandardItemModel m;
for (int i=0; i<8; ++i) {
+ const QString text = QLatin1String("Item number ") + QString::number(i);
for (int j=0; j<8; ++j) {
- QStandardItem *item = new QStandardItem(QString("Item number %1").arg(i));
+ QStandardItem *item = new QStandardItem(text);
if ((i % 2 == 0 && j == 0) ||
(j % 2 == 0 && i == 0) ||
j == 5 || i == 5 ) {
@@ -2021,7 +2022,7 @@ void tst_QItemSelectionModel::rowIntersectsSelection3()
QStandardItemModel model;
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -2046,7 +2047,7 @@ void tst_QItemSelectionModel::unselectable()
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 10; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
}
QItemSelectionModel selectionModel(&model);
@@ -2093,7 +2094,8 @@ public:
QVariant data(const QModelIndex &idx, int role) const
{
if (role == Qt::DisplayRole || role == Qt::EditRole)
- return QString("[%1,%2]").arg(idx.row()).arg(idx.column());
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(']');
return QVariant();
}
@@ -2202,7 +2204,7 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -2217,7 +2219,7 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
QSignalSpy deselectSpy(&selectionModel, &QItemSelectionModel::selectionChanged);
QVERIFY(deselectSpy.isValid());
model.removeRows(0, 1, root);
- QVERIFY(deselectSpy.count() == 1);
+ QCOMPARE(deselectSpy.count(), 1);
// More testing stress for the patch.
model.clear();
@@ -2225,13 +2227,14 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
parentItem = model.invisibleRootItem();
for (int i = 0; i < 2; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
}
for (int i = 0; i < 2; ++i) {
parentItem = model.invisibleRootItem()->child(i, 0);
+ const QString prefix = QLatin1String("item ") + QString::number(i) + QLatin1Char('.');
for (int j = 0; j < 2; ++j) {
- QStandardItem *item = new QStandardItem(QString("item %0.%1").arg(i).arg(j));
+ QStandardItem *item = new QStandardItem(prefix + QString::number(j));
parentItem->appendRow(item);
}
}
@@ -2245,7 +2248,7 @@ void tst_QItemSelectionModel::childrenDeselectionSignal()
QVERIFY(selectionModel.selection().contains(sel2));
deselectSpy.clear();
model.removeRow(0, model.index(0, 0));
- QVERIFY(deselectSpy.count() == 1);
+ QCOMPARE(deselectSpy.count(), 1);
QVERIFY(!selectionModel.selection().contains(sel));
QVERIFY(selectionModel.selection().contains(sel2));
}
@@ -2304,13 +2307,12 @@ void tst_QItemSelectionModel::layoutChangedWithAllSelected2()
// Populate the tree view.
for (unsigned int i = 0; i < cNumCols; i++)
- model.setHeaderData( i, Qt::Horizontal, QString::fromLatin1("Column %1").arg(i));
+ model.setHeaderData( i, Qt::Horizontal, QLatin1String("Column ") + QString::number(i));
for (unsigned int r = 0; r < cNumRows; r++) {
- for (unsigned int c = 0; c < cNumCols; c++) {
- model.setData(model.index(r, c, QModelIndex()),
- QString::fromLatin1("r:%1/c:%2").arg(r, c));
- }
+ const QString prefix = QLatin1String("r:") + QString::number(r) + QLatin1String("/c:");
+ for (unsigned int c = 0; c < cNumCols; c++)
+ model.setData(model.index(r, c, QModelIndex()), prefix + QString::number(c));
}
QCOMPARE(model.rowCount(), int(cNumRows));
@@ -2375,7 +2377,7 @@ public slots:
foreach(const QModelIndex &index, deselected.indexes()) {
QVERIFY(!m_itemSelectionModel->selection().contains(index));
}
- QVERIFY(m_itemSelectionModel->selection().size() == 2);
+ QCOMPARE(m_itemSelectionModel->selection().size(), 2);
}
};
@@ -2393,7 +2395,7 @@ void tst_QItemSelectionModel::deselectRemovedMiddleRange()
selModel.select(QItemSelection(model.index(3, 0), model.index(6, 0)), QItemSelectionModel::Select);
- QVERIFY(selModel.selection().size() == 1);
+ QCOMPARE(selModel.selection().size(), 1);
RemovalObserver ro(&selModel);
@@ -2402,7 +2404,7 @@ void tst_QItemSelectionModel::deselectRemovedMiddleRange()
bool ok = model.removeRows(4, 2);
QVERIFY(ok);
- QVERIFY(spy.size() == 1);
+ QCOMPARE(spy.size(), 1);
}
static QStandardItemModel* getModel(QObject *parent)
@@ -2412,15 +2414,16 @@ static QStandardItemModel* getModel(QObject *parent)
for (int i = 0; i < 4; ++i) {
QStandardItem *parentItem = model->invisibleRootItem();
QList<QStandardItem*> list;
+ const QString prefix = QLatin1String("item ") + QString::number(i) + QLatin1String(", ");
for (int j = 0; j < 4; ++j) {
- list.append(new QStandardItem(QString("item %1, %2").arg(i).arg(j)));
+ list.append(new QStandardItem(prefix + QString::number(j)));
}
parentItem->appendRow(list);
parentItem = list.first();
for (int j = 0; j < 4; ++j) {
QList<QStandardItem*> list;
for (int k = 0; k < 4; ++k) {
- list.append(new QStandardItem(QString("item %1, %2").arg(i).arg(j)));
+ list.append(new QStandardItem(prefix + QString::number(j)));
}
parentItem->appendRow(list);
}
@@ -2713,8 +2716,8 @@ void tst_QItemSelectionModel::testChainedSelectionClear()
QModelIndexList selectedIndexes = selectionModel.selection().indexes();
QModelIndexList duplicatedIndexes = duplicate.selection().indexes();
- QVERIFY(selectedIndexes.size() == duplicatedIndexes.size());
- QVERIFY(selectedIndexes.size() == 1);
+ QCOMPARE(selectedIndexes.size(), duplicatedIndexes.size());
+ QCOMPARE(selectedIndexes.size(), 1);
QVERIFY(selectedIndexes.first() == model.index(0, 0));
}
@@ -2724,18 +2727,18 @@ void tst_QItemSelectionModel::testChainedSelectionClear()
QModelIndexList selectedIndexes = selectionModel.selection().indexes();
QModelIndexList duplicatedIndexes = duplicate.selection().indexes();
- QVERIFY(selectedIndexes.size() == duplicatedIndexes.size());
- QVERIFY(selectedIndexes.size() == 0);
+ QCOMPARE(selectedIndexes.size(), duplicatedIndexes.size());
+ QCOMPARE(selectedIndexes.size(), 0);
}
duplicate.setCurrentIndex(model.index(0, 0), QItemSelectionModel::NoUpdate);
- QVERIFY(selectionModel.currentIndex() == duplicate.currentIndex());
+ QCOMPARE(selectionModel.currentIndex(), duplicate.currentIndex());
duplicate.clearCurrentIndex();
QVERIFY(!duplicate.currentIndex().isValid());
- QVERIFY(selectionModel.currentIndex() == duplicate.currentIndex());
+ QCOMPARE(selectionModel.currentIndex(), duplicate.currentIndex());
}
void tst_QItemSelectionModel::testClearCurrentIndex()
@@ -2750,13 +2753,13 @@ void tst_QItemSelectionModel::testClearCurrentIndex()
QModelIndex firstIndex = model.index(0, 0);
QVERIFY(firstIndex.isValid());
selectionModel.setCurrentIndex(firstIndex, QItemSelectionModel::NoUpdate);
- QVERIFY(selectionModel.currentIndex() == firstIndex);
- QVERIFY(currentIndexSpy.size() == 1);
+ QCOMPARE(selectionModel.currentIndex(), firstIndex);
+ QCOMPARE(currentIndexSpy.size(), 1);
selectionModel.clearCurrentIndex();
- QVERIFY(selectionModel.currentIndex() == QModelIndex());
- QVERIFY(currentIndexSpy.size() == 2);
+ QCOMPARE(selectionModel.currentIndex(), QModelIndex());
+ QCOMPARE(currentIndexSpy.size(), 2);
}
void tst_QItemSelectionModel::QTBUG48402_data()
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro
index 25947990a7..099f666def 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/qsortfilterproxymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsortfilterproxymodel
QT += widgets testlib
@@ -8,4 +7,3 @@ mtdir = ../../../other/modeltest
INCLUDEPATH += $$PWD/$${mtdir}
SOURCES += tst_qsortfilterproxymodel.cpp $${mtdir}/dynamictreemodel.cpp $${mtdir}/modeltest.cpp
HEADERS += $${mtdir}/dynamictreemodel.h $${mtdir}/modeltest.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
index 0302ae5cbf..7d93818797 100644
--- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
+++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp
@@ -341,7 +341,7 @@ void tst_QSortFilterProxyModel::sort_data()
QStringList list;
for (int i = 10000; i < 20000; ++i)
- list.append(QString("Number: %1").arg(i));
+ list.append(QStringLiteral("Number: ") + QString::number(i));
QTest::newRow("large set ascending") << static_cast<int>(Qt::AscendingOrder) << int(Qt::CaseSensitive) << list << list;
}
@@ -1346,14 +1346,14 @@ void tst_QSortFilterProxyModel::buildHierarchy(const QStringList &l, QAbstractIt
QStack<QModelIndex> parent_stack;
for (int i = 0; i < l.count(); ++i) {
QString token = l.at(i);
- if (token == "<") { // start table
+ if (token == QLatin1String("<")) { // start table
++ind;
parent_stack.push(parent);
row_stack.push(row);
parent = m->index(row - 1, 0, parent);
row = 0;
QVERIFY(m->insertColumns(0, 1, parent)); // add column
- } else if (token == ">") { // end table
+ } else if (token == QLatin1String(">")) { // end table
--ind;
parent = parent_stack.pop();
row = row_stack.pop();
@@ -1376,14 +1376,14 @@ void tst_QSortFilterProxyModel::checkHierarchy(const QStringList &l, const QAbst
QStack<QModelIndex> parent_stack;
for (int i = 0; i < l.count(); ++i) {
QString token = l.at(i);
- if (token == "<") { // start table
+ if (token == QLatin1String("<")) { // start table
++indent;
parent_stack.push(parent);
row_stack.push(row);
parent = m->index(row - 1, 0, parent);
QVERIFY(parent.isValid());
row = 0;
- } else if (token == ">") { // end table
+ } else if (token == QLatin1String(">")) { // end table
--indent;
parent = parent_stack.pop();
row = row_stack.pop();
@@ -1418,7 +1418,7 @@ void tst_QSortFilterProxyModel::filterTable()
filter.setFilterRegExp("9");
for (int i = 0; i < filter.rowCount(); ++i)
- QVERIFY(filter.data(filter.index(i, 0)).toString().contains("9"));
+ QVERIFY(filter.data(filter.index(i, 0)).toString().contains(QLatin1Char('9')));
}
void tst_QSortFilterProxyModel::insertAfterSelect()
@@ -1663,16 +1663,16 @@ void tst_QSortFilterProxyModel::removeSourceRows()
QCOMPARE(aboutToRemoveSpy.count(), expectedRemovedProxyIntervals.count());
for (int i = 0; i < aboutToRemoveSpy.count(); ++i) {
QList<QVariant> args = aboutToRemoveSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), expectedRemovedProxyIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), expectedRemovedProxyIntervals.at(i).second);
}
QCOMPARE(removeSpy.count(), expectedRemovedProxyIntervals.count());
for (int i = 0; i < removeSpy.count(); ++i) {
QList<QVariant> args = removeSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), expectedRemovedProxyIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), expectedRemovedProxyIntervals.at(i).second);
}
@@ -1841,8 +1841,8 @@ void tst_QSortFilterProxyModel::changeFilter()
QCOMPARE(initialInsertSpy.count(), 0);
for (int i = 0; i < initialRemoveSpy.count(); ++i) {
QList<QVariant> args = initialRemoveSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), initialRemoveIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), initialRemoveIntervals.at(i).second);
}
@@ -1864,8 +1864,8 @@ void tst_QSortFilterProxyModel::changeFilter()
QCOMPARE(finalRemoveSpy.count(), finalRemoveIntervals.count());
for (int i = 0; i < finalRemoveSpy.count(); ++i) {
QList<QVariant> args = finalRemoveSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), finalRemoveIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), finalRemoveIntervals.at(i).second);
}
@@ -1876,8 +1876,8 @@ void tst_QSortFilterProxyModel::changeFilter()
QCOMPARE(finalInsertSpy.count(), insertIntervals.count());
for (int i = 0; i < finalInsertSpy.count(); ++i) {
QList<QVariant> args = finalInsertSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), insertIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), insertIntervals.at(i).second);
}
@@ -2018,8 +2018,8 @@ void tst_QSortFilterProxyModel::changeSourceData()
QCOMPARE(removeSpy.count(), removeIntervals.count());
for (int i = 0; i < removeSpy.count(); ++i) {
QList<QVariant> args = removeSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), removeIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), removeIntervals.at(i).second);
}
@@ -2027,8 +2027,8 @@ void tst_QSortFilterProxyModel::changeSourceData()
QCOMPARE(insertSpy.count(), insertIntervals.count());
for (int i = 0; i < insertSpy.count(); ++i) {
QList<QVariant> args = insertSpy.at(i);
- QVERIFY(args.at(1).type() == QVariant::Int);
- QVERIFY(args.at(2).type() == QVariant::Int);
+ QCOMPARE(args.at(1).type(), QVariant::Int);
+ QCOMPARE(args.at(2).type(), QVariant::Int);
QCOMPARE(args.at(1).toInt(), insertIntervals.at(i).first);
QCOMPARE(args.at(2).toInt(), insertIntervals.at(i).second);
}
@@ -2545,12 +2545,11 @@ void tst_QSortFilterProxyModel::sortStable()
{
QStandardItemModel* model = new QStandardItemModel(5, 2);
for (int r = 0; r < 5; r++) {
+ const QString prefix = QLatin1String("Row:") + QString::number(r) + QLatin1String(", Column:");
for (int c = 0; c < 2; c++) {
- QStandardItem* item = new QStandardItem(
- QString("Row:%0, Column:%1").arg(r).arg(c) );
+ QStandardItem* item = new QStandardItem(prefix + QString::number(c));
for (int i = 0; i < 3; i++) {
- QStandardItem* child = new QStandardItem(
- QString("Item %0").arg(i) );
+ QStandardItem* child = new QStandardItem(QLatin1String("Item ") + QString::number(i));
item->appendRow( child );
}
model->setItem(r, c, item);
@@ -2581,7 +2580,7 @@ void tst_QSortFilterProxyModel::hiddenColumns()
public:
MyStandardItemModel() : QStandardItemModel(0,5) {}
void reset()
- { QStandardItemModel::reset(); }
+ { beginResetModel(); endResetModel(); }
friend class tst_QSortFilterProxyModel;
} model;
QSortFilterProxyModel proxy;
@@ -2625,7 +2624,7 @@ void tst_QSortFilterProxyModel::staticSorting()
QSortFilterProxyModel proxy;
proxy.setSourceModel(&model);
proxy.setDynamicSortFilter(false);
- QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(" ");
+ QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(QLatin1Char(' '));
// prepare model
QStandardItem *root = model.invisibleRootItem ();
@@ -2680,7 +2679,7 @@ void tst_QSortFilterProxyModel::staticSorting()
void tst_QSortFilterProxyModel::dynamicSorting()
{
QStringListModel model1;
- const QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(" ");
+ const QStringList initial = QString("bateau avion dragon hirondelle flamme camion elephant").split(QLatin1Char(' '));
model1.setStringList(initial);
QSortFilterProxyModel proxy1;
proxy1.setDynamicSortFilter(false);
@@ -2806,7 +2805,8 @@ public:
qWarning("Invalid modelIndex [%d,%d,%p]", idx.row(), idx.column(),
idx.internalPointer());
}
- return QString("[%1,%2]").arg(idx.row()).arg(idx.column());
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(']');
}
return QVariant();
}
@@ -2971,7 +2971,7 @@ void tst_QSortFilterProxyModel::doubleProxySelectionSetSourceModel()
QStandardItemModel *model1 = new QStandardItemModel;
QStandardItem *parentItem = model1->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("model1 item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("model1 item ") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -2979,7 +2979,7 @@ void tst_QSortFilterProxyModel::doubleProxySelectionSetSourceModel()
QStandardItemModel *model2 = new QStandardItemModel;
QStandardItem *parentItem2 = model2->invisibleRootItem();
for (int i = 0; i < 4; ++i) {
- QStandardItem *item = new QStandardItem(QString("model2 item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("model2 item ") + QString::number(i));
parentItem2->appendRow(item);
parentItem2 = item;
}
@@ -3078,7 +3078,7 @@ void tst_QSortFilterProxyModel::appearsAndSort()
void tst_QSortFilterProxyModel::unnecessaryDynamicSorting()
{
QStringListModel model;
- const QStringList initial = QString("bravo charlie delta echo").split(" ");
+ const QStringList initial = QString("bravo charlie delta echo").split(QLatin1Char(' '));
model.setStringList(initial);
QSortFilterProxyModel proxy;
proxy.setDynamicSortFilter(false);
@@ -3162,7 +3162,7 @@ private:
void tst_QSortFilterProxyModel::testMultipleProxiesWithSelection()
{
QStringListModel model;
- const QStringList initial = QString("bravo charlie delta echo").split(" ");
+ const QStringList initial = QString("bravo charlie delta echo").split(QLatin1Char(' '));
model.setStringList(initial);
QSortFilterProxyModel proxy;
@@ -3196,7 +3196,7 @@ static bool isValid(const QItemSelection &selection)
void tst_QSortFilterProxyModel::mapSelectionFromSource()
{
QStringListModel model;
- const QStringList initial = QString("bravo charlie delta echo").split(" ");
+ const QStringList initial = QString("bravo charlie delta echo").split(QLatin1Char(' '));
model.setStringList(initial);
QSortFilterProxyModel proxy;
@@ -3205,7 +3205,7 @@ void tst_QSortFilterProxyModel::mapSelectionFromSource()
proxy.setSourceModel(&model);
// Only "delta" remains.
- QVERIFY(proxy.rowCount() == 1);
+ QCOMPARE(proxy.rowCount(), 1);
QItemSelection selection;
QModelIndex charlie = model.index(1, 0);
@@ -3220,7 +3220,7 @@ void tst_QSortFilterProxyModel::mapSelectionFromSource()
QItemSelection proxiedSelection = proxy.mapSelectionFromSource(selection);
// Only "delta" is in the mapped result.
- QVERIFY(proxiedSelection.size() == 1);
+ QCOMPARE(proxiedSelection.size(), 1);
QVERIFY(isValid(proxiedSelection));
}
@@ -3377,7 +3377,10 @@ void tst_QSortFilterProxyModel::resetInvalidate()
{
switch (test) {
case 0: break;
- case 1: reset(); break;
+ case 1:
+ beginResetModel();
+ endResetModel();
+ break;
case 2: invalidate(); break;
case 3: invalidateFilter(); break;
}
@@ -3551,11 +3554,11 @@ void tst_QSortFilterProxyModel::testParentLayoutChanged()
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
{
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item ") + QString::number(i));
parentItem->appendRow(item);
}
{
- QStandardItem *item = new QStandardItem(QString("item 1%0").arg(i));
+ QStandardItem *item = new QStandardItem(QLatin1String("item 1") + QString::number(i));
parentItem->appendRow(item);
parentItem = item;
}
@@ -3852,9 +3855,10 @@ void tst_QSortFilterProxyModel::hierarchyFilterInvalidation()
{
QStandardItemModel model;
for (int i = 0; i < 10; ++i) {
- QStandardItem *child = new QStandardItem(QString("Row %1").arg(i));
+ const QString rowText = QLatin1String("Row ") + QString::number(i);
+ QStandardItem *child = new QStandardItem(rowText);
for (int j = 0; j < 1; ++j) {
- child->appendRow(new QStandardItem(QString("Row %1/%2").arg(i).arg(j)));
+ child->appendRow(new QStandardItem(rowText + QLatin1Char('/') + QString::number(j)));
}
model.appendRow(child);
}
@@ -3913,7 +3917,7 @@ void tst_QSortFilterProxyModel::simpleFilterInvalidation()
{
QStandardItemModel model;
for (int i = 0; i < 2; ++i) {
- QStandardItem *child = new QStandardItem(QString("Row %1").arg(i));
+ QStandardItem *child = new QStandardItem(QLatin1String("Row ") + QString::number(i));
child->appendRow(new QStandardItem("child"));
model.appendRow(child);
}
diff --git a/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro b/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro
index e11e16b203..91a4cf306c 100644
--- a/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro
+++ b/tests/auto/corelib/itemmodels/qstringlistmodel/qstringlistmodel.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstringlistmodel
QT = core testlib
HEADERS += qmodellistener.h
SOURCES += tst_qstringlistmodel.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/json/json.pro b/tests/auto/corelib/json/json.pro
index 237e20685a..4644ae27e6 100644
--- a/tests/auto/corelib/json/json.pro
+++ b/tests/auto/corelib/json/json.pro
@@ -2,10 +2,8 @@ TARGET = tst_json
QT = core testlib
CONFIG -= app_bundle
CONFIG += testcase
-CONFIG += parallel_test
!android:TESTDATA += test.json test.bjson test3.json test2.json
else:RESOURCES += json.qrc
SOURCES += tst_qtjson.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/json/tst_qtjson.cpp b/tests/auto/corelib/json/tst_qtjson.cpp
index 884c4b3850..e8d836683e 100644
--- a/tests/auto/corelib/json/tst_qtjson.cpp
+++ b/tests/auto/corelib/json/tst_qtjson.cpp
@@ -741,7 +741,7 @@ void tst_QtJson::testObjectIteration()
{
QJsonObject object2 = object;
- QVERIFY(object == object2);
+ QCOMPARE(object, object2);
QJsonValue val = *object2.begin();
object2.erase(object2.begin());
@@ -757,7 +757,7 @@ void tst_QtJson::testObjectIteration()
{
QJsonObject object2 = object;
- QVERIFY(object == object2);
+ QCOMPARE(object, object2);
QJsonObject::iterator it = object2.find(QString::number(5));
object2.erase(it);
@@ -793,7 +793,7 @@ void tst_QtJson::testObjectIteration()
while (!object.isEmpty())
it = object.erase(it);
QCOMPARE(object.size() , 0);
- QVERIFY(it == object.end());
+ QCOMPARE(it, object.end());
}
void tst_QtJson::testArrayIteration()
@@ -814,7 +814,7 @@ void tst_QtJson::testArrayIteration()
{
QJsonArray array2 = array;
- QVERIFY(array == array2);
+ QCOMPARE(array, array2);
QJsonValue val = *array2.begin();
array2.erase(array2.begin());
@@ -856,7 +856,7 @@ void tst_QtJson::testArrayIteration()
while (!array.isEmpty())
it = array.erase(it);
QCOMPARE(array.size() , 0);
- QVERIFY(it == array.end());
+ QCOMPARE(it, array.end());
}
void tst_QtJson::testObjectFind()
@@ -870,14 +870,14 @@ void tst_QtJson::testObjectFind()
QJsonObject::iterator it = object.find(QLatin1String("1"));
QCOMPARE((*it).toDouble(), 1.);
it = object.find(QLatin1String("11"));
- QVERIFY((*it).type() == QJsonValue::Undefined);
- QVERIFY(it == object.end());
+ QCOMPARE((*it).type(), QJsonValue::Undefined);
+ QCOMPARE(it, object.end());
QJsonObject::const_iterator cit = object.constFind(QLatin1String("1"));
QCOMPARE((*cit).toDouble(), 1.);
cit = object.constFind(QLatin1String("11"));
- QVERIFY((*it).type() == QJsonValue::Undefined);
- QVERIFY(it == object.end());
+ QCOMPARE((*it).type(), QJsonValue::Undefined);
+ QCOMPARE(it, object.end());
}
void tst_QtJson::testDocument()
@@ -898,8 +898,8 @@ void tst_QtJson::testDocument()
QCOMPARE(doc.isEmpty(), false);
QCOMPARE(doc.isArray(), false);
QCOMPARE(doc.isObject(), true);
- QVERIFY(doc.object() == object);
- QVERIFY(doc.array() == QJsonArray());
+ QCOMPARE(doc.object(), object);
+ QCOMPARE(doc.array(), QJsonArray());
doc = QJsonDocument();
QCOMPARE(doc.isEmpty(), true);
@@ -917,8 +917,8 @@ void tst_QtJson::testDocument()
QCOMPARE(doc.isEmpty(), false);
QCOMPARE(doc.isArray(), true);
QCOMPARE(doc.isObject(), false);
- QVERIFY(doc.array() == array);
- QVERIFY(doc.object() == QJsonObject());
+ QCOMPARE(doc.array(), array);
+ QCOMPARE(doc.object(), QJsonObject());
QJsonObject outer;
outer.insert(QLatin1String("outerKey"), 22);
@@ -1740,7 +1740,7 @@ void tst_QtJson::fromBinary()
QJsonDocument doc = QJsonDocument::fromJson(testJson);
QJsonDocument outdoc = QJsonDocument::fromBinaryData(doc.toBinaryData());
QVERIFY(!outdoc.isNull());
- QVERIFY(doc == outdoc);
+ QCOMPARE(doc, outdoc);
QFile bfile(testDataDir + "/test.bjson");
bfile.open(QFile::ReadOnly);
@@ -1748,8 +1748,8 @@ void tst_QtJson::fromBinary()
QJsonDocument bdoc = QJsonDocument::fromBinaryData(binary);
QVERIFY(!bdoc.isNull());
- QVERIFY(doc.toVariant() == bdoc.toVariant());
- QVERIFY(doc == bdoc);
+ QCOMPARE(doc.toVariant(), bdoc.toVariant());
+ QCOMPARE(doc, bdoc);
}
void tst_QtJson::toAndFromBinary_data()
@@ -1770,7 +1770,7 @@ void tst_QtJson::toAndFromBinary()
QVERIFY(!doc.isNull());
QJsonDocument outdoc = QJsonDocument::fromBinaryData(doc.toBinaryData());
QVERIFY(!outdoc.isNull());
- QVERIFY(doc == outdoc);
+ QCOMPARE(doc, outdoc);
}
void tst_QtJson::parseNumbers()
@@ -2086,7 +2086,7 @@ void tst_QtJson::assignToDocument()
QJsonDocument innerDoc(inner.toObject());
QVERIFY(innerDoc != doc);
- QVERIFY(innerDoc.object() == inner.toObject());
+ QCOMPARE(innerDoc.object(), inner.toObject());
}
{
const char *json = "[ [ true ] ]";
@@ -2098,7 +2098,7 @@ void tst_QtJson::assignToDocument()
QJsonDocument innerDoc(inner.toArray());
QVERIFY(innerDoc != doc);
- QVERIFY(innerDoc.array() == inner.toArray());
+ QCOMPARE(innerDoc.array(), inner.toArray());
}
}
@@ -2129,7 +2129,7 @@ void tst_QtJson::testCompaction()
QVERIFY(!doc.isEmpty());
QCOMPARE(doc.isArray(), false);
QCOMPARE(doc.isObject(), true);
- QVERIFY(doc.object() == obj);
+ QCOMPARE(doc.object(), obj);
}
void tst_QtJson::testDebugStream()
@@ -2328,14 +2328,14 @@ void tst_QtJson::testDetachBug()
void tst_QtJson::valueEquals()
{
- QVERIFY(QJsonValue() == QJsonValue());
+ QCOMPARE(QJsonValue(), QJsonValue());
QVERIFY(QJsonValue() != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue() != QJsonValue(true));
QVERIFY(QJsonValue() != QJsonValue(1.));
QVERIFY(QJsonValue() != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue() != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(true) == QJsonValue(true));
+ QCOMPARE(QJsonValue(true), QJsonValue(true));
QVERIFY(QJsonValue(true) != QJsonValue(false));
QVERIFY(QJsonValue(true) != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue(true) != QJsonValue());
@@ -2343,9 +2343,9 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(true) != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue(true) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(1) == QJsonValue(1));
+ QCOMPARE(QJsonValue(1), QJsonValue(1));
QVERIFY(QJsonValue(1) != QJsonValue(2));
- QVERIFY(QJsonValue(1) == QJsonValue(1.));
+ QCOMPARE(QJsonValue(1), QJsonValue(1.));
QVERIFY(QJsonValue(1) != QJsonValue(1.1));
QVERIFY(QJsonValue(1) != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue(1) != QJsonValue());
@@ -2353,7 +2353,7 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(1) != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue(1) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(1.) == QJsonValue(1.));
+ QCOMPARE(QJsonValue(1.), QJsonValue(1.));
QVERIFY(QJsonValue(1.) != QJsonValue(2.));
QVERIFY(QJsonValue(1.) != QJsonValue(QJsonValue::Undefined));
QVERIFY(QJsonValue(1.) != QJsonValue());
@@ -2361,7 +2361,7 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(1.) != QJsonValue(QJsonArray()));
QVERIFY(QJsonValue(1.) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(QJsonArray()) == QJsonValue(QJsonArray()));
+ QCOMPARE(QJsonValue(QJsonArray()), QJsonValue(QJsonArray()));
QJsonArray nonEmptyArray;
nonEmptyArray.append(true);
QVERIFY(QJsonValue(QJsonArray()) != nonEmptyArray);
@@ -2371,7 +2371,7 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(QJsonArray()) != QJsonValue(1.));
QVERIFY(QJsonValue(QJsonArray()) != QJsonValue(QJsonObject()));
- QVERIFY(QJsonValue(QJsonObject()) == QJsonValue(QJsonObject()));
+ QCOMPARE(QJsonValue(QJsonObject()), QJsonValue(QJsonObject()));
QJsonObject nonEmptyObject;
nonEmptyObject.insert("Key", true);
QVERIFY(QJsonValue(QJsonObject()) != nonEmptyObject);
@@ -2381,13 +2381,13 @@ void tst_QtJson::valueEquals()
QVERIFY(QJsonValue(QJsonObject()) != QJsonValue(1.));
QVERIFY(QJsonValue(QJsonObject()) != QJsonValue(QJsonArray()));
- QVERIFY(QJsonValue("foo") == QJsonValue(QLatin1String("foo")));
- QVERIFY(QJsonValue("foo") == QJsonValue(QString("foo")));
- QVERIFY(QJsonValue("\x66\x6f\x6f") == QJsonValue(QString("foo")));
- QVERIFY(QJsonValue("\x62\x61\x72") == QJsonValue("bar"));
- QVERIFY(QJsonValue(UNICODE_NON_CHARACTER) == QJsonValue(QString(UNICODE_NON_CHARACTER)));
- QVERIFY(QJsonValue(UNICODE_DJE) == QJsonValue(QString(UNICODE_DJE)));
- QVERIFY(QJsonValue("\xc3\xa9") == QJsonValue(QString("\xc3\xa9")));
+ QCOMPARE(QJsonValue("foo"), QJsonValue(QLatin1String("foo")));
+ QCOMPARE(QJsonValue("foo"), QJsonValue(QString("foo")));
+ QCOMPARE(QJsonValue("\x66\x6f\x6f"), QJsonValue(QString("foo")));
+ QCOMPARE(QJsonValue("\x62\x61\x72"), QJsonValue("bar"));
+ QCOMPARE(QJsonValue(UNICODE_NON_CHARACTER), QJsonValue(QString(UNICODE_NON_CHARACTER)));
+ QCOMPARE(QJsonValue(UNICODE_DJE), QJsonValue(QString(UNICODE_DJE)));
+ QCOMPARE(QJsonValue("\xc3\xa9"), QJsonValue(QString("\xc3\xa9")));
}
void tst_QtJson::objectEquals_data()
@@ -2521,7 +2521,7 @@ void tst_QtJson::bom()
QJsonDocument doc = QJsonDocument::fromJson(json, &error);
QVERIFY(!doc.isNull());
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
}
void tst_QtJson::nesting()
@@ -2553,14 +2553,14 @@ void tst_QtJson::nesting()
QJsonDocument doc = QJsonDocument::fromJson(json, &error);
QVERIFY(!doc.isNull());
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
- json.prepend("[");
- json.append("]");
+ json.prepend('[');
+ json.append(']');
doc = QJsonDocument::fromJson(json, &error);
QVERIFY(doc.isNull());
- QVERIFY(error.error == QJsonParseError::DeepNesting);
+ QCOMPARE(error.error, QJsonParseError::DeepNesting);
json = QByteArray("true ");
@@ -2572,14 +2572,14 @@ void tst_QtJson::nesting()
doc = QJsonDocument::fromJson(json, &error);
QVERIFY(!doc.isNull());
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
- json.prepend("[");
- json.append("]");
+ json.prepend('[');
+ json.append(']');
doc = QJsonDocument::fromJson(json, &error);
QVERIFY(doc.isNull());
- QVERIFY(error.error == QJsonParseError::DeepNesting);
+ QCOMPARE(error.error, QJsonParseError::DeepNesting);
}
@@ -2589,7 +2589,7 @@ void tst_QtJson::longStrings()
// in the data structures (for Latin1String in qjson_p.h)
QString s(0x7ff0, 'a');
for (int i = 0x7ff0; i < 0x8010; i++) {
- s.append("c");
+ s.append(QLatin1Char('c'));
QMap <QString, QVariant> map;
map["key"] = s;
@@ -2603,12 +2603,12 @@ void tst_QtJson::longStrings()
QJsonDocument d2 = QJsonDocument::fromJson(a1);
/* ... and a QByteArray from the QJsonDocument */
QByteArray a2 = d2.toJson();
- QVERIFY(a1 == a2);
+ QCOMPARE(a1, a2);
}
s = QString(0xfff0, 'a');
for (int i = 0xfff0; i < 0x10010; i++) {
- s.append("c");
+ s.append(QLatin1Char('c'));
QMap <QString, QVariant> map;
map["key"] = s;
@@ -2622,7 +2622,7 @@ void tst_QtJson::longStrings()
QJsonDocument d2 = QJsonDocument::fromJson(a1);
/* ... and a QByteArray from the QJsonDocument */
QByteArray a2 = d2.toJson();
- QVERIFY(a1 == a2);
+ QCOMPARE(a1, a2);
}
}
@@ -2755,7 +2755,7 @@ void tst_QtJson::unicodeKeys()
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson(json, &error);
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
QJsonObject o = doc.object();
QCOMPARE(o.keys().size(), 5);
@@ -2769,12 +2769,12 @@ void tst_QtJson::garbageAtEnd()
{
QJsonParseError error;
QJsonDocument doc = QJsonDocument::fromJson("{},", &error);
- QVERIFY(error.error == QJsonParseError::GarbageAtEnd);
- QVERIFY(error.offset == 2);
+ QCOMPARE(error.error, QJsonParseError::GarbageAtEnd);
+ QCOMPARE(error.offset, 2);
QVERIFY(doc.isEmpty());
doc = QJsonDocument::fromJson("{} ", &error);
- QVERIFY(error.error == QJsonParseError::NoError);
+ QCOMPARE(error.error, QJsonParseError::NoError);
QVERIFY(!doc.isEmpty());
}
diff --git a/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro b/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro
index 1039f2c08d..a49bb9ae1f 100644
--- a/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro
+++ b/tests/auto/corelib/kernel/qcoreapplication/qcoreapplication.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcoreapplication
QT = core testlib core-private
SOURCES = tst_qcoreapplication.cpp
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
index 655719cffc..b889d61786 100644
--- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
+++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.cpp
@@ -442,14 +442,14 @@ public slots:
void threadProgress(int v)
{
++count;
- QVERIFY(v == count);
+ QCOMPARE(v, count);
QCoreApplication::postEvent(this, new QEvent(QEvent::MaxUser), -1);
}
void threadFinished()
{
- QVERIFY(count == 7);
+ QCOMPARE(count, 7);
count = 0;
thread->deleteLater();
@@ -898,6 +898,7 @@ void tst_QCoreApplication::threadedEventDelivery()
QCOMPARE(receiver.recordedEvents.contains(QEvent::User + 1), eventsReceived);
}
+#ifndef QT_NO_LIBRARY
void tst_QCoreApplication::addRemoveLibPaths()
{
QStringList paths = QCoreApplication::libraryPaths();
@@ -922,8 +923,9 @@ void tst_QCoreApplication::addRemoveLibPaths()
QStringList replace;
replace << currentDir << paths[0];
QCoreApplication::setLibraryPaths(replace);
- QVERIFY(QCoreApplication::libraryPaths() == replace);
+ QCOMPARE(QCoreApplication::libraryPaths(), replace);
}
+#endif
static void createQObjectOnDestruction()
{
diff --git a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h
index d9296b3846..6c24ab56f8 100644
--- a/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h
+++ b/tests/auto/corelib/kernel/qcoreapplication/tst_qcoreapplication.h
@@ -63,7 +63,9 @@ private slots:
void applicationEventFilters_auxThread();
void threadedEventDelivery_data();
void threadedEventDelivery();
+#ifndef QT_NO_LIBRARY
void addRemoveLibPaths();
+#endif
};
#endif // TST_QCOREAPPLICATION_H
diff --git a/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro b/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
index c3019467ce..ff048d0429 100644
--- a/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
+++ b/tests/auto/corelib/kernel/qeventdispatcher/qeventdispatcher.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qeventdispatcher
QT = core testlib
SOURCES += tst_qeventdispatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
index ea4792fc1c..5cd043b584 100644
--- a/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
+++ b/tests/auto/corelib/kernel/qeventloop/qeventloop.pro
@@ -1,10 +1,8 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qeventloop
QT = core network testlib core-private
SOURCES = $$PWD/tst_qeventloop.cpp
win32:!wince:!winrt: LIBS += -luser32
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG, glib): DEFINES += HAVE_GLIB
diff --git a/tests/auto/corelib/kernel/qmath/qmath.pro b/tests/auto/corelib/kernel/qmath/qmath.pro
index 5b8cba4104..703c530e35 100644
--- a/tests/auto/corelib/kernel/qmath/qmath.pro
+++ b/tests/auto/corelib/kernel/qmath/qmath.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmath
QT = core testlib
SOURCES = tst_qmath.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro b/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro
index f045fc5d88..718f2b51de 100644
--- a/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro
+++ b/tests/auto/corelib/kernel/qmetaenum/qmetaenum.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetaenum
QT = core testlib
SOURCES = tst_qmetaenum.cpp
diff --git a/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro b/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
index 8340bc06e3..a42cd60236 100644
--- a/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
+++ b/tests/auto/corelib/kernel/qmetamethod/qmetamethod.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetamethod
QT = core testlib
SOURCES = tst_qmetamethod.cpp
mac:CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
index cf3ff04aa4..8d5d34d10d 100644
--- a/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
+++ b/tests/auto/corelib/kernel/qmetamethod/tst_qmetamethod.cpp
@@ -599,8 +599,8 @@ void tst_QMetaMethod::method()
QFETCH(QMetaMethod::MethodType, methodType);
QFETCH(QMetaMethod::Access, access);
- QVERIFY(parameterTypes.size() == parameterTypeNames.size());
- QVERIFY(parameterTypes.size() == parameterNames.size());
+ QCOMPARE(parameterTypes.size(), parameterTypeNames.size());
+ QCOMPARE(parameterTypes.size(), parameterNames.size());
const QMetaObject *mo = &MethodTestObject::staticMetaObject;
int index = (methodType == QMetaMethod::Constructor)
diff --git a/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro b/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro
index 509ade6e2a..e7e5a03a86 100644
--- a/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro
+++ b/tests/auto/corelib/kernel/qmetaobject/qmetaobject.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetaobject
QT = core-private testlib
SOURCES = tst_qmetaobject.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
index 7c19bfb89c..0a84a019d0 100644
--- a/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
+++ b/tests/auto/corelib/kernel/qmetaobject/tst_qmetaobject.cpp
@@ -811,7 +811,7 @@ void tst_QMetaObject::invokeBlockingQueuedMetaMember()
void tst_QMetaObject::qtMetaObjectInheritance()
{
- QVERIFY(QObject::staticMetaObject.superClass() == 0);
+ QVERIFY(!QObject::staticMetaObject.superClass());
QCOMPARE(QSortFilterProxyModel::staticMetaObject.indexOfEnumerator("Qt::CaseSensitivity"), -1);
QCOMPARE(QSortFilterProxyModel::staticMetaObject.indexOfEnumerator("CaseSensitivity"), -1);
int indexOfSortCaseSensitivity = QSortFilterProxyModel::staticMetaObject.indexOfProperty("sortCaseSensitivity");
@@ -878,7 +878,7 @@ void tst_QMetaObject::invokeMetaConstructor()
const QMetaObject *mo = &QtTestObject::staticMetaObject;
{
QObject *obj = mo->newInstance();
- QVERIFY(obj == 0);
+ QVERIFY(!obj);
}
{
QtTestObject obj;
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro b/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro
index 68d3b48086..f3153b3fd4 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/qmetaobjectbuilder.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmetaobjectbuilder
QT = core-private testlib
SOURCES = tst_qmetaobjectbuilder.cpp
mac:CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
index 74fcde2e71..6cf45bed1e 100644
--- a/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
+++ b/tests/auto/corelib/kernel/qmetaobjectbuilder/tst_qmetaobjectbuilder.cpp
@@ -138,14 +138,14 @@ void tst_QMetaObjectBuilder::create()
{
QMetaObjectBuilder builder;
QVERIFY(builder.className().isEmpty());
- QVERIFY(builder.superClass() == &QObject::staticMetaObject);
+ QCOMPARE(builder.superClass(), &QObject::staticMetaObject);
QCOMPARE(builder.methodCount(), 0);
QCOMPARE(builder.constructorCount(), 0);
QCOMPARE(builder.propertyCount(), 0);
QCOMPARE(builder.enumeratorCount(), 0);
QCOMPARE(builder.classInfoCount(), 0);
QCOMPARE(builder.relatedMetaObjectCount(), 0);
- QVERIFY(builder.staticMetacallFunction() == 0);
+ QVERIFY(!builder.staticMetacallFunction());
}
void tst_QMetaObjectBuilder::className()
@@ -174,17 +174,17 @@ void tst_QMetaObjectBuilder::superClass()
// Change the super class.
builder.setSuperClass(&QObject::staticMetaObject);
- QVERIFY(builder.superClass() == &QObject::staticMetaObject);
+ QCOMPARE(builder.superClass(), &QObject::staticMetaObject);
// Change it again.
builder.setSuperClass(&staticMetaObject);
- QVERIFY(builder.superClass() == &staticMetaObject);
+ QCOMPARE(builder.superClass(), &staticMetaObject);
// Clone the super class off a static QMetaObject.
builder.addMetaObject(&QObject::staticMetaObject, QMetaObjectBuilder::SuperClass);
- QVERIFY(builder.superClass() == 0);
+ QVERIFY(!builder.superClass());
builder.addMetaObject(&staticMetaObject, QMetaObjectBuilder::SuperClass);
- QVERIFY(builder.superClass() == staticMetaObject.superClass());
+ QCOMPARE(builder.superClass(), staticMetaObject.superClass());
// Check that nothing else changed.
QVERIFY(checkForSideEffects(builder, QMetaObjectBuilder::SuperClass));
@@ -195,11 +195,11 @@ void tst_QMetaObjectBuilder::flags()
QMetaObjectBuilder builder;
// Check default
- QVERIFY(builder.flags() == 0);
+ QCOMPARE(builder.flags(), 0);
// Set flags
builder.setFlags(QMetaObjectBuilder::DynamicMetaObject);
- QVERIFY(builder.flags() == QMetaObjectBuilder::DynamicMetaObject);
+ QCOMPARE(builder.flags(), QMetaObjectBuilder::DynamicMetaObject);
}
void tst_QMetaObjectBuilder::method()
@@ -209,12 +209,12 @@ void tst_QMetaObjectBuilder::method()
// Check null method
QMetaMethodBuilder nullMethod;
QCOMPARE(nullMethod.signature(), QByteArray());
- QVERIFY(nullMethod.methodType() == QMetaMethod::Method);
+ QCOMPARE(nullMethod.methodType(), QMetaMethod::Method);
QVERIFY(nullMethod.returnType().isEmpty());
QVERIFY(nullMethod.parameterTypes().isEmpty());
QVERIFY(nullMethod.parameterNames().isEmpty());
QVERIFY(nullMethod.tag().isEmpty());
- QVERIFY(nullMethod.access() == QMetaMethod::Public);
+ QCOMPARE(nullMethod.access(), QMetaMethod::Public);
QCOMPARE(nullMethod.attributes(), 0);
QCOMPARE(nullMethod.revision(), 0);
QCOMPARE(nullMethod.index(), 0);
@@ -222,12 +222,12 @@ void tst_QMetaObjectBuilder::method()
// Add a method and check its attributes.
QMetaMethodBuilder method1 = builder.addMethod("foo(const QString&, int)");
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Method);
+ QCOMPARE(method1.methodType(), QMetaMethod::Method);
QCOMPARE(method1.returnType(), QByteArray("void"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(method1.parameterNames().isEmpty());
QVERIFY(method1.tag().isEmpty());
- QVERIFY(method1.access() == QMetaMethod::Public);
+ QCOMPARE(method1.access(), QMetaMethod::Public);
QCOMPARE(method1.attributes(), 0);
QCOMPARE(method1.revision(), 0);
QCOMPARE(method1.index(), 0);
@@ -236,12 +236,12 @@ void tst_QMetaObjectBuilder::method()
// Add another method and check again.
QMetaMethodBuilder method2 = builder.addMethod("bar(QString)", "int");
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("int"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.revision(), 0);
QCOMPARE(method2.index(), 1);
@@ -262,22 +262,22 @@ void tst_QMetaObjectBuilder::method()
// Check that method1 is changed, but method2 is not.
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Method);
+ QCOMPARE(method1.methodType(), QMetaMethod::Method);
QCOMPARE(method1.returnType(), QByteArray("int"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(method1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(method1.tag(), QByteArray("tag"));
- QVERIFY(method1.access() == QMetaMethod::Private);
+ QCOMPARE(method1.access(), QMetaMethod::Private);
QCOMPARE(method1.attributes(), 42);
QCOMPARE(method1.revision(), 123);
QCOMPARE(method1.index(), 0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("int"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.revision(), 0);
QCOMPARE(method2.index(), 1);
@@ -293,22 +293,22 @@ void tst_QMetaObjectBuilder::method()
// This time check that only method2 changed.
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Method);
+ QCOMPARE(method1.methodType(), QMetaMethod::Method);
QCOMPARE(method1.returnType(), QByteArray("int"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(method1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(method1.tag(), QByteArray("tag"));
- QVERIFY(method1.access() == QMetaMethod::Private);
+ QCOMPARE(method1.access(), QMetaMethod::Private);
QCOMPARE(method1.attributes(), 42);
QCOMPARE(method1.revision(), 123);
QCOMPARE(method1.index(), 0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("QString"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(method2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(method2.tag(), QByteArray("Q_FOO"));
- QVERIFY(method2.access() == QMetaMethod::Protected);
+ QCOMPARE(method2.access(), QMetaMethod::Protected);
QCOMPARE(method2.attributes(), 24);
QCOMPARE(method2.revision(), 321);
QCOMPARE(method2.index(), 1);
@@ -319,12 +319,12 @@ void tst_QMetaObjectBuilder::method()
QCOMPARE(builder.methodCount(), 1);
method2 = builder.method(0);
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Method);
+ QCOMPARE(method2.methodType(), QMetaMethod::Method);
QCOMPARE(method2.returnType(), QByteArray("QString"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(method2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(method2.tag(), QByteArray("Q_FOO"));
- QVERIFY(method2.access() == QMetaMethod::Protected);
+ QCOMPARE(method2.access(), QMetaMethod::Protected);
QCOMPARE(method2.attributes(), 24);
QCOMPARE(method2.revision(), 321);
QCOMPARE(method2.index(), 0);
@@ -347,12 +347,12 @@ void tst_QMetaObjectBuilder::slot()
// Add a slot and check its attributes.
QMetaMethodBuilder method1 = builder.addSlot("foo(const QString&, int)");
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Slot);
+ QCOMPARE(method1.methodType(), QMetaMethod::Slot);
QCOMPARE(method1.returnType(), QByteArray("void"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(method1.parameterNames().isEmpty());
QVERIFY(method1.tag().isEmpty());
- QVERIFY(method1.access() == QMetaMethod::Public);
+ QCOMPARE(method1.access(), QMetaMethod::Public);
QCOMPARE(method1.attributes(), 0);
QCOMPARE(method1.index(), 0);
QCOMPARE(builder.methodCount(), 1);
@@ -360,12 +360,12 @@ void tst_QMetaObjectBuilder::slot()
// Add another slot and check again.
QMetaMethodBuilder method2 = builder.addSlot("bar(QString)");
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Slot);
+ QCOMPARE(method2.methodType(), QMetaMethod::Slot);
QCOMPARE(method2.returnType(), QByteArray("void"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.index(), 1);
QCOMPARE(builder.methodCount(), 2);
@@ -386,12 +386,12 @@ void tst_QMetaObjectBuilder::signal()
// Add a signal and check its attributes.
QMetaMethodBuilder method1 = builder.addSignal("foo(const QString&, int)");
QCOMPARE(method1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(method1.methodType() == QMetaMethod::Signal);
+ QCOMPARE(method1.methodType(), QMetaMethod::Signal);
QCOMPARE(method1.returnType(), QByteArray("void"));
QCOMPARE(method1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(method1.parameterNames().isEmpty());
QVERIFY(method1.tag().isEmpty());
- QVERIFY(method1.access() == QMetaMethod::Public);
+ QCOMPARE(method1.access(), QMetaMethod::Public);
QCOMPARE(method1.attributes(), 0);
QCOMPARE(method1.index(), 0);
QCOMPARE(builder.methodCount(), 1);
@@ -399,12 +399,12 @@ void tst_QMetaObjectBuilder::signal()
// Add another signal and check again.
QMetaMethodBuilder method2 = builder.addSignal("bar(QString)");
QCOMPARE(method2.signature(), QByteArray("bar(QString)"));
- QVERIFY(method2.methodType() == QMetaMethod::Signal);
+ QCOMPARE(method2.methodType(), QMetaMethod::Signal);
QCOMPARE(method2.returnType(), QByteArray("void"));
QCOMPARE(method2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(method2.parameterNames().isEmpty());
QVERIFY(method2.tag().isEmpty());
- QVERIFY(method2.access() == QMetaMethod::Public);
+ QCOMPARE(method2.access(), QMetaMethod::Public);
QCOMPARE(method2.attributes(), 0);
QCOMPARE(method2.index(), 1);
QCOMPARE(builder.methodCount(), 2);
@@ -425,12 +425,12 @@ void tst_QMetaObjectBuilder::constructor()
// Add a constructor and check its attributes.
QMetaMethodBuilder ctor1 = builder.addConstructor("foo(const QString&, int)");
QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(ctor1.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor1.methodType(), QMetaMethod::Constructor);
QVERIFY(ctor1.returnType().isEmpty());
QCOMPARE(ctor1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QVERIFY(ctor1.parameterNames().isEmpty());
QVERIFY(ctor1.tag().isEmpty());
- QVERIFY(ctor1.access() == QMetaMethod::Public);
+ QCOMPARE(ctor1.access(), QMetaMethod::Public);
QCOMPARE(ctor1.attributes(), 0);
QCOMPARE(ctor1.index(), 0);
QCOMPARE(builder.constructorCount(), 1);
@@ -438,12 +438,12 @@ void tst_QMetaObjectBuilder::constructor()
// Add another constructor and check again.
QMetaMethodBuilder ctor2 = builder.addConstructor("bar(QString)");
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QVERIFY(ctor2.returnType().isEmpty());
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(ctor2.parameterNames().isEmpty());
QVERIFY(ctor2.tag().isEmpty());
- QVERIFY(ctor2.access() == QMetaMethod::Public);
+ QCOMPARE(ctor2.access(), QMetaMethod::Public);
QCOMPARE(ctor2.attributes(), 0);
QCOMPARE(ctor2.index(), 1);
QCOMPARE(builder.constructorCount(), 2);
@@ -464,21 +464,21 @@ void tst_QMetaObjectBuilder::constructor()
// Check that ctor1 is changed, but ctor2 is not.
QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(ctor1.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor1.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor1.returnType(), QByteArray("int"));
QCOMPARE(ctor1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(ctor1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(ctor1.tag(), QByteArray("tag"));
- QVERIFY(ctor1.access() == QMetaMethod::Private);
+ QCOMPARE(ctor1.access(), QMetaMethod::Private);
QCOMPARE(ctor1.attributes(), 42);
QCOMPARE(ctor1.index(), 0);
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QVERIFY(ctor2.returnType().isEmpty());
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QVERIFY(ctor2.parameterNames().isEmpty());
QVERIFY(ctor2.tag().isEmpty());
- QVERIFY(ctor2.access() == QMetaMethod::Public);
+ QCOMPARE(ctor2.access(), QMetaMethod::Public);
QCOMPARE(ctor2.attributes(), 0);
QCOMPARE(ctor2.index(), 1);
QCOMPARE(builder.constructorCount(), 2);
@@ -492,21 +492,21 @@ void tst_QMetaObjectBuilder::constructor()
// This time check that only ctor2 changed.
QCOMPARE(ctor1.signature(), QByteArray("foo(QString,int)"));
- QVERIFY(ctor1.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor1.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor1.returnType(), QByteArray("int"));
QCOMPARE(ctor1.parameterTypes(), QList<QByteArray>() << "QString" << "int");
QCOMPARE(ctor1.parameterNames(), QList<QByteArray>() << "a" << "b");
QCOMPARE(ctor1.tag(), QByteArray("tag"));
- QVERIFY(ctor1.access() == QMetaMethod::Private);
+ QCOMPARE(ctor1.access(), QMetaMethod::Private);
QCOMPARE(ctor1.attributes(), 42);
QCOMPARE(ctor1.index(), 0);
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor2.returnType(), QByteArray("QString"));
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(ctor2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(ctor2.tag(), QByteArray("Q_FOO"));
- QVERIFY(ctor2.access() == QMetaMethod::Protected);
+ QCOMPARE(ctor2.access(), QMetaMethod::Protected);
QCOMPARE(ctor2.attributes(), 24);
QCOMPARE(ctor2.index(), 1);
QCOMPARE(builder.constructorCount(), 2);
@@ -516,12 +516,12 @@ void tst_QMetaObjectBuilder::constructor()
QCOMPARE(builder.constructorCount(), 1);
ctor2 = builder.constructor(0);
QCOMPARE(ctor2.signature(), QByteArray("bar(QString)"));
- QVERIFY(ctor2.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(ctor2.methodType(), QMetaMethod::Constructor);
QCOMPARE(ctor2.returnType(), QByteArray("QString"));
QCOMPARE(ctor2.parameterTypes(), QList<QByteArray>() << "QString");
QCOMPARE(ctor2.parameterNames(), QList<QByteArray>() << "c");
QCOMPARE(ctor2.tag(), QByteArray("Q_FOO"));
- QVERIFY(ctor2.access() == QMetaMethod::Protected);
+ QCOMPARE(ctor2.access(), QMetaMethod::Protected);
QCOMPARE(ctor2.attributes(), 24);
QCOMPARE(ctor2.index(), 0);
@@ -536,10 +536,10 @@ void tst_QMetaObjectBuilder::constructor()
QCOMPARE(builder.constructorCount(), 2);
QCOMPARE(prototypeConstructor.signature(), QByteArray("SomethingOfEverything()"));
- QVERIFY(prototypeConstructor.methodType() == QMetaMethod::Constructor);
+ QCOMPARE(prototypeConstructor.methodType(), QMetaMethod::Constructor);
QCOMPARE(prototypeConstructor.returnType(), QByteArray());
QVERIFY(prototypeConstructor.parameterTypes().isEmpty());
- QVERIFY(prototypeConstructor.access() == QMetaMethod::Public);
+ QCOMPARE(prototypeConstructor.access(), QMetaMethod::Public);
QCOMPARE(prototypeConstructor.index(), 1);
// Check that nothing else changed.
@@ -967,13 +967,13 @@ void tst_QMetaObjectBuilder::relatedMetaObject()
// Add two related meta objects and check their attributes.
QCOMPARE(builder.addRelatedMetaObject(&QObject::staticMetaObject), 0);
QCOMPARE(builder.addRelatedMetaObject(&staticMetaObject), 1);
- QVERIFY(builder.relatedMetaObject(0) == &QObject::staticMetaObject);
- QVERIFY(builder.relatedMetaObject(1) == &staticMetaObject);
+ QCOMPARE(builder.relatedMetaObject(0), &QObject::staticMetaObject);
+ QCOMPARE(builder.relatedMetaObject(1), &staticMetaObject);
QCOMPARE(builder.relatedMetaObjectCount(), 2);
// Remove the first one and check again.
builder.removeRelatedMetaObject(0);
- QVERIFY(builder.relatedMetaObject(0) == &staticMetaObject);
+ QCOMPARE(builder.relatedMetaObject(0), &staticMetaObject);
QCOMPARE(builder.relatedMetaObjectCount(), 1);
// Check that nothing else changed.
@@ -1617,7 +1617,7 @@ void tst_QMetaObjectBuilder::usage_slot()
QVERIFY(index != -1);
QMetaMethod voidSlotInt = testObject->metaObject()->method(index);
- QVERIFY(testObject->voidSlotIntArgument() == -1);
+ QCOMPARE(testObject->voidSlotIntArgument(), -1);
QVERIFY(voidSlotInt.invoke(testObject.data(), Q_ARG(int, 123)));
QCOMPARE(testObject->voidSlotIntArgument(), 123);
}
@@ -1658,7 +1658,7 @@ void tst_QMetaObjectBuilder::usage_connect()
QVERIFY(QObject::connect(testObject.data(), SIGNAL(intPropChanged(int)),
testObject.data(), SLOT(voidSlotInt(int))));
- QVERIFY(testObject->voidSlotIntArgument() == -1);
+ QCOMPARE(testObject->voidSlotIntArgument(), -1);
testObject->setProperty("intProp", 123);
QCOMPARE(testObject->voidSlotIntArgument(), 123);
@@ -1674,7 +1674,7 @@ void tst_QMetaObjectBuilder::usage_templateConnect()
testObject.data(), &TestObject::voidSlotInt);
QVERIFY(con);
- QVERIFY(testObject->voidSlotIntArgument() == -1);
+ QCOMPARE(testObject->voidSlotIntArgument(), -1);
testObject->setProperty("intProp", 123);
QCOMPARE(testObject->voidSlotIntArgument(), 123);
diff --git a/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro b/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro
index f103abdd2b..1f338a909b 100644
--- a/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro
+++ b/tests/auto/corelib/kernel/qmetaproperty/qmetaproperty.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmetaproperty
QT = core testlib
SOURCES = tst_qmetaproperty.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmetatype/qmetatype.pro b/tests/auto/corelib/kernel/qmetatype/qmetatype.pro
index fc262b8fc7..1d4e647a4b 100644
--- a/tests/auto/corelib/kernel/qmetatype/qmetatype.pro
+++ b/tests/auto/corelib/kernel/qmetatype/qmetatype.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmetatype
QT = core testlib
INCLUDEPATH += $$PWD/../../../other/qvariant_common
diff --git a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
index 10ffa06245..1fde3d4cff 100644
--- a/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
+++ b/tests/auto/corelib/kernel/qmetatype/tst_qmetatype.cpp
@@ -193,8 +193,11 @@ protected:
Bar space[1];
space[0].~Bar();
+ const QByteArray postFix = '_'
+ + QByteArray::number(reinterpret_cast<quintptr>(QThread::currentThreadId()));
+
for (int i = 0; i < 1000; ++i) {
- const QByteArray name = QString("Bar%1_%2").arg(i).arg((size_t)QThread::currentThreadId()).toLatin1();
+ const QByteArray name = "Bar" + QByteArray::number(i) + postFix;
const char *nm = name.constData();
int tp = qRegisterMetaType<Bar>(nm);
#if defined(Q_OS_LINUX) && !defined(Q_OS_ANDROID)
@@ -2394,8 +2397,8 @@ void tst_QMetaType::compareCustomEqualOnlyType()
QVERIFY(variant50 != variant100x);
QVERIFY(variant100 != variant50);
QVERIFY(variant100x != variant50);
- QVERIFY(variant100 == variant100x);
- QVERIFY(variant100 == variant100);
+ QCOMPARE(variant100, variant100x);
+ QCOMPARE(variant100, variant100);
// compare always fails
QVERIFY(!(variant50 < variant50));
diff --git a/tests/auto/corelib/kernel/qmimedata/qmimedata.pro b/tests/auto/corelib/kernel/qmimedata/qmimedata.pro
index 51389da6ee..502ec78024 100644
--- a/tests/auto/corelib/kernel/qmimedata/qmimedata.pro
+++ b/tests/auto/corelib/kernel/qmimedata/qmimedata.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmimedata
QT += testlib
SOURCES = tst_qmimedata.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
index d368d9961b..4f88dc2a76 100644
--- a/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
+++ b/tests/auto/corelib/kernel/qmimedata/tst_qmimedata.cpp
@@ -101,7 +101,7 @@ void tst_QMimeData::data() const
// set text, verify
mimeData.setData("text/plain", "pirates");
QCOMPARE(mimeData.data("text/plain"), QByteArray("pirates"));
- QVERIFY(mimeData.data("text/html").length() == 0);
+ QCOMPARE(mimeData.data("text/html").length(), 0);
// html time
mimeData.setData("text/html", "ninjas");
diff --git a/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro b/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro
index b08dfb1838..125915047a 100644
--- a/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro
+++ b/tests/auto/corelib/kernel/qobject/signalbug/signalbug.pro
@@ -12,4 +12,3 @@ SOURCES += signalbug.cpp
# This app is testdata for tst_qobject
target.path = $$[QT_INSTALL_TESTS]/tst_qobject/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qobject/test/test.pro b/tests/auto/corelib/kernel/qobject/test/test.pro
index 0a15ae384e..e9c1537fa7 100644
--- a/tests/auto/corelib/kernel/qobject/test/test.pro
+++ b/tests/auto/corelib/kernel/qobject/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase console
-CONFIG += parallel_test
TARGET = ../tst_qobject
QT = core-private network testlib
SOURCES = ../tst_qobject.cpp
diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
index a3c6d8e9df..90f7780344 100644
--- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
+++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp
@@ -2038,57 +2038,57 @@ void tst_QObject::metamethod()
m = mobj->method(mobj->indexOfMethod("invoke1()"));
QVERIFY(m.methodSignature() == "invoke1()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("sinvoke1()"));
QVERIFY(m.methodSignature() == "sinvoke1()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY((m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("invoke2()"));
QVERIFY(m.methodSignature() == "invoke2()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Protected);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Protected);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY((m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("sinvoke2()"));
QVERIFY(m.methodSignature() == "sinvoke2()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Protected);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Protected);
QVERIFY((m.attributes() & QMetaMethod::Scriptable));
QVERIFY((m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("invoke3()"));
QVERIFY(m.methodSignature() == "invoke3()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Private);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Private);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("sinvoke3()"));
QVERIFY(m.methodSignature() == "sinvoke3()");
- QVERIFY(m.methodType() == QMetaMethod::Method);
- QVERIFY(m.access() == QMetaMethod::Private);
+ QCOMPARE(m.methodType(), QMetaMethod::Method);
+ QCOMPARE(m.access(), QMetaMethod::Private);
QVERIFY((m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("signal5()"));
QVERIFY(m.methodSignature() == "signal5()");
- QVERIFY(m.methodType() == QMetaMethod::Signal);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Signal);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY((m.attributes() & QMetaMethod::Compatibility));
m = mobj->method(mobj->indexOfMethod("aPublicSlot()"));
QVERIFY(m.methodSignature() == "aPublicSlot()");
- QVERIFY(m.methodType() == QMetaMethod::Slot);
- QVERIFY(m.access() == QMetaMethod::Public);
+ QCOMPARE(m.methodType(), QMetaMethod::Slot);
+ QCOMPARE(m.access(), QMetaMethod::Public);
QVERIFY(!(m.attributes() & QMetaMethod::Scriptable));
QVERIFY(!(m.attributes() & QMetaMethod::Compatibility));
@@ -2360,7 +2360,7 @@ void tst_QObject::testUserData()
int id = user_data_ids[i];
CustomData *data = static_cast<CustomData *>(my_test_object.userData(id));
QVERIFY(data != 0);
- QVERIFY(data->id == id);
+ QCOMPARE(data->id, id);
}
}
@@ -2902,12 +2902,12 @@ void tst_QObject::floatProperty()
QVERIFY(idx > 0);
QMetaProperty prop = obj.metaObject()->property(idx);
QVERIFY(prop.isValid());
- QVERIFY(prop.type() == uint(QMetaType::type("float")));
+ QCOMPARE(int(prop.type()), QMetaType::type("float"));
QVERIFY(!prop.write(&obj, QVariant("Hello")));
QVERIFY(prop.write(&obj, QVariant::fromValue(128.0f)));
QVariant v = prop.read(&obj);
- QVERIFY(int(v.userType()) == QMetaType::Float);
- QVERIFY(qvariant_cast<float>(v) == 128.0f);
+ QCOMPARE(v.userType(), int(QMetaType::Float));
+ QCOMPARE(qvariant_cast<float>(v), 128.0f);
}
void tst_QObject::qrealProperty()
@@ -2917,18 +2917,18 @@ void tst_QObject::qrealProperty()
QVERIFY(idx > 0);
QMetaProperty prop = obj.metaObject()->property(idx);
QVERIFY(prop.isValid());
- QVERIFY(prop.type() == uint(QMetaType::type("qreal")));
+ QCOMPARE(int(prop.type()), QMetaType::type("qreal"));
QVERIFY(!prop.write(&obj, QVariant("Hello")));
QVERIFY(prop.write(&obj, QVariant::fromValue(128.0f)));
QVariant v = prop.read(&obj);
QCOMPARE(v.userType(), qMetaTypeId<qreal>());
- QVERIFY(qvariant_cast<qreal>(v) == 128.0);
+ QCOMPARE(qvariant_cast<qreal>(v), 128.0);
QVERIFY(prop.write(&obj, QVariant::fromValue(double(127))));
v = prop.read(&obj);
QCOMPARE(v.userType(), qMetaTypeId<qreal>());
- QVERIFY(qvariant_cast<qreal>(v) == 127.0);
+ QCOMPARE(qvariant_cast<qreal>(v), 127.0);
}
class DynamicPropertyObject : public PropertyObject
@@ -2994,7 +2994,7 @@ void tst_QObject::recursiveSignalEmission()
proc.start(path);
QVERIFY2(proc.waitForStarted(), qPrintable(QString::fromLatin1("Cannot start '%1': %2").arg(path, proc.errorString())));
QVERIFY(proc.waitForFinished());
- QVERIFY(proc.exitStatus() == QProcess::NormalExit);
+ QCOMPARE(proc.exitStatus(), QProcess::NormalExit);
QCOMPARE(proc.exitCode(), 0);
#endif
}
diff --git a/tests/auto/corelib/kernel/qpointer/qpointer.pro b/tests/auto/corelib/kernel/qpointer/qpointer.pro
index 4b573cb6a5..02765efdbd 100644
--- a/tests/auto/corelib/kernel/qpointer/qpointer.pro
+++ b/tests/auto/corelib/kernel/qpointer/qpointer.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpointer
QT = core testlib
qtHaveModule(widgets): QT += widgets
SOURCES = tst_qpointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp b/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp
index 26bb70fc66..2cba521b61 100644
--- a/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp
+++ b/tests/auto/corelib/kernel/qsharedmemory/test/tst_qsharedmemory.cpp
@@ -145,7 +145,7 @@ void tst_QSharedMemory::init()
{
existingSharedMemory = new QSharedMemory(EXISTING_SHARE);
if (!existingSharedMemory->create(EXISTING_SIZE)) {
- QVERIFY(existingSharedMemory->error() == QSharedMemory::AlreadyExists);
+ QCOMPARE(existingSharedMemory->error(), QSharedMemory::AlreadyExists);
}
}
@@ -244,10 +244,10 @@ void tst_QSharedMemory::constructor()
QSharedMemory sm;
QCOMPARE(sm.key(), QString());
QVERIFY(!sm.isAttached());
- QVERIFY(sm.data() == 0);
+ QVERIFY(!sm.data());
QCOMPARE(sm.size(), 0);
QCOMPARE(sm.error(), QSharedMemory::NoError);
- QVERIFY(sm.errorString() == QString());
+ QCOMPARE(sm.errorString(), QString());
}
void tst_QSharedMemory::key_data()
@@ -288,8 +288,8 @@ void tst_QSharedMemory::key()
QCOMPARE(sm.isAttached(), false);
QCOMPARE(sm.error(), QSharedMemory::NoError);
- QVERIFY(sm.errorString() == QString());
- QVERIFY(sm.data() == 0);
+ QCOMPARE(sm.errorString(), QString());
+ QVERIFY(!sm.data());
QCOMPARE(sm.size(), 0);
QCOMPARE(sm.detach(), false);
@@ -328,11 +328,11 @@ void tst_QSharedMemory::create()
qDebug() << sm.errorString();
QCOMPARE(sm.key(), key);
if (canCreate) {
- QVERIFY(sm.errorString() == QString());
+ QCOMPARE(sm.errorString(), QString());
QVERIFY(sm.data() != 0);
QVERIFY(sm.size() != 0);
} else {
- QVERIFY(sm.data() == 0);
+ QVERIFY(!sm.data());
QVERIFY(sm.errorString() != QString());
}
}
@@ -377,10 +377,10 @@ void tst_QSharedMemory::attach()
QVERIFY(sm.size() != 0);
QVERIFY(sm.detach());
QCOMPARE(sm.size(), 0);
- QVERIFY(sm.data() == 0);
+ QVERIFY(!sm.data());
} else {
- QVERIFY(sm.data() == 0);
- QVERIFY(sm.size() == 0);
+ QVERIFY(!sm.data());
+ QCOMPARE(sm.size(), 0);
QVERIFY(sm.errorString() != QString());
QVERIFY(!sm.detach());
}
@@ -481,7 +481,7 @@ void tst_QSharedMemory::useTooMuchMemory()
bool success = true;
int count = 0;
while (success) {
- QString key = QString("maxmemorytest_%1").arg(count++);
+ QString key = QLatin1String("maxmemorytest_") + QString::number(count++);
QSharedMemory *sm = new QSharedMemory(rememberKey(key));
QVERIFY(sm);
jail.append(sm);
@@ -498,7 +498,7 @@ void tst_QSharedMemory::useTooMuchMemory()
QVERIFY(!sm->isAttached());
QCOMPARE(sm->key(), key);
QCOMPARE(sm->size(), 0);
- QVERIFY(sm->data() == 0);
+ QVERIFY(!sm->data());
if (sm->error() != QSharedMemory::OutOfResources)
qDebug() << sm->error() << sm->errorString();
// ### Linux won't return OutOfResources if there are not enough semaphores to use.
@@ -535,7 +535,7 @@ void tst_QSharedMemory::attachTooMuch()
QVERIFY(!war->isAttached());
QCOMPARE(war->key(), government.key());
QCOMPARE(war->size(), 0);
- QVERIFY(war->data() == 0);
+ QVERIFY(!war->data());
QCOMPARE(war->error(), QSharedMemory::OutOfResources);
QVERIFY(war->errorString() != QString());
QVERIFY(!war->detach());
diff --git a/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro b/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro
index c6c6f379eb..6e4913db5d 100644
--- a/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro
+++ b/tests/auto/corelib/kernel/qsignalblocker/qsignalblocker.pro
@@ -1,7 +1,5 @@
CONFIG += testcase console
-CONFIG += parallel_test
TARGET = tst_qsignalblocker
QT = core testlib
SOURCES = tst_qsignalblocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro b/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro
index 526db5eef3..418d6dce62 100644
--- a/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro
+++ b/tests/auto/corelib/kernel/qsignalmapper/qsignalmapper.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsignalmapper
QT = core testlib
SOURCES = tst_qsignalmapper.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp b/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp
index 579aa78ac4..8a5275e032 100644
--- a/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp
+++ b/tests/auto/corelib/kernel/qsignalmapper/tst_qsignalmapper.cpp
@@ -97,16 +97,16 @@ void tst_QSignalMapper::mapped()
connect(&mapper, SIGNAL(mapped(QString)), &target, SLOT(myslot(QString)));
src1.emit_mysignal(20);
- QVERIFY(target.id == 1);
+ QCOMPARE(target.id, 1);
QVERIFY(target.str.isEmpty());
src2.emit_mysignal(20);
- QVERIFY(target.id == 2);
- QVERIFY(target.str == "two");
+ QCOMPARE(target.id, 2);
+ QCOMPARE(target.str, QLatin1String("two"));
src3.emit_mysignal(20);
- QVERIFY(target.id == 2);
- QVERIFY(target.str == "three");
+ QCOMPARE(target.id, 2);
+ QCOMPARE(target.str, QLatin1String("three"));
}
QTEST_MAIN(tst_QSignalMapper)
diff --git a/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro b/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
index 303a96c68f..58e4b98af7 100644
--- a/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
+++ b/tests/auto/corelib/kernel/qsocketnotifier/qsocketnotifier.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsocketnotifier
QT = core-private network-private testlib
SOURCES = tst_qsocketnotifier.cpp
@@ -7,4 +6,3 @@ SOURCES = tst_qsocketnotifier.cpp
requires(contains(QT_CONFIG,private_tests))
include(../../../network/socket/platformsocketengine/platformsocketengine.pri)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
index f49da1f5a8..30ce65849d 100644
--- a/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
+++ b/tests/auto/corelib/kernel/qsocketnotifier/tst_qsocketnotifier.cpp
@@ -151,7 +151,7 @@ void tst_QSocketNotifier::unexpectedDisconnection()
readEnd1.initialize(QAbstractSocket::TcpSocket);
readEnd1.connectToHost(server.serverAddress(), server.serverPort());
QVERIFY(readEnd1.waitForWrite());
- QVERIFY(readEnd1.state() == QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd1.state(), QAbstractSocket::ConnectedState);
QVERIFY(server.waitForNewConnection());
QTcpSocket *writeEnd1 = server.nextPendingConnection();
QVERIFY(writeEnd1 != 0);
@@ -160,7 +160,7 @@ void tst_QSocketNotifier::unexpectedDisconnection()
readEnd2.initialize(QAbstractSocket::TcpSocket);
readEnd2.connectToHost(server.serverAddress(), server.serverPort());
QVERIFY(readEnd2.waitForWrite());
- QVERIFY(readEnd2.state() == QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd2.state(), QAbstractSocket::ConnectedState);
QVERIFY(server.waitForNewConnection());
QTcpSocket *writeEnd2 = server.nextPendingConnection();
QVERIFY(writeEnd2 != 0);
@@ -186,8 +186,8 @@ void tst_QSocketNotifier::unexpectedDisconnection()
QVERIFY(timer.isActive()); //escape if test would hang
} while(tester.sequence <= 0);
- QVERIFY(readEnd1.state() == QAbstractSocket::ConnectedState);
- QVERIFY(readEnd2.state() == QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd1.state(), QAbstractSocket::ConnectedState);
+ QCOMPARE(readEnd2.state(), QAbstractSocket::ConnectedState);
QCOMPARE(tester.sequence, 2);
diff --git a/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp b/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp
index 169a13aff2..0c0fdb8067 100644
--- a/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp
+++ b/tests/auto/corelib/kernel/qsystemsemaphore/test/tst_qsystemsemaphore.cpp
@@ -191,13 +191,13 @@ void tst_QSystemSemaphore::basicProcesses()
acquire.start(m_helperBinary, QStringList("acquire"));
QVERIFY2(acquire.waitForStarted(), "Could not start helper binary");
acquire.waitForFinished(HELPERWAITTIME);
- QVERIFY(acquire.state() == QProcess::Running);
+ QCOMPARE(acquire.state(), QProcess::Running);
acquire.kill();
release.start(m_helperBinary, QStringList("release"));
QVERIFY2(release.waitForStarted(), "Could not start helper binary");
acquire.waitForFinished(HELPERWAITTIME);
release.waitForFinished(HELPERWAITTIME);
- QVERIFY(acquire.state() == QProcess::NotRunning);
+ QCOMPARE(acquire.state(), QProcess::NotRunning);
#endif
}
diff --git a/tests/auto/corelib/kernel/qtimer/qtimer.pro b/tests/auto/corelib/kernel/qtimer/qtimer.pro
index 48adf07f64..8afdbb148e 100644
--- a/tests/auto/corelib/kernel/qtimer/qtimer.pro
+++ b/tests/auto/corelib/kernel/qtimer/qtimer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtimer
QT = core testlib
SOURCES = tst_qtimer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
index b34a3a6beb..c17d81ea9e 100644
--- a/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
+++ b/tests/auto/corelib/kernel/qtimer/tst_qtimer.cpp
@@ -529,7 +529,7 @@ void tst_QTimer::restartedTimerFiresTooSoon()
{
RestartedTimerFiresTooSoonObject object;
object.timerFired();
- QVERIFY(object.eventLoop.exec() == 0);
+ QCOMPARE(object.eventLoop.exec(), 0);
}
class LongLastingSlotClass : public QObject
diff --git a/tests/auto/corelib/kernel/qtranslator/qtranslator.pro b/tests/auto/corelib/kernel/qtranslator/qtranslator.pro
index e588f44370..b7a5a85e09 100644
--- a/tests/auto/corelib/kernel/qtranslator/qtranslator.pro
+++ b/tests/auto/corelib/kernel/qtranslator/qtranslator.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtranslator
QT = core testlib
SOURCES = tst_qtranslator.cpp
diff --git a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
index 2707b6df41..5e967207d4 100644
--- a/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
+++ b/tests/auto/corelib/kernel/qtranslator/tst_qtranslator.cpp
@@ -107,7 +107,7 @@ void tst_QTranslator::load()
QTranslator tor( 0 );
tor.load("hellotr_la");
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
void tst_QTranslator::load2()
@@ -118,7 +118,7 @@ void tst_QTranslator::load2()
QByteArray data = file.readAll();
tor.load((const uchar *)data.constData(), data.length());
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
class TranslatorThread : public QThread
@@ -129,7 +129,7 @@ class TranslatorThread : public QThread
if (tor.isEmpty())
qFatal("Could not load translation");
- if (tor.translate("QPushButton", "Hello world!") != QString::fromLatin1("Hallo Welt!"))
+ if (tor.translate("QPushButton", "Hello world!") != QLatin1String("Hallo Welt!"))
qFatal("Test string was not translated correctlys");
}
};
@@ -212,9 +212,9 @@ void tst_QTranslator::plural()
tor.load("hellotr_la");
QVERIFY(!tor.isEmpty());
QCoreApplication::installTranslator(&tor);
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QString::fromLatin1("Hallo 0 Welten!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QString::fromLatin1("Hallo 1 Welt!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QString::fromLatin1("Hallo 2 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QLatin1String("Hallo 0 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QLatin1String("Hallo 1 Welt!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QLatin1String("Hallo 2 Welten!"));
}
void tst_QTranslator::translate_qm_file_generated_with_msgfmt()
@@ -240,7 +240,7 @@ void tst_QTranslator::loadFromResource()
QTranslator tor;
tor.load(":/tst_qtranslator/hellotr_la.qm");
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
void tst_QTranslator::loadDirectory()
@@ -260,16 +260,16 @@ void tst_QTranslator::dependencies()
QTranslator tor;
tor.load("dependencies_la");
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
// plural
QCoreApplication::installTranslator(&tor);
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QString::fromLatin1("Hallo 0 Welten!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QString::fromLatin1("Hallo 1 Welt!"));
- QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QString::fromLatin1("Hallo 2 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 0), QLatin1String("Hallo 0 Welten!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 1), QLatin1String("Hallo 1 Welt!"));
+ QCOMPARE(QCoreApplication::translate("QPushButton", "Hello %n world(s)!", 0, 2), QLatin1String("Hallo 2 Welten!"));
// pick up translation from the file with dependencies
- QCOMPARE(tor.translate("QPushButton", "It's a small world"), QString::fromLatin1("Es ist eine kleine Welt"));
+ QCOMPARE(tor.translate("QPushButton", "It's a small world"), QLatin1String("Es ist eine kleine Welt"));
}
{
@@ -279,7 +279,7 @@ void tst_QTranslator::dependencies()
QByteArray data = file.readAll();
tor.load((const uchar *)data.constData(), data.length());
QVERIFY(!tor.isEmpty());
- QCOMPARE(tor.translate("QPushButton", "Hello world!"), QString::fromLatin1("Hallo Welt!"));
+ QCOMPARE(tor.translate("QPushButton", "Hello world!"), QLatin1String("Hallo Welt!"));
}
}
diff --git a/tests/auto/corelib/kernel/qvariant/qvariant.pro b/tests/auto/corelib/kernel/qvariant/qvariant.pro
index 39178ba9e6..a2dda809ad 100644
--- a/tests/auto/corelib/kernel/qvariant/qvariant.pro
+++ b/tests/auto/corelib/kernel/qvariant/qvariant.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qvariant
QT = core testlib
INCLUDEPATH += $$PWD/../../../other/qvariant_common
diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
index 6da8f55e61..de53ab1fa3 100644
--- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
+++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp
@@ -351,13 +351,13 @@ void tst_QVariant::constructor_invalid()
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("^Trying to construct an instance of an invalid type, type id:"));
QVariant variant(static_cast<QVariant::Type>(typeId));
QVERIFY(!variant.isValid());
- QVERIFY(variant.userType() == QMetaType::UnknownType);
+ QCOMPARE(variant.userType(), int(QMetaType::UnknownType));
}
{
QTest::ignoreMessage(QtWarningMsg, QRegularExpression("^Trying to construct an instance of an invalid type, type id:"));
QVariant variant(typeId, /* copy */ 0);
QVERIFY(!variant.isValid());
- QVERIFY(variant.userType() == QMetaType::UnknownType);
+ QCOMPARE(variant.userType(), int(QMetaType::UnknownType));
}
}
@@ -901,7 +901,7 @@ void tst_QVariant::toFloat()
bool ok;
float d = value.toFloat(&ok);
QCOMPARE(d, result);
- QVERIFY(ok == valueOK);
+ QCOMPARE(ok, valueOK);
}
void tst_QVariant::toLongLong_data()
@@ -1323,9 +1323,9 @@ void tst_QVariant::writeToReadFromDataStream()
// the uninitialized float can be NaN (observed on Windows Mobile 5 ARMv4i)
float readFloat = qvariant_cast<float>(readVariant);
float writtenFloat = qvariant_cast<float>(writeVariant);
- QVERIFY(qIsNaN(readFloat) == qIsNaN(writtenFloat));
+ QCOMPARE(qIsNaN(readFloat), qIsNaN(writtenFloat));
if (!qIsNaN(readFloat))
- QVERIFY(readFloat == writtenFloat);
+ QCOMPARE(readFloat, writtenFloat);
}
break;
}
@@ -2115,7 +2115,7 @@ void tst_QVariant::userType()
QVERIFY(!userVar.canConvert(QVariant::String));
QVariant userVar2(userVar);
- QVERIFY(userVar == userVar2);
+ QCOMPARE(userVar, userVar2);
userVar2.setValue(data2);
QVERIFY(userVar != userVar2);
@@ -2129,7 +2129,7 @@ void tst_QVariant::userType()
userVar3.setValue(data2);
userVar3 = userVar2;
- QVERIFY(userVar2 == userVar3);
+ QCOMPARE(userVar2, userVar3);
}
// At this point all QVariants got destroyed but we have 2 MyType instances.
QCOMPARE(instanceCount, 2);
@@ -2144,7 +2144,7 @@ void tst_QVariant::userType()
QVERIFY(!userVar.canConvert(QVariant::String));
QVariant userVar2(userVar);
- QVERIFY(userVar == userVar2);
+ QCOMPARE(userVar, userVar2);
userVar2.setValue(&data2);
QVERIFY(userVar != userVar2);
@@ -2158,10 +2158,10 @@ void tst_QVariant::userType()
/* This check is correct now. userVar2 contains a pointer to data2 and so
* does userVar3. */
- QVERIFY(userVar2 == userVar3);
+ QCOMPARE(userVar2, userVar3);
userVar3 = userVar2;
- QVERIFY(userVar2 == userVar3);
+ QCOMPARE(userVar2, userVar3);
}
QCOMPARE(instanceCount, 2);
@@ -2446,7 +2446,7 @@ void tst_QVariant::saveLoadCustomTypes()
qRegisterMetaTypeStreamOperators<Blah>("Blah");
QCOMPARE(v.userType(), tp);
- QVERIFY(v.type() == QVariant::UserType);
+ QCOMPARE(v.type(), QVariant::UserType);
{
QDataStream stream(&data, QIODevice::WriteOnly);
stream << v;
@@ -2610,7 +2610,7 @@ void tst_QVariant::qvariant_cast_QObject_derived()
{
CustomQObjectDerivedNoMetaType *object = new CustomQObjectDerivedNoMetaType(this);
QVariant data = QVariant::fromValue(object);
- QVERIFY(data.userType() == qMetaTypeId<CustomQObjectDerivedNoMetaType*>());
+ QCOMPARE(data.userType(), qMetaTypeId<CustomQObjectDerivedNoMetaType*>());
QCOMPARE(data.value<QObject *>(), object);
QCOMPARE(data.value<CustomQObjectDerivedNoMetaType *>(), object);
QCOMPARE(data.value<CustomQObject *>(), object);
@@ -2619,7 +2619,7 @@ void tst_QVariant::qvariant_cast_QObject_derived()
CustomQObjectDerived *object = new CustomQObjectDerived(this);
QVariant data = QVariant::fromValue(object);
- QVERIFY(data.userType() == qMetaTypeId<CustomQObjectDerived*>());
+ QCOMPARE(data.userType(), qMetaTypeId<CustomQObjectDerived*>());
QCOMPARE(data.value<QObject *>(), object);
QCOMPARE(data.value<CustomQObjectDerived *>(), object);
@@ -2886,10 +2886,10 @@ void tst_QVariant::voidStar() const
QVariant v1, v2;
v1 = QVariant::fromValue(p1);
v2 = v1;
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
v2 = QVariant::fromValue(p2);
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
p2 = 0;
v2 = QVariant::fromValue(p2);
@@ -2906,10 +2906,10 @@ void tst_QVariant::dataStar() const
QCOMPARE(qvariant_cast<Data*>(v1), p1);
QVariant v2 = v1;
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
v2 = QVariant::fromValue(p1);
- QVERIFY(v1 == v2);
+ QCOMPARE(v1, v2);
delete p1;
}
@@ -3081,8 +3081,8 @@ void tst_QVariant::compareCustomTypes() const
/* We compare pointers. */
QVERIFY(variant1 != variant2);
- QVERIFY(variant1 == variant1);
- QVERIFY(variant2 == variant2);
+ QCOMPARE(variant1, variant1);
+ QCOMPARE(variant2, variant2);
}
void tst_QVariant::timeToDateTime() const
@@ -3289,7 +3289,7 @@ void tst_QVariant::toIntFromQString() const
void tst_QVariant::toIntFromDouble() const
{
double d = 2147483630; // max int 2147483647
- QVERIFY((int)d == 2147483630);
+ QCOMPARE((int)d, 2147483630);
QVariant var(d);
QVERIFY( var.canConvert( QVariant::Int ) );
@@ -4119,7 +4119,7 @@ void tst_QVariant::saveInvalid()
QDataStream stream(&data, QIODevice::WriteOnly);
stream.setVersion(version);
stream << QVariant();
- QVERIFY(stream.status() == QDataStream::Ok);
+ QCOMPARE(stream.status(), QDataStream::Ok);
QVERIFY(data.size() >= 4);
QCOMPARE(int(data.constData()[0]), 0);
QCOMPARE(int(data.constData()[1]), 0);
@@ -4133,7 +4133,7 @@ void tst_QVariant::saveNewBuiltinWithOldStream()
QDataStream stream(&data, QIODevice::WriteOnly);
stream.setVersion(QDataStream::Qt_3_1);
stream << QVariant::fromValue<QJsonValue>(123); // QJsonValue class was introduced in Qt5
- QVERIFY(stream.status() == QDataStream::Ok);
+ QCOMPARE(stream.status(), QDataStream::Ok);
QVERIFY(data.size() >= 4);
QCOMPARE(int(data.constData()[0]), 0);
QCOMPARE(int(data.constData()[1]), 0);
diff --git a/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro b/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro
index f0ac7c621f..20ec7572fb 100644
--- a/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro
+++ b/tests/auto/corelib/kernel/qwineventnotifier/qwineventnotifier.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qwineventnotifier
QT = core-private testlib
SOURCES = tst_qwineventnotifier.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
index d0b834824a..e661ff8412 100644
--- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-cache/qmimedatabase-cache.pro
@@ -10,6 +10,5 @@ RESOURCES += $$QT_SOURCE_TREE/src/corelib/mimetypes/mimetypes.qrc
RESOURCES += ../testdata.qrc
*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Wshadow -Wno-long-long -Wnon-virtual-dtor
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
unix:!mac:!qnx: DEFINES += USE_XDG_DATA_DIRS
diff --git a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
index 4add6c2bcd..160f359116 100644
--- a/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
+++ b/tests/auto/corelib/mimetypes/qmimedatabase/qmimedatabase-xml/qmimedatabase-xml.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmimedatabase-xml
@@ -11,6 +11,5 @@ RESOURCES += $$QT_SOURCE_TREE/src/corelib/mimetypes/mimetypes.qrc
RESOURCES += ../testdata.qrc
*-g++*:QMAKE_CXXFLAGS += -W -Wall -Wextra -Wshadow -Wno-long-long -Wnon-virtual-dtor
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
unix:!mac:!qnx: DEFINES += USE_XDG_DATA_DIRS
diff --git a/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro b/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
index f76a4ab951..1540e75c28 100644
--- a/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
+++ b/tests/auto/corelib/mimetypes/qmimetype/qmimetype.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmimetype
QT = core-private testlib
SOURCES = tst_qmimetype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/plugin.pro b/tests/auto/corelib/plugin/plugin.pro
index 506f6abaeb..e6b748e4f4 100644
--- a/tests/auto/corelib/plugin/plugin.pro
+++ b/tests/auto/corelib/plugin/plugin.pro
@@ -1,7 +1,10 @@
TEMPLATE=subdirs
SUBDIRS=\
qfactoryloader \
- qlibrary \
- qplugin \
- qpluginloader \
quuid
+
+load(qfeatures)
+!contains(QT_DISABLED_FEATURES, library): SUBDIRS += \
+ qpluginloader \
+ qplugin \
+ qlibrary
diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
index 2496cd2f1e..b7a641959a 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/plugin1/plugin1.pro
@@ -9,4 +9,3 @@ DESTDIR = ../bin
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
index e70ed4fb25..b536aff486 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/plugin2/plugin2.pro
@@ -9,4 +9,3 @@ DESTDIR = ../bin
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qfactoryloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro b/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro
index 42bc01e2ed..ace9fe8fd0 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/qfactoryloader.pro
@@ -12,4 +12,3 @@ TARGET = tst_qpluginloader
INSTALLS =
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
index d8dfaac29e..f1e76c31bf 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
+++ b/tests/auto/corelib/plugin/qfactoryloader/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = ../tst_qfactoryloader
QT = core-private testlib
@@ -19,4 +18,8 @@ win32 {
}
mac: CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+
+load(qfeatures)
+contains(QT_DISABLED_FEATURES, library) {
+ LIBS += -L ../bin/ -lplugin1 -lplugin2
+}
diff --git a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp
index 474f4e9868..92a4dda252 100644
--- a/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp
+++ b/tests/auto/corelib/plugin/qfactoryloader/tst_qfactoryloader.cpp
@@ -38,6 +38,11 @@
#include "plugin1/plugininterface1.h"
#include "plugin2/plugininterface2.h"
+#ifdef QT_NO_LIBRARY
+Q_IMPORT_PLUGIN(Plugin1)
+Q_IMPORT_PLUGIN(Plugin2)
+#endif
+
class tst_QFactoryLoader : public QObject
{
Q_OBJECT
@@ -54,8 +59,9 @@ void tst_QFactoryLoader::initTestCase()
{
const QString binFolder = QFINDTESTDATA(binFolderC);
QVERIFY2(!binFolder.isEmpty(), "Unable to locate 'bin' folder");
-
+#ifndef QT_NO_LIBRARY
QCoreApplication::setLibraryPaths(QStringList(QFileInfo(binFolder).absolutePath()));
+#endif
}
void tst_QFactoryLoader::usingTwoFactoriesFromSameDir()
diff --git a/tests/auto/corelib/plugin/qlibrary/lib/lib.pro b/tests/auto/corelib/plugin/qlibrary/lib/lib.pro
index 195e48da93..44bd0be14e 100644
--- a/tests/auto/corelib/plugin/qlibrary/lib/lib.pro
+++ b/tests/auto/corelib/plugin/qlibrary/lib/lib.pro
@@ -20,4 +20,3 @@ win32 {
DESTDIR = ../release/
}
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro b/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro
index 52dd8b9679..d55747501c 100644
--- a/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro
+++ b/tests/auto/corelib/plugin/qlibrary/lib2/lib2.pro
@@ -46,4 +46,3 @@ renamed_target.extra = $$member(renamed_target.extra, 0, -2)
QMAKE_POST_LINK = $$member(QMAKE_POST_LINK, 0, -2)
INSTALLS += target renamed_target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qlibrary/qlibrary.pro b/tests/auto/corelib/plugin/qlibrary/qlibrary.pro
index 5bdf780fc0..ec58838e71 100644
--- a/tests/auto/corelib/plugin/qlibrary/qlibrary.pro
+++ b/tests/auto/corelib/plugin/qlibrary/qlibrary.pro
@@ -9,4 +9,3 @@ TARGET = tst_qlibrary
# no special install rule for subdir
INSTALLS =
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qlibrary/tst/tst.pro b/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
index 27433d59c0..d59cd738bf 100644
--- a/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
+++ b/tests/auto/corelib/plugin/qlibrary/tst/tst.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle
TARGET = ../tst_qlibrary
QT = core testlib
@@ -14,4 +13,3 @@ win32 {
}
TESTDATA += ../library_path/invalid.so
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp b/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
index f31a7af6dd..8ac4125145 100644
--- a/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
+++ b/tests/auto/corelib/plugin/qlibrary/tst_qlibrary.cpp
@@ -96,7 +96,7 @@
static QString sys_qualifiedLibraryName(const QString &fileName)
{
QString appDir = QCoreApplication::applicationDirPath();
- return appDir + "/" + PREFIX + fileName + SUFFIX;
+ return appDir + QLatin1Char('/') + PREFIX + fileName + SUFFIX;
}
QT_FORWARD_DECLARE_CLASS(QLibrary)
diff --git a/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro b/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro
index a4db0eccf6..ca47df22bd 100644
--- a/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/debugplugin/debugplugin.pro
@@ -4,4 +4,3 @@ CONFIG -= release debug_and_release
SOURCES = main.cpp
QT = core
DESTDIR = ../plugins
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qplugin/qplugin.pro b/tests/auto/corelib/plugin/qplugin/qplugin.pro
index e8840a0fb2..918ffb44bd 100644
--- a/tests/auto/corelib/plugin/qplugin/qplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/qplugin.pro
@@ -25,4 +25,3 @@ mac {
SUBDIRS += tst_qplugin.pro
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro b/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro
index 0f698312bd..b7dea67894 100644
--- a/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/releaseplugin/releaseplugin.pro
@@ -4,4 +4,3 @@ CONFIG -= debug debug_and_release
SOURCES = main.cpp
QT = core
DESTDIR = ../plugins
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro b/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro
index d1ffff9c4e..8c6540fe87 100644
--- a/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro
+++ b/tests/auto/corelib/plugin/qplugin/tst_qplugin.pro
@@ -1,8 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qplugin
QT = core testlib
SOURCES = tst_qplugin.cpp
TESTDATA += plugins/*
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro b/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro
index 70ab54a964..abfc70883e 100644
--- a/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/almostplugin/almostplugin.pro
@@ -10,4 +10,3 @@ QT = core
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qpluginloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro b/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro
index c74a00e9a6..bd6f19cb4f 100644
--- a/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/lib/lib.pro
@@ -11,4 +11,3 @@ win32-msvc: DEFINES += WIN32_MSVC
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qpluginloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro b/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro
index 5c6c56e389..83d00f7cd8 100644
--- a/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/qpluginloader.pro
@@ -12,4 +12,3 @@ TARGET = tst_qpluginloader
INSTALLS =
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro b/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro
index 2ea9c27cc9..6ec4a8de05 100644
--- a/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/theplugin/theplugin.pro
@@ -11,4 +11,3 @@ QT = core
# This is testdata for the tst_qpluginloader test.
target.path = $$[QT_INSTALL_TESTS]/tst_qpluginloader/bin
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro b/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
index 3894c90ae3..101392927c 100644
--- a/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
+++ b/tests/auto/corelib/plugin/qpluginloader/tst/tst.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = ../tst_qpluginloader
QT = core testlib
contains(QT_CONFIG, private_tests): QT += core-private
@@ -16,4 +15,3 @@ win32 {
}
TESTDATA += ../elftest ../machtest
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
index 72bd38d116..9640c52623 100644
--- a/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
+++ b/tests/auto/corelib/plugin/qpluginloader/tst_qpluginloader.cpp
@@ -95,7 +95,8 @@
static QString sys_qualifiedLibraryName(const QString &fileName)
{
- QString libname = QFINDTESTDATA(QString("bin/%1%2%3").arg(PREFIX).arg(fileName).arg(SUFFIX));
+ QString name = QLatin1String("bin/") + QLatin1String(PREFIX) + fileName + QLatin1String(SUFFIX);
+ const QString libname = QFINDTESTDATA(name);
QFileInfo fi(libname);
if (fi.exists())
return fi.canonicalFilePath();
@@ -386,7 +387,8 @@ void tst_QPluginLoader::loadMachO()
void tst_QPluginLoader::loadGarbage()
{
for (int i=0; i<5; i++) {
- QPluginLoader lib(QFINDTESTDATA(QString("elftest/garbage%1.so").arg(i+1)));
+ const QString name = QLatin1String("elftest/garbage") + QString::number(i + 1) + QLatin1String(".so");
+ QPluginLoader lib(QFINDTESTDATA(name));
QCOMPARE(lib.load(), false);
QVERIFY(lib.errorString() != QString("Unknown error"));
}
diff --git a/tests/auto/corelib/plugin/quuid/quuid.pro b/tests/auto/corelib/plugin/quuid/quuid.pro
index 461956f313..25e24561ae 100644
--- a/tests/auto/corelib/plugin/quuid/quuid.pro
+++ b/tests/auto/corelib/plugin/quuid/quuid.pro
@@ -4,4 +4,3 @@ SUBDIRS = testProcessUniqueness
SUBDIRS += test
-CONFIG += parallel_test
diff --git a/tests/auto/corelib/plugin/quuid/test/test.pro b/tests/auto/corelib/plugin/quuid/test/test.pro
index c8312c0985..0f6f915814 100644
--- a/tests/auto/corelib/plugin/quuid/test/test.pro
+++ b/tests/auto/corelib/plugin/quuid/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_quuid
QT = core testlib
SOURCES = ../tst_quuid.cpp
@@ -13,4 +12,3 @@ CONFIG(debug_and_release_target) {
} else {
DESTDIR = ..
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro b/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro
index b2f7aaf2d3..5ee7b1a21f 100644
--- a/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro
+++ b/tests/auto/corelib/plugin/quuid/testProcessUniqueness/testProcessUniqueness.pro
@@ -7,4 +7,3 @@ DESTDIR = ./
# This app is testdata for tst_quuid
target.path = $$[QT_INSTALL_TESTS]/tst_quuid/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/plugin/quuid/tst_quuid.cpp b/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
index f31aed6976..e40f3416aa 100644
--- a/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
+++ b/tests/auto/corelib/plugin/quuid/tst_quuid.cpp
@@ -223,11 +223,11 @@ void tst_QUuid::equal()
QVERIFY( !(uuidA == uuidB) );
QUuid copy(uuidA);
- QVERIFY(uuidA == copy);
+ QCOMPARE(uuidA, copy);
QUuid assigned;
assigned = uuidA;
- QVERIFY(uuidA == assigned);
+ QCOMPARE(uuidA, assigned);
}
diff --git a/tests/auto/corelib/statemachine/qstate/qstate.pro b/tests/auto/corelib/statemachine/qstate/qstate.pro
index 22e57d5615..e2251ded9d 100644
--- a/tests/auto/corelib/statemachine/qstate/qstate.pro
+++ b/tests/auto/corelib/statemachine/qstate/qstate.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstate
QT = core testlib
SOURCES = tst_qstate.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro b/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro
index f6fbbc83c6..4f16b2a9ca 100644
--- a/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro
+++ b/tests/auto/corelib/statemachine/qstatemachine/qstatemachine.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstatemachine
QT = core-private testlib
qtHaveModule(widgets): QT += widgets
SOURCES = tst_qstatemachine.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
index cfbb88a123..1ae4057049 100644
--- a/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
+++ b/tests/auto/corelib/statemachine/qstatemachine/tst_qstatemachine.cpp
@@ -3036,7 +3036,7 @@ void tst_QStateMachine::graphicsSceneEventTransitions()
QVERIFY(runningSpy.isValid());
machine.start();
QTRY_COMPARE(startedSpy.count(), 1);
- QVERIFY(finishedSpy.count() == 0);
+ QCOMPARE(finishedSpy.count(), 0);
TEST_RUNNING_CHANGED(true);
QGraphicsSceneMouseEvent mouseEvent(QEvent::GraphicsSceneMouseMove);
scene.sendEvent(textItem, &mouseEvent);
@@ -6158,26 +6158,26 @@ void tst_QStateMachine::childModeConstructor()
{
QStateMachine machine(QState::ExclusiveStates);
QCOMPARE(machine.childMode(), QState::ExclusiveStates);
- QVERIFY(machine.parent() == 0);
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parent());
+ QVERIFY(!machine.parentState());
}
{
QStateMachine machine(QState::ParallelStates);
QCOMPARE(machine.childMode(), QState::ParallelStates);
- QVERIFY(machine.parent() == 0);
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parent());
+ QVERIFY(!machine.parentState());
}
{
QStateMachine machine(QState::ExclusiveStates, this);
QCOMPARE(machine.childMode(), QState::ExclusiveStates);
QCOMPARE(machine.parent(), static_cast<QObject *>(this));
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parentState());
}
{
QStateMachine machine(QState::ParallelStates, this);
QCOMPARE(machine.childMode(), QState::ParallelStates);
QCOMPARE(machine.parent(), static_cast<QObject *>(this));
- QVERIFY(machine.parentState() == 0);
+ QVERIFY(!machine.parentState());
}
QState state;
{
diff --git a/tests/auto/corelib/thread/qatomicint/qatomicint.pro b/tests/auto/corelib/thread/qatomicint/qatomicint.pro
index 1a3f7cc926..89ac465e81 100644
--- a/tests/auto/corelib/thread/qatomicint/qatomicint.pro
+++ b/tests/auto/corelib/thread/qatomicint/qatomicint.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qatomicint
QT = core testlib
SOURCES = tst_qatomicint.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri
index e80e71f238..29e9464a4d 100644
--- a/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri
+++ b/tests/auto/corelib/thread/qatomicinteger/qatomicinteger.pri
@@ -13,7 +13,7 @@ equals(FORCE, no-cxx11) {
suffix = $$TYPE
}
-CONFIG += testcase parallel_test
+CONFIG += testcase
QT = core testlib
TARGET = tst_qatomicinteger_$$lower($$suffix)
SOURCES = $$PWD/tst_qatomicinteger.cpp
diff --git a/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro b/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro
index 8468496d9c..cce822da6e 100644
--- a/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro
+++ b/tests/auto/corelib/thread/qatomicpointer/qatomicpointer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qatomicpointer
QT = core testlib
SOURCES = tst_qatomicpointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp b/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp
index dbc239a3f9..392c4be1c6 100644
--- a/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp
+++ b/tests/auto/corelib/thread/qatomicpointer/tst_qatomicpointer.cpp
@@ -123,15 +123,15 @@ void tst_QAtomicPointer::constructor()
{
void *one = this;
QAtomicPointer<void> atomic1 = one;
- QVERIFY(atomic1.load() == one);
+ QCOMPARE(atomic1.load(), one);
void *two = &one;
QAtomicPointer<void> atomic2 = two;
- QVERIFY(atomic2.load() == two);
+ QCOMPARE(atomic2.load(), two);
void *three = &two;
QAtomicPointer<void> atomic3 = three;
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
}
void tst_QAtomicPointer::copy_constructor()
@@ -139,19 +139,19 @@ void tst_QAtomicPointer::copy_constructor()
void *one = this;
QAtomicPointer<void> atomic1 = one;
QAtomicPointer<void> atomic1_copy = atomic1;
- QVERIFY(atomic1_copy.load() == one);
+ QCOMPARE(atomic1_copy.load(), one);
QCOMPARE(atomic1_copy.load(), atomic1.load());
void *two = &one;
QAtomicPointer<void> atomic2 = two;
QAtomicPointer<void> atomic2_copy = atomic2;
- QVERIFY(atomic2_copy.load() == two);
+ QCOMPARE(atomic2_copy.load(), two);
QCOMPARE(atomic2_copy.load(), atomic2.load());
void *three = &two;
QAtomicPointer<void> atomic3 = three;
QAtomicPointer<void> atomic3_copy = atomic3;
- QVERIFY(atomic3_copy.load() == three);
+ QCOMPARE(atomic3_copy.load(), three);
QCOMPARE(atomic3_copy.load(), atomic3.load());
}
@@ -165,17 +165,17 @@ void tst_QAtomicPointer::assignment_operator()
QAtomicPointer<void> atomic2 = two;
QAtomicPointer<void> atomic3 = three;
- QVERIFY(atomic1.load() == one);
- QVERIFY(atomic2.load() == two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic1.load(), one);
+ QCOMPARE(atomic2.load(), two);
+ QCOMPARE(atomic3.load(), three);
atomic1 = two;
atomic2 = three;
atomic3 = one;
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
void tst_QAtomicPointer::isTestAndSetNative()
@@ -240,15 +240,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetRelaxed(one, two));
QVERIFY(atomic2.testAndSetRelaxed(two, three));
QVERIFY(atomic3.testAndSetRelaxed(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -258,15 +258,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetAcquire(one, two));
QVERIFY(atomic2.testAndSetAcquire(two, three));
QVERIFY(atomic3.testAndSetAcquire(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -276,15 +276,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetRelease(one, two));
QVERIFY(atomic2.testAndSetRelease(two, three));
QVERIFY(atomic3.testAndSetRelease(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -294,15 +294,15 @@ void tst_QAtomicPointer::testAndSet()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QVERIFY(atomic1.testAndSetOrdered(one, two));
QVERIFY(atomic2.testAndSetOrdered(two, three));
QVERIFY(atomic3.testAndSetOrdered(three, one));
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
}
@@ -368,15 +368,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreRelaxed(two), one);
QCOMPARE(atomic2.fetchAndStoreRelaxed(three), two);
QCOMPARE(atomic3.fetchAndStoreRelaxed(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -386,15 +386,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreAcquire(two), one);
QCOMPARE(atomic2.fetchAndStoreAcquire(three), two);
QCOMPARE(atomic3.fetchAndStoreAcquire(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -404,15 +404,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreRelease(two), one);
QCOMPARE(atomic2.fetchAndStoreRelease(three), two);
QCOMPARE(atomic3.fetchAndStoreRelease(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
{
@@ -422,15 +422,15 @@ void tst_QAtomicPointer::fetchAndStore()
QCOMPARE(atomic1.load(), one);
QCOMPARE(atomic2.load(), two);
- QVERIFY(atomic3.load() == three);
+ QCOMPARE(atomic3.load(), three);
QCOMPARE(atomic1.fetchAndStoreOrdered(two), one);
QCOMPARE(atomic2.fetchAndStoreOrdered(three), two);
QCOMPARE(atomic3.fetchAndStoreOrdered(one), three);
- QVERIFY(atomic1.load() == two);
- QVERIFY(atomic2.load() == three);
- QVERIFY(atomic3.load() == one);
+ QCOMPARE(atomic1.load(), two);
+ QCOMPARE(atomic2.load(), three);
+ QCOMPARE(atomic3.load(), one);
}
}
diff --git a/tests/auto/corelib/thread/qfuture/qfuture.pro b/tests/auto/corelib/thread/qfuture/qfuture.pro
index 36853de2f0..ed9e189668 100644
--- a/tests/auto/corelib/thread/qfuture/qfuture.pro
+++ b/tests/auto/corelib/thread/qfuture/qfuture.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfuture
QT = core core-private testlib concurrent
SOURCES = tst_qfuture.cpp
DEFINES += QT_STRICT_ITERATORS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
index ad690a094b..e9db99f3cd 100644
--- a/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
+++ b/tests/auto/corelib/thread/qfuture/tst_qfuture.cpp
@@ -84,9 +84,9 @@ void tst_QFuture::resultStore()
{
QtPrivate::ResultStore<int> store;
- QVERIFY(store.begin() == store.end());
- QVERIFY(store.resultAt(0) == store.end());
- QVERIFY(store.resultAt(1) == store.end());
+ QCOMPARE(store.begin(), store.end());
+ QCOMPARE(store.resultAt(0), store.end());
+ QCOMPARE(store.resultAt(1), store.end());
}
@@ -118,7 +118,7 @@ void tst_QFuture::resultStore()
store.addResults(-1, &vec1, 2, 2);
QtPrivate::ResultIteratorBase it = store.begin();
QCOMPARE(it.resultIndex(), 0);
- QVERIFY(it == store.begin());
+ QCOMPARE(it, store.begin());
QVERIFY(it != store.end());
++it;
@@ -133,7 +133,7 @@ void tst_QFuture::resultStore()
QCOMPARE(it.resultIndex(), 3);
++it;
- QVERIFY(it == store.end());
+ QCOMPARE(it, store.end());
}
{
QtPrivate::ResultStoreBase store;
@@ -1012,14 +1012,14 @@ void tst_QFuture::iterators()
QFuture<int>::const_iterator i1 = f.begin(), i2 = i1 + 1;
QFuture<int>::const_iterator c1 = i1, c2 = c1 + 1;
- QVERIFY(i1 == i1);
- QVERIFY(i1 == c1);
- QVERIFY(c1 == i1);
- QVERIFY(c1 == c1);
- QVERIFY(i2 == i2);
- QVERIFY(i2 == c2);
- QVERIFY(c2 == i2);
- QVERIFY(c2 == c2);
+ QCOMPARE(i1, i1);
+ QCOMPARE(i1, c1);
+ QCOMPARE(c1, i1);
+ QCOMPARE(c1, c1);
+ QCOMPARE(i2, i2);
+ QCOMPARE(i2, c2);
+ QCOMPARE(c2, i2);
+ QCOMPARE(c2, c2);
QVERIFY(i1 != i2);
QVERIFY(i1 != c2);
@@ -1061,14 +1061,14 @@ void tst_QFuture::iterators()
QFuture<QString>::const_iterator i1 = f.begin(), i2 = i1 + 1;
QFuture<QString>::const_iterator c1 = i1, c2 = c1 + 1;
- QVERIFY(i1 == i1);
- QVERIFY(i1 == c1);
- QVERIFY(c1 == i1);
- QVERIFY(c1 == c1);
- QVERIFY(i2 == i2);
- QVERIFY(i2 == c2);
- QVERIFY(c2 == i2);
- QVERIFY(c2 == c2);
+ QCOMPARE(i1, i1);
+ QCOMPARE(i1, c1);
+ QCOMPARE(c1, i1);
+ QCOMPARE(c1, c1);
+ QCOMPARE(i2, i2);
+ QCOMPARE(i2, c2);
+ QCOMPARE(c2, i2);
+ QCOMPARE(c2, c2);
QVERIFY(i1 != i2);
QVERIFY(i1 != c2);
@@ -1438,6 +1438,8 @@ void tst_QFuture::nestedExceptions()
QVERIFY(MyClass::caught);
}
+#endif // QT_NO_EXCEPTIONS
+
void tst_QFuture::nonGlobalThreadPool()
{
static Q_CONSTEXPR int Answer = 42;
@@ -1485,7 +1487,5 @@ void tst_QFuture::nonGlobalThreadPool()
}
}
-#endif // QT_NO_EXCEPTIONS
-
QTEST_MAIN(tst_QFuture)
#include "tst_qfuture.moc"
diff --git a/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro b/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro
index a828213ade..5eebd12deb 100644
--- a/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro
+++ b/tests/auto/corelib/thread/qfuturesynchronizer/qfuturesynchronizer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfuturesynchronizer
QT = core testlib concurrent
SOURCES = tst_qfuturesynchronizer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro b/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro
index 17c0363ce4..d0e8b4c982 100644
--- a/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro
+++ b/tests/auto/corelib/thread/qfuturewatcher/qfuturewatcher.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qfuturewatcher
QT = core core-private testlib concurrent
SOURCES = tst_qfuturewatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qmutex/qmutex.pro b/tests/auto/corelib/thread/qmutex/qmutex.pro
index dde0a7f88f..229e57eb89 100644
--- a/tests/auto/corelib/thread/qmutex/qmutex.pro
+++ b/tests/auto/corelib/thread/qmutex/qmutex.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmutex
QT = core testlib
SOURCES = tst_qmutex.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro b/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro
index d35eca1009..76ec0471ca 100644
--- a/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro
+++ b/tests/auto/corelib/thread/qmutexlocker/qmutexlocker.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmutexlocker
QT = core testlib
SOURCES = tst_qmutexlocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro b/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro
index d391768102..ba46786750 100644
--- a/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro
+++ b/tests/auto/corelib/thread/qreadlocker/qreadlocker.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qreadlocker
QT = core testlib
SOURCES = tst_qreadlocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro b/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro
index b38d731049..c108c3d8af 100644
--- a/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro
+++ b/tests/auto/corelib/thread/qreadwritelock/qreadwritelock.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qreadwritelock
QT = core testlib
SOURCES = tst_qreadwritelock.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qresultstore/qresultstore.pro b/tests/auto/corelib/thread/qresultstore/qresultstore.pro
index 5e9e83c503..2f6c18f64c 100644
--- a/tests/auto/corelib/thread/qresultstore/qresultstore.pro
+++ b/tests/auto/corelib/thread/qresultstore/qresultstore.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qresultstore
QT = core-private testlib concurrent
SOURCES = tst_qresultstore.cpp
DEFINES += QT_STRICT_ITERATORS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp b/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp
index ff850683ac..821077de18 100644
--- a/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp
+++ b/tests/auto/corelib/thread/qresultstore/tst_qresultstore.cpp
@@ -80,9 +80,9 @@ void tst_QtConcurrentResultStore::iterators()
{
{
ResultStore<int> store;
- QVERIFY(store.begin() == store.end());
- QVERIFY(store.resultAt(0) == store.end());
- QVERIFY(store.resultAt(1) == store.end());
+ QCOMPARE(store.begin(), store.end());
+ QCOMPARE(store.resultAt(0), store.end());
+ QCOMPARE(store.resultAt(1), store.end());
}
{
ResultStoreBase storebase;
@@ -90,7 +90,7 @@ void tst_QtConcurrentResultStore::iterators()
storebase.addResult(1, &int1); // ResultStoreBase does not take ownership, only ResultStore<> does.
ResultIteratorBase it = storebase.begin();
QCOMPARE(it.resultIndex(), 0);
- QVERIFY(it == storebase.begin());
+ QCOMPARE(it, storebase.begin());
QVERIFY(it != storebase.end());
++it;
@@ -100,7 +100,7 @@ void tst_QtConcurrentResultStore::iterators()
++it;
QVERIFY(it != storebase.begin());
- QVERIFY(it == storebase.end());
+ QCOMPARE(it, storebase.end());
}
}
@@ -160,7 +160,7 @@ void tst_QtConcurrentResultStore::addResults()
store.addResults(-1, &vec1, 2, 2);
ResultIteratorBase it = store.begin();
QCOMPARE(it.resultIndex(), 0);
- QVERIFY(it == store.begin());
+ QCOMPARE(it, store.begin());
QVERIFY(it != store.end());
++it;
@@ -175,7 +175,7 @@ void tst_QtConcurrentResultStore::addResults()
QCOMPARE(it.resultIndex(), 3);
++it;
- QVERIFY(it == store.end());
+ QCOMPARE(it, store.end());
}
void tst_QtConcurrentResultStore::resultIndex()
diff --git a/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro b/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
index 56e9fd5da6..5a0f0337e6 100644
--- a/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
+++ b/tests/auto/corelib/thread/qsemaphore/qsemaphore.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qsemaphore
QT = core testlib
SOURCES = tst_qsemaphore.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthread/qthread.pro b/tests/auto/corelib/thread/qthread/qthread.pro
index 9efce4e7ed..18d867ecef 100644
--- a/tests/auto/corelib/thread/qthread/qthread.pro
+++ b/tests/auto/corelib/thread/qthread/qthread.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qthread
QT = core testlib
SOURCES = tst_qthread.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro b/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro
index 2c189e7422..e8b95a06a7 100644
--- a/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro
+++ b/tests/auto/corelib/thread/qthreadonce/qthreadonce.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qthreadonce
QT = core testlib
SOURCES = tst_qthreadonce.cpp
@@ -10,4 +10,3 @@ SOURCES = tst_qthreadonce.cpp
# Temporary:
SOURCES += qthreadonce.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp b/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp
index 0699c50464..7a3054abb0 100644
--- a/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp
+++ b/tests/auto/corelib/thread/qthreadonce/tst_qthreadonce.cpp
@@ -163,7 +163,7 @@ void tst_QThreadOnce::nesting()
}
}
- QVERIFY(variable == 1);
+ QCOMPARE(variable, 1);
}
static void reentrant(int control, int &counter)
diff --git a/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro b/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro
index 387b79b012..eac4ef9365 100644
--- a/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro
+++ b/tests/auto/corelib/thread/qthreadpool/qthreadpool.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qthreadpool
QT = core testlib
SOURCES = tst_qthreadpool.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro b/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro
index eb8d06d094..94a0a01e94 100644
--- a/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro
+++ b/tests/auto/corelib/thread/qthreadstorage/crashonexit/crashonexit.pro
@@ -7,4 +7,3 @@ CONFIG += console
# This app is testdata for tst_qthreadstorage
target.path = $$[QT_INSTALL_TESTS]/tst_qthreadstorage/$$TARGET
INSTALLS += target
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro b/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro
index 2fa973d2f7..d821e56366 100644
--- a/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro
+++ b/tests/auto/corelib/thread/qthreadstorage/qthreadstorage.pro
@@ -2,4 +2,4 @@ TEMPLATE = subdirs
SUBDIRS = \
crashonexit \
test
-CONFIG += ordered parallel_test
+CONFIG += ordered
diff --git a/tests/auto/corelib/thread/qthreadstorage/test/test.pro b/tests/auto/corelib/thread/qthreadstorage/test/test.pro
index 8b7caf1e24..729241f891 100644
--- a/tests/auto/corelib/thread/qthreadstorage/test/test.pro
+++ b/tests/auto/corelib/thread/qthreadstorage/test/test.pro
@@ -7,4 +7,3 @@ SOURCES = ../tst_qthreadstorage.cpp
TEST_HELPER_INSTALLS = ../crashonexit/crashonexit
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro b/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro
index 7383997e67..2098d9dd2f 100644
--- a/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro
+++ b/tests/auto/corelib/thread/qwaitcondition/qwaitcondition.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qwaitcondition
QT = core testlib
SOURCES = tst_qwaitcondition.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro b/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro
index 4a797975ab..a6c4f70b8d 100644
--- a/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro
+++ b/tests/auto/corelib/thread/qwritelocker/qwritelocker.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qwritelocker
QT = core testlib
SOURCES = tst_qwritelocker.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/collections/collections.pro b/tests/auto/corelib/tools/collections/collections.pro
index 51ea667f58..5c04515fa0 100644
--- a/tests/auto/corelib/tools/collections/collections.pro
+++ b/tests/auto/corelib/tools/collections/collections.pro
@@ -2,8 +2,6 @@ CONFIG += testcase
TARGET = tst_collections
SOURCES += tst_collections.cpp
QT = core testlib
-CONFIG += parallel_test
# This test does not work with strict iterators
DEFINES -= QT_STRICT_ITERATORS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/collections/tst_collections.cpp b/tests/auto/corelib/tools/collections/tst_collections.cpp
index ae8ffe48be..22a282457b 100644
--- a/tests/auto/corelib/tools/collections/tst_collections.cpp
+++ b/tests/auto/corelib/tools/collections/tst_collections.cpp
@@ -517,11 +517,11 @@ void tst_Collections::list()
QList<QString> list = vector.toList();
QVERIFY(list.size() == 5);
- QVERIFY(list.at(0) == "99");
- QVERIFY(list.at(4) == "100");
+ QCOMPARE(list.at(0), QLatin1String("99"));
+ QCOMPARE(list.at(4), QLatin1String("100"));
list[0] = "10";
- QVERIFY(list.at(0) == "10");
- QVERIFY(vector.at(0) == "99");
+ QCOMPARE(list.at(0), QLatin1String("10"));
+ QCOMPARE(vector.at(0), QLatin1String("99"));
}
@@ -533,15 +533,15 @@ void tst_Collections::list()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(list.first() == "Xello");
+ QCOMPARE(list.first(), QLatin1String("Xello"));
QList<QString>::const_iterator cit = list.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = list.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(),QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -575,10 +575,10 @@ void tst_Collections::list()
list << "alpha" << "beta";
list += list;
QVERIFY(list.size() == 4);
- QVERIFY(list.at(0) == "alpha");
- QVERIFY(list.at(1) == "beta");
- QVERIFY(list.at(2) == "alpha");
- QVERIFY(list.at(3) == "beta");
+ QCOMPARE(list.at(0), QLatin1String("alpha"));
+ QCOMPARE(list.at(1), QLatin1String("beta"));
+ QCOMPARE(list.at(2), QLatin1String("alpha"));
+ QCOMPARE(list.at(3), QLatin1String("beta"));
}
// test endcases for inserting into a qlist
@@ -954,15 +954,15 @@ void tst_Collections::linkedList()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(list.first() == "Xello");
+ QCOMPARE(list.first(), QLatin1String("Xello"));
QLinkedList<QString>::const_iterator cit = list.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = list.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -970,10 +970,10 @@ void tst_Collections::linkedList()
list << "alpha" << "beta";
list += list;
QVERIFY(list.size() == 4);
- QVERIFY(*list.begin() == "alpha");
- QVERIFY(*(list.begin() + 1) == "beta");
- QVERIFY(*(list.begin() + 2) == "alpha");
- QVERIFY(*(list.begin() + 3) == "beta");
+ QCOMPARE(*list.begin(), QLatin1String("alpha"));
+ QCOMPARE(*(list.begin() + 1), QLatin1String("beta"));
+ QCOMPARE(*(list.begin() + 2), QLatin1String("alpha"));
+ QCOMPARE(*(list.begin() + 3), QLatin1String("beta"));
}
{
@@ -1054,8 +1054,8 @@ void tst_Collections::vector()
QVector<QString> vec;
vec << "foo" << "bar";
vec.reserve( 512 );
- QVERIFY(vec[0] == "foo");
- QVERIFY(vec[1] == "bar");
+ QCOMPARE(vec[0], QLatin1String("foo"));
+ QCOMPARE(vec[1], QLatin1String("bar"));
int initialLargeStaticCount = LargeStatic::count;
{
@@ -1070,10 +1070,10 @@ void tst_Collections::vector()
vector << "alpha" << "beta";
vector += vector;
QVERIFY(vector.size() == 4);
- QVERIFY(vector.at(0) == "alpha");
- QVERIFY(vector.at(1) == "beta");
- QVERIFY(vector.at(2) == "alpha");
- QVERIFY(vector.at(3) == "beta");
+ QCOMPARE(vector.at(0), QLatin1String("alpha"));
+ QCOMPARE(vector.at(1), QLatin1String("beta"));
+ QCOMPARE(vector.at(2), QLatin1String("alpha"));
+ QCOMPARE(vector.at(3), QLatin1String("beta"));
}
int originalLargeStaticCount = LargeStatic::count;
@@ -1594,15 +1594,15 @@ void tst_Collections::hash()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(*hash.begin() == "Xello");
+ QCOMPARE(*hash.begin(), QLatin1String("Xello"));
QHash<int, QString>::const_iterator cit = hash.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = hash.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -1915,15 +1915,15 @@ void tst_Collections::map()
QVERIFY((*it)[0] == QChar('H'));
QVERIFY(it->constData()[0] == QChar('H'));
it->replace(QChar('H'), QChar('X'));
- QVERIFY(*map.begin() == "Xello");
+ QCOMPARE(*map.begin(), QLatin1String("Xello"));
QMap<int, QString>::const_iterator cit = map.constBegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
cit = map.cbegin();
- QVERIFY((*cit).toLower() == "xello");
- QVERIFY(cit->toUpper() == "XELLO");
+ QCOMPARE((*cit).toLower(), QLatin1String("xello"));
+ QCOMPARE(cit->toUpper(), QLatin1String("XELLO"));
}
{
@@ -2005,17 +2005,17 @@ void tst_Collections::qstring()
QVERIFY(hello.left(0) == "");
QVERIFY(!hello.left(0).isNull());
- QVERIFY(hello.left(1) == "h");
- QVERIFY(hello.left(2) == "he");
- QVERIFY(hello.left(200) == "hello");
+ QCOMPARE(hello.left(1), QLatin1String("h"));
+ QCOMPARE(hello.left(2), QLatin1String("he"));
+ QCOMPARE(hello.left(200), QLatin1String("hello"));
QVERIFY(hello.left(hello.size()) == hello);
QVERIFY(hello.left(hello.size()+1) == hello);
QVERIFY(hello.right(0) == "");
QVERIFY(!hello.right(0).isNull());
- QVERIFY(hello.right(1) == "o");
- QVERIFY(hello.right(2) == "lo");
- QVERIFY(hello.right(200) == "hello");
+ QCOMPARE(hello.right(1), QLatin1String("o"));
+ QCOMPARE(hello.right(2), QLatin1String("lo"));
+ QCOMPARE(hello.right(200), QLatin1String("hello"));
QVERIFY(hello.right(hello.size()) == hello);
QVERIFY(hello.right(hello.size()+1) == hello);
@@ -2023,16 +2023,16 @@ void tst_Collections::qstring()
QVERIFY(hello.mid(0, 1) == "h");
QVERIFY(hello.mid(0, 2) == "he");
QVERIFY(hello.mid(0, 200) == "hello");
- QVERIFY(hello.mid(0) == "hello");
+ QCOMPARE(hello.mid(0), QLatin1String("hello"));
QVERIFY(hello.mid(0, hello.size()) == hello);
QVERIFY(hello.mid(0, hello.size()+1) == hello);
QVERIFY(hello.mid(hello.size()-0) == "");
QVERIFY(hello.mid(hello.size()-0).isEmpty());
QVERIFY(!hello.mid(hello.size()-0).isNull());
- QVERIFY(hello.mid(hello.size()-1) == "o");
- QVERIFY(hello.mid(hello.size()-2) == "lo");
- QVERIFY(hello.mid(hello.size()-200) == "hello");
+ QCOMPARE(hello.mid(hello.size()-1), QLatin1String("o"));
+ QCOMPARE(hello.mid(hello.size()-2), QLatin1String("lo"));
+ QCOMPARE(hello.mid(hello.size()-200), QLatin1String("hello"));
QString null;
QString nonNull = "";
@@ -2048,7 +2048,7 @@ void tst_Collections::qstring()
QString fill = "123";
fill.fill('a');
- QVERIFY(fill == "aaa");
+ QCOMPARE(fill, QLatin1String("aaa"));
s.clear();
s = hello;
@@ -2060,15 +2060,15 @@ void tst_Collections::qstring()
QVERIFY(s == helloWorld);
s = "012345";
s.insert(3, 'E');
- QVERIFY(s == "012E345");
+ QCOMPARE(s, QLatin1String("012E345"));
s.insert(3, "INSID");
- QVERIFY(s == "012INSIDE345");
+ QCOMPARE(s, QLatin1String("012INSIDE345"));
s = "short";
s.insert(7, 'E');
- QVERIFY(s == "short E");
+ QCOMPARE(s, QLatin1String("short E"));
s = "short";
s.insert(7, "END");
- QVERIFY(s == "short END");
+ QCOMPARE(s, QLatin1String("short END"));
QVERIFY(QString::fromLatin1("hello") == "hello");
@@ -2125,25 +2125,25 @@ void tst_Collections::qstring()
s += QChar((uchar) 0xb0);
QVERIFY(s.toUtf8() != s.toLatin1());
QCOMPARE(s[s.length()-1].unicode(), (ushort)0xb0);
- QVERIFY(s.left(s.length()-1) == "ascii");
+ QCOMPARE(s.left(s.length()-1), QLatin1String("ascii"));
QVERIFY(s == QString::fromUtf8(s.toUtf8().constData()));
s = "12";
s.append('3');
s += '4';
- QVERIFY(s == "1234");
+ QCOMPARE(s, QLatin1String("1234"));
s = "repend";
s.prepend('p');
- QVERIFY(s == "prepend");
+ QCOMPARE(s, QLatin1String("prepend"));
s.prepend("abc ");
- QVERIFY(s == "abc prepend");
+ QCOMPARE(s, QLatin1String("abc prepend"));
s = " whitespace ";
- QVERIFY(s.trimmed() == "whitespace");
+ QCOMPARE(s.trimmed(), QLatin1String("whitespace"));
s = " lots of stuff ";
- QVERIFY(s.simplified() == "lots of stuff");
+ QCOMPARE(s.simplified(), QLatin1String("lots of stuff"));
s = "a hat, a stick, a ski";
QVERIFY(s[2] == 'h');
@@ -2152,17 +2152,17 @@ void tst_Collections::qstring()
s = "12223";
s.remove(1, 2);
- QVERIFY(s == "123");
+ QCOMPARE(s, QLatin1String("123"));
s = "(%1)(%2)";
s = s.arg("foo").arg(7);
- QVERIFY(s == "(foo)(7)");
+ QCOMPARE(s, QLatin1String("(foo)(7)"));
s = "stl rocks";
std::string stl_string = s.toStdString(); // TODO: std::string stl_string = s does not work.
- QVERIFY(s == "stl rocks");
+ QCOMPARE(s, QLatin1String("stl rocks"));
s = QString::fromStdString(stl_string); // TODO: s = stl_string does not work.
- QVERIFY(s == "stl rocks");
+ QCOMPARE(s, QLatin1String("stl rocks"));
{
QString str("Bananas");
@@ -2178,10 +2178,10 @@ void tst_Collections::qstring()
QString str = "Hello";
QString cstr = QString::fromRawData(str.unicode(), str.length());
- QVERIFY(str == "Hello");
- QVERIFY(cstr == "Hello");
+ QCOMPARE(str, QLatin1String("Hello"));
+ QCOMPARE(cstr, QLatin1String("Hello"));
cstr.clear();
- QVERIFY(str == "Hello");
+ QCOMPARE(str, QLatin1String("Hello"));
QVERIFY(cstr.isEmpty());
{
@@ -2328,7 +2328,7 @@ void tst_Collections::pair()
QPair<int, QString> a(1, "Zebra"), b(2, "Ying"), c(3, "Yang"), d(3, "Ying"), e(5, "Alabama");
QVERIFY(a.first == 1);
- QVERIFY(a.second == "Zebra");
+ QCOMPARE(a.second, QLatin1String("Zebra"));
QVERIFY(a == qMakePair(1, QString("Zebra")));
QVERIFY(a == a && b == b && c == c && d == d && e == e);
@@ -3482,7 +3482,7 @@ template<class Container> void foreach_test_arrays(const Container &container)
void tst_Collections::foreach_2()
{
- QStringList strlist = QString::fromLatin1("a,b,c,d,e,f,g,h,ih,kl,mn,op,qr,st,uvw,xyz").split(",");
+ QStringList strlist = QString::fromLatin1("a,b,c,d,e,f,g,h,ih,kl,mn,op,qr,st,uvw,xyz").split(QLatin1Char(','));
foreach_test_arrays(strlist);
foreach_test_arrays(QList<QString>(strlist));
foreach_test_arrays(strlist.toVector());
diff --git a/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro b/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro
index cb6f6595b4..0e6e830185 100644
--- a/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro
+++ b/tests/auto/corelib/tools/qalgorithms/qalgorithms.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qalgorithms
QT = core testlib
SOURCES = tst_qalgorithms.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp b/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp
index 99e5c4c85d..105b8b45d8 100644
--- a/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp
+++ b/tests/auto/corelib/tools/qalgorithms/tst_qalgorithms.cpp
@@ -312,24 +312,24 @@ void tst_QAlgorithms::swap()
{
QString a = "1", b = "2";
qSwap(a, b);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
qSwap(a, a);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
qSwap(b, b);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
qSwap(a, b);
- QVERIFY(a == "1");
- QVERIFY(b == "2");
+ QCOMPARE(a, QLatin1String("1"));
+ QCOMPARE(b, QLatin1String("2"));
qSwap(b, a);
- QVERIFY(a == "2");
- QVERIFY(b == "1");
+ QCOMPARE(a, QLatin1String("2"));
+ QCOMPARE(b, QLatin1String("1"));
}
{
diff --git a/tests/auto/corelib/tools/qarraydata/qarraydata.pro b/tests/auto/corelib/tools/qarraydata/qarraydata.pro
index d5fe08c009..ee3faa9ad7 100644
--- a/tests/auto/corelib/tools/qarraydata/qarraydata.pro
+++ b/tests/auto/corelib/tools/qarraydata/qarraydata.pro
@@ -2,5 +2,4 @@ TARGET = tst_qarraydata
SOURCES += $$PWD/tst_qarraydata.cpp
HEADERS += $$PWD/simplevector.h
QT = core testlib
-CONFIG += testcase parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+CONFIG += testcase
diff --git a/tests/auto/corelib/tools/qbitarray/qbitarray.pro b/tests/auto/corelib/tools/qbitarray/qbitarray.pro
index 22f62faaca..1e7185b600 100644
--- a/tests/auto/corelib/tools/qbitarray/qbitarray.pro
+++ b/tests/auto/corelib/tools/qbitarray/qbitarray.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbitarray
QT = core testlib
SOURCES = tst_qbitarray.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
index d3bbfa338b..5e6459c58b 100644
--- a/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
+++ b/tests/auto/corelib/tools/qbitarray/tst_qbitarray.cpp
@@ -126,9 +126,9 @@ void tst_QBitArray::size()
for (int j=0; j<len; j++) {
bool b = a[j];
if (b)
- S+= "1";
+ S+= QLatin1Char('1');
else
- S+= "0";
+ S+= QLatin1Char('0');
}
QTEST(S,"res");
}
diff --git a/tests/auto/corelib/tools/qbytearray/qbytearray.pro b/tests/auto/corelib/tools/qbytearray/qbytearray.pro
index 22104f817f..a4501611d6 100644
--- a/tests/auto/corelib/tools/qbytearray/qbytearray.pro
+++ b/tests/auto/corelib/tools/qbytearray/qbytearray.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbytearray
QT = core-private testlib
SOURCES = tst_qbytearray.cpp
TESTDATA += rfc3252.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
mac {
OBJECTIVE_SOURCES += tst_qbytearray_mac.mm
diff --git a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
index f942eab800..4a8190da6d 100644
--- a/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
+++ b/tests/auto/corelib/tools/qbytearray/tst_qbytearray.cpp
@@ -212,12 +212,12 @@ QByteArray verifyZeroTermination(const QByteArray &ba)
const_cast<char *>(baData)[baSize] = 'x';
if ('x' != ba.constData()[baSize]) {
- return QString::fromLatin1("*** Failed to replace null-terminator in "
- "result ('%1') ***").arg(QString::fromLatin1(ba)).toLatin1();
+ return "*** Failed to replace null-terminator in "
+ "result ('" + ba + "') ***";
}
if (ba != baCopy) {
- return QString::fromLatin1( "*** Result ('%1') differs from its copy "
- "after null-terminator was replaced ***").arg(QString::fromLatin1(ba)).toLatin1();
+ return "*** Result ('" + ba + "') differs from its copy "
+ "after null-terminator was replaced ***";
}
const_cast<char *>(baData)[baSize] = '\0'; // Restore sanity
@@ -896,7 +896,9 @@ void tst_QByteArray::prepend()
QCOMPARE(ba.prepend("1"), QByteArray("1foo"));
QCOMPARE(ba.prepend(QByteArray("2")), QByteArray("21foo"));
QCOMPARE(ba.prepend('3'), QByteArray("321foo"));
- QCOMPARE(ba.prepend("\0 ", 2), QByteArray::fromRawData("\0 321foo", 8));
+ QCOMPARE(ba.prepend(-1, 'x'), QByteArray("321foo"));
+ QCOMPARE(ba.prepend(3, 'x'), QByteArray("xxx321foo"));
+ QCOMPARE(ba.prepend("\0 ", 2), QByteArray::fromRawData("\0 xxx321foo", 11));
}
void tst_QByteArray::prependExtended_data()
@@ -924,8 +926,10 @@ void tst_QByteArray::prependExtended()
QCOMPARE(array.prepend("1"), QByteArray("1data"));
QCOMPARE(array.prepend(QByteArray("2")), QByteArray("21data"));
QCOMPARE(array.prepend('3'), QByteArray("321data"));
- QCOMPARE(array.prepend("\0 ", 2), QByteArray::fromRawData("\0 321data", 9));
- QCOMPARE(array.size(), 9);
+ QCOMPARE(array.prepend(-1, 'x'), QByteArray("321data"));
+ QCOMPARE(array.prepend(3, 'x'), QByteArray("xxx321data"));
+ QCOMPARE(array.prepend("\0 ", 2), QByteArray::fromRawData("\0 xxx321data", 12));
+ QCOMPARE(array.size(), 12);
}
void tst_QByteArray::append()
@@ -936,9 +940,11 @@ void tst_QByteArray::append()
QCOMPARE(ba.append("1"), QByteArray("foo1"));
QCOMPARE(ba.append(QByteArray("2")), QByteArray("foo12"));
QCOMPARE(ba.append('3'), QByteArray("foo123"));
- QCOMPARE(ba.append("\0"), QByteArray("foo123"));
- QCOMPARE(ba.append("\0", 1), QByteArray::fromRawData("foo123\0", 7));
- QCOMPARE(ba.size(), 7);
+ QCOMPARE(ba.append(-1, 'x'), QByteArray("foo123"));
+ QCOMPARE(ba.append(3, 'x'), QByteArray("foo123xxx"));
+ QCOMPARE(ba.append("\0"), QByteArray("foo123xxx"));
+ QCOMPARE(ba.append("\0", 1), QByteArray::fromRawData("foo123xxx\0", 10));
+ QCOMPARE(ba.size(), 10);
}
void tst_QByteArray::appendExtended_data()
@@ -958,9 +964,11 @@ void tst_QByteArray::appendExtended()
QCOMPARE(array.append("1"), QByteArray("data1"));
QCOMPARE(array.append(QByteArray("2")), QByteArray("data12"));
QCOMPARE(array.append('3'), QByteArray("data123"));
- QCOMPARE(array.append("\0"), QByteArray("data123"));
- QCOMPARE(array.append("\0", 1), QByteArray::fromRawData("data123\0", 8));
- QCOMPARE(array.size(), 8);
+ QCOMPARE(array.append(-1, 'x'), QByteArray("data123"));
+ QCOMPARE(array.append(3, 'x'), QByteArray("data123xxx"));
+ QCOMPARE(array.append("\0"), QByteArray("data123xxx"));
+ QCOMPARE(array.append("\0", 1), QByteArray::fromRawData("data123xxx\0", 11));
+ QCOMPARE(array.size(), 11);
}
void tst_QByteArray::insert()
@@ -976,6 +984,12 @@ void tst_QByteArray::insert()
QCOMPARE(ba.insert(1, 'b'), QByteArray("abc"));
QCOMPARE(ba.size(), 3);
+ ba = "ac";
+ QCOMPARE(ba.insert(-1, 3, 'x'), QByteArray("ac"));
+ QCOMPARE(ba.insert(1, 3, 'x'), QByteArray("axxxc"));
+ QCOMPARE(ba.insert(6, 3, 'x'), QByteArray("axxxc xxx"));
+ QCOMPARE(ba.size(), 9);
+
ba = "ikl";
QCOMPARE(ba.insert(1, "j"), QByteArray("ijkl"));
QCOMPARE(ba.size(), 4);
@@ -994,7 +1008,8 @@ void tst_QByteArray::insertExtended()
{
QFETCH(QByteArray, array);
QCOMPARE(array.insert(1, "i"), QByteArray("diata"));
- QCOMPARE(array.size(), 5);
+ QCOMPARE(array.insert(1, 3, 'x'), QByteArray("dxxxiata"));
+ QCOMPARE(array.size(), 8);
}
void tst_QByteArray::remove_data()
@@ -1969,15 +1984,15 @@ void tst_QByteArray::movablity()
QCOMPARE(array.isEmpty(), newIsEmpty);
QCOMPARE(array.isNull(), newIsNull);
QCOMPARE(array.capacity(), newCapacity);
- QVERIFY(array.startsWith("a"));
- QVERIFY(array.endsWith("b"));
+ QVERIFY(array.startsWith('a'));
+ QVERIFY(array.endsWith('b'));
QCOMPARE(copy.size(), newSize);
QCOMPARE(copy.isEmpty(), newIsEmpty);
QCOMPARE(copy.isNull(), newIsNull);
QCOMPARE(copy.capacity(), newCapacity);
- QVERIFY(copy.startsWith("a"));
- QVERIFY(copy.endsWith("b"));
+ QVERIFY(copy.startsWith('a'));
+ QVERIFY(copy.endsWith('b'));
// try to not crash
array.squeeze();
diff --git a/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro b/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
index 2cd4522f67..6c05c288cf 100644
--- a/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
+++ b/tests/auto/corelib/tools/qbytearraylist/qbytearraylist.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbytearraylist
QT = core testlib
SOURCES = tst_qbytearraylist.cpp
diff --git a/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro b/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro
index 7da193d01a..0624e1886c 100644
--- a/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro
+++ b/tests/auto/corelib/tools/qbytearraymatcher/qbytearraymatcher.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qbytearraymatcher
QT = core testlib
SOURCES = tst_qbytearraymatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qcache/qcache.pro b/tests/auto/corelib/tools/qcache/qcache.pro
index 80a616ce38..07488ef40f 100644
--- a/tests/auto/corelib/tools/qcache/qcache.pro
+++ b/tests/auto/corelib/tools/qcache/qcache.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcache
QT = core testlib
SOURCES = tst_qcache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qchar/qchar.pro b/tests/auto/corelib/tools/qchar/qchar.pro
index a72f16fa49..771e4290b8 100644
--- a/tests/auto/corelib/tools/qchar/qchar.pro
+++ b/tests/auto/corelib/tools/qchar/qchar.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qchar
QT = core-private testlib
SOURCES = tst_qchar.cpp
TESTDATA += data/NormalizationTest.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/tools/qchar/tst_qchar.cpp b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
index f80d6e6d93..4b1e315e7f 100644
--- a/tests/auto/corelib/tools/qchar/tst_qchar.cpp
+++ b/tests/auto/corelib/tools/qchar/tst_qchar.cpp
@@ -43,9 +43,6 @@
class tst_QChar : public QObject
{
Q_OBJECT
-public slots:
- void init();
- void cleanup();
private slots:
void operators_data();
void operators();
@@ -80,27 +77,8 @@ private slots:
void normalization_manual();
void normalizationCorrections();
void unicodeVersion();
-#if defined(Q_OS_WINCE)
-private:
- QCoreApplication* app;
-#endif
};
-void tst_QChar::init()
-{
-#if defined(Q_OS_WINCE)
- int argc = 0;
- app = new QCoreApplication(argc, NULL);
-#endif
-}
-
-void tst_QChar::cleanup()
-{
-#if defined(Q_OS_WINCE)
- delete app;
-#endif
-}
-
void tst_QChar::operators_data()
{
QTest::addColumn<QChar>("lhs");
@@ -239,8 +217,8 @@ void tst_QChar::isDigit_data()
for (ushort ucs = 0; ucs < 256; ++ucs) {
bool isDigit = (ucs <= '9' && ucs >= '0');
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isDigit;
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isDigit;
}
}
@@ -266,8 +244,8 @@ void tst_QChar::isLetter_data()
QTest::addColumn<bool>("expected");
for (ushort ucs = 0; ucs < 256; ++ucs) {
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isExpectedLetter(ucs);
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isExpectedLetter(ucs);
}
}
@@ -288,8 +266,8 @@ void tst_QChar::isLetterOrNumber_data()
|| (ucs >= '0' && ucs <= '9')
|| ucs == 0xB2 || ucs == 0xB3 || ucs == 0xB9
|| (ucs >= 0xBC && ucs <= 0xBE);
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isLetterOrNumber;
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isLetterOrNumber;
}
}
@@ -403,8 +381,8 @@ void tst_QChar::isSpace_data()
for (ushort ucs = 0; ucs < 256; ++ucs) {
bool isSpace = (ucs <= 0x0D && ucs >= 0x09) || ucs == 0x20 || ucs == 0xA0 || ucs == 0x85;
- QString tag = QString::fromLatin1("0x%0").arg(QString::number(ucs, 16));
- QTest::newRow(tag.toLatin1()) << ucs << isSpace;
+ const QByteArray tag = "0x" + QByteArray::number(ucs, 16);
+ QTest::newRow(tag.constData()) << ucs << isSpace;
}
}
@@ -756,7 +734,7 @@ void tst_QChar::normalization_data()
if (comment >= 0)
line = line.left(comment);
- if (line.startsWith("@")) {
+ if (line.startsWith('@')) {
if (line.startsWith("@Part") && line.size() > 5 && QChar(line.at(5)).isDigit())
part = QChar(line.at(5)).digitValue();
continue;
@@ -793,8 +771,10 @@ void tst_QChar::normalization_data()
}
}
- QString nm = QString("line #%1 (part %2").arg(linenum).arg(part);
- QTest::newRow(nm.toLatin1()) << columns << part;
+
+ const QByteArray nm = "line #" + QByteArray::number(linenum) + " (part "
+ + QByteArray::number(part);
+ QTest::newRow(nm.constData()) << columns << part;
}
}
diff --git a/tests/auto/corelib/tools/qcollator/qcollator.pro b/tests/auto/corelib/tools/qcollator/qcollator.pro
index 3c5987ffa0..ed879ee70e 100644
--- a/tests/auto/corelib/tools/qcollator/qcollator.pro
+++ b/tests/auto/corelib/tools/qcollator/qcollator.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcollator
QT = core testlib
SOURCES = tst_qcollator.cpp
DEFINES += QT_NO_CAST_TO_ASCII
contains(QT_CONFIG,icu):DEFINES += QT_USE_ICU
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro
index 6d3e6d677f..75b74bbf4d 100644
--- a/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro
+++ b/tests/auto/corelib/tools/qcommandlineparser/tst_qcommandlineparser.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcommandlineparser
QT = core testlib
SOURCES = tst_qcommandlineparser.cpp
diff --git a/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro b/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro
index db4412ed59..d79bd16c76 100644
--- a/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro
+++ b/tests/auto/corelib/tools/qcontiguouscache/qcontiguouscache.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcontiguouscache
QT = core testlib
SOURCES = tst_qcontiguouscache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
index 941a068f8e..15a57c692e 100644
--- a/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
+++ b/tests/auto/corelib/tools/qcryptographichash/qcryptographichash.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qcryptographichash
QT = core testlib
SOURCES = tst_qcryptographichash.cpp
TESTDATA += data/*
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/tools/qdate/qdate.pro b/tests/auto/corelib/tools/qdate/qdate.pro
index 6be3164fd7..dd7c6cb888 100644
--- a/tests/auto/corelib/tools/qdate/qdate.pro
+++ b/tests/auto/corelib/tools/qdate/qdate.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdate
QT = core testlib
SOURCES = tst_qdate.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qdate/tst_qdate.cpp b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
index e515fcf5b9..27988e5b5b 100644
--- a/tests/auto/corelib/tools/qdate/tst_qdate.cpp
+++ b/tests/auto/corelib/tools/qdate/tst_qdate.cpp
@@ -1047,7 +1047,7 @@ void tst_QDate::fromStringFormat_data()
QTest::newRow("data14") << QString("132") << QString("Md") << invalidDate();
QTest::newRow("data15") << february << QString("MMMM") << QDate(defDate().year(), 2, 1);
- QString date = mon + " " + august + " 8 2005";
+ QString date = mon + QLatin1Char(' ') + august + " 8 2005";
QTest::newRow("data16") << date << QString("ddd MMMM d yyyy") << QDate(2005, 8, 8);
QTest::newRow("data17") << QString("2000:00") << QString("yyyy:yy") << QDate(2000, 1, 1);
QTest::newRow("data18") << QString("1999:99") << QString("yyyy:yy") << QDate(1999, 1, 1);
diff --git a/tests/auto/corelib/tools/qdatetime/qdatetime.pro b/tests/auto/corelib/tools/qdatetime/qdatetime.pro
index 25d11443e4..ba36621cf1 100644
--- a/tests/auto/corelib/tools/qdatetime/qdatetime.pro
+++ b/tests/auto/corelib/tools/qdatetime/qdatetime.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qdatetime
QT = core-private testlib
SOURCES = tst_qdatetime.cpp
@@ -10,7 +10,6 @@ win32-msvc|win32-msvc9x {
QMAKE_CFLAGS_RELEASE -= -O1
QMAKE_CXXFLAGS_RELEASE -= -O1
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
mac {
OBJECTIVE_SOURCES += tst_qdatetime_mac.mm
diff --git a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
index df9089057d..da5039ce3b 100644
--- a/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
+++ b/tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
@@ -1691,13 +1691,15 @@ void tst_QDateTime::operator_insert_extract_data()
const int thisVersion = tmpDataStream.version();
for (int version = QDataStream::Qt_1_0; version <= thisVersion; ++version) {
const QDataStream::Version dataStreamVersion = static_cast<QDataStream::Version>(version);
- QTest::newRow(QString::fromLatin1("v%1 WA => HAWAII %2").arg(dataStreamVersion).arg(positiveYear.toString()).toLocal8Bit().constData())
+ const QByteArray vN = QByteArray::number(dataStreamVersion);
+ const QByteArray pY = positiveYear.toString().toLatin1();
+ QTest::newRow(('v' + vN + " WA => HAWAII " + pY).constData())
<< positiveYear << westernAustralia << hawaii << dataStreamVersion;
- QTest::newRow(QString::fromLatin1("v%1 WA => WA %2").arg(dataStreamVersion).arg(positiveYear.toString()).toLocal8Bit().constData())
+ QTest::newRow(('v' + vN + " WA => WA " + pY).constData())
<< positiveYear << westernAustralia << westernAustralia << dataStreamVersion;
- QTest::newRow(QString::fromLatin1("v%1 HAWAII => WA %2").arg(dataStreamVersion).arg(negativeYear.toString()).toLocal8Bit().constData())
+ QTest::newRow(('v' + vN + " HAWAII => WA " + negativeYear.toString().toLatin1()).constData())
<< negativeYear << hawaii << westernAustralia << dataStreamVersion;
- QTest::newRow(QString::fromLatin1("v%1 HAWAII => HAWAII %2").arg(dataStreamVersion).arg(positiveYear.toString()).toLocal8Bit().constData())
+ QTest::newRow(('v' + vN + " HAWAII => HAWAII " + pY).constData())
<< positiveYear << hawaii << hawaii << dataStreamVersion;
}
}
@@ -2096,11 +2098,11 @@ void tst_QDateTime::fromStringStringFormat_data()
QTest::newRow("data9") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data10") << QString("101010") << QString("dMyy") << QDateTime(QDate(1910, 10, 10), QTime());
QTest::newRow("data11") << date << QString("dd MMM yy") << QDateTime(QDate(1910, 10, 10), QTime());
- date = fri + " " + december + " 3 2004";
+ date = fri + QLatin1Char(' ') + december + " 3 2004";
QTest::newRow("data12") << date << QString("ddd MMMM d yyyy") << QDateTime(QDate(2004, 12, 3), QTime());
QTest::newRow("data13") << QString("30.02.2004") << QString("dd.MM.yyyy") << invalidDateTime();
QTest::newRow("data14") << QString("32.01.2004") << QString("dd.MM.yyyy") << invalidDateTime();
- date = thu + " " + january + " 2004";
+ date = thu + QLatin1Char(' ') + january + " 2004";
QTest::newRow("data15") << date << QString("ddd MMMM yyyy") << QDateTime(QDate(2004, 1, 1), QTime());
QTest::newRow("data16") << QString("2005-06-28T07:57:30.001Z")
<< QString("yyyy-MM-ddThh:mm:ss.zZ")
diff --git a/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro b/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro
index 679f9bbda4..80c5a94a83 100644
--- a/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro
+++ b/tests/auto/corelib/tools/qeasingcurve/qeasingcurve.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qeasingcurve
QT = core testlib
SOURCES = tst_qeasingcurve.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro b/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro
index 7e9f907915..657a63a5d7 100644
--- a/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro
+++ b/tests/auto/corelib/tools/qelapsedtimer/qelapsedtimer.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qelapsedtimer
QT = core testlib
SOURCES = tst_qelapsedtimer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro b/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro
index 2ee091c139..45fe1f60fe 100644
--- a/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro
+++ b/tests/auto/corelib/tools/qexplicitlyshareddatapointer/qexplicitlyshareddatapointer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qexplicitlyshareddatapointer
QT = core testlib
SOURCES = tst_qexplicitlyshareddatapointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qfreelist/qfreelist.pro b/tests/auto/corelib/tools/qfreelist/qfreelist.pro
index 60ae819f87..fb108338bd 100644
--- a/tests/auto/corelib/tools/qfreelist/qfreelist.pro
+++ b/tests/auto/corelib/tools/qfreelist/qfreelist.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfreelist
QT = core-private testlib
SOURCES = tst_qfreelist.cpp
!contains(QT_CONFIG,private_tests): SOURCES += $$QT_SOURCE_TREE/src/corelib/tools/qfreelist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qhash/qhash.pro b/tests/auto/corelib/tools/qhash/qhash.pro
index 1ed062ca91..79ffd4e9d1 100644
--- a/tests/auto/corelib/tools/qhash/qhash.pro
+++ b/tests/auto/corelib/tools/qhash/qhash.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qhash
QT = core testlib
SOURCES = $$PWD/tst_qhash.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
index 6a5c6b5670..340453fb3e 100644
--- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp
+++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp
@@ -510,24 +510,24 @@ void tst_QHash::key()
QCOMPARE(hash1.key(1, def), def);
hash1.insert("one", 1);
- QCOMPARE(hash1.key(1), QString("one"));
- QCOMPARE(hash1.key(1, def), QString("one"));
+ QCOMPARE(hash1.key(1), QLatin1String("one"));
+ QCOMPARE(hash1.key(1, def), QLatin1String("one"));
QCOMPARE(hash1.key(2), QString());
QCOMPARE(hash1.key(2, def), def);
hash1.insert("two", 2);
- QCOMPARE(hash1.key(1), QString("one"));
- QCOMPARE(hash1.key(1, def), QString("one"));
- QCOMPARE(hash1.key(2), QString("two"));
- QCOMPARE(hash1.key(2, def), QString("two"));
+ QCOMPARE(hash1.key(1), QLatin1String("one"));
+ QCOMPARE(hash1.key(1, def), QLatin1String("one"));
+ QCOMPARE(hash1.key(2), QLatin1String("two"));
+ QCOMPARE(hash1.key(2, def), QLatin1String("two"));
QCOMPARE(hash1.key(3), QString());
QCOMPARE(hash1.key(3, def), def);
hash1.insert("deux", 2);
- QCOMPARE(hash1.key(1), QString("one"));
- QCOMPARE(hash1.key(1, def), QString("one"));
- QVERIFY(hash1.key(2) == "deux" || hash1.key(2) == "two");
- QVERIFY(hash1.key(2, def) == "deux" || hash1.key(2, def) == "two");
+ QCOMPARE(hash1.key(1), QLatin1String("one"));
+ QCOMPARE(hash1.key(1, def), QLatin1String("one"));
+ QVERIFY(hash1.key(2) == QLatin1String("deux") || hash1.key(2) == QLatin1String("two"));
+ QVERIFY(hash1.key(2, def) == QLatin1String("deux") || hash1.key(2, def) == QLatin1String("two"));
QCOMPARE(hash1.key(3), QString());
QCOMPARE(hash1.key(3, def), def);
}
@@ -628,8 +628,8 @@ void tst_QHash::find()
map1.insert(1,"Mayer");
map1.insert(2,"Hej");
- QVERIFY(map1.find(1).value() == "Mayer");
- QVERIFY(map1.find(2).value() == "Hej");
+ QCOMPARE(map1.find(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.find(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -661,8 +661,8 @@ void tst_QHash::constFind()
map1.insert(1,"Mayer");
map1.insert(2,"Hej");
- QVERIFY(map1.constFind(1).value() == "Mayer");
- QVERIFY(map1.constFind(2).value() == "Hej");
+ QCOMPARE(map1.constFind(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.constFind(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -706,7 +706,7 @@ void tst_QHash::take()
map.insert(2, "zwei");
map.insert(3, "drei");
- QVERIFY(map.take(3) == "drei");
+ QCOMPARE(map.take(3), QLatin1String("drei"));
QVERIFY(!map.contains(3));
}
diff --git a/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro b/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro
index 21426a4f55..853e9f30e5 100644
--- a/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro
+++ b/tests/auto/corelib/tools/qhashfunctions/qhashfunctions.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qhashfunctions
QT = core testlib
SOURCES = $$PWD/tst_qhashfunctions.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qline/qline.pro b/tests/auto/corelib/tools/qline/qline.pro
index 56f852ac52..c66df2cd68 100644
--- a/tests/auto/corelib/tools/qline/qline.pro
+++ b/tests/auto/corelib/tools/qline/qline.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qline
QT = core testlib
SOURCES = tst_qline.cpp
unix:!mac:!vxworks:!haiku:LIBS+=-lm
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qline/tst_qline.cpp b/tests/auto/corelib/tools/qline/tst_qline.cpp
index 20373bfb15..a215464d8a 100644
--- a/tests/auto/corelib/tools/qline/tst_qline.cpp
+++ b/tests/auto/corelib/tools/qline/tst_qline.cpp
@@ -179,7 +179,7 @@ void tst_QLine::testIntersection_data()
a = a.translated(1, 1);
b = b.translated(1, 1);
- QTest::newRow(qPrintable(QString::fromLatin1("rotation-%0").arg(i)))
+ QTest::newRow(("rotation-" + QByteArray::number(i)).constData())
<< (double)a.x1() << (double)a.y1() << (double)a.x2() << (double)a.y2()
<< (double)b.x1() << (double)b.y1() << (double)b.x2() << (double)b.y2()
<< int(QLineF::BoundedIntersection)
@@ -332,7 +332,7 @@ void tst_QLine::testAngle_data()
<< 135.0;
for (int i=0; i<180; ++i) {
- QTest::newRow(QString("angle:%1").arg(i).toLatin1())
+ QTest::newRow(("angle:" + QByteArray::number(i)).constData())
<< 0.0 << 0.0 << double(cos(i*M_2PI/360)) << double(sin(i*M_2PI/360))
<< 0.0 << 0.0 << 1.0 << 0.0
<< double(i);
@@ -460,7 +460,7 @@ void tst_QLine::testAngleTo_data()
for (int i = 0; i < 360; ++i) {
const QLineF l = QLineF::fromPolar(1, i);
- QTest::newRow(QString("angle:%1").arg(i).toLatin1())
+ QTest::newRow(("angle:" + QByteArray::number(i)).constData())
<< qreal(0.0) << qreal(0.0) << qreal(1.0) << qreal(0.0)
<< qreal(0.0) << qreal(0.0) << l.p2().x() << l.p2().y()
<< qreal(i);
diff --git a/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro b/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro
index 439bf03707..80630f78ad 100644
--- a/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro
+++ b/tests/auto/corelib/tools/qlinkedlist/qlinkedlist.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qlinkedlist
QT = core testlib
SOURCES = tst_qlinkedlist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qlist/qlist.pro b/tests/auto/corelib/tools/qlist/qlist.pro
index 43c06e0ee1..47f0140abb 100644
--- a/tests/auto/corelib/tools/qlist/qlist.pro
+++ b/tests/auto/corelib/tools/qlist/qlist.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qlist
QT = core testlib
SOURCES = $$PWD/tst_qlist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro b/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro
index 8995fce52c..b61f51d53a 100644
--- a/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro
+++ b/tests/auto/corelib/tools/qlocale/syslocaleapp/syslocaleapp.pro
@@ -6,4 +6,3 @@ CONFIG -= app_bundle
QT = core
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qlocale/test/test.pro b/tests/auto/corelib/tools/qlocale/test/test.pro
index df12d35a09..e9ad1e8281 100644
--- a/tests/auto/corelib/tools/qlocale/test/test.pro
+++ b/tests/auto/corelib/tools/qlocale/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += console testcase
-CONFIG += parallel_test
CONFIG -= app_bundle
QT = core testlib core-private
embedded: QT += gui
@@ -16,5 +15,4 @@ win32 {
TEST_HELPER_INSTALLS = ../syslocaleapp/syslocaleapp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
blackberry:LIBS += -lpps
diff --git a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
index 0466ced10a..2da7a83568 100644
--- a/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
+++ b/tests/auto/corelib/tools/qlocale/tst_qlocale.cpp
@@ -42,6 +42,7 @@
#include <qdatetime.h>
#include <qprocess.h>
#include <float.h>
+#include <locale.h>
#include <qlocale.h>
#include <private/qlocale_p.h>
@@ -140,8 +141,10 @@ private slots:
void legacyNames();
void unixLocaleName();
void matchingLocales();
- void double_conversion_data();
- void double_conversion();
+ void stringToDouble_data();
+ void stringToDouble();
+ void doubleToString_data();
+ void doubleToString();
void long_long_conversion_data();
void long_long_conversion();
void long_long_conversion_extra();
@@ -370,7 +373,7 @@ void tst_QLocale::ctor()
&& l.country() == QLocale::exp_country, \
QString("requested: \"" + QString(req_lc) + "\", got: " \
+ QLocale::languageToString(l.language()) \
- + "/" + QLocale::countryToString(l.country())).toLatin1().constData()); \
+ + QLatin1Char('/') + QLocale::countryToString(l.country())).toLatin1().constData()); \
QCOMPARE(l, QLocale(QLocale::exp_lang, QLocale::exp_country)); \
QCOMPARE(qHash(l), qHash(QLocale(QLocale::exp_lang, QLocale::exp_country))); \
}
@@ -431,8 +434,8 @@ void tst_QLocale::ctor()
&& l.country() == QLocale::exp_country, \
QString("requested: \"" + QString(req_lc) + "\", got: " \
+ QLocale::languageToString(l.language()) \
- + "/" + QLocale::scriptToString(l.script()) \
- + "/" + QLocale::countryToString(l.country())).toLatin1().constData()); \
+ + QLatin1Char('/') + QLocale::scriptToString(l.script()) \
+ + QLatin1Char('/') + QLocale::countryToString(l.country())).toLatin1().constData()); \
}
TEST_CTOR("zh_CN", Chinese, SimplifiedHanScript, China)
@@ -606,7 +609,7 @@ void tst_QLocale::legacyNames()
&& l.country() == QLocale::exp_country, \
QString("requested: \"" + QString(req_lc) + "\", got: " \
+ QLocale::languageToString(l.language()) \
- + "/" + QLocale::countryToString(l.country())).toLatin1().constData()); \
+ + QLatin1Char('/') + QLocale::countryToString(l.country())).toLatin1().constData()); \
}
TEST_CTOR("mo_MD", Romanian, Moldova)
@@ -664,7 +667,7 @@ void tst_QLocale::unixLocaleName()
#undef TEST_NAME
}
-void tst_QLocale::double_conversion_data()
+void tst_QLocale::stringToDouble_data()
{
QTest::addColumn<QString>("locale_name");
QTest::addColumn<QString>("num_str");
@@ -786,7 +789,7 @@ void tst_QLocale::double_conversion_data()
QTest::newRow("de_DE 9.876543,0e--2") << QString("de_DE") << QString("9.876543,0e")+QChar(8722)+QString("2") << false << 0.0;
}
-void tst_QLocale::double_conversion()
+void tst_QLocale::stringToDouble()
{
#define MY_DOUBLE_EPSILON (2.22045e-16)
@@ -803,6 +806,11 @@ void tst_QLocale::double_conversion()
double d = locale.toDouble(num_str, &ok);
QCOMPARE(ok, good);
+ char *currentLocale = setlocale(LC_ALL, "de_DE");
+ QCOMPARE(locale.toDouble(num_str, &ok), d); // make sure result is independent of locale
+ QCOMPARE(ok, good);
+ setlocale(LC_ALL, currentLocale);
+
if (ok) {
double diff = d - num;
if (diff < 0)
@@ -821,6 +829,90 @@ void tst_QLocale::double_conversion()
}
}
+void tst_QLocale::doubleToString_data()
+{
+ QTest::addColumn<QString>("locale_name");
+ QTest::addColumn<QString>("num_str");
+ QTest::addColumn<double>("num");
+ QTest::addColumn<char>("mode");
+ QTest::addColumn<int>("precision");
+
+ QTest::newRow("C 3.4 f 5") << QString("C") << QString("3.40000") << 3.4 << 'f' << 5;
+ QTest::newRow("C 3.4 f 0") << QString("C") << QString("3") << 3.4 << 'f' << 0;
+ QTest::newRow("C 3.4 e 5") << QString("C") << QString("3.40000e+00") << 3.4 << 'e' << 5;
+ QTest::newRow("C 3.4 e 0") << QString("C") << QString("3e+00") << 3.4 << 'e' << 0;
+ QTest::newRow("C 3.4 g 5") << QString("C") << QString("3.4") << 3.4 << 'g' << 5;
+ QTest::newRow("C 3.4 g 1") << QString("C") << QString("3") << 3.4 << 'g' << 1;
+
+ QTest::newRow("C 3.4 f 1") << QString("C") << QString("3.4") << 3.4 << 'f' << 1;
+ QTest::newRow("C 3.4 e 1") << QString("C") << QString("3.4e+00") << 3.4 << 'e' << 1;
+ QTest::newRow("C 3.4 g 2") << QString("C") << QString("3.4") << 3.4 << 'g' << 2;
+
+ QTest::newRow("de_DE 3,4 f 1") << QString("de_DE") << QString("3,4") << 3.4 << 'f' << 1;
+ QTest::newRow("de_DE 3,4 e 1") << QString("de_DE") << QString("3,4e+00") << 3.4 << 'e' << 1;
+ QTest::newRow("de_DE 3,4 g 2") << QString("de_DE") << QString("3,4") << 3.4 << 'g' << 2;
+
+ QTest::newRow("C 0.035003945 f 12") << QString("C") << QString("0.035003945000") << 0.035003945 << 'f' << 12;
+ QTest::newRow("C 0.035003945 f 6") << QString("C") << QString("0.035004") << 0.035003945 << 'f' << 6;
+ QTest::newRow("C 0.035003945 e 10") << QString("C") << QString("3.5003945000e-02") << 0.035003945 << 'e' << 10;
+ QTest::newRow("C 0.035003945 e 4") << QString("C") << QString("3.5004e-02") << 0.035003945 << 'e' << 4;
+ QTest::newRow("C 0.035003945 g 11") << QString("C") << QString("0.035003945") << 0.035003945 << 'g' << 11;
+ QTest::newRow("C 0.035003945 g 5") << QString("C") << QString("0.035004") << 0.035003945 << 'g' << 5;
+
+ QTest::newRow("C 0.035003945 f 9") << QString("C") << QString("0.035003945") << 0.035003945 << 'f' << 9;
+ QTest::newRow("C 0.035003945 e 7") << QString("C") << QString("3.5003945e-02") << 0.035003945 << 'e' << 7;
+ QTest::newRow("C 0.035003945 g 8") << QString("C") << QString("0.035003945") << 0.035003945 << 'g' << 8;
+
+ QTest::newRow("de_DE 0,035003945 f 9") << QString("de_DE") << QString("0,035003945") << 0.035003945 << 'f' << 9;
+ QTest::newRow("de_DE 0,035003945 e 7") << QString("de_DE") << QString("3,5003945e-02") << 0.035003945 << 'e' << 7;
+ QTest::newRow("de_DE 0,035003945 g 8") << QString("de_DE") << QString("0,035003945") << 0.035003945 << 'g' << 8;
+
+ QTest::newRow("C 0.000003945 f 12") << QString("C") << QString("0.000003945000") << 0.000003945 << 'f' << 12;
+ QTest::newRow("C 0.000003945 f 6") << QString("C") << QString("0.000004") << 0.000003945 << 'f' << 6;
+ QTest::newRow("C 0.000003945 e 6") << QString("C") << QString("3.945000e-06") << 0.000003945 << 'e' << 6;
+ QTest::newRow("C 0.000003945 e 0") << QString("C") << QString("4e-06") << 0.000003945 << 'e' << 0;
+ QTest::newRow("C 0.000003945 g 7") << QString("C") << QString("3.945e-06") << 0.000003945 << 'g' << 7;
+ QTest::newRow("C 0.000003945 g 1") << QString("C") << QString("4e-06") << 0.000003945 << 'g' << 1;
+
+ QTest::newRow("C 0.000003945 f 9") << QString("C") << QString("0.000003945") << 0.000003945 << 'f' << 9;
+ QTest::newRow("C 0.000003945 e 3") << QString("C") << QString("3.945e-06") << 0.000003945 << 'e' << 3;
+ QTest::newRow("C 0.000003945 g 4") << QString("C") << QString("3.945e-06") << 0.000003945 << 'g' << 4;
+
+ QTest::newRow("de_DE 0,000003945 f 9") << QString("de_DE") << QString("0,000003945") << 0.000003945 << 'f' << 9;
+ QTest::newRow("de_DE 0,000003945 e 3") << QString("de_DE") << QString("3,945e-06") << 0.000003945 << 'e' << 3;
+ QTest::newRow("de_DE 0,000003945 g 4") << QString("de_DE") << QString("3,945e-06") << 0.000003945 << 'g' << 4;
+
+ QTest::newRow("C 12456789012 f 3") << QString("C") << QString("12456789012.000") << 12456789012.0 << 'f' << 3;
+ QTest::newRow("C 12456789012 e 13") << QString("C") << QString("1.2456789012000e+10") << 12456789012.0 << 'e' << 13;
+ QTest::newRow("C 12456789012 e 7") << QString("C") << QString("1.2456789e+10") << 12456789012.0 << 'e' << 7;
+ QTest::newRow("C 12456789012 g 14") << QString("C") << QString("12456789012") << 12456789012.0 << 'g' << 14;
+ QTest::newRow("C 12456789012 g 8") << QString("C") << QString("1.2456789e+10") << 12456789012.0 << 'g' << 8;
+
+ QTest::newRow("C 12456789012 f 0") << QString("C") << QString("12456789012") << 12456789012.0 << 'f' << 0;
+ QTest::newRow("C 12456789012 e 10") << QString("C") << QString("1.2456789012e+10") << 12456789012.0 << 'e' << 10;
+ QTest::newRow("C 12456789012 g 11") << QString("C") << QString("12456789012") << 12456789012.0 << 'g' << 11;
+
+ QTest::newRow("de_DE 12456789012 f 0") << QString("de_DE") << QString("12.456.789.012") << 12456789012.0 << 'f' << 0;
+ QTest::newRow("de_DE 12456789012 e 10") << QString("de_DE") << QString("1,2456789012e+10") << 12456789012.0 << 'e' << 10;
+ QTest::newRow("de_DE 12456789012 g 11") << QString("de_DE") << QString("12.456.789.012") << 12456789012.0 << 'g' << 11;
+}
+
+void tst_QLocale::doubleToString()
+{
+ QFETCH(QString, locale_name);
+ QFETCH(QString, num_str);
+ QFETCH(double, num);
+ QFETCH(char, mode);
+ QFETCH(int, precision);
+
+ const QLocale locale(locale_name);
+ QCOMPARE(locale.toString(num, mode, precision), num_str);
+
+ char *currentLocale = setlocale(LC_ALL, "de_DE");
+ QCOMPARE(locale.toString(num, mode, precision), num_str);
+ setlocale(LC_ALL, currentLocale);
+}
+
void tst_QLocale::long_long_conversion_data()
{
QTest::addColumn<QString>("locale_name");
@@ -952,7 +1044,8 @@ void tst_QLocale::fpExceptions()
#define _EM_INEXACT 0x00000001
#endif
- // check that qdtoa doesn't throw floating point exceptions when they are enabled
+ // check that double-to-string conversion doesn't throw floating point exceptions when they are
+ // enabled
#ifdef Q_OS_WIN
unsigned int oldbits = _control87(0, 0);
_control87( 0 | _EM_INEXACT, _MCW_EM );
@@ -1278,13 +1371,13 @@ void tst_QLocale::formatTimeZone()
QLocale enUS("en_US");
QDateTime dt1(QDate(2013, 1, 1), QTime(1, 0, 0), Qt::OffsetFromUTC, 60 * 60);
- QCOMPARE(enUS.toString(dt1, "t"), QString("UTC+01:00"));
+ QCOMPARE(enUS.toString(dt1, "t"), QLatin1String("UTC+01:00"));
QDateTime dt2(QDate(2013, 1, 1), QTime(1, 0, 0), Qt::OffsetFromUTC, -60 * 60);
- QCOMPARE(enUS.toString(dt2, "t"), QString("UTC-01:00"));
+ QCOMPARE(enUS.toString(dt2, "t"), QLatin1String("UTC-01:00"));
QDateTime dt3(QDate(2013, 1, 1), QTime(0, 0, 0), Qt::UTC);
- QCOMPARE(enUS.toString(dt3, "t"), QString("UTC"));
+ QCOMPARE(enUS.toString(dt3, "t"), QLatin1String("UTC"));
// LocalTime should vary
if (europeanTimeZone) {
@@ -1293,14 +1386,14 @@ void tst_QLocale::formatTimeZone()
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "Windows only returns long name (QTBUG-32759)", Continue);
#endif // Q_OS_WIN
- QCOMPARE(enUS.toString(dt4, "t"), QString("CET"));
+ QCOMPARE(enUS.toString(dt4, "t"), QLatin1String("CET"));
// Time definitely in Daylight Time
QDateTime dt5(QDate(2013, 6, 1), QTime(0, 0, 0), Qt::LocalTime);
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "Windows only returns long name (QTBUG-32759)", Continue);
#endif // Q_OS_WIN
- QCOMPARE(enUS.toString(dt5, "t"), QString("CEST"));
+ QCOMPARE(enUS.toString(dt5, "t"), QLatin1String("CEST"));
} else {
QSKIP("You must test using Central European (CET/CEST) time zone, e.g. TZ=Europe/Oslo");
}
@@ -1309,13 +1402,13 @@ void tst_QLocale::formatTimeZone()
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "QTimeZone windows backend only returns long name", Continue);
#endif
- QCOMPARE(enUS.toString(dt6, "t"), QString("CET"));
+ QCOMPARE(enUS.toString(dt6, "t"), QLatin1String("CET"));
QDateTime dt7(QDate(2013, 6, 1), QTime(0, 0, 0), QTimeZone("Europe/Berlin"));
#ifdef Q_OS_WIN
QEXPECT_FAIL("", "QTimeZone windows backend only returns long name", Continue);
#endif
- QCOMPARE(enUS.toString(dt7, "t"), QString("CEST"));
+ QCOMPARE(enUS.toString(dt7, "t"), QLatin1String("CEST"));
// Current datetime should return current abbreviation
QCOMPARE(enUS.toString(QDateTime::currentDateTime(), "t"),
@@ -1461,9 +1554,9 @@ void tst_QLocale::macDefaultLocale()
if (timeString.contains(QString("GMT"))) {
QString expectedGMTSpecifierBase("GMT");
if (diff >= 0)
- expectedGMTSpecifierBase.append("+");
+ expectedGMTSpecifierBase.append(QLatin1Char('+'));
else
- expectedGMTSpecifierBase.append("-");
+ expectedGMTSpecifierBase.append(QLatin1Char('-'));
QString expectedGMTSpecifier = expectedGMTSpecifierBase + QString("%1").arg(qAbs(diff));
QString expectedGMTSpecifierZeroExtended = expectedGMTSpecifierBase + QString("0%1").arg(qAbs(diff));
@@ -1698,9 +1791,11 @@ void tst_QLocale::testNames_data()
for (int i = 0; i < locale_data_count; ++i) {
const QLocaleData &item = locale_data[i];
- const QString testName = QString::fromLatin1("data_%1 (%2/%3)").arg(i)
- .arg(QLocale::languageToString((QLocale::Language)item.m_language_id))
- .arg(QLocale::countryToString((QLocale::Country)item.m_country_id));
+
+ const QString testName = QLatin1String("data_") + QString::number(i) + QLatin1String(" (")
+ + QLocale::languageToString((QLocale::Language)item.m_language_id)
+ + QLatin1Char('/') + QLocale::countryToString((QLocale::Country)item.m_country_id)
+ + QLatin1Char(')');
QTest::newRow(testName.toLatin1().constData()) << (int)item.m_language_id << (int)item.m_country_id;
}
}
@@ -1828,13 +1923,27 @@ void tst_QLocale::underflowOverflow()
a(QLatin1String("0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001e10"));
bool ok = false;
- a.toDouble(&ok);
+ double d = a.toDouble(&ok);
QVERIFY(!ok);
+ QCOMPARE(d, 0.0);
a = QLatin1String("1e600");
ok = false;
- a.toDouble(&ok);
+ d = a.toDouble(&ok);
+ QVERIFY(!ok); // detectable overflow
+ QVERIFY(qIsInf(d));
+
+ a = QLatin1String("-1e600");
+ ok = false;
+ d = a.toDouble(&ok);
+ QVERIFY(!ok); // detectable underflow
+ QVERIFY(qIsInf(-d));
+
+ a = QLatin1String("1e-600");
+ ok = false;
+ d = a.toDouble(&ok);
QVERIFY(!ok);
+ QCOMPARE(d, 0.0);
a = QLatin1String("-9223372036854775809");
a.toLongLong(&ok);
diff --git a/tests/auto/corelib/tools/qmap/qmap.pro b/tests/auto/corelib/tools/qmap/qmap.pro
index 460b6654fb..27820a76c8 100644
--- a/tests/auto/corelib/tools/qmap/qmap.pro
+++ b/tests/auto/corelib/tools/qmap/qmap.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmap
QT = core testlib
SOURCES = $$PWD/tst_qmap.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qmap/tst_qmap.cpp b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
index bb6535b635..daaabbb523 100644
--- a/tests/auto/corelib/tools/qmap/tst_qmap.cpp
+++ b/tests/auto/corelib/tools/qmap/tst_qmap.cpp
@@ -413,24 +413,24 @@ void tst_QMap::key()
QCOMPARE(map1.key(1, def), def);
map1.insert("one", 1);
- QCOMPARE(map1.key(1), QString("one"));
- QCOMPARE(map1.key(1, def), QString("one"));
+ QCOMPARE(map1.key(1), QLatin1String("one"));
+ QCOMPARE(map1.key(1, def), QLatin1String("one"));
QCOMPARE(map1.key(2), QString());
QCOMPARE(map1.key(2, def), def);
map1.insert("two", 2);
- QCOMPARE(map1.key(1), QString("one"));
- QCOMPARE(map1.key(1, def), QString("one"));
- QCOMPARE(map1.key(2), QString("two"));
- QCOMPARE(map1.key(2, def), QString("two"));
+ QCOMPARE(map1.key(1), QLatin1String("one"));
+ QCOMPARE(map1.key(1, def), QLatin1String("one"));
+ QCOMPARE(map1.key(2), QLatin1String("two"));
+ QCOMPARE(map1.key(2, def), QLatin1String("two"));
QCOMPARE(map1.key(3), QString());
QCOMPARE(map1.key(3, def), def);
map1.insert("deux", 2);
- QCOMPARE(map1.key(1), QString("one"));
- QCOMPARE(map1.key(1, def), QString("one"));
- QVERIFY(map1.key(2) == "deux" || map1.key(2) == "two");
- QVERIFY(map1.key(2, def) == "deux" || map1.key(2, def) == "two");
+ QCOMPARE(map1.key(1), QLatin1String("one"));
+ QCOMPARE(map1.key(1, def), QLatin1String("one"));
+ QVERIFY(map1.key(2) == QLatin1String("deux") || map1.key(2) == QLatin1String("two"));
+ QVERIFY(map1.key(2, def) == QLatin1String("deux") || map1.key(2, def) == QLatin1String("two"));
QCOMPARE(map1.key(3), QString());
QCOMPARE(map1.key(3, def), def);
}
@@ -608,8 +608,8 @@ void tst_QMap::find()
map1.insert(1,"Mayer");
map1.insert(2,"Hej");
- QVERIFY(map1.find(1).value() == "Mayer");
- QVERIFY(map1.find(2).value() == "Hej");
+ QCOMPARE(map1.find(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.find(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -643,8 +643,8 @@ void tst_QMap::constFind()
QVERIFY(map1.constFind(4) == map1.constEnd());
- QVERIFY(map1.constFind(1).value() == "Mayer");
- QVERIFY(map1.constFind(2).value() == "Hej");
+ QCOMPARE(map1.constFind(1).value(), QLatin1String("Mayer"));
+ QCOMPARE(map1.constFind(2).value(), QLatin1String("Hej"));
for(i = 3; i < 10; ++i) {
compareString = testString.arg(i);
@@ -705,10 +705,10 @@ void tst_QMap::lowerUpperBound()
QCOMPARE(map1.lowerBound(5).key(), 5);
QCOMPARE(map1.lowerBound(6).key(), 7);
QCOMPARE(map1.lowerBound(7).key(), 7);
- QCOMPARE(map1.lowerBound(6).value(), QString("seven_2"));
- QCOMPARE(map1.lowerBound(7).value(), QString("seven_2"));
- QCOMPARE((++map1.lowerBound(6)).value(), QString("seven"));
- QCOMPARE((++map1.lowerBound(7)).value(), QString("seven"));
+ QCOMPARE(map1.lowerBound(6).value(), QLatin1String("seven_2"));
+ QCOMPARE(map1.lowerBound(7).value(), QLatin1String("seven_2"));
+ QCOMPARE((++map1.lowerBound(6)).value(), QLatin1String("seven"));
+ QCOMPARE((++map1.lowerBound(7)).value(), QLatin1String("seven"));
QCOMPARE(map1.lowerBound(10).key(), 10);
QVERIFY(map1.lowerBound(999) == map1.end());
}
@@ -733,11 +733,11 @@ void tst_QMap::mergeCompare()
map1b.unite(map2b);
sanityCheckTree(map1b, __LINE__);
- QVERIFY(map1.value(1) == "ett");
- QVERIFY(map1.value(2) == "tvo");
- QVERIFY(map1.value(3) == "tre");
- QVERIFY(map1.value(4) == "fyra");
- QVERIFY(map1.value(5) == "fem");
+ QCOMPARE(map1.value(1), QLatin1String("ett"));
+ QCOMPARE(map1.value(2), QLatin1String("tvo"));
+ QCOMPARE(map1.value(3), QLatin1String("tre"));
+ QCOMPARE(map1.value(4), QLatin1String("fyra"));
+ QCOMPARE(map1.value(5), QLatin1String("fem"));
map3.insert(1, "ett");
map3.insert(2, "tvo");
@@ -755,7 +755,7 @@ void tst_QMap::take()
map.insert(2, "zwei");
map.insert(3, "drei");
- QVERIFY(map.take(3) == "drei");
+ QCOMPARE(map.take(3), QLatin1String("drei"));
QVERIFY(!map.contains(3));
}
@@ -771,19 +771,19 @@ void tst_QMap::iterators()
//STL-Style iterators
QMap<int, QString>::iterator stlIt = map.begin();
- QVERIFY(stlIt.value() == "Teststring 1");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 1"));
stlIt+=5;
- QVERIFY(stlIt.value() == "Teststring 6");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 6"));
stlIt++;
- QVERIFY(stlIt.value() == "Teststring 7");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 7"));
stlIt-=3;
- QVERIFY(stlIt.value() == "Teststring 4");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 4"));
stlIt--;
- QVERIFY(stlIt.value() == "Teststring 3");
+ QCOMPARE(stlIt.value(), QLatin1String("Teststring 3"));
for(stlIt = map.begin(), i = 1; stlIt != map.end(); ++stlIt, ++i)
QVERIFY(stlIt.value() == testString.arg(i));
@@ -792,19 +792,19 @@ void tst_QMap::iterators()
//STL-Style const-iterators
QMap<int, QString>::const_iterator cstlIt = map.constBegin();
- QVERIFY(cstlIt.value() == "Teststring 1");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 1"));
cstlIt+=5;
- QVERIFY(cstlIt.value() == "Teststring 6");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 6"));
cstlIt++;
- QVERIFY(cstlIt.value() == "Teststring 7");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 7"));
cstlIt-=3;
- QVERIFY(cstlIt.value() == "Teststring 4");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 4"));
cstlIt--;
- QVERIFY(cstlIt.value() == "Teststring 3");
+ QCOMPARE(cstlIt.value(), QLatin1String("Teststring 3"));
for(cstlIt = map.constBegin(), i = 1; cstlIt != map.constEnd(); ++cstlIt, ++i)
QVERIFY(cstlIt.value() == testString.arg(i));
@@ -1062,7 +1062,7 @@ void tst_QMap::equal_range()
QCOMPARE(cresult.second, cmap.cend());
for (int i = -10; i < 10; i += 2)
- map.insert(i, QString("%1").arg(i));
+ map.insert(i, QString::number(i));
result = map.equal_range(0);
QCOMPARE(result.first, map.find(0));
diff --git a/tests/auto/corelib/tools/qmargins/qmargins.pro b/tests/auto/corelib/tools/qmargins/qmargins.pro
index 25fe715edf..696f9374a2 100644
--- a/tests/auto/corelib/tools/qmargins/qmargins.pro
+++ b/tests/auto/corelib/tools/qmargins/qmargins.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmargins
QT = core testlib
SOURCES = tst_qmargins.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro b/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro
index afd0c1176d..a62b702f22 100644
--- a/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro
+++ b/tests/auto/corelib/tools/qmessageauthenticationcode/qmessageauthenticationcode.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qmessageauthenticationcode
QT = core testlib
SOURCES = tst_qmessageauthenticationcode.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qpair/qpair.pro b/tests/auto/corelib/tools/qpair/qpair.pro
index c49215cb1c..659be887d3 100644
--- a/tests/auto/corelib/tools/qpair/qpair.pro
+++ b/tests/auto/corelib/tools/qpair/qpair.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qpair
QT = core testlib
SOURCES = tst_qpair.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qpoint/qpoint.pro b/tests/auto/corelib/tools/qpoint/qpoint.pro
index 0923abbc88..8321d08fe0 100644
--- a/tests/auto/corelib/tools/qpoint/qpoint.pro
+++ b/tests/auto/corelib/tools/qpoint/qpoint.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qpoint
QT = core testlib
SOURCES = tst_qpoint.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qpointf/qpointf.pro b/tests/auto/corelib/tools/qpointf/qpointf.pro
index 1c594cd47c..5715b95d96 100644
--- a/tests/auto/corelib/tools/qpointf/qpointf.pro
+++ b/tests/auto/corelib/tools/qpointf/qpointf.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qpointf
QT = core testlib
SOURCES = tst_qpointf.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qqueue/qqueue.pro b/tests/auto/corelib/tools/qqueue/qqueue.pro
index 7b1e28baf3..55ceb65fbd 100644
--- a/tests/auto/corelib/tools/qqueue/qqueue.pro
+++ b/tests/auto/corelib/tools/qqueue/qqueue.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qqueue
QT = core testlib
SOURCES = tst_qqueue.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qrect/qrect.pro b/tests/auto/corelib/tools/qrect/qrect.pro
index 06fe15b0d6..8ec31db215 100644
--- a/tests/auto/corelib/tools/qrect/qrect.pro
+++ b/tests/auto/corelib/tools/qrect/qrect.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qrect
QT = core testlib
SOURCES = tst_qrect.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregexp/qregexp.pro b/tests/auto/corelib/tools/qregexp/qregexp.pro
index d8f67eed25..5f6ff0a71c 100644
--- a/tests/auto/corelib/tools/qregexp/qregexp.pro
+++ b/tests/auto/corelib/tools/qregexp/qregexp.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregexp
QT = core testlib
SOURCES = tst_qregexp.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp b/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp
index b9a3fc13c5..1d8b719d16 100644
--- a/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp
+++ b/tests/auto/corelib/tools/qregexp/tst_qregexp.cpp
@@ -880,19 +880,19 @@ void tst_QRegExp::caretAnchoredOptimization()
{
QString s = "---babnana----";
s.replace( QRegExp("^-*|(-*)$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
s = "---babnana----";
s.replace( QRegExp("^-*|(-{0,})$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
s = "---babnana----";
s.replace( QRegExp("^-*|(-{1,})$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
s = "---babnana----";
s.replace( QRegExp("^-*|(-+)$"), "" );
- QVERIFY(s == "babnana");
+ QCOMPARE(s, QLatin1String("babnana"));
}
void tst_QRegExp::isEmpty()
@@ -1370,12 +1370,14 @@ void tst_QRegExp::escapeSequences()
{
QString perlSyntaxSpecialChars("0123456789afnrtvbBdDwWsSx\\|[]{}()^$?+*");
QString w3cXmlSchema11SyntaxSpecialChars("cCiIpP"); // as well as the perl ones
+ QString pattern = QLatin1String("\\?");
for (int i = ' '; i <= 127; ++i) {
QLatin1Char c(i);
if (perlSyntaxSpecialChars.indexOf(c) == -1) {
- QRegExp rx(QString("\\%1").arg(c), Qt::CaseSensitive, QRegExp::RegExp);
+ pattern[1] = c;
+ QRegExp rx(pattern, Qt::CaseSensitive, QRegExp::RegExp);
// we'll never have c == 'a' since it's a special character
- QString s = QString("aaa%1aaa").arg(c);
+ const QString s = QLatin1String("aaa") + c + QLatin1String("aaa");
QCOMPARE(rx.indexIn(s), 3);
rx.setPatternSyntax(QRegExp::RegExp2);
diff --git a/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro b/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro
index 3ecf16918c..a27286ff20 100644
--- a/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro
+++ b/tests/auto/corelib/tools/qregularexpression/alwaysoptimize/alwaysoptimize.pro
@@ -1,8 +1,7 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpression_alwaysoptimize
QT = core testlib
HEADERS = ../tst_qregularexpression.h
SOURCES = \
tst_qregularexpression_alwaysoptimize.cpp \
../tst_qregularexpression.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro b/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro
index 9e366c0f48..0b36c79c1b 100644
--- a/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro
+++ b/tests/auto/corelib/tools/qregularexpression/defaultoptimize/defaultoptimize.pro
@@ -1,8 +1,7 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpression_defaultoptimize
QT = core testlib
HEADERS = ../tst_qregularexpression.h
SOURCES = \
tst_qregularexpression_defaultoptimize.cpp \
../tst_qregularexpression.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro b/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro
index d34bc9b93d..1db77781dd 100644
--- a/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro
+++ b/tests/auto/corelib/tools/qregularexpression/forceoptimize/forceoptimize.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpression_forceoptimize
QT = core testlib
HEADERS = ../tst_qregularexpression.h
diff --git a/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp b/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
index 8ddd4979b6..6be4e69eb7 100644
--- a/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
+++ b/tests/auto/corelib/tools/qregularexpression/tst_qregularexpression.cpp
@@ -656,7 +656,7 @@ void tst_QRegularExpression::normalMatch_data()
m.captured << "c123def" << "c12" << "3" << "def";
offset = 2;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("match06-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("match06-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("(\\w*)(\\d+)(\\w*)")
<< QStringLiteral("abc123def").mid(offset - i)
<< i
@@ -669,7 +669,7 @@ void tst_QRegularExpression::normalMatch_data()
m.captured << QString("");
offset = 9;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("match07-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("match07-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("\\w*")
<< QStringLiteral("abc123def").mid(offset - i)
<< i
@@ -747,7 +747,7 @@ void tst_QRegularExpression::normalMatch_data()
m.isValid = true;
offset = 1;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("nomatch02-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("nomatch02-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("(\\w+) (\\w+)")
<< QStringLiteral("a string").mid(offset - i)
<< i
@@ -759,7 +759,7 @@ void tst_QRegularExpression::normalMatch_data()
m.isValid = true;
offset = 9;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("nomatch03-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("nomatch03-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("\\w+")
<< QStringLiteral("abc123def").mid(offset - i)
<< i
@@ -930,7 +930,7 @@ void tst_QRegularExpression::partialMatch_data()
m.captured << "def";
offset = 1;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("softmatch08-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("softmatch08-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("abc\\w+X|defY")
<< QStringLiteral("abcdef").mid(offset - i)
<< i
@@ -1016,7 +1016,7 @@ void tst_QRegularExpression::partialMatch_data()
m.captured << "def";
offset = 1;
for (int i = 0; i <= offset; ++i) {
- QTest::newRow(QStringLiteral("hardmatch08-offset%1").arg(i).toUtf8().constData())
+ QTest::newRow(("hardmatch08-offset" + QByteArray::number(i)).constData())
<< QRegularExpression("abc\\w+X|defY")
<< QStringLiteral("abcdef").mid(offset - i)
<< i
diff --git a/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro b/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro
index 0618b03309..c63544035a 100644
--- a/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro
+++ b/tests/auto/corelib/tools/qringbuffer/qringbuffer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qringbuffer
QT = core-private testlib
SOURCES = tst_qringbuffer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp b/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp
index 77fc6ad6ae..b77fe23bd6 100644
--- a/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp
+++ b/tests/auto/corelib/tools/qringbuffer/tst_qringbuffer.cpp
@@ -39,11 +39,11 @@ class tst_QRingBuffer : public QObject
{
Q_OBJECT
private slots:
+ void constructing();
void readPointerAtPositionWriteRead();
void readPointerAtPositionEmptyRead();
void readPointerAtPositionWithHead();
void readPointerAtPositionReadTooMuch();
- void sizeWhenEmpty();
void sizeWhenReservedAndChopped();
void sizeWhenReserved();
void free();
@@ -57,6 +57,23 @@ private slots:
void readLine();
};
+void tst_QRingBuffer::constructing()
+{
+ QRingBuffer ringBuffer;
+
+ QCOMPARE(ringBuffer.size(), Q_INT64_C(0));
+ QVERIFY(ringBuffer.isEmpty());
+ QCOMPARE(ringBuffer.nextDataBlockSize(), Q_INT64_C(0));
+ QVERIFY(ringBuffer.readPointer() == Q_NULLPTR);
+ QCOMPARE(ringBuffer.skip(5), Q_INT64_C(0));
+ QCOMPARE(ringBuffer.read(), QByteArray());
+ QCOMPARE(ringBuffer.getChar(), -1);
+ QVERIFY(!ringBuffer.canReadLine());
+
+ char buf[5];
+ QCOMPARE(ringBuffer.peek(buf, sizeof(buf)), Q_INT64_C(0));
+}
+
void tst_QRingBuffer::sizeWhenReserved()
{
QRingBuffer ringBuffer;
@@ -74,13 +91,6 @@ void tst_QRingBuffer::sizeWhenReservedAndChopped()
QCOMPARE(ringBuffer.size(), Q_INT64_C(0));
}
-void tst_QRingBuffer::sizeWhenEmpty()
-{
- QRingBuffer ringBuffer;
-
- QCOMPARE(ringBuffer.size(), Q_INT64_C(0));
-}
-
void tst_QRingBuffer::readPointerAtPositionReadTooMuch()
{
QRingBuffer ringBuffer;
@@ -140,7 +150,7 @@ void tst_QRingBuffer::readPointerAtPositionWriteRead()
inData.putChar(0x23);
inData.write("Qt rocks!");
for (int i = 0; i < 5000; i++)
- inData.write(QString("Number %1").arg(i).toUtf8());
+ inData.write("Number " + QByteArray::number(i));
inData.reset();
QVERIFY(inData.size() > 0);
@@ -284,7 +294,8 @@ void tst_QRingBuffer::indexOf()
for (int i = 1; i < 256; ++i) {
qint64 index = ringBuffer.indexOf(char(i));
QCOMPARE(index, qint64(i - 1));
- QCOMPARE(ringBuffer.indexOf(char(i), i), index);
+ QCOMPARE(ringBuffer.indexOf(char(i), i, i >> 1), index);
+ QCOMPARE(ringBuffer.indexOf(char(i), 256, i), Q_INT64_C(-1));
QCOMPARE(ringBuffer.indexOf(char(i), i - 1), -1); // test for absent char
}
}
diff --git a/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro b/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro
index 5fa529e175..5248ad5528 100644
--- a/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro
+++ b/tests/auto/corelib/tools/qscopedpointer/qscopedpointer.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qscopedpointer
QT = core testlib
SOURCES = tst_qscopedpointer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro b/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro
index f823e6284b..c9c0a029d3 100644
--- a/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro
+++ b/tests/auto/corelib/tools/qscopedvaluerollback/qscopedvaluerollback.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qscopedvaluerollback
QT = core testlib
SOURCES = tst_qscopedvaluerollback.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qset/qset.pro b/tests/auto/corelib/tools/qset/qset.pro
index 8b5cdbc3f0..10ae3307d1 100644
--- a/tests/auto/corelib/tools/qset/qset.pro
+++ b/tests/auto/corelib/tools/qset/qset.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qset
QT = core testlib
SOURCES = tst_qset.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qset/tst_qset.cpp b/tests/auto/corelib/tools/qset/tst_qset.cpp
index fe4d81085c..f8f368f51c 100644
--- a/tests/auto/corelib/tools/qset/tst_qset.cpp
+++ b/tests/auto/corelib/tools/qset/tst_qset.cpp
@@ -753,7 +753,7 @@ void tst_QSet::stlMutableIterator()
QSet<QString>::const_iterator k = set2.insert("foo");
i = reinterpret_cast<QSet<QString>::iterator &>(k);
// #endif
- QVERIFY(*i == "foo");
+ QCOMPARE(*i, QLatin1String("foo"));
}
}
diff --git a/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro b/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
index 2e8e335472..240137d563 100644
--- a/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
+++ b/tests/auto/corelib/tools/qsharedpointer/qsharedpointer.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsharedpointer
QT = core testlib
diff --git a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
index 7741803224..d88a70c1e5 100644
--- a/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
+++ b/tests/auto/corelib/tools/qsharedpointer/tst_qsharedpointer.cpp
@@ -63,6 +63,7 @@ private slots:
void basics();
void operators();
void swap();
+ void moveSemantics();
void useOfForwardDeclared();
void memoryManagement();
void dropLastReferenceOfForwardDeclared();
@@ -411,6 +412,66 @@ void tst_QSharedPointer::swap()
QVERIFY(w2.isNull());
}
+void tst_QSharedPointer::moveSemantics()
+{
+#ifdef Q_COMPILER_RVALUE_REFS
+ QSharedPointer<int> p1, p2(new int(42)), control = p2;
+ QVERIFY(p1 != control);
+ QVERIFY(p1.isNull());
+ QVERIFY(p2 == control);
+ QVERIFY(!p2.isNull());
+ QVERIFY(*p2 == 42);
+
+ // move assignment
+ p1 = std::move(p2);
+ QVERIFY(p1 == control);
+ QVERIFY(!p1.isNull());
+ QVERIFY(p2 != control);
+ QVERIFY(p2.isNull());
+ QVERIFY(*p1 == 42);
+
+ // move construction
+ QSharedPointer<int> p3 = std::move(p1);
+ QVERIFY(p1 != control);
+ QVERIFY(p1.isNull());
+ QVERIFY(p3 == control);
+ QVERIFY(!p3.isNull());
+ QVERIFY(*p3 == 42);
+
+ QWeakPointer<int> w1, w2 = control;
+
+ QVERIFY(w1.isNull());
+ QVERIFY(!w2.isNull());
+ QVERIFY(w2.lock() == control);
+ QVERIFY(!w1.lock());
+
+ // move assignment
+ w1 = std::move(w2);
+ QVERIFY(w2.isNull());
+ QVERIFY(!w1.isNull());
+ QVERIFY(w1.lock() == control);
+ QVERIFY(!w2.lock());
+
+ // move construction
+ QWeakPointer<int> w3 = std::move(w1);
+ QVERIFY(w1.isNull());
+ QVERIFY(!w3.isNull());
+ QVERIFY(w3.lock() == control);
+ QVERIFY(!w1.lock());
+
+ p1.reset();
+ p2.reset();
+ p3.reset();
+ control.reset();
+
+ QVERIFY(w1.isNull());
+ QVERIFY(w2.isNull());
+ QVERIFY(w3.isNull());
+#else
+ QSKIP("This test requires C++11 rvalue/move semantics support in the compiler.");
+#endif
+}
+
void tst_QSharedPointer::useOfForwardDeclared()
{
// this just a compile test: use the forward-declared class
diff --git a/tests/auto/corelib/tools/qsize/qsize.pro b/tests/auto/corelib/tools/qsize/qsize.pro
index 310194ad12..9462e98e49 100644
--- a/tests/auto/corelib/tools/qsize/qsize.pro
+++ b/tests/auto/corelib/tools/qsize/qsize.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsize
QT = core testlib
SOURCES = tst_qsize.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qsizef/qsizef.pro b/tests/auto/corelib/tools/qsizef/qsizef.pro
index c456e450fd..f5ba220b06 100644
--- a/tests/auto/corelib/tools/qsizef/qsizef.pro
+++ b/tests/auto/corelib/tools/qsizef/qsizef.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qsizef
QT = core testlib
SOURCES = tst_qsizef.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstl/qstl.pro b/tests/auto/corelib/tools/qstl/qstl.pro
index 88fb53c6c6..e57e62b828 100644
--- a/tests/auto/corelib/tools/qstl/qstl.pro
+++ b/tests/auto/corelib/tools/qstl/qstl.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstl
QT = core testlib
SOURCES = tst_qstl.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstring/qstring.pro b/tests/auto/corelib/tools/qstring/qstring.pro
index 1eda27e1ff..1ff9a4fc9e 100644
--- a/tests/auto/corelib/tools/qstring/qstring.pro
+++ b/tests/auto/corelib/tools/qstring/qstring.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstring
QT = core testlib
SOURCES = tst_qstring.cpp
@@ -7,6 +7,10 @@ contains(QT_CONFIG,icu):DEFINES += QT_USE_ICU
contains(QT_CONFIG,c++11): CONFIG += c++11
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
+!contains(QT_CONFIG, doubleconversion):!contains(QT_CONFIG, system-doubleconversion) {
+ DEFINES += QT_NO_DOUBLECONVERSION
+}
+
mac {
OBJECTIVE_SOURCES += tst_qstring_mac.mm
LIBS += -framework Foundation
diff --git a/tests/auto/corelib/tools/qstring/tst_qstring.cpp b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
index d18aa9f5f3..cb911853e8 100644
--- a/tests/auto/corelib/tools/qstring/tst_qstring.cpp
+++ b/tests/auto/corelib/tools/qstring/tst_qstring.cpp
@@ -63,7 +63,7 @@
#include <algorithm>
#define CREATE_REF(string) \
- const QString padded = QString::fromLatin1(" %1 ").arg(string); \
+ const QString padded = QLatin1Char(' ') + string + QLatin1Char(' '); \
QStringRef ref = padded.midRef(1, padded.size() - 2);
namespace {
@@ -969,61 +969,61 @@ void tst_QString::acc_01()
QString f;
f = e;
f[7]='F';
- QCOMPARE(e,(QString)"String E");
+ QCOMPARE(e, QLatin1String("String E"));
char text[]="String f";
f = text;
text[7]='!';
- QCOMPARE(f,(QString)"String f");
+ QCOMPARE(f, QLatin1String("String f"));
f[7]='F';
QCOMPARE(text[7],'!');
a="";
a[0]='A';
- QCOMPARE(a,(QString)"A");
+ QCOMPARE(a, QLatin1String("A"));
QCOMPARE(a.length(),1);
a[1]='B';
- QCOMPARE(a,(QString)"AB");
+ QCOMPARE(a, QLatin1String("AB"));
QCOMPARE(a.length(),2);
a[2]='C';
- QCOMPARE(a,(QString)"ABC");
+ QCOMPARE(a, QLatin1String("ABC"));
QCOMPARE(a.length(),3);
a = QString();
QVERIFY(a.isNull());
a[0]='A';
- QCOMPARE(a,(QString)"A");
+ QCOMPARE(a, QLatin1String("A"));
QCOMPARE(a.length(),1);
a[1]='B';
- QCOMPARE(a,(QString)"AB");
+ QCOMPARE(a, QLatin1String("AB"));
QCOMPARE(a.length(),2);
a[2]='C';
- QCOMPARE(a,(QString)"ABC");
+ QCOMPARE(a, QLatin1String("ABC"));
QCOMPARE(a.length(),3);
a="123";
b="456";
a[0]=a[1];
- QCOMPARE(a,(QString)"223");
+ QCOMPARE(a, QLatin1String("223"));
a[1]=b[1];
- QCOMPARE(b,(QString)"456");
- QCOMPARE(a,(QString)"253");
+ QCOMPARE(b, QLatin1String("456"));
+ QCOMPARE(a, QLatin1String("253"));
char t[]="TEXT";
a="A";
a=t;
- QCOMPARE(a,(QString)"TEXT");
+ QCOMPARE(a, QLatin1String("TEXT"));
QCOMPARE(a,(QString)t);
a[0]='X';
- QCOMPARE(a,(QString)"XEXT");
+ QCOMPARE(a, QLatin1String("XEXT"));
QCOMPARE(t[0],'T');
t[0]='Z';
- QCOMPARE(a,(QString)"XEXT");
+ QCOMPARE(a, QLatin1String("XEXT"));
a="ABC";
QCOMPARE(char(a.toLatin1()[1]),'B');
- QCOMPARE(strcmp(a.toLatin1(),((QString)"ABC").toLatin1()),0);
- QCOMPARE(a+="DEF",(QString)"ABCDEF");
- QCOMPARE(a+='G',(QString)"ABCDEFG");
- QCOMPARE(a+=((const char*)(0)),(QString)"ABCDEFG");
+ QCOMPARE(strcmp(a.toLatin1(), QByteArrayLiteral("ABC")), 0);
+ QCOMPARE(a+="DEF", QLatin1String("ABCDEF"));
+ QCOMPARE(a+='G', QLatin1String("ABCDEFG"));
+ QCOMPARE(a+=((const char*)(0)), QLatin1String("ABCDEFG"));
// non-member operators
@@ -1045,11 +1045,11 @@ void tst_QString::acc_01()
QVERIFY(a<=c);
QVERIFY(!(c<=a));
QVERIFY(!(d<=a));
- QCOMPARE(QString(a+b),(QString)"ABCABC");
- QCOMPARE(QString(a+"XXXX"),(QString)"ABCXXXX");
- QCOMPARE(QString(a+'X'),(QString)"ABCX");
- QCOMPARE(QString("XXXX"+a),(QString)"XXXXABC");
- QCOMPARE(QString('X'+a),(QString)"XABC");
+ QCOMPARE(QString(a+b), QLatin1String("ABCABC"));
+ QCOMPARE(QString(a+"XXXX"), QLatin1String("ABCXXXX"));
+ QCOMPARE(QString(a+'X'), QLatin1String("ABCX"));
+ QCOMPARE(QString("XXXX"+a), QLatin1String("XXXXABC"));
+ QCOMPARE(QString('X'+a), QLatin1String("XABC"));
a = (const char*)0;
QVERIFY(a.isNull());
QVERIFY(*a.toLatin1().constData() == '\0');
@@ -1115,7 +1115,7 @@ void tst_QString::constructor()
QVERIFY(a == (QString)"");
QCOMPARE(b,cb);
QCOMPARE(c,cc);
- QCOMPARE(d,(QString)"String D");
+ QCOMPARE(d, QLatin1String("String D"));
QString nullStr;
QVERIFY( nullStr.isNull() );
@@ -1204,11 +1204,11 @@ void tst_QString::truncate()
{
QString e("String E");
e.truncate(4);
- QCOMPARE(e,(QString)"Stri");
+ QCOMPARE(e, QLatin1String("Stri"));
e = "String E";
e.truncate(0);
- QCOMPARE(e,(QString)"");
+ QCOMPARE(e, QLatin1String(""));
QVERIFY(e.isEmpty());
QVERIFY(!e.isNull());
@@ -1218,25 +1218,25 @@ void tst_QString::fill()
{
QString e;
e.fill('e',1);
- QCOMPARE(e,(QString)"e");
+ QCOMPARE(e, QLatin1String("e"));
QString f;
f.fill('f',3);
- QCOMPARE(f,(QString)"fff");
+ QCOMPARE(f, QLatin1String("fff"));
f.fill('F');
- QCOMPARE(f,(QString)"FFF");
+ QCOMPARE(f, QLatin1String("FFF"));
}
void tst_QString::sprintf()
{
QString a;
a.sprintf("COMPARE");
- QCOMPARE(a,(QString)"COMPARE");
+ QCOMPARE(a, QLatin1String("COMPARE"));
a.sprintf("%%%d",1);
- QCOMPARE(a,(QString)"%1");
- QCOMPARE(a.sprintf("X%dY",2),(QString)"X2Y");
- QCOMPARE(a.sprintf("X%9iY", 50000 ),(QString)"X 50000Y");
- QCOMPARE(a.sprintf("X%-9sY","hello"),(QString)"Xhello Y");
- QCOMPARE(a.sprintf("X%-9iY", 50000 ),(QString)"X50000 Y");
+ QCOMPARE(a, QLatin1String("%1"));
+ QCOMPARE(a.sprintf("X%dY",2), QLatin1String("X2Y"));
+ QCOMPARE(a.sprintf("X%9iY", 50000 ), QLatin1String("X 50000Y"));
+ QCOMPARE(a.sprintf("X%-9sY","hello"), QLatin1String("Xhello Y"));
+ QCOMPARE(a.sprintf("X%-9iY", 50000 ), QLatin1String("X50000 Y"));
QCOMPARE(a.sprintf("%lf", 1.23), QString("1.230000"));
QCOMPARE(a.sprintf("%lf", 1.23456789), QString("1.234568"));
QCOMPARE(a.sprintf("%p", (void *)0xbfffd350), QString("0xbfffd350"));
@@ -1253,13 +1253,13 @@ void tst_QString::sprintf()
S1.sprintf("%f",d);
QCOMPARE(S1, QString("-514.256830"));
- QCOMPARE(a.sprintf("%.3s", "Hello" ),(QString)"Hel");
- QCOMPARE(a.sprintf("%10.3s", "Hello" ),(QString)" Hel");
- QCOMPARE(a.sprintf("%.10s", "Hello" ),(QString)"Hello");
- QCOMPARE(a.sprintf("%10.10s", "Hello" ),(QString)" Hello");
- QCOMPARE(a.sprintf("%-10.10s", "Hello" ),(QString)"Hello ");
- QCOMPARE(a.sprintf("%-10.3s", "Hello" ),(QString)"Hel ");
- QCOMPARE(a.sprintf("%-5.5s", "Hello" ),(QString)"Hello");
+ QCOMPARE(a.sprintf("%.3s", "Hello" ), QLatin1String("Hel"));
+ QCOMPARE(a.sprintf("%10.3s", "Hello" ), QLatin1String(" Hel"));
+ QCOMPARE(a.sprintf("%.10s", "Hello" ), QLatin1String("Hello"));
+ QCOMPARE(a.sprintf("%10.10s", "Hello" ), QLatin1String(" Hello"));
+ QCOMPARE(a.sprintf("%-10.10s", "Hello" ), QLatin1String("Hello "));
+ QCOMPARE(a.sprintf("%-10.3s", "Hello" ), QLatin1String("Hel "));
+ QCOMPARE(a.sprintf("%-5.5s", "Hello" ), QLatin1String("Hello"));
// Check utf8 conversion for %s
QCOMPARE(a.sprintf("%s", "\303\266\303\244\303\274\303\226\303\204\303\234\303\270\303\246\303\245\303\230\303\206\303\205"), QString::fromLatin1("\366\344\374\326\304\334\370\346\345\330\306\305"));
@@ -1268,12 +1268,10 @@ void tst_QString::sprintf()
a.sprintf("%s%n%s", "hello", &n1, "goodbye");
QCOMPARE(n1, 5);
QCOMPARE(a, QString("hellogoodbye"));
-#ifndef Q_CC_MINGW // does not know %ll
qlonglong n2;
a.sprintf("%s%s%lln%s", "foo", "bar", &n2, "whiz");
QCOMPARE((int)n2, 6);
QCOMPARE(a, QString("foobarwhiz"));
-#endif
}
/*
@@ -1362,7 +1360,7 @@ void tst_QString::indexOf_data()
QString s2;
s2 += QChar(0x3bc);
QTest::newRow( "data58" ) << s1 << s2 << 0 << false << 3;
- s2.prepend("C");
+ s2.prepend(QLatin1Char('C'));
QTest::newRow( "data59" ) << s1 << s2 << 0 << false << 2;
QString veryBigHaystack(500, 'a');
@@ -1809,9 +1807,9 @@ void tst_QString::left()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.left(3),(QString)"ABC");
+ QCOMPARE(a.left(3), QLatin1String("ABC"));
QVERIFY(!a.left(0).isNull());
- QCOMPARE(a.left(0),(QString)"");
+ QCOMPARE(a.left(0), QLatin1String(""));
QString n;
QVERIFY(n.left(3).isNull());
@@ -1827,10 +1825,10 @@ void tst_QString::leftRef()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.leftRef(3).toString(),(QString)"ABC");
+ QCOMPARE(a.leftRef(3).toString(), QLatin1String("ABC"));
QVERIFY(a.leftRef(0).toString().isEmpty());
- QCOMPARE(a.leftRef(0).toString(),(QString)"");
+ QCOMPARE(a.leftRef(0).toString(), QLatin1String(""));
QString n;
QVERIFY(n.leftRef(3).toString().isEmpty());
@@ -1846,8 +1844,8 @@ void tst_QString::right()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.right(3),(QString)"EFG");
- QCOMPARE(a.right(0),(QString)"");
+ QCOMPARE(a.right(3), QLatin1String("EFG"));
+ QCOMPARE(a.right(0), QLatin1String(""));
QString n;
QVERIFY(n.right(3).isNull());
@@ -1862,8 +1860,8 @@ void tst_QString::rightRef()
{
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.rightRef(3).toString(),(QString)"EFG");
- QCOMPARE(a.rightRef(0).toString(),(QString)"");
+ QCOMPARE(a.rightRef(3).toString(), QLatin1String("EFG"));
+ QCOMPARE(a.rightRef(0).toString(), QLatin1String(""));
QString n;
QVERIFY(n.rightRef(3).toString().isEmpty());
@@ -1879,8 +1877,8 @@ void tst_QString::mid()
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.mid(3,3),(QString)"DEF");
- QCOMPARE(a.mid(0,0),(QString)"");
+ QCOMPARE(a.mid(3,3), QLatin1String("DEF"));
+ QCOMPARE(a.mid(0,0), QLatin1String(""));
QVERIFY(!a.mid(15,0).isNull());
QVERIFY(a.mid(15,0).isEmpty());
QVERIFY(!a.mid(15,1).isNull());
@@ -1958,8 +1956,8 @@ void tst_QString::midRef()
QString a;
a="ABCDEFGHIEfGEFG"; // 15 chars
- QCOMPARE(a.midRef(3,3).toString(),(QString)"DEF");
- QCOMPARE(a.midRef(0,0).toString(),(QString)"");
+ QCOMPARE(a.midRef(3,3).toString(), QLatin1String("DEF"));
+ QCOMPARE(a.midRef(0,0).toString(), QLatin1String(""));
QVERIFY(!a.midRef(15,0).toString().isNull());
QVERIFY(a.midRef(15,0).toString().isEmpty());
QVERIFY(!a.midRef(15,1).toString().isNull());
@@ -2083,44 +2081,44 @@ void tst_QString::leftJustified()
{
QString a;
a="ABC";
- QCOMPARE(a.leftJustified(5,'-'),(QString)"ABC--");
- QCOMPARE(a.leftJustified(4,'-'),(QString)"ABC-");
- QCOMPARE(a.leftJustified(4),(QString)"ABC ");
- QCOMPARE(a.leftJustified(3),(QString)"ABC");
- QCOMPARE(a.leftJustified(2),(QString)"ABC");
- QCOMPARE(a.leftJustified(1),(QString)"ABC");
- QCOMPARE(a.leftJustified(0),(QString)"ABC");
+ QCOMPARE(a.leftJustified(5,'-'), QLatin1String("ABC--"));
+ QCOMPARE(a.leftJustified(4,'-'), QLatin1String("ABC-"));
+ QCOMPARE(a.leftJustified(4), QLatin1String("ABC "));
+ QCOMPARE(a.leftJustified(3), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(2), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(1), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(0), QLatin1String("ABC"));
QString n;
QVERIFY(!n.leftJustified(3).isNull());
- QCOMPARE(a.leftJustified(4,' ',true),(QString)"ABC ");
- QCOMPARE(a.leftJustified(3,' ',true),(QString)"ABC");
- QCOMPARE(a.leftJustified(2,' ',true),(QString)"AB");
- QCOMPARE(a.leftJustified(1,' ',true),(QString)"A");
- QCOMPARE(a.leftJustified(0,' ',true),(QString)"");
+ QCOMPARE(a.leftJustified(4,' ',true), QLatin1String("ABC "));
+ QCOMPARE(a.leftJustified(3,' ',true), QLatin1String("ABC"));
+ QCOMPARE(a.leftJustified(2,' ',true), QLatin1String("AB"));
+ QCOMPARE(a.leftJustified(1,' ',true), QLatin1String("A"));
+ QCOMPARE(a.leftJustified(0,' ',true), QLatin1String(""));
}
void tst_QString::rightJustified()
{
QString a;
a="ABC";
- QCOMPARE(a.rightJustified(5,'-'),(QString)"--ABC");
- QCOMPARE(a.rightJustified(4,'-'),(QString)"-ABC");
- QCOMPARE(a.rightJustified(4),(QString)" ABC");
- QCOMPARE(a.rightJustified(3),(QString)"ABC");
- QCOMPARE(a.rightJustified(2),(QString)"ABC");
- QCOMPARE(a.rightJustified(1),(QString)"ABC");
- QCOMPARE(a.rightJustified(0),(QString)"ABC");
+ QCOMPARE(a.rightJustified(5,'-'), QLatin1String("--ABC"));
+ QCOMPARE(a.rightJustified(4,'-'), QLatin1String("-ABC"));
+ QCOMPARE(a.rightJustified(4), QLatin1String(" ABC"));
+ QCOMPARE(a.rightJustified(3), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(2), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(1), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(0), QLatin1String("ABC"));
QString n;
QVERIFY(!n.rightJustified(3).isNull());
- QCOMPARE(a.rightJustified(4,'-',true),(QString)"-ABC");
- QCOMPARE(a.rightJustified(4,' ',true),(QString)" ABC");
- QCOMPARE(a.rightJustified(3,' ',true),(QString)"ABC");
- QCOMPARE(a.rightJustified(2,' ',true),(QString)"AB");
- QCOMPARE(a.rightJustified(1,' ',true),(QString)"A");
- QCOMPARE(a.rightJustified(0,' ',true),(QString)"");
- QCOMPARE(a,(QString)"ABC");
+ QCOMPARE(a.rightJustified(4,'-',true), QLatin1String("-ABC"));
+ QCOMPARE(a.rightJustified(4,' ',true), QLatin1String(" ABC"));
+ QCOMPARE(a.rightJustified(3,' ',true), QLatin1String("ABC"));
+ QCOMPARE(a.rightJustified(2,' ',true), QLatin1String("AB"));
+ QCOMPARE(a.rightJustified(1,' ',true), QLatin1String("A"));
+ QCOMPARE(a.rightJustified(0,' ',true), QLatin1String(""));
+ QCOMPARE(a, QLatin1String("ABC"));
}
void tst_QString::toUpper()
@@ -2302,21 +2300,21 @@ void tst_QString::trimmed()
{
QString a;
a="Text";
- QCOMPARE(a,(QString)"Text");
- QCOMPARE(a.trimmed(),(QString)"Text");
- QCOMPARE(a,(QString)"Text");
+ QCOMPARE(a, QLatin1String("Text"));
+ QCOMPARE(a.trimmed(), QLatin1String("Text"));
+ QCOMPARE(a, QLatin1String("Text"));
a=" ";
- QCOMPARE(a.trimmed(),(QString)"");
- QCOMPARE(a,(QString)" ");
+ QCOMPARE(a.trimmed(), QLatin1String(""));
+ QCOMPARE(a, QLatin1String(" "));
a=" a ";
- QCOMPARE(a.trimmed(),(QString)"a");
+ QCOMPARE(a.trimmed(), QLatin1String("a"));
a="Text";
- QCOMPARE(qMove(a).trimmed(),(QString)"Text");
+ QCOMPARE(qMove(a).trimmed(), QLatin1String("Text"));
a=" ";
- QCOMPARE(qMove(a).trimmed(),(QString)"");
+ QCOMPARE(qMove(a).trimmed(), QLatin1String(""));
a=" a ";
- QCOMPARE(qMove(a).trimmed(),(QString)"a");
+ QCOMPARE(qMove(a).trimmed(), QLatin1String("a"));
}
void tst_QString::simplified_data()
@@ -2442,12 +2440,13 @@ void tst_QString::insert_special_cases()
QCOMPARE(a.insert(1,'>'), QString("<>ABCABCABCABC"));
a = "Meal";
- QCOMPARE(a.insert(1, QLatin1String("ontr")), QString("Montreal"));
- QCOMPARE(a.insert(4, ""), QString("Montreal"));
- QCOMPARE(a.insert(3, QLatin1String("")), QString("Montreal"));
- QCOMPARE(a.insert(3, QLatin1String(0)), QString("Montreal"));
- QCOMPARE(a.insert(3, static_cast<const char *>(0)), QString("Montreal"));
- QCOMPARE(a.insert(0, QLatin1String("a")), QString("aMontreal"));
+ const QString montreal = QStringLiteral("Montreal");
+ QCOMPARE(a.insert(1, QLatin1String("ontr")), montreal);
+ QCOMPARE(a.insert(4, ""), montreal);
+ QCOMPARE(a.insert(3, QLatin1String("")), montreal);
+ QCOMPARE(a.insert(3, QLatin1String(0)), montreal);
+ QCOMPARE(a.insert(3, static_cast<const char *>(0)), montreal);
+ QCOMPARE(a.insert(0, QLatin1String("a")), QLatin1String("aMontreal"));
}
void tst_QString::append_data(bool emptyIsNoop)
@@ -3558,12 +3557,12 @@ void tst_QString::toDouble()
void tst_QString::setNum()
{
QString a;
- QCOMPARE(a.setNum(123),(QString)"123");
- QCOMPARE(a.setNum(-123),(QString)"-123");
- QCOMPARE(a.setNum(0x123,16),(QString)"123");
- QCOMPARE(a.setNum((short)123),(QString)"123");
- QCOMPARE(a.setNum(123L),(QString)"123");
- QCOMPARE(a.setNum(123UL),(QString)"123");
+ QCOMPARE(a.setNum(123), QLatin1String("123"));
+ QCOMPARE(a.setNum(-123), QLatin1String("-123"));
+ QCOMPARE(a.setNum(0x123,16), QLatin1String("123"));
+ QCOMPARE(a.setNum((short)123), QLatin1String("123"));
+ QCOMPARE(a.setNum(123L), QLatin1String("123"));
+ QCOMPARE(a.setNum(123UL), QLatin1String("123"));
QCOMPARE(a.setNum(2147483647L), QString("2147483647")); // 32 bit LONG_MAX
QCOMPARE(a.setNum(-2147483647L), QString("-2147483647")); // LONG_MIN + 1
QCOMPARE(a.setNum(-2147483647L-1L), QString("-2147483648")); // LONG_MIN
@@ -3820,7 +3819,7 @@ void tst_QString::check_QDataStream()
{
QDataStream in(&ar,QIODevice::ReadOnly);
in >> a;
- QCOMPARE(a,(QString)"COMPARE Text");
+ QCOMPARE(a, QLatin1String("COMPARE Text"));
}
}
@@ -3835,7 +3834,7 @@ void tst_QString::check_QTextStream()
{
QTextStream in(&ar,QIODevice::ReadOnly);
in >> a;
- QCOMPARE(a,(QString)"This");
+ QCOMPARE(a, QLatin1String("This"));
}
}
@@ -4528,100 +4527,100 @@ void tst_QString::arg()
QString s13( "%1% %x%c%2 %d%2-%" );
QString s14( "%1%2%3" );
- QCOMPARE( s4.arg("foo"), QString("[foo]") );
- QCOMPARE( s5.arg("foo"), QString("[foo]") );
- QCOMPARE( s6.arg("foo"), QString("[foo]") );
- QCOMPARE( s7.arg("foo"), QString("[foo]") );
- QCOMPARE( s8.arg("foo"), QString("[foo %1]") );
- QCOMPARE( s8.arg("foo").arg("bar"), QString("[foo bar]") );
- QCOMPARE( s8.arg("foo", "bar"), QString("[foo bar]") );
- QCOMPARE( s9.arg("foo"), QString("[foo %3]") );
- QCOMPARE( s9.arg("foo").arg("bar"), QString("[foo bar]") );
- QCOMPARE( s9.arg("foo", "bar"), QString("[foo bar]") );
- QCOMPARE( s10.arg("foo"), QString("[foo %2 %3]") );
- QCOMPARE( s10.arg("foo").arg("bar"), QString("[foo bar %3]") );
- QCOMPARE( s10.arg("foo", "bar"), QString("[foo bar %3]") );
- QCOMPARE( s10.arg("foo").arg("bar").arg("baz"), QString("[foo bar baz]") );
- QCOMPARE( s10.arg("foo", "bar", "baz"), QString("[foo bar baz]") );
- QCOMPARE( s11.arg("foo"), QString("[%9 %3 foo]") );
- QCOMPARE( s11.arg("foo").arg("bar"), QString("[%9 bar foo]") );
- QCOMPARE( s11.arg("foo", "bar"), QString("[%9 bar foo]") );
- QCOMPARE( s11.arg("foo").arg("bar").arg("baz"), QString("[baz bar foo]") );
- QCOMPARE( s11.arg("foo", "bar", "baz"), QString("[baz bar foo]") );
+ QCOMPARE( s4.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s5.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s6.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s7.arg("foo"), QLatin1String("[foo]") );
+ QCOMPARE( s8.arg("foo"), QLatin1String("[foo %1]") );
+ QCOMPARE( s8.arg("foo").arg("bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s8.arg("foo", "bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s9.arg("foo"), QLatin1String("[foo %3]") );
+ QCOMPARE( s9.arg("foo").arg("bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s9.arg("foo", "bar"), QLatin1String("[foo bar]") );
+ QCOMPARE( s10.arg("foo"), QLatin1String("[foo %2 %3]") );
+ QCOMPARE( s10.arg("foo").arg("bar"), QLatin1String("[foo bar %3]") );
+ QCOMPARE( s10.arg("foo", "bar"), QLatin1String("[foo bar %3]") );
+ QCOMPARE( s10.arg("foo").arg("bar").arg("baz"), QLatin1String("[foo bar baz]") );
+ QCOMPARE( s10.arg("foo", "bar", "baz"), QLatin1String("[foo bar baz]") );
+ QCOMPARE( s11.arg("foo"), QLatin1String("[%9 %3 foo]") );
+ QCOMPARE( s11.arg("foo").arg("bar"), QLatin1String("[%9 bar foo]") );
+ QCOMPARE( s11.arg("foo", "bar"), QLatin1String("[%9 bar foo]") );
+ QCOMPARE( s11.arg("foo").arg("bar").arg("baz"), QLatin1String("[baz bar foo]") );
+ QCOMPARE( s11.arg("foo", "bar", "baz"), QLatin1String("[baz bar foo]") );
QCOMPARE( s12.arg("a").arg("b").arg("c").arg("d").arg("e"),
- QString("[e b c e a d]") );
- QCOMPARE( s12.arg("a", "b", "c", "d").arg("e"), QString("[e b c e a d]") );
- QCOMPARE( s12.arg("a").arg("b", "c", "d", "e"), QString("[e b c e a d]") );
+ QLatin1String("[e b c e a d]") );
+ QCOMPARE( s12.arg("a", "b", "c", "d").arg("e"), QLatin1String("[e b c e a d]") );
+ QCOMPARE( s12.arg("a").arg("b", "c", "d", "e"), QLatin1String("[e b c e a d]") );
QCOMPARE( s13.arg("alpha").arg("beta"),
- QString("alpha% %x%cbeta %dbeta-%") );
- QCOMPARE( s13.arg("alpha", "beta"), QString("alpha% %x%cbeta %dbeta-%") );
- QCOMPARE( s14.arg("a", "b", "c"), QString("abc") );
- QCOMPARE( s8.arg("%1").arg("foo"), QString("[foo foo]") );
- QCOMPARE( s8.arg("%1", "foo"), QString("[%1 foo]") );
- QCOMPARE( s4.arg("foo", 2), QString("[foo]") );
- QCOMPARE( s4.arg("foo", -2), QString("[foo]") );
- QCOMPARE( s4.arg("foo", 10), QString("[ foo]") );
- QCOMPARE( s4.arg("foo", -10), QString("[foo ]") );
+ QLatin1String("alpha% %x%cbeta %dbeta-%") );
+ QCOMPARE( s13.arg("alpha", "beta"), QLatin1String("alpha% %x%cbeta %dbeta-%") );
+ QCOMPARE( s14.arg("a", "b", "c"), QLatin1String("abc") );
+ QCOMPARE( s8.arg("%1").arg("foo"), QLatin1String("[foo foo]") );
+ QCOMPARE( s8.arg("%1", "foo"), QLatin1String("[%1 foo]") );
+ QCOMPARE( s4.arg("foo", 2), QLatin1String("[foo]") );
+ QCOMPARE( s4.arg("foo", -2), QLatin1String("[foo]") );
+ QCOMPARE( s4.arg("foo", 10), QLatin1String("[ foo]") );
+ QCOMPARE( s4.arg("foo", -10), QLatin1String("[foo ]") );
QString firstName( "James" );
QString lastName( "Bond" );
QString fullName = QString( "My name is %2, %1 %2" )
.arg( firstName ).arg( lastName );
- QCOMPARE( fullName, QString("My name is Bond, James Bond") );
+ QCOMPARE( fullName, QLatin1String("My name is Bond, James Bond") );
// number overloads
- QCOMPARE( s4.arg(0), QString("[0]") );
- QCOMPARE( s4.arg(-1), QString("[-1]") );
- QCOMPARE( s4.arg(4294967295UL), QString("[4294967295]") ); // ULONG_MAX 32
+ QCOMPARE( s4.arg(0), QLatin1String("[0]") );
+ QCOMPARE( s4.arg(-1), QLatin1String("[-1]") );
+ QCOMPARE( s4.arg(4294967295UL), QLatin1String("[4294967295]") ); // ULONG_MAX 32
QCOMPARE( s4.arg(Q_INT64_C(9223372036854775807)), // LLONG_MAX
- QString("[9223372036854775807]") );
+ QLatin1String("[9223372036854775807]") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"\" , 0");
QCOMPARE( QString().arg(0), QString() );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"\" , 0");
QCOMPARE( QString("").arg(0), QString("") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \" \" , 0");
- QCOMPARE( QString(" ").arg(0), QString(" ") );
+ QCOMPARE( QString(" ").arg(0), QLatin1String(" ") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"%\" , 0");
- QCOMPARE( QString("%").arg(0), QString("%") );
+ QCOMPARE( QString("%").arg(0), QLatin1String("%") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"%%\" , 0");
- QCOMPARE( QString("%%").arg(0), QString("%%") );
+ QCOMPARE( QString("%%").arg(0), QLatin1String("%%") );
QTest::ignoreMessage(QtWarningMsg, "QString::arg: Argument missing: \"%%%\" , 0");
- QCOMPARE( QString("%%%").arg(0), QString("%%%") );
- QCOMPARE( QString("%%%1%%%2").arg("foo").arg("bar"), QString("%%foo%%bar") );
-
- QCOMPARE( QString("%1").arg("hello", -10), QString("hello ") );
- QCOMPARE( QString("%1").arg("hello", -5), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", -2), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 0), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 2), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 5), QString("hello") );
- QCOMPARE( QString("%1").arg("hello", 10), QString(" hello") );
- QCOMPARE( QString("%1%1").arg("hello"), QString("hellohello") );
- QCOMPARE( QString("%2%1").arg("hello"), QString("%2hello") );
- QCOMPARE( QString("%1%1").arg(QString::null), QString("") );
- QCOMPARE( QString("%2%1").arg(""), QString("%2") );
+ QCOMPARE( QString("%%%").arg(0), QLatin1String("%%%") );
+ QCOMPARE( QString("%%%1%%%2").arg("foo").arg("bar"), QLatin1String("%%foo%%bar") );
+
+ QCOMPARE( QString("%1").arg("hello", -10), QLatin1String("hello ") );
+ QCOMPARE( QString("%1").arg("hello", -5), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", -2), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 0), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 2), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 5), QLatin1String("hello") );
+ QCOMPARE( QString("%1").arg("hello", 10), QLatin1String(" hello") );
+ QCOMPARE( QString("%1%1").arg("hello"), QLatin1String("hellohello") );
+ QCOMPARE( QString("%2%1").arg("hello"), QLatin1String("%2hello") );
+ QCOMPARE( QString("%1%1").arg(QString::null), QLatin1String("") );
+ QCOMPARE( QString("%2%1").arg(""), QLatin1String("%2") );
QCOMPARE( QString("%2 %L1").arg(12345.6789).arg(12345.6789),
- QString("12345.7 12.345,7") );
+ QLatin1String("12345.7 12.345,7") );
QCOMPARE( QString("[%2] [%L1]").arg(12345.6789, 9).arg(12345.6789, 9),
- QString("[ 12345.7] [ 12.345,7]") );
+ QLatin1String("[ 12345.7] [ 12.345,7]") );
QCOMPARE( QString("[%2] [%L1]").arg(12345.6789, 9, 'g', 7).arg(12345.6789, 9, 'g', 7),
- QString("[ 12345.68] [12.345,68]") );
+ QLatin1String("[ 12345.68] [12.345,68]") );
QCOMPARE( QString("[%2] [%L1]").arg(12345.6789, 10, 'g', 7, QLatin1Char('0')).arg(12345.6789, 10, 'g', 7, QLatin1Char('0')),
- QString("[0012345.68] [012.345,68]") );
+ QLatin1String("[0012345.68] [012.345,68]") );
QCOMPARE( QString("%2 %L1").arg(123456789).arg(123456789),
- QString("123456789 123.456.789") );
+ QLatin1String("123456789 123.456.789") );
QCOMPARE( QString("[%2] [%L1]").arg(123456789, 12).arg(123456789, 12),
- QString("[ 123456789] [ 123.456.789]") );
+ QLatin1String("[ 123456789] [ 123.456.789]") );
QCOMPARE( QString("[%2] [%L1]").arg(123456789, 13, 10, QLatin1Char('0')).arg(123456789, 12, 10, QLatin1Char('0')),
- QString("[000123456789] [00123.456.789]") );
+ QLatin1String("[000123456789] [00123.456.789]") );
QCOMPARE( QString("[%2] [%L1]").arg(123456789, 13, 16, QLatin1Char('0')).arg(123456789, 12, 16, QLatin1Char('0')),
- QString("[0000075bcd15] [00000075bcd15]") );
+ QLatin1String("[0000075bcd15] [00000075bcd15]") );
QCOMPARE( QString("%L2 %L1 %3").arg(12345.7).arg(123456789).arg('c'),
- QString("123.456.789 12.345,7 c") );
+ QLatin1String("123.456.789 12.345,7 c") );
// multi-digit replacement
QString input("%%%L0 %1 %02 %3 %4 %5 %L6 %7 %8 %%% %090 %10 %11 %L12 %14 %L9888 %9999 %%%%%%%L");
@@ -4631,36 +4630,36 @@ void tst_QString::arg()
.arg("k").arg("l").arg("m")
.arg("n").arg("o").arg("p");
- QCOMPARE(input, QString("%%A B C D E f g h i %%% j0 k l m n o88 p99 %%%%%%%L"));
+ QCOMPARE(input, QLatin1String("%%A B C D E f g h i %%% j0 k l m n o88 p99 %%%%%%%L"));
QString str("%1 %2 %3 %4 %5 %6 %7 %8 %9 foo %10 %11 bar");
str = str.arg("one", "2", "3", "4", "5", "6", "7", "8", "9");
str = str.arg("ahoy", "there");
- QCOMPARE(str, QString("one 2 3 4 5 6 7 8 9 foo ahoy there bar"));
+ QCOMPARE(str, QLatin1String("one 2 3 4 5 6 7 8 9 foo ahoy there bar"));
QString str2("%123 %234 %345 %456 %567 %999 %1000 %1230");
str2 = str2.arg("A", "B", "C", "D", "E", "F");
- QCOMPARE(str2, QString("A B C D E F %1000 %1230"));
-
- QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('0')), QString("-01"));
- QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('0')), QString("-100"));
- QCOMPARE(QString("%1").arg(-1, 3, 10, QChar(' ')), QString(" -1"));
- QCOMPARE(QString("%1").arg(-100, 3, 10, QChar(' ')), QString("-100"));
- QCOMPARE(QString("%1").arg(1U, 3, 10, QChar(' ')), QString(" 1"));
- QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar(' ')), QString("1000"));
- QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('x')), QString("x-1"));
- QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('x')), QString("-100"));
- QCOMPARE(QString("%1").arg(1U, 3, 10, QChar('x')), QString("xx1"));
- QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar('x')), QString("1000"));
-
- QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('0')), QString("-01"));
- QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('0')), QString("-100"));
- QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar(' ')), QString(" -1"));
- QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar(' ')), QString("-100"));
- QCOMPARE(QString("%1").arg(1., 3, 'g', -1, QChar('x')), QString("xx1"));
- QCOMPARE(QString("%1").arg(1000., 3, 'g', -1, QChar('x')), QString("1000"));
- QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('x')), QString("x-1"));
- QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('x')), QString("-100"));
+ QCOMPARE(str2, QLatin1String("A B C D E F %1000 %1230"));
+
+ QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('0')), QLatin1String("-01"));
+ QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('0')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(-1, 3, 10, QChar(' ')), QLatin1String(" -1"));
+ QCOMPARE(QString("%1").arg(-100, 3, 10, QChar(' ')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(1U, 3, 10, QChar(' ')), QLatin1String(" 1"));
+ QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar(' ')), QLatin1String("1000"));
+ QCOMPARE(QString("%1").arg(-1, 3, 10, QChar('x')), QLatin1String("x-1"));
+ QCOMPARE(QString("%1").arg(-100, 3, 10, QChar('x')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(1U, 3, 10, QChar('x')), QLatin1String("xx1"));
+ QCOMPARE(QString("%1").arg(1000U, 3, 10, QChar('x')), QLatin1String("1000"));
+
+ QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('0')), QLatin1String("-01"));
+ QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('0')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar(' ')), QLatin1String(" -1"));
+ QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar(' ')), QLatin1String("-100"));
+ QCOMPARE(QString("%1").arg(1., 3, 'g', -1, QChar('x')), QLatin1String("xx1"));
+ QCOMPARE(QString("%1").arg(1000., 3, 'g', -1, QChar('x')), QLatin1String("1000"));
+ QCOMPARE(QString("%1").arg(-1., 3, 'g', -1, QChar('x')), QLatin1String("x-1"));
+ QCOMPARE(QString("%1").arg(-100., 3, 'g', -1, QChar('x')), QLatin1String("-100"));
QLocale::setDefault(QString("ar"));
QCOMPARE( QString("%L1").arg(12345.6789, 10, 'g', 7, QLatin1Char('0')),
@@ -4673,13 +4672,18 @@ void tst_QString::arg()
void tst_QString::number()
{
- QCOMPARE( QString::number(int(0)), QString("0") );
- QCOMPARE( QString::number((unsigned int)(11)), QString("11") );
- QCOMPARE( QString::number(-22L), QString("-22") );
- QCOMPARE( QString::number(333UL), QString("333") );
- QCOMPARE( QString::number(4.4), QString("4.4") );
- QCOMPARE( QString::number(Q_INT64_C(-555)), QString("-555") );
- QCOMPARE( QString::number(Q_UINT64_C(6666)), QString("6666") );
+ QCOMPARE( QString::number(int(0)), QLatin1String("0") );
+ QCOMPARE( QString::number((unsigned int)(11)), QLatin1String("11") );
+ QCOMPARE( QString::number(-22L), QLatin1String("-22") );
+ QCOMPARE( QString::number(333UL), QLatin1String("333") );
+ QCOMPARE( QString::number(4.4), QLatin1String("4.4") );
+ QCOMPARE( QString::number(Q_INT64_C(-555)), QLatin1String("-555") );
+ QCOMPARE( QString::number(Q_UINT64_C(6666)), QLatin1String("6666") );
+
+#ifndef QT_NO_DOUBLECONVERSION // snprintf_l is too stupid for this
+ QCOMPARE( QString::number(12.05, 'f', 1), QString("12.1") );
+ QCOMPARE( QString::number(12.5, 'f', 0), QString("13") );
+#endif
}
void tst_QString::capacity_data()
@@ -6105,9 +6109,6 @@ void tst_QString::QCharRefDetaching() const
void tst_QString::sprintfZU() const
{
-#ifdef Q_CC_MINGW
- QSKIP("MinGW does not support '%zu'.");
-#else
{
QString string;
size_t s = 6;
@@ -6136,7 +6137,6 @@ void tst_QString::sprintfZU() const
string.sprintf("%zu %s\n", s, "foo");
QCOMPARE(string, QString::fromLatin1("6 foo\n"));
}
-#endif // !Q_CC_MINGW
}
void tst_QString::repeatedSignature() const
diff --git a/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro b/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro
index 1719af631d..14dbe779db 100644
--- a/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro
+++ b/tests/auto/corelib/tools/qstring_no_cast_from_bytearray/qstring_no_cast_from_bytearray.pro
@@ -1,7 +1,6 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstring_no_cast_from_bytearray
QT = core testlib
SOURCES = tst_qstring_no_cast_from_bytearray.cpp
DEFINES += QT_NO_CAST_FROM_BYTEARRAY
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro
index 64ce377c29..d9cdad1bf5 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder1/qstringbuilder1.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder1
QT = core testlib
SOURCES = tst_qstringbuilder1.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro
index 56ed7707d0..e134c5d934 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder2/qstringbuilder2.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder2
QT = core testlib
SOURCES = tst_qstringbuilder2.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro
index 2be2c24de4..29607551c3 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder3/qstringbuilder3.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder3
QT = core testlib
SOURCES = tst_qstringbuilder3.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro
index 3a97d49483..e55848e4bd 100644
--- a/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro
+++ b/tests/auto/corelib/tools/qstringbuilder/qstringbuilder4/qstringbuilder4.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringbuilder4
QT = core testlib
SOURCES = tst_qstringbuilder4.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro b/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro
index e5e625d520..3a1678b5f3 100644
--- a/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro
+++ b/tests/auto/corelib/tools/qstringiterator/qstringiterator.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringiterator
QT = core core-private testlib
SOURCES = tst_qstringiterator.cpp
diff --git a/tests/auto/corelib/tools/qstringlist/qstringlist.pro b/tests/auto/corelib/tools/qstringlist/qstringlist.pro
index c3b2fe07c0..a87257decb 100644
--- a/tests/auto/corelib/tools/qstringlist/qstringlist.pro
+++ b/tests/auto/corelib/tools/qstringlist/qstringlist.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringlist
QT = core testlib
SOURCES = tst_qstringlist.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro b/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro
index 3a6e22b469..e34928776f 100644
--- a/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro
+++ b/tests/auto/corelib/tools/qstringmatcher/qstringmatcher.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringmatcher
QT = core testlib
SOURCES = tst_qstringmatcher.cpp
DEFINES += QT_NO_CAST_TO_ASCII
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringref/qstringref.pro b/tests/auto/corelib/tools/qstringref/qstringref.pro
index edb5ef995c..04f3ba6a92 100644
--- a/tests/auto/corelib/tools/qstringref/qstringref.pro
+++ b/tests/auto/corelib/tools/qstringref/qstringref.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qstringref
QT = core testlib
SOURCES = tst_qstringref.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp b/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
index 82d103c460..b3599b6a5c 100644
--- a/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
+++ b/tests/auto/corelib/tools/qstringref/tst_qstringref.cpp
@@ -97,7 +97,7 @@ static QStringRef emptyRef()
}
#define CREATE_REF(string) \
- const QString padded = QString::fromLatin1(" %1 ").arg(string); \
+ const QString padded = QLatin1Char(' ') + string + QLatin1Char(' '); \
QStringRef ref = padded.midRef(1, padded.size() - 2);
typedef QList<int> IntList;
@@ -292,7 +292,7 @@ void tst_QStringRef::indexOf_data()
QString s2;
s2 += QChar(0x3bc);
QTest::newRow("data58") << QString(s1) << QString(s2) << 0 << false << 3;
- s2.prepend("C");
+ s2.prepend(QLatin1Char('C'));
QTest::newRow("data59") << QString(s1) << QString(s2) << 0 << false << 2;
QString veryBigHaystack(500, 'a');
@@ -317,8 +317,8 @@ void tst_QStringRef::indexOf()
QFETCH(bool, bcs);
QFETCH(int, resultpos);
- const QString haystackPadded = QString::fromLatin1(" %1 ").arg(haystack);
- const QString needlePadded = QString::fromLatin1(" %1 ").arg(needle);
+ const QString haystackPadded = QLatin1Char(' ') + haystack + QLatin1Char(' ');
+ const QString needlePadded = QLatin1Char(' ') + needle + QLatin1Char(' ');
const QStringRef haystackRef(&haystackPadded, 1, haystack.size());
const QStringRef needleRef(&needlePadded, 1, needle.size());
@@ -407,8 +407,8 @@ void tst_QStringRef::indexOf2()
QFETCH(QString, needle);
QFETCH(int, resultpos);
- const QString haystackPadded = QString::fromLatin1(" %1 ").arg(haystack);
- const QString needlePadded = QString::fromLatin1(" %1 ").arg(needle);
+ const QString haystackPadded = QLatin1Char(' ') + haystack + QLatin1Char(' ');
+ const QString needlePadded = QLatin1Char(' ') + needle + QLatin1Char(' ');
const QStringRef haystackRef(&haystackPadded, 1, haystack.size());
const QStringRef needleRef(&needlePadded, 1, needle.size());
@@ -490,8 +490,8 @@ void tst_QStringRef::lastIndexOf()
QFETCH(int, expected);
QFETCH(bool, caseSensitive);
- const QString haystackPadded = QString::fromLatin1(" %1 ").arg(haystack);
- const QString needlePadded = QString::fromLatin1(" %1 ").arg(needle);
+ const QString haystackPadded = QLatin1Char(' ') + haystack + QLatin1Char(' ');
+ const QString needlePadded = QLatin1Char(' ') + needle + QLatin1Char(' ');
const QStringRef haystackRef(&haystackPadded, 1, haystack.size());
const QStringRef needleRef(&needlePadded, 1, needle.size());
diff --git a/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro b/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro
index 29b9854ebb..9d26ec1fd5 100644
--- a/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro
+++ b/tests/auto/corelib/tools/qtextboundaryfinder/qtextboundaryfinder.pro
@@ -1,10 +1,9 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtextboundaryfinder
QT = core testlib
SOURCES = tst_qtextboundaryfinder.cpp
TESTDATA += data
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp b/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
index 753d61f02c..927c07f9e6 100644
--- a/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
+++ b/tests/auto/corelib/tools/qtextboundaryfinder/tst_qtextboundaryfinder.cpp
@@ -166,8 +166,8 @@ static void generateDataFromFile(const QString &fname)
}
}
- QString nm = QString("line #%1: %2").arg(linenum).arg(comments);
- QTest::newRow(nm.toLatin1()) << testString << expectedBreakPositions;
+ const QByteArray nm = "line #" + QByteArray::number(linenum) + ": " + comments.toLatin1();
+ QTest::newRow(nm.constData()) << testString << expectedBreakPositions;
}
}
#endif
diff --git a/tests/auto/corelib/tools/qtime/qtime.pro b/tests/auto/corelib/tools/qtime/qtime.pro
index 48db4c6664..0973b7a9ef 100644
--- a/tests/auto/corelib/tools/qtime/qtime.pro
+++ b/tests/auto/corelib/tools/qtime/qtime.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtime
QT = core testlib
SOURCES = tst_qtime.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qtimeline/qtimeline.pro b/tests/auto/corelib/tools/qtimeline/qtimeline.pro
index ca8eba41fb..9424cf8fd2 100644
--- a/tests/auto/corelib/tools/qtimeline/qtimeline.pro
+++ b/tests/auto/corelib/tools/qtimeline/qtimeline.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtimeline
QT = core testlib
SOURCES = tst_qtimeline.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qtimezone/qtimezone.pro b/tests/auto/corelib/tools/qtimezone/qtimezone.pro
index fa2397a6bb..4459ed6020 100644
--- a/tests/auto/corelib/tools/qtimezone/qtimezone.pro
+++ b/tests/auto/corelib/tools/qtimezone/qtimezone.pro
@@ -1,8 +1,7 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qtimezone
QT = core-private testlib
SOURCES = tst_qtimezone.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG,icu) {
DEFINES += QT_USE_ICU
}
diff --git a/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro b/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro
index 4fb8a1cf30..108fb33db5 100644
--- a/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro
+++ b/tests/auto/corelib/tools/qvarlengtharray/qvarlengtharray.pro
@@ -1,5 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qvarlengtharray
QT = core testlib
SOURCES = tst_qvarlengtharray.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
index 82f78b2b0b..1c736fba65 100644
--- a/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
+++ b/tests/auto/corelib/tools/qvarlengtharray/tst_qvarlengtharray.cpp
@@ -148,14 +148,14 @@ void tst_QVarLengthArray::oldTests()
QVarLengthArray<QString> sa(10);
sa[0] = "Hello";
sa[9] = "World";
- QVERIFY(*sa.data() == "Hello");
- QVERIFY(sa[9] == "World");
+ QCOMPARE(*sa.data(), QLatin1String("Hello"));
+ QCOMPARE(sa[9], QLatin1String("World"));
sa.reserve(512);
- QVERIFY(*sa.data() == "Hello");
- QVERIFY(sa[9] == "World");
+ QCOMPARE(*sa.data(), QLatin1String("Hello"));
+ QCOMPARE(sa[9], QLatin1String("World"));
sa.resize(512);
- QVERIFY(*sa.data() == "Hello");
- QVERIFY(sa[9] == "World");
+ QCOMPARE(*sa.data(), QLatin1String("Hello"));
+ QCOMPARE(sa[9], QLatin1String("World"));
}
{
int arr[2] = {1, 2};
diff --git a/tests/auto/corelib/tools/qvector/qvector.pro b/tests/auto/corelib/tools/qvector/qvector.pro
index c1e0564915..d49516923f 100644
--- a/tests/auto/corelib/tools/qvector/qvector.pro
+++ b/tests/auto/corelib/tools/qvector/qvector.pro
@@ -1,6 +1,5 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
contains(QT_CONFIG, c++11):CONFIG += c++11
TARGET = tst_qvector
QT = core testlib
SOURCES = $$PWD/tst_qvector.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/tools/qvector/tst_qvector.cpp b/tests/auto/corelib/tools/qvector/tst_qvector.cpp
index 87822bca6f..bdfb567331 100644
--- a/tests/auto/corelib/tools/qvector/tst_qvector.cpp
+++ b/tests/auto/corelib/tools/qvector/tst_qvector.cpp
@@ -2391,6 +2391,7 @@ void tst_QVector::reallocAfterCopy_data()
int result1, result2, result3, result4;
int fill_size;
for (int i = 70; i <= 100; i += 10) {
+ const QByteArray prefix = "reallocAfterCopy:" + QByteArray::number(i) + ',';
fill_size = i - 20;
for (int j = 0; j <= 3; j++) {
if (j == 0) { // append
@@ -2414,7 +2415,8 @@ void tst_QVector::reallocAfterCopy_data()
result3 = i - 10;
result4 = i - 20;
}
- QTest::newRow(qPrintable(QString("reallocAfterCopy:%1,%2").arg(i).arg(j))) << i << fill_size << j << result1 << result2 << result3 << result4;
+ QTest::newRow((prefix + QByteArray::number(j)).constData())
+ << i << fill_size << j << result1 << result2 << result3 << result4;
}
}
}
diff --git a/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro b/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro
index ba4b2b40cb..e3a231060c 100644
--- a/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro
+++ b/tests/auto/corelib/tools/qversionnumber/qversionnumber.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
contains(QT_CONFIG, c++11):CONFIG += c++11 c++14
TARGET = tst_qversionnumber
QT = core testlib
diff --git a/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro b/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro
index 0a9580da62..0a739f0a0e 100644
--- a/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro
+++ b/tests/auto/corelib/xml/qxmlstream/qxmlstream.pro
@@ -1,8 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qxmlstream
QT = core xml network testlib
SOURCES = tst_qxmlstream.cpp
TESTDATA += data XML-Test-Suite
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
index 341b169113..c87595c3c9 100644
--- a/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
+++ b/tests/auto/corelib/xml/qxmlstream/tst_qxmlstream.cpp
@@ -119,7 +119,7 @@ static QByteArray makeCanonical(const QString &filename,
if (notation.publicId().isEmpty()) {
writeDtd << " SYSTEM \'";
writeDtd << notation.systemId().toString();
- writeDtd << "\'";
+ writeDtd << '\'';
} else {
writeDtd << " PUBLIC \'";
writeDtd << notation.publicId().toString();
@@ -127,10 +127,10 @@ static QByteArray makeCanonical(const QString &filename,
if (!notation.systemId().isEmpty() ) {
writeDtd << " \'";
writeDtd << notation.systemId().toString();
- writeDtd << "\'";
+ writeDtd << '\'';
}
}
- writeDtd << ">";
+ writeDtd << '>';
writeDtd << endl;
}
@@ -157,7 +157,7 @@ static QByteArray makeCanonical(const QString &filename,
text.indexOf(QLatin1Char(13), p),
text.indexOf(QLatin1Char(9), p))) >= 0) {
writer.writeCharacters(text.mid(p, i - p));
- writer.writeEntityReference(QString("#%1").arg(text.at(i).unicode()));
+ writer.writeEntityReference(QLatin1Char('#') + QString::number(text.at(i).unicode()));
p = i + 1;
}
writer.writeCharacters(text.mid(p));
@@ -357,7 +357,7 @@ public:
QFile inputFile(inputFilePath);
if(!inputFile.open(QIODevice::ReadOnly))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to open input file %1").arg(inputFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to open input file ") + inputFilePath));
return true;
}
@@ -365,8 +365,8 @@ public:
{
if(isWellformed(&inputFile, ParseSinglePass))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to flag %1 as not well-formed.")
- .arg(inputFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to flag ") + inputFilePath
+ + QLatin1String(" as not well-formed.")));
/* Exit, the incremental test will fail as well, no need to flood the output. */
return true;
@@ -376,8 +376,8 @@ public:
if(isWellformed(&inputFile, ParseIncrementally))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to flag %1 as not well-formed with incremental parsing.")
- .arg(inputFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to flag ") + inputFilePath
+ + QLatin1String(" as not well-formed with incremental parsing.")));
}
else
successes.append(id);
@@ -402,7 +402,7 @@ public:
if(!expectedFile.open(QIODevice::ReadOnly))
{
- failures.append(qMakePair(id, QString::fromLatin1("Failed to open baseline %1").arg(expectedFilePath)));
+ failures.append(qMakePair(id, QLatin1String("Failed to open baseline ") + expectedFilePath));
return true;
}
@@ -665,8 +665,10 @@ void tst_QXmlStream::reportSuccess_data() const
const int len = m_handler.successes.count();
- for(int i = 0; i < len; ++i)
- QTest::newRow(qPrintable(QString("%1. %2").arg(i).arg(m_handler.successes.at(i)))) << false;
+ for (int i = 0; i < len; ++i) {
+ const QByteArray testName = QByteArray::number(i) + ". " + m_handler.successes.at(i).toLatin1();
+ QTest::newRow(testName.constData()) << false;
+ }
if(len == 0)
QTest::newRow("No test cases succeeded.") << true;
@@ -687,7 +689,7 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
while (!reader.atEnd()) {
reader.readNext();
- writer << reader.tokenString() << "(";
+ writer << reader.tokenString() << '(';
if (reader.isWhitespace())
writer << " whitespace";
if (reader.isCDATA())
@@ -695,42 +697,42 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
if (reader.isStartDocument() && reader.isStandaloneDocument())
writer << " standalone";
if (!reader.text().isEmpty())
- writer << " text=\"" << reader.text().toString() << "\"";
+ writer << " text=\"" << reader.text().toString() << '"';
if (!reader.processingInstructionTarget().isEmpty())
- writer << " processingInstructionTarget=\"" << reader.processingInstructionTarget().toString() << "\"";
+ writer << " processingInstructionTarget=\"" << reader.processingInstructionTarget().toString() << '"';
if (!reader.processingInstructionData().isEmpty())
- writer << " processingInstructionData=\"" << reader.processingInstructionData().toString() << "\"";
+ writer << " processingInstructionData=\"" << reader.processingInstructionData().toString() << '"';
if (!reader.dtdName().isEmpty())
- writer << " dtdName=\"" << reader.dtdName().toString() << "\"";
+ writer << " dtdName=\"" << reader.dtdName().toString() << '"';
if (!reader.dtdPublicId().isEmpty())
- writer << " dtdPublicId=\"" << reader.dtdPublicId().toString() << "\"";
+ writer << " dtdPublicId=\"" << reader.dtdPublicId().toString() << '"';
if (!reader.dtdSystemId().isEmpty())
- writer << " dtdSystemId=\"" << reader.dtdSystemId().toString() << "\"";
+ writer << " dtdSystemId=\"" << reader.dtdSystemId().toString() << '"';
if (!reader.documentVersion().isEmpty())
- writer << " documentVersion=\"" << reader.documentVersion().toString() << "\"";
+ writer << " documentVersion=\"" << reader.documentVersion().toString() << '"';
if (!reader.documentEncoding().isEmpty())
- writer << " documentEncoding=\"" << reader.documentEncoding().toString() << "\"";
+ writer << " documentEncoding=\"" << reader.documentEncoding().toString() << '"';
if (!reader.name().isEmpty())
- writer << " name=\"" << reader.name().toString() << "\"";
+ writer << " name=\"" << reader.name().toString() << '"';
if (!reader.namespaceUri().isEmpty())
- writer << " namespaceUri=\"" << reader.namespaceUri().toString() << "\"";
+ writer << " namespaceUri=\"" << reader.namespaceUri().toString() << '"';
if (!reader.qualifiedName().isEmpty())
- writer << " qualifiedName=\"" << reader.qualifiedName().toString() << "\"";
+ writer << " qualifiedName=\"" << reader.qualifiedName().toString() << '"';
if (!reader.prefix().isEmpty())
- writer << " prefix=\"" << reader.prefix().toString() << "\"";
+ writer << " prefix=\"" << reader.prefix().toString() << '"';
if (reader.attributes().size()) {
foreach(QXmlStreamAttribute attribute, reader.attributes()) {
writer << endl << " Attribute(";
if (!attribute.name().isEmpty())
- writer << " name=\"" << attribute.name().toString() << "\"";
+ writer << " name=\"" << attribute.name().toString() << '"';
if (!attribute.namespaceUri().isEmpty())
- writer << " namespaceUri=\"" << attribute.namespaceUri().toString() << "\"";
+ writer << " namespaceUri=\"" << attribute.namespaceUri().toString() << '"';
if (!attribute.qualifiedName().isEmpty())
- writer << " qualifiedName=\"" << attribute.qualifiedName().toString() << "\"";
+ writer << " qualifiedName=\"" << attribute.qualifiedName().toString() << '"';
if (!attribute.prefix().isEmpty())
- writer << " prefix=\"" << attribute.prefix().toString() << "\"";
+ writer << " prefix=\"" << attribute.prefix().toString() << '"';
if (!attribute.value().isEmpty())
- writer << " value=\"" << attribute.value().toString() << "\"";
+ writer << " value=\"" << attribute.value().toString() << '"';
writer << " )" << endl;
}
}
@@ -738,9 +740,9 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
foreach(QXmlStreamNamespaceDeclaration namespaceDeclaration, reader.namespaceDeclarations()) {
writer << endl << " NamespaceDeclaration(";
if (!namespaceDeclaration.prefix().isEmpty())
- writer << " prefix=\"" << namespaceDeclaration.prefix().toString() << "\"";
+ writer << " prefix=\"" << namespaceDeclaration.prefix().toString() << '"';
if (!namespaceDeclaration.namespaceUri().isEmpty())
- writer << " namespaceUri=\"" << namespaceDeclaration.namespaceUri().toString() << "\"";
+ writer << " namespaceUri=\"" << namespaceDeclaration.namespaceUri().toString() << '"';
writer << " )" << endl;
}
}
@@ -748,11 +750,11 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
foreach(QXmlStreamNotationDeclaration notationDeclaration, reader.notationDeclarations()) {
writer << endl << " NotationDeclaration(";
if (!notationDeclaration.name().isEmpty())
- writer << " name=\"" << notationDeclaration.name().toString() << "\"";
+ writer << " name=\"" << notationDeclaration.name().toString() << '"';
if (!notationDeclaration.systemId().isEmpty())
- writer << " systemId=\"" << notationDeclaration.systemId().toString() << "\"";
+ writer << " systemId=\"" << notationDeclaration.systemId().toString() << '"';
if (!notationDeclaration.publicId().isEmpty())
- writer << " publicId=\"" << notationDeclaration.publicId().toString() << "\"";
+ writer << " publicId=\"" << notationDeclaration.publicId().toString() << '"';
writer << " )" << endl;
}
}
@@ -760,15 +762,15 @@ QByteArray tst_QXmlStream::readFile(const QString &filename)
foreach(QXmlStreamEntityDeclaration entityDeclaration, reader.entityDeclarations()) {
writer << endl << " EntityDeclaration(";
if (!entityDeclaration.name().isEmpty())
- writer << " name=\"" << entityDeclaration.name().toString() << "\"";
+ writer << " name=\"" << entityDeclaration.name().toString() << '"';
if (!entityDeclaration.notationName().isEmpty())
- writer << " notationName=\"" << entityDeclaration.notationName().toString() << "\"";
+ writer << " notationName=\"" << entityDeclaration.notationName().toString() << '"';
if (!entityDeclaration.systemId().isEmpty())
- writer << " systemId=\"" << entityDeclaration.systemId().toString() << "\"";
+ writer << " systemId=\"" << entityDeclaration.systemId().toString() << '"';
if (!entityDeclaration.publicId().isEmpty())
- writer << " publicId=\"" << entityDeclaration.publicId().toString() << "\"";
+ writer << " publicId=\"" << entityDeclaration.publicId().toString() << '"';
if (!entityDeclaration.value().isEmpty())
- writer << " value=\"" << entityDeclaration.value().toString() << "\"";
+ writer << " value=\"" << entityDeclaration.value().toString() << '"';
writer << " )" << endl;
}
}
@@ -877,13 +879,13 @@ void tst_QXmlStream::testFalsePrematureError() const
while (!xml.atEnd()) {
xml.readNext();
}
- QVERIFY(xml.error() == QXmlStreamReader::PrematureEndOfDocumentError);
+ QCOMPARE(xml.error(), QXmlStreamReader::PrematureEndOfDocumentError);
QCOMPARE(xml.errorString(), QLatin1String("Premature end of document."));
xml.addData(legal_start);
while (!xml.atEnd()) {
xml.readNext();
}
- QVERIFY(xml.error() == QXmlStreamReader::PrematureEndOfDocumentError);
+ QCOMPARE(xml.error(), QXmlStreamReader::PrematureEndOfDocumentError);
QCOMPARE(xml.errorString(), QLatin1String("Premature end of document."));
xml.addData(end);
while (!xml.atEnd()) {
@@ -898,7 +900,7 @@ void tst_QXmlStream::testFalsePrematureError() const
}
QVERIFY(xml.hasError());
QCOMPARE(xml.errorString(), QLatin1String("Start tag expected."));
- QVERIFY(xml.error() == QXmlStreamReader::NotWellFormedError);
+ QCOMPARE(xml.error(), QXmlStreamReader::NotWellFormedError);
}
}
@@ -978,7 +980,8 @@ void tst_QXmlStream::writeAttributesWithSpace() const
writer.writeEmptyElement("A");
writer.writeAttribute("attribute", QStringLiteral("value") + QChar(QChar::Nbsp));
writer.writeEndDocument();
- QString s = QString("<?xml version=\"1.0\" encoding=\"UTF-8\"?><A attribute=\"value%1\"/>\n").arg(QChar(QChar::Nbsp));
+ QString s = QLatin1String("<?xml version=\"1.0\" encoding=\"UTF-8\"?><A attribute=\"value")
+ + QChar(QChar::Nbsp) + QLatin1String("\"/>\n");
QCOMPARE(buffer.buffer().data(), s.toUtf8().data());
}
@@ -1051,11 +1054,11 @@ void tst_QXmlStream::readNextStartElement() const
QXmlStreamReader reader(in);
QVERIFY(reader.readNextStartElement());
- QVERIFY(reader.isStartElement() && reader.name() == "A");
+ QVERIFY(reader.isStartElement() && reader.name() == QLatin1String("A"));
int amountOfB = 0;
while (reader.readNextStartElement()) {
- QVERIFY(reader.isStartElement() && reader.name() == "B");
+ QVERIFY(reader.isStartElement() && reader.name() == QLatin1String("B"));
++amountOfB;
reader.skipCurrentElement();
}
diff --git a/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro b/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro
index d95fa941f0..c05a575acf 100644
--- a/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro
+++ b/tests/auto/dbus/qdbusabstractadaptor/qdbusabstractadaptor/qdbusabstractadaptor.pro
@@ -5,4 +5,3 @@ TARGET = ../tst_qdbusabstractadaptor
DESTDIR = ./
QT = core core-private dbus testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro b/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro
index ddafd528ee..8f2d261899 100644
--- a/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro
+++ b/tests/auto/dbus/qdbusabstractadaptor/qmyserver/qmyserver.pro
@@ -4,4 +4,3 @@ TARGET = qmyserver
DESTDIR = ./
QT = core dbus
CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
index d26af847cf..7a73dddfe3 100644
--- a/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
+++ b/tests/auto/dbus/qdbusabstractadaptor/tst_qdbusabstractadaptor.cpp
@@ -507,7 +507,7 @@ void tst_QDBusAbstractAdaptor::initTestCase()
// get peer server address
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
QDBusMessage rpl = QDBusConnection::sessionBus().call(req);
- QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl.type(), QDBusMessage::ReplyMessage);
QString address = rpl.arguments().at(0).toString();
// connect to peer server
@@ -1870,7 +1870,7 @@ void tst_QDBusAbstractAdaptor::methodWithMoreThanOneReturnValue()
QDBusInterface remote(con.baseService(), "/", "local.Interface3", con);
QDBusMessage reply = remote.call(QDBus::BlockWithGui, "methodStringString", testString);
- QVERIFY(reply.arguments().count() == 2);
+ QCOMPARE(reply.arguments().count(), 2);
QDBusReply<int> intreply = reply;
QVERIFY(intreply.isValid());
@@ -1892,7 +1892,7 @@ void tst_QDBusAbstractAdaptor::methodWithMoreThanOneReturnValuePeer()
QDBusInterface remote(QString(), "/", "local.Interface3", con);
QDBusMessage reply = remote.call(QDBus::BlockWithGui, "methodStringString", testString);
- QVERIFY(reply.arguments().count() == 2);
+ QCOMPARE(reply.arguments().count(), 2);
QDBusReply<int> intreply = reply;
QVERIFY(intreply.isValid());
diff --git a/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro b/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro
index a8cc4c2b38..702c81ff54 100644
--- a/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro
+++ b/tests/auto/dbus/qdbusabstractinterface/qdbusabstractinterface/qdbusabstractinterface.pro
@@ -7,7 +7,6 @@ DESTDIR = ./
QT = core testlib
QT += dbus
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
DBUS_INTERFACES = ../org.qtproject.QtDBus.Pinger.xml
QDBUSXML2CPP_INTERFACE_HEADER_FLAGS += -i ../interface.h
diff --git a/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro b/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro
index 957b47e413..206522b557 100644
--- a/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro
+++ b/tests/auto/dbus/qdbusabstractinterface/qpinger/qpinger.pro
@@ -5,4 +5,3 @@ DESTDIR = ./
CONFIG -= app_bundle
CONFIG += console
QT = core dbus
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
index cd23f2cb47..2db687e21b 100644
--- a/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
+++ b/tests/auto/dbus/qdbusabstractinterface/tst_qdbusabstractinterface.cpp
@@ -247,7 +247,7 @@ void tst_QDBusAbstractInterface::initTestCase()
// get peer server address
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
QDBusMessage rpl = con.call(req);
- QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl.type(), QDBusMessage::ReplyMessage);
peerAddress = rpl.arguments().at(0).toString();
}
@@ -283,7 +283,7 @@ void tst_QDBusAbstractInterface::cleanup()
targetObj.m_complexProp = RegisteredType();
QDBusMessage resetCall = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "reset");
- QVERIFY(QDBusConnection::sessionBus().call(resetCall).type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(QDBusConnection::sessionBus().call(resetCall).type(), QDBusMessage::ReplyMessage);
}
void tst_QDBusAbstractInterface::makeVoidCall()
@@ -441,7 +441,7 @@ void tst_QDBusAbstractInterface::makeAsyncStringCallPeer()
QVERIFY2(p, "Not connected to D-Bus");
QDBusMessage reply = p->call(QDBus::BlockWithGui, QLatin1String("voidMethod"));
- QVERIFY(reply.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
QDBusPendingReply<QString> r = p->stringMethod();
r.waitForFinished();
@@ -622,7 +622,7 @@ void tst_QDBusAbstractInterface::complexPropRead()
RegisteredType expectedValue = targetObj.m_complexProp = RegisteredType("This is a test");
QVariant v = p->property("complexProp");
- QVERIFY(v.userType() == qMetaTypeId<RegisteredType>());
+ QCOMPARE(v.userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(v.value<RegisteredType>(), targetObj.m_complexProp);
}
@@ -694,7 +694,7 @@ void tst_QDBusAbstractInterface::complexPropReadPeer()
RegisteredType expectedValue = RegisteredType("This is a test");
QVariant v = p->property("complexProp");
- QVERIFY(v.userType() == qMetaTypeId<RegisteredType>());
+ QCOMPARE(v.userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(v.value<RegisteredType>(), expectedValue);
}
@@ -861,8 +861,8 @@ void tst_QDBusAbstractInterface::getVoidSignal()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s.at(0).size() == 0);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s.at(0).size(), 0);
}
void tst_QDBusAbstractInterface::getStringSignal_data()
@@ -886,8 +886,8 @@ void tst_QDBusAbstractInterface::getStringSignal()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), int(QVariant::String));
QCOMPARE(s[0][0].toString(), expectedValue);
}
@@ -913,8 +913,8 @@ void tst_QDBusAbstractInterface::getComplexSignal()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(s[0][0].value<RegisteredType>(), expectedValue);
}
@@ -942,8 +942,8 @@ void tst_QDBusAbstractInterface::getVoidSignalPeer()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s.at(0).size() == 0);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s.at(0).size(), 0);
}
void tst_QDBusAbstractInterface::getStringSignalPeer_data()
@@ -968,8 +968,8 @@ void tst_QDBusAbstractInterface::getStringSignalPeer()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), int(QVariant::String));
QCOMPARE(s[0][0].toString(), expectedValue);
}
@@ -996,8 +996,8 @@ void tst_QDBusAbstractInterface::getComplexSignalPeer()
QTestEventLoop::instance().enterLoop(2);
QVERIFY(!QTestEventLoop::instance().timeout());
- QVERIFY(s.size() == 1);
- QVERIFY(s[0].size() == 1);
+ QCOMPARE(s.size(), 1);
+ QCOMPARE(s[0].size(), 1);
QCOMPARE(s[0][0].userType(), qMetaTypeId<RegisteredType>());
QCOMPARE(s[0][0].value<RegisteredType>(), expectedValue);
}
@@ -1045,7 +1045,7 @@ void tst_QDBusAbstractInterface::followSignal()
// now the signal must have been received:
QCOMPARE(s.size(), 1);
- QVERIFY(s.at(0).size() == 0);
+ QCOMPARE(s.at(0).size(), 0);
// cleanup:
con.interface()->unregisterService(serviceToFollow);
diff --git a/tests/auto/dbus/qdbusconnection/qdbusconnection.pro b/tests/auto/dbus/qdbusconnection/qdbusconnection.pro
index 83ae29de0a..3fcf3e076b 100644
--- a/tests/auto/dbus/qdbusconnection/qdbusconnection.pro
+++ b/tests/auto/dbus/qdbusconnection/qdbusconnection.pro
@@ -3,4 +3,3 @@ TARGET = tst_qdbusconnection
QT = core dbus testlib
SOURCES += tst_qdbusconnection.cpp
HEADERS += tst_qdbusconnection.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
index e91f87d6c8..7cd8c875ec 100644
--- a/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
+++ b/tests/auto/dbus/qdbusconnection/tst_qdbusconnection.cpp
@@ -71,7 +71,7 @@ void tst_QDBusConnection::noConnection()
QVERIFY(con.callWithCallback(msg, &spy, SLOT(asyncReply)) == 0);
QDBusMessage reply = con.call(msg);
- QVERIFY(reply.type() == QDBusMessage::ErrorMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ErrorMessage);
QDBusReply<void> voidreply(reply);
QVERIFY(!voidreply.isValid());
@@ -877,14 +877,14 @@ void tst_QDBusConnection::callSelfByAnotherName()
break;
case 1:
- QVERIFY(con.interface()->registerService(sname).value() == QDBusConnectionInterface::ServiceRegistered);
+ QCOMPARE(con.interface()->registerService(sname).value(), QDBusConnectionInterface::ServiceRegistered);
break;
case 2: {
// flag is DBUS_NAME_FLAG_DO_NOT_QUEUE = 0x04
// reply is DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER = 1
QDBusReply<uint> reply = con.interface()->call("RequestName", sname, 4u);
- QVERIFY(reply.value() == 1);
+ QCOMPARE(reply.value(), uint(1));
}
}
@@ -907,7 +907,7 @@ void tst_QDBusConnection::callSelfByAnotherName()
QString(), "test0");
QDBusMessage reply = con.call(msg, QDBus::Block, 1000);
- QVERIFY(reply.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
}
void tst_QDBusConnection::multipleInterfacesInQObject()
@@ -923,7 +923,7 @@ void tst_QDBusConnection::multipleInterfacesInQObject()
"local.BaseObject", "anotherMethod");
QDBusMessage reply = con.call(msg, QDBus::Block);
QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
- QVERIFY(reply.arguments().count() == 0);
+ QCOMPARE(reply.arguments().count(), 0);
}
void tst_QDBusConnection::slotsWithLessParameters()
diff --git a/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro b/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro
index 7b15a4fb81..97d3c0ebf4 100644
--- a/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro
+++ b/tests/auto/dbus/qdbusconnection_no_bus/qdbusconnection_no_bus.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusconnection_no_bus
QT = core dbus testlib
SOURCES += tst_qdbusconnection_no_bus.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbuscontext/qdbuscontext.pro b/tests/auto/dbus/qdbuscontext/qdbuscontext.pro
index a426c4cfd1..42cf425d52 100644
--- a/tests/auto/dbus/qdbuscontext/qdbuscontext.pro
+++ b/tests/auto/dbus/qdbuscontext/qdbuscontext.pro
@@ -2,5 +2,4 @@ CONFIG += testcase
TARGET = tst_qdbuscontext
QT = core dbus testlib
SOURCES += tst_qdbuscontext.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro b/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro
index 170b555ee7..b7dedad133 100644
--- a/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro
+++ b/tests/auto/dbus/qdbusinterface/qdbusinterface/qdbusinterface.pro
@@ -5,4 +5,3 @@ TARGET = ../tst_qdbusinterface
DESTDIR = ./
QT = core core-private dbus testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro b/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro
index ddafd528ee..8f2d261899 100644
--- a/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro
+++ b/tests/auto/dbus/qdbusinterface/qmyserver/qmyserver.pro
@@ -4,4 +4,3 @@ TARGET = qmyserver
DESTDIR = ./
QT = core dbus
CONFIG -= app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
index 93d3eacb08..47364e9217 100644
--- a/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
+++ b/tests/auto/dbus/qdbusinterface/tst_qdbusinterface.cpp
@@ -283,7 +283,7 @@ void tst_QDBusInterface::initTestCase()
// get peer server address
QDBusMessage req = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "address");
QDBusMessage rpl = con.call(req);
- QVERIFY(rpl.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl.type(), QDBusMessage::ReplyMessage);
QString address = rpl.arguments().at(0).toString();
// connect to peer server
@@ -292,7 +292,7 @@ void tst_QDBusInterface::initTestCase()
QDBusMessage req2 = QDBusMessage::createMethodCall(serviceName, objectPath, interfaceName, "waitForConnected");
QDBusMessage rpl2 = con.call(req2);
- QVERIFY(rpl2.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(rpl2.type(), QDBusMessage::ReplyMessage);
QVERIFY2(rpl2.type() == QDBusMessage::ReplyMessage, rpl2.errorMessage().toLatin1());
}
@@ -348,7 +348,7 @@ void tst_QDBusInterface::invalidAfterServiceOwnerChanged()
QTestEventLoop::instance().connect(connIface, SIGNAL(serviceOwnerChanged(QString,QString,QString)),
SLOT(exitLoop()));
- QVERIFY(connIface->registerService("com.example.Test") == QDBusConnectionInterface::ServiceRegistered);
+ QCOMPARE(connIface->registerService("com.example.Test").value(), QDBusConnectionInterface::ServiceRegistered);
QTestEventLoop::instance().enterLoop(5);
diff --git a/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro b/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro
index cbe3e89a16..3577210b86 100644
--- a/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro
+++ b/tests/auto/dbus/qdbuslocalcalls/qdbuslocalcalls.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbuslocalcalls
QT = core dbus testlib
SOURCES += tst_qdbuslocalcalls.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro b/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro
index b0656231d2..b0442a0ee4 100644
--- a/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro
+++ b/tests/auto/dbus/qdbusmarshall/qdbusmarshall/qdbusmarshall.pro
@@ -12,4 +12,3 @@ contains(QT_CONFIG, dbus-linked) {
} else {
SOURCES += ../../../../../src/dbus/qdbus_symbols.cpp
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro b/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro
index a4c5efba85..57f8b2a598 100644
--- a/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro
+++ b/tests/auto/dbus/qdbusmarshall/qpong/qpong.pro
@@ -5,4 +5,3 @@ QT = core dbus
CONFIG -= app_bundle
CONFIG += console
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro b/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro
index c0b38cf478..12f801613d 100644
--- a/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro
+++ b/tests/auto/dbus/qdbusmetaobject/qdbusmetaobject.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusmetaobject
QT = core dbus-private testlib
SOURCES += tst_qdbusmetaobject.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro b/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro
index aef9bc73cb..38d7370667 100644
--- a/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro
+++ b/tests/auto/dbus/qdbusmetatype/qdbusmetatype.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusmetatype
QT = core dbus testlib
SOURCES += tst_qdbusmetatype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro b/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro
index 7b5f867798..ddfe3008a5 100644
--- a/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro
+++ b/tests/auto/dbus/qdbuspendingcall/qdbuspendingcall.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbuspendingcall
QT = core dbus testlib
SOURCES += tst_qdbuspendingcall.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp b/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
index cc12ef8bcc..8cb9aa70e9 100644
--- a/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
+++ b/tests/auto/dbus/qdbuspendingcall/tst_qdbuspendingcall.cpp
@@ -178,7 +178,7 @@ void tst_QDBusPendingCall::waitForFinished()
QVERIFY(!ac.isError());
const QDBusMessage reply = ac.reply();
- QVERIFY(reply.type() == QDBusMessage::ReplyMessage);
+ QCOMPARE(reply.type(), QDBusMessage::ReplyMessage);
QCOMPARE(reply.signature(), QString("as"));
const QVariantList args = ac.reply().arguments();
@@ -334,7 +334,7 @@ void tst_QDBusPendingCall::watcher_waitForFinished_threaded()
QDBusPendingCall ac = tst->sendMessage();
// QVERIFY(!ac.isFinished());
// QVERIFY(!ac.isError());
-// QVERIFY(ac.reply().type() == QDBusMessage::InvalidMessage);
+// QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage);
QDBusPendingCallWatcher watch(ac);
tst->connect(&watch, SIGNAL(finished(QDBusPendingCallWatcher*)),
@@ -344,7 +344,7 @@ void tst_QDBusPendingCall::watcher_waitForFinished_threaded()
// QVERIFY(!ac.isFinished());
// QVERIFY(!ac.isError());
-// QVERIFY(ac.reply().type() == QDBusMessage::InvalidMessage);
+// QCOMPARE(ac.reply().type(), QDBusMessage::InvalidMessage);
QCOMPARE(tst->callCount, 0);
QCOMPARE(tst->slotCalled, 0);
diff --git a/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro b/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro
index d6b9e71084..814e40decc 100644
--- a/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro
+++ b/tests/auto/dbus/qdbuspendingreply/qdbuspendingreply.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbuspendingreply
QT = core dbus testlib
SOURCES += tst_qdbuspendingreply.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusreply/qdbusreply.pro b/tests/auto/dbus/qdbusreply/qdbusreply.pro
index 0ffb35e461..42e9e6dddc 100644
--- a/tests/auto/dbus/qdbusreply/qdbusreply.pro
+++ b/tests/auto/dbus/qdbusreply/qdbusreply.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusreply
QT = core dbus testlib
SOURCES += tst_qdbusreply.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro b/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro
index 82a0f3bb7e..e689a5cfa3 100644
--- a/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro
+++ b/tests/auto/dbus/qdbusservicewatcher/qdbusservicewatcher.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusservicewatcher
QT = core dbus testlib
SOURCES += tst_qdbusservicewatcher.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbusthreading/qdbusthreading.pro b/tests/auto/dbus/qdbusthreading/qdbusthreading.pro
index e50804336b..95358b2003 100644
--- a/tests/auto/dbus/qdbusthreading/qdbusthreading.pro
+++ b/tests/auto/dbus/qdbusthreading/qdbusthreading.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusthreading
QT = core dbus testlib
SOURCES += tst_qdbusthreading.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbustype/qdbustype.pro b/tests/auto/dbus/qdbustype/qdbustype.pro
index 21df33d2c7..1b3e0f8008 100644
--- a/tests/auto/dbus/qdbustype/qdbustype.pro
+++ b/tests/auto/dbus/qdbustype/qdbustype.pro
@@ -9,4 +9,3 @@ contains(QT_CONFIG, dbus-linked) {
} else {
SOURCES += ../../../../src/dbus/qdbus_symbols.cpp
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/dbus/qdbustype/tst_qdbustype.cpp b/tests/auto/dbus/qdbustype/tst_qdbustype.cpp
index 4408729e7c..5634bc20f8 100644
--- a/tests/auto/dbus/qdbustype/tst_qdbustype.cpp
+++ b/tests/auto/dbus/qdbustype/tst_qdbustype.cpp
@@ -260,11 +260,11 @@ void tst_QDBusType::isValidArray()
QFETCH(QString, data);
QFETCH(bool, result);
- data.prepend("a");
+ data.prepend(QLatin1Char('a'));
QCOMPARE(bool(q_dbus_signature_validate_single(data.toLatin1(), 0)), result);
QCOMPARE(QDBusUtil::isValidSingleSignature(data), result);
- data.prepend("a");
+ data.prepend(QLatin1Char('a'));
QCOMPARE(bool(q_dbus_signature_validate_single(data.toLatin1(), 0)), result);
QCOMPARE(QDBusUtil::isValidSingleSignature(data), result);
}
diff --git a/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro b/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro
index a7186c341b..3e47b00814 100644
--- a/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro
+++ b/tests/auto/dbus/qdbusxmlparser/qdbusxmlparser.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qdbusxmlparser
QT = core-private dbus-private xml testlib
SOURCES += tst_qdbusxmlparser.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro b/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro
index 7ed69ce1d1..485472c70c 100644
--- a/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro
+++ b/tests/auto/gui/image/qicoimageformat/qicoimageformat.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qicoimageformat
SOURCES+= tst_qicoimageformat.cpp
QT += testlib
diff --git a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
index bff762fd04..ffe3dcfb75 100644
--- a/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
+++ b/tests/auto/gui/image/qicoimageformat/tst_qicoimageformat.cpp
@@ -141,7 +141,7 @@ void tst_QIcoImageFormat::canRead()
QFETCH(QString, fileName);
QFETCH(int, isValid);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QCOMPARE(reader.canRead(), (isValid == 0 ? false : true));
}
@@ -175,7 +175,7 @@ void tst_QIcoImageFormat::SequentialFile()
QFETCH(QString, fileName);
QFETCH(int, isValid);
- QSequentialFile *file = new QSequentialFile(m_IconPath + "/" + fileName);
+ QSequentialFile *file = new QSequentialFile(m_IconPath + QLatin1Char('/') + fileName);
QVERIFY(file);
QVERIFY(file->open(QFile::ReadOnly));
QImageReader reader(file);
@@ -212,7 +212,7 @@ void tst_QIcoImageFormat::imageCount()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QCOMPARE(reader.imageCount(), count);
}
@@ -240,7 +240,7 @@ void tst_QIcoImageFormat::jumpToNextImage()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
bool bJumped = reader.jumpToImage(0);
while (bJumped) {
count--;
@@ -263,7 +263,7 @@ void tst_QIcoImageFormat::loopCount()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QCOMPARE(reader.loopCount(), count);
}
@@ -291,7 +291,7 @@ void tst_QIcoImageFormat::nextImageDelay()
QFETCH(QString, fileName);
QFETCH(int, count);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
if (count == -1) {
QCOMPARE(reader.nextImageDelay(), 0);
} else {
@@ -320,7 +320,7 @@ void tst_QIcoImageFormat::pngCompression()
QFETCH(int, width);
QFETCH(int, height);
- QImageReader reader(m_IconPath + "/" + fileName);
+ QImageReader reader(m_IconPath + QLatin1Char('/') + fileName);
QImage image;
reader.jumpToImage(index);
diff --git a/tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cache b/tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cache
new file mode 100644
index 0000000000..a323875989
--- /dev/null
+++ b/tests/auto/gui/image/qicon/icons/themeparent/icon-theme.cache
Binary files differ
diff --git a/tests/auto/gui/image/qicon/qicon.pro b/tests/auto/gui/image/qicon/qicon.pro
index 6ff20ec8fa..f5570c2497 100644
--- a/tests/auto/gui/image/qicon/qicon.pro
+++ b/tests/auto/gui/image/qicon/qicon.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qicon
QT += testlib
diff --git a/tests/auto/gui/image/qicon/tst_qicon.cpp b/tests/auto/gui/image/qicon/tst_qicon.cpp
index 9ed3873682..afa72f6922 100644
--- a/tests/auto/gui/image/qicon/tst_qicon.cpp
+++ b/tests/auto/gui/image/qicon/tst_qicon.cpp
@@ -63,6 +63,7 @@ private slots:
void streamAvailableSizes_data();
void streamAvailableSizes();
void fromTheme();
+ void fromThemeCache();
#ifndef QT_NO_WIDGETS
void task184901_badCache();
@@ -633,6 +634,69 @@ void tst_QIcon::fromTheme()
QVERIFY(abIcon.isNull());
}
+void tst_QIcon::fromThemeCache()
+{
+ QTemporaryDir dir;
+ QVERIFY(QDir().mkpath(dir.path() + QLatin1String("/testcache/16x16/actions")));
+ QVERIFY(QFile(QStringLiteral(":/styles/commonstyle/images/standardbutton-open-16.png"))
+ .copy( dir.path() + QLatin1String("/testcache/16x16/actions/button-open.png")));
+
+ {
+ QFile index(dir.path() + QLatin1String("/testcache/index.theme"));
+ QVERIFY(index.open(QFile::WriteOnly));
+ index.write("[Icon Theme]\nDirectories=16x16/actions\n[16x16/actions]\nSize=16\nContext=Actions\nType=Fixed\n");
+ }
+ QIcon::setThemeSearchPaths(QStringList() << dir.path());
+ QIcon::setThemeName("testcache");
+
+ // We just created a theme with that icon, it must exist
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+
+ QString cacheName = dir.path() + QLatin1String("/testcache/icon-theme.cache");
+
+ // An invalid cache should not prevent lookup
+ {
+ QFile cacheFile(cacheName);
+ QVERIFY(cacheFile.open(QFile::WriteOnly));
+ QDataStream(&cacheFile) << quint16(1) << quint16(0) << "invalid corrupted stuff in there\n";
+ }
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+
+ // An empty cache should prevent the lookup
+ {
+ QFile cacheFile(cacheName);
+ QVERIFY(cacheFile.open(QFile::WriteOnly));
+ QDataStream ds(&cacheFile);
+ ds << quint16(1) << quint16(0); // 0: version
+ ds << quint32(12) << quint32(20); // 4: hash offset / dir list offset
+ ds << quint32(1) << quint32(0xffffffff); // 12: one empty bucket
+ ds << quint32(1) << quint32(28); // 20: list with one element
+ ds.writeRawData("16x16/actions", sizeof("16x16/actions")); // 28
+ }
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(QIcon::fromTheme("button-open").isNull()); // The icon was not in the cache, it should not be found
+
+ // Adding an icon should be changing the modification date of one sub directory which should make the cache ignored
+ QTest::qWait(1000); // wait enough to have a different modification time in seconds
+ QVERIFY(QFile(QStringLiteral(":/styles/commonstyle/images/standardbutton-save-16.png"))
+ .copy(dir.path() + QLatin1String("/testcache/16x16/actions/button-save.png")));
+ QVERIFY(QFileInfo(cacheName).lastModified() < QFileInfo(dir.path() + QLatin1String("/testcache/16x16/actions")).lastModified());
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+
+ // Try to run the actual gtk-update-icon-cache and make sure that icons are still found
+ QProcess process;
+ process.start(QStringLiteral("gtk-update-icon-cache"),
+ QStringList() << QStringLiteral("-f") << QStringLiteral("-t") << (dir.path() + QLatin1String("/testcache")));
+ if (!process.waitForFinished())
+ QSKIP("gtk-update-icon-cache not run");
+ QVERIFY(QFileInfo(cacheName).lastModified() >= QFileInfo(dir.path() + QLatin1String("/testcache/16x16/actions")).lastModified());
+ QIcon::setThemeSearchPaths(QStringList() << dir.path()); // reload themes
+ QVERIFY(!QIcon::fromTheme("button-open").isNull());
+ QVERIFY(!QIcon::fromTheme("button-open-fallback").isNull());
+ QVERIFY(QIcon::fromTheme("notexist-fallback").isNull());
+}
void tst_QIcon::task223279_inconsistentAddFile()
{
diff --git a/tests/auto/gui/image/qicon/tst_qicon.qrc b/tests/auto/gui/image/qicon/tst_qicon.qrc
index 1505ca925b..3c8fbba7c2 100644
--- a/tests/auto/gui/image/qicon/tst_qicon.qrc
+++ b/tests/auto/gui/image/qicon/tst_qicon.qrc
@@ -15,6 +15,7 @@
<file>./icons/themeparent/32x32/actions/address-book-new.png</file>
<file>./icons/themeparent/32x32/actions/appointment-new.png</file>
<file>./icons/themeparent/index.theme</file>
+<file>./icons/themeparent/icon-theme.cache</file>
<file>./icons/themeparent/scalable/actions/address-book-new.svg</file>
<file>./icons/themeparent/scalable/actions/appointment-new.svg</file>
<file>./styles/commonstyle/images/standardbutton-open-16.png</file>
diff --git a/tests/auto/gui/image/qimage/qimage.pro b/tests/auto/gui/image/qimage/qimage.pro
index 42280d3bd4..d32e84c0d7 100644
--- a/tests/auto/gui/image/qimage/qimage.pro
+++ b/tests/auto/gui/image/qimage/qimage.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qimage
SOURCES += tst_qimage.cpp
diff --git a/tests/auto/gui/image/qimage/tst_qimage.cpp b/tests/auto/gui/image/qimage/tst_qimage.cpp
index 08f48abd20..e15e66b0a7 100644
--- a/tests/auto/gui/image/qimage/tst_qimage.cpp
+++ b/tests/auto/gui/image/qimage/tst_qimage.cpp
@@ -970,13 +970,17 @@ void tst_QImage::createAlphaMask_data()
int alphas[] = { 0, 127, 255 };
for (unsigned a1 = 0; a1 < sizeof(alphas) / sizeof(int); ++a1) {
+ const QByteArray a1B = QByteArray::number(alphas[a1]);
for (unsigned a2 = 0; a2 < sizeof(alphas) / sizeof(int); ++a2) {
if (a1 == a2)
continue;
+ const QByteArray a2B = QByteArray::number(alphas[a2]);
for (int x=10; x<18; x+=3) {
+ const QByteArray xB = QByteArray::number(x);
for (int y=100; y<108; y+=3) {
- QTest::newRow(qPrintable(QString::fromLatin1("x=%1, y=%2, a1=%3, a2=%4").arg(x).arg(y).arg(alphas[a1]).arg(alphas[a2])))
- << x << y << alphas[a1] << alphas[a2];
+ const QByteArray testName = "x=" + xB + ", y=" + QByteArray::number(y)
+ + ", a1=" + a1B + ", a2=" + a2B;
+ QTest::newRow(testName.constData()) << x << y << alphas[a1] << alphas[a2];
}
}
}
@@ -1073,34 +1077,34 @@ void tst_QImage::rotate_data()
degrees << 0 << 90 << 180 << 270;
foreach (int d, degrees) {
- QString title = QString("%1 %2").arg(d);
- QTest::newRow(qPrintable(title.arg("Format_RGB32")))
+ const QByteArray dB = QByteArray::number(d);
+ QTest::newRow((dB + " Format_RGB32").constData())
<< QImage::Format_RGB32 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB32")))
+ QTest::newRow((dB + " Format_ARGB32").constData())
<< QImage::Format_ARGB32 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB32_Premultiplied")))
+ QTest::newRow((dB + " Format_ARGB32_Premultiplied").constData())
<< QImage::Format_ARGB32_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB16")))
+ QTest::newRow((dB + " Format_RGB16").constData())
<< QImage::Format_RGB16 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB8565_Premultiplied")))
+ QTest::newRow((dB + " Format_ARGB8565_Premultiplied").constData())
<< QImage::Format_ARGB8565_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB666")))
+ QTest::newRow((dB + " Format_RGB666").constData())
<< QImage::Format_RGB666 << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB555")))
+ QTest::newRow((dB + " Format_RGB555").constData())
<< QImage::Format_RGB555 << d;
- QTest::newRow(qPrintable(title.arg("Format_ARGB8555_Premultiplied")))
+ QTest::newRow((dB + " Format_ARGB8555_Premultiplied").constData())
<< QImage::Format_ARGB8555_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_RGB888")))
+ QTest::newRow((dB + " Format_RGB888").constData())
<< QImage::Format_RGB888 << d;
- QTest::newRow(qPrintable(title.arg("Format_Indexed8")))
+ QTest::newRow((dB + " Format_Indexed8").constData())
<< QImage::Format_Indexed8 << d;
- QTest::newRow(qPrintable(title.arg("Format_RGBX8888")))
+ QTest::newRow((dB + " Format_RGBX8888").constData())
<< QImage::Format_RGBX8888 << d;
- QTest::newRow(qPrintable(title.arg("Format_RGBA8888_Premultiplied")))
+ QTest::newRow((dB + " Format_RGBA8888_Premultiplied").constData())
<< QImage::Format_RGBA8888_Premultiplied << d;
- QTest::newRow(qPrintable(title.arg("Format_Alpha8")))
+ QTest::newRow((dB + " Format_Alpha8").constData())
<< QImage::Format_Alpha8 << d;
- QTest::newRow(qPrintable(title.arg("Format_Grayscale8")))
+ QTest::newRow((dB + " Format_Grayscale8").constData())
<< QImage::Format_Grayscale8 << d;
}
}
@@ -1624,9 +1628,11 @@ void tst_QImage::smoothScale2_data()
int sizes[] = { 2, 3, 4, 6, 7, 8, 10, 16, 20, 32, 40, 64, 100, 101, 128, 0 };
QImage::Format formats[] = { QImage::Format_RGB32, QImage::Format_ARGB32_Premultiplied, QImage::Format_Invalid };
for (int j = 0; formats[j] != QImage::Format_Invalid; ++j) {
- QString formatstr = formats[j] == QImage::Format_RGB32 ? QStringLiteral("rgb32") : QStringLiteral("argb32pm");
+ QByteArray formatstr = formats[j] == QImage::Format_RGB32 ? QByteArrayLiteral("rgb32") : QByteArrayLiteral("argb32pm");
for (int i = 0; sizes[i] != 0; ++i) {
- QTest::newRow(QString("%1 %2x%2").arg(formatstr).arg(sizes[i]).toUtf8()) << (int)formats[j] << sizes[i];
+ const QByteArray sizeB = QByteArray::number(sizes[i]);
+ QTest::newRow((formatstr + ' ' + sizeB + 'x' + sizeB).constData())
+ << (int)formats[j] << sizes[i];
}
}
}
@@ -2598,10 +2604,11 @@ void tst_QImage::genericRgbConversion_data()
QTest::addColumn<QImage::Format>("dest_format");
for (int i = QImage::Format_RGB32; i < QImage::Format_Alpha8; ++i) {
+ const QString formatI = formatToString(QImage::Format(i));
for (int j = QImage::Format_RGB32; j < QImage::Format_Alpha8; ++j) {
if (i == j)
continue;
- QString test = QString::fromLatin1("%1 -> %2").arg(formatToString(QImage::Format(i))).arg(formatToString(QImage::Format(j)));
+ const QString test = formatI + QLatin1String(" -> ") + formatToString(QImage::Format(j));
QTest::newRow(qPrintable(test)) << QImage::Format(i) << QImage::Format(j);
}
}
diff --git a/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro b/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro
index bbcf8d23c9..428ff62959 100644
--- a/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro
+++ b/tests/auto/gui/image/qimageiohandler/qimageiohandler.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qimageiohandler
QT += testlib
diff --git a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
index 16fe959b11..2eb9b4fc2d 100644
--- a/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
+++ b/tests/auto/gui/image/qimagereader/tst_qimagereader.cpp
@@ -158,7 +158,7 @@ private:
// helper to skip an autotest when the given image format is not supported
#define SKIP_IF_UNSUPPORTED(format) do { \
if (!QByteArray(format).isEmpty() && !QImageReader::supportedImageFormats().contains(format)) \
- QSKIP("\"" + QByteArray(format) + "\" images are not supported"); \
+ QSKIP('"' + QByteArray(format) + "\" images are not supported"); \
} while (0)
// Testing get/set functions
@@ -785,7 +785,7 @@ void tst_QImageReader::animatedGif()
QVERIFY(!image.isNull());
int i = 0;
while(!image.isNull()){
- QString frameName = QString(":images/qt%1.gif").arg(++i);
+ QString frameName = QLatin1String(":images/qt") + QString::number(++i) + QLatin1String(".gif");
QCOMPARE(image, QImage(frameName));
image = io.read();
}
@@ -1637,14 +1637,14 @@ void tst_QImageReader::pixelCompareWithBaseline()
// least one file succeeded we know that the plugin was built.
// The other failures are then real failures.
QImage icoImg;
- const QString inputFileName(QString::fromLatin1("images/%1").arg(fileName));
+ const QString inputFileName(QLatin1String("images/") + fileName);
QFileInfo fi(inputFileName);
++enteredCount;
// might fail if the plugin does not exist, which is ok.
if (icoImg.load(inputFileName)) {
icoImg = icoImg.convertToFormat(QImage::Format_ARGB32_Premultiplied);
- const QString baselineFileName(QString::fromLatin1("baseline/%1.png").arg(fi.baseName()));
+ const QString baselineFileName(QLatin1String("baseline/") + fi.baseName() + QLatin1String(".png"));
#if 0
icoImg.save(baselineFileName);
#else
diff --git a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
index 06c775dded..6c22c47f0e 100644
--- a/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
+++ b/tests/auto/gui/image/qimagewriter/tst_qimagewriter.cpp
@@ -96,7 +96,7 @@ private:
// helper to skip an autotest when the given image format is not supported
#define SKIP_IF_UNSUPPORTED(format) do { \
if (!QByteArray(format).isEmpty() && !QImageReader::supportedImageFormats().contains(format)) \
- QSKIP("\"" + QByteArray(format) + "\" images are not supported"); \
+ QSKIP('"' + QByteArray(format) + "\" images are not supported"); \
} while (0)
static void initializePadding(QImage *image)
@@ -271,8 +271,8 @@ void tst_QImageWriter::writeImage2_data()
QImage image = image0.convertToFormat(imgFormat);
initializePadding(&image);
foreach (const QString format, formats) {
- const QString fileName = QString("solidcolor_%1.%2").arg(imgFormat)
- .arg(format);
+ const QString fileName = QLatin1String("solidcolor_")
+ + QString::number(imgFormat) + QLatin1Char('.') + format;
QTest::newRow(fileName.toLatin1()) << fileName
<< format.toLatin1()
<< image;
diff --git a/tests/auto/gui/image/qmovie/qmovie.pro b/tests/auto/gui/image/qmovie/qmovie.pro
index 4e7030b1f7..a04ad73b80 100644
--- a/tests/auto/gui/image/qmovie/qmovie.pro
+++ b/tests/auto/gui/image/qmovie/qmovie.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmovie
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/image/qpicture/qpicture.pro b/tests/auto/gui/image/qpicture/qpicture.pro
index a24b8ec481..0fc851ce11 100644
--- a/tests/auto/gui/image/qpicture/qpicture.pro
+++ b/tests/auto/gui/image/qpicture/qpicture.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpicture
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
index 67d7e57fd4..b4252031e6 100644
--- a/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
+++ b/tests/auto/gui/image/qpixmap/tst_qpixmap.cpp
@@ -445,7 +445,8 @@ void tst_QPixmap::scroll()
else
QVERIFY(pixmap.cacheKey() != oldKey);
- QString fileName = QString(":/images/%1.png").arg(QTest::currentDataTag());
+ const QString fileName = QLatin1String(":/images/") + QLatin1String(QTest::currentDataTag())
+ + QLatin1String(".png");
QPixmap output(fileName);
QCOMPARE(input.isNull(), output.isNull());
QVERIFY(lenientCompare(pixmap, output));
@@ -458,7 +459,7 @@ void tst_QPixmap::fill_data()
QTest::addColumn<bool>("syscolor");
QTest::addColumn<bool>("bitmap");
for (int color = Qt::black; color < Qt::darkYellow; ++color)
- QTest::newRow(QString("syscolor_%1").arg(color).toLatin1())
+ QTest::newRow(("syscolor_" + QByteArray::number(color)).constData())
<< uint(color) << true << false;
#if defined (Q_OS_WINCE)
@@ -1000,7 +1001,9 @@ void tst_QPixmap::toWinHICON()
HBITMAP bitmap = qt_pixmapToWinHBITMAP(empty, Alpha);
SelectObject(bitmap_dc, bitmap);
- QImage imageFromFile(image + QString(QLatin1String("_%1x%2.png")).arg(width).arg(height));
+ const QString fileName = image + QLatin1Char('_') + QString::number(width) + QLatin1Char('x')
+ + QString::number(height) + QLatin1String(".png");
+ QImage imageFromFile(fileName);
imageFromFile = imageFromFile.convertToFormat(QImage::Format_ARGB32_Premultiplied);
HICON icon = qt_pixmapToWinHICON(QPixmap::fromImage(imageFromFile));
@@ -1036,7 +1039,9 @@ void tst_QPixmap::fromWinHICON()
QImage imageFromHICON = qt_pixmapFromWinHICON(icon).toImage();
DestroyIcon(icon);
- QImage imageFromFile(image + QString(QLatin1String("_%1x%2.png")).arg(width).arg(height));
+ const QString fileName = image + QLatin1Char('_') + QString::number(width) + QLatin1Char('x')
+ + QString::number(height) + QLatin1String(".png");
+ QImage imageFromFile(fileName);
imageFromFile = imageFromFile.convertToFormat(QImage::Format_ARGB32_Premultiplied);
// fuzzy comparison must be used, as the pixel values change slightly during conversion
diff --git a/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro b/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro
index a81712ba23..fe3b5a2db3 100644
--- a/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro
+++ b/tests/auto/gui/image/qpixmapcache/qpixmapcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpixmapcache
QT += gui-private testlib
SOURCES += tst_qpixmapcache.cpp
diff --git a/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp b/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp
index a3cf66da18..d1f76e8742 100644
--- a/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp
+++ b/tests/auto/gui/image/qpixmapcache/tst_qpixmapcache.cpp
@@ -147,7 +147,7 @@ void tst_QPixmapCache::setCacheLimit()
QVERIFY(QPixmapCache::find(key, p1) == 0);
QPixmapCache::setCacheLimit(1000);
key = QPixmapCache::insert(*p1);
- QCOMPARE(getPrivate(key)->isValid, true);
+ QVERIFY(key.isValid());
QCOMPARE(getPrivate(key)->key, 1);
delete p1;
@@ -189,7 +189,7 @@ void tst_QPixmapCache::setCacheLimit()
key2 = QPixmapCache::insert(*p1);
QCOMPARE(getPrivate(key2)->key, 1);
//This old key is not valid anymore after the flush
- QCOMPARE(getPrivate(key)->isValid, false);
+ QVERIFY(!key.isValid());
QVERIFY(QPixmapCache::find(key, &p2) == 0);
delete p1;
}
@@ -233,7 +233,7 @@ void tst_QPixmapCache::find()
//at that time the first key has been erase because no more place in the cache
QVERIFY(QPixmapCache::find(key, &p1) == 0);
- QCOMPARE(getPrivate(key)->isValid, false);
+ QVERIFY(!key.isValid());
}
void tst_QPixmapCache::insert()
@@ -313,7 +313,7 @@ void tst_QPixmapCache::replace()
p2.fill(Qt::yellow);
QPixmapCache::Key key = QPixmapCache::insert(p1);
- QCOMPARE(getPrivate(key)->isValid, true);
+ QVERIFY(key.isValid());
QPixmap p3;
QVERIFY(QPixmapCache::find(key, &p3) == 1);
@@ -321,7 +321,7 @@ void tst_QPixmapCache::replace()
QPixmapCache::replace(key, p2);
QVERIFY(QPixmapCache::find(key, &p3) == 1);
- QCOMPARE(getPrivate(key)->isValid, true);
+ QVERIFY(key.isValid());
QCOMPARE(getPrivate(key)->key, 1);
QCOMPARE(p3.width(), 10);
@@ -438,7 +438,7 @@ void tst_QPixmapCache::clear()
for (int k = 0; k < numberOfKeys; ++k) {
QVERIFY(QPixmapCache::find(keys.at(k), &p1) == 0);
- QCOMPARE(getPrivate(keys[k])->isValid, false);
+ QVERIFY(!keys[k].isValid());
}
}
diff --git a/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro b/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro
index b85d475e97..50426612dc 100644
--- a/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro
+++ b/tests/auto/gui/itemmodels/qstandarditem/qstandarditem.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstandarditem
QT += testlib
SOURCES += tst_qstandarditem.cpp
diff --git a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp
index ff263c166a..06f7793ace 100644
--- a/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp
+++ b/tests/auto/gui/itemmodels/qstandarditem/tst_qstandarditem.cpp
@@ -140,7 +140,8 @@ void tst_QStandardItem::getSetData()
QStandardItem item;
for (int x = 0; x < 2; ++x) {
for (int i = 1; i <= 2; ++i) {
- QString text = QString("text %0").arg(i);
+ const QString iS = QString::number(i);
+ QString text = QLatin1String("text ") + iS;
item.setText(text);
QCOMPARE(item.text(), text);
@@ -150,15 +151,15 @@ void tst_QStandardItem::getSetData()
item.setIcon(icon);
QCOMPARE(item.icon(), icon);
- QString toolTip = QString("toolTip %0").arg(i);
+ QString toolTip = QLatin1String("toolTip ") + iS;
item.setToolTip(toolTip);
QCOMPARE(item.toolTip(), toolTip);
- QString statusTip = QString("statusTip %0").arg(i);
+ QString statusTip = QLatin1String("statusTip ") + iS;
item.setStatusTip(statusTip);
QCOMPARE(item.statusTip(), statusTip);
- QString whatsThis = QString("whatsThis %0").arg(i);
+ QString whatsThis = QLatin1String("whatsThis ") + iS;
item.setWhatsThis(whatsThis);
QCOMPARE(item.whatsThis(), whatsThis);
@@ -188,11 +189,11 @@ void tst_QStandardItem::getSetData()
item.setCheckState(checkState);
QCOMPARE(item.checkState(), checkState);
- QString accessibleText = QString("accessibleText %0").arg(i);
+ QString accessibleText = QLatin1String("accessibleText ") + iS;
item.setAccessibleText(accessibleText);
QCOMPARE(item.accessibleText(), accessibleText);
- QString accessibleDescription = QString("accessibleDescription %0").arg(i);
+ QString accessibleDescription = QLatin1String("accessibleDescription ") + iS;
item.setAccessibleDescription(accessibleDescription);
QCOMPARE(item.accessibleDescription(), accessibleDescription);
diff --git a/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro b/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro
index 71ef4acb88..eef165d9f7 100644
--- a/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro
+++ b/tests/auto/gui/itemmodels/qstandarditemmodel/qstandarditemmodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstandarditemmodel
QT += widgets widgets-private testlib
diff --git a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp
index ae47b2053b..7fc234670d 100644
--- a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp
+++ b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp
@@ -256,7 +256,7 @@ void tst_QStandardItemModel::insertRow()
QCOMPARE(rcLast[RowsInserted], expectedRow);
//check that the inserted item has different DisplayRole than initial items
- QVERIFY(m_model->data(m_model->index(expectedRow, 0), Qt::DisplayRole).toString() != "initialitem");
+ QVERIFY(m_model->data(m_model->index(expectedRow, 0), Qt::DisplayRole).toString() != QLatin1String("initialitem"));
} else {
// We inserted something outside the bounds, do nothing
QCOMPARE(m_model->rowCount(), defaultSize);
@@ -300,7 +300,7 @@ void tst_QStandardItemModel::insertRowsItems()
QStandardItemModel *m = qobject_cast<QStandardItemModel*>(m_model);
QStandardItem *hiddenRoot = m->invisibleRootItem();
for (int i = 0; i < 3; ++i)
- items.append(new QStandardItem(QString("%1").arg(i + 10)));
+ items.append(new QStandardItem(QString::number(i + 10)));
hiddenRoot->appendRows(items);
QCOMPARE(m_model->rowCount(), rowCount + 3);
QCOMPARE(m_model->index(rowCount + 0, 0).data().toInt(), 10);
@@ -365,7 +365,7 @@ void tst_QStandardItemModel::insertColumn()
QCOMPARE(rcLast[ColumnsInserted], expectedColumn);
//check that the inserted item has different DisplayRole than initial items
- QVERIFY(m_model->data(m_model->index(0, expectedColumn), Qt::DisplayRole).toString() != "initialitem");
+ QVERIFY(m_model->data(m_model->index(0, expectedColumn), Qt::DisplayRole).toString() != QLatin1String("initialitem"));
} else {
// We inserted something outside the bounds, do nothing
QCOMPARE(m_model->columnCount(), defaultSize);
@@ -729,8 +729,8 @@ void tst_QStandardItemModel::data()
}
}
- QVERIFY(m_model->data(m_model->index(0, 0), Qt::DisplayRole).toString() == "initialitem");
- QVERIFY(m_model->data(m_model->index(0, 0), Qt::ToolTipRole).toString() == "tooltip");
+ QCOMPARE(m_model->data(m_model->index(0, 0), Qt::DisplayRole).toString(), QLatin1String("initialitem"));
+ QCOMPARE(m_model->data(m_model->index(0, 0), Qt::ToolTipRole).toString(), QLatin1String("tooltip"));
}
@@ -874,7 +874,7 @@ void tst_QStandardItemModel::sort_data()
<< "zulu");
QStringList list;
for (int i=1000; i < 2000; ++i)
- list.append(QString("Number: %1").arg(i));
+ list.append(QStringLiteral("Number: ") + QString::number(i));
QTest::newRow("large set ascending") << static_cast<int>(Qt::AscendingOrder) << list << list;
}
@@ -1336,7 +1336,7 @@ void tst_QStandardItemModel::useCase3()
// create the tree structure first
QStandardItem *childItem = 0;
for (int i = 0; i < 100; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item = new QStandardItem(QStringLiteral("item ") + QString::number(i));
if (childItem)
item->appendRow(childItem);
childItem = item;
@@ -1466,55 +1466,48 @@ struct FriendlyTreeView : public QTreeView
#endif
#ifdef QT_BUILD_INTERNAL
-void tst_QStandardItemModel::treeDragAndDrop()
-{
- const int nRow = 5;
- const int nCol = 3;
-
- QStandardItemModel model;
- QStandardItemModel checkModel;
+static void populateDragAndDropModel(QStandardItemModel &model, int nRow, int nCol)
+{
+ const QString item = QStringLiteral("item ");
+ const QString dash = QStringLiteral(" - ");
for (int i = 0; i < nRow; ++i) {
+ const QString iS = QString::number(i);
QList<QStandardItem *> colItems1;
for (int c = 0 ; c < nCol; c ++)
- colItems1 << new QStandardItem(QString("item %1 - %0").arg(c).arg(i));
+ colItems1 << new QStandardItem(item + iS + dash + QString::number(c));
model.appendRow(colItems1);
for (int j = 0; j < nRow; ++j) {
+ const QString jS = QString::number(j);
QList<QStandardItem *> colItems2;
for (int c = 0 ; c < nCol; c ++)
- colItems2 << new QStandardItem(QString("item %1/%2 - %0").arg(c).arg(i).arg(j));
+ colItems2 << new QStandardItem(item + iS + QLatin1Char('/') + jS + dash + QString::number(c));
colItems1.at(0)->appendRow(colItems2);
for (int k = 0; k < nRow; ++k) {
QList<QStandardItem *> colItems3;
+ const QString kS = QString::number(k);
for (int c = 0 ; c < nCol; c ++)
- colItems3 << new QStandardItem(QString("item %1/%2/%3 - %0").arg(c).arg(i).arg(j).arg(k));
+ colItems3 << new QStandardItem(item + iS + QLatin1Char('/') + jS
+ + QLatin1Char('/') + kS
+ + dash + QString::number(c));
colItems2.at(0)->appendRow(colItems3);
}
}
}
+}
- for (int i = 0; i < nRow; ++i) {
- QList<QStandardItem *> colItems1;
- for (int c = 0 ; c < nCol; c ++)
- colItems1 << new QStandardItem(QString("item %1 - %0").arg(c).arg(i));
- checkModel.appendRow(colItems1);
+void tst_QStandardItemModel::treeDragAndDrop()
+{
+ const int nRow = 5;
+ const int nCol = 3;
- for (int j = 0; j < nRow; ++j) {
- QList<QStandardItem *> colItems2;
- for (int c = 0 ; c < nCol; c ++)
- colItems2 << new QStandardItem(QString("item %1/%2 - %0").arg(c).arg(i).arg(j));
- colItems1.at(0)->appendRow(colItems2);
+ QStandardItemModel model;
+ QStandardItemModel checkModel;
- for (int k = 0; k < nRow; ++k) {
- QList<QStandardItem *> colItems3;
- for (int c = 0 ; c < nCol; c ++)
- colItems3 << new QStandardItem(QString("item %1/%2/%3 - %0").arg(c).arg(i).arg(j).arg(k));
- colItems2.at(0)->appendRow(colItems3);
- }
- }
- }
+ populateDragAndDropModel(model, nRow, nCol);
+ populateDragAndDropModel(checkModel, nRow, nCol);
QVERIFY(compareModels(&model, &checkModel));
@@ -1613,14 +1606,14 @@ void tst_QStandardItemModel::removeRowsAndColumns()
#define VERIFY_MODEL \
for (int c = 0; c < col_list.count(); c++) \
for (int r = 0; r < row_list.count(); r++) \
- QCOMPARE(model.item(r,c)->text() , row_list[r] + "x" + col_list[c]);
+ QCOMPARE(model.item(r,c)->text() , row_list[r] + QLatin1Char('x') + col_list[c]);
QVector<QString> row_list = QString("1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20").split(',').toVector();
QVector<QString> col_list = row_list;
QStandardItemModel model;
for (int c = 0; c < col_list.count(); c++)
for (int r = 0; r < row_list.count(); r++)
- model.setItem(r, c, new QStandardItem(row_list[r] + "x" + col_list[c]));
+ model.setItem(r, c, new QStandardItem(row_list[r] + QLatin1Char('x') + col_list[c]));
VERIFY_MODEL
row_list.remove(3);
@@ -1642,14 +1635,14 @@ void tst_QStandardItemModel::removeRowsAndColumns()
QList<QStandardItem *> row_taken = model.takeRow(6);
QCOMPARE(row_taken.count(), col_list.count());
for (int c = 0; c < col_list.count(); c++)
- QCOMPARE(row_taken[c]->text() , row_list[6] + "x" + col_list[c]);
+ QCOMPARE(row_taken[c]->text() , row_list[6] + QLatin1Char('x') + col_list[c]);
row_list.remove(6);
VERIFY_MODEL
QList<QStandardItem *> col_taken = model.takeColumn(10);
QCOMPARE(col_taken.count(), row_list.count());
for (int r = 0; r < row_list.count(); r++)
- QCOMPARE(col_taken[r]->text() , row_list[r] + "x" + col_list[10]);
+ QCOMPARE(col_taken[r]->text() , row_list[r] + QLatin1Char('x') + col_list[10]);
col_list.remove(10);
VERIFY_MODEL
}
@@ -1661,7 +1654,7 @@ void tst_QStandardItemModel::itemRoleNames()
QStandardItemModel model;
for (int c = 0; c < col_list.count(); c++)
for (int r = 0; r < row_list.count(); r++)
- model.setItem(r, c, new QStandardItem(row_list[r] + "x" + col_list[c]));
+ model.setItem(r, c, new QStandardItem(row_list[r] + QLatin1Char('x') + col_list[c]));
VERIFY_MODEL
QHash<int, QByteArray> newRoleNames;
diff --git a/tests/auto/gui/kernel/qdrag/qdrag.pro b/tests/auto/gui/kernel/qdrag/qdrag.pro
index d4a7bc2705..ac3fde8028 100644
--- a/tests/auto/gui/kernel/qdrag/qdrag.pro
+++ b/tests/auto/gui/kernel/qdrag/qdrag.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdrag
QT += testlib
SOURCES += tst_qdrag.cpp
diff --git a/tests/auto/gui/kernel/qevent/qevent.pro b/tests/auto/gui/kernel/qevent/qevent.pro
index 09d4395f4d..2959089ce3 100644
--- a/tests/auto/gui/kernel/qevent/qevent.pro
+++ b/tests/auto/gui/kernel/qevent/qevent.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qevent
SOURCES += tst_qevent.cpp
QT = core testlib
-CONFIG += parallel_test
diff --git a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
index d18f9664fc..ea8f594f9c 100644
--- a/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
+++ b/tests/auto/gui/kernel/qguiapplication/tst_qguiapplication.cpp
@@ -63,6 +63,7 @@ private slots:
void initTestCase();
void cleanup();
void displayName();
+ void desktopFileName();
void firstWindowTitle();
void windowIcon();
void focusObject();
@@ -117,6 +118,21 @@ void tst_QGuiApplication::displayName()
QCOMPARE(QGuiApplication::applicationDisplayName(), QString::fromLatin1("The GUI Application"));
}
+void tst_QGuiApplication::desktopFileName()
+{
+ int argc = 1;
+ char *argv[] = { const_cast<char*>("tst_qguiapplication") };
+ QGuiApplication app(argc, argv);
+
+ QCOMPARE(QGuiApplication::desktopFileName(), QString());
+
+ QGuiApplication::setDesktopFileName("io.qt.QGuiApplication.desktop");
+ QCOMPARE(QGuiApplication::desktopFileName(), QString::fromLatin1("io.qt.QGuiApplication.desktop"));
+
+ QGuiApplication::setDesktopFileName(QString());
+ QCOMPARE(QGuiApplication::desktopFileName(), QString());
+}
+
void tst_QGuiApplication::firstWindowTitle()
{
int argc = 3;
diff --git a/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro b/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro
index 914142404b..331295bab9 100644
--- a/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro
+++ b/tests/auto/gui/kernel/qguimetatype/qguimetatype.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qguimetatype
SOURCES += tst_qguimetatype.cpp
QT = core gui testlib
-CONFIG += parallel_test
diff --git a/tests/auto/gui/kernel/qguitimer/qguitimer.pro b/tests/auto/gui/kernel/qguitimer/qguitimer.pro
index 15793d6e70..8a71e48007 100644
--- a/tests/auto/gui/kernel/qguitimer/qguitimer.pro
+++ b/tests/auto/gui/kernel/qguitimer/qguitimer.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qguitimer
QT = core gui testlib
SOURCES += ../../../corelib/kernel/qtimer/tst_qtimer.cpp
diff --git a/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro b/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro
index cc72c225a3..ada3817e55 100644
--- a/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro
+++ b/tests/auto/gui/kernel/qguivariant/no_application/no_application.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = no_application
SOURCES += main.cpp
QT += testlib
diff --git a/tests/auto/gui/kernel/qguivariant/test/test.pro b/tests/auto/gui/kernel/qguivariant/test/test.pro
index c4123797d2..39e4b3b71f 100644
--- a/tests/auto/gui/kernel/qguivariant/test/test.pro
+++ b/tests/auto/gui/kernel/qguivariant/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qguivariant
SOURCES += tst_qguivariant.cpp
RESOURCES = tst_qguivariant.qrc
diff --git a/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp b/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp
index 0e822ced5b..84fdd81f6c 100644
--- a/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp
+++ b/tests/auto/gui/kernel/qguivariant/test/tst_qguivariant.cpp
@@ -380,7 +380,7 @@ void tst_QGuiVariant::toString_data()
#ifndef Q_OS_MAC
<< QString( "Ctrl+A" );
#else
- << QString(QChar(0x2318)) + "A";
+ << QString(QChar(0x2318)) + QLatin1Char('A');
#endif
QFont font( "times", 12 );
diff --git a/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro b/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
index 7c1e8d52de..9f79fe9ab7 100644
--- a/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
+++ b/tests/auto/gui/kernel/qkeysequence/qkeysequence.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qkeysequence
QT += testlib
@@ -8,4 +7,3 @@ QT += core-private gui-private
SOURCES += tst_qkeysequence.cpp
RESOURCES += qkeysequence.qrc
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
index 3fcbd0a16f..84680fb7a6 100644
--- a/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
+++ b/tests/auto/gui/kernel/qkeysequence/tst_qkeysequence.cpp
@@ -250,7 +250,7 @@ void tst_QKeySequence::operatorQString()
seq = QKeySequence( modifiers | keycode );
- QCOMPARE( (QString)seq, keystring );
+ QCOMPARE( seq.toString(QKeySequence::NativeText), keystring );
}
// this verifies that the constructors can handle the same strings in and out
@@ -260,7 +260,7 @@ void tst_QKeySequence::symetricConstructors()
QFETCH( int, keycode );
QKeySequence seq1( modifiers | keycode );
- QKeySequence seq2( (QString)seq1 );
+ QKeySequence seq2( seq1.toString(QKeySequence::NativeText) );
QVERIFY( seq1 == seq2 );
}
diff --git a/tests/auto/gui/kernel/qpalette/qpalette.pro b/tests/auto/gui/kernel/qpalette/qpalette.pro
index de87e8fafe..9dd3f3e715 100644
--- a/tests/auto/gui/kernel/qpalette/qpalette.pro
+++ b/tests/auto/gui/kernel/qpalette/qpalette.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpalette
QT += testlib
SOURCES += tst_qpalette.cpp
diff --git a/tests/auto/gui/kernel/qscreen/qscreen.pro b/tests/auto/gui/kernel/qscreen/qscreen.pro
index b2c98a9dfd..b631f4cf37 100644
--- a/tests/auto/gui/kernel/qscreen/qscreen.pro
+++ b/tests/auto/gui/kernel/qscreen/qscreen.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscreen
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro b/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro
index 9a705f443e..97d9d69fb7 100644
--- a/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro
+++ b/tests/auto/gui/kernel/qsurfaceformat/qsurfaceformat.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsurfaceformat
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
index 2219306b81..a953a36559 100644
--- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
+++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp
@@ -58,12 +58,17 @@ class tst_QWindow: public QObject
Q_OBJECT
private slots:
+ void create();
+ void setParent();
+ void setVisible();
void eventOrderOnShow();
void resizeEventAfterResize();
void mapGlobal();
void positioning_data();
void positioning();
void positioningDuringMinimized();
+ void childWindowPositioning_data();
+ void childWindowPositioning();
void platformSurface();
void isExposed();
void isActive();
@@ -124,6 +129,111 @@ void tst_QWindow::cleanup()
QVERIFY(QGuiApplication::allWindows().isEmpty());
}
+void tst_QWindow::create()
+{
+ QWindow a;
+ QVERIFY2(!a.handle(), "QWindow should lazy init the platform window");
+
+ a.create();
+ QVERIFY2(a.handle(), "Explicitly creating a platform window should never fail");
+
+ QWindow b;
+ QWindow c(&b);
+ b.create();
+ QVERIFY(b.handle());
+ QVERIFY2(!c.handle(), "Creating a parent window should not automatically create children");
+
+ QWindow d;
+ QWindow e(&d);
+ e.create();
+ QVERIFY(e.handle());
+ QVERIFY2(d.handle(), "Creating a child window should automatically create parents");
+
+ QWindow f;
+ QWindow g(&f);
+ f.create();
+ QVERIFY(f.handle());
+ QPlatformWindow *platformWindow = f.handle();
+ g.create();
+ QVERIFY(g.handle());
+ QVERIFY2(f.handle() == platformWindow, "Creating a child window should not affect parent if already created");
+}
+
+void tst_QWindow::setParent()
+{
+ QWindow a;
+ QWindow b(&a);
+ QVERIFY2(b.parent() == &a, "Setting parent at construction time should work");
+ QVERIFY2(a.children().contains(&b), "Parent should have child in list of children");
+
+ QWindow c;
+ QWindow d;
+ d.setParent(&c);
+ QVERIFY2(d.parent() == &c, "Setting parent after construction should work");
+ QVERIFY2(c.children().contains(&d), "Parent should have child in list of children");
+
+ a.create();
+ b.setParent(0);
+ QVERIFY2(!b.handle(), "Making window top level shouild not automatically create it");
+
+ QWindow e;
+ c.create();
+ e.setParent(&c);
+ QVERIFY2(!e.handle(), "Making window a child of a created window should not automatically create it");
+
+ QWindow f;
+ QWindow g;
+ g.create();
+ QVERIFY(g.handle());
+ g.setParent(&f);
+ QVERIFY2(f.handle(), "Making a created window a child of a non-created window should automatically create it");
+}
+
+void tst_QWindow::setVisible()
+{
+ QWindow a;
+ QWindow b(&a);
+ a.setVisible(true);
+ QVERIFY2(!b.handle(), "Making a top level window visible doesn't create its children");
+ QVERIFY2(!b.isVisible(), "Making a top level window visible doesn't make its children visible");
+ QVERIFY(QTest::qWaitForWindowExposed(&a));
+
+ QWindow c;
+ QWindow d(&c);
+ d.setVisible(true);
+ QVERIFY2(!c.handle(), "Making a child window visible doesn't create parent window if parent is hidden");
+ QVERIFY2(!c.isVisible(), "Making a child window visible doesn't make its parent visible");
+
+ QVERIFY2(!d.handle(), "Making a child window visible doesn't create platform window if parent is hidden");
+
+ c.create();
+ QVERIFY(c.handle());
+ QVERIFY2(d.handle(), "Creating a parent window should automatically create children if they are visible");
+ QVERIFY2(!c.isVisible(), "Creating a parent window should not make it visible just because it has visible children");
+
+ QWindow e;
+ QWindow f(&e);
+ f.setVisible(true);
+ QVERIFY(!f.handle());
+ QVERIFY(!e.handle());
+ f.setParent(0);
+ QVERIFY2(f.handle(), "Making a visible but not created child window top level should create it");
+ QVERIFY(QTest::qWaitForWindowExposed(&f));
+
+ QWindow g;
+ QWindow h;
+ QWindow i(&g);
+ i.setVisible(true);
+ h.setVisible(true);
+ QVERIFY(QTest::qWaitForWindowExposed(&h));
+ QVERIFY(!i.handle());
+ QVERIFY(!g.handle());
+ QVERIFY(h.handle());
+ i.setParent(&h);
+ QVERIFY2(i.handle(), "Making a visible but not created child window child of a created window should create it");
+ QVERIFY(QTest::qWaitForWindowExposed(&i));
+}
+
void tst_QWindow::mapGlobal()
{
QWindow a;
@@ -212,6 +322,19 @@ private:
QPlatformSurfaceEvent::SurfaceEventType m_surfaceventType;
};
+class ColoredWindow : public QRasterWindow {
+public:
+ explicit ColoredWindow(const QColor &color, QWindow *parent = 0) : QRasterWindow(parent), m_color(color) {}
+ void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE
+ {
+ QPainter p(this);
+ p.fillRect(QRect(QPoint(0, 0), size()), m_color);
+ }
+
+private:
+ const QColor m_color;
+};
+
void tst_QWindow::eventOrderOnShow()
{
// Some platforms enforce minimum widths for windows, which can cause extra resize
@@ -394,6 +517,60 @@ void tst_QWindow::positioningDuringMinimized()
QTRY_COMPARE(window.geometry(), newGeometry);
}
+void tst_QWindow::childWindowPositioning_data()
+{
+ QTest::addColumn<bool>("showInsteadOfCreate");
+
+ QTest::newRow("create") << false;
+ QTest::newRow("show") << true;
+}
+
+void tst_QWindow::childWindowPositioning()
+{
+ const QPoint topLeftOrigin(0, 0);
+
+ ColoredWindow topLevelWindowFirst(Qt::green);
+ topLevelWindowFirst.setObjectName("topLevelWindowFirst");
+ ColoredWindow childWindowAfter(Qt::yellow, &topLevelWindowFirst);
+ childWindowAfter.setObjectName("childWindowAfter");
+
+ topLevelWindowFirst.setFramePosition(m_availableTopLeft);
+ childWindowAfter.setFramePosition(topLeftOrigin);
+
+ ColoredWindow topLevelWindowAfter(Qt::green);
+ topLevelWindowAfter.setObjectName("topLevelWindowAfter");
+ ColoredWindow childWindowFirst(Qt::yellow, &topLevelWindowAfter);
+ childWindowFirst.setObjectName("childWindowFirst");
+
+ topLevelWindowAfter.setFramePosition(m_availableTopLeft);
+ childWindowFirst.setFramePosition(topLeftOrigin);
+
+ QFETCH(bool, showInsteadOfCreate);
+
+ QWindow* windows[] = { &topLevelWindowFirst, &childWindowAfter, &childWindowFirst, &topLevelWindowAfter, 0 };
+ for (int i = 0; windows[i]; ++i) {
+ QWindow *window = windows[i];
+ if (showInsteadOfCreate) {
+ window->showNormal();
+ } else {
+ window->create();
+ }
+ }
+
+ if (showInsteadOfCreate) {
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevelWindowFirst));
+ QVERIFY(QTest::qWaitForWindowExposed(&topLevelWindowAfter));
+ }
+
+ // Creation order shouldn't affect the geometry
+ QCOMPARE(topLevelWindowFirst.geometry(), topLevelWindowAfter.geometry());
+ QCOMPARE(childWindowAfter.geometry(), childWindowFirst.geometry());
+
+ // Creation order shouldn't affect the child ending up at 0,0
+ QCOMPARE(childWindowFirst.framePosition(), topLeftOrigin);
+ QCOMPARE(childWindowAfter.framePosition(), topLeftOrigin);
+}
+
class PlatformWindowFilter : public QObject
{
Q_OBJECT
@@ -1665,19 +1842,6 @@ void tst_QWindow::modalWindowPosition()
QCOMPARE(window.geometry(), origGeo);
}
-class ColoredWindow : public QRasterWindow {
-public:
- explicit ColoredWindow(const QColor &color, QWindow *parent = 0) : QRasterWindow(parent), m_color(color) {}
- void paintEvent(QPaintEvent *) Q_DECL_OVERRIDE
- {
- QPainter p(this);
- p.fillRect(QRect(QPoint(0, 0), size()), m_color);
- }
-
-private:
- const QColor m_color;
-};
-
static bool isNativeWindowVisible(const QWindow *window)
{
#if defined(Q_OS_WIN) && !defined(Q_OS_WINCE) && !defined(Q_OS_WINRT)
diff --git a/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro b/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro
index 3302535dda..1401619cd0 100644
--- a/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro
+++ b/tests/auto/gui/math3d/qmatrixnxn/qmatrixnxn.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmatrixnxn
SOURCES += tst_qmatrixnxn.cpp
QT += testlib
diff --git a/tests/auto/gui/math3d/qquaternion/qquaternion.pro b/tests/auto/gui/math3d/qquaternion/qquaternion.pro
index d20719fd11..f578a38580 100644
--- a/tests/auto/gui/math3d/qquaternion/qquaternion.pro
+++ b/tests/auto/gui/math3d/qquaternion/qquaternion.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qquaternion
SOURCES += tst_qquaternion.cpp
QT += testlib
diff --git a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
index 1fbad5b829..53d9a987a6 100644
--- a/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
+++ b/tests/auto/gui/math3d/qquaternion/tst_qquaternion.cpp
@@ -999,16 +999,16 @@ static QByteArray testnameForAxis(const QVector3D &axis)
testname = "null";
} else {
if (axis.x()) {
- testname += axis.x() < 0 ? "-" : "+";
- testname += "X";
+ testname += axis.x() < 0 ? '-' : '+';
+ testname += 'X';
}
if (axis.y()) {
- testname += axis.y() < 0 ? "-" : "+";
- testname += "Y";
+ testname += axis.y() < 0 ? '-' : '+';
+ testname += 'Y';
}
if (axis.z()) {
- testname += axis.z() < 0 ? "-" : "+";
- testname += "Z";
+ testname += axis.z() < 0 ? '-' : '+';
+ testname += 'Z';
}
}
return testname;
diff --git a/tests/auto/gui/math3d/qvectornd/qvectornd.pro b/tests/auto/gui/math3d/qvectornd/qvectornd.pro
index 9504b4a02b..9e5155aa6f 100644
--- a/tests/auto/gui/math3d/qvectornd/qvectornd.pro
+++ b/tests/auto/gui/math3d/qvectornd/qvectornd.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qvectornd
SOURCES += tst_qvectornd.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qbrush/qbrush.pro b/tests/auto/gui/painting/qbrush/qbrush.pro
index 0cb11398dc..5016267e66 100644
--- a/tests/auto/gui/painting/qbrush/qbrush.pro
+++ b/tests/auto/gui/painting/qbrush/qbrush.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qbrush
QT += testlib gui-private
SOURCES += tst_qbrush.cpp
diff --git a/tests/auto/gui/painting/qcolor/qcolor.pro b/tests/auto/gui/painting/qcolor/qcolor.pro
index 44d65bb50b..c8aab4ab75 100644
--- a/tests/auto/gui/painting/qcolor/qcolor.pro
+++ b/tests/auto/gui/painting/qcolor/qcolor.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcolor
SOURCES += tst_qcolor.cpp
QT += testlib gui-private core-private
diff --git a/tests/auto/gui/painting/qpagelayout/qpagelayout.pro b/tests/auto/gui/painting/qpagelayout/qpagelayout.pro
index 38a1064357..21fc8e0bb7 100644
--- a/tests/auto/gui/painting/qpagelayout/qpagelayout.pro
+++ b/tests/auto/gui/painting/qpagelayout/qpagelayout.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpagelayout
SOURCES += tst_qpagelayout.cpp
QT += gui-private testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/painting/qpagesize/qpagesize.pro b/tests/auto/gui/painting/qpagesize/qpagesize.pro
index 5836dc9ba0..5e1cdb64eb 100644
--- a/tests/auto/gui/painting/qpagesize/qpagesize.pro
+++ b/tests/auto/gui/painting/qpagesize/qpagesize.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpagesize
SOURCES += tst_qpagesize.cpp
QT += testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/painting/qpaintengine/qpaintengine.pro b/tests/auto/gui/painting/qpaintengine/qpaintengine.pro
index 1cf79af0a7..810dd81311 100644
--- a/tests/auto/gui/painting/qpaintengine/qpaintengine.pro
+++ b/tests/auto/gui/painting/qpaintengine/qpaintengine.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpaintengine
SOURCES += tst_qpaintengine.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qpainter/qpainter.pro b/tests/auto/gui/painting/qpainter/qpainter.pro
index e90b516ef2..d4f1d43a74 100644
--- a/tests/auto/gui/painting/qpainter/qpainter.pro
+++ b/tests/auto/gui/painting/qpainter/qpainter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpainter
QT += testlib gui-private core-private
@@ -9,7 +8,6 @@ SOURCES += tst_qpainter.cpp
TESTDATA += drawEllipse/* drawLine_rop_bitmap/* drawPixmap_rop/* drawPixmap_rop_bitmap/* \
task217400.png
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
android: !android-no-sdk {
RESOURCES += \
diff --git a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp
index 1ed78fa0ef..1571053d7e 100644
--- a/tests/auto/gui/painting/qpainter/tst_qpainter.cpp
+++ b/tests/auto/gui/painting/qpainter/tst_qpainter.cpp
@@ -663,7 +663,7 @@ QColor tst_QPainter::baseColor( int k, int intensity )
QImage tst_QPainter::getResImage( const QString &dir, const QString &addition, const QString &extension )
{
QImage res;
- QString resFilename = dir + QString( "/res_%1." ).arg( addition ) + extension;
+ QString resFilename = dir + QLatin1String("/res_") + addition + QLatin1Char('.') + extension;
if ( !res.load( resFilename ) ) {
QWARN(QString("Could not load result data %s %1").arg(resFilename).toLatin1());
return QImage();
@@ -674,14 +674,14 @@ QImage tst_QPainter::getResImage( const QString &dir, const QString &addition, c
QBitmap tst_QPainter::getBitmap( const QString &dir, const QString &filename, bool mask )
{
QBitmap bm;
- QString bmFilename = dir + QString( "/%1.xbm" ).arg( filename );
+ QString bmFilename = dir + QLatin1Char('/') + filename + QLatin1String(".xbm");
if ( !bm.load( bmFilename ) ) {
QWARN(QString("Could not load bitmap '%1'").arg(bmFilename).toLatin1());
return QBitmap();
}
if ( mask ) {
QBitmap mask;
- QString maskFilename = dir + QString( "/%1-mask.xbm" ).arg( filename );
+ QString maskFilename = dir + QLatin1Char('/') + filename + QLatin1String("-mask.xbm");
if (!mask.load(maskFilename)) {
QWARN(QString("Could not load mask '%1'").arg(maskFilename).toLatin1());
return QBitmap();
@@ -1521,10 +1521,11 @@ void tst_QPainter::drawEllipse_data()
// ratio between width and hight is too large/small (task 114874). Those
// ratios are therefore currently avoided.
for (int w = 10; w < 128; w += 7) {
+ const QByteArray wB = QByteArray::number(w);
for (int h = w/2; h < qMin(2*w, 128); h += 13) {
- QString s = QString("%1x%2").arg(w).arg(h);
- QTest::newRow(QString("%1 with pen").arg(s).toLatin1()) << QSize(w, h) << true;
- QTest::newRow(QString("%1 no pen").arg(s).toLatin1()) << QSize(w, h) << false;
+ const QByteArray sB = wB + 'x' + QByteArray::number(h);
+ QTest::newRow((sB + " with pen").constData()) << QSize(w, h) << true;
+ QTest::newRow((sB + " no pen").constData()) << QSize(w, h) << false;
}
}
}
@@ -1562,16 +1563,17 @@ void tst_QPainter::drawClippedEllipse_data()
QTest::addColumn<QRect>("rect");
for (int w = 20; w < 128; w += 7) {
+ const QByteArray wB = QByteArray::number(w);
for (int h = w/2; h < qMin(2*w, 128); h += 13) {
- QString s = QString("%1x%2").arg(w).arg(h);
- QTest::newRow(QString("%1 top").arg(s).toLatin1()) << QRect(0, -h/2, w, h);
- QTest::newRow(QString("%1 topright").arg(s).toLatin1()) << QRect(w/2, -h/2, w, h);
- QTest::newRow(QString("%1 right").arg(s).toLatin1()) << QRect(w/2, 0, w, h);
- QTest::newRow(QString("%1 bottomright").arg(s).toLatin1()) << QRect(w/2, h/2, w, h);
- QTest::newRow(QString("%1 bottom").arg(s).toLatin1()) << QRect(0, h/2, w, h);
- QTest::newRow(QString("%1 bottomleft").arg(s).toLatin1()) << QRect(-w/2, h/2, w, h);
- QTest::newRow(QString("%1 left").arg(s).toLatin1()) << QRect(-w/2, 0, w, h);
- QTest::newRow(QString("%1 topleft").arg(s).toLatin1()) << QRect(-w/2, -h/2, w, h);
+ const QByteArray sB = wB + 'x' + QByteArray::number(h);
+ QTest::newRow((sB + " top").constData()) << QRect(0, -h/2, w, h);
+ QTest::newRow((sB + " topright").constData()) << QRect(w/2, -h/2, w, h);
+ QTest::newRow((sB + " right").constData()) << QRect(w/2, 0, w, h);
+ QTest::newRow((sB + " bottomright").constData()) << QRect(w/2, h/2, w, h);
+ QTest::newRow((sB + " bottom").constData()) << QRect(0, h/2, w, h);
+ QTest::newRow((sB + " bottomleft").constData()) << QRect(-w/2, h/2, w, h);
+ QTest::newRow((sB + " left").constData()) << QRect(-w/2, 0, w, h);
+ QTest::newRow((sB + " topleft").constData()) << QRect(-w/2, -h/2, w, h);
}
}
}
@@ -1678,13 +1680,14 @@ void tst_QPainter::fillData()
QTest::addColumn<bool>("usePen");
for (int w = 3; w < 50; w += 7) {
+ const QByteArray wB = QByteArray::number(w);
for (int h = 3; h < 50; h += 11) {
int x = w/2 + 5;
int y = h/2 + 5;
- QTest::newRow(QString("rect(%1, %2, %3, %4) with pen").arg(x).arg(y).arg(w).arg(h).toLatin1())
- << QRect(x, y, w, h) << true;
- QTest::newRow(QString("rect(%1, %2, %3, %4) no pen").arg(x).arg(y).arg(w).arg(h).toLatin1())
- << QRect(x, y, w, h) << false;
+ const QByteArray rB = "rect(" + QByteArray::number(x) + ", " + QByteArray::number(y)
+ + ", " + QByteArray::number(w) + ", " + QByteArray::number(h) + ')';
+ QTest::newRow((rB + " with pen").constData()) << QRect(x, y, w, h) << true;
+ QTest::newRow((rB + " no pen").constData()) << QRect(x, y, w, h) << false;
}
}
}
@@ -2167,21 +2170,23 @@ void tst_QPainter::clippedLines_data()
<< QLineF(15, 50, 66, 50);
foreach (QLineF line, lines) {
- QString desc = QString("line (%1, %2, %3, %4) %5").arg(line.x1())
- .arg(line.y1()).arg(line.x2()).arg(line.y2());
- QTest::newRow(qPrintable(desc.arg(0))) << QSize(100, 100) << line
+ const QByteArray desc = "line (" + QByteArray::number(line.x1())
+ + ", " + QByteArray::number(line.y1()) + ", "
+ + QByteArray::number(line.x2()) + ", " + QByteArray::number(line.y2())
+ + ") ";
+ QTest::newRow((desc + '0').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 49, 49)
<< QPen(Qt::black);
- QTest::newRow(qPrintable(desc.arg(1))) << QSize(100, 100) << line
+ QTest::newRow((desc + '1').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 50, 50)
<< QPen(Qt::black);
- QTest::newRow(qPrintable(desc.arg(2))) << QSize(100, 100) << line
+ QTest::newRow((desc + '2').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 51, 51)
<< QPen(Qt::black);
- QTest::newRow(qPrintable(desc.arg(3))) << QSize(100, 100) << line
+ QTest::newRow((desc + '3').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 51, 51)
<< QPen(Qt::NoPen);
- QTest::newRow(qPrintable(desc.arg(4))) << QSize(100, 100) << line
+ QTest::newRow((desc + '4').constData()) << QSize(100, 100) << line
<< QRect(15, 15, 51, 51)
<< pen2;
}
@@ -4487,7 +4492,7 @@ void tst_QPainter::QTBUG5939_attachPainterPrivate()
TestWidget *widget = new TestWidget();
proxy->setWidget(widget);
scene->addItem(proxy);
- proxy->rotate(45);
+ proxy->setTransform(QTransform().rotate(45));
w->resize(scene->sceneRect().size().toSize());
w->show();
diff --git a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
index ae30719ee7..b5e2ef96d1 100644
--- a/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
+++ b/tests/auto/gui/painting/qpainterpath/tst_qpainterpath.cpp
@@ -270,13 +270,13 @@ void tst_QPainterPath::contains_QPointF_data()
inside.addEllipse(base_rect.adjusted(5, 5, -5, -5));
QPolygonF inside_poly = inside.toFillPolygon();
for (int i=0; i<inside_poly.size(); ++i)
- QTest::newRow(qPrintable(QString("inside_ellipse %1").arg(i))) << path << inside_poly.at(i) << true;
+ QTest::newRow(("inside_ellipse " + QByteArray::number(i)).constData()) << path << inside_poly.at(i) << true;
QPainterPath outside;
outside.addEllipse(base_rect.adjusted(-5, -5, 5, 5));
QPolygonF outside_poly = outside.toFillPolygon();
for (int i=0; i<outside_poly.size(); ++i)
- QTest::newRow(qPrintable(QString("outside_ellipse %1").arg(i))) << path << outside_poly.at(i) << false;
+ QTest::newRow(("outside_ellipse " + QByteArray::number(i)).constData()) << path << outside_poly.at(i) << false;
path = QPainterPath();
base_rect = QRectF(50, 50, 200, 200);
@@ -852,8 +852,10 @@ void tst_QPainterPath::testArcMoveTo_data()
<< QRectF(100, 100, -100, -100);
for (int domain=0; domain<rects.size(); ++domain) {
+ const QByteArray dB = QByteArray::number(domain);
for (int i=-360; i<=360; ++i) {
- QTest::newRow(qPrintable(QString("test %1 %2").arg(domain).arg(i))) << rects.at(domain) << (qreal) i;
+ QTest::newRow(("test " + dB + ' ' + QByteArray::number(i)).constData())
+ << rects.at(domain) << (qreal) i;
}
// test low angles
diff --git a/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro b/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro
index 8ad476b498..218183da3d 100644
--- a/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro
+++ b/tests/auto/gui/painting/qpainterpathstroker/qpainterpathstroker.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpainterpathstroker
SOURCES += tst_qpainterpathstroker.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qpathclipper/qpathclipper.pro b/tests/auto/gui/painting/qpathclipper/qpathclipper.pro
index b90bca8df3..2536cb24c0 100644
--- a/tests/auto/gui/painting/qpathclipper/qpathclipper.pro
+++ b/tests/auto/gui/painting/qpathclipper/qpathclipper.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpathclipper
INCLUDEPATH += .
HEADERS += paths.h
diff --git a/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro b/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro
index fda0fad3b5..4d2dd70e26 100644
--- a/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro
+++ b/tests/auto/gui/painting/qpdfwriter/qpdfwriter.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpdfwriter
SOURCES += tst_qpdfwriter.cpp
QT += gui-private testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/painting/qpen/qpen.pro b/tests/auto/gui/painting/qpen/qpen.pro
index cafec29947..762b8f47d4 100644
--- a/tests/auto/gui/painting/qpen/qpen.pro
+++ b/tests/auto/gui/painting/qpen/qpen.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpen
SOURCES += tst_qpen.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qpolygon/qpolygon.pro b/tests/auto/gui/painting/qpolygon/qpolygon.pro
index 4783e4b5d4..9385b6458d 100644
--- a/tests/auto/gui/painting/qpolygon/qpolygon.pro
+++ b/tests/auto/gui/painting/qpolygon/qpolygon.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpolygon
QT += testlib
SOURCES += tst_qpolygon.cpp
diff --git a/tests/auto/gui/painting/qregion/qregion.pro b/tests/auto/gui/painting/qregion/qregion.pro
index 01eb9dd937..e9dff9a32e 100644
--- a/tests/auto/gui/painting/qregion/qregion.pro
+++ b/tests/auto/gui/painting/qregion/qregion.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qregion
QT += gui-private testlib
diff --git a/tests/auto/gui/painting/qtransform/qtransform.pro b/tests/auto/gui/painting/qtransform/qtransform.pro
index d59c040fb8..62c7518da0 100644
--- a/tests/auto/gui/painting/qtransform/qtransform.pro
+++ b/tests/auto/gui/painting/qtransform/qtransform.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtransform
SOURCES += tst_qtransform.cpp
QT += testlib
diff --git a/tests/auto/gui/painting/qwmatrix/qwmatrix.pro b/tests/auto/gui/painting/qwmatrix/qwmatrix.pro
index b3bec3d4ff..efa2963091 100644
--- a/tests/auto/gui/painting/qwmatrix/qwmatrix.pro
+++ b/tests/auto/gui/painting/qwmatrix/qwmatrix.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwmatrix
SOURCES += tst_qwmatrix.cpp
QT += testlib
diff --git a/tests/auto/gui/qopengl/qopengl.pro b/tests/auto/gui/qopengl/qopengl.pro
index bddccac747..2ca2fe4fb6 100644
--- a/tests/auto/gui/qopengl/qopengl.pro
+++ b/tests/auto/gui/qopengl/qopengl.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qopengl
QT += gui-private core-private testlib
diff --git a/tests/auto/gui/qopenglconfig/qopenglconfig.pro b/tests/auto/gui/qopenglconfig/qopenglconfig.pro
index bcf7215eea..9b0175acea 100644
--- a/tests/auto/gui/qopenglconfig/qopenglconfig.pro
+++ b/tests/auto/gui/qopenglconfig/qopenglconfig.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qopenglconfig
QT += gui-private core-private testlib
diff --git a/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro b/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro
index 866638f154..ec71130350 100644
--- a/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro
+++ b/tests/auto/gui/text/qabstracttextdocumentlayout/qabstracttextdocumentlayout.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstracttextdocumentlayout
QT += testlib
SOURCES += tst_qabstracttextdocumentlayout.cpp
diff --git a/tests/auto/gui/text/qcssparser/qcssparser.pro b/tests/auto/gui/text/qcssparser/qcssparser.pro
index bb0c8c4f40..88d1fcfd2d 100644
--- a/tests/auto/gui/text/qcssparser/qcssparser.pro
+++ b/tests/auto/gui/text/qcssparser/qcssparser.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcssparser
SOURCES += tst_qcssparser.cpp
QT += xml gui-private testlib
diff --git a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
index b1beb0ffd0..2308f4f215 100644
--- a/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
+++ b/tests/auto/gui/text/qcssparser/tst_qcssparser.cpp
@@ -185,7 +185,7 @@ static void debug(const QVector<QCss::Symbol> &symbols, int index = -1)
{
qDebug() << "all symbols:";
for (int i = 0; i < symbols.count(); ++i)
- qDebug() << "(" << i << "); Token:" << tokenName(symbols.at(i).token) << "; Lexem:" << symbols.at(i).lexem();
+ qDebug() << '(' << i << "); Token:" << tokenName(symbols.at(i).token) << "; Lexem:" << symbols.at(i).lexem();
if (index != -1)
qDebug() << "failure at index" << index;
}
@@ -916,21 +916,37 @@ void tst_QCssParser::marginValue_data()
int ex = QFontMetrics(f).xHeight();
int em = QFontMetrics(f).height();
+ const QString ex1234 = QString::number(ex) + QLatin1Char(' ') + QString::number(2 * ex)
+ + QLatin1Char(' ') + QString::number(3 * ex) + QLatin1Char(' ')
+ + QString::number(4 * ex);
+ const QString em2ex4 = QLatin1String("1 ") + QString::number(2*em) + QLatin1String(" 3 ")
+ + QString::number(4 * ex);
+
QTest::newRow("one value") << "margin: 1px" << "1 1 1 1";
QTest::newRow("two values") << "margin: 1px 2px" << "1 2 1 2";
QTest::newRow("three value") << "margin: 1px 2px 3px" << "1 2 3 2";
QTest::newRow("four values") << "margin: 1px 2px 3px 4px" << "1 2 3 4";
QTest::newRow("default px") << "margin: 1 2 3 4" << "1 2 3 4";
QTest::newRow("no unit") << "margin: 1 2 3 4" << "1 2 3 4";
- QTest::newRow("em") << "margin: 1ex 2ex 3ex 4ex" << QString("%1 %2 %3 %4").arg(ex).arg(2*ex).arg(3*ex).arg(4*ex);
- QTest::newRow("ex") << "margin: 1 2em 3px 4ex" << QString("%1 %2 %3 %4").arg(1).arg(2*em).arg(3).arg(4*ex);
+ QTest::newRow("em") << "margin: 1ex 2ex 3ex 4ex"
+ << (QString::number(ex) + QLatin1Char(' ') + QString::number(2 * ex)
+ + QLatin1Char(' ') + QString::number(3 * ex) + QLatin1Char(' ')
+ + QString::number(4 * ex));
+ QTest::newRow("ex") << "margin: 1 2em 3px 4ex"
+ << (QLatin1String("1 ") + QString::number(2 * em) + QLatin1String(" 3 ")
+ + QString::number(4 * ex));
f.setPointSize(20);
f.setBold(true);
ex = QFontMetrics(f).xHeight();
em = QFontMetrics(f).height();
- QTest::newRow("em2") << "font: bold 20pt; margin: 1ex 2ex 3ex 4ex" << QString("%1 %2 %3 %4").arg(ex).arg(2*ex).arg(3*ex).arg(4*ex);
- QTest::newRow("ex2") << "margin: 1 2em 3px 4ex; font-size: 20pt; font-weight: bold;" << QString("%1 %2 %3 %4").arg(1).arg(2*em).arg(3).arg(4*ex);
+ QTest::newRow("em2") << "font: bold 20pt; margin: 1ex 2ex 3ex 4ex"
+ << (QString::number(ex) + QLatin1Char(' ') + QString::number(2 * ex)
+ + QLatin1Char(' ') + QString::number(3 * ex) + QLatin1Char(' ')
+ + QString::number(4 * ex));
+ QTest::newRow("ex2") << "margin: 1 2em 3px 4ex; font-size: 20pt; font-weight: bold;"
+ << (QLatin1String("1 ") + QString::number(2 * em) + QLatin1String(" 3 ")
+ + QString::number(4 * ex));
QTest::newRow("crap") << "margin: crap" << "0 0 0 0";
}
@@ -963,7 +979,8 @@ void tst_QCssParser::marginValue()
int p[4];
int spacing;
v.extractBox(m, p, &spacing);
- QString str = QString("%1 %2 %3 %4").arg(m[0]).arg(m[1]).arg(m[2]).arg(m[3]);
+ QString str = QString::number(m[0]) + QLatin1Char(' ') + QString::number(m[1])
+ + QLatin1Char(' ') + QString::number(m[2]) + QLatin1Char(' ') + QString::number(m[3]);
QCOMPARE(str, expectedMargin);
}
}
@@ -1090,7 +1107,7 @@ void tst_QCssParser::styleSelector()
QFETCH(QString, xml);
QFETCH(QString, elementToCheck);
- QString css = QString("%1 { background-color: green }").arg(selector);
+ const QString css = selector + QLatin1String(" { background-color: green }");
QCss::Parser parser(css);
QCss::StyleSheet sheet;
QVERIFY(parser.parse(&sheet));
@@ -1154,7 +1171,7 @@ void tst_QCssParser::specificity()
{
QFETCH(QString, selector);
- QString css = QString("%1 { }").arg(selector);
+ QString css = selector + QLatin1String(" { }");
QCss::Parser parser(css);
QCss::StyleSheet sheet;
QVERIFY(parser.parse(&sheet));
@@ -1340,7 +1357,7 @@ void tst_QCssParser::shorthandBackgroundProperty()
QVERIFY(doc.setContent(QLatin1String("<!DOCTYPE test><test> <dummy/> </test>")));
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
@@ -1500,7 +1517,7 @@ void tst_QCssParser::gradient()
QVERIFY(doc.setContent(QLatin1String("<!DOCTYPE test><test> <dummy/> </test>")));
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
@@ -1560,7 +1577,7 @@ void tst_QCssParser::extractFontFamily()
{
QFETCH(QString, css);
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
@@ -1618,7 +1635,7 @@ void tst_QCssParser::extractBorder()
QFETCH(QColor, expectedTopColor);
css.prepend("dummy {");
- css.append("}");
+ css.append(QLatin1Char('}'));
QCss::Parser parser(css);
QCss::StyleSheet sheet;
diff --git a/tests/auto/gui/text/qfont/qfont.pro b/tests/auto/gui/text/qfont/qfont.pro
index ced66c226c..048d952faf 100644
--- a/tests/auto/gui/text/qfont/qfont.pro
+++ b/tests/auto/gui/text/qfont/qfont.pro
@@ -1,10 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfont
QT += testlib
QT += core-private gui-private
qtHaveModule(widgets): QT += widgets
SOURCES += tst_qfont.cpp
-
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/gui/text/qfont/tst_qfont.cpp b/tests/auto/gui/text/qfont/tst_qfont.cpp
index 93e308b96a..844a091495 100644
--- a/tests/auto/gui/text/qfont/tst_qfont.cpp
+++ b/tests/auto/gui/text/qfont/tst_qfont.cpp
@@ -504,7 +504,7 @@ void tst_QFont::isCopyOf()
void tst_QFont::insertAndRemoveSubstitutions()
{
- QFont::removeSubstitution("BogusFontFamily");
+ QFont::removeSubstitutions("BogusFontFamily");
// make sure it is empty before we start
QVERIFY(QFont::substitutes("BogusFontFamily").isEmpty());
QVERIFY(QFont::substitutes("bogusfontfamily").isEmpty());
@@ -521,7 +521,7 @@ void tst_QFont::insertAndRemoveSubstitutions()
QCOMPARE(QFont::substitutes("BogusFontFamily").count(), 3);
QCOMPARE(QFont::substitutes("bogusfontfamily").count(), 3);
- QFont::removeSubstitution("BogusFontFamily");
+ QFont::removeSubstitutions("BogusFontFamily");
// make sure it is empty again
QVERIFY(QFont::substitutes("BogusFontFamily").isEmpty());
QVERIFY(QFont::substitutes("bogusfontfamily").isEmpty());
@@ -679,7 +679,7 @@ static inline QByteArray msgNotAcceptableFont(const QString &defaultFamily, cons
{
QString res = QString::fromLatin1("Font family '%1' is not one of the following acceptable results: ").arg(defaultFamily);
Q_FOREACH (const QString &family, acceptableFamilies)
- res += QString::fromLatin1("\n %1").arg(family);
+ res += QLatin1String("\n ") + family;
return res.toLocal8Bit();
}
diff --git a/tests/auto/gui/text/qfontcache/qfontcache.pro b/tests/auto/gui/text/qfontcache/qfontcache.pro
index 5068c12cd6..bc1042a91b 100644
--- a/tests/auto/gui/text/qfontcache/qfontcache.pro
+++ b/tests/auto/gui/text/qfontcache/qfontcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontcache
QT += testlib
QT += core-private gui-private
diff --git a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
index 831ed1f572..5dba2fc06a 100644
--- a/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
+++ b/tests/auto/gui/text/qfontdatabase/qfontdatabase.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontdatabase
SOURCES += tst_qfontdatabase.cpp
QT += testlib core-private gui-private
diff --git a/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro b/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
index 7286c53d74..5dfabadd1a 100644
--- a/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
+++ b/tests/auto/gui/text/qfontmetrics/qfontmetrics.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontmetrics
QT += testlib core-private gui-private
SOURCES += tst_qfontmetrics.cpp
diff --git a/tests/auto/gui/text/qglyphrun/qglyphrun.pro b/tests/auto/gui/text/qglyphrun/qglyphrun.pro
index b7d9f164c9..39f641a3b2 100644
--- a/tests/auto/gui/text/qglyphrun/qglyphrun.pro
+++ b/tests/auto/gui/text/qglyphrun/qglyphrun.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qglyphrun
QT = core gui testlib
diff --git a/tests/auto/gui/text/qrawfont/qrawfont.pro b/tests/auto/gui/text/qrawfont/qrawfont.pro
index 20da2e9a22..47e760e1da 100644
--- a/tests/auto/gui/text/qrawfont/qrawfont.pro
+++ b/tests/auto/gui/text/qrawfont/qrawfont.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qrawfont
QT = core core-private gui gui-private testlib
diff --git a/tests/auto/gui/text/qstatictext/qstatictext.pro b/tests/auto/gui/text/qstatictext/qstatictext.pro
index 435b132ffd..55146c4482 100644
--- a/tests/auto/gui/text/qstatictext/qstatictext.pro
+++ b/tests/auto/gui/text/qstatictext/qstatictext.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
linux: CONFIG += insignificant_test
TARGET = tst_qstatictext
QT += testlib
diff --git a/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro b/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro
index a8dd6437ba..a78c429433 100644
--- a/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro
+++ b/tests/auto/gui/text/qsyntaxhighlighter/qsyntaxhighlighter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsyntaxhighlighter
SOURCES += tst_qsyntaxhighlighter.cpp
QT += testlib
diff --git a/tests/auto/gui/text/qtextblock/qtextblock.pro b/tests/auto/gui/text/qtextblock/qtextblock.pro
index 6048361f7a..cf3456bbf6 100644
--- a/tests/auto/gui/text/qtextblock/qtextblock.pro
+++ b/tests/auto/gui/text/qtextblock/qtextblock.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextblock
QT += testlib
diff --git a/tests/auto/gui/text/qtextcursor/qtextcursor.pro b/tests/auto/gui/text/qtextcursor/qtextcursor.pro
index 5e045404f1..bae85d9c37 100644
--- a/tests/auto/gui/text/qtextcursor/qtextcursor.pro
+++ b/tests/auto/gui/text/qtextcursor/qtextcursor.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextcursor
SOURCES += tst_qtextcursor.cpp
QT += testlib
diff --git a/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp b/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp
index 9396cd678b..1ecc3f2eae 100644
--- a/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp
+++ b/tests/auto/gui/text/qtextcursor/tst_qtextcursor.cpp
@@ -175,7 +175,7 @@ void tst_QTextCursor::navigation1()
{
cursor.insertText("Hello World");
- QVERIFY(doc->toPlainText() == "Hello World");
+ QCOMPARE(doc->toPlainText(), QLatin1String("Hello World"));
cursor.movePosition(QTextCursor::End);
QCOMPARE(cursor.position(), 11);
@@ -205,7 +205,7 @@ void tst_QTextCursor::navigation1()
doc->undo();
doc->undo();
- QVERIFY(doc->toPlainText() == "Hello World");
+ QCOMPARE(doc->toPlainText(), QLatin1String("Hello World"));
cursor.movePosition(QTextCursor::Start);
cursor.movePosition(QTextCursor::Right, QTextCursor::MoveAnchor, 6);
diff --git a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
index 7378ca85ee..ef96cda97d 100644
--- a/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
+++ b/tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
@@ -216,8 +216,8 @@ public:
QString tst_QTextDocument::cssFontSizeString(const QFont &font)
{
return font.pointSize() >= 0
- ? QStringLiteral("%1pt").arg(font.pointSizeF())
- : QStringLiteral("%1px").arg(font.pixelSize());
+ ? QString::number(font.pointSizeF()) + QStringLiteral("pt")
+ : QString::number(font.pixelSize()) + QStringLiteral("px");
}
// Testing get/set functions
@@ -3082,7 +3082,7 @@ void tst_QTextDocument::baseUrl()
document.setBaseUrl(base);
QCOMPARE(document.baseUrl(), base);
- document.setHtml(QString("<img src='%1'/>").arg(resource.toString()));
+ document.setHtml(QLatin1String("<img src='") + resource.toString() + QLatin1String("'/>"));
document.resource(QTextDocument::ImageResource, resource);
QCOMPARE(document.loadedResource(), loaded);
}
diff --git a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
index 1cd9d9bcbe..2ec64e5acc 100644
--- a/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
+++ b/tests/auto/gui/text/qtextdocumentfragment/tst_qtextdocumentfragment.cpp
@@ -1177,9 +1177,11 @@ void tst_QTextDocumentFragment::copySubTable()
fmt.setColumnWidthConstraints(constraints);
QTextTable *table = cursor.insertTable(4, 4, fmt);
- for (int row = 0; row < 4; ++row)
+ for (int row = 0; row < 4; ++row) {
+ const QString rowS = QString::number(row) + QLatin1Char('/');
for (int col = 0; col < 4; ++col)
- table->cellAt(row, col).firstCursorPosition().insertText(QString("%1/%2").arg(row).arg(col));
+ table->cellAt(row, col).firstCursorPosition().insertText(rowS + QString::number(col));
+ }
QCOMPARE(table->format().columnWidthConstraints().count(), table->columns());
diff --git a/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro b/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro
index 42c6406fdb..5d31ee3930 100644
--- a/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro
+++ b/tests/auto/gui/text/qtextdocumentlayout/qtextdocumentlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextdocumentlayout
QT += testlib
qtHaveModule(widgets) QT += widgets
diff --git a/tests/auto/gui/text/qtextformat/qtextformat.pro b/tests/auto/gui/text/qtextformat/qtextformat.pro
index c64d266916..bf909bafd2 100644
--- a/tests/auto/gui/text/qtextformat/qtextformat.pro
+++ b/tests/auto/gui/text/qtextformat/qtextformat.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextformat
QT += testlib core-private gui-private
SOURCES += tst_qtextformat.cpp
diff --git a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
index de0c2d6dbe..60ad5d32f5 100644
--- a/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
+++ b/tests/auto/gui/text/qtextlayout/tst_qtextlayout.cpp
@@ -1123,10 +1123,10 @@ void tst_QTextLayout::boundingRectTopLeft()
void tst_QTextLayout::graphemeBoundaryForSurrogatePairs()
{
QString txt;
- txt.append("a");
+ txt.append(QLatin1Char('a'));
txt.append(0xd87e);
txt.append(0xdc25);
- txt.append("b");
+ txt.append(QLatin1Char('b'));
QTextLayout layout(txt);
QTextEngine *engine = layout.engine();
const QCharAttributes *attrs = engine->attributes();
diff --git a/tests/auto/gui/text/qtextlist/qtextlist.pro b/tests/auto/gui/text/qtextlist/qtextlist.pro
index b837f1f81b..e9ca3ad0a0 100644
--- a/tests/auto/gui/text/qtextlist/qtextlist.pro
+++ b/tests/auto/gui/text/qtextlist/qtextlist.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextlist
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/text/qtextobject/qtextobject.pro b/tests/auto/gui/text/qtextobject/qtextobject.pro
index b2bf793e8e..3c69757410 100644
--- a/tests/auto/gui/text/qtextobject/qtextobject.pro
+++ b/tests/auto/gui/text/qtextobject/qtextobject.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextobject
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp b/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp
index f12bbbdd7e..17541912ce 100644
--- a/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp
+++ b/tests/auto/gui/text/qtextodfwriter/tst_qtextodfwriter.cpp
@@ -135,7 +135,7 @@ void tst_QTextOdfWriter::testWriteParagraph_data()
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">foobar <text:s text:c=\"2\"/>word<text:tab/>tab x</text:span></text:p>";
QTest::newRow("misc2") << "\t \tFoo" <<
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\"><text:tab/> <text:s text:c=\"4\"/><text:tab/>Foo</text:span></text:p>";
- QTest::newRow("linefeed") << QString("line1%1line2").arg(QChar(0x2028)) <<
+ QTest::newRow("linefeed") << (QStringLiteral("line1") + QChar(0x2028) + QStringLiteral("line2")) <<
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">line1<text:line-break/>line2</text:span></text:p>";
QTest::newRow("spaces") << "The quick brown fox jumped over the lazy dog" <<
"<text:p text:style-name=\"p1\"><text:span text:style-name=\"c0\">The quick brown fox jumped over the lazy dog</text:span></text:p>";
diff --git a/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro b/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
index 2179fcbdf8..756073e171 100644
--- a/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
+++ b/tests/auto/gui/text/qtextscriptengine/qtextscriptengine.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtextscriptengine
QT += core-private gui-private testlib
diff --git a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
index 2595bba2a9..37b815c2e3 100644
--- a/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
+++ b/tests/auto/gui/text/qtextscriptengine/tst_qtextscriptengine.cpp
@@ -130,7 +130,7 @@ struct ShapeTable {
static void prepareShapingTest(const QFont &font, const ShapeTable *shape_table)
{
for (const ShapeTable *s = shape_table; s->unicode[0]; ++s) {
- QByteArray testName = font.family().toLatin1() + ":";
+ QByteArray testName = font.family().toLatin1() + ':';
QString string;
for (const ushort *u = s->unicode; *u; ++u) {
string.append(QChar(*u));
diff --git a/tests/auto/gui/text/qtexttable/qtexttable.pro b/tests/auto/gui/text/qtexttable/qtexttable.pro
index 1e7249090a..2faadfcb0d 100644
--- a/tests/auto/gui/text/qtexttable/qtexttable.pro
+++ b/tests/auto/gui/text/qtexttable/qtexttable.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtexttable
QT += testlib
qtHaveModule(widgets): QT += widgets
diff --git a/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro b/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro
index 162cc796e5..f5fb11effd 100644
--- a/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro
+++ b/tests/auto/gui/util/qdesktopservices/qdesktopservices.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += testlib
SOURCES += tst_qdesktopservices.cpp
diff --git a/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro b/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro
index 9f04bdbb60..955369527f 100644
--- a/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro
+++ b/tests/auto/gui/util/qdoublevalidator/qdoublevalidator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdoublevalidator
QT += testlib
SOURCES += tst_qdoublevalidator.cpp
diff --git a/tests/auto/gui/util/qintvalidator/qintvalidator.pro b/tests/auto/gui/util/qintvalidator/qintvalidator.pro
index 4bc35416b5..52e0b85735 100644
--- a/tests/auto/gui/util/qintvalidator/qintvalidator.pro
+++ b/tests/auto/gui/util/qintvalidator/qintvalidator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qintvalidator
SOURCES += tst_qintvalidator.cpp
QT += testlib
diff --git a/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro b/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro
index 5b70d7b11d..8f1de5b747 100644
--- a/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro
+++ b/tests/auto/gui/util/qregexpvalidator/qregexpvalidator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qregexpvalidator
SOURCES += tst_qregexpvalidator.cpp
QT += testlib
diff --git a/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro b/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro
index 1e8e50563e..ab76cef3d1 100644
--- a/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro
+++ b/tests/auto/gui/util/qregularexpressionvalidator/qregularexpressionvalidator.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_qregularexpressionvalidator
SOURCES += tst_qregularexpressionvalidator.cpp
QT += testlib
diff --git a/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro b/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
index 4772af9af9..1874f001ab 100644
--- a/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
+++ b/tests/auto/network/access/qabstractnetworkcache/qabstractnetworkcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractnetworkcache
QT = core network testlib
SOURCES += tst_qabstractnetworkcache.cpp
diff --git a/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp b/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
index fd48ec3253..62f87db6df 100644
--- a/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
+++ b/tests/auto/network/access/qabstractnetworkcache/tst_qabstractnetworkcache.cpp
@@ -44,7 +44,7 @@
#include <algorithm>
-#define TESTFILE QString("http://%1/qtest/cgi-bin/").arg(QtNetworkSettings::serverName())
+#define TESTFILE QLatin1String("http://") + QtNetworkSettings::serverName() + QLatin1String("/qtest/cgi-bin/")
class tst_QAbstractNetworkCache : public QObject
{
diff --git a/tests/auto/network/access/qftp/tst_qftp.cpp b/tests/auto/network/access/qftp/tst_qftp.cpp
index 795548ccc8..25e324c9f3 100644
--- a/tests/auto/network/access/qftp/tst_qftp.cpp
+++ b/tests/auto/network/access/qftp/tst_qftp.cpp
@@ -290,10 +290,11 @@ void tst_QFtp::init()
#if !defined(Q_OS_WINCE)
srand(time(0));
- uniqueExtension = QString("%1%2%3").arg((qulonglong)this).arg(rand()).arg((qulonglong)time(0));
+ uniqueExtension = QString::number((quintptr)this) + QString::number(rand())
+ + QString::number((qulonglong)time(0));
#else
srand(0);
- uniqueExtension = QString("%1%2%3").arg((qulonglong)this).arg(rand()).arg((qulonglong)(0));
+ uniqueExtension = QString::number((quintptr)this) + QString::number(rand()) + QLatin1Char('0');
#endif
}
@@ -643,19 +644,20 @@ void tst_QFtp::get_data()
// test the two get() overloads in one routine
for ( int i=0; i<2; i++ ) {
- QTest::newRow( QString("relPath01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("relPath01_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< "qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("relPath02_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
+ QTest::newRow(("relPath02_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
<< "qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("absPath01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("absPath01_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< "/qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("absPath02_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
+ QTest::newRow(("absPath02_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString("ftptest") << QString("password")
<< "/var/ftp/qtest/rfc3252" << 1 << rfc3252 << (bool)(i==1);
- QTest::newRow( QString("nonExist01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("nonExist01_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< QString("foo") << 0 << QByteArray() << (bool)(i==1);
- QTest::newRow( QString("nonExist02_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("nonExist02_" + iB).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< QString("/foo") << 0 << QByteArray() << (bool)(i==1);
}
}
@@ -734,7 +736,7 @@ void tst_QFtp::put_data()
// test the two put() overloads in one routine
for ( int i=0; i<2; i++ ) {
- QTest::newRow( QString("relPath01_%1").arg(i).toLatin1().constData() ) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
+ QTest::newRow(("relPath01_" + QByteArray::number(i)).constData()) << QtNetworkSettings::serverName() << (uint)21 << QString() << QString()
<< QString("qtest/upload/rel01_%1") << rfc3252
<< (bool)(i==1) << 1;
/*
@@ -2048,10 +2050,10 @@ bool tst_QFtp::dirExists( const QString &host, quint16 port, const QString &user
addCommand( QFtp::ConnectToHost, ftp->connectToHost( host, port ) );
addCommand( QFtp::Login, ftp->login( user, password ) );
- if ( dirToCreate.startsWith( "/" ) )
+ if ( dirToCreate.startsWith( QLatin1Char('/') ) )
addCommand( QFtp::Cd, ftp->cd( dirToCreate ) );
else
- addCommand( QFtp::Cd, ftp->cd( cdDir + "/" + dirToCreate ) );
+ addCommand( QFtp::Cd, ftp->cd( cdDir + QLatin1Char('/') + dirToCreate ) );
addCommand( QFtp::Close, ftp->close() );
inFileDirExistsFunction = true;
diff --git a/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro b/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro
index fa19fa7ac9..bd20fd33dd 100644
--- a/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro
+++ b/tests/auto/network/access/qhttpnetworkconnection/qhttpnetworkconnection.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qhttpnetworkconnection
SOURCES += tst_qhttpnetworkconnection.cpp
requires(contains(QT_CONFIG,private_tests))
diff --git a/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro b/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro
index f5dbc7f010..1810a38f6e 100644
--- a/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro
+++ b/tests/auto/network/access/qhttpnetworkreply/qhttpnetworkreply.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qhttpnetworkreply
SOURCES += tst_qhttpnetworkreply.cpp
requires(contains(QT_CONFIG,private_tests))
diff --git a/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro b/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro
index 8b3de90f54..e84f9f7dba 100644
--- a/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro
+++ b/tests/auto/network/access/qnetworkaccessmanager/qnetworkaccessmanager.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkaccessmanager
SOURCES += tst_qnetworkaccessmanager.cpp
QT = core network testlib
diff --git a/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro b/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro
index d308c286fb..0e942cd4f4 100644
--- a/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro
+++ b/tests/auto/network/access/qnetworkcachemetadata/qnetworkcachemetadata.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkcachemetadata
QT = core network testlib
SOURCES += tst_qnetworkcachemetadata.cpp
diff --git a/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro b/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro
index ba3ece8576..320e3a81c5 100644
--- a/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro
+++ b/tests/auto/network/access/qnetworkcookie/qnetworkcookie.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkcookie
SOURCES += tst_qnetworkcookie.cpp
diff --git a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
index be3e839725..9738cf157e 100644
--- a/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
+++ b/tests/auto/network/access/qnetworkcookie/tst_qnetworkcookie.cpp
@@ -63,16 +63,16 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
-
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
diff --git a/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro b/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro
index bb39f83af6..4c955f38f0 100644
--- a/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro
+++ b/tests/auto/network/access/qnetworkcookiejar/qnetworkcookiejar.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkcookiejar
SOURCES += tst_qnetworkcookiejar.cpp
diff --git a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
index 12ac1e519d..f1ac7bc386 100644
--- a/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
+++ b/tests/auto/network/access/qnetworkcookiejar/tst_qnetworkcookiejar.cpp
@@ -72,16 +72,17 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
diff --git a/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro b/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
index 7e26abbe08..4a78544bf8 100644
--- a/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
+++ b/tests/auto/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkdiskcache
QT = core network testlib
SOURCES += tst_qnetworkdiskcache.cpp
diff --git a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
index 1685838e9e..399c9a733a 100644
--- a/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
+++ b/tests/auto/network/access/qnetworkdiskcache/tst_qnetworkdiskcache.cpp
@@ -540,7 +540,7 @@ void tst_QNetworkDiskCache::expire()
std::sort(cacheList.begin(), cacheList.end());
for (int i = 0; i < cacheList.count(); ++i) {
QString fileName = cacheList[i];
- QCOMPARE(fileName, QString("http://localhost:4/%1").arg(i + 6));
+ QCOMPARE(fileName, QLatin1String("http://localhost:4/") + QString::number(i + 6));
}
}
@@ -782,7 +782,10 @@ void tst_QNetworkDiskCache::crashWhenParentingCache()
QNetworkAccessManager *manager = new QNetworkAccessManager();
QNetworkDiskCache *diskCache = new QNetworkDiskCache(manager); // parent to qnam!
// we expect the temp dir to be cleaned at some point anyway
- diskCache->setCacheDirectory(QString("%1/cacheDir_%2").arg(QDir::tempPath()).arg(QCoreApplication::applicationPid()));
+
+ const QString diskCachePath = QDir::tempPath() + QLatin1String("/cacheDir_")
+ + QString::number(QCoreApplication::applicationPid());
+ diskCache->setCacheDirectory(diskCachePath);
manager->setCache(diskCache);
QUrl url("http://127.0.0.1:" + QString::number(server.serverPort()));
diff --git a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
index fbeeec2ec4..a84d290661 100644
--- a/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
+++ b/tests/auto/network/access/qnetworkreply/tst_qnetworkreply.cpp
@@ -125,9 +125,10 @@ class tst_QNetworkReply: public QObject
qsrand(QTime(0,0,0).msecsTo(QTime::currentTime()) + QCoreApplication::applicationPid());
seedCreated = true; // not thread-safe, but who cares
}
- QString s = QString("%1-%2-%3").arg(QTime(0,0,0).msecsTo(QTime::currentTime())).arg(QCoreApplication::applicationPid()).arg(qrand());
- return s;
- };
+ return QString::number(QTime(0, 0, 0).msecsTo(QTime::currentTime()))
+ + QLatin1Char('-') + QString::number(QCoreApplication::applicationPid())
+ + QLatin1Char('-') + QString::number(qrand());
+ }
static QString tempRedirectReplyStr() {
QString s = "HTTP/1.1 307 Temporary Redirect\r\n"
@@ -198,6 +199,7 @@ public Q_SLOTS:
protected Q_SLOTS:
void nestedEventLoops_slot();
+ void notEnoughData();
private Q_SLOTS:
void init();
@@ -486,6 +488,7 @@ private Q_SLOTS:
void parentingRepliesToTheApp();
private:
QString testDataDir;
+ bool notEnoughDataForFastSender;
};
bool tst_QNetworkReply::seedCreated = false;
@@ -514,16 +517,16 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
-
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
@@ -990,11 +993,13 @@ public:
}
// a server that sends the data provided at construction time, useful for HTTP
- FastSender(const QByteArray& data, bool https, bool fillBuffer)
+ FastSender(const QByteArray& data, bool https, bool fillBuffer, tst_QNetworkReply *listener = 0)
: wantedSize(data.size()), port(-1), protocol(ProvidedData),
doSsl(https), fillKernelBuffer(fillBuffer), transferRate(-1),
dataToTransmit(data), dataIndex(0)
{
+ if (listener)
+ connect(this, SIGNAL(notEnoughData()), listener, SLOT(notEnoughData()));
start();
ready.acquire();
}
@@ -1057,6 +1062,7 @@ protected:
do {
if (writeNextData(client, BlockSize) < BlockSize) {
qDebug() << "ERROR: FastSender: not enough data to write in order to fill buffers; or client is reading too fast";
+ emit notEnoughData();
return;
}
while (client->bytesToWrite() > 0) {
@@ -1117,6 +1123,7 @@ protected:
}
signals:
void dataReady();
+ void notEnoughData();
};
class RateControlledReader: public QObject
@@ -2780,7 +2787,7 @@ void tst_QNetworkReply::postToHttpsMultipart()
// hack for testing the setting of the content-type header by hand:
if (contentType == "custom") {
- QByteArray contentType("multipart/custom; boundary=\"" + multiPart->boundary() + "\"");
+ QByteArray contentType("multipart/custom; boundary=\"" + multiPart->boundary() + '"');
request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
}
@@ -2932,7 +2939,7 @@ void tst_QNetworkReply::connectToIPv6Address()
QVERIFY2(waitForFinish(reply) == Success, msgWaitForFinished(reply));
QByteArray content = reply->readAll();
//qDebug() << server.receivedData;
- QByteArray hostinfo = "\r\nHost: " + hostfield + ":" + QByteArray::number(server.serverPort()) + "\r\n";
+ QByteArray hostinfo = "\r\nHost: " + hostfield + ':' + QByteArray::number(server.serverPort()) + "\r\n";
QVERIFY(server.receivedData.contains(hostinfo));
QCOMPARE(content, dataToSend);
QCOMPARE(reply->url(), request.url());
@@ -4816,7 +4823,7 @@ void tst_QNetworkReply::ioPostToHttpsUploadProgress()
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
// create the request
- QUrl url = QUrl(QString("https://127.0.0.1:%1/").arg(server.serverPort()));
+ QUrl url = QUrl(QLatin1String("https://127.0.0.1:") + QString::number(server.serverPort()) + QLatin1Char('/'));
QNetworkRequest request(url);
request.setRawHeader("Content-Type", "application/octet-stream");
@@ -4900,7 +4907,8 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
<< testData.size() << "bytes of data";
const bool fillKernelBuffer = bufferSize > 0;
- FastSender server(httpResponse, https, fillKernelBuffer);
+ notEnoughDataForFastSender = false;
+ FastSender server(httpResponse, https, fillKernelBuffer, this);
QUrl url(QString("%1://127.0.0.1:%2/qtest/rfc3252.txt")
.arg(https?"https":"http")
@@ -4915,7 +4923,13 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
QTime loopTime;
loopTime.start();
- QVERIFY2(waitForFinish(reply) == Success, msgWaitForFinished(reply));
+ const int result = waitForFinish(reply);
+ if (notEnoughDataForFastSender) {
+ server.wait();
+ QSKIP("kernel socket buffers are too big for this test to work");
+ }
+
+ QVERIFY2(result == Success, msgWaitForFinished(reply));
const int elapsedTime = loopTime.elapsed();
server.wait();
@@ -4943,7 +4957,7 @@ void tst_QNetworkReply::ioGetFromBuiltinHttp()
const int allowedDeviation = 16; // TODO find out why the send rate is 13% faster currently
const int minRate = rate * 1024 * (100-allowedDeviation) / 100;
const int maxRate = rate * 1024 * (100+allowedDeviation) / 100;
- qDebug() << minRate << "<="<< server.transferRate << "<=" << maxRate << "?";
+ qDebug() << minRate << "<="<< server.transferRate << "<=" << maxRate << '?';
// The test takes too long to run if sending enough data to overwhelm the
// reciever's kernel buffers.
//QEXPECT_FAIL("http+limited", "Limiting is broken right now, check QTBUG-15065", Continue);
@@ -5032,7 +5046,7 @@ void tst_QNetworkReply::emitAllUploadProgressSignals()
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
connect(&server, SIGNAL(newConnection()), &QTestEventLoop::instance(), SLOT(exitLoop()));
- QUrl url = QUrl(QString("http://127.0.0.1:%1/").arg(server.serverPort()));
+ QUrl url = QUrl(QLatin1String("http://127.0.0.1:") + QString::number(server.serverPort()) + QLatin1Char('/'));
QNetworkRequest normalRequest(url);
normalRequest.setRawHeader("Content-Type", "application/octet-stream");
@@ -5087,7 +5101,7 @@ void tst_QNetworkReply::ioPostToHttpEmptyUploadProgress()
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
// create the request
- QUrl url = QUrl(QString("http://127.0.0.1:%1/").arg(server.serverPort()));
+ QUrl url = QUrl(QLatin1String("http://127.0.0.1:") + QString::number(server.serverPort()) + QLatin1Char('/'));
QNetworkRequest request(url);
request.setRawHeader("Content-Type", "application/octet-stream");
QNetworkReplyPtr reply(manager.post(request, &buffer));
@@ -5519,7 +5533,7 @@ void tst_QNetworkReply::sendCookies_data()
list.clear();
cookie = QNetworkCookie("a", "b");
cookie.setPath("/");
- cookie.setDomain("." + QtNetworkSettings::serverDomainName());
+ cookie.setDomain(QLatin1Char('.') + QtNetworkSettings::serverDomainName());
list << cookie;
QTest::newRow("domain-match") << list << "a=b";
@@ -5588,6 +5602,11 @@ void tst_QNetworkReply::nestedEventLoops_slot()
QTestEventLoop::instance().exitLoop();
}
+void tst_QNetworkReply::notEnoughData()
+{
+ notEnoughDataForFastSender = true;
+}
+
void tst_QNetworkReply::nestedEventLoops()
{
// Slightly fragile test, it may not be testing anything
@@ -5852,7 +5871,7 @@ void tst_QNetworkReply::httpConnectionCount()
QCoreApplication::instance()->processEvents();
for (int i = 0; i < 10; i++) {
- QNetworkRequest request (QUrl("http://127.0.0.1:" + QString::number(server.serverPort()) + "/" + QString::number(i)));
+ QNetworkRequest request (QUrl("http://127.0.0.1:" + QString::number(server.serverPort()) + QLatin1Char('/') + QString::number(i)));
QNetworkReply* reply = manager.get(request);
reply->setParent(&server);
}
@@ -6465,9 +6484,10 @@ public slots:
QByteArray data(amount, '@');
if (chunkedEncoding) {
- client->write(QString(QString("%1").arg(amount,0,16).toUpper() + "\r\n").toLatin1());
+ client->write(QByteArray::number(amount, 16).toUpper());
+ client->write("\r\n");
client->write(data.constData(), amount);
- client->write(QString("\r\n").toLatin1());
+ client->write("\r\n");
} else {
client->write(data.constData(), amount);
}
@@ -7736,6 +7756,7 @@ void tst_QNetworkReply::emitErrorForAllReplies() // QTBUG-36890
#ifdef QT_BUILD_INTERNAL
void tst_QNetworkReply::backgroundRequest_data()
{
+#ifndef QT_NO_BEARERMANAGEMENT
QTest::addColumn<QUrl>("url");
QTest::addColumn<bool>("background");
QTest::addColumn<int>("policy");
@@ -7761,7 +7782,7 @@ void tst_QNetworkReply::backgroundRequest_data()
QTest::newRow("ftp, bg, normal") << ftpurl << true << (int)QNetworkSession::NoPolicy << QNetworkReply::NoError;
QTest::newRow("ftp, fg, nobg") << ftpurl << false << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::NoError;
QTest::newRow("ftp, bg, nobg") << ftpurl << true << (int)QNetworkSession::NoBackgroundTrafficPolicy << QNetworkReply::BackgroundRequestNotAllowedError;
-
+#endif // !QT_NO_BEARERMANAGEMENT
}
#endif
@@ -8298,10 +8319,15 @@ void tst_QNetworkReply::putWithServerClosingConnectionImmediately()
server.m_expectedReplies = numUploads;
server.listen(QHostAddress(QHostAddress::LocalHost), 0);
+ QString urlPrefix = QLatin1String("http");
+ if (withSsl)
+ urlPrefix += QLatin1Char('s');
+ urlPrefix += QLatin1String("://127.0.0.1:");
+ urlPrefix += QString::number(server.serverPort());
+ urlPrefix += QLatin1String("/file=");
for (int i = 0; i < numUploads; i++) {
// create the request
- QUrl url = QUrl(QString("http%1://127.0.0.1:%2/file=%3").arg(withSsl ? "s" : "").arg(server.serverPort()).arg(i));
- QNetworkRequest request(url);
+ QNetworkRequest request(QUrl(urlPrefix + QString::number(i)));
QNetworkReply *reply = manager.put(request, sourceFile);
connect(reply, SIGNAL(sslErrors(QList<QSslError>)), reply, SLOT(ignoreSslErrors()));
connect(reply, SIGNAL(finished()), &server, SLOT(replyFinished()));
diff --git a/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro b/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro
index 0470d96b8c..c00c2c30a2 100644
--- a/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro
+++ b/tests/auto/network/access/qnetworkrequest/qnetworkrequest.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkrequest
SOURCES += tst_qnetworkrequest.cpp
diff --git a/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp b/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
index 7370339b2b..7136a136b0 100644
--- a/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
+++ b/tests/auto/network/access/qnetworkrequest/tst_qnetworkrequest.cpp
@@ -73,16 +73,16 @@ namespace QTest {
template<>
char *toString(const QList<QNetworkCookie> &list)
{
- QString result = "QList(";
+ QByteArray result = "QList(";
bool first = true;
foreach (QNetworkCookie cookie, list) {
if (!first)
result += ", ";
first = false;
- result += QString::fromLatin1("QNetworkCookie(%1)").arg(QLatin1String(cookie.toRawForm()));
+ result += "QNetworkCookie(" + cookie.toRawForm() + ')';
}
-
- return qstrdup(result.append(')').toLocal8Bit());
+ result.append(')');
+ return qstrdup(result.constData());
}
}
diff --git a/tests/auto/network/access/spdy/spdy.pro b/tests/auto/network/access/spdy/spdy.pro
index 23efa85b47..cdbe60a19b 100644
--- a/tests/auto/network/access/spdy/spdy.pro
+++ b/tests/auto/network/access/spdy/spdy.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_spdy
SOURCES += tst_spdy.cpp
QT = core core-private network network-private testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
win32:CONFIG += insignificant_test # QTBUG-47128
diff --git a/tests/auto/network/bearer/qnetworksession/lackey/main.cpp b/tests/auto/network/bearer/qnetworksession/lackey/main.cpp
index 74b26107bc..a7ff336382 100644
--- a/tests/auto/network/bearer/qnetworksession/lackey/main.cpp
+++ b/tests/auto/network/bearer/qnetworksession/lackey/main.cpp
@@ -132,8 +132,9 @@ int main(int argc, char** argv)
return SESSION_OPEN_ERROR;
}
- QString output = QString("Started session for %1\n").arg(session->configuration().identifier());
- oopSocket.write(output.toLatin1());
+ QByteArray output = "Started session for "
+ + session->configuration().identifier().toLatin1() + '\n';
+ oopSocket.write(output);
oopSocket.waitForBytesWritten();
oopSocket.waitForReadyRead();
diff --git a/tests/auto/network/kernel/qdnslookup/qdnslookup.pro b/tests/auto/network/kernel/qdnslookup/qdnslookup.pro
index 3727736fad..f14ffd003e 100644
--- a/tests/auto/network/kernel/qdnslookup/qdnslookup.pro
+++ b/tests/auto/network/kernel/qdnslookup/qdnslookup.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdnslookup
diff --git a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
index 301a915dd6..976b895b53 100644
--- a/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
+++ b/tests/auto/network/kernel/qdnslookup/tst_qdnslookup.cpp
@@ -275,7 +275,7 @@ void tst_QDnsLookup::lookup()
QStringList mailExchanges;
foreach (const QDnsMailExchangeRecord &record, lookup.mailExchangeRecords()) {
QCOMPARE(record.name(), domain);
- mailExchanges << QString("%1 %2").arg(QString::number(record.preference()), record.exchange());
+ mailExchanges << QString::number(record.preference()) + QLatin1Char(' ') + record.exchange();
}
QVERIFY2(mx_alternatives.contains(mailExchanges.join(';')),
qPrintable("Actual: " + mailExchanges.join(';') + "\nExpected one of:\n" + mx_alternatives.join('\n')));
@@ -304,11 +304,9 @@ void tst_QDnsLookup::lookup()
QStringList services;
foreach (const QDnsServiceRecord &record, lookup.serviceRecords()) {
QCOMPARE(record.name(), domain);
- services << QString("%1 %2 %3 %4").arg(
- QString::number(record.priority()),
- QString::number(record.weight()),
- QString::number(record.port()),
- record.target());
+ services << (QString::number(record.priority()) + QLatin1Char(' ')
+ + QString::number(record.weight()) + QLatin1Char(' ')
+ + QString::number(record.port()) + QLatin1Char(' ') + record.target());
}
QVERIFY2(srv_alternatives.contains(services.join(';')),
qPrintable("Actual: " + services.join(';') + "\nExpected one of:\n" + srv_alternatives.join('\n')));
diff --git a/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro b/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro
index 0515bbad3b..25d76b5739 100644
--- a/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro
+++ b/tests/auto/network/kernel/qdnslookup_appless/qdnslookup_appless.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdnslookup_appless
diff --git a/tests/auto/network/kernel/qhostaddress/qhostaddress.pro b/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
index f349cab976..19d74dfd9b 100644
--- a/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
+++ b/tests/auto/network/kernel/qhostaddress/qhostaddress.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qhostaddress
SOURCES += tst_qhostaddress.cpp
diff --git a/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro b/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro
index ae207e9c79..427f2e0f19 100644
--- a/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro
+++ b/tests/auto/network/kernel/qnetworkaddressentry/qnetworkaddressentry.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkaddressentry
SOURCES += tst_qnetworkaddressentry.cpp
diff --git a/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro b/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
index 79279514d1..694dec2ed7 100644
--- a/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
+++ b/tests/auto/network/kernel/qnetworkinterface/qnetworkinterface.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkinterface
SOURCES += tst_qnetworkinterface.cpp
diff --git a/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp b/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
index f7798bbb70..2a0552b770 100644
--- a/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
+++ b/tests/auto/network/kernel/qnetworkinterface/tst_qnetworkinterface.cpp
@@ -141,7 +141,7 @@ void tst_QNetworkInterface::dump()
s.nospace() << ": " << qPrintable(e.ip().toString());
if (!e.netmask().isNull())
s.nospace() << '/' << e.prefixLength()
- << " (" << qPrintable(e.netmask().toString()) << ")";
+ << " (" << qPrintable(e.netmask().toString()) << ')';
if (!e.broadcast().isNull())
s.nospace() << " broadcast " << qPrintable(e.broadcast().toString());
}
@@ -203,6 +203,11 @@ void tst_QNetworkInterface::interfaceFromXXX()
QFETCH(QNetworkInterface, iface);
QVERIFY(QNetworkInterface::interfaceFromName(iface.name()).isValid());
+ if (int idx = iface.index()) {
+ QVERIFY(QNetworkInterface::interfaceFromIndex(idx).isValid());
+ QCOMPARE(QNetworkInterface::interfaceNameFromIndex(idx), iface.name());
+ QCOMPARE(QNetworkInterface::interfaceIndexFromName(iface.name()), idx);
+ }
foreach (QNetworkAddressEntry entry, iface.addressEntries()) {
QVERIFY(!entry.ip().isNull());
diff --git a/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro b/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro
index c63c7742a1..ed73e3e10e 100644
--- a/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro
+++ b/tests/auto/network/kernel/qnetworkproxyfactory/qnetworkproxyfactory.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkproxyfactory
QT = core network testlib
diff --git a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
index 56728432f8..c70fbce46c 100644
--- a/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
+++ b/tests/auto/network/socket/qlocalsocket/tst_qlocalsocket.cpp
@@ -190,7 +190,7 @@ private slots:
}
void slotError(QLocalSocket::LocalSocketError newError)
{
- QVERIFY(errorString() != "Unknown error");
+ QVERIFY(errorString() != QLatin1String("Unknown error"));
QCOMPARE(error(), newError);
}
void slotStateChanged(QLocalSocket::LocalSocketState newState)
@@ -328,8 +328,9 @@ void tst_QLocalSocket::listenAndConnect_data()
int connections = i;
if (i == 2)
connections = 5;
- QTest::newRow(QString("null %1").arg(i).toLatin1()) << QString() << false << connections;
- QTest::newRow(QString("tst_localsocket %1").arg(i).toLatin1()) << "tst_localsocket" << true << connections;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("null " + iB).constData()) << QString() << false << connections;
+ QTest::newRow(("tst_localsocket " + iB).constData()) << "tst_localsocket" << true << connections;
}
}
@@ -535,7 +536,7 @@ void tst_QLocalSocket::sendData()
if (server.hasPendingConnections()) {
QString testLine = "test";
for (int i = 0; i < 50000; ++i)
- testLine += "a";
+ testLine += QLatin1Char('a');
QLocalSocket *serverSocket = server.nextPendingConnection();
QVERIFY(serverSocket);
QCOMPARE(serverSocket->state(), QLocalSocket::ConnectedState);
@@ -1234,7 +1235,7 @@ void tst_QLocalSocket::verifyListenWithDescriptor()
QVERIFY2(server.fullServerName().at(0) == at, "abstract sockets should start with a '@'");
} else {
QCOMPARE(server.fullServerName(), path);
- if (path.contains(QLatin1String("/"))) {
+ if (path.contains(QLatin1Char('/'))) {
QVERIFY2(server.serverName() == path.mid(path.lastIndexOf(QLatin1Char('/'))+1), "server name invalid short name");
} else {
QVERIFY2(server.serverName() == path, "servier name doesn't match the path provided");
diff --git a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
index 8da656aab7..bd43961ea2 100644
--- a/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
+++ b/tests/auto/network/socket/qsocks5socketengine/tst_qsocks5socketengine.cpp
@@ -613,8 +613,8 @@ void tst_QSocks5SocketEngine::tcpSocketBlockingTest()
// Read greeting
QVERIFY(socket.waitForReadyRead(5000));
- QString s = socket.readLine();
- QVERIFY2(QtNetworkSettings::compareReplyIMAP(s.toLatin1()), s.toLatin1().constData());
+ QByteArray s = socket.readLine();
+ QVERIFY2(QtNetworkSettings::compareReplyIMAP(s), s.constData());
// Write NOOP
QCOMPARE((int) socket.write("1 NOOP\r\n", 8), 8);
@@ -624,7 +624,7 @@ void tst_QSocks5SocketEngine::tcpSocketBlockingTest()
// Read response
s = socket.readLine();
- QCOMPARE(s.toLatin1().constData(), "1 OK Completed\r\n");
+ QCOMPARE(s, QByteArrayLiteral("1 OK Completed\r\n"));
// Write LOGOUT
QCOMPARE((int) socket.write("2 LOGOUT\r\n", 10), 10);
@@ -634,13 +634,13 @@ void tst_QSocks5SocketEngine::tcpSocketBlockingTest()
// Read two lines of respose
s = socket.readLine();
- QCOMPARE(s.toLatin1().constData(), "* BYE LOGOUT received\r\n");
+ QCOMPARE(s, QByteArrayLiteral("* BYE LOGOUT received\r\n"));
if (!socket.canReadLine())
QVERIFY(socket.waitForReadyRead(5000));
s = socket.readLine();
- QCOMPARE(s.toLatin1().constData(), "2 OK Completed\r\n");
+ QCOMPARE(s, QByteArrayLiteral("2 OK Completed\r\n"));
// Close the socket
socket.close();
@@ -715,7 +715,7 @@ void tst_QSocks5SocketEngine::tcpSocketNonBlockingTest()
// Read response
QVERIFY(!tcpSocketNonBlocking_data.isEmpty());
- QCOMPARE(tcpSocketNonBlocking_data.at(0).toLatin1().constData(), "1 OK Completed\r\n");
+ QCOMPARE(tcpSocketNonBlocking_data.at(0), QLatin1String("1 OK Completed\r\n"));
tcpSocketNonBlocking_data.clear();
diff --git a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
index abbc560414..a5ba405dd4 100644
--- a/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
+++ b/tests/auto/network/socket/qtcpsocket/tst_qtcpsocket.cpp
@@ -201,6 +201,7 @@ private slots:
void setSocketOption();
void clientSendDataOnDelayedDisconnect();
void serverDisconnectWithBuffered();
+ void socketDiscardDataInWriteMode();
protected slots:
void nonBlockingIMAP_hostFound();
@@ -1775,7 +1776,7 @@ void tst_QTcpSocket::atEnd()
// Test server must use some vsFTPd 2.x.x version
QVERIFY2(greeting.length() == sizeof("220 (vsFTPd 2.x.x)")-1, qPrintable(greeting));
QVERIFY2(greeting.startsWith("220 (vsFTPd 2."), qPrintable(greeting));
- QVERIFY2(greeting.endsWith(")"), qPrintable(greeting));
+ QVERIFY2(greeting.endsWith(QLatin1Char(')')), qPrintable(greeting));
delete socket;
}
@@ -3028,5 +3029,36 @@ void tst_QTcpSocket::serverDisconnectWithBuffered()
delete socket;
}
+// Test buffered sockets discard input when opened in WriteOnly mode
+void tst_QTcpSocket::socketDiscardDataInWriteMode()
+{
+ QFETCH_GLOBAL(bool, setProxy);
+ if (setProxy)
+ return;
+
+ QTcpServer tcpServer;
+ QTcpSocket *socket = newSocket();
+
+ QVERIFY(tcpServer.listen(QHostAddress::LocalHost));
+ socket->connectToHost(tcpServer.serverAddress(), tcpServer.serverPort(),
+ QIODevice::WriteOnly);
+ QVERIFY(socket->waitForConnected(5000)); // ready for write
+ QCOMPARE(socket->state(), QAbstractSocket::ConnectedState);
+
+ // Accept connection on server side
+ QVERIFY2(tcpServer.waitForNewConnection(5000), "Network timeout");
+ QTcpSocket *newConnection = tcpServer.nextPendingConnection();
+ // Send one char and drop link
+ QVERIFY(newConnection != NULL);
+ QVERIFY(newConnection->putChar(0));
+ QVERIFY(newConnection->flush());
+ delete newConnection;
+
+ QVERIFY(socket->waitForReadyRead(5000)); // discard input
+ QVERIFY(socket->atEnd());
+
+ delete socket;
+}
+
QTEST_MAIN(tst_QTcpSocket)
#include "tst_qtcpsocket.moc"
diff --git a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
index 0ee3255502..cad81d870c 100644
--- a/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
+++ b/tests/auto/network/socket/qudpsocket/tst_qudpsocket.cpp
@@ -1119,12 +1119,13 @@ void tst_QUdpSocket::multicastTtlOption_data()
addresses += QHostAddress(QHostAddress::AnyIPv6);
foreach (const QHostAddress &address, addresses) {
- QTest::newRow(QString("%1 0").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 1").arg(address.toString()).toLatin1()) << address << 1 << 1;
- QTest::newRow(QString("%1 2").arg(address.toString()).toLatin1()) << address << 2 << 2;
- QTest::newRow(QString("%1 128").arg(address.toString()).toLatin1()) << address << 128 << 128;
- QTest::newRow(QString("%1 255").arg(address.toString()).toLatin1()) << address << 255 << 255;
- QTest::newRow(QString("%1 1024").arg(address.toString()).toLatin1()) << address << 1024 << 1;
+ const QByteArray addressB = address.toString().toLatin1();
+ QTest::newRow((addressB + " 0").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 1").constData()) << address << 1 << 1;
+ QTest::newRow((addressB + " 2").constData()) << address << 2 << 2;
+ QTest::newRow((addressB + " 128").constData()) << address << 128 << 128;
+ QTest::newRow((addressB + " 255").constData()) << address << 255 << 255;
+ QTest::newRow((addressB + " 1024").constData()) << address << 1024 << 1;
}
}
@@ -1163,13 +1164,14 @@ void tst_QUdpSocket::multicastLoopbackOption_data()
addresses += QHostAddress(QHostAddress::AnyIPv6);
foreach (const QHostAddress &address, addresses) {
- QTest::newRow(QString("%1 0").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 1").arg(address.toString()).toLatin1()) << address << 1 << 1;
- QTest::newRow(QString("%1 2").arg(address.toString()).toLatin1()) << address << 2 << 1;
- QTest::newRow(QString("%1 0 again").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 2 again").arg(address.toString()).toLatin1()) << address << 2 << 1;
- QTest::newRow(QString("%1 0 last time").arg(address.toString()).toLatin1()) << address << 0 << 0;
- QTest::newRow(QString("%1 1 again").arg(address.toString()).toLatin1()) << address << 1 << 1;
+ const QByteArray addressB = address.toString().toLatin1();
+ QTest::newRow((addressB + " 0").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 1").constData()) << address << 1 << 1;
+ QTest::newRow((addressB + " 2").constData()) << address << 2 << 1;
+ QTest::newRow((addressB + " 0 again").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 2 again").constData()) << address << 2 << 1;
+ QTest::newRow((addressB + " 0 last time").constData()) << address << 0 << 0;
+ QTest::newRow((addressB + " 1 again").constData()) << address << 1 << 1;
}
}
@@ -1266,9 +1268,8 @@ void tst_QUdpSocket::setMulticastInterface_data()
if ((iface.flags() & QNetworkInterface::IsUp) == 0)
continue;
foreach (const QNetworkAddressEntry &entry, iface.addressEntries()) {
- QTest::newRow(QString("%1:%2").arg(iface.name()).arg(entry.ip().toString()).toLatin1())
- << iface
- << entry.ip();
+ const QByteArray testName = iface.name().toLatin1() + ':' + entry.ip().toString().toLatin1();
+ QTest::newRow(testName.constData()) << iface << entry.ip();
}
}
}
diff --git a/tests/auto/network/ssl/qasn1element/qasn1element.pro b/tests/auto/network/ssl/qasn1element/qasn1element.pro
index 524c772443..006ac3428c 100644
--- a/tests/auto/network/ssl/qasn1element/qasn1element.pro
+++ b/tests/auto/network/ssl/qasn1element/qasn1element.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qasn1element.cpp
QT = core network network-private testlib
diff --git a/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro b/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
index 26d6424a97..87a210c051 100644
--- a/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
+++ b/tests/auto/network/ssl/qsslcertificate/qsslcertificate.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslcertificate.cpp
!wince:win32:LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
index 4c288fffaf..4ebaedd8de 100644
--- a/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
+++ b/tests/auto/network/ssl/qsslcertificate/tst_qsslcertificate.cpp
@@ -423,15 +423,15 @@ void tst_QSslCertificate::subjectAlternativeNames()
QMapIterator<QSsl::AlternativeNameEntryType, QString> it(altSubjectNames);
while (it.hasNext()) {
it.next();
- QString type;
+ QByteArray type;
if (it.key() == QSsl::EmailEntry)
- type = QLatin1String("email");
+ type = "email";
else if (it.key() == QSsl::DnsEntry)
- type = QLatin1String("DNS");
+ type = "DNS";
else
QFAIL("unsupported alternative name type");
- QString entry = QString("%1:%2").arg(type).arg(it.value());
- QVERIFY(fileContents.contains(entry.toLatin1()));
+ const QByteArray entry = type + ':' + it.value().toLatin1();
+ QVERIFY(fileContents.contains(entry));
}
// verify that each entry in fileContents is present in subjAltNames
@@ -844,7 +844,7 @@ void tst_QSslCertificate::nulInCN()
QVERIFY(!cert.isNull());
QString cn = cert.subjectInfo(QSslCertificate::CommonName)[0];
- QVERIFY(cn != "www.bank.com");
+ QVERIFY(cn != QLatin1String("www.bank.com"));
static const char realCN[] = "www.bank.com\0.badguy.com";
QCOMPARE(cn, QString::fromLatin1(realCN, sizeof realCN - 1));
@@ -1064,7 +1064,7 @@ QString tst_QSslCertificate::toString(const QList<QSslError>& errors)
QStringList errorStrings;
foreach (const QSslError& error, errors) {
- errorStrings.append(QLatin1String("\"") + error.errorString() + QLatin1String("\""));
+ errorStrings.append(QLatin1Char('"') + error.errorString() + QLatin1Char('"'));
}
return QLatin1String("[ ") + errorStrings.join(QLatin1String(", ")) + QLatin1String(" ]");
diff --git a/tests/auto/network/ssl/qsslcipher/qsslcipher.pro b/tests/auto/network/ssl/qsslcipher/qsslcipher.pro
index 36e3c29b31..4cb2dfebab 100644
--- a/tests/auto/network/ssl/qsslcipher/qsslcipher.pro
+++ b/tests/auto/network/ssl/qsslcipher/qsslcipher.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslcipher.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro b/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro
index 747bb55ade..e67b64b2b7 100644
--- a/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro
+++ b/tests/auto/network/ssl/qsslellipticcurve/qsslellipticcurve.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslellipticcurve.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslerror/qsslerror.pro b/tests/auto/network/ssl/qsslerror/qsslerror.pro
index 6b7090db99..7737aae3f1 100644
--- a/tests/auto/network/ssl/qsslerror/qsslerror.pro
+++ b/tests/auto/network/ssl/qsslerror/qsslerror.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslerror.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslkey/qsslkey.pro b/tests/auto/network/ssl/qsslkey/qsslkey.pro
index a74f432890..7eb04793f3 100644
--- a/tests/auto/network/ssl/qsslkey/qsslkey.pro
+++ b/tests/auto/network/ssl/qsslkey/qsslkey.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslkey.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
index a7957d3288..81257a460f 100644
--- a/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
+++ b/tests/auto/network/ssl/qsslkey/tst_qsslkey.cpp
@@ -279,13 +279,13 @@ void tst_QSslKey::toEncryptedPemOrDer_data()
<< "aAzZ`1234567890-=~!@#$%^&*()_+[]{}\\|;:'\",.<>/?"; // ### add more (?)
foreach (KeyInfo keyInfo, keyInfoList) {
foreach (QString password, passwords) {
- QString testName = QString("%1-%2-%3-%4-%5").arg(keyInfo.fileInfo.fileName())
- .arg(keyInfo.algorithm == QSsl::Rsa ? "RSA" :
- (keyInfo.algorithm == QSsl::Dsa ? "DSA" : "EC"))
- .arg(keyInfo.type == QSsl::PrivateKey ? "PrivateKey" : "PublicKey")
- .arg(keyInfo.format == QSsl::Pem ? "PEM" : "DER")
- .arg(password);
- QTest::newRow(testName.toLatin1())
+ const QByteArray testName = keyInfo.fileInfo.fileName().toLatin1()
+ + '-' + (keyInfo.algorithm == QSsl::Rsa ? "RSA" :
+ (keyInfo.algorithm == QSsl::Dsa ? "DSA" : "EC"))
+ + '-' + (keyInfo.type == QSsl::PrivateKey ? "PrivateKey" : "PublicKey")
+ + '-' + (keyInfo.format == QSsl::Pem ? "PEM" : "DER")
+ + password.toLatin1();
+ QTest::newRow(testName.constData())
<< keyInfo.fileInfo.absoluteFilePath() << keyInfo.algorithm << keyInfo.type
<< keyInfo.format << password;
}
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
index 4f216ebb37..ae911e43ed 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_member/qsslsocket_onDemandCertificates_member.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
testcase.timeout = 300 # this test is slow
SOURCES += tst_qsslsocket_onDemandCertificates_member.cpp
diff --git a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
index 96a6162ce6..25e5a5d5c7 100644
--- a/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
+++ b/tests/auto/network/ssl/qsslsocket_onDemandCertificates_static/qsslsocket_onDemandCertificates_static.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qsslsocket_onDemandCertificates_static.cpp
win32:!wince: LIBS += -lws2_32
diff --git a/tests/auto/opengl/qgl/qgl.pro b/tests/auto/opengl/qgl/qgl.pro
index 35b5c6888b..14c34c9ef0 100644
--- a/tests/auto/opengl/qgl/qgl.pro
+++ b/tests/auto/opengl/qgl/qgl.pro
@@ -11,5 +11,4 @@ SOURCES += tst_qgl.cpp
RESOURCES = qgl.qrc
linux-*:system(". /etc/lsb-release && [ $DISTRIB_CODENAME = lucid ]"): CONFIG+=insignificant_test # QTBUG-25293
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
win32-msvc2010:contains(QT_CONFIG, angle):CONFIG += insignificant_test # QTQAINFRA-711
diff --git a/tests/auto/opengl/qglbuffer/qglbuffer.pro b/tests/auto/opengl/qglbuffer/qglbuffer.pro
index 72117322da..f12a191f79 100644
--- a/tests/auto/opengl/qglbuffer/qglbuffer.pro
+++ b/tests/auto/opengl/qglbuffer/qglbuffer.pro
@@ -3,10 +3,8 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qglbuffer
requires(qtHaveModule(opengl))
QT += opengl widgets testlib
SOURCES += tst_qglbuffer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/opengl/qglfunctions/qglfunctions.pro b/tests/auto/opengl/qglfunctions/qglfunctions.pro
index a512ea0dd9..3873efbbc5 100644
--- a/tests/auto/opengl/qglfunctions/qglfunctions.pro
+++ b/tests/auto/opengl/qglfunctions/qglfunctions.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qglfunctions
requires(qtHaveModule(opengl))
QT += opengl widgets testlib
@@ -7,4 +6,3 @@ QT += opengl widgets testlib
SOURCES += tst_qglfunctions.cpp
win32:CONFIG+=insignificant_test # QTBUG-26390
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/opengl/qglthreads/qglthreads.pro b/tests/auto/opengl/qglthreads/qglthreads.pro
index 3502c41c87..ab8bda741e 100644
--- a/tests/auto/opengl/qglthreads/qglthreads.pro
+++ b/tests/auto/opengl/qglthreads/qglthreads.pro
@@ -10,6 +10,5 @@ x11 {
LIBS += $$QMAKE_LIBS_X11
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
-win32:CONFIG+=insignificant_test # QTBUG-28264
+
diff --git a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp b/tests/auto/opengl/qglthreads/tst_qglthreads.cpp
index ff5a18dedb..7b7064529f 100644
--- a/tests/auto/opengl/qglthreads/tst_qglthreads.cpp
+++ b/tests/auto/opengl/qglthreads/tst_qglthreads.cpp
@@ -702,6 +702,9 @@ private:
*/
void tst_QGLThreads::painterOnGLWidgetInThread()
{
+ //QTBUG-46446 tst_qglthreads is unstable on windows 7
+ if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive))
+ QSKIP("Doesn't work on this platform. QTBUG-46446");
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))
QSKIP("No platformsupport for ThreadedOpenGL");
if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) ||
@@ -746,6 +749,9 @@ void tst_QGLThreads::painterOnPixmapInThread()
*/
void tst_QGLThreads::painterOnPboInThread()
{
+ //QTBUG-46446 tst_qglthreads is unstable on windows 7
+ if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive))
+ QSKIP("Doesn't work on this platform. QTBUG-46446");
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))
QSKIP("No platformsupport for ThreadedOpenGL");
if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) ||
@@ -773,6 +779,9 @@ void tst_QGLThreads::painterOnPboInThread()
*/
void tst_QGLThreads::painterOnFboInThread()
{
+ //QTBUG-46446 tst_qglthreads is unstable on windows 7
+ if (QGuiApplication::platformName().compare("windows 7", Qt::CaseInsensitive))
+ QSKIP("Doesn't work on this platform. QTBUG-46446");
if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::ThreadedOpenGL))
QSKIP("No platformsupport for ThreadedOpenGL");
if (!((QGLFormat::openGLVersionFlags() & QGLFormat::OpenGL_Version_2_0) ||
diff --git a/tests/auto/other/atwrapper/atWrapper.cpp b/tests/auto/other/atwrapper/atWrapper.cpp
index 4260ca18b8..a75a7b91bf 100644
--- a/tests/auto/other/atwrapper/atWrapper.cpp
+++ b/tests/auto/other/atwrapper/atWrapper.cpp
@@ -149,9 +149,10 @@ void atWrapper::ftpMgetDone( bool error)
if ( mgetDirList.size() > 1 )
for ( int i = 1; i < mgetDirList.size(); ++i )
{
- file = new QFile( QString( output ) + "/" + mgetDirList.at( 0 ) + "/" + mgetDirList.at( i ) );
+ file = new QFile( QString( output ) + QLatin1Char('/') + mgetDirList.at( 0 )
+ + QLatin1Char('/') + mgetDirList.at( i ) );
if (file->open(QIODevice::WriteOnly)) {
- ftp.get( ftpBaseDir + "/" + mgetDirList.at( 0 ) + "/" + mgetDirList.at( i ), file );
+ ftp.get( ftpBaseDir + QLatin1Char('/') + mgetDirList.at( 0 ) + QLatin1Char('/') + mgetDirList.at( i ), file );
ftp.list(); //Only there to fill up a slot in the pendingCommands queue.
while ( ftp.hasPendingCommands() )
QCoreApplication::instance()->processEvents();
@@ -192,11 +193,11 @@ bool atWrapper::setupFTP()
QString dir = "";
ftpMkDir( ftpBaseDir );
- ftpBaseDir += "/" + QLibraryInfo::buildKey();
+ ftpBaseDir += QLatin1Char('/') + QLibraryInfo::buildKey();
ftpMkDir( ftpBaseDir );
- ftpBaseDir += "/" + QString( qVersion() );
+ ftpBaseDir += QLatin1Char('/') + QString( qVersion() );
ftpMkDir( ftpBaseDir );
@@ -209,9 +210,9 @@ bool atWrapper::setupFTP()
{
i.next();
//qDebug() << "Creating dir with key:" << i.key();
- ftpMkDir( ftpBaseDir + "/" + QString( i.key() ) + ".failed" );
- ftpMkDir( ftpBaseDir + "/" + QString( i.key() ) + ".diff" );
- if (!ftpMkDir( ftpBaseDir + "/" + QString( i.key() ) + ".baseline" ))
+ ftpMkDir( ftpBaseDir + QLatin1Char('/') + QString( i.key() ) + ".failed" );
+ ftpMkDir( ftpBaseDir + QLatin1Char('/') + QString( i.key() ) + ".diff" );
+ if (!ftpMkDir( ftpBaseDir + QLatin1Char('/') + QString( i.key() ) + ".baseline" ))
haveBaseline = false;
}
@@ -226,7 +227,7 @@ bool atWrapper::setupFTP()
{
j.next();
rmDirList.clear();
- rmDirList << ftpBaseDir + "/" + j.key() + ".failed" + "/";
+ rmDirList << ftpBaseDir + QLatin1Char('/') + j.key() + ".failed/";
ftpRmDir( j.key() + ".failed" );
ftp.rmdir( j.key() + ".failed" );
ftp.mkdir( j.key() + ".failed" );
@@ -236,7 +237,7 @@ bool atWrapper::setupFTP()
QCoreApplication::instance()->processEvents();
rmDirList.clear();
- rmDirList << ftpBaseDir + "/" + j.key() + ".diff" + "/";
+ rmDirList << ftpBaseDir + QLatin1Char('/') + j.key() + ".diff/";
ftpRmDir( j.key() + ".diff" );
ftp.rmdir( j.key() + ".diff" );
ftp.mkdir( j.key() + ".diff" );
@@ -396,7 +397,7 @@ void atWrapper::createBaseline()
for (int n = 0; n < list.size(); n++)
{
QFileInfo fileInfo = list.at( n );
- QFile file( QString( output ) + "/" + i.key() + "/" + fileInfo.fileName() );
+ QFile file( QString( output ) + QLatin1Char('/') + i.key() + QLatin1Char('/') + fileInfo.fileName() );
file.open( QIODevice::ReadOnly );
QByteArray fileData = file.readAll();
//qDebug() << "Sending up:" << fileInfo.fileName() << "with file size" << fileData.size();
@@ -470,9 +471,9 @@ bool atWrapper::diff( QString basedir, QString dir, QString target )
//Comparing the two specified files, and then uploading them to
//the ftp server if they differ
- basedir += "/" + dir;
+ basedir += QLatin1Char('/') + dir;
QString one = basedir + ".baseline/" + target;
- QString two = basedir + "/" + target;
+ QString two = basedir + QLatin1Char('/') + target;
QFile file( one );
@@ -517,7 +518,7 @@ void atWrapper::uploadDiff( QString basedir, QString dir, QString filename )
qDebug() << basedir;
QImage im1( basedir + ".baseline/" + filename );
- QImage im2( basedir + "/" + filename );
+ QImage im2( basedir + QLatin1Char('/') + filename );
QImage im3(im1.size(), QImage::Format_ARGB32);
@@ -591,16 +592,16 @@ bool atWrapper::loadConfig( QString path )
QDir::current().mkdir( output );
- output += "/" + QLibraryInfo::buildKey();
+ output += QLatin1Char('/') + QLibraryInfo::buildKey();
QDir::current().mkdir( output );
- output += "/" + QString( qVersion() );
+ output += QLatin1Char('/') + QString( qVersion() );
QDir::current().mkdir( output );
- ftpBaseDir += "/" + QHostInfo::localHostName().split( "." ).first();
+ ftpBaseDir += QLatin1Char('/') + QHostInfo::localHostName().split( QLatin1Char('.') ).first();
/*
diff --git a/tests/auto/other/compiler/compiler.pro b/tests/auto/other/compiler/compiler.pro
index 213429050f..57871429d2 100644
--- a/tests/auto/other/compiler/compiler.pro
+++ b/tests/auto/other/compiler/compiler.pro
@@ -6,4 +6,3 @@ QT = core testlib
contains(QT_CONFIG, c++11): CONFIG += c++14 c++11
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/gestures/gestures.pro b/tests/auto/other/gestures/gestures.pro
index fa87dbddfb..3d0ef7c745 100644
--- a/tests/auto/other/gestures/gestures.pro
+++ b/tests/auto/other/gestures/gestures.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_gestures
QT += widgets testlib gui-private
SOURCES += tst_gestures.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/gestures/tst_gestures.cpp b/tests/auto/other/gestures/tst_gestures.cpp
index 2a4f88c627..851edaeb19 100644
--- a/tests/auto/other/gestures/tst_gestures.cpp
+++ b/tests/auto/other/gestures/tst_gestures.cpp
@@ -36,6 +36,7 @@
#include <QtTest/qtesttouch.h>
#include <qevent.h>
+#include <qtouchdevice.h>
#include <qwidget.h>
#include <qlayout.h>
#include <qgesture.h>
diff --git a/tests/auto/other/lancelot/lancelot.pro b/tests/auto/other/lancelot/lancelot.pro
index ef557691e3..6e79566649 100644
--- a/tests/auto/other/lancelot/lancelot.pro
+++ b/tests/auto/other/lancelot/lancelot.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
CONFIG -= app_bundle
TARGET = tst_lancelot
QT += xml widgets testlib
@@ -12,4 +11,3 @@ RESOURCES += images.qrc
include($$PWD/../../../baselineserver/shared/qbaselinetest.pri)
TESTDATA += scripts/*
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/lancelot/paintcommands.cpp b/tests/auto/other/lancelot/paintcommands.cpp
index 4fc41fd649..15454b59d2 100644
--- a/tests/auto/other/lancelot/paintcommands.cpp
+++ b/tests/auto/other/lancelot/paintcommands.cpp
@@ -650,7 +650,7 @@ template <typename T> T PaintCommands::image_load(const QString &filepath)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(fi.fileName());
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + fi.fileName();
t = T(fileName);
if (t.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
@@ -841,10 +841,11 @@ void PaintCommands::command_import(QRegExp re)
qPrintable(fi.fileName()));
QFileInfo fileinfo(*file);
- m_commands[m_currentCommandIndex] = QString("# import file (%1) start").arg(fileinfo.fileName());
+ m_commands[m_currentCommandIndex] = QLatin1String("# import file (") + fileinfo.fileName()
+ + QLatin1String(") start");
QString rawContent = QString::fromUtf8(file->readAll());
QStringList importedData = rawContent.split('\n', QString::SkipEmptyParts);
- importedData.append(QString("# import file (%1) end ---").arg(fileinfo.fileName()));
+ importedData.append(QLatin1String("# import file (") + fileinfo.fileName() + QLatin1String(") end ---"));
insertAt(m_currentCommandIndex, importedData);
if (m_verboseMode) {
@@ -862,13 +863,13 @@ void PaintCommands::command_begin_block(QRegExp re)
if (m_verboseMode)
printf(" -(lance) begin_block (%s)\n", qPrintable(blockName));
- m_commands[m_currentCommandIndex] = QString("# begin block (%1)").arg(blockName);
+ m_commands[m_currentCommandIndex] = QLatin1String("# begin block (") + blockName + QLatin1Char(')');
QStringList newBlock;
int i = m_currentCommandIndex + 1;
for (; i < m_commands.count(); ++i) {
const QString &nextCmd = m_commands.at(i);
if (nextCmd.startsWith("end_block")) {
- m_commands[i] = QString("# end block (%1)").arg(blockName);
+ m_commands[i] = QLatin1String("# end block (") + blockName + QLatin1Char(')');
break;
}
newBlock += nextCmd;
@@ -905,7 +906,7 @@ void PaintCommands::command_repeat_block(QRegExp re)
return;
}
- m_commands[m_currentCommandIndex] = QString("# repeated block (%1)").arg(blockName);
+ m_commands[m_currentCommandIndex] = QLatin1String("# repeated block (") + blockName + QLatin1Char(')');
insertAt(m_currentCommandIndex, block);
}
@@ -946,7 +947,7 @@ void PaintCommands::command_drawPixmap(QRegExp re)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(re.cap(1));
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + re.cap(1);
pm = QPixmap(fileName);
if (pm.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
@@ -995,7 +996,7 @@ void PaintCommands::command_drawImage(QRegExp re)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(re.cap(1));
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + re.cap(1);
im = QImage(fileName);
if (im.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
@@ -1041,7 +1042,7 @@ void PaintCommands::command_drawTiledPixmap(QRegExp re)
QDir dir = fi.absoluteDir();
dir.cdUp();
dir.cd("images");
- QString fileName = QString("%1/%2").arg(dir.absolutePath()).arg(re.cap(1));
+ QString fileName = dir.absolutePath() + QLatin1Char('/') + re.cap(1);
pm = QPixmap(fileName);
if (pm.isNull() && !fileName.endsWith(".png")) {
fileName.append(".png");
diff --git a/tests/auto/other/languagechange/languagechange.pro b/tests/auto/other/languagechange/languagechange.pro
index 0b9c04d2ed..7dbd47f63d 100644
--- a/tests/auto/other/languagechange/languagechange.pro
+++ b/tests/auto/other/languagechange/languagechange.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
win32:testcase.timeout = 1800 # test runtime varies greatly on Windows, QTBUG-26006
TARGET = tst_languagechange
QT += widgets core-private gui-private testlib
SOURCES += tst_languagechange.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/languagechange/tst_languagechange.cpp b/tests/auto/other/languagechange/tst_languagechange.cpp
index 68d604547d..493e279e18 100644
--- a/tests/auto/other/languagechange/tst_languagechange.cpp
+++ b/tests/auto/other/languagechange/tst_languagechange.cpp
@@ -253,7 +253,7 @@ void tst_languageChange::retranslatability()
switch (dialogType) {
case InputDialog:
stateMachine.start();
- QInputDialog::getInteger(0, QLatin1String("title"), QLatin1String("label"));
+ QInputDialog::getInt(0, QLatin1String("title"), QLatin1String("label"));
break;
case ColorDialog:
diff --git a/tests/auto/other/macgui/macgui.pro b/tests/auto/other/macgui/macgui.pro
index bf805ccd75..b557806555 100644
--- a/tests/auto/other/macgui/macgui.pro
+++ b/tests/auto/other/macgui/macgui.pro
@@ -7,4 +7,3 @@ HEADERS += guitest.h
QT = core-private widgets-private testlib
requires(mac)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/macnativeevents/qnativeevents.cpp b/tests/auto/other/macnativeevents/qnativeevents.cpp
index 1402182042..db8f2bd193 100644
--- a/tests/auto/other/macnativeevents/qnativeevents.cpp
+++ b/tests/auto/other/macnativeevents/qnativeevents.cpp
@@ -222,46 +222,46 @@ QDebug operator<<(QDebug d, const QNativeEvent &e)
QTextStream &operator<<(QTextStream &s, QNativeEvent *e)
{
- return s << e->eventId << " " << e->modifiers << " QNativeEvent";
+ return s << e->eventId << ' ' << e->modifiers << " QNativeEvent";
}
QTextStream &operator<<(QTextStream &s, QNativeMouseEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseMoveEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseButtonEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->button
- << " " << e->clickCount << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->button
+ << ' ' << e->clickCount << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseDragEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->button << " " << e->clickCount
- << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->button << ' ' << e->clickCount
+ << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeMouseWheelEvent *e)
{
- return s << e->eventId << " " << e->globalPos.x() << " " << e->globalPos.y() << " " << e->delta
- << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->globalPos.x() << ' ' << e->globalPos.y() << ' ' << e->delta
+ << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeKeyEvent *e)
{
- return s << e->eventId << " " << e->press << " " << e->nativeKeyCode << " " << e->character
- << " " << e->modifiers << " " << e->toString();
+ return s << e->eventId << ' ' << e->press << ' ' << e->nativeKeyCode << ' ' << e->character
+ << ' ' << e->modifiers << ' ' << e->toString();
}
QTextStream &operator<<(QTextStream &s, QNativeModifierEvent *e)
{
- return s << e->eventId << " " << e->modifiers << " " << e->nativeKeyCode << " " << e->toString();
+ return s << e->eventId << ' ' << e->modifiers << ' ' << e->nativeKeyCode << ' ' << e->toString();
}
diff --git a/tests/auto/other/macplist/app/app.pro b/tests/auto/other/macplist/app/app.pro
index c4dfedb104..9ccac831d0 100644
--- a/tests/auto/other/macplist/app/app.pro
+++ b/tests/auto/other/macplist/app/app.pro
@@ -1,4 +1,3 @@
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/macplist/test/test.pro b/tests/auto/other/macplist/test/test.pro
index 6dad17ab67..5018abeca9 100644
--- a/tests/auto/other/macplist/test/test.pro
+++ b/tests/auto/other/macplist/test/test.pro
@@ -10,4 +10,3 @@ win32 {
TARGET = ../../release/tst_macplist
}
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/modeltest/dynamictreemodel.cpp b/tests/auto/other/modeltest/dynamictreemodel.cpp
index c7cf04231f..bdf2b604fd 100644
--- a/tests/auto/other/modeltest/dynamictreemodel.cpp
+++ b/tests/auto/other/modeltest/dynamictreemodel.cpp
@@ -299,7 +299,8 @@ bool ModelResetCommand::emitPreSignal(const QModelIndex &srcParent, int srcStart
void ModelResetCommand::emitPostSignal()
{
- m_model->reset();
+ m_model->beginResetModel();
+ m_model->endResetModel();
}
ModelResetCommandFixed::ModelResetCommandFixed(DynamicTreeModel* model, QObject* parent)
diff --git a/tests/auto/other/modeltest/modeltest.pro b/tests/auto/other/modeltest/modeltest.pro
index 045299e095..8e96058449 100644
--- a/tests/auto/other/modeltest/modeltest.pro
+++ b/tests/auto/other/modeltest/modeltest.pro
@@ -3,7 +3,3 @@ TARGET = tst_modeltest
QT += widgets testlib
SOURCES += tst_modeltest.cpp modeltest.cpp dynamictreemodel.cpp
HEADERS += modeltest.h dynamictreemodel.h
-
-
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/networkselftest/networkselftest.pro b/tests/auto/other/networkselftest/networkselftest.pro
index 60b45e6b5e..7c307a097b 100644
--- a/tests/auto/other/networkselftest/networkselftest.pro
+++ b/tests/auto/other/networkselftest/networkselftest.pro
@@ -3,5 +3,3 @@ TARGET = tst_networkselftest
SOURCES += tst_networkselftest.cpp
QT = core core-private network testlib
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/networkselftest/tst_networkselftest.cpp b/tests/auto/other/networkselftest/tst_networkselftest.cpp
index 7ce385121c..257a7fc03d 100644
--- a/tests/auto/other/networkselftest/tst_networkselftest.cpp
+++ b/tests/auto/other/networkselftest/tst_networkselftest.cpp
@@ -986,8 +986,8 @@ void tst_NetworkSelfTest::smbServer()
static const char contents[] = "This is 34 bytes. Do not change...";
#ifdef Q_OS_WIN
// use Windows's native UNC support to try and open a file on the server
- QString filepath = QString("\\\\%1\\testshare\\test.pri").arg(QtNetworkSettings::winServerName());
- FILE *f = fopen(filepath.toLatin1(), "rb");
+ QByteArray filepath = "\\\\" + QtNetworkSettings::winServerName().toLatin1() + "\\testshare\\test.pri";
+ FILE *f = fopen(filepath.constData(), "rb");
QVERIFY2(f, qt_error_string().toLocal8Bit());
char buf[128];
diff --git a/tests/auto/other/qaccessibility/qaccessibility.pro b/tests/auto/other/qaccessibility/qaccessibility.pro
index 1d6fc6bcd1..ef3b469ba1 100644
--- a/tests/auto/other/qaccessibility/qaccessibility.pro
+++ b/tests/auto/other/qaccessibility/qaccessibility.pro
@@ -21,4 +21,3 @@ win32 {
LIBS += -luuid
!winphone: LIBS += -loleacc -loleaut32 -lole32
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
index 62c2c0a916..8fe4d976b3 100644
--- a/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
+++ b/tests/auto/other/qaccessibility/tst_qaccessibility.cpp
@@ -573,7 +573,7 @@ static QWidget *createWidgets()
int i = 0;
box->addWidget(new QComboBox(w));
- box->addWidget(new QPushButton(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QPushButton(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QHeaderView(Qt::Vertical, w));
box->addWidget(new QTreeView(w));
box->addWidget(new QTreeWidget(w));
@@ -583,25 +583,25 @@ static QWidget *createWidgets()
box->addWidget(new QTableWidget(w));
box->addWidget(new QCalendarWidget(w));
box->addWidget(new QDialogButtonBox(w));
- box->addWidget(new QGroupBox(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QGroupBox(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QFrame(w));
- box->addWidget(new QLineEdit(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QLineEdit(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QProgressBar(w));
box->addWidget(new QTabWidget(w));
- box->addWidget(new QCheckBox(QString::fromLatin1("widget text %1").arg(i++), w));
- box->addWidget(new QRadioButton(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QCheckBox(QLatin1String("widget text ") + QString::number(i++), w));
+ box->addWidget(new QRadioButton(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QDial(w));
box->addWidget(new QScrollBar(w));
box->addWidget(new QSlider(w));
box->addWidget(new QDateTimeEdit(w));
box->addWidget(new QDoubleSpinBox(w));
box->addWidget(new QSpinBox(w));
- box->addWidget(new QLabel(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QLabel(QLatin1String("widget text ") + QString::number(i++), w));
box->addWidget(new QLCDNumber(w));
box->addWidget(new QStackedWidget(w));
box->addWidget(new QToolBox(w));
- box->addWidget(new QLabel(QString::fromLatin1("widget text %1").arg(i++), w));
- box->addWidget(new QTextEdit(QString::fromLatin1("widget text %1").arg(i++), w));
+ box->addWidget(new QLabel(QLatin1String("widget text ") + QString::number(i++), w));
+ box->addWidget(new QTextEdit(QLatin1String("widget text ") + QString::number(i++), w));
/* Not in the list
* QAbstractItemView, QGraphicsView, QScrollArea,
@@ -1763,7 +1763,7 @@ void tst_QAccessibility::textEditTest()
}
edit.show();
- QTest::qWaitForWindowShown(&edit);
+ QTest::qWaitForWindowExposed(&edit);
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&edit);
QCOMPARE(iface->text(QAccessible::Value), edit.toPlainText());
QVERIFY(iface->state().focusable);
@@ -2175,7 +2175,7 @@ void tst_QAccessibility::lineEditTest()
QLineEdit le(QStringLiteral("My characters have geometries."), toplevel);
// characterRect()
le.show();
- QTest::qWaitForWindowShown(&le);
+ QTest::qWaitForWindowExposed(&le);
QAccessibleInterface *iface(QAccessible::queryAccessibleInterface(&le));
QAccessibleTextInterface* textIface = iface->textInterface();
QVERIFY(textIface);
@@ -2322,9 +2322,13 @@ void tst_QAccessibility::lineEditTextFunctions_data()
QTest::newRow("char after 6") << "hello" << 2 << (int) QAccessible::CharBoundary << 3 << 6 << -1 << -1 << "";
for (int i = -2; i < 6; ++i) {
- QTest::newRow(QString::fromLatin1("line before %1").arg(i).toLocal8Bit().constData()) << "hello" << 0 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
- QTest::newRow(QString::fromLatin1("line at %1").arg(i).toLocal8Bit().constData()) << "hello" << 1 << (int) QAccessible::LineBoundary << 3 << i << 0 << 5 << "hello";
- QTest::newRow(QString::fromLatin1("line after %1").arg(i).toLocal8Bit().constData()) << "hello" << 2 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("line before " + iB).constData())
+ << "hello" << 0 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
+ QTest::newRow(("line at " + iB).constData())
+ << "hello" << 1 << (int) QAccessible::LineBoundary << 3 << i << 0 << 5 << "hello";
+ QTest::newRow(("line after " + iB).constData())
+ << "hello" << 2 << (int) QAccessible::LineBoundary << 3 << i << -1 << -1 << "";
}
}
@@ -3576,7 +3580,7 @@ void tst_QAccessibility::comboBoxTest()
// Fully decorated windows have a minimum width of 160 on Windows.
combo.setMinimumWidth(200);
combo.show();
- QVERIFY(QTest::qWaitForWindowShown(&combo));
+ QVERIFY(QTest::qWaitForWindowExposed(&combo));
QAccessibleInterface *iface = QAccessible::queryAccessibleInterface(&combo);
QCOMPARE(verifyHierarchy(iface), 0);
diff --git a/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro b/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro
index 5d81567f45..ceed81c914 100644
--- a/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro
+++ b/tests/auto/other/qaccessibilitymac/qaccessibilitymac.pro
@@ -13,4 +13,3 @@ mac {
requires(mac)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm
index 3056904dcf..5f6826e7f7 100644
--- a/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm
+++ b/tests/auto/other/qaccessibilitymac/tst_qaccessibilitymac_helpers.mm
@@ -42,7 +42,7 @@
#include <QtTest>
#include <unistd.h>
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#import <ApplicationServices/ApplicationServices.h>
QT_USE_NAMESPACE
diff --git a/tests/auto/other/qcomplextext/qcomplextext.pro b/tests/auto/other/qcomplextext/qcomplextext.pro
index 28acc397bf..98dbd3b214 100644
--- a/tests/auto/other/qcomplextext/qcomplextext.pro
+++ b/tests/auto/other/qcomplextext/qcomplextext.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcomplextext
QT += testlib
QT += core-private gui-private
SOURCES += tst_qcomplextext.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qfocusevent/qfocusevent.pro b/tests/auto/other/qfocusevent/qfocusevent.pro
index c6e31d2e50..5f799291c6 100644
--- a/tests/auto/other/qfocusevent/qfocusevent.pro
+++ b/tests/auto/other/qfocusevent/qfocusevent.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qfocusevent
QT += widgets testlib
SOURCES += tst_qfocusevent.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro b/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro
index e34990d513..b03a448dfb 100644
--- a/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro
+++ b/tests/auto/other/qnetworkaccessmanager_and_qprogressdialog/qnetworkaccessmanager_and_qprogressdialog.pro
@@ -1,6 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qnetworkaccessmanager_and_qprogressdialog
SOURCES += tst_qnetworkaccessmanager_and_qprogressdialog.cpp
QT += network widgets testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qobjectperformance/qobjectperformance.pro b/tests/auto/other/qobjectperformance/qobjectperformance.pro
index 78423bee9c..189f8eeb2a 100644
--- a/tests/auto/other/qobjectperformance/qobjectperformance.pro
+++ b/tests/auto/other/qobjectperformance/qobjectperformance.pro
@@ -5,4 +5,3 @@ SOURCES += tst_qobjectperformance.cpp
QT = core network testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qobjectrace/qobjectrace.pro b/tests/auto/other/qobjectrace/qobjectrace.pro
index b5848edb01..94e7928585 100644
--- a/tests/auto/other/qobjectrace/qobjectrace.pro
+++ b/tests/auto/other/qobjectrace/qobjectrace.pro
@@ -2,6 +2,3 @@ CONFIG += testcase
SOURCES += tst_qobjectrace.cpp
QT = core testlib
-TARGET.EPOCHEAPSIZE = 20000000 40000000
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qprocess_and_guieventloop/test.pro b/tests/auto/other/qprocess_and_guieventloop/test.pro
index 54d6f194b0..50c4e1d72b 100644
--- a/tests/auto/other/qprocess_and_guieventloop/test.pro
+++ b/tests/auto/other/qprocess_and_guieventloop/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT = core gui testlib
SOURCES = tst_qprocess_and_guieventloop.cpp
TARGET = tst_qprocess_and_guieventloop
diff --git a/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro b/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro
index c7a4f3e216..722f575f80 100644
--- a/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro
+++ b/tests/auto/other/qsharedpointer_and_qwidget/qsharedpointer_and_qwidget.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsharedpointer_and_qwidget
QT += widgets testlib
SOURCES += tst_qsharedpointer_and_qwidget.cpp
DEFINES += SRCDIR=\\\"$$PWD/\\\"
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qtokenautomaton/qtokenautomaton.pro b/tests/auto/other/qtokenautomaton/qtokenautomaton.pro
index 2c0b3dae9b..e4d0160f80 100644
--- a/tests/auto/other/qtokenautomaton/qtokenautomaton.pro
+++ b/tests/auto/other/qtokenautomaton/qtokenautomaton.pro
@@ -16,5 +16,3 @@ HEADERS += tokenizers/basic/basic.h \
tokenizers/withNamespace/withNamespace.h
QT = core testlib
-CONFIG += parallel_test
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/other/qvariant_common/tst_qvariant_common.h b/tests/auto/other/qvariant_common/tst_qvariant_common.h
index 79a5707de8..6a7c125089 100644
--- a/tests/auto/other/qvariant_common/tst_qvariant_common.h
+++ b/tests/auto/other/qvariant_common/tst_qvariant_common.h
@@ -72,7 +72,7 @@ protected:
currentName.chop(1);
ok &= (msg.contains(", " + currentName) || msg.contains(", 0x0"));
}
- ok &= msg.endsWith(")");
+ ok &= msg.endsWith(QLatin1Char(')'));
QVERIFY2(ok, (QString::fromLatin1("Message is not correctly finished: '") + msg + '\'').toLatin1().constData());
}
diff --git a/tests/auto/other/toolsupport/toolsupport.pro b/tests/auto/other/toolsupport/toolsupport.pro
index 274ead2c35..7603dea79e 100644
--- a/tests/auto/other/toolsupport/toolsupport.pro
+++ b/tests/auto/other/toolsupport/toolsupport.pro
@@ -1,4 +1,4 @@
-CONFIG += testcase parallel_test
+CONFIG += testcase
TARGET = tst_toolsupport
QT = testlib core-private
SOURCES = $$PWD/tst_toolsupport.cpp
diff --git a/tests/auto/other/toolsupport/tst_toolsupport.cpp b/tests/auto/other/toolsupport/tst_toolsupport.cpp
index bbd787bf38..a5b85ef221 100644
--- a/tests/auto/other/toolsupport/tst_toolsupport.cpp
+++ b/tests/auto/other/toolsupport/tst_toolsupport.cpp
@@ -29,6 +29,16 @@
#include <QtTest>
+//
+// Note:
+//
+// When this test here fails and the change leading to the failure
+// intentionally changed a private class, adjust the test here and bump
+// the TypeInformationVersion field in src/corelib/global/qhooks.cpp
+// in the same commit as the modification to the private class.
+//
+
+
// Don't do this at home. This is test code, not production.
#define protected public
#define private public
diff --git a/tests/auto/other/windowsmobile/test/test.pro b/tests/auto/other/windowsmobile/test/test.pro
index 5f744c2acb..36dd15f60e 100644
--- a/tests/auto/other/windowsmobile/test/test.pro
+++ b/tests/auto/other/windowsmobile/test/test.pro
@@ -1,6 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += widgets testlib
HEADERS += ddhelper.h
SOURCES += tst_windowsmobile.cpp ddhelper.cpp
@@ -22,4 +21,3 @@ wincewm*: {
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro b/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro
index 2e9ae33592..b867610009 100644
--- a/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro
+++ b/tests/auto/printsupport/dialogs/qabstractprintdialog/qabstractprintdialog.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractprintdialog
QT += widgets printsupport testlib
SOURCES += tst_qabstractprintdialog.cpp
diff --git a/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro b/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro
index fb11b0361e..56c1b60d94 100644
--- a/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro
+++ b/tests/auto/printsupport/kernel/qprintdevice/qprintdevice.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qprintdevice
SOURCES += tst_qprintdevice.cpp
QT += printsupport-private network testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/printsupport/kernel/qprinter/qprinter.pro b/tests/auto/printsupport/kernel/qprinter/qprinter.pro
index 9fc6ed13fc..462929c153 100644
--- a/tests/auto/printsupport/kernel/qprinter/qprinter.pro
+++ b/tests/auto/printsupport/kernel/qprinter/qprinter.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qprinter
QT += printsupport widgets testlib
SOURCES += tst_qprinter.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
index 6dcf50a838..f397f48bb8 100644
--- a/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
+++ b/tests/auto/printsupport/kernel/qprinterinfo/qprinterinfo.pro
@@ -1,9 +1,7 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qprinterinfo
SOURCES += tst_qprinterinfo.cpp
QT += printsupport network testlib
DEFINES += QT_USE_USING_NAMESPACE
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/sql/kernel/qsql/qsql.pro b/tests/auto/sql/kernel/qsql/qsql.pro
index 03918f5d3d..71e2989572 100644
--- a/tests/auto/sql/kernel/qsql/qsql.pro
+++ b/tests/auto/sql/kernel/qsql/qsql.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsql
SOURCES += tst_qsql.cpp
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
index fe8a3689b0..3ba4833dd5 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_databases.h
@@ -119,7 +119,7 @@ inline static QString qTableName(const QString& prefix, QSqlDatabase db)
QString tableStr;
if (db.driverName().toLower().contains("ODBC"))
tableStr += QLatin1String("_odbc");
- return fixupTableName(QString(db.driver()->escapeIdentifier(prefix + tableStr + "_" +
+ return fixupTableName(QString(db.driver()->escapeIdentifier(prefix + tableStr + QLatin1Char('_') +
qGetHostName(), QSqlDriver::TableName)),db);
}
@@ -219,12 +219,12 @@ public:
}
// construct a stupid unique name
- QString cName = QString::number( counter++ ) + "_" + driver + "@";
+ QString cName = QString::number( counter++ ) + QLatin1Char('_') + driver + QLatin1Char('@');
cName += host.isEmpty() ? dbName : host;
if ( port > 0 )
- cName += ":" + QString::number( port );
+ cName += QLatin1Char(':') + QString::number( port );
db = QSqlDatabase::addDatabase( driver, cName );
@@ -364,7 +364,7 @@ public:
// for debugging only: outputs the connection as string
static QString dbToString( const QSqlDatabase db )
{
- QString res = db.driverName() + "@";
+ QString res = db.driverName() + QLatin1Char('@');
if ( db.driverName().startsWith( "QODBC" ) || db.driverName().startsWith( "QOCI" ) ) {
res += db.databaseName();
@@ -373,7 +373,7 @@ public:
}
if ( db.port() > 0 ) {
- res += ":" + QString::number( db.port() );
+ res += QLatin1Char(':') + QString::number( db.port() );
}
return res;
@@ -522,7 +522,7 @@ public:
result += '\'';
if(!err.driverText().isEmpty())
result += err.driverText() + "' || '";
- result += err.databaseText() + "'";
+ result += err.databaseText() + QLatin1Char('\'');
return result.toLocal8Bit();
}
@@ -534,7 +534,7 @@ public:
result += '\'';
if(!err.driverText().isEmpty())
result += err.driverText() + "' || '";
- result += err.databaseText() + "'";
+ result += err.databaseText() + QLatin1Char('\'');
return result.toLocal8Bit();
}
diff --git a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
index 83cf0394f9..5738f20f15 100644
--- a/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
+++ b/tests/auto/sql/kernel/qsqldatabase/tst_qsqldatabase.cpp
@@ -217,7 +217,7 @@ struct FieldDef {
{
QString rt = typeName;
rt.replace(QRegExp("\\s"), QString("_"));
- int i = rt.indexOf("(");
+ int i = rt.indexOf(QLatin1Char('('));
if (i == -1)
i = rt.length();
if (i > 20)
diff --git a/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro b/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro
index 5633840635..8bfe1da1ce 100644
--- a/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro
+++ b/tests/auto/sql/kernel/qsqldriver/qsqldriver.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqldriver
SOURCES += tst_qsqldriver.cpp
diff --git a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
index 2f48b65e74..5273632138 100644
--- a/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
+++ b/tests/auto/sql/kernel/qsqldriver/tst_qsqldriver.cpp
@@ -79,7 +79,7 @@ void tst_QSqlDriver::recreateTestTables(QSqlDatabase db)
tst_Databases::safeDropTable( db, relTEST1 );
QString doubleField = (dbType == QSqlDriver::SQLite) ? "more_data double" : "more_data double(8,7)";
QVERIFY_SQL( q, exec("create table " + relTEST1 +
- " (id int not null primary key, name varchar(20), title_key int, another_title_key int, " + doubleField + ")"));
+ " (id int not null primary key, name varchar(20), title_key int, another_title_key int, " + doubleField + QLatin1Char(')')));
QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(1, 'harry', 1, 2, 1.234567)"));
QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(2, 'trond', 2, 1, 8.901234)"));
QVERIFY_SQL( q, exec("insert into " + relTEST1 + " values(3, 'vohi', 1, 2, 5.678901)"));
diff --git a/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro b/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro
index c217e27645..ef0d213dba 100644
--- a/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro
+++ b/tests/auto/sql/kernel/qsqlerror/qsqlerror.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlerror
QT = core sql testlib
diff --git a/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro b/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro
index 6b74041a17..5e0f4afe4c 100644
--- a/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro
+++ b/tests/auto/sql/kernel/qsqlfield/qsqlfield.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlfield
SOURCES += tst_qsqlfield.cpp
diff --git a/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp b/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp
index b77e1fe9ef..1d31f921f0 100644
--- a/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp
+++ b/tests/auto/sql/kernel/qsqlfield/tst_qsqlfield.cpp
@@ -201,9 +201,9 @@ void tst_QSqlField::name()
{
QSqlField field( "test", QVariant::String );
QFETCH( QString, val );
- QVERIFY( field.name() == "test" );
+ QCOMPARE(field.name(), QLatin1String("test"));
field.setName( val );
- QVERIFY( field.name() == val );
+ QCOMPARE(field.name(), val);
}
void tst_QSqlField::operator_Assign()
@@ -253,9 +253,9 @@ void tst_QSqlField::setName()
{
QSqlField field( "test", QVariant::String );
QFETCH( QString, val );
- QVERIFY( field.name() == "test" );
+ QCOMPARE(field.name(), QLatin1String("test"));
field.setName( val );
- QVERIFY( field.name() == val );
+ QCOMPARE(field.name(), val);
}
void tst_QSqlField::setNull()
@@ -273,16 +273,16 @@ void tst_QSqlField::setReadOnly()
field.setValue( "test" );
field.setReadOnly( true );
field.setValue( "Harry" );
- QVERIFY( field.value() == "test" );
+ QCOMPARE(field.value().toString(), QLatin1String("test"));
field.clear();
- QVERIFY( field.value() == "test" );
+ QCOMPARE(field.value().toString(), QLatin1String("test"));
QVERIFY( !field.isNull() );
field.clear();
- QVERIFY( field.value() == "test" );
+ QCOMPARE(field.value().toString(), QLatin1String("test"));
QVERIFY( !field.isNull() );
field.setReadOnly( false );
field.setValue( "Harry" );
- QVERIFY( field.value() == "Harry" );
+ QCOMPARE(field.value().toString(), QLatin1String("Harry"));
field.clear();
QVERIFY( field.value() == QVariant().toString() );
QVERIFY( field.isNull() );
diff --git a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
index b98ab68ae9..6311e4c480 100644
--- a/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
+++ b/tests/auto/sql/kernel/qsqlquery/tst_qsqlquery.cpp
@@ -959,14 +959,14 @@ void tst_QSqlQuery::value()
if (dbType == QSqlDriver::Interbase)
QVERIFY( q.value( 1 ).toString().startsWith( "VarChar" + QString::number( i ) ) );
- else if ( q.value( 1 ).toString().right( 1 ) == " " )
+ else if ( q.value( 1 ).toString().endsWith(QLatin1Char(' ')))
QCOMPARE( q.value( 1 ).toString(), ( "VarChar" + QString::number( i ) + " " ) );
else
QCOMPARE( q.value( 1 ).toString(), ( "VarChar" + QString::number( i ) ) );
if (dbType == QSqlDriver::Interbase)
QVERIFY( q.value( 2 ).toString().startsWith( "Char" + QString::number( i ) ) );
- else if ( q.value( 2 ).toString().right( 1 ) != " " )
+ else if (!q.value( 2 ).toString().endsWith(QLatin1Char(' ')))
QCOMPARE( q.value( 2 ).toString(), ( "Char" + QString::number( i ) ) );
else
QCOMPARE( q.value( 2 ).toString(), ( "Char" + QString::number( i ) + " " ) );
@@ -3145,7 +3145,7 @@ void tst_QSqlQuery::sqlServerReturn0()
"SELECT * FROM "+tableName+" WHERE ID = 2 "
"RETURN 0"));
- QVERIFY_SQL(q, exec("{CALL "+procName+"}"));
+ QVERIFY_SQL(q, exec("{CALL " + procName + QLatin1Char('}')));
QVERIFY_SQL(q, next());
}
@@ -3162,7 +3162,7 @@ void tst_QSqlQuery::QTBUG_551()
TYPE IntType IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;\n\
TYPE VCType IS TABLE OF VARCHAR2(60) INDEX BY BINARY_INTEGER;\n\
PROCEDURE P (Inp IN IntType, Outp OUT VCType);\n\
- END "+pkgname+";"));
+ END "+ pkgname + QLatin1Char(';')));
QVERIFY_SQL(q, exec("CREATE OR REPLACE PACKAGE BODY "+pkgname+" IS\n\
PROCEDURE P (Inp IN IntType, Outp OUT VCType)\n\
@@ -3172,7 +3172,7 @@ void tst_QSqlQuery::QTBUG_551()
Outp(2) := '2. Value is ' ||TO_CHAR(Inp(2));\n\
Outp(3) := '3. Value is ' ||TO_CHAR(Inp(3));\n\
END p;\n\
- END "+pkgname+";"));
+ END " + pkgname + QLatin1Char(';')));
QVariantList inLst, outLst, res_outLst;
@@ -3310,7 +3310,7 @@ void tst_QSqlQuery::QTBUG_6421()
QVERIFY_SQL(q, exec("create index INDEX2 on "+tableName+" (COL2 desc)"));
QVERIFY_SQL(q, exec("create index INDEX3 on "+tableName+" (COL3 desc)"));
q.setForwardOnly(true);
- QVERIFY_SQL(q, exec("select COLUMN_EXPRESSION from ALL_IND_EXPRESSIONS where TABLE_NAME='"+tableName+"'"));
+ QVERIFY_SQL(q, exec("select COLUMN_EXPRESSION from ALL_IND_EXPRESSIONS where TABLE_NAME='" + tableName + QLatin1Char('\'')));
QVERIFY_SQL(q, next());
QCOMPARE(q.value(0).toString(), QLatin1String("\"COL1\""));
QVERIFY_SQL(q, next());
@@ -3338,7 +3338,7 @@ void tst_QSqlQuery::QTBUG_6618()
"begin\n"
" raiserror('" + errorString + "', 16, 1)\n"
"end\n" ));
- q.exec("{call " + qTableName("tst_raiseError", __FILE__, db) + "}");
+ q.exec("{call " + qTableName("tst_raiseError", __FILE__, db) + QLatin1Char('}'));
QVERIFY(q.lastError().text().contains(errorString));
}
@@ -3430,7 +3430,7 @@ void tst_QSqlQuery::QTBUG_21884()
QStringList stList;
QString tableName(qTableName("bug21884", __FILE__, db));
stList << "create table " + tableName + "(id integer primary key, note string)";
- stList << "select * from " + tableName + ";";
+ stList << "select * from " + tableName + QLatin1Char(';');
stList << "select * from " + tableName + "; \t\n\r";
stList << "drop table " + tableName;
@@ -3984,7 +3984,7 @@ void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, const
{
QSqlQuery q(db);
QVERIFY_SQL(q, exec("DROP TABLE IF EXISTS " + tableName));
- QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id " + type + ")"));
+ QVERIFY_SQL(q, exec("CREATE TABLE " + tableName + " (id " + type + ')'));
const int steps = 20;
const T increment = max / steps - min / steps;
@@ -4001,7 +4001,7 @@ void runIntegralTypesMysqlTest(QSqlDatabase &db, const QString &tableName, const
q.bindValue(0, v);
QVERIFY_SQL(q, exec());
} else {
- QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (" + QString::number(v) + ")"));
+ QVERIFY_SQL(q, exec("INSERT INTO " + tableName + " (id) VALUES (" + QString::number(v) + QLatin1Char(')')));
}
values[i] = v;
v += increment;
diff --git a/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro b/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro
index 0e92797bb0..ee17b5f249 100644
--- a/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro
+++ b/tests/auto/sql/kernel/qsqlrecord/qsqlrecord.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlrecord
SOURCES += tst_qsqlrecord.cpp
diff --git a/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp b/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
index 8a90f16dce..722a391c13 100644
--- a/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
+++ b/tests/auto/sql/kernel/qsqlrecord/tst_qsqlrecord.cpp
@@ -484,7 +484,7 @@ void tst_QSqlRecord::setValue()
QVERIFY( rec2.value( 3 ) == QVariant(bval) );
rec2.setValue( "string", "__Harry__" );
- QVERIFY( rec2.value( 0 ) == "__Harry__" );
+ QCOMPARE(rec2.value(0).toString(), QLatin1String("__Harry__"));
for ( i = 0; i < 4; ++i )
QVERIFY( !rec2.isNull( i ) );
@@ -501,7 +501,7 @@ void tst_QSqlRecord::value()
QSqlRecord rec2;
rec2.append( QSqlField( "string", QVariant::String ) );
rec2.setValue( "string", "Harry" );
- QVERIFY( rec2.value( "string" ) == "Harry" );
+ QCOMPARE(rec2.value("string").toString(), QLatin1String("Harry"));
}
QTEST_MAIN(tst_QSqlRecord)
diff --git a/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro b/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro
index bc627e0724..2576fbad71 100644
--- a/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro
+++ b/tests/auto/sql/models/qsqlquerymodel/qsqlquerymodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlquerymodel
SOURCES += tst_qsqlquerymodel.cpp
diff --git a/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro b/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro
index 5ce1b5694c..cade7c171d 100644
--- a/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro
+++ b/tests/auto/sql/models/qsqlrelationaltablemodel/qsqlrelationaltablemodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqlrelationaltablemodel
SOURCES += tst_qsqlrelationaltablemodel.cpp
diff --git a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
index 3702631275..fbc583f341 100644
--- a/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
+++ b/tests/auto/sql/models/qsqlrelationaltablemodel/tst_qsqlrelationaltablemodel.cpp
@@ -1115,7 +1115,7 @@ void tst_QSqlRelationalTableModel::casing()
QCOMPARE( rec.count(), 0);
//try an owner that does exist
- rec = db.driver()->record(db.userName() + "." + qTableName("CASETEST1", db).toUpper());
+ rec = db.driver()->record(db.userName() + QLatin1Char('.') + qTableName("CASETEST1", db).toUpper());
QCOMPARE( rec.count(), 4);
}
QSqlRecord rec = db.driver()->record(qTableName("CASETEST1", db).toUpper());
@@ -1464,13 +1464,13 @@ void tst_QSqlRelationalTableModel::psqlSchemaTest()
QSqlQuery q(db);
QVERIFY_SQL(q, exec("create schema " + qTableName("QTBUG_5373", __FILE__, db)));
QVERIFY_SQL(q, exec("create schema " + qTableName("QTBUG_5373_s2", __FILE__, db)));
- QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373", __FILE__, db) + "." + qTableName("document", __FILE__, db) +
+ QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373", __FILE__, db) + QLatin1Char('.') + qTableName("document", __FILE__, db) +
"(document_id int primary key, relatingid int, userid int)"));
- QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373_s2", __FILE__, db) + "." + qTableName("user", __FILE__, db) +
+ QVERIFY_SQL(q, exec("create table " + qTableName("QTBUG_5373_s2", __FILE__, db) + QLatin1Char('.') + qTableName("user", __FILE__, db) +
"(userid int primary key, username char(40))"));
- model.setTable(qTableName("QTBUG_5373", __FILE__, db) + "." + qTableName("document", __FILE__, db));
- model.setRelation(1, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + "." + qTableName("user", __FILE__, db), "userid", "username"));
- model.setRelation(2, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + "." + qTableName("user", __FILE__, db), "userid", "username"));
+ model.setTable(qTableName("QTBUG_5373", __FILE__, db) + QLatin1Char('.') + qTableName("document", __FILE__, db));
+ model.setRelation(1, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + QLatin1Char('.') + qTableName("user", __FILE__, db), "userid", "username"));
+ model.setRelation(2, QSqlRelation(qTableName("QTBUG_5373_s2", __FILE__, db) + QLatin1Char('.') + qTableName("user", __FILE__, db), "userid", "username"));
QVERIFY_SQL(model, select());
model.setJoinMode(QSqlRelationalTableModel::LeftJoin);
@@ -1515,14 +1515,14 @@ void tst_QSqlRelationalTableModel::relationOnFirstColumn()
//prepare test1 table
QSqlQuery q(db);
QVERIFY_SQL(q, exec("CREATE TABLE " + testTable1 + " (val1 INTEGER, id1 INTEGER PRIMARY KEY);"));
- QVERIFY_SQL(q, exec("DELETE FROM " + testTable1 + ";"));
+ QVERIFY_SQL(q, exec("DELETE FROM " + testTable1 + QLatin1Char(';')));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable1 + " (id1, val1) VALUES(1, 10);"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable1 + " (id1, val1) VALUES(2, 20);"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable1 + " (id1, val1) VALUES(3, 30);"));
//prepare test2 table
QVERIFY_SQL(q, exec("CREATE TABLE " + testTable2 + " (id INTEGER PRIMARY KEY, name TEXT);"));
- QVERIFY_SQL(q, exec("DELETE FROM " + testTable2 + ";"));
+ QVERIFY_SQL(q, exec("DELETE FROM " + testTable2 + QLatin1Char(';')));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable2 + " (id, name) VALUES (10, 'Hervanta');"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable2 + " (id, name) VALUES (20, 'Keskusta');"));
QVERIFY_SQL(q, exec("INSERT INTO " + testTable2 + " (id, name) VALUES (30, 'Annala');"));
diff --git a/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro b/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro
index fedb41ba1d..2af39b341f 100644
--- a/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro
+++ b/tests/auto/sql/models/qsqltablemodel/qsqltablemodel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsqltablemodel
SOURCES += tst_qsqltablemodel.cpp
diff --git a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
index 2ace79973b..fff9811e60 100644
--- a/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
+++ b/tests/auto/sql/models/qsqltablemodel/tst_qsqltablemodel.cpp
@@ -1987,7 +1987,7 @@ void tst_QSqlTableModel::tableModifyWithBlank()
//set a filter on the table so the only record we get is the one we just made
//I could just do another setData command, but I want to make sure the TableModel
//matches exactly what is stored in the database
- model.setFilter("column1='"+timeString+"'"); //filter to get just the newly entered row
+ model.setFilter("column1='" + timeString + QLatin1Char('\'')); //filter to get just the newly entered row
QVERIFY_SQL(model, select());
//Make sure we only get one record, and that it is the one we just made
diff --git a/tests/auto/testlib/qsignalspy/qsignalspy.pro b/tests/auto/testlib/qsignalspy/qsignalspy.pro
index 72ae3a5009..1578802bf8 100644
--- a/tests/auto/testlib/qsignalspy/qsignalspy.pro
+++ b/tests/auto/testlib/qsignalspy/qsignalspy.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qsignalspy
SOURCES += tst_qsignalspy.cpp
QT = core testlib
-CONFIG += parallel_test
diff --git a/tests/auto/testlib/selftests/selftests.pro b/tests/auto/testlib/selftests/selftests.pro
index 1d39e6a899..32d66c019d 100644
--- a/tests/auto/testlib/selftests/selftests.pro
+++ b/tests/auto/testlib/selftests/selftests.pro
@@ -9,4 +9,3 @@ INSTALLS =
QT = core
-CONFIG += parallel_test
diff --git a/tests/auto/testlib/selftests/test/test.pro b/tests/auto/testlib/selftests/test/test.pro
index 0a31810105..106787b64d 100644
--- a/tests/auto/testlib/selftests/test/test.pro
+++ b/tests/auto/testlib/selftests/test/test.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += ../tst_selftests.cpp
QT = core xml testlib-private
diff --git a/tests/auto/testlib/selftests/tst_selftests.cpp b/tests/auto/testlib/selftests/tst_selftests.cpp
index 63c48fc809..389cb65c0b 100644
--- a/tests/auto/testlib/selftests/tst_selftests.cpp
+++ b/tests/auto/testlib/selftests/tst_selftests.cpp
@@ -775,6 +775,10 @@ void tst_Selftests::doRunSubTest(QString const& subdir, QStringList const& logge
QRegularExpressionMatch match = durationRegExp.match(line);
QVERIFY2(match.hasMatch(), qPrintable(QString::fromLatin1("Invalid Duration tag at line %1 (%2): '%3'")
.arg(i).arg(loggers.at(n), output)));
+ } else if (line.startsWith("Totals:")) {
+ const int lastCommaPos = line.lastIndexOf(',');
+ if (lastCommaPos > 0)
+ line.truncate(lastCommaPos); // Plain text logger: strip time (", 2323dms").
} else {
QVERIFY2(output == expected,
qPrintable(QString::fromLatin1("Mismatch at line %1 (%2, %3):\n'%4'\n !=\n'%5'")
diff --git a/tests/auto/tools/moc/moc.pro b/tests/auto/tools/moc/moc.pro
index 99e226c5f4..688799048f 100644
--- a/tests/auto/tools/moc/moc.pro
+++ b/tests/auto/tools/moc/moc.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_moc
#exists(/usr/include/boost/spirit.hpp) {
@@ -41,7 +40,6 @@ qtHaveModule(dbus) {
DEFINES += WITH_DBUS
QT += dbus
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
# tst_Moc::specifyMetaTagsFromCmdline()
# Ensure that plugin_metadata.h are moc-ed with some extra -M arguments:
diff --git a/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro b/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro
index d568e7107d..4bfa89a44e 100644
--- a/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro
+++ b/tests/auto/tools/qdbuscpp2xml/qdbuscpp2xml.pro
@@ -9,4 +9,3 @@ SOURCES += tst_qdbuscpp2xml.cpp \
RESOURCES += qdbuscpp2xml.qrc
HEADERS += test1.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro b/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro
index d2e2e19a36..8c29ff47c4 100644
--- a/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro
+++ b/tests/auto/tools/qdbusxml2cpp/qdbusxml2cpp.pro
@@ -3,4 +3,3 @@ QT = core testlib
TARGET = tst_qdbusxml2cpp
SOURCES += tst_qdbusxml2cpp.cpp
QMAKE_CXXFLAGS += $$QT_CFLAGS_DBUS
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/tools/qmake/qmake.pro b/tests/auto/tools/qmake/qmake.pro
index d0817247db..ac52fb81fa 100644
--- a/tests/auto/tools/qmake/qmake.pro
+++ b/tests/auto/tools/qmake/qmake.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
# Allow more time since examples are compiled, which may take longer on Windows.
win32:testcase.timeout=900
TARGET = tst_qmake
diff --git a/tests/auto/tools/qmake/testcompiler.cpp b/tests/auto/tools/qmake/testcompiler.cpp
index 601d626b5c..23a7012af7 100644
--- a/tests/auto/tools/qmake/testcompiler.cpp
+++ b/tests/auto/tools/qmake/testcompiler.cpp
@@ -296,7 +296,7 @@ bool TestCompiler::make( const QString &workPath, const QString &target, bool ex
bool TestCompiler::exists( const QString &destDir, const QString &exeName, BuildType buildType, const QString &version )
{
- QFileInfo f(destDir + "/" + targetName(buildType, exeName, version));
+ QFileInfo f(destDir + QLatin1Char('/') + targetName(buildType, exeName, version));
return f.exists();
}
diff --git a/tests/auto/tools/qmakelib/qmakelib.pro b/tests/auto/tools/qmakelib/qmakelib.pro
index f1b8dfef3d..140bece708 100644
--- a/tests/auto/tools/qmakelib/qmakelib.pro
+++ b/tests/auto/tools/qmakelib/qmakelib.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmakelib
QT = core testlib
diff --git a/tests/auto/tools/rcc/rcc.pro b/tests/auto/tools/rcc/rcc.pro
index 160697b06c..264b8ecc66 100644
--- a/tests/auto/tools/rcc/rcc.pro
+++ b/tests/auto/tools/rcc/rcc.pro
@@ -3,4 +3,3 @@ QT = core testlib
TARGET = tst_rcc
SOURCES += tst_rcc.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro b/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro
index c379e67ec5..c8ddedb401 100644
--- a/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro
+++ b/tests/auto/widgets/dialogs/qcolordialog/qcolordialog.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qcolordialog
QT += widgets testlib
SOURCES += tst_qcolordialog.cpp
diff --git a/tests/auto/widgets/dialogs/qdialog/qdialog.pro b/tests/auto/widgets/dialogs/qdialog/qdialog.pro
index c7917e8ff6..0a065b1a87 100644
--- a/tests/auto/widgets/dialogs/qdialog/qdialog.pro
+++ b/tests/auto/widgets/dialogs/qdialog/qdialog.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdialog
QT += widgets testlib gui-private core-private
SOURCES += tst_qdialog.cpp
diff --git a/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro b/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro
index a88f449494..b4cf05e347 100644
--- a/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro
+++ b/tests/auto/widgets/dialogs/qerrormessage/qerrormessage.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TEMPLATE = app
TARGET = tst_qerrormessage
diff --git a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
index bc3c5e73f0..ed4cc64410 100644
--- a/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog/tst_qfiledialog.cpp
@@ -942,7 +942,7 @@ void tst_QFiledialog::selectFiles()
QString filesPath = fd.directory().absolutePath();
for (int i=0; i < 5; ++i) {
- QFile file(filesPath + QString::fromLatin1("/qfiledialog_auto_test_not_pres_%1").arg(i));
+ QFile file(filesPath + QLatin1String("/qfiledialog_auto_test_not_pres_") + QString::number(i));
file.open(QIODevice::WriteOnly);
file.resize(1024);
file.flush();
@@ -956,7 +956,7 @@ void tst_QFiledialog::selectFiles()
QListView* listView = fd.findChild<QListView*>("listView");
QVERIFY(listView);
for (int i = 0; i < list.count(); ++i) {
- fd.selectFile(fd.directory().path() + "/" + list.at(i));
+ fd.selectFile(fd.directory().path() + QLatin1Char('/') + list.at(i));
QTRY_VERIFY(!listView->selectionModel()->selectedRows().isEmpty());
toSelect.append(listView->selectionModel()->selectedRows().last());
}
diff --git a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
index d48c718d4d..5e5affed28 100644
--- a/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
+++ b/tests/auto/widgets/dialogs/qfiledialog2/tst_qfiledialog2.cpp
@@ -520,7 +520,7 @@ protected:
path = parentIndex.child(source_row,0).data(Qt::DisplayRole).toString();
do {
- path = parentIndex.data(Qt::DisplayRole).toString() + "/" + path;
+ path = parentIndex.data(Qt::DisplayRole).toString() + QLatin1Char('/') + path;
parentIndex = parentIndex.parent();
} while(parentIndex.isValid());
@@ -903,7 +903,7 @@ void tst_QFileDialog2::task228844_ensurePreviousSorting()
#else
QTest::qWait(500);
#endif
- QCOMPARE(fd2.selectedFiles().first(), current.absolutePath() + QChar('/') + QLatin1String("g"));
+ QCOMPARE(fd2.selectedFiles().first(), current.absolutePath() + QLatin1String("/g"));
QNonNativeFileDialog fd3(0, "This is a third file dialog", tempFile->fileName());
fd3.restoreState(fd.saveState());
@@ -1149,7 +1149,7 @@ void tst_QFileDialog2::task257579_sideBarWithNonCleanUrls()
QLatin1String dirname("autotest_task257579");
dir.rmdir(dirname); //makes sure it doesn't exist any more
QVERIFY(dir.mkdir(dirname));
- QString url = QString::fromLatin1("%1/%2/..").arg(dir.absolutePath()).arg(dirname);
+ QString url = dir.absolutePath() + QLatin1Char('/') + dirname + QLatin1String("/..");
QNonNativeFileDialog fd;
fd.setSidebarUrls(QList<QUrl>() << QUrl::fromLocalFile(url));
QSidebar *sidebar = fd.findChild<QSidebar*>("sidebar");
diff --git a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
index 209048a853..acf45f8fb7 100644
--- a/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
+++ b/tests/auto/widgets/dialogs/qfilesystemmodel/tst_qfilesystemmodel.cpp
@@ -251,15 +251,17 @@ void tst_QFileSystemModel::naturalCompare_data()
QTest::addColumn<int>("result");
QTest::addColumn<int>("swap");
-#define ROWNAME(name) (qPrintable(QString("prefix=%1, postfix=%2, num=%3, i=%4, test=%5").arg(prefix).arg(postfix).arg(num).arg(i).arg(name)))
+#define ROWNAME(name) (("prefix=" + prefix.toLatin1() + ", postfix=" + postfix.toLatin1() \
+ + ", num=" + num.toLatin1() + ", i=" + QByteArray::number(i) \
+ + ", test=" + name).constData())
for (int j = 0; j < 4; ++j) { // <- set a prefix and a postfix string (not numbers)
QString prefix = (j == 0 || j == 1) ? "b" : "";
QString postfix = (j == 1 || j == 2) ? "y" : "";
for (int k = 0; k < 3; ++k) { // <- make 0 not a special case
- QString num = QString("%1").arg(k);
- QString nump = QString("%1").arg(k + 1);
+ const QString num = QString::number(k);
+ const QString nump = QString::number(k + 1);
for (int i = 10; i < 12; ++i) { // <- swap s1 and s2 and reverse the result
QTest::newRow(ROWNAME("basic")) << prefix + "0" + postfix << prefix + "0" + postfix << int(Qt::CaseInsensitive) << 0;
@@ -470,8 +472,9 @@ void tst_QFileSystemModel::rowsInserted_data()
QTest::addColumn<int>("count");
QTest::addColumn<int>("ascending");
for (int i = 0; i < 4; ++i) {
- QTest::newRow(QString("Qt::AscendingOrder %1").arg(i).toLocal8Bit().constData()) << i << (int)Qt::AscendingOrder;
- QTest::newRow(QString("Qt::DescendingOrder %1").arg(i).toLocal8Bit().constData()) << i << (int)Qt::DescendingOrder;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("Qt::AscendingOrder " + iB).constData()) << i << (int)Qt::AscendingOrder;
+ QTest::newRow(("Qt::DescendingOrder " + iB).constData()) << i << (int)Qt::DescendingOrder;
}
}
@@ -499,7 +502,7 @@ void tst_QFileSystemModel::rowsInserted()
int oldCount = model->rowCount(root);
QStringList files;
for (int i = 0; i < count; ++i)
- files.append(QString("c%1").arg(i));
+ files.append(QLatin1Char('c') + QString::number(i));
QVERIFY(createFiles(tmp, files, 5));
TRY_WAIT(model->rowCount(root) == oldCount + count);
QTRY_COMPARE(model->rowCount(root), oldCount + count);
@@ -1019,8 +1022,8 @@ void tst_QFileSystemModel::dirsBeforeFiles()
for (int i = 0; i < 3; ++i) {
QLatin1Char c('a' + i);
- dir.mkdir(QString("%1-dir").arg(c));
- QFile file(flatDirTestPath + QString("/%1-file").arg(c));
+ dir.mkdir(c + QLatin1String("-dir"));
+ QFile file(flatDirTestPath + QLatin1Char('/') + c + QLatin1String("-file"));
file.open(QIODevice::ReadWrite);
file.close();
}
@@ -1097,7 +1100,7 @@ void tst_QFileSystemModel::permissions() // checks QTBUG-20503
QFETCH(bool, readOnly);
const QString tmp = flatDirTestPath;
- const QString file = tmp + '/' + "f";
+ const QString file = tmp + QLatin1String("/f");
QVERIFY(createFiles(tmp, QStringList() << "f"));
QVERIFY(QFile::setPermissions(file, QFile::Permissions(permissions)));
diff --git a/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro b/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro
index dc1702971e..320d6ee3b5 100644
--- a/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro
+++ b/tests/auto/widgets/dialogs/qfontdialog/qfontdialog.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontdialog
QT += widgets widgets-private testlib
@@ -9,9 +8,9 @@ SOURCES += tst_qfontdialog.cpp
RESOURCES += testfonts.qrc
-mac {
+osx {
# ### fixme
# OBJECTIVE_SOURCES += tst_qfontdialog_mac_helpers.mm
-# LIBS += -framework Cocoa
+# LIBS += -framework AppKit
}
diff --git a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
index c3b80304a2..2590f31608 100644
--- a/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
+++ b/tests/auto/widgets/dialogs/qinputdialog/tst_qinputdialog.cpp
@@ -168,10 +168,10 @@ void testGetNumeric(QInputDialog *dialog, SpinBoxType * = 0, ValueType * = 0)
const ValueType origValue = sbox->value();
testInvalidateAndRestore<SpinBoxType, ValueType>(sbox, okButton, ledit);
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->minimum()));
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->maximum()));
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->minimum() - 1));
- testTypingValue<SpinBoxType>(sbox, okButton, QString("%1").arg(sbox->maximum() + 1));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->minimum()));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->maximum()));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->minimum() - 1));
+ testTypingValue<SpinBoxType>(sbox, okButton, QString::number(sbox->maximum() + 1));
testTypingValue<SpinBoxType>(sbox, okButton, "0");
testTypingValue<SpinBoxType>(sbox, okButton, "0.0");
testTypingValue<SpinBoxType>(sbox, okButton, "foobar");
diff --git a/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro b/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro
index e9f220101b..91848fee24 100644
--- a/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro
+++ b/tests/auto/widgets/dialogs/qmessagebox/qmessagebox.pro
@@ -2,6 +2,5 @@ TEMPLATE = app
TARGET = tst_qmessagebox
QT += gui-private core-private widgets testlib
CONFIG += testcase
-CONFIG += parallel_test
SOURCES += tst_qmessagebox.cpp
diff --git a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
index 97cfec8171..fd78bd870b 100644
--- a/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
+++ b/tests/auto/widgets/dialogs/qmessagebox/tst_qmessagebox.cpp
@@ -606,7 +606,7 @@ void tst_QMessageBox::detailsButtonText()
QAbstractButton* btn = NULL;
foreach(btn, list) {
if (btn && (btn->inherits("QPushButton"))) {
- if (btn->text().remove("&") != QMessageBox::tr("OK")
+ if (btn->text().remove(QLatin1Char('&')) != QMessageBox::tr("OK")
&& btn->text() != QMessageBox::tr("Show Details...")) {
QFAIL(qPrintable(QString("Unexpected messagebox button text: %1").arg(btn->text())));
}
diff --git a/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro b/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro
index 290374f825..10aeaace71 100644
--- a/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro
+++ b/tests/auto/widgets/dialogs/qprogressdialog/qprogressdialog.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qprogressdialog
QT += widgets testlib
SOURCES += tst_qprogressdialog.cpp
diff --git a/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro b/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro
index ce485504e2..18e637199a 100644
--- a/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro
+++ b/tests/auto/widgets/dialogs/qsidebar/qsidebar.pro
@@ -1,8 +1,6 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += core-private
QT += widgets widgets-private testlib
SOURCES += tst_qsidebar.cpp
TARGET = tst_qsidebar
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/dialogs/qwizard/qwizard.pro b/tests/auto/widgets/dialogs/qwizard/qwizard.pro
index a1d72e854a..c6e5bcea7a 100644
--- a/tests/auto/widgets/dialogs/qwizard/qwizard.pro
+++ b/tests/auto/widgets/dialogs/qwizard/qwizard.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwizard
QT += widgets testlib
SOURCES += tst_qwizard.cpp tst_qwizard_2.cpp
diff --git a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp
index b2bdbac79a..e25f41da3f 100644
--- a/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp
+++ b/tests/auto/widgets/dialogs/qwizard/tst_qwizard.cpp
@@ -547,8 +547,8 @@ void tst_QWizard::setDefaultProperty()
// make sure the data structure is reasonable
for (int i = 0; i < 200000; ++i) {
- wizard.setDefaultProperty("QLineEdit", QByteArray("x" + QByteArray::number(i)).constData(), 0);
- wizard.setDefaultProperty("QLabel", QByteArray("y" + QByteArray::number(i)).constData(), 0);
+ wizard.setDefaultProperty("QLineEdit", QByteArray('x' + QByteArray::number(i)).constData(), 0);
+ wizard.setDefaultProperty("QLabel", QByteArray('y' + QByteArray::number(i)).constData(), 0);
}
}
@@ -1625,7 +1625,7 @@ class SetPage : public Operation
for (int j = 0; j < page; ++j)
wizard->next();
}
- QString describe() const { return QString("set page %1").arg(page); }
+ QString describe() const { return QLatin1String("set page ") + QString::number(page); }
const int page;
public:
SetPage(int page) : page(page) {}
@@ -1634,7 +1634,7 @@ public:
class SetStyle : public Operation
{
void apply(QWizard *wizard) const { wizard->setWizardStyle(style); }
- QString describe() const { return QString("set style %1").arg(style); }
+ QString describe() const { return QLatin1String("set style ") + QString::number(style); }
const QWizard::WizardStyle style;
public:
SetStyle(QWizard::WizardStyle style) : style(style) {}
@@ -1697,7 +1697,8 @@ public:
QString SetOption::describe() const
{
- return QString("set opt %1 %2").arg(OptionInfo::instance().tag(option)).arg(on);
+ return QLatin1String("set opt ") + OptionInfo::instance().tag(option)
+ + QLatin1Char(on ? '1' : '0');
}
Q_DECLARE_METATYPE(Operation *)
@@ -1726,7 +1727,7 @@ public:
void createTestRows()
{
for (int i = 0; i < combinations.count(); ++i) {
- QTest::newRow((name + QString(", row %1").arg(i)).toLatin1().data())
+ QTest::newRow((name.toLatin1() + ", row " + QByteArray::number(i)).constData())
<< (i == 0) << (type == Equality) << *(combinations.at(i));
++nRows_;
}
@@ -1827,7 +1828,7 @@ public:
foreach (Operation * op, operations) {
if (op) {
op->apply(this);
- opsDescr += QString("(%1) ").arg(op->describe());
+ opsDescr += QLatin1Char('(') + op->describe() + QLatin1String(") ");
}
}
}
@@ -2115,7 +2116,7 @@ void tst_QWizard::combinations()
}
if (minSizeTest)
- qDebug() << "minimum sizes" << reason.latin1() << ";" << wizard.minimumSizeHint()
+ qDebug() << "minimum sizes" << reason.latin1() << ';' << wizard.minimumSizeHint()
<< otor.latin1() << refMinSize;
if (imageTest)
diff --git a/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro b/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
index 9f6b0455e2..177d1a7c42 100644
--- a/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
+++ b/tests/auto/widgets/effects/qgraphicseffect/qgraphicseffect.pro
@@ -5,4 +5,3 @@ QT += widgets widgets-private testlib
QT += core-private gui-private
SOURCES += tst_qgraphicseffect.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp b/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
index c7d1dd0aa1..ceeea77dc2 100644
--- a/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
+++ b/tests/auto/widgets/effects/qgraphicseffect/tst_qgraphicseffect.cpp
@@ -549,7 +549,7 @@ void tst_QGraphicsEffect::drawPixmapItem()
QVERIFY(QTest::qWaitForWindowExposed(&view));
QTRY_VERIFY(effect->repaints >= 1);
- item->rotate(180);
+ item->setTransform(QTransform().rotate(180), true);
QTRY_VERIFY(effect->repaints >= 2);
}
@@ -593,7 +593,7 @@ void tst_QGraphicsEffect::deviceCoordinateTranslateCaching()
QTRY_VERIFY(item->numRepaints >= 1);
int numRepaints = item->numRepaints;
- item->translate(10, 0);
+ item->setTransform(QTransform::fromTranslate(10, 0), true);
QTRY_COMPARE(item->numRepaints, numRepaints);
}
diff --git a/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro b/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro
index b6693eeb5f..bf0f99598b 100644
--- a/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro
+++ b/tests/auto/widgets/effects/qpixmapfilter/qpixmapfilter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qpixmapfilter
QT += widgets widgets-private testlib
diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro
index 6e8717c86d..a1064d1c73 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/qgraphicsanchorlayout1.pro
@@ -3,4 +3,3 @@ TARGET = tst_qgraphicsanchorlayout1
QT += widgets widgets-private testlib
QT += core-private gui-private
SOURCES += tst_qgraphicsanchorlayout1.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
index a58f295575..15987a094e 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsanchorlayout1/tst_qgraphicsanchorlayout1.cpp
@@ -159,7 +159,7 @@ public:
{
setContentsMargins( 0,0,0,0 );
if (name.isEmpty())
- setData(0, QString::fromLatin1("w%1").arg(quintptr(this)));
+ setData(0, QLatin1Char('w') + QString::number(quintptr(this)));
else
setData(0, name);
}
@@ -1702,10 +1702,8 @@ void tst_QGraphicsAnchorLayout1::testBasicLayout()
// Create dummy widgets
QList<QGraphicsWidget *> widgets;
- for (int i = 0; i < widgetCount; ++i) {
- TestWidget *w = new TestWidget(0, QString::fromLatin1("W%1").arg(i));
- widgets << w;
- }
+ for (int i = 0; i < widgetCount; ++i)
+ widgets << new TestWidget(0, QLatin1Char('W') + QString::number(i));
// Setup anchor layout
TheAnchorLayout *layout = new TheAnchorLayout;
diff --git a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
index 8c27bebf3a..2d1efab4d1 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsgridlayout/tst_qgraphicsgridlayout.cpp
@@ -451,9 +451,10 @@ void tst_QGraphicsGridLayout::addItem_data()
int column = b;
int rowSpan = c;
int columnSpan = d;
- QString name = QString::fromLatin1("(%1,%2,%3,%4").arg(a).arg(b).arg(c).arg(d);
+ const QByteArray name = '(' + QByteArray::number(a) + ',' + QByteArray::number(b)
+ + ',' + QByteArray::number(c) + ',' + QByteArray::number(d);
Qt::Alignment alignment = Qt::AlignLeft;
- QTest::newRow(name.toLatin1()) << row << column << rowSpan << columnSpan << alignment;
+ QTest::newRow(name.constData()) << row << column << rowSpan << columnSpan << alignment;
}}}}
}
@@ -1107,7 +1108,8 @@ void tst_QGraphicsGridLayout::itemAt()
if (i >= 0 && i < layout->count()) {
QVERIFY(layout->itemAt(i));
} else {
- QTest::ignoreMessage(QtWarningMsg, QString::fromLatin1("QGraphicsGridLayout::itemAt: invalid index %1").arg(i).toLatin1().constData());
+ const QByteArray message = "QGraphicsGridLayout::itemAt: invalid index " + QByteArray::number(i);
+ QTest::ignoreMessage(QtWarningMsg, message.constData());
QCOMPARE(layout->itemAt(i), static_cast<QGraphicsLayoutItem*>(0));
}
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro b/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
index 66e39869bb..5bfa15db16 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/qgraphicsitem.pro
@@ -6,4 +6,3 @@ SOURCES += tst_qgraphicsitem.cpp
DEFINES += QT_NO_CAST_TO_ASCII
win32:!wince:!winrt: LIBS += -luser32
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index 835aeaa4df..28ce831889 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -310,7 +310,7 @@ private slots:
void selected_textItem();
void selected_multi();
void acceptedMouseButtons();
- void acceptsHoverEvents();
+ void acceptHoverEvents();
void childAcceptsHoverEvents();
void hasFocus();
void pos();
@@ -385,7 +385,9 @@ private slots:
void itemContainsChildrenInShape2();
void ancestorFlags();
void untransformable();
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEventPropagation();
+#endif // QT_NO_CONTEXTMENU
void itemIsMovable();
void boundingRegion_data();
void boundingRegion();
@@ -564,9 +566,9 @@ void tst_QGraphicsItem::construction()
QVERIFY(!item->isSelected());
QCOMPARE(item->acceptedMouseButtons(), Qt::MouseButtons(0x1f));
if (item->type() == QGraphicsTextItem::Type)
- QVERIFY(item->acceptsHoverEvents());
+ QVERIFY(item->acceptHoverEvents());
else
- QVERIFY(!item->acceptsHoverEvents());
+ QVERIFY(!item->acceptHoverEvents());
QVERIFY(!item->hasFocus());
QCOMPARE(item->pos(), QPointF());
QCOMPARE(item->matrix(), QMatrix());
@@ -1125,11 +1127,11 @@ void tst_QGraphicsItem::visible()
scene.addItem(item);
QVERIFY(item->isVisible());
- QCOMPARE(scene.itemAt(0, 0), item);
+ QCOMPARE(scene.items(QPointF(0, 0)).value(0, Q_NULLPTR), item);
item->setVisible(false);
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(0, 0)).isEmpty());
item->setVisible(true);
- QCOMPARE(scene.itemAt(0, 0), item);
+ QCOMPARE(scene.items(QPointF(0, 0)).value(0, Q_NULLPTR), item);
QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress);
event.setButton(Qt::LeftButton);
@@ -1930,7 +1932,7 @@ protected:
{ ++hoverOutCount; }
};
-void tst_QGraphicsItem::acceptsHoverEvents()
+void tst_QGraphicsItem::acceptHoverEvents()
{
QGraphicsScene scene;
HoverItem *item1 = new HoverItem(QRectF(-10, -10, 20, 20));
@@ -1939,10 +1941,10 @@ void tst_QGraphicsItem::acceptsHoverEvents()
scene.addItem(item2);
item2->setZValue(1);
- QVERIFY(!item1->acceptsHoverEvents());
- QVERIFY(!item2->acceptsHoverEvents());
- item1->setAcceptsHoverEvents(true);
- item2->setAcceptsHoverEvents(true);
+ QVERIFY(!item1->acceptHoverEvents());
+ QVERIFY(!item2->acceptHoverEvents());
+ item1->setAcceptHoverEvents(true);
+ item2->setAcceptHoverEvents(true);
QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseMove);
event.setScenePos(QPointF(-100, -100));
@@ -1953,8 +1955,8 @@ void tst_QGraphicsItem::acceptsHoverEvents()
QCOMPARE(item1->hoverInCount, 0);
QCOMPARE(item2->hoverInCount, 1);
- item1->setAcceptsHoverEvents(false);
- item2->setAcceptsHoverEvents(false);
+ item1->setAcceptHoverEvents(false);
+ item2->setAcceptHoverEvents(false);
event.setScenePos(QPointF(-100, -100));
QApplication::sendEvent(&scene, &event);
@@ -1964,8 +1966,8 @@ void tst_QGraphicsItem::acceptsHoverEvents()
QCOMPARE(item1->hoverInCount, 0);
QCOMPARE(item2->hoverInCount, 1);
- item1->setAcceptsHoverEvents(true);
- item2->setAcceptsHoverEvents(false);
+ item1->setAcceptHoverEvents(true);
+ item2->setAcceptHoverEvents(false);
event.setScenePos(QPointF(-100, -100));
QApplication::sendEvent(&scene, &event);
@@ -2168,27 +2170,27 @@ void tst_QGraphicsItem::matrix()
line.resetMatrix();
QCOMPARE(line.matrix(), QMatrix());
- line.rotate(90);
+ line.setTransform(QTransform().rotate(90), true);
QCOMPARE(line.matrix(), QMatrix().rotate(90));
- line.rotate(90);
+ line.setTransform(QTransform().rotate(90), true);
QCOMPARE(line.matrix(), QMatrix().rotate(90).rotate(90));
line.resetMatrix();
- line.scale(2, 4);
+ line.setTransform(QTransform::fromScale(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().scale(2, 4));
- line.scale(2, 4);
+ line.setTransform(QTransform::fromScale(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().scale(2, 4).scale(2, 4));
line.resetMatrix();
- line.shear(2, 4);
+ line.setTransform(QTransform().shear(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().shear(2, 4));
- line.shear(2, 4);
+ line.setTransform(QTransform().shear(2, 4), true);
QCOMPARE(line.matrix(), QMatrix().shear(2, 4).shear(2, 4));
line.resetMatrix();
- line.translate(10, 10);
+ line.setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(line.matrix(), QMatrix().translate(10, 10));
- line.translate(10, 10);
+ line.setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(line.matrix(), QMatrix().translate(10, 10).translate(10, 10));
line.resetMatrix();
}
@@ -2201,15 +2203,15 @@ void tst_QGraphicsItem::sceneMatrix()
QCOMPARE(parent->sceneMatrix(), QMatrix());
QCOMPARE(child->sceneMatrix(), QMatrix());
- parent->translate(10, 10);
+ parent->setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(parent->sceneMatrix(), QMatrix().translate(10, 10));
QCOMPARE(child->sceneMatrix(), QMatrix().translate(10, 10));
- child->translate(10, 10);
+ child->setTransform(QTransform::fromTranslate(10, 10), true);
QCOMPARE(parent->sceneMatrix(), QMatrix().translate(10, 10));
QCOMPARE(child->sceneMatrix(), QMatrix().translate(20, 20));
- parent->rotate(90);
+ parent->setTransform(QTransform().rotate(90), true);
QCOMPARE(parent->sceneMatrix(), QMatrix().translate(10, 10).rotate(90));
QCOMPARE(child->sceneMatrix(), QMatrix().translate(10, 10).rotate(90).translate(10, 10));
@@ -2645,7 +2647,7 @@ void tst_QGraphicsItem::isObscuredBy()
MyItem myitem1, myitem2;
myitem1.setRect(QRectF(50, 50, 40, 200));
- myitem1.rotate(67);
+ myitem1.setTransform(QTransform().rotate(67), true);
myitem2.setRect(QRectF(25, 25, 20, 20));
myitem2.setZValue(-1.0);
@@ -3271,7 +3273,7 @@ void tst_QGraphicsItem::hoverEventsGenerateRepaints()
EventTester *tester = new EventTester;
scene.addItem(tester);
- tester->setAcceptsHoverEvents(true);
+ tester->setAcceptHoverEvents(true);
QTRY_COMPARE(tester->repaints, 1);
@@ -3363,7 +3365,7 @@ void tst_QGraphicsItem::sceneBoundingRect()
QCOMPARE(item->boundingRect(), QRectF(0, 0, 100, 100));
QCOMPARE(item->sceneBoundingRect(), QRectF(100, 100, 100, 100));
- item->rotate(90);
+ item->setTransform(QTransform().rotate(90), true);
QCOMPARE(item->boundingRect(), QRectF(0, 0, 100, 100));
QCOMPARE(item->sceneBoundingRect(), QRectF(0, 100, 100, 100));
@@ -3391,7 +3393,7 @@ void tst_QGraphicsItem::childrenBoundingRect()
QGraphicsRectItem *childChild = scene.addRect(QRectF(0, 0, 100, 100), QPen(Qt::black, 0));
childChild->setParentItem(child);
childChild->setPos(500, 500);
- child->rotate(90);
+ child->setTransform(QTransform().rotate(90), true);
scene.addPolygon(parent->mapToScene(parent->boundingRect() | parent->childrenBoundingRect()))->setPen(QPen(Qt::red));;
@@ -3439,11 +3441,11 @@ void tst_QGraphicsItem::childrenBoundingRectTransformed()
QCOMPARE(subTreeRect.width(), qreal(351.7766952966369));
QCOMPARE(subTreeRect.height(), qreal(251.7766952966369));
- rect->rotate(45);
- rect2->rotate(-45);
- rect3->rotate(45);
- rect4->rotate(-45);
- rect5->rotate(45);
+ rect->setTransform(QTransform().rotate(45), true);
+ rect2->setTransform(QTransform().rotate(-45), true);
+ rect3->setTransform(QTransform().rotate(45), true);
+ rect4->setTransform(QTransform().rotate(-45), true);
+ rect5->setTransform(QTransform().rotate(45), true);
subTreeRect = rect->childrenBoundingRect();
QCOMPARE(rect->childrenBoundingRect(), QRectF(-100, 75, 275, 250));
@@ -3565,7 +3567,7 @@ void tst_QGraphicsItem::group()
QGraphicsRectItem *child = scene.addRect(QRectF(0, 0, 50, 50), QPen(Qt::black, 0), QBrush(Qt::blue));
QGraphicsRectItem *parent2 = scene.addRect(QRectF(0, 0, 50, 50), QPen(Qt::black, 0), QBrush(Qt::red));
parent2->setPos(-50, 50);
- child->rotate(45);
+ child->setTransform(QTransform().rotate(45), true);
child->setParentItem(parent);
parent->setPos(25, 25);
child->setPos(25, 25);
@@ -3614,7 +3616,7 @@ void tst_QGraphicsItem::group()
newItems << item;
item->setPos(-1000 + rand() % 2000,
-1000 + rand() % 2000);
- item->rotate(rand() % 90);
+ item->setTransform(QTransform().rotate(rand() % 90), true);
}
view.fitInView(scene.itemsBoundingRect());
@@ -3657,8 +3659,8 @@ void tst_QGraphicsItem::setGroup2()
rect->setTransformOriginPoint(50,50);
rect->setRotation(45);
rect->setScale(1.5);
- rect->translate(20,20);
- group.translate(-30,-40);
+ rect->setTransform(QTransform::fromTranslate(20,20), true);
+ group.setTransform(QTransform::fromTranslate(-30, -40), true);
group.setRotation(180);
group.setScale(0.5);
@@ -3711,7 +3713,7 @@ void tst_QGraphicsItem::warpChildrenIntoGroup()
QGraphicsScene scene;
QGraphicsRectItem *parentRectItem = scene.addRect(QRectF(0, 0, 100, 100));
QGraphicsRectItem *childRectItem = scene.addRect(QRectF(0, 0, 100, 100));
- parentRectItem->rotate(90);
+ parentRectItem->setTransform(QTransform().rotate(90), true);
childRectItem->setPos(-50, -25);
childRectItem->setParentItem(parentRectItem);
@@ -3720,7 +3722,7 @@ void tst_QGraphicsItem::warpChildrenIntoGroup()
QGraphicsRectItem *parentOfGroup = scene.addRect(QRectF(0, 0, 100, 100));
parentOfGroup->setPos(-200, -200);
- parentOfGroup->scale(2, 2);
+ parentOfGroup->setTransform(QTransform::fromScale(2, 2), true);
QGraphicsItemGroup *group = new QGraphicsItemGroup;
group->setPos(50, 50);
@@ -4128,9 +4130,9 @@ public:
font.setPointSize(4);
painter->setFont(font);
for (int x = -100; x < 100; x += 25) {
- for (int y = -100; y < 100; y += 25) {
- painter->drawText(QRectF(x, y, 25, 25), Qt::AlignCenter, QString("%1x%2").arg(x).arg(y));
- }
+ const QString prefix = QString::number(x) + QLatin1Char('x');
+ for (int y = -100; y < 100; y += 25)
+ painter->drawText(QRectF(x, y, 25, 25), Qt::AlignCenter, prefix + QString::number(y));
}
}
};
@@ -4633,7 +4635,7 @@ void tst_QGraphicsItem::itemChange()
// ItemTransformChange / ItemTransformHasChanged
tester.itemChangeReturnValue.setValue<QTransform>(QTransform().rotate(90));
- tester.translate(50, 0);
+ tester.setTransform(QTransform::fromTranslate(50, 0), true);
++changeCount; // notification sent too
++changeCount;
QCOMPARE(tester.changes.size(), changeCount);
@@ -5193,6 +5195,7 @@ public:
}
protected:
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent(QGraphicsSceneContextMenuEvent *)
{
if (harakiri == 3) {
@@ -5200,6 +5203,7 @@ protected:
delete this;
}
}
+#endif // QT_NO_CONTEXTMENU
void dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
@@ -5362,7 +5366,7 @@ void tst_QGraphicsItem::deleteItemInEventHandlers()
for (int i = 0; i < 17; ++i) {
QGraphicsScene scene;
HarakiriItem *item = new HarakiriItem(i);
- item->setAcceptsHoverEvents(true);
+ item->setAcceptHoverEvents(true);
item->setFlag(QGraphicsItem::ItemIsFocusable);
scene.addItem(item);
@@ -5378,11 +5382,13 @@ void tst_QGraphicsItem::deleteItemInEventHandlers()
if (!item->dead)
scene.advance();
+#ifndef QT_NO_CONTEXTMENU
if (!item->dead) {
QContextMenuEvent event(QContextMenuEvent::Other,
view.mapFromScene(item->scenePos()));
QCoreApplication::sendEvent(view.viewport(), &event);
}
+#endif // QT_NO_CONTEXTMENU
if (!item->dead)
QTest::mouseMove(view.viewport(), view.mapFromScene(item->scenePos()));
if (!item->dead)
@@ -5514,16 +5520,16 @@ void tst_QGraphicsItem::itemClipsChildrenToShape2()
QGraphicsScene scene;
scene.addItem(parent);
- QCOMPARE(scene.itemAt(5, 5), (QGraphicsItem *)parent);
- QCOMPARE(scene.itemAt(15, 5), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(5, 15), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(60, 60), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(140, 60), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(60, 140), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(140, 140), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(75, 75), (QGraphicsItem *)child2);
- QCOMPARE(scene.itemAt(75, 100), (QGraphicsItem *)child1);
- QCOMPARE(scene.itemAt(100, 75), (QGraphicsItem *)child1);
+ QCOMPARE(scene.items(QPointF(5, 5)).value(0, Q_NULLPTR), (QGraphicsItem *)parent);
+ QVERIFY(scene.items(QPointF(15, 5)).isEmpty());
+ QVERIFY(scene.items(QPointF(5, 15)).isEmpty());
+ QVERIFY(scene.items(QPointF(60, 60)).isEmpty());
+ QVERIFY(scene.items(QPointF(140, 60)).isEmpty());
+ QVERIFY(scene.items(QPointF(60, 140)).isEmpty());
+ QVERIFY(scene.items(QPointF(140, 140)).isEmpty());
+ QCOMPARE(scene.items(QPointF(75, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)child2);
+ QCOMPARE(scene.items(QPointF(75, 100)).value(0, Q_NULLPTR), (QGraphicsItem *)child1);
+ QCOMPARE(scene.items(QPointF(100, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)child1);
QImage image(100, 100, QImage::Format_ARGB32_Premultiplied);
image.fill(0);
@@ -5558,20 +5564,20 @@ void tst_QGraphicsItem::itemClipsChildrenToShape3()
grandchild->setPos( 50, 50 );
parent->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
- QCOMPARE(scene.itemAt(25,25), (QGraphicsItem *)parent);
- QCOMPARE(scene.itemAt(75,75), (QGraphicsItem *)child);
- QCOMPARE(scene.itemAt(125,125), (QGraphicsItem *)grandchild);
- QCOMPARE(scene.itemAt(175,175), (QGraphicsItem *)0);
+ QCOMPARE(scene.items(QPointF(25, 25)).value(0, Q_NULLPTR), (QGraphicsItem *)parent);
+ QCOMPARE(scene.items(QPointF(75, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)child);
+ QCOMPARE(scene.items(QPointF(125, 125)).value(0, Q_NULLPTR), (QGraphicsItem *)grandchild);
+ QVERIFY(scene.items(QPointF(175, 175)).isEmpty());
// Move child to fully overlap the parent. The grandchild should
// now occupy two-thirds of the scene
child->prepareGeometryChange();
child->setPos( 0, 0 );
- QCOMPARE(scene.itemAt(25,25), (QGraphicsItem *)child);
- QCOMPARE(scene.itemAt(75,75), (QGraphicsItem *)grandchild);
- QCOMPARE(scene.itemAt(125,125), (QGraphicsItem *)grandchild);
- QCOMPARE(scene.itemAt(175,175), (QGraphicsItem *)0);
+ QCOMPARE(scene.items(QPointF(25, 25)).value(0, Q_NULLPTR), (QGraphicsItem *)child);
+ QCOMPARE(scene.items(QPointF(75, 75)).value(0, Q_NULLPTR), (QGraphicsItem *)grandchild);
+ QCOMPARE(scene.items(QPointF(125, 125)).value(0, Q_NULLPTR), (QGraphicsItem *)grandchild);
+ QVERIFY(scene.items(QPointF(175, 175)).isEmpty());
}
class MyProxyWidget : public QGraphicsProxyWidget
@@ -5843,17 +5849,17 @@ void tst_QGraphicsItem::itemClippingDiscovery()
rightRectItem->setParentItem(clipItem);
// The rects item are both visible at these points.
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)leftRectItem);
- QCOMPARE(scene.itemAt(90, 90), (QGraphicsItem *)rightRectItem);
+ QCOMPARE(scene.items(QPointF(10, 10)).value(0, Q_NULLPTR), (QGraphicsItem *)leftRectItem);
+ QCOMPARE(scene.items(QPointF(90, 90)).value(0, Q_NULLPTR), (QGraphicsItem *)rightRectItem);
// The ellipse clips the rects now.
clipItem->setFlag(QGraphicsItem::ItemClipsChildrenToShape);
// The rect items are no longer visible at these points.
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
if (sizeof(qreal) != sizeof(double))
QSKIP("This fails due to internal rounding errors");
- QCOMPARE(scene.itemAt(90, 90), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(90, 90)).isEmpty());
}
class ItemCountsBoundingRectCalls : public QGraphicsRectItem
@@ -5884,7 +5890,7 @@ void tst_QGraphicsItem::itemContainsChildrenInShape()
int oldChildBoundingRectCalls = childOutsideShape->boundingRectCalls;
// First test that both items are searched if no optimization flags are set
- QGraphicsItem* item = scene.itemAt(25,5);
+ QGraphicsItem* item = scene.items(QPointF(25, 5)).value(0, Q_NULLPTR);
QCOMPARE(item, childOutsideShape);
QVERIFY(parent->boundingRectCalls > oldParentBoundingRectCalls);
@@ -5895,7 +5901,7 @@ void tst_QGraphicsItem::itemContainsChildrenInShape()
oldChildBoundingRectCalls = childOutsideShape->boundingRectCalls;
// Repeat the test to make sure that no caching/indexing is in effect
- item = scene.itemAt(25,5);
+ item = scene.items(QPointF(25, 5)).value(0, Q_NULLPTR);
QCOMPARE(item, childOutsideShape);
QVERIFY(parent->boundingRectCalls > oldParentBoundingRectCalls);
@@ -5908,7 +5914,7 @@ void tst_QGraphicsItem::itemContainsChildrenInShape()
// Set the optimization flag and make sure that the child is not returned
// and that the child's boundingRect() method is never called.
parent->setFlag(QGraphicsItem::ItemContainsChildrenInShape);
- item = scene.itemAt(25,5);
+ item = scene.items(QPointF(25, 5)).value(0, Q_NULLPTR);
QVERIFY(!(item));
QVERIFY(parent->boundingRectCalls > oldParentBoundingRectCalls);
@@ -6216,12 +6222,12 @@ void tst_QGraphicsItem::untransformable()
QGraphicsItem *item1 = new QGraphicsEllipseItem(QRectF(-50, -50, 100, 100));
item1->setZValue(1);
item1->setFlag(QGraphicsItem::ItemIgnoresTransformations);
- item1->rotate(45);
+ item1->setTransform(QTransform().rotate(45), true);
((QGraphicsEllipseItem *)item1)->setBrush(Qt::red);
QGraphicsItem *item2 = new QGraphicsEllipseItem(QRectF(-50, -50, 100, 100));
item2->setParentItem(item1);
- item2->rotate(45);
+ item2->setTransform(QTransform().rotate(45), true);
item2->setPos(100, 0);
((QGraphicsEllipseItem *)item2)->setBrush(Qt::green);
@@ -6276,6 +6282,7 @@ void tst_QGraphicsItem::untransformable()
}
}
+#ifndef QT_NO_CONTEXTMENU
class ContextMenuItem : public QGraphicsRectItem
{
public:
@@ -6339,6 +6346,7 @@ void tst_QGraphicsItem::contextMenuEventPropagation()
QCOMPARE(bottomItem->gotEvent, false);
QCOMPARE(topItem->eventWasAccepted, true);
}
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsItem::itemIsMovable()
{
@@ -6460,10 +6468,11 @@ void tst_QGraphicsItem::task177918_lineItemUndetected()
QGraphicsLineItem *line = scene.addLine(10, 10, 10, 10);
QCOMPARE(line->boundingRect(), QRectF(10, 10, 0, 0));
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::IntersectsItemShape).isEmpty());
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::ContainsItemShape).isEmpty());
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::IntersectsItemBoundingRect).isEmpty());
- QVERIFY(!scene.items(9, 9, 2, 2, Qt::ContainsItemBoundingRect).isEmpty());
+ const QRectF rect(9, 9, 2, 2);
+ QVERIFY(!scene.items(rect, Qt::IntersectsItemShape).isEmpty());
+ QVERIFY(!scene.items(rect, Qt::ContainsItemShape).isEmpty());
+ QVERIFY(!scene.items(rect, Qt::IntersectsItemBoundingRect).isEmpty());
+ QVERIFY(!scene.items(rect, Qt::ContainsItemBoundingRect).isEmpty());
}
void tst_QGraphicsItem::task240400_clickOnTextItem_data()
@@ -6699,8 +6708,8 @@ void tst_QGraphicsItem::itemTransform_parentChild()
QGraphicsItem *child = scene.addRect(0, 0, 100, 100);
child->setParentItem(parent);
child->setPos(10, 10);
- child->scale(2, 2);
- child->rotate(90);
+ child->setTransform(QTransform::fromScale(2, 2), true);
+ child->setTransform(QTransform().rotate(90), true);
QCOMPARE(child->itemTransform(parent).map(QPointF(10, 10)), QPointF(-10, 30));
QCOMPARE(parent->itemTransform(child).map(QPointF(-10, 30)), QPointF(10, 10));
@@ -6712,19 +6721,19 @@ void tst_QGraphicsItem::itemTransform_siblings()
QGraphicsItem *parent = scene.addRect(0, 0, 100, 100);
QGraphicsItem *brother = scene.addRect(0, 0, 100, 100);
QGraphicsItem *sister = scene.addRect(0, 0, 100, 100);
- parent->scale(10, 5);
- parent->rotate(-180);
- parent->shear(2, 3);
+ parent->setTransform(QTransform::fromScale(10, 5), true);
+ parent->setTransform(QTransform().rotate(-180), true);
+ parent->setTransform(QTransform().shear(2, 3), true);
brother->setParentItem(parent);
sister->setParentItem(parent);
brother->setPos(10, 10);
- brother->scale(2, 2);
- brother->rotate(90);
+ brother->setTransform(QTransform::fromScale(2, 2), true);
+ brother->setTransform(QTransform().rotate(90), true);
sister->setPos(10, 10);
- sister->scale(2, 2);
- sister->rotate(90);
+ sister->setTransform(QTransform::fromScale(2, 2), true);
+ sister->setTransform(QTransform().rotate(90), true);
QCOMPARE(brother->itemTransform(sister).map(QPointF(10, 10)), QPointF(10, 10));
QCOMPARE(sister->itemTransform(brother).map(QPointF(10, 10)), QPointF(10, 10));
@@ -6736,11 +6745,11 @@ void tst_QGraphicsItem::itemTransform_unrelated()
QGraphicsItem *stranger1 = scene.addRect(0, 0, 100, 100);
QGraphicsItem *stranger2 = scene.addRect(0, 0, 100, 100);
stranger1->setPos(10, 10);
- stranger1->scale(2, 2);
- stranger1->rotate(90);
+ stranger1->setTransform(QTransform::fromScale(2, 2), true);
+ stranger1->setTransform(QTransform().rotate(90), true);
stranger2->setPos(10, 10);
- stranger2->scale(2, 2);
- stranger2->rotate(90);
+ stranger2->setTransform(QTransform::fromScale(2, 2), true);
+ stranger2->setTransform(QTransform().rotate(90), true);
QCOMPARE(stranger1->itemTransform(stranger2).map(QPointF(10, 10)), QPointF(10, 10));
QCOMPARE(stranger2->itemTransform(stranger1).map(QPointF(10, 10)), QPointF(10, 10));
@@ -7022,7 +7031,8 @@ void tst_QGraphicsItem::itemStacksBehindParent()
paintedItems.clear();
view.viewport()->update();
QApplication::processEvents();
- QTRY_COMPARE(scene.items(0, 0, 100, 100), (QList<QGraphicsItem *>()
+ QRectF rect(0, 0, 100, 100);
+ QTRY_COMPARE(scene.items(rect), (QList<QGraphicsItem *>()
<< grandChild111 << child11
<< grandChild121 << child12 << parent1
<< grandChild211 << child21
@@ -7038,7 +7048,7 @@ void tst_QGraphicsItem::itemStacksBehindParent()
paintedItems.clear();
QApplication::processEvents();
- QTRY_COMPARE(scene.items(0, 0, 100, 100), (QList<QGraphicsItem *>()
+ QTRY_COMPARE(scene.items(rect), (QList<QGraphicsItem *>()
<< grandChild121 << child12 << parent1
<< grandChild111 << child11
<< grandChild211 << child21
@@ -7054,7 +7064,7 @@ void tst_QGraphicsItem::itemStacksBehindParent()
scene.update();
QApplication::processEvents();
- QTRY_COMPARE(scene.items(0, 0, 100, 100), (QList<QGraphicsItem *>()
+ QTRY_COMPARE(scene.items(rect), (QList<QGraphicsItem *>()
<< parent1 << grandChild111 << child11
<< grandChild121 << child12
<< grandChild211 << child21
@@ -7221,12 +7231,12 @@ void tst_QGraphicsItem::sceneTransformCache()
QGraphicsRectItem *rect2 = scene.addRect(0, 0, 100, 100);
rect2->setPen(QPen(Qt::black, 0));
rect2->setParentItem(rect);
- rect2->rotate(90);
- rect->translate(0, 50);
+ rect2->setTransform(QTransform().rotate(90), true);
+ rect->setTransform(QTransform::fromTranslate(0, 50), true);
QGraphicsView view(&scene);
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
- rect->translate(0, 100);
+ rect->setTransform(QTransform::fromTranslate(0, 100), true);
QTransform x;
x.translate(0, 150);
x.rotate(90);
@@ -7390,14 +7400,14 @@ void tst_QGraphicsItem::cacheMode()
QCOMPARE(testerChild2->repaints, 2);
// Translating does not result in a repaint.
- tester->translate(10, 10);
+ tester->setTransform(QTransform::fromTranslate(10, 10), true);
QTest::qWait(25);
QTRY_COMPARE(tester->repaints, 2);
QCOMPARE(testerChild->repaints, 2);
QCOMPARE(testerChild2->repaints, 2);
// Rotating results in a repaint.
- tester->rotate(45);
+ tester->setTransform(QTransform().rotate(45), true);
QTest::qWait(25);
QTRY_COMPARE(tester->repaints, 3);
QCOMPARE(testerChild->repaints, 3);
@@ -7413,9 +7423,9 @@ void tst_QGraphicsItem::cacheMode()
QCOMPARE(testerChild2->repaints, 3);
// Rotating items with ItemCoordinateCache doesn't cause a repaint.
- tester->rotate(22);
- testerChild->rotate(22);
- testerChild2->rotate(22);
+ tester->setTransform(QTransform().rotate(22), true);
+ testerChild->setTransform(QTransform().rotate(22), true);
+ testerChild2->setTransform(QTransform().rotate(22), true);
QTest::qWait(25);
QTRY_COMPARE(tester->repaints, 4);
QTRY_COMPARE(testerChild->repaints, 4);
@@ -7648,7 +7658,9 @@ public:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0)
{
QGraphicsRectItem::paint(painter, option, widget);
- painter->drawText(boundingRect(), Qt::AlignCenter, QString("%1x%2\n%3x%4").arg(p.x()).arg(p.y()).arg(sp.x()).arg(sp.y()));
+ const QString text = QString::number(p.x()) + QLatin1Char('x') + QString::number(p.y())
+ + QLatin1Char('\n') + QString::number(sp.x()) + QLatin1Char('x') + QString::number(sp.y());
+ painter->drawText(boundingRect(), Qt::AlignCenter, text);
}
protected:
@@ -7728,9 +7740,9 @@ void tst_QGraphicsItem::deviceTransform()
rect1->setPos(100, 100);
rect2->setPos(100, 100);
rect3->setPos(100, 100);
- rect1->rotate(rotation1);
- rect2->rotate(rotation2);
- rect3->rotate(rotation3);
+ rect1->setTransform(QTransform().rotate(rotation1), true);
+ rect2->setTransform(QTransform().rotate(rotation2), true);
+ rect3->setTransform(QTransform().rotate(rotation3), true);
rect1->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable1);
rect2->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable2);
rect3->setFlag(QGraphicsItem::ItemIgnoresTransformations, untransformable3);
@@ -7863,14 +7875,14 @@ void tst_QGraphicsItem::update()
expectedRegion = itemDeviceBoundingRect.adjusted(-2, -2, 2, 2);
view.reset();
item->repaints = 0;
- parent->translate(-400, 0);
+ parent->setTransform(QTransform::fromTranslate(-400, 0), true);
qApp->processEvents();
QCOMPARE(item->repaints, 0);
QCOMPARE(view.repaints, 1);
QCOMPARE(view.paintedRegion, expectedRegion);
view.reset();
item->repaints = 0;
- parent->translate(400, 0);
+ parent->setTransform(QTransform::fromTranslate(400, 0), true);
qApp->processEvents();
QCOMPARE(item->repaints, 1);
QCOMPARE(view.repaints, 1);
@@ -8170,7 +8182,7 @@ void tst_QGraphicsItem::moveItem()
RESET_COUNTERS
- parent->translate(20, 20);
+ parent->setTransform(QTransform::fromTranslate(20, 20), true);
qApp->processEvents();
QCOMPARE(parent->repaints, 1);
QCOMPARE(child->repaints, 1);
@@ -8236,10 +8248,11 @@ void tst_QGraphicsItem::sorting()
QGraphicsScene scene;
QGraphicsItem *grid[100][100];
for (int x = 0; x < 100; ++x) {
+ const QString prefix = QString::number(x) + QLatin1Char('x');
for (int y = 0; y < 100; ++y) {
PainterItem *item = new PainterItem;
item->setPos(x * 25, y * 25);
- item->setData(0, QString("%1x%2").arg(x).arg(y));
+ item->setData(0, prefix + QString::number(y));
grid[x][y] = item;
scene.addItem(item);
}
@@ -11641,12 +11654,12 @@ void tst_QGraphicsItem::QTBUG_21618_untransformable_sceneTransform()
QGraphicsItem *item1 = scene.addRect(0, 0, 100, 100, QPen(), Qt::red);
item1->setPos(50, 50);
- item1->translate(50, 50);
- item1->rotate(90);
+ item1->setTransform(QTransform::fromTranslate(50, 50), true);
+ item1->setTransform(QTransform().rotate(90), true);
QGraphicsItem *item2 = scene.addRect(0, 0, 100, 100, QPen(), Qt::green);
item2->setPos(50, 50);
- item2->translate(50, 50);
- item2->rotate(90);
+ item2->setTransform(QTransform::fromTranslate(50, 50), true);
+ item2->setTransform(QTransform().rotate(90), true);
item2->setFlags(QGraphicsItem::ItemIgnoresTransformations);
QGraphicsRectItem *item1_topleft = new QGraphicsRectItem(QRectF(-2, -2, 4, 4));
diff --git a/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro b/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro
index 484f4ba5f8..3515d259d0 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsitemanimation/qgraphicsitemanimation.pro
@@ -3,5 +3,4 @@ TARGET = tst_qgraphicsitemanimation
QT += widgets testlib
SOURCES += tst_qgraphicsitemanimation.cpp
DEFINES += QT_NO_CAST_TO_ASCII
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro b/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
index 254a91ef6a..1be43692d5 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicslayout/qgraphicslayout.pro
@@ -7,4 +7,3 @@ TARGET = tst_qgraphicslayout
QT += widgets testlib
SOURCES += tst_qgraphicslayout.cpp
DEFINES += QT_USE_USING_NAMESPACE
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro
index ef5cc36d05..e4a970201a 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/qgraphicslayoutitem.pro
@@ -2,5 +2,4 @@ CONFIG += testcase
TARGET = tst_qgraphicslayoutitem
QT += widgets testlib
SOURCES += tst_qgraphicslayoutitem.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp
index c291f09def..43993f6dbc 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicslayoutitem/tst_qgraphicslayoutitem.cpp
@@ -146,7 +146,7 @@ void tst_QGraphicsLayoutItem::effectiveSizeHint_data()
QTest::addColumn<Qt::SizeHint>("sizeHint");
QTest::addColumn<QSizeF>("constraint");
for (int i = 0; i < 15; ++i) {
- QTestData &data = QTest::newRow(QString("%1").arg(i).toLatin1());
+ QTestData &data = QTest::newRow(QByteArray::number(i).constData());
switch(i % 5) {
case 0: data << Qt::MinimumSize; break;
case 1: data << Qt::PreferredSize; break;
diff --git a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
index 8bebd4eddd..d0aacf5dad 100644
--- a/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicslinearlayout/tst_qgraphicslinearlayout.cpp
@@ -425,10 +425,11 @@ void tst_QGraphicsLinearLayout::dump_data()
QTest::addColumn<int>("itemCount");
QTest::addColumn<int>("layoutCount");
for (int i = -1; i < 3; ++i) {
- QTest::newRow(QString("%1, 0, 0").arg(i).toLatin1()) << 0 << 0;
- QTest::newRow(QString("%1, 0, 5").arg(i).toLatin1()) << 5 << 5;
- QTest::newRow(QString("%1, 5, 0").arg(i).toLatin1()) << 5 << 5;
- QTest::newRow(QString("%1, 5, 5").arg(i).toLatin1()) << 5 << 5;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow((iB + ", 0, 0").constData()) << 0 << 0;
+ QTest::newRow((iB + ", 0, 5").constData()) << 5 << 5;
+ QTest::newRow((iB + ", 5, 0").constData()) << 5 << 5;
+ QTest::newRow((iB + ", 5, 5").constData()) << 5 << 5;
}
}
@@ -511,11 +512,13 @@ void tst_QGraphicsLinearLayout::insertItem_data()
QTest::addColumn<int>("insertItemAt");
QTest::addColumn<bool>("isWidget");
for (int i = -1; i < 4; ++i) {
+ const QByteArray iB = QByteArray::number(i);
for (int j = 0; j < 2; ++j) {
- QTest::newRow(QString("0, 0, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 0 << i << (bool)j;
- QTest::newRow(QString("1, 0, %1 %2").arg(i).arg(j).toLatin1()) << 1 << 0 << i << (bool)j;
- QTest::newRow(QString("0, 1, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 1 << i << (bool)j;
- QTest::newRow(QString("2, 2, %1 %2").arg(i).arg(j).toLatin1()) << 2 << 2 << i << (bool)j;
+ const QByteArray postFix = iB + ' ' + QByteArray::number(j);
+ QTest::newRow(("0, 0, " + postFix).constData()) << 0 << 0 << i << (bool)j;
+ QTest::newRow(("1, 0, " + postFix).constData()) << 1 << 0 << i << (bool)j;
+ QTest::newRow(("0, 1, " + postFix).constData()) << 0 << 1 << i << (bool)j;
+ QTest::newRow(("2, 2, " + postFix).constData()) << 2 << 2 << i << (bool)j;
}
}
}
@@ -565,11 +568,13 @@ void tst_QGraphicsLinearLayout::insertStretch_data()
QTest::addColumn<int>("insertItemAt");
QTest::addColumn<int>("stretch");
for (int i = -1; i < 4; ++i) {
+ const QByteArray iB = QByteArray::number(i);
for (int j = 0; j < 2; ++j) {
- QTest::newRow(QString("0, 0, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 0 << i << j;
- QTest::newRow(QString("1, 0, %1 %2").arg(i).arg(j).toLatin1()) << 1 << 0 << i << j;
- QTest::newRow(QString("0, 1, %1 %2").arg(i).arg(j).toLatin1()) << 0 << 1 << i << j;
- QTest::newRow(QString("2, 2, %1 %2").arg(i).arg(j).toLatin1()) << 2 << 2 << i << j;
+ const QByteArray postFix = iB + ' ' + QByteArray::number(j);
+ QTest::newRow(("0, 0, " + postFix).constData()) << 0 << 0 << i << j;
+ QTest::newRow(("1, 0, " + postFix).constData()) << 1 << 0 << i << j;
+ QTest::newRow(("0, 1, " + postFix).constData()) << 0 << 1 << i << j;
+ QTest::newRow(("2, 2, " + postFix).constData()) << 2 << 2 << i << j;
}
}
}
@@ -786,12 +791,13 @@ void tst_QGraphicsLinearLayout::removeAt_data()
QTest::addColumn<int>("removeItemAt");
QTest::addColumn<Qt::Orientation>("orientation");
for (int i = -1; i < 4; ++i) {
+ const QByteArray iB = QByteArray::number(i);
for (int k = 0; k < 2; ++k) {
Qt::Orientation orientation = (k == 0) ? Qt::Vertical : Qt::Horizontal;
- QTest::newRow(QString("0, 0, %1").arg(i).toLatin1()) << 0 << 0 << i << orientation;
- QTest::newRow(QString("1, 0, %1").arg(i).toLatin1()) << 1 << 0 << i << orientation;
- QTest::newRow(QString("0, 1, %1").arg(i).toLatin1()) << 0 << 1 << i << orientation;
- QTest::newRow(QString("2, 2, %1").arg(i).toLatin1()) << 2 << 2 << i << orientation;
+ QTest::newRow(("0, 0, " + iB).constData()) << 0 << 0 << i << orientation;
+ QTest::newRow(("1, 0, " + iB).constData()) << 1 << 0 << i << orientation;
+ QTest::newRow(("0, 1, " + iB).constData()) << 0 << 1 << i << orientation;
+ QTest::newRow(("2, 2, " + iB).constData()) << 2 << 2 << i << orientation;
}
}
}
@@ -840,10 +846,11 @@ void tst_QGraphicsLinearLayout::removeItem_data()
QTest::addColumn<int>("layoutCount");
QTest::addColumn<int>("removeItemAt");
for (int i = -1; i < 4; ++i) {
- QTest::newRow(QString("0, 0, %1").arg(i).toLatin1()) << 0 << 0 << i;
- QTest::newRow(QString("1, 0, %1").arg(i).toLatin1()) << 1 << 0 << i;
- QTest::newRow(QString("0, 1, %1").arg(i).toLatin1()) << 0 << 1 << i;
- QTest::newRow(QString("2, 2, %1").arg(i).toLatin1()) << 2 << 2 << i;
+ const QByteArray iB = QByteArray::number(i);
+ QTest::newRow(("0, 0, " + iB).constData()) << 0 << 0 << i;
+ QTest::newRow(("1, 0, " + iB).constData()) << 1 << 0 << i;
+ QTest::newRow(("0, 1, " + iB).constData()) << 0 << 1 << i;
+ QTest::newRow(("2, 2, " + iB).constData()) << 2 << 2 << i;
}
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro b/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro
index 60f09c2228..483f123fa7 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsobject/qgraphicsobject.pro
@@ -5,4 +5,3 @@ QT += widgets testlib
QT += core-private
SOURCES += tst_qgraphicsobject.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro b/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro
index 6452e39c56..123f1050ec 100644
--- a/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicspixmapitem/qgraphicspixmapitem.pro
@@ -2,5 +2,4 @@ CONFIG += testcase
TARGET = tst_qgraphicspixmapitem
QT += widgets testlib
SOURCES += tst_qgraphicspixmapitem.cpp
-CONFIG += parallel_test
diff --git a/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro b/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro
index bca0ecc20c..89847e9ed2 100644
--- a/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicspolygonitem/qgraphicspolygonitem.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qgraphicspolygonitem
QT += widgets testlib
SOURCES += tst_qgraphicspolygonitem.cpp
-CONFIG += parallel_test
-
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
index 38fef51394..e7bcccb495 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/qgraphicsproxywidget.pro
@@ -6,4 +6,3 @@ QT += core-private gui-private
SOURCES += tst_qgraphicsproxywidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
index 8760dc176c..10708c0dd7 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsproxywidget/tst_qgraphicsproxywidget.cpp
@@ -162,7 +162,9 @@ private slots:
void fontPropagation();
void dontCrashWhenDie();
void createProxyForChildWidget();
+#ifndef QT_NO_CONTEXTMENU
void actionsContextMenu();
+#endif // QT_NO_CONTEXTMENU
void actionsContextMenu_data();
void deleteProxyForChildWidget();
void bypassGraphicsProxyWidget_data();
@@ -492,7 +494,7 @@ void tst_QGraphicsProxyWidget::setWidget()
QCOMPARE(proxy->rect().toRect(), widget->rect());
QCOMPARE(proxy->focusPolicy(), Qt::WheelFocus);
QVERIFY(proxy->acceptDrops());
- QCOMPARE(proxy->acceptsHoverEvents(), true); // to get widget enter events
+ QCOMPARE(proxy->acceptHoverEvents(), true); // to get widget enter events
int left, top, right, bottom;
widget->getContentsMargins(&left, &top, &right, &bottom);
qreal rleft, rtop, rright, rbottom;
@@ -541,14 +543,15 @@ void tst_QGraphicsProxyWidget::testEventFilter_data()
QTest::newRow("none") << QEvent::None << false;
for (int i = 0; i < 2; ++i) {
bool fromObject = (i == 0);
- QTest::newRow(QString("resize %1").arg(fromObject).toLatin1()) << QEvent::Resize << fromObject;
- QTest::newRow(QString("move %1").arg(fromObject).toLatin1()) << QEvent::Move << fromObject;
- QTest::newRow(QString("hide %1").arg(fromObject).toLatin1()) << QEvent::Hide << fromObject;
- QTest::newRow(QString("show %1").arg(fromObject).toLatin1()) << QEvent::Show << fromObject;
- QTest::newRow(QString("enabled %1").arg(fromObject).toLatin1()) << QEvent::EnabledChange << fromObject;
- QTest::newRow(QString("focusIn %1").arg(fromObject).toLatin1()) << QEvent::FocusIn << fromObject;
- QTest::newRow(QString("focusOut %1").arg(fromObject).toLatin1()) << QEvent::FocusOut << fromObject;
- QTest::newRow(QString("keyPress %1").arg(fromObject).toLatin1()) << QEvent::KeyPress << fromObject;
+ const char fromObjectC = fromObject ? '1' : '0';
+ QTest::newRow((QByteArrayLiteral("resize ") + fromObjectC).constData()) << QEvent::Resize << fromObject;
+ QTest::newRow((QByteArrayLiteral("move ") + fromObjectC).constData()) << QEvent::Move << fromObject;
+ QTest::newRow((QByteArrayLiteral("hide ") + fromObjectC).constData()) << QEvent::Hide << fromObject;
+ QTest::newRow((QByteArrayLiteral("show ") + fromObjectC).constData()) << QEvent::Show << fromObject;
+ QTest::newRow((QByteArrayLiteral("enabled ") + fromObjectC).constData()) << QEvent::EnabledChange << fromObject;
+ QTest::newRow((QByteArrayLiteral("focusIn ") + fromObjectC).constData()) << QEvent::FocusIn << fromObject;
+ QTest::newRow((QByteArrayLiteral("focusOut ") + fromObjectC).constData()) << QEvent::FocusOut << fromObject;
+ QTest::newRow((QByteArrayLiteral("keyPress ") + fromObjectC).constData()) << QEvent::KeyPress << fromObject;
}
}
@@ -760,8 +763,10 @@ void tst_QGraphicsProxyWidget::focusNextPrevChild_data()
bool hasWidget = (j == 0);
bool hasScene = (k == 0);
bool result = hasScene && hasWidget;
- QString name = QString("Forward: %1, hasWidget: %2, hasScene: %3, result: %4").arg(next).arg(hasWidget).arg(hasScene).arg(result);
- QTest::newRow(name.toLatin1()) << hasWidget << hasScene << next << result;
+ QByteArray name = QByteArrayLiteral("Forward: ") + (next ? '1' : '0')
+ + ", hasWidget: " + (hasWidget ? '1' : '0') + ", hasScene: "
+ + (hasScene ? '1' : '0') + ", result: " + (result ? '1' : '0');
+ QTest::newRow(name.constData()) << hasWidget << hasScene << next << result;
}
}
}
@@ -1026,8 +1031,10 @@ void tst_QGraphicsProxyWidget::hoverMoveEvent_data()
bool hoverEnabled = (j == 0);
bool mouseTracking = (k == 0);
bool mouseDown = (l == 0);
- QString name = QString("hasWidget:%1, hover:%2, mouseTracking:%3, mouseDown: %4").arg(hasWidget).arg(hoverEnabled).arg(mouseTracking).arg(mouseDown);
- QTest::newRow(name.toLatin1()) << hasWidget << hoverEnabled << mouseTracking << mouseDown;
+ QByteArray name = QByteArrayLiteral("hasWidget:") + (hasWidget ? '1' : '0') + ", hover:"
+ + (hoverEnabled ? '1' : '0') + ", mouseTracking:"
+ + (mouseTracking ? '1' : '0') + ", mouseDown: " + (mouseDown ? '1' : '0');
+ QTest::newRow(name.constData()) << hasWidget << hoverEnabled << mouseTracking << mouseDown;
}
}
}
@@ -3072,6 +3079,7 @@ void tst_QGraphicsProxyWidget::createProxyForChildWidget()
delete boxProxy;
}
+#ifndef QT_NO_CONTEXTMENU
class ContextMenuWidget : public QLabel
{
Q_OBJECT
@@ -3120,6 +3128,7 @@ private:
bool m_embeddedPopupSet;
QTimer *m_timer;
};
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsProxyWidget::actionsContextMenu_data()
{
@@ -3132,6 +3141,7 @@ void tst_QGraphicsProxyWidget::actionsContextMenu_data()
QTest::newRow("with actionsContextMenu without focus") << true << false;
}
+#ifndef QT_NO_CONTEXTMENU
void tst_QGraphicsProxyWidget::actionsContextMenu()
{
QFETCH(bool, hasFocus);
@@ -3186,7 +3196,7 @@ void tst_QGraphicsProxyWidget::actionsContextMenu()
}
}
-
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsProxyWidget::deleteProxyForChildWidget()
{
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
index 25a43d6821..1a775d8b16 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/qgraphicsscene.pro
@@ -17,4 +17,3 @@ wince* {
DEPLOYMENT += rootFiles renderFiles
DEFINES += SRCDIR=\\\".\\\"
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
index ae71b0412f..f494e4474c 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -108,7 +108,7 @@ class HoverItem : public QGraphicsRectItem
public:
HoverItem()
: QGraphicsRectItem(QRectF(-10, -10, 20, 20)), isHovered(false)
- { setAcceptsHoverEvents(true); }
+ { setAcceptHoverEvents(true); }
bool isHovered;
@@ -227,8 +227,10 @@ private slots:
void render_data();
void render();
void renderItemsWithNegativeWidthOrHeight();
+#ifndef QT_NO_CONTEXTMENU
void contextMenuEvent();
void contextMenuEvent_ItemIgnoresTransformations();
+#endif
void update();
void update2();
void views();
@@ -301,11 +303,16 @@ void tst_QGraphicsScene::construction()
QVERIFY(scene.items(QPainterPath()).isEmpty());
QTest::ignoreMessage(QtWarningMsg, "QGraphicsScene::collidingItems: cannot find collisions for null item");
QVERIFY(scene.collidingItems(0).isEmpty());
- QVERIFY(!scene.itemAt(QPointF()));
+ QVERIFY(scene.items(QPointF()).isEmpty());
QVERIFY(scene.selectedItems().isEmpty());
QVERIFY(!scene.focusItem());
}
+static inline const QGraphicsItem *itemAt(const QGraphicsScene &scene, qreal x, qreal y)
+{
+ return scene.items(QPointF(x, y)).value(0, Q_NULLPTR);
+}
+
void tst_QGraphicsScene::sceneRect()
{
QGraphicsScene scene;
@@ -318,8 +325,8 @@ void tst_QGraphicsScene::sceneRect()
item->setPos(-5, -5);
QCOMPARE(sceneRectChanged.count(), 0);
- QCOMPARE(scene.itemAt(0, 0), item);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), item);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
QCOMPARE(sceneRectChanged.count(), 0);
QCOMPARE(scene.sceneRect(), QRectF(-5, -5, 10, 10));
QCOMPARE(sceneRectChanged.count(), 1);
@@ -334,8 +341,8 @@ void tst_QGraphicsScene::sceneRect()
QCOMPARE(sceneRectChanged.count(), 3);
QCOMPARE(sceneRectChanged.last().at(0).toRectF(), scene.sceneRect());
- QCOMPARE(scene.itemAt(0, 0), item);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), item);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
QCOMPARE(scene.sceneRect(), QRectF(-100, -100, 10, 10));
item->setPos(10, 10);
QCOMPARE(scene.sceneRect(), QRectF(-100, -100, 10, 10));
@@ -344,8 +351,8 @@ void tst_QGraphicsScene::sceneRect()
scene.setSceneRect(QRectF());
- QCOMPARE(scene.itemAt(10, 10), item);
- QCOMPARE(scene.itemAt(20, 20), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 10, 10), item);
+ QVERIFY(scene.items(QPointF(20, 20)).isEmpty());
QCOMPARE(sceneRectChanged.count(), 4);
QCOMPARE(scene.sceneRect(), QRectF(-5, -5, 25, 25));
QCOMPARE(sceneRectChanged.count(), 5);
@@ -374,7 +381,7 @@ void tst_QGraphicsScene::itemIndexMethod()
for (int x = minX; x < maxX; x += 100) {
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 10, 10));
item->setPos(x, y);
- QCOMPARE(scene.itemAt(x, y), item);
+ QCOMPARE(itemAt(scene, x, y), item);
items << item;
}
}
@@ -382,7 +389,7 @@ void tst_QGraphicsScene::itemIndexMethod()
int n = 0;
for (int y = minY; y < maxY; y += 100) {
for (int x = minX; x < maxX; x += 100)
- QCOMPARE(scene.itemAt(x, y), items.at(n++));
+ QCOMPARE(itemAt(scene, x, y), items.at(n++));
}
scene.setItemIndexMethod(QGraphicsScene::NoIndex);
@@ -391,7 +398,7 @@ void tst_QGraphicsScene::itemIndexMethod()
n = 0;
for (int y = minY; y < maxY; y += 100) {
for (int x = minX; x < maxX; x += 100)
- QCOMPARE(scene.itemAt(x, y), items.at(n++));
+ QCOMPARE(itemAt(scene, x, y), items.at(n++));
}
scene.setItemIndexMethod(QGraphicsScene::BspTreeIndex);
@@ -400,7 +407,7 @@ void tst_QGraphicsScene::itemIndexMethod()
n = 0;
for (int y = minY; y < maxY; y += 100) {
for (int x = minX; x < maxX; x += 100)
- QCOMPARE(scene.itemAt(x, y), items.at(n++));
+ QCOMPARE(itemAt(scene, x, y), items.at(n++));
}
}
@@ -439,7 +446,7 @@ void tst_QGraphicsScene::items()
items << scene.addRect(QRectF(0, 0, 10, 10));
}
QCOMPARE(scene.items().size(), items.size());
- scene.itemAt(0, 0); // trigger indexing
+ itemAt(scene, 0, 0); // trigger indexing
scene.removeItem(items.at(5));
delete items.at(5);
@@ -458,8 +465,8 @@ void tst_QGraphicsScene::items()
QList<QGraphicsItem *> items;
items<<l1<<l2;
QCOMPARE(scene.items().size(), items.size());
- QVERIFY(scene.items(-1, -1, 2, 2).contains(l1));
- QVERIFY(scene.items(-1, -1, 2, 2).contains(l2));
+ QVERIFY(scene.items(QRectF(-1, -1, 2, 2)).contains(l1));
+ QVERIFY(scene.items(QRectF(-1, -1, 2, 2)).contains(l2));
}
}
@@ -722,7 +729,7 @@ void tst_QGraphicsScene::items_QRectF_2()
QGraphicsItem *item = scene.addEllipse(ellipseRect);
QCOMPARE(!scene.items(sceneRect, selectionMode).isEmpty(), contained);
- item->rotate(45);
+ item->setTransform(QTransform().rotate(45), true);
QCOMPARE(!scene.items(sceneRect, selectionMode).isEmpty(), containedRotated);
}
@@ -1085,19 +1092,19 @@ void tst_QGraphicsScene::addItem()
QTRY_VERIFY(view.repaints > 0);
view.repaints = 0;
- QCOMPARE(scene.itemAt(0, 0), path);
+ QCOMPARE(itemAt(scene, 0, 0), path);
QGraphicsItem *path2 = new QGraphicsEllipseItem(QRectF(-10, -10, 20, 20));
path2->setPos(100, 100);
- QCOMPARE(scene.itemAt(0, 0), path);
- QCOMPARE(scene.itemAt(100, 100), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), path);
+ QVERIFY(scene.items(QPointF(100, 100)).isEmpty());
scene.addItem(path2);
// Adding an item should always issue a repaint.
QTRY_VERIFY(view.repaints > 0);
- QCOMPARE(scene.itemAt(100, 100), path2);
+ QCOMPARE(itemAt(scene, 100, 100), path2);
}
{
// 2) Create scene, then item, then add item
@@ -1109,8 +1116,8 @@ void tst_QGraphicsScene::addItem()
path2->setPos(100, 100);
scene.addItem(path2);
- QCOMPARE(scene.itemAt(0, 0), path);
- QCOMPARE(scene.itemAt(100, 100), path2);
+ QCOMPARE(itemAt(scene, 0, 0), path);
+ QCOMPARE(itemAt(scene, 100, 100), path2);
}
}
@@ -1123,15 +1130,15 @@ void tst_QGraphicsScene::addEllipse()
QCOMPARE(ellipse->pen(), QPen(Qt::red));
QCOMPARE(ellipse->brush(), QBrush(Qt::blue));
QCOMPARE(ellipse->rect(), QRectF(-10, -10, 20, 20));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)ellipse);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(-10, -10)).isEmpty());
+ QCOMPARE(itemAt(scene, -9.9, 0), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QCOMPARE(itemAt(scene, 0, -9.9), (QGraphicsItem *)ellipse);
+ QCOMPARE(itemAt(scene, 0, 9.9), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QCOMPARE(itemAt(scene, 9.9, 0), (QGraphicsItem *)ellipse);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
}
void tst_QGraphicsScene::addLine()
@@ -1144,15 +1151,15 @@ void tst_QGraphicsScene::addLine()
QCOMPARE(line->pos(), QPointF());
QCOMPARE(line->pen(), pen);
QCOMPARE(line->line(), QLineF(-10, -10, 20, 20));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)line);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)line);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)line);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)line);
+ QCOMPARE(itemAt(scene, -10, -10), (QGraphicsItem *)line);
+ QVERIFY(scene.items(QPointF(-9.9, 0)).isEmpty());
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QVERIFY(scene.items(QPointF(0, -9.9)).isEmpty());
+ QVERIFY(scene.items(QPointF(0, 9.9)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QVERIFY(scene.items(QPointF(9.9, 0)).isEmpty());
+ QCOMPARE(itemAt(scene, 10, 10), (QGraphicsItem *)line);
}
void tst_QGraphicsScene::addPath()
@@ -1170,27 +1177,27 @@ void tst_QGraphicsScene::addPath()
path->setPen(QPen(Qt::red, 0));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 30), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(-9.9, 30), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(9.9, 30), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 20.1), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(0, 39.9), (QGraphicsItem *)path);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-10, 20), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10, 20), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, -9.9, 0), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 9.9, 0), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, -9.9), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 9.9), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 30), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, -9.9, 30), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 9.9, 30), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 20.1), (QGraphicsItem *)path);
+ QCOMPARE(itemAt(scene, 0, 39.9), (QGraphicsItem *)path);
+ QVERIFY(scene.items(QPointF(-10, -10)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
+ QVERIFY(scene.items(QPointF(-10, 20)).isEmpty());
+ QVERIFY(scene.items(QPointF(10, 20)).isEmpty());
if (sizeof(qreal) != sizeof(double))
QWARN("Skipping test because of rounding errors when qreal != double");
else
- QCOMPARE(scene.itemAt(-10, 30), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(10.1, 30), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(-10, 30)).isEmpty());
+ QVERIFY(scene.items(QPointF(10.1, 30)).isEmpty());
}
void tst_QGraphicsScene::addPixmap()
@@ -1201,16 +1208,17 @@ void tst_QGraphicsScene::addPixmap()
QCOMPARE(pixmap->pos(), QPointF());
QCOMPARE(pixmap->pixmap(), pix);
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(pix.width() - 1, 0), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(0, pix.height() - 1), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(pix.width() - 1, pix.height() - 1), (QGraphicsItem *)pixmap);
- QCOMPARE(scene.itemAt(-1, -1), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(pix.width() - 1, -1), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(-1, pix.height() - 1), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(pix.width(), pix.height()), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, pix.height()), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(pix.width(), 0), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)pixmap);
+ QCOMPARE(itemAt(scene, pix.width() - 1, 0), (QGraphicsItem *)pixmap);
+ QCOMPARE(itemAt(scene, 0, pix.height() - 1), (QGraphicsItem *)pixmap);
+ QCOMPARE(itemAt(scene, pix.width() - 1, pix.height() - 1), (QGraphicsItem *)pixmap);
+
+ QVERIFY(scene.items(QPointF(-1, -1)).isEmpty());
+ QVERIFY(scene.items(QPointF(pix.width() - 1, -1)).isEmpty());
+ QVERIFY(scene.items(QPointF(-1, pix.height() - 1)).isEmpty());
+ QVERIFY(scene.items(QPointF(pix.width(), pix.height())).isEmpty());
+ QVERIFY(scene.items(QPointF(0, pix.height())).isEmpty());
+ QVERIFY(scene.items(QPointF(pix.width(), 0)).isEmpty());
}
void tst_QGraphicsScene::addRect()
@@ -1225,15 +1233,15 @@ void tst_QGraphicsScene::addRect()
rect->setPen(QPen(Qt::red, 0));
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(-10, -10), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(-9.9, 0), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(-10, 10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(0, -9.9), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(0, 9.9), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(10, -10), (QGraphicsItem *)0);
- QCOMPARE(scene.itemAt(9.9, 0), (QGraphicsItem *)rect);
- QCOMPARE(scene.itemAt(10, 10), (QGraphicsItem *)0);
+ QCOMPARE(itemAt(scene, 0, 0), (QGraphicsItem *)rect);
+ QCOMPARE(itemAt(scene, -10, -10), (QGraphicsItem *)rect);
+ QCOMPARE(itemAt(scene, -9.9, 0), (QGraphicsItem *)rect);
+ QVERIFY(scene.items(QPointF(-10, 10)).isEmpty());
+ QCOMPARE(itemAt(scene, 0, -9.9), (QGraphicsItem *)rect);
+ QCOMPARE(itemAt(scene, 0, 9.9), (QGraphicsItem *)rect);
+ QVERIFY(scene.items(QPointF(10, -10)).isEmpty());
+ QCOMPARE(itemAt(scene, 9.9, 0), (QGraphicsItem *)rect);
+ QVERIFY(scene.items(QPointF(10, 10)).isEmpty());
}
void tst_QGraphicsScene::addText()
@@ -1252,14 +1260,14 @@ void tst_QGraphicsScene::removeItem()
#endif
QGraphicsScene scene;
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 10, 10));
- QCOMPARE(scene.itemAt(0, 0), item); // forces indexing
+ QCOMPARE(itemAt(scene, 0, 0), item); // forces indexing
scene.removeItem(item);
- QCOMPARE(scene.itemAt(0, 0), (QGraphicsItem *)0);
+ QVERIFY(scene.items(QPointF(0, 0)).isEmpty());
delete item;
QGraphicsItem *item2 = scene.addRect(QRectF(0, 0, 10, 10));
item2->setFlag(QGraphicsItem::ItemIsSelectable);
- QCOMPARE(scene.itemAt(0, 0), item2);
+ QCOMPARE(itemAt(scene, 0, 0), item2);
// Removing a selected item
QVERIFY(scene.selectedItems().isEmpty());
@@ -1289,7 +1297,7 @@ void tst_QGraphicsScene::removeItem()
QTRY_VERIFY(hoverItem->isHovered);
scene.removeItem(hoverItem);
- hoverItem->setAcceptsHoverEvents(false);
+ hoverItem->setAcceptHoverEvents(false);
scene.addItem(hoverItem);
QTRY_VERIFY(!hoverItem->isHovered);
}
@@ -1801,7 +1809,7 @@ void tst_QGraphicsScene::createItemGroup()
scene.destroyItemGroup(group);
QGraphicsItemGroup *emptyGroup = scene.createItemGroup(QList<QGraphicsItem *>());
- QCOMPARE(emptyGroup->children(), QList<QGraphicsItem *>());
+ QVERIFY(emptyGroup->childItems().isEmpty());
QVERIFY(!emptyGroup->parentItem());
QCOMPARE(emptyGroup->scene(), &scene);
}
@@ -2140,7 +2148,7 @@ void tst_QGraphicsScene::mouseEventPropagation_mouseMove()
{
Scene scene;
scene.addRect(QRectF(5, 0, 12, 12));
- scene.addRect(QRectF(15, 0, 12, 12))->setAcceptsHoverEvents(true);
+ scene.addRect(QRectF(15, 0, 12, 12))->setAcceptHoverEvents(true);
for (int i = 0; i < 30; ++i) {
QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseMove);
event.setScenePos(QPointF(i, 5));
@@ -2622,7 +2630,8 @@ void tst_QGraphicsScene::render()
painter.end();
const QString renderPath = QLatin1String(SRCDIR) + "/testData/render";
- QString fileName = renderPath + QString("/%1.png").arg(QTest::currentDataTag());
+ QString fileName = renderPath + QLatin1Char('/') + QLatin1String(QTest::currentDataTag())
+ + QLatin1String(".png");
QImage original(fileName);
QVERIFY(!original.isNull());
@@ -2706,6 +2715,7 @@ void tst_QGraphicsScene::renderItemsWithNegativeWidthOrHeight()
QCOMPARE(actual, expected);
}
+#ifndef QT_NO_CONTEXTMENU
void tst_QGraphicsScene::contextMenuEvent()
{
QGraphicsScene scene;
@@ -2788,6 +2798,7 @@ void tst_QGraphicsScene::contextMenuEvent_ItemIgnoresTransformations()
QVERIFY(!event.isAccepted());
}
}
+#endif // QT_NO_CONTEXTMENU
void tst_QGraphicsScene::update()
{
@@ -2800,7 +2811,7 @@ void tst_QGraphicsScene::update()
rect->setPos(-100, -100);
// This function forces indexing
- scene.itemAt(0, 0);
+ itemAt(scene, 0, 0);
qRegisterMetaType<QList<QRectF> >("QList<QRectF>");
QSignalSpy spy(&scene, SIGNAL(changed(QList<QRectF>)));
@@ -2809,7 +2820,7 @@ void tst_QGraphicsScene::update()
scene.update();
// This function forces a purge, which will post an update signal
- scene.itemAt(0, 0);
+ itemAt(scene, 0, 0);
// This will process the pending update
QApplication::instance()->processEvents();
@@ -3257,10 +3268,11 @@ void tst_QGraphicsScene::tabFocus_sceneWithNestedFocusWidgets()
FocusWidget *widget1_1 = new FocusWidget;
FocusWidget *widget1_2 = new FocusWidget;
widget1_1->setParentItem(widget1);
- widget1_1->scale(0.5, 0.5);
+ const QTransform scale(QTransform::fromScale(0.5, 0.5));
+ widget1_1->setTransform(scale, true);
widget1_1->setPos(0, widget1->boundingRect().height() / 2);
widget1_2->setParentItem(widget1);
- widget1_2->scale(0.5, 0.5);
+ widget1_2->setTransform(scale, true);
widget1_2->setPos(widget1->boundingRect().width() / 2, widget1->boundingRect().height() / 2);
FocusWidget *widget2 = new FocusWidget;
@@ -3520,7 +3532,7 @@ void tst_QGraphicsScene::task250680_childClip()
QVERIFY(QPathCompare::comparePaths(rect->clipPath().simplified(), path));
QCOMPARE(scene.items(QRectF(320, 240, 5, 5)).size(), 2);
- rect->rotate(45);
+ rect->setTransform(QTransform().rotate(45), true);
QCOMPARE(scene.items(QRectF(320, 240, 5, 5)).size(), 2);
}
@@ -3599,20 +3611,20 @@ void tst_QGraphicsScene::sorting()
// view.show();
qDebug() << "items: {";
- foreach (QGraphicsItem *item, scene.items(32, 31, 4, 55))
+ foreach (QGraphicsItem *item, scene.items(QRectF(32, 31, 4, 55)))
qDebug() << "\t" << item->data(0).toString();
qDebug() << "}";
- QCOMPARE(scene.items(32, 31, 4, 55),
+ QCOMPARE(scene.items(QRectF(32, 31, 4, 55)),
QList<QGraphicsItem *>()
<< c_1_2 << c_1_1_1 << c_1 << t_1);
- QCOMPARE(scene.items(-53, 47, 136, 3),
+ QCOMPARE(scene.items(QRectF(-53, 47, 136, 3)),
QList<QGraphicsItem *>()
<< c_2_2 << c_2_1 << c_2 << c_1_2 << c_1_1 << c_1 << t_1);
- QCOMPARE(scene.items(-23, 79, 104, 3),
+ QCOMPARE(scene.items(QRectF(-23, 79, 104, 3)),
QList<QGraphicsItem *>()
<< c_2_1_1 << c_1_1_1);
- QCOMPARE(scene.items(-26, -3, 92, 79),
+ QCOMPARE(scene.items(QRectF(-26, -3, 92, 79)),
QList<QGraphicsItem *>()
<< c_2_2 << c_2_1_1 << c_2_1 << c_2
<< c_1_2 << c_1_1_1 << c_1_1 << c_1
@@ -4376,7 +4388,7 @@ void tst_QGraphicsScene::taskQT657_paintIntoCacheWithTransparentParts()
QGraphicsProxyWidget *proxy = scene->addWidget(w);
proxy->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
- proxy->rotate(15);
+ proxy->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4422,7 +4434,7 @@ void tst_QGraphicsScene::taskQTBUG_7863_paintIntoCacheWithTransparentParts()
scene->addItem(backItem);
rectItem->setCacheMode(QGraphicsItem::DeviceCoordinateCache);
- backItem->rotate(15);
+ backItem->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4464,7 +4476,7 @@ void tst_QGraphicsScene::taskQTBUG_7863_paintIntoCacheWithTransparentParts()
scene->addItem(rectItem);
rectItem->setCacheMode(QGraphicsItem::ItemCoordinateCache);
- rectItem->rotate(15);
+ rectItem->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4505,7 +4517,7 @@ void tst_QGraphicsScene::taskQTBUG_7863_paintIntoCacheWithTransparentParts()
scene->addItem(rectItem);
rectItem->setCacheMode(QGraphicsItem::ItemCoordinateCache);
- rectItem->rotate(15);
+ rectItem->setTransform(QTransform().rotate(15), true);
view->show();
QVERIFY(QTest::qWaitForWindowExposed(view));
@@ -4609,41 +4621,41 @@ void tst_QGraphicsScene::focusItemChangedSignal()
QCOMPARE(spy.count(), 1);
QList<QVariant> arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
QVERIFY(topLevelItem2->hasFocus());
scene.clearFocus();
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)0);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)0);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::OtherFocusReason);
scene.setFocus(Qt::MenuBarFocusReason);
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::MenuBarFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)0);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::MenuBarFocusReason);
for (int i = 0; i < 3; ++i) {
topLevelItem1->setFocus(Qt::TabFocusReason);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem1);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem1);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
topLevelItem2->setFocus(Qt::TabFocusReason);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem1);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem1);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::TabFocusReason);
}
// The following two are unexpected, but fixing this (i.e., losing and gaining focus
@@ -4664,9 +4676,9 @@ void tst_QGraphicsScene::focusItemChangedSignal()
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)topLevelItem2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
QGraphicsRectItem *panel2 = new QGraphicsRectItem;
panel2->setFlags(QGraphicsItem::ItemIsPanel | QGraphicsItem::ItemIsFocusable);
@@ -4678,17 +4690,17 @@ void tst_QGraphicsScene::focusItemChangedSignal()
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel2);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel1);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel2);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel1);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
scene.setActivePanel(panel1);
QCOMPARE(spy.count(), 1);
arguments = spy.takeFirst();
QCOMPARE(arguments.size(), 3);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
- QCOMPARE(qVariantValue<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel2);
- QCOMPARE(qVariantValue<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(0)), (QGraphicsItem *)panel1);
+ QCOMPARE(qvariant_cast<QGraphicsItem *>(arguments.at(1)), (QGraphicsItem *)panel2);
+ QCOMPARE(qvariant_cast<Qt::FocusReason>(arguments.at(2)), Qt::ActiveWindowFocusReason);
}
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro b/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro
index 3d0d73566e..3b74ab0c75 100644
--- a/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicssceneindex/qgraphicssceneindex.pro
@@ -4,4 +4,3 @@ requires(contains(QT_CONFIG,private_tests))
QT += widgets widgets-private testlib
QT += core-private gui-private
SOURCES += tst_qgraphicssceneindex.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
index b2d6eef9b1..88c081bcfb 100644
--- a/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicssceneindex/tst_qgraphicssceneindex.cpp
@@ -327,7 +327,7 @@ void tst_QGraphicsSceneIndex::removeItems()
delete widgetChild1;
//We move the parent
- scene.items(295, 295, 50, 50);
+ scene.items(QRectF(295, 295, 50, 50));
//This should not crash
}
diff --git a/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro b/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro
index a46c803e41..68ee58d0d7 100644
--- a/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicstransform/qgraphicstransform.pro
@@ -2,5 +2,3 @@ CONFIG += testcase
TARGET = tst_qgraphicstransform
QT += widgets testlib
SOURCES += tst_qgraphicstransform.cpp
-CONFIG += parallel_test
-
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
index d1f9bede0b..258b5e0e14 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/qgraphicsview.pro
@@ -9,4 +9,3 @@ SOURCES += tst_qgraphicsview.cpp tst_qgraphicsview_2.cpp
HEADERS += tst_qgraphicsview.h
DEFINES += QT_NO_CAST_TO_ASCII
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index 98473fb5cc..c974cd6bec 100644
--- a/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -468,10 +468,12 @@ void tst_QGraphicsView::interactive()
QCOMPARE(item->events.size(), i * 5 + 5);
QCOMPARE(item->events.at(item->events.size() - 2), QEvent::GraphicsSceneMouseRelease);
QCOMPARE(item->events.at(item->events.size() - 1), QEvent::UngrabMouse);
+#ifndef QT_NO_CONTEXTMENU
QContextMenuEvent contextEvent(QContextMenuEvent::Mouse, itemPoint, view.mapToGlobal(itemPoint));
QApplication::sendEvent(view.viewport(), &contextEvent);
QCOMPARE(item->events.size(), i * 5 + 6);
QCOMPARE(item->events.last(), QEvent::GraphicsSceneContextMenu);
+#endif // QT_NO_CONTEXTMENU
}
view.setInteractive(false);
@@ -483,10 +485,12 @@ void tst_QGraphicsView::interactive()
sendMouseRelease(view.viewport(), itemPoint);
QCOMPARE(item->events.size(), 501);
QCOMPARE(item->events.last(), QEvent::GraphicsSceneContextMenu);
+#ifndef QT_NO_CONTEXTMENU
QContextMenuEvent contextEvent(QContextMenuEvent::Mouse, itemPoint, view.mapToGlobal(itemPoint));
QApplication::sendEvent(view.viewport(), &contextEvent);
QCOMPARE(item->events.size(), 501);
QCOMPARE(item->events.last(), QEvent::GraphicsSceneContextMenu);
+#endif // QT_NO_CONTEXTMENU
}
}
@@ -583,7 +587,7 @@ void tst_QGraphicsView::sceneRect_growing()
QGraphicsScene scene;
for (int i = 0; i < 100; ++i)
- scene.addText(QString("(0, %1)").arg((i - 50) * 20))->setPos(0, (i - 50) * 20);
+ scene.addText(QLatin1String("(0, ") + QString::number((i - 50) * 20))->setPos(0, (i - 50) * 20);
QGraphicsView view(&scene, &toplevel);
view.setFixedSize(200, 200);
@@ -1391,8 +1395,8 @@ void tst_QGraphicsView::fitInView()
items[2]->setPos(-100, 100);
items[3]->setPos(100, 100);
- items[0]->rotate(30);
- items[1]->rotate(-30);
+ items[0]->setTransform(QTransform().rotate(30), true);
+ items[1]->setTransform(QTransform().rotate(-30), true);
#if defined(Q_OS_WINCE)
//Is the standard scrollbar size
@@ -2888,9 +2892,6 @@ void tst_QGraphicsView::scrollBarRanges()
QFETCH(ExpectedValueDescription, vmax);
QFETCH(bool, useStyledPanel);
- if (style == QLatin1String("GTK+") && useStyledPanel)
- QSKIP("GTK + style test skipped, see QTBUG-29002");
-
if (useStyledPanel && style == QStringLiteral("Macintosh") && platformName == QStringLiteral("cocoa"))
QSKIP("Insignificant on OSX");
QGraphicsScene scene;
@@ -3506,7 +3507,7 @@ void tst_QGraphicsView::embeddedViews()
SpyItem *item = new SpyItem;
v2->scene()->addItem(item);
- proxy->translate(5, 5);
+ proxy->setTransform(QTransform::fromTranslate(5, 5), true);
QImage actual(64, 64, QImage::Format_ARGB32_Premultiplied);
actual.fill(0);
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
index 481bc96d96..042c42f63f 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/qgraphicswidget.pro
@@ -6,4 +6,3 @@ QT += core-private gui-private
SOURCES += tst_qgraphicswidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
index ec2203e615..b61610dee3 100644
--- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
+++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp
@@ -588,7 +588,7 @@ void tst_QGraphicsWidget::focusPolicy_data()
QTest::addColumn<Qt::FocusPolicy>("focusPolicy2");
for (int i = 0; i < 25; ++i) {
- QTestData &data = QTest::newRow(QString("%1").arg(i).toLatin1());
+ QTestData &data = QTest::newRow(QByteArray::number(i).constData());
switch(i % 5) {
case 0: data << Qt::TabFocus; break;
case 1: data << Qt::ClickFocus; break;
@@ -1108,7 +1108,7 @@ void tst_QGraphicsWidget::initStyleOption()
view.setAlignment(Qt::AlignTop | Qt::AlignLeft);
SubQGraphicsWidget *widget = new SubQGraphicsWidget;
- widget->setAcceptsHoverEvents(true);
+ widget->setAcceptHoverEvents(true);
QStyleOption option;
scene.addItem(widget);
@@ -1499,7 +1499,7 @@ void tst_QGraphicsWidget::setTabOrderAndReparent()
for (i = 1; i < 4; ++i) {
QGraphicsWidget *wid = new QGraphicsWidget;
wid->setFocusPolicy(Qt::StrongFocus);
- wid->setData(0, QString::fromLatin1("w%1").arg(i));
+ wid->setData(0, QLatin1Char('w') + QString::number(i));
scene.addItem(wid);
if (i == 1)
w1 = wid;
@@ -1539,7 +1539,7 @@ void tst_QGraphicsWidget::setTabOrderAndReparent()
for (i = 1; i < 5; ++i) {
QGraphicsWidget *wid = new QGraphicsWidget;
wid->setFocusPolicy(Qt::StrongFocus);
- wid->setData(0, QString::fromLatin1("w%1").arg(i));
+ wid->setData(0, QLatin1Char('w') + QString::number(i));
scene.addItem(wid);
if (i == 1)
w1 = wid;
@@ -2090,12 +2090,12 @@ void tst_QGraphicsWidget::task236127_bspTreeIndexFails()
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
- QTRY_VERIFY(!scene.itemAt(25, 25));
+ QTRY_VERIFY(scene.items(QPointF(25, 25)).isEmpty());
widget->setGeometry(0, 112, 360, 528);
- QTRY_COMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget);
+ QTRY_COMPARE(scene.items(QPointF(15, 120)).value(0, Q_NULLPTR), (QGraphicsItem *)widget);
widget2->setGeometry(0, 573, 360, 67);
- QTRY_COMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget);
- QTRY_COMPARE(scene.itemAt(50, 585), (QGraphicsItem *)widget2);
+ QTRY_COMPARE(scene.items(QPointF(15, 120)).value(0, Q_NULLPTR), (QGraphicsItem *)widget);
+ QTRY_COMPARE(scene.items(QPointF(50, 585)).value(0, Q_NULLPTR), (QGraphicsItem *)widget2);
}
void tst_QGraphicsWidget::defaultSize()
diff --git a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
index 3a17f7c690..5e6d4120b3 100644
--- a/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
+++ b/tests/auto/widgets/itemviews/qabstractitemview/tst_qabstractitemview.cpp
@@ -872,7 +872,7 @@ class DnDTestModel : public QStandardItemModel
public:
DnDTestModel() : QStandardItemModel(20, 20), dropAction_result(Qt::IgnoreAction) {
for (int i = 0; i < rowCount(); ++i)
- setData(index(i, 0), QString("%1").arg(i));
+ setData(index(i, 0), QString::number(i));
}
Qt::DropAction dropAction() const { return dropAction_result; }
};
@@ -1277,9 +1277,9 @@ void tst_QAbstractItemView::task250754_fontChange()
QStandardItemModel *m = new QStandardItemModel(this);
for (int i=0; i<20; ++i) {
- QStandardItem *item = new QStandardItem(QString("Item number %1").arg(i));
+ QStandardItem *item = new QStandardItem(QStringLiteral("Item number ") + QString::number(i));
for (int j=0; j<5; ++j) {
- QStandardItem *child = new QStandardItem(QString("Child Item number %1").arg(j));
+ QStandardItem *child = new QStandardItem(QStringLiteral("Child Item number ") + QString::number(j));
item->setChild(j, 0, child);
}
m->setItem(i, 0, item);
@@ -1369,7 +1369,7 @@ void tst_QAbstractItemView::shiftArrowSelectionAfterScrolling()
{
QStandardItemModel model;
for (int i=0; i<10; ++i) {
- QStandardItem *item = new QStandardItem(QString("%1").arg(i));
+ QStandardItem *item = new QStandardItem(QString::number(i));
model.setItem(i, 0, item);
}
@@ -1406,7 +1406,7 @@ void tst_QAbstractItemView::shiftSelectionAfterRubberbandSelection()
{
QStandardItemModel model;
for (int i=0; i<3; ++i) {
- QStandardItem *item = new QStandardItem(QString("%1").arg(i));
+ QStandardItem *item = new QStandardItem(QString::number(i));
model.setItem(i, 0, item);
}
@@ -1483,7 +1483,7 @@ void tst_QAbstractItemView::ctrlRubberbandSelection()
{
QStandardItemModel model;
for (int i=0; i<3; ++i) {
- QStandardItem *item = new QStandardItem(QString("%1").arg(i));
+ QStandardItem *item = new QStandardItem(QString::number(i));
model.setItem(i, 0, item);
}
diff --git a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
index 6645da727c..894058b41a 100644
--- a/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
+++ b/tests/auto/widgets/itemviews/qcolumnview/tst_qcolumnview.cpp
@@ -112,12 +112,14 @@ public:
for (int j = 0; j < 10; ++j) {
QStandardItem *parentItem = invisibleRootItem();
for (int i = 0; i < 10; ++i) {
- QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
+ const QString iS = QString::number(i);
+ const QString itemText = QLatin1String("item ") + iS;
+ QStandardItem *item = new QStandardItem(itemText);
parentItem->appendRow(item);
- QStandardItem *item2 = new QStandardItem(QString("item %0").arg(i));
+ QStandardItem *item2 = new QStandardItem(itemText);
parentItem->appendRow(item2);
- item2->appendRow(new QStandardItem(QString("item %0").arg(i)));
- parentItem->appendRow(new QStandardItem(QString("file %0").arg(i)));
+ item2->appendRow(new QStandardItem(itemText));
+ parentItem->appendRow(new QStandardItem(QLatin1String("file ") + iS));
parentItem = item;
}
}
diff --git a/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro b/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro
index 3f4cb491f4..53b23b5ef2 100644
--- a/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro
+++ b/tests/auto/widgets/itemviews/qdatawidgetmapper/qdatawidgetmapper.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdatawidgetmapper
QT += widgets testlib
SOURCES += tst_qdatawidgetmapper.cpp
diff --git a/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp b/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp
index 8b80d52a5f..5b7a2a46ad 100644
--- a/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp
+++ b/tests/auto/widgets/itemviews/qdatawidgetmapper/tst_qdatawidgetmapper.cpp
@@ -66,8 +66,10 @@ static QStandardItemModel *testModel(QObject *parent = 0)
QStandardItemModel *model = new QStandardItemModel(10, 10, parent);
for (int row = 0; row < 10; ++row) {
+ const QString prefix = QLatin1String("item ") + QString::number(row)
+ + QLatin1Char(' ');
for (int col = 0; col < 10; ++col)
- model->setData(model->index(row, col), QString("item %1 %2").arg(row).arg(col));
+ model->setData(model->index(row, col), prefix + QString::number(col));
}
return model;
diff --git a/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp b/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
index f12876f745..63cf7b2751 100644
--- a/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
+++ b/tests/auto/widgets/itemviews/qdirmodel/tst_qdirmodel.cpp
@@ -416,14 +416,14 @@ void tst_QDirModel::rowsAboutToBeRemoved_data()
bool tst_QDirModel::rowsAboutToBeRemoved_init(const QString &test_path, const QStringList &initial_files)
{
- QString path = QDir::currentPath() + "/" + test_path;
+ QString path = QDir::currentPath() + QLatin1Char('/') + test_path;
if (!QDir::current().mkdir(test_path) && false) { // FIXME
qDebug() << "failed to create dir" << path;
return false;
}
for (int i = 0; i < initial_files.count(); ++i) {
- QFile file(path + "/" + initial_files.at(i));
+ QFile file(path + QLatin1Char('/') + initial_files.at(i));
if (!file.open(QIODevice::WriteOnly)) {
qDebug() << "failed to open file" << initial_files.at(i);
return false;
@@ -443,7 +443,7 @@ bool tst_QDirModel::rowsAboutToBeRemoved_init(const QString &test_path, const QS
bool tst_QDirModel::rowsAboutToBeRemoved_cleanup(const QString &test_path)
{
- QString path = QDir::currentPath() + "/" + test_path;
+ QString path = QDir::currentPath() + QLatin1Char('/') + test_path;
QDir dir(path, "*", QDir::SortFlags(QDir::Name|QDir::IgnoreCase), QDir::Files);
QStringList files = dir.entryList();
@@ -584,8 +584,8 @@ void tst_QDirModel::filePath()
QString path = SRCDIR;
#else
QString path = QFileInfo(SRCDIR).absoluteFilePath();
- if (!path.endsWith("/"))
- path += "/";
+ if (!path.endsWith(QLatin1Char('/')))
+ path += QLatin1Char('/');
#endif
QCOMPARE(model.filePath(index), path + QString( "test.lnk"));
model.setResolveSymlinks(true);
diff --git a/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro b/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro
index 0c3a780405..37173a175e 100644
--- a/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro
+++ b/tests/auto/widgets/itemviews/qfileiconprovider/qfileiconprovider.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfileiconprovider
QT += widgets testlib
SOURCES += tst_qfileiconprovider.cpp
diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
index 55fcf04846..34cd9a55fc 100644
--- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
+++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp
@@ -272,7 +272,8 @@ public:
wrongIndex = true;
qWarning("Invalid modelIndex [%d,%d,%p]", idx.row(), idx.column(), idx.internalPointer());
}
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0);//idx.data());
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1String(",0]");
}
void insertOneColumn(int col)
@@ -1569,7 +1570,7 @@ public:
return QVariant();
}
if (role == Qt::DisplayRole) {
- return QString::fromLatin1("%1,%2").arg(index.row()).arg(index.column());
+ return QString::number(index.row()) + QLatin1Char(',') + QString::number(index.column());
}
return QVariant();
}
@@ -2242,13 +2243,21 @@ void tst_QHeaderView::QTBUG8650_crashOnInsertSections()
model.insertColumn(0, items);
}
+static void setModelTexts(QStandardItemModel *model)
+{
+ const int columnCount = model->columnCount();
+ for (int i = 0, rowCount = model->rowCount(); i < rowCount; ++i) {
+ const QString prefix = QLatin1String("item [") + QString::number(i) + QLatin1Char(',');
+ for (int j = 0; j < columnCount; ++j)
+ model->setData(model->index(i, j), prefix + QString::number(j) + QLatin1Char(']'));
+ }
+}
+
void tst_QHeaderView::QTBUG12268_hiddenMovedSectionSorting()
{
QTableView view; // ### this test fails on QTableView &view = *m_tableview; !? + shadowing view member
QStandardItemModel *model = new QStandardItemModel(4,3, &view);
- for (int i = 0; i< model->rowCount(); ++i)
- for (int j = 0; j< model->columnCount(); ++j)
- model->setData(model->index(i,j), QString("item [%1,%2]").arg(i).arg(j));
+ setModelTexts(model);
view.setModel(model);
view.horizontalHeader()->setSectionsMovable(true);
view.setSortingEnabled(true);
@@ -2324,9 +2333,7 @@ void tst_QHeaderView::initialSortOrderRole()
{
QTableView view; // ### Shadowing member view (of type QHeaderView)
QStandardItemModel *model = new QStandardItemModel(4, 3, &view);
- for (int i = 0; i< model->rowCount(); ++i)
- for (int j = 0; j< model->columnCount(); ++j)
- model->setData(model->index(i,j), QString("item [%1,%2]").arg(i).arg(j));
+ setModelTexts(model);
QStandardItem *ascendingItem = new QStandardItem();
QStandardItem *descendingItem = new QStandardItem();
ascendingItem->setData(Qt::AscendingOrder, Qt::InitialSortOrderRole);
@@ -2494,7 +2501,7 @@ void tst_QHeaderView::calculateAndCheck(int cppline, const int precalced_compare
QString msg = "semantic problem at " + QString(__FILE__) + " (" + sline + ")";
msg += "\nThe *expected* result was : {" + istr(x[0]) + istr(x[1]) + istr(x[2]) + istr(x[3])
- + istr(x[4]) + istr(x[5]) + istr(x[6], false) + "}";
+ + istr(x[4]) + istr(x[5]) + istr(x[6], false) + QLatin1Char('}');
msg += "\nThe calculated result was : {";
msg += istr(chk_visual) + istr(chk_logical) + istr(chk_sizes) + istr(chk_hidden_size)
+ istr(chk_lookup_visual) + istr(chk_lookup_logical) + istr(header_lenght, false) + "};";
@@ -2572,7 +2579,7 @@ void tst_QHeaderView::additionalInit()
for (int i = 0; i < model->rowCount(); ++i) {
model->setData(model->index(i, 0), QVariant(i));
s.setNum(i);
- s += ".";
+ s += QLatin1Char('.');
s += 'a' + (i % 25);
model->setData(model->index(i, 1), QVariant(s));
}
diff --git a/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro b/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro
index 55df1d83f1..5ff7771585 100644
--- a/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro
+++ b/tests/auto/widgets/itemviews/qitemeditorfactory/qitemeditorfactory.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qitemeditorfactory
QT += widgets testlib
SOURCES += tst_qitemeditorfactory.cpp
diff --git a/tests/auto/widgets/itemviews/qitemview/qitemview.pro b/tests/auto/widgets/itemviews/qitemview/qitemview.pro
index 6e1697f790..079953d60d 100644
--- a/tests/auto/widgets/itemviews/qitemview/qitemview.pro
+++ b/tests/auto/widgets/itemviews/qitemview/qitemview.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qitemview
QT += widgets testlib
SOURCES += tst_qitemview.cpp
diff --git a/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp b/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
index 8fd86ea467..64919581c3 100644
--- a/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
+++ b/tests/auto/widgets/itemviews/qitemview/tst_qitemview.cpp
@@ -288,14 +288,16 @@ void tst_QItemView::populate()
const int baseInsert = 26;
#endif
for (int i = 0; i < 40; ++i) {
+ const QString iS = QString::number(i);
parent = treeModel->index(0, 0, parent);
treeModel->insertRows(0, baseInsert + i, parent);
treeModel->insertColumns(0, baseInsert + i, parent);
// Fill in some values to make it easier to debug
for (int x = 0; x < treeModel->rowCount(); ++x) {
+ const QString xS = QString::number(x);
for (int y = 0; y < treeModel->columnCount(); ++y) {
QModelIndex index = treeModel->index(x, y, parent);
- treeModel->setData(index, QString("%1_%2_%3").arg(x).arg(y).arg(i));
+ treeModel->setData(index, xS + QLatin1Char('_') + QString::number(y) + QLatin1Char('_') + iS);
treeModel->setData(index, QVariant(QColor(Qt::blue)), Qt::TextColorRole);
}
}
diff --git a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
index 5b206af357..6d811ff4e1 100644
--- a/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
+++ b/tests/auto/widgets/itemviews/qlistview/tst_qlistview.cpp
@@ -74,6 +74,15 @@ static inline void setFrameless(QWidget *w)
w->setWindowFlags(flags);
}
+static QStringList generateList(const QString &prefix, int size)
+{
+ QStringList result;
+ result.reserve(size);
+ for (int i = 0; i < size; ++i)
+ result.append(prefix + QString::number(i));
+ return result;
+}
+
class tst_QListView : public QObject
{
Q_OBJECT
@@ -255,7 +264,7 @@ public:
wrongIndex = true;
qWarning("got invalid modelIndex %d/%d", idx.row(), idx.column());
}
- return QString("%1/%2").arg(idx.row()).arg(idx.column());
+ return QString::number(idx.row()) + QLatin1Char('/') + QString::number(idx.column());
}
void removeLastRow()
@@ -364,10 +373,11 @@ void tst_QListView::cursorMove()
view.setModel(&model);
for (int j = 0; j < columns; ++j) {
+ const QString postfix = QLatin1Char(',') + QString::number(j) + QLatin1Char(']');
view.setModelColumn(j);
for (int i = 0; i < rows; ++i) {
QModelIndex index = model.index(i, j);
- model.setData(index, QString("[%1,%2]").arg(i).arg(j));
+ model.setData(index, QLatin1Char('[') + QString::number(i) + postfix);
view.setCurrentIndex(index);
QApplication::processEvents();
QCOMPARE(view.currentIndex(), index);
@@ -468,7 +478,7 @@ void tst_QListView::hideRows()
QStandardItemModel sim(0);
QStandardItem *root = new QStandardItem("Root row");
for (int i=0;i<5;i++)
- root->appendRow(new QStandardItem(QString("Row %1").arg(i)));
+ root->appendRow(new QStandardItem(QLatin1String("Row ") + QString::number(i)));
sim.appendRow(root);
view.setModel(&sim);
view.setRootIndex(root->index());
@@ -702,9 +712,11 @@ void tst_QListView::singleSelectionRemoveColumn()
int numCols = 3;
int numRows = 3;
QStandardItemModel model(numCols, numRows);
- for (int r = 0; r < numRows; ++r)
+ for (int r = 0; r < numRows; ++r) {
+ const QString prefix = QString::number(r) + QLatin1Char(',');
for (int c = 0; c < numCols; ++c)
- model.setData(model.index(r, c), QString("%1,%2").arg(r).arg(c));
+ model.setData(model.index(r, c), prefix + QString::number(c));
+ }
QListView view;
view.setModel(&model);
@@ -729,10 +741,11 @@ void tst_QListView::modelColumn()
int numCols = 3;
int numRows = 3;
QStandardItemModel model(numCols, numRows);
- for (int r = 0; r < numRows; ++r)
+ for (int r = 0; r < numRows; ++r) {
+ const QString prefix = QString::number(r) + QLatin1Char(',');
for (int c = 0; c < numCols; ++c)
- model.setData(model.index(r, c), QString("%1,%2").arg(r).arg(c));
-
+ model.setData(model.index(r, c), prefix + QString::number(c));
+ }
QListView view;
view.setModel(&model);
@@ -811,10 +824,7 @@ void tst_QListView::batchedMode()
{
const int rowCount = 3;
- QStringList items;
- for (int i = 0; i < rowCount; ++i)
- items << QLatin1String("item ") + QString::number(i);
- QStringListModel model(items);
+ QStringListModel model(generateList(QLatin1String("item "), rowCount));
QListView view;
view.setWindowTitle(QTest::currentTestFunction());
@@ -840,11 +850,7 @@ void tst_QListView::batchedMode()
void tst_QListView::setCurrentIndex()
{
- QStringList items;
- int i;
- for (i=0; i <20; ++i)
- items << QString("item %1").arg(i);
- QStringListModel model(items);
+ QStringListModel model(generateList(QLatin1String("item "), 20));
QListView view;
view.setModel(&model);
@@ -866,7 +872,7 @@ void tst_QListView::setCurrentIndex()
int offset = sb->value();
// first "scroll" down, verify that we scroll one step at a time
- i = 0;
+ int i = 0;
for (i = 0; i < 20; ++i) {
QModelIndex idx = model.index(i,0);
view.setCurrentIndex(idx);
@@ -1289,7 +1295,7 @@ void tst_QListView::scrollBarRanges()
QStringListModel model(&lv);
QStringList list;
for (int i = 0; i < rowCount; ++i)
- list << QString::fromLatin1("Item %1").arg(i);
+ list << QLatin1String("Item ") + QString::number(i);
model.setStringList(list);
lv.setModel(&model);
@@ -1387,17 +1393,13 @@ void tst_QListView::scrollBarAsNeeded()
QStringList list;
int i;
for (i = 0; i < rowCounts[r]; ++i)
- list << QString::fromLatin1("Item %1").arg(i);
+ list << QLatin1String("Item ") + QString::number(i);
model.setStringList(list);
QApplication::processEvents();
QTest::qWait(50);
- QStringList replacement;
- for (i = 0; i < itemCount; ++i) {
- replacement << QString::fromLatin1("Item %1").arg(i);
- }
- model.setStringList(replacement);
+ model.setStringList(generateList(QLatin1String("Item "), itemCount));
QApplication::processEvents();
@@ -1410,10 +1412,9 @@ void tst_QListView::moveItems()
{
QStandardItemModel model;
for (int r = 0; r < 4; ++r) {
- for (int c = 0; c < 4; ++c) {
- QStandardItem* item = new QStandardItem(QString("standard item (%1,%2)").arg(r).arg(c));
- model.setItem(r, c, item);
- }
+ const QString prefix = QLatin1String("standard item (") + QString::number(r) + QLatin1Char(',');
+ for (int c = 0; c < 4; ++c)
+ model.setItem(r, c, new QStandardItem(prefix + QString::number(c) + QLatin1Char(')')));
}
PublicListView view;
@@ -1525,9 +1526,10 @@ void tst_QListView::emptyItemSize()
{
QStandardItemModel model;
for (int r = 0; r < 4; ++r) {
- QStandardItem* item = new QStandardItem(QString("standard item (%1)").arg(r));
- model.setItem(r, 0, item);
+ const QString text = QLatin1String("standard item (") + QString::number(r) + QLatin1Char(')');
+ model.setItem(r, new QStandardItem(text));
}
+
model.setItem(4, 0, new QStandardItem());
PublicListView view;
@@ -1994,12 +1996,7 @@ public:
void tst_QListView::taskQTBUG_9455_wrongScrollbarRanges()
{
- QStringList list;
- const int nrItems = 8;
- for (int i = 0; i < nrItems; i++)
- list << QString::asprintf("item %d", i);
-
- QStringListModel model(list);
+ QStringListModel model(generateList("item ", 8));
ListView_9455 w;
setFrameless(&w);
w.setModel(&model);
@@ -2083,7 +2080,7 @@ void tst_QListView::taskQTBUG_12308_wrongFlowLayout()
QListWidgetItem *item = new QListWidgetItem();
item->setText(QString("Item %L1").arg(i));
lw.addItem(item);
- if (!item->text().contains(QString::fromLatin1("1")))
+ if (!item->text().contains(QLatin1Char('1')))
item->setHidden(true);
}
lw.show();
diff --git a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
index ecf72613da..7b5fd34f44 100644
--- a/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
+++ b/tests/auto/widgets/itemviews/qlistwidget/tst_qlistwidget.cpp
@@ -230,7 +230,7 @@ void tst_QListWidget::populate()
void tst_QListWidget::addItem()
{
int count = testWidget->count();
- QString label = QString("%1").arg(count);
+ const QString label = QString::number(count);
testWidget->addItem(label);
QCOMPARE(testWidget->count(), ++count);
QCOMPARE(testWidget->item(testWidget->count()-1)->text(), label);
@@ -244,7 +244,7 @@ void tst_QListWidget::addItem2()
testWidget->addItem(0);
QCOMPARE(testWidget->count(), count);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(count));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(count));
item->setFlags(item->flags() | Qt::ItemIsEditable);
testWidget->addItem(item);
QCOMPARE(testWidget->count(), ++count);
@@ -261,10 +261,10 @@ void tst_QListWidget::addItems()
QCOMPARE(testWidget->count(), count);
QStringList stringList;
- QString label = QString("%1").arg(count);
- stringList << QString("%1").arg(testWidget->count() + 1)
- << QString("%1").arg(testWidget->count() + 2)
- << QString("%1").arg(testWidget->count() + 3)
+ QString label = QString::number(count);
+ stringList << QString::number(testWidget->count() + 1)
+ << QString::number(testWidget->count() + 2)
+ << QString::number(testWidget->count() + 3)
<< label;
testWidget->addItems(stringList);
QCOMPARE(testWidget->count(), count + stringList.count());
@@ -276,7 +276,7 @@ void tst_QListWidget::openPersistentEditor()
{
// Boundary checking
testWidget->openPersistentEditor(0);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->openPersistentEditor(item);
int childCount = testWidget->viewport()->children().count();
@@ -290,7 +290,7 @@ void tst_QListWidget::closePersistentEditor()
// Boundary checking
int childCount = testWidget->viewport()->children().count();
testWidget->closePersistentEditor(0);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->closePersistentEditor(item);
QCOMPARE(childCount, testWidget->viewport()->children().count());
@@ -316,7 +316,7 @@ void tst_QListWidget::setItemHidden()
if (testWidget->isItemHidden(testWidget->item(i)))
totalHidden++;
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->addItem(item);
// Check that nothing else changed
@@ -362,7 +362,7 @@ void tst_QListWidget::setCurrentItem()
{
QFETCH(int, fill);
for (int i = 0; i < fill; ++i)
- testWidget->addItem(QString("%1").arg(i));
+ testWidget->addItem(QString::number(i));
// Boundary checking
testWidget->setCurrentItem((QListWidgetItem *)0);
@@ -394,7 +394,7 @@ void tst_QListWidget::setCurrentRow()
{
QFETCH(int, fill);
for (int i = 0; i < fill; ++i)
- testWidget->addItem(QString("%1").arg(i));
+ testWidget->addItem(QString::number(i));
// Boundary checking
testWidget->setCurrentRow(-1);
@@ -455,7 +455,7 @@ void tst_QListWidget::editItem()
{
// Boundary checking
testWidget->editItem(0);
- QListWidgetItem *item = new QListWidgetItem(QString("%1").arg(testWidget->count()));
+ QListWidgetItem *item = new QListWidgetItem(QString::number(testWidget->count()));
testWidget->editItem(item);
QFETCH(bool, editable);
@@ -650,7 +650,7 @@ void tst_QListWidget::item()
QCOMPARE(item, static_cast<QListWidgetItem*>(0));
QCOMPARE(testWidget->count(), 3);
} else {
- QCOMPARE(item->text(), QString("item%1").arg(row));
+ QCOMPARE(item->text(), QStringLiteral("item") + QString::number(row));
QCOMPARE(testWidget->count(), 3);
}
}
@@ -683,7 +683,7 @@ void tst_QListWidget::takeItem()
QCOMPARE(item, static_cast<QListWidgetItem*>(0));
QCOMPARE(testWidget->count(), 3);
} else {
- QCOMPARE(item->text(), QString("item%1").arg(row));
+ QCOMPARE(item->text(), QStringLiteral("item") + QString::number(row));
QCOMPARE(testWidget->count(), 2);
}
@@ -746,7 +746,7 @@ void tst_QListWidget::selectedItems()
//insert items
for (int i=0; i<itemCount; ++i)
- new QListWidgetItem(QString("Item%1").arg(i), testWidget);
+ new QListWidgetItem(QStringLiteral("Item") + QString::number(i), testWidget);
//test the selection
testWidget->setSelectionMode(QListWidget::SingleSelection);
@@ -1245,8 +1245,8 @@ void tst_QListWidget::insertItemsWithSorting_data()
QStringList ascendingItems;
QStringList reverseItems;
for (int i = 'a'; i <= 'z'; ++i) {
- ascendingItems << QString("%0").arg(QLatin1Char(i));
- reverseItems << QString("%0").arg(QLatin1Char('z' - i + 'a'));
+ ascendingItems << QString(1, QLatin1Char(i));
+ reverseItems << QString(1, QLatin1Char('z' - i + 'a'));
ascendingRows << i - 'a';
reverseRows << 'z' - i + 'a';
}
@@ -1490,7 +1490,7 @@ void tst_QListWidget::fastScroll()
QWidget topLevel;
MyListWidget widget(&topLevel);
for (int i = 0; i < 50; ++i)
- widget.addItem(QString("Item %1").arg(i));
+ widget.addItem(QStringLiteral("Item ") + QString::number(i));
topLevel.resize(300, 300); // toplevel needs to be wide enough for the item
topLevel.show();
diff --git a/tests/auto/widgets/itemviews/qtableview/qtableview.pro b/tests/auto/widgets/itemviews/qtableview/qtableview.pro
index 0814af77fb..e02da95ab9 100644
--- a/tests/auto/widgets/itemviews/qtableview/qtableview.pro
+++ b/tests/auto/widgets/itemviews/qtableview/qtableview.pro
@@ -3,6 +3,4 @@ TARGET = tst_qtableview
QT += widgets widgets-private testlib
QT += core-private gui-private
-TARGET.EPOCHEAPSIZE = 0x200000 0x800000
SOURCES += tst_qtableview.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
index e5abd6bc46..45dab3f2c1 100644
--- a/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
+++ b/tests/auto/widgets/itemviews/qtableview/tst_qtableview.cpp
@@ -325,8 +325,10 @@ public:
return QVariant();
}
- if (role == Qt::DisplayRole || role == Qt::EditRole)
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(0);
+ if (role == Qt::DisplayRole || role == Qt::EditRole) {
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1String(",0]");
+ }
return QVariant();
}
@@ -415,7 +417,8 @@ public:
void reset()
{
- QAbstractTableModel::reset();
+ beginResetModel();
+ endResetModel();
}
int row_count;
@@ -3606,7 +3609,11 @@ public:
{
return QVariant();
}
- void res() { reset(); }
+ void res()
+ {
+ beginResetModel();
+ endResetModel();
+ }
int rows;
int columns;
@@ -3797,7 +3804,7 @@ public:
int role = Qt::DisplayRole) const
{
if (role == Qt::DisplayRole)
- return QString("%1 - %2").arg(index.column()).arg(index.row());
+ return QString::number(index.column()) + QLatin1String(" - ") + QString::number(index.row());
return QVariant();
}
@@ -3919,12 +3926,12 @@ void tst_QTableView::task227953_setRootIndex()
//setup the first table as a child of the first item
for ( int row = 0; row < 40; ++row ) {
- item1.appendRow(QList<QStandardItem*>() << new QStandardItem(QString("row %0").arg(row)));
+ item1.appendRow(QList<QStandardItem*>() << new QStandardItem(QLatin1String("row ") + QString::number(row)));
}
//setup the second table as a child of the second item
for ( int row = 0; row < 10; ++row ) {
- item2.appendRow(QList<QStandardItem*>() << new QStandardItem(QString("row %0").arg(row)));
+ item2.appendRow(QList<QStandardItem*>() << new QStandardItem(QLatin1String("row ") + QString::number(row)));
}
tableView.setModel(&model);
diff --git a/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro b/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro
index d2c962b4de..114ce115eb 100644
--- a/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro
+++ b/tests/auto/widgets/itemviews/qtablewidget/qtablewidget.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtablewidget
QT += widgets testlib
SOURCES += tst_qtablewidget.cpp
diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
index ea31fd19dd..db3cf8082d 100644
--- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
+++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp
@@ -1473,7 +1473,7 @@ void tst_QTableWidget::task262056_sortDuplicate()
for (int i = 0; i<8; i++ ) {
QTableWidgetItem *twi = new QTableWidgetItem(items.at(i));
testWidget->setItem(i,0,twi);
- testWidget->setItem(i,1,new QTableWidgetItem(QString("item %1").arg(i)));
+ testWidget->setItem(i,1,new QTableWidgetItem(QLatin1String("item ") + QString::number(i)));
}
testWidget->sortItems(0, Qt::AscendingOrder);
QSignalSpy layoutChangedSpy(testWidget->model(), SIGNAL(layoutChanged()));
diff --git a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
index 033464c9db..dec6a66a7f 100644
--- a/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
+++ b/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp
@@ -338,9 +338,12 @@ public:
qWarning("Invalid modelIndex [%d,%d,%p]", idx.row(), idx.column(),
idx.internalPointer());
}
+ QString result = QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(',') + QString::number(level(idx))
+ + QLatin1Char(']');
if (idx.row() & 1)
- return QString("[%1,%2,%3] - this item is extra wide").arg(idx.row()).arg(idx.column()).arg(level(idx));
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column()).arg(level(idx));
+ result += QLatin1String(" - this item is extra wide");
+ return result;
}
if (decorationsEnabled && role == Qt::DecorationRole) {
QPixmap pm(16,16);
@@ -2084,13 +2087,14 @@ void tst_QTreeView::rowsAboutToBeRemoved()
{
QStandardItemModel model(3, 1);
for (int i = 0; i < model.rowCount(); i++) {
+ const QString iS = QString::number(i);
QModelIndex index = model.index(i, 0, QModelIndex());
- model.setData(index, QString("%1").arg(i));
+ model.setData(index, iS);
model.insertRows(0, 4, index);
model.insertColumns(0,1,index);
for (int i1 = 0; i1 < model.rowCount(index); i1++) {
QModelIndex index2 = model.index(i1, 0, index);
- model.setData(index2, QString("%1%2").arg(i).arg(i1));
+ model.setData(index2, iS + QString::number(i1));
}
}
@@ -2228,14 +2232,16 @@ void tst_QTreeView::resizeColumnToContents()
{
QStandardItemModel model(50,2);
for (int r = 0; r < model.rowCount(); ++r) {
+ const QString rS = QString::number(r);
for (int c = 0; c < model.columnCount(); ++c) {
QModelIndex idx = model.index(r, c);
- model.setData(idx, QString::fromLatin1("%1,%2").arg(r).arg(c) );
+ model.setData(idx, rS + QLatin1Char(',') + QString::number(c));
model.insertColumns(0, 2, idx);
model.insertRows(0, 6, idx);
for (int i = 0; i < 6; ++i) {
+ const QString iS = QString::number(i);
for (int j = 0; j < 2 ; ++j) {
- model.setData(model.index(i, j, idx), QString::fromLatin1("child%1%2").arg(i).arg(j));
+ model.setData(model.index(i, j, idx), QLatin1String("child") + iS + QString::number(j));
}
}
}
@@ -2390,7 +2396,7 @@ void tst_QTreeView::selectionWithHiddenItems()
{
QStandardItemModel model;
for (int i = 0; i < model.rowCount(); ++i)
- model.setData(model.index(i,0), QString("row %1").arg(i));
+ model.setData(model.index(i,0), QLatin1String("row ") + QString::number(i));
QStandardItem item0("row 0");
QStandardItem item1("row 1");
@@ -2464,7 +2470,7 @@ void tst_QTreeView::selectAll()
QCOMPARE(view2.selectedIndexes().count(), model.rowCount() * model.columnCount());
for (int i = 0; i < model.rowCount(); ++i)
- model.setData(model.index(i,0), QString("row %1").arg(i));
+ model.setData(model.index(i,0), QLatin1String("row ") + QString::number(i));
PublicView view;
view.setModel(&model);
int selectedCount = view.selectedIndexes().count();
@@ -2818,8 +2824,9 @@ public:
if (parentNode->isDead)
qFatal("%s: grandparentNode is dead!", Q_FUNC_INFO);
}
- return QString("[%1,%2,%3]").arg(idx.row()).arg(idx.column())
- .arg(parentNode->isDead ? "dead" : "alive");
+ return QLatin1Char('[') + QString::number(idx.row()) + QLatin1Char(',')
+ + QString::number(idx.column()) + QLatin1Char(',')
+ + QLatin1String(parentNode->isDead ? "dead" : "alive") + QLatin1Char(']');
}
return QVariant();
}
@@ -3022,7 +3029,7 @@ void tst_QTreeView::filterProxyModelCrash()
QStandardItemModel model;
QList<QStandardItem *> items;
for (int i = 0; i < 100; i++)
- items << new QStandardItem(QString::fromLatin1("item %1").arg(i));
+ items << new QStandardItem(QLatin1String("item ") + QString::number(i));
model.appendColumn(items);
QSortFilterProxyModel proxy;
@@ -3388,11 +3395,11 @@ void tst_QTreeView::task203696_hidingColumnsAndRowsn()
{
QTreeView view;
QStandardItemModel *model = new QStandardItemModel(0, 3, &view);
- for (int i = 0; i < 3; ++i)
- {
+ for (int i = 0; i < 3; ++i) {
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" col ");
model->insertRow(model->rowCount());
for (int j = 0; j < model->columnCount(); ++j)
- model->setData(model->index(i, j), QString("row %1 col %2").arg(i).arg(j));
+ model->setData(model->index(i, j), prefix + QString::number(j));
}
view.setModel(model);
view.show();
@@ -3414,8 +3421,9 @@ void tst_QTreeView::addRowsWhileSectionsAreHidden()
for (i = 0; i < 3; ++i)
{
model->insertRow(model->rowCount());
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" col ");
for (int j = 0; j < model->columnCount(); ++j) {
- model->setData(model->index(i, j), QString("row %1 col %2").arg(i).arg(j));
+ model->setData(model->index(i, j), prefix + QString::number(j));
}
}
int col;
@@ -3424,8 +3432,9 @@ void tst_QTreeView::addRowsWhileSectionsAreHidden()
for (i = 3; i < 6; ++i)
{
model->insertRow(model->rowCount());
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" col ");
for (int j = 0; j < model->columnCount(); ++j) {
- model->setData(model->index(i, j), QString("row %1 col %2").arg(i).arg(j));
+ model->setData(model->index(i, j), prefix + QString::number(j));
}
}
for (col = 0; col < pass; ++col)
@@ -3479,8 +3488,10 @@ void tst_QTreeView::task220298_selectColumns()
virtual QVariant data ( const QModelIndex & index, int role = Qt::DisplayRole ) const
{
- if(role == Qt::DisplayRole)
- return QVariant(QString("%1-%2").arg(index.column()).arg(index.row()));
+ if (role == Qt::DisplayRole) {
+ return QVariant(QString::number(index.column()) + QLatin1Char('-')
+ + QString::number(index.row()));
+ }
return QVariant();
}
@@ -3518,7 +3529,7 @@ void tst_QTreeView::task224091_appendColumns()
QList<QStandardItem *> projlist;
for (int k = 0; k < 10; ++k)
- projlist.append(new QStandardItem(QString("Top Level %0").arg(k)));
+ projlist.append(new QStandardItem(QLatin1String("Top Level ") + QString::number(k)));
model->appendColumn(projlist);
model->invisibleRootItem()->appendRow(new QStandardItem("end"));
@@ -3745,7 +3756,7 @@ void tst_QTreeView::task246536_scrollbarsNotWorking()
QVERIFY(QTest::qWaitForWindowExposed(&tree));
QList<QStandardItem *> items;
for(int i=0; i<100; ++i){
- items << new QStandardItem(QString::fromLatin1("item %1").arg(i));
+ items << new QStandardItem(QLatin1String("item ") + QString::number(i));
}
model.invisibleRootItem()->appendColumn(items);
QTest::qWait(100);
@@ -3933,7 +3944,8 @@ void tst_QTreeView::taskQTBUG_6450_selectAllWith1stColumnHidden()
QList<QTreeWidgetItem *> items;
const int nrRows = 10;
for (int i = 0; i < nrRows; ++i) {
- items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));
+ const QString text = QLatin1String("item: ") + QString::number(i);
+ items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(text)));
items.last()->setText(1, QString("is an item"));
}
tree.insertTopLevelItems(0, items);
@@ -3964,9 +3976,11 @@ public:
void tst_QTreeView::taskQTBUG_9216_setSizeAndUniformRowHeightsWrongRepaint()
{
QStandardItemModel model(10, 10, this);
- for (int row = 0; row < 10; row++)
+ for (int row = 0; row < 10; row++) {
+ const QString prefix = QLatin1String("row ") + QString::number(row) + QLatin1String(", col ");
for (int col = 0; col < 10; col++)
- model.setItem(row, col, new QStandardItem(QString("row %0, col %1").arg(row).arg(col)));
+ model.setItem(row, col, new QStandardItem(prefix + QString::number(col)));
+ }
TreeViewQTBUG_9216 view;
view.setUniformRowHeights(true);
view.setModel(&model);
@@ -4285,7 +4299,7 @@ void tst_QTreeView::testInitialFocus()
{
QTreeWidget treeWidget;
treeWidget.setColumnCount(5);
- new QTreeWidgetItem(&treeWidget, QStringList(QString("1;2;3;4;5").split(";")));
+ new QTreeWidgetItem(&treeWidget, QStringList(QString("1;2;3;4;5").split(QLatin1Char(';'))));
treeWidget.setTreePosition(2);
treeWidget.header()->hideSection(0); // make sure we skip hidden section(s)
treeWidget.header()->swapSections(1, 2); // make sure that we look for first visual index (and not first logical)
@@ -4339,9 +4353,10 @@ void tst_QTreeView::taskQTBUG_37813_crash()
treeWidget.setColumnCount(2);
QList<QTreeWidgetItem *> items;
for (int r = 0; r < 2; ++r) {
+ const QString prefix = QLatin1String("Row ") + QString::number(r) + QLatin1String(" Column ");
QTreeWidgetItem *item = new QTreeWidgetItem();
for (int c = 0; c < treeWidget.columnCount(); ++c)
- item->setText(c, QString::fromLatin1("Row %1 Column %2").arg(r).arg(c));
+ item->setText(c, prefix + QString::number(c));
items.append(item);
}
treeWidget.addTopLevelItems(items);
diff --git a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp
index 117c53a2bb..1acdc103bd 100644
--- a/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp
+++ b/tests/auto/widgets/itemviews/qtreewidget/tst_qtreewidget.cpp
@@ -320,7 +320,7 @@ void tst_QTreeWidget::addTopLevelItem()
for (int i = 0; i < 100; i += count) {
tops.clear();
for (int j = 0; j < count; ++j)
- tops << new TreeItem(QStringList() << QString("%0").arg(j));
+ tops << new TreeItem(QStringList(QString::number(j)));
tree.addTopLevelItems(tops);
QCOMPARE(tree.topLevelItemCount(), count + i);
for (int j = 0; j < count; ++j)
@@ -511,10 +511,10 @@ void tst_QTreeWidget::takeItem()
for (int i=0; i<3; ++i) {
QTreeWidgetItem *top = new QTreeWidgetItem(testWidget);
- top->setText(0, QString("top%1").arg(i));
+ top->setText(0, QStringLiteral("top") + QString::number(i));
for (int j=0; j<3; ++j) {
QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("child%1").arg(j));
+ child->setText(0, QStringLiteral("child") + QString::number(j));
}
}
@@ -528,7 +528,7 @@ void tst_QTreeWidget::takeItem()
QCOMPARE(item, (QTreeWidgetItem *)0);
QCOMPARE(count, testWidget->topLevelItemCount());
} else {
- QCOMPARE(item->text(0), QString("top%1").arg(index));
+ QCOMPARE(item->text(0), QStringLiteral("top") + QString::number(index));
QCOMPARE(count-1, testWidget->topLevelItemCount());
delete item;
}
@@ -539,7 +539,7 @@ void tst_QTreeWidget::takeItem()
QCOMPARE(item, (QTreeWidgetItem *)0);
QCOMPARE(count, testWidget->topLevelItem(0)->childCount());
} else {
- QCOMPARE(item->text(0), QString("child%1").arg(index));
+ QCOMPARE(item->text(0), QStringLiteral("child") + QString::number(index));
QCOMPARE(count-1, testWidget->topLevelItem(0)->childCount());
delete item;
}
@@ -794,10 +794,11 @@ void tst_QTreeWidget::selectedItems()
// create items
for (int t=0; t<topLevel; ++t) {
QTreeWidgetItem *top = new QTreeWidgetItem(testWidget);
- top->setText(0, QString("top%1").arg(t));
+ const QString topS = QLatin1String("top") + QString::number(t);
+ top->setText(0, topS);
for (int c=0; c<children; ++c) {
QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1child%2").arg(t).arg(c));
+ child->setText(0, topS + QLatin1String("child") + QString::number(c));
}
}
@@ -1442,11 +1443,10 @@ static void fillTreeWidget(QTreeWidgetItem *parent, int rows)
{
const int columns = parent->treeWidget()->columnCount();
for (int r = 0; r < rows; ++r) {
+ const QString prefix = QLatin1String("[r:") + QString::number(r) + QLatin1String(",c:");
QTreeWidgetItem *w = new QTreeWidgetItem(parent);
- for ( int c = 0; c < columns; ++c ) {
- QString s = QString("[r:%1,c:%2]").arg(r).arg(c);
- w->setText(c, s);
- }
+ for (int c = 0; c < columns; ++c)
+ w->setText(c, prefix + QString::number(c) + QLatin1Char(']'));
fillTreeWidget(w, rows - r - 1);
}
}
@@ -1455,10 +1455,9 @@ static void fillTreeWidget(QTreeWidget *tree, int rows)
{
for (int r = 0; r < rows; ++r) {
QTreeWidgetItem *w = new QTreeWidgetItem();
- for ( int c = 0; c < tree->columnCount(); ++c ) {
- QString s = QString("[r:%1,c:%2]").arg(r).arg(c);
- w->setText(c, s);
- }
+ const QString prefix = QLatin1String("[r:") + QString::number(r) + QLatin1String(",c:");
+ for (int c = 0; c < tree->columnCount(); ++c)
+ w->setText(c, prefix + QString::number(c) + QLatin1Char(']'));
tree->insertTopLevelItem(r, w);
fillTreeWidget(w, rows - r - 1);
}
@@ -1555,7 +1554,7 @@ void tst_QTreeWidget::keyboardNavigation()
}
QTreeWidgetItem *current = testWidget->currentItem();
- QCOMPARE(current->text(0), QString("[r:%1,c:0]").arg(row));
+ QCOMPARE(current->text(0), QLatin1String("[r:") + QString::number(row) + QLatin1String(",c:0]"));
if (current->parent())
QCOMPARE(current->parent()->indexOfChild(current), row);
else
@@ -1696,7 +1695,7 @@ void tst_QTreeWidget::addChild()
for (int i = 0; i < 100; i += count) {
QList<QTreeWidgetItem*> list;
for (int j = 0; j < count; ++j)
- list << new QTreeWidgetItem(QStringList() << QString("%0").arg(j));
+ list << new QTreeWidgetItem(QStringList(QString::number(j)));
item->addChildren(list);
QCOMPARE(item->childCount(), count + i);
for (int j = 0; j < count; ++j) {
@@ -1743,7 +1742,8 @@ void tst_QTreeWidget::setData()
for (int i = 1; i <= 2; ++i) {
for (int j = 0; j < 5; ++j) {
QVariantList args;
- QString text = QString("text %0").arg(i);
+ const QString iS = QString::number(i);
+ const QString text = QLatin1String("text ") + iS;
item->setText(j, text);
QCOMPARE(item->text(j), text);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -1765,7 +1765,7 @@ void tst_QTreeWidget::setData()
item->setIcon(j, icon);
QCOMPARE(itemChangedSpy.count(), 0);
- QString toolTip = QString("toolTip %0").arg(i);
+ const QString toolTip = QLatin1String("toolTip ") + iS;
item->setToolTip(j, toolTip);
QCOMPARE(item->toolTip(j), toolTip);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -1775,7 +1775,7 @@ void tst_QTreeWidget::setData()
item->setToolTip(j, toolTip);
QCOMPARE(itemChangedSpy.count(), 0);
- QString statusTip = QString("statusTip %0").arg(i);
+ const QString statusTip = QLatin1String("statusTip ") + iS;
item->setStatusTip(j, statusTip);
QCOMPARE(item->statusTip(j), statusTip);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -1785,7 +1785,7 @@ void tst_QTreeWidget::setData()
item->setStatusTip(j, statusTip);
QCOMPARE(itemChangedSpy.count(), 0);
- QString whatsThis = QString("whatsThis %0").arg(i);
+ const QString whatsThis = QLatin1String("whatsThis ") + iS;
item->setWhatsThis(j, whatsThis);
QCOMPARE(item->whatsThis(j), whatsThis);
QCOMPARE(itemChangedSpy.count(), 1);
@@ -2007,7 +2007,7 @@ void tst_QTreeWidget::columnCount()
void tst_QTreeWidget::setHeaderLabels()
{
- QStringList list = QString("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z").split(",");
+ QStringList list = QString("a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z").split(QLatin1Char(','));
testWidget->setHeaderLabels(list);
QCOMPARE(testWidget->header()->count(), list.count());
}
@@ -2147,8 +2147,8 @@ void tst_QTreeWidget::insertItemsWithSorting_data()
QStringList ascendingItems;
QStringList reverseItems;
for (int i = 'a'; i <= 'z'; ++i) {
- ascendingItems << QString("%0").arg(QLatin1Char(i));
- reverseItems << QString("%0").arg(QLatin1Char('z' - i + 'a'));
+ ascendingItems << QString(1, QLatin1Char(i));
+ reverseItems << QString(1, QLatin1Char('z' - i + 'a'));
ascendingRows << i - 'a';
reverseRows << 'z' - i + 'a';
}
@@ -2671,9 +2671,9 @@ void tst_QTreeWidget::expandAndCallapse()
QTreeWidgetItem *top = new QTreeWidgetItem(&tw, QStringList() << "top");
QTreeWidgetItem *p;
for (int i = 0; i < 10; ++i) {
- p = new QTreeWidgetItem(top, QStringList() << QString("%1").arg(i));
+ p = new QTreeWidgetItem(top, QStringList(QString::number(i)));
for (int j = 0; j < 10; ++j)
- new QTreeWidgetItem(p, QStringList() << QString("%1").arg(j));
+ new QTreeWidgetItem(p, QStringList(QString::number(j)));
}
QSignalSpy spy0(&tw, SIGNAL(itemExpanded(QTreeWidgetItem*)));
QSignalSpy spy1(&tw, SIGNAL(itemCollapsed(QTreeWidgetItem*)));
@@ -3133,7 +3133,7 @@ void tst_QTreeWidget::selectionOrder()
testWidget->setColumnCount(1);
QList<QTreeWidgetItem *> items;
for (int i = 0; i < 10; ++i)
- items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QString("item: %1").arg(i))));
+ items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(QLatin1String("item: ") + QString::number(i))));
testWidget->insertTopLevelItems(0, items);
QModelIndex idx = testWidget->indexFromItem(items[0]);
diff --git a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro
index 5fa6762617..42a00618a2 100644
--- a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro
+++ b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/qtreewidgetitemiterator.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtreewidgetitemiterator
QT += widgets testlib
SOURCES += tst_qtreewidgetitemiterator.cpp
diff --git a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
index c52198fa2c..2ea78f8154 100644
--- a/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
+++ b/tests/auto/widgets/itemviews/qtreewidgetitemiterator/tst_qtreewidgetitemiterator.cpp
@@ -105,7 +105,8 @@ void tst_QTreeWidgetItemIterator::initTestCase()
*/
for (int i=0; i <= 16; ++i) {
QTreeWidgetItem *top = new QTreeWidgetItem(testWidget);
- top->setText(0, QString("top%1").arg(i));
+ const QString topS = QLatin1String("top") + QString::number(i);
+ top->setText(0, topS);
switch (i) {
case 0: testWidget->setItemHidden(top, true);break;
case 1: testWidget->setItemHidden(top, false);break;
@@ -136,7 +137,7 @@ void tst_QTreeWidgetItemIterator::initTestCase()
}
for (int j=0; j <= 16; ++j) {
QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1,child%2").arg(i).arg(j));
+ child->setText(0, topS + QLatin1String(",child") + QString::number(j));
switch (j) {
case 0: testWidget->setItemHidden(child, true);break;
case 1: testWidget->setItemHidden(child, false);break;
@@ -1074,6 +1075,24 @@ void tst_QTreeWidgetItemIterator::updateIfModifiedFromWidget_data()
<< 3 << 3 << 3 << (int)QTreeWidgetItemIterator::All << 1 << 3 << QString("top0,child1") << QString("top0,child1") << 0;
}
+static void populate3Levels(QTreeWidget &tw, int topLevelItems, int childItems, int grandChildItems)
+{
+ for (int i1 = 0; i1 < topLevelItems; ++i1) {
+ QTreeWidgetItem *top = new QTreeWidgetItem(&tw);
+ const QString top1S = QLatin1String("top") + QString::number(i1);
+ top->setText(0, top1S);
+ for (int i2 = 0; i2 < childItems; ++i2) {
+ QTreeWidgetItem *child = new QTreeWidgetItem(top);
+ const QString childS = top1S + QLatin1String(",child") + QString::number(i2);
+ child->setText(0, childS);
+ for (int i3 = 0; i3 < grandChildItems; ++i3) {
+ QTreeWidgetItem *grandChild = new QTreeWidgetItem(child);
+ grandChild->setText(0, childS + QLatin1String(",grandchild") + QString::number(i3));
+ }
+ }
+ }
+}
+
void tst_QTreeWidgetItemIterator::updateIfModifiedFromWidget()
{
QFETCH(int, topLevelItems);
@@ -1089,18 +1108,7 @@ void tst_QTreeWidgetItemIterator::updateIfModifiedFromWidget()
QTreeWidget tw;
tw.clear();
tw.setColumnCount(2);
- for (int i1=0; i1 < topLevelItems; ++i1) {
- QTreeWidgetItem *top = new QTreeWidgetItem(&tw);
- top->setText(0, QString("top%1").arg(i1));
- for (int i2=0; i2 < childItems; ++i2) {
- QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1,child%2").arg(i1).arg(i2));
- for (int i3=0; i3 < grandChildItems; ++i3) {
- QTreeWidgetItem *grandChild = new QTreeWidgetItem(child);
- grandChild->setText(0, QString("top%1,child%2,grandchild%3").arg(i1).arg(i2).arg(i3));
- }
- }
- }
+ populate3Levels(tw, topLevelItems, childItems, grandChildItems);
QTreeWidgetItemIterator it(&tw, QTreeWidgetItemIterator::IteratorFlags(iteratorflags));
it+=expecteditemindex;
@@ -1161,18 +1169,7 @@ void tst_QTreeWidgetItemIterator::updateIteratorAfterDeletedItem_and_ContinueIte
QTreeWidget tw;
tw.clear();
tw.setColumnCount(2);
- for (int i1=0; i1 < topLevelItems; ++i1) {
- QTreeWidgetItem *top = new QTreeWidgetItem(&tw);
- top->setText(0, QString("top%1").arg(i1));
- for (int i2=0; i2 < childItems; ++i2) {
- QTreeWidgetItem *child = new QTreeWidgetItem(top);
- child->setText(0, QString("top%1,child%2").arg(i1).arg(i2));
- for (int i3=0; i3 < grandChildItems; ++i3) {
- QTreeWidgetItem *grandChild = new QTreeWidgetItem(child);
- grandChild->setText(0, QString("top%1,child%2,grandchild%3").arg(i1).arg(i2).arg(i3));
- }
- }
- }
+ populate3Levels(tw, topLevelItems, childItems, grandChildItems);
QTreeWidgetItemIterator it(&tw, QTreeWidgetItemIterator::All);
it += iterator_initial_index;
diff --git a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp
index 71b55d71ea..02276e7651 100644
--- a/tests/auto/widgets/kernel/qaction/tst_qaction.cpp
+++ b/tests/auto/widgets/kernel/qaction/tst_qaction.cpp
@@ -334,9 +334,9 @@ void tst_QAction::task200823_tooltip()
action->setShortcut(shortcut);
// we want a non-standard tooltip that shows the shortcut
- action->setToolTip(QString("%1 (%2)").arg(action->text()).arg(action->shortcut().toString()));
+ action->setToolTip(action->text() + QLatin1String(" (") + action->shortcut().toString() + QLatin1Char(')'));
- QString ref = QString("foo (%1)").arg(QKeySequence(shortcut).toString());
+ QString ref = QLatin1String("foo (") + QKeySequence(shortcut).toString() + QLatin1Char(')');
QCOMPARE(action->toolTip(), ref);
}
diff --git a/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro b/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro
index 82c0204aa8..87521edfe9 100644
--- a/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro
+++ b/tests/auto/widgets/kernel/qactiongroup/qactiongroup.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qactiongroup
QT += widgets testlib
SOURCES += tst_qactiongroup.cpp
diff --git a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
index 878136b4a0..1257a3f420 100644
--- a/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
+++ b/tests/auto/widgets/kernel/qapplication/tst_qapplication.cpp
@@ -133,9 +133,11 @@ private slots:
void testDeleteLater();
void testDeleteLaterProcessEvents();
+#ifndef QT_NO_LIBRARY
void libraryPaths();
void libraryPaths_qt_plugin_path();
void libraryPaths_qt_plugin_path_2();
+#endif
void sendPostedEvents();
@@ -398,11 +400,12 @@ void tst_QApplication::setFont_data()
if (!sizes.size())
sizes = fdb.standardSizes();
if (sizes.size() > 0) {
- QTest::newRow(QString("data%1a").arg(cnt).toLatin1().constData())
+ const QByteArray cntB = QByteArray::number(cnt);
+ QTest::newRow(("data" + cntB + "a").constData())
<< family
<< sizes.first()
<< false;
- QTest::newRow(QString("data%1b").arg(cnt).toLatin1().constData())
+ QTest::newRow(("data" + cntB + "b").constData())
<< family
<< sizes.first()
<< true;
@@ -500,7 +503,7 @@ static QString cstrings2QString( char **args )
while ( args[i] ) {
string += args[i];
if ( args[i+1] )
- string += " ";
+ string += QLatin1Char(' ');
++i;
}
return string;
@@ -909,6 +912,7 @@ bool isPathListIncluded(const QStringList &l, const QStringList &r)
return j == r.count();
}
+#ifndef QT_NO_LIBRARY
#define QT_TST_QAPP_DEBUG
void tst_QApplication::libraryPaths()
{
@@ -1057,16 +1061,16 @@ void tst_QApplication::libraryPaths_qt_plugin_path_2()
#ifdef Q_OS_UNIX
QByteArray validPath = QDir("/tmp").canonicalPath().toLatin1();
QByteArray nonExistentPath = "/nonexistent";
- QByteArray pluginPath = validPath + ":" + nonExistentPath;
+ QByteArray pluginPath = validPath + ':' + nonExistentPath;
#elif defined(Q_OS_WIN)
# ifdef Q_OS_WINCE
QByteArray validPath = "/Temp";
QByteArray nonExistentPath = "/nonexistent";
- QByteArray pluginPath = validPath + ";" + nonExistentPath;
+ QByteArray pluginPath = validPath + ';' + nonExistentPath;
# else
QByteArray validPath = "C:\\windows";
QByteArray nonExistentPath = "Z:\\nonexistent";
- QByteArray pluginPath = validPath + ";" + nonExistentPath;
+ QByteArray pluginPath = validPath + ';' + nonExistentPath;
# endif
#endif
@@ -1114,6 +1118,7 @@ void tst_QApplication::libraryPaths_qt_plugin_path_2()
qputenv("QT_PLUGIN_PATH", QByteArray());
}
}
+#endif
class SendPostedEventsTester : public QObject
{
diff --git a/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro b/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro
index e30a4b57b1..90e83f5285 100644
--- a/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro
+++ b/tests/auto/widgets/kernel/qboxlayout/qboxlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qboxlayout
QT += widgets testlib
SOURCES += tst_qboxlayout.cpp
diff --git a/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro b/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro
index 77709df5da..1ab155f22e 100644
--- a/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro
+++ b/tests/auto/widgets/kernel/qdesktopwidget/qdesktopwidget.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdesktopwidget
QT += widgets testlib
SOURCES += tst_qdesktopwidget.cpp
diff --git a/tests/auto/widgets/kernel/qformlayout/qformlayout.pro b/tests/auto/widgets/kernel/qformlayout/qformlayout.pro
index 668b890c97..be944605a3 100644
--- a/tests/auto/widgets/kernel/qformlayout/qformlayout.pro
+++ b/tests/auto/widgets/kernel/qformlayout/qformlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qformlayout
QT += widgets testlib
SOURCES += tst_qformlayout.cpp
diff --git a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
index e1b494c9f1..dc3be524f8 100644
--- a/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
+++ b/tests/auto/widgets/kernel/qformlayout/tst_qformlayout.cpp
@@ -184,7 +184,7 @@ void tst_QFormLayout::getItemPosition()
QList<QLabel*> labels;
QList<QLineEdit*> fields;
for (int i = 0; i < 5; ++i) {
- labels.append(new QLabel(QString("Label %1").arg(i+1)));
+ labels.append(new QLabel(QLatin1String("Label " ) + QString::number(i + 1)));
fields.append(new QLineEdit);
fl->addRow(labels[i], fields[i]);
}
@@ -493,8 +493,8 @@ void tst_QFormLayout::addRow()
QVERIFY(layout->itemAt(0, QFormLayout::LabelRole)->widget() == lbl1);
QVERIFY(layout->itemAt(1, QFormLayout::LabelRole)->widget() == lbl2);
- QVERIFY(layout->itemAt(2, QFormLayout::LabelRole)->widget()->property("text") == "Foo:");
- QVERIFY(layout->itemAt(3, QFormLayout::LabelRole)->widget()->property("text") == "Bar:");
+ QCOMPARE(layout->itemAt(2, QFormLayout::LabelRole)->widget()->property("text").toString(), QLatin1String("Foo:"));
+ QCOMPARE(layout->itemAt(3, QFormLayout::LabelRole)->widget()->property("text").toString(), QLatin1String("Bar:"));
QVERIFY(layout->itemAt(4, QFormLayout::LabelRole) == 0);
QVERIFY(layout->itemAt(5, QFormLayout::LabelRole) == 0);
diff --git a/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro b/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro
index febcee6c55..ee64f8538f 100644
--- a/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro
+++ b/tests/auto/widgets/kernel/qgridlayout/qgridlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qgridlayout
QT += widgets widgets-private testlib
diff --git a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
index 1e67c675ef..0ad8e30351 100644
--- a/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
+++ b/tests/auto/widgets/kernel/qgridlayout/tst_qgridlayout.cpp
@@ -538,7 +538,8 @@ public:
}
private:
void init(int numPixels = -1){
- setText(QString::fromLatin1("(%1,%2)").arg(sh.width()).arg(sh.height()));
+ setText(QLatin1Char('(') + QString::number(sh.width())
+ + QLatin1Char(',') + QString::number(sh.height()) + QLatin1Char(')'));
setFrameStyle(QFrame::Box | QFrame::Plain);
setNumberOfPixels(numPixels);
}
@@ -1432,8 +1433,9 @@ void tst_QGridLayout::layoutSpacing_data()
w->setLayout(layout);
int pw = up->sizeHint().width();
int ph = up->sizeHint().height();
- QByteArray testName = QString::fromLatin1("arrowpad with %1 empty rows, %2 empty columns").arg(yoff).arg(xoff).toLatin1();
- QTest::newRow(testName.data())
+ QByteArray testName = "arrowpad with " + QByteArray::number(yoff)
+ + " empty rows, " + QByteArray::number(xoff) + " empty columns";
+ QTest::newRow(testName.constData())
<< w << (PointList()
<< QPoint(0 + pw + 5, 3)
<< QPoint(0, 3 + ph + 10)
@@ -1686,7 +1688,7 @@ void tst_QGridLayout::replaceWidget()
for (int n = 0; n < itemCount; ++n) {
int x = n % 3;
int y = n / 3;
- labels[n] = new QLabel(QString("label %1").arg(n));
+ labels[n] = new QLabel(QLatin1String("label ") + QString::number(n));
Qt::Alignment align = (n % 3 ? Qt::AlignLeft : Qt::AlignRight);
l->addWidget(labels[n], x * 3, y * 3, (n % 2) + 1, (n + 1) % 2 + 1, align);
}
diff --git a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
index 4d15ac9a93..5413b274d4 100644
--- a/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
+++ b/tests/auto/widgets/kernel/qlayout/tst_qlayout.cpp
@@ -195,7 +195,7 @@ void tst_QLayout::smartMaxSize()
int width = sz.width();
int expectedWidth = expectedWidths[expectedIndex];
if (width != expectedWidth) {
- qDebug() << "error at index" << expectedIndex << ":" << sizePolicy.horizontalPolicy() << align << minSize << sizeHint << maxSize << width;
+ qDebug() << "error at index" << expectedIndex << ':' << sizePolicy.horizontalPolicy() << align << minSize << sizeHint << maxSize << width;
++regressionCount;
}
++expectedIndex;
diff --git a/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp b/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
index f206a5fe9a..5641e60078 100644
--- a/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
+++ b/tests/auto/widgets/kernel/qshortcut/tst_qshortcut.cpp
@@ -180,12 +180,13 @@ protected:
QKeyEvent *ke = static_cast<QKeyEvent*>(e);
if (ke->modifiers() && ke->key() > Qt::Key_Any
&& ke->key() < Qt::Key_ydiaeresis) {
+ const QChar c = QLatin1Char(char(ke->key()));
if (ke->modifiers() == Qt::ControlModifier)
- insertPlainText(QString("<Ctrl+%1>").arg(char(ke->key())));
+ insertPlainText(QLatin1String("<Ctrl+") + c + QLatin1Char('>'));
else if (ke->modifiers() == Qt::AltModifier)
- insertPlainText(QString("<Alt+%1>").arg(char(ke->key())));
+ insertPlainText(QLatin1String("<Alt+") + c + QLatin1Char('>'));
else if (ke->modifiers() == Qt::ShiftModifier)
- insertPlainText(QString("<Shift+%1>").arg(char(ke->key())));
+ insertPlainText(QLatin1String("<Shift+") + c + QLatin1Char('>'));
return true;
}
}
diff --git a/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro b/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro
index cd80253e12..1f94c1b386 100644
--- a/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro
+++ b/tests/auto/widgets/kernel/qstackedlayout/qstackedlayout.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstackedlayout
QT += widgets testlib
SOURCES += tst_qstackedlayout.cpp
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
index f3f4467b80..eb39f8fff8 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget.cpp
@@ -5644,7 +5644,7 @@ void tst_QWidget::setToolTip()
for (int pass = 0; pass < 2; ++pass) {
QCursor::setPos(0, 0);
QScopedPointer<QWidget> popup(new QWidget(0, Qt::Popup));
- popup->setObjectName(QString::fromLatin1("tst_qwidget setToolTip #%1").arg(pass));
+ popup->setObjectName(QLatin1String("tst_qwidget setToolTip #") + QString::number(pass));
popup->setWindowTitle(popup->objectName());
popup->setGeometry(50, 50, 150, 50);
QFrame *frame = new QFrame(popup.data());
diff --git a/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm b/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm
index c67682fd85..293b3387ee 100644
--- a/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm
+++ b/tests/auto/widgets/kernel/qwidget/tst_qwidget_mac_helpers.mm
@@ -39,7 +39,7 @@
#include <qpa/qplatformnativeinterface.h>
#include <private/qcore_mac_p.h>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
QString nativeWindowTitle(QWidget *window, Qt::WindowState state)
{
diff --git a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro
index d61681d5cb..8672c363a2 100644
--- a/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro
+++ b/tests/auto/widgets/kernel/qwidget_window/qwidget_window.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwidget_window
QT += widgets testlib core-private gui-private
SOURCES += tst_qwidget_window.cpp
diff --git a/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro b/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro
index 0029ebd51e..e4158559a9 100644
--- a/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro
+++ b/tests/auto/widgets/kernel/qwidgetaction/qwidgetaction.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwidgetaction
QT += widgets testlib
SOURCES += tst_qwidgetaction.cpp
diff --git a/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro b/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro
index e3f2da96bd..7979e92087 100644
--- a/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro
+++ b/tests/auto/widgets/kernel/qwidgetsvariant/qwidgetsvariant.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qwidgetsvariant
INCLUDEPATH += $$PWD/../../../other/qvariant_common
SOURCES += tst_qwidgetsvariant.cpp
diff --git a/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro b/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro
index 4ff05eb04a..17fc1d28b5 100644
--- a/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro
+++ b/tests/auto/widgets/kernel/qwindowcontainer/qwindowcontainer.pro
@@ -1,6 +1,5 @@
CONFIG += testcase
mac:CONFIG -= app_bundle
-# CONFIG += parallel_test // Cannot be parallel due to the activation test
TARGET = tst_qwindowcontainer
QT += widgets testlib
SOURCES += tst_qwindowcontainer.cpp
diff --git a/tests/auto/widgets/styles/qstyle/qstyle.pro b/tests/auto/widgets/styles/qstyle/qstyle.pro
index b4546aa760..4d7473f068 100644
--- a/tests/auto/widgets/styles/qstyle/qstyle.pro
+++ b/tests/auto/widgets/styles/qstyle/qstyle.pro
@@ -1,7 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qstyle
-TARGET.EPOCHEAPSIZE = 0x200000 0x800000
QT += widgets testlib
SOURCES += tst_qstyle.cpp
diff --git a/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro b/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro
index 2ca24c4f43..bf12a6b30f 100644
--- a/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro
+++ b/tests/auto/widgets/styles/qstyleoption/qstyleoption.pro
@@ -2,7 +2,6 @@ TEMPLATE = app
TARGET = tst_qstyleoption
CONFIG += testcase
-CONFIG += parallel_test
QT += widgets testlib
SOURCES += tst_qstyleoption.cpp
diff --git a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
index a360803c50..3d42ee98a8 100644
--- a/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
+++ b/tests/auto/widgets/styles/qstylesheetstyle/tst_qstylesheetstyle.cpp
@@ -55,6 +55,7 @@ public:
~tst_QStyleSheetStyle();
private slots:
+ void init();
void repolish();
void numinstances();
void widgetsBeforeAppStyleSheet();
@@ -71,8 +72,12 @@ private slots:
void layoutSpacing();
#endif
void qproperty();
+ void palettePropagation_data();
void palettePropagation();
+ void fontPropagation_data();
void fontPropagation();
+ void widgetStylePropagation_data();
+ void widgetStylePropagation();
void onWidgetDestroyed();
void fontPrecedence();
void focusColors();
@@ -137,6 +142,12 @@ tst_QStyleSheetStyle::~tst_QStyleSheetStyle()
{
}
+void tst_QStyleSheetStyle::init()
+{
+ qApp->setStyleSheet(QString());
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, false);
+}
+
void tst_QStyleSheetStyle::numinstances()
{
QWidget w;
@@ -627,31 +638,80 @@ void tst_QStyleSheetStyle::namespaces()
QCOMPARE(BACKGROUND(pb2), red);
}
+void tst_QStyleSheetStyle::palettePropagation_data()
+{
+ QTest::addColumn<QString>("applicationStyleSheet");
+ QTest::addColumn<bool>("widgetStylePropagation");
+ QTest::newRow("Widget style propagation") << " " << true;
+ QTest::newRow("Widget style propagation, no application style sheet") << QString() << true;
+ QTest::newRow("Default propagation") << " " << false;
+ QTest::newRow("Default propagation, no application style sheet") << QString() << false;
+}
+
void tst_QStyleSheetStyle::palettePropagation()
{
- qApp->setStyleSheet("");
+ QFETCH(QString, applicationStyleSheet);
+ QFETCH(bool, widgetStylePropagation);
+
+ qApp->setStyleSheet(applicationStyleSheet);
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, widgetStylePropagation);
+
QGroupBox gb;
- QPushButton *push = new QPushButton(&gb);
- QPushButton &pb = *push;
- push->setText("AsdF");
+ QLabel *label = new QLabel(&gb);
+ QLabel &lb = *label;
+ label->setText("AsdF");
gb.setStyleSheet("QGroupBox { color: red }");
- QVERIFY(COLOR(gb) == Qt::red);
- QVERIFY(COLOR(pb) == APPCOLOR(pb)); // palette shouldn't propagate
- gb.setStyleSheet("QGroupBox * { color: red }");
+ QCOMPARE(COLOR(gb), QColor(Qt::red));
- QVERIFY(COLOR(pb) == Qt::red);
- QVERIFY(COLOR(gb) == APPCOLOR(gb));
+ if (widgetStylePropagation) {
+ QCOMPARE(COLOR(lb), QColor(Qt::red)); // palette should propagate in standard mode
+ } else {
+ QCOMPARE(COLOR(lb), APPCOLOR(lb)); // palette shouldn't propagate
+ }
QWidget window;
+ lb.setParent(&window);
+ if (widgetStylePropagation) {
+ // In standard propagation mode, widgets that are not explicitly
+ // targeted do not have their propagated palette unset when they are
+ // unpolished by changing parents. This is consistent with regular Qt
+ // widgets, who also maintain their propagated palette when changing
+ // parents
+ QCOMPARE(COLOR(lb), QColor(Qt::red));
+ } else {
+ QCOMPARE(COLOR(lb), APPCOLOR(lb));
+ }
+ lb.setParent(&gb);
+
+ gb.setStyleSheet("QGroupBox * { color: red }");
+
+ QCOMPARE(COLOR(lb), QColor(Qt::red));
+ QCOMPARE(COLOR(gb), APPCOLOR(gb));
+
window.setStyleSheet("* { color: white; }");
- pb.setParent(&window);
- QVERIFY(COLOR(pb) == Qt::white);
+ lb.setParent(&window);
+ QCOMPARE(COLOR(lb), QColor(Qt::white));
+}
+
+void tst_QStyleSheetStyle::fontPropagation_data()
+{
+ QTest::addColumn<QString>("applicationStyleSheet");
+ QTest::addColumn<bool>("widgetStylePropagation");
+ QTest::newRow("Widget style propagation") << " " << true;
+ QTest::newRow("Widget style propagation, no application style sheet") << QString() << true;
+ QTest::newRow("Default propagation") << " " << false;
+ QTest::newRow("Default propagation, no application style sheet") << QString() << false;
}
void tst_QStyleSheetStyle::fontPropagation()
{
- qApp->setStyleSheet("");
+ QFETCH(QString, applicationStyleSheet);
+ QFETCH(bool, widgetStylePropagation);
+
+ qApp->setStyleSheet(applicationStyleSheet);
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, widgetStylePropagation);
+
QComboBox cb;
cb.addItem("item1");
cb.addItem("item2");
@@ -661,7 +721,11 @@ void tst_QStyleSheetStyle::fontPropagation()
cb.setStyleSheet("QComboBox { font-size: 20pt; }");
QCOMPARE(FONTSIZE(cb), 20);
- QCOMPARE(FONTSIZE(*popup), viewFontSize);
+ if (widgetStylePropagation) {
+ QCOMPARE(FONTSIZE(*popup), 20);
+ } else {
+ QCOMPARE(FONTSIZE(*popup), viewFontSize);
+ }
QGroupBox gb;
QPushButton *push = new QPushButton(&gb);
QPushButton &pb = *push;
@@ -670,7 +734,11 @@ void tst_QStyleSheetStyle::fontPropagation()
gb.setStyleSheet("QGroupBox { font-size: 20pt }");
QCOMPARE(FONTSIZE(gb), 20);
- QVERIFY(FONTSIZE(pb) == buttonFontSize); // font does not propagate
+ if (widgetStylePropagation) {
+ QCOMPARE(FONTSIZE(pb), 20);
+ } else {
+ QCOMPARE(FONTSIZE(pb), buttonFontSize); // font does not propagate
+ }
gb.setStyleSheet("QGroupBox * { font-size: 20pt; }");
QCOMPARE(FONTSIZE(gb), gbFontSize);
QCOMPARE(FONTSIZE(pb), 20);
@@ -1471,12 +1539,14 @@ void tst_QStyleSheetStyle::embeddedFonts()
QCOMPARE(spin.font().pixelSize(), 32);
QCOMPARE(embedded->font().pixelSize(), 32);
+#ifndef QT_NO_CONTEXTMENU
QMenu *menu = embedded->createStandardContextMenu();
menu->show();
QTest::qWait(20);
QVERIFY(menu);
QVERIFY(menu->font().pixelSize() != 32);
QCOMPARE(menu->font().pixelSize(), qApp->font(menu).pixelSize());
+#endif // QT_NO_CONTEXTMENU
//task 242556
QComboBox box;
@@ -1744,8 +1814,11 @@ void tst_QStyleSheetStyle::QTBUG36933_brokenPseudoClassLookup()
QTableWidget widget(rowCount, columnCount);
for (int row = 0; row < rowCount; ++row) {
- for (int column = 0; column < columnCount; ++column)
- widget.setItem(row, column, new QTableWidgetItem(QStringLiteral("row %1 column %2").arg(row + 1).arg(column + 1)));
+ for (int column = 0; column < columnCount; ++column) {
+ const QString t = QLatin1String("row ") + QString::number(row + 1)
+ + QLatin1String(" column ") + QString::number(column + 1);
+ widget.setItem(row, column, new QTableWidgetItem(t));
+ }
// put no visible text for the vertical headers, but still put some text or they will collapse
widget.setVerticalHeaderItem(row, new QTableWidgetItem(QStringLiteral(" ")));
@@ -1794,6 +1867,138 @@ void tst_QStyleSheetStyle::styleSheetChangeBeforePolish()
QVERIFY(testForColors(image2, QColor(0x00, 0xFF, 0x00)));
}
+void tst_QStyleSheetStyle::widgetStylePropagation_data()
+{
+ QTest::addColumn<QString>("applicationStyleSheet");
+ QTest::addColumn<QString>("parentStyleSheet");
+ QTest::addColumn<QString>("childStyleSheet");
+ QTest::addColumn<QFont>("parentFont");
+ QTest::addColumn<QFont>("childFont");
+ QTest::addColumn<QPalette>("parentPalette");
+ QTest::addColumn<QPalette>("childPalette");
+ QTest::addColumn<int>("parentExpectedSize");
+ QTest::addColumn<int>("childExpectedSize");
+ QTest::addColumn<QColor>("parentExpectedColor");
+ QTest::addColumn<QColor>("childExpectedColor");
+
+ QFont noFont;
+ QFont font45; font45.setPointSize(45);
+ QFont font32; font32.setPointSize(32);
+
+ QPalette noPalette;
+ QPalette redPalette; redPalette.setColor(QPalette::WindowText, QColor("red"));
+ QPalette greenPalette; greenPalette.setColor(QPalette::WindowText, QColor("green"));
+
+ QLabel defaultLabel;
+
+ int defaultSize = defaultLabel.font().pointSize();
+ QColor defaultColor = defaultLabel.palette().color(defaultLabel.foregroundRole());
+ QColor redColor("red");
+ QColor greenColor("green");
+
+ // Check regular Qt propagation works as expected, with and without a
+ // non-interfering application stylesheet
+ QTest::newRow("defaults")
+ << QString() << QString() << QString()
+ << noFont << noFont << noPalette << noPalette
+ << defaultSize << defaultSize << defaultColor << defaultColor;
+ QTest::newRow("parent font propagation, no application style sheet")
+ << QString() << QString() << QString()
+ << font45 << noFont << noPalette << noPalette
+ << 45 << 45 << defaultColor << defaultColor;
+ QTest::newRow("parent font propagation, dummy application style sheet")
+ << "QGroupBox { font-size: 64pt }" << QString() << QString()
+ << font45 << noFont << noPalette << noPalette
+ << 45 << 45 << defaultColor << defaultColor;
+ QTest::newRow("parent color propagation, no application style sheet")
+ << QString() << QString() << QString()
+ << noFont << noFont << redPalette << noPalette
+ << defaultSize << defaultSize << redColor << redColor;
+ QTest::newRow("parent color propagation, dummy application style sheet")
+ << "QGroupBox { color: blue }" << QString() << QString()
+ << noFont << noFont << redPalette << noPalette
+ << defaultSize << defaultSize << redColor << redColor;
+
+ // Parent style sheet propagates to child if child has not explicitly
+ // set a value
+ QTest::newRow("parent style sheet color propagation")
+ << "#parentLabel { color: red }" << QString() << QString()
+ << noFont << noFont << noPalette << noPalette
+ << defaultSize << defaultSize << redColor << redColor;
+ QTest::newRow("parent style sheet font propagation")
+ << "#parentLabel { font-size: 45pt }" << QString() << QString()
+ << noFont << noFont << noPalette << noPalette
+ << 45 << 45 << defaultColor << defaultColor;
+
+ // Parent style sheet does not propagate to child if child has explicitly
+ // set a value
+ QTest::newRow("parent style sheet color propagation, child explicitly set")
+ << "#parentLabel { color: red }" << QString() << QString()
+ << noFont << noFont << noPalette << greenPalette
+ << defaultSize << defaultSize << redColor << greenColor;
+ QTest::newRow("parent style sheet font propagation, child explicitly set")
+ << "#parentLabel { font-size: 45pt }" << QString() << QString()
+ << noFont << font32 << noPalette << noPalette
+ << 45 << 32 << defaultColor << defaultColor;
+
+ // Parent does not propagate to child when child is target of style sheet
+ QTest::newRow("parent style sheet font propagation, child application style sheet")
+ << "#childLabel { font-size: 32pt }" << QString() << QString()
+ << font45 << noFont << noPalette << noPalette
+ << 45 << 32 << defaultColor << defaultColor;
+ QTest::newRow("parent style sheet color propagation, child application style sheet")
+ << "#childLabel { color: green }" << QString() << QString()
+ << noFont << noFont << redPalette << noPalette
+ << defaultSize << defaultSize << redColor << greenColor;
+}
+
+void tst_QStyleSheetStyle::widgetStylePropagation()
+{
+ QFETCH(QString, applicationStyleSheet);
+ QFETCH(QString, parentStyleSheet);
+ QFETCH(QString, childStyleSheet);
+
+ QFETCH(QFont, parentFont);
+ QFETCH(QFont, childFont);
+ QFETCH(QPalette, parentPalette);
+ QFETCH(QPalette, childPalette);
+
+ QFETCH(int, parentExpectedSize);
+ QFETCH(int, childExpectedSize);
+ QFETCH(QColor, parentExpectedColor);
+ QFETCH(QColor, childExpectedColor);
+
+ QCoreApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);
+
+ qApp->setStyleSheet(applicationStyleSheet);
+
+ QLabel parentLabel;
+ parentLabel.setObjectName("parentLabel");
+ QLabel childLabel(&parentLabel);
+ childLabel.setObjectName("childLabel");
+
+ if (parentFont.resolve())
+ parentLabel.setFont(parentFont);
+ if (childFont.resolve())
+ childLabel.setFont(childFont);
+ if (parentPalette.resolve())
+ parentLabel.setPalette(parentPalette);
+ if (childPalette.resolve())
+ childLabel.setPalette(childPalette);
+ if (!parentStyleSheet.isEmpty())
+ parentLabel.setStyleSheet(parentStyleSheet);
+ if (!childStyleSheet.isEmpty())
+ childLabel.setStyleSheet(childStyleSheet);
+
+ parentLabel.ensurePolished();
+ childLabel.ensurePolished();
+
+ QCOMPARE(FONTSIZE(parentLabel), parentExpectedSize);
+ QCOMPARE(FONTSIZE(childLabel), childExpectedSize);
+ QCOMPARE(COLOR(parentLabel), parentExpectedColor);
+ QCOMPARE(COLOR(childLabel), childExpectedColor);
+}
+
QTEST_MAIN(tst_QStyleSheetStyle)
#include "tst_qstylesheetstyle.moc"
diff --git a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
index e8ac9aa5d2..fdeb6d100d 100644
--- a/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
+++ b/tests/auto/widgets/util/qcompleter/tst_qcompleter.cpp
@@ -61,7 +61,7 @@ public:
protected:
QStringList splitPath(const QString &path) const {
- return csv ? path.split(",") : QCompleter::splitPath(path);
+ return csv ? path.split(QLatin1Char(',')) : QCompleter::splitPath(path);
}
private:
@@ -367,7 +367,7 @@ void tst_QCompleter::csMatchingOnCsSortedModel_data()
QTest::addColumn<QString>("completion");
QTest::addColumn<QString>("completionText");
-#define ROWNAME(name) (qPrintable(QString("%1 %2").arg(name).arg(i)))
+#define ROWNAME(name) ((QByteArray(name) + ' ' + QByteArray::number(i)).constData())
for (int i = 0; i < 2; i++) {
if (i == 1)
@@ -1164,7 +1164,7 @@ void tst_QCompleter::dynamicSortOrder()
completer.setModelSorting(QCompleter::CaseSensitivelySortedModel);
QStandardItem *root = model.invisibleRootItem();
for (int i = 0; i < 20; i++) {
- root->appendRow(new QStandardItem(QString("%1").arg(i)));
+ root->appendRow(new QStandardItem(QString::number(i)));
}
root->appendRow(new QStandardItem("13"));
root->sortChildren(0, Qt::AscendingOrder);
@@ -1256,7 +1256,7 @@ void tst_QCompleter::task189564_omitNonSelectableItems()
QStringList strings;
for (int i = 0; i < n; ++i)
- strings << QString("%1%2").arg(prefix).arg(i);
+ strings << prefix + QString::number(i);
const QString omitString(strings.at(n / 2));
task189564_StringListModel model(omitString);
model.setStringList(strings);
@@ -1553,9 +1553,9 @@ void tst_QCompleter::task247560_keyboardNavigation()
QStandardItemModel model;
for (int i = 0; i < 5; i++) {
- for (int j = 0; j < 5; j++) {
- model.setItem(i, j, new QStandardItem(QString("row %1 column %2").arg(i).arg(j)));
- }
+ const QString prefix = QLatin1String("row ") + QString::number(i) + QLatin1String(" column ");
+ for (int j = 0; j < 5; j++)
+ model.setItem(i, j, new QStandardItem(prefix + QString::number(j)));
}
diff --git a/tests/auto/widgets/util/qscroller/qscroller.pro b/tests/auto/widgets/util/qscroller/qscroller.pro
index 55f57f5ed1..29e8378f2b 100644
--- a/tests/auto/widgets/util/qscroller/qscroller.pro
+++ b/tests/auto/widgets/util/qscroller/qscroller.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscroller
QT += widgets testlib gui-private
diff --git a/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro b/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro
index d409d23650..e9310fc234 100644
--- a/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro
+++ b/tests/auto/widgets/util/qsystemtrayicon/qsystemtrayicon.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsystemtrayicon
QT += widgets testlib
SOURCES += tst_qsystemtrayicon.cpp
diff --git a/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro b/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro
index 911898407b..2d9aa52e3a 100644
--- a/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro
+++ b/tests/auto/widgets/widgets/qabstractscrollarea/qabstractscrollarea.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractscrollarea
QT += widgets testlib
SOURCES += tst_qabstractscrollarea.cpp
diff --git a/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro b/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro
index 020be08867..6453999786 100644
--- a/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro
+++ b/tests/auto/widgets/widgets/qabstractslider/qabstractslider.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractslider
QT += widgets testlib
SOURCES += tst_qabstractslider.cpp
diff --git a/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro b/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro
index 8fa1c0fcac..f9b601228e 100644
--- a/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro
+++ b/tests/auto/widgets/widgets/qabstractspinbox/qabstractspinbox.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qabstractspinbox
QT += widgets testlib
SOURCES += tst_qabstractspinbox.cpp
diff --git a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
index 03e8ed75ed..88b9d08557 100644
--- a/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
+++ b/tests/auto/widgets/widgets/qcombobox/qcombobox.pro
@@ -2,4 +2,3 @@ CONFIG += testcase
TARGET = tst_qcombobox
QT += widgets widgets-private gui-private core-private testlib
SOURCES += tst_qcombobox.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
index 09129f0676..eb8b610352 100644
--- a/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
+++ b/tests/auto/widgets/widgets/qcombobox/tst_qcombobox.cpp
@@ -2308,9 +2308,10 @@ void tst_QComboBox::task191329_size()
QStandardItemModel model(rows, 2);
for (int row = 0; row < model.rowCount(); ++row) {
+ const QString rowS = QLatin1String("row ") + QString::number(row);
for (int column = 0; column < model.columnCount(); ++column) {
- QStandardItem *item = new QStandardItem(QString("row %0, column %1").arg(row).arg(column));
- model.setItem(row, column, item);
+ const QString text = rowS + QLatin1String(", column ") + QString::number(column);
+ model.setItem(row, column, new QStandardItem(text));
}
}
QTableView *table = new QTableView();
@@ -2687,7 +2688,8 @@ void tst_QComboBox::resetModel()
void reset()
{
- QStringListModel::reset();
+ QStringListModel::beginResetModel();
+ QStringListModel::endResetModel();
}
};
QComboBox cb;
@@ -2859,10 +2861,11 @@ void tst_QComboBox::task_QTBUG_10491_currentIndexAndModelColumn()
QStandardItemModel model(4, 4, &comboBox);
for (int i = 0; i < 4; i++){
- model.setItem(i, 0, new QStandardItem(QString("Employee Nr %1").arg(i)));
- model.setItem(i, 1, new QStandardItem(QString("Street Nr %1").arg(i)));
- model.setItem(i, 2, new QStandardItem(QString("Town Nr %1").arg(i)));
- model.setItem(i, 3, new QStandardItem(QString("Phone Nr %1").arg(i)));
+ const QString iS = QString::number(i);
+ model.setItem(i, 0, new QStandardItem(QLatin1String("Employee Nr ") + iS));
+ model.setItem(i, 1, new QStandardItem(QLatin1String("Street Nr ") + iS));
+ model.setItem(i, 2, new QStandardItem(QLatin1String("Town Nr ") + iS));
+ model.setItem(i, 3, new QStandardItem(QLatin1String("Phone Nr ") + iS));
}
comboBox.setModel(&model);
comboBox.setModelColumn(0);
@@ -2908,12 +2911,12 @@ void tst_QComboBox::itemData()
// ensure that the currentText(), the DisplayRole and the EditRole
// stay in sync when using QComboBox's default model
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
+ QString itemText = QLatin1String("item text ") + QString::number(i);
comboBox.addItem(itemText);
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
+ QString itemText = QLatin1String("item text ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2925,14 +2928,11 @@ void tst_QComboBox::itemData()
QCOMPARE(comboBox.currentData(Qt::EditRole).toString(), itemText);
}
- for (int i = 0; i < itemCount; ++i) {
- // now change by using setItemText
- QString itemText = QString("setItemText %1").arg(i);
- comboBox.setItemText(i, itemText);
- }
+ for (int i = 0; i < itemCount; ++i) // now change by using setItemText
+ comboBox.setItemText(i, QLatin1String("setItemText ") + QString::number(i));
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("setItemText %1").arg(i);
+ QString itemText = QLatin1String("setItemText ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2946,12 +2946,12 @@ void tst_QComboBox::itemData()
for (int i = 0; i < itemCount; ++i) {
// now change by changing the DisplayRole's data
- QString itemText = QString("setItemData(DisplayRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(DisplayRole) ") + QString::number(i);
comboBox.setItemData(i, QVariant(itemText), Qt::DisplayRole);
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("setItemData(DisplayRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(DisplayRole) ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2965,12 +2965,12 @@ void tst_QComboBox::itemData()
for (int i = 0; i < itemCount; ++i) {
// now change by changing the EditRole's data
- QString itemText = QString("setItemData(EditRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(EditRole) ") + QString::number(i);
comboBox.setItemData(i, QVariant(itemText), Qt::EditRole);
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("setItemData(EditRole) %1").arg(i);
+ QString itemText = QLatin1String("setItemData(EditRole) ") + QString::number(i);
QCOMPARE(comboBox.itemText(i), itemText);
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
@@ -2987,14 +2987,14 @@ void tst_QComboBox::itemData()
// set additional user data in the addItem call
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
- comboBox.addItem(itemText, QVariant(itemDataText));
+ const QString iS = QString::number(i);
+ comboBox.addItem(QLatin1String("item text ") + iS, QVariant(QLatin1String("item data ") + iS));
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
+ const QString iS = QString::number(i);
+ QString itemText = QLatin1String("item text ") + iS;
+ QString itemDataText = QLatin1String("item data ") + iS;
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i).toString(), itemDataText);
@@ -3017,8 +3017,9 @@ void tst_QComboBox::itemData()
QString qtlogoPath = QFINDTESTDATA("qtlogo.png");
QIcon icon = QIcon(QPixmap(qtlogoPath));
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
+ const QString iS = QString::number(i);
+ QString itemText = QLatin1String("item text ") + iS;
+ QString itemDataText = QLatin1String("item data ") + iS;
double d = i;
comboBox.addItem(itemText);
comboBox.setItemData(i, QVariant(itemDataText), Qt::UserRole);
@@ -3027,8 +3028,9 @@ void tst_QComboBox::itemData()
}
for (int i = 0; i < itemCount; ++i) {
- QString itemText = QString("item text %1").arg(i);
- QString itemDataText = QString("item data %1").arg(i);
+ const QString iS = QString::number(i);
+ QString itemText = QLatin1String("item text ") + iS;
+ QString itemDataText = QLatin1String("item data ") + iS;
double d = i;
QCOMPARE(comboBox.itemData(i, Qt::DisplayRole).toString(), itemText);
QCOMPARE(comboBox.itemData(i, Qt::EditRole).toString(), itemText);
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro b/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
index 690edd5c9e..411185ae2a 100644
--- a/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
+++ b/tests/auto/widgets/widgets/qdatetimeedit/qdatetimeedit.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdatetimeedit
QT += widgets testlib core-private widgets-private
SOURCES += tst_qdatetimeedit.cpp
diff --git a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
index d41398046f..d496386773 100644
--- a/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
+++ b/tests/auto/widgets/widgets/qdatetimeedit/tst_qdatetimeedit.cpp
@@ -3436,7 +3436,7 @@ void tst_QDateTimeEdit::deleteCalendarWidget()
// it should create a new widget
QVERIFY(edit.calendarWidget());
- QVERIFY(edit.calendarWidget()->objectName() != "cw1");
+ QVERIFY(edit.calendarWidget()->objectName() != QLatin1String("cw1"));
}
}
diff --git a/tests/auto/widgets/widgets/qdial/qdial.pro b/tests/auto/widgets/widgets/qdial/qdial.pro
index 0af9633236..9bdd61f9d5 100644
--- a/tests/auto/widgets/widgets/qdial/qdial.pro
+++ b/tests/auto/widgets/widgets/qdial/qdial.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdial
QT += widgets testlib
SOURCES += tst_qdial.cpp
diff --git a/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro b/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro
index 9892c48e0c..7f2ad59581 100644
--- a/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro
+++ b/tests/auto/widgets/widgets/qdialogbuttonbox/qdialogbuttonbox.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
QT += widgets testlib
SOURCES += tst_qdialogbuttonbox.cpp
diff --git a/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro b/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro
index eca396f1a8..5c1ef52036 100644
--- a/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro
+++ b/tests/auto/widgets/widgets/qdockwidget/qdockwidget.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qdockwidget
QT += widgets widgets-private testlib
QT += core-private gui-private
diff --git a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp
index 6a1ce17aab..a0fdac075e 100644
--- a/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp
+++ b/tests/auto/widgets/widgets/qdoublespinbox/tst_qdoublespinbox.cpp
@@ -214,12 +214,15 @@ void tst_QDoubleSpinBox::setPrefixSuffix_data()
QTest::newRow("data0") << QString() << QString() << 10.5 << 1 << "10.5" << "10.5" << false;
QTest::newRow("data1") << QString() << "cm" << 10.5 << 2 << "10.50cm" << "10.50" << false;
- QTest::newRow("data2") << "cm: " << QString() << 10.5 << 0 << "cm: 10" << "10" << false;
+
+ // 10.5 is rounded correctly to 11 when using libdouble-conversion, or incorrectly to 10 when
+ // using snprintf. This is not the point of this test, though.
+ QTest::newRow("data2") << "cm: " << QString() << 10.4 << 0 << "cm: 10" << "10" << false;
QTest::newRow("data3") << "length: " << "cm" << 10.5 << 3 << "length: 10.500cm" << "10.500" << false;
QTest::newRow("data4") << QString() << QString() << 10.5 << 1 << "10.5" << "10.5" << true;
QTest::newRow("data5") << QString() << "cm" << 10.5 << 2 << "10.50cm" << "10.50" << true;
- QTest::newRow("data6") << "cm: " << QString() << 10.5 << 0 << "cm: 10" << "10" << true;
+ QTest::newRow("data6") << "cm: " << QString() << 10.4 << 0 << "cm: 10" << "10" << true;
QTest::newRow("data7") << "length: " << "cm" << 10.5 << 3 << "length: 10.500cm" << "10.500" << true;
}
diff --git a/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro b/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro
index 6fa0589f95..404edcd075 100644
--- a/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro
+++ b/tests/auto/widgets/widgets/qfocusframe/qfocusframe.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfocusframe
QT += widgets testlib
SOURCES += tst_qfocusframe.cpp
diff --git a/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro b/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro
index b21729bb9b..418789ac0f 100644
--- a/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro
+++ b/tests/auto/widgets/widgets/qfontcombobox/qfontcombobox.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qfontcombobox
QT += widgets testlib
SOURCES += tst_qfontcombobox.cpp
diff --git a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
index 5d6fdf2851..09de0e6dc9 100644
--- a/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
+++ b/tests/auto/widgets/widgets/qfontcombobox/tst_qfontcombobox.cpp
@@ -248,7 +248,7 @@ void tst_QFontComboBox::writingSystem_data()
QTest::newRow("Runic") << QFontDatabase::Runic;
for (int i = 0; i < 31; ++i)
- QTest::newRow(qPrintable(QString("enum %1").arg(i))) << (QFontDatabase::WritingSystem)i;
+ QTest::newRow(("enum " + QByteArray::number(i)).constData()) << (QFontDatabase::WritingSystem)i;
}
// public QFontDatabase::WritingSystem writingSystem() const
diff --git a/tests/auto/widgets/widgets/qframe/tst_qframe.cpp b/tests/auto/widgets/widgets/qframe/tst_qframe.cpp
index 81a6ba2ee3..03bd79683f 100644
--- a/tests/auto/widgets/widgets/qframe/tst_qframe.cpp
+++ b/tests/auto/widgets/widgets/qframe/tst_qframe.cpp
@@ -73,22 +73,24 @@ static void provideFrameData()
for (int lineWidth = 0; lineWidth < 3; ++lineWidth) {
for (int midLineWidth = 0; midLineWidth < 3; ++midLineWidth) {
- QTest::newRow(qPrintable(QStringLiteral("box_noshadow_%1_%2").arg(lineWidth).arg(midLineWidth)))
- << "box_noshadow" << lineWidth << midLineWidth << QFrame::Box << (QFrame::Shadow)0;
- QTest::newRow(qPrintable(QStringLiteral("box_plain_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ const QByteArray postFix = '_' + QByteArray::number(lineWidth) + '_'
+ + QByteArray::number(midLineWidth);
+ QTest::newRow(("box_noshadow" + postFix).constData())
+ << "box_noshadow" << lineWidth << midLineWidth << QFrame::Box << (QFrame::Shadow)0;
+ QTest::newRow(("box_plain" + postFix).constData())
<< "box_plain" << lineWidth << midLineWidth << QFrame::Box << QFrame::Plain;
- QTest::newRow(qPrintable(QStringLiteral("box_raised_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("box_raised" + postFix).constData())
<< "box_raised" << lineWidth << midLineWidth << QFrame::Box << QFrame::Raised;
- QTest::newRow(qPrintable(QStringLiteral("box_sunken_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("box_sunken" + postFix).constData())
<< "box_sunken" << lineWidth << midLineWidth << QFrame::Box << QFrame::Sunken;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_noshadow_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_noshadow" + postFix).constData())
<< "winpanel_noshadow" << lineWidth << midLineWidth << QFrame::WinPanel << (QFrame::Shadow)0;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_plain_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_plain" + postFix).constData())
<< "winpanel_plain" << lineWidth << midLineWidth << QFrame::WinPanel << QFrame::Plain;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_raised_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_raised" + postFix).constData())
<< "winpanel_raised" << lineWidth << midLineWidth << QFrame::WinPanel << QFrame::Raised;
- QTest::newRow(qPrintable(QStringLiteral("winpanel_sunken_%1_%2").arg(lineWidth).arg(midLineWidth)))
+ QTest::newRow(("winpanel_sunken" + postFix).constData())
<< "winpanel_sunken" << lineWidth << midLineWidth << QFrame::WinPanel << QFrame::Sunken;
}
}
@@ -174,7 +176,10 @@ void tst_QFrame::testPainting()
const QPixmap pixmap = frame.grab();
- const QString referenceFilePath = QFINDTESTDATA(QStringLiteral("images/%1_%2_%3.png").arg(basename).arg(lineWidth).arg(midLineWidth));
+ const QString fileName = QLatin1String("images/") + basename + QLatin1Char('_')
+ + QString::number(lineWidth) + QLatin1Char('_') + QString::number(midLineWidth)
+ + QLatin1String(".png");
+ const QString referenceFilePath = QFINDTESTDATA(fileName);
const QPixmap referencePixmap(referenceFilePath);
QVERIFY2(!referencePixmap.isNull(), qPrintable(QStringLiteral("Could not load reference pixmap %1").arg(referenceFilePath)));
QCOMPARE(pixmap, referencePixmap);
diff --git a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp
index 53eec99258..d7a03deb45 100644
--- a/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp
+++ b/tests/auto/widgets/widgets/qgroupbox/tst_qgroupbox.cpp
@@ -73,6 +73,7 @@ private slots:
void childrenAreDisabled();
void propagateFocus();
void task_QTBUG_19170_ignoreMouseReleseEvent();
+ void task_QTBUG_15519_propagateMouseEvents();
private:
bool checked;
@@ -80,6 +81,7 @@ private:
qint64 clickTimeStamp;
qint64 toggleTimeStamp;
+ static void sendMouseMoveEvent(QWidget *widget, const QPoint &localPos);
};
tst_QGroupBox::tst_QGroupBox()
@@ -502,5 +504,114 @@ void tst_QGroupBox::task_QTBUG_19170_ignoreMouseReleseEvent()
QCOMPARE(box.isChecked(), false);
}
+class MouseEventTestWidget : public QWidget
+{
+public:
+ bool mousePressed;
+ bool mouseReleased;
+ bool mouseMoved;
+
+ void reset()
+ {
+ mousePressed = false;
+ mouseReleased = false;
+ mouseMoved = false;
+ }
+
+protected:
+ void mousePressEvent(QMouseEvent*)
+ {
+ mousePressed = true;
+ }
+
+ void mouseReleaseEvent(QMouseEvent*)
+ {
+ mouseReleased = true;
+ }
+
+ void mouseMoveEvent(QMouseEvent*)
+ {
+ mouseMoved = true;
+ }
+};
+
+void tst_QGroupBox::task_QTBUG_15519_propagateMouseEvents()
+{
+ MouseEventTestWidget parent;
+ QGroupBox box(&parent);
+ parent.setMouseTracking(true);
+ box.setMouseTracking(true);
+ box.resize(100, 100);
+ box.setTitle("This is a test for QTBUG-15519");
+ box.show();
+
+ QStyleOptionGroupBox option;
+ option.initFrom(&box);
+ option.subControls = QStyle::SubControls(QStyle::SC_All);
+ QRect checkBoxRect = box.style()->subControlRect(QStyle::CC_GroupBox, &option,
+ QStyle::SC_GroupBoxCheckBox, &box);
+
+ // Without a checkbox, all mouse events should propagate
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mousePressed, true);
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mousePressed, true);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mouseReleased, true);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mouseReleased, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, checkBoxRect.center());
+ QCOMPARE(parent.mouseMoved, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, box.rect().center());
+ QCOMPARE(parent.mouseMoved, true);
+
+ // With a checkbox, presses and releases to the checkbox should not propagate
+
+ box.setCheckable(true);
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mousePressed, false);
+
+ parent.reset();
+ QTest::mousePress(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mousePressed, true);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, checkBoxRect.center());
+ QCOMPARE(parent.mouseReleased, false);
+
+ parent.reset();
+ QTest::mouseRelease(&box, Qt::LeftButton, 0, box.rect().center());
+ QCOMPARE(parent.mouseReleased, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, checkBoxRect.center());
+ QCOMPARE(parent.mouseMoved, true);
+
+ parent.reset();
+ sendMouseMoveEvent(&box, box.rect().center());
+ QCOMPARE(parent.mouseMoved, true);
+}
+
+void tst_QGroupBox::sendMouseMoveEvent(QWidget *widget, const QPoint &localPos)
+{
+ // Send a MouseMove event without actually moving the pointer
+ QMouseEvent event(QEvent::MouseMove, localPos, Qt::NoButton, Qt::NoButton, Qt::NoModifier);
+ QApplication::sendEvent(widget, &event);
+}
+
QTEST_MAIN(tst_QGroupBox)
#include "tst_qgroupbox.moc"
diff --git a/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro b/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro
index 097cb00d11..c660b398ce 100644
--- a/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro
+++ b/tests/auto/widgets/widgets/qkeysequenceedit/qkeysequenceedit.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qkeysequenceedit
QT += widgets testlib
SOURCES += tst_qkeysequenceedit.cpp
diff --git a/tests/auto/widgets/widgets/qlabel/qlabel.pro b/tests/auto/widgets/widgets/qlabel/qlabel.pro
index 6c259bc5a3..6a5757fb5c 100644
--- a/tests/auto/widgets/widgets/qlabel/qlabel.pro
+++ b/tests/auto/widgets/widgets/qlabel/qlabel.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qlabel
QT += widgets widgets-private testlib
diff --git a/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro b/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro
index 220380b1d5..1508806fb0 100644
--- a/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro
+++ b/tests/auto/widgets/widgets/qlcdnumber/qlcdnumber.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qlcdnumber
QT += widgets testlib
SOURCES += tst_qlcdnumber.cpp
diff --git a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
index 666960d98e..ba700ed58d 100644
--- a/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
+++ b/tests/auto/widgets/widgets/qlineedit/tst_qlineedit.cpp
@@ -2244,6 +2244,7 @@ void tst_QLineEdit::deleteSelectedText()
edit.setText(text);
edit.selectAll();
+#ifndef QT_NO_CONTEXTMENU
QMenu *menu = edit.createStandardContextMenu();
for (int i = 0; i < menu->actions().count(); ++i) {
QAction *current = menu->actions().at(i);
@@ -2252,6 +2253,7 @@ void tst_QLineEdit::deleteSelectedText()
QVERIFY(edit.text().isEmpty());
}
}
+#endif // QT_NO_CONTEXTMENU
}
@@ -2864,6 +2866,11 @@ void tst_QLineEdit::insert()
QCOMPARE(testWidget->text(), QString("No Crash! This is a nice test"));
}
+static inline QByteArray selectionTestName(int start, int length)
+{
+ return "selection start: " + QByteArray::number(start) + " length: " + QByteArray::number(length);
+}
+
void tst_QLineEdit::setSelection_data()
{
QTest::addColumn<QString>("text");
@@ -2877,39 +2884,39 @@ void tst_QLineEdit::setSelection_data()
int start, length, pos;
start = 0; length = 1; pos = 1;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("A") << true;
start = 0; length = 2; pos = 2;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("Ab") << true;
start = 0; length = 4; pos = 4;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("Abc ") << true;
start = -1; length = 0; pos = text.length();
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString() << false;
start = 34; length = 1; pos = 35;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("z") << true;
start = 34; length = 2; pos = 35;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("z") << true;
start = 34; length = -1; pos = 33;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("y") << true;
start = 1; length = -2; pos = 0;
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString("A") << true;
start = -1; length = -1; pos = text.length();
- QTest::newRow(QString("selection start: %1 length: %2").arg(start).arg(length).toLatin1())
+ QTest::newRow(selectionTestName(start, length).constData())
<< text << start << length << pos << QString() << false;
}
@@ -3290,7 +3297,7 @@ void tst_QLineEdit::inlineCompletion()
QStandardItem *root = model->invisibleRootItem();
QStandardItem *items[5];
for (int i = 0; i < 5; i++) {
- items[i] = new QStandardItem(QString("item%1").arg(i));
+ items[i] = new QStandardItem(QLatin1String("item") + QString::number(i));
if ((i+2)%2 == 0) { // disable 0,2,4
items[i]->setFlags(items[i]->flags() & ~Qt::ItemIsEnabled);
}
diff --git a/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro b/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro
index bd4fc6ba97..7e0a5320b0 100644
--- a/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro
+++ b/tests/auto/widgets/widgets/qmainwindow/qmainwindow.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qmainwindow
QT += widgets widgets-private testlib
SOURCES += tst_qmainwindow.cpp
diff --git a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
index 6282028746..ebf05ca300 100644
--- a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
+++ b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp
@@ -1369,7 +1369,7 @@ void tst_QMainWindow::restoreStateFromPreviousVersion()
QVector<QDockWidget*> docks;
for(int i = 0; i < 16; ++i) {
- const QString name = QString::fromLatin1("dock %1").arg(i);
+ const QString name = QStringLiteral("dock ") + QString::number(i);
QDockWidget *dock = new QDockWidget(name);
docks += dock;
dock->setObjectName(name);
diff --git a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
index e23634c515..83a4e3bb59 100644
--- a/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
+++ b/tests/auto/widgets/widgets/qmdiarea/tst_qmdiarea.cpp
@@ -621,6 +621,11 @@ void tst_QMdiArea::showWindows()
//#define USE_SHOW
+static inline QString windowTitle(const QString &t, const QString &f)
+{
+ return t + QLatin1String(" - [") + f + QLatin1Char(']');
+}
+
void tst_QMdiArea::changeWindowTitle()
{
const QString mwc = QString::fromLatin1("MainWindow's Caption");
@@ -648,7 +653,7 @@ void tst_QMdiArea::changeWindowTitle()
widget->setWindowState(Qt::WindowMaximized);
#endif
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) );
+ QTRY_COMPARE( mw->windowTitle(), windowTitle(mwc, wc) );
#endif
mw->hide();
@@ -657,7 +662,7 @@ void tst_QMdiArea::changeWindowTitle()
QVERIFY(QTest::qWaitForWindowExposed(mw));
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) );
+ QTRY_COMPARE( mw->windowTitle(), windowTitle(mwc, wc) );
#endif
#ifdef USE_SHOW
@@ -675,11 +680,11 @@ void tst_QMdiArea::changeWindowTitle()
#endif
qApp->processEvents();
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) );
+ QTRY_COMPARE( mw->windowTitle(), windowTitle(mwc, wc) );
widget->setWindowTitle( wc2 );
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc, wc2) );
mw->setWindowTitle( mwc2 );
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc2, wc2) );
#endif
mw->show();
@@ -693,7 +698,7 @@ void tst_QMdiArea::changeWindowTitle()
qApp->processEvents();
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc2, wc2) );
#endif
#ifdef USE_SHOW
widget->showNormal();
@@ -714,7 +719,7 @@ void tst_QMdiArea::changeWindowTitle()
#endif
qApp->processEvents();
#if !defined(Q_OS_MAC) && !defined(Q_OS_WINCE)
- QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) );
+ QCOMPARE( mw->windowTitle(), windowTitle(mwc2, wc2) );
#endif
#ifdef USE_SHOW
@@ -2321,7 +2326,7 @@ void tst_QMdiArea::setViewMode()
iconPixmap.fill(Qt::red);
for (int i = 0; i < 5; ++i) {
QMdiSubWindow *subWindow = mdiArea.addSubWindow(new QWidget);
- subWindow->setWindowTitle(QString(QLatin1String("Title %1")).arg(i));
+ subWindow->setWindowTitle(QLatin1String("Title ") + QString::number(i));
subWindow->setWindowIcon(iconPixmap);
}
diff --git a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
index db252347ac..51176d8195 100644
--- a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
+++ b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp
@@ -202,6 +202,7 @@ private slots:
void task_226929();
void styleChange();
void testFullScreenState();
+ void testRemoveBaseWidget();
};
void tst_QMdiSubWindow::initTestCase()
@@ -396,7 +397,7 @@ void tst_QMdiSubWindow::mainWindowSupport()
QMdiArea *nestedWorkspace = new QMdiArea; // :-)
window->setWidget(nestedWorkspace);
- window->widget()->setWindowTitle(QString::fromLatin1("Window %1").arg(i));
+ window->widget()->setWindowTitle(QLatin1String("Window ") + QString::number(i));
workspace->addSubWindow(window);
QVERIFY(!window->maximizedButtonsWidget());
@@ -423,8 +424,9 @@ void tst_QMdiSubWindow::mainWindowSupport()
QVERIFY(window->maximizedSystemMenuIconWidget());
QCOMPARE(window->maximizedSystemMenuIconWidget(), qobject_cast<QWidget *>(mainWindow.menuBar()
->cornerWidget(Qt::TopLeftCorner)));
- QCOMPARE(mainWindow.windowTitle(), QString::fromLatin1("%1 - [%2]")
- .arg(originalWindowTitle, window->widget()->windowTitle()));
+ const QString expectedTitle = originalWindowTitle + QLatin1String(" - [")
+ + window->widget()->windowTitle() + QLatin1Char(']');
+ QCOMPARE(mainWindow.windowTitle(), expectedTitle);
#endif
// Check that nested child windows don't set window title
@@ -432,7 +434,7 @@ void tst_QMdiSubWindow::mainWindowSupport()
QMdiSubWindow *nestedWindow = new QMdiSubWindow;
nestedWindow->setWidget(new QWidget);
nestedWorkspace->addSubWindow(nestedWindow);
- nestedWindow->widget()->setWindowTitle(QString::fromLatin1("NestedWindow %1").arg(i));
+ nestedWindow->widget()->setWindowTitle(QLatin1String("NestedWindow ") + QString::number(i));
nestedWindow->showMaximized();
qApp->processEvents();
QVERIFY(nestedWindow->isMaximized());
@@ -2080,6 +2082,27 @@ void tst_QMdiSubWindow::testFullScreenState()
QCOMPARE(subWindow->size(), QSize(300, 300));
}
+void tst_QMdiSubWindow::testRemoveBaseWidget()
+{
+ QMdiArea mdiArea;
+ mdiArea.show();
+
+ QWidget *widget1 = new QWidget;
+ mdiArea.addSubWindow(widget1);
+
+ QWidget *widget2 = new QWidget;
+ mdiArea.addSubWindow(widget2);
+
+ mdiArea.removeSubWindow(widget1);
+ QVERIFY(!widget1->parent());
+
+ widget2->setParent(widget1);
+ mdiArea.removeSubWindow(widget2);
+ QCOMPARE(widget2->parent(), widget1);
+
+ delete widget1;
+}
+
QTEST_MAIN(tst_QMdiSubWindow)
#include "tst_qmdisubwindow.moc"
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
index 5ae0733965..eaa277093c 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu.cpp
@@ -554,7 +554,7 @@ void tst_QMenu::widgetActionFocus()
QMenu m;
QListWidget *l = new QListWidget(&m);
for (int i = 1; i<3 ; i++)
- l->addItem(QString("item%1").arg(i));
+ l->addItem(QStringLiteral("item" ) + QString::number(i));
QWidgetAction *wa = new QWidgetAction(&m);
wa->setDefaultWidget(l);
m.addAction(wa);
@@ -747,7 +747,7 @@ void tst_QMenu::task250673_activeMultiColumnSubMenuPosition()
uint i = 2;
while (main.columnCount() < 2) {
- main.addAction(QString("Item %1").arg(i));
+ main.addAction(QLatin1String("Item ") + QString::number(i));
++i;
QVERIFY(i<1000);
}
@@ -1021,7 +1021,7 @@ public:
MyMenu() : m_currentIndex(0)
{
for (int i = 0; i < 2; ++i)
- dialogActions[i] = addAction( QString("dialog %1").arg(i), dialogs + i, SLOT(exec()));
+ dialogActions[i] = addAction(QLatin1String("dialog ") + QString::number(i), dialogs + i, SLOT(exec()));
}
void activateAction(int index)
diff --git a/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm b/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm
index b1708d8669..7130e79276 100644
--- a/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm
+++ b/tests/auto/widgets/widgets/qmenu/tst_qmenu_mac.mm
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
#include <QMenu>
#include <QTest>
diff --git a/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST b/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST
index 725b8e93b4..86c7141268 100644
--- a/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST
+++ b/tests/auto/widgets/widgets/qopenglwidget/BLACKLIST
@@ -1,2 +1,14 @@
[clearAndGrab]
opensuse-13.1
+
+#QTBUG-31611
+[painter]
+windows msvc-2010 32bit developer-build
+
+#QTBUG-31611
+[reparentToAlreadyCreated]
+windows msvc-2010 32bit developer-build
+
+#QTBUG-31611
+[reparentToNotYetCreated]
+windows msvc-2010 32bit developer-build
diff --git a/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro
index bbc6e987af..2d4cff9e10 100644
--- a/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro
+++ b/tests/auto/widgets/widgets/qopenglwidget/qopenglwidget.pro
@@ -1,8 +1,5 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qopenglwidget
QT += gui-private core-private testlib widgets
SOURCES += tst_qopenglwidget.cpp
-
-win32-msvc2010:contains(QT_CONFIG, angle):CONFIG += insignificant_test # QTBUG-31611
diff --git a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
index 44a554ad82..1657751605 100644
--- a/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
+++ b/tests/auto/widgets/widgets/qpushbutton/tst_qpushbutton.cpp
@@ -537,9 +537,6 @@ void tst_QPushButton::sizeHint_data()
#if !defined(QT_NO_STYLE_WINDOWS)
QTest::newRow("windows") << QString::fromLatin1("windows");
#endif
-#if !defined(QT_NO_STYLE_GTK)
- QTest::newRow("gtk") << QString::fromLatin1("gtk");
-#endif
#if defined(Q_OS_MAC) && !defined(QT_NO_STYLE_MAC)
QTest::newRow("macintosh") << QString::fromLatin1("macintosh");
#endif
diff --git a/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro b/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro
index 0cd706420e..bdf18a0252 100644
--- a/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro
+++ b/tests/auto/widgets/widgets/qscrollarea/qscrollarea.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscrollarea
QT += widgets testlib
SOURCES += tst_qscrollarea.cpp
diff --git a/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro b/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro
index 8c6ea6e1d4..2863dd2034 100644
--- a/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro
+++ b/tests/auto/widgets/widgets/qscrollbar/qscrollbar.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qscrollbar
QT += widgets testlib
SOURCES += tst_qscrollbar.cpp
diff --git a/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro b/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
index ceb897c612..1149b50feb 100644
--- a/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
+++ b/tests/auto/widgets/widgets/qsizegrip/qsizegrip.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsizegrip
INCLUDEPATH += .
QT += widgets testlib
diff --git a/tests/auto/widgets/widgets/qslider/qslider.pro b/tests/auto/widgets/widgets/qslider/qslider.pro
index d0a61e5a95..4c8b061459 100644
--- a/tests/auto/widgets/widgets/qslider/qslider.pro
+++ b/tests/auto/widgets/widgets/qslider/qslider.pro
@@ -3,7 +3,6 @@
############################################################
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qslider
QT += widgets testlib
SOURCES += tst_qslider.cpp
diff --git a/tests/auto/widgets/widgets/qsplitter/qsplitter.pro b/tests/auto/widgets/widgets/qsplitter/qsplitter.pro
index c43847b11f..8ae745ea9d 100644
--- a/tests/auto/widgets/widgets/qsplitter/qsplitter.pro
+++ b/tests/auto/widgets/widgets/qsplitter/qsplitter.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qsplitter
QT += widgets testlib
SOURCES += tst_qsplitter.cpp
diff --git a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
index a54ad6ecd0..9e854ff3ea 100644
--- a/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
+++ b/tests/auto/widgets/widgets/qsplitter/tst_qsplitter.cpp
@@ -678,9 +678,9 @@ void tst_QSplitter::task187373_addAbstractScrollAreas_data()
classNames << QLatin1String("QTreeView");
foreach (QString className, classNames) {
- QTest::newRow(qPrintable(QString("%1 1").arg(className))) << className << false << true;
- QTest::newRow(qPrintable(QString("%1 2").arg(className))) << className << true << false;
- QTest::newRow(qPrintable(QString("%1 3").arg(className))) << className << true << true;
+ QTest::newRow(qPrintable(className + QLatin1String(" 1"))) << className << false << true;
+ QTest::newRow(qPrintable(className + QLatin1String(" 2"))) << className << true << false;
+ QTest::newRow(qPrintable(className + QLatin1String(" 3"))) << className << true << true;
}
}
diff --git a/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp b/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp
index d060c4ceae..2a2bc1edf8 100644
--- a/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp
+++ b/tests/auto/widgets/widgets/qstackedwidget/tst_qstackedwidget.cpp
@@ -149,7 +149,7 @@ private:
void createWidgets() {
for (int i = 0; i < m_n; ++i) {
QLineEdit *le = new QLineEdit(this);
- le->setObjectName(QString::fromLatin1("lineEdit%1").arg(i));
+ le->setObjectName(QLatin1String("lineEdit") + QString::number(i));
layout ()->addWidget(le);
m_les << le;
}
diff --git a/tests/auto/widgets/widgets/qtabbar/qtabbar.pro b/tests/auto/widgets/widgets/qtabbar/qtabbar.pro
index 8772005bef..01b3c4a404 100644
--- a/tests/auto/widgets/widgets/qtabbar/qtabbar.pro
+++ b/tests/auto/widgets/widgets/qtabbar/qtabbar.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtabbar
QT += widgets testlib
SOURCES += tst_qtabbar.cpp
diff --git a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
index ced2253a74..b983e6954a 100644
--- a/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
+++ b/tests/auto/widgets/widgets/qtabbar/tst_qtabbar.cpp
@@ -606,7 +606,7 @@ public slots:
void updateTabText()
{
count++;
- setTabText(0, QString("%1").arg(count));
+ setTabText(0, QString::number(count));
}
};
diff --git a/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro b/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro
index a8c62ec54a..19b3a03443 100644
--- a/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro
+++ b/tests/auto/widgets/widgets/qtoolbox/qtoolbox.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qtoolbox
QT += widgets testlib
SOURCES += tst_qtoolbox.cpp
diff --git a/tests/auto/xml/sax/qxml/qxml.pro b/tests/auto/xml/sax/qxml/qxml.pro
index e5fd4eafe3..e0b48ad9f5 100644
--- a/tests/auto/xml/sax/qxml/qxml.pro
+++ b/tests/auto/xml/sax/qxml/qxml.pro
@@ -1,5 +1,4 @@
CONFIG += testcase
-CONFIG += parallel_test
TARGET = tst_qxml
SOURCES += tst_qxml.cpp
diff --git a/tests/baselineserver/src/baselineserver.cpp b/tests/baselineserver/src/baselineserver.cpp
index 4a36c022eb..b82ef6aed1 100644
--- a/tests/baselineserver/src/baselineserver.cpp
+++ b/tests/baselineserver/src/baselineserver.cpp
@@ -259,7 +259,7 @@ bool BaselineHandler::establishConnection()
logMsg += key + QLS(": '") + clientInfo.value(key) + QLS("', ");
}
qDebug() << runId << logtime() << "Connection established with" << clientInfo.value(PI_HostName)
- << "[" << qPrintable(clientInfo.value(PI_HostAddress)) << "]" << logMsg
+ << '[' << qPrintable(clientInfo.value(PI_HostAddress)) << ']' << logMsg
<< "Overrides:" << clientInfo.overrides() << "AdHoc-Run:" << clientInfo.isAdHocRun();
// ### Hardcoded backwards compatibility: add project field for certain existing clients that lack it
diff --git a/tests/baselineserver/src/report.cpp b/tests/baselineserver/src/report.cpp
index 2f04b0509e..527c1c065c 100644
--- a/tests/baselineserver/src/report.cpp
+++ b/tests/baselineserver/src/report.cpp
@@ -309,7 +309,7 @@ void Report::writeFunctionResults(const ImageItemList &list)
out << "<span style=\"color:green\"><small>No mismatch reported</small></span>";
break;
default:
- out << "?";
+ out << '?';
break;
}
out << "</td>\n";
@@ -401,14 +401,14 @@ QString Report::writeResultsXmlFiles()
if (!cwd.exists(dir))
cwd.mkpath(dir);
foreach (const QString &func, itemLists.keys()) {
- QFile f(dir + "/" + func + "-results.xml");
+ QFile f(dir + QLatin1Char('/') + func + "-results.xml");
if (!f.open(QIODevice::WriteOnly))
continue;
QXmlStreamWriter s(&f);
s.setAutoFormatting(true);
s.writeStartDocument();
foreach (QString key, plat.keys()) {
- QString cmt = " " + key + "=\"" + plat.value(key) +"\" ";
+ QString cmt = QLatin1Char(' ') + key + "=\"" + plat.value(key) +"\" ";
s.writeComment(cmt.replace("--", "[-]"));
}
s.writeStartElement("testsuite");
diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp b/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp
index aa42c11fc7..ef6e41f4f3 100644
--- a/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp
+++ b/tests/benchmarks/corelib/codecs/qtextcodec/main.cpp
@@ -56,11 +56,11 @@ void tst_QTextCodec::codecForName() const
QBENCHMARK {
foreach(const QByteArray& c, codecs) {
QVERIFY(QTextCodec::codecForName(c));
- QVERIFY(QTextCodec::codecForName(c + "-"));
+ QVERIFY(QTextCodec::codecForName(c + '-'));
}
foreach(const QByteArray& c, codecs) {
- QVERIFY(QTextCodec::codecForName(c + "+"));
- QVERIFY(QTextCodec::codecForName(c + "*"));
+ QVERIFY(QTextCodec::codecForName(c + '+'));
+ QVERIFY(QTextCodec::codecForName(c + '*'));
}
}
}
diff --git a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
index 5563004ca8..5ee577c256 100644
--- a/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
+++ b/tests/benchmarks/corelib/codecs/qtextcodec/qtextcodec.pro
@@ -4,4 +4,3 @@ SOURCES += main.cpp
TESTDATA = utf-8.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qdir/10000/10000.pro b/tests/benchmarks/corelib/io/qdir/10000/10000.pro
index 88654b3575..2e83dad071 100644
--- a/tests/benchmarks/corelib/io/qdir/10000/10000.pro
+++ b/tests/benchmarks/corelib/io/qdir/10000/10000.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_qdir_10000
SOURCES += bench_qdir_10000.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qdir/tree/tree.pro b/tests/benchmarks/corelib/io/qdir/tree/tree.pro
index fbc575c585..2998a13b57 100644
--- a/tests/benchmarks/corelib/io/qdir/tree/tree.pro
+++ b/tests/benchmarks/corelib/io/qdir/tree/tree.pro
@@ -5,4 +5,3 @@ SOURCES += bench_qdir_tree.cpp
RESOURCES += bench_qdir_tree.qrc
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
index e61c50cd5d..3cfb0b44de 100644
--- a/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
+++ b/tests/benchmarks/corelib/io/qdiriterator/qdiriterator.pro
@@ -13,4 +13,3 @@ wince* {
DEPLOYMENT += corelibdir
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qfile/main.cpp b/tests/benchmarks/corelib/io/qfile/main.cpp
index 8e836ebdff..13e1cb9e2f 100644
--- a/tests/benchmarks/corelib/io/qfile/main.cpp
+++ b/tests/benchmarks/corelib/io/qfile/main.cpp
@@ -602,7 +602,7 @@ void tst_qfile::createSmallFiles()
for (int i = 0; i < 1000; ++i)
#endif
{
- QFile f(tmpDirName+"/"+QString::number(i));
+ QFile f(tmpDirName + QLatin1Char('/') + QString::number(i));
f.open(QIODevice::WriteOnly);
f.seek(511);
f.putChar('\n');
@@ -641,7 +641,7 @@ void tst_qfile::readSmallFiles()
case(QFileBenchmark): {
QList<QFile*> fileList;
Q_FOREACH(QString file, files) {
- QFile *f = new QFile(tmpDirName+ "/" + file);
+ QFile *f = new QFile(tmpDirName + QLatin1Char('/') + file);
f->open(QIODevice::ReadOnly|textMode|bufferedMode);
fileList.append(f);
}
@@ -664,7 +664,7 @@ void tst_qfile::readSmallFiles()
case(QFSFileEngineBenchmark): {
QList<QFSFileEngine*> fileList;
Q_FOREACH(QString file, files) {
- QFSFileEngine *fse = new QFSFileEngine(tmpDirName+ "/" + file);
+ QFSFileEngine *fse = new QFSFileEngine(tmpDirName + QLatin1Char('/') + file);
fse->open(QIODevice::ReadOnly|textMode|bufferedMode);
fileList.append(fse);
}
@@ -685,7 +685,7 @@ void tst_qfile::readSmallFiles()
case(PosixBenchmark): {
QList<FILE*> fileList;
Q_FOREACH(QString file, files) {
- fileList.append(::fopen(QFile::encodeName(tmpDirName+ "/" + file).constData(), "rb"));
+ fileList.append(::fopen(QFile::encodeName(tmpDirName + QLatin1Char('/') + file).constData(), "rb"));
}
QBENCHMARK {
diff --git a/tests/benchmarks/corelib/io/qfile/qfile.pro b/tests/benchmarks/corelib/io/qfile/qfile.pro
index 6716dd549d..5f7b9af73f 100644
--- a/tests/benchmarks/corelib/io/qfile/qfile.pro
+++ b/tests/benchmarks/corelib/io/qfile/qfile.pro
@@ -4,4 +4,3 @@ QT = core core-private testlib
win32: DEFINES+= _CRT_SECURE_NO_WARNINGS
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro b/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
index b8cb50abf3..42e8708b02 100644
--- a/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
+++ b/tests/benchmarks/corelib/io/qfileinfo/qfileinfo.pro
@@ -7,4 +7,3 @@ QT += core-private testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro b/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
index 3b06fcbce6..7937436e13 100644
--- a/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
+++ b/tests/benchmarks/corelib/io/qiodevice/qiodevice.pro
@@ -1,10 +1,8 @@
TEMPLATE = app
TARGET = tst_bench_qiodevice
-TARGET.EPOCHEAPSIZE = 0x100000 0x2000000
QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qprocess/test/test.pro b/tests/benchmarks/corelib/io/qprocess/test/test.pro
index eaae0c8254..b665525b17 100644
--- a/tests/benchmarks/corelib/io/qprocess/test/test.pro
+++ b/tests/benchmarks/corelib/io/qprocess/test/test.pro
@@ -2,4 +2,3 @@ TARGET = ../tst_bench_qprocess
SOURCES += ../tst_bench_qprocess.cpp
QT = core core-private testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
index 8fd4db6b4b..cb8dfdcdcb 100644
--- a/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
+++ b/tests/benchmarks/corelib/io/qprocess/testProcessLoopback/testProcessLoopback.pro
@@ -3,4 +3,3 @@ CONFIG -= qt app_bundle
CONFIG += console
winrt: QMAKE_LFLAGS += /ENTRY:mainCRTStartup
DESTDIR = ./
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro b/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
index 3dcba655f2..758930c139 100644
--- a/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
+++ b/tests/benchmarks/corelib/io/qtemporaryfile/qtemporaryfile.pro
@@ -6,4 +6,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
index 3dcba655f2..758930c139 100644
--- a/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
+++ b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro
@@ -6,4 +6,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/io/qurl/qurl.pro b/tests/benchmarks/corelib/io/qurl/qurl.pro
index e3beedc472..52f7bdc8b6 100644
--- a/tests/benchmarks/corelib/io/qurl/qurl.pro
+++ b/tests/benchmarks/corelib/io/qurl/qurl.pro
@@ -4,4 +4,3 @@ QT = core testlib
win32: DEFINES+= _CRT_SECURE_NO_WARNINGS
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/json/json.pro b/tests/benchmarks/corelib/json/json.pro
index 77c9ca3ffe..004f4b123e 100644
--- a/tests/benchmarks/corelib/json/json.pro
+++ b/tests/benchmarks/corelib/json/json.pro
@@ -5,4 +5,3 @@ CONFIG -= app_bundle
SOURCES += tst_bench_qtbinaryjson.cpp
TESTDATA = numbers.json test.json
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/events/events.pro b/tests/benchmarks/corelib/kernel/events/events.pro
index 01cba51329..798a880e5b 100644
--- a/tests/benchmarks/corelib/kernel/events/events.pro
+++ b/tests/benchmarks/corelib/kernel/events/events.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_events
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro b/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
index df5450f88d..6896b3ff55 100644
--- a/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
+++ b/tests/benchmarks/corelib/kernel/qcoreapplication/qcoreapplication.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qcoreapplication
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro b/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
index 39410e90fd..47d2acb9b1 100644
--- a/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
+++ b/tests/benchmarks/corelib/kernel/qmetaobject/qmetaobject.pro
@@ -3,4 +3,3 @@ QT += widgets testlib
TARGET = tst_bench_qmetaobject
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro b/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
index a97e0ffab8..83d0708b60 100644
--- a/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
+++ b/tests/benchmarks/corelib/kernel/qmetatype/qmetatype.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_qmetatype
SOURCES += tst_qmetatype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qobject/qobject.pro b/tests/benchmarks/corelib/kernel/qobject/qobject.pro
index 57243405e1..e611eff0a2 100644
--- a/tests/benchmarks/corelib/kernel/qobject/qobject.pro
+++ b/tests/benchmarks/corelib/kernel/qobject/qobject.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qobject
HEADERS += object.h
SOURCES += main.cpp object.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
index 16539c0198..e127ba1934 100644
--- a/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
+++ b/tests/benchmarks/corelib/kernel/qtimer_vs_qmetaobject/qtimer_vs_qmetaobject.pro
@@ -8,4 +8,3 @@ CONFIG += release
SOURCES += tst_qtimer_vs_qmetaobject.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro b/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
index afacbd2c2b..8ea7200d53 100644
--- a/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
+++ b/tests/benchmarks/corelib/kernel/qvariant/qvariant.pro
@@ -6,4 +6,3 @@ CONFIG += release
SOURCES += tst_qvariant.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro b/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
index 0a0d9b1193..fe55b98e54 100644
--- a/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
+++ b/tests/benchmarks/corelib/mimetypes/qmimedatabase/qmimedatabase.pro
@@ -3,4 +3,3 @@ QT = core testlib
TARGET = tst_bench_qmimedatabase
SOURCES = main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/plugin/quuid/quuid.pro b/tests/benchmarks/corelib/plugin/quuid/quuid.pro
index 3f77ff7821..8f88bb85b4 100644
--- a/tests/benchmarks/corelib/plugin/quuid/quuid.pro
+++ b/tests/benchmarks/corelib/plugin/quuid/quuid.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_quuid
SOURCES += tst_quuid.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
index 9f906b433f..ec87f60919 100644
--- a/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
+++ b/tests/benchmarks/corelib/thread/qmutex/qmutex.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qmutex
QT = core testlib
SOURCES += tst_qmutex.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro b/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
index f44763c39c..95afc951bc 100644
--- a/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
+++ b/tests/benchmarks/corelib/thread/qthreadstorage/qthreadstorage.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qthreadstorage
SOURCES += tst_qthreadstorage.cpp
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro b/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
index 8adf8a732f..43c7921a93 100644
--- a/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
+++ b/tests/benchmarks/corelib/thread/qwaitcondition/qwaitcondition.pro
@@ -2,4 +2,3 @@ TEMPLATE = app
TARGET = tst_bench_qwaitcondition
QT = core testlib
SOURCES += tst_qwaitcondition.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro b/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
index 0d0f8405d8..49edcbee70 100644
--- a/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
+++ b/tests/benchmarks/corelib/tools/containers-associative/containers-associative.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_containers-associative
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro b/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
index 0b5b070864..6f731cb6d8 100644
--- a/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
+++ b/tests/benchmarks/corelib/tools/containers-sequential/containers-sequential.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_containers-sequential
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
index 69c2add07b..f54f8320d4 100644
--- a/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
+++ b/tests/benchmarks/corelib/tools/qalgorithms/qalgorithms.pro
@@ -1,4 +1,3 @@
TARGET = tst_bench_qalgorithms
QT = core testlib
SOURCES = tst_qalgorithms.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro b/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro
index 0d5e7646ad..6a60b306f1 100644
--- a/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro
+++ b/tests/benchmarks/corelib/tools/qbytearray/qbytearray.pro
@@ -4,4 +4,3 @@ TARGET = tst_bench_qbytearray
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qchar/qchar.pro b/tests/benchmarks/corelib/tools/qchar/qchar.pro
index 1137e91cab..80a9861f48 100644
--- a/tests/benchmarks/corelib/tools/qchar/qchar.pro
+++ b/tests/benchmarks/corelib/tools/qchar/qchar.pro
@@ -1,4 +1,3 @@
TARGET = tst_bench_qchar
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro b/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
index 0739d3dea6..fe74dafef4 100644
--- a/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
+++ b/tests/benchmarks/corelib/tools/qcontiguouscache/qcontiguouscache.pro
@@ -5,4 +5,3 @@ SOURCES += main.cpp
CONFIG += parallel_test
QT = core testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro b/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro
index ac71b77683..a85e7346c6 100644
--- a/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro
+++ b/tests/benchmarks/corelib/tools/qdatetime/qdatetime.pro
@@ -2,4 +2,3 @@ TARGET = tst_bench_qdatetime
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qhash/qhash.pro b/tests/benchmarks/corelib/tools/qhash/qhash.pro
index bdef2c74aa..40f661c116 100644
--- a/tests/benchmarks/corelib/tools/qhash/qhash.pro
+++ b/tests/benchmarks/corelib/tools/qhash/qhash.pro
@@ -3,4 +3,3 @@ QT = core testlib
INCLUDEPATH += .
SOURCES += main.cpp outofline.cpp
CONFIG += release
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qlist/qlist.pro b/tests/benchmarks/corelib/tools/qlist/qlist.pro
index eba4066cf5..c83bc455d2 100644
--- a/tests/benchmarks/corelib/tools/qlist/qlist.pro
+++ b/tests/benchmarks/corelib/tools/qlist/qlist.pro
@@ -2,4 +2,3 @@ TARGET = tst_bench_qlist
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qlocale/qlocale.pro b/tests/benchmarks/corelib/tools/qlocale/qlocale.pro
index 9e8f2721c9..e56bbe0341 100644
--- a/tests/benchmarks/corelib/tools/qlocale/qlocale.pro
+++ b/tests/benchmarks/corelib/tools/qlocale/qlocale.pro
@@ -2,4 +2,3 @@ TARGET = tst_bench_qlocale
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qmap/qmap.pro b/tests/benchmarks/corelib/tools/qmap/qmap.pro
index bb3d33a3a1..6a0c8d62bd 100644
--- a/tests/benchmarks/corelib/tools/qmap/qmap.pro
+++ b/tests/benchmarks/corelib/tools/qmap/qmap.pro
@@ -3,4 +3,3 @@ QT = core testlib
INCLUDEPATH += .
SOURCES += main.cpp
CONFIG += release
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qrect/qrect.pro b/tests/benchmarks/corelib/tools/qrect/qrect.pro
index 361e734a36..42cfcd8924 100644
--- a/tests/benchmarks/corelib/tools/qrect/qrect.pro
+++ b/tests/benchmarks/corelib/tools/qrect/qrect.pro
@@ -5,4 +5,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qregexp/qregexp.pro b/tests/benchmarks/corelib/tools/qregexp/qregexp.pro
index 8b35ecffed..f64ae781a2 100644
--- a/tests/benchmarks/corelib/tools/qregexp/qregexp.pro
+++ b/tests/benchmarks/corelib/tools/qregexp/qregexp.pro
@@ -18,4 +18,3 @@ qtHaveModule(script):!pcre {
}
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qstring/qstring.pro b/tests/benchmarks/corelib/tools/qstring/qstring.pro
index 80410bc39e..9f5e34b915 100644
--- a/tests/benchmarks/corelib/tools/qstring/qstring.pro
+++ b/tests/benchmarks/corelib/tools/qstring/qstring.pro
@@ -3,4 +3,3 @@ QT -= gui
QT += core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro b/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro
index 128deab8f2..fa4cbe3c13 100644
--- a/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro
+++ b/tests/benchmarks/corelib/tools/qstringbuilder/qstringbuilder.pro
@@ -9,4 +9,3 @@ QT = core testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro b/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro
index 823b3d4d46..5803e7da0e 100644
--- a/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro
+++ b/tests/benchmarks/corelib/tools/qstringlist/qstringlist.pro
@@ -3,4 +3,3 @@ CONFIG -= debug
CONFIG += release
QT = core testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/corelib/tools/qvector/qvector.pro b/tests/benchmarks/corelib/tools/qvector/qvector.pro
index 8c118e64e8..24a65d8ee8 100644
--- a/tests/benchmarks/corelib/tools/qvector/qvector.pro
+++ b/tests/benchmarks/corelib/tools/qvector/qvector.pro
@@ -3,4 +3,3 @@ QT = core testlib core-private
INCLUDEPATH += .
SOURCES += main.cpp outofline.cpp
CONFIG += release
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/dbus/qdbusperformance/server/server.pro b/tests/benchmarks/dbus/qdbusperformance/server/server.pro
index c913e90afb..a2270ad2c1 100644
--- a/tests/benchmarks/dbus/qdbusperformance/server/server.pro
+++ b/tests/benchmarks/dbus/qdbusperformance/server/server.pro
@@ -4,4 +4,3 @@ TARGET = server
DESTDIR = .
QT += dbus
QT -= gui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/dbus/qdbusperformance/test/test.pro b/tests/benchmarks/dbus/qdbusperformance/test/test.pro
index 83f708f4fe..ddc5410759 100644
--- a/tests/benchmarks/dbus/qdbusperformance/test/test.pro
+++ b/tests/benchmarks/dbus/qdbusperformance/test/test.pro
@@ -3,4 +3,3 @@ HEADERS += ../serverobject.h
TARGET = ../tst_qdbusperformance
QT = core dbus testlib
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/dbus/qdbustype/qdbustype.pro b/tests/benchmarks/dbus/qdbustype/qdbustype.pro
index 1437e4d9eb..d30bad8ce7 100644
--- a/tests/benchmarks/dbus/qdbustype/qdbustype.pro
+++ b/tests/benchmarks/dbus/qdbustype/qdbustype.pro
@@ -10,4 +10,3 @@ contains(QT_CONFIG, dbus-linked) {
}
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/animation/qanimation/qanimation.pro b/tests/benchmarks/gui/animation/qanimation/qanimation.pro
index b26e4bb7f7..a5859468f7 100644
--- a/tests/benchmarks/gui/animation/qanimation/qanimation.pro
+++ b/tests/benchmarks/gui/animation/qanimation/qanimation.pro
@@ -14,4 +14,3 @@ SOURCES += main.cpp \
HEADERS += dummyobject.h \
dummyanimation.h \
rectanimation.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
index a6ed4b84fb..ded6a06795 100644
--- a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
+++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/GraphicsViewBenchmark.pro
@@ -68,4 +68,3 @@ SOURCES += main.cpp \
TARGET = tst_GraphicsViewBenchmark
RESOURCES += GraphicsViewBenchmark.qrc
INCLUDEPATH += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
index 7e82b1ca53..7c4dc97591 100644
--- a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
+++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/commandline.cpp
@@ -100,7 +100,7 @@ bool readSettingsFromCommandLine(int argc, char *argv[],
return false;
}
else {
- QStringList res = QString(argv[i+1]).split("x");
+ QStringList res = QString(argv[i+1]).split(QLatin1Char('x'));
if (res.count() != 2) {
printf("-resolution parameter UI resolution should be set in format WxH where width and height are positive values\n");
usage(argv[0]);
diff --git a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
index 4dbb24211c..64c91da5f2 100644
--- a/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
+++ b/tests/benchmarks/gui/graphicsview/functional/GraphicsViewBenchmark/widgets/dummydatagen.cpp
@@ -81,7 +81,8 @@ QString DummyDataGenerator::randomPhoneNumber(QString indexNumber)
QString beginNumber = QString::number(555-index*2);
QString endNumber = QString("0").repeated(4-indexNumber.length()) + indexNumber;
- return countryCode +" " + areaCode +" " + beginNumber +" " + endNumber;
+ return countryCode + QLatin1Char(' ') + areaCode +QLatin1Char(' ') + beginNumber
+ + QLatin1Char(' ') + endNumber;
}
QString DummyDataGenerator::randomFirstName()
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
index 03f5d4b418..01c0dbd653 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsanchorlayout/qgraphicsanchorlayout.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qgraphicsanchorlayout
SOURCES += tst_qgraphicsanchorlayout.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro b/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
index 1d02be4918..461ec13263 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsitem/qgraphicsitem.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qgraphicsitem
SOURCES += tst_qgraphicsitem.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
index ac6cafe09b..7e58c2dc83 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsitem/tst_qgraphicsitem.cpp
@@ -114,7 +114,7 @@ void tst_QGraphicsItem::setParentItem_deep()
childRect->setParentItem(lastRect);
lastRect = childRect;
}
- QGraphicsItem *first = rect.children().first();
+ QGraphicsItem *first = rect.childItems().first();
first->setParentItem(0);
}
}
@@ -194,8 +194,9 @@ void tst_QGraphicsItem::rotate()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform rotate(QTransform().rotate(45));
QBENCHMARK {
- item->rotate(45);
+ item->setTransform(rotate, true);
}
}
@@ -205,8 +206,9 @@ void tst_QGraphicsItem::scale()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform scale(QTransform::fromScale(2, 2));
QBENCHMARK {
- item->scale(2, 2);
+ item->setTransform(scale, true);
}
}
@@ -216,8 +218,9 @@ void tst_QGraphicsItem::shear()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform shear = QTransform().shear(1.5, 1.5);
QBENCHMARK {
- item->shear(1.5, 1.5);
+ item->setTransform(shear, true);
}
}
@@ -227,8 +230,9 @@ void tst_QGraphicsItem::translate()
QGraphicsItem *item = scene.addRect(QRectF(0, 0, 100, 100));
processEvents();
+ const QTransform translate = QTransform::fromTranslate(100, 100);
QBENCHMARK {
- item->translate(100, 100);
+ item->setTransform(translate, true);
}
}
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro
index 942af7257b..9026fb37d8 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslayout/qgraphicslayout.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qgraphicslayout
QT += testlib
SOURCES += tst_qgraphicslayout.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
index d48e68e4d9..7126c8ecd6 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicslinearlayout/qgraphicslinearlayout.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qgraphicslinearlayout
QT += testlib
SOURCES += tst_qgraphicslinearlayout.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro b/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
index 6d8b037df7..769f84423e 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsscene/qgraphicsscene.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qgraphicsscene
SOURCES += tst_qgraphicsscene.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
index 6215ab4e34..345948a4d0 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp
@@ -165,7 +165,7 @@ void tst_QGraphicsScene::addItem()
scene.addItem(item);
}
}
- scene.itemAt(0, 0);
+ scene.items(QPointF(0, 0));
}
//let QGraphicsScene::_q_polishItems be called so ~QGraphicsItem doesn't spend all his time cleaning the unpolished list
qApp->processEvents();
@@ -217,12 +217,12 @@ void tst_QGraphicsScene::itemAt()
}
}
- scene.itemAt(0, 0); // triggers indexing
+ scene.items(QPointF(0, 0)); // triggers indexing
processEvents();
QGraphicsItem *item = 0;
QBENCHMARK {
- item = scene.itemAt(0, 0);
+ item = scene.items(QPointF(0, 0)).value(0, Q_NULLPTR);
}
//let QGraphicsScene::_q_polishItems be called so ~QGraphicsItem doesn't spend all his time cleaning the unpolished list
@@ -239,7 +239,7 @@ void tst_QGraphicsScene::initialShow()
item->setPos((y/2) * item->rect().width(), (y/2) * item->rect().height());
scene.addItem(item);
}
- scene.itemAt(0, 0); // triggers indexing
+ scene.items(QPointF(0, 0)); // triggers indexing
//This call polish the items so we bench their processing too.
qApp->processEvents();
}
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
index 4047bad1ca..8ef79cef23 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/chipTest/chip.pro
@@ -17,4 +17,3 @@ sources.files = $$SOURCES $$HEADERS $$RESOURCES *.png *.pro *.html *.doc images
sources.path = $$[QT_INSTALL_EXAMPLES]/graphicsview/chip
INSTALLS += target sources
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
index 55e50d275b..28dcadcbfa 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/moveItems/moveItems.pro
@@ -1,2 +1 @@
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
index 55e50d275b..28dcadcbfa 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/benchapps/scrolltest/scrolltest.pro
@@ -1,2 +1 @@
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp
index 42c4b88eda..24daf90b68 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/chiptester/chip.cpp
@@ -43,7 +43,7 @@ Chip::Chip(const QColor &color, int x, int y)
setZValue((x + y) % 2);
setFlags(ItemIsSelectable | ItemIsMovable);
- setAcceptsHoverEvents(true);
+ setAcceptHoverEvents(true);
}
QRectF Chip::boundingRect() const
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro b/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
index e68b90cbc5..3d48959f3c 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/qgraphicsview.pro
@@ -7,4 +7,3 @@ SOURCES += tst_qgraphicsview.cpp
RESOURCES += qgraphicsview.qrc
include(chiptester/chiptester.pri)
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
index f8645d2507..3d6b38252f 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
+++ b/tests/benchmarks/gui/graphicsview/qgraphicsview/tst_qgraphicsview.cpp
@@ -166,7 +166,7 @@ void tst_QGraphicsView::initTestCase()
mView.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
mView.tryResize(100, 100);
mView.show();
- QTest::qWaitForWindowShown(&mView);
+ QTest::qWaitForWindowExposed(&mView);
QTest::qWait(300);
processEvents();
}
@@ -418,7 +418,7 @@ void tst_QGraphicsView::chipTester()
tester.setOpenGL(opengl);
tester.setOperation(ChipTester::Operation(operation));
tester.show();
- QTest::qWaitForWindowShown(&tester);
+ QTest::qWaitForWindowExposed(&tester);
QTest::qWait(250);
processEvents();
@@ -434,7 +434,7 @@ static void addChildHelper(QGraphicsItem *parent, int n, bool rotate)
QGraphicsRectItem *item = new QGraphicsRectItem(QRectF(0, 0, 50, 50), parent);
item->setPos(10, 10);
if (rotate)
- item->rotate(10);
+ item->setTransform(QTransform().rotate(10), true);
addChildHelper(item, n - 1, rotate);
}
@@ -464,7 +464,8 @@ void tst_QGraphicsView::deepNesting()
for (int y = 0; y < 15; ++y) {
for (int x = 0; x < 15; ++x) {
QGraphicsItem *item1 = scene.addRect(QRectF(0, 0, 50, 50));
- if (rotate) item1->rotate(10);
+ if (rotate)
+ item1->setTransform(QTransform().rotate(10), true);
item1->setPos(x * 25, y * 25);
addChildHelper(item1, 30, rotate);
}
@@ -476,7 +477,7 @@ void tst_QGraphicsView::deepNesting()
mView.setRenderHint(QPainter::Antialiasing);
mView.setScene(&scene);
mView.tryResize(600, 600);
- (void)scene.itemAt(0, 0);
+ (void)scene.items(QPointF(0, 0));
processEvents();
QBENCHMARK {
diff --git a/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro b/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
index a4e06368ca..00becec216 100644
--- a/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
+++ b/tests/benchmarks/gui/graphicsview/qgraphicswidget/qgraphicswidget.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qgraphicswidget
SOURCES += tst_qgraphicswidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/blendbench/blendbench.pro b/tests/benchmarks/gui/image/blendbench/blendbench.pro
index 8fd8682e09..17c18301bb 100644
--- a/tests/benchmarks/gui/image/blendbench/blendbench.pro
+++ b/tests/benchmarks/gui/image/blendbench/blendbench.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_blendbench
QT += testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro b/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro
index c3b6e36e63..9e47f979e1 100644
--- a/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro
+++ b/tests/benchmarks/gui/image/qimageconversion/qimageconversion.pro
@@ -5,5 +5,4 @@ SOURCES += tst_qimageconversion.cpp
!contains(QT_CONFIG, no-gif):DEFINES += QTEST_HAVE_GIF
!contains(QT_CONFIG, no-jpeg):DEFINES += QTEST_HAVE_JPEG
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
contains(QT_CONFIG, c++11): CONFIG += c++11
diff --git a/tests/benchmarks/gui/image/qimagereader/qimagereader.pro b/tests/benchmarks/gui/image/qimagereader/qimagereader.pro
index 5f1c72153d..e54e2ffce5 100644
--- a/tests/benchmarks/gui/image/qimagereader/qimagereader.pro
+++ b/tests/benchmarks/gui/image/qimagereader/qimagereader.pro
@@ -24,4 +24,3 @@ wince {
DEPLOYMENT += addFiles imageFormatsPlugins
}
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/qpixmap/qpixmap.pro b/tests/benchmarks/gui/image/qpixmap/qpixmap.pro
index 3a8526b56c..7ba53857cb 100644
--- a/tests/benchmarks/gui/image/qpixmap/qpixmap.pro
+++ b/tests/benchmarks/gui/image/qpixmap/qpixmap.pro
@@ -4,4 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qpixmap
SOURCES += tst_qpixmap.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro b/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro
index 436288ebf2..074c764e50 100644
--- a/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro
+++ b/tests/benchmarks/gui/image/qpixmapcache/qpixmapcache.pro
@@ -3,4 +3,3 @@ TEMPLATE = app
QT += testlib
SOURCES += tst_qpixmapcache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro b/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro
index 31a0a77cec..7e8415e495 100644
--- a/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro
+++ b/tests/benchmarks/gui/itemviews/qheaderview/qheaderview.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qheaderview
SOURCES += qheaderviewbench.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp b/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp
index 9cc8f1e6bb..5b75d1ecd6 100644
--- a/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp
+++ b/tests/benchmarks/gui/itemviews/qheaderview/qheaderviewbench.cpp
@@ -130,7 +130,7 @@ void BenchQHeaderView::init()
for (int i = 0; i < m_model->rowCount(); ++i) {
m_model->setData(m_model->index(i, 0), QVariant(i));
s.setNum(i);
- s += ".";
+ s += QLatin1Char('.');
s += 'a' + (i % 25);
m_model->setData(m_model->index(i, 1), QVariant(s));
}
diff --git a/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro b/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
index 45ef4a3133..bd2306d646 100644
--- a/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
+++ b/tests/benchmarks/gui/itemviews/qtableview/qtableview.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qtableview
SOURCES += tst_qtableview.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qapplication/qapplication.pro b/tests/benchmarks/gui/kernel/qapplication/qapplication.pro
index 73e6a0a92f..86a016d42e 100644
--- a/tests/benchmarks/gui/kernel/qapplication/qapplication.pro
+++ b/tests/benchmarks/gui/kernel/qapplication/qapplication.pro
@@ -6,4 +6,3 @@ TARGET = tst_bench_qapplication
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro b/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro
index 8f9080a09f..be9cf4b38b 100644
--- a/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro
+++ b/tests/benchmarks/gui/kernel/qguimetatype/qguimetatype.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qguimetatype
QT += testlib
SOURCES += tst_qguimetatype.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro b/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro
index 68a93109f6..63886c21d4 100644
--- a/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro
+++ b/tests/benchmarks/gui/kernel/qguivariant/qguivariant.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qguivariant
QT += testlib
SOURCES += tst_qguivariant.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qwidget/qwidget.pro b/tests/benchmarks/gui/kernel/qwidget/qwidget.pro
index 6db601d70a..758c9c5b98 100644
--- a/tests/benchmarks/gui/kernel/qwidget/qwidget.pro
+++ b/tests/benchmarks/gui/kernel/qwidget/qwidget.pro
@@ -2,4 +2,3 @@ QT += widgets testlib
TARGET = tst_bench_qwidget
SOURCES += tst_qwidget.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp b/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp
index 839d4535cb..289ed3bf06 100644
--- a/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp
+++ b/tests/benchmarks/gui/kernel/qwidget/tst_qwidget.cpp
@@ -128,7 +128,7 @@ private:
void tst_QWidget::initTestCase()
{
widget.show();
- QTest::qWaitForWindowShown(&widget);
+ QTest::qWaitForWindowExposed(&widget);
QTest::qWait(300);
processEvents();
}
diff --git a/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro b/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro
index 713eb95e2d..fe5c23840f 100644
--- a/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro
+++ b/tests/benchmarks/gui/math3d/qmatrix4x4/qmatrix4x4.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qmatrix4x4
QT += testlib
SOURCES += tst_qmatrix4x4.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro b/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro
index a363fb4183..e57a3e6a38 100644
--- a/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro
+++ b/tests/benchmarks/gui/math3d/qquaternion/qquaternion.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qquaternion
QT += testlib
SOURCES += tst_qquaternion.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qpainter/qpainter.pro b/tests/benchmarks/gui/painting/qpainter/qpainter.pro
index b114dde68d..1a1f218033 100644
--- a/tests/benchmarks/gui/painting/qpainter/qpainter.pro
+++ b/tests/benchmarks/gui/painting/qpainter/qpainter.pro
@@ -5,4 +5,3 @@ TEMPLATE = app
TARGET = tst_bench_qpainter
SOURCES += tst_qpainter.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qregion/qregion.pro b/tests/benchmarks/gui/painting/qregion/qregion.pro
index ef3dbefa55..1ff55080c5 100644
--- a/tests/benchmarks/gui/painting/qregion/qregion.pro
+++ b/tests/benchmarks/gui/painting/qregion/qregion.pro
@@ -4,4 +4,3 @@ QT += testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qtbench/qtbench.pro b/tests/benchmarks/gui/painting/qtbench/qtbench.pro
index 46c2f06984..a4c7273b47 100644
--- a/tests/benchmarks/gui/painting/qtbench/qtbench.pro
+++ b/tests/benchmarks/gui/painting/qtbench/qtbench.pro
@@ -4,5 +4,3 @@ TEMPLATE = app
TARGET = tst_bench_qtbench
SOURCES += tst_qtbench.cpp
-
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp b/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp
index c7ba7b82f6..cc9fe7e32e 100644
--- a/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp
+++ b/tests/benchmarks/gui/painting/qtbench/tst_qtbench.cpp
@@ -229,7 +229,7 @@ void tst_QtBench::qtBench()
BenchWidget widget(reinterpret_cast<Benchmark *>(benchmark));
widget.show();
- QTest::qWaitForWindowShown(&widget);
+ QTest::qWaitForWindowExposed(&widget);
while (!widget.done()) {
widget.update();
diff --git a/tests/benchmarks/gui/painting/qtransform/qtransform.pro b/tests/benchmarks/gui/painting/qtransform/qtransform.pro
index 76ed1325fd..e8de3fcbd4 100644
--- a/tests/benchmarks/gui/painting/qtransform/qtransform.pro
+++ b/tests/benchmarks/gui/painting/qtransform/qtransform.pro
@@ -3,4 +3,3 @@ TARGET = tst_bench_qtransform
QT += testlib
SOURCES += tst_qtransform.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp b/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp
index e4d5999c62..bb5399707c 100644
--- a/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp
+++ b/tests/benchmarks/gui/styles/qstylesheetstyle/main.cpp
@@ -173,7 +173,7 @@ void tst_qstylesheetstyle::grid()
w->setStyleSheet("/* */");
if(show) {
w->show();
- QTest::qWaitForWindowShown(w);
+ QTest::qWaitForWindowExposed(w);
QApplication::flush();
QApplication::processEvents();
QTest::qWait(30);
diff --git a/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro b/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro
index 707731f4d1..5aef3520c0 100644
--- a/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro
+++ b/tests/benchmarks/gui/styles/qstylesheetstyle/qstylesheetstyle.pro
@@ -5,4 +5,3 @@ TARGET = tst_bench_qstylesheetstyle
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro b/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro
index 3ebb9ed778..bcaff3de1e 100644
--- a/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro
+++ b/tests/benchmarks/gui/text/qfontmetrics/qfontmetrics.pro
@@ -2,4 +2,3 @@ TEMPLATE = app
TARGET = tst_bench_QFontMetrics
QT += testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/gui/text/qtext/qtext.pro b/tests/benchmarks/gui/text/qtext/qtext.pro
index 86b9006f62..d5597fb097 100644
--- a/tests/benchmarks/gui/text/qtext/qtext.pro
+++ b/tests/benchmarks/gui/text/qtext/qtext.pro
@@ -7,4 +7,3 @@ TARGET = tst_bench_QText
SOURCES += main.cpp
TESTDATA = bidi.txt
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro
index 82c49e40b8..eccabd5d89 100644
--- a/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro
+++ b/tests/benchmarks/network/access/qfile_vs_qnetworkaccessmanager/qfile_vs_qnetworkaccessmanager.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro b/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
index 226c123a72..9de05b5e65 100644
--- a/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
+++ b/tests/benchmarks/network/access/qnetworkdiskcache/qnetworkdiskcache.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += tst_qnetworkdiskcache.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro b/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro
index 92d20f50d0..2378cd4862 100644
--- a/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro
+++ b/tests/benchmarks/network/access/qnetworkreply/qnetworkreply.pro
@@ -7,4 +7,3 @@ QT += core-private network network-private testlib
CONFIG += release
SOURCES += tst_qnetworkreply.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro b/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro
index e335d95aad..41dae0051b 100644
--- a/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro
+++ b/tests/benchmarks/network/kernel/qhostinfo/qhostinfo.pro
@@ -7,4 +7,3 @@ QT += core-private network network-private testlib
CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro b/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro
index abc7676afa..ebf1891433 100644
--- a/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro
+++ b/tests/benchmarks/network/socket/qtcpserver/qtcpserver.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += tst_qtcpserver.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro b/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro
index d22fdd326a..a67c0d66df 100644
--- a/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro
+++ b/tests/benchmarks/network/ssl/qsslsocket/qsslsocket.pro
@@ -7,4 +7,3 @@ QT += network testlib
CONFIG += release
SOURCES += tst_qsslsocket.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro b/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro
index a5cd697900..281e79f585 100644
--- a/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro
+++ b/tests/benchmarks/plugins/imageformats/jpeg/jpeg.pro
@@ -6,4 +6,3 @@ CONFIG += release
SOURCES += jpeg.cpp
TESTDATA = n900.jpeg
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/benchmarks/sql/kernel/qsqlquery/main.cpp b/tests/benchmarks/sql/kernel/qsqlquery/main.cpp
index b5937b76b0..942266313f 100644
--- a/tests/benchmarks/sql/kernel/qsqlquery/main.cpp
+++ b/tests/benchmarks/sql/kernel/qsqlquery/main.cpp
@@ -285,7 +285,7 @@ void tst_QSqlQuery::benchmarkSelectPrepared()
int expectedSum = 0;
QString fillQuery = "INSERT INTO " + tableName + " VALUES (0)";
for (int i = 1; i < NUM_ROWS; ++i) {
- fillQuery += ", (" + QString::number(i) + ")";
+ fillQuery += ", (" + QString::number(i) + QLatin1Char(')');
expectedSum += i;
}
QVERIFY_SQL(q, exec(fillQuery));
diff --git a/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro b/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro
index abfebad2aa..18425f4a25 100644
--- a/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro
+++ b/tests/benchmarks/sql/kernel/qsqlquery/qsqlquery.pro
@@ -4,4 +4,3 @@ SOURCES += main.cpp
QT = core sql testlib core-private sql-private
LIBS += $$QMAKE_LIBS_NETWORK
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/bearerex/bearerex.cpp b/tests/manual/bearerex/bearerex.cpp
index fe96c55636..2b04bd8bda 100644
--- a/tests/manual/bearerex/bearerex.cpp
+++ b/tests/manual/bearerex/bearerex.cpp
@@ -147,7 +147,7 @@ void BearerEx::on_createSessionButton_clicked()
QNetworkConfiguration networkConfiguration = qvariant_cast<QNetworkConfiguration>(item->data(Qt::UserRole));
int newTabIndex = mainTabWidget->count();
SessionTab* newTab = new SessionTab(&networkConfiguration,&m_NetworkConfigurationManager,eventListWidget,newTabIndex-1);
- QString label = QString("S")+QString::number(newTabIndex-1);
+ QString label = QLatin1Char('S') + QString::number(newTabIndex-1);
mainTabWidget->insertTab(newTabIndex,newTab,label);
mainTabWidget->setCurrentIndex(newTabIndex);
}
@@ -271,9 +271,11 @@ SessionTab::SessionTab(QNetworkConfiguration* apNetworkConfiguration,
snapLabel->hide();
snapLineEdit->hide();
alrButton->hide();
- iapLineEdit->setText(apNetworkConfiguration->name()+" ("+apNetworkConfiguration->identifier()+")");
+ iapLineEdit->setText(apNetworkConfiguration->name()+ " (" + apNetworkConfiguration->identifier()
+ + QLatin1Char(')'));
} else if (apNetworkConfiguration->type() == QNetworkConfiguration::ServiceNetwork) {
- snapLineEdit->setText(apNetworkConfiguration->name()+" ("+apNetworkConfiguration->identifier()+")");
+ snapLineEdit->setText(apNetworkConfiguration->name()+ " (" + apNetworkConfiguration->identifier()
+ + QLatin1Char(')'));
}
bearerLineEdit->setText(apNetworkConfiguration->bearerTypeName());
sentRecDataLineEdit->setText(QString::number(m_NetworkSession->bytesWritten())+
@@ -380,7 +382,7 @@ void SessionTab::newConfigurationActivated()
msgBox.setDefaultButton(QMessageBox::Yes);
if (msgBox.exec() == QMessageBox::Yes) {
m_NetworkSession->accept();
- iapLineEdit->setText(m_config.name()+" ("+m_config.identifier()+")");
+ iapLineEdit->setText(m_config.name() + " (" + m_config.identifier() + QLatin1Char(')'));
} else {
m_NetworkSession->reject();
}
@@ -391,7 +393,7 @@ void SessionTab::preferredConfigurationChanged(const QNetworkConfiguration& conf
m_config = config;
QMessageBox msgBox;
msgBox.setText("Roaming to new configuration.");
- msgBox.setInformativeText("Do you want to migrate to "+config.name()+"?");
+ msgBox.setInformativeText("Do you want to migrate to " + config.name() + QLatin1Char('?'));
msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::Yes);
if (msgBox.exec() == QMessageBox::Yes) {
@@ -407,7 +409,7 @@ void SessionTab::opened()
QFont font = listItem->font();
font.setBold(true);
listItem->setFont(font);
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+QString("Opened"));
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QLatin1String(" - Opened"));
m_eventListWidget->addItem(listItem);
QVariant identifier = m_NetworkSession->sessionProperty("ActiveConfiguration");
@@ -415,7 +417,7 @@ void SessionTab::opened()
QString configId = identifier.toString();
QNetworkConfiguration config = m_ConfigManager->configurationFromIdentifier(configId);
if (config.isValid()) {
- iapLineEdit->setText(config.name()+" ("+config.identifier()+")");
+ iapLineEdit->setText(config.name() + " (" + config.identifier() + QLatin1Char(')'));
}
}
newState(m_NetworkSession->state()); // Update the "(open)"
@@ -438,7 +440,7 @@ void SessionTab::closed()
QFont font = listItem->font();
font.setBold(true);
listItem->setFont(font);
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+QString("Closed"));
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QLatin1String(" - Closed"));
m_eventListWidget->addItem(listItem);
}
@@ -489,7 +491,7 @@ void SessionTab::stateChanged(QNetworkSession::State state)
newState(state);
QListWidgetItem* listItem = new QListWidgetItem();
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+stateString(state));
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QLatin1String(" - ") + stateString(state));
m_eventListWidget->addItem(listItem);
}
@@ -500,7 +502,7 @@ void SessionTab::newState(QNetworkSession::State state)
QString configId = identifier.toString();
QNetworkConfiguration config = m_ConfigManager->configurationFromIdentifier(configId);
if (config.isValid()) {
- iapLineEdit->setText(config.name()+" ("+config.identifier()+")");
+ iapLineEdit->setText(config.name() + " (" + config.identifier() + QLatin1Char(')'));
bearerLineEdit->setText(config.bearerTypeName());
}
} else {
@@ -539,7 +541,7 @@ void SessionTab::error(QNetworkSession::SessionError error)
errorString = "InvalidConfigurationError";
break;
}
- listItem->setText(QString("S")+QString::number(m_index)+QString(" - ")+errorString);
+ listItem->setText(QLatin1Char('S') + QString::number(m_index) + QString(" - ") + errorString);
m_eventListWidget->addItem(listItem);
msgBox.setText(errorString);
diff --git a/tests/manual/bearerex/bearerex.pro b/tests/manual/bearerex/bearerex.pro
index 8f0af52b40..e643657660 100644
--- a/tests/manual/bearerex/bearerex.pro
+++ b/tests/manual/bearerex/bearerex.pro
@@ -19,4 +19,3 @@ SOURCES += bearerex.cpp \
main.cpp \
xqlistwidget.cpp \
datatransferer.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/cocoa/menus/menus.pro b/tests/manual/cocoa/menus/menus.pro
index 855a77455f..0ccb25feb9 100644
--- a/tests/manual/cocoa/menus/menus.pro
+++ b/tests/manual/cocoa/menus/menus.pro
@@ -3,4 +3,3 @@ TEMPLATE = app
SOURCES += main.cpp
QT += gui widgets
CONFIG -=app_bundle
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/cocoa/nativewidgets/nativewigets.pro b/tests/manual/cocoa/nativewidgets/nativewigets.pro
index f1b1260688..d81b567276 100644
--- a/tests/manual/cocoa/nativewidgets/nativewigets.pro
+++ b/tests/manual/cocoa/nativewidgets/nativewigets.pro
@@ -4,4 +4,3 @@ HEADERS +=
SOURCES += main.cpp
QT += core widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h b/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h
index 95601906e7..5aaffc7048 100644
--- a/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h
+++ b/tests/manual/cocoa/qmaccocoaviewcontainer/TestMouseMovedNSView.h
@@ -31,7 +31,7 @@
**
****************************************************************************/
-#import <Cocoa/Cocoa.h>
+#import <AppKit/AppKit.h>
@interface TestMouseMovedNSView : NSView {
NSPoint mouseMovedPoint_;
diff --git a/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro b/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
index 9546adea1c..1d1eb08253 100644
--- a/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
+++ b/tests/manual/cocoa/qmaccocoaviewcontainer/qmaccocoaviewcontainer.pro
@@ -2,7 +2,7 @@ TEMPLATE = app
TARGET = qmaccocoaviewcontainer
INCLUDEPATH += .
QT += widgets
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
# Input
OBJECTIVE_SOURCES += main.mm TestMouseMovedNSView.m
HEADERS += TestMouseMovedNSView.h
diff --git a/tests/manual/cocoa/qt_on_cocoa/main.mm b/tests/manual/cocoa/qt_on_cocoa/main.mm
index 23370b0305..219bb56416 100644
--- a/tests/manual/cocoa/qt_on_cocoa/main.mm
+++ b/tests/manual/cocoa/qt_on_cocoa/main.mm
@@ -36,7 +36,7 @@
#include <QtGui>
#include <QtWidgets/QtWidgets>
-#include <Cocoa/Cocoa.h>
+#include <AppKit/AppKit.h>
@interface AppDelegate : NSObject <NSApplicationDelegate> {
QGuiApplication *m_app;
diff --git a/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro b/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro
index 97e4473e15..91c4d2c875 100644
--- a/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro
+++ b/tests/manual/cocoa/qt_on_cocoa/qt_on_cocoa.pro
@@ -3,7 +3,7 @@ TEMPLATE = app
OBJECTIVE_SOURCES += main.mm
HEADERS += rasterwindow.h
SOURCES += rasterwindow.cpp
-LIBS += -framework Cocoa
+LIBS += -framework AppKit
QT += gui widgets quick
diff --git a/tests/manual/cocoa/wheelevent/wheelevent.pro b/tests/manual/cocoa/wheelevent/wheelevent.pro
index f90302da95..3a30aef3fb 100644
--- a/tests/manual/cocoa/wheelevent/wheelevent.pro
+++ b/tests/manual/cocoa/wheelevent/wheelevent.pro
@@ -4,4 +4,3 @@ HEADERS += window.h
SOURCES += window.cpp main.cpp
QT += core core-private gui gui-private widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/diaglib/README.txt b/tests/manual/diaglib/README.txt
index 0fb226c750..fd199d09cb 100644
--- a/tests/manual/diaglib/README.txt
+++ b/tests/manual/diaglib/README.txt
@@ -27,6 +27,11 @@ class EventFilter (eventfilter.h):
An event filter that logs Qt events to qDebug() depending on
configured categories (for example mouse, keyboard, etc).
+class DebugProxyStyle (debugproxystyle.h)
+ A proxy style that wraps around an existing style and outputs
+ the parameters and return values of its function calls, useful
+ for debugging QStyle.
+
function glInfo() (glinfo.h):
Returns a string describing the Open GL configuration (obtained
by querying GL_VENDOR and GL_RENDERER). Available only
diff --git a/tests/manual/diaglib/debugproxystyle.cpp b/tests/manual/diaglib/debugproxystyle.cpp
new file mode 100644
index 0000000000..51f15a4fee
--- /dev/null
+++ b/tests/manual/diaglib/debugproxystyle.cpp
@@ -0,0 +1,161 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "debugproxystyle.h"
+
+#include <QDebug>
+#include <QWidget>
+#include <QStyleOption>
+#include <QApplication>
+
+#if QT_VERSION < 0x050000
+QDebug operator<<(QDebug d, const QPixmap &p)
+{
+ d << "QPixmap(" << p.size() << ')';
+ return d;
+}
+#endif // QT_VERSION < 0x050000
+
+QDebug operator<<(QDebug debug, const QStyleOption *option)
+{
+#if QT_VERSION >= 0x050000
+ QDebugStateSaver saver(debug);
+ debug.nospace();
+#endif
+ debug << "QStyleOption(";
+ if (option)
+ debug << "rec=" << option->rect;
+ else
+ debug << '0';
+ debug << ')';
+ return debug;
+}
+
+namespace QtDiag {
+
+DebugProxyStyle::DebugProxyStyle(QStyle *style) : QProxyStyle(style)
+{
+#if QT_VERSION >= 0x050000
+ const qreal devicePixelRatio = qApp->devicePixelRatio();
+#else
+ const qreal devicePixelRatio = 1;
+#endif
+ qDebug() << __FUNCTION__ << QT_VERSION_STR
+#if QT_VERSION >= 0x050000
+ << QGuiApplication::platformName()
+#endif
+ << style->objectName() << "devicePixelRatio=" << devicePixelRatio;
+}
+
+void DebugProxyStyle::drawPrimitive(QStyle::PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
+{
+ qDebug() << __FUNCTION__ << "element=" << element << option << widget;
+ QProxyStyle::drawPrimitive( element, option, painter, widget);
+}
+
+void DebugProxyStyle::drawControl(QStyle::ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget) const
+{
+ qDebug() << __FUNCTION__ << "element=" << element << option << widget;
+ QProxyStyle::drawControl(element, option, painter, widget);
+}
+
+void DebugProxyStyle::drawComplexControl(QStyle::ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget) const
+{
+ qDebug() << __FUNCTION__ << "control=" << control << option << widget;
+ QProxyStyle::drawComplexControl(control, option, painter, widget);
+}
+
+void DebugProxyStyle::drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const
+{
+ qDebug() << __FUNCTION__ << rect << "alignment=" << alignment << pixmap;
+ QProxyStyle::drawItemPixmap(painter, rect, alignment, pixmap);
+}
+
+QSize DebugProxyStyle::sizeFromContents(QStyle::ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const
+{
+ const QSize result = QProxyStyle::sizeFromContents(type, option, size, widget);
+ qDebug() << __FUNCTION__ << size << "type=" << type << option << widget << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::subElementRect(QStyle::SubElement element, const QStyleOption *option, const QWidget *widget) const
+{
+ const QRect result = QProxyStyle::subElementRect(element, option, widget);
+ qDebug() << __FUNCTION__ << "element=" << element << option << widget << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::subControlRect(QStyle::ComplexControl cc, const QStyleOptionComplex *opt, QStyle::SubControl sc, const QWidget *widget) const
+{
+ const QRect result = QProxyStyle::subControlRect(cc, opt, sc, widget);
+ qDebug() << __FUNCTION__ << "cc=" << cc << "sc=" << sc << opt << widget << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::itemTextRect(const QFontMetrics &fm, const QRect &r, int flags, bool enabled, const QString &text) const
+{
+ const QRect result = QProxyStyle::itemTextRect(fm, r, flags, enabled, text);
+ qDebug() << __FUNCTION__ << r << "flags=" << flags << "enabled=" << enabled
+ << text << "returns" << result;
+ return result;
+}
+
+QRect DebugProxyStyle::itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const
+{
+ const QRect result = QProxyStyle::itemPixmapRect(r, flags, pixmap);
+ qDebug() << __FUNCTION__ << r << "flags=" << flags << pixmap << "returns" << result;
+ return result;
+}
+
+int DebugProxyStyle::pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option, const QWidget *widget) const
+{
+ const int result = QProxyStyle::pixelMetric(metric, option, widget);
+ qDebug() << __FUNCTION__ << "metric=" << metric << option << widget << "returns" << result;
+ return result;
+}
+
+QPixmap DebugProxyStyle::standardPixmap(QStyle::StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget) const
+{
+ const QPixmap result = QProxyStyle::standardPixmap(standardPixmap, opt, widget);
+ qDebug() << __FUNCTION__ << "standardPixmap=" << standardPixmap << opt << "returns" << result;
+ return result;
+}
+
+QPixmap DebugProxyStyle::generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const
+{
+ const QPixmap result = QProxyStyle::generatedIconPixmap(iconMode, pixmap, opt);
+ qDebug() << __FUNCTION__ << "iconMode=" << iconMode << pixmap << opt << "returns" << result;
+ return result;
+}
+
+} // namespace QtDiag
diff --git a/tests/manual/diaglib/debugproxystyle.h b/tests/manual/diaglib/debugproxystyle.h
new file mode 100644
index 0000000000..d7a15ec2c0
--- /dev/null
+++ b/tests/manual/diaglib/debugproxystyle.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+**
+** Copyright (C) 2015 The Qt Company Ltd.
+** Contact: http://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL21$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see http://www.qt.io/terms-conditions. For further
+** information use the contact form at http://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 or version 3 as published by the Free
+** Software Foundation and appearing in the file LICENSE.LGPLv21 and
+** LICENSE.LGPLv3 included in the packaging of this file. Please review the
+** following information to ensure the GNU Lesser General Public License
+** requirements will be met: https://www.gnu.org/licenses/lgpl.html and
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** As a special exception, The Qt Company gives you certain additional
+** rights. These rights are described in The Qt Company LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef DEBUGPROXYSTYLE_H
+#define DEBUGPROXYSTYLE_H
+
+#include <QProxyStyle>
+
+namespace QtDiag {
+
+class DebugProxyStyle : public QProxyStyle {
+ Q_OBJECT
+
+public:
+ explicit DebugProxyStyle(QStyle *style);
+
+ void drawPrimitive(PrimitiveElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
+ void drawControl(ControlElement element, const QStyleOption *option, QPainter *painter, const QWidget *widget = 0) const;
+ void drawComplexControl(ComplexControl control, const QStyleOptionComplex *option, QPainter *painter, const QWidget *widget = 0) const;
+ void drawItemPixmap(QPainter *painter, const QRect &rect, int alignment, const QPixmap &pixmap) const;
+ QSize sizeFromContents(ContentsType type, const QStyleOption *option, const QSize &size, const QWidget *widget) const;
+ QRect subElementRect(SubElement element, const QStyleOption *option, const QWidget *widget) const;
+ QRect subControlRect(ComplexControl cc, const QStyleOptionComplex *opt, SubControl sc, const QWidget *widget) const;
+ QRect itemTextRect(const QFontMetrics &fm, const QRect &r, int flags, bool enabled, const QString &text) const;
+ QRect itemPixmapRect(const QRect &r, int flags, const QPixmap &pixmap) const;
+ int pixelMetric(PixelMetric metric, const QStyleOption *option = 0, const QWidget *widget = 0) const;
+ QPixmap standardPixmap(StandardPixmap standardPixmap, const QStyleOption *opt, const QWidget *widget = 0) const;
+ QPixmap generatedIconPixmap(QIcon::Mode iconMode, const QPixmap &pixmap, const QStyleOption *opt) const;
+};
+
+} // namespace QtDiag
+
+#endif // DEBUGPROXYSTYLE_H
diff --git a/tests/manual/diaglib/diaglib.pri b/tests/manual/diaglib/diaglib.pri
index a1f1893f52..a51d2f1201 100644
--- a/tests/manual/diaglib/diaglib.pri
+++ b/tests/manual/diaglib/diaglib.pri
@@ -3,12 +3,14 @@ SOURCES += \
$$PWD/textdump.cpp \
$$PWD/eventfilter.cpp \
$$PWD/qwindowdump.cpp \
+ $$PWD/debugproxystyle.cpp
HEADERS += \
$$PWD/textdump.h \
$$PWD/eventfilter.h \
$$PWD/qwindowdump.h \
- $$PWD/nativewindowdump.h
+ $$PWD/nativewindowdump.h \
+ $$PWD/debugproxystyle.h
win32 {
SOURCES += $$PWD/nativewindowdump_win.cpp
diff --git a/tests/manual/gestures/graphicsview/graphicsview.pro b/tests/manual/gestures/graphicsview/graphicsview.pro
index 4cc989efd2..9ecd0b372f 100644
--- a/tests/manual/gestures/graphicsview/graphicsview.pro
+++ b/tests/manual/gestures/graphicsview/graphicsview.pro
@@ -8,4 +8,3 @@ SOURCES += main.cpp \
HEADERS += imageitem.h \
gestures.h \
mousepangesturerecognizer.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/gestures/graphicsview/main.cpp b/tests/manual/gestures/graphicsview/main.cpp
index 062a1643df..30fd79ec8f 100644
--- a/tests/manual/gestures/graphicsview/main.cpp
+++ b/tests/manual/gestures/graphicsview/main.cpp
@@ -175,7 +175,7 @@ void MainWindow::setDirectory(const QString &path)
QDir dir(path);
QStringList files = dir.entryList(QDir::Files | QDir::Readable | QDir::NoDotAndDotDot);
foreach(const QString &file, files) {
- QImageReader img(path + QLatin1String("/")+file);
+ QImageReader img(path + QLatin1Char('/') +file);
QImage image = img.read();
if (!image.isNull()) {
{
diff --git a/tests/manual/gestures/scrollarea/scrollarea.pro b/tests/manual/gestures/scrollarea/scrollarea.pro
index a4854e2599..84e2af3f49 100644
--- a/tests/manual/gestures/scrollarea/scrollarea.pro
+++ b/tests/manual/gestures/scrollarea/scrollarea.pro
@@ -3,4 +3,3 @@ QT += widgets
SOURCES = main.cpp \
mousepangesturerecognizer.cpp
HEADERS += mousepangesturerecognizer.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/highdpi/dragwidget.cpp b/tests/manual/highdpi/dragwidget.cpp
index b203566696..dacafef203 100644
--- a/tests/manual/highdpi/dragwidget.cpp
+++ b/tests/manual/highdpi/dragwidget.cpp
@@ -166,7 +166,7 @@ void DragWidget::mousePressEvent(QMouseEvent *event)
QMimeData *mimeData = new QMimeData;
mimeData->setText(child->text());
mimeData->setData("application/x-hotspot",
- QByteArray::number(hotSpot.x()) + " " + QByteArray::number(hotSpot.y()));
+ QByteArray::number(hotSpot.x()) + ' ' + QByteArray::number(hotSpot.y()));
QPixmap pixmap(child->size());
child->render(&pixmap);
diff --git a/tests/manual/highdpi/main.cpp b/tests/manual/highdpi/main.cpp
index 692a60d511..3e0073dd52 100644
--- a/tests/manual/highdpi/main.cpp
+++ b/tests/manual/highdpi/main.cpp
@@ -139,7 +139,7 @@ private slots:
// update label, add ".0" if needed.
QString number = QString::number(scalefactorF);
- if (!number.contains("."))
+ if (!number.contains(QLatin1Char('.')))
number.append(".0");
m_label->setText(number);
}
@@ -203,8 +203,8 @@ DemoController::DemoController(DemoContainerList *demos, QCommandLineParser *par
foreach (QScreen *screen, screens) {
// create scale control line
QSize screenSize = screen->geometry().size();
- QString screenId = screen->name() + " " + QString::number(screenSize.width())
- + " " + QString::number(screenSize.height());
+ QString screenId = screen->name() + QLatin1Char(' ') + QString::number(screenSize.width())
+ + QLatin1Char(' ') + QString::number(screenSize.height());
LabelSlider *slider = new LabelSlider(this, screenId, layout, layoutRow++);
slider->setValue(getScreenFactorWithoutPixelDensity(screen) * 10);
diff --git a/tests/manual/inputmethodhints/inputmethodhints.pro b/tests/manual/inputmethodhints/inputmethodhints.pro
index 2f6608b602..f253f72332 100644
--- a/tests/manual/inputmethodhints/inputmethodhints.pro
+++ b/tests/manual/inputmethodhints/inputmethodhints.pro
@@ -8,4 +8,3 @@ SOURCES += main.cpp \
inputmethodhints.cpp
FORMS += inputmethodhints.ui
RESOURCES +=
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/keypadnavigation/keypadnavigation.pro b/tests/manual/keypadnavigation/keypadnavigation.pro
index 3ec3241998..a45d38af21 100644
--- a/tests/manual/keypadnavigation/keypadnavigation.pro
+++ b/tests/manual/keypadnavigation/keypadnavigation.pro
@@ -1,4 +1,3 @@
QT += widgets
SOURCES += main.cpp
FORMS += keypadnavigation.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/lance/lance.pro b/tests/manual/lance/lance.pro
index 430c9196e6..312106c2f0 100644
--- a/tests/manual/lance/lance.pro
+++ b/tests/manual/lance/lance.pro
@@ -16,4 +16,3 @@ RESOURCES += icons.qrc \
qtHaveModule(opengl): QT += opengl
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/lance/main.cpp b/tests/manual/lance/main.cpp
index 6c0a651ce6..79e72cb5b3 100644
--- a/tests/manual/lance/main.cpp
+++ b/tests/manual/lance/main.cpp
@@ -602,7 +602,7 @@ int main(int argc, char **argv)
pcmd.setType(type);
pcmd.setCheckersBackground(checkers_background);
pcmd.setContents(content);
- QString file = QString(files.at(j)).replace(".", "_") + ".ps";
+ QString file = QString(files.at(j)).replace(QLatin1Char('.'), QLatin1Char('_')) + ".ps";
QPrinter p(highres ? QPrinter::HighResolution : QPrinter::ScreenResolution);
if (printdlg) {
diff --git a/tests/manual/network_remote_stresstest/network_remote_stresstest.pro b/tests/manual/network_remote_stresstest/network_remote_stresstest.pro
index 736747e486..754776f7e9 100644
--- a/tests/manual/network_remote_stresstest/network_remote_stresstest.pro
+++ b/tests/manual/network_remote_stresstest/network_remote_stresstest.pro
@@ -7,4 +7,3 @@ SOURCES += tst_network_remote_stresstest.cpp
RESOURCES += url-list.qrc
LIBS += $$QMAKE_LIBS_NETWORK
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp b/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp
index 486c5179b7..df61325439 100644
--- a/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp
+++ b/tests/manual/network_remote_stresstest/tst_network_remote_stresstest.cpp
@@ -246,30 +246,31 @@ void tst_NetworkRemoteStressTest::blockingSequentialRemoteHosts()
socket = QSharedPointer<QTcpSocket>(new QTcpSocket);
socket->connectToHost(url.host(), url.port(isHttps ? 443 : 80));
- QVERIFY2(socket->waitForConnected(10000), "Timeout connecting to " + url.encodedHost());
+ const QByteArray encodedHost = url.host(QUrl::FullyEncoded).toLatin1();
+ QVERIFY2(socket->waitForConnected(10000), "Timeout connecting to " + encodedHost);
#ifndef QT_NO_SSL
if (isHttps) {
static_cast<QSslSocket *>(socket.data())->setProtocol(QSsl::TlsV1_0);
static_cast<QSslSocket *>(socket.data())->startClientEncryption();
static_cast<QSslSocket *>(socket.data())->ignoreSslErrors();
- QVERIFY2(static_cast<QSslSocket *>(socket.data())->waitForEncrypted(10000), "Timeout starting TLS with " + url.encodedHost());
+ QVERIFY2(static_cast<QSslSocket *>(socket.data())->waitForEncrypted(10000), "Timeout starting TLS with " + encodedHost);
}
#endif // QT_NO_SSL
socket->write("GET " + url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority | QUrl::RemoveFragment) + " HTTP/1.0\r\n"
"Connection: close\r\n"
"User-Agent: tst_QTcpSocket_stresstest/1.0\r\n"
- "Host: " + url.encodedHost() + "\r\n"
+ "Host: " + encodedHost + "\r\n"
"\r\n");
while (socket->bytesToWrite())
- QVERIFY2(socket->waitForBytesWritten(10000), "Timeout writing to " + url.encodedHost());
+ QVERIFY2(socket->waitForBytesWritten(10000), "Timeout writing to " + encodedHost);
while (socket->state() == QAbstractSocket::ConnectedState && !timeout.hasExpired(10000)) {
socket->waitForReadyRead(10000);
byteCounter += socket->readAll().size(); // discard
}
- QVERIFY2(!timeout.hasExpired(10000), "Timeout reading from " + url.encodedHost());
+ QVERIFY2(!timeout.hasExpired(10000), "Timeout reading from " + encodedHost);
totalBytes += byteCounter;
if (intermediateDebug) {
@@ -318,16 +319,17 @@ void tst_NetworkRemoteStressTest::sequentialRemoteHosts()
socket->connectToHost(url.host(), url.port(80));
}
+ const QByteArray encodedHost = url.host(QUrl::FullyEncoded).toLatin1();
socket->write("GET " + url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority | QUrl::RemoveFragment) + " HTTP/1.0\r\n"
"Connection: close\r\n"
"User-Agent: tst_QTcpSocket_stresstest/1.0\r\n"
- "Host: " + url.encodedHost() + "\r\n"
+ "Host: " + encodedHost + "\r\n"
"\r\n");
connect(socket.data(), SIGNAL(readyRead()), SLOT(slotReadAll()));
QTestEventLoop::instance().connect(socket.data(), SIGNAL(disconnected()), SLOT(exitLoop()));
QTestEventLoop::instance().enterLoop(30);
- QVERIFY2(!QTestEventLoop::instance().timeout(), "Timeout with " + url.encodedHost() + "; "
+ QVERIFY2(!QTestEventLoop::instance().timeout(), "Timeout with " + encodedHost + "; "
+ QByteArray::number(socket->bytesToWrite()) + " bytes to write");
totalBytes += byteCounter;
@@ -397,10 +399,11 @@ void tst_NetworkRemoteStressTest::parallelRemoteHosts()
socket->connectToHost(url.host(), url.port(isHttps ? 443 : 80));
}
+ const QByteArray encodedHost = url.host(QUrl::FullyEncoded).toLatin1();
socket->write("GET " + url.toEncoded(QUrl::RemoveScheme | QUrl::RemoveAuthority | QUrl::RemoveFragment) + " HTTP/1.0\r\n"
"Connection: close\r\n"
"User-Agent: tst_QTcpSocket_stresstest/1.0\r\n"
- "Host: " + url.encodedHost() + "\r\n"
+ "Host: " + encodedHost + "\r\n"
"\r\n");
connect(socket, SIGNAL(readyRead()), SLOT(slotReadAll()));
QTestEventLoop::instance().connect(socket, SIGNAL(disconnected()), SLOT(exitLoop()));
diff --git a/tests/manual/network_stresstest/minihttpserver.cpp b/tests/manual/network_stresstest/minihttpserver.cpp
index d97fd7ec96..1a5fefcce7 100644
--- a/tests/manual/network_stresstest/minihttpserver.cpp
+++ b/tests/manual/network_stresstest/minihttpserver.cpp
@@ -141,7 +141,7 @@ void MiniHttpServerConnection::handlePendingRequest()
}
QUrl uri = QUrl::fromEncoded(request.mid(4, eol - int(strlen(http11)) - 4));
- source.setFileName(":" + uri.path());
+ source.setFileName(QLatin1Char(':') + uri.path());
// connection-close?
request = request.toLower();
diff --git a/tests/manual/qcursor/allcursors/allcursors.pro b/tests/manual/qcursor/allcursors/allcursors.pro
index c85ef861c2..b9f6a0c98d 100644
--- a/tests/manual/qcursor/allcursors/allcursors.pro
+++ b/tests/manual/qcursor/allcursors/allcursors.pro
@@ -14,4 +14,3 @@ SOURCES += main.cpp\
HEADERS += mainwindow.h
FORMS += mainwindow.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qcursor/grab_override/grab_override.pro b/tests/manual/qcursor/grab_override/grab_override.pro
index d163a726c3..d84e2ee2b8 100644
--- a/tests/manual/qcursor/grab_override/grab_override.pro
+++ b/tests/manual/qcursor/grab_override/grab_override.pro
@@ -16,4 +16,3 @@ HEADERS += mainwindow.h
FORMS += mainwindow.ui
RESOURCES += images.qrc
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qdesktopwidget/qdesktopwidget.pro b/tests/manual/qdesktopwidget/qdesktopwidget.pro
index 8d10589476..8979e7ef35 100644
--- a/tests/manual/qdesktopwidget/qdesktopwidget.pro
+++ b/tests/manual/qdesktopwidget/qdesktopwidget.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro b/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro
index a45ad29a5b..6135f74b8b 100644
--- a/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro
+++ b/tests/manual/qgraphicsitemgroup/qgraphicsitemgroup.pro
@@ -7,4 +7,3 @@ SOURCES += main.cpp \
HEADERS += widget.h \
customitem.h
FORMS += widget.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qgraphicslayout/flicker/flicker.pro b/tests/manual/qgraphicslayout/flicker/flicker.pro
index 12506c5571..d800418f85 100644
--- a/tests/manual/qgraphicslayout/flicker/flicker.pro
+++ b/tests/manual/qgraphicslayout/flicker/flicker.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += window.h
SOURCES += main.cpp window.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro b/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro
index 8440453cb7..62838785d6 100644
--- a/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro
+++ b/tests/manual/qhttpnetworkconnection/qhttpnetworkconnection.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += network testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qimagereader/qimagereader.pro b/tests/manual/qimagereader/qimagereader.pro
index 99e96537dc..3523257f3e 100644
--- a/tests/manual/qimagereader/qimagereader.pro
+++ b/tests/manual/qimagereader/qimagereader.pro
@@ -1,3 +1,2 @@
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qlocale/qlocale.pro b/tests/manual/qlocale/qlocale.pro
index 98079c7690..a5a2766e65 100644
--- a/tests/manual/qlocale/qlocale.pro
+++ b/tests/manual/qlocale/qlocale.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += currency.h calendar.h dateformats.h numberformats.h languages.h window.h miscellaneous.h info.h
SOURCES += currency.cpp main.cpp calendar.cpp dateformats.cpp numberformats.cpp languages.cpp window.cpp miscellaneous.cpp info.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qnetworkaccessmanager/qget/qget.cpp b/tests/manual/qnetworkaccessmanager/qget/qget.cpp
index 000e268c6e..cb435a792c 100644
--- a/tests/manual/qnetworkaccessmanager/qget/qget.cpp
+++ b/tests/manual/qnetworkaccessmanager/qget/qget.cpp
@@ -159,7 +159,7 @@ int main(int argc, char *argv[])
headersFile=str.mid(10);
else if (str == "--serial")
dl.setQueueMode(DownloadManager::Serial);
- else if (str.startsWith("-"))
+ else if (str.startsWith(QLatin1Char('-')))
qDebug() << "unsupported option" << str;
else {
QUrl url(QUrl::fromUserInput(str));
diff --git a/tests/manual/qnetworkaccessmanager/qget/qget.pro b/tests/manual/qnetworkaccessmanager/qget/qget.pro
index 082ffa7ac8..8a632f8d4e 100644
--- a/tests/manual/qnetworkaccessmanager/qget/qget.pro
+++ b/tests/manual/qnetworkaccessmanager/qget/qget.pro
@@ -6,4 +6,3 @@ SOURCES += qget.cpp
SOURCES += transferitem.cpp
SOURCES += downloadmanager.cpp
HEADERS += qget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp b/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp
index 13fba9f2e5..2e975cdfb2 100644
--- a/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp
+++ b/tests/manual/qnetworkaccessmanager/qget/transferitem.cpp
@@ -42,9 +42,9 @@ TransferItem::TransferItem(const QNetworkRequest &r, const QString &u, const QSt
void TransferItem::progress(qint64 sent, qint64 total)
{
if (total > 0)
- qDebug() << (sent*100/total) << "%";
+ qDebug() << (sent*100/total) << '%';
else
- qDebug() << sent << "B";
+ qDebug() << sent << 'B';
}
void TransferItem::start()
diff --git a/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
index 79de15933e..8f9314cc96 100644
--- a/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
+++ b/tests/manual/qnetworkconfigurationmanager/qnetworkconfigurationmanager.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += network testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qnetworkreply/qnetworkreply.pro b/tests/manual/qnetworkreply/qnetworkreply.pro
index 64666103a0..eddcbdff1d 100644
--- a/tests/manual/qnetworkreply/qnetworkreply.pro
+++ b/tests/manual/qnetworkreply/qnetworkreply.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += core-private network network-private testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qscreen/propertyfield.cpp b/tests/manual/qscreen/propertyfield.cpp
index 01f38624d4..a8cf90c9bb 100644
--- a/tests/manual/qscreen/propertyfield.cpp
+++ b/tests/manual/qscreen/propertyfield.cpp
@@ -87,7 +87,7 @@ void PropertyField::propertyChanged()
m_lastChangeTime = QTime::currentTime().addSecs(-5);
}
- qDebug() << " " << QString::fromUtf8(m_prop.name()) << ":" << val;
+ qDebug() << " " << QString::fromUtf8(m_prop.name()) << ':' << val;
// If the value has recently changed, show the change
if (text != m_lastText || m_lastChangeTime.elapsed() < 1000) {
setText(m_lastTextShowing + " -> " + text);
diff --git a/tests/manual/qssloptions/qssloptions.pro b/tests/manual/qssloptions/qssloptions.pro
index d4325b0fd1..a98fd61f51 100644
--- a/tests/manual/qssloptions/qssloptions.pro
+++ b/tests/manual/qssloptions/qssloptions.pro
@@ -6,4 +6,3 @@ QT += network testlib
#CONFIG += release
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtabletevent/device_information/device_information.pro b/tests/manual/qtabletevent/device_information/device_information.pro
index 59669843ba..727ad34bc1 100644
--- a/tests/manual/qtabletevent/device_information/device_information.pro
+++ b/tests/manual/qtabletevent/device_information/device_information.pro
@@ -4,4 +4,3 @@ SOURCES += \
tabletwidget.cpp
HEADERS += \
tabletwidget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtabletevent/device_information/tabletwidget.cpp b/tests/manual/qtabletevent/device_information/tabletwidget.cpp
index f1d838f01d..f868d5a910 100644
--- a/tests/manual/qtabletevent/device_information/tabletwidget.cpp
+++ b/tests/manual/qtabletevent/device_information/tabletwidget.cpp
@@ -61,7 +61,7 @@ bool TabletWidget::eventFilter(QObject *, QEvent *ev)
mType = event->type();
mPos = event->pos();
mGPos = event->globalPos();
- mHiResGlobalPos = event->hiResGlobalPos();
+ mHiResGlobalPos = event->posF();
mDev = event->device();
mPointerType = event->pointerType();
mUnique = event->uniqueId();
@@ -201,7 +201,7 @@ QString TabletWidget::buttonsToString(Qt::MouseButtons bs)
if (bs.testFlag(b))
ret << buttonToString(b);
}
- return ret.join("|");
+ return ret.join(QLatin1Char('|'));
}
void TabletWidget::tabletEvent(QTabletEvent *event)
diff --git a/tests/manual/qtabletevent/event_compression/event_compression.pro b/tests/manual/qtabletevent/event_compression/event_compression.pro
index 8300c33c87..15650d6190 100644
--- a/tests/manual/qtabletevent/event_compression/event_compression.pro
+++ b/tests/manual/qtabletevent/event_compression/event_compression.pro
@@ -3,4 +3,3 @@ QT += widgets testlib
SOURCES += main.cpp \
mousestatwidget.cpp
HEADERS += mousestatwidget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro b/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro
index fa41d09d1b..8f1f4342ee 100644
--- a/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro
+++ b/tests/manual/qtabletevent/regular_widgets/regular_widgets.pro
@@ -2,4 +2,3 @@ TEMPLATE = app
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtbug-8933/qtbug-8933.pro b/tests/manual/qtbug-8933/qtbug-8933.pro
index 0d8bfcc797..4600d47cac 100644
--- a/tests/manual/qtbug-8933/qtbug-8933.pro
+++ b/tests/manual/qtbug-8933/qtbug-8933.pro
@@ -14,4 +14,3 @@ SOURCES += main.cpp\
HEADERS += widget.h
FORMS += widget.ui
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qtouchevent/qtouchevent.pro b/tests/manual/qtouchevent/qtouchevent.pro
index 6a1ca85335..81384eaf24 100644
--- a/tests/manual/qtouchevent/qtouchevent.pro
+++ b/tests/manual/qtouchevent/qtouchevent.pro
@@ -4,4 +4,3 @@ SOURCES = main.cpp \
touchwidget.cpp
FORMS += form.ui
HEADERS += touchwidget.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/qwidget_zorder/qwidget_zorder.pro b/tests/manual/qwidget_zorder/qwidget_zorder.pro
index 99e96537dc..3523257f3e 100644
--- a/tests/manual/qwidget_zorder/qwidget_zorder.pro
+++ b/tests/manual/qwidget_zorder/qwidget_zorder.pro
@@ -1,3 +1,2 @@
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/mainwindow/mainwindow.pro b/tests/manual/repaint/mainwindow/mainwindow.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/mainwindow/mainwindow.pro
+++ b/tests/manual/repaint/mainwindow/mainwindow.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/scrollarea/scrollarea.pro b/tests/manual/repaint/scrollarea/scrollarea.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/scrollarea/scrollarea.pro
+++ b/tests/manual/repaint/scrollarea/scrollarea.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/splitter/splitter.pro b/tests/manual/repaint/splitter/splitter.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/splitter/splitter.pro
+++ b/tests/manual/repaint/splitter/splitter.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/tableview/tableview.pro b/tests/manual/repaint/tableview/tableview.pro
index ae27c84109..6a5aaad251 100644
--- a/tests/manual/repaint/tableview/tableview.pro
+++ b/tests/manual/repaint/tableview/tableview.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS +=../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/task141091/task141091.pro b/tests/manual/repaint/task141091/task141091.pro
index a7db71ba3e..b54299e540 100644
--- a/tests/manual/repaint/task141091/task141091.pro
+++ b/tests/manual/repaint/task141091/task141091.pro
@@ -1,4 +1,3 @@
CONFIG += console
QT += widgets
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/toplevel/toplevel.pro b/tests/manual/repaint/toplevel/toplevel.pro
index 827a7e2dac..a881c24f56 100644
--- a/tests/manual/repaint/toplevel/toplevel.pro
+++ b/tests/manual/repaint/toplevel/toplevel.pro
@@ -3,4 +3,3 @@ QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/repaint/widget/widget.pro b/tests/manual/repaint/widget/widget.pro
index 1fc3773864..f20e5fe402 100644
--- a/tests/manual/repaint/widget/widget.pro
+++ b/tests/manual/repaint/widget/widget.pro
@@ -1,4 +1,3 @@
QT += widgets
HEADERS += ../shared/shared.h
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/socketengine/socketengine.pro b/tests/manual/socketengine/socketengine.pro
index 3da17c2d49..d379628669 100644
--- a/tests/manual/socketengine/socketengine.pro
+++ b/tests/manual/socketengine/socketengine.pro
@@ -5,4 +5,3 @@ QT -= gui
QT += network-private core-private testlib
SOURCES += main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/textrendering/glyphshaping/glyphshaping.pro b/tests/manual/textrendering/glyphshaping/glyphshaping.pro
index 5dc8542e86..6500814423 100644
--- a/tests/manual/textrendering/glyphshaping/glyphshaping.pro
+++ b/tests/manual/textrendering/glyphshaping/glyphshaping.pro
@@ -4,4 +4,3 @@ OTHER_FILES = glyphshaping_data.xml
glyphshaping_data.path = .
glyphshaping_data.files = $$PWD/glyphshaping_data.xml
DEPLOYMENT += glyphshaping_data
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/textrendering/textperformance/textperformance.pro b/tests/manual/textrendering/textperformance/textperformance.pro
index acfd7b1906..f07a4f0294 100644
--- a/tests/manual/textrendering/textperformance/textperformance.pro
+++ b/tests/manual/textrendering/textperformance/textperformance.pro
@@ -1,3 +1,2 @@
QT += widgets
SOURCES = main.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/unc/main.cpp b/tests/manual/unc/main.cpp
index d507bb2ba4..b5893eda20 100644
--- a/tests/manual/unc/main.cpp
+++ b/tests/manual/unc/main.cpp
@@ -63,7 +63,7 @@ protected:
label->setTextInteractionFlags(Qt::TextBrowserInteraction);
label->setOpenExternalLinks(true);
- QString link("<a href=" + path + ">" + path + "</a>");
+ QString link("<a href=" + path + QLatin1Char('>') + path + "</a>");
label->setText(link);
return label;
diff --git a/tests/manual/widgetgrab/widgetgrab.pro b/tests/manual/widgetgrab/widgetgrab.pro
index f1d2b0e65f..d206fb1df1 100644
--- a/tests/manual/widgetgrab/widgetgrab.pro
+++ b/tests/manual/widgetgrab/widgetgrab.pro
@@ -6,5 +6,4 @@ SOURCES += main.cpp
greaterThan(QT_MAJOR_VERSION, 4) {
QT += widgets
- DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
}
diff --git a/tests/manual/widgets/itemviews/delegate/delegate.pro b/tests/manual/widgets/itemviews/delegate/delegate.pro
index 1ce6d141ab..e5c90f18ec 100644
--- a/tests/manual/widgets/itemviews/delegate/delegate.pro
+++ b/tests/manual/widgets/itemviews/delegate/delegate.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
QT += widgets
SOURCES=example.cpp
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro b/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro
index f83136266d..ac40c6e9e1 100644
--- a/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro
+++ b/tests/manual/widgets/itemviews/qheaderview/qheaderview.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = qheaderviewtest1.cpp
QT += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro b/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro
index c241ee1045..f06006ea3a 100644
--- a/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro
+++ b/tests/manual/widgets/itemviews/qtreeview/qtreeview.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = main.cpp
QT += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro b/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro
index 4b1da9be38..1969392ab3 100644
--- a/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro
+++ b/tests/manual/widgets/itemviews/qtreewidget/qtreewidget.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = main.cpp
QT += widgets core-private
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro b/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro
index 805b0cc119..731756cff3 100644
--- a/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro
+++ b/tests/manual/widgets/qgraphicsview/rubberband/rubberband.pro
@@ -1,4 +1,3 @@
TEMPLATE = app
SOURCES = rubberbandtest.cpp
QT += gui widgets # core-private
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/windowflags/windowflags.pro b/tests/manual/windowflags/windowflags.pro
index 546264cafc..ba0f75b65c 100644
--- a/tests/manual/windowflags/windowflags.pro
+++ b/tests/manual/windowflags/windowflags.pro
@@ -8,4 +8,3 @@ SOURCES = controllerwindow.cpp \
controls.cpp
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/windowgeometry/windowgeometry.pro b/tests/manual/windowgeometry/windowgeometry.pro
index c0c7ef0217..e717799649 100644
--- a/tests/manual/windowgeometry/windowgeometry.pro
+++ b/tests/manual/windowgeometry/windowgeometry.pro
@@ -7,4 +7,3 @@ INCLUDEPATH += ../windowflags
SOURCES += $$PWD/main.cpp controllerwidget.cpp ../windowflags/controls.cpp
HEADERS += controllerwidget.h ../windowflags/controls.h
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/manual/windowmodality/windowmodality.pro b/tests/manual/windowmodality/windowmodality.pro
index 12071fa7ee..b29e939d27 100644
--- a/tests/manual/windowmodality/windowmodality.pro
+++ b/tests/manual/windowmodality/windowmodality.pro
@@ -1,4 +1,3 @@
SOURCES = main.cpp
FORMS = widget.ui dialog.ui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
-DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tools/configure/Makefile.win32 b/tools/configure/Makefile.win32
index 8d6fe8bf72..c83ecaaeea 100644
--- a/tools/configure/Makefile.win32
+++ b/tools/configure/Makefile.win32
@@ -4,7 +4,7 @@ CONFSRC = $(TOOLSRC)\configure
PCH = configure_pch.pch
DEFINES = -DUNICODE -DQT_NO_CODECS -DQT_NO_TEXTCODEC -DQT_NO_UNICODETABLES -DQT_LITE_COMPONENT -DQT_NO_COMPRESS -DQT_NO_THREAD -DQT_NO_QOBJECT -DQT_NO_GEOM_VARIANT -D_CRT_SECURE_NO_DEPRECATE -DQT_BOOTSTRAPPED -DQT_BUILD_CONFIGURE -DQT_VERSION_STR=\"$(QTVERSION)\" -DQT_VERSION_MAJOR=$(QT_VERSION_MAJOR) -DQT_VERSION_MINOR=$(QT_VERSION_MINOR) -DQT_VERSION_PATCH=$(QT_VERSION_PATCH)
-INCPATH = -I"..\..\include" -I"..\..\include\QtCore" -I"..\..\include\QtCore\$(QTVERSION)" -I"..\..\include\QtCore\$(QTVERSION)\QtCore" -I"$(TOOLSRC)\shared" -I"$(QTSRC)mkspecs\win32-msvc2008"
+INCPATH = -I"..\..\include" -I"..\..\include\QtCore" -I"..\..\include\QtCore\$(QTVERSION)" -I"..\..\include\QtCore\$(QTVERSION)\QtCore" -I"$(TOOLSRC)\shared" -I"$(QTSRC)mkspecs\win32-msvc2012"
CXXFLAGS_BARE = -nologo -Zc:wchar_t -W3 -GR -EHsc -w34100 -w34189 -wd4577 $(CFLAGS_CRT) $(EXTRA_CXXFLAGS) $(DEFINES) $(INCPATH)
CXXFLAGS = -FIconfigure_pch.h -Yuconfigure_pch.h -Fp$(PCH) -MP $(CXXFLAGS_BARE)
LINK = link
diff --git a/tools/configure/configureapp.cpp b/tools/configure/configureapp.cpp
index 5ddb3cb489..d2f5547804 100644
--- a/tools/configure/configureapp.cpp
+++ b/tools/configure/configureapp.cpp
@@ -160,6 +160,7 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "SSE4_2" ] = "auto";
dictionary[ "AVX" ] = "auto";
dictionary[ "AVX2" ] = "auto";
+ dictionary[ "AVX512" ] = "auto";
dictionary[ "SYNCQT" ] = "auto";
dictionary[ "CE_CRT" ] = "no";
dictionary[ "CETEST" ] = "auto";
@@ -261,6 +262,7 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "PNG" ] = "auto";
dictionary[ "LIBJPEG" ] = "auto";
dictionary[ "LIBPNG" ] = "auto";
+ dictionary[ "DOUBLECONVERSION" ] = "auto";
dictionary[ "FREETYPE" ] = "yes";
dictionary[ "HARFBUZZ" ] = "qt";
@@ -279,7 +281,6 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "STYLE_FUSION" ] = "yes";
dictionary[ "STYLE_WINDOWSCE" ] = "no";
dictionary[ "STYLE_WINDOWSMOBILE" ] = "no";
- dictionary[ "STYLE_GTK" ] = "no";
dictionary[ "SQL_MYSQL" ] = "no";
dictionary[ "SQL_ODBC" ] = "no";
@@ -305,7 +306,7 @@ Configure::Configure(int& argc, char** argv) : verbose(0)
dictionary[ "NATIVE_GESTURES" ] = "yes";
dictionary[ "MSVC_MP" ] = "no";
- if (dictionary["QMAKESPEC"] == QString("win32-g++")) {
+ if (dictionary["QMAKESPEC"].startsWith("win32-g++")) {
const QString zero = QStringLiteral("0");
const QStringList parts = Environment::gccVersion().split(QLatin1Char('.'));
dictionary["QT_GCC_MAJOR_VERSION"] = parts.value(0, zero);
@@ -467,25 +468,21 @@ void Configure::parseCmdLine()
dictionary[ "COMPILE_EXAMPLES" ] = "no";
}
- else if (configCmdLine.at(i) == "-c++11")
- dictionary[ "C++STD" ] = "c++11";
- else if (configCmdLine.at(i) == "-no-c++11")
- dictionary[ "C++STD" ] = "c++98";
else if (configCmdLine.at(i) == "-c++std") {
++i;
if (i == argCount)
break;
QString level = configCmdLine.at(i);
- if (level == "c++98" || level == "c++11" || level == "c++14" || level == "c++1z"
+ if (level == "c++11" || level == "c++14" || level == "c++1z"
|| level == "auto") {
dictionary[ "C++STD" ] = level;
- } else if (level == "98" || level == "11" || level == "14" || level == "1z") {
+ } else if (level == "11" || level == "14" || level == "1z") {
dictionary[ "C++STD" ] = "c++" + level;
} else {
dictionary[ "DONE" ] = "error";
cout << "ERROR: invalid C++ standard " << level
- << "; valid options are: c++98 c++11 c++14 c++1z auto" << endl;
+ << "; valid options are: c++11 c++14 c++1z auto" << endl;
return;
}
}
@@ -627,6 +624,14 @@ void Configure::parseCmdLine()
dictionary[ "LIBPNG" ] = "system";
}
+ // Double Conversion -----------------------------------------
+ else if (configCmdLine.at(i) == "-no-doubleconversion")
+ dictionary[ "DOUBLECONVERSION" ] = "no";
+ else if (configCmdLine.at(i) == "-qt-doubleconversion")
+ dictionary[ "DOUBLECONVERSION" ] = "qt";
+ else if (configCmdLine.at(i) == "-system-doubleconversion")
+ dictionary[ "DOUBLECONVERSION" ] = "system";
+
// Text Rendering --------------------------------------------
else if (configCmdLine.at(i) == "-no-freetype")
dictionary[ "FREETYPE" ] = "no";
@@ -889,6 +894,10 @@ void Configure::parseCmdLine()
dictionary[ "AVX2" ] = "no";
else if (configCmdLine.at(i) == "-avx2")
dictionary[ "AVX2" ] = "yes";
+ else if (configCmdLine.at(i) == "-no-avx512")
+ dictionary[ "AVX512" ] = "";
+ else if (configCmdLine.at(i) == "-avx512")
+ dictionary[ "AVX512" ] = "auto";
else if (configCmdLine.at(i) == "-no-ssl") {
dictionary[ "SSL"] = "no";
@@ -1417,19 +1426,12 @@ void Configure::parseCmdLine()
cout << "See the README file for a list of supported operating systems and compilers." << endl;
} else {
if (dictionary[ "QMAKESPEC" ].endsWith("-icc") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc.net") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2002") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2003") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2005") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2008") ||
- dictionary[ "QMAKESPEC" ].endsWith("-msvc2010") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2012") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2013") ||
dictionary[ "QMAKESPEC" ].endsWith("-msvc2015")) {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "nmake";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.win32";
- } else if (dictionary[ "QMAKESPEC" ] == QString("win32-g++")) {
+ } else if (dictionary[ "QMAKESPEC" ].startsWith(QLatin1String("win32-g++"))) {
if (dictionary[ "MAKE" ].isEmpty()) dictionary[ "MAKE" ] = "mingw32-make";
dictionary[ "QMAKEMAKEFILE" ] = "Makefile.unix";
} else {
@@ -1705,6 +1707,7 @@ void Configure::applySpecSpecifics()
dictionary[ "SSE4_2" ] = "no";
dictionary[ "AVX" ] = "no";
dictionary[ "AVX2" ] = "no";
+ dictionary[ "AVX512" ] = "no";
dictionary[ "CE_CRT" ] = "yes";
dictionary[ "LARGE_FILE" ] = "no";
dictionary[ "ANGLE" ] = "no";
@@ -1817,7 +1820,7 @@ bool Configure::displayHelp()
desc("OPENSOURCE", "opensource", "-opensource", "Compile and link the Open-Source Edition of Qt.");
desc("COMMERCIAL", "commercial", "-commercial", "Compile and link the Commercial Edition of Qt.\n");
- desc( "-c++std <edition>", "Compile Qt with C++ standard edition (c++98, c++11, c++14, c++1z)\n"
+ desc( "-c++std <edition>", "Compile Qt with C++ standard edition (c++11, c++14, c++1z)\n"
"Default: highest supported. This option is not supported for MSVC.\n");
desc("USE_GOLD_LINKER", "yes", "-use-gold-linker", "Link using the GNU gold linker (gcc only).");
@@ -1961,6 +1964,10 @@ bool Configure::displayHelp()
desc("LIBJPEG", "qt", "-qt-libjpeg", "Use the libjpeg bundled with Qt.");
desc("LIBJPEG", "system","-system-libjpeg", "Use libjpeg from the operating system.\nSee http://www.ijg.org\n");
+ desc("DOUBLECONVERSION", "no", "-no-doubleconversion", "Use sscanf_l and snprintf_l for (imprecise) double conversion.");
+ desc("DOUBLECONVERSION", "qt", "-qt-doubleconversion", "Use the libdouble-conversion bundled with Qt.");
+ desc("DOUBLECONVERSION", "system", "-system-doubleconversion", "Use the libdouble-conversion provided by the system.");
+
desc("FREETYPE", "no", "-no-freetype", "Do not compile in Freetype2 support.");
desc("FREETYPE", "yes", "-qt-freetype", "Use the libfreetype bundled with Qt.");
desc("FREETYPE", "system","-system-freetype", "Use the libfreetype provided by the system.");
@@ -2020,6 +2027,8 @@ bool Configure::displayHelp()
desc("AVX", "yes", "-avx", "Compile with use of AVX instructions.");
desc("AVX2", "no", "-no-avx2", "Do not compile with use of AVX2 instructions.");
desc("AVX2", "yes", "-avx2", "Compile with use of AVX2 instructions.\n");
+ desc("AVX512", "no", "-no-avx512", "Do not compile with use of AVX512 instructions.");
+ desc("AVX512", "yes", "-avx512", "Compile with use of AVX512 instructions.\n");
desc("SSL", "no", "-no-ssl", "Do not compile support for SSL.");
desc("SSL", "yes", "-ssl", "Enable run-time SSL support.");
desc("OPENSSL", "no", "-no-openssl", "Do not compile support for OpenSSL.");
@@ -2164,11 +2173,6 @@ bool Configure::checkAngleAvailability(QString *errorMessage /* = 0 */) const
// it is also present in MinGW.
const QString directXSdk = Environment::detectDirectXSdk();
const Compiler compiler = Environment::compilerFromQMakeSpec(dictionary[QStringLiteral("QMAKESPEC")]);
- if (compiler >= CC_MSVC2005 && compiler <= CC_MSVC2008) {
- if (errorMessage)
- *errorMessage = QStringLiteral("ANGLE is no longer supported for this compiler.");
- return false;
- }
if (compiler < CC_MSVC2012 && directXSdk.isEmpty()) {
if (errorMessage)
*errorMessage = QStringLiteral("There is no Direct X SDK installed or the environment variable \"DXSDK_DIR\" is not set.");
@@ -2208,6 +2212,24 @@ bool Configure::checkAngleAvailability(QString *errorMessage /* = 0 */) const
return true;
}
+QString Configure::checkAvx512Availability()
+{
+ static const char avx512features[][5] = { "cd", "er", "pf", "bw", "dq", "vl", "ifma", "vbmi" };
+
+ // try AVX512 Foundation. No Foundation, nothing else works.
+ if (!tryCompileProject("common/avx512", "AVX512=F"))
+ return QString();
+
+ QString available = "avx512f";
+ for (int i = 0; i < sizeof(avx512features)/sizeof(avx512features[0]); ++i) {
+ if (tryCompileProject("common/avx512", QStringLiteral("AVX512=%0").arg(avx512features[i]).toUpper())) {
+ available += " avx512";
+ available += avx512features[i];
+ }
+ }
+ return available;
+}
+
/*!
Checks the system for the availability of a feature.
Returns true if the feature is available, else false.
@@ -2356,6 +2378,8 @@ bool Configure::checkAvailability(const QString &part)
available = dictionary["QT_CPU_FEATURES"].contains("neon");
} else if (part == "FONT_CONFIG") {
available = tryCompileProject("unix/fontconfig");
+ } else if (part == "DOUBLECONVERSION") {
+ available = tryCompileProject("unix/doubleconversion");
}
return available;
@@ -2373,7 +2397,10 @@ void Configure::autoDetection()
if (dictionary["C++STD"] == "auto" && !dictionary["QMAKESPEC"].contains("msvc")) {
if (!tryCompileProject("common/c++11")) {
- dictionary["C++STD"] = "c++98";
+ dictionary["DONE"] = "error";
+ cout << "ERROR: Qt requires a C++11 compiler and yours does not seem to be that." << endl
+ << "Please upgrade." << endl;
+ return;
} else if (!tryCompileProject("common/c++14")) {
dictionary["C++STD"] = "c++11";
} else if (!tryCompileProject("common/c++1z")) {
@@ -2483,6 +2510,8 @@ void Configure::autoDetection()
dictionary["AVX"] = checkAvailability("AVX") ? "yes" : "no";
if (dictionary["AVX2"] == "auto")
dictionary["AVX2"] = checkAvailability("AVX2") ? "yes" : "no";
+ if (dictionary["AVX512"] == "auto")
+ dictionary["AVX512"] = checkAvx512Availability();
if (dictionary["NEON"] == "auto")
dictionary["NEON"] = checkAvailability("NEON") ? "yes" : "no";
if (dictionary["SSL"] == "auto") {
@@ -2570,6 +2599,9 @@ void Configure::autoDetection()
if (dictionary["FONT_CONFIG"] == "auto")
dictionary["FONT_CONFIG"] = checkAvailability("FONT_CONFIG") ? "yes" : "no";
+ if (dictionary["DOUBLECONVERSION"] == "auto")
+ dictionary["DOUBLECONVERSION"] = checkAvailability("DOUBLECONVERSION") ? "system" : "qt";
+
if (dictionary["DIRECTWRITE"] == "auto")
dictionary["DIRECTWRITE"] = checkAvailability("DIRECTWRITE") ? "yes" : "no";
@@ -2625,9 +2657,8 @@ bool Configure::verifyConfiguration()
<< "Oracle driver, as the current build will most likely fail." << endl;
prompt = true;
}
- if (dictionary["QMAKESPEC"].endsWith("win32-msvc.net")) {
- cout << "WARNING: The makespec win32-msvc.net is deprecated. Consider using" << endl
- << "win32-msvc2002 or win32-msvc2003 instead." << endl;
+ if (dictionary["QMAKESPEC"].endsWith("win32-msvc2008") || dictionary["QMAKESPEC"].endsWith("win32-msvc2010")) {
+ cout << "ERROR: Qt cannot be compiled with Visual Studio 2008 or 2010." << endl;
prompt = true;
}
if (0 != dictionary["ARM_FPU_TYPE"].size()) {
@@ -2814,6 +2845,14 @@ void Configure::generateOutputVars()
if (dictionary[ "LIBPNG" ] == "system")
qtConfig += "system-png";
+ // Double conversion -----------------------------------------------
+ if (dictionary[ "DOUBLECONVERSION" ] == "qt")
+ qtConfig += "doubleconversion";
+ else if (dictionary[ "DOUBLECONVERSION" ] == "system")
+ qtConfig += "system-doubleconversion";
+ else if (dictionary[ "DOUBLECONVERSION" ] == "no")
+ qtConfig += "no-doubleconversion";
+
// Text rendering --------------------------------------------------
if (dictionary[ "FREETYPE" ] == "yes")
qtConfig += "freetype";
@@ -3198,6 +3237,8 @@ void Configure::generateCachefile()
moduleStream << " avx";
if (dictionary[ "AVX2" ] == "yes")
moduleStream << " avx2";
+ if (!dictionary[ "AVX512" ].isEmpty())
+ moduleStream << ' ' << dictionary[ "AVX512" ];
if (dictionary[ "NEON" ] == "yes")
moduleStream << " neon";
if (dictionary[ "LARGE_FILE" ] == "yes")
@@ -3677,6 +3718,8 @@ void Configure::generateConfigfiles()
tmpStream << "#define QT_COMPILER_SUPPORTS_AVX 1" << endl;
if (dictionary[ "AVX2" ] == "yes")
tmpStream << "#define QT_COMPILER_SUPPORTS_AVX2 1" << endl;
+ foreach (const QString &avx512feature, dictionary[ "AVX512" ].split(' ', QString::SkipEmptyParts))
+ tmpStream << "#define QT_COMPILER_SUPPRTS_" << avx512feature.toUpper() << " 1" << endl;
if (dictionary["QREAL"] != "double") {
tmpStream << "#define QT_COORD_TYPE " << dictionary["QREAL"] << endl;
@@ -3693,7 +3736,6 @@ void Configure::generateConfigfiles()
if (dictionary["STYLE_WINDOWSVISTA"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSVISTA";
if (dictionary["STYLE_WINDOWSCE"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSCE";
if (dictionary["STYLE_WINDOWSMOBILE"] != "yes") qconfigList += "QT_NO_STYLE_WINDOWSMOBILE";
- if (dictionary["STYLE_GTK"] != "yes") qconfigList += "QT_NO_STYLE_GTK";
if (dictionary["GIF"] == "yes") qconfigList += "QT_BUILTIN_GIF_READER=1";
if (dictionary["PNG"] != "yes") qconfigList += "QT_NO_IMAGEFORMAT_PNG";
@@ -3841,13 +3883,19 @@ void Configure::displayConfig()
sout << "Link Time Code Generation..." << dictionary[ "LTCG" ] << endl;
sout << "Accessibility support......." << dictionary[ "ACCESSIBILITY" ] << endl;
sout << "RTTI support................" << dictionary[ "RTTI" ] << endl;
- sout << "SSE2 support................" << dictionary[ "SSE2" ] << endl;
- sout << "SSE3 support................" << dictionary[ "SSE3" ] << endl;
- sout << "SSSE3 support..............." << dictionary[ "SSSE3" ] << endl;
- sout << "SSE4.1 support.............." << dictionary[ "SSE4_1" ] << endl;
- sout << "SSE4.2 support.............." << dictionary[ "SSE4_2" ] << endl;
- sout << "AVX support................." << dictionary[ "AVX" ] << endl;
- sout << "AVX2 support................" << dictionary[ "AVX2" ] << endl;
+ sout << "SSE support................."
+ << (dictionary[ "SSE2" ] == "no" ? "<none>" : "SSE2")
+ << (dictionary[ "SSE3" ] == "no" ? "" : " SSE3")
+ << (dictionary[ "SSSE3" ] == "no" ? "" : " SSSE3")
+ << (dictionary[ "SSE4_1" ] == "no" ? "" : " SSE4.1")
+ << (dictionary[ "SSE4_2" ] == "no" ? "" : " SSE4.2")
+ << endl;
+ sout << "AVX support................."
+ << (dictionary[ "AVX" ] == "no" ? "<none>" : "AVX")
+ << (dictionary[ "AVX2" ] == "no" ? "" : " AVX2")
+ << endl;
+ sout << "AVX512 support.............."
+ << (dictionary[ "AVX512" ].isEmpty() ? QString("<none>") : dictionary[ "AVX512" ].toUpper()) << endl;
sout << "NEON support................" << dictionary[ "NEON" ] << endl;
sout << "OpenGL support.............." << dictionary[ "OPENGL" ] << endl;
sout << "Large File support.........." << dictionary[ "LARGE_FILE" ] << endl;
@@ -3881,6 +3929,7 @@ void Configure::displayConfig()
sout << " GIF support............." << dictionary[ "GIF" ] << endl;
sout << " JPEG support............" << dictionary[ "JPEG" ] << endl;
sout << " PNG support............." << dictionary[ "PNG" ] << endl;
+ sout << " DoubleConversion........" << dictionary[ "DOUBLECONVERSION" ] << endl;
sout << " FreeType support........" << dictionary[ "FREETYPE" ] << endl;
sout << " Fontconfig support......" << dictionary[ "FONT_CONFIG" ] << endl;
sout << " HarfBuzz support........" << dictionary[ "HARFBUZZ" ] << endl;
@@ -4002,14 +4051,6 @@ void Configure::displayConfig()
<< "will be the same unless you are cross-compiling)." << endl
<< endl;
}
- if (dictionary["C++STD"] == "c++98") {
- sout << endl
- << "NOTE: The -no-c++11 / -c++-level c++98 option is deprecated." << endl
- << endl
- << "Qt 5.7 will require C++11 support. The options are in effect for this" << endl
- << "Qt 5.6 build, but you should update your build scripts to remove the" << endl
- << "option and, if necessary, upgrade your compiler." << endl;
- }
if (!dictionary["PREFIX_COMPLAINTS"].isEmpty()) {
sout << endl
<< dictionary["PREFIX_COMPLAINTS"] << endl
@@ -4303,10 +4344,10 @@ void Configure::buildQmake()
<< "QT_MAJOR_VERSION = " << dictionary["VERSION_MAJOR"] << endl
<< "QT_MINOR_VERSION = " << dictionary["VERSION_MINOR"] << endl
<< "QT_PATCH_VERSION = " << dictionary["VERSION_PATCH"] << endl;
- if (dictionary[ "QMAKESPEC" ] == QString("win32-g++")) {
- stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\win32-g++" << endl
+ if (dictionary[ "QMAKESPEC" ].startsWith("win32-g++")) {
+ stream << "QMAKESPEC = $(SOURCE_PATH)\\mkspecs\\" << dictionary[ "QMAKESPEC" ] << endl
<< "EXTRA_CFLAGS = -DUNICODE -ffunction-sections" << endl
- << "EXTRA_CXXFLAGS = -DUNICODE -ffunction-sections" << endl
+ << "EXTRA_CXXFLAGS = -std=c++11 -DUNICODE -ffunction-sections" << endl
<< "EXTRA_LFLAGS = -Wl,--gc-sections" << endl
<< "QTOBJS = qfilesystemengine_win.o \\" << endl
<< " qfilesystemiterator_win.o \\" << endl
diff --git a/tools/configure/configureapp.h b/tools/configure/configureapp.h
index 78cc118a9d..5361cc2b1d 100644
--- a/tools/configure/configureapp.h
+++ b/tools/configure/configureapp.h
@@ -92,6 +92,7 @@ public:
private:
bool checkAngleAvailability(QString *errorMessage = 0) const;
+ QString checkAvx512Availability();
int verbose;
diff --git a/tools/configure/environment.cpp b/tools/configure/environment.cpp
index 11064a757d..af4c5e2247 100644
--- a/tools/configure/environment.cpp
+++ b/tools/configure/environment.cpp
@@ -68,12 +68,6 @@ struct CompilerInfo{
{CC_BORLAND, "Borland C++", 0, "bcc32.exe"},
{CC_MINGW, "MinGW (Minimalist GNU for Windows)", 0, "g++.exe"},
{CC_INTEL, "Intel(R) C++ Compiler for 32-bit applications", 0, "icl.exe"}, // xilink.exe, xilink5.exe, xilink6.exe, xilib.exe
- {CC_MSVC2005, "Microsoft (R) Visual Studio 2005 C/C++ Compiler (8.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\8.0", "cl.exe"}, // link.exe, lib.exe
- {CC_MSVC2005, "Microsoft (R) Visual Studio 2005 C/C++ Compiler (8.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\8.0", "cl.exe"}, // link.exe, lib.exe
- {CC_MSVC2008, "Microsoft (R) Visual Studio 2008 C/C++ Compiler (9.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\9.0", "cl.exe"}, // link.exe, lib.exe
- {CC_MSVC2008, "Microsoft (R) Visual Studio 2008 C/C++ Compiler (9.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\9.0", "cl.exe"}, // link.exe, lib.exe
- {CC_MSVC2010, "Microsoft (R) Visual Studio 2010 C/C++ Compiler (10.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\10.0", "cl.exe"}, // link.exe, lib.exe
- {CC_MSVC2010, "Microsoft (R) Visual Studio 2010 C/C++ Compiler (10.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\10.0", "cl.exe"}, // link.exe, lib.exe
{CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe
{CC_MSVC2012, "Microsoft (R) Visual Studio 2012 C/C++ Compiler (11.0)", "Software\\Wow6432Node\\Microsoft\\VisualStudio\\SxS\\VC7\\11.0", "cl.exe"}, // link.exe, lib.exe
{CC_MSVC2013, "Microsoft (R) Visual Studio 2013 C/C++ Compiler (12.0)", "Software\\Microsoft\\VisualStudio\\SxS\\VC7\\12.0", "cl.exe"}, // link.exe, lib.exe
@@ -115,15 +109,6 @@ QString Environment::detectQMakeSpec()
case CC_MSVC2012:
spec = "win32-msvc2012";
break;
- case CC_MSVC2010:
- spec = "win32-msvc2010";
- break;
- case CC_MSVC2008:
- spec = "win32-msvc2008";
- break;
- case CC_MSVC2005:
- spec = "win32-msvc2005";
- break;
case CC_INTEL:
spec = "win32-icc";
break;
@@ -148,12 +133,6 @@ Compiler Environment::compilerFromQMakeSpec(const QString &qmakeSpec)
return CC_MSVC2013;
if (qmakeSpec == QLatin1String("win32-msvc2012"))
return CC_MSVC2012;
- if (qmakeSpec == QLatin1String("win32-msvc2010"))
- return CC_MSVC2010;
- if (qmakeSpec == QLatin1String("win32-msvc2008"))
- return CC_MSVC2008;
- if (qmakeSpec == QLatin1String("win32-msvc2005"))
- return CC_MSVC2005;
if (qmakeSpec == QLatin1String("win32-icc"))
return CC_INTEL;
if (qmakeSpec == QLatin1String("win32-g++"))