From f42469deb2f5993a7dc53817c62a43a22c35cbc4 Mon Sep 17 00:00:00 2001 From: "falktx@falktx.com" Date: Sun, 4 Aug 2024 11:57:06 +0200 Subject: [PATCH] Update to latest DPF Signed-off-by: falktx@falktx.com --- Makefile | 4 +- dpf/CMakeLists.txt | 10 +- dpf/FEATURES.md | 46 +- dpf/LICENSE | 21 +- dpf/LICENSING.md | 19 +- dpf/Makefile.base.mk | 164 +- dpf/Makefile.plugins.mk | 170 +- dpf/cmake/DPF-plugin.cmake | 399 +- dpf/dgl/Application.hpp | 37 +- dpf/dgl/Base.hpp | 65 +- dpf/dgl/EventHandlers.hpp | 6 +- dpf/dgl/ImageBaseWidgets.hpp | 1 + dpf/dgl/Makefile | 12 +- dpf/dgl/StandaloneWindow.hpp | 1 + dpf/dgl/Widget.hpp | 4 +- dpf/dgl/Window.hpp | 13 +- dpf/dgl/src/Application.cpp | 72 +- dpf/dgl/src/ApplicationPrivateData.cpp | 42 +- dpf/dgl/src/ApplicationPrivateData.hpp | 6 + dpf/dgl/src/Cairo.cpp | 14 +- dpf/dgl/src/EventHandlers.cpp | 15 +- dpf/dgl/src/ImageBaseWidgets.cpp | 7 + dpf/dgl/src/Layout.cpp | 26 +- dpf/dgl/src/OpenGL.cpp | 22 +- dpf/dgl/src/Stub.cpp | 193 + dpf/dgl/src/SubWidget.cpp | 4 +- dpf/dgl/src/Window.cpp | 66 +- dpf/dgl/src/WindowPrivateData.cpp | 40 +- dpf/dgl/src/WindowPrivateData.hpp | 18 +- dpf/dgl/src/pugl-upstream/.clang-tidy | 2 + dpf/dgl/src/pugl-upstream/include/pugl/pugl.h | 33 +- dpf/dgl/src/pugl-upstream/src/common.c | 18 +- dpf/dgl/src/pugl-upstream/src/internal.c | 6 + dpf/dgl/src/pugl-upstream/src/mac.m | 63 +- dpf/dgl/src/pugl-upstream/src/mac_cairo.m | 4 +- dpf/dgl/src/pugl-upstream/src/win.c | 67 +- dpf/dgl/src/pugl-upstream/src/win_gl.c | 2 +- dpf/dgl/src/pugl-upstream/src/win_vulkan.c | 2 +- dpf/dgl/src/pugl-upstream/src/x11.c | 83 +- dpf/dgl/src/pugl.cpp | 53 +- dpf/distrho/DistrhoDetails.hpp | 99 +- dpf/distrho/DistrhoInfo.hpp | 75 +- dpf/distrho/DistrhoPlugin.hpp | 60 +- dpf/distrho/DistrhoPluginInfo.h.template | 392 ++ dpf/distrho/DistrhoPluginMain.cpp | 8 +- dpf/distrho/DistrhoPluginUtils.hpp | 10 +- dpf/distrho/DistrhoUI.hpp | 63 +- dpf/distrho/DistrhoUIMain.cpp | 22 +- dpf/distrho/DistrhoUI_macOS.mm | 27 +- dpf/distrho/DistrhoUI_win32.cpp | 27 + dpf/distrho/DistrhoUtils.hpp | 130 +- dpf/distrho/extra/ChildProcess.hpp | 276 + dpf/distrho/extra/FileBrowserDialogImpl.cpp | 45 +- dpf/distrho/extra/FileBrowserDialogImpl.hpp | 12 +- dpf/distrho/extra/RingBuffer.hpp | 91 +- dpf/distrho/extra/Sleep.hpp | 10 +- dpf/distrho/extra/String.hpp | 22 +- dpf/distrho/extra/Time.hpp | 127 + dpf/distrho/extra/WebView.hpp | 28 + dpf/distrho/extra/WebViewImpl.cpp | 1493 ++++++ dpf/distrho/extra/WebViewImpl.hpp | 126 + dpf/distrho/extra/WebViewWin32.hpp | 101 + dpf/distrho/extra/choc/LICENSE.md | 15 + dpf/distrho/extra/choc/README.md | 22 + dpf/distrho/extra/choc/choc.patch | 2803 ++++++++++ dpf/distrho/extra/choc/choc_DesktopWindow.h | 154 + dpf/distrho/extra/choc/choc_DynamicLibrary.h | 141 + dpf/distrho/extra/choc/choc_MemoryDLL.h | 511 ++ dpf/distrho/extra/choc/choc_Platform.h | 67 + dpf/distrho/extra/choc/choc_StringUtilities.h | 74 + dpf/distrho/extra/choc/choc_WebView.h | 4769 +++++++++++++++++ dpf/distrho/src/DistrhoDefines.h | 3 + dpf/distrho/src/DistrhoPlugin.cpp | 3 +- dpf/distrho/src/DistrhoPluginAU.cpp | 3205 +++++++++++ dpf/distrho/src/DistrhoPluginCLAP.cpp | 46 +- dpf/distrho/src/DistrhoPluginChecks.h | 171 +- dpf/distrho/src/DistrhoPluginExport.cpp | 281 + dpf/distrho/src/DistrhoPluginInternal.hpp | 57 +- dpf/distrho/src/DistrhoPluginJACK.cpp | 57 +- dpf/distrho/src/DistrhoPluginLV2.cpp | 38 +- dpf/distrho/src/DistrhoPluginLV2export.cpp | 18 +- dpf/distrho/src/DistrhoPluginVST.hpp | 18 +- dpf/distrho/src/DistrhoPluginVST2.cpp | 66 +- dpf/distrho/src/DistrhoPluginVST3.cpp | 67 +- dpf/distrho/src/DistrhoUI.cpp | 350 +- dpf/distrho/src/DistrhoUIAU.mm | 502 ++ dpf/distrho/src/DistrhoUIDSSI.cpp | 26 +- dpf/distrho/src/DistrhoUIInternal.hpp | 79 +- dpf/distrho/src/DistrhoUILV2.cpp | 5 +- dpf/distrho/src/DistrhoUIPrivateData.hpp | 179 +- dpf/distrho/src/DistrhoUIVST3.cpp | 182 +- dpf/distrho/src/DistrhoUtils.cpp | 18 +- dpf/distrho/src/jackbridge/JackBridge.cpp | 4 +- dpf/distrho/src/jackbridge/NativeBridge.hpp | 8 +- dpf/utils/au-services-restart.sh | 7 + dpf/utils/generate-ttl.sh | 14 +- dpf/utils/package-osx-bundles.sh | 91 +- dpf/utils/plugin.pkg/package.xml.in | 33 +- dpf/utils/symbols/au.exp | 1 + plugins/3BandEQ/DistrhoPlugin3BandEQ.hpp | 5 - plugins/3BandEQ/DistrhoPluginInfo.h | 7 +- plugins/3BandEQ/Makefile | 9 +- .../DistrhoPlugin3BandSplitter.hpp | 5 - plugins/3BandSplitter/DistrhoPluginInfo.h | 7 +- plugins/3BandSplitter/Makefile | 9 +- plugins/AmplitudeImposer/Makefile | 3 +- plugins/CycleShifter/Makefile | 3 +- plugins/MVerb/Makefile | 3 +- plugins/Nekobi/DistrhoPluginInfo.h | 7 +- plugins/Nekobi/DistrhoPluginNekobi.hpp | 5 - plugins/Nekobi/Makefile | 5 +- plugins/PingPongPan/DistrhoPluginInfo.h | 7 +- .../PingPongPan/DistrhoPluginPingPongPan.hpp | 5 - plugins/PingPongPan/Makefile | 9 +- plugins/ProM/Makefile | 3 +- plugins/SoulForce/Makefile | 3 +- plugins/glBars/Makefile | 3 +- 117 files changed, 17894 insertions(+), 1363 deletions(-) create mode 100644 dpf/dgl/src/Stub.cpp create mode 100644 dpf/distrho/DistrhoPluginInfo.h.template create mode 100644 dpf/distrho/DistrhoUI_win32.cpp create mode 100644 dpf/distrho/extra/ChildProcess.hpp create mode 100644 dpf/distrho/extra/Time.hpp create mode 100644 dpf/distrho/extra/WebView.hpp create mode 100644 dpf/distrho/extra/WebViewImpl.cpp create mode 100644 dpf/distrho/extra/WebViewImpl.hpp create mode 100644 dpf/distrho/extra/WebViewWin32.hpp create mode 100644 dpf/distrho/extra/choc/LICENSE.md create mode 100644 dpf/distrho/extra/choc/README.md create mode 100644 dpf/distrho/extra/choc/choc.patch create mode 100644 dpf/distrho/extra/choc/choc_DesktopWindow.h create mode 100644 dpf/distrho/extra/choc/choc_DynamicLibrary.h create mode 100644 dpf/distrho/extra/choc/choc_MemoryDLL.h create mode 100644 dpf/distrho/extra/choc/choc_Platform.h create mode 100644 dpf/distrho/extra/choc/choc_StringUtilities.h create mode 100644 dpf/distrho/extra/choc/choc_WebView.h create mode 100644 dpf/distrho/src/DistrhoPluginAU.cpp create mode 100644 dpf/distrho/src/DistrhoPluginExport.cpp create mode 100644 dpf/distrho/src/DistrhoUIAU.mm create mode 100755 dpf/utils/au-services-restart.sh create mode 100644 dpf/utils/symbols/au.exp diff --git a/Makefile b/Makefile index 89992f3..8b7ce6f 100644 --- a/Makefile +++ b/Makefile @@ -28,9 +28,9 @@ endif dgl: ifeq ($(HAVE_CAIRO_OR_OPENGL),true) - $(MAKE) FILE_BROWSER_DISABLED=true -C dpf/dgl + $(MAKE) USE_FILE_BROWSER=false -C dpf/dgl ifeq ($(HAVE_OPENGL),true) - $(MAKE) FILE_BROWSER_DISABLED=true -C dpf/dgl opengl3 + $(MAKE) USE_FILE_BROWSER=false -C dpf/dgl opengl3 endif endif diff --git a/dpf/CMakeLists.txt b/dpf/CMakeLists.txt index 5a3bbf9..1cd8d96 100644 --- a/dpf/CMakeLists.txt +++ b/dpf/CMakeLists.txt @@ -1,5 +1,6 @@ # DISTRHO Plugin Framework (DPF) # Copyright (C) 2021 Jean Pierre Cimalando +# Copyright (C) 2022-2024 Filipe Coelho # # SPDX-License-Identifier: ISC @@ -33,10 +34,11 @@ if(DPF_LIBRARIES) if(PKG_CONFIG_FOUND) pkg_check_modules(CAIRO "cairo") if(CAIRO_FOUND AND (NOT HAIKU)) - dpf__add_dgl_cairo(FALSE) + dpf__add_dgl_cairo(TRUE, TRUE) endif() endif() - dpf__add_dgl_opengl(FALSE) + dpf__add_dgl_external(TRUE) + dpf__add_dgl_opengl(TRUE, TRUE) endif() if(DPF_EXAMPLES) @@ -47,9 +49,6 @@ if(DPF_EXAMPLES) add_subdirectory("examples/CairoUI") endif() endif() - if((NOT WIN32) AND (NOT APPLE)) - add_subdirectory("examples/ExternalUI") - endif() add_subdirectory("examples/EmbedExternalUI") add_subdirectory("examples/FileHandling") add_subdirectory("examples/Info") @@ -58,4 +57,5 @@ if(DPF_EXAMPLES) add_subdirectory("examples/MidiThrough") add_subdirectory("examples/Parameters") add_subdirectory("examples/States") + add_subdirectory("examples/WebMeters") endif() diff --git a/dpf/FEATURES.md b/dpf/FEATURES.md index 7106f3b..275d2e7 100644 --- a/dpf/FEATURES.md +++ b/dpf/FEATURES.md @@ -4,29 +4,29 @@ This file describes the available features for each plugin format. The limitations could be due to the plugin format itself or within DPF. If the limitation is within DPF, a link is provided to a description below on the reason for it. -| Feature | JACK/Standalone | LADSPA | DSSI | LV2 | VST2 | VST3 | CLAP | Feature | -|---------------------|---------------------------------------|--------------------|---------------------|-------------------------------|----------------------------|----------------------------|-------------------------------|---------------------| -| Audio port groups | [Yes*](#jack-audio-port-groups) | No | No | Yes | No | Yes | Yes | Audio port groups | -| Audio port as CV | Yes | No | No | Yes | No | [Yes*](#vst3-cv) | [No*](#work-in-progress) | Audio port as CV | -| Audio sidechan | Yes | No | No | Yes | [No*](#vst2-deprecated) | Yes | Yes | Audio sidechan | -| Bypass control | No | No | No | Yes | [No*](#vst2-deprecated) | Yes | Yes | Bypass control | -| MIDI input | Yes | No | Yes | Yes | Yes | Yes | Yes | MIDI input | -| MIDI output | Yes | No | No | Yes | Yes | Yes | Yes | MIDI output | -| Parameter changes | Yes | No | No | [No*](#lv2-parameter-changes) | Yes | Yes | Yes | Parameter changes | -| Parameter groups | No | No | No | Yes | Yes | [No*](#work-in-progress) | Yes | Parameter groups | -| Parameter outputs | No | No | No | Yes | No | Yes | Yes | Parameter outputs | -| Parameter triggers | Yes | No | No | Yes | [No*](#parameter-triggers) | [No*](#parameter-triggers) | [No*](#parameter-triggers) | Parameter triggers | -| Programs | [Yes*](#jack-parameters-and-programs) | [No*](#ladspa-rdf) | [Yes*](#dssi-state) | Yes | [No*](#vst2-programs) | Yes | No | Programs | -| States | Yes | No | [Yes*](#dssi-state) | Yes | Yes | Yes | Yes | States | -| Full/internal state | Yes | No | No | Yes | Yes | Yes | Yes | Full/internal state | -| Time position | Yes | No | No | Yes | Yes | Yes | Yes | Time position | -| UI | [Yes*](#jack-custom-ui-only) | No | External only | Yes | Embed only | Embed only | Yes | UI | -| UI bg/fg colors | No | No | No | Yes | No | No? | No | UI bg/fg colors | -| UI direct access | Yes | No | No | Yes | Yes | Yes | Yes | UI direct access | -| UI host-filebrowser | No | No | No | Yes | [No*](#vst2-deprecated) | [No*](#work-in-progress) | [No*](#work-in-progress) | UI host-filebrowser | -| UI host-resize | Yes | No | Yes | Yes | No | Yes | Yes | UI host-resize | -| UI remote control | No | No | Yes | Yes | No | Yes | No | UI remote control | -| UI send midi note | Yes | No | Yes | Yes | Yes | Yes | Yes | UI send midi note | +| Feature | JACK/Standalone | LADSPA | DSSI | LV2 | VST2 | VST3 | CLAP | AU | Feature | +|---------------------|---------------------------------------|--------------------|---------------------|-------------------------------|----------------------------|----------------------------|----------------------------|----------------------------|---------------------| +| Audio port groups | [Yes*](#jack-audio-port-groups) | No | No | Yes | No | Yes | Yes | [No*](#work-in-progress) | Audio port groups | +| Audio port as CV | Yes | No | No | Yes | No | [Yes*](#vst3-cv) | [No*](#work-in-progress) | No | Audio port as CV | +| Audio sidechan | Yes | No | No | Yes | [No*](#vst2-deprecated) | Yes | Yes | [No*](#work-in-progress) | Audio sidechan | +| Bypass control | No | No | No | Yes | [No*](#vst2-deprecated) | Yes | Yes | Yes | Bypass control | +| MIDI input | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | MIDI input | +| MIDI output | Yes | No | No | Yes | Yes | Yes | Yes | Yes | MIDI output | +| Parameter changes | Yes | No | No | [No*](#lv2-parameter-changes) | Yes | Yes | Yes | Yes | Parameter changes | +| Parameter groups | No | No | No | Yes | Yes | [No*](#work-in-progress) | Yes | [No*](#work-in-progress) | Parameter groups | +| Parameter outputs | No | No | No | Yes | No | Yes | Yes | Yes | Parameter outputs | +| Parameter triggers | Yes | No | No | Yes | [No*](#parameter-triggers) | [No*](#parameter-triggers) | [No*](#parameter-triggers) | [No*](#parameter-triggers) | Parameter triggers | +| Programs | [Yes*](#jack-parameters-and-programs) | [No*](#ladspa-rdf) | [Yes*](#dssi-state) | Yes | [No*](#vst2-programs) | Yes | No | Yes | Programs | +| States | Yes | No | [Yes*](#dssi-state) | Yes | Yes | Yes | Yes | Yes | States | +| Full/internal state | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Full/internal state | +| Time position | Yes | No | No | Yes | Yes | Yes | Yes | Yes | Time position | +| UI | [Yes*](#jack-custom-ui-only) | No | External only | Yes | Embed only | Embed only | Yes | Embed only | UI | +| UI bg/fg colors | No | No | No | Yes | No | No? | No | No | UI bg/fg colors | +| UI direct access | Yes | No | No | Yes | Yes | Yes | Yes | Yes | UI direct access | +| UI host-filebrowser | No | No | No | Yes | [No*](#vst2-deprecated) | [No*](#work-in-progress) | [No*](#work-in-progress) | No | UI host-filebrowser | +| UI host-resize | Yes | No | Yes | Yes | No | Yes | Yes | No | UI host-resize | +| UI remote control | No | No | Yes | Yes | No | Yes | No | Yes | UI remote control | +| UI send midi note | Yes | No | Yes | Yes | Yes | Yes | Yes | Yes | UI send midi note | For things that could be unclear: diff --git a/dpf/LICENSE b/dpf/LICENSE index 7ea562a..652264a 100644 --- a/dpf/LICENSE +++ b/dpf/LICENSE @@ -1,12 +1,13 @@ -Copyright (C) 2012-2022 Filipe Coelho +Copyright (C) 2012-2024 Filipe Coelho -Permission to use, copy, modify, and/or distribute this software for any purpose with -or without fee is hereby granted, provided that the above copyright notice and this -permission notice appear in all copies. +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD -TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN -NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER -IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. diff --git a/dpf/LICENSING.md b/dpf/LICENSING.md index 3759580..7429866 100644 --- a/dpf/LICENSING.md +++ b/dpf/LICENSING.md @@ -7,15 +7,16 @@ This file describes the licensing that applies to each individual plugin format Regardless of target format, DPF itself needs to be mentioned in attribution. See the [LICENSE](LICENSE) file for copyright details. -| Target | License(s) | License restrictions | Additional attribution | -|-----------------|----------------------|-----------------------|------------------------| -| JACK/Standalone | MIT (RtAudio) | Copyright attribution | **RtAudio**: 2001-2019 Gary P. Scavone | -| LADSPA | LGPLv2.1+ | ??? (*) | 2000-2002 Richard W. E. Furse, Paul Barton-Davis, Stefan Westerfeld | -| DSSI | LGPLv2.1+ | ??? (*) | **DSSI**: 2004, 2009 Chris Cannam, Steve Harris and Sean Bolton;
**ALSA**: 1998-2001 Jaroslav Kysela, Abramo Bagnara, Takashi Iwai | -| LV2 | ISC | Copyright attribution | 2006-2020 Steve Harris, David Robillard;
2000-2002 Richard W.E. Furse, Paul Barton-Davis, Stefan Westerfeld | -| VST2 | BSD-3 | Copyright attribution | 2020-2022 Michael Fabian 'Xaymar' Dirks | -| VST3 | ISC | Copyright attribution | (none, only DPF files used) | -| CLAP | MIT | Copyright attribution | 2014-2022 Alexandre Bique | +| Target | License(s) | License restrictions | Additional attribution | +|-----------------|-----------------------|-----------------------|-----------------------------------------| +| JACK/Standalone | MIT (RtAudio, RtMidi) | Copyright attribution | **RtAudio**: 2001-2021 Gary P. Scavone | +| LADSPA | LGPLv2.1+ | ??? (*) | 2000-2002 Richard W. E. Furse, Paul Barton-Davis, Stefan Westerfeld | +| DSSI | LGPLv2.1+ | ??? (*) | **DSSI**: 2004, 2009 Chris Cannam, Steve Harris and Sean Bolton;
**ALSA**: 1998-2001 Jaroslav Kysela, Abramo Bagnara, Takashi Iwai | +| LV2 | ISC | Copyright attribution | 2006-2020 Steve Harris, David Robillard;
2000-2002 Richard W.E. Furse, Paul Barton-Davis, Stefan Westerfeld | +| VST2 | BSD-3 | Copyright attribution | 2020-2022 Michael Fabian 'Xaymar' Dirks | +| VST3 | ISC | Copyright attribution | (none, only DPF files used) | +| CLAP | MIT | Copyright attribution | 2014-2022 Alexandre Bique | +| AU | ISC | Copyright attribution | (none, only DPF files used) | ### LADSPA and DSSI special note diff --git a/dpf/Makefile.base.mk b/dpf/Makefile.base.mk index f808218..99f1c1b 100644 --- a/dpf/Makefile.base.mk +++ b/dpf/Makefile.base.mk @@ -4,15 +4,22 @@ # Created by falkTX # -AR ?= ar -CC ?= gcc -CXX ?= g++ - # Before including this file, a few variables can be set in order to tweak build behaviour: + # DEBUG=true +# Building in debug mode +# Implies SKIP_STRIPPING=true as well + # NOOPT=true +# Do not automatically set optimization flags + # SKIP_STRIPPING=true +# Do not strip output binaries + # NVG_DISABLE_SKIPPING_WHITESPACE=true +# Tweak `nvgTextBreakLines` to allow space characters +# FIXME proper details + # NVG_FONT_TEXTURE_FLAGS=0 # FILE_BROWSER_DISABLED=true # WINDOWS_ICON_ID=0 @@ -21,9 +28,25 @@ CXX ?= g++ # USE_OPENGL3=true # USE_NANOVG_FBO=true # USE_NANOVG_FREETYPE=true +# USE_FILE_BROWSER=true +# USE_WEB_VIEW=true + # STATIC_BUILD=true +# Tweak build to be able to generate fully static builds (e.g. skip use of libdl) +# Experimental, use only if you know what you are doing + # FORCE_NATIVE_AUDIO_FALLBACK=true +# Do not use JACK for the standalone, only native audio + # SKIP_NATIVE_AUDIO_FALLBACK=true +# Do not use native audio for the standalone, only use JACK + +# --------------------------------------------------------------------------------------------------------------------- +# Read target compiler from environment + +AR ?= ar +CC ?= gcc +CXX ?= g++ # --------------------------------------------------------------------------------------------------------------------- # Protect against multiple inclusion @@ -212,6 +235,27 @@ ifeq ($(MACOS),true) UNIX = true endif +# --------------------------------------------------------------------------------------------------------------------- +# Compatibility checks + +ifeq ($(FILE_BROWSER_DISABLED),true) +$(error FILE_BROWSER_DISABLED has been replaced by USE_FILE_BROWSER (opt-in vs opt-out)) +endif + +ifeq ($(USE_FILEBROWSER),true) +$(error typo detected use USE_FILE_BROWSER instead of USE_FILEBROWSER) +endif + +ifeq ($(USE_WEBVIEW),true) +$(error typo detected use USE_WEB_VIEW instead of USE_WEBVIEW) +endif + +# --------------------------------------------------------------------------------------------------------------------- +# Set optional flags + +USE_FILE_BROWSER ?= true +USE_WEB_VIEW ?= false + # --------------------------------------------------------------------------------------------------------------------- # Set build and link flags @@ -250,7 +294,9 @@ BASE_OPTS += -mtune=generic -msse -msse2 -mfpmath=sse endif ifeq ($(MACOS),true) +ifneq ($(MACOS_NO_DEAD_STRIP),true) LINK_OPTS += -Wl,-dead_strip,-dead_strip_dylibs +endif else ifeq ($(WASM),true) LINK_OPTS += -O3 LINK_OPTS += -Wl,--gc-sections @@ -416,6 +462,9 @@ else ifeq ($(MACOS),true) DGL_SYSTEM_LIBS += -framework Cocoa DGL_SYSTEM_LIBS += -framework CoreVideo +ifeq ($(USE_WEB_VIEW),true) +DGL_SYSTEM_LIBS += -framework WebKit +endif else ifeq ($(WASM),true) @@ -430,13 +479,19 @@ DGL_SYSTEM_LIBS += -lcomdlg32 DGL_SYSTEM_LIBS += -ldwmapi DGL_SYSTEM_LIBS += -lgdi32 # DGL_SYSTEM_LIBS += -lole32 +ifeq ($(USE_WEB_VIEW),true) +DGL_SYSTEM_LIBS += -lole32 +DGL_SYSTEM_LIBS += -luuid +endif else +ifneq ($(FILE_BROWSER_DISABLED),true) ifeq ($(HAVE_DBUS),true) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags dbus-1) -DHAVE_DBUS DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs dbus-1) endif +endif ifeq ($(HAVE_X11),true) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags x11) -DHAVE_X11 @@ -453,6 +508,10 @@ ifeq ($(HAVE_XRANDR),true) DGL_FLAGS += $(shell $(PKG_CONFIG) --cflags xrandr) -DHAVE_XRANDR DGL_SYSTEM_LIBS += $(shell $(PKG_CONFIG) --libs xrandr) endif +ifeq ($(USE_WEB_VIEW),true) +DGL_FLAGS += -pthread +DGL_SYSTEM_LIBS += -pthread -lrt +endif endif # HAVE_X11 endif @@ -563,11 +622,11 @@ SHARED_MEMORY_LIBS = -lrt endif # --------------------------------------------------------------------------------------------------------------------- -# Backwards-compatible HAVE_DGL +# Generic HAVE_DGL ifeq ($(HAIKU_OR_MACOS_OR_WASM_OR_WINDOWS),true) HAVE_DGL = true -else ifeq ($(HAVE_OPENGL),true) +else HAVE_DGL = $(HAVE_X11) endif @@ -593,10 +652,6 @@ ifneq ($(NVG_FONT_TEXTURE_FLAGS),) BUILD_CXX_FLAGS += -DNVG_FONT_TEXTURE_FLAGS=$(NVG_FONT_TEXTURE_FLAGS) endif -ifeq ($(FILE_BROWSER_DISABLED),true) -BUILD_CXX_FLAGS += -DDGL_FILE_BROWSER_DISABLED -endif - ifneq ($(WINDOWS_ICON_ID),) BUILD_CXX_FLAGS += -DDGL_WINDOWS_ICON_ID=$(WINDOWS_ICON_ID) endif @@ -633,6 +688,14 @@ ifeq ($(USE_RGBA),true) BUILD_CXX_FLAGS += -DDGL_USE_RGBA endif +ifeq ($(USE_FILE_BROWSER),true) +BUILD_CXX_FLAGS += -DDGL_USE_FILE_BROWSER +endif + +ifeq ($(USE_WEB_VIEW),true) +BUILD_CXX_FLAGS += -DDGL_USE_WEB_VIEW +endif + # --------------------------------------------------------------------------------------------------------------------- # Set app extension @@ -688,7 +751,9 @@ endif # Set VST3 binary directory, see https://vst3sdk-doc.diatonic.jp/doc/vstinterfaces/vst3loc.html ifeq ($(LINUX),true) -VST3_BINARY_DIR = Contents/$(TARGET_PROCESSOR)-linux +# This must match `uname -m`, which differs from `gcc -dumpmachine` on PowerPC. +VST3_ARCHITECTURE := $(patsubst powerpc%,ppc%,$(TARGET_PROCESSOR)) +VST3_BINARY_DIR = Contents/$(VST3_ARCHITECTURE)-linux else ifeq ($(MACOS),true) VST3_BINARY_DIR = Contents/MacOS else ifeq ($(WASM),true) @@ -796,30 +861,99 @@ MOD_ENVIRONMENT = \ modduo: $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduo-static,arm-mod-linux-gnueabihf.static,arm) +modduo-new: + $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduo-new,arm-modaudio-linux-gnueabihf,arm) + modduox: $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduox-static,aarch64-mod-linux-gnueabi.static,aarch64) +modduox-new: + $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduox-new,aarch64-modaudio-linux-gnueabi,aarch64) + moddwarf: $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/moddwarf,aarch64-mod-linux-gnu,aarch64) +moddwarf-new: + $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/moddwarf-new,aarch64-modaudio-linux-gnu,aarch64) + modpush: - tar -C bin -cz $(subst bin/,,$(wildcard bin/*.lv2)) | base64 | curl -F 'package=@-' http://192.168.51.1/sdk/install && echo + tar -C bin -chz $(subst bin/,,$(wildcard bin/*.lv2)) | base64 | curl -F 'package=@-' http://192.168.51.1/sdk/install && echo -ifneq (,$(findstring modduo-,$(MAKECMDGOALS))) +ifneq (,$(findstring modduo-new-,$(MAKECMDGOALS))) +$(MAKECMDGOALS): + $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduo-new,arm-modaudio-linux-gnueabihf,arm) $(subst modduo-new-,,$(MAKECMDGOALS)) +else ifneq (,$(findstring modduo-,$(filter-out modduo-new,$(MAKECMDGOALS)))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduo-static,arm-mod-linux-gnueabihf.static,arm) $(subst modduo-,,$(MAKECMDGOALS)) endif -ifneq (,$(findstring modduox-,$(MAKECMDGOALS))) +ifneq (,$(findstring modduox-new-,$(MAKECMDGOALS))) +$(MAKECMDGOALS): + $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduox-new,aarch64-modaudio-linux-gnueabi,aarch64) $(subst modduox-new-,,$(MAKECMDGOALS)) +else ifneq (,$(findstring modduox-,$(filter-out modduox-new,$(MAKECMDGOALS)))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/modduox-static,aarch64-mod-linux-gnueabi.static,aarch64) $(subst modduox-,,$(MAKECMDGOALS)) endif -ifneq (,$(findstring moddwarf-,$(MAKECMDGOALS))) +ifneq (,$(findstring moddwarf-new-,$(MAKECMDGOALS))) +$(MAKECMDGOALS): + $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/moddwarf-new,aarch64-modaudio-linux-gnu,aarch64) $(subst moddwarf-new-,,$(MAKECMDGOALS)) +else ifneq (,$(findstring moddwarf-,$(filter-out moddwarf-new,$(MAKECMDGOALS)))) $(MAKECMDGOALS): $(MAKE) $(call MOD_ENVIRONMENT,$(MOD_WORKDIR)/moddwarf,aarch64-mod-linux-gnu,aarch64) $(subst moddwarf-,,$(MAKECMDGOALS)) endif +# --------------------------------------------------------------------------------------------------------------------- +# Convenience rules for common builds + +macos-intel-10.8: + $(MAKE) \ + CFLAGS="$(CFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.8" \ + CXXFLAGS="$(CXXFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.8 -stdlib=libc++" \ + LDFLAGS="$(LDFLAGS) -stdlib=libc++" \ + PKG_CONFIG=/usr/bin/false \ + PKG_CONFIG_PATH=/NOT + +macos-universal-10.8: + $(MAKE) \ + CFLAGS="$(CFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.15" \ + CXXFLAGS="$(CXXFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_8 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_8 -mmacosx-version-min=10.15 -stdlib=libc++" \ + LDFLAGS="$(LDFLAGS) -stdlib=libc++" \ + PKG_CONFIG=/usr/bin/false \ + PKG_CONFIG_PATH=/NOT + +macos-intel-10.15: + $(MAKE) \ + CFLAGS="$(CFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ + CXXFLAGS="$(CXXFLAGS) -arch x86_64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ + PKG_CONFIG=/usr/bin/false \ + PKG_CONFIG_PATH=/NOT + +macos-universal-10.15: + $(MAKE) \ + CFLAGS="$(CFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ + CXXFLAGS="$(CXXFLAGS) -arch x86_64 -arch arm64 -DMAC_OS_X_VERSION_MAX_ALLOWED=MAC_OS_X_VERSION_10_15 -DMAC_OS_X_VERSION_MIN_REQUIRED=MAC_OS_X_VERSION_10_15 -mmacosx-version-min=10.15" \ + PKG_CONFIG=/usr/bin/false \ + PKG_CONFIG_PATH=/NOT + +mingw32: + $(MAKE) \ + AR=i686-w64-mingw32-ar \ + CC=i686-w64-mingw32-gcc \ + CXX=i686-w64-mingw32-g++ \ + EXE_WRAPPER=wine \ + PKG_CONFIG=/usr/bin/false \ + PKG_CONFIG_PATH=/NOT + +mingw64: + $(MAKE) \ + AR=x86_64-w64-mingw32-ar \ + CC=x86_64-w64-mingw32-gcc \ + CXX=x86_64-w64-mingw32-g++ \ + EXE_WRAPPER=wine \ + PKG_CONFIG=/usr/bin/false \ + PKG_CONFIG_PATH=/NOT + # --------------------------------------------------------------------------------------------------------------------- # Protect against multiple inclusion diff --git a/dpf/Makefile.plugins.mk b/dpf/Makefile.plugins.mk index 844f306..7280f78 100644 --- a/dpf/Makefile.plugins.mk +++ b/dpf/Makefile.plugins.mk @@ -1,27 +1,75 @@ #!/usr/bin/make -f -# Makefile for DPF Example Plugins # -# -------------------------------- # +# Makefile for DPF # +# ---------------- # # Created by falkTX # # NOTE: NAME, FILES_DSP and FILES_UI must have been defined before including this file! +# extra useful variables to define before including this file: +# - DPF_BUILD_DIR: where to place temporary build files +# - DPF_TARGET_DIR: where to place final binary files +# - UI_TYPE: one of cairo, opengl, opengl3 or external, with opengl being default +# ("generic" is also allowed if only using image widgets) + +# override the "all" target after including this file to define which plugin formats to build, like so: +# all: au clap jack lv2_sep vst2 vst3 + +# NOTE the "lv2" target refers to a monolithic build (dsp and ui combined), +# while "lv2_sep" target has dsp and ui in separate binaries. +# use of this target must match the definition of `DISTRHO_PLUGIN_WANT_DIRECT_ACCESS` + +# --------------------------------------------------------------------------------------------------------------------- +# Try to figure out where DPF is located + ifeq ($(DPF_PATH),) -ifneq (,$(wildcard dpf/Makefile.base.mk)) -BASE_PATH=. -DPF_PATH=dpf -else ifneq (,$(wildcard ../dpf/Makefile.base.mk)) -BASE_PATH=.. -DPF_PATH=../dpf -else ifneq (,$(wildcard ../../dpf/Makefile.base.mk)) -BASE_PATH=../.. -DPF_PATH=../../dpf + +# find path to this makefile +DPF_PLUGINS_MAKEFILE = $(lastword $(filter %Makefile.plugins.mk,$(MAKEFILE_LIST))) + +# error out if wrongly named or referencing it without any path +ifeq (,$(findstring /Makefile.plugins.mk,$(DPF_PLUGINS_MAKEFILE))) +$(error wrong inclusion of Makefile.plugins.mk, must be either absolute or relative path) +endif + +# find path to DPF +DPF_PATH = $(patsubst %/Makefile.plugins.mk,%,$(DPF_PLUGINS_MAKEFILE)) + +# best guess for where to place binary files +ifeq ($(DPF_PATH),..) +BASE_PATH = $(DPF_PATH) +else ifeq ($(DPF_PATH),../..) +BASE_PATH = $(DPF_PATH) +else ifeq ($(DPF_PATH),../../..) +BASE_PATH = $(DPF_PATH) else -BASE_PATH=../.. -DPF_PATH=../.. +BASE_PATH = $(patsubst %/,%,$(dir $(DPF_PATH))) endif + endif +# --------------------------------------------------------------------------------------------------------------------- +# Check for proper UI_TYPE parameter + +ifeq ($(UI_TYPE),) +else ifeq ($(UI_TYPE),cairo) +else ifeq ($(UI_TYPE),external) +else ifeq ($(UI_TYPE),generic) +else ifeq ($(UI_TYPE),opengl) +else ifeq ($(UI_TYPE),opengl3) +USE_OPENGL3 = true +else ifeq ($(UI_TYPE),vulkan) +else ifeq ($(UI_TYPE),webview) +USE_CLAP_BUNDLE = true +USE_VST2_BUNDLE = true +USE_WEB_VIEW = true +else +$(error unknown UI_TYPE $(UI_TYPE)) +endif + +# --------------------------------------------------------------------------------------------------------------------- +# Include DPF base setup + include $(DPF_PATH)/Makefile.base.mk # --------------------------------------------------------------------------------------------------------------------- @@ -140,6 +188,8 @@ OBJS_UI = $(FILES_UI:%=$(BUILD_DIR)/%.o) ifeq ($(MACOS),true) OBJS_UI += $(BUILD_DIR)/DistrhoUI_macOS_$(NAME).mm.o +else ifeq ($(WINDOWS)$(USE_WEB_VIEW),truetrue) +OBJS_UI += $(BUILD_DIR)/DistrhoUI_win32.cpp.o endif # --------------------------------------------------------------------------------------------------------------------- @@ -159,6 +209,9 @@ ifeq ($(HAVE_OPENGL),true) UI_TYPE = opengl else ifeq ($(HAVE_CAIRO),true) UI_TYPE = cairo +else +HAVE_DGL = false +UI_TYPE = none endif endif @@ -211,12 +264,22 @@ endif endif ifeq ($(UI_TYPE),external) -DGL_FLAGS += -DDGL_EXTERNAL +DGL_FLAGS += -DDGL_EXTERNAL -DHAVE_DGL +ifeq ($(HAVE_STUB),true) +DGL_FLAGS += $(STUB_FLAGS) +DGL_LIBS += $(STUB_LIBS) +DGL_LIB = $(DGL_BUILD_DIR)/libdgl-stub.a HAVE_DGL = true +else +HAVE_DGL = false +endif endif -ifeq ($(UI_TYPE),stub) +ifeq ($(UI_TYPE),webview) +DGL_FLAGS += -DDGL_EXTERNAL -DHAVE_DGL ifeq ($(HAVE_STUB),true) +DGL_FLAGS += $(STUB_FLAGS) +DGL_LIBS += $(STUB_LIBS) DGL_LIB = $(DGL_BUILD_DIR)/libdgl-stub.a HAVE_DGL = true else @@ -224,6 +287,10 @@ HAVE_DGL = false endif endif +ifeq ($(HAVE_DGL)$(LINUX)$(USE_WEB_VIEW),truetruetrue) +DGL_LIB_SHARED = $(shell $(CC) -print-file-name=Scrt1.o) +endif + DGL_LIBS += $(DGL_SYSTEM_LIBS) -lm # TODO split dsp and ui object build flags @@ -296,6 +363,8 @@ static = $(TARGET_DIR)/$(NAME).a ifeq ($(MACOS),true) BUNDLE_RESOURCES = Info.plist PkgInfo Resources/empty.lproj +au = $(TARGET_DIR)/$(NAME).component/Contents/MacOS/$(NAME) +aufiles += $(BUNDLE_RESOURCES:%=$(TARGET_DIR)/$(NAME).component/Contents/%) vst2files += $(BUNDLE_RESOURCES:%=$(TARGET_DIR)/$(NAME).vst/Contents/%) vst3files += $(BUNDLE_RESOURCES:%=$(TARGET_DIR)/$(NAME).vst3/Contents/%) clapfiles += $(BUNDLE_RESOURCES:%=$(TARGET_DIR)/$(NAME).clap/Contents/%) @@ -316,6 +385,7 @@ endif # Set plugin symbols to export ifeq ($(MACOS),true) +SYMBOLS_AU = -Wl,-exported_symbols_list,$(DPF_PATH)/utils/symbols/au.exp SYMBOLS_LADSPA = -Wl,-exported_symbols_list,$(DPF_PATH)/utils/symbols/ladspa.exp SYMBOLS_DSSI = -Wl,-exported_symbols_list,$(DPF_PATH)/utils/symbols/dssi.exp SYMBOLS_LV2DSP = -Wl,-exported_symbols_list,$(DPF_PATH)/utils/symbols/lv2-dsp.exp @@ -410,10 +480,11 @@ ifeq ($(DPF_BUILD_DIR),) endif rm -rf $(TARGET_DIR)/$(NAME) rm -rf $(TARGET_DIR)/$(NAME)-* + rm -rf $(TARGET_DIR)/$(NAME).clap + rm -rf $(TARGET_DIR)/$(NAME).component rm -rf $(TARGET_DIR)/$(NAME).lv2 rm -rf $(TARGET_DIR)/$(NAME).vst rm -rf $(TARGET_DIR)/$(NAME).vst3 - rm -rf $(TARGET_DIR)/$(NAME).clap # --------------------------------------------------------------------------------------------------------------------- # DGL @@ -458,15 +529,18 @@ $(BUILD_DIR)/DistrhoUI_macOS_%.mm.o: $(DPF_PATH)/distrho/DistrhoUI_macOS.mm $(EX @echo "Compiling DistrhoUI_macOS.mm ($*)" $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -ObjC++ -c -o $@ -$(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o: $(DPF_PATH)/distrho/DistrhoPluginMain.cpp $(EXTRA_DEPENDENCIES) $(EXTRA_DSP_DEPENDENCIES) +$(BUILD_DIR)/DistrhoUI_win32.cpp.o: $(DPF_PATH)/distrho/DistrhoUI_win32.cpp $(EXTRA_DEPENDENCIES) $(EXTRA_UI_DEPENDENCIES) -@mkdir -p $(BUILD_DIR) - @echo "Compiling DistrhoPluginMain.cpp (JACK)" - $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_JACK $(JACK_FLAGS) -c -o $@ + @echo "Compiling DistrhoUI_win32.cpp ($*)" + $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -std=gnu++17 -c -o $@ -$(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o: $(DPF_PATH)/distrho/DistrhoUIMain.cpp $(EXTRA_DEPENDENCIES) $(EXTRA_UI_DEPENDENCIES) - -@mkdir -p $(BUILD_DIR) - @echo "Compiling DistrhoUIMain.cpp (DSSI)" - $(SILENT)$(CXX) $< $(BUILD_CXX_FLAGS) -DDISTRHO_PLUGIN_TARGET_DSSI $(LIBLO_FLAGS) -c -o $@ +$(BUILD_DIR)/DistrhoPluginMain_JACK.cpp.o: BUILD_CXX_FLAGS += $(JACK_FLAGS) + +$(BUILD_DIR)/DistrhoPluginMain_AU.cpp.o: BUILD_CXX_FLAGS += -ObjC++ + +$(BUILD_DIR)/DistrhoUIMain_AU.cpp.o: BUILD_CXX_FLAGS += -ObjC++ + +$(BUILD_DIR)/DistrhoUIMain_DSSI.cpp.o: BUILD_CXX_FLAGS += $(LIBLO_FLAGS) # --------------------------------------------------------------------------------------------------------------------- # JACK @@ -517,9 +591,9 @@ lv2_dsp: $(lv2_dsp) lv2_sep: $(lv2_dsp) $(lv2_ui) ifeq ($(HAVE_DGL),true) -$(lv2): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) +$(lv2): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) $(DGL_LIB_SHARED) else -$(lv2): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o +$(lv2): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o endif -@mkdir -p $(shell dirname $@) @echo "Creating LV2 plugin for $(NAME)" @@ -530,7 +604,7 @@ $(lv2_dsp): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_LV2.cpp.o @echo "Creating LV2 plugin library for $(NAME)" $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(EXTRA_LIBS) $(EXTRA_DSP_LIBS) $(SHARED) $(SYMBOLS_LV2DSP) -o $@ -$(lv2_ui): $(OBJS_UI) $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) +$(lv2_ui): $(OBJS_UI) $(BUILD_DIR)/DistrhoUIMain_LV2.cpp.o $(DGL_LIB) $(DGL_LIB_SHARED) -@mkdir -p $(shell dirname $@) @echo "Creating LV2 plugin UI for $(NAME)" $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(EXTRA_LIBS) $(EXTRA_UI_LIBS) $(DGL_LIBS) $(SHARED) $(SYMBOLS_LV2UI) -o $@ @@ -635,7 +709,7 @@ modgui: vst2 vst: $(vst2) $(vst2files) ifeq ($(HAVE_DGL),true) -$(vst2): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_VST2.cpp.o $(BUILD_DIR)/DistrhoUIMain_VST2.cpp.o $(DGL_LIB) +$(vst2): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_VST2.cpp.o $(BUILD_DIR)/DistrhoUIMain_VST2.cpp.o $(DGL_LIB) $(DGL_LIB_SHARED) else $(vst2): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_VST2.cpp.o endif @@ -649,7 +723,7 @@ endif vst3: $(vst3) $(vst3files) ifeq ($(HAVE_DGL),true) -$(vst3): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_VST3.cpp.o $(BUILD_DIR)/DistrhoUIMain_VST3.cpp.o $(DGL_LIB) +$(vst3): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_VST3.cpp.o $(BUILD_DIR)/DistrhoUIMain_VST3.cpp.o $(DGL_LIB) $(DGL_LIB_SHARED) else $(vst3): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_VST3.cpp.o endif @@ -671,7 +745,7 @@ endif clap: $(clap) $(clapfiles) ifeq ($(HAVE_DGL),true) -$(clap): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_CLAP.cpp.o $(BUILD_DIR)/DistrhoUIMain_CLAP.cpp.o $(DGL_LIB) +$(clap): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_CLAP.cpp.o $(BUILD_DIR)/DistrhoUIMain_CLAP.cpp.o $(DGL_LIB) $(DGL_LIB_SHARED) else $(clap): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_CLAP.cpp.o endif @@ -679,13 +753,39 @@ endif @echo "Creating CLAP plugin for $(NAME)" $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(EXTRA_LIBS) $(EXTRA_DSP_LIBS) $(EXTRA_UI_LIBS) $(DGL_LIBS) $(CLAP_LIBS) $(SHARED) $(SYMBOLS_CLAP) -o $@ +# --------------------------------------------------------------------------------------------------------------------- +# AU + +au: $(au) $(aufiles) + +ifeq ($(HAVE_DGL),true) +$(au): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_AU.cpp.o $(BUILD_DIR)/DistrhoUIMain_AU.cpp.o $(DGL_LIB) +else +$(au): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_AU.cpp.o +endif + -@mkdir -p $(shell dirname $@) + @echo "Creating AU component for $(NAME)" + $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(EXTRA_LIBS) $(EXTRA_DSP_LIBS) $(EXTRA_UI_LIBS) $(DGL_LIBS) -framework AudioToolbox -framework AudioUnit -framework CoreFoundation $(SHARED) $(SYMBOLS_AU) -o $@ + +# --------------------------------------------------------------------------------------------------------------------- +# Export + +ifeq ($(HAVE_DGL),true) +$(BUILD_DIR)/export$(APP_EXT): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_EXPORT.cpp.o $(BUILD_DIR)/DistrhoUIMain_EXPORT.cpp.o $(DGL_LIB) +else +$(BUILD_DIR)/export$(APP_EXT): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_EXPORT.cpp.o +endif + -@mkdir -p $(shell dirname $@) + @echo "Creating export tool for $(NAME)" + $(SILENT)$(CXX) $^ $(BUILD_CXX_FLAGS) $(LINK_FLAGS) $(EXTRA_LIBS) $(EXTRA_DSP_LIBS) $(EXTRA_UI_LIBS) $(DGL_LIBS) -o $@ + # --------------------------------------------------------------------------------------------------------------------- # Shared shared: $(shared) ifeq ($(HAVE_DGL),true) -$(shared): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_SHARED.cpp.o $(BUILD_DIR)/DistrhoUIMain_SHARED.cpp.o $(DGL_LIB) +$(shared): $(OBJS_DSP) $(OBJS_UI) $(BUILD_DIR)/DistrhoPluginMain_SHARED.cpp.o $(BUILD_DIR)/DistrhoUIMain_SHARED.cpp.o $(DGL_LIB) $(DGL_LIB_SHARED) else $(shared): $(OBJS_DSP) $(BUILD_DIR)/DistrhoPluginMain_SHARED.cpp.o endif @@ -727,6 +827,13 @@ $(TARGET_DIR)/%/Resources/empty.lproj: $(DPF_PATH)/utils/plugin.bundle/Contents/ -@mkdir -p $(shell dirname $@) $(SILENT)cp $< $@ +# --------------------------------------------------------------------------------------------------------------------- +# format-specific files + +$(TARGET_DIR)/$(NAME).component/Contents/Info.plist: $(BUILD_DIR)/export$(APP_EXT) + -@mkdir -p $(shell dirname $@) + cd $(TARGET_DIR)/$(NAME).component/Contents && $(abspath $<) "$(NAME)" + # --------------------------------------------------------------------------------------------------------------------- -include $(OBJS_DSP:%.o=%.d) @@ -741,6 +848,8 @@ endif -include $(BUILD_DIR)/DistrhoPluginMain_VST2.cpp.d -include $(BUILD_DIR)/DistrhoPluginMain_VST3.cpp.d -include $(BUILD_DIR)/DistrhoPluginMain_CLAP.cpp.d +-include $(BUILD_DIR)/DistrhoPluginMain_AU.cpp.d +-include $(BUILD_DIR)/DistrhoPluginMain_Export.cpp.d -include $(BUILD_DIR)/DistrhoPluginMain_SHARED.cpp.d -include $(BUILD_DIR)/DistrhoPluginMain_STATIC.cpp.d @@ -750,6 +859,7 @@ endif -include $(BUILD_DIR)/DistrhoUIMain_VST2.cpp.d -include $(BUILD_DIR)/DistrhoUIMain_VST3.cpp.d -include $(BUILD_DIR)/DistrhoUIMain_CLAP.cpp.d +-include $(BUILD_DIR)/DistrhoUIMain_AU.cpp.d -include $(BUILD_DIR)/DistrhoUIMain_SHARED.cpp.d -include $(BUILD_DIR)/DistrhoUIMain_STATIC.cpp.d diff --git a/dpf/cmake/DPF-plugin.cmake b/dpf/cmake/DPF-plugin.cmake index 35be66f..38976d3 100644 --- a/dpf/cmake/DPF-plugin.cmake +++ b/dpf/cmake/DPF-plugin.cmake @@ -1,6 +1,6 @@ # DISTRHO Plugin Framework (DPF) # Copyright (C) 2021 Jean Pierre Cimalando -# Copyright (C) 2022 Filipe Coelho +# Copyright (C) 2022-2024 Filipe Coelho # # SPDX-License-Identifier: ISC @@ -75,7 +75,13 @@ include(CMakeParseArguments) # `jack`, `ladspa`, `dssi`, `lv2`, `vst2`, `vst3`, `clap` # # `UI_TYPE` -# the user interface type: `opengl` (default), `cairo`, `external` +# the user interface type, can be one of the following: +# - cairo +# - external +# - opengl (default) +# - opengl3 +# - vulkan +# - webview # # `FILES_COMMON` ... # list of sources which are part of both DSP and UI @@ -96,8 +102,14 @@ include(CMakeParseArguments) # `NO_SHARED_RESOURCES` # do not build DPF shared resources (fonts, etc) # +# `USE_FILE_BROWSER` +# enable file browser dialog APIs +# +# `USE_WEB_VIEW` +# enable web browser view APIs +# function(dpf_add_plugin NAME) - set(options MONOLITHIC NO_SHARED_RESOURCES) + set(options MONOLITHIC NO_SHARED_RESOURCES USE_FILE_BROWSER USE_WEB_VIEW) set(oneValueArgs MODGUI_CLASS_NAME UI_TYPE) set(multiValueArgs FILES_COMMON FILES_DSP FILES_UI TARGETS) cmake_parse_arguments(_dpf_plugin "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -107,23 +119,35 @@ function(dpf_add_plugin NAME) endif() set(_dgl_library) - set(_dgl_external OFF) if(_dpf_plugin_FILES_UI) if(_dpf_plugin_UI_TYPE STREQUAL "cairo") - dpf__add_dgl_cairo("${_dpf_plugin_NO_SHARED_RESOURCES}") + dpf__add_dgl_cairo($> $) set(_dgl_library dgl-cairo) + elseif(_dpf_plugin_UI_TYPE STREQUAL "external") + dpf__add_dgl_external($) + set(_dgl_library dgl-external) elseif(_dpf_plugin_UI_TYPE STREQUAL "opengl") - dpf__add_dgl_opengl("${_dpf_plugin_NO_SHARED_RESOURCES}") + dpf__add_dgl_opengl($> $) set(_dgl_library dgl-opengl) - elseif(_dpf_plugin_UI_TYPE STREQUAL "external") - set(_dgl_external ON) + elseif(_dpf_plugin_UI_TYPE STREQUAL "opengl3") + dpf__add_dgl_opengl3($> $) + set(_dgl_library dgl-opengl3) + elseif(_dpf_plugin_UI_TYPE STREQUAL "vulkan") + dpf__add_dgl_vulkan($> $) + set(_dgl_library dgl-vulkan) + elseif(_dpf_plugin_UI_TYPE STREQUAL "webview") + set(_dpf_plugin_USE_WEB_VIEW TRUE) + dpf__add_dgl_external($) + set(_dgl_library dgl-external) else() message(FATAL_ERROR "Unrecognized UI type for plugin: ${_dpf_plugin_UI_TYPE}") endif() + else() + set(_dpf_plugin_UI_TYPE "") endif() set(_dgl_has_ui OFF) - if(_dgl_library OR _dgl_external) + if(_dgl_library) set(_dgl_has_ui ON) endif() @@ -137,6 +161,14 @@ function(dpf_add_plugin NAME) target_include_directories("${NAME}" PUBLIC "${DPF_ROOT_DIR}/distrho") + if(_dpf_plugin_USE_FILE_BROWSER) + target_compile_definitions("${NAME}" PUBLIC "DGL_USE_FILE_BROWSER") + endif() + + if(_dpf_plugin_USE_WEB_VIEW) + target_compile_definitions("${NAME}" PUBLIC "DGL_USE_WEB_VIEW") + endif() + if(_dpf_plugin_MODGUI_CLASS_NAME) target_compile_definitions("${NAME}" PUBLIC "DISTRHO_PLUGIN_MODGUI_CLASS_NAME=\"${_dpf_plugin_MODGUI_CLASS_NAME}\"") endif() @@ -145,7 +177,7 @@ function(dpf_add_plugin NAME) target_link_libraries("${NAME}" PRIVATE "dl") endif() - if(_dgl_library AND NOT _dgl_external) + if(_dgl_library) # make sure that all code will see DGL_* definitions target_link_libraries("${NAME}" PUBLIC "${_dgl_library}-definitions" @@ -156,22 +188,20 @@ function(dpf_add_plugin NAME) dpf__add_static_library("${NAME}-dsp" ${_dpf_plugin_FILES_DSP}) target_link_libraries("${NAME}-dsp" PUBLIC "${NAME}") - if(_dgl_library AND NOT _dgl_external) + if(_dgl_library) dpf__add_static_library("${NAME}-ui" ${_dpf_plugin_FILES_UI}) target_link_libraries("${NAME}-ui" PUBLIC "${NAME}" ${_dgl_library}) if((NOT WIN32) AND (NOT APPLE) AND (NOT HAIKU)) target_link_libraries("${NAME}-ui" PRIVATE "dl") + if(LINUX AND _dpf_plugin_USE_WEB_VIEW) + execute_process(COMMAND ${CMAKE_C_COMPILER} -print-file-name=Scrt1.o + OUTPUT_STRIP_TRAILING_WHITESPACE + OUTPUT_VARIABLE _dpf_plugin_shared_crt) + target_link_libraries("${NAME}-ui" PRIVATE "rt") + endif() endif() - # add the files containing Objective-C classes - dpf__add_plugin_specific_ui_sources("${NAME}-ui") - elseif(_dgl_external) - dpf__add_static_library("${NAME}-ui" ${_dpf_plugin_FILES_UI}) - target_link_libraries("${NAME}-ui" PUBLIC "${NAME}") - if((NOT WIN32) AND (NOT APPLE) AND (NOT HAIKU)) - target_link_libraries("${NAME}-ui" PRIVATE "dl") - endif() - # add the files containing Objective-C classes - dpf__add_plugin_specific_ui_sources("${NAME}-ui") + # add the files containing C++17 or Objective-C classes + dpf__add_plugin_specific_ui_sources("${NAME}-ui" "${_dpf_plugin_USE_WEB_VIEW}") else() add_library("${NAME}-ui" INTERFACE) endif() @@ -185,13 +215,17 @@ function(dpf_add_plugin NAME) elseif(_target STREQUAL "dssi") dpf__build_dssi("${NAME}" "${_dgl_has_ui}") elseif(_target STREQUAL "lv2") - dpf__build_lv2("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_MONOLITHIC}") + dpf__build_lv2("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_MONOLITHIC}" "${_dpf_plugin_shared_crt}") elseif(_target STREQUAL "vst2") - dpf__build_vst2("${NAME}" "${_dgl_has_ui}") + dpf__build_vst2("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_shared_crt}") elseif(_target STREQUAL "vst3") - dpf__build_vst3("${NAME}" "${_dgl_has_ui}") + dpf__build_vst3("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_shared_crt}") elseif(_target STREQUAL "clap") - dpf__build_clap("${NAME}" "${_dgl_has_ui}") + dpf__build_clap("${NAME}" "${_dgl_has_ui}" "${_dpf_plugin_shared_crt}") + elseif(_target STREQUAL "au") + if (APPLE) + dpf__build_au("${NAME}" "${_dgl_has_ui}") + endif() elseif(_target STREQUAL "static") dpf__build_static("${NAME}" "${_dgl_has_ui}") else() @@ -341,7 +375,7 @@ endfunction() # # Add build rules for an LV2 plugin. # -function(dpf__build_lv2 NAME HAS_UI MONOLITHIC) +function(dpf__build_lv2 NAME HAS_UI MONOLITHIC EXTRA_UI_LINK_OPTS) dpf__create_dummy_source_list(_no_srcs) dpf__add_module("${NAME}-lv2" ${_no_srcs}) @@ -362,12 +396,14 @@ function(dpf__build_lv2 NAME HAS_UI MONOLITHIC) if(MONOLITHIC) dpf__add_ui_main("${NAME}-lv2" "lv2" "${HAS_UI}") target_link_libraries("${NAME}-lv2" PRIVATE "${NAME}-ui") + target_link_options("${NAME}-lv2" PRIVATE "${EXTRA_UI_LINK_OPTS}") set_target_properties("${NAME}-lv2" PROPERTIES OUTPUT_NAME "${NAME}") else() dpf__add_module("${NAME}-lv2-ui" ${_no_srcs}) dpf__add_ui_main("${NAME}-lv2-ui" "lv2" "${HAS_UI}") dpf__set_module_export_list("${NAME}-lv2-ui" "lv2-ui") + target_link_options("${NAME}-lv2-ui" PRIVATE "${EXTRA_UI_LINK_OPTS}") target_link_libraries("${NAME}-lv2-ui" PRIVATE "${NAME}-ui") set_target_properties("${NAME}-lv2-ui" PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.lv2/$<0:>" @@ -396,7 +432,7 @@ endfunction() # # Add build rules for a VST2 plugin. # -function(dpf__build_vst2 NAME HAS_UI) +function(dpf__build_vst2 NAME HAS_UI EXTRA_UI_LINK_OPTS) dpf__create_dummy_source_list(_no_srcs) dpf__add_module("${NAME}-vst2" ${_no_srcs}) @@ -404,6 +440,7 @@ function(dpf__build_vst2 NAME HAS_UI) dpf__add_ui_main("${NAME}-vst2" "vst2" "${HAS_UI}") dpf__set_module_export_list("${NAME}-vst2" "vst2") target_link_libraries("${NAME}-vst2" PRIVATE "${NAME}-dsp" "${NAME}-ui") + target_link_options("${NAME}-vst2" PRIVATE "${EXTRA_UI_LINK_OPTS}") set_target_properties("${NAME}-vst2" PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>" ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/vst2/$<0:>" @@ -456,7 +493,7 @@ function(dpf__determine_vst3_package_architecture OUTPUT_VARIABLE) else() set(vst3_package_arch "i386") endif() - elseif(vst3_system_arch MATCHES "^(armv[3-8][a-z]*)$") + elseif(vst3_system_arch MATCHES "^(armv[3-8][a-z]*|ppc(64)?(le)?)$") set(vst3_package_arch "${vst3_system_arch}") elseif(vst3_system_arch MATCHES "^(aarch64)$") set(vst3_package_arch "aarch64") @@ -474,7 +511,7 @@ endfunction() # # Add build rules for a VST3 plugin. # -function(dpf__build_vst3 NAME HAS_UI) +function(dpf__build_vst3 NAME HAS_UI EXTRA_UI_LINK_OPTS) dpf__determine_vst3_package_architecture(vst3_arch) dpf__create_dummy_source_list(_no_srcs) @@ -484,6 +521,7 @@ function(dpf__build_vst3 NAME HAS_UI) dpf__add_ui_main("${NAME}-vst3" "vst3" "${HAS_UI}") dpf__set_module_export_list("${NAME}-vst3" "vst3") target_link_libraries("${NAME}-vst3" PRIVATE "${NAME}-dsp" "${NAME}-ui") + target_link_options("${NAME}-vst3" PRIVATE "${EXTRA_UI_LINK_OPTS}") set_target_properties("${NAME}-vst3" PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/vst3/$<0:>" OUTPUT_NAME "${NAME}" @@ -516,7 +554,7 @@ endfunction() # # Add build rules for a CLAP plugin. # -function(dpf__build_clap NAME HAS_UI) +function(dpf__build_clap NAME HAS_UI EXTRA_UI_LINK_OPTS) dpf__create_dummy_source_list(_no_srcs) dpf__add_module("${NAME}-clap" ${_no_srcs}) @@ -524,6 +562,7 @@ function(dpf__build_clap NAME HAS_UI) dpf__add_ui_main("${NAME}-clap" "clap" "${HAS_UI}") dpf__set_module_export_list("${NAME}-clap" "clap") target_link_libraries("${NAME}-clap" PRIVATE "${NAME}-dsp" "${NAME}-ui") + target_link_options("${NAME}-clap" PRIVATE "${EXTRA_UI_LINK_OPTS}") set_target_properties("${NAME}-clap" PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/$<0:>" ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/clap/$<0:>" @@ -544,6 +583,53 @@ function(dpf__build_clap NAME HAS_UI) endif() endfunction() +# dpf__build_au +# ------------------------------------------------------------------------------ +# +# Add build rules for an AUv2 plugin. +# +function(dpf__build_au NAME HAS_UI) + dpf__create_dummy_source_list(_no_srcs) + + dpf__add_module("${NAME}-au" ${_no_srcs}) + dpf__add_plugin_main("${NAME}-au" "au") + dpf__add_ui_main("${NAME}-au" "au" "${HAS_UI}") + dpf__set_module_export_list("${NAME}-au" "au") + find_library(APPLE_AUDIOTOOLBOX_FRAMEWORK "AudioToolbox") + find_library(APPLE_AUDIOUNIT_FRAMEWORK "AudioUnit") + find_library(APPLE_COREFOUNDATION_FRAMEWORK "CoreFoundation") + target_compile_options("${NAME}-au" PRIVATE "-ObjC++") + target_link_libraries("${NAME}-au" PRIVATE + "${NAME}-dsp" + "${NAME}-ui" + "${APPLE_AUDIOTOOLBOX_FRAMEWORK}" + "${APPLE_AUDIOUNIT_FRAMEWORK}" + "${APPLE_COREFOUNDATION_FRAMEWORK}") + set_target_properties("${NAME}-au" PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.component/Contents/MacOS/$<0:>" + ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/obj/au/$<0:>" + OUTPUT_NAME "${NAME}" + PREFIX "" + SUFFIX "") + + dpf__add_executable("${NAME}-export" ${_no_srcs}) + dpf__add_plugin_main("${NAME}-export" "export") + dpf__add_ui_main("${NAME}-export" "export" "${HAS_UI}") + target_link_libraries("${NAME}-export" PRIVATE "${NAME}-dsp" "${NAME}-ui") + + separate_arguments(CMAKE_CROSSCOMPILING_EMULATOR) + + add_custom_command(TARGET "${NAME}-au" POST_BUILD + COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} "$" "${NAME}" + WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/bin/${NAME}.component/Contents" + DEPENDS "${NAME}-export") + + add_dependencies("${NAME}-au" "${NAME}-export") + + file(COPY "${DPF_ROOT_DIR}/utils/plugin.bundle/Contents/PkgInfo" + DESTINATION "${PROJECT_BINARY_DIR}/bin/${NAME}.component/Contents") +endfunction() + # dpf__build_static # ------------------------------------------------------------------------------ # @@ -577,7 +663,7 @@ endfunction() # # Add the Cairo variant of DGL, if not already available. # -function(dpf__add_dgl_cairo NO_SHARED_RESOURCES) +function(dpf__add_dgl_cairo SHARED_RESOURCES USE_FILE_BROWSER) if(TARGET dgl-cairo) return() endif() @@ -605,23 +691,27 @@ function(dpf__add_dgl_cairo NO_SHARED_RESOURCES) "${DPF_ROOT_DIR}/dgl/src/Window.cpp" "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp" "${DPF_ROOT_DIR}/dgl/src/Cairo.cpp") - if(NO_SHARED_RESOURCES) - target_compile_definitions(dgl-cairo PUBLIC "DGL_NO_SHARED_RESOURCES") - else() + if(SHARED_RESOURCES) target_sources(dgl-cairo PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp") + else() + target_compile_definitions(dgl-cairo PUBLIC "DGL_NO_SHARED_RESOURCES") endif() - if(NOT APPLE) + if(APPLE) target_sources(dgl-cairo PRIVATE - "${DPF_ROOT_DIR}/dgl/src/pugl.cpp") + "${DPF_ROOT_DIR}/dgl/src/pugl.mm") else() target_sources(dgl-cairo PRIVATE - "${DPF_ROOT_DIR}/dgl/src/pugl.mm") + "${DPF_ROOT_DIR}/dgl/src/pugl.cpp") endif() target_include_directories(dgl-cairo PUBLIC "${DPF_ROOT_DIR}/dgl") target_include_directories(dgl-cairo PUBLIC "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include") + if(USE_FILE_BROWSER) + target_compile_definitions(dgl-cairo PUBLIC "DGL_USE_FILE_BROWSER") + endif() + dpf__add_dgl_system_libs() target_link_libraries(dgl-cairo PRIVATE dgl-system-libs) @@ -637,12 +727,68 @@ function(dpf__add_dgl_cairo NO_SHARED_RESOURCES) target_link_libraries(dgl-cairo PRIVATE dgl-cairo-definitions) endfunction() +# dpf__add_dgl_external +# ------------------------------------------------------------------------------ +# +# Add the external variant of DGL, if not already available. +# +function(dpf__add_dgl_external USE_FILE_BROWSER) + if(TARGET dgl-external) + return() + endif() + + dpf__add_static_library(dgl-external STATIC + "${DPF_ROOT_DIR}/dgl/src/Application.cpp" + "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Color.cpp" + "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp" + "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp" + "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp" + "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp" + "${DPF_ROOT_DIR}/dgl/src/Layout.cpp" + "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp" + "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp" + "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Widget.cpp" + "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Window.cpp" + "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Stub.cpp") + + if(APPLE) + target_sources(dgl-external PRIVATE + "${DPF_ROOT_DIR}/dgl/src/pugl.mm") + else() + target_sources(dgl-external PRIVATE + "${DPF_ROOT_DIR}/dgl/src/pugl.cpp") + endif() + target_include_directories(dgl-external PUBLIC + "${DPF_ROOT_DIR}/dgl") + target_include_directories(dgl-external PUBLIC + "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include") + + if(USE_FILE_BROWSER) + target_compile_definitions(dgl-external PUBLIC "DGL_USE_FILE_BROWSER") + endif() + + dpf__add_dgl_system_libs() + target_compile_definitions(dgl-external PUBLIC "DGL_NO_SHARED_RESOURCES") + target_link_libraries(dgl-external PRIVATE dgl-system-libs) + + add_library(dgl-external-definitions INTERFACE) + target_compile_definitions(dgl-external-definitions INTERFACE "DGL_EXTERNAL" "HAVE_DGL") + + target_include_directories(dgl-external PUBLIC "${OPENGL_INCLUDE_DIR}") + target_link_libraries(dgl-external PRIVATE dgl-external-definitions "${OPENGL_gl_LIBRARY}") +endfunction() + # dpf__add_dgl_opengl # ------------------------------------------------------------------------------ # # Add the OpenGL variant of DGL, if not already available. # -function(dpf__add_dgl_opengl NO_SHARED_RESOURCES) +function(dpf__add_dgl_opengl SHARED_RESOURCES USE_FILE_BROWSER) if(TARGET dgl-opengl) return() endif() @@ -672,17 +818,17 @@ function(dpf__add_dgl_opengl NO_SHARED_RESOURCES) "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp" "${DPF_ROOT_DIR}/dgl/src/OpenGL.cpp" "${DPF_ROOT_DIR}/dgl/src/NanoVG.cpp") - if(NO_SHARED_RESOURCES) - target_compile_definitions(dgl-opengl PUBLIC "DGL_NO_SHARED_RESOURCES") - else() + if(SHARED_RESOURCES) target_sources(dgl-opengl PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp") + else() + target_compile_definitions(dgl-opengl PUBLIC "DGL_NO_SHARED_RESOURCES") endif() - if(NOT APPLE) + if(APPLE) target_sources(dgl-opengl PRIVATE - "${DPF_ROOT_DIR}/dgl/src/pugl.cpp") + "${DPF_ROOT_DIR}/dgl/src/pugl.mm") else() target_sources(dgl-opengl PRIVATE - "${DPF_ROOT_DIR}/dgl/src/pugl.mm") + "${DPF_ROOT_DIR}/dgl/src/pugl.cpp") endif() target_include_directories(dgl-opengl PUBLIC "${DPF_ROOT_DIR}/dgl") @@ -693,6 +839,10 @@ function(dpf__add_dgl_opengl NO_SHARED_RESOURCES) target_compile_definitions(dgl-opengl PUBLIC "GL_SILENCE_DEPRECATION") endif() + if(USE_FILE_BROWSER) + target_compile_definitions(dgl-opengl PUBLIC "DGL_USE_FILE_BROWSER") + endif() + dpf__add_dgl_system_libs() target_link_libraries(dgl-opengl PRIVATE dgl-system-libs) @@ -703,15 +853,165 @@ function(dpf__add_dgl_opengl NO_SHARED_RESOURCES) target_link_libraries(dgl-opengl PRIVATE dgl-opengl-definitions "${OPENGL_gl_LIBRARY}") endfunction() +# dpf__add_dgl_opengl3 +# ------------------------------------------------------------------------------ +# +# Add the OpenGL3 variant of DGL, if not already available. +# +function(dpf__add_dgl_opengl3 SHARED_RESOURCES USE_FILE_BROWSER) + if(TARGET dgl-opengl3) + return() + endif() + + if(NOT OpenGL_GL_PREFERENCE) + set(OpenGL_GL_PREFERENCE "LEGACY") + endif() + + find_package(OpenGL REQUIRED) + + dpf__add_static_library(dgl-opengl3 STATIC + "${DPF_ROOT_DIR}/dgl/src/Application.cpp" + "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Color.cpp" + "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp" + "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp" + "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp" + "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp" + "${DPF_ROOT_DIR}/dgl/src/Layout.cpp" + "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp" + "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp" + "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Widget.cpp" + "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Window.cpp" + "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/OpenGL.cpp" + "${DPF_ROOT_DIR}/dgl/src/NanoVG.cpp") + if(SHARED_RESOURCES) + target_sources(dgl-opengl3 PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp") + else() + target_compile_definitions(dgl-opengl3 PUBLIC "DGL_NO_SHARED_RESOURCES") + endif() + if(APPLE) + target_sources(dgl-opengl3 PRIVATE + "${DPF_ROOT_DIR}/dgl/src/pugl.mm") + else() + target_sources(dgl-opengl3 PRIVATE + "${DPF_ROOT_DIR}/dgl/src/pugl.cpp") + endif() + target_include_directories(dgl-opengl3 PUBLIC + "${DPF_ROOT_DIR}/dgl") + target_include_directories(dgl-opengl3 PUBLIC + "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include") + + if(APPLE) + target_compile_definitions(dgl-opengl3 PUBLIC "GL_SILENCE_DEPRECATION") + endif() + + if(USE_FILE_BROWSER) + target_compile_definitions(dgl-opengl3 PUBLIC "DGL_USE_FILE_BROWSER") + endif() + + dpf__add_dgl_system_libs() + target_link_libraries(dgl-opengl3 PRIVATE dgl-system-libs) + + add_library(dgl-opengl3-definitions INTERFACE) + target_compile_definitions(dgl-opengl3-definitions INTERFACE "DGL_USE_OPENGL3" "DGL_OPENGL" "HAVE_OPENGL" "HAVE_DGL") + + target_include_directories(dgl-opengl3 PUBLIC "${OPENGL_INCLUDE_DIR}") + target_link_libraries(dgl-opengl3 PRIVATE dgl-opengl3-definitions "${OPENGL_gl_LIBRARY}") +endfunction() + +# dpf__add_dgl_vulkan +# ------------------------------------------------------------------------------ +# +# Add the Vulkan variant of DGL, if not already available. +# +function(dpf__add_dgl_vulkan SHARED_RESOURCES USE_FILE_BROWSER) + if(TARGET dgl-vulkan) + return() + endif() + + find_package(Vulkan REQUIRED) + + dpf__add_static_library(dgl-vulkan STATIC + "${DPF_ROOT_DIR}/dgl/src/Application.cpp" + "${DPF_ROOT_DIR}/dgl/src/ApplicationPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Color.cpp" + "${DPF_ROOT_DIR}/dgl/src/EventHandlers.cpp" + "${DPF_ROOT_DIR}/dgl/src/Geometry.cpp" + "${DPF_ROOT_DIR}/dgl/src/ImageBase.cpp" + "${DPF_ROOT_DIR}/dgl/src/ImageBaseWidgets.cpp" + "${DPF_ROOT_DIR}/dgl/src/Layout.cpp" + "${DPF_ROOT_DIR}/dgl/src/SubWidget.cpp" + "${DPF_ROOT_DIR}/dgl/src/SubWidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/TopLevelWidget.cpp" + "${DPF_ROOT_DIR}/dgl/src/TopLevelWidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Widget.cpp" + "${DPF_ROOT_DIR}/dgl/src/WidgetPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Window.cpp" + "${DPF_ROOT_DIR}/dgl/src/WindowPrivateData.cpp" + "${DPF_ROOT_DIR}/dgl/src/Vulkan.cpp") + if(NO_SHARED_RESOURCES) + target_sources(dgl-vulkan PRIVATE "${DPF_ROOT_DIR}/dgl/src/Resources.cpp") + else() + target_compile_definitions(dgl-vulkan PUBLIC "DGL_NO_SHARED_RESOURCES") + endif() + if(APPLE) + target_sources(dgl-vulkan PRIVATE + "${DPF_ROOT_DIR}/dgl/src/pugl.mm") + else() + target_sources(dgl-vulkan PRIVATE + "${DPF_ROOT_DIR}/dgl/src/pugl.cpp") + endif() + target_include_directories(dgl-vulkan PUBLIC + "${DPF_ROOT_DIR}/dgl") + target_include_directories(dgl-vulkan PUBLIC + "${DPF_ROOT_DIR}/dgl/src/pugl-upstream/include") + + if(APPLE) + target_compile_definitions(dgl-vulkan PUBLIC "GL_SILENCE_DEPRECATION") + endif() + + if(USE_FILE_BROWSER) + target_compile_definitions(dgl-vulkan PUBLIC "DGL_USE_FILE_BROWSER") + endif() + + dpf__add_dgl_system_libs() + target_link_libraries(dgl-vulkan PRIVATE dgl-system-libs) + + add_library(dgl-vulkan-definitions INTERFACE) + target_compile_definitions(dgl-vulkan-definitions INTERFACE "DGL_VULKAN" "HAVE_VULKAN" "HAVE_DGL") + + target_include_directories(dgl-vulkan PUBLIC "${OPENGL_INCLUDE_DIR}") + target_link_libraries(dgl-vulkan PRIVATE dgl-vulkan-definitions "${OPENGL_gl_LIBRARY}") +endfunction() + # dpf__add_plugin_specific_ui_sources # ------------------------------------------------------------------------------ # -# Compile system specific files, for now it is just Objective-C code +# Compile system specific files # -function(dpf__add_plugin_specific_ui_sources NAME) +function(dpf__add_plugin_specific_ui_sources NAME USE_WEB_VIEW) if(APPLE) target_sources("${NAME}" PRIVATE "${DPF_ROOT_DIR}/distrho/DistrhoUI_macOS.mm") + if(USE_WEB_VIEW) + find_library(APPLE_WEBKIT_FRAMEWORK "WebKit") + target_link_libraries("${NAME}" PRIVATE "${APPLE_WEBKIT_FRAMEWORK}") + endif() + elseif(WIN32 AND USE_WEB_VIEW) + target_sources("${NAME}" PRIVATE + "${DPF_ROOT_DIR}/distrho/DistrhoUI_win32.cpp") + if (MSVC) + set_source_files_properties("${DPF_ROOT_DIR}/distrho/DistrhoUI_win32.cpp" + PROPERTIES COMPILE_FLAGS /std:c++17) + else() + set_source_files_properties("${DPF_ROOT_DIR}/distrho/DistrhoUI_win32.cpp" + PROPERTIES COMPILE_FLAGS -std=gnu++17) + endif() + target_link_libraries("${NAME}" PRIVATE "ole32" "uuid") endif() endfunction() @@ -804,7 +1104,9 @@ endfunction() function(dpf__add_module NAME) add_library("${NAME}" MODULE ${ARGN}) dpf__set_target_defaults("${NAME}") - if(MINGW) + if(APPLE) + set_target_properties("${NAME}" PROPERTIES SUFFIX ".dylib") + elseif(MINGW) target_link_libraries("${NAME}" PRIVATE "-static") endif() endfunction() @@ -861,6 +1163,9 @@ function(dpf__set_target_defaults NAME) if (CMAKE_COMPILER_IS_GNUCXX) target_compile_options("${NAME}" PUBLIC "-fno-gnu-unique") endif() + if ((NOT APPLE) AND (NOT MSVC)) + target_link_options("${NAME}" PUBLIC "-Wl,--no-undefined") + endif() endfunction() # dpf__add_plugin_main diff --git a/dpf/dgl/Application.hpp b/dpf/dgl/Application.hpp index ed25a64..da0278a 100644 --- a/dpf/dgl/Application.hpp +++ b/dpf/dgl/Application.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -27,6 +27,41 @@ END_NAMESPACE_DISTRHO START_NAMESPACE_DGL +// -------------------------------------------------------------------------------------------------------------------- +// build config sentinels + +/** + This set of static variables act as a build sentinel that detects a configuration error. + + Usually this means the way DGL was built and how it is being used and linked into your program is different, + we want to avoid such combinations as memory layout would then also be different + leading to all sort of subtle but very nasty memory corruption issues. + + Make sure the flags used to build DGL match the ones used by your program and the link errors should go away. + */ +#define BUILD_CONFIG_SENTINEL(NAME) \ + static struct DISTRHO_JOIN_MACRO(_, NAME) { bool ok; DISTRHO_JOIN_MACRO(_, NAME)() noexcept; } NAME; + +#ifdef DPF_DEBUG +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_off) +#endif + +#ifdef DGL_USE_FILE_BROWSER +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_off) +#endif + +#ifdef DGL_NO_SHARED_RESOURCES +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_no_shared_resources_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_no_shared_resources_off) +#endif + +#undef BUILD_CONFIG_SENTINEL + // -------------------------------------------------------------------------------------------------------------------- /** diff --git a/dpf/dgl/Base.hpp b/dpf/dgl/Base.hpp index 8bdf29b..51e7704 100644 --- a/dpf/dgl/Base.hpp +++ b/dpf/dgl/Base.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -20,6 +20,35 @@ #include "../distrho/extra/LeakDetector.hpp" #include "../distrho/extra/ScopedPointer.hpp" +// -------------------------------------------------------------------------------------------------------------------- +// Compatibility checks + +#if defined(DGL_CAIRO) && defined(DGL_EXTERNAL) +# error invalid build config: trying to build for both cairo and external at the same time +#elif defined(DGL_CAIRO) && defined(DGL_OPENGL) +# error invalid build config: trying to build for both cairo and opengl at the same time +#elif defined(DGL_CAIRO) && defined(DGL_VULKAN) +# error invalid build config: trying to build for both cairo and vulkan at the same time +#elif defined(DGL_EXTERNAL) && defined(DGL_OPENGL) +# error invalid build config: trying to build for both external and opengl at the same time +#elif defined(DGL_EXTERNAL) && defined(DGL_VULKAN) +# error invalid build config: trying to build for both external and vulkan at the same time +#elif defined(DGL_OPENGL) && defined(DGL_VULKAN) +# error invalid build config: trying to build for both opengl and vulkan at the same time +#endif + +#ifdef DGL_USE_FILEBROWSER +# error typo detected use DGL_USE_FILE_BROWSER instead of DGL_USE_FILEBROWSER +#endif + +#ifdef DGL_UI_USE_WEBVIEW +# error typo detected use DGL_UI_USE_WEB_VIEW instead of DGL_UI_USE_WEBVIEW +#endif + +#if defined(DGL_FILE_BROWSER_DISABLED) +# error DGL_FILE_BROWSER_DISABLED has been replaced by DGL_USE_FILE_BROWSER (opt-in vs opt-out) +#endif + // -------------------------------------------------------------------------------------------------------------------- // Define namespace @@ -40,10 +69,13 @@ START_NAMESPACE_DGL Keyboard modifier flags. */ enum Modifier { - kModifierShift = 1u << 0u, ///< Shift key - kModifierControl = 1u << 1u, ///< Control key - kModifierAlt = 1u << 2u, ///< Alt/Option key - kModifierSuper = 1u << 3u ///< Mod4/Command/Windows key + kModifierShift = 1U << 0U, ///< Shift key + kModifierControl = 1U << 1U, ///< Control key + kModifierAlt = 1U << 2U, ///< Alt/Option key + kModifierSuper = 1U << 3U, ///< Mod4/Command/Windows key + kModifierNumLock = 1U << 4U, ///< Num lock enabled + kModifierScrollLock = 1U << 5U, ///< Scroll lock enabled + kModifierCapsLock = 1U << 6U, ///< Caps lock enabled }; /** @@ -63,13 +95,14 @@ enum Modifier { enum Key { // Convenience symbols for ASCII control characters kKeyBackspace = 0x00000008U, ///< Backspace + kKeyTab = 0x00000009U, ///< Tab kKeyEnter = 0x0000000DU, ///< Enter kKeyEscape = 0x0000001BU, ///< Escape kKeyDelete = 0x0000007FU, ///< Delete kKeySpace = 0x00000020U, ///< Space // Unicode Private Use Area - kKeyF1 = 0x0000E000U, ///< F1 + kKeyF1 = 0xE000U, ///< F1 kKeyF2, ///< F2 kKeyF3, ///< F3 kKeyF4, ///< F4 @@ -81,7 +114,7 @@ enum Key { kKeyF10, ///< F10 kKeyF11, ///< F11 kKeyF12, ///< F12 - kKeyPageUp = 0xE031, ///< Page Up + kKeyPageUp = 0xE031U, ///< Page Up kKeyPageDown, ///< Page Down kKeyEnd, ///< End kKeyHome, ///< Home @@ -96,7 +129,7 @@ enum Key { kKeyNumLock, ///< Num Lock kKeyScrollLock, ///< Scroll Lock kKeyCapsLock, ///< Caps Lock - kKeyShiftL = 0xE051U, ///< Left Shift, + kKeyShiftL = 0xE051U, ///< Left Shift kKeyShiftR, ///< Right Shift kKeyControlL, ///< Left Control kKeyControlR, ///< Right Control @@ -150,7 +183,7 @@ enum Key { */ enum EventFlag { kFlagSendEvent = 1, ///< Event is synthetic - kFlagIsHint = 2 ///< Event is a hint (not direct user input) + kFlagIsHint = 2, ///< Event is a hint (not direct user input) }; /** @@ -159,7 +192,7 @@ enum EventFlag { enum CrossingMode { kCrossingNormal, ///< Crossing due to pointer motion kCrossingGrab, ///< Crossing due to a grab - kCrossingUngrab ///< Crossing due to a grab release + kCrossingUngrab, ///< Crossing due to a grab release }; /** @@ -204,7 +237,7 @@ enum MouseCursor { // Backwards compatibility with old DPF kMouseCursorDiagonal DISTRHO_DEPRECATED_BY("kMouseCursorUpLeftDownRight") = kMouseCursorUpLeftDownRight, - kMouseCursorAntiDiagonal DISTRHO_DEPRECATED_BY("kMouseCursorUpRightDownLeft") = kMouseCursorUpRightDownLeft + kMouseCursorAntiDiagonal DISTRHO_DEPRECATED_BY("kMouseCursorUpRightDownLeft") = kMouseCursorUpRightDownLeft, }; /** @@ -215,11 +248,11 @@ enum MouseCursor { while a smooth scroll is for those with arbitrary scroll direction freedom, like some touchpads. */ enum ScrollDirection { - kScrollUp, ///< Scroll up - kScrollDown, ///< Scroll down - kScrollLeft, ///< Scroll left - kScrollRight, ///< Scroll right - kScrollSmooth ///< Smooth scroll in any direction + kScrollUp, ///< Scroll up + kScrollDown, ///< Scroll down + kScrollLeft, ///< Scroll left + kScrollRight, ///< Scroll right + kScrollSmooth, ///< Smooth scroll in any direction }; /** diff --git a/dpf/dgl/EventHandlers.hpp b/dpf/dgl/EventHandlers.hpp index 98ee607..443fa8d 100644 --- a/dpf/dgl/EventHandlers.hpp +++ b/dpf/dgl/EventHandlers.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -133,6 +133,8 @@ public: // returns 0-1 ranged value, already with log scale as needed float getNormalizedValue() const noexcept; + float getDefault() const noexcept; + // NOTE: value is assumed to be scaled if using log void setDefault(float def) noexcept; @@ -186,7 +188,7 @@ private: struct PrivateData; PrivateData* const pData; - DISTRHO_LEAK_DETECTOR(SliderEventHandler) + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(SliderEventHandler) }; // -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/dgl/ImageBaseWidgets.hpp b/dpf/dgl/ImageBaseWidgets.hpp index a4bf007..2f449e7 100644 --- a/dpf/dgl/ImageBaseWidgets.hpp +++ b/dpf/dgl/ImageBaseWidgets.hpp @@ -138,6 +138,7 @@ public: virtual void imageKnobDragStarted(ImageBaseKnob* imageKnob) = 0; virtual void imageKnobDragFinished(ImageBaseKnob* imageKnob) = 0; virtual void imageKnobValueChanged(ImageBaseKnob* imageKnob, float value) = 0; + virtual void imageKnobDoubleClicked(ImageBaseKnob*) {}; }; explicit ImageBaseKnob(Widget* parentWidget, const ImageType& image, Orientation orientation = Vertical) noexcept; diff --git a/dpf/dgl/Makefile b/dpf/dgl/Makefile index 8444c99..da7a5e9 100644 --- a/dpf/dgl/Makefile +++ b/dpf/dgl/Makefile @@ -14,6 +14,7 @@ BUILD_CXX_FLAGS += -Isrc/pugl-upstream/include LINK_FLAGS += $(DGL_LIBS) ifeq ($(MACOS),true) +BUILD_CXX_FLAGS += -DDISTRHO_MACOS_NAMESPACE_TIME=$(shell date +%s) BUILD_CXX_FLAGS += -Wno-deprecated-declarations else PUGL_EXTRA_FLAGS = -Wno-extra -Wmissing-field-initializers @@ -90,7 +91,8 @@ endif # --------------------------------------------------------------------------------------------------------------------- -OBJS_stub = $(OBJS_common) +OBJS_stub = $(OBJS_common) \ + $(BUILD_DIR)/dgl/Stub.cpp.o ifeq ($(MACOS),true) OBJS_stub += $(BUILD_DIR)/dgl/pugl.mm.o @@ -117,8 +119,6 @@ endif ifeq ($(HAVE_OPENGL),true) TARGETS += $(BUILD_DIR)/libdgl-opengl.a -# Compat name, to be removed soon -TARGETS += $(BUILD_DIR)/libdgl.a endif ifeq ($(HAVE_STUB),true) @@ -138,6 +138,7 @@ opengl: $(BUILD_DIR)/libdgl-opengl.a opengl3: $(BUILD_DIR)/libdgl-opengl3.a stub: $(BUILD_DIR)/libdgl-stub.a vulkan: $(BUILD_DIR)/libdgl-vulkan.a +web: $(BUILD_DIR)/libdgl-web.a # --------------------------------------------------------------------------------------------------------------------- @@ -171,11 +172,6 @@ $(BUILD_DIR)/libdgl-vulkan.a: $(OBJS_vulkan) $(SILENT)rm -f $@ $(SILENT)$(AR) crs $@ $^ -# Compat name, to be removed soon -$(BUILD_DIR)/libdgl.a: $(BUILD_DIR)/libdgl-opengl.a - @echo "Symlinking libdgl.a" - $(SILENT)ln -sf $< $@ - # --------------------------------------------------------------------------------------------------------------------- $(BUILD_DIR)/dgl/%.c.o: src/%.c diff --git a/dpf/dgl/StandaloneWindow.hpp b/dpf/dgl/StandaloneWindow.hpp index 017a3a7..5b77e58 100644 --- a/dpf/dgl/StandaloneWindow.hpp +++ b/dpf/dgl/StandaloneWindow.hpp @@ -73,6 +73,7 @@ public: uint getHeight() const noexcept { return Window::getHeight(); } const Size getSize() const noexcept { return Window::getSize(); } void repaint() noexcept { Window::repaint(); } + void repaint(const Rectangle& rect) noexcept { Window::repaint(rect); } void setWidth(uint width) { Window::setWidth(width); } void setHeight(uint height) { Window::setHeight(height); } void setSize(uint width, uint height) { Window::setSize(width, height); } diff --git a/dpf/dgl/Widget.hpp b/dpf/dgl/Widget.hpp index e05c17d..7766f48 100644 --- a/dpf/dgl/Widget.hpp +++ b/dpf/dgl/Widget.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -407,7 +407,7 @@ protected: /** A function called to draw the widget contents. */ - virtual void onDisplay() = 0; + virtual void onDisplay() {}; /** A function called when a key is pressed or released. diff --git a/dpf/dgl/Window.hpp b/dpf/dgl/Window.hpp index b18fe07..ac6b89c 100644 --- a/dpf/dgl/Window.hpp +++ b/dpf/dgl/Window.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -19,7 +19,7 @@ #include "Geometry.hpp" -#ifndef DGL_FILE_BROWSER_DISABLED +#ifdef DGL_USE_FILE_BROWSER # include "FileBrowserDialog.hpp" #endif @@ -394,7 +394,7 @@ public: */ void focus(); -#ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER /** Open a file browser dialog with this window as transient parent. A few options can be specified to setup the dialog. @@ -405,7 +405,7 @@ public: This function does not block the event loop. */ bool openFileBrowser(const DGL_NAMESPACE::FileBrowserOptions& options = FileBrowserOptions()); -#endif + #endif /** Request repaint of this window, for the entire area. @@ -517,7 +517,7 @@ protected: */ virtual void onScaleFactorChanged(double scaleFactor); -#ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER /** A function called when a path is selected by the user, as triggered by openFileBrowser(). This action happens after the user confirms the action, so the file browser dialog will be closed at this point. @@ -528,7 +528,7 @@ protected: /** DEPRECATED Use onFileSelected(). */ DISTRHO_DEPRECATED_BY("onFileSelected(const char*)") inline virtual void fileBrowserSelected(const char* filename) { return onFileSelected(filename); } -#endif + #endif private: PrivateData* const pData; @@ -545,6 +545,7 @@ private: uint height, double scaleFactor, bool resizable, + bool usesScheduledRepaints, bool usesSizeRequest, bool doPostInit); diff --git a/dpf/dgl/src/Application.cpp b/dpf/dgl/src/Application.cpp index 5fe05de..d69ef38 100644 --- a/dpf/dgl/src/Application.cpp +++ b/dpf/dgl/src/Application.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -24,6 +24,55 @@ START_NAMESPACE_DGL +// -------------------------------------------------------------------------------------------------------------------- +// build config sentinels + +#define BUILD_CONFIG_SENTINEL(NAME) \ + DISTRHO_JOIN_MACRO(_, NAME)::DISTRHO_JOIN_MACRO(_, NAME)() noexcept : ok(false) {} + +#ifdef DPF_DEBUG +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dpf_debug_off) +#endif + +#ifdef DGL_USE_FILE_BROWSER +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_use_file_browser_off) +#endif + +#ifdef DGL_NO_SHARED_RESOURCES +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_no_shared_resources_on) +#else +BUILD_CONFIG_SENTINEL(fail_to_link_is_mismatch_dgl_no_shared_resources_off) +#endif + +#undef BUILD_CONFIG_SENTINEL + +static inline +bool dpf_check_build_status() noexcept +{ + return ( + #ifdef DPF_DEBUG + fail_to_link_is_mismatch_dpf_debug_on.ok && + #else + fail_to_link_is_mismatch_dpf_debug_off.ok && + #endif + #ifdef DGL_USE_FILE_BROWSER + fail_to_link_is_mismatch_dgl_use_file_browser_on.ok && + #else + fail_to_link_is_mismatch_dgl_use_file_browser_off.ok && + #endif + #ifdef DGL_NO_SHARED_RESOURCES + fail_to_link_is_mismatch_dgl_no_shared_resources_on.ok && + #else + fail_to_link_is_mismatch_dgl_no_shared_resources_off.ok && + #endif + true + ); +} + // -------------------------------------------------------------------------------------------------------------------- #ifdef __EMSCRIPTEN__ @@ -34,7 +83,26 @@ static void app_idle(void* const app) #endif Application::Application(const bool isStandalone) - : pData(new PrivateData(isStandalone)) {} + : pData(new PrivateData(isStandalone)) +{ + // build config sentinels + #ifdef DPF_DEBUG + fail_to_link_is_mismatch_dpf_debug_on.ok = true; + #else + fail_to_link_is_mismatch_dpf_debug_off.ok = true; + #endif + #ifdef DGL_USE_FILE_BROWSER + fail_to_link_is_mismatch_dgl_use_file_browser_on.ok = true; + #else + fail_to_link_is_mismatch_dgl_use_file_browser_off.ok = true; + #endif + #ifdef DGL_NO_SHARED_RESOURCES + fail_to_link_is_mismatch_dgl_no_shared_resources_on.ok = true; + #else + fail_to_link_is_mismatch_dgl_no_shared_resources_off.ok = true; + #endif + DISTRHO_SAFE_ASSERT(dpf_check_build_status()); +} Application::~Application() { diff --git a/dpf/dgl/src/ApplicationPrivateData.cpp b/dpf/dgl/src/ApplicationPrivateData.cpp index deadd24..0e353a7 100644 --- a/dpf/dgl/src/ApplicationPrivateData.cpp +++ b/dpf/dgl/src/ApplicationPrivateData.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -23,24 +23,25 @@ START_NAMESPACE_DGL +typedef std::list::iterator WindowListIterator; typedef std::list::reverse_iterator WindowListReverseIterator; static d_ThreadHandle getCurrentThreadHandle() noexcept { -#ifdef DISTRHO_OS_WINDOWS + #ifdef DISTRHO_OS_WINDOWS return GetCurrentThread(); -#else + #else return pthread_self(); -#endif + #endif } static bool isThisTheMainThread(const d_ThreadHandle mainThreadHandle) noexcept { -#ifdef DISTRHO_OS_WINDOWS + #ifdef DISTRHO_OS_WINDOWS return GetCurrentThread() == mainThreadHandle; // IsGUIThread ? -#else + #else return pthread_equal(getCurrentThreadHandle(), mainThreadHandle) != 0; -#endif + #endif } // -------------------------------------------------------------------------------------------------------------------- @@ -59,6 +60,7 @@ Application::PrivateData::PrivateData(const bool standalone) isQuitting(false), isQuittingInNextCycle(false), isStarting(true), + needsRepaint(false), visibleWindows(0), mainThreadHandle(getCurrentThreadHandle()), windows(), @@ -66,12 +68,16 @@ Application::PrivateData::PrivateData(const bool standalone) { DISTRHO_SAFE_ASSERT_RETURN(world != nullptr,); + #ifdef DGL_USING_SDL + SDL_Init(SDL_INIT_EVENTS|SDL_INIT_TIMER|SDL_INIT_VIDEO); + #else puglSetWorldHandle(world, this); #ifdef __EMSCRIPTEN__ puglSetWorldString(world, PUGL_CLASS_NAME, "canvas"); #else puglSetWorldString(world, PUGL_CLASS_NAME, DISTRHO_MACRO_AS_STRING(DGL_NAMESPACE)); #endif + #endif } Application::PrivateData::~PrivateData() @@ -82,8 +88,12 @@ Application::PrivateData::~PrivateData() windows.clear(); idleCallbacks.clear(); + #ifdef DGL_USING_SDL + SDL_Quit(); + #else if (world != nullptr) puglFreeWorld(world); + #endif } // -------------------------------------------------------------------------------------------------------------------- @@ -136,6 +146,20 @@ void Application::PrivateData::triggerIdleCallbacks() } } +void Application::PrivateData::repaintIfNeeeded() +{ + if (needsRepaint) + { + needsRepaint = false; + + for (WindowListIterator it = windows.begin(), ite = windows.end(); it != ite; ++it) + { + DGL_NAMESPACE::Window* const window(*it); + window->repaint(); + } + } +} + void Application::PrivateData::quit() { if (! isThisTheMainThread(mainThreadHandle)) @@ -149,13 +173,13 @@ void Application::PrivateData::quit() isQuitting = true; -#ifndef DPF_TEST_APPLICATION_CPP + #ifndef DPF_TEST_APPLICATION_CPP for (WindowListReverseIterator rit = windows.rbegin(), rite = windows.rend(); rit != rite; ++rit) { DGL_NAMESPACE::Window* const window(*rit); window->close(); } -#endif + #endif } double Application::PrivateData::getTime() const diff --git a/dpf/dgl/src/ApplicationPrivateData.hpp b/dpf/dgl/src/ApplicationPrivateData.hpp index 0e33c98..59afaae 100644 --- a/dpf/dgl/src/ApplicationPrivateData.hpp +++ b/dpf/dgl/src/ApplicationPrivateData.hpp @@ -63,6 +63,9 @@ struct Application::PrivateData { /** Whether the applicating is starting up, that is, no windows have been made visible yet. Defaults to true. */ bool isStarting; + /** When true force all windows to be repainted on next idle. */ + bool needsRepaint; + /** Counter of visible windows, only used in standalone mode. If 0->1, application is starting. If 1->0, application is quitting/stopping. */ uint visibleWindows; @@ -96,6 +99,9 @@ struct Application::PrivateData { /** Run each idle callback without updating pugl world. */ void triggerIdleCallbacks(); + /** Trigger a repaint of all windows if @a needsRepaint is true. */ + void repaintIfNeeeded(); + /** Set flag indicating application is quitting, and close all windows in reverse order of registration. For standalone mode only. */ void quit(); diff --git a/dpf/dgl/src/Cairo.cpp b/dpf/dgl/src/Cairo.cpp index ceed597..612029a 100644 --- a/dpf/dgl/src/Cairo.cpp +++ b/dpf/dgl/src/Cairo.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * Copyright (C) 2019-2021 Jean Pierre Cimalando * * Permission to use, copy, modify, and/or distribute this software for any purpose with @@ -438,9 +438,9 @@ void CairoImage::loadFromMemory(const char* const rdata, const Size& s, co for (int w = 0; w < width; ++w) { const uchar a = urdata[h*width*4+w*4+3]; - newdata[h*width*4+w*4+0] = (urdata[h*width*4+w*4+0] * a) >> 8; - newdata[h*width*4+w*4+1] = (urdata[h*width*4+w*4+1] * a) >> 8; - newdata[h*width*4+w*4+2] = (urdata[h*width*4+w*4+2] * a) >> 8; + newdata[h*width*4+w*4+0] = static_cast((urdata[h*width*4+w*4+0] * a) >> 8); + newdata[h*width*4+w*4+1] = static_cast((urdata[h*width*4+w*4+1] * a) >> 8); + newdata[h*width*4+w*4+2] = static_cast((urdata[h*width*4+w*4+2] * a) >> 8); newdata[h*width*4+w*4+3] = a; } } @@ -465,9 +465,9 @@ void CairoImage::loadFromMemory(const char* const rdata, const Size& s, co for (int w = 0; w < width; ++w) { const uchar a = urdata[h*width*4+w*4+3]; - newdata[h*width*4+w*4+0] = (urdata[h*width*4+w*4+2] * a) >> 8; - newdata[h*width*4+w*4+1] = (urdata[h*width*4+w*4+1] * a) >> 8; - newdata[h*width*4+w*4+2] = (urdata[h*width*4+w*4+0] * a) >> 8; + newdata[h*width*4+w*4+0] = static_cast((urdata[h*width*4+w*4+2] * a) >> 8); + newdata[h*width*4+w*4+1] = static_cast((urdata[h*width*4+w*4+1] * a) >> 8); + newdata[h*width*4+w*4+2] = static_cast((urdata[h*width*4+w*4+0] * a) >> 8); newdata[h*width*4+w*4+3] = a; } } diff --git a/dpf/dgl/src/EventHandlers.cpp b/dpf/dgl/src/EventHandlers.cpp index 3b5536a..a2721d2 100644 --- a/dpf/dgl/src/EventHandlers.cpp +++ b/dpf/dgl/src/EventHandlers.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -419,7 +419,7 @@ struct KnobEventHandler::PrivateData { if ((state & kKnobStateDragging) == 0x0) return false; - float movDiff; + double movDiff; switch (orientation) { @@ -431,8 +431,8 @@ struct KnobEventHandler::PrivateData { break; case Both: { - const float movDiffX = ev.pos.getX() / scaleFactor - lastX; - const float movDiffY = lastY - ev.pos.getY() / scaleFactor; + const double movDiffX = ev.pos.getX() / scaleFactor - lastX; + const double movDiffY = lastY - ev.pos.getY() / scaleFactor; movDiff = std::abs(movDiffX) > std::abs(movDiffY) ? movDiffX : movDiffY; } break; @@ -444,7 +444,7 @@ struct KnobEventHandler::PrivateData { return true; const float divisor = (ev.mod & kModifierControl) ? accel * 10.f : accel; - valueTmp += (maximum - minimum) / divisor * movDiff; + valueTmp += (maximum - minimum) / divisor * static_cast(movDiff); if (usingLog) valueTmp = logscale(valueTmp); @@ -618,6 +618,11 @@ float KnobEventHandler::getNormalizedValue() const noexcept return pData->getNormalizedValue(); } +float KnobEventHandler::getDefault() const noexcept +{ + return pData->valueDef; +} + void KnobEventHandler::setDefault(const float def) noexcept { pData->valueDef = def; diff --git a/dpf/dgl/src/ImageBaseWidgets.cpp b/dpf/dgl/src/ImageBaseWidgets.cpp index 3b71eb3..24cc0e6 100644 --- a/dpf/dgl/src/ImageBaseWidgets.cpp +++ b/dpf/dgl/src/ImageBaseWidgets.cpp @@ -316,6 +316,13 @@ struct ImageBaseKnob::PrivateData : public KnobEventHandler::Callback callback->imageKnobValueChanged(imageKnob, value); } + void knobDoubleClicked(SubWidget* const widget) override + { + if (callback != nullptr) + if (ImageBaseKnob* const imageKnob = dynamic_cast(widget)) + callback->imageKnobDoubleClicked(imageKnob); + } + // implemented independently per graphics backend void init(); void cleanup(); diff --git a/dpf/dgl/src/Layout.cpp b/dpf/dgl/src/Layout.cpp index ea1dc81..814ed84 100644 --- a/dpf/dgl/src/Layout.cpp +++ b/dpf/dgl/src/Layout.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -35,8 +35,8 @@ uint Layout::setAbsolutePos(int x, const int y, const uint padding) SubWidgetWithSizeHint& s(*it); maxHeight = std::max(maxHeight, s.widget->getHeight()); s.widget->setAbsolutePos(x, y); - x += s.widget->getWidth(); - x += padding; + x += static_cast(s.widget->getWidth()); + x += static_cast(padding); } return maxHeight; @@ -52,8 +52,8 @@ uint Layout::setAbsolutePos(const int x, int y, const uint padding) SubWidgetWithSizeHint& s(*it); maxWidth = std::max(maxWidth, s.widget->getWidth()); s.widget->setAbsolutePos(x, y); - y += s.widget->getHeight(); - y += padding; + y += static_cast(s.widget->getHeight()); + y += static_cast(padding); } return maxWidth; @@ -78,7 +78,7 @@ void Layout::setSize(const uint width, const uint padding) } if (const size_t numWidgets = widgets.size()) - nonFixedWidth -= padding * (numWidgets - 1); + nonFixedWidth -= padding * static_cast(numWidgets - 1); const uint widthPerWidget = numDynamiclySizedWidgets != 0 ? nonFixedWidth / numDynamiclySizedWidgets : 0; @@ -111,7 +111,7 @@ void Layout::setSize(const uint height, const uint padding) } if (const size_t numWidgets = widgets.size()) - nonFixedHeight -= padding * (numWidgets - 1); + nonFixedHeight -= padding * static_cast(numWidgets - 1); const uint heightPerWidget = numDynamiclySizedWidgets != 0 ? nonFixedHeight / numDynamiclySizedWidgets : 0; @@ -138,8 +138,8 @@ void HorizontallyStackedVerticalLayout::setAbsolutePos(int x, const int y, const for (VerticalLayoutIterator it=items.begin(), end=items.end(); it != end; ++it) { VerticalLayout* l(*it); - x += l->setAbsolutePos(x, y, padding); - x += padding; + x += static_cast(l->setAbsolutePos(x, y, padding)); + x += static_cast(padding); } } @@ -157,9 +157,9 @@ Size VerticallyStackedHorizontalLayout::adjustSize(const uint padding) uint width = 0; uint height = 0; - for (SubWidgetWithSizeHintIterator it=l->widgets.begin(), end=l->widgets.end(); it != end; ++it) + for (SubWidgetWithSizeHintIterator it2=l->widgets.begin(), end2=l->widgets.end(); it2 != end2; ++it2) { - SubWidgetWithSizeHint& s(*it); + SubWidgetWithSizeHint& s(*it2); if (width != 0) width += padding; @@ -191,8 +191,8 @@ void VerticallyStackedHorizontalLayout::setAbsolutePos(const int x, int y, const for (HorizontalLayoutIterator it=items.begin(), end=items.end(); it != end; ++it) { HorizontalLayout* l(*it); - y += l->setAbsolutePos(x, y, padding); - y += padding; + y += static_cast(l->setAbsolutePos(x, y, padding)); + y += static_cast(padding); } } diff --git a/dpf/dgl/src/OpenGL.cpp b/dpf/dgl/src/OpenGL.cpp index 43d096e..fa387e4 100644 --- a/dpf/dgl/src/OpenGL.cpp +++ b/dpf/dgl/src/OpenGL.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2021 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -691,12 +691,12 @@ void SubWidget::PrivateData::display(const uint width, const uint height, const const int w = static_cast(self->getWidth()); const int h = static_cast(self->getHeight()); - if (viewportScaleFactor != 0.0 && viewportScaleFactor != 1.0) + if (d_isNotZero(viewportScaleFactor) && d_isNotEqual(viewportScaleFactor, 1.0)) { glViewport(x, - -static_cast(height * viewportScaleFactor - height + absolutePos.getY() + 0.5), - static_cast(width * viewportScaleFactor + 0.5), - static_cast(height * viewportScaleFactor + 0.5)); + -d_roundToIntPositive(height * viewportScaleFactor - height + absolutePos.getY()), + d_roundToIntPositive(width * viewportScaleFactor), + d_roundToIntPositive(height * viewportScaleFactor)); } else { @@ -712,16 +712,16 @@ void SubWidget::PrivateData::display(const uint width, const uint height, const else { // set viewport pos - glViewport(static_cast(absolutePos.getX() * autoScaleFactor + 0.5), - -static_cast(absolutePos.getY() * autoScaleFactor + 0.5), + glViewport(d_roundToIntPositive(absolutePos.getX() * autoScaleFactor), + -d_roundToIntPositive(absolutePos.getY() * autoScaleFactor), static_cast(width), static_cast(height)); // then cut the outer bounds - glScissor(static_cast(absolutePos.getX() * autoScaleFactor + 0.5), - static_cast(height - (self->getHeight() + absolutePos.getY()) * autoScaleFactor + 0.5), - static_cast(self->getWidth() * autoScaleFactor + 0.5), - static_cast(self->getHeight() * autoScaleFactor + 0.5)); + glScissor(d_roundToIntPositive(absolutePos.getX() * autoScaleFactor), + d_roundToIntPositive(height - (static_cast(self->getHeight()) + absolutePos.getY()) * autoScaleFactor), + d_roundToIntPositive(self->getWidth() * autoScaleFactor), + d_roundToIntPositive(self->getHeight() * autoScaleFactor)); glEnable(GL_SCISSOR_TEST); needsDisableScissor = true; diff --git a/dpf/dgl/src/Stub.cpp b/dpf/dgl/src/Stub.cpp new file mode 100644 index 0000000..647d8c9 --- /dev/null +++ b/dpf/dgl/src/Stub.cpp @@ -0,0 +1,193 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "Color.hpp" +#include "SubWidgetPrivateData.hpp" +#include "TopLevelWidgetPrivateData.hpp" +#include "WidgetPrivateData.hpp" +#include "WindowPrivateData.hpp" + +START_NAMESPACE_DGL + +// -------------------------------------------------------------------------------------------------------------------- + +static void notImplemented(const char* const name) +{ + d_stderr2("stub function not implemented: %s", name); +} + +// -------------------------------------------------------------------------------------------------------------------- +// Color + +void Color::setFor(const GraphicsContext&, bool) +{ + notImplemented("Color::setFor"); +} + +// -------------------------------------------------------------------------------------------------------------------- +// Line + +template +void Line::draw(const GraphicsContext& context, T) +{ + notImplemented("Line::draw"); +} + +template +void Line::draw() +{ + notImplemented("Line::draw"); +} + +template class Line; +template class Line; +template class Line; +template class Line; +template class Line; +template class Line; + +// -------------------------------------------------------------------------------------------------------------------- +// Circle + +template +void Circle::draw(const GraphicsContext&) +{ + notImplemented("Circle::draw"); +} + +template +void Circle::drawOutline(const GraphicsContext&, T) +{ + notImplemented("Circle::drawOutline"); +} + +template +void Circle::draw() +{ + notImplemented("Circle::draw"); +} + +template +void Circle::drawOutline() +{ + notImplemented("Circle::drawOutline"); +} + +template class Circle; +template class Circle; +template class Circle; +template class Circle; +template class Circle; +template class Circle; + +// -------------------------------------------------------------------------------------------------------------------- +// Triangle + +template +void Triangle::draw(const GraphicsContext&) +{ + notImplemented("Triangle::draw"); +} + +template +void Triangle::drawOutline(const GraphicsContext&, T) +{ + notImplemented("Triangle::drawOutline"); +} + +template +void Triangle::draw() +{ + notImplemented("Triangle::draw"); +} + +template +void Triangle::drawOutline() +{ + notImplemented("Triangle::drawOutline"); +} + +template class Triangle; +template class Triangle; +template class Triangle; +template class Triangle; +template class Triangle; +template class Triangle; + +// -------------------------------------------------------------------------------------------------------------------- +// Rectangle + +template +void Rectangle::draw(const GraphicsContext&) +{ + notImplemented("Rectangle::draw"); +} + +template +void Rectangle::drawOutline(const GraphicsContext&, T) +{ + notImplemented("Rectangle::drawOutline"); +} + +template +void Rectangle::draw() +{ + notImplemented("Rectangle::draw"); +} + +template +void Rectangle::drawOutline() +{ + notImplemented("Rectangle::drawOutline"); +} + +template class Rectangle; +template class Rectangle; +template class Rectangle; +template class Rectangle; +template class Rectangle; +template class Rectangle; + +// -------------------------------------------------------------------------------------------------------------------- + +void SubWidget::PrivateData::display(uint, uint, double) +{ +} + +// -------------------------------------------------------------------------------------------------------------------- + +void TopLevelWidget::PrivateData::display() +{ +} + +// -------------------------------------------------------------------------------------------------------------------- + +void Window::PrivateData::renderToPicture(const char*, const GraphicsContext&, uint, uint) +{ + notImplemented("Window::PrivateData::renderToPicture"); +} + +// -------------------------------------------------------------------------------------------------------------------- + +const GraphicsContext& Window::PrivateData::getGraphicsContext() const noexcept +{ + GraphicsContext& context((GraphicsContext&)graphicsContext); + return context; +} + +// -------------------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DGL diff --git a/dpf/dgl/src/SubWidget.cpp b/dpf/dgl/src/SubWidget.cpp index af1274a..0b97fe9 100644 --- a/dpf/dgl/src/SubWidget.cpp +++ b/dpf/dgl/src/SubWidget.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2021 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -71,7 +71,7 @@ Rectangle SubWidget::getConstrainedAbsoluteArea() const noexcept const int y = getAbsoluteY(); if (x >= 0 && y >= 0) - return Rectangle(x, y, getSize()); + return Rectangle(static_cast(x), static_cast(y), getSize()); const int xOffset = std::min(0, x); const int yOffset = std::min(0, y); diff --git a/dpf/dgl/src/Window.cpp b/dpf/dgl/src/Window.cpp index 4b04705..b21e5c4 100644 --- a/dpf/dgl/src/Window.cpp +++ b/dpf/dgl/src/Window.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -106,7 +106,7 @@ Window::Window(Application& app, const uint height, const double scaleFactor, const bool resizable) - : pData(new PrivateData(app, this, parentWindowHandle, width, height, scaleFactor, resizable, false)) + : pData(new PrivateData(app, this, parentWindowHandle, width, height, scaleFactor, resizable, false, false)) { pData->initPost(); } @@ -117,9 +117,11 @@ Window::Window(Application& app, const uint height, const double scaleFactor, const bool resizable, - const bool isVST3, + const bool usesScheduledRepaints, + const bool usesSizeRequest, const bool doPostInit) - : pData(new PrivateData(app, this, parentWindowHandle, width, height, scaleFactor, resizable, isVST3)) + : pData(new PrivateData(app, this, parentWindowHandle, width, height, scaleFactor, resizable, + usesScheduledRepaints, usesSizeRequest)) { if (doPostInit) pData->initPost(); @@ -225,7 +227,7 @@ uint Window::getWidth() const noexcept DISTRHO_SAFE_ASSERT_RETURN(pData->view != nullptr, 0); const double width = puglGetFrame(pData->view).width; - DISTRHO_SAFE_ASSERT_RETURN(width >= 0.0, 0); + DISTRHO_SAFE_ASSERT_RETURN(width > 0.0, 0); return static_cast(width + 0.5); } @@ -234,7 +236,7 @@ uint Window::getHeight() const noexcept DISTRHO_SAFE_ASSERT_RETURN(pData->view != nullptr, 0); const double height = puglGetFrame(pData->view).height; - DISTRHO_SAFE_ASSERT_RETURN(height >= 0.0, 0); + DISTRHO_SAFE_ASSERT_RETURN(height > 0.0, 0); return static_cast(height + 0.5); } @@ -243,8 +245,8 @@ Size Window::getSize() const noexcept DISTRHO_SAFE_ASSERT_RETURN(pData->view != nullptr, Size()); const PuglRect rect = puglGetFrame(pData->view); - DISTRHO_SAFE_ASSERT_RETURN(rect.width >= 0.0, Size()); - DISTRHO_SAFE_ASSERT_RETURN(rect.height >= 0.0, Size()); + DISTRHO_SAFE_ASSERT_RETURN(rect.width > 0.0, Size()); + DISTRHO_SAFE_ASSERT_RETURN(rect.height > 0.0, Size()); return Size(static_cast(rect.width + 0.5), static_cast(rect.height + 0.5)); } @@ -269,10 +271,10 @@ void Window::setSize(uint width, uint height) uint minWidth = pData->minWidth; uint minHeight = pData->minHeight; - if (pData->autoScaling && scaleFactor != 1.0) + if (pData->autoScaling && d_isNotEqual(scaleFactor, 1.0)) { - minWidth *= scaleFactor; - minHeight *= scaleFactor; + minWidth = d_roundToUnsignedInt(minWidth * scaleFactor); + minHeight = d_roundToUnsignedInt(minHeight * scaleFactor); } // handle geometry constraints here @@ -293,10 +295,10 @@ void Window::setSize(uint width, uint height) { // fix width if (reqRatio > ratio) - width = static_cast(height * ratio + 0.5); + width = d_roundToUnsignedInt(height * ratio); // fix height else - height = static_cast(static_cast(width) / ratio + 0.5); + height = d_roundToUnsignedInt(static_cast(width) / ratio); } } } @@ -313,6 +315,16 @@ void Window::setSize(uint width, uint height) else if (pData->view != nullptr) { puglSetSizeAndDefault(pData->view, width, height); + + // there are no resize events for closed windows, so short-circuit the top-level widgets here + if (pData->isClosed) + { + for (std::list::iterator it = pData->topLevelWidgets.begin(), + end = pData->topLevelWidgets.end(); it != end; ++it) + { + ((Widget*)*it)->setSize(width, height); + } + } } } @@ -402,7 +414,7 @@ void Window::focus() pData->focus(); } -#ifndef DGL_FILE_BROWSER_DISABLED +#ifdef DGL_USE_FILE_BROWSER bool Window::openFileBrowser(const FileBrowserOptions& options) { return pData->openFileBrowser(options); @@ -411,8 +423,13 @@ bool Window::openFileBrowser(const FileBrowserOptions& options) void Window::repaint() noexcept { - if (pData->view != nullptr) - puglPostRedisplay(pData->view); + if (pData->view == nullptr) + return; + + if (pData->usesScheduledRepaints) + pData->appData->needsRepaint = true; + + puglPostRedisplay(pData->view); } void Window::repaint(const Rectangle& rect) noexcept @@ -420,6 +437,9 @@ void Window::repaint(const Rectangle& rect) noexcept if (pData->view == nullptr) return; + if (pData->usesScheduledRepaints) + pData->appData->needsRepaint = true; + PuglRect prect = { static_cast(rect.getX()), static_cast(rect.getY()), @@ -430,10 +450,10 @@ void Window::repaint(const Rectangle& rect) noexcept { const double autoScaleFactor = pData->autoScaleFactor; - prect.x *= autoScaleFactor; - prect.y *= autoScaleFactor; - prect.width *= autoScaleFactor; - prect.height *= autoScaleFactor; + prect.x = static_cast(prect.x * autoScaleFactor); + prect.y = static_cast(prect.y * autoScaleFactor); + prect.width = static_cast(prect.width * autoScaleFactor + 0.5); + prect.height = static_cast(prect.height * autoScaleFactor + 0.5); } puglPostRedisplayRect(pData->view, prect); } @@ -479,8 +499,8 @@ void Window::setGeometryConstraints(uint minimumWidth, if (automaticallyScale && scaleFactor != 1.0) { - minimumWidth *= scaleFactor; - minimumHeight *= scaleFactor; + minimumWidth = d_roundToUnsignedInt(minimumWidth * scaleFactor); + minimumHeight = d_roundToUnsignedInt(minimumHeight * scaleFactor); } puglSetGeometryConstraints(pData->view, minimumWidth, minimumHeight, keepAspectRatio); @@ -554,7 +574,7 @@ void Window::onScaleFactorChanged(double) { } -#ifndef DGL_FILE_BROWSER_DISABLED +#ifdef DGL_USE_FILE_BROWSER void Window::onFileSelected(const char*) { } diff --git a/dpf/dgl/src/WindowPrivateData.cpp b/dpf/dgl/src/WindowPrivateData.cpp index 3ef68c3..a2afec6 100644 --- a/dpf/dgl/src/WindowPrivateData.cpp +++ b/dpf/dgl/src/WindowPrivateData.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -115,6 +115,7 @@ Window::PrivateData::PrivateData(Application& a, Window* const s) isClosed(true), isVisible(false), isEmbed(false), + usesScheduledRepaints(false), usesSizeRequest(false), scaleFactor(DGL_NAMESPACE::getScaleFactor(view)), autoScaling(false), @@ -127,7 +128,7 @@ Window::PrivateData::PrivateData(Application& a, Window* const s) waitingForClipboardEvents(false), clipboardTypeId(0), filenameToRenderInto(nullptr), - #ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER fileBrowserHandle(nullptr), #endif modal() @@ -144,6 +145,7 @@ Window::PrivateData::PrivateData(Application& a, Window* const s, PrivateData* c isClosed(true), isVisible(false), isEmbed(false), + usesScheduledRepaints(false), usesSizeRequest(false), scaleFactor(ppData->scaleFactor), autoScaling(false), @@ -156,7 +158,7 @@ Window::PrivateData::PrivateData(Application& a, Window* const s, PrivateData* c waitingForClipboardEvents(false), clipboardTypeId(0), filenameToRenderInto(nullptr), - #ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER fileBrowserHandle(nullptr), #endif modal(ppData) @@ -175,6 +177,7 @@ Window::PrivateData::PrivateData(Application& a, Window* const s, isClosed(parentWindowHandle == 0), isVisible(parentWindowHandle != 0), isEmbed(parentWindowHandle != 0), + usesScheduledRepaints(false), usesSizeRequest(false), scaleFactor(scale != 0.0 ? scale : DGL_NAMESPACE::getScaleFactor(view)), autoScaling(false), @@ -187,7 +190,7 @@ Window::PrivateData::PrivateData(Application& a, Window* const s, waitingForClipboardEvents(false), clipboardTypeId(0), filenameToRenderInto(nullptr), - #ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER fileBrowserHandle(nullptr), #endif modal() @@ -198,7 +201,9 @@ Window::PrivateData::PrivateData(Application& a, Window* const s, Window::PrivateData::PrivateData(Application& a, Window* const s, const uintptr_t parentWindowHandle, const uint width, const uint height, - const double scale, const bool resizable, const bool usesSizeRequest_) + const double scale, const bool resizable, + const bool _usesScheduledRepaints, + const bool _usesSizeRequest) : app(a), appData(a.pData), self(s), @@ -207,7 +212,8 @@ Window::PrivateData::PrivateData(Application& a, Window* const s, isClosed(parentWindowHandle == 0), isVisible(parentWindowHandle != 0 && view != nullptr), isEmbed(parentWindowHandle != 0), - usesSizeRequest(usesSizeRequest_), + usesScheduledRepaints(_usesScheduledRepaints), + usesSizeRequest(_usesSizeRequest), scaleFactor(scale != 0.0 ? scale : DGL_NAMESPACE::getScaleFactor(view)), autoScaling(false), autoScaleFactor(1.0), @@ -219,7 +225,7 @@ Window::PrivateData::PrivateData(Application& a, Window* const s, waitingForClipboardEvents(false), clipboardTypeId(0), filenameToRenderInto(nullptr), - #ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER fileBrowserHandle(nullptr), #endif modal() @@ -238,7 +244,7 @@ Window::PrivateData::~PrivateData() if (isEmbed) { - #ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER if (fileBrowserHandle != nullptr) fileBrowserClose(fileBrowserHandle); #endif @@ -270,18 +276,18 @@ void Window::PrivateData::initPre(const uint width, const uint height, const boo puglSetViewHint(view, PUGL_RESIZABLE, resizable ? PUGL_TRUE : PUGL_FALSE); puglSetViewHint(view, PUGL_IGNORE_KEY_REPEAT, PUGL_FALSE); -#if DGL_USE_RGBA + #if defined(DGL_USE_RGBA) && DGL_USE_RGBA puglSetViewHint(view, PUGL_DEPTH_BITS, 24); -#else + #else puglSetViewHint(view, PUGL_DEPTH_BITS, 16); -#endif + #endif puglSetViewHint(view, PUGL_STENCIL_BITS, 8); // PUGL_SAMPLES ?? puglSetEventFunc(view, puglEventCallback); // setting default size triggers system-level calls, do it last - puglSetSizeHint(view, PUGL_DEFAULT_SIZE, width, height); + puglSetSizeHint(view, PUGL_DEFAULT_SIZE, static_cast(width), static_cast(height)); } bool Window::PrivateData::initPost() @@ -388,7 +394,7 @@ void Window::PrivateData::hide() if (modal.enabled) stopModal(); -#ifndef DGL_FILE_BROWSER_DISABLED +#ifdef DGL_USE_FILE_BROWSER if (fileBrowserHandle != nullptr) { fileBrowserClose(fileBrowserHandle); @@ -429,7 +435,7 @@ void Window::PrivateData::setResizable(const bool resizable) void Window::PrivateData::idleCallback() { -#ifndef DGL_FILE_BROWSER_DISABLED +#ifdef DGL_USE_FILE_BROWSER if (fileBrowserHandle != nullptr && fileBrowserIdle(fileBrowserHandle)) { self->onFileSelected(fileBrowserGetPath(fileBrowserHandle)); @@ -471,7 +477,7 @@ bool Window::PrivateData::removeIdleCallback(IdleCallback* const callback) return puglStopTimer(view, (uintptr_t)callback) == PUGL_SUCCESS; } -#ifndef DGL_FILE_BROWSER_DISABLED +#ifdef DGL_USE_FILE_BROWSER // ----------------------------------------------------------------------- // file handling @@ -492,7 +498,7 @@ bool Window::PrivateData::openFileBrowser(const FileBrowserOptions& options) return fileBrowserHandle != nullptr; } -#endif // ! DGL_FILE_BROWSER_DISABLED +#endif // DGL_USE_FILE_BROWSER // ----------------------------------------------------------------------- // modal handling @@ -598,7 +604,7 @@ void Window::PrivateData::onPuglConfigure(const double width, const double heigh #ifndef DPF_TEST_WINDOW_CPP FOR_EACH_TOP_LEVEL_WIDGET(it) { - TopLevelWidget* const widget(*it); + TopLevelWidget* const widget = *it; /* Some special care here, we call Widget::setSize instead of the TopLevelWidget one. * This is because we want TopLevelWidget::setSize to handle both window and widget size, diff --git a/dpf/dgl/src/WindowPrivateData.hpp b/dpf/dgl/src/WindowPrivateData.hpp index d5c3cbd..0983a6d 100644 --- a/dpf/dgl/src/WindowPrivateData.hpp +++ b/dpf/dgl/src/WindowPrivateData.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -60,7 +60,10 @@ struct Window::PrivateData : IdleCallback { /** Whether this Window is embed into another (usually not DGL-controlled) Window. */ const bool isEmbed; - /** Whether to ignore resize requests and feed them into the host instead. used for VST3 */ + /** Whether to schedule repaints on the next idle call, used for AU */ + const bool usesScheduledRepaints; + + /** Whether to ignore resize requests and feed them into the host instead, used for CLAP and VST3 */ const bool usesSizeRequest; /** Scale factor to report to widgets on request, purely informational. */ @@ -87,10 +90,10 @@ struct Window::PrivateData : IdleCallback { /** Render to a picture file when non-null, automatically free+unset after saving. */ char* filenameToRenderInto; -#ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER /** Handle for file browser dialog operations. */ DGL_NAMESPACE::FileBrowserHandle fileBrowserHandle; -#endif + #endif /** Modal window setup. */ struct Modal { @@ -131,7 +134,8 @@ struct Window::PrivateData : IdleCallback { /** Constructor for an embed Window, with a few extra hints from the host side. */ explicit PrivateData(Application& app, Window* self, uintptr_t parentWindowHandle, - uint width, uint height, double scaling, bool resizable, bool isVST3); + uint width, uint height, double scaling, bool resizable, + bool usesScheduledRepaints, bool usesSizeRequest); /** Destructor. */ ~PrivateData() override; @@ -164,10 +168,10 @@ struct Window::PrivateData : IdleCallback { bool addIdleCallback(IdleCallback* callback, uint timerFrequencyInMs); bool removeIdleCallback(IdleCallback* callback); -#ifndef DGL_FILE_BROWSER_DISABLED + #ifdef DGL_USE_FILE_BROWSER // file handling bool openFileBrowser(const DGL_NAMESPACE::FileBrowserOptions& options); -#endif + #endif static void renderToPicture(const char* filename, const GraphicsContext& context, uint width, uint height); diff --git a/dpf/dgl/src/pugl-upstream/.clang-tidy b/dpf/dgl/src/pugl-upstream/.clang-tidy index 3e54543..7f81150 100644 --- a/dpf/dgl/src/pugl-upstream/.clang-tidy +++ b/dpf/dgl/src/pugl-upstream/.clang-tidy @@ -6,9 +6,11 @@ Checks: > -*-magic-numbers, -altera*, -bugprone-assignment-in-if-condition, + -bugprone-switch-missing-default-case, -clang-diagnostic-unused-function, -clang-diagnostic-unused-macros, -llvmlibc-*, + -misc-include-cleaner, -readability-identifier-length, CheckOptions: - key: hicpp-uppercase-literal-suffix.NewSuffixes diff --git a/dpf/dgl/src/pugl-upstream/include/pugl/pugl.h b/dpf/dgl/src/pugl-upstream/include/pugl/pugl.h index 39c051e..ac5f51c 100644 --- a/dpf/dgl/src/pugl-upstream/include/pugl/pugl.h +++ b/dpf/dgl/src/pugl-upstream/include/pugl/pugl.h @@ -145,7 +145,7 @@ typedef uint32_t PuglEventFlags; typedef enum { PUGL_CROSSING_NORMAL, ///< Crossing due to pointer motion PUGL_CROSSING_GRAB, ///< Crossing due to a grab - PUGL_CROSSING_UNGRAB ///< Crossing due to a grab release + PUGL_CROSSING_UNGRAB, ///< Crossing due to a grab release } PuglCrossingMode; /// Common header for all event structs @@ -342,6 +342,7 @@ typedef struct { */ typedef enum { PUGL_KEY_BACKSPACE = 0x00000008U, ///< Backspace + PUGL_KEY_TAB = 0x00000009U, ///< Tab PUGL_KEY_ENTER = 0x0000000DU, ///< Enter PUGL_KEY_ESCAPE = 0x0000001BU, ///< Escape PUGL_KEY_DELETE = 0x0000007FU, ///< Delete @@ -414,10 +415,13 @@ typedef enum { /// Keyboard modifier flags typedef enum { - PUGL_MOD_SHIFT = 1U << 0U, ///< Shift key - PUGL_MOD_CTRL = 1U << 1U, ///< Control key - PUGL_MOD_ALT = 1U << 2U, ///< Alt/Option key - PUGL_MOD_SUPER = 1U << 3U ///< Mod4/Command/Windows key + PUGL_MOD_SHIFT = 1U << 0U, ///< Shift pressed + PUGL_MOD_CTRL = 1U << 1U, ///< Control pressed + PUGL_MOD_ALT = 1U << 2U, ///< Alt/Option pressed + PUGL_MOD_SUPER = 1U << 3U, ///< Super/Command/Windows pressed + PUGL_MOD_NUM_LOCK = 1U << 4U, ///< Num lock enabled + PUGL_MOD_SCROLL_LOCK = 1U << 5U, ///< Scroll lock enabled + PUGL_MOD_CAPS_LOCK = 1U << 6U, ///< Caps lock enabled } PuglMod; /// Bitwise OR of #PuglMod values @@ -505,11 +509,11 @@ typedef struct { arbitrary scroll direction freedom, like some touchpads. */ typedef enum { - PUGL_SCROLL_UP, ///< Scroll up - PUGL_SCROLL_DOWN, ///< Scroll down - PUGL_SCROLL_LEFT, ///< Scroll left - PUGL_SCROLL_RIGHT, ///< Scroll right - PUGL_SCROLL_SMOOTH ///< Smooth scroll in any direction + PUGL_SCROLL_UP, ///< Scroll up + PUGL_SCROLL_DOWN, ///< Scroll down + PUGL_SCROLL_LEFT, ///< Scroll left + PUGL_SCROLL_RIGHT, ///< Scroll right + PUGL_SCROLL_SMOOTH, ///< Smooth scroll in any direction } PuglScrollDirection; /** @@ -763,7 +767,7 @@ typedef void* PuglWorldHandle; /// The type of a World typedef enum { PUGL_PROGRAM, ///< Top-level application - PUGL_MODULE ///< Plugin or module within a larger application + PUGL_MODULE, ///< Plugin or module within a larger application } PuglWorldType; /// World flags @@ -773,7 +777,7 @@ typedef enum { X11: Calls XInitThreads() which is required for some drivers. */ - PUGL_WORLD_THREADS = 1U << 0U + PUGL_WORLD_THREADS = 1U << 0U, } PuglWorldFlag; /// Bitwise OR of #PuglWorldFlag values @@ -1023,7 +1027,7 @@ typedef enum { If set, the view's size should be constrained to an aspect ratio no higher than this. Mutually exclusive with #PUGL_FIXED_ASPECT. */ - PUGL_MAX_ASPECT + PUGL_MAX_ASPECT, } PuglSizeHint; /// The number of #PuglSizeHint values @@ -1569,7 +1573,8 @@ puglGetClipboard(PuglView* view, uint32_t typeIndex, size_t* len); for example if compiled on X11 without Xcursor support. @return #PUGL_BAD_PARAMETER if the given cursor is invalid, - #PUGL_FAILURE if the cursor is known but loading it system fails. + #PUGL_UNSUPPORTED if setting the cursor is not supported on this system, or + another error if the cursor is known but loading it fails. */ PUGL_API PuglStatus diff --git a/dpf/dgl/src/pugl-upstream/src/common.c b/dpf/dgl/src/pugl-upstream/src/common.c index 6f1e017..46b2f3d 100644 --- a/dpf/dgl/src/pugl-upstream/src/common.c +++ b/dpf/dgl/src/pugl-upstream/src/common.c @@ -146,12 +146,20 @@ puglNewView(PuglWorld* const world) puglSetDefaultHints(view->hints); - // Add to world view list - ++world->numViews; - world->views = - (PuglView**)realloc(world->views, world->numViews * sizeof(PuglView*)); + // Enlarge world view list + const size_t newNumViews = world->numViews + 1U; + PuglView** const views = + (PuglView**)realloc(world->views, newNumViews * sizeof(PuglView*)); + + if (!views) { + free(view); + return NULL; + } - world->views[world->numViews - 1] = view; + // Add to world view list + world->views = views; + world->views[world->numViews] = view; + world->numViews = newNumViews; return view; } diff --git a/dpf/dgl/src/pugl-upstream/src/internal.c b/dpf/dgl/src/pugl-upstream/src/internal.c index ca710ce..3c4d304 100644 --- a/dpf/dgl/src/pugl-upstream/src/internal.c +++ b/dpf/dgl/src/pugl-upstream/src/internal.c @@ -132,6 +132,12 @@ puglFilterMods(const PuglMods state, const PuglKey key) case PUGL_KEY_SUPER_L: case PUGL_KEY_SUPER_R: return state & ~(PuglMods)PUGL_MOD_SUPER; + case PUGL_KEY_NUM_LOCK: + return state & ~(PuglMods)PUGL_MOD_NUM_LOCK; + case PUGL_KEY_SCROLL_LOCK: + return state & ~(PuglMods)PUGL_MOD_SCROLL_LOCK; + case PUGL_KEY_CAPS_LOCK: + return state & ~(PuglMods)PUGL_MOD_CAPS_LOCK; default: break; } diff --git a/dpf/dgl/src/pugl-upstream/src/mac.m b/dpf/dgl/src/pugl-upstream/src/mac.m index dcc2ee3..727f142 100644 --- a/dpf/dgl/src/pugl-upstream/src/mac.m +++ b/dpf/dgl/src/pugl-upstream/src/mac.m @@ -15,6 +15,7 @@ #include +#include #include #ifndef __MAC_10_10 @@ -325,11 +326,14 @@ dispatchCurrentChildViewConfiguration(PuglView* const view) return; } + const double viewY = (double)puglview->lastConfigure.height - + ((rect.origin.y + rect.size.height) * scaleFactor); + const PuglExposeEvent ev = { PUGL_EXPOSE, 0, (PuglCoord)(rect.origin.x * scaleFactor), - (PuglCoord)(rect.origin.y * scaleFactor), + (PuglCoord)viewY, (PuglSpan)(rect.size.width * scaleFactor), (PuglSpan)(rect.size.height * scaleFactor), }; @@ -371,7 +375,8 @@ getModifiers(const NSEvent* const ev) return (((modifierFlags & NSShiftKeyMask) ? PUGL_MOD_SHIFT : 0) | ((modifierFlags & NSControlKeyMask) ? PUGL_MOD_CTRL : 0) | ((modifierFlags & NSAlternateKeyMask) ? PUGL_MOD_ALT : 0) | - ((modifierFlags & NSCommandKeyMask) ? PUGL_MOD_SUPER : 0)); + ((modifierFlags & NSCommandKeyMask) ? PUGL_MOD_SUPER : 0) | + ((modifierFlags & (1U << 16U)) ? PUGL_MOD_CAPS_LOCK : 0)); } static PuglKey @@ -625,10 +630,16 @@ handleCrossing(PuglWrapperView* view, NSEvent* event, const PuglEventType type) - (void)scrollWheel:(NSEvent*)event { - const NSPoint wloc = [self eventLocation:event]; - const NSPoint rloc = [NSEvent mouseLocation]; - const double dx = -[event scrollingDeltaX]; - const double dy = [event scrollingDeltaY]; + const NSPoint wloc = [self eventLocation:event]; + const NSPoint rloc = [NSEvent mouseLocation]; + + double dx = -[event scrollingDeltaX]; + double dy = [event scrollingDeltaY]; + if (![event hasPreciseScrollingDeltas]) { + dx *= 10.0; + dy *= 10.0; + } + const PuglScrollDirection dir = ((dx == 0.0 && dy > 0.0) ? PUGL_SCROLL_UP @@ -648,7 +659,7 @@ handleCrossing(PuglWrapperView* view, NSEvent* event, const PuglEventType type) rloc.x, [[NSScreen mainScreen] frame].size.height - rloc.y, getModifiers(event), - [event hasPreciseScrollingDeltas] ? PUGL_SCROLL_SMOOTH : dir, + dir, dx, dy, }; @@ -836,32 +847,36 @@ handleCrossing(PuglWrapperView* view, NSEvent* event, const PuglEventType type) } } +static bool +flagDiffers(const uint32_t lhs, const uint32_t rhs, const uint32_t mask) +{ + return (lhs & mask) != (rhs & mask); +} + - (void)flagsChanged:(NSEvent*)event { const uint32_t mods = getModifiers(event); - PuglEventType type = PUGL_NOTHING; PuglKey special = (PuglKey)0; - if ((mods & PUGL_MOD_SHIFT) != (puglview->impl->mods & PUGL_MOD_SHIFT)) { - type = mods & PUGL_MOD_SHIFT ? PUGL_KEY_PRESS : PUGL_KEY_RELEASE; - special = PUGL_KEY_SHIFT_L; - } else if ((mods & PUGL_MOD_CTRL) != (puglview->impl->mods & PUGL_MOD_CTRL)) { - type = mods & PUGL_MOD_CTRL ? PUGL_KEY_PRESS : PUGL_KEY_RELEASE; - special = PUGL_KEY_CTRL_L; - } else if ((mods & PUGL_MOD_ALT) != (puglview->impl->mods & PUGL_MOD_ALT)) { - type = mods & PUGL_MOD_ALT ? PUGL_KEY_PRESS : PUGL_KEY_RELEASE; - special = PUGL_KEY_ALT_L; - } else if ((mods & PUGL_MOD_SUPER) != - (puglview->impl->mods & PUGL_MOD_SUPER)) { - type = mods & PUGL_MOD_SUPER ? PUGL_KEY_PRESS : PUGL_KEY_RELEASE; - special = PUGL_KEY_SUPER_L; + const uint16_t keyCode = [event keyCode]; + if (flagDiffers(mods, puglview->impl->mods, PUGL_MOD_SHIFT)) { + special = (keyCode == 0x3C) ? PUGL_KEY_SHIFT_R : PUGL_KEY_SHIFT_L; + } else if (flagDiffers(mods, puglview->impl->mods, PUGL_MOD_CTRL)) { + special = (keyCode == 0x3E) ? PUGL_KEY_CTRL_R : PUGL_KEY_CTRL_L; + } else if (flagDiffers(mods, puglview->impl->mods, PUGL_MOD_ALT)) { + special = (keyCode == 0x3D) ? PUGL_KEY_ALT_R : PUGL_KEY_ALT_L; + } else if (flagDiffers(mods, puglview->impl->mods, PUGL_MOD_SUPER)) { + special = PUGL_KEY_SUPER_L; // Left and right command are identical + } else if (flagDiffers(mods, puglview->impl->mods, PUGL_MOD_CAPS_LOCK)) { + special = PUGL_KEY_CAPS_LOCK; } if (special != 0) { - const NSPoint wloc = [self eventLocation:event]; - const NSPoint rloc = [NSEvent mouseLocation]; + const NSPoint wloc = [self eventLocation:event]; + const NSPoint rloc = [NSEvent mouseLocation]; + const bool release = [event type] == NSEventTypeKeyUp; - const PuglKeyEvent ev = {type, + const PuglKeyEvent ev = {release ? PUGL_KEY_RELEASE : PUGL_KEY_PRESS, 0, [event timestamp], wloc.x, diff --git a/dpf/dgl/src/pugl-upstream/src/mac_cairo.m b/dpf/dgl/src/pugl-upstream/src/mac_cairo.m index 54160b9..e4d2f5f 100644 --- a/dpf/dgl/src/pugl-upstream/src/mac_cairo.m +++ b/dpf/dgl/src/pugl-upstream/src/mac_cairo.m @@ -93,10 +93,8 @@ puglMacCairoEnter(PuglView* view, const PuglExposeEvent* expose) const CGSize sizePx = {(CGFloat)view->lastConfigure.width, (CGFloat)view->lastConfigure.height}; - const CGSize sizePt = CGContextConvertSizeToUserSpace(context, sizePx); - // Convert coordinates to standard Cairo space - CGContextTranslateCTM(context, 0.0, sizePt.height); + CGContextTranslateCTM(context, 0.0, sizePx.height * scale); CGContextScaleCTM(context, scale, -scale); drawView->surface = cairo_quartz_surface_create_for_cg_context( diff --git a/dpf/dgl/src/pugl-upstream/src/win.c b/dpf/dgl/src/pugl-upstream/src/win.c index 3d245f2..73c8583 100644 --- a/dpf/dgl/src/pugl-upstream/src/win.c +++ b/dpf/dgl/src/pugl-upstream/src/win.c @@ -94,6 +94,12 @@ puglWinStatus(const BOOL success) static bool puglRegisterWindowClass(const char* name) { +#ifdef UNICODE + wchar_t* const wname = puglUtf8ToWideChar(name); +#else + const char* const wname = name; +#endif + HMODULE module = NULL; if (!GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, @@ -103,7 +109,7 @@ puglRegisterWindowClass(const char* name) } WNDCLASSEX wc = PUGL_INIT_STRUCT; - if (GetClassInfoEx(module, name, &wc)) { + if (GetClassInfoEx(module, wname, &wc)) { return true; // Already registered } @@ -114,9 +120,13 @@ puglRegisterWindowClass(const char* name) wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); - wc.lpszClassName = name; + wc.lpszClassName = wname; - return !!RegisterClassEx(&wc); + const bool success = !!RegisterClassEx(&wc); +#ifdef UNICODE + free(wname); +#endif + return success; } static unsigned @@ -174,7 +184,7 @@ static double puglWinGetViewScaleFactor(const PuglView* const view) { const HMODULE shcore = - LoadLibraryEx("Shcore.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); + LoadLibraryExA("Shcore.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); if (!shcore) { return 1.0; } @@ -209,7 +219,7 @@ puglInitWorldInternals(PuglWorldType type, PuglWorldFlags PUGL_UNUSED(flags)) if (type == PUGL_PROGRAM) { HMODULE user32 = - LoadLibraryEx("user32.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); + LoadLibraryExA("user32.dll", NULL, LOAD_LIBRARY_SEARCH_SYSTEM32); if (user32) { PFN_SetProcessDPIAware SetProcessDPIAware = (PFN_SetProcessDPIAware)GetProcAddress(user32, "SetProcessDPIAware"); @@ -398,7 +408,14 @@ puglFreeViewInternals(PuglView* view) void puglFreeWorldInternals(PuglWorld* world) { +#ifdef UNICODE + wchar_t* const wname = puglUtf8ToWideChar(world->strings[PUGL_CLASS_NAME]); + UnregisterClass(wname, NULL); + free(wname); +#else UnregisterClass(world->strings[PUGL_CLASS_NAME], NULL); +#endif + free(world->impl); } @@ -472,11 +489,15 @@ static uint32_t getModifiers(void) { // clang-format off - return (((GetKeyState(VK_SHIFT) < 0) ? (uint32_t)PUGL_MOD_SHIFT : 0U) | - ((GetKeyState(VK_CONTROL) < 0) ? (uint32_t)PUGL_MOD_CTRL : 0U) | - ((GetKeyState(VK_MENU) < 0) ? (uint32_t)PUGL_MOD_ALT : 0U) | - ((GetKeyState(VK_LWIN) < 0) ? (uint32_t)PUGL_MOD_SUPER : 0U) | - ((GetKeyState(VK_RWIN) < 0) ? (uint32_t)PUGL_MOD_SUPER : 0U)); + return ( + ((GetKeyState(VK_SHIFT) < 0) ? (uint32_t)PUGL_MOD_SHIFT : 0U) | + ((GetKeyState(VK_CONTROL) < 0) ? (uint32_t)PUGL_MOD_CTRL : 0U) | + ((GetKeyState(VK_MENU) < 0) ? (uint32_t)PUGL_MOD_ALT : 0U) | + ((GetKeyState(VK_LWIN) < 0) ? (uint32_t)PUGL_MOD_SUPER : 0U) | + ((GetKeyState(VK_RWIN) < 0) ? (uint32_t)PUGL_MOD_SUPER : 0U) | + ((GetKeyState(VK_NUMLOCK) & 1U) ? (uint32_t)PUGL_MOD_NUM_LOCK : 0U) | + ((GetKeyState(VK_SCROLL) & 1U) ? (uint32_t)PUGL_MOD_SCROLL_LOCK : 0U) | + ((GetKeyState(VK_CAPITAL) & 1U) ? (uint32_t)PUGL_MOD_CAPS_LOCK : 0U)); // clang-format on } @@ -1477,7 +1498,7 @@ puglPaste(PuglView* const view) return PUGL_SUCCESS; } -static const char* const cursor_ids[] = { +static const TCHAR* const cursor_ids[] = { IDC_ARROW, // ARROW IDC_IBEAM, // CARET IDC_CROSS, // CROSSHAIR @@ -1602,18 +1623,18 @@ puglWinCreateWindow(PuglView* const view, AdjustWindowRectEx(&wr, winFlags, FALSE, winExFlags); // Create window and get drawing context - if (!(*hwnd = CreateWindowEx(winExFlags, - className, - title, - winFlags, - wr.left, - wr.right, - wr.right - wr.left, - wr.bottom - wr.top, - (HWND)parent, - NULL, - NULL, - NULL))) { + if (!(*hwnd = CreateWindowExA(winExFlags, + className, + title, + winFlags, + wr.left, + wr.right, + wr.right - wr.left, + wr.bottom - wr.top, + (HWND)parent, + NULL, + NULL, + NULL))) { return PUGL_REALIZE_FAILED; } diff --git a/dpf/dgl/src/pugl-upstream/src/win_gl.c b/dpf/dgl/src/pugl-upstream/src/win_gl.c index f707fc6..01321d4 100644 --- a/dpf/dgl/src/pugl-upstream/src/win_gl.c +++ b/dpf/dgl/src/pugl-upstream/src/win_gl.c @@ -288,7 +288,7 @@ puglGetProcAddress(const char* name) return func ? func - : (PuglGlFunc)GetProcAddress(GetModuleHandle("opengl32.dll"), name); + : (PuglGlFunc)GetProcAddress(GetModuleHandleA("opengl32.dll"), name); } PuglStatus diff --git a/dpf/dgl/src/pugl-upstream/src/win_vulkan.c b/dpf/dgl/src/pugl-upstream/src/win_vulkan.c index 6d7c632..2927447 100644 --- a/dpf/dgl/src/pugl-upstream/src/win_vulkan.c +++ b/dpf/dgl/src/pugl-upstream/src/win_vulkan.c @@ -32,7 +32,7 @@ puglNewVulkanLoader(PuglWorld* PUGL_UNUSED(world), const char* const filename = libraryName ? libraryName : "vulkan-1.dll"; if (!(loader->libvulkan = - LoadLibraryEx(filename, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS))) { + LoadLibraryExA(filename, NULL, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS))) { free(loader); return NULL; } diff --git a/dpf/dgl/src/pugl-upstream/src/x11.c b/dpf/dgl/src/pugl-upstream/src/x11.c index 2de7d1c..217838f 100644 --- a/dpf/dgl/src/pugl-upstream/src/x11.c +++ b/dpf/dgl/src/pugl-upstream/src/x11.c @@ -416,8 +416,9 @@ updateSizeHints(const PuglView* const view) sizeHints.max_width = (int)frame.width; sizeHints.max_height = (int)frame.height; } else { + // Avoid setting PBaseSize for top level views to avoid window manager bugs const PuglViewSize defaultSize = view->sizeHints[PUGL_DEFAULT_SIZE]; - if (puglIsValidSize(defaultSize)) { + if (puglIsValidSize(defaultSize) && view->parent) { sizeHints.flags |= PBaseSize; sizeHints.base_width = defaultSize.width; sizeHints.base_height = defaultSize.height; @@ -881,7 +882,8 @@ translateKey(PuglView* const view, XEvent* const xevent, PuglEvent* const event) event->key.keycode = xevent->xkey.keycode; // Mask off the control and shift bits to get the lowercase "main" symbol - xevent->xkey.state = xevent->xkey.state & ~(unsigned)(ControlMask|ShiftMask); + xevent->xkey.state = + xevent->xkey.state & ~(unsigned)(ControlMask | ShiftMask); // Lookup unshifted key char ustr[8] = PUGL_INIT_STRUCT; @@ -919,7 +921,10 @@ translateModifiers(const unsigned xstate) return (((xstate & ShiftMask) ? (uint32_t)PUGL_MOD_SHIFT : 0U) | ((xstate & ControlMask) ? (uint32_t)PUGL_MOD_CTRL : 0U) | ((xstate & Mod1Mask) ? (uint32_t)PUGL_MOD_ALT : 0U) | - ((xstate & Mod4Mask) ? (uint32_t)PUGL_MOD_SUPER : 0U)); + ((xstate & Mod4Mask) ? (uint32_t)PUGL_MOD_SUPER : 0U) | + ((xstate & Mod2Mask) ? (uint32_t)PUGL_MOD_NUM_LOCK : 0U) | + ((xstate & Mod3Mask) ? (uint32_t)PUGL_MOD_SCROLL_LOCK : 0U) | + ((xstate & LockMask) ? (uint32_t)PUGL_MOD_CAPS_LOCK : 0U)); } static PuglStatus @@ -957,28 +962,37 @@ getX11SelectionClipboard(PuglView* const view, const Atom selection) : NULL; } -static void +static PuglStatus setClipboardFormats(PuglView* const view, PuglX11Clipboard* const board, const unsigned long numFormats, const Atom* const formats) { - Atom* const newFormats = - (Atom*)realloc(board->formats, numFormats * sizeof(Atom)); - if (!newFormats) { - return; - } - + // Clear current board formats for (unsigned long i = 0; i < board->numFormats; ++i) { free(board->formatStrings[i]); board->formatStrings[i] = NULL; } - board->formats = newFormats; board->numFormats = 0; - board->formatStrings = + // Enlarge formats array + Atom* const newFormats = + (Atom*)realloc(board->formats, numFormats * sizeof(Atom)); + if (!newFormats) { + return PUGL_NO_MEMORY; + } + + board->formats = newFormats; + + // Enlarge format strings array + char** const newFormatStrings = (char**)realloc(board->formatStrings, numFormats * sizeof(char*)); + if (!newFormatStrings) { + return PUGL_NO_MEMORY; + } + + board->formatStrings = newFormatStrings; for (unsigned long i = 0; i < numFormats; ++i) { if (formats[i]) { @@ -1005,6 +1019,8 @@ setClipboardFormats(PuglView* const view, XFree(name); } } + + return PUGL_SUCCESS; } static PuglEvent @@ -1390,10 +1406,13 @@ puglStartTimer(PuglView* const view, const uintptr_t id, const double timeout) } // Add new timer - const size_t size = ++w->numTimers * sizeof(timer); - w->timers = (PuglTimer*)realloc(w->timers, size); - w->timers[w->numTimers - 1] = timer; - return PUGL_SUCCESS; + const size_t size = ++w->numTimers * sizeof(timer); + PuglTimer* const newTimers = (PuglTimer*)realloc(w->timers, size); + if (newTimers) { + w->timers = newTimers; + w->timers[w->numTimers - 1] = timer; + return PUGL_SUCCESS; + } } } #else @@ -1583,7 +1602,7 @@ retrieveSelection(const PuglWorld* const world, return PUGL_SUCCESS; } -static void +static PuglStatus handleSelectionNotify(const PuglWorld* const world, PuglView* const view, const XSelectionEvent* const event) @@ -1600,9 +1619,8 @@ handleSelectionNotify(const PuglWorld* const world, unsigned long numFormats = 0; Atom* formats = NULL; if (!getAtomProperty( - view, event->requestor, event->property, &numFormats, &formats)) { - setClipboardFormats(view, board, numFormats, formats); - + view, event->requestor, event->property, &numFormats, &formats) && + !setClipboardFormats(view, board, numFormats, formats)) { const PuglDataOfferEvent offer = { PUGL_DATA_OFFER, 0, (double)event->time / 1e3}; @@ -1628,7 +1646,7 @@ handleSelectionNotify(const PuglWorld* const world, } } - puglDispatchEvent(view, &puglEvent); + return puglDispatchEvent(view, &puglEvent); } static PuglStatus @@ -1754,8 +1772,7 @@ handleTimerEvent(PuglWorld* const world, const XEvent xevent) static PuglStatus dispatchX11Events(PuglWorld* const world) { - PuglStatus st0 = PUGL_SUCCESS; - PuglStatus st1 = PUGL_SUCCESS; + PuglStatus st = PUGL_SUCCESS; // Flush output to the server once at the start Display* display = world->impl->display; @@ -1791,9 +1808,13 @@ dispatchX11Events(PuglWorld* const world) clearX11Clipboard(board); } } else if (xevent.type == SelectionNotify) { - handleSelectionNotify(world, view, &xevent.xselection); + st = handleSelectionNotify(world, view, &xevent.xselection); } else if (xevent.type == SelectionRequest) { - handleSelectionRequest(world, view, &xevent.xselectionrequest); + st = handleSelectionRequest(world, view, &xevent.xselectionrequest); + } + + if (st) { + break; } // Translate X11 event to Pugl event @@ -1822,12 +1843,12 @@ dispatchX11Events(PuglWorld* const world) break; default: // Dispatch event to application immediately - st0 = puglDispatchEvent(view, &event); + st = puglDispatchEvent(view, &event); break; } } - return st0 ? st0 : st1; + return st; } #ifndef PUGL_DISABLE_DEPRECATED @@ -2042,7 +2063,7 @@ puglSetTransientParent(PuglView* const view, const PuglNativeView parent) view->transientParent = parent; - if (view->impl->win) { + if (view->impl->win && view->transientParent) { XSetTransientForHint( display, view->impl->win, (Window)view->transientParent); } @@ -2138,12 +2159,12 @@ puglSetClipboard(PuglView* const view, PuglInternals* const impl = view->impl; Display* const display = view->world->impl->display; PuglX11Clipboard* const board = &view->impl->clipboard; - const PuglStatus st = puglSetBlob(&board->data, data, len); + PuglStatus st = puglSetBlob(&board->data, data, len); if (!st) { const Atom format = {XInternAtom(display, type, 0)}; - setClipboardFormats(view, board, 1, &format); + st = setClipboardFormats(view, board, 1, &format); XSetSelectionOwner(display, board->selection, impl->win, CurrentTime); board->source = impl->win; @@ -2174,7 +2195,7 @@ puglSetCursor(PuglView* const view, const PuglCursor cursor) #else (void)view; (void)cursor; - return PUGL_FAILURE; + return PUGL_UNSUPPORTED; #endif } diff --git a/dpf/dgl/src/pugl.cpp b/dpf/dgl/src/pugl.cpp index bd21f15..4acb533 100644 --- a/dpf/dgl/src/pugl.cpp +++ b/dpf/dgl/src/pugl.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -138,15 +138,18 @@ START_NAMESPACE_DGL # endif #elif defined(DISTRHO_OS_MAC) # ifndef DISTRHO_MACOS_NAMESPACE_MACRO -# define DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, SEP, INTERFACE) NS ## SEP ## INTERFACE -# define DISTRHO_MACOS_NAMESPACE_MACRO(NS, INTERFACE) DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, _, INTERFACE) -# define PuglCairoView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PuglCairoView) -# define PuglOpenGLView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PuglOpenGLView) -# define PuglStubView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PuglStubView) -# define PuglVulkanView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PuglVulkanView) -# define PuglWindow DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PuglWindow) -# define PuglWindowDelegate DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PuglWindowDelegate) -# define PuglWrapperView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, PuglWrapperView) +# ifndef DISTRHO_MACOS_NAMESPACE_TIME +# define DISTRHO_MACOS_NAMESPACE_TIME __apple_build_version__ +# endif +# define DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, SEP, TIME, INTERFACE) NS ## SEP ## TIME ## SEP ## INTERFACE +# define DISTRHO_MACOS_NAMESPACE_MACRO(NS, TIME, INTERFACE) DISTRHO_MACOS_NAMESPACE_MACRO_HELPER(NS, _, TIME, INTERFACE) +# define PuglCairoView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, DISTRHO_MACOS_NAMESPACE_TIME, PuglCairoView) +# define PuglOpenGLView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, DISTRHO_MACOS_NAMESPACE_TIME, PuglOpenGLView) +# define PuglStubView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, DISTRHO_MACOS_NAMESPACE_TIME, PuglStubView) +# define PuglVulkanView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, DISTRHO_MACOS_NAMESPACE_TIME, PuglVulkanView) +# define PuglWindow DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, DISTRHO_MACOS_NAMESPACE_TIME, PuglWindow) +# define PuglWindowDelegate DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, DISTRHO_MACOS_NAMESPACE_TIME, PuglWindowDelegate) +# define PuglWrapperView DISTRHO_MACOS_NAMESPACE_MACRO(DGL_NAMESPACE, DISTRHO_MACOS_NAMESPACE_TIME, PuglWrapperView) # endif # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wdeprecated-declarations" @@ -181,7 +184,14 @@ START_NAMESPACE_DGL # include "pugl-upstream/src/win_vulkan.c" # endif #elif defined(HAVE_X11) +# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wsign-conversion" +# endif # include "pugl-upstream/src/x11.c" +# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +# endif # include "pugl-upstream/src/x11_stub.c" # ifdef DGL_CAIRO # include "pugl-upstream/src/x11_cairo.c" @@ -277,13 +287,13 @@ void puglRaiseWindow(PuglView* const view) PuglStatus puglSetGeometryConstraints(PuglView* const view, const uint width, const uint height, const bool aspect) { - view->sizeHints[PUGL_MIN_SIZE].width = width; - view->sizeHints[PUGL_MIN_SIZE].height = height; + view->sizeHints[PUGL_MIN_SIZE].width = static_cast(width); + view->sizeHints[PUGL_MIN_SIZE].height = static_cast(height); if (aspect) { - view->sizeHints[PUGL_FIXED_ASPECT].width = width; - view->sizeHints[PUGL_FIXED_ASPECT].height = height; + view->sizeHints[PUGL_FIXED_ASPECT].width = static_cast(width); + view->sizeHints[PUGL_FIXED_ASPECT].height = static_cast(height); } #if defined(DISTRHO_OS_HAIKU) @@ -353,7 +363,7 @@ PuglStatus puglSetSizeAndDefault(PuglView* view, uint width, uint height) #ifdef DGL_USING_X11 // workaround issues in fluxbox, see https://github.com/lv2/pugl/issues/118 - if (view->impl->win) + if (view->impl->win && !view->parent && !view->transientParent) { view->sizeHints[PUGL_DEFAULT_SIZE].width = view->sizeHints[PUGL_DEFAULT_SIZE].height = 0; } @@ -397,9 +407,16 @@ PuglStatus puglSetSizeAndDefault(PuglView* view, uint width, uint height) if (const PuglStatus status = puglSetSize(view, width, height)) return status; - // handle new PUGL_DEFAULT_SIZE hint - if (const PuglStatus status = updateSizeHints(view)) - return status; + // updateSizeHints will use last known size, which is not yet updated + const PuglSpan lastWidth = view->lastConfigure.width; + const PuglSpan lastHeight = view->lastConfigure.height; + view->lastConfigure.width = static_cast(width); + view->lastConfigure.height = static_cast(height); + + updateSizeHints(view); + + view->lastConfigure.width = lastWidth; + view->lastConfigure.height = lastHeight; // flush size changes XFlush(view->world->impl->display); diff --git a/dpf/distrho/DistrhoDetails.hpp b/dpf/distrho/DistrhoDetails.hpp index 53c7127..f72608f 100644 --- a/dpf/distrho/DistrhoDetails.hpp +++ b/dpf/distrho/DistrhoDetails.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -511,15 +511,6 @@ struct ParameterEnumerationValue { ParameterEnumerationValue(float v, const char* l) noexcept : value(v), label(l) {} - -#if __cplusplus >= 201703L - /** - Constructor using custom values, constexpr compatible variant. - */ - constexpr ParameterEnumerationValue(float v, const std::string_view& l) noexcept - : value(v), - label(l) {} -#endif }; /** @@ -566,7 +557,7 @@ struct ParameterEnumerationValues { When using this constructor the pointer to @values MUST have been statically declared.@n It will not be automatically deleted later. */ - constexpr ParameterEnumerationValues(uint32_t c, bool r, ParameterEnumerationValue* v) noexcept + constexpr ParameterEnumerationValues(uint8_t c, bool r, ParameterEnumerationValue* v) noexcept : count(c), restrictedMode(r), values(v), @@ -578,6 +569,8 @@ struct ParameterEnumerationValues { if (deleteLater) delete[] values; } + + DISTRHO_DECLARE_NON_COPYABLE(ParameterEnumerationValues) }; /** @@ -669,6 +662,7 @@ struct Parameter { shortName(), symbol(), unit(), + description(), ranges(), enumValues(), designation(kParameterDesignationNull), @@ -684,6 +678,7 @@ struct Parameter { shortName(), symbol(s), unit(u), + description(), ranges(def, min, max), enumValues(), designation(kParameterDesignationNull), @@ -702,6 +697,7 @@ struct Parameter { shortName(), symbol(s), unit(u), + description(), ranges(def, min, max), enumValues(evcount, true, ev), designation(kParameterDesignationNull), @@ -709,29 +705,6 @@ struct Parameter { groupId(kPortGroupNone) {} #endif -#if __cplusplus >= 201703L - /** - Constructor for constexpr compatible data. - */ - constexpr Parameter(uint32_t h, - const std::string_view& n, - const std::string_view& sn, - const std::string_view& sym, - const std::string_view& u, - const std::string_view& desc) noexcept - : hints(h), - name(n), - shortName(sn), - symbol(sym), - unit(u), - description(desc), - ranges(), - enumValues(), - designation(kParameterDesignationNull), - midiCC(0), - groupId(kPortGroupNone) {} -#endif - /** Initialize a parameter for a specific designation. */ @@ -757,17 +730,57 @@ struct Parameter { break; } } -}; -#if __cplusplus >= 202001L /* TODO */ -/** - Bypass parameter definition in constexpr form. - */ -static constexpr const Parameter kParameterBypass = { - kParameterIsAutomatable|kParameterIsBoolean|kParameterIsInteger, - "Bypass", "Bypass", ParameterDesignationSymbols::bypass, "", "", {}, {}, 0, kPortGroupNone, + Parameter& operator=(Parameter& other) noexcept + { + hints = other.hints; + name = other.name; + shortName = other.shortName; + symbol = other.symbol; + unit = other.unit; + description = other.description; + ranges = other.ranges; + designation = other.designation; + midiCC = other.midiCC; + groupId = other.groupId; + + // enumValues needs special handling + enumValues.count = other.enumValues.count; + enumValues.restrictedMode = other.enumValues.restrictedMode; + enumValues.values = other.enumValues.values; + enumValues.deleteLater = other.enumValues.deleteLater; + + // make sure to not delete data twice + other.enumValues.deleteLater = false; + + return *this; + } + + Parameter& operator=(const Parameter& other) noexcept + { + hints = other.hints; + name = other.name; + shortName = other.shortName; + symbol = other.symbol; + unit = other.unit; + description = other.description; + ranges = other.ranges; + designation = other.designation; + midiCC = other.midiCC; + groupId = other.groupId; + + // make sure to not delete data twice + DISTRHO_SAFE_ASSERT_RETURN(other.enumValues.values == nullptr || !other.enumValues.deleteLater, *this); + + // enumValues needs special handling + enumValues.count = other.enumValues.count; + enumValues.restrictedMode = other.enumValues.restrictedMode; + enumValues.values = other.enumValues.values; + enumValues.deleteLater = other.enumValues.deleteLater; + + return *this; + } }; -#endif /** Port Group.@n diff --git a/dpf/distrho/DistrhoInfo.hpp b/dpf/distrho/DistrhoInfo.hpp index 050cbd3..7df2003 100644 --- a/dpf/distrho/DistrhoInfo.hpp +++ b/dpf/distrho/DistrhoInfo.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -603,6 +603,12 @@ START_NAMESPACE_DISTRHO */ #define DISTRHO_PLUGIN_WANT_TIMEPOS 1 +/** + Whether the %UI uses Cairo for drawing instead of the default OpenGL mode.@n + When enabled your %UI instance will subclass @ref CairoTopLevelWidget instead of @ref TopLevelWidget. + */ +#define DISTRHO_UI_USE_CAIRO 1 + /** Whether the %UI uses a custom toolkit implementation based on OpenGL.@n When enabled, the macros @ref DISTRHO_UI_CUSTOM_INCLUDE_PATH and @ref DISTRHO_UI_CUSTOM_WIDGET_TYPE are required. @@ -616,6 +622,12 @@ START_NAMESPACE_DISTRHO */ #define DISTRHO_UI_CUSTOM_INCLUDE_PATH +/** + Whether the %UI uses NanoVG for drawing instead of the default raw OpenGL mode.@n + When enabled your %UI instance will subclass @ref NanoTopLevelWidget instead of @ref TopLevelWidget. + */ +#define DISTRHO_UI_USE_NANOVG 1 + /** The top-level-widget typedef to use for the custom toolkit. This widget class MUST be a subclass of DGL TopLevelWindow class. @@ -648,25 +660,54 @@ START_NAMESPACE_DISTRHO #define DISTRHO_UI_DEFAULT_HEIGHT 300 /** - Whether the %UI uses NanoVG for drawing instead of the default raw OpenGL calls.@n - When enabled your %UI instance will subclass @ref NanoWidget instead of @ref Widget. - */ -#define DISTRHO_UI_USE_NANOVG 1 - -/** - Whether the %UI is resizable to any size by the user.@n - By default this is false, and resizing is only allowed under the plugin UI control,@n + Whether the %UI is resizable to any size by the user and OS.@n + By default this is false, with resizing only allowed when coded from the the plugin UI side.@n Enabling this options makes it possible for the user to resize the plugin UI at anytime. @see UI::setGeometryConstraints(uint, uint, bool, bool) */ #define DISTRHO_UI_USER_RESIZABLE 1 +/** + Whether to %UI is going to use file browser dialogs.@n + By default this is false, with the file browser APIs not available for use. + */ +#define DISTRHO_UI_FILE_BROWSER 1 + +/** + Whether to %UI is going to use web browser views.@n + By default this is false, with the web browser APIs not available for use. + */ +#define DISTRHO_UI_WEB_VIEW 1 + /** The %UI URI when exporting in LV2 format.@n By default this is set to @ref DISTRHO_PLUGIN_URI with "#UI" as suffix. */ #define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" +/** + The AudioUnit type for a plugin.@n + This is a 4-character symbol, automatically set by DPF based on other plugin macros. + See https://developer.apple.com/documentation/audiotoolbox/1584142-audio_unit_types for more information. + */ +#define DISTRHO_PLUGIN_AU_TYPE aufx + +/** + A 4-character symbol that identifies a brand or manufacturer, with at least one non-lower case character.@n + Plugins from the same brand should use the same symbol. + @note This macro is required when building AU plugins, and used for VST3 if present + @note Setting this macro will change the uid of a VST3 plugin. + If you already released a DPF-based VST3 plugin make sure to also enable DPF_VST3_DONT_USE_BRAND_ID + */ +#define DISTRHO_PLUGIN_BRAND_ID Dstr + +/** + A 4-character symbol which identifies a plugin.@n + It must be unique within at least a set of plugins from the brand. + @note This macro is required when building AU plugins + */ +#define DISTRHO_PLUGIN_UNIQUE_ID test + /** Custom LV2 category for the plugin.@n This is a single string, and can be one of the following values: @@ -842,7 +883,7 @@ START_NAMESPACE_DISTRHO /** Whether to enable runtime plugin tests.@n This will check, during initialization of the plugin, if parameters, programs and states are setup properly.@n - Useful to enable as part of CI, can safely be skipped.@n + Useful to enable as part of CI, can be safely skipped.@n Under DPF makefiles this can be enabled by using `make DPF_RUNTIME_TESTING=true`. @note Some checks are only available with the GCC compiler, @@ -857,10 +898,10 @@ START_NAMESPACE_DISTRHO #define DPF_VST_SHOW_PARAMETER_OUTPUTS /** - Disable all file browser related code.@n - Must be set as compiler macro when building DGL. (e.g. `CXXFLAGS="-DDGL_FILE_BROWSER_DISABLED"`) + Forcibly ignore DISTRHO_PLUGIN_BRAND_ID for VST3 plugins.@n + This is required for DPF-based VST3 plugins that got released without setting DISTRHO_PLUGIN_BRAND_ID first. */ -#define DGL_FILE_BROWSER_DISABLED +#define DPF_VST3_DONT_USE_BRAND_ID /** Disable resource files, like internally used fonts.@n @@ -868,14 +909,6 @@ START_NAMESPACE_DISTRHO */ #define DGL_NO_SHARED_RESOURCES -/** - Whether to use OpenGL3 instead of the default OpenGL2 compatility profile. - Under DPF makefiles this can be enabled by using `make USE_OPENGL3=true` on the dgl build step. - - @note This is experimental and incomplete, contributions are welcome and appreciated. - */ -#define DGL_USE_OPENGL3 - /** @} */ /* ------------------------------------------------------------------------------------------------------------ diff --git a/dpf/distrho/DistrhoPlugin.hpp b/dpf/distrho/DistrhoPlugin.hpp index 1a51db2..8570f9e 100644 --- a/dpf/distrho/DistrhoPlugin.hpp +++ b/dpf/distrho/DistrhoPlugin.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -189,30 +189,65 @@ protected: Get the plugin label.@n This label is a short restricted name consisting of only _, a-z, A-Z and 0-9 characters. */ + #ifdef DISTRHO_PLUGIN_LABEL + virtual const char* getLabel() const + { + return DISTRHO_PLUGIN_LABEL; + } + #else virtual const char* getLabel() const = 0; + #endif /** Get an extensive comment/description about the plugin.@n Optional, returns nothing by default. */ - virtual const char* getDescription() const { return ""; } + virtual const char* getDescription() const + { + #ifdef DISTRHO_PLUGIN_DESCRIPTION + return DISTRHO_PLUGIN_DESCRIPTION; + #else + return ""; + #endif + } /** Get the plugin author/maker. */ + #ifdef DISTRHO_PLUGIN_MAKER + virtual const char* getMaker() const + { + return DISTRHO_PLUGIN_MAKER; + } + #else virtual const char* getMaker() const = 0; + #endif /** Get the plugin homepage.@n Optional, returns nothing by default. */ - virtual const char* getHomePage() const { return ""; } + virtual const char* getHomePage() const + { + #ifdef DISTRHO_PLUGIN_HOMEPAGE + return DISTRHO_PLUGIN_HOMEPAGE; + #else + return ""; + #endif + } /** Get the plugin license (a single line of text or a URL).@n For commercial plugins this should return some short copyright information. */ + #ifdef DISTRHO_PLUGIN_LICENSE + virtual const char* getLicense() const + { + return DISTRHO_PLUGIN_LICENSE; + } + #else virtual const char* getLicense() const = 0; + #endif /** Get the plugin version, in hexadecimal. @@ -222,10 +257,19 @@ protected: /** Get the plugin unique Id.@n - This value is used by LADSPA, DSSI, VST2 and VST3 plugin formats. + This value is used by LADSPA, DSSI, VST2, VST3 and AUv2 plugin formats.@n + @note It is preferred that you set DISTRHO_PLUGIN_UNIQUE_ID macro instead of overriding this call, + as that is required for AUv2 plugins anyhow. @see d_cconst() */ + #ifdef DISTRHO_PLUGIN_UNIQUE_ID + virtual int64_t getUniqueId() const + { + return d_cconst(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)); + } + #else virtual int64_t getUniqueId() const = 0; + #endif /* -------------------------------------------------------------------------------------------------------- * Init */ @@ -364,6 +408,14 @@ protected: */ virtual void sampleRateChanged(double newSampleRate); + /** + Optional callback to inform the plugin about audio port IO changes.@n + This function will only be called when the plugin is deactivated.@n + Only used in AU (AudioUnit) format when DISTRHO_PLUGIN_EXTRA_IO is defined. + @see DISTRHO_PLUGIN_EXTRA_IO + */ + virtual void ioChanged(uint16_t numInputs, uint16_t numOutputs); + // ------------------------------------------------------------------------------------------------------- private: diff --git a/dpf/distrho/DistrhoPluginInfo.h.template b/dpf/distrho/DistrhoPluginInfo.h.template new file mode 100644 index 0000000..127b627 --- /dev/null +++ b/dpf/distrho/DistrhoPluginInfo.h.template @@ -0,0 +1,392 @@ +#pragma once + +/** + This file contains C Macros that describe this plugin. + With these macros we can tell the host what features the plugin requires. + New functions will be available to call and/or override depending on which macros are enabled. + + All values are either integer or strings. + For boolean-like values 1 means 'on' and 0 means 'off'. + */ + +/** + The plugin name. + This is used to identify your plugin before a Plugin instance can be created. + @note This macro is required. + */ +#define DISTRHO_PLUGIN_NAME "Plugin Name" + +/** + Number of audio inputs the plugin has. + @note This macro is required. + */ +#define DISTRHO_PLUGIN_NUM_INPUTS 2 + +/** + Number of audio outputs the plugin has. + @note This macro is required. + */ +#define DISTRHO_PLUGIN_NUM_OUTPUTS 2 + +/** + The plugin URI when exporting in LV2 format. + TODO describe what a URI is + @note This macro is required. + */ +#define DISTRHO_PLUGIN_URI "urn:distrho:name" + +/** + Whether the plugin has a custom UI. + */ +// #define DISTRHO_PLUGIN_HAS_UI 0 + +/** + Whether the plugin processing is realtime-safe. + TODO - list rtsafe requirements + */ +// #define DISTRHO_PLUGIN_IS_RT_SAFE 0 + +/** + Whether the plugin is a synth. + @ref DISTRHO_PLUGIN_WANT_MIDI_INPUT is automatically enabled when this is too. + @see DISTRHO_PLUGIN_WANT_MIDI_INPUT + */ +// #define DISTRHO_PLUGIN_IS_SYNTH 0 + +/** + Request the minimum buffer size for the input and output event ports. + Currently only used in LV2, with a default value of 2048 if unset. + */ +// #define DISTRHO_PLUGIN_MINIMUM_BUFFER_SIZE 2048 + +/** + Whether the plugin has an LV2 modgui. + + This will simply add a "rdfs:seeAlso " on the LV2 manifest. + It is up to you to create this file. + */ +// #define DISTRHO_PLUGIN_USES_MODGUI 0 + +/** + Enable direct access between the UI and plugin code. + @see UI::getPluginInstancePointer() + @note DO NOT USE THIS UNLESS STRICTLY NECESSARY!! + Try to avoid it at all costs! + */ +// #define DISTRHO_PLUGIN_WANT_DIRECT_ACCESS 0 + +/** + Whether the plugin introduces latency during audio or midi processing. + @see Plugin::setLatency(uint32_t) + */ +// #define DISTRHO_PLUGIN_WANT_LATENCY 0 + +/** + Whether the plugin wants MIDI input. + This is automatically enabled if @ref DISTRHO_PLUGIN_IS_SYNTH is true. + */ +// #define DISTRHO_PLUGIN_WANT_MIDI_INPUT 0 + +/** + Whether the plugin wants MIDI output. + @see Plugin::writeMidiEvent(const MidiEvent&) + */ +// #define DISTRHO_PLUGIN_WANT_MIDI_OUTPUT 0 + +/** + Whether the plugin wants to change its own parameter inputs. + Not all hosts or plugin formats support this, + so Plugin::canRequestParameterValueChanges() can be used to query support at runtime. + @see Plugin::requestParameterValueChange(uint32_t, float) + */ +// #define DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST 0 + +/** + Whether the plugin provides its own internal programs. + @see Plugin::initProgramName(uint32_t, String&) + @see Plugin::loadProgram(uint32_t) + */ +// #define DISTRHO_PLUGIN_WANT_PROGRAMS 0 + +/** + Whether the plugin uses internal non-parameter data. + @see Plugin::initState(uint32_t, String&, String&) + @see Plugin::setState(const char*, const char*) + */ +// #define DISTRHO_PLUGIN_WANT_STATE 0 + +/** + Whether the plugin implements the full state API. + When this macro is enabled, the plugin must implement a new getState(const char* key) function, which the host calls when saving its session/project. + This is useful for plugins that have custom internal values not exposed to the host as key-value state pairs or parameters. + Most simple effects and synths will not need this. + @note this macro is automatically enabled if a plugin has programs and state, as the key-value state pairs need to be updated when the current program changes. + @see Plugin::getState(const char*) + */ +// #define DISTRHO_PLUGIN_WANT_FULL_STATE 0 + +/** + Whether the plugin wants time position information from the host. + @see Plugin::getTimePosition() + */ +// #define DISTRHO_PLUGIN_WANT_TIMEPOS 0 + +/** + Whether the UI uses Cairo for drawing instead of the default OpenGL mode. + When enabled your UI instance will subclass CairoTopLevelWidget instead of TopLevelWidget. + */ +// #define DISTRHO_UI_USE_CAIRO 0 + +/** + Whether the UI uses a custom toolkit implementation based on OpenGL. + When enabled, the macros DISTRHO_UI_CUSTOM_INCLUDE_PATH and DISTRHO_UI_CUSTOM_WIDGET_TYPE are required. + */ +// #define DISTRHO_UI_USE_CUSTOM 0 + +/** + The include path to the header file used by the custom toolkit implementation. + This path must be relative to dpf/distrho/DistrhoUI.hpp + */ +// #define DISTRHO_UI_CUSTOM_INCLUDE_PATH + +/** + The top-level-widget typedef to use for the custom toolkit. + This widget class MUST be a subclass of DGL TopLevelWindow class. + It is recommended that you keep this widget class inside the DGL namespace, + and define widget type as e.g. DGL_NAMESPACE::MyCustomTopLevelWidget. + */ +// #define DISTRHO_UI_CUSTOM_WIDGET_TYPE + +/** + Whether the %UI uses NanoVG for drawing instead of the default raw OpenGL mode.@n + When enabled your %UI instance will subclass NanoTopLevelWidget instead of TopLevelWidget. + */ +// #define DISTRHO_UI_USE_NANOVG 0 + +/** + Default UI width to use when creating initial and temporary windows. + Setting this macro allows to skip a temporary UI from being created in certain VST2 and VST3 hosts. + (which would normally be done for knowing the UI size before host creates a window for it) + + Value must match 1x scale factor. + + When this macro is defined, the companion DISTRHO_UI_DEFAULT_HEIGHT macro must be defined as well. + */ +// #define DISTRHO_UI_DEFAULT_WIDTH 300 + +/** + Default UI height to use when creating initial and temporary windows. + Setting this macro allows to skip a temporary UI from being created in certain VST2 and VST3 hosts. + (which would normally be done for knowing the UI size before host creates a window for it) + + Value must match 1x scale factor. + + When this macro is defined, the companion DISTRHO_UI_DEFAULT_WIDTH macro must be defined as well. + */ +// #define DISTRHO_UI_DEFAULT_HEIGHT 300 + +/** + Whether the UI is resizable to any size by the user and OS. + By default this is false, with resizing only allowed when coded from the the plugin UI side. + Enabling this options makes it possible for the user to resize the plugin UI at anytime. + @see UI::setGeometryConstraints(uint, uint, bool, bool) + */ +// #define DISTRHO_UI_USER_RESIZABLE 0 + +/** + Whether to UI is going to use file browser dialogs. + By default this is false, with the file browser APIs not available for use. + */ +// #define DISTRHO_UI_FILE_BROWSER 0 + +/** + Whether to UI is going to use web browser views. + By default this is false, with the web browser APIs not available for use. + */ +// #define DISTRHO_UI_WEB_VIEW 0 + +/** + The UI URI when exporting in LV2 format. + By default this is set to @ref DISTRHO_PLUGIN_URI with "#UI" as suffix. + */ +// #define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#UI" + +/** + The AudioUnit type for a plugin. + This is a 4-character symbol, automatically set by DPF based on other plugin macros. + See https://developer.apple.com/documentation/audiotoolbox/1584142-audio_unit_types for more information. + */ +// #define DISTRHO_PLUGIN_AU_TYPE aufx + +/** + A 4-character symbol that identifies a brand or manufacturer, with at least one non-lower case character. + Plugins from the same brand should use the same symbol. + @note This macro is required when building AU plugins, and used for VST3 if present + @note Setting this macro will change the uid of a VST3 plugin. + If you already released a DPF-based VST3 plugin make sure to also enable DPF_VST3_DONT_USE_BRAND_ID + */ +#define DISTRHO_PLUGIN_BRAND_ID Dstr + +/** + A 4-character symbol which identifies a plugin. + It must be unique within at least a set of plugins from the brand. + @note This macro is required when building AU plugins + */ +// #define DISTRHO_PLUGIN_UNIQUE_ID test + +/** + Custom LV2 category for the plugin. + This is a single string, and can be one of the following values: + + - lv2:AllpassPlugin + - lv2:AmplifierPlugin + - lv2:AnalyserPlugin + - lv2:BandpassPlugin + - lv2:ChorusPlugin + - lv2:CombPlugin + - lv2:CompressorPlugin + - lv2:ConstantPlugin + - lv2:ConverterPlugin + - lv2:DelayPlugin + - lv2:DistortionPlugin + - lv2:DynamicsPlugin + - lv2:EQPlugin + - lv2:EnvelopePlugin + - lv2:ExpanderPlugin + - lv2:FilterPlugin + - lv2:FlangerPlugin + - lv2:FunctionPlugin + - lv2:GatePlugin + - lv2:GeneratorPlugin + - lv2:HighpassPlugin + - lv2:InstrumentPlugin + - lv2:LimiterPlugin + - lv2:LowpassPlugin + - lv2:MIDIPlugin + - lv2:MixerPlugin + - lv2:ModulatorPlugin + - lv2:MultiEQPlugin + - lv2:OscillatorPlugin + - lv2:ParaEQPlugin + - lv2:PhaserPlugin + - lv2:PitchPlugin + - lv2:ReverbPlugin + - lv2:SimulatorPlugin + - lv2:SpatialPlugin + - lv2:SpectralPlugin + - lv2:UtilityPlugin + - lv2:WaveshaperPlugin + + See http://lv2plug.in/ns/lv2core for more information. + */ +// #define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:Plugin" + +/** + Custom VST3 categories for the plugin. + This is a single concatenated string of categories, separated by a @c |. + + Each effect category can be one of the following values: + + - Fx + - Fx|Ambisonics + - Fx|Analyzer + - Fx|Delay + - Fx|Distortion + - Fx|Dynamics + - Fx|EQ + - Fx|Filter + - Fx|Instrument + - Fx|Instrument|External + - Fx|Spatial + - Fx|Generator + - Fx|Mastering + - Fx|Modulation + - Fx|Network + - Fx|Pitch Shift + - Fx|Restoration + - Fx|Reverb + - Fx|Surround + - Fx|Tools + + Each instrument category can be one of the following values: + + - Instrument + - Instrument|Drum + - Instrument|External + - Instrument|Piano + - Instrument|Sampler + - Instrument|Synth + - Instrument|Synth|Sampler + + And extra categories possible for any plugin type: + + - Mono + - Stereo + */ +// #define DISTRHO_PLUGIN_VST3_CATEGORIES "Fx|Stereo" + +/** + Custom CLAP features for the plugin. + This is a list of features defined as a string array body, without the terminating @c , or nullptr. + + A top-level category can be set as feature and be one of the following values: + + - instrument + - audio-effect + - note-effect + - analyzer + + The following sub-categories can also be set: + + - synthesizer + - sampler + - drum + - drum-machine + + - filter + - phaser + - equalizer + - de-esser + - phase-vocoder + - granular + - frequency-shifter + - pitch-shifter + + - distortion + - transient-shaper + - compressor + - limiter + + - flanger + - chorus + - delay + - reverb + + - tremolo + - glitch + + - utility + - pitch-correction + - restoration + + - multi-effects + + - mixing + - mastering + + And finally the following audio capabilities can be set: + + - mono + - stereo + - surround + - ambisonic +*/ +// #define DISTRHO_PLUGIN_CLAP_FEATURES "audio-effect", "stereo" + +/** + The plugin id when exporting in CLAP format, in reverse URI form. + @note This macro is required when building CLAP plugins +*/ +// #define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.effect" + +/** @} */ diff --git a/dpf/distrho/DistrhoPluginMain.cpp b/dpf/distrho/DistrhoPluginMain.cpp index 561da7b..254da24 100644 --- a/dpf/distrho/DistrhoPluginMain.cpp +++ b/dpf/distrho/DistrhoPluginMain.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -16,7 +16,9 @@ #include "src/DistrhoPlugin.cpp" -#if defined(DISTRHO_PLUGIN_TARGET_CARLA) +#if defined(DISTRHO_PLUGIN_TARGET_AU) +# include "src/DistrhoPluginAU.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_CARLA) # include "src/DistrhoPluginCarla.cpp" #elif defined(DISTRHO_PLUGIN_TARGET_CLAP) # include "src/DistrhoPluginCLAP.cpp" @@ -31,6 +33,8 @@ # include "src/DistrhoPluginVST2.cpp" #elif defined(DISTRHO_PLUGIN_TARGET_VST3) # include "src/DistrhoPluginVST3.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_EXPORT) +# include "src/DistrhoPluginExport.cpp" #elif defined(DISTRHO_PLUGIN_TARGET_SHARED) DISTRHO_PLUGIN_EXPORT DISTRHO_NAMESPACE::Plugin* createSharedPlugin(); DISTRHO_PLUGIN_EXPORT DISTRHO_NAMESPACE::Plugin* createSharedPlugin() { return DISTRHO_NAMESPACE::createPlugin(); } diff --git a/dpf/distrho/DistrhoPluginUtils.hpp b/dpf/distrho/DistrhoPluginUtils.hpp index b9ed642..414dcd3 100644 --- a/dpf/distrho/DistrhoPluginUtils.hpp +++ b/dpf/distrho/DistrhoPluginUtils.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2021 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -53,13 +53,15 @@ const char* getPluginFormatName() noexcept; Returns a path inside the bundle where the plugin is meant to store its resources in.@n This path varies between systems and plugin formats, like so: + - AU: /Contents/Resources + - CLAP+VST2 macOS: /Contents/Resources + - CLAP+VST2 non-macOS: /resources (see note) - LV2: /resources (can be stored anywhere inside the bundle really, DPF just uses this one) - - VST2 macOS: /Contents/Resources - - VST2 non-macOS: /resources (see note) + - VST3: /Contents/Resources The other non-mentioned formats do not support bundles.@n - @note For VST2 on non-macOS systems, this assumes you have your plugin inside a dedicated directory + @note For CLAP and VST2 on non-macOS systems, this assumes you have your plugin inside a dedicated directory rather than only shipping with the binary (e.g. /myplugin.dll) */ const char* getResourcePath(const char* bundlePath) noexcept; diff --git a/dpf/distrho/DistrhoUI.hpp b/dpf/distrho/DistrhoUI.hpp index 14b3925..f2e67f0 100644 --- a/dpf/distrho/DistrhoUI.hpp +++ b/dpf/distrho/DistrhoUI.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -31,11 +31,7 @@ # include "Vulkan.hpp" #endif -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# include "../dgl/Base.hpp" -# include "extra/ExternalWindow.hpp" -typedef DISTRHO_NAMESPACE::ExternalWindow UIWidget; -#elif DISTRHO_UI_USE_CUSTOM +#if DISTRHO_UI_USE_CUSTOM # include DISTRHO_UI_CUSTOM_INCLUDE_PATH typedef DISTRHO_UI_CUSTOM_WIDGET_TYPE UIWidget; #elif DISTRHO_UI_USE_CAIRO @@ -52,9 +48,8 @@ typedef DGL_NAMESPACE::TopLevelWidget UIWidget; #if DISTRHO_UI_FILE_BROWSER # include "extra/FileBrowserDialog.hpp" #endif -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# include -#endif + +#include START_NAMESPACE_DISTRHO @@ -197,8 +192,7 @@ public: This function does not block the event loop. - @note This is exactly the same API as provided by the Window class, - but redeclared here so that non-embed/DGL based UIs can still use file browser related functions. + @note This is exactly the same API as provided by the Window class, but redeclared here for convenience. */ bool openFileBrowser(const DISTRHO_NAMESPACE::FileBrowserOptions& options = FileBrowserOptions()); #endif @@ -214,34 +208,6 @@ public: void* getPluginInstancePointer() const noexcept; #endif -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - /* -------------------------------------------------------------------------------------------------------- - * External UI helpers */ - - /** - Get the bundle path that will be used for the next UI. - @note: This function is only valid during createUI(), - it will return null when called from anywhere else. - */ - static const char* getNextBundlePath() noexcept; - - /** - Get the scale factor that will be used for the next UI. - @note: This function is only valid during createUI(), - it will return 1.0 when called from anywhere else. - */ - static double getNextScaleFactor() noexcept; - -# if DISTRHO_PLUGIN_HAS_EMBED_UI - /** - Get the Window Id that will be used for the next created window. - @note: This function is only valid during createUI(), - it will return 0 when called from anywhere else. - */ - static uintptr_t getNextWindowId() noexcept; -# endif -#endif - protected: /* -------------------------------------------------------------------------------------------------------- * DSP/Plugin Callbacks */ @@ -250,14 +216,14 @@ protected: A parameter has changed on the plugin side.@n This is called by the host to inform the UI about parameter changes. */ - virtual void parameterChanged(uint32_t index, float value) = 0; + virtual void parameterChanged(uint32_t index, float value); #if DISTRHO_PLUGIN_WANT_PROGRAMS /** A program has been loaded on the plugin side.@n This is called by the host to inform the UI about program changes. */ - virtual void programLoaded(uint32_t index) = 0; + virtual void programLoaded(uint32_t index); #endif #if DISTRHO_PLUGIN_WANT_STATE @@ -265,7 +231,7 @@ protected: A state has changed on the plugin side.@n This is called by the host to inform the UI about state changes. */ - virtual void stateChanged(const char* key, const char* value) = 0; + virtual void stateChanged(const char* key, const char* value); #endif /* -------------------------------------------------------------------------------------------------------- @@ -297,7 +263,6 @@ protected: */ virtual void uiScaleFactorChanged(double scaleFactor); -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI /** Get the types available for the data in a clipboard. Must only be called within the context of uiClipboardDataOffer. @@ -334,7 +299,6 @@ protected: The most common exception is custom OpenGL setup, but only really needed for custom OpenGL drawing code. */ virtual void uiReshape(uint width, uint height); -#endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI #if DISTRHO_UI_FILE_BROWSER /** @@ -352,21 +316,12 @@ protected: /* -------------------------------------------------------------------------------------------------------- * UI Resize Handling, internal */ -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - /** - External Window resize function, called when the window is resized. - This is overriden here so the host knows when the UI is resized by you. - @see ExternalWindow::sizeChanged(uint,uint) - */ - void sizeChanged(uint width, uint height) override; -#else /** Widget resize function, called when the widget is resized. This is overriden here so the host knows when the UI is resized by you. @see Widget::onResize(const ResizeEvent&) */ void onResize(const ResizeEvent& ev) override; -#endif // ------------------------------------------------------------------------------------------------------- @@ -375,10 +330,8 @@ private: PrivateData* const uiData; friend class PluginWindow; friend class UIExporter; -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI /** @internal */ void requestSizeChange(uint width, uint height) override; -#endif DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(UI) }; diff --git a/dpf/distrho/DistrhoUIMain.cpp b/dpf/distrho/DistrhoUIMain.cpp index 13d337b..2236815 100644 --- a/dpf/distrho/DistrhoUIMain.cpp +++ b/dpf/distrho/DistrhoUIMain.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -23,7 +23,10 @@ #if DISTRHO_PLUGIN_HAS_UI -#if defined(DISTRHO_PLUGIN_TARGET_CARLA) +#if defined(DISTRHO_PLUGIN_TARGET_AU) +# define DISTRHO_PLUGIN_AND_UI_IN_SINGLE_OBJECT 1 +# import "src/DistrhoUIAU.mm" +#elif defined(DISTRHO_PLUGIN_TARGET_CARLA) # define DISTRHO_PLUGIN_AND_UI_IN_SINGLE_OBJECT 1 #elif defined(DISTRHO_PLUGIN_TARGET_CLAP) # define DISTRHO_PLUGIN_AND_UI_IN_SINGLE_OBJECT 1 @@ -40,6 +43,8 @@ #elif defined(DISTRHO_PLUGIN_TARGET_VST3) # define DISTRHO_PLUGIN_AND_UI_IN_SINGLE_OBJECT 1 # include "src/DistrhoUIVST3.cpp" +#elif defined(DISTRHO_PLUGIN_TARGET_EXPORT) +# define DISTRHO_PLUGIN_AND_UI_IN_SINGLE_OBJECT 1 #elif defined(DISTRHO_PLUGIN_TARGET_SHARED) || defined(DISTRHO_PLUGIN_TARGET_STATIC) # define DISTRHO_PLUGIN_AND_UI_IN_SINGLE_OBJECT 1 #else @@ -53,6 +58,19 @@ # define DISTRHO_IS_STANDALONE 0 # endif # include "src/DistrhoUtils.cpp" +#else +# ifdef DISTRHO_PLUGIN_TARGET_JACK +# define DISTRHO_IS_STANDALONE 1 +# else +# define DISTRHO_IS_STANDALONE 0 +# endif +#endif + +#if defined(DPF_USING_LD_LINUX_WEBVIEW) && !DISTRHO_IS_STANDALONE +int main(int argc, char* argv[]) +{ + return DISTRHO_NAMESPACE::dpf_webview_start(argc, argv); +} #endif #endif diff --git a/dpf/distrho/DistrhoUI_macOS.mm b/dpf/distrho/DistrhoUI_macOS.mm index f2b3359..0ab1ecd 100644 --- a/dpf/distrho/DistrhoUI_macOS.mm +++ b/dpf/distrho/DistrhoUI_macOS.mm @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -20,9 +20,11 @@ #include "src/DistrhoPluginChecks.h" #include "src/DistrhoDefines.h" -#if DISTRHO_UI_FILE_BROWSER || DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# import -#endif +#define Point CocoaPoint +#define Size CocoaSize +#import +#undef Point +#undef Size #if DISTRHO_UI_FILE_BROWSER # define DISTRHO_FILE_BROWSER_DIALOG_HPP_INCLUDED @@ -34,9 +36,19 @@ END_NAMESPACE_DISTRHO # include "extra/FileBrowserDialogImpl.cpp" #endif -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# include -# include +#if DISTRHO_UI_WEB_VIEW +# define DISTRHO_WEB_VIEW_HPP_INCLUDED +# define WEB_VIEW_NAMESPACE DISTRHO_NAMESPACE +# define WEB_VIEW_DISTRHO_NAMESPACE +START_NAMESPACE_DISTRHO +# include "extra/WebViewImpl.hpp" +END_NAMESPACE_DISTRHO +# include "extra/WebViewImpl.cpp" +#endif + +#include +#include + START_NAMESPACE_DISTRHO double getDesktopScaleFactor(const uintptr_t parentWindowHandle) { @@ -51,4 +63,3 @@ double getDesktopScaleFactor(const uintptr_t parentWindowHandle) return [NSScreen mainScreen].backingScaleFactor; } END_NAMESPACE_DISTRHO -#endif diff --git a/dpf/distrho/DistrhoUI_win32.cpp b/dpf/distrho/DistrhoUI_win32.cpp new file mode 100644 index 0000000..562a414 --- /dev/null +++ b/dpf/distrho/DistrhoUI_win32.cpp @@ -0,0 +1,27 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// Include CHOC separately because it requires C++17 + +#include "DistrhoDetails.hpp" +#include "src/DistrhoPluginChecks.h" +#include "src/DistrhoDefines.h" + +#if DISTRHO_UI_WEB_VIEW +# define DISTRHO_WEB_VIEW_INCLUDE_IMPLEMENTATION +# include "extra/WebView.hpp" +# include "extra/WebViewWin32.hpp" +#endif diff --git a/dpf/distrho/DistrhoUtils.hpp b/dpf/distrho/DistrhoUtils.hpp index a948224..bdd367a 100644 --- a/dpf/distrho/DistrhoUtils.hpp +++ b/dpf/distrho/DistrhoUtils.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -38,7 +38,7 @@ typedef SSIZE_T ssize_t; #endif -#if ! defined(CARLA_MATH_UTILS_HPP_INCLUDED) && ! defined(DISTRHO_PROPER_CPP11_SUPPORT) +#if ! defined(CARLA_MATH_UTILS_HPP_INCLUDED) && ! defined(DISTRHO_PROPER_CPP11_SUPPORT) && ! defined(DISTRHO_OS_MAC) namespace std { inline float fmin(float __x, float __y) { return __builtin_fminf(__x, __y); } @@ -55,9 +55,6 @@ inline float round(float __x) # define M_PI 3.14159265358979323846 #endif -#define DISTRHO_MACRO_AS_STRING_VALUE(MACRO) #MACRO -#define DISTRHO_MACRO_AS_STRING(MACRO) DISTRHO_MACRO_AS_STRING_VALUE(MACRO) - /* -------------------------------------------------------------------------------------------------------------------- * misc functions */ @@ -77,6 +74,15 @@ int64_t d_cconst(const uint8_t a, const uint8_t b, const uint8_t c, const uint8_ return (a << 24) | (b << 16) | (c << 8) | (d << 0); } +/** + Return a 32-bit number from 4 ASCII characters. + */ +static inline constexpr +uint32_t d_cconst(const char str[4]) +{ + return (str[0] << 24) | (str[1] << 16) | (str[2] << 8) | str[3]; +} + /** Return an hexadecimal representation of a MAJ.MIN.MICRO version number. */ @@ -103,6 +109,27 @@ void d_pass() noexcept {} @{ */ +/* + * Internal noexcept-safe fopen function. + */ +static inline +FILE* __d_fopen(const char* const filename, FILE* const fallback) noexcept +{ + if (std::getenv("DPF_CAPTURE_CONSOLE_OUTPUT") == nullptr) + return fallback; + + FILE* ret = nullptr; + + try { + ret = std::fopen(filename, "a+"); + } catch (...) {} + + if (ret == nullptr) + ret = fallback; + + return ret; +} + /** Print a string to stdout with newline (gray color). Does nothing if DEBUG is not defined. @@ -113,12 +140,30 @@ void d_pass() noexcept {} static inline void d_debug(const char* const fmt, ...) noexcept { + static FILE* const output = __d_fopen("/tmp/dpf.debug.log", stdout); + try { va_list args; va_start(args, fmt); - std::fprintf(stdout, "\x1b[30;1m"); - std::vfprintf(stdout, fmt, args); - std::fprintf(stdout, "\x1b[0m\n"); + + if (output == stdout) + { + #ifdef DISTRHO_OS_MAC + std::fprintf(output, "\x1b[37;1m[dpf] "); + #else + std::fprintf(output, "\x1b[30;1m[dpf] "); + #endif + std::vfprintf(output, fmt, args); + std::fprintf(output, "\x1b[0m\n"); + } + else + { + std::fprintf(output, "[dpf] "); + std::vfprintf(output, fmt, args); + std::fprintf(output, "\n"); + } + + std::fflush(output); va_end(args); } catch (...) {} } @@ -130,11 +175,18 @@ void d_debug(const char* const fmt, ...) noexcept static inline void d_stdout(const char* const fmt, ...) noexcept { + static FILE* const output = __d_fopen("/tmp/dpf.stdout.log", stdout); + try { va_list args; va_start(args, fmt); - std::vfprintf(stdout, fmt, args); - std::fprintf(stdout, "\n"); + std::fprintf(output, "[dpf] "); + std::vfprintf(output, fmt, args); + std::fprintf(output, "\n"); + #ifndef DEBUG + if (output != stdout) + #endif + std::fflush(output); va_end(args); } catch (...) {} } @@ -145,11 +197,18 @@ void d_stdout(const char* const fmt, ...) noexcept static inline void d_stderr(const char* const fmt, ...) noexcept { + static FILE* const output = __d_fopen("/tmp/dpf.stderr.log", stderr); + try { va_list args; va_start(args, fmt); - std::vfprintf(stderr, fmt, args); - std::fprintf(stderr, "\n"); + std::fprintf(output, "[dpf] "); + std::vfprintf(output, fmt, args); + std::fprintf(output, "\n"); + #ifndef DEBUG + if (output != stderr) + #endif + std::fflush(output); va_end(args); } catch (...) {} } @@ -160,12 +219,26 @@ void d_stderr(const char* const fmt, ...) noexcept static inline void d_stderr2(const char* const fmt, ...) noexcept { + static FILE* const output = __d_fopen("/tmp/dpf.stderr2.log", stderr); + try { va_list args; va_start(args, fmt); - std::fprintf(stderr, "\x1b[31m"); - std::vfprintf(stderr, fmt, args); - std::fprintf(stderr, "\x1b[0m\n"); + + if (output == stdout) + { + std::fprintf(output, "\x1b[31m[dpf] "); + std::vfprintf(output, fmt, args); + std::fprintf(output, "\x1b[0m\n"); + } + else + { + std::fprintf(output, "[dpf] "); + std::vfprintf(output, fmt, args); + std::fprintf(output, "\n"); + } + + std::fflush(output); va_end(args); } catch (...) {} } @@ -310,7 +383,7 @@ uint32_t d_nextPowerOf2(uint32_t size) noexcept } /** - Round a floating point number to integer. + Round a floating point number to an integer. Fast operation for values known to be 0 or positive. */ template @@ -321,7 +394,18 @@ int32_t d_roundToIntPositive(const T& value) } /** - Round a floating point number to integer. + Round a floating point number to an unsigned integer. + Fast operation for values known to be 0 or positive. + */ +template +static inline constexpr +uint32_t d_roundToUnsignedInt(const T& value) +{ + return static_cast(value + static_cast(0.5)); +} + +/** + Round a floating point number to an integer. Fast operation for values known to be 0 or negative. */ template @@ -345,13 +429,15 @@ int32_t d_roundToInt(const T& value) /** @} */ /* -------------------------------------------------------------------------------------------------------------------- - * math functions */ + * other stuff */ #ifndef DONT_SET_USING_DISTRHO_NAMESPACE - // If your code uses a lot of DISTRHO classes, then this will obviously save you - // a lot of typing, but can be disabled by setting DONT_SET_USING_DISTRHO_NAMESPACE. - namespace DISTRHO_NAMESPACE {} - using namespace DISTRHO_NAMESPACE; +/** + If your code uses a lot of DISTRHO classes, then this will obviously save you a lot of typing, + but can be disabled by setting DONT_SET_USING_DISTRHO_NAMESPACE. + */ +namespace DISTRHO_NAMESPACE {} +using namespace DISTRHO_NAMESPACE; #endif #endif // DISTRHO_UTILS_HPP_INCLUDED diff --git a/dpf/distrho/extra/ChildProcess.hpp b/dpf/distrho/extra/ChildProcess.hpp new file mode 100644 index 0000000..5638edb --- /dev/null +++ b/dpf/distrho/extra/ChildProcess.hpp @@ -0,0 +1,276 @@ +// SPDX-FileCopyrightText: 2023-2024 MOD Audio UG +// SPDX-License-Identifier: AGPL-3.0-or-later + +#pragma once + +#include "Sleep.hpp" +#include "Time.hpp" + +#ifdef DISTRHO_OS_WINDOWS +# include +# include +# include +#else +# include +# include +# include +# include +#endif + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------------------------------------------- + +class ChildProcess +{ + #ifdef _WIN32 + PROCESS_INFORMATION pinfo = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, 0, 0 }; + #else + pid_t pid = -1; + #endif + +public: + ChildProcess() + { + } + + ~ChildProcess() + { + stop(); + } + + #ifdef _WIN32 + bool start(const char* const args[], const WCHAR* const envp) + #else + bool start(const char* const args[], char* const* const envp = nullptr) + #endif + { + #ifdef _WIN32 + std::string cmd; + + for (uint i = 0; args[i] != nullptr; ++i) + { + if (i != 0) + cmd += " "; + + if (args[i][0] != '"' && std::strchr(args[i], ' ') != nullptr) + { + cmd += "\""; + cmd += args[i]; + cmd += "\""; + } + else + { + cmd += args[i]; + } + } + + wchar_t wcmd[PATH_MAX]; + if (MultiByteToWideChar(CP_UTF8, 0, cmd.data(), -1, wcmd, PATH_MAX) <= 0) + return false; + + STARTUPINFOW si = {}; + si.cb = sizeof(si); + + d_stdout("will start process with args '%s'", cmd.data()); + + return CreateProcessW(nullptr, // lpApplicationName + wcmd, // lpCommandLine + nullptr, // lpProcessAttributes + nullptr, // lpThreadAttributes + TRUE, // bInheritHandles + CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT, // dwCreationFlags + const_cast(envp), // lpEnvironment + nullptr, // lpCurrentDirectory + &si, // lpStartupInfo + &pinfo) != FALSE; + #else + const pid_t ret = pid = vfork(); + + switch (ret) + { + // child process + case 0: + if (envp != nullptr) + execve(args[0], const_cast(args), envp); + else + execvp(args[0], const_cast(args)); + + d_stderr2("exec failed: %d:%s", errno, std::strerror(errno)); + _exit(1); + break; + + // error + case -1: + d_stderr2("vfork() failed: %d:%s", errno, std::strerror(errno)); + break; + } + + return ret > 0; + #endif + } + + void stop(const uint32_t timeoutInMilliseconds = 2000) + { + const uint32_t timeout = d_gettime_ms() + timeoutInMilliseconds; + bool sendTerminate = true; + + #ifdef _WIN32 + if (pinfo.hProcess == INVALID_HANDLE_VALUE) + return; + + const PROCESS_INFORMATION opinfo = pinfo; + pinfo = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, 0, 0 }; + + for (DWORD exitCode;;) + { + if (GetExitCodeProcess(opinfo.hProcess, &exitCode) == FALSE || + exitCode != STILL_ACTIVE || + WaitForSingleObject(opinfo.hProcess, 0) != WAIT_TIMEOUT) + { + CloseHandle(opinfo.hThread); + CloseHandle(opinfo.hProcess); + return; + } + + if (sendTerminate) + { + sendTerminate = false; + TerminateProcess(opinfo.hProcess, ERROR_BROKEN_PIPE); + } + + if (d_gettime_ms() < timeout) + { + d_msleep(5); + continue; + } + d_stderr("ChildProcess::stop() - timed out"); + TerminateProcess(opinfo.hProcess, 9); + d_msleep(5); + CloseHandle(opinfo.hThread); + CloseHandle(opinfo.hProcess); + break; + } + #else + if (pid <= 0) + return; + + const pid_t opid = pid; + pid = -1; + + for (pid_t ret;;) + { + try { + ret = ::waitpid(opid, nullptr, WNOHANG); + } DISTRHO_SAFE_EXCEPTION_BREAK("waitpid"); + + switch (ret) + { + case -1: + if (errno == ECHILD) + { + // success, child doesn't exist + return; + } + else + { + d_stderr("ChildProcess::stop() - waitpid failed: %d:%s", errno, std::strerror(errno)); + return; + } + break; + + case 0: + if (sendTerminate) + { + sendTerminate = false; + kill(opid, SIGTERM); + } + if (d_gettime_ms() < timeout) + { + d_msleep(5); + continue; + } + + d_stderr("ChildProcess::stop() - timed out"); + kill(opid, SIGKILL); + waitpid(opid, nullptr, WNOHANG); + break; + + default: + if (ret == opid) + { + // success + return; + } + else + { + d_stderr("ChildProcess::stop() - got wrong pid %i (requested was %i)", int(ret), int(opid)); + return; + } + } + + break; + } + #endif + } + + bool isRunning() + { + #ifdef _WIN32 + if (pinfo.hProcess == INVALID_HANDLE_VALUE) + return false; + + DWORD exitCode; + if (GetExitCodeProcess(pinfo.hProcess, &exitCode) == FALSE || + exitCode != STILL_ACTIVE || + WaitForSingleObject(pinfo.hProcess, 0) != WAIT_TIMEOUT) + { + const PROCESS_INFORMATION opinfo = pinfo; + pinfo = { INVALID_HANDLE_VALUE, INVALID_HANDLE_VALUE, 0, 0 }; + CloseHandle(opinfo.hThread); + CloseHandle(opinfo.hProcess); + return false; + } + + return true; + #else + if (pid <= 0) + return false; + + const pid_t ret = ::waitpid(pid, nullptr, WNOHANG); + + if (ret == pid || (ret == -1 && errno == ECHILD)) + { + pid = 0; + return false; + } + + return true; + #endif + } + + #ifndef _WIN32 + void signal(const int sig) + { + if (pid > 0) + kill(pid, sig); + } + #endif + + void terminate() + { + #ifdef _WIN32 + if (pinfo.hProcess != INVALID_HANDLE_VALUE) + TerminateProcess(pinfo.hProcess, 15); + #else + if (pid > 0) + kill(pid, SIGTERM); + #endif + } + + DISTRHO_DECLARE_NON_COPYABLE(ChildProcess) +}; + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO diff --git a/dpf/distrho/extra/FileBrowserDialogImpl.cpp b/dpf/distrho/extra/FileBrowserDialogImpl.cpp index 0a21839..06d8c1b 100644 --- a/dpf/distrho/extra/FileBrowserDialogImpl.cpp +++ b/dpf/distrho/extra/FileBrowserDialogImpl.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -27,10 +27,12 @@ #ifdef DISTRHO_OS_MAC # import #endif + #ifdef DISTRHO_OS_WASM # include # include #endif + #ifdef DISTRHO_OS_WINDOWS # include # include @@ -41,13 +43,30 @@ #else # include #endif + #ifdef HAVE_DBUS # include #endif + #ifdef HAVE_X11 # define DBLCLKTME 400 # include "sofd/libsofd.h" +# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wcast-qual" +# pragma GCC diagnostic ignored "-Wconversion" +# pragma GCC diagnostic ignored "-Wfloat-conversion" +# pragma GCC diagnostic ignored "-Wshadow" +# pragma GCC diagnostic ignored "-Wsign-conversion" +# pragma GCC diagnostic ignored "-Wstrict-overflow" +# endif # include "sofd/libsofd.c" +# if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +# pragma GCC diagnostic pop +# endif +# undef HAVE_MNTENT +# undef MAX +# undef MIN #endif #ifdef FILE_BROWSER_DIALOG_DGL_NAMESPACE @@ -329,6 +348,16 @@ struct FileBrowserData { #else // DISTRHO_OS_WINDOWS FileBrowserData(const bool save) : selectedFile(nullptr) + #ifdef DISTRHO_OS_MAC + , nsBasePanel(nullptr) + , nsOpenPanel(nullptr) + #endif + #ifdef HAVE_DBUS + , dbuscon(nullptr) + #endif + #ifdef HAVE_X11 + , x11display(nullptr) + #endif { #ifdef DISTRHO_OS_MAC if (save) @@ -393,6 +422,8 @@ struct FileBrowserData { std::free(const_cast(selectedFile)); selectedFile = nullptr; } + + DISTRHO_DECLARE_NON_COPYABLE(FileBrowserData) }; // -------------------------------------------------------------------------------------------------------------------- @@ -463,7 +494,11 @@ FileBrowserHandle fileBrowserCreate(const bool isEmbed, [nsOpenPanel setCanChooseFiles:YES]; } - [nsBasePanel setDirectoryURL:[NSURL fileURLWithPath:[NSString stringWithUTF8String:startDir]]]; + NSString* const startDirString = [[NSString alloc] + initWithBytes:startDir + length:strlen(startDir) + encoding:NSUTF8StringEncoding]; + [nsBasePanel setDirectoryURL:[NSURL fileURLWithPath:startDirString]]; // TODO file filter using allowedContentTypes: [UTType] @@ -496,6 +531,9 @@ FileBrowserHandle fileBrowserCreate(const bool isEmbed, } }]; }); + + [startDirString release]; + [titleString release]; # endif #endif @@ -590,7 +628,8 @@ FileBrowserHandle fileBrowserCreate(const bool isEmbed, dbus_message_iter_open_container(&dict, DBUS_TYPE_VARIANT, "ay", &variant); dbus_message_iter_open_container(&variant, DBUS_TYPE_ARRAY, "y", &variantArray); dbus_message_iter_append_fixed_array(&variantArray, DBUS_TYPE_BYTE, - ¤t_folder_val, startDir.length()+1); + ¤t_folder_val, + static_cast(startDir.length() + 1)); dbus_message_iter_close_container(&variant, &variantArray); dbus_message_iter_close_container(&dict, &variant); dbus_message_iter_close_container(&array, &dict); diff --git a/dpf/distrho/extra/FileBrowserDialogImpl.hpp b/dpf/distrho/extra/FileBrowserDialogImpl.hpp index 225e34f..8f5f4f0 100644 --- a/dpf/distrho/extra/FileBrowserDialogImpl.hpp +++ b/dpf/distrho/extra/FileBrowserDialogImpl.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -18,6 +18,10 @@ # error bad include #endif +#if !defined(DGL_USE_FILE_BROWSER) && defined(DISTRHO_UI_FILE_BROWSER) && DISTRHO_UI_FILE_BROWSER == 0 +# error To use File Browser in DPF plugins please set DISTRHO_UI_FILE_BROWSER to 1 +#endif + // -------------------------------------------------------------------------------------------------------------------- // File Browser Dialog stuff @@ -109,17 +113,17 @@ FileBrowserHandle fileBrowserCreate(bool isEmbed, in which case this idle function must not be called anymore for this handle. You can then call fileBrowserGetPath to know the selected file (or null if cancelled). */ -bool fileBrowserIdle(const FileBrowserHandle handle); +bool fileBrowserIdle(FileBrowserHandle handle); /** Close and free the file browser dialog, handle must not be used afterwards. */ -void fileBrowserClose(const FileBrowserHandle handle); +void fileBrowserClose(FileBrowserHandle handle); /** Get the path chosen by the user or null.@n Should only be called after fileBrowserIdle returns true. */ -const char* fileBrowserGetPath(const FileBrowserHandle handle); +const char* fileBrowserGetPath(FileBrowserHandle handle); // -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/extra/RingBuffer.hpp b/dpf/distrho/extra/RingBuffer.hpp index 71f1018..be744dd 100644 --- a/dpf/distrho/extra/RingBuffer.hpp +++ b/dpf/distrho/extra/RingBuffer.hpp @@ -404,6 +404,36 @@ public: return false; } + // ------------------------------------------------------------------- + // peek operations (returns a value without advancing read position) + + /* + * Peek for an unsigned 32-bit integer. + * Returns 0 if reading fails. + */ + uint32_t peekUInt() const noexcept + { + uint32_t ui = 0; + return tryPeek(&ui, sizeof(int32_t)) ? ui : 0; + } + + /*! + * Peek for a custom data type specified by the template typename used, + * with size being automatically deduced by the compiler (through the use of sizeof). + * + * Returns true if peeking succeeds. + * In case of failure, @a type value is automatically cleared by its deduced size. + */ + template + bool peekCustomType(T& type) const noexcept + { + if (tryPeek(&type, sizeof(T))) + return true; + + std::memset(&type, 0, sizeof(T)); + return false; + } + // ------------------------------------------------------------------- // write operations @@ -601,7 +631,7 @@ protected: } else { - const uint32_t firstpart(buffer->size - tail); + const uint32_t firstpart = buffer->size - tail; std::memcpy(bytebuf, buffer->buf + tail, firstpart); std::memcpy(bytebuf + firstpart, buffer->buf, readto); } @@ -619,6 +649,63 @@ protected: return true; } + /** @internal try reading from the buffer, can fail. */ + bool tryPeek(void* const buf, const uint32_t size) const noexcept + { + DISTRHO_SAFE_ASSERT_RETURN(buffer != nullptr, false); + #if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wtautological-pointer-compare" + #endif + DISTRHO_SAFE_ASSERT_RETURN(buffer->buf != nullptr, false); + #if defined(__clang__) + #pragma clang diagnostic pop + #endif + DISTRHO_SAFE_ASSERT_RETURN(buf != nullptr, false); + DISTRHO_SAFE_ASSERT_RETURN(size > 0, false); + DISTRHO_SAFE_ASSERT_RETURN(size < buffer->size, false); + + // empty + if (buffer->head == buffer->tail) + return false; + + uint8_t* const bytebuf = static_cast(buf); + + const uint32_t head = buffer->head; + const uint32_t tail = buffer->tail; + const uint32_t wrap = head > tail ? 0 : buffer->size; + + if (size > wrap + head - tail) + return false; + + uint32_t readto = tail + size; + + if (readto > buffer->size) + { + readto -= buffer->size; + + if (size == 1) + { + std::memcpy(bytebuf, buffer->buf + tail, 1); + } + else + { + const uint32_t firstpart = buffer->size - tail; + std::memcpy(bytebuf, buffer->buf + tail, firstpart); + std::memcpy(bytebuf + firstpart, buffer->buf, readto); + } + } + else + { + std::memcpy(bytebuf, buffer->buf + tail, size); + + if (readto == buffer->size) + readto = 0; + } + + return true; + } + /** @internal try writing to the buffer, can fail. */ bool tryWrite(const void* const buf, const uint32_t size) noexcept { @@ -656,7 +743,7 @@ protected: } else { - const uint32_t firstpart(buffer->size - wrtn); + const uint32_t firstpart = buffer->size - wrtn; std::memcpy(buffer->buf + wrtn, bytebuf, firstpart); std::memcpy(buffer->buf, bytebuf + firstpart, writeto); } diff --git a/dpf/distrho/extra/Sleep.hpp b/dpf/distrho/extra/Sleep.hpp index 612a940..3f27251 100644 --- a/dpf/distrho/extra/Sleep.hpp +++ b/dpf/distrho/extra/Sleep.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2016 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -29,7 +29,9 @@ # include #endif -// ----------------------------------------------------------------------- +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------------------------------------------- // d_*sleep /* @@ -66,6 +68,8 @@ void d_msleep(const uint msecs) noexcept } DISTRHO_SAFE_EXCEPTION("d_msleep"); } -// ----------------------------------------------------------------------- +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO #endif // DISTRHO_SLEEP_HPP_INCLUDED diff --git a/dpf/distrho/extra/String.hpp b/dpf/distrho/extra/String.hpp index d61d5c4..08bd6be 100644 --- a/dpf/distrho/extra/String.hpp +++ b/dpf/distrho/extra/String.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -22,10 +22,6 @@ #include -#if __cplusplus >= 201703L -# include -#endif - START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------- @@ -91,16 +87,6 @@ public: _dup(strBuf); } - #if __cplusplus >= 201703L - /* - * constexpr compatible variant. - */ - explicit constexpr String(const std::string_view& strView) noexcept - : fBuffer(const_cast(strView.data())), - fBufferLen(strView.size()), - fBufferAlloc(false) {} - #endif - /* * Integer. */ @@ -695,11 +681,11 @@ public: "abcdefghijklmnopqrstuvwxyz" "0123456789+/"; -#ifndef _MSC_VER + #ifndef _MSC_VER const std::size_t kTmpBufSize = std::min(d_nextPowerOf2(static_cast(dataSize/3)), 65536U); -#else + #else constexpr std::size_t kTmpBufSize = 65536U; -#endif + #endif const uchar* bytesToEncode((const uchar*)data); diff --git a/dpf/distrho/extra/Time.hpp b/dpf/distrho/extra/Time.hpp new file mode 100644 index 0000000..e219cc8 --- /dev/null +++ b/dpf/distrho/extra/Time.hpp @@ -0,0 +1,127 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_TIME_HPP_INCLUDED +#define DISTRHO_TIME_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +#ifdef DISTRHO_OS_WINDOWS +# include +# include +# include +#else +# include +#endif + +START_NAMESPACE_DISTRHO + +// ----------------------------------------------------------------------------------------------------------- +// d_gettime_* + +/* + * Get a monotonically-increasing time in milliseconds. + */ +static inline +uint32_t d_gettime_ms() noexcept +{ + #if defined(DISTRHO_OS_MAC) + static const time_t s = clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000000; + return (clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000000) - s; + #elif defined(DISTRHO_OS_WINDOWS) + return static_cast(timeGetTime()); + #else + static struct { + timespec ts; + int r; + uint32_t ms; + } s = { {}, clock_gettime(CLOCK_MONOTONIC, &s.ts), static_cast(s.ts.tv_sec * 1000 + + s.ts.tv_nsec / 1000000) }; + timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000) - s.ms; + #endif +} + +/* + * Get a monotonically-increasing time in microseconds. + */ +static inline +uint64_t d_gettime_us() noexcept +{ + #if defined(DISTRHO_OS_MAC) + static const uint64_t s = clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000; + return (clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000) - s; + #elif defined(DISTRHO_OS_WINDOWS) + static struct { + LARGE_INTEGER freq; + LARGE_INTEGER counter; + BOOL r1, r2; + } s = { {}, {}, QueryPerformanceFrequency(&s.freq), QueryPerformanceCounter(&s.counter) }; + + LARGE_INTEGER counter; + QueryPerformanceCounter(&counter); + return (counter.QuadPart - s.counter.QuadPart) * 1000000 / s.freq.QuadPart; + #else + static struct { + timespec ts; + int r; + uint64_t us; + } s = { {}, clock_gettime(CLOCK_MONOTONIC, &s.ts), static_cast(s.ts.tv_sec * 1000000 + + s.ts.tv_nsec / 1000) }; + timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec * 1000000 + ts.tv_nsec / 1000) - s.us; + #endif +} + +/* + * Get a monotonically-increasing time in nanoseconds. + */ +static inline +uint64_t d_gettime_ns() noexcept +{ + #if defined(DISTRHO_OS_MAC) + static const uint64_t s = clock_gettime_nsec_np(CLOCK_UPTIME_RAW); + return clock_gettime_nsec_np(CLOCK_UPTIME_RAW) - s; + #elif defined(DISTRHO_OS_WINDOWS) + static struct { + LARGE_INTEGER freq; + LARGE_INTEGER counter; + BOOL r1, r2; + } s = { {}, {}, QueryPerformanceFrequency(&s.freq), QueryPerformanceCounter(&s.counter) }; + + LARGE_INTEGER counter; + QueryPerformanceCounter(&counter); + return (counter.QuadPart - s.counter.QuadPart) * 1000000000ULL / s.freq.QuadPart; + #else + static struct { + timespec ts; + int r; + uint64_t ns; + } s = { {}, clock_gettime(CLOCK_MONOTONIC, &s.ts), static_cast(s.ts.tv_sec * 1000000000ULL + + s.ts.tv_nsec) }; + timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec * 1000000000ULL + ts.tv_nsec) - s.ns; + #endif +} + +// ----------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_TIME_HPP_INCLUDED diff --git a/dpf/distrho/extra/WebView.hpp b/dpf/distrho/extra/WebView.hpp new file mode 100644 index 0000000..fdc6504 --- /dev/null +++ b/dpf/distrho/extra/WebView.hpp @@ -0,0 +1,28 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef DISTRHO_WEB_VIEW_HPP_INCLUDED +#define DISTRHO_WEB_VIEW_HPP_INCLUDED + +#include "../DistrhoUtils.hpp" + +START_NAMESPACE_DISTRHO + +#include "WebViewImpl.hpp" + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_WEB_VIEW_HPP_INCLUDED diff --git a/dpf/distrho/extra/WebViewImpl.cpp b/dpf/distrho/extra/WebViewImpl.cpp new file mode 100644 index 0000000..d247c1b --- /dev/null +++ b/dpf/distrho/extra/WebViewImpl.cpp @@ -0,0 +1,1493 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#if !defined(DISTRHO_WEB_VIEW_HPP_INCLUDED) && !defined(DGL_WEB_VIEW_HPP_INCLUDED) +# error bad include +#endif +#if !defined(WEB_VIEW_DISTRHO_NAMESPACE) && !defined(WEB_VIEW_DGL_NAMESPACE) +# error bad usage +#endif + +// #include +// #include +// #include + +#ifdef DISTRHO_OS_MAC +# define WEB_VIEW_USING_MACOS_WEBKIT 1 +#else +# define WEB_VIEW_USING_MACOS_WEBKIT 0 +#endif + +#ifdef DISTRHO_OS_WINDOWS +# define WEB_VIEW_USING_CHOC 1 +#else +# define WEB_VIEW_USING_CHOC 0 +#endif + +#if defined(HAVE_X11) && defined(DISTRHO_OS_LINUX) +# define WEB_VIEW_USING_X11_IPC 1 +#else +# define WEB_VIEW_USING_X11_IPC 0 +#endif + +#if WEB_VIEW_USING_CHOC +# include "WebViewWin32.hpp" +# include "String.hpp" +#elif WEB_VIEW_USING_MACOS_WEBKIT +# include +# include +#elif WEB_VIEW_USING_X11_IPC +// #define QT_NO_VERSION_TAGGING +// #include +// #include +// #include +// #undef signals +# include "ChildProcess.hpp" +# include "RingBuffer.hpp" +# include "String.hpp" +# include +# include +# include +# include +# include +# include +# include +# include +# include +# ifdef __linux__ +# include +# include +# include +# else +# include +# endif +#endif + +// ----------------------------------------------------------------------------------------------------------- + +#if WEB_VIEW_USING_MACOS_WEBKIT + +#define MACRO_NAME2(a, b, c) a ## b ## c +#define MACRO_NAME(a, b, c) MACRO_NAME2(a, b, c) + +#define WEB_VIEW_DELEGATE_CLASS_NAME \ + MACRO_NAME(WebViewDelegate_, _, DISTRHO_NAMESPACE) + +@interface WEB_VIEW_DELEGATE_CLASS_NAME : NSObject +@end + +@implementation WEB_VIEW_DELEGATE_CLASS_NAME { +@public + WebViewMessageCallback callback; + void* callbackPtr; + bool loaded; +} + +- (void)webView:(WKWebView *)webview + didFinishNavigation:(WKNavigation*)navigation +{ + d_stdout("page loaded"); + loaded = true; +} + +- (void)webView:(WKWebView*)webview + runJavaScriptAlertPanelWithMessage:(NSString*)message + initiatedByFrame:(WKFrameInfo*)frame + completionHandler:(void (^)(void))completionHandler +{ + NSAlert* const alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert setInformativeText:message]; + [alert setMessageText:@"Alert"]; + + dispatch_async(dispatch_get_main_queue(), ^ + { + [alert beginSheetModalForWindow:[webview window] + completionHandler:^(NSModalResponse) + { + completionHandler(); + [alert release]; + }]; + }); +} + +- (void)webView:(WKWebView*)webview + runJavaScriptConfirmPanelWithMessage:(NSString*)message + initiatedByFrame:(WKFrameInfo*)frame + completionHandler:(void (^)(BOOL))completionHandler +{ + NSAlert* const alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert addButtonWithTitle:@"Cancel"]; + [alert setInformativeText:message]; + [alert setMessageText:@"Confirm"]; + + dispatch_async(dispatch_get_main_queue(), ^ + { + [alert beginSheetModalForWindow:[webview window] + completionHandler:^(NSModalResponse result) + { + completionHandler(result == NSAlertFirstButtonReturn); + [alert release]; + }]; + }); +} + +- (void)webView:(WKWebView*)webview + runJavaScriptTextInputPanelWithPrompt:(NSString*)prompt + defaultText:(NSString*)defaultText + initiatedByFrame:(WKFrameInfo*)frame + completionHandler:(void (^)(NSString*))completionHandler +{ + NSTextField* const input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 250, 30)]; + [input setStringValue:defaultText]; + + NSAlert* const alert = [[NSAlert alloc] init]; + [alert setAccessoryView:input]; + [alert addButtonWithTitle:@"OK"]; + [alert addButtonWithTitle:@"Cancel"]; + [alert setInformativeText:prompt]; + [alert setMessageText: @"Prompt"]; + + dispatch_async(dispatch_get_main_queue(), ^ + { + [alert beginSheetModalForWindow:[webview window] + completionHandler:^(NSModalResponse result) + { + [input validateEditing]; + completionHandler(result == NSAlertFirstButtonReturn ? [input stringValue] : nil); + [alert release]; + }]; + }); +} + +- (void)webView:(WKWebView*)webview + runOpenPanelWithParameters:(WKOpenPanelParameters*)params + initiatedByFrame:(WKFrameInfo*)frame + completionHandler:(void (^)(NSArray*))completionHandler +{ + NSOpenPanel* const panel = [[NSOpenPanel alloc] init]; + + [panel setAllowsMultipleSelection:[params allowsMultipleSelection]]; + // [panel setAllowedFileTypes:(NSArray*)[params _allowedFileExtensions]]; + [panel setCanChooseDirectories:[params allowsDirectories]]; + [panel setCanChooseFiles:![params allowsDirectories]]; + + dispatch_async(dispatch_get_main_queue(), ^ + { + [panel beginSheetModalForWindow:[webview window] + completionHandler:^(NSModalResponse result) + { + completionHandler(result == NSModalResponseOK ? [panel URLs] : nil); + [panel release]; + }]; + }); +} + +- (void)userContentController:(WKUserContentController*)userContentController + didReceiveScriptMessage:(WKScriptMessage*)message +{ + NSString* const nsstring = static_cast([message body]); + char* const string = strdup([nsstring UTF8String]); + d_debug("JS call received '%s' %p", string, callback); + + if (callback != nullptr) + callback(callbackPtr, string); + + std::free(string); +} + +@end + +#endif // WEB_VIEW_USING_MACOS_WEBKIT + +// ----------------------------------------------------------------------------------------------------------- + +#ifdef WEB_VIEW_DGL_NAMESPACE +START_NAMESPACE_DGL +using DISTRHO_NAMESPACE::String; +#else +START_NAMESPACE_DISTRHO +#endif + +// ----------------------------------------------------------------------------------------------------------- + +#if WEB_VIEW_USING_X11_IPC + +#ifdef __linux__ +typedef int32_t ipc_sem_t; +#else +typedef sem_t ipc_sem_t; +#endif + +enum WebViewMessageType { + kWebViewMessageNull, + kWebViewMessageInitData, + kWebViewMessageEvaluateJS, + kWebViewMessageCallback, + kWebViewMessageReload +}; + +struct WebViewSharedBuffer { + static constexpr const uint32_t size = 0x100000; + ipc_sem_t sem; + uint32_t head, tail, wrtn; + bool invalidateCommit; + uint8_t buf[size]; +}; + +struct WebViewRingBuffer { + WebViewSharedBuffer server; + WebViewSharedBuffer client; + bool valid; +}; + +static void webview_wake(ipc_sem_t* const sem) +{ + #ifdef __linux__ + if (__sync_bool_compare_and_swap(sem, 0, 1)) + syscall(SYS_futex, sem, FUTEX_WAKE, 1, nullptr, nullptr, 0); + #else + sem_post(sem); + #endif +} + +static bool webview_timedwait(ipc_sem_t* const sem) +{ + #ifdef __linux__ + const struct timespec timeout = { 1, 0 }; + for (;;) + { + if (__sync_bool_compare_and_swap(sem, 1, 0)) + return true; + if (syscall(SYS_futex, sem, FUTEX_WAIT, 0, &timeout, nullptr, 0) != 0) + if (errno != EAGAIN && errno != EINTR) + return false; + } + #else + struct timespec timeout; + if (clock_gettime(CLOCK_REALTIME, &timeout) != 0) + return false; + + timeout.tv_sec += 1; + + for (int r;;) + { + r = sem_timedwait(sem, &timeout); + + if (r < 0) + r = errno; + + if (r == EINTR) + continue; + + return r == 0; + } + #endif +} + +static void getFilenameFromFunctionPtr(char filename[PATH_MAX], const void* const ptr) +{ + Dl_info info = {}; + dladdr(ptr, &info); + + if (info.dli_fname[0] == '.' && info.dli_fname[1] != '.') + { + if (getcwd(filename, PATH_MAX - 1) == nullptr) + filename[0] = '\0'; + std::strncat(filename, info.dli_fname + 1, PATH_MAX - 1); + } + else if (info.dli_fname[0] != '/') + { + if (getcwd(filename, PATH_MAX - 1) == nullptr) + filename[0] = '\0'; + else + std::strncat(filename, "/", PATH_MAX - 1); + std::strncat(filename, info.dli_fname, PATH_MAX - 1); + } + else + { + std::strncpy(filename, info.dli_fname, PATH_MAX - 1); + } +} + +#endif // WEB_VIEW_USING_X11_IPC + +// ----------------------------------------------------------------------------------------------------------- + +struct WebViewData { + #if WEB_VIEW_USING_CHOC + WebView* webview; + String url; + #elif WEB_VIEW_USING_MACOS_WEBKIT + NSView* view; + WKWebView* webview; + NSURLRequest* urlreq; + WEB_VIEW_DELEGATE_CLASS_NAME* delegate; + #elif WEB_VIEW_USING_X11_IPC + int shmfd = 0; + char shmname[128] = {}; + WebViewRingBuffer* shmptr = nullptr; + WebViewMessageCallback callback = nullptr; + void* callbackPtr = nullptr; + ChildProcess p; + RingBufferControl rbctrl, rbctrl2; + ::Display* display = nullptr; + ::Window childWindow = 0; + ::Window ourWindow = 0; + #endif + WebViewData() {} + DISTRHO_DECLARE_NON_COPYABLE(WebViewData); +}; + +// ----------------------------------------------------------------------------------------------------------- + +WebViewHandle webViewCreate(const char* const url, + const uintptr_t windowId, + const uint initialWidth, + const uint initialHeight, + const double scaleFactor, + const WebViewOptions& options) +{ +#if WEB_VIEW_USING_CHOC + WebView* const webview = webview_choc_create(options); + if (webview == nullptr) + return nullptr; + + const HWND hwnd = static_cast(webview_choc_handle(webview)); + + LONG_PTR flags = GetWindowLongPtr(hwnd, -16); + flags = (flags & ~WS_POPUP) | WS_CHILD; + SetWindowLongPtr(hwnd, -16, flags); + + SetParent(hwnd, reinterpret_cast(windowId)); + SetWindowPos(hwnd, nullptr, + options.offset.x, + options.offset.y, + initialWidth - options.offset.x, + initialHeight - options.offset.y, + SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); + ShowWindow(hwnd, SW_SHOW); + + WebViewData* const whandle = new WebViewData; + whandle->webview = webview; + whandle->url = url; + + webview_choc_navigate(webview, url); + + return whandle; +#elif WEB_VIEW_USING_MACOS_WEBKIT + NSView* const view = reinterpret_cast(windowId); + + WKPreferences* const prefs = [[WKPreferences alloc] init]; + [prefs setValue:@YES forKey:@"javaScriptCanAccessClipboard"]; + [prefs setValue:@YES forKey:@"DOMPasteAllowed"]; + + // if (debug) + { + [prefs setValue:@YES forKey:@"developerExtrasEnabled"]; + // TODO enable_write_console_messages_to_stdout + } + + WKWebViewConfiguration* const config = [[WKWebViewConfiguration alloc] init]; + config.limitsNavigationsToAppBoundDomains = false; + config.preferences = prefs; + + const CGRect rect = CGRectMake(options.offset.x / scaleFactor, + options.offset.y / scaleFactor, + initialWidth / scaleFactor, + initialHeight / scaleFactor); + + WKWebView* const webview = [[WKWebView alloc] initWithFrame:rect + configuration:config]; + [webview setHidden:YES]; + [view addSubview:webview]; + + // TODO webkit_web_view_set_background_color + + WEB_VIEW_DELEGATE_CLASS_NAME* const delegate = [[WEB_VIEW_DELEGATE_CLASS_NAME alloc] init]; + delegate->callback = options.callback; + delegate->callbackPtr = options.callbackPtr; + delegate->loaded = false; + + if (WKUserContentController* const controller = [config userContentController]) + { + [controller addScriptMessageHandler:delegate name:@"external"]; + + WKUserScript* const mscript = [[WKUserScript alloc] + initWithSource:(options.callback != nullptr + ? @"function postMessage(m){window.webkit.messageHandlers.external.postMessage(m)}" + : @"function postMessage(m){}") + injectionTime:WKUserScriptInjectionTimeAtDocumentStart + forMainFrameOnly:true + ]; + [controller addUserScript:mscript]; + [mscript release]; + + if (options.initialJS != nullptr) + { + NSString* const nsInitialJS = [[NSString alloc] initWithBytes:options.initialJS + length:std::strlen(options.initialJS) + encoding:NSUTF8StringEncoding]; + + WKUserScript* const script = [[WKUserScript alloc] initWithSource:nsInitialJS + injectionTime:WKUserScriptInjectionTimeAtDocumentStart + forMainFrameOnly:true]; + + [controller addUserScript:script]; + + [script release]; + [nsInitialJS release]; + } + } + + [webview setNavigationDelegate:delegate]; + [webview setUIDelegate:delegate]; + + NSString* const nsurl = [[NSString alloc] initWithBytes:url + length:std::strlen(url) + encoding:NSUTF8StringEncoding]; + NSURLRequest* const urlreq = [[NSURLRequest alloc] initWithURL: [NSURL URLWithString: nsurl]]; + + d_stdout("url is '%s'", url); + if (std::strncmp(url, "file://", 7) == 0) + { + const char* const lastsep = std::strrchr(url + 7, '/'); + + NSString* const urlpath = [[NSString alloc] initWithBytes:url + length:(lastsep - url) + encoding:NSUTF8StringEncoding]; + + [webview loadFileRequest:urlreq + allowingReadAccessToURL:[NSURL URLWithString:urlpath]]; + + [urlpath release]; + } + else + { + [webview loadRequest:urlreq]; + } + + d_stdout("waiting for load"); + + if (! delegate->loaded) + { + NSAutoreleasePool* const pool = [[NSAutoreleasePool alloc] init]; + NSDate* const date = [NSDate dateWithTimeIntervalSinceNow:0.05]; + NSEvent* event; + + while (! delegate->loaded) + { + event = [NSApp + #ifdef __MAC_10_12 + nextEventMatchingMask:NSEventMaskAny + #else + nextEventMatchingMask:NSAnyEventMask + #endif + untilDate:date + inMode:NSDefaultRunLoopMode + dequeue:YES]; + + if (event == nil) + break; + + [NSApp sendEvent: event]; + } + + [pool release]; + } + + d_stdout("waiting done"); + + [webview setHidden:NO]; + + [nsurl release]; + [config release]; + [prefs release]; + + WebViewData* const handle = new WebViewData; + handle->view = view; + handle->webview = webview; + handle->urlreq = urlreq; + handle->delegate = delegate; + return handle; +#elif WEB_VIEW_USING_X11_IPC + // get startup paths + char ldlinux[PATH_MAX] = {}; + getFilenameFromFunctionPtr(ldlinux, dlsym(nullptr, "_rtld_global")); + + char filename[PATH_MAX] = {}; + getFilenameFromFunctionPtr(filename, reinterpret_cast(webViewCreate)); + + d_stdout("ld-linux is '%s'", ldlinux); + d_stdout("filename is '%s'", filename); + + // setup shared memory + int shmfd; + char shmname[128]; + void* shmptr; + + for (int i = 0; i < 9999; ++i) + { + snprintf(shmname, sizeof(shmname) - 1, "/dpf-webview-%d", i + 1); + shmfd = shm_open(shmname, O_CREAT|O_EXCL|O_RDWR, 0666); + + if (shmfd < 0) + continue; + + if (ftruncate(shmfd, sizeof(WebViewRingBuffer)) != 0) + { + close(shmfd); + shm_unlink(shmname); + continue; + } + + break; + } + + if (shmfd < 0) + { + d_stderr("shm_open failed: %s", strerror(errno)); + return nullptr; + } + + shmptr = mmap(nullptr, sizeof(WebViewRingBuffer), PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0); + + if (shmptr == nullptr || shmptr == MAP_FAILED) + { + d_stderr("mmap failed: %s", strerror(errno)); + close(shmfd); + shm_unlink(shmname); + return nullptr; + } + + #ifndef __linux__ + sem_init(&handle->shmptr->client.sem, 1, 0); + sem_init(&handle->shmptr->server.sem, 1, 0); + #endif + + ::Display* const display = XOpenDisplay(nullptr); + DISTRHO_SAFE_ASSERT_RETURN(display != nullptr, nullptr); + + // set up custom child environment + uint envsize = 0; + while (environ[envsize] != nullptr) + ++envsize; + + char** const envp = new char*[envsize + 5]; + { + uint e = 0; + for (uint i = 0; i < envsize; ++i) + { + if (std::strncmp(environ[i], "LD_PRELOAD=", 11) == 0) + continue; + if (std::strncmp(environ[i], "LD_LIBRARY_PATH=", 16) == 0) + continue; + envp[e++] = strdup(environ[i]); + } + + envp[e++] = strdup("LANG=en_US.UTF-8"); + envp[e++] = ("DPF_WEB_VIEW_SCALE_FACTOR=" + String(scaleFactor)).getAndReleaseBuffer(); + envp[e++] = ("DPF_WEB_VIEW_WIN_ID=" +String(windowId)).getAndReleaseBuffer(); + + for (uint i = e; i < envsize + 5; ++i) + envp[e++] = nullptr; + } + + WebViewData* const handle = new WebViewData; + handle->callback = options.callback; + handle->callbackPtr = options.callbackPtr; + handle->shmfd = shmfd; + handle->shmptr = static_cast(shmptr); + handle->display = display; + handle->ourWindow = windowId; + std::memcpy(handle->shmname, shmname, sizeof(shmname)); + + handle->shmptr->valid = true; + + handle->rbctrl.setRingBuffer(&handle->shmptr->client, false); + handle->rbctrl.flush(); + + handle->rbctrl2.setRingBuffer(&handle->shmptr->server, false); + handle->rbctrl2.flush(); + + const char* const args[] = { ldlinux, filename, "dpf-ld-linux-webview", shmname, nullptr }; + handle->p.start(args, envp); + + for (uint i = 0; envp[i] != nullptr; ++i) + std::free(envp[i]); + delete[] envp; + + const size_t urllen = std::strlen(url); + const size_t initjslen = options.initialJS != nullptr ? std::strlen(options.initialJS) + 1 : 0; + handle->rbctrl.writeUInt(kWebViewMessageInitData) && + handle->rbctrl.writeULong(windowId) && + handle->rbctrl.writeUInt(initialWidth) && + handle->rbctrl.writeUInt(initialHeight) && + handle->rbctrl.writeDouble(scaleFactor) && + handle->rbctrl.writeInt(options.offset.x) && + handle->rbctrl.writeInt(options.offset.y) && + handle->rbctrl.writeUInt(urllen) && + handle->rbctrl.writeCustomData(url, urllen) && + handle->rbctrl.writeUInt(initjslen) && + initjslen != 0 && + handle->rbctrl.writeCustomData(options.initialJS, initjslen); + handle->rbctrl.commitWrite(); + webview_wake(&handle->shmptr->client.sem); + + for (int i = 0; i < 5 && handle->p.isRunning(); ++i) + { + if (webview_timedwait(&handle->shmptr->server.sem)) + return handle; + } + + d_stderr("webview client side failed to start"); + webViewDestroy(handle); + return nullptr; +#endif + + // maybe unused + (void)windowId; + (void)initialWidth; + (void)initialHeight; + (void)scaleFactor; + (void)options; + return nullptr; +} + +void webViewDestroy(const WebViewHandle handle) +{ + #if WEB_VIEW_USING_CHOC + webview_choc_destroy(handle->webview); + #elif WEB_VIEW_USING_MACOS_WEBKIT + [handle->webview setHidden:YES]; + [handle->webview removeFromSuperview]; + [handle->urlreq release]; + // [handle->delegate release]; + #elif WEB_VIEW_USING_X11_IPC + #ifndef __linux__ + sem_destroy(&handle->shmptr->client.sem); + sem_destroy(&handle->shmptr->server.sem); + #endif + munmap(handle->shmptr, sizeof(WebViewRingBuffer)); + close(handle->shmfd); + shm_unlink(handle->shmname); + XCloseDisplay(handle->display); + #endif + delete handle; +} + +void webViewIdle(const WebViewHandle handle) +{ + #if WEB_VIEW_USING_X11_IPC + uint32_t size = 0; + void* buffer = nullptr; + + while (handle->rbctrl2.isDataAvailableForReading()) + { + switch (handle->rbctrl2.readUInt()) + { + case kWebViewMessageCallback: + if (const uint32_t len = handle->rbctrl2.readUInt()) + { + if (len > size) + { + size = len; + buffer = std::realloc(buffer, len); + + if (buffer == nullptr) + { + d_stderr("server out of memory, abort!"); + handle->rbctrl2.flush(); + return; + } + } + + if (handle->rbctrl2.readCustomData(buffer, len)) + { + d_debug("server kWebViewMessageCallback -> '%s'", static_cast(buffer)); + if (handle->callback != nullptr) + handle->callback(handle->callbackPtr, static_cast(buffer)); + continue; + } + } + break; + } + + d_stderr("server ringbuffer data race, abort!"); + handle->rbctrl2.flush(); + return; + } + #else + // unused + (void)handle; + #endif +} + +void webViewEvaluateJS(const WebViewHandle handle, const char* const js) +{ + #if WEB_VIEW_USING_CHOC + webview_choc_eval(handle->webview, js); + #elif WEB_VIEW_USING_MACOS_WEBKIT + NSString* const nsjs = [[NSString alloc] initWithBytes:js + length:std::strlen(js) + encoding:NSUTF8StringEncoding]; + [handle->webview evaluateJavaScript:nsjs completionHandler:nil]; + [nsjs release]; + #elif WEB_VIEW_USING_X11_IPC + d_debug("evaluateJS '%s'", js); + const size_t len = std::strlen(js) + 1; + handle->rbctrl.writeUInt(kWebViewMessageEvaluateJS) && + handle->rbctrl.writeUInt(len) && + handle->rbctrl.writeCustomData(js, len); + if (handle->rbctrl.commitWrite()) + webview_wake(&handle->shmptr->client.sem); + #endif + + // maybe unused + (void)handle; + (void)js; +} + +void webViewReload(const WebViewHandle handle) +{ + #if WEB_VIEW_USING_CHOC + webview_choc_navigate(handle->webview, handle->url); + #elif WEB_VIEW_USING_MACOS_WEBKIT + [handle->webview loadRequest:handle->urlreq]; + #elif WEB_VIEW_USING_X11_IPC + d_stdout("reload"); + handle->rbctrl.writeUInt(kWebViewMessageReload); + if (handle->rbctrl.commitWrite()) + webview_wake(&handle->shmptr->client.sem); + #endif + + // maybe unused + (void)handle; +} + +void webViewResize(const WebViewHandle handle, const uint width, const uint height, const double scaleFactor) +{ + #if WEB_VIEW_USING_CHOC + const HWND hwnd = static_cast(webview_choc_handle(handle->webview)); + SetWindowPos(hwnd, nullptr, 0, 0, width, height, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); + #elif WEB_VIEW_USING_MACOS_WEBKIT + [handle->webview setFrameSize:NSMakeSize(width / scaleFactor, height / scaleFactor)]; + #elif WEB_VIEW_USING_X11_IPC + if (handle->childWindow == 0) + { + ::Window rootWindow, parentWindow; + ::Window* childWindows = nullptr; + uint numChildren = 0; + + XFlush(handle->display); + XQueryTree(handle->display, handle->ourWindow, &rootWindow, &parentWindow, &childWindows, &numChildren); + + if (numChildren == 0 || childWindows == nullptr) + return; + + handle->childWindow = childWindows[0]; + XFree(childWindows); + } + + XResizeWindow(handle->display, handle->childWindow, width, height); + XFlush(handle->display); + #endif + + // maybe unused + (void)handle; + (void)width; + (void)height; + (void)scaleFactor; +} + +#if WEB_VIEW_USING_X11_IPC + +// ----------------------------------------------------------------------------------------------------------- + +static std::function evaluateFn; +static std::function reloadFn; +static std::function terminateFn; +static std::function wakeFn; + +// ----------------------------------------------------------------------------------------------------------- + +struct GtkContainer; +struct GtkPlug; +struct GtkWidget; +struct GtkWindow; +struct JSCValue; +struct WebKitJavascriptResult; +struct WebKitSettings; +struct WebKitUserContentManager; +struct WebKitUserScript; +struct WebKitWebView; +typedef int gboolean; + +#define G_CALLBACK(p) reinterpret_cast(p) +#define GTK_CONTAINER(p) reinterpret_cast(p) +#define GTK_PLUG(p) reinterpret_cast(p) +#define GTK_WINDOW(p) reinterpret_cast(p) +#define WEBKIT_WEB_VIEW(p) reinterpret_cast(p) + +// struct QApplication; +// struct QUrl; +// struct QWebEngineView; +// struct QWindow; + +// ----------------------------------------------------------------------------------------------------------- + +#define JOIN(A, B) A ## B + +#define AUTOSYM(S) \ + using JOIN(gtk3_, S) = decltype(&S); \ + JOIN(gtk3_, S) S = reinterpret_cast(dlsym(nullptr, #S)); \ + DISTRHO_SAFE_ASSERT_RETURN(S != nullptr, false); + +#define CSYM(S, NAME) \ + S NAME = reinterpret_cast(dlsym(nullptr, #NAME)); \ + DISTRHO_SAFE_ASSERT_RETURN(NAME != nullptr, false); + +#define CPPSYM(S, NAME, SN) \ + S NAME = reinterpret_cast(dlsym(nullptr, #SN)); \ + DISTRHO_SAFE_ASSERT_RETURN(NAME != nullptr, false); + +// ----------------------------------------------------------------------------------------------------------- +// gtk3 variant + +static void gtk3_idle(void* const ptr) +{ + WebViewRingBuffer* const shmptr = static_cast(ptr); + + RingBufferControl rbctrl; + rbctrl.setRingBuffer(&shmptr->client, false); + + uint32_t size = 0; + void* buffer = nullptr; + + while (rbctrl.isDataAvailableForReading()) + { + switch (rbctrl.readUInt()) + { + case kWebViewMessageEvaluateJS: + if (const uint32_t len = rbctrl.readUInt()) + { + if (len > size) + { + size = len; + buffer = realloc(buffer, len); + + if (buffer == nullptr) + { + d_stderr("lv2ui client out of memory, abort!"); + abort(); + } + } + + if (rbctrl.readCustomData(buffer, len)) + { + d_debug("client kWebViewMessageEvaluateJS -> '%s'", static_cast(buffer)); + evaluateFn(static_cast(buffer)); + continue; + } + } + break; + case kWebViewMessageReload: + d_debug("client kWebViewMessageReload"); + reloadFn(); + continue; + } + + d_stderr("client ringbuffer data race, abort!"); + abort(); + } + + free(buffer); +} + +static int gtk3_js_cb(WebKitUserContentManager*, WebKitJavascriptResult* const result, void* const arg) +{ + WebViewRingBuffer* const shmptr = static_cast(arg); + + using g_free_t = void (*)(void*); + using jsc_value_to_string_t = char* (*)(JSCValue*); + using webkit_javascript_result_get_js_value_t = JSCValue* (*)(WebKitJavascriptResult*); + + CSYM(g_free_t, g_free) + CSYM(jsc_value_to_string_t, jsc_value_to_string) + CSYM(webkit_javascript_result_get_js_value_t, webkit_javascript_result_get_js_value) + + JSCValue* const value = webkit_javascript_result_get_js_value(result); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr, false); + + char* const string = jsc_value_to_string(value); + DISTRHO_SAFE_ASSERT_RETURN(string != nullptr, false); + + d_debug("js call received with data '%s'", string); + + const size_t len = std::strlen(string); + RingBufferControl rbctrl2; + rbctrl2.setRingBuffer(&shmptr->server, false); + rbctrl2.writeUInt(kWebViewMessageCallback) && + rbctrl2.writeUInt(len) && + rbctrl2.writeCustomData(string, len); + rbctrl2.commitWrite(); + + g_free(string); + return 0; +} + +static bool gtk3(Display* const display, + const Window winId, + const int x, + const int y, + const uint width, + const uint height, + double scaleFactor, + const char* const url, + const char* const initialJS, + WebViewRingBuffer* const shmptr) +{ + void* lib; + if ((lib = dlopen("libwebkit2gtk-4.0.so.37", RTLD_NOW|RTLD_GLOBAL)) == nullptr || + (lib = dlopen("libwebkit2gtk-4.0.so", RTLD_NOW|RTLD_GLOBAL)) == nullptr) + return false; + + using g_main_context_invoke_t = void (*)(void*, void*, void*); + using g_signal_connect_data_t = ulong (*)(void*, const char*, void*, void*, void*, int); + using gdk_set_allowed_backends_t = void (*)(const char*); + using gtk_container_add_t = void (*)(GtkContainer*, GtkWidget*); + using gtk_init_check_t = gboolean (*)(int*, char***); + using gtk_main_t = void (*)(); + using gtk_main_quit_t = void (*)(); + using gtk_plug_get_id_t = Window (*)(GtkPlug*); + using gtk_plug_new_t = GtkWidget* (*)(Window); + using gtk_widget_show_all_t = void (*)(GtkWidget*); + using gtk_window_move_t = void (*)(GtkWindow*, int, int); + using gtk_window_set_default_size_t = void (*)(GtkWindow*, int, int); + using webkit_settings_new_t = WebKitSettings* (*)(); + using webkit_settings_set_enable_developer_extras_t = void (*)(WebKitSettings*, gboolean); + using webkit_settings_set_enable_write_console_messages_to_stdout_t = void (*)(WebKitSettings*, gboolean); + using webkit_settings_set_hardware_acceleration_policy_t = void (*)(WebKitSettings*, int); + using webkit_settings_set_javascript_can_access_clipboard_t = void (*)(WebKitSettings*, gboolean); + using webkit_user_content_manager_add_script_t = void (*)(WebKitUserContentManager*, WebKitUserScript*); + using webkit_user_content_manager_register_script_message_handler_t = gboolean (*)(WebKitUserContentManager*, const char*); + using webkit_user_script_new_t = WebKitUserScript* (*)(const char*, int, int, const char* const*, const char* const*); + using webkit_web_view_evaluate_javascript_t = void* (*)(WebKitWebView*, const char*, ssize_t, const char*, const char*, void*, void*, void*); + using webkit_web_view_get_user_content_manager_t = WebKitUserContentManager* (*)(WebKitWebView*); + using webkit_web_view_load_uri_t = void (*)(WebKitWebView*, const char*); + using webkit_web_view_new_with_settings_t = GtkWidget* (*)(WebKitSettings*); + using webkit_web_view_run_javascript_t = void* (*)(WebKitWebView*, const char*, void*, void*, void*); + using webkit_web_view_set_background_color_t = void (*)(WebKitWebView*, const double*); + + CSYM(g_main_context_invoke_t, g_main_context_invoke) + CSYM(g_signal_connect_data_t, g_signal_connect_data) + CSYM(gdk_set_allowed_backends_t, gdk_set_allowed_backends) + CSYM(gtk_container_add_t, gtk_container_add) + CSYM(gtk_init_check_t, gtk_init_check) + CSYM(gtk_main_t, gtk_main) + CSYM(gtk_main_quit_t, gtk_main_quit) + CSYM(gtk_plug_get_id_t, gtk_plug_get_id) + CSYM(gtk_plug_new_t, gtk_plug_new) + CSYM(gtk_widget_show_all_t, gtk_widget_show_all) + CSYM(gtk_window_move_t, gtk_window_move) + CSYM(gtk_window_set_default_size_t, gtk_window_set_default_size) + CSYM(webkit_settings_new_t, webkit_settings_new) + CSYM(webkit_settings_set_enable_developer_extras_t, webkit_settings_set_enable_developer_extras) + CSYM(webkit_settings_set_enable_write_console_messages_to_stdout_t, webkit_settings_set_enable_write_console_messages_to_stdout) + CSYM(webkit_settings_set_hardware_acceleration_policy_t, webkit_settings_set_hardware_acceleration_policy) + CSYM(webkit_settings_set_javascript_can_access_clipboard_t, webkit_settings_set_javascript_can_access_clipboard) + CSYM(webkit_user_content_manager_add_script_t, webkit_user_content_manager_add_script) + CSYM(webkit_user_content_manager_register_script_message_handler_t, webkit_user_content_manager_register_script_message_handler) + CSYM(webkit_user_script_new_t, webkit_user_script_new) + CSYM(webkit_web_view_get_user_content_manager_t, webkit_web_view_get_user_content_manager) + CSYM(webkit_web_view_load_uri_t, webkit_web_view_load_uri) + CSYM(webkit_web_view_new_with_settings_t, webkit_web_view_new_with_settings) + CSYM(webkit_web_view_set_background_color_t, webkit_web_view_set_background_color) + + // special case for legacy API handling + webkit_web_view_evaluate_javascript_t webkit_web_view_evaluate_javascript = reinterpret_cast(dlsym(nullptr, "webkit_web_view_evaluate_javascript")); + webkit_web_view_run_javascript_t webkit_web_view_run_javascript = reinterpret_cast(dlsym(nullptr, "webkit_web_view_run_javascript")); + DISTRHO_SAFE_ASSERT_RETURN(webkit_web_view_evaluate_javascript != nullptr || webkit_web_view_run_javascript != nullptr, false); + + const int gdkScale = std::fmod(scaleFactor, 1.0) >= 0.75 + ? static_cast(scaleFactor + 0.5) + : static_cast(scaleFactor); + + if (gdkScale != 1) + { + char scale[8] = {}; + std::snprintf(scale, 7, "%d", gdkScale); + setenv("GDK_SCALE", scale, 1); + + std::snprintf(scale, 7, "%.2f", (1.0 / scaleFactor) * 1.2); + setenv("GDK_DPI_SCALE", scale, 1); + } + else if (scaleFactor > 1.0) + { + char scale[8] = {}; + std::snprintf(scale, 7, "%.2f", (1.0 / scaleFactor) * 1.4); + setenv("GDK_DPI_SCALE", scale, 1); + } + + scaleFactor /= gdkScale; + + gdk_set_allowed_backends("x11"); + + if (! gtk_init_check (nullptr, nullptr)) + return false; + + GtkWidget* const window = gtk_plug_new(winId); + DISTRHO_SAFE_ASSERT_RETURN(window != nullptr, false); + + gtk_window_set_default_size(GTK_WINDOW(window), + (width - x) * scaleFactor, + (height - y) * scaleFactor); + gtk_window_move(GTK_WINDOW(window), x * scaleFactor, y * scaleFactor); + + WebKitSettings* const settings = webkit_settings_new(); + DISTRHO_SAFE_ASSERT_RETURN(settings != nullptr, false); + + // TODO DOMPasteAllowed + webkit_settings_set_javascript_can_access_clipboard(settings, true); + webkit_settings_set_hardware_acceleration_policy(settings, 2 /* WEBKIT_HARDWARE_ACCELERATION_POLICY_NEVER */); + + // if (debug) + { + webkit_settings_set_enable_developer_extras(settings, true); + webkit_settings_set_enable_write_console_messages_to_stdout(settings, true); + } + + GtkWidget* const webview = webkit_web_view_new_with_settings(settings); + DISTRHO_SAFE_ASSERT_RETURN(webview != nullptr, false); + + const double color[] = {49.0/255, 54.0/255, 59.0/255, 1}; + webkit_web_view_set_background_color(WEBKIT_WEB_VIEW(webview), color); + + if (WebKitUserContentManager* const manager = webkit_web_view_get_user_content_manager(WEBKIT_WEB_VIEW(webview))) + { + g_signal_connect_data(manager, "script-message-received::external", G_CALLBACK(gtk3_js_cb), shmptr, nullptr, 0); + webkit_user_content_manager_register_script_message_handler(manager, "external"); + + WebKitUserScript* const mscript = webkit_user_script_new( + "function postMessage(m){window.webkit.messageHandlers.external.postMessage(m)}", 0, 0, nullptr, nullptr); + webkit_user_content_manager_add_script(manager, mscript); + + if (initialJS != nullptr) + { + WebKitUserScript* const script = webkit_user_script_new(initialJS, 0, 0, nullptr, nullptr); + webkit_user_content_manager_add_script(manager, script); + } + } + + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview), url); + + gtk_container_add(GTK_CONTAINER(window), webview); + + gtk_widget_show_all(window); + + Window wid = gtk_plug_get_id(GTK_PLUG(window)); + XMapWindow(display, wid); + XFlush(display); + + evaluateFn = [=](const char* const js){ + if (webkit_web_view_evaluate_javascript != nullptr) + webkit_web_view_evaluate_javascript(WEBKIT_WEB_VIEW(webview), js, -1, + nullptr, nullptr, nullptr, nullptr, nullptr); + else + webkit_web_view_run_javascript(WEBKIT_WEB_VIEW(webview), js, nullptr, nullptr, nullptr); + }; + + reloadFn = [=](){ + webkit_web_view_load_uri(WEBKIT_WEB_VIEW(webview), url); + }; + + terminateFn = [=](){ + d_stdout("terminateFn"); + static bool quit = true; + if (quit) + { + quit = false; + gtk_main_quit(); + } + }; + + wakeFn = [=](WebViewRingBuffer* const rb){ + g_main_context_invoke(NULL, G_CALLBACK(gtk3_idle), rb); + }; + + // notify server we started ok + webview_wake(&shmptr->server.sem); + + gtk_main(); + d_stdout("quit"); + + dlclose(lib); + return true; +} + +#if 0 +// ----------------------------------------------------------------------------------------------------------- +// qt5webengine variant + +static bool qt5webengine(const Window winId, const double scaleFactor, const char* const url) +{ + void* lib; + if ((lib = dlopen("libQt5WebEngineWidgets.so.5", RTLD_NOW|RTLD_GLOBAL)) == nullptr || + (lib = dlopen("libQt5WebEngineWidgets.so", RTLD_NOW|RTLD_GLOBAL)) == nullptr) + return false; + + using QApplication__init_t = void (*)(QApplication*, int&, char**, int); + using QApplication_exec_t = void (*)(); + using QApplication_setAttribute_t = void (*)(Qt::ApplicationAttribute, bool); + using QString__init_t = void (*)(void*, const QChar*, ptrdiff_t); + using QUrl__init_t = void (*)(void*, const QString&, int /* QUrl::ParsingMode */); + using QWebEngineView__init_t = void (*)(QWebEngineView*, void*); + using QWebEngineView_move_t = void (*)(QWebEngineView*, const QPoint&); + using QWebEngineView_resize_t = void (*)(QWebEngineView*, const QSize&); + using QWebEngineView_setUrl_t = void (*)(QWebEngineView*, const QUrl&); + using QWebEngineView_show_t = void (*)(QWebEngineView*); + using QWebEngineView_winId_t = ulonglong (*)(QWebEngineView*); + using QWebEngineView_windowHandle_t = QWindow* (*)(QWebEngineView*); + using QWindow_fromWinId_t = QWindow* (*)(ulonglong); + using QWindow_setParent_t = void (*)(QWindow*, void*); + + CPPSYM(QApplication__init_t, QApplication__init, _ZN12QApplicationC1ERiPPci) + CPPSYM(QApplication_exec_t, QApplication_exec, _ZN15QGuiApplication4execEv) + CPPSYM(QApplication_setAttribute_t, QApplication_setAttribute, _ZN16QCoreApplication12setAttributeEN2Qt20ApplicationAttributeEb) + CPPSYM(QString__init_t, QString__init, _ZN7QStringC2EPK5QChari) + CPPSYM(QUrl__init_t, QUrl__init, _ZN4QUrlC1ERK7QStringNS_11ParsingModeE) + CPPSYM(QWebEngineView__init_t, QWebEngineView__init, _ZN14QWebEngineViewC1EP7QWidget) + CPPSYM(QWebEngineView_move_t, QWebEngineView_move, _ZN7QWidget4moveERK6QPoint) + CPPSYM(QWebEngineView_resize_t, QWebEngineView_resize, _ZN7QWidget6resizeERK5QSize) + CPPSYM(QWebEngineView_setUrl_t, QWebEngineView_setUrl, _ZN14QWebEngineView6setUrlERK4QUrl) + CPPSYM(QWebEngineView_show_t, QWebEngineView_show, _ZN7QWidget4showEv) + CPPSYM(QWebEngineView_winId_t, QWebEngineView_winId, _ZNK7QWidget5winIdEv) + CPPSYM(QWebEngineView_windowHandle_t, QWebEngineView_windowHandle, _ZNK7QWidget12windowHandleEv) + CPPSYM(QWindow_fromWinId_t, QWindow_fromWinId, _ZN7QWindow9fromWinIdEy) + CPPSYM(QWindow_setParent_t, QWindow_setParent, _ZN7QWindow9setParentEPS_) + + unsetenv("QT_FONT_DPI"); + unsetenv("QT_SCREEN_SCALE_FACTORS"); + unsetenv("QT_USE_PHYSICAL_DPI"); + setenv("QT_AUTO_SCREEN_SCALE_FACTOR", "0", 1); + + char scale[8] = {}; + std::snprintf(scale, 7, "%.2f", scaleFactor); + setenv("QT_SCALE_FACTOR", scale, 1); + + QApplication_setAttribute(Qt::AA_X11InitThreads, true); + QApplication_setAttribute(Qt::AA_EnableHighDpiScaling, true); + QApplication_setAttribute(Qt::AA_UseHighDpiPixmaps, true); + + static int argc = 0; + static char* argv[] = { nullptr }; + + uint8_t _app[64]; // sizeof(QApplication) == 16 + QApplication* const app = reinterpret_cast(_app); + QApplication__init(app, argc, argv, 0); + + uint8_t _qstrurl[32]; // sizeof(QString) == 8 + QString* const qstrurl(reinterpret_cast(_qstrurl)); + + { + const size_t url_len = std::strlen(url); + QChar* const url_qchar = new QChar[url_len + 1]; + + for (size_t i = 0; i < url_len; ++i) + url_qchar[i] = QChar(url[i]); + + url_qchar[url_len] = 0; + + QString__init(qstrurl, url_qchar, url_len); + } + + uint8_t _qurl[32]; // sizeof(QUrl) == 8 + QUrl* const qurl(reinterpret_cast(_qurl)); + QUrl__init(qurl, *qstrurl, 1 /* QUrl::StrictMode */); + + uint8_t _webview[128]; // sizeof(QWebEngineView) == 56 + QWebEngineView* const webview = reinterpret_cast(_webview); + QWebEngineView__init(webview, nullptr); + + QWebEngineView_move(webview, QPoint(0, kVerticalOffset)); + QWebEngineView_resize(webview, QSize(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT - kVerticalOffset)); + QWebEngineView_winId(webview); + QWindow_setParent(QWebEngineView_windowHandle(webview), QWindow_fromWinId(winId)); + QWebEngineView_setUrl(webview, *qurl); + QWebEngineView_show(webview); + + reloadFn = [=](){ + QWebEngineView_setUrl(webview, *qurl); + }; + + terminateFn = [=](){ + // TODO + }; + + QApplication_exec(); + + dlclose(lib); + return true; +} + +// ----------------------------------------------------------------------------------------------------------- +// qt6webengine variant (same as qt5 but `QString__init_t` has different arguments) + +static bool qt6webengine(const Window winId, const double scaleFactor, const char* const url) +{ + void* lib; + if ((lib = dlopen("libQt6WebEngineWidgets.so.6", RTLD_NOW|RTLD_GLOBAL)) == nullptr || + (lib = dlopen("libQt6WebEngineWidgets.so", RTLD_NOW|RTLD_GLOBAL)) == nullptr) + return false; + + using QApplication__init_t = void (*)(QApplication*, int&, char**, int); + using QApplication_exec_t = void (*)(); + using QApplication_setAttribute_t = void (*)(Qt::ApplicationAttribute, bool); + using QString__init_t = void (*)(void*, const QChar*, long long); + using QUrl__init_t = void (*)(void*, const QString&, int /* QUrl::ParsingMode */); + using QWebEngineView__init_t = void (*)(QWebEngineView*, void*); + using QWebEngineView_move_t = void (*)(QWebEngineView*, const QPoint&); + using QWebEngineView_resize_t = void (*)(QWebEngineView*, const QSize&); + using QWebEngineView_setUrl_t = void (*)(QWebEngineView*, const QUrl&); + using QWebEngineView_show_t = void (*)(QWebEngineView*); + using QWebEngineView_winId_t = ulonglong (*)(QWebEngineView*); + using QWebEngineView_windowHandle_t = QWindow* (*)(QWebEngineView*); + using QWindow_fromWinId_t = QWindow* (*)(ulonglong); + using QWindow_setParent_t = void (*)(QWindow*, void*); + + CPPSYM(QApplication__init_t, QApplication__init, _ZN12QApplicationC1ERiPPci) + CPPSYM(QApplication_exec_t, QApplication_exec, _ZN15QGuiApplication4execEv) + CPPSYM(QApplication_setAttribute_t, QApplication_setAttribute, _ZN16QCoreApplication12setAttributeEN2Qt20ApplicationAttributeEb) + CPPSYM(QString__init_t, QString__init, _ZN7QStringC2EPK5QCharx) + CPPSYM(QUrl__init_t, QUrl__init, _ZN4QUrlC1ERK7QStringNS_11ParsingModeE) + CPPSYM(QWebEngineView__init_t, QWebEngineView__init, _ZN14QWebEngineViewC1EP7QWidget) + CPPSYM(QWebEngineView_move_t, QWebEngineView_move, _ZN7QWidget4moveERK6QPoint) + CPPSYM(QWebEngineView_resize_t, QWebEngineView_resize, _ZN7QWidget6resizeERK5QSize) + CPPSYM(QWebEngineView_setUrl_t, QWebEngineView_setUrl, _ZN14QWebEngineView6setUrlERK4QUrl) + CPPSYM(QWebEngineView_show_t, QWebEngineView_show, _ZN7QWidget4showEv) + CPPSYM(QWebEngineView_winId_t, QWebEngineView_winId, _ZNK7QWidget5winIdEv) + CPPSYM(QWebEngineView_windowHandle_t, QWebEngineView_windowHandle, _ZNK7QWidget12windowHandleEv) + CPPSYM(QWindow_fromWinId_t, QWindow_fromWinId, _ZN7QWindow9fromWinIdEy) + CPPSYM(QWindow_setParent_t, QWindow_setParent, _ZN7QWindow9setParentEPS_) + + unsetenv("QT_FONT_DPI"); + unsetenv("QT_SCREEN_SCALE_FACTORS"); + unsetenv("QT_USE_PHYSICAL_DPI"); + setenv("QT_AUTO_SCREEN_SCALE_FACTOR", "0", 1); + + char scale[8] = {}; + std::snprintf(scale, 7, "%.2f", scaleFactor); + setenv("QT_SCALE_FACTOR", scale, 1); + + QApplication_setAttribute(Qt::AA_X11InitThreads, true); + QApplication_setAttribute(Qt::AA_EnableHighDpiScaling, true); + QApplication_setAttribute(Qt::AA_UseHighDpiPixmaps, true); + + static int argc = 0; + static char* argv[] = { nullptr }; + + uint8_t _app[64]; // sizeof(QApplication) == 16 + QApplication* const app = reinterpret_cast(_app); + QApplication__init(app, argc, argv, 0); + + uint8_t _qstrurl[32]; // sizeof(QString) == 8 + QString* const qstrurl(reinterpret_cast(_qstrurl)); + + { + const size_t url_len = std::strlen(url); + QChar* const url_qchar = new QChar[url_len + 1]; + + for (size_t i = 0; i < url_len; ++i) + url_qchar[i] = QChar(url[i]); + + url_qchar[url_len] = 0; + + QString__init(qstrurl, url_qchar, url_len); + } + + uint8_t _qurl[32]; // sizeof(QUrl) == 8 + QUrl* const qurl(reinterpret_cast(_qurl)); + QUrl__init(qurl, *qstrurl, 1 /* QUrl::StrictMode */); + + uint8_t _webview[128]; // sizeof(QWebEngineView) == 56 + QWebEngineView* const webview = reinterpret_cast(_webview); + QWebEngineView__init(webview, nullptr); + + QWebEngineView_move(webview, QPoint(0, kVerticalOffset)); + QWebEngineView_resize(webview, QSize(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT - kVerticalOffset)); + QWebEngineView_winId(webview); + QWindow_setParent(QWebEngineView_windowHandle(webview), QWindow_fromWinId(winId)); + QWebEngineView_setUrl(webview, *qurl); + QWebEngineView_show(webview); + + reloadFn = [=](){ + QWebEngineView_setUrl(webview, *qurl); + }; + + terminateFn = [=](){ + // TODO + }; + + QApplication_exec(); + + dlclose(lib); + return true; +} +#endif + +// ----------------------------------------------------------------------------------------------------------- +// startup via ld-linux + +static void signalHandler(const int sig) +{ + switch (sig) + { + case SIGTERM: + terminateFn(); + break; + } +} + +static void* threadHandler(void* const ptr) +{ + WebViewRingBuffer* const shmptr = static_cast(ptr); + + // TODO wait until page is loaded, or something better + d_sleep(1); + + while (shmptr->valid) + { + if (webview_timedwait(&shmptr->client.sem)) + wakeFn(shmptr); + } + + return nullptr; +} + +int dpf_webview_start(const int argc, char* argv[]) +{ + d_stdout("started %d %s", argc, argv[1]); + + if (argc != 3) + { + d_stderr("WebView entry point, nothing to see here! ;)"); + return 1; + } + + uselocale(newlocale(LC_NUMERIC_MASK, "C", nullptr)); + + Display* const display = XOpenDisplay(nullptr); + DISTRHO_SAFE_ASSERT_RETURN(display != nullptr, 1); + + const char* const shmname = argv[2]; + const int shmfd = shm_open(shmname, O_RDWR, 0); + if (shmfd < 0) + { + d_stderr("shm_open failed: %s", std::strerror(errno)); + return 1; + } + + WebViewRingBuffer* const shmptr = static_cast(mmap(nullptr, + sizeof(WebViewRingBuffer), + PROT_READ|PROT_WRITE, + MAP_SHARED, + shmfd, 0)); + if (shmptr == nullptr || shmptr == nullptr) + { + d_stderr("mmap failed: %s", std::strerror(errno)); + close(shmfd); + return 1; + } + + RingBufferControl rbctrl; + rbctrl.setRingBuffer(&shmptr->client, false); + + // fetch initial data + bool hasInitialData = false; + Window winId = 0; + uint width = 0, height = 0; + double scaleFactor = 0; + int x = 0, y = 0; + char* url = nullptr; + char* initJS = nullptr; + + while (shmptr->valid && webview_timedwait(&shmptr->client.sem)) + { + if (rbctrl.isDataAvailableForReading()) + { + DISTRHO_SAFE_ASSERT_RETURN(rbctrl.readUInt() == kWebViewMessageInitData, 1); + + hasInitialData = true; + winId = rbctrl.readULong(); + width = rbctrl.readUInt(); + height = rbctrl.readUInt(); + scaleFactor = rbctrl.readDouble(); + x = rbctrl.readInt(); + y = rbctrl.readInt(); + + const uint urllen = rbctrl.readUInt(); + url = static_cast(std::malloc(urllen)); + rbctrl.readCustomData(url, urllen); + + if (const uint initjslen = rbctrl.readUInt()) + { + initJS = static_cast(std::malloc(initjslen)); + rbctrl.readCustomData(initJS, initjslen); + } + } + } + + pthread_t thread; + if (hasInitialData && pthread_create(&thread, nullptr, threadHandler, shmptr) == 0) + { + struct sigaction sig = {}; + sig.sa_handler = signalHandler; + sig.sa_flags = SA_RESTART; + sigemptyset(&sig.sa_mask); + sigaction(SIGTERM, &sig, nullptr); + + // qt5webengine(winId, scaleFactor, url) || + // qt6webengine(winId, scaleFactor, url) || + gtk3(display, winId, x, y, width, height, scaleFactor, url, initJS, shmptr); + + shmptr->valid = false; + pthread_join(thread, nullptr); + } + + munmap(shmptr, sizeof(WebViewRingBuffer)); + close(shmfd); + + XCloseDisplay(display); + + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------- + +#endif // WEB_VIEW_USING_X11_IPC + +#ifdef WEB_VIEW_DGL_NAMESPACE +END_NAMESPACE_DGL +#else +END_NAMESPACE_DISTRHO +#endif + +#undef MACRO_NAME +#undef MACRO_NAME2 + +#undef WEB_VIEW_DISTRHO_NAMESPACE +#undef WEB_VIEW_DGL_NAMESPACE diff --git a/dpf/distrho/extra/WebViewImpl.hpp b/dpf/distrho/extra/WebViewImpl.hpp new file mode 100644 index 0000000..1b4f819 --- /dev/null +++ b/dpf/distrho/extra/WebViewImpl.hpp @@ -0,0 +1,126 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#if !defined(DISTRHO_WEB_VIEW_HPP_INCLUDED) && !defined(DGL_WEB_VIEW_HPP_INCLUDED) +# error bad include +#endif + +#if !defined(DGL_UI_USE_WEB_VIEW) && defined(DISTRHO_UI_WEB_VIEW) && DISTRHO_UI_WEB_VIEW == 0 +# error To use WebViews in DPF plugins please set DISTRHO_UI_WEB_VIEW to 1 +#endif + +// -------------------------------------------------------------------------------------------------------------------- +// Web View stuff + +struct WebViewData; +typedef WebViewData* WebViewHandle; +typedef void (*WebViewMessageCallback)(void* arg, char* msg); + +// -------------------------------------------------------------------------------------------------------------------- + +/** + Web view options, for customizing web view details. +*/ +struct WebViewOptions { + /** + Position offset, for cases of mixing regular widgets with web views. + */ + struct PositionOffset { + /** Horizontal offset, with scale factor pre-applied */ + int x; + + /** Vertical offset, with scale factor pre-applied */ + int y; + + /** Constructor for default values */ + PositionOffset() : x(0), y(0) {} + } offset; + + /** + Set some JavaScript to evalute on every new page load. + */ + const char* initialJS; + + /** + Message callback triggered from JavaScript code inside the WebView. + */ + WebViewMessageCallback callback; + void* callbackPtr; + + /** Constructor for default values */ + WebViewOptions() + : offset(), + initialJS(nullptr), + callback(nullptr), + callbackPtr(nullptr) {} + + /** Constructor providing a callback */ + WebViewOptions(const WebViewMessageCallback cb, void* const ptr) + : offset(), + initialJS(nullptr), + callback(cb), + callbackPtr(ptr) {} +}; + +// -------------------------------------------------------------------------------------------------------------------- + +/** + Create a new web view. + + The web view will be added on top of an existing platform-specific view/window. + This means it will draw on top of whatever is below it, + something to take into consideration if mixing regular widgets with web views. + + Provided metrics must have scale factor pre-applied. + + @p windowId: The native window id to attach this view to (X11 Window, HWND or NSView*) + @p scaleFactor: Scale factor in use + @p options: Extra options, optional +*/ +WebViewHandle webViewCreate(const char* url, + uintptr_t windowId, + uint initialWidth, + uint initialHeight, + double scaleFactor, + const WebViewOptions& options = WebViewOptions()); + +/** + Destroy the web view, handle must not be used afterwards. +*/ +void webViewDestroy(WebViewHandle webview); + +/** + Idle the web view, to be called on regular intervals. + Can cause callbacks to trigger. +*/ +void webViewIdle(WebViewHandle webview); + +/** + Evaluate/run JavaScript on the web view. +*/ +void webViewEvaluateJS(WebViewHandle webview, const char* js); + +/** + Reload the web view current page. +*/ +void webViewReload(WebViewHandle webview); + +/** + Resize the web view. +*/ +void webViewResize(WebViewHandle webview, uint width, uint height, double scaleFactor); + +// -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/extra/WebViewWin32.hpp b/dpf/distrho/extra/WebViewWin32.hpp new file mode 100644 index 0000000..4b005e2 --- /dev/null +++ b/dpf/distrho/extra/WebViewWin32.hpp @@ -0,0 +1,101 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#if !defined(DISTRHO_WEB_VIEW_HPP_INCLUDED) && !defined(DGL_WEB_VIEW_HPP_INCLUDED) +# define DISTRHO_WEB_VIEW_INCLUDE_IMPLEMENTATION +# include "WebView.hpp" +#endif + +// -------------------------------------------------------------------------------------------------------------------- +// Web View stuff + +START_NAMESPACE_DISTRHO + +class WebView; + +WebView* webview_choc_create(const WebViewOptions& opts); +void webview_choc_destroy(WebView*); +void* webview_choc_handle(WebView*); +void webview_choc_eval(WebView*, const char* js); +void webview_choc_navigate(WebView*, const char* url); + +END_NAMESPACE_DISTRHO + +// -------------------------------------------------------------------------------------------------------------------- + +#ifdef DISTRHO_WEB_VIEW_INCLUDE_IMPLEMENTATION + +# define WC_ERR_INVALID_CHARS 0 +# include "choc/choc_WebView.h" + +START_NAMESPACE_DISTRHO + +WebView* webview_choc_create(const WebViewOptions& opts) +{ + WebView::Options wopts; + wopts.acceptsFirstMouseClick = true; + wopts.enableDebugMode = true; + + std::unique_ptr webview = std::make_unique(wopts); + DISTRHO_SAFE_ASSERT_RETURN(webview->loadedOK(), nullptr); + + if (const WebViewMessageCallback callback = opts.callback) + { + webview->addInitScript("function postMessage(m){window.chrome.webview.postMessage(m);}"); + + void* const callbackPtr = opts.callbackPtr; + webview->bind([callback, callbackPtr](const std::string& value) { + char* const data = strdup(value.data()); + callback(callbackPtr, data); + std::free(data); + }); + } + else + { + webview->addInitScript("function postMessage(m){}"); + } + + if (opts.initialJS != nullptr) + webview->addInitScript(opts.initialJS); + + return webview.release(); +} + +void webview_choc_destroy(WebView* const webview) +{ + delete webview; +} + +void* webview_choc_handle(WebView* const webview) +{ + return webview->getViewHandle(); +} + +void webview_choc_eval(WebView* const webview, const char* const js) +{ + webview->evaluateJavascript(js); +} + +void webview_choc_navigate(WebView* const webview, const char* const url) +{ + webview->navigate(url); +} + +END_NAMESPACE_DISTRHO + +#endif // DISTRHO_WEB_VIEW_INCLUDE_IMPLEMENTATION + +// -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/extra/choc/LICENSE.md b/dpf/distrho/extra/choc/LICENSE.md new file mode 100644 index 0000000..243935b --- /dev/null +++ b/dpf/distrho/extra/choc/LICENSE.md @@ -0,0 +1,15 @@ +## CHOC: licensing + +I'd like anyone to feel able to use this library code without worrying about the legal implications, so it's released under the permissive ISC license: + +---- + +**Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.** + +**THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.** + +https://en.wikipedia.org/wiki/ISC_license + +---- + +Note that if you use the `choc::ui::WebView` class on Windows, it embeds some Microsoft redistributable code which has its own (permissive) license that you should be aware of. See inside the file `choc_WebView.h` for more details. diff --git a/dpf/distrho/extra/choc/README.md b/dpf/distrho/extra/choc/README.md new file mode 100644 index 0000000..401da6a --- /dev/null +++ b/dpf/distrho/extra/choc/README.md @@ -0,0 +1,22 @@ +Taken from https://github.com/Tracktion/choc + +``` +commit 2512542b2d65f3e92df7f2f1f7eeb712fa41a0de (HEAD -> main, origin/main, origin/HEAD) +Author: Cesare Ferrari +Date: Sun Apr 28 12:53:17 2024 +0100 + + Disable additional gcc warnin +``` + +With the big [choc.patch](./choc.patch) patch applied to top for: + +- remove everything not related to windows +- remove everything unused by DPF +- convert webview JS callbacks to pass raw strings instead of json +- remove even more stuff (json no longer needed) +- convert choc asserts into distrho ones +- put everything inside distrho namespace + +And then backported: + +- https://github.com/Tracktion/choc/commit/792e4bd9bedf38b9a28f12be0535c90649d5616b diff --git a/dpf/distrho/extra/choc/choc.patch b/dpf/distrho/extra/choc/choc.patch new file mode 100644 index 0000000..3b3db04 --- /dev/null +++ b/dpf/distrho/extra/choc/choc.patch @@ -0,0 +1,2803 @@ +diff --git a/choc_DesktopWindow.h b/choc_DesktopWindow.h +index b948042..55e7305 100644 +--- a/choc_DesktopWindow.h ++++ b/choc_DesktopWindow.h +@@ -19,100 +19,7 @@ + #ifndef CHOC_DESKTOPWINDOW_HEADER_INCLUDED + #define CHOC_DESKTOPWINDOW_HEADER_INCLUDED + +-#include "../platform/choc_Platform.h" +- +- +-//============================================================================== +-namespace choc::ui +-{ +- +-/// Represents the position and size of a DesktopWindow or other UI elements. +-struct Bounds +-{ +- int x = 0, y = 0, width = 0, height = 0; +-}; +- +-/** +- A very basic desktop window class. +- +- The main use-case for this is as a simple way to host other UI elements +- such as the choc::ui::WebView. +- +- Because this is a GUI, it needs a message loop to be running. If you're using +- it inside an app which already runs a message loop, it should just work, +- or you can use choc::messageloop::run() and choc::messageloop::stop() for an easy +- but basic loop. +- +- Note that on Linux this uses GTK, so to build it you'll need to: +- 1. Install the libgtk-3-dev package. +- 2. Link the gtk+3.0 library in your build. +- You might want to have a look inside choc/tests/CMakeLists.txt for +- an example of how to add this packages to your build without too +- much fuss. +- +- For an example of how to use this class, see `choc/tests/main.cpp` where +- there's a simple demo. +-*/ +-struct DesktopWindow +-{ +- DesktopWindow (Bounds); +- ~DesktopWindow(); +- +- /// Sets the title of the window that the browser is inside +- void setWindowTitle (const std::string& newTitle); +- +- /// Gives the window a child/content view to display. +- /// The pointer being passed in will be a platform-specific native handle, +- /// so a HWND on Windows, an NSView* on OSX, etc. +- void setContent (void* nativeView); +- +- /// Shows or hides the window. It's visible by default when created. +- void setVisible (bool visible); +- +- /// Changes the window's position +- void setBounds (Bounds); +- +- /// Enables/disables user resizing of the window +- void setResizable (bool); +- +- /// Enables/disables the window's close button (if applicable). +- void setClosable (bool); +- +- /// Gives the window a given size and positions it in the middle of the +- /// default monitor +- void centreWithSize (int width, int height); +- +- /// Sets a minimum size below which the user can't shrink the window +- void setMinimumSize (int minWidth, int minHeight); +- /// Sets a maximum size above which the user can't grow the window +- void setMaximumSize (int maxWidth, int maxHeight); +- +- /// Tries to bring this window to the front of the Z-order. +- void toFront(); +- +- /// Returns the native OS handle, which may be a HWND on Windows, an +- /// NSWindow* on OSX or a GtkWidget* on linux. +- void* getWindowHandle() const; +- +- /// An optional callback that will be called when the parent window is resized +- std::function windowResized; +- /// An optional callback that will be called when the parent window is closed +- std::function windowClosed; +- +-private: +- struct Pimpl; +- std::unique_ptr pimpl; +-}; +- +-//============================================================================== +-/// This Windows-only function turns on high-DPI awareness for the current +-/// process. On other OSes where no equivalent call is needed, this function is +-/// just a stub. +-void setWindowsDPIAwareness(); +- +- +-} // namespace choc::ui +- ++#include "choc_Platform.h" + + //============================================================================== + // _ _ _ _ +@@ -125,326 +32,6 @@ void setWindowsDPIAwareness(); + // + //============================================================================== + +-#if CHOC_LINUX +- +-struct choc::ui::DesktopWindow::Pimpl +-{ +- Pimpl (DesktopWindow& w, Bounds bounds) : owner (w) +- { +- if (! gtk_init_check (nullptr, nullptr)) +- return; +- +- window = gtk_window_new (GTK_WINDOW_TOPLEVEL); +- g_object_ref_sink (G_OBJECT (window)); +- +- destroyHandlerID = g_signal_connect (G_OBJECT (window), "destroy", +- G_CALLBACK (+[](GtkWidget*, gpointer arg) +- { +- static_cast (arg)->windowDestroyEvent(); +- }), +- this); +- setBounds (bounds); +- setVisible (true); +- } +- +- ~Pimpl() +- { +- if (destroyHandlerID != 0 && window != nullptr) +- g_signal_handler_disconnect (G_OBJECT (window), destroyHandlerID); +- +- g_clear_object (&window); +- } +- +- void windowDestroyEvent() +- { +- g_clear_object (&window); +- +- if (owner.windowClosed != nullptr) +- owner.windowClosed(); +- } +- +- void* getWindowHandle() const { return (void*) window; } +- +- void setWindowTitle (const std::string& newTitle) +- { +- gtk_window_set_title (GTK_WINDOW (window), newTitle.c_str()); +- } +- +- void setContent (void* view) +- { +- if (content != nullptr) +- gtk_container_remove (GTK_CONTAINER (window), content); +- +- content = GTK_WIDGET (view); +- gtk_container_add (GTK_CONTAINER (window), content); +- gtk_widget_grab_focus (content); +- } +- +- void setVisible (bool visible) +- { +- if (visible) +- gtk_widget_show_all (window); +- else +- gtk_widget_hide (window); +- } +- +- void setResizable (bool b) { gtk_window_set_resizable (GTK_WINDOW (window), b); } +- void setClosable (bool b) { gtk_window_set_deletable (GTK_WINDOW (window), b); } +- +- void setMinimumSize (int w, int h) +- { +- GdkGeometry g; +- g.min_width = w; +- g.min_height = h; +- gtk_window_set_geometry_hints (GTK_WINDOW (window), nullptr, &g, GDK_HINT_MIN_SIZE); +- } +- +- void setMaximumSize (int w, int h) +- { +- GdkGeometry g; +- g.max_width = w; +- g.max_height = h; +- gtk_window_set_geometry_hints (GTK_WINDOW (window), nullptr, &g, GDK_HINT_MAX_SIZE); +- } +- +- void setBounds (Bounds b) +- { +- setSize (b.width, b.height); +- gtk_window_move (GTK_WINDOW (window), b.x, b.y); +- } +- +- void setSize (int w, int h) +- { +- if (gtk_window_get_resizable (GTK_WINDOW (window))) +- gtk_window_resize (GTK_WINDOW (window), w, h); +- else +- gtk_widget_set_size_request (window, w, h); +- } +- +- void centreWithSize (int w, int h) +- { +- setSize (w, h); +- gtk_window_set_position (GTK_WINDOW (window), GTK_WIN_POS_CENTER); +- } +- +- void toFront() +- { +- gtk_window_activate_default (GTK_WINDOW (window)); +- } +- +- DesktopWindow& owner; +- GtkWidget* window = {}; +- GtkWidget* content = {}; +- unsigned long destroyHandlerID = 0; +-}; +- +-inline void choc::ui::setWindowsDPIAwareness() {} +- +-//============================================================================== +-#elif CHOC_APPLE +- +-#include "choc_MessageLoop.h" +- +-namespace choc::ui +-{ +- +-namespace macos_ui_helpers +-{ +- // Including CodeGraphics.h can create all kinds of messy C/C++ symbol clashes +- // with other headers, but all we actually need are these coordinate structs: +- #if defined (__LP64__) && __LP64__ +- using CGFloat = double; +- #else +- using CGFloat = float; +- #endif +- +- struct CGPoint { CGFloat x = 0, y = 0; }; +- struct CGSize { CGFloat width = 0, height = 0; }; +- struct CGRect { CGPoint origin; CGSize size; }; +- +- inline CGSize createCGSize (double w, double h) { return { (CGFloat) w, (CGFloat) h }; } +- inline CGRect createCGRect (choc::ui::Bounds b) { return { { (CGFloat) b.x, (CGFloat) b.y }, { (CGFloat) b.width, (CGFloat) b.height } }; } +- +- static constexpr long NSWindowStyleMaskTitled = 1; +- static constexpr long NSWindowStyleMaskMiniaturizable = 4; +- static constexpr long NSWindowStyleMaskResizable = 8; +- static constexpr long NSWindowStyleMaskClosable = 2; +- static constexpr long NSBackingStoreBuffered = 2; +- static constexpr long NSApplicationActivationPolicyRegular = 0; +-} +- +-using namespace macos_ui_helpers; +- +-inline void setWindowsDPIAwareness() {} +- +-struct DesktopWindow::Pimpl +-{ +- Pimpl (DesktopWindow& w, Bounds bounds) : owner (w) +- { +- using namespace choc::objc; +- CHOC_AUTORELEASE_BEGIN +- call (getSharedNSApplication(), "setActivationPolicy:", NSApplicationActivationPolicyRegular); +- +- window = call (call (getClass ("NSWindow"), "alloc"), +- "initWithContentRect:styleMask:backing:defer:", +- createCGRect (bounds), +- NSWindowStyleMaskTitled, NSBackingStoreBuffered, (int) 0); +- +- delegate = createDelegate(); +- setStyleBit (NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable, true); +- objc_setAssociatedObject (delegate, "choc_window", (CHOC_OBJC_CAST_BRIDGED id) this, OBJC_ASSOCIATION_ASSIGN); +- call (window, "setDelegate:", delegate); +- CHOC_AUTORELEASE_END +- } +- +- ~Pimpl() +- { +- CHOC_AUTORELEASE_BEGIN +- objc::call (window, "setDelegate:", nullptr); +- objc::call (window, "close"); +- objc::call (delegate, "release"); +- CHOC_AUTORELEASE_END +- } +- +- void* getWindowHandle() const { return (CHOC_OBJC_CAST_BRIDGED void*) window; } +- +- void setWindowTitle (const std::string& newTitle) +- { +- CHOC_AUTORELEASE_BEGIN +- objc::call (window, "setTitle:", objc::getNSString (newTitle)); +- CHOC_AUTORELEASE_END +- } +- +- void setContent (void* view) +- { +- CHOC_AUTORELEASE_BEGIN +- objc::call (window, "setContentView:", (CHOC_OBJC_CAST_BRIDGED id) view); +- CHOC_AUTORELEASE_END +- } +- +- void setVisible (bool visible) +- { +- CHOC_AUTORELEASE_BEGIN +- objc::call (window, "setIsVisible:", (BOOL) visible); +- CHOC_AUTORELEASE_END +- } +- +- void setStyleBit (long bit, bool shouldEnable) +- { +- CHOC_AUTORELEASE_BEGIN +- auto style = objc::call (window, "styleMask"); +- style = shouldEnable ? (style | (unsigned long) bit) : (style & ~(unsigned long) bit); +- objc::call (window, "setStyleMask:", style); +- CHOC_AUTORELEASE_END +- } +- +- void setResizable (bool b) { setStyleBit (NSWindowStyleMaskResizable, b); } +- void setClosable (bool b) { setStyleBit (NSWindowStyleMaskClosable, b); } +- +- void setMinimumSize (int w, int h) { CHOC_AUTORELEASE_BEGIN objc::call (window, "setContentMinSize:", createCGSize (w, h)); CHOC_AUTORELEASE_END } +- void setMaximumSize (int w, int h) { CHOC_AUTORELEASE_BEGIN objc::call (window, "setContentMaxSize:", createCGSize (w, h)); CHOC_AUTORELEASE_END } +- +- CGRect getFrameRectForContent (Bounds b) +- { +- return objc::call (window, "frameRectForContentRect:", createCGRect (b)); +- } +- +- void centreWithSize (int w, int h) +- { +- CHOC_AUTORELEASE_BEGIN +- objc::call (window, "setFrame:display:animate:", getFrameRectForContent ({ 0, 0, w, h }), (BOOL) 1, (BOOL) 0); +- objc::call (window, "center"); +- CHOC_AUTORELEASE_END +- } +- +- void setBounds (Bounds b) +- { +- CHOC_AUTORELEASE_BEGIN +- objc::call (window, "setFrame:display:animate:", getFrameRectForContent (b), (BOOL) 1, (BOOL) 0); +- CHOC_AUTORELEASE_END +- } +- +- void toFront() +- { +- CHOC_AUTORELEASE_BEGIN +- objc::call (objc::getSharedNSApplication(), "activateIgnoringOtherApps:", (BOOL) 1); +- objc::call (window, "makeKeyAndOrderFront:", (id) nullptr); +- CHOC_AUTORELEASE_END +- } +- +- static Pimpl& getPimplFromContext (id self) +- { +- auto view = (CHOC_OBJC_CAST_BRIDGED Pimpl*) objc_getAssociatedObject (self, "choc_window"); +- CHOC_ASSERT (view != nullptr); +- return *view; +- } +- +- id createDelegate() +- { +- static DelegateClass dc; +- return objc::call ((id) dc.delegateClass, "new"); +- } +- +- DesktopWindow& owner; +- id window = {}, delegate = {}; +- +- struct DelegateClass +- { +- DelegateClass() +- { +- delegateClass = choc::objc::createDelegateClass ("NSResponder", "CHOCDesktopWindowDelegate_"); +- +- if (auto* p = objc_getProtocol ("NSWindowDelegate")) +- class_addProtocol (delegateClass, p); +- +- class_addMethod (delegateClass, sel_registerName ("windowShouldClose:"), +- (IMP) (+[](id self, SEL, id) -> BOOL +- { +- CHOC_AUTORELEASE_BEGIN +- auto& p = getPimplFromContext (self); +- p.window = {}; +- +- if (auto callback = p.owner.windowClosed) +- choc::messageloop::postMessage ([callback] { callback(); }); +- +- CHOC_AUTORELEASE_END +- return TRUE; +- }), +- "c@:@"); +- +- class_addMethod (delegateClass, sel_registerName ("windowDidResize:"), +- (IMP) (+[](id self, SEL, id) +- { +- CHOC_AUTORELEASE_BEGIN +- +- if (auto callback = getPimplFromContext (self).owner.windowResized) +- callback(); +- +- CHOC_AUTORELEASE_END +- }), +- "v@:@"); +- +- class_addMethod (delegateClass, sel_registerName ("applicationShouldTerminateAfterLastWindowClosed:"), +- (IMP) (+[](id, SEL, id) -> BOOL { return 0; }), +- "c@:@"); +- +- objc_registerClassPair (delegateClass); +- } +- +- ~DelegateClass() +- { +- objc_disposeClassPair (delegateClass); +- } +- +- Class delegateClass = {}; +- }; +-}; +- +-} // namespace choc::ui +- +-//============================================================================== +-#elif CHOC_WINDOWS +- + #undef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN + #undef NOMINMAX +@@ -453,27 +40,7 @@ struct DesktopWindow::Pimpl + #include + #undef Rectangle + +-namespace choc::ui +-{ +- +-static RECT boundsToRect (Bounds b) +-{ +- RECT r; +- r.left = b.x; +- r.top = b.y; +- r.right = b.x + b.width; +- r.bottom = b.y + b.height; +- return r; +-} +- +-template +-FunctionType getUser32Function (const char* name) +-{ +- if (auto user32 = choc::file::DynamicLibrary ("user32.dll")) +- return reinterpret_cast (user32.findFunction (name)); +- +- return {}; +-} ++START_NAMESPACE_DISTRHO + + struct HWNDHolder + { +@@ -516,7 +83,7 @@ struct WindowClass + wc.lpfnWndProc = wndProc; + + classAtom = (LPCWSTR) (uintptr_t) RegisterClassExW (&wc); +- CHOC_ASSERT (classAtom != 0); ++ DISTRHO_SAFE_ASSERT (classAtom != 0); + } + + ~WindowClass() +@@ -582,250 +149,6 @@ static std::wstring createUTF16StringFromUTF8 (std::string_view utf8) + return {}; + } + +-inline void setWindowsDPIAwareness() +-{ +- if (auto setProcessDPIAwarenessContext = getUser32Function ("SetProcessDpiAwarenessContext")) +- setProcessDPIAwarenessContext (/*DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2*/ (void*) -4); +-} +- +-//============================================================================== +-struct DesktopWindow::Pimpl +-{ +- Pimpl (DesktopWindow& w, Bounds b) : owner (w) +- { +- hwnd = windowClass.createWindow (WS_OVERLAPPEDWINDOW, 640, 480, this); +- +- if (hwnd.hwnd == nullptr) +- return; +- +- setBounds (b); +- ShowWindow (hwnd, SW_SHOW); +- UpdateWindow (hwnd); +- SetFocus (hwnd); +- } +- +- ~Pimpl() +- { +- hwnd.reset(); +- } +- +- void* getWindowHandle() const { return hwnd; } +- +- void setWindowTitle (const std::string& newTitle) +- { +- SetWindowTextW (hwnd, createUTF16StringFromUTF8 (newTitle).c_str()); +- } +- +- void setContent (void* childHandle) +- { +- if (auto child = getFirstChildWindow()) +- { +- ShowWindow (child, SW_HIDE); +- SetParent (child, nullptr); +- } +- +- auto child = (HWND) childHandle; +- auto flags = GetWindowLongPtr (child, -16); +- flags = (flags & ~(decltype (flags)) WS_POPUP) | (decltype (flags)) WS_CHILD; +- SetWindowLongPtr (child, -16, flags); +- +- SetParent (child, hwnd); +- resizeContentToFit(); +- ShowWindow (child, IsWindowVisible (hwnd) ? SW_SHOW : SW_HIDE); +- } +- +- void setVisible (bool visible) +- { +- ShowWindow (hwnd, visible ? SW_SHOW : SW_HIDE); +- +- if (visible) +- InvalidateRect (hwnd, nullptr, 0); +- } +- +- void setResizable (bool b) +- { +- auto style = GetWindowLong (hwnd, GWL_STYLE); +- +- if (b) +- style |= (WS_THICKFRAME | WS_MAXIMIZEBOX); +- else +- style &= ~(WS_THICKFRAME | WS_MAXIMIZEBOX); +- +- SetWindowLong (hwnd, GWL_STYLE, style); +- } +- +- void setClosable (bool closable) +- { +- EnableMenuItem (GetSystemMenu (hwnd, FALSE), SC_CLOSE, +- closable ? (MF_BYCOMMAND | MF_ENABLED) +- : (MF_BYCOMMAND | MF_DISABLED | MF_GRAYED)); +- } +- +- void setMinimumSize (int w, int h) +- { +- minimumSize.x = w; +- minimumSize.y = h; +- } +- +- void setMaximumSize (int w, int h) +- { +- maximumSize.x = w; +- maximumSize.y = h; +- } +- +- void getMinMaxInfo (MINMAXINFO& m) const +- { +- if (maximumSize.x > 0 && maximumSize.y > 0) +- { +- m.ptMaxSize = maximumSize; +- m.ptMaxTrackSize = maximumSize; +- } +- +- if (minimumSize.x > 0 && minimumSize.y > 0) +- m.ptMinTrackSize = minimumSize; +- } +- +- void centreWithSize (int w, int h) +- { +- auto dpi = static_cast (getWindowDPI()); +- auto screenW = (GetSystemMetrics(SM_CXSCREEN) * 96) / dpi; +- auto screenH = (GetSystemMetrics(SM_CYSCREEN) * 96) / dpi; +- auto x = (screenW - w) / 2; +- auto y = (screenH - h) / 2; +- setBounds ({ x, y, w, h }, SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); +- } +- +- void setBounds (Bounds b) +- { +- setBounds (b, SWP_NOZORDER | SWP_NOACTIVATE | SWP_FRAMECHANGED); +- } +- +- void setBounds (Bounds b, DWORD flags) +- { +- auto r = boundsToRect (scaleBounds (b, getWindowDPI() / 96.0)); +- AdjustWindowRect (&r, WS_OVERLAPPEDWINDOW, 0); +- SetWindowPos (hwnd, nullptr, r.left, r.top, r.right - r.left, r.bottom - r.top, flags); +- resizeContentToFit(); +- } +- +- void toFront() +- { +- BringWindowToTop (hwnd); +- } +- +-private: +- DesktopWindow& owner; +- HWNDHolder hwnd; +- POINT minimumSize = {}, maximumSize = {}; +- WindowClass windowClass { L"CHOCWindow", (WNDPROC) wndProc }; +- +- Bounds scaleBounds (Bounds b, double scale) +- { +- b.x = static_cast (b.x * scale); +- b.y = static_cast (b.y * scale); +- b.width = static_cast (b.width * scale); +- b.height = static_cast (b.height * scale); +- +- return b; +- } +- +- HWND getFirstChildWindow() +- { +- HWND result = {}; +- +- if (IsWindow (hwnd)) +- { +- EnumChildWindows (hwnd, +[](HWND w, LPARAM context) +- { +- *reinterpret_cast (context) = w; +- return FALSE; +- }, (LPARAM) &result); +- } +- +- return result; +- } +- +- void resizeContentToFit() +- { +- if (auto child = getFirstChildWindow()) +- { +- RECT r; +- GetClientRect (hwnd, &r); +- SetWindowPos (child, nullptr, r.left, r.top, r.right - r.left, r.bottom - r.top, +- SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE | SWP_FRAMECHANGED); +- } +- } +- +- void handleClose() +- { +- if (owner.windowClosed != nullptr) +- owner.windowClosed(); +- } +- +- void handleSizeChange() +- { +- resizeContentToFit(); +- +- if (owner.windowResized != nullptr) +- owner.windowResized(); +- } +- +- static void enableNonClientDPIScaling (HWND h) +- { +- if (auto fn = getUser32Function ("EnableNonClientDpiScaling")) +- fn (h); +- } +- +- uint32_t getWindowDPI() const +- { +- if (auto getDpiForWindow = getUser32Function ("GetDpiForWindow")) +- return getDpiForWindow (hwnd); +- +- return 96; +- } +- +- static Pimpl* getPimpl (HWND h) { return (Pimpl*) GetWindowLongPtr (h, GWLP_USERDATA); } +- +- static LRESULT wndProc (HWND h, UINT msg, WPARAM wp, LPARAM lp) +- { +- switch (msg) +- { +- case WM_NCCREATE: enableNonClientDPIScaling (h); break; +- case WM_SIZE: if (auto w = getPimpl (h)) w->handleSizeChange(); break; +- case WM_CLOSE: if (auto w = getPimpl (h)) w->handleClose(); return 0; +- case WM_GETMINMAXINFO: if (auto w = getPimpl (h)) w->getMinMaxInfo (*(LPMINMAXINFO) lp); return 0; +- default: break; +- } +- +- return DefWindowProcW (h, msg, wp, lp); +- } +-}; +- +-} // namespace choc::ui +- +-#else +- #error "choc DesktopWindow only supports OSX, Windows or Linux!" +-#endif +- +-namespace choc::ui +-{ +- +-//============================================================================== +-inline DesktopWindow::DesktopWindow (Bounds b) { pimpl = std::make_unique (*this, b); } +-inline DesktopWindow::~DesktopWindow() {} +- +-inline void* DesktopWindow::getWindowHandle() const { return pimpl->getWindowHandle(); } +-inline void DesktopWindow::setContent (void* view) { pimpl->setContent (view); } +-inline void DesktopWindow::setVisible (bool visible) { pimpl->setVisible (visible); } +-inline void DesktopWindow::setWindowTitle (const std::string& title) { pimpl->setWindowTitle (title); } +-inline void DesktopWindow::setMinimumSize (int w, int h) { pimpl->setMinimumSize (w, h); } +-inline void DesktopWindow::setMaximumSize (int w, int h) { pimpl->setMaximumSize (w, h); } +-inline void DesktopWindow::setResizable (bool b) { pimpl->setResizable (b); } +-inline void DesktopWindow::setClosable (bool b) { pimpl->setClosable (b); } +-inline void DesktopWindow::setBounds (Bounds b) { pimpl->setBounds (b); } +-inline void DesktopWindow::centreWithSize (int w, int h) { pimpl->centreWithSize (w, h); } +-inline void DesktopWindow::toFront() { pimpl->toFront(); } +- +-} // namespace choc::ui ++END_NAMESPACE_DISTRHO + + #endif // CHOC_DESKTOPWINDOW_HEADER_INCLUDED +diff --git a/choc_DynamicLibrary.h b/choc_DynamicLibrary.h +index 85b2cfd..ef8c282 100644 +--- a/choc_DynamicLibrary.h ++++ b/choc_DynamicLibrary.h +@@ -21,8 +21,7 @@ + + #include + +-namespace choc::file +-{ ++START_NAMESPACE_DISTRHO + + //============================================================================== + /** +@@ -87,38 +86,8 @@ inline DynamicLibrary& DynamicLibrary::operator= (DynamicLibrary&& other) + return *this; + } + +-} // namespace choc::file +- +-#if ! (defined (_WIN32) || defined (_WIN64)) +- +-#include +- +-inline choc::file::DynamicLibrary::DynamicLibrary (std::string_view library) +-{ +- handle = ::dlopen (std::string (library).c_str(), RTLD_LOCAL | RTLD_NOW); +-} +- +-inline void choc::file::DynamicLibrary::close() +-{ +- if (handle != nullptr) +- { +- ::dlclose (handle); +- handle = nullptr; +- } +-} +- +-inline void* choc::file::DynamicLibrary::findFunction (std::string_view name) +-{ +- if (handle != nullptr) +- return ::dlsym (handle, std::string (name).c_str()); +- +- return {}; +-} +- +-#else +- + //============================================================================== +-namespace choc::win32_defs ++namespace win32_defs + { + #if ! (defined (_WINDOWS_) || defined (_APISETLIBLOADER_)) // only use these local definitions if windows.h isn't already included + using CHOC_HMODULE = void*; +@@ -145,12 +114,12 @@ namespace choc::win32_defs + #endif + } + +-inline choc::file::DynamicLibrary::DynamicLibrary (std::string_view library) ++inline DynamicLibrary::DynamicLibrary (std::string_view library) + { + handle = (void*) win32_defs::LoadLibraryA (std::string (library).c_str()); + } + +-inline void choc::file::DynamicLibrary::close() ++inline void DynamicLibrary::close() + { + if (handle != nullptr) + { +@@ -159,7 +128,7 @@ inline void choc::file::DynamicLibrary::close() + } + } + +-inline void* choc::file::DynamicLibrary::findFunction (std::string_view name) ++inline void* DynamicLibrary::findFunction (std::string_view name) + { + if (handle != nullptr) + return (void*) win32_defs::GetProcAddress ((win32_defs::CHOC_HMODULE) handle, std::string (name).c_str()); +@@ -167,6 +136,6 @@ inline void* choc::file::DynamicLibrary::findFunction (std::string_view name) + return {}; + } + +-#endif ++END_NAMESPACE_DISTRHO + + #endif // CHOC_DYNAMIC_LIBRARY_HEADER_INCLUDED +diff --git a/choc_FloatToString.h b/choc_FloatToString.h +index bf89933..586ecca 100644 +--- a/choc_FloatToString.h ++++ b/choc_FloatToString.h +@@ -21,7 +21,7 @@ + + #include + #include +-#include "../math/choc_MathHelpers.h" ++#include "choc_MathHelpers.h" + + namespace choc::text + { +diff --git a/choc_JSON.h b/choc_JSON.h +index dbea379..617e2af 100644 +--- a/choc_JSON.h ++++ b/choc_JSON.h +@@ -26,7 +26,7 @@ + + #include "choc_UTF8.h" + #include "choc_FloatToString.h" +-#include "../containers/choc_Value.h" ++#include "choc_Value.h" + + #undef max // It's never a smart idea to include any C headers before your C++ ones, as it + #undef min // risks polluting your namespace with all kinds of dangerous macros like these ones. +diff --git a/choc_MemoryDLL.h b/choc_MemoryDLL.h +index 00c3caa..f60eea1 100644 +--- a/choc_MemoryDLL.h ++++ b/choc_MemoryDLL.h +@@ -23,8 +23,7 @@ + #include + #include + +-namespace choc::memory +-{ ++START_NAMESPACE_DISTRHO + + /** + MemoryDLL is an egregious hack that allows you to load DLL files from a chunk +@@ -62,7 +61,7 @@ private: + std::unique_ptr pimpl; + }; + +-} // namespace choc::memory ++END_NAMESPACE_DISTRHO + + + +@@ -77,8 +76,6 @@ private: + // + //============================================================================== + +-#if defined (_WIN32) || defined (_WIN64) +- + #include + #include + #undef WIN32_LEAN_AND_MEAN +@@ -89,8 +86,7 @@ private: + #include + #undef Rectangle + +-namespace choc::memory +-{ ++START_NAMESPACE_DISTRHO + + struct MemoryDLL::Pimpl + { +@@ -497,20 +493,6 @@ private: + } + }; + +-#else +- +-#include "choc_Assert.h" +- +-namespace choc::memory +-{ +-struct MemoryDLL::Pimpl +-{ +- bool initialise (const void*, size_t) { CHOC_ASSERT (false); return {}; } // Only available on Windows! +- void* findFunction (std::string_view) { CHOC_ASSERT (false); return {}; } // Only available on Windows! +-}; +- +-#endif +- + inline MemoryDLL::~MemoryDLL() = default; + + inline MemoryDLL::MemoryDLL (const void* data, size_t size) : pimpl (std::make_unique()) +@@ -524,6 +506,6 @@ inline void* MemoryDLL::findFunction (std::string_view name) + return pimpl != nullptr ? pimpl->findFunction (name) : nullptr; + } + +-} // namespace choc::memory ++END_NAMESPACE_DISTRHO + + #endif // CHOC_MEMORYDLL_HEADER_INCLUDED +diff --git a/choc_StringUtilities.h b/choc_StringUtilities.h +index 3122f83..4cd54c6 100644 +--- a/choc_StringUtilities.h ++++ b/choc_StringUtilities.h +@@ -27,125 +27,14 @@ + #include + #include + #include +-#include "../platform/choc_Assert.h" + +-namespace choc::text +-{ ++START_NAMESPACE_DISTRHO + + //============================================================================== +-inline bool isWhitespace (char c) { return c == ' ' || (c <= 13 && c >= 9); } +-inline bool isDigit (char c) { return static_cast (c - '0') < 10; } +- +-/// Replaces all occurrences of a one or more substrings. +-/// The arguments must be a sequence of pairs of strings, where the first of each pair is the string to +-/// look for, followed by its replacement. +-template +-std::string replace (StringType textToSearch, +- std::string_view firstSubstringToReplace, std::string_view firstReplacement, +- OtherReplacements&&... otherPairsOfStringsToReplace); +- +-/// Returns a string with any whitespace trimmed from its start and end. +-std::string trim (std::string textToTrim); +- +-/// Returns a string with any whitespace trimmed from its start and end. +-std::string_view trim (std::string_view textToTrim); +- +-/// Returns a string with any whitespace trimmed from its start and end. +-std::string_view trim (const char* textToTrim); +- +-/// Returns a string with any whitespace trimmed from its start. +-std::string trimStart (std::string textToTrim); +- +-/// Returns a string with any whitespace trimmed from its start. +-std::string_view trimStart (std::string_view textToTrim); +- +-/// Returns a string with any whitespace trimmed from its start. +-std::string_view trimStart (const char* textToTrim); +- +-/// Returns a string with any whitespace trimmed from its end. +-std::string trimEnd (std::string textToTrim); +- +-/// Returns a string with any whitespace trimmed from its end. +-std::string_view trimEnd (std::string_view textToTrim); +- +-/// Returns a string with any whitespace trimmed from its end. +-std::string_view trimEnd (const char* textToTrim); +- +-/// If the string begins with one or more instances of the given character, this +-/// skips past them, returning the remainder of the string. +-std::string_view trimCharacterAtStart (std::string_view textToTrim, char characterToSkip); +- +-/// If the given character is at the start and end of the string, it trims it away. +-std::string removeOuterCharacter (std::string text, char outerChar); +- +-inline std::string removeDoubleQuotes (std::string text) { return removeOuterCharacter (std::move (text), '"'); } +-inline std::string removeSingleQuotes (std::string text) { return removeOuterCharacter (std::move (text), '\''); } +- +-inline std::string addDoubleQuotes (std::string text) { return "\"" + std::move (text) + "\""; } +-inline std::string addSingleQuotes (std::string text) { return "'" + std::move (text) + "'"; } +- +-std::string toLowerCase (std::string); +-std::string toUpperCase (std::string); +- +-template +-std::vector splitString (std::string_view textToSplit, +- IsDelimiterChar&& isDelimiterChar, +- bool includeDelimitersInResult); +- +-template +-std::vector splitString (std::string_view textToSplit, +- CharStartsDelimiter&& isDelimiterStart, +- CharIsInDelimiterBody&& isDelimiterBody, +- bool includeDelimitersInResult); +- +-std::vector splitString (std::string_view textToSplit, +- char delimiterCharacter, +- bool includeDelimitersInResult); +- +-std::vector splitAtWhitespace (std::string_view text, bool keepDelimiters = false); +- +-/// Splits a string at newline characters, returning an array of strings. +-std::vector splitIntoLines (std::string_view text, bool includeNewLinesInResult); +- +-/// Joins some kind of array of strings into a single string, adding the given separator +-/// between them (but not adding it at the start or end) +-template +-std::string joinStrings (const ArrayOfStrings& strings, std::string_view separator); +- +-/// Returns true if this text contains the given sub-string. +-bool contains (std::string_view text, std::string_view possibleSubstring); +-/// Returns true if this text starts with the given character. +-bool startsWith (std::string_view text, char possibleStart); +-/// Returns true if this text starts with the given sub-string. +-bool startsWith (std::string_view text, std::string_view possibleStart); +-/// Returns true if this text ends with the given sub-string. +-bool endsWith (std::string_view text, char possibleEnd); +-/// Returns true if this text ends with the given sub-string. +-bool endsWith (std::string_view text, std::string_view possibleEnd); +- +-/// Calculates the Levenstein distance between two strings. +-template +-size_t getLevenshteinDistance (const StringType& string1, +- const StringType& string2); +- +-/// Converts a hex character to a number 0-15, or -1 if it's not a valid hex digit. +-int hexDigitToInt (uint32_t unicodeChar); +- + /// Returns a hex string for the given value. + /// If the minimum number of digits is non-zero, it will be zero-padded to fill this length; + template +-std::string createHexString (IntegerType value, int minNumDigits = 0); +- +-/// Returns a truncated, easy-to-read version of a time as hours, seconds or milliseconds, +-/// depending on its magnitude. The use-cases include things like logging or console app output. +-std::string getDurationDescription (std::chrono::duration); +- +-/// Returns an easy-to-read description of a size in bytes. Depending on the magnitude, +-/// it might choose different units such as GB, MB, KB or just bytes. +-std::string getByteSizeDescription (uint64_t sizeInBytes); +- +-/// Encodes a string as a legal URI, using percent-encoding (aka URL encoding) +-std::string percentEncodeURI (std::string_view text); ++std::string createHexString (IntegerType value); + + + //============================================================================== +@@ -159,20 +48,11 @@ std::string percentEncodeURI (std::string_view text); + // + //============================================================================== + +-inline int hexDigitToInt (uint32_t c) +-{ +- auto d1 = c - static_cast ('0'); if (d1 < 10u) return static_cast (d1); +- auto d2 = d1 + static_cast ('0' - 'a'); if (d2 < 6u) return static_cast (d2 + 10); +- auto d3 = d2 + static_cast ('a' - 'A'); if (d3 < 6u) return static_cast (d3 + 10); +- return -1; +-} +- + template +-std::string createHexString (IntegerType v, int minNumDigits) ++std::string createHexString (IntegerType v) + { + static_assert (std::is_integral::value, "Need to pass integers into this method"); + auto value = static_cast::type> (v); +- CHOC_ASSERT (minNumDigits <= 32); + + char hex[40]; + const auto end = hex + sizeof (hex) - 1; +@@ -183,415 +63,12 @@ std::string createHexString (IntegerType v, int minNumDigits) + { + *--d = "0123456789abcdef"[static_cast (value) & 15u]; + value = static_cast (value >> 4); +- --minNumDigits; + +- if (value == 0 && minNumDigits <= 0) ++ if (value == 0) + return std::string (d, end); + } + } + +-template +-std::string replace (StringType textToSearch, std::string_view firstToReplace, std::string_view firstReplacement, +- OtherReplacements&&... otherPairsOfStringsToReplace) +-{ +- static_assert ((sizeof... (otherPairsOfStringsToReplace) & 1u) == 0, +- "This function expects a list of pairs of strings as its arguments"); +- +- if constexpr (std::is_same::value || std::is_same::value) +- { +- return replace (std::string (textToSearch), firstToReplace, firstReplacement, +- std::forward (otherPairsOfStringsToReplace)...); +- } +- else if constexpr (sizeof... (otherPairsOfStringsToReplace) == 0) +- { +- size_t pos = 0; +- +- for (;;) +- { +- pos = textToSearch.find (firstToReplace, pos); +- +- if (pos == std::string::npos) +- return textToSearch; +- +- textToSearch.replace (pos, firstToReplace.length(), firstReplacement); +- pos += firstReplacement.length(); +- } +- } +- else +- { +- return replace (replace (std::move (textToSearch), firstToReplace, firstReplacement), +- std::forward (otherPairsOfStringsToReplace)...); +- } +-} +- +-inline std::string trim (std::string text) { return trimStart (trimEnd (std::move (text))); } +-inline std::string_view trim (std::string_view text) { return trimStart (trimEnd (std::move (text))); } +- +-inline std::string_view trim (const char* text) { return trim (std::string_view (text)); } +-inline std::string_view trimStart (const char* text) { return trimStart (std::string_view (text)); } +-inline std::string_view trimEnd (const char* text) { return trimEnd (std::string_view (text)); } +- +-inline std::string trimStart (std::string text) +-{ +- auto i = text.begin(); +- +- if (i == text.end()) return {}; +- if (! isWhitespace (*i)) return text; +- +- for (;;) +- { +- ++i; +- +- if (i == text.end()) return {}; +- if (! isWhitespace (*i)) return { i, text.end() }; +- } +-} +- +-inline std::string_view trimStart (std::string_view text) +-{ +- size_t i = 0; +- +- for (auto c : text) +- { +- if (! isWhitespace (c)) +- { +- text.remove_prefix (i); +- return text; +- } +- +- ++i; +- } +- +- return {}; +-} +- +-inline std::string trimEnd (std::string text) +-{ +- for (auto i = text.end();;) +- { +- if (i == text.begin()) +- return {}; +- +- --i; +- +- if (! isWhitespace (*i)) +- { +- text.erase (i + 1, text.end()); +- return text; +- } +- } +-} +- +-inline std::string_view trimEnd (std::string_view text) +-{ +- for (auto i = text.length(); i != 0; --i) +- if (! isWhitespace (text[i - 1])) +- return text.substr (0, i); +- +- return {}; +-} +- +-inline std::string_view trimCharacterAtStart (std::string_view textToTrim, char characterToSkip) +-{ +- for (size_t i = 0; i < textToTrim.length(); ++i) +- if (textToTrim[i] != characterToSkip) +- return textToTrim.substr (i); +- +- return {}; +-} +- +-inline std::string removeOuterCharacter (std::string t, char outerChar) +-{ +- if (t.length() >= 2 && t.front() == outerChar && t.back() == outerChar) +- return t.substr (1, t.length() - 2); +- +- return t; +-} +- +-inline std::string toLowerCase (std::string s) +-{ +- std::transform (s.begin(), s.end(), s.begin(), [] (auto c) { return static_cast (std::tolower (static_cast (c))); }); +- return s; +-} +- +-inline std::string toUpperCase (std::string s) +-{ +- std::transform (s.begin(), s.end(), s.begin(), [] (auto c) { return static_cast (std::toupper (static_cast (c))); }); +- return s; +-} +- +-template +-std::vector splitString (std::string_view source, +- CharStartsDelimiter&& isDelimiterStart, +- CharIsInDelimiterBody&& isDelimiterBody, +- bool keepDelimiters) +-{ +- std::vector tokens; +- auto tokenStart = source.begin(); +- auto pos = tokenStart; +- +- while (pos != source.end()) +- { +- if (isDelimiterStart (*pos)) +- { +- auto delimiterStart = pos++; +- +- while (pos != source.end() && isDelimiterBody (*pos)) +- ++pos; +- +- if (pos != source.begin()) +- tokens.push_back ({ tokenStart, keepDelimiters ? pos : delimiterStart }); +- +- tokenStart = pos; +- } +- else +- { +- ++pos; +- } +- } +- +- if (pos != source.begin()) +- tokens.push_back ({ tokenStart, pos }); +- +- return tokens; +-} +- +-template +-std::vector splitString (std::string_view source, IsDelimiterChar&& isDelimiterChar, bool keepDelimiters) +-{ +- std::vector tokens; +- auto tokenStart = source.begin(); +- auto pos = tokenStart; +- +- while (pos != source.end()) +- { +- if (isDelimiterChar (*pos)) +- { +- tokens.push_back ({ tokenStart, keepDelimiters ? pos + 1 : pos }); +- tokenStart = ++pos; +- } +- else +- { +- ++pos; +- } +- } +- +- if (pos != source.begin()) +- tokens.push_back ({ tokenStart, pos }); +- +- return tokens; +-} +- +-inline std::vector splitString (std::string_view text, char delimiterCharacter, bool keepDelimiters) +-{ +- return splitString (text, [=] (char c) { return c == delimiterCharacter; }, keepDelimiters); +-} +- +-inline std::vector splitAtWhitespace (std::string_view text, bool keepDelimiters) +-{ +- return splitString (text, +- [] (char c) { return isWhitespace (c); }, +- [] (char c) { return isWhitespace (c); }, +- keepDelimiters); +-} +- +-inline std::vector splitIntoLines (std::string_view text, bool includeNewLinesInResult) +-{ +- return splitString (text, '\n', includeNewLinesInResult); +-} +- +-template +-inline std::string joinStrings (const ArrayOfStrings& strings, std::string_view sep) +-{ +- if (strings.empty()) +- return {}; +- +- auto spaceNeeded = sep.length() * strings.size(); +- +- for (auto& s : strings) +- spaceNeeded += s.length(); +- +- std::string result (strings.front()); +- result.reserve (spaceNeeded); +- +- for (size_t i = 1; i < strings.size(); ++i) +- { +- result += sep; +- result += strings[i]; +- } +- +- return result; +-} +- +-inline bool contains (std::string_view t, std::string_view s) { return t.find (s) != std::string::npos; } +-inline bool startsWith (std::string_view t, char s) { return ! t.empty() && t.front() == s; } +-inline bool endsWith (std::string_view t, char s) { return ! t.empty() && t.back() == s; } +- +-inline bool startsWith (std::string_view t, std::string_view s) +-{ +- auto len = s.length(); +- return t.length() >= len && t.substr (0, len) == s; +-} +- +-inline bool endsWith (std::string_view t, std::string_view s) +-{ +- auto len1 = t.length(), len2 = s.length(); +- return len1 >= len2 && t.substr (len1 - len2) == s; +-} +- +-inline std::string getDurationDescription (std::chrono::duration d) +-{ +- auto microseconds = std::chrono::duration_cast (d).count(); +- +- if (microseconds < 0) return "-" + getDurationDescription (-d); +- if (microseconds == 0) return "0 sec"; +- +- std::string result; +- +- auto addLevel = [&] (int64_t size, std::string_view units, int64_t decimalScale, int64_t modulo) -> bool +- { +- if (microseconds < size) +- return false; +- +- if (! result.empty()) +- result += ' '; +- +- auto scaled = (microseconds * decimalScale + size / 2) / size; +- auto whole = scaled / decimalScale; +- +- if (modulo != 0) +- whole = whole % modulo; +- +- result += std::to_string (whole); +- +- if (auto fraction = scaled % decimalScale) +- { +- result += '.'; +- result += static_cast ('0' + (fraction / 10)); +- +- if (fraction % 10 != 0) +- result += static_cast ('0' + (fraction % 10)); +- } +- +- result += (whole == 1 && units.length() > 3 && units.back() == 's') ? units.substr (0, units.length() - 1) : units; +- return true; +- }; +- +- bool hours = addLevel (60000000ll * 60ll, " hours", 1, 0); +- bool mins = addLevel (60000000ll, " min", 1, hours ? 60 : 0); +- +- if (hours) +- return result; +- +- if (mins) +- { +- addLevel (1000000, " sec", 1, 60); +- } +- else +- { +- if (! addLevel (1000000, " sec", 100, 0)) +- if (! addLevel (1000, " ms", 100, 0)) +- addLevel (1, " microseconds", 100, 0); +- } +- +- return result; +-} +- +-template +-size_t getLevenshteinDistance (const StringType& string1, const StringType& string2) +-{ +- if (string1.empty()) return string2.length(); +- if (string2.empty()) return string1.length(); +- +- auto calculate = [] (size_t* costs, size_t numCosts, const StringType& s1, const StringType& s2) -> size_t +- { +- for (size_t i = 0; i < numCosts; ++i) +- costs[i] = i; +- +- size_t p1 = 0; +- +- for (auto c1 : s1) +- { +- auto corner = p1; +- *costs = p1 + 1; +- size_t p2 = 0; +- +- for (auto c2 : s2) +- { +- auto upper = costs[p2 + 1]; +- costs[p2 + 1] = c1 == c2 ? corner : (std::min (costs[p2], std::min (upper, corner)) + 1); +- ++p2; +- corner = upper; +- } +- +- ++p1; +- } +- +- return costs[numCosts - 1]; +- }; +- +- auto sizeNeeded = string2.length() + 1; +- constexpr size_t maxStackSize = 96; +- +- if (sizeNeeded <= maxStackSize) +- { +- size_t costs[maxStackSize]; +- return calculate (costs, sizeNeeded, string1, string2); +- } +- +- std::unique_ptr costs (new size_t[sizeNeeded]); +- return calculate (costs.get(), sizeNeeded, string1, string2); +-} +- +-inline std::string getByteSizeDescription (uint64_t size) +-{ +- auto intToStringWith1DecPlace = [] (uint64_t n, uint64_t divisor) -> std::string +- { +- auto scaled = (n * 10 + divisor / 2) / divisor; +- auto result = std::to_string (scaled / 10); +- +- if (auto fraction = scaled % 10) +- { +- result += '.'; +- result += static_cast ('0' + fraction); +- } +- +- return result; +- }; +- +- static constexpr uint64_t maxValue = std::numeric_limits::max() / 10; +- +- if (size >= 0x40000000) return intToStringWith1DecPlace (std::min (maxValue, size), 0x40000000) + " GB"; +- if (size >= 0x100000) return intToStringWith1DecPlace (size, 0x100000) + " MB"; +- if (size >= 0x400) return intToStringWith1DecPlace (size, 0x400) + " KB"; +- if (size != 1) return std::to_string (size) + " bytes"; +- +- return "1 byte"; +-} +- +-inline std::string percentEncodeURI (std::string_view text) +-{ +- std::string result; +- result.reserve (text.length()); +- +- for (auto c : text) +- { +- if (std::string_view ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-.~").find (c) != std::string_view::npos) +- { +- result += c; +- } +- else +- { +- result += '%'; +- result += "0123456789abcdef"[static_cast (c) >> 4]; +- result += "0123456789abcdef"[static_cast (c) & 15u]; +- } +- } +- +- return result; +-} +- +- +-} // namespace choc::text ++END_NAMESPACE_DISTRHO + + #endif +diff --git a/choc_Value.h b/choc_Value.h +index bd27f7a..5df22c4 100644 +--- a/choc_Value.h ++++ b/choc_Value.h +@@ -25,7 +25,7 @@ + #include + #include + #include +-#include "../platform/choc_Assert.h" ++#include "choc_Assert.h" + + namespace choc::value + { +diff --git a/choc_WebView.h b/choc_WebView.h +index 3ddf610..935dce1 100644 +--- a/choc_WebView.h ++++ b/choc_WebView.h +@@ -23,46 +23,18 @@ + #include + #include + #include +-#include "../platform/choc_Platform.h" +-#include "../text/choc_JSON.h" ++#include ++#include ++#include "choc_Platform.h" ++#include "choc_StringUtilities.h" + +-//============================================================================== +-namespace choc::ui +-{ ++START_NAMESPACE_DISTRHO + + /** + Creates an embedded browser which can be placed inside some kind of parent window. + + After creating a WebView object, its getViewHandle() returns a platform-specific +- handle that can be added to whatever kind of window is appropriate. The +- choc::ui::DesktopWindow class is an example of a window that can have the +- webview added to it via its choc::ui::DesktopWindow::setContent() method. +- +- There are unfortunately a few extra build steps needed for using WebView +- in your projects: +- +- - On OSX, you'll need to add the `WebKit` framework to your project +- +- - On Linux, you'll need to: +- 1. Install the libgtk-3-dev and libwebkit2gtk-4.0-dev packages. +- 2. Link the gtk+3.0 and webkit2gtk-4.0 libraries in your build. +- You might want to have a look inside choc/tests/CMakeLists.txt for +- an example of how to add those packages to your build without too +- much fuss. +- +- - On Windows, no extra build steps needed!! This is a bigger deal than it +- sounds, because normally to use an embedded Edge browser on Windows is a +- total PITA, involving downloading a special Microsoft SDK with redistributable +- DLLs, etc, but I've jumped through many ugly hoops to make this class +- fully self-contained. +- +- Because this is a GUI, it needs a message loop to be running. If you're using +- it inside an app which already runs a message loop, it should just work, +- or you can use choc::messageloop::run() and choc::messageloop::stop() for an easy +- but basic loop. +- +- For an example of how to use this class, see `choc/tests/main.cpp` where +- there's a simple demo. ++ handle that can be added to whatever kind of window is appropriate. + */ + class WebView + { +@@ -82,34 +54,6 @@ public: + // this empty for default behaviour. + std::string customUserAgent; + +- /// If you provide a fetchResource function, it is expected to return this +- /// object, which is simply the raw content of the resource, and its MIME type. +- struct Resource +- { +- Resource() = default; +- Resource (std::string_view content, std::string mimeType); +- +- std::vector data; +- std::string mimeType; +- }; +- +- using FetchResource = std::function(const std::string& path)>; +- +- /// Serve resources to the browser from a C++ callback function. +- /// This can effectively be used to implement a basic web server, +- /// serving resources to the browser in any way the client code chooses. +- /// Given the path URL component (i.e. starting from "/"), the client should +- /// return some bytes, and the associated MIME type, for that resource. +- /// When provided, this function will initially be called with the root path +- /// ("/") in order to serve the initial content for the page (or if the +- /// customSchemeURI property is also set, it will navigate to that URI). +- /// When this happens, the client should return some HTML with a "text/html" +- /// MIME type. +- /// Subsequent relative requests made from the page (e.g. via `img` tags, +- /// `fetch` calls from javascript etc) will all invoke calls to this callback +- /// with the requested path as their argument. +- FetchResource fetchResource; +- + /// If fetchResource is being used to serve custom data, you can choose to + /// override the default URI scheme by providing a home URI here, e.g. if + /// you wanted a scheme called `foo:`, you might set this to `foo://myname.com` +@@ -132,31 +76,18 @@ public: + /// fail on some systems if the OS doesn't provide a suitable component. + bool loadedOK() const; + +- /// Directly sets the HTML content of the browser +- bool setHTML (const std::string& html); +- +- /// This function type is used by evaluateJavascript(). +- using CompletionHandler = std::function; +- + /// Asynchronously evaluates some javascript. +- /// If you want to find out the result of the expression (or whether there +- /// was a compile error etc), then provide a callback function which will be +- /// invoked when the script is complete. + /// This will return true if the webview is in a state that lets it run code, or + /// false if something prevents that. +- bool evaluateJavascript (const std::string& script, CompletionHandler completionHandler = {}); ++ bool evaluateJavascript (const std::string& script); + + /// Sends the browser to this URL + bool navigate (const std::string& url); + + /// A callback function which can be passed to bind(). +- using CallbackFn = std::function; +- /// Binds a C++ function to a named javascript function that can be called +- /// by code running in the browser. +- bool bind (const std::string& functionName, CallbackFn&& function); +- /// Removes a previously-bound function. +- bool unbind (const std::string& functionName); ++ using CallbackFn = std::function; ++ /// Set the C++ callback function. ++ bool bind (CallbackFn&& function); + + /// Adds a script to run when the browser loads a page + bool addInitScript (const std::string& script); +@@ -169,14 +100,11 @@ private: + struct Pimpl; + std::unique_ptr pimpl; + +- std::unordered_map bindings; ++ CallbackFn binding {}; + void invokeBinding (const std::string&); +- static std::string getURIScheme (const Options&); +- static std::string getURIHome (const Options&); +- struct DeletionChecker { bool deleted = false; }; + }; + +-} // namespace choc::ui ++END_NAMESPACE_DISTRHO + + + //============================================================================== +@@ -190,737 +118,14 @@ private: + // + //============================================================================== + +-#if CHOC_LINUX +- +-#include "../platform/choc_DisableAllWarnings.h" +-#include +-#include +-#include "../platform/choc_ReenableAllWarnings.h" +- +-struct choc::ui::WebView::Pimpl +-{ +- Pimpl (WebView& v, const Options& options) +- : owner (v), fetchResource (options.fetchResource) +- { +- if (! gtk_init_check (nullptr, nullptr)) +- return; +- +- defaultURI = getURIHome (options); +- webviewContext = webkit_web_context_new(); +- g_object_ref_sink (G_OBJECT (webviewContext)); +- webview = webkit_web_view_new_with_context (webviewContext); +- g_object_ref_sink (G_OBJECT (webview)); +- manager = webkit_web_view_get_user_content_manager (WEBKIT_WEB_VIEW (webview)); +- +- signalHandlerID = g_signal_connect (manager, "script-message-received::external", +- G_CALLBACK (+[] (WebKitUserContentManager*, WebKitJavascriptResult* r, gpointer arg) +- { +- static_cast (arg)->invokeCallback (r); +- }), +- this); +- +- webkit_user_content_manager_register_script_message_handler (manager, "external"); +- +- WebKitSettings* settings = webkit_web_view_get_settings (WEBKIT_WEB_VIEW (webview)); +- webkit_settings_set_javascript_can_access_clipboard (settings, true); +- +- if (options.enableDebugMode) +- { +- webkit_settings_set_enable_write_console_messages_to_stdout (settings, true); +- webkit_settings_set_enable_developer_extras (settings, true); +- +- if (auto inspector = WEBKIT_WEB_INSPECTOR (webkit_web_view_get_inspector (WEBKIT_WEB_VIEW (webview)))) +- webkit_web_inspector_show (inspector); +- } +- +- if (! options.customUserAgent.empty()) +- webkit_settings_set_user_agent (settings, options.customUserAgent.c_str()); +- +- if (options.fetchResource) +- { +- const auto onResourceRequested = [] (auto* request, auto* context) +- { +- try +- { +- const auto* path = webkit_uri_scheme_request_get_path (request); +- +- if (const auto resource = static_cast (context)->fetchResource (path)) +- { +- const auto& [bytes, mimeType] = *resource; +- +- auto* streamBytes = g_bytes_new (bytes.data(), static_cast (bytes.size())); +- auto* stream = g_memory_input_stream_new_from_bytes (streamBytes); +- g_bytes_unref (streamBytes); +- +- auto* response = webkit_uri_scheme_response_new (stream, static_cast (bytes.size())); +- webkit_uri_scheme_response_set_status (response, 200, nullptr); +- webkit_uri_scheme_response_set_content_type (response, mimeType.c_str()); +- +- auto* headers = soup_message_headers_new (SOUP_MESSAGE_HEADERS_RESPONSE); +- soup_message_headers_append (headers, "Cache-Control", "no-store"); +- soup_message_headers_append (headers, "Access-Control-Allow-Origin", "*"); +- webkit_uri_scheme_response_set_http_headers (response, headers); // response takes ownership of the headers +- +- webkit_uri_scheme_request_finish_with_response (request, response); +- +- g_object_unref (stream); +- g_object_unref (response); +- } +- else +- { +- auto* stream = g_memory_input_stream_new(); +- auto* response = webkit_uri_scheme_response_new (stream, -1); +- webkit_uri_scheme_response_set_status (response, 404, nullptr); +- +- webkit_uri_scheme_request_finish_with_response (request, response); +- +- g_object_unref (stream); +- g_object_unref (response); +- } +- } +- catch (...) +- { +- auto* error = g_error_new (WEBKIT_NETWORK_ERROR, WEBKIT_NETWORK_ERROR_FAILED, "Something went wrong"); +- webkit_uri_scheme_request_finish_error (request, error); +- g_error_free (error); +- } +- }; +- +- webkit_web_context_register_uri_scheme (webviewContext, getURIScheme (options).c_str(), onResourceRequested, this, nullptr); +- navigate ({}); +- } +- +- gtk_widget_show_all (webview); +- } +- +- ~Pimpl() +- { +- deletionChecker->deleted = true; +- +- if (signalHandlerID != 0 && webview != nullptr) +- g_signal_handler_disconnect (manager, signalHandlerID); +- +- g_clear_object (&webview); +- g_clear_object (&webviewContext); +- } +- +- static constexpr const char* postMessageFn = "window.webkit.messageHandlers.external.postMessage"; +- +- bool loadedOK() const { return getViewHandle() != nullptr; } +- void* getViewHandle() const { return (void*) webview; } +- +- std::shared_ptr deletionChecker { std::make_shared() }; +- +- bool evaluateJavascript (const std::string& js, CompletionHandler&& completionHandler) +- { +- GAsyncReadyCallback callback = {}; +- gpointer userData = {}; +- +- if (completionHandler) +- { +- callback = evaluationCompleteCallback; +- userData = new CompletionHandler (std::move (completionHandler)); +- } +- +- #if WEBKIT_CHECK_VERSION (2, 40, 0) +- webkit_web_view_evaluate_javascript (WEBKIT_WEB_VIEW (webview), js.c_str(), static_cast (js.length()), +- nullptr, nullptr, nullptr, callback, userData); +- #else +- webkit_web_view_run_javascript (WEBKIT_WEB_VIEW (webview), js.c_str(), nullptr, callback, userData); +- #endif +- return true; +- } +- +- static void evaluationCompleteCallback (GObject* object, GAsyncResult* result, gpointer userData) +- { +- std::unique_ptr completionHandler (reinterpret_cast (userData)); +- choc::value::Value value; +- std::string errorMessage; +- GError* error = {}; +- +- #if WEBKIT_CHECK_VERSION (2, 40, 0) +- if (auto js_result = webkit_web_view_evaluate_javascript_finish (WEBKIT_WEB_VIEW (object), result, &error)) +- #else +- if (auto js_result = webkit_web_view_run_javascript_finish (WEBKIT_WEB_VIEW (object), result, &error)) +- #endif +- { +- if (error != nullptr) +- { +- errorMessage = error->message; +- g_error_free (error); +- } +- +- #if WEBKIT_CHECK_VERSION (2, 40, 0) +- if (auto js_value = js_result) +- #else +- if (auto js_value = webkit_javascript_result_get_js_value (js_result)) +- #endif +- { +- if (auto json = jsc_value_to_json (js_value, 0)) +- { +- try +- { +- auto jsonView = std::string_view (json); +- +- if (! jsonView.empty()) +- value = choc::json::parseValue (jsonView); +- } +- catch (const std::exception& e) +- { +- if (errorMessage.empty()) +- errorMessage = e.what(); +- } +- +- g_free (json); +- } +- else +- { +- if (errorMessage.empty()) +- errorMessage = "Failed to convert result to JSON"; +- } +- +- #if WEBKIT_CHECK_VERSION (2, 40, 0) +- g_object_unref (js_value); +- #endif +- } +- else +- { +- if (errorMessage.empty()) +- errorMessage = "Failed to fetch result"; +- } +- +- #if ! WEBKIT_CHECK_VERSION (2, 40, 0) +- webkit_javascript_result_unref (js_result); +- #endif +- } +- else +- { +- errorMessage = "Failed to fetch result"; +- } +- +- (*completionHandler) (errorMessage, value); +- } +- +- bool navigate (const std::string& url) +- { +- if (url.empty()) +- return navigate (defaultURI); +- +- webkit_web_view_load_uri (WEBKIT_WEB_VIEW (webview), url.c_str()); +- return true; +- } +- +- bool setHTML (const std::string& html) +- { +- webkit_web_view_load_html (WEBKIT_WEB_VIEW (webview), html.c_str(), nullptr); +- return true; +- } +- +- bool addInitScript (const std::string& js) +- { +- if (manager != nullptr) +- { +- webkit_user_content_manager_add_script (manager, webkit_user_script_new (js.c_str(), +- WEBKIT_USER_CONTENT_INJECT_TOP_FRAME, +- WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_START, +- nullptr, nullptr)); +- return true; +- } +- +- return false; +- } +- +- void invokeCallback (WebKitJavascriptResult* r) +- { +- auto s = jsc_value_to_string (webkit_javascript_result_get_js_value (r)); +- owner.invokeBinding (s); +- g_free (s); +- } +- +- WebView& owner; +- Options::FetchResource fetchResource; +- WebKitWebContext* webviewContext = {}; +- GtkWidget* webview = {}; +- WebKitUserContentManager* manager = {}; +- std::string defaultURI; +- unsigned long signalHandlerID = 0; +-}; +- +-//============================================================================== +-#elif CHOC_APPLE +- +-#include "choc_MessageLoop.h" +- +-struct choc::ui::WebView::Pimpl +-{ +- Pimpl (WebView& v, const Options& optionsToUse) +- : owner (v), options (std::make_unique (optionsToUse)) +- { +- using namespace choc::objc; +- CHOC_AUTORELEASE_BEGIN +- +- defaultURI = getURIHome (*options); +- +- id config = call (getClass ("WKWebViewConfiguration"), "new"); +- +- id prefs = call (config, "preferences"); +- call (prefs, "setValue:forKey:", getNSNumberBool (true), getNSString ("fullScreenEnabled")); +- call (prefs, "setValue:forKey:", getNSNumberBool (true), getNSString ("DOMPasteAllowed")); +- call (prefs, "setValue:forKey:", getNSNumberBool (true), getNSString ("javaScriptCanAccessClipboard")); +- +- if (options->enableDebugMode) +- call (prefs, "setValue:forKey:", getNSNumberBool (true), getNSString ("developerExtrasEnabled")); +- +- delegate = createDelegate(); +- objc_setAssociatedObject (delegate, "choc_webview", (CHOC_OBJC_CAST_BRIDGED id) this, OBJC_ASSOCIATION_ASSIGN); +- +- manager = call (config, "userContentController"); +- call (manager, "retain"); +- call (manager, "addScriptMessageHandler:name:", delegate, getNSString ("external")); +- +- if (options->fetchResource) +- call (config, "setURLSchemeHandler:forURLScheme:", delegate, getNSString (getURIScheme (*options))); +- +- webview = call (allocateWebview(), "initWithFrame:configuration:", CGRect(), config); +- objc_setAssociatedObject (webview, "choc_webview", (CHOC_OBJC_CAST_BRIDGED id) this, OBJC_ASSOCIATION_ASSIGN); +- +- if (! options->customUserAgent.empty()) +- call (webview, "setValue:forKey:", getNSString (options->customUserAgent), getNSString ("customUserAgent")); +- +- call (webview, "setUIDelegate:", delegate); +- call (webview, "setNavigationDelegate:", delegate); +- +- call (config, "release"); +- +- if (options->fetchResource) +- navigate ({}); +- +- CHOC_AUTORELEASE_END +- } +- +- ~Pimpl() +- { +- CHOC_AUTORELEASE_BEGIN +- deletionChecker->deleted = true; +- objc_setAssociatedObject (delegate, "choc_webview", nil, OBJC_ASSOCIATION_ASSIGN); +- objc_setAssociatedObject (webview, "choc_webview", nil, OBJC_ASSOCIATION_ASSIGN); +- objc::call (webview, "release"); +- webview = {}; +- objc::call (manager, "removeScriptMessageHandlerForName:", objc::getNSString ("external")); +- objc::call (manager, "release"); +- manager = {}; +- objc::call (delegate, "release"); +- delegate = {}; +- CHOC_AUTORELEASE_END +- } +- +- static constexpr const char* postMessageFn = "window.webkit.messageHandlers.external.postMessage"; +- +- bool loadedOK() const { return getViewHandle() != nullptr; } +- void* getViewHandle() const { return (CHOC_OBJC_CAST_BRIDGED void*) webview; } +- +- std::shared_ptr deletionChecker { std::make_shared() }; +- +- bool addInitScript (const std::string& script) +- { +- using namespace choc::objc; +- CHOC_AUTORELEASE_BEGIN +- +- if (id s = call (call (getClass ("WKUserScript"), "alloc"), "initWithSource:injectionTime:forMainFrameOnly:", +- getNSString (script), WKUserScriptInjectionTimeAtDocumentStart, (BOOL) 1)) +- { +- call (manager, "addUserScript:", s); +- call (s, "release"); +- return true; +- } +- +- CHOC_AUTORELEASE_END +- return false; +- } +- +- bool navigate (const std::string& url) +- { +- if (url.empty()) +- return navigate (defaultURI); +- +- using namespace choc::objc; +- CHOC_AUTORELEASE_BEGIN +- +- if (id nsURL = call (getClass ("NSURL"), "URLWithString:", getNSString (url))) +- return call (webview, "loadRequest:", call (getClass ("NSURLRequest"), "requestWithURL:", nsURL)) != nullptr; +- +- CHOC_AUTORELEASE_END +- return false; +- } +- +- bool setHTML (const std::string& html) +- { +- CHOC_AUTORELEASE_BEGIN +- return objc::call (webview, "loadHTMLString:baseURL:", objc::getNSString (html), (id) nullptr) != nullptr; +- CHOC_AUTORELEASE_END +- } +- +- bool evaluateJavascript (const std::string& script, CompletionHandler completionHandler) +- { +- CHOC_AUTORELEASE_BEGIN +- auto s = objc::getNSString (script); +- +- if (completionHandler) +- { +- objc::call (webview, "evaluateJavaScript:completionHandler:", s, +- ^(id result, id error) +- { +- CHOC_AUTORELEASE_BEGIN +- +- auto errorMessage = getMessageFromNSError (error); +- choc::value::Value value; +- +- try +- { +- if (auto json = convertNSObjectToJSON (result); ! json.empty()) +- value = choc::json::parseValue (json); +- } +- catch (const std::exception& e) +- { +- errorMessage = e.what(); +- } +- +- completionHandler (errorMessage, value); +- CHOC_AUTORELEASE_END +- }); +- } +- else +- { +- objc::call (webview, "evaluateJavaScript:completionHandler:", s, (id) nullptr); +- } +- +- return true; +- CHOC_AUTORELEASE_END +- } +- +- static std::string convertNSObjectToJSON (id value) +- { +- if (value) +- { +- if (id nsData = objc::call (objc::getClass ("NSJSONSerialization"), "dataWithJSONObject:options:error:", +- value, 12, (id) nullptr)) +- { +- auto data = objc::call (nsData, "bytes"); +- auto length = objc::call (nsData, "length"); +- return std::string (static_cast (data), static_cast (length)); +- } +- } +- +- return {}; +- } +- +-private: +- id createDelegate() +- { +- static DelegateClass dc; +- return objc::call ((id) dc.delegateClass, "new"); +- } +- +- id allocateWebview() +- { +- static WebviewClass c; +- return objc::call ((id) c.webviewClass, "alloc"); +- } +- +- static std::string getMessageFromNSError (id nsError) +- { +- if (nsError) +- { +- if (id userInfo = objc::call (nsError, "userInfo")) +- if (id message = objc::call (userInfo, "objectForKey:", objc::getNSString ("WKJavaScriptExceptionMessage"))) +- if (auto s = objc::getString (message); ! s.empty()) +- return s; +- +- return objc::getString (objc::call (nsError, "localizedDescription")); +- } +- +- return {}; +- } +- +- void onResourceRequested (id task) +- { +- using namespace choc::objc; +- CHOC_AUTORELEASE_BEGIN +- +- try +- { +- id requestUrl = call (call (task, "request"), "URL"); +- +- auto makeResponse = [&] (auto responseCode, id headerFields) +- { +- return call (call (call (getClass ("NSHTTPURLResponse"), "alloc"), +- "initWithURL:statusCode:HTTPVersion:headerFields:", +- requestUrl, +- responseCode, +- getNSString ("HTTP/1.1"), +- headerFields), +- "autorelease"); +- }; +- +- auto path = objc::getString (call (requestUrl, "path")); +- +- if (auto resource = options->fetchResource (path)) +- { +- const auto& [bytes, mimeType] = *resource; +- +- auto contentLength = std::to_string (bytes.size()); +- id headerKeys[] = { getNSString ("Content-Length"), getNSString ("Content-Type"), getNSString ("Cache-Control"), getNSString ("Access-Control-Allow-Origin") }; +- id headerObjects[] = { getNSString (contentLength), getNSString (mimeType), getNSString ("no-store") , getNSString ("*") }; +- +- id headerFields = call (getClass ("NSDictionary"), "dictionaryWithObjects:forKeys:count:", +- headerObjects, headerKeys, sizeof (headerObjects) / sizeof (id)); +- +- call (task, "didReceiveResponse:", makeResponse (200, headerFields)); +- +- id data = call (getClass ("NSData"), "dataWithBytes:length:", bytes.data(), bytes.size()); +- call (task, "didReceiveData:", data); +- } +- else +- { +- call (task, "didReceiveResponse:", makeResponse (404, nullptr)); +- } +- +- call (task, "didFinish"); +- } +- catch (...) +- { +- id error = call (getClass ("NSError"), "errorWithDomain:code:userInfo:", +- getNSString ("NSURLErrorDomain"), -1, nullptr); +- +- call (task, "didFailWithError:", error); +- } +- +- CHOC_AUTORELEASE_END +- } +- +- BOOL sendAppAction (id self, const char* action) +- { +- objc::call (objc::getSharedNSApplication(), "sendAction:to:from:", +- sel_registerName (action), (id) nullptr, self); +- return true; +- } +- +- BOOL performKeyEquivalent (id self, id e) +- { +- enum +- { +- NSEventTypeKeyDown = 10, +- +- NSEventModifierFlagShift = 1 << 17, +- NSEventModifierFlagControl = 1 << 18, +- NSEventModifierFlagOption = 1 << 19, +- NSEventModifierFlagCommand = 1 << 20 +- }; +- +- if (objc::call (e, "type") == NSEventTypeKeyDown) +- { +- auto flags = objc::call (e, "modifierFlags") & (NSEventModifierFlagShift | NSEventModifierFlagCommand +- | NSEventModifierFlagControl | NSEventModifierFlagOption); +- +- auto path = objc::getString (objc::call (e, "charactersIgnoringModifiers")); +- +- if (flags == NSEventModifierFlagCommand) +- { +- if (path == "c") return sendAppAction (self, "copy:"); +- if (path == "x") return sendAppAction (self, "cut:"); +- if (path == "v") return sendAppAction (self, "paste:"); +- if (path == "z") return sendAppAction (self, "undo:"); +- if (path == "a") return sendAppAction (self, "selectAll:"); +- } +- else if (flags == (NSEventModifierFlagShift | NSEventModifierFlagCommand)) +- { +- if (path == "Z") return sendAppAction (self, "redo:"); +- } +- } +- +- return false; +- } +- +- void handleError (id error) +- { +- static constexpr int NSURLErrorCancelled = -999; +- +- if (objc::call (error, "code") == NSURLErrorCancelled) +- return; +- +- setHTML ("Error" +- "

" + getMessageFromNSError (error) + "

"); +- } +- +- static Pimpl* getPimpl (id self) +- { +- return (CHOC_OBJC_CAST_BRIDGED Pimpl*) (objc_getAssociatedObject (self, "choc_webview")); +- } +- +- WebView& owner; +- // NB: this is a pointer because making it a member forces the alignment of this Pimpl class +- // to 16, which then conflicts with obj-C pointer alignment... +- std::unique_ptr options; +- id webview = {}, manager = {}, delegate = {}; +- std::string defaultURI; +- +- struct WebviewClass +- { +- WebviewClass() +- { +- webviewClass = choc::objc::createDelegateClass ("WKWebView", "CHOCWebView_"); +- +- class_addMethod (webviewClass, sel_registerName ("acceptsFirstMouse:"), +- (IMP) (+[](id self, SEL, id) -> BOOL +- { +- if (auto p = getPimpl (self)) +- return p->options->acceptsFirstMouseClick; +- +- return false; +- }), "B@:@"); +- +- class_addMethod (webviewClass, sel_registerName ("performKeyEquivalent:"), +- (IMP) (+[](id self, SEL, id e) -> BOOL +- { +- if (auto p = getPimpl (self)) +- return p->performKeyEquivalent (self, e); +- +- return false; +- }), "B@:@"); +- +- objc_registerClassPair (webviewClass); +- } +- +- ~WebviewClass() +- { +- // NB: it doesn't seem possible to dispose of this class late enough to avoid a warning on shutdown +- // about the KVO system still using it, so unfortunately the only option seems to be to let it leak.. +- // objc_disposeClassPair (webviewClass); +- } +- +- Class webviewClass = {}; +- }; +- +- struct DelegateClass +- { +- DelegateClass() +- { +- using namespace choc::objc; +- delegateClass = createDelegateClass ("NSObject", "CHOCWebViewDelegate_"); +- +- class_addMethod (delegateClass, sel_registerName ("userContentController:didReceiveScriptMessage:"), +- (IMP) (+[](id self, SEL, id, id msg) +- { +- if (auto p = getPimpl (self)) +- p->owner.invokeBinding (objc::getString (call (msg, "body"))); +- }), +- "v@:@@"); +- +- class_addMethod (delegateClass, sel_registerName ("webView:startURLSchemeTask:"), +- (IMP) (+[](id self, SEL, id, id task) +- { +- if (auto p = getPimpl (self)) +- p->onResourceRequested (task); +- }), +- "v@:@@"); +- +- class_addMethod (delegateClass, sel_registerName ("webView:didFailProvisionalNavigation:withError:"), +- (IMP) (+[](id self, SEL, id, id, id error) +- { +- if (auto p = getPimpl (self)) +- p->handleError (error); +- }), +- "v@:@@@"); +- +- class_addMethod (delegateClass, sel_registerName ("webView:didFailNavigation:withError:"), +- (IMP) (+[](id self, SEL, id, id, id error) +- { +- if (auto p = getPimpl (self)) +- p->handleError (error); +- }), +- "v@:@@@"); +- +- class_addMethod (delegateClass, sel_registerName ("webView:stopURLSchemeTask:"), (IMP) (+[](id, SEL, id, id) {}), "v@:@@"); +- +- class_addMethod (delegateClass, sel_registerName ("webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:"), +- (IMP) (+[](id, SEL, id wkwebview, id params, id /*frame*/, void (^completionHandler)(id)) +- { +- CHOC_AUTORELEASE_BEGIN +- id panel = call (getClass ("NSOpenPanel"), "openPanel"); +- +- auto allowsMultipleSelection = call (params, "allowsMultipleSelection"); +- id allowedFileExtensions = call (params, "_allowedFileExtensions"); +- id window = call (wkwebview, "window"); +- +- call (panel, "setAllowsMultipleSelection:", allowsMultipleSelection); +- call (panel, "setAllowedFileTypes:", allowedFileExtensions); +- +- call (panel, "beginSheetModalForWindow:completionHandler:", window, +- ^(long result) +- { +- CHOC_AUTORELEASE_BEGIN +- if (result == 1) // NSModalResponseOK +- completionHandler (call (panel, "URLs")); +- else +- completionHandler (nil); +- CHOC_AUTORELEASE_END +- }); +- CHOC_AUTORELEASE_END +- }), "v@:@@@@"); +- +- objc_registerClassPair (delegateClass); +- } +- +- ~DelegateClass() +- { +- objc_disposeClassPair (delegateClass); +- } +- +- Class delegateClass = {}; +- }; +- +- static constexpr long WKUserScriptInjectionTimeAtDocumentStart = 0; +- +- // Including CodeGraphics.h can create all kinds of messy C/C++ symbol clashes +- // with other headers, but all we actually need are these coordinate structs: +- #if defined (__LP64__) && __LP64__ +- using CGFloat = double; +- #else +- using CGFloat = float; +- #endif +- +- struct CGPoint { CGFloat x = 0, y = 0; }; +- struct CGSize { CGFloat width = 0, height = 0; }; +- struct CGRect { CGPoint origin; CGSize size; }; +-}; +- +-//============================================================================== +-#elif CHOC_WINDOWS +- +-#include "../platform/choc_DynamicLibrary.h" +- +-// If you want to supply your own mechanism for finding the Microsoft +-// Webview2Loader.dll file, then define the CHOC_FIND_WEBVIEW2LOADER_DLL +-// macro, which must evaluate to a choc::file::DynamicLibrary object +-// which points to the DLL. +-#ifndef CHOC_FIND_WEBVIEW2LOADER_DLL +- #define CHOC_USE_INTERNAL_WEBVIEW_DLL 1 +- #define CHOC_FIND_WEBVIEW2LOADER_DLL choc::ui::getWebview2LoaderDLL() +- #include "../platform/choc_MemoryDLL.h" +- namespace choc::ui +- { +- using WebViewDLL = choc::memory::MemoryDLL; +- static WebViewDLL getWebview2LoaderDLL(); +- } +-#else +- namespace choc::ui +- { +- using WebViewDLL = choc::file::DynamicLibrary; +- } +-#endif +- ++#include "choc_DynamicLibrary.h" ++#include "choc_MemoryDLL.h" + #include "choc_DesktopWindow.h" + ++START_NAMESPACE_DISTRHO ++static MemoryDLL getWebview2LoaderDLL(); ++END_NAMESPACE_DISTRHO ++ + #ifndef __webview2_h__ + #define __webview2_h__ + +@@ -1268,8 +473,7 @@ public: + + #endif // __webview2_h__ + +-namespace choc::ui +-{ ++START_NAMESPACE_DISTRHO + + //============================================================================== + struct WebView::Pimpl +@@ -1277,10 +481,7 @@ struct WebView::Pimpl + Pimpl (WebView& v, const Options& opts) + : owner (v), options (opts) + { +- // You cam define this macro to provide a custom way of getting a +- // choc::file::DynamicLibrary that contains the redistributable +- // Microsoft WebView2Loader.dll +- webviewDLL = CHOC_FIND_WEBVIEW2LOADER_DLL; ++ webviewDLL = getWebview2LoaderDLL(); + + if (! webviewDLL) + return; +@@ -1290,9 +491,6 @@ struct WebView::Pimpl + if (hwnd.hwnd == nullptr) + return; + +- defaultURI = getURIHome (options); +- setHTMLURI = defaultURI + "getHTMLInternal"; +- + SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR) this); + + if (createEmbeddedWebView()) +@@ -1304,8 +502,6 @@ struct WebView::Pimpl + + ~Pimpl() + { +- deletionChecker->deleted = true; +- + if (coreWebView != nullptr) + { + coreWebView->Release(); +@@ -1327,52 +523,30 @@ struct WebView::Pimpl + hwnd.reset(); + } + +- static constexpr const char* postMessageFn = "window.chrome.webview.postMessage"; +- + bool loadedOK() const { return coreWebView != nullptr; } + void* getViewHandle() const { return (void*) hwnd.hwnd; } + +- std::shared_ptr deletionChecker { std::make_shared() }; +- + bool navigate (const std::string& url) + { +- if (url.empty()) +- return navigate (defaultURI); +- +- CHOC_ASSERT (coreWebView != nullptr); ++ DISTRHO_SAFE_ASSERT_RETURN (coreWebView != nullptr, false); + return coreWebView->Navigate (createUTF16StringFromUTF8 (url).c_str()) == S_OK; + } + + bool addInitScript (const std::string& script) + { +- CHOC_ASSERT (coreWebView != nullptr); ++ DISTRHO_SAFE_ASSERT_RETURN (coreWebView != nullptr, false); + return coreWebView->AddScriptToExecuteOnDocumentCreated (createUTF16StringFromUTF8 (script).c_str(), nullptr) == S_OK; + } + +- bool evaluateJavascript (const std::string& script, CompletionHandler&& ch) +- { +- if (coreWebView == nullptr) +- return false; +- +- COMPtr callback (ch ? new ExecuteScriptCompletedCallback (std::move (ch)) +- : nullptr); +- +- return coreWebView->ExecuteScript (createUTF16StringFromUTF8 (script).c_str(), callback) == S_OK; +- } +- +- bool setHTML (const std::string& html) ++ bool evaluateJavascript (const std::string& script) + { +- CHOC_ASSERT (coreWebView != nullptr); +- pageHTML = { html, "text/html" }; +- navigate (setHTMLURI); +- return true; ++ DISTRHO_SAFE_ASSERT_RETURN (coreWebView != nullptr, false); ++ return coreWebView->ExecuteScript (createUTF16StringFromUTF8 (script).c_str(), nullptr) == S_OK; + } + + private: + WindowClass windowClass { L"CHOCWebView", (WNDPROC) wndProc }; + HWNDHolder hwnd; +- std::string defaultURI, setHTMLURI; +- WebView::Options::Resource pageHTML; + + //============================================================================== + template +@@ -1404,7 +578,7 @@ private: + return message; + } + +- return choc::text::createHexString (hr); ++ return createHexString (hr); + } + + static Pimpl* getPimpl (HWND h) { return (Pimpl*) GetWindowLongPtr (h, GWLP_USERDATA); } +@@ -1463,15 +637,9 @@ private: + if (coreWebView == nullptr) + return false; + +- const auto wildcardFilter = createUTF16StringFromUTF8 (defaultURI + "*"); +- coreWebView->AddWebResourceRequestedFilter (wildcardFilter.c_str(), COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL); +- + EventRegistrationToken token; + coreWebView->add_WebResourceRequested (handler, std::addressof (token)); + +- if (options.fetchResource) +- navigate ({}); +- + ICoreWebView2Settings* settings = nullptr; + + if (coreWebView->get_Settings (std::addressof (settings)) == S_OK +@@ -1526,14 +694,6 @@ private: + webviewInitialising.clear(); + } + +- std::optional fetchResourceOrPageHTML (const std::string& uri) +- { +- if (uri == setHTMLURI) +- return pageHTML; +- +- return options.fetchResource (uri.substr (defaultURI.size() - 1)); +- } +- + HRESULT onResourceRequested (ICoreWebView2WebResourceRequestedEventArgs* args) + { + struct ScopedExit +@@ -1579,42 +739,8 @@ private: + ICoreWebView2WebResourceResponse* response = {}; + ScopedExit cleanupResponse (makeCleanupIUnknown (response)); + +- if (const auto resource = fetchResourceOrPageHTML (createUTF8FromUTF16 (uri))) +- { +- const auto makeMemoryStream = [](const auto* data, auto length) -> IStream* +- { +- choc::file::DynamicLibrary lib ("shlwapi.dll"); +- using SHCreateMemStreamFn = IStream*(__stdcall *)(const BYTE*, UINT); +- auto fn = reinterpret_cast (lib.findFunction ("SHCreateMemStream")); +- return fn ? fn (data, length) : nullptr; +- }; +- +- auto* stream = makeMemoryStream (reinterpret_cast (resource->data.data()), +- static_cast (resource->data.size())); +- +- if (stream == nullptr) +- return E_FAIL; +- +- ScopedExit cleanupStream (makeCleanupIUnknown (stream)); +- +- std::vector headers; +- headers.emplace_back ("Content-Type: " + resource->mimeType); +- headers.emplace_back ("Cache-Control: no-store"); +- headers.emplace_back ("Access-Control-Allow-Origin: *"); +- +- if (! options.customUserAgent.empty()) +- headers.emplace_back ("User-Agent: " + options.customUserAgent); +- +- const auto headerString = createUTF16StringFromUTF8 (choc::text::joinStrings (headers, "\n")); +- +- if (coreWebViewEnvironment->CreateWebResourceResponse (stream, 200, L"OK", headerString.c_str(), std::addressof (response)) != S_OK) +- return E_FAIL; +- } +- else +- { +- if (coreWebViewEnvironment->CreateWebResourceResponse (nullptr, 404, L"Not Found", nullptr, std::addressof (response)) != S_OK) +- return E_FAIL; +- } ++ if (coreWebViewEnvironment->CreateWebResourceResponse (nullptr, 404, L"Not Found", nullptr, std::addressof (response)) != S_OK) ++ return E_FAIL; + + if (args->put_Response (response) != S_OK) + return E_FAIL; +@@ -1708,58 +834,9 @@ private: + std::atomic refCount { 0 }; + }; + +- //============================================================================== +- struct ExecuteScriptCompletedCallback : public ICoreWebView2ExecuteScriptCompletedHandler +- { +- ExecuteScriptCompletedCallback (CompletionHandler&& cb) : callback (std::move (cb)) {} +- virtual ~ExecuteScriptCompletedCallback() {} +- +- HRESULT STDMETHODCALLTYPE QueryInterface (REFIID refID, void** result) override +- { +- if (refID == IID { 0x49511172, 0xcc67, 0x4bca, { 0x99, 0x23, 0x13, 0x71, 0x12, 0xf4, 0xc4, 0xcc } } +- || refID == IID_IUnknown) +- { +- *result = this; +- AddRef(); +- return S_OK; +- } +- +- *result = nullptr; +- return E_NOINTERFACE; +- } +- +- ULONG STDMETHODCALLTYPE AddRef() override { return ++refCount; } +- ULONG STDMETHODCALLTYPE Release() override { auto newCount = --refCount; if (newCount == 0) delete this; return newCount; } +- +- HRESULT STDMETHODCALLTYPE Invoke (HRESULT hr, LPCWSTR resultJSON) override +- { +- std::string errorMessage = getMessageFromHRESULT (hr); +- choc::value::Value value; +- +- if (resultJSON != nullptr) +- { +- try +- { +- if (auto json = createUTF8FromUTF16 (std::wstring (resultJSON)); ! json.empty()) +- value = choc::json::parseValue (json); +- } +- catch (const std::exception& e) +- { +- errorMessage = e.what(); +- } +- } +- +- callback (errorMessage, value); +- return S_OK; +- } +- +- CompletionHandler callback; +- std::atomic refCount { 0 }; +- }; +- + //============================================================================== + WebView& owner; +- WebViewDLL webviewDLL; ++ MemoryDLL webviewDLL; + Options options; + ICoreWebView2Environment* coreWebViewEnvironment = nullptr; + ICoreWebView2* coreWebView = nullptr; +@@ -1793,15 +870,6 @@ private: + } + }; + +-} // namespace choc::ui +- +-#else +- #error "choc WebView only supports OSX, Windows or Linux!" +-#endif +- +-namespace choc::ui +-{ +- + //============================================================================== + inline WebView::WebView() : WebView (Options()) {} + +@@ -1820,137 +888,30 @@ inline WebView::~WebView() + + inline bool WebView::loadedOK() const { return pimpl != nullptr; } + inline bool WebView::navigate (const std::string& url) { return pimpl != nullptr && pimpl->navigate (url); } +-inline bool WebView::setHTML (const std::string& html) { return pimpl != nullptr && pimpl->setHTML (html); } + inline bool WebView::addInitScript (const std::string& script) { return pimpl != nullptr && pimpl->addInitScript (script); } + +-inline bool WebView::evaluateJavascript (const std::string& script, CompletionHandler completionHandler) ++inline bool WebView::evaluateJavascript (const std::string& script) + { +- return pimpl != nullptr && pimpl->evaluateJavascript (script, std::move (completionHandler)); ++ return pimpl != nullptr && pimpl->evaluateJavascript (script); + } + + inline void* WebView::getViewHandle() const { return pimpl != nullptr ? pimpl->getViewHandle() : nullptr; } + +-inline bool WebView::bind (const std::string& functionName, CallbackFn&& fn) ++inline bool WebView::bind (CallbackFn&& fn) + { + if (pimpl == nullptr) + return false; + +- static constexpr std::string_view scriptTemplate = R"((function() { +-const fnBinding = window._fnBindings = (window._fnBindings || { messageID: 1 }); +- +-window["FUNCTION_NAME"] = function() +-{ +- const messageID = ++fnBinding.messageID; +- const promise = new Promise((resolve, reject) => { fnBinding[messageID] = { resolve, reject }; }); +- +- const args = JSON.stringify ({ id: messageID, +- fn: "FUNCTION_NAME", +- params: Array.prototype.slice.call (arguments) +- }, +- (key, value) => typeof value === 'bigint' ? value.toString() : value); +- INVOKE_BINDING (args); +- return promise; +-} +-})())"; +- +- auto script = choc::text::replace (scriptTemplate, "FUNCTION_NAME", functionName, +- "INVOKE_BINDING", Pimpl::postMessageFn); +- +- if (addInitScript (script) +- && evaluateJavascript (script)) +- { +- bindings[functionName] = std::move (fn); +- return true; +- } +- +- return false; +-} +- +-inline bool WebView::unbind (const std::string& functionName) +-{ +- if (auto found = bindings.find (functionName); found != bindings.end()) +- { +- evaluateJavascript ("delete window[\"" + functionName + "\"];"); +- bindings.erase (found); +- return true; +- } +- +- return false; ++ binding = std::move (fn); ++ return true; + } + + inline void WebView::invokeBinding (const std::string& msg) + { +- try +- { +- auto json = choc::json::parse (msg); +- auto b = bindings.find (std::string (json["fn"].getString())); +- auto callbackID = json["id"].getWithDefault(0); +- +- if (callbackID == 0 || b == bindings.end()) +- return; +- +- auto callbackItem = "window._fnBindings[" + std::to_string (callbackID) + "]"; +- +- try +- { +- auto deletionChecker = pimpl->deletionChecker; +- auto result = b->second (json["params"]); +- +- if (deletionChecker->deleted) // in case the WebView was deleted during the callback +- return; +- +- auto call = callbackItem + ".resolve(" + choc::json::toString (result) + "); delete " + callbackItem + ";"; +- evaluateJavascript (call); +- return; +- } +- catch (const std::exception&) +- {} +- +- auto call = callbackItem + ".reject(); delete " + callbackItem + ";"; +- evaluateJavascript (call); +- } +- catch (const std::exception&) +- {} +-} +- +-inline std::string WebView::getURIHome (const Options& options) +-{ +- if (! options.customSchemeURI.empty()) +- { +- if (choc::text::endsWith (options.customSchemeURI, "/")) +- return options.customSchemeURI; +- +- return options.customSchemeURI + "/"; +- } +- +- #if CHOC_WINDOWS +- return "https://choc.localhost/"; +- #else +- return "choc://choc.choc/"; +- #endif +-} +- +-inline std::string WebView::getURIScheme (const Options& options) +-{ +- auto uri = getURIHome (options); +- auto colon = uri.find (":"); +- CHOC_ASSERT (colon != std::string::npos && colon != 0); // need to provide a valid URI with a scheme at the start. +- return uri.substr (0, colon); +-} +- +-inline WebView::Options::Resource::Resource (std::string_view content, std::string mime) +-{ +- if (! content.empty()) +- { +- auto src = content.data(); +- data.insert (data.end(), src, src + content.length()); +- } +- +- mimeType = std::move (mime); ++ binding(msg); + } + +-} // namespace choc::ui +- ++END_NAMESPACE_DISTRHO + + //============================================================================== + //============================================================================== +@@ -2035,7 +996,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + )") + #endif + +-inline choc::ui::WebViewDLL choc::ui::getWebview2LoaderDLL() ++inline DISTRHO_NAMESPACE::MemoryDLL DISTRHO_NAMESPACE::getWebview2LoaderDLL() + { + // This is version 1.0.2365.46 + +@@ -5798,7 +4759,7 @@ inline choc::ui::WebViewDLL choc::ui::getWebview2LoaderDLL() + }; + #endif + +- return choc::memory::MemoryDLL (dllData, sizeof (dllData)); ++ return DISTRHO_NAMESPACE::MemoryDLL (dllData, sizeof (dllData)); + } + + #endif diff --git a/dpf/distrho/extra/choc/choc_DesktopWindow.h b/dpf/distrho/extra/choc/choc_DesktopWindow.h new file mode 100644 index 0000000..55e7305 --- /dev/null +++ b/dpf/distrho/extra/choc/choc_DesktopWindow.h @@ -0,0 +1,154 @@ +// +// ██████ ██  ██  ██████  ██████ +// ██      ██  ██ ██    ██ ██       ** Classy Header-Only Classes ** +// ██  ███████ ██  ██ ██ +// ██  ██   ██ ██  ██ ██ https://github.com/Tracktion/choc +//  ██████ ██  ██  ██████   ██████ +// +// CHOC is (C)2022 Tracktion Corporation, and is offered under the terms of the ISC license: +// +// Permission to use, copy, modify, and/or distribute this software for any purpose with or +// without fee is hereby granted, provided that the above copyright notice and this permission +// notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#ifndef CHOC_DESKTOPWINDOW_HEADER_INCLUDED +#define CHOC_DESKTOPWINDOW_HEADER_INCLUDED + +#include "choc_Platform.h" + +//============================================================================== +// _ _ _ _ +// __| | ___ | |_ __ _ (_)| | ___ +// / _` | / _ \| __| / _` || || |/ __| +// | (_| || __/| |_ | (_| || || |\__ \ _ _ _ +// \__,_| \___| \__| \__,_||_||_||___/(_)(_)(_) +// +// Code beyond this point is implementation detail... +// +//============================================================================== + +#undef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#undef NOMINMAX +#define NOMINMAX +#define Rectangle Rectangle_renamed_to_avoid_name_collisions +#include +#undef Rectangle + +START_NAMESPACE_DISTRHO + +struct HWNDHolder +{ + HWNDHolder() = default; + HWNDHolder (HWND h) : hwnd (h) {} + HWNDHolder (const HWNDHolder&) = delete; + HWNDHolder& operator= (const HWNDHolder&) = delete; + HWNDHolder (HWNDHolder&& other) : hwnd (other.hwnd) { other.hwnd = {}; } + HWNDHolder& operator= (HWNDHolder&& other) { reset(); hwnd = other.hwnd; other.hwnd = {}; return *this; } + ~HWNDHolder() { reset(); } + + operator HWND() const { return hwnd; } + operator void*() const { return (void*) hwnd; } + + void reset() { if (IsWindow (hwnd)) DestroyWindow (hwnd); hwnd = {}; } + + HWND hwnd = {}; +}; + +struct WindowClass +{ + WindowClass (std::wstring name, WNDPROC wndProc) + { + name += std::to_wstring (static_cast (GetTickCount())); + + moduleHandle = GetModuleHandle (nullptr); + auto icon = (HICON) LoadImage (moduleHandle, IDI_APPLICATION, IMAGE_ICON, + GetSystemMetrics (SM_CXSMICON), + GetSystemMetrics (SM_CYSMICON), + LR_DEFAULTCOLOR); + + WNDCLASSEXW wc; + ZeroMemory (&wc, sizeof(wc)); + wc.cbSize = sizeof(wc); + wc.style = CS_OWNDC; + wc.hInstance = moduleHandle; + wc.lpszClassName = name.c_str(); + wc.hIcon = icon; + wc.hIconSm = icon; + wc.lpfnWndProc = wndProc; + + classAtom = (LPCWSTR) (uintptr_t) RegisterClassExW (&wc); + DISTRHO_SAFE_ASSERT (classAtom != 0); + } + + ~WindowClass() + { + UnregisterClassW (classAtom, moduleHandle); + } + + HWNDHolder createWindow (DWORD style, int w, int h, void* userData) + { + if (auto hwnd = CreateWindowW (classAtom, L"", style, CW_USEDEFAULT, CW_USEDEFAULT, + w, h, nullptr, nullptr, moduleHandle, nullptr)) + { + SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR) userData); + return hwnd; + } + + return {}; + } + + auto getClassName() const { return classAtom; } + + HINSTANCE moduleHandle = {}; + LPCWSTR classAtom = {}; +}; + +static std::string createUTF8FromUTF16 (const std::wstring& utf16) +{ + if (! utf16.empty()) + { + auto numWideChars = static_cast (utf16.size()); + auto resultSize = WideCharToMultiByte (CP_UTF8, WC_ERR_INVALID_CHARS, utf16.data(), numWideChars, nullptr, 0, nullptr, nullptr); + + if (resultSize > 0) + { + std::string result; + result.resize (static_cast (resultSize)); + + if (WideCharToMultiByte (CP_UTF8, WC_ERR_INVALID_CHARS, utf16.data(), numWideChars, result.data(), resultSize, nullptr, nullptr) > 0) + return result; + } + } + + return {}; +} + +static std::wstring createUTF16StringFromUTF8 (std::string_view utf8) +{ + if (! utf8.empty()) + { + auto numUTF8Bytes = static_cast (utf8.size()); + auto resultSize = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, utf8.data(), numUTF8Bytes, nullptr, 0); + + if (resultSize > 0) + { + std::wstring result; + result.resize (static_cast (resultSize)); + + if (MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, utf8.data(), numUTF8Bytes, result.data(), resultSize) > 0) + return result; + } + } + + return {}; +} + +END_NAMESPACE_DISTRHO + +#endif // CHOC_DESKTOPWINDOW_HEADER_INCLUDED diff --git a/dpf/distrho/extra/choc/choc_DynamicLibrary.h b/dpf/distrho/extra/choc/choc_DynamicLibrary.h new file mode 100644 index 0000000..ef8c282 --- /dev/null +++ b/dpf/distrho/extra/choc/choc_DynamicLibrary.h @@ -0,0 +1,141 @@ +// +// ██████ ██  ██  ██████  ██████ +// ██      ██  ██ ██    ██ ██       ** Classy Header-Only Classes ** +// ██  ███████ ██  ██ ██ +// ██  ██   ██ ██  ██ ██ https://github.com/Tracktion/choc +//  ██████ ██  ██  ██████   ██████ +// +// CHOC is (C)2022 Tracktion Corporation, and is offered under the terms of the ISC license: +// +// Permission to use, copy, modify, and/or distribute this software for any purpose with or +// without fee is hereby granted, provided that the above copyright notice and this permission +// notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#ifndef CHOC_DYNAMIC_LIBRARY_HEADER_INCLUDED +#define CHOC_DYNAMIC_LIBRARY_HEADER_INCLUDED + +#include + +START_NAMESPACE_DISTRHO + +//============================================================================== +/** + A minimal cross-platform loader for .dll/.so files. +*/ +struct DynamicLibrary +{ + DynamicLibrary() = default; + + /// Attempts to load a library with the given name or path. + DynamicLibrary (std::string_view library); + + DynamicLibrary (const DynamicLibrary&) = delete; + DynamicLibrary& operator= (const DynamicLibrary&) = delete; + DynamicLibrary (DynamicLibrary&&); + DynamicLibrary& operator= (DynamicLibrary&&); + + /// On destruction, this object releases the library that was loaded + ~DynamicLibrary(); + + /// Returns a pointer to the function with this name, or nullptr if not found. + void* findFunction (std::string_view functionName); + + /// Returns true if the library was successfully loaded + operator bool() const noexcept { return handle != nullptr; } + + /// Releases any handle that this object is holding + void close(); + + /// platform-specific handle. Will be nullptr if not loaded + void* handle = nullptr; +}; + + + +//============================================================================== +// _ _ _ _ +// __| | ___ | |_ __ _ (_)| | ___ +// / _` | / _ \| __| / _` || || |/ __| +// | (_| || __/| |_ | (_| || || |\__ \ _ _ _ +// \__,_| \___| \__| \__,_||_||_||___/(_)(_)(_) +// +// Code beyond this point is implementation detail... +// +//============================================================================== + +inline DynamicLibrary::~DynamicLibrary() +{ + close(); +} + +inline DynamicLibrary::DynamicLibrary (DynamicLibrary&& other) : handle (other.handle) +{ + other.handle = nullptr; +} + +inline DynamicLibrary& DynamicLibrary::operator= (DynamicLibrary&& other) +{ + close(); + handle = other.handle; + other.handle = nullptr; + return *this; +} + +//============================================================================== +namespace win32_defs +{ +#if ! (defined (_WINDOWS_) || defined (_APISETLIBLOADER_)) // only use these local definitions if windows.h isn't already included + using CHOC_HMODULE = void*; + #ifdef _MSC_VER + extern "C" CHOC_HMODULE __stdcall choc_LoadLibraryA (const char*); + extern "C" int __stdcall choc_FreeLibrary (CHOC_HMODULE); + extern "C" void* __stdcall choc_GetProcAddress (CHOC_HMODULE, const char*); + #pragma comment(linker,"/alternatename:choc_LoadLibraryA=LoadLibraryA") + #pragma comment(linker,"/alternatename:choc_FreeLibrary=FreeLibrary") + #pragma comment(linker,"/alternatename:choc_GetProcAddress=GetProcAddress") + static inline CHOC_HMODULE LoadLibraryA (const char* l) { return choc_LoadLibraryA (l); } + static inline int FreeLibrary (CHOC_HMODULE m) { return choc_FreeLibrary (m); } + static inline void* GetProcAddress (CHOC_HMODULE m, const char* f) { return choc_GetProcAddress (m, f); } + #else + extern "C" __declspec(dllimport) CHOC_HMODULE __stdcall LoadLibraryA (const char*); + extern "C" __declspec(dllimport) int __stdcall FreeLibrary (CHOC_HMODULE); + extern "C" __declspec(dllimport) void* __stdcall GetProcAddress (CHOC_HMODULE, const char*); + #endif +#else + using CHOC_HMODULE = HMODULE; + static inline CHOC_HMODULE LoadLibraryA (const char* l) { return ::LoadLibraryA (l); } + static inline int FreeLibrary (CHOC_HMODULE m) { return ::FreeLibrary (m); } + static inline void* GetProcAddress (CHOC_HMODULE m, const char* f) { return (void*) ::GetProcAddress (m, f); } +#endif +} + +inline DynamicLibrary::DynamicLibrary (std::string_view library) +{ + handle = (void*) win32_defs::LoadLibraryA (std::string (library).c_str()); +} + +inline void DynamicLibrary::close() +{ + if (handle != nullptr) + { + win32_defs::FreeLibrary ((win32_defs::CHOC_HMODULE) handle); + handle = nullptr; + } +} + +inline void* DynamicLibrary::findFunction (std::string_view name) +{ + if (handle != nullptr) + return (void*) win32_defs::GetProcAddress ((win32_defs::CHOC_HMODULE) handle, std::string (name).c_str()); + + return {}; +} + +END_NAMESPACE_DISTRHO + +#endif // CHOC_DYNAMIC_LIBRARY_HEADER_INCLUDED diff --git a/dpf/distrho/extra/choc/choc_MemoryDLL.h b/dpf/distrho/extra/choc/choc_MemoryDLL.h new file mode 100644 index 0000000..f60eea1 --- /dev/null +++ b/dpf/distrho/extra/choc/choc_MemoryDLL.h @@ -0,0 +1,511 @@ +// +// ██████ ██  ██  ██████  ██████ +// ██      ██  ██ ██    ██ ██       ** Classy Header-Only Classes ** +// ██  ███████ ██  ██ ██ +// ██  ██   ██ ██  ██ ██ https://github.com/Tracktion/choc +//  ██████ ██  ██  ██████   ██████ +// +// CHOC is (C)2022 Tracktion Corporation, and is offered under the terms of the ISC license: +// +// Permission to use, copy, modify, and/or distribute this software for any purpose with or +// without fee is hereby granted, provided that the above copyright notice and this permission +// notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#ifndef CHOC_MEMORYDLL_HEADER_INCLUDED +#define CHOC_MEMORYDLL_HEADER_INCLUDED + +#include +#include +#include + +START_NAMESPACE_DISTRHO + +/** + MemoryDLL is an egregious hack that allows you to load DLL files from a chunk + of memory in the same way you might load them from a file on disk. + + This opens up the ability to do horrible things such as embedding a random DLL + in a chunk of C++ code, so that it gets baked directly into your executable.. + That means that if your app requires a 3rd-party DLL but you don't want the hassle + of having to install the DLL file in the right place on your users' machines, you + could use this trick to embed it invisibly inside your executable... + + Currently this is only implemented for Windows DLLs, but a linux/OSX loader for + .dylibs is also totally feasible if anyone fancies having a go :) + + @see DynamicLibrary +*/ +struct MemoryDLL +{ + MemoryDLL() = default; + MemoryDLL (MemoryDLL&&) = default; + MemoryDLL& operator= (MemoryDLL&&) = default; + ~MemoryDLL(); + + /// Attempts to load a chunk of memory that contains a DLL file image. + MemoryDLL (const void* data, size_t size); + + /// Returns a pointer to the function with this name, or nullptr if not found. + void* findFunction (std::string_view functionName); + + /// Returns true if the library was successfully loaded + operator bool() const { return pimpl != nullptr; } + +private: + struct Pimpl; + std::unique_ptr pimpl; +}; + +END_NAMESPACE_DISTRHO + + + +//============================================================================== +// _ _ _ _ +// __| | ___ | |_ __ _ (_)| | ___ +// / _` | / _ \| __| / _` || || |/ __| +// | (_| || __/| |_ | (_| || || |\__ \ _ _ _ +// \__,_| \___| \__| \__,_||_||_||___/(_)(_)(_) +// +// Code beyond this point is implementation detail... +// +//============================================================================== + +#include +#include +#undef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#undef NOMINMAX +#define NOMINMAX +#define Rectangle Rectangle_renamed_to_avoid_name_collisions +#include +#undef Rectangle + +START_NAMESPACE_DISTRHO + +struct MemoryDLL::Pimpl +{ + Pimpl() = default; + + ~Pimpl() + { + if (entryFunction != nullptr) + (*reinterpret_cast (entryFunction)) ((HINSTANCE) imageData, DLL_PROCESS_DETACH, nullptr); + + for (auto& m : loadedModules) + FreeLibrary (m); + + if (imageData != nullptr) + VirtualFree (imageData, 0, MEM_RELEASE); + + for (auto m : virtualBlocks) + VirtualFree (m, 0, MEM_RELEASE); + } + + bool initialise (const void* data, size_t size) + { + if (size < sizeof (IMAGE_DOS_HEADER)) + return false; + + auto dosHeader = static_cast (data); + + if (dosHeader->e_magic != IMAGE_DOS_SIGNATURE + || size < static_cast (dosHeader->e_lfanew) + sizeof (IMAGE_NT_HEADERS)) + return false; + + const auto& headers = *getOffsetAs (data, dosHeader->e_lfanew); + + if (headers.Signature != IMAGE_NT_SIGNATURE + || (headers.OptionalHeader.SectionAlignment & 1) != 0) + return false; + + #ifdef _M_ARM64 + if (headers.FileHeader.Machine != IMAGE_FILE_MACHINE_ARM64) return false; + #elif defined (_WIN64) + if (headers.FileHeader.Machine != IMAGE_FILE_MACHINE_AMD64) return false; + #else + if (headers.FileHeader.Machine != IMAGE_FILE_MACHINE_I386) return false; + #endif + + SYSTEM_INFO systemInfo; + GetNativeSystemInfo (std::addressof (systemInfo)); + + auto alignedImageSize = roundUp (headers.OptionalHeader.SizeOfImage, systemInfo.dwPageSize); + + if (alignedImageSize != roundUp (getLastSectionEnd (headers), systemInfo.dwPageSize)) + return false; + + imageData = VirtualAlloc (reinterpret_cast (headers.OptionalHeader.ImageBase), + alignedImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); + + if (imageData == nullptr) + { + imageData = VirtualAlloc (nullptr, alignedImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); + + if (imageData == nullptr) + return false; + } + + while ((((uint64_t) imageData) >> 32) < (((uint64_t) imageData + alignedImageSize) >> 32)) + { + virtualBlocks.push_back (imageData); + imageData = VirtualAlloc (nullptr, alignedImageSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); + + if (imageData == nullptr) + return false; + } + + isDLL = (headers.FileHeader.Characteristics & IMAGE_FILE_DLL) != 0; + pageSize = systemInfo.dwPageSize; + + if (size < headers.OptionalHeader.SizeOfHeaders) + return false; + + auto newHeaders = VirtualAlloc (imageData, headers.OptionalHeader.SizeOfHeaders, MEM_COMMIT, PAGE_READWRITE); + memcpy (newHeaders, dosHeader, headers.OptionalHeader.SizeOfHeaders); + imageHeaders = getOffsetAs (newHeaders, dosHeader->e_lfanew); + imageHeaders->OptionalHeader.ImageBase = reinterpret_cast (imageData); + + if (copySections (data, size, headers.OptionalHeader.SectionAlignment)) + { + if (auto locationDelta = (ptrdiff_t) (imageHeaders->OptionalHeader.ImageBase - headers.OptionalHeader.ImageBase)) + performRelocation (locationDelta); + + if (loadImports() && prepareSections()) + { + executeTLS(); + loadNameTable(); + + if (imageHeaders->OptionalHeader.AddressOfEntryPoint != 0) + { + entryFunction = getOffsetAs (imageData, imageHeaders->OptionalHeader.AddressOfEntryPoint); + + if (isDLL) + return (*reinterpret_cast (entryFunction)) ((HINSTANCE) imageData, DLL_PROCESS_ATTACH, nullptr); + + return true; + } + } + } + + return false; + } + + void* findFunction (std::string_view name) + { + if (auto found = exportedFunctionOffsets.find (std::string (name)); found != exportedFunctionOffsets.end()) + return getOffsetAs (imageData, found->second); + + return {}; + } + +private: + PIMAGE_NT_HEADERS imageHeaders = {}; + void* imageData = nullptr; + std::vector loadedModules; + uint32_t pageSize = 0; + bool isDLL = false; + std::vector virtualBlocks; + std::unordered_map exportedFunctionOffsets; + using DLLEntryFn = BOOL(WINAPI*)(HINSTANCE, DWORD, void*); + void* entryFunction = {}; + + template + static const Type* getOffsetAs (const void* address, Diff offset) + { + return reinterpret_cast (static_cast (address) + offset); + } + + template + static Type* getOffsetAs (void* address, Diff offset) + { + return reinterpret_cast (static_cast (address) + offset); + } + + template + Type* getDataDirectoryAddress (int type) const + { + auto& dd = imageHeaders->OptionalHeader.DataDirectory[type]; + + if (dd.Size > 0) + return getOffsetAs (imageData, dd.VirtualAddress); + + return {}; + } + + static size_t getLastSectionEnd (const IMAGE_NT_HEADERS& headers) + { + auto section = IMAGE_FIRST_SECTION (&headers); + auto optionalSectionSize = headers.OptionalHeader.SectionAlignment; + size_t lastSectionEnd = 0; + + for (uint32_t i = 0; i < headers.FileHeader.NumberOfSections; ++i, ++section) + { + auto end = section->VirtualAddress + (section->SizeOfRawData == 0 ? optionalSectionSize + : section->SizeOfRawData); + if (end > lastSectionEnd) + lastSectionEnd = end; + } + + return lastSectionEnd; + } + + void loadNameTable() + { + if (auto exports = getDataDirectoryAddress (IMAGE_DIRECTORY_ENTRY_EXPORT)) + { + if (exports->NumberOfNames > 0 && exports->NumberOfFunctions > 0) + { + auto name = getOffsetAs (imageData, exports->AddressOfNames); + auto ordinal = getOffsetAs (imageData, exports->AddressOfNameOrdinals); + + exportedFunctionOffsets.reserve (exports->NumberOfNames); + + for (size_t i = 0; i < exports->NumberOfNames; ++i, ++name, ++ordinal) + if (*ordinal <= exports->NumberOfFunctions) + exportedFunctionOffsets[std::string (getOffsetAs (imageData, *name))] + = getOffsetAs (imageData, exports->AddressOfFunctions)[*ordinal]; + } + } + } + + void executeTLS() + { + if (auto tls = getDataDirectoryAddress (IMAGE_DIRECTORY_ENTRY_TLS)) + if (auto callback = reinterpret_cast (tls->AddressOfCallBacks)) + while (*callback != nullptr) + (*callback++) ((void*) imageData, DLL_PROCESS_ATTACH, nullptr); + } + + bool prepareSections() + { + auto section = IMAGE_FIRST_SECTION (imageHeaders); + auto size = getSectionSize (*section); + auto address = getSectionAddress (*section); + auto addressPage = getPageBase (address); + auto characteristics = section->Characteristics; + + for (WORD i = 1; i < imageHeaders->FileHeader.NumberOfSections; ++i) + { + ++section; + auto nextSize = getSectionSize (*section); + auto nextAddress = getSectionAddress (*section); + auto nextAddressPage = getPageBase (nextAddress); + + if (addressPage == nextAddressPage || address + size > nextAddressPage) + { + if ((section->Characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0 || (characteristics & IMAGE_SCN_MEM_DISCARDABLE) == 0) + characteristics = (characteristics | section->Characteristics) & ~static_cast (IMAGE_SCN_MEM_DISCARDABLE); + else + characteristics |= section->Characteristics; + + size = static_cast ((nextAddress + nextSize) - address); + continue; + } + + if (! setProtectionFlags (size, characteristics, address, addressPage, false)) + return false; + + size = nextSize; + address = nextAddress; + addressPage = nextAddressPage; + characteristics = section->Characteristics; + } + + return setProtectionFlags (size, characteristics, address, addressPage, true); + } + + bool setProtectionFlags (size_t sectionSize, DWORD sectionCharacteristics, void* sectionAddress, void* addressPage, bool isLast) + { + if (sectionSize == 0) + return true; + + if ((sectionCharacteristics & IMAGE_SCN_MEM_DISCARDABLE) != 0) + { + if (sectionAddress == addressPage + && (isLast || imageHeaders->OptionalHeader.SectionAlignment == pageSize || (sectionSize % pageSize) == 0)) + VirtualFree (sectionAddress, sectionSize, MEM_DECOMMIT); + + return true; + } + + auto getProtectionFlags = [] (DWORD type) + { + return ((type & IMAGE_SCN_MEM_NOT_CACHED) ? PAGE_NOCACHE : 0) + | ((type & IMAGE_SCN_MEM_EXECUTE) + ? ((type & IMAGE_SCN_MEM_READ) + ? ((type & IMAGE_SCN_MEM_WRITE) ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ) + : ((type & IMAGE_SCN_MEM_WRITE) ? PAGE_EXECUTE_WRITECOPY : PAGE_EXECUTE)) + : ((type & IMAGE_SCN_MEM_READ) + ? ((type & IMAGE_SCN_MEM_WRITE) ? PAGE_READWRITE : PAGE_READONLY) + : ((type & IMAGE_SCN_MEM_WRITE) ? PAGE_WRITECOPY : PAGE_NOACCESS))); + }; + + DWORD oldProtectValue; + return VirtualProtect (sectionAddress, sectionSize, + static_cast (getProtectionFlags (sectionCharacteristics)), + std::addressof (oldProtectValue)) != 0; + } + + bool loadImports() + { + auto imp = getDataDirectoryAddress (IMAGE_DIRECTORY_ENTRY_IMPORT); + + if (imp == nullptr) + return false; + + while (! IsBadReadPtr (imp, sizeof (IMAGE_IMPORT_DESCRIPTOR)) && imp->Name != 0) + { + auto handle = LoadLibraryA (getOffsetAs (imageData, imp->Name)); + + if (handle == nullptr) + return false; + + loadedModules.push_back (handle); + auto thunkRef = getOffsetAs (imageData, imp->OriginalFirstThunk ? imp->OriginalFirstThunk + : imp->FirstThunk); + auto funcRef = getOffsetAs (imageData, imp->FirstThunk); + + for (; *thunkRef != 0; ++thunkRef, ++funcRef) + { + auto name = IMAGE_SNAP_BY_ORDINAL(*thunkRef) + ? (LPCSTR) IMAGE_ORDINAL(*thunkRef) + : (LPCSTR) std::addressof (getOffsetAs (imageData, *thunkRef)->Name); + + *funcRef = GetProcAddress (handle, name); + + if (*funcRef == 0) + return false; + } + + ++imp; + } + + return true; + } + + size_t getSectionSize (const IMAGE_SECTION_HEADER& section) const + { + if (auto size = section.SizeOfRawData) + return size; + + if (section.Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) + return imageHeaders->OptionalHeader.SizeOfInitializedData; + + if (section.Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) + return imageHeaders->OptionalHeader.SizeOfUninitializedData; + + return 0; + } + + static size_t roundUp (size_t value, size_t alignment) { return (value + alignment - 1) & ~(alignment - 1); } + char* getPageBase (void* address) const { return (char*) (reinterpret_cast (address) & ~static_cast (pageSize - 1)); } + + char* getSectionAddress (const IMAGE_SECTION_HEADER& section) const + { + #ifdef _WIN64 + return reinterpret_cast (static_cast (section.Misc.PhysicalAddress) + | (static_cast (imageHeaders->OptionalHeader.ImageBase & 0xffffffff00000000))); + #else + return reinterpret_cast (section.Misc.PhysicalAddress); + #endif + } + + bool copySections (const void* data, size_t size, size_t sectionAlignment) const + { + auto section = IMAGE_FIRST_SECTION (imageHeaders); + + for (int i = 0; i < imageHeaders->FileHeader.NumberOfSections; ++i, ++section) + { + if (section->SizeOfRawData == 0) + { + if (sectionAlignment == 0) + continue; + + if (auto dest = VirtualAlloc (getOffsetAs (imageData, section->VirtualAddress), + sectionAlignment, MEM_COMMIT, PAGE_READWRITE)) + { + dest = getOffsetAs (imageData, section->VirtualAddress); + section->Misc.PhysicalAddress = static_cast (reinterpret_cast (dest)); + memset (dest, 0, sectionAlignment); + continue; + } + + return false; + } + + if (size < section->PointerToRawData + section->SizeOfRawData) + return false; + + if (auto dest = VirtualAlloc (getOffsetAs (imageData, section->VirtualAddress), + section->SizeOfRawData, MEM_COMMIT, PAGE_READWRITE)) + { + dest = getOffsetAs (imageData, section->VirtualAddress); + memcpy (dest, static_cast (data) + section->PointerToRawData, section->SizeOfRawData); + section->Misc.PhysicalAddress = static_cast (reinterpret_cast (dest)); + continue; + } + + return false; + } + + return true; + } + + void performRelocation (ptrdiff_t delta) + { + auto directory = imageHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC]; + + if (directory.Size != 0) + { + auto relocation = getOffsetAs (imageData, directory.VirtualAddress); + + while (relocation->VirtualAddress > 0) + { + auto dest = getOffsetAs (imageData, relocation->VirtualAddress); + auto offset = getOffsetAs (relocation, sizeof (IMAGE_BASE_RELOCATION)); + + for (uint32_t i = 0; i < (relocation->SizeOfBlock - sizeof (IMAGE_BASE_RELOCATION)) / 2; ++i, ++offset) + { + switch (*offset >> 12) + { + case IMAGE_REL_BASED_HIGHLOW: addDelta (dest + (*offset & 0xfff), delta); break; + case IMAGE_REL_BASED_DIR64: addDelta (dest + (*offset & 0xfff), delta); break; + case IMAGE_REL_BASED_ABSOLUTE: + default: break; + } + } + + relocation = getOffsetAs (relocation, relocation->SizeOfBlock); + } + } + } + + template + static void addDelta (char* addr, ptrdiff_t delta) + { + *reinterpret_cast (addr) = static_cast (static_cast (*reinterpret_cast (addr)) + delta); + } +}; + +inline MemoryDLL::~MemoryDLL() = default; + +inline MemoryDLL::MemoryDLL (const void* data, size_t size) : pimpl (std::make_unique()) +{ + if (! pimpl->initialise (data, size)) + pimpl.reset(); +} + +inline void* MemoryDLL::findFunction (std::string_view name) +{ + return pimpl != nullptr ? pimpl->findFunction (name) : nullptr; +} + +END_NAMESPACE_DISTRHO + +#endif // CHOC_MEMORYDLL_HEADER_INCLUDED diff --git a/dpf/distrho/extra/choc/choc_Platform.h b/dpf/distrho/extra/choc/choc_Platform.h new file mode 100644 index 0000000..e117943 --- /dev/null +++ b/dpf/distrho/extra/choc/choc_Platform.h @@ -0,0 +1,67 @@ +// +// ██████ ██  ██  ██████  ██████ +// ██      ██  ██ ██    ██ ██       ** Classy Header-Only Classes ** +// ██  ███████ ██  ██ ██ +// ██  ██   ██ ██  ██ ██ https://github.com/Tracktion/choc +//  ██████ ██  ██  ██████   ██████ +// +// CHOC is (C)2022 Tracktion Corporation, and is offered under the terms of the ISC license: +// +// Permission to use, copy, modify, and/or distribute this software for any purpose with or +// without fee is hereby granted, provided that the above copyright notice and this permission +// notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#ifndef CHOC_PLATFORM_DETECT_HEADER_INCLUDED +#define CHOC_PLATFORM_DETECT_HEADER_INCLUDED + +/* + These conditionals declare the macros + - CHOC_WINDOWS + - CHOC_ANDROID + - CHOC_LINUX + - CHOC_OSX + - CHOC_IOS + ...based on the current operating system. + + It also declares a string literal macro CHOC_OPERATING_SYSTEM_NAME + which can be used if you need a text description of the OS. +*/ +#if defined (_WIN32) || defined (_WIN64) + #define CHOC_WINDOWS 1 + #define CHOC_OPERATING_SYSTEM_NAME "Windows" +#elif __ANDROID__ + #define CHOC_ANDROID 1 + #define CHOC_OPERATING_SYSTEM_NAME "Android" +#elif defined (LINUX) || defined (__linux__) + #define CHOC_LINUX 1 + #define CHOC_OPERATING_SYSTEM_NAME "Linux" +#elif __APPLE__ + #define CHOC_APPLE 1 + #include + #if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATOR + #define CHOC_IOS 1 + #define CHOC_OPERATING_SYSTEM_NAME "iOS" + #else + #define CHOC_OSX 1 + #define CHOC_OPERATING_SYSTEM_NAME "OSX" + #endif +#elif defined (__FreeBSD__) || (__OpenBSD__) + #define CHOC_BSD 1 + #define CHOC_OPERATING_SYSTEM_NAME "BSD" +#elif defined (_POSIX_VERSION) + #define CHOC_POSIX 1 + #define CHOC_OPERATING_SYSTEM_NAME "Posix" +#elif defined (__EMSCRIPTEN__) + #define CHOC_EMSCRIPTEN 1 + #define CHOC_OPERATING_SYSTEM_NAME "Emscripten" +#else + #error "Unknown platform!" +#endif + + +#endif // CHOC_PLATFORM_DETECT_HEADER_INCLUDED diff --git a/dpf/distrho/extra/choc/choc_StringUtilities.h b/dpf/distrho/extra/choc/choc_StringUtilities.h new file mode 100644 index 0000000..4cd54c6 --- /dev/null +++ b/dpf/distrho/extra/choc/choc_StringUtilities.h @@ -0,0 +1,74 @@ +// +// ██████ ██  ██  ██████  ██████ +// ██      ██  ██ ██    ██ ██       ** Classy Header-Only Classes ** +// ██  ███████ ██  ██ ██ +// ██  ██   ██ ██  ██ ██ https://github.com/Tracktion/choc +//  ██████ ██  ██  ██████   ██████ +// +// CHOC is (C)2022 Tracktion Corporation, and is offered under the terms of the ISC license: +// +// Permission to use, copy, modify, and/or distribute this software for any purpose with or +// without fee is hereby granted, provided that the above copyright notice and this permission +// notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#ifndef CHOC_STRING_UTILS_HEADER_INCLUDED +#define CHOC_STRING_UTILS_HEADER_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include + +START_NAMESPACE_DISTRHO + +//============================================================================== +/// Returns a hex string for the given value. +/// If the minimum number of digits is non-zero, it will be zero-padded to fill this length; +template +std::string createHexString (IntegerType value); + + +//============================================================================== +// _ _ _ _ +// __| | ___ | |_ __ _ (_)| | ___ +// / _` | / _ \| __| / _` || || |/ __| +// | (_| || __/| |_ | (_| || || |\__ \ _ _ _ +// \__,_| \___| \__| \__,_||_||_||___/(_)(_)(_) +// +// Code beyond this point is implementation detail... +// +//============================================================================== + +template +std::string createHexString (IntegerType v) +{ + static_assert (std::is_integral::value, "Need to pass integers into this method"); + auto value = static_cast::type> (v); + + char hex[40]; + const auto end = hex + sizeof (hex) - 1; + auto d = end; + *d = 0; + + for (;;) + { + *--d = "0123456789abcdef"[static_cast (value) & 15u]; + value = static_cast (value >> 4); + + if (value == 0) + return std::string (d, end); + } +} + +END_NAMESPACE_DISTRHO + +#endif diff --git a/dpf/distrho/extra/choc/choc_WebView.h b/dpf/distrho/extra/choc/choc_WebView.h new file mode 100644 index 0000000..fb88594 --- /dev/null +++ b/dpf/distrho/extra/choc/choc_WebView.h @@ -0,0 +1,4769 @@ +// +// ██████ ██  ██  ██████  ██████ +// ██      ██  ██ ██    ██ ██       ** Classy Header-Only Classes ** +// ██  ███████ ██  ██ ██ +// ██  ██   ██ ██  ██ ██ https://github.com/Tracktion/choc +//  ██████ ██  ██  ██████   ██████ +// +// CHOC is (C)2022 Tracktion Corporation, and is offered under the terms of the ISC license: +// +// Permission to use, copy, modify, and/or distribute this software for any purpose with or +// without fee is hereby granted, provided that the above copyright notice and this permission +// notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR +// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +// WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +#ifndef CHOC_WEBVIEW_HEADER_INCLUDED +#define CHOC_WEBVIEW_HEADER_INCLUDED + +#include +#include +#include +#include +#include +#include +#include "choc_Platform.h" +#include "choc_StringUtilities.h" + +START_NAMESPACE_DISTRHO + +/** + Creates an embedded browser which can be placed inside some kind of parent window. + + After creating a WebView object, its getViewHandle() returns a platform-specific + handle that can be added to whatever kind of window is appropriate. +*/ +class WebView +{ +public: + /// Contains optional settings to pass to a WebView constructor. + struct Options + { + /// If supported, this enables developer features in the browser + bool enableDebugMode = false; + + /// On OSX, setting this to true will allow the first click on a non-focused + /// webview to be used as input, rather than the default behaviour, which is + /// for the first click to give the webview focus but not trigger any action. + bool acceptsFirstMouseClick = false; + + /// Optional user-agent string which can be used to override the default. Leave + // this empty for default behaviour. + std::string customUserAgent; + + /// If fetchResource is being used to serve custom data, you can choose to + /// override the default URI scheme by providing a home URI here, e.g. if + /// you wanted a scheme called `foo:`, you might set this to `foo://myname.com` + /// and the view will navigate to that address when launched. + /// Leave blank for a default. + std::string customSchemeURI; + }; + + /// Creates a WebView with default options + WebView(); + /// Creates a WebView with some options + WebView (const Options&); + + WebView (const WebView&) = delete; + WebView (WebView&&) = default; + WebView& operator= (WebView&&) = default; + ~WebView(); + + /// Returns true if the webview has been successfully initialised. This could + /// fail on some systems if the OS doesn't provide a suitable component. + bool loadedOK() const; + + /// Asynchronously evaluates some javascript. + /// This will return true if the webview is in a state that lets it run code, or + /// false if something prevents that. + bool evaluateJavascript (const std::string& script); + + /// Sends the browser to this URL + bool navigate (const std::string& url); + + /// A callback function which can be passed to bind(). + using CallbackFn = std::function; + /// Set the C++ callback function. + bool bind (CallbackFn&& function); + + /// Adds a script to run when the browser loads a page + bool addInitScript (const std::string& script); + + /// Returns a platform-specific handle for this view + void* getViewHandle() const; + +private: + //============================================================================== + struct Pimpl; + std::unique_ptr pimpl; + + CallbackFn binding {}; + void invokeBinding (const std::string&); +}; + +END_NAMESPACE_DISTRHO + + +//============================================================================== +// _ _ _ _ +// __| | ___ | |_ __ _ (_)| | ___ +// / _` | / _ \| __| / _` || || |/ __| +// | (_| || __/| |_ | (_| || || |\__ \ _ _ _ +// \__,_| \___| \__| \__,_||_||_||___/(_)(_)(_) +// +// Code beyond this point is implementation detail... +// +//============================================================================== + +#include "choc_DynamicLibrary.h" +#include "choc_MemoryDLL.h" +#include "choc_DesktopWindow.h" + +START_NAMESPACE_DISTRHO +static MemoryDLL getWebview2LoaderDLL(); +END_NAMESPACE_DISTRHO + +#ifndef __webview2_h__ +#define __webview2_h__ + +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif + +#include +#include +#include +#include +#include +#include + +#ifndef __RPCNDR_H_VERSION__ +#error "This code requires an updated version of " +#endif + +extern "C" +{ + +struct EventRegistrationToken { __int64 value; }; + +typedef interface ICoreWebView2 ICoreWebView2; +typedef interface ICoreWebView2Controller ICoreWebView2Controller; +typedef interface ICoreWebView2Environment ICoreWebView2Environment; +typedef interface ICoreWebView2HttpHeadersCollectionIterator ICoreWebView2HttpHeadersCollectionIterator; +typedef interface ICoreWebView2HttpRequestHeaders ICoreWebView2HttpRequestHeaders; +typedef interface ICoreWebView2HttpResponseHeaders ICoreWebView2HttpResponseHeaders; +typedef interface ICoreWebView2WebResourceRequest ICoreWebView2WebResourceRequest; +typedef interface ICoreWebView2WebResourceRequestedEventArgs ICoreWebView2WebResourceRequestedEventArgs; +typedef interface ICoreWebView2WebResourceRequestedEventHandler ICoreWebView2WebResourceRequestedEventHandler; +typedef interface ICoreWebView2WebResourceResponse ICoreWebView2WebResourceResponse; + +MIDL_INTERFACE("4e8a3389-c9d8-4bd2-b6b5-124fee6cc14d") +ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Invoke(HRESULT, ICoreWebView2Environment*) = 0; +}; + +MIDL_INTERFACE("6c4819f3-c9b7-4260-8127-c9f5bde7f68c") +ICoreWebView2CreateCoreWebView2ControllerCompletedHandler : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Invoke(HRESULT, ICoreWebView2Controller*) = 0; +}; + +MIDL_INTERFACE("b96d755e-0319-4e92-a296-23436f46a1fc") +ICoreWebView2Environment : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE CreateCoreWebView2Controller(HWND, ICoreWebView2CreateCoreWebView2ControllerCompletedHandler*) = 0; + virtual HRESULT STDMETHODCALLTYPE CreateWebResourceResponse(IStream*, int, LPCWSTR, LPCWSTR, ICoreWebView2WebResourceResponse**) = 0; + virtual HRESULT STDMETHODCALLTYPE get_BrowserVersionString(LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE add_NewBrowserVersionAvailable(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_NewBrowserVersionAvailable(EventRegistrationToken) = 0; +}; + +MIDL_INTERFACE("0f99a40c-e962-4207-9e92-e3d542eff849") +ICoreWebView2WebMessageReceivedEventArgs : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_Source(LPWSTR *) = 0; + virtual HRESULT STDMETHODCALLTYPE get_WebMessageAsJson(LPWSTR *) = 0; + virtual HRESULT STDMETHODCALLTYPE TryGetWebMessageAsString(LPWSTR *) = 0; +}; + +MIDL_INTERFACE("57213f19-00e6-49fa-8e07-898ea01ecbd2") +ICoreWebView2WebMessageReceivedEventHandler : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Invoke(ICoreWebView2 *, ICoreWebView2WebMessageReceivedEventArgs *) = 0; +}; + +enum COREWEBVIEW2_PERMISSION_KIND +{ + COREWEBVIEW2_PERMISSION_KIND_UNKNOWN_PERMISSION = 0, + COREWEBVIEW2_PERMISSION_KIND_MICROPHONE = (COREWEBVIEW2_PERMISSION_KIND_UNKNOWN_PERMISSION + 1), + COREWEBVIEW2_PERMISSION_KIND_CAMERA = (COREWEBVIEW2_PERMISSION_KIND_MICROPHONE + 1), + COREWEBVIEW2_PERMISSION_KIND_GEOLOCATION = (COREWEBVIEW2_PERMISSION_KIND_CAMERA + 1), + COREWEBVIEW2_PERMISSION_KIND_NOTIFICATIONS = (COREWEBVIEW2_PERMISSION_KIND_GEOLOCATION + 1), + COREWEBVIEW2_PERMISSION_KIND_OTHER_SENSORS = (COREWEBVIEW2_PERMISSION_KIND_NOTIFICATIONS + 1), + COREWEBVIEW2_PERMISSION_KIND_CLIPBOARD_READ = (COREWEBVIEW2_PERMISSION_KIND_OTHER_SENSORS + 1) +}; + +enum COREWEBVIEW2_PERMISSION_STATE +{ + COREWEBVIEW2_PERMISSION_STATE_DEFAULT = 0, + COREWEBVIEW2_PERMISSION_STATE_ALLOW = (COREWEBVIEW2_PERMISSION_STATE_DEFAULT + 1), + COREWEBVIEW2_PERMISSION_STATE_DENY = (COREWEBVIEW2_PERMISSION_STATE_ALLOW + 1) +}; + +enum COREWEBVIEW2_MOVE_FOCUS_REASON +{ + COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC = 0, + COREWEBVIEW2_MOVE_FOCUS_REASON_NEXT = (COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC + 1), + COREWEBVIEW2_MOVE_FOCUS_REASON_PREVIOUS = (COREWEBVIEW2_MOVE_FOCUS_REASON_NEXT + 1) +}; + +enum COREWEBVIEW2_CAPTURE_PREVIEW_IMAGE_FORMAT {}; +enum COREWEBVIEW2_WEB_RESOURCE_CONTEXT +{ + COREWEBVIEW2_WEB_RESOURCE_CONTEXT_ALL = 0 +}; + +MIDL_INTERFACE("c10e7f7b-b585-46f0-a623-8befbf3e4ee0") +ICoreWebView2Deferral : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Complete() = 0; +}; + +MIDL_INTERFACE("97055cd4-512c-4264-8b5f-e3f446cea6a5") +ICoreWebView2WebResourceRequest : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_Uri(LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Uri(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Method(LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Method(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Content(IStream**) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Content(IStream*) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Headers(ICoreWebView2HttpRequestHeaders**) = 0; +}; + +MIDL_INTERFACE("973ae2ef-ff18-4894-8fb2-3c758f046810") +ICoreWebView2PermissionRequestedEventArgs : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_Uri(LPWSTR *) = 0; + virtual HRESULT STDMETHODCALLTYPE get_PermissionKind(COREWEBVIEW2_PERMISSION_KIND *) = 0; + virtual HRESULT STDMETHODCALLTYPE get_IsUserInitiated(BOOL *) = 0; + virtual HRESULT STDMETHODCALLTYPE get_State(COREWEBVIEW2_PERMISSION_STATE *) = 0; + virtual HRESULT STDMETHODCALLTYPE put_State(COREWEBVIEW2_PERMISSION_STATE) = 0; + virtual HRESULT STDMETHODCALLTYPE GetDeferral(ICoreWebView2Deferral **) = 0; +}; + + +MIDL_INTERFACE("e562e4f0-d7fa-43ac-8d71-c05150499f00") +ICoreWebView2Settings : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_IsScriptEnabled(BOOL * isScriptEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_IsScriptEnabled(BOOL isScriptEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE get_IsWebMessageEnabled(BOOL* isWebMessageEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_IsWebMessageEnabled(BOOL isWebMessageEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE get_AreDefaultScriptDialogsEnabled(BOOL* areDefaultScriptDialogsEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_AreDefaultScriptDialogsEnabled(BOOL areDefaultScriptDialogsEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE get_IsStatusBarEnabled(BOOL* isStatusBarEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_IsStatusBarEnabled(BOOL isStatusBarEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE get_AreDevToolsEnabled(BOOL* areDevToolsEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_AreDevToolsEnabled(BOOL areDevToolsEnabled) = 0; + virtual HRESULT STDMETHODCALLTYPE get_AreDefaultContextMenusEnabled(BOOL* enabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_AreDefaultContextMenusEnabled(BOOL enabled) = 0; + virtual HRESULT STDMETHODCALLTYPE get_AreHostObjectsAllowed(BOOL* allowed) = 0; + virtual HRESULT STDMETHODCALLTYPE put_AreHostObjectsAllowed(BOOL allowed) = 0; + virtual HRESULT STDMETHODCALLTYPE get_IsZoomControlEnabled(BOOL* enabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_IsZoomControlEnabled(BOOL enabled) = 0; + virtual HRESULT STDMETHODCALLTYPE get_IsBuiltInErrorPageEnabled(BOOL* enabled) = 0; + virtual HRESULT STDMETHODCALLTYPE put_IsBuiltInErrorPageEnabled(BOOL enabled) = 0; +}; + +MIDL_INTERFACE("ee9a0f68-f46c-4e32-ac23-ef8cac224d2a") +ICoreWebView2Settings2 : public ICoreWebView2Settings +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_UserAgent(LPWSTR * userAgent) = 0; + virtual HRESULT STDMETHODCALLTYPE put_UserAgent(LPCWSTR userAgent) = 0; +}; + +MIDL_INTERFACE("15e1c6a3-c72a-4df3-91d7-d097fbec6bfd") +ICoreWebView2PermissionRequestedEventHandler : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Invoke(ICoreWebView2*, ICoreWebView2PermissionRequestedEventArgs*) = 0; +}; + +MIDL_INTERFACE("76eceacb-0462-4d94-ac83-423a6793775e") +ICoreWebView2 : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_Settings(ICoreWebView2Settings**) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Source(LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE Navigate(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE NavigateToString(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE add_NavigationStarting(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_NavigationStarting(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_ContentLoading(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_ContentLoading(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_SourceChanged(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_SourceChanged(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_HistoryChanged(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_HistoryChanged(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_NavigationCompleted(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_NavigationCompleted(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_FrameNavigationStarting(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_FrameNavigationStarting(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_FrameNavigationCompleted(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_FrameNavigationCompleted(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_ScriptDialogOpening(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_ScriptDialogOpening(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_PermissionRequested(ICoreWebView2PermissionRequestedEventHandler*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_PermissionRequested(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_ProcessFailed(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_ProcessFailed(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE AddScriptToExecuteOnDocumentCreated(LPCWSTR, void*) = 0; + virtual HRESULT STDMETHODCALLTYPE RemoveScriptToExecuteOnDocumentCreated(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE ExecuteScript(LPCWSTR, void*) = 0; + virtual HRESULT STDMETHODCALLTYPE CapturePreview(COREWEBVIEW2_CAPTURE_PREVIEW_IMAGE_FORMAT, void*, void*) = 0; + virtual HRESULT STDMETHODCALLTYPE Reload() = 0; + virtual HRESULT STDMETHODCALLTYPE PostWebMessageAsJson(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE PostWebMessageAsString(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE add_WebMessageReceived(ICoreWebView2WebMessageReceivedEventHandler*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_WebMessageReceived(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE CallDevToolsProtocolMethod(LPCWSTR, LPCWSTR, void*) = 0; + virtual HRESULT STDMETHODCALLTYPE get_BrowserProcessId(UINT32*) = 0; + virtual HRESULT STDMETHODCALLTYPE get_CanGoBack(BOOL*) = 0; + virtual HRESULT STDMETHODCALLTYPE get_CanGoForward(BOOL*) = 0; + virtual HRESULT STDMETHODCALLTYPE GoBack() = 0; + virtual HRESULT STDMETHODCALLTYPE GoForward() = 0; + virtual HRESULT STDMETHODCALLTYPE GetDevToolsProtocolEventReceiver(LPCWSTR, void**) = 0; + virtual HRESULT STDMETHODCALLTYPE Stop() = 0; + virtual HRESULT STDMETHODCALLTYPE add_NewWindowRequested(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_NewWindowRequested(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_DocumentTitleChanged(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_DocumentTitleChanged(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE get_DocumentTitle(LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE AddHostObjectToScript(LPCWSTR, VARIANT*) = 0; + virtual HRESULT STDMETHODCALLTYPE RemoveHostObjectFromScript(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE OpenDevToolsWindow() = 0; + virtual HRESULT STDMETHODCALLTYPE add_ContainsFullScreenElementChanged(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_ContainsFullScreenElementChanged(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE get_ContainsFullScreenElement(BOOL*) = 0; + virtual HRESULT STDMETHODCALLTYPE add_WebResourceRequested(ICoreWebView2WebResourceRequestedEventHandler*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_WebResourceRequested(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE AddWebResourceRequestedFilter(const LPCWSTR, const COREWEBVIEW2_WEB_RESOURCE_CONTEXT) = 0; + virtual HRESULT STDMETHODCALLTYPE RemoveWebResourceRequestedFilter(const LPCWSTR, const COREWEBVIEW2_WEB_RESOURCE_CONTEXT) = 0; + virtual HRESULT STDMETHODCALLTYPE add_WindowCloseRequested(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_WindowCloseRequested(EventRegistrationToken) = 0; +}; + +MIDL_INTERFACE("4d00c0d1-9434-4eb6-8078-8697a560334f") +ICoreWebView2Controller : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_IsVisible(BOOL*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_IsVisible(BOOL) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Bounds(RECT*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Bounds(RECT) = 0; + virtual HRESULT STDMETHODCALLTYPE get_ZoomFactor(double*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_ZoomFactor(double) = 0; + virtual HRESULT STDMETHODCALLTYPE add_ZoomFactorChanged(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_ZoomFactorChanged(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE SetBoundsAndZoomFactor(RECT, double) = 0; + virtual HRESULT STDMETHODCALLTYPE MoveFocus(COREWEBVIEW2_MOVE_FOCUS_REASON) = 0; + virtual HRESULT STDMETHODCALLTYPE add_MoveFocusRequested(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_MoveFocusRequested(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_GotFocus(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_GotFocus(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_LostFocus(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_LostFocus(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE add_AcceleratorKeyPressed(void*, EventRegistrationToken*) = 0; + virtual HRESULT STDMETHODCALLTYPE remove_AcceleratorKeyPressed(EventRegistrationToken) = 0; + virtual HRESULT STDMETHODCALLTYPE get_ParentWindow(HWND*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_ParentWindow(HWND) = 0; + virtual HRESULT STDMETHODCALLTYPE NotifyParentWindowPositionChanged() = 0; + virtual HRESULT STDMETHODCALLTYPE Close() = 0; + virtual HRESULT STDMETHODCALLTYPE get_CoreWebView2(ICoreWebView2**) = 0; +}; + +STDAPI CreateCoreWebView2EnvironmentWithOptions(PCWSTR, PCWSTR, void*, ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler*); + +MIDL_INTERFACE("0702fc30-f43b-47bb-ab52-a42cb552ad9f") +ICoreWebView2HttpHeadersCollectionIterator : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetCurrentHeader(LPWSTR*, LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE get_HasCurrentHeader(BOOL*) = 0; + virtual HRESULT STDMETHODCALLTYPE MoveNext(BOOL*) = 0; +}; + +MIDL_INTERFACE("e86cac0e-5523-465c-b536-8fb9fc8c8c60") +ICoreWebView2HttpRequestHeaders : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE GetHeader(LPCWSTR, LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE GetHeaders(LPCWSTR, ICoreWebView2HttpHeadersCollectionIterator**) = 0; + virtual HRESULT STDMETHODCALLTYPE Contains(LPCWSTR, BOOL*) = 0; + virtual HRESULT STDMETHODCALLTYPE SetHeader(LPCWSTR, LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE RemoveHeader(LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE GetIterator(ICoreWebView2HttpHeadersCollectionIterator**) = 0; +}; + +MIDL_INTERFACE("03c5ff5a-9b45-4a88-881c-89a9f328619c") +ICoreWebView2HttpResponseHeaders : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE AppendHeader(LPCWSTR, LPCWSTR) = 0; + virtual HRESULT STDMETHODCALLTYPE Contains(LPCWSTR, BOOL*) = 0; + virtual HRESULT STDMETHODCALLTYPE GetHeader(LPCWSTR, LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE GetHeaders(LPCWSTR, ICoreWebView2HttpHeadersCollectionIterator**) = 0; + virtual HRESULT STDMETHODCALLTYPE GetIterator(ICoreWebView2HttpHeadersCollectionIterator**) = 0; +}; + +MIDL_INTERFACE("453e667f-12c7-49d4-be6d-ddbe7956f57a") +ICoreWebView2WebResourceRequestedEventArgs : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_Request(ICoreWebView2WebResourceRequest**) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Response(ICoreWebView2WebResourceResponse**) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Response(ICoreWebView2WebResourceResponse*) = 0; + virtual HRESULT STDMETHODCALLTYPE GetDeferral(ICoreWebView2Deferral**) = 0; + virtual HRESULT STDMETHODCALLTYPE get_ResourceContext(COREWEBVIEW2_WEB_RESOURCE_CONTEXT*) = 0; +}; + +MIDL_INTERFACE("ab00b74c-15f1-4646-80e8-e76341d25d71") +ICoreWebView2WebResourceRequestedEventHandler : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Invoke(ICoreWebView2*, ICoreWebView2WebResourceRequestedEventArgs*) = 0; +}; + +MIDL_INTERFACE("aafcc94f-fa27-48fd-97df-830ef75aaec9") +ICoreWebView2WebResourceResponse : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE get_Content(IStream**) = 0; + virtual HRESULT STDMETHODCALLTYPE put_Content(IStream*) = 0; + virtual HRESULT STDMETHODCALLTYPE get_Headers(ICoreWebView2HttpResponseHeaders**) = 0; + virtual HRESULT STDMETHODCALLTYPE get_StatusCode(int*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_StatusCode(int) = 0; + virtual HRESULT STDMETHODCALLTYPE get_ReasonPhrase(LPWSTR*) = 0; + virtual HRESULT STDMETHODCALLTYPE put_ReasonPhrase(LPCWSTR) = 0; +}; + +MIDL_INTERFACE("49511172-cc67-4bca-9923-137112f4c4cc") +ICoreWebView2ExecuteScriptCompletedHandler : public IUnknown +{ +public: + virtual HRESULT STDMETHODCALLTYPE Invoke (HRESULT, LPCWSTR) = 0; +}; + +} + +#endif // __webview2_h__ + +START_NAMESPACE_DISTRHO + +//============================================================================== +struct WebView::Pimpl +{ + Pimpl (WebView& v, const Options& opts) + : owner (v), options (opts) + { + CoInitialize (nullptr); + + webviewDLL = getWebview2LoaderDLL(); + + if (! webviewDLL) + return; + + hwnd = windowClass.createWindow (WS_POPUP, 400, 400, this); + + if (hwnd.hwnd == nullptr) + return; + + SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR) this); + + if (createEmbeddedWebView()) + { + resizeContentToFit(); + // coreWebViewController->MoveFocus (COREWEBVIEW2_MOVE_FOCUS_REASON_PROGRAMMATIC); + } + } + + ~Pimpl() + { + if (coreWebView != nullptr) + { + coreWebView->Release(); + coreWebView = nullptr; + } + + if (coreWebViewController != nullptr) + { + coreWebViewController->Release(); + coreWebViewController = nullptr; + } + + if (coreWebViewEnvironment != nullptr) + { + coreWebViewEnvironment->Release(); + coreWebViewEnvironment = nullptr; + } + + hwnd.reset(); + } + + bool loadedOK() const { return coreWebView != nullptr; } + void* getViewHandle() const { return (void*) hwnd.hwnd; } + + bool navigate (const std::string& url) + { + DISTRHO_SAFE_ASSERT_RETURN (coreWebView != nullptr, false); + return coreWebView->Navigate (createUTF16StringFromUTF8 (url).c_str()) == S_OK; + } + + bool addInitScript (const std::string& script) + { + DISTRHO_SAFE_ASSERT_RETURN (coreWebView != nullptr, false); + return coreWebView->AddScriptToExecuteOnDocumentCreated (createUTF16StringFromUTF8 (script).c_str(), nullptr) == S_OK; + } + + bool evaluateJavascript (const std::string& script) + { + DISTRHO_SAFE_ASSERT_RETURN (coreWebView != nullptr, false); + return coreWebView->ExecuteScript (createUTF16StringFromUTF8 (script).c_str(), nullptr) == S_OK; + } + +private: + WindowClass windowClass { L"CHOCWebView", (WNDPROC) wndProc }; + HWNDHolder hwnd; + + //============================================================================== + template + struct COMPtr + { + COMPtr (const COMPtr&) = delete; + COMPtr (COMPtr&&) = delete; + COMPtr (Type* o) : object (o) { if (object) object->AddRef(); } + ~COMPtr() { if (object) object->Release(); } + + Type* object = nullptr; + operator Type*() const { return object; } + }; + + static std::string getMessageFromHRESULT (HRESULT hr) + { + if (hr == S_OK) + return {}; + + wchar_t* buffer = nullptr; + auto length = FormatMessageW (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + nullptr, (DWORD) hr, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR) std::addressof (buffer), 0, nullptr); + + if (length > 0) + { + auto message = createUTF8FromUTF16 (std::wstring (buffer, length)); + LocalFree (buffer); + return message; + } + + return createHexString (hr); + } + + static Pimpl* getPimpl (HWND h) { return (Pimpl*) GetWindowLongPtr (h, GWLP_USERDATA); } + + static LRESULT wndProc (HWND h, UINT msg, WPARAM wp, LPARAM lp) + { + if (msg == WM_SIZE) + if (auto w = getPimpl (h)) + w->resizeContentToFit(); + + if (msg == WM_SHOWWINDOW) + if (auto w = getPimpl (h); w->coreWebViewController != nullptr) + w->coreWebViewController->put_IsVisible (wp != 0); + + return DefWindowProcW (h, msg, wp, lp); + } + + void resizeContentToFit() + { + if (coreWebViewController != nullptr) + { + RECT r; + GetWindowRect (hwnd, &r); + r.right -= r.left; r.bottom -= r.top; + r.left = r.top = 0; + coreWebViewController->put_Bounds (r); + } + } + + bool createEmbeddedWebView() + { + if (auto userDataFolder = getUserDataFolder(); ! userDataFolder.empty()) + { + COMPtr handler (new EventHandler (*this)); + webviewInitialising.test_and_set(); + + if (auto createCoreWebView2EnvironmentWithOptions = (decltype(&CreateCoreWebView2EnvironmentWithOptions)) + webviewDLL.findFunction ("CreateCoreWebView2EnvironmentWithOptions")) + { + if (createCoreWebView2EnvironmentWithOptions (nullptr, userDataFolder.c_str(), nullptr, handler) == S_OK) + { + MSG msg; + auto timeoutTimer = SetTimer ({}, {}, 6000, {}); + + while (webviewInitialising.test_and_set() && GetMessage (std::addressof (msg), nullptr, 0, 0)) + { + TranslateMessage (std::addressof (msg)); + DispatchMessage (std::addressof (msg)); + + if (msg.message == WM_TIMER && msg.hwnd == nullptr && msg.wParam == timeoutTimer) + break; + } + + KillTimer ({}, timeoutTimer); + + if (coreWebView == nullptr) + return false; + + EventRegistrationToken token; + coreWebView->add_WebResourceRequested (handler, std::addressof (token)); + + ICoreWebView2Settings* settings = nullptr; + + if (coreWebView->get_Settings (std::addressof (settings)) == S_OK + && settings != nullptr) + { + settings->put_AreDevToolsEnabled (options.enableDebugMode); + + if (! options.customUserAgent.empty()) + { + ICoreWebView2Settings2* settings2 = nullptr; + + // This palaver is needed because __uuidof doesn't work in MINGW + auto guid = IID { 0xee9a0f68, 0xf46c, 0x4e32, { 0xac, 0x23, 0xef, 0x8c, 0xac, 0x22, 0x4d, 0x2a } }; + + if (settings->QueryInterface (guid, (void**) std::addressof (settings2)) == S_OK + && settings2 != nullptr) + { + auto agent = createUTF16StringFromUTF8 (options.customUserAgent); + settings2->put_UserAgent (agent.c_str()); + } + } + } + + return true; + } + } + } + + return false; + } + + bool environmentCreated (ICoreWebView2Environment* env) + { + if (coreWebViewEnvironment != nullptr) + return false; + + env->AddRef(); + coreWebViewEnvironment = env; + return true; + } + + void webviewCreated (ICoreWebView2Controller* controller, ICoreWebView2* view) + { + if (controller != nullptr && view != nullptr) + { + controller->AddRef(); + view->AddRef(); + coreWebViewController = controller; + coreWebView = view; + } + + webviewInitialising.clear(); + } + + HRESULT onResourceRequested (ICoreWebView2WebResourceRequestedEventArgs* args) + { + struct ScopedExit + { + using Fn = std::function; + + explicit ScopedExit (Fn&& fn) : onExit (std::move (fn)) {} + + ScopedExit (const ScopedExit&) = delete; + ScopedExit (ScopedExit&&) = delete; + ScopedExit& operator= (const ScopedExit&) = delete; + ScopedExit& operator= (ScopedExit&&) = delete; + + ~ScopedExit() + { + if (onExit) + onExit(); + } + + Fn onExit; + }; + + auto makeCleanup = [](auto*& ptr, auto cleanup) { return [&ptr, cleanup] { if (ptr) cleanup (ptr); }; }; + auto makeCleanupIUnknown = [](auto*& ptr) { return [&ptr] { if (ptr) ptr->Release(); }; }; + + try + { + if (coreWebViewEnvironment == nullptr) + return E_FAIL; + + ICoreWebView2WebResourceRequest* request = {}; + ScopedExit cleanupRequest (makeCleanupIUnknown (request)); + + if (args->get_Request (std::addressof (request)) != S_OK) + return E_FAIL; + + LPWSTR uri = {}; + ScopedExit cleanupUri (makeCleanup (uri, CoTaskMemFree)); + + if (request->get_Uri (std::addressof (uri)) != S_OK) + return E_FAIL; + + ICoreWebView2WebResourceResponse* response = {}; + ScopedExit cleanupResponse (makeCleanupIUnknown (response)); + + if (coreWebViewEnvironment->CreateWebResourceResponse (nullptr, 404, L"Not Found", nullptr, std::addressof (response)) != S_OK) + return E_FAIL; + + if (args->put_Response (response) != S_OK) + return E_FAIL; + } + catch (...) + { + return E_FAIL; + } + + return S_OK; + } + + //============================================================================== + struct EventHandler : public ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler, + public ICoreWebView2CreateCoreWebView2ControllerCompletedHandler, + public ICoreWebView2WebMessageReceivedEventHandler, + public ICoreWebView2PermissionRequestedEventHandler, + public ICoreWebView2WebResourceRequestedEventHandler + { + EventHandler (Pimpl& p) : ownerPimpl (p) {} + EventHandler (const EventHandler&) = delete; + EventHandler (EventHandler&&) = delete; + EventHandler& operator= (const EventHandler&) = delete; + EventHandler& operator= (EventHandler&&) = delete; + virtual ~EventHandler() {} + + HRESULT STDMETHODCALLTYPE QueryInterface (REFIID, LPVOID*) override { return E_NOINTERFACE; } + ULONG STDMETHODCALLTYPE AddRef() override { return ++refCount; } + ULONG STDMETHODCALLTYPE Release() override { auto newCount = --refCount; if (newCount == 0) delete this; return newCount; } + + HRESULT STDMETHODCALLTYPE Invoke (HRESULT, ICoreWebView2Environment* env) override + { + if (env == nullptr) + return E_FAIL; + + if (! ownerPimpl.environmentCreated (env)) + return E_FAIL; + + env->CreateCoreWebView2Controller (ownerPimpl.hwnd, this); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE Invoke (HRESULT, ICoreWebView2Controller* controller) override + { + if (controller == nullptr) + return E_FAIL; + + ICoreWebView2* view = {}; + controller->get_CoreWebView2 (std::addressof (view)); + + if (view == nullptr) + return E_FAIL; + + EventRegistrationToken token; + view->add_WebMessageReceived (this, std::addressof (token)); + view->add_PermissionRequested (this, std::addressof (token)); + ownerPimpl.webviewCreated (controller, view); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE Invoke (ICoreWebView2* sender, ICoreWebView2WebMessageReceivedEventArgs* args) override + { + if (sender == nullptr) + return E_FAIL; + + LPWSTR message = {}; + args->TryGetWebMessageAsString (std::addressof (message)); + ownerPimpl.owner.invokeBinding (createUTF8FromUTF16 (message)); + sender->PostWebMessageAsString (message); + CoTaskMemFree (message); + return S_OK; + } + + HRESULT STDMETHODCALLTYPE Invoke (ICoreWebView2*, ICoreWebView2PermissionRequestedEventArgs* args) override + { + COREWEBVIEW2_PERMISSION_KIND permissionKind; + args->get_PermissionKind (std::addressof (permissionKind)); + + if (permissionKind == COREWEBVIEW2_PERMISSION_KIND_CLIPBOARD_READ) + args->put_State (COREWEBVIEW2_PERMISSION_STATE_ALLOW); + + return S_OK; + } + + HRESULT STDMETHODCALLTYPE Invoke (ICoreWebView2*, ICoreWebView2WebResourceRequestedEventArgs* args) override + { + return ownerPimpl.onResourceRequested (args); + } + + Pimpl& ownerPimpl; + std::atomic refCount { 0 }; + }; + + //============================================================================== + WebView& owner; + MemoryDLL webviewDLL; + Options options; + ICoreWebView2Environment* coreWebViewEnvironment = nullptr; + ICoreWebView2* coreWebView = nullptr; + ICoreWebView2Controller* coreWebViewController = nullptr; + std::atomic_flag webviewInitialising = ATOMIC_FLAG_INIT; + + //============================================================================== + static std::wstring getUserDataFolder() + { + wchar_t currentExePath[MAX_PATH] = {}; + wchar_t dataPath[MAX_PATH] = {}; + + GetModuleFileNameW (nullptr, currentExePath, MAX_PATH); + auto currentExeName = std::wstring (currentExePath); + auto lastSlash = currentExeName.find_last_of (L'\\'); + + if (lastSlash != std::wstring::npos) + currentExeName = currentExeName.substr (lastSlash + 1); + + if (SHGetFolderPathW (nullptr, CSIDL_APPDATA, nullptr, 0, dataPath) == S_OK) + { + auto path = std::wstring (dataPath); + + if (! path.empty() && path.back() != L'\\') + path += L"\\"; + + return path + currentExeName; + } + + return {}; + } +}; + +//============================================================================== +inline WebView::WebView() : WebView (Options()) {} + +inline WebView::WebView (const Options& options) +{ + pimpl = std::make_unique (*this, options); + + if (! pimpl->loadedOK()) + pimpl.reset(); +} + +inline WebView::~WebView() +{ + pimpl.reset(); +} + +inline bool WebView::loadedOK() const { return pimpl != nullptr; } +inline bool WebView::navigate (const std::string& url) { return pimpl != nullptr && pimpl->navigate (url); } +inline bool WebView::addInitScript (const std::string& script) { return pimpl != nullptr && pimpl->addInitScript (script); } + +inline bool WebView::evaluateJavascript (const std::string& script) +{ + return pimpl != nullptr && pimpl->evaluateJavascript (script); +} + +inline void* WebView::getViewHandle() const { return pimpl != nullptr ? pimpl->getViewHandle() : nullptr; } + +inline bool WebView::bind (CallbackFn&& fn) +{ + if (pimpl == nullptr) + return false; + + binding = std::move (fn); + return true; +} + +inline void WebView::invokeBinding (const std::string& msg) +{ + binding(msg); +} + +END_NAMESPACE_DISTRHO + +//============================================================================== +//============================================================================== +/* + The data monstrosity that follows is a binary dump of the redistributable + WebView2Loader.dll files from Microsoft, embedded here to avoid you + needing to install the DLLs alongside your app. + + More details on how the microsoft webview2 packages work can be found at: + https://docs.microsoft.com/en-us/microsoft-edge/webview2/concepts/distribution + + The copyright notice that goes with the redistributable files is + printed below, and you should note that if you embed this code in your + own app, you'll need to comply with this license! + + | + | Copyright (C) Microsoft Corporation. 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. + | * The name of Microsoft Corporation, or the names of its contributors + | may not 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. + | + +*/ + +#if CHOC_WINDOWS + +#ifdef CHOC_REGISTER_OPEN_SOURCE_LICENCE + CHOC_REGISTER_OPEN_SOURCE_LICENCE (WebView2Loader, R"( +============================================================================== +Microsoft WebView2Loader.dll redistributable file license: + +Copyright (C) Microsoft Corporation. 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. +* The name of Microsoft Corporation, or the names of its contributors +may not 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. +)") +#endif + +inline DISTRHO_NAMESPACE::MemoryDLL DISTRHO_NAMESPACE::getWebview2LoaderDLL() +{ + // This is version 1.0.2365.46 + + #ifdef _M_ARM64 + static constexpr unsigned char dllData[138216] = { + 77,90,120,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,14,31,186,14,0,180,9,205,33,184,1,76,205,33,84,104,105,115,32,112,114,111,103,114,97,109,32,99,97,110,110, + 111,116,32,98,101,32,114,117,110,32,105,110,32,68,79,83,32,109,111,100,101,46,36,0,0,80,69,0,0,100,170,7,0,88,207,211,101,0,0,0,0,0,0,0,0,240,0,34,32,11,2,14,0,0,52,1,0,0,188,0,0,0,0,0,0,192,89,0,0,0,16,0,0,0,0,0,128,1,0,0,0,0,16,0,0,0,2,0,0, + 10,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,80,2,0,0,4,0,0,63,223,2,0,3,0,96,65,0,0,16,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,16,0,0,0,193,198,1,0,48,1,0,0,241,199,1,0,40,0,0,0,0,48,2,0,136,5,0,0,0,16,2,0,208,11,0,0,0,244, + 1,0,232,39,0,0,0,64,2,0,136,6,0,0,12,191,1,0,56,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,187,1,0,40,0,0,0,32,81,1,0,64,1,0,0,0,0,0,0,0,0,0,0,136,202,1,0,104,2,0,0,56,197,1,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,116,101,120,116,0,0,0, + 16,50,1,0,0,16,0,0,0,52,1,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,96,46,114,100,97,116,97,0,0,220,147,0,0,0,80,1,0,0,148,0,0,0,56,1,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,64,46,100,97,116,97,0,0,0,12,28,0,0,0,240,1,0,0,12,0,0,0,204,1,0,0,0,0,0,0, + 0,0,0,0,0,0,0,64,0,0,192,46,112,100,97,116,97,0,0,208,11,0,0,0,16,2,0,0,12,0,0,0,216,1,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,64,46,116,108,115,0,0,0,0,9,0,0,0,0,32,2,0,0,2,0,0,0,228,1,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,192,46,114,115,114,99,0,0,0,136, + 5,0,0,0,48,2,0,0,6,0,0,0,230,1,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,64,46,114,101,108,111,99,0,0,136,6,0,0,0,64,2,0,0,8,0,0,0,236,1,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,1,31,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4,64,120,66,5,0,52,229,3,0,170,64,4,0,55,161,12,64,242,96,1,0,84,162,44,64,146,95,192,63,241,204,2,0,84,160,116,64,76,1,168,113,110,34,0,38,30,34,1,0,52,165,64,0,145,165,236,124,146,31,32,3,213, + 160,116,223,76,1,168,113,110,34,0,38,30,162,255,255,53,165,64,0,209,1,3,0,156,0,152,96,78,0,28,33,78,0,168,112,110,2,0,38,30,66,8,0,82,160,0,0,203,64,4,128,139,192,3,95,214,33,64,0,209,225,7,129,203,162,36,64,120,194,0,0,52,33,4,0,241,172,255, + 255,84,236,255,255,23,162,36,64,120,226,255,255,53,165,8,0,209,160,0,0,203,0,252,65,147,192,3,95,214,0,0,128,210,192,3,95,214,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,3,0,170,96,4,0,55,63,32,0,241,35,4,0,84,163,12,64,242,192,1,0,84,162,44,64,146,95,192,63,241,140,4,0,84,99,64,0,209,227,3,3,203,160,116,64,76,1,168,113,110,34,0,38,30,130,5,0,52,33,4,131,203,165,0,3,139, + 63,32,0,241,67,2,0,84,35,252,67,147,160,116,223,76,1,168,113,110,34,0,38,30,66,4,0,52,99,4,0,241,97,255,255,84,33,8,64,242,192,1,0,84,33,32,0,209,225,3,1,203,165,4,1,203,160,116,223,76,1,168,113,110,34,0,38,30,226,2,0,52,6,0,0,20,161,0,0,180, + 162,36,64,120,226,1,0,52,33,4,0,241,168,255,255,84,160,0,0,203,0,252,65,147,192,3,95,214,99,64,0,209,227,7,131,203,162,36,64,120,194,0,0,52,33,4,0,241,160,0,0,84,99,4,0,241,108,255,255,84,221,255,255,23,165,8,0,209,160,0,0,203,0,252,65,147,192, + 3,95,214,165,64,0,209,33,1,0,156,0,152,96,78,0,28,33,78,0,168,112,110,2,0,38,30,66,8,0,82,160,0,0,203,64,4,128,139,192,3,95,214,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,0,0,0,0,255,131,0,209,3,164,128,210,99,50,163,242,227,3,0,169,225,11,1,169,255,131, + 0,145,192,3,95,214,192,3,95,214,243,83,186,169,245,91,1,169,247,99,2,169,249,107,3,169,251,115,4,169,253,123,5,169,253,67,1,145,115,80,64,169,117,88,65,169,119,96,66,169,121,104,67,169,123,112,68,169,97,40,64,249,64,0,63,214,253,123,69,169,251, + 115,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,198,168,192,3,95,214,243,83,186,169,245,91,1,169,247,99,2,169,249,107,3,169,251,115,4,169,253,123,5,169,253,67,1,145,115,80,64,169,117,88,65,169,119,96,66,169,121,104,67,169,123,112, + 68,169,97,40,64,249,64,0,63,214,253,123,69,169,251,115,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,198,168,192,3,95,214,0,0,0,0,0,0,0,0,255,67,0,209,241,0,0,208,49,10,64,249,241,99,49,203,241,7,0,249,192,3,95,214,0,0,0,0,0,0,0,0, + 241,0,0,208,240,7,64,249,49,10,64,249,240,99,48,203,31,2,17,235,129,0,0,84,255,67,0,145,192,3,95,214,31,32,3,213,224,3,16,170,2,0,0,20,0,0,0,0,253,123,1,169,253,67,0,145,106,1,0,148,253,123,65,169,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,203, + 127,0,2,235,195,10,0,84,195,1,0,180,33,0,128,249,95,32,0,241,227,3,0,170,34,2,0,84,98,0,16,54,32,32,255,13,96,32,191,13,98,0,8,54,32,0,255,13,96,0,191,13,98,0,0,54,34,0,64,57,98,0,0,57,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,66,128,0,241,3,5,0,84,66,128,0,241,99,4,0,84,33,32,128,249,66,0,1,241,195,3,0,84,63,12,64,242,97,0,0,84,127,12,64,242,96,1,0,84,32,32,223,76,36,32,223,76,33,64,128,249,33,96,128,249,96,32,159,76,100,32,159,76,66,0,2,241,34,255,255,84,98, + 2,48,54,16,0,0,20,32,4,64,173,34,12,65,173,36,20,66,173,38,28,67,173,33,0,2,145,33,64,128,249,33,96,128,249,96,4,0,173,98,12,1,173,100,20,2,173,102,28,3,173,99,0,2,145,66,0,2,241,98,254,255,84,98,0,48,54,32,32,223,76,96,32,159,76,98,0,40,54, + 32,160,223,76,96,160,159,76,98,0,32,54,32,112,223,76,96,112,159,76,98,0,24,54,32,112,223,12,96,112,159,12,98,0,16,54,32,32,255,13,96,32,191,13,98,0,8,54,32,0,255,13,96,0,191,13,98,0,0,54,34,0,64,57,98,0,0,57,192,3,95,214,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,2,139,33,240,159,248,95,32,0,241,3,0,2,139,130,2,0,84,162,0,16,54,33,16,0,209,99,16,0,209,32,32,96,13,96,32,32,13,162,0,8,54,33,8,0,209,99,8,0,209,32,0,96,13,96,0,32,13,98,0,0,54,34,252,95,56,98,252,31, + 56,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,128,0,241,227,5,0,84,66,128,0,241,3,5,0,84,33,240,155,248,66,0,1,241,3,4,0,84,63,12,64,242,97,0,0,84,127,12,64,242,192,1,0,84,33,0,1,209,32,32,64,76,33,0,1,209,36,32,64,76,33,240,151, + 248,33,240,147,248,99,0,1,209,96,32,0,76,99,0,1,209,100,32,0,76,66,0,2,241,162,254,255,84,15,0,0,20,33,0,2,209,38,28,67,173,36,20,66,173,99,0,2,209,34,12,65,173,32,4,64,173,33,240,151,248,33,240,147,248,102,28,3,173,100,20,2,173,98,12,1,173, + 96,4,0,173,66,0,2,241,98,254,255,84,162,0,48,54,33,0,1,209,99,0,1,209,32,32,64,76,96,32,0,76,162,0,40,54,33,128,0,209,99,128,0,209,32,160,64,76,96,160,0,76,162,0,32,54,33,64,0,209,99,64,0,209,32,112,64,76,96,112,0,76,162,0,24,54,33,32,0,209, + 99,32,0,209,32,112,64,12,96,112,0,12,162,0,16,54,33,16,0,209,99,16,0,209,32,32,96,13,96,32,32,13,162,0,8,54,33,8,0,209,99,8,0,209,32,0,96,13,96,0,32,13,98,0,0,54,34,252,95,56,98,252,31,56,192,3,95,214,33,0,128,82,59,0,0,20,0,0,0,0,0,0,0,0,16, + 0,176,210,241,0,0,208,48,114,5,185,16,0,128,210,80,66,56,213,16,14,66,211,16,1,0,180,16,6,56,213,16,94,84,211,31,10,0,241,240,55,159,154,16,2,97,178,48,114,5,185,224,1,31,214,208,255,175,210,16,90,74,57,251,255,255,23,0,0,0,0,0,0,0,0,0,0,0,0, + 240,0,0,208,16,114,69,185,112,0,0,54,0,48,225,184,192,3,95,214,240,0,0,180,2,252,95,136,67,0,1,42,3,252,16,136,176,255,255,53,224,3,2,42,192,3,95,214,143,254,255,16,223,255,255,23,0,0,0,0,0,0,0,0,240,0,0,208,16,114,69,185,112,0,0,54,0,128,225, + 184,192,3,95,214,208,0,0,180,2,252,95,136,1,252,16,136,208,255,255,53,224,3,2,42,192,3,95,214,175,254,255,16,208,255,255,23,0,0,0,0,0,0,0,0,0,0,0,0,1,0,128,18,3,0,0,20,0,0,0,0,0,0,0,0,240,0,0,208,16,114,69,185,144,0,0,54,0,0,225,184,0,0,1,11, + 192,3,95,214,240,0,0,180,2,252,95,136,67,0,1,11,3,252,16,136,176,255,255,53,224,3,3,42,192,3,95,214,111,254,255,16,186,255,255,23,0,0,0,0,225,3,33,42,240,0,0,208,16,114,69,185,112,0,0,54,0,16,225,184,192,3,95,214,240,0,0,180,2,252,95,136,67, + 0,33,10,3,252,16,136,176,255,255,53,224,3,2,42,192,3,95,214,143,254,255,16,170,255,255,23,0,0,0,0,16,0,64,185,177,3,128,210,17,0,184,242,31,2,17,107,129,1,0,84,80,132,64,249,17,2,64,185,49,106,27,18,15,72,136,82,15,167,186,114,255,1,17,107,161, + 0,0,84,16,18,0,145,80,132,0,249,0,0,128,82,192,3,95,214,32,0,128,82,192,3,95,214,0,0,0,0,0,0,0,0,240,0,0,208,16,114,69,185,112,0,0,54,0,128,225,248,192,3,95,214,208,0,0,180,2,252,95,200,1,252,16,200,208,255,255,53,224,3,2,170,192,3,95,214,175, + 254,255,16,136,255,255,23,0,0,0,0,0,0,0,0,0,0,0,0,255,195,1,209,253,123,1,169,243,83,2,169,245,91,3,169,247,99,4,169,249,107,5,169,251,115,6,169,33,0,64,249,225,3,0,249,243,3,0,170,244,3,1,170,245,3,2,170,246,3,3,170,226,3,3,170,106,254,255, + 151,224,3,19,170,225,3,20,170,226,3,21,170,227,3,22,170,83,80,64,169,85,88,65,169,87,96,66,169,89,104,67,169,91,112,68,169,93,40,64,249,0,0,63,214,243,3,0,170,100,254,255,151,224,3,19,170,225,15,64,249,66,0,128,210,89,254,255,151,224,3,19,170, + 251,115,70,169,249,107,69,169,247,99,68,169,245,91,67,169,243,83,66,169,253,123,65,169,255,195,1,145,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,208,16,66,0,145,16,2,64,249,31,0,16,235,65,0,0,84,192,3,95,214,253,123,190,169,253,3,0,145,240, + 0,0,208,16,66,0,145,241,0,0,208,49,34,0,145,16,2,64,249,49,2,64,249,240,71,1,169,165,68,0,148,0,0,62,212,0,0,0,0,0,0,0,0,0,0,0,0,234,3,0,170,32,12,1,78,1,28,160,78,2,28,160,78,3,28,160,78,95,128,0,241,172,6,0,84,1,0,102,158,136,0,0,16,9,105, + 98,56,8,9,9,139,0,1,31,214,42,22,18,28,25,21,17,13,36,33,30,27,24,20,16,12,41,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,113,159,12,64,33,191,13,64,33,0,13,192,3,95,214,64,113,159,12,64,33,191,13,64,1,32, + 13,192,3,95,214,64,113,159,12,64,33,191,13,65,1,0,57,192,3,95,214,64,113,159,12,64,33,32,13,192,3,95,214,64,113,159,12,64,33,0,13,192,3,95,214,64,113,159,12,64,1,32,13,192,3,95,214,64,113,159,12,65,1,0,57,192,3,95,214,64,113,0,12,192,3,95,214, + 72,64,0,209,8,1,10,139,0,113,0,76,64,113,0,76,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,192,128,82,95,0,8,235,234,1,0,84,73,252,69,147,41,5,0,241,64,161,159,76,204,255,255,84,66,16,64,146,130,248,255,181,192,3,95,214,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,13,64,242,160,0,0,84,8,65,0,209,232,3,8,203,66,0,8,203,64,113,136,76,73,252,70,147,31,32,3,213,31,32,3,213,31,32,3,213,31,32,3,213,31,32,3,213,41,5,0,241,64,33,159,76,204,255,255,84,66,20,64,146,66,251, + 255,180,95,128,0,241,43,245,255,84,64,161,159,76,66,128,0,241,193,244,255,84,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,1,170,127,12,64,242,193,30,0,84,95,64,0,241,140,24,0,84,67,32,0,16,104,104,98,56,99,8,8,203,96,0,31,214,0,0, + 0,0,0,0,0,0,0,0,0,0,3,40,193,168,40,36,193,168,31,1,3,235,1,28,0,84,74,13,192,218,41,13,192,218,64,1,9,235,224,7,159,26,0,36,128,90,192,3,95,214,3,132,64,248,40,132,64,248,31,1,3,235,224,0,0,84,99,12,192,218,8,13,192,218,96,0,8,235,224,7,159, + 26,0,36,128,90,192,3,95,214,3,68,64,184,40,68,64,184,31,1,3,235,224,0,0,84,99,8,192,218,8,9,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,20,64,56,40,20,64,56,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,132,64,248,40,132, + 64,248,31,1,3,235,224,0,0,84,99,12,192,218,8,13,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,68,64,184,40,68,64,184,31,1,3,235,224,0,0,84,99,8,192,218,8,9,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,36,64,120,40, + 36,64,120,127,0,8,235,224,0,0,84,99,4,192,218,8,5,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,20,64,56,40,20,64,56,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,132,64,248,40,132,64,248,31,1,3,235,224,0,0,84,99,12,192,218, + 8,13,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,68,64,184,40,68,64,184,31,1,3,235,224,0,0,84,99,8,192,218,8,9,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,36,64,120,40,36,64,120,99,4,192,218,8,5,192,218,96,0,8,235, + 224,7,159,26,0,36,128,90,192,3,95,214,0,0,128,210,192,3,95,214,3,132,64,248,40,132,64,248,31,1,3,235,224,0,0,84,99,12,192,218,8,13,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,68,64,184,40,68,64,184,99,8,192,218,8,9,192,218,96, + 0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,132,64,248,40,132,64,248,99,12,192,218,8,13,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,132,64,248,40,132,64,248,31,1,3,235,224,0,0,84,99,12,192,218,8,13,192,218,96,0,8,235,224,7, + 159,26,0,36,128,90,192,3,95,214,3,20,64,56,40,20,64,56,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,132,64,248,40,132,64,248,31,1,3,235,224,0,0,84,99,12,192,218,8,13,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,36,64,120, + 40,36,64,120,99,4,192,218,8,5,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,132,64,248,40,132,64,248,31,1,3,235,224,0,0,84,99,12,192,218,8,13,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,36,64,120,40,36,64,120,127, + 0,8,235,224,0,0,84,99,4,192,218,8,5,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,3,20,64,56,40,20,64,56,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,95,128,0,241,43,2,0,84,66,128,0,209,3,40,193,168,40,36,193,168,31,1,3,235,33, + 4,0,84,95,1,9,235,33,3,0,84,3,40,193,168,40,36,193,168,31,1,3,235,97,3,0,84,95,1,9,235,97,2,0,84,66,128,0,241,106,254,255,84,66,128,0,145,95,64,0,241,77,229,255,84,66,32,0,209,3,132,64,248,40,132,64,248,31,1,3,235,225,1,0,84,66,32,0,241,108, + 255,255,84,32,244,255,84,66,32,0,145,67,4,0,16,104,104,98,56,99,8,8,203,96,0,31,214,74,13,192,218,41,13,192,218,64,1,9,235,224,7,159,26,0,36,128,90,192,3,95,214,99,12,192,218,8,13,192,218,96,0,8,235,224,7,159,26,0,36,128,90,192,3,95,214,0,0, + 0,0,0,0,0,0,0,0,0,0,98,0,0,181,0,0,128,210,192,3,95,214,66,4,0,209,3,20,64,56,40,20,64,56,127,0,8,107,129,0,0,84,98,255,255,181,0,0,128,210,192,3,95,214,96,0,8,107,224,7,159,26,0,36,128,90,192,3,95,214,151,221,159,195,139,231,169,205,131,123, + 107,89,149,241,179,215,251,0,0,0,81,10,64,249,240,115,47,235,240,51,144,154,31,2,17,235,67,0,0,84,192,3,95,214,16,206,116,146,49,6,64,209,63,2,64,249,63,2,16,235,161,255,255,84,192,3,95,214,243,15,30,248,253,251,0,169,253,35,0,145,255,131,0, + 209,232,0,0,208,227,3,0,170,8,9,64,249,168,3,31,248,104,12,66,248,105,128,94,248,42,37,127,169,234,167,0,169,72,3,0,181,1,136,2,169,232,0,0,208,243,3,0,170,8,105,69,249,1,0,0,176,33,224,0,145,224,35,0,145,226,3,19,170,0,1,63,214,96,2,0,53,98, + 6,64,249,232,0,0,208,96,18,64,249,65,0,128,82,67,0,64,121,8,109,69,249,0,1,63,214,243,3,31,42,160,3,95,248,76,254,255,151,224,3,19,42,255,131,0,145,253,251,64,169,243,7,66,248,192,3,95,214,160,0,128,82,96,0,62,212,32,0,32,212,232,0,176,82,31, + 4,0,113,8,60,0,51,19,176,136,26,242,255,255,23,253,123,191,169,253,3,0,145,70,1,0,180,63,4,0,113,65,1,0,84,72,28,0,114,9,32,128,82,195,16,1,169,40,5,136,26,200,0,0,185,199,20,64,249,199,0,0,181,253,123,193,168,192,3,95,214,129,255,255,53,223, + 0,0,185,250,255,255,23,200,0,0,208,198,24,64,249,239,3,7,170,8,81,66,249,0,1,63,214,253,123,193,168,224,0,31,214,243,15,30,248,253,251,0,169,253,35,0,145,255,131,0,209,232,0,0,176,41,44,0,145,8,9,64,249,168,3,31,248,40,0,64,57,42,48,64,248,11, + 4,64,249,8,29,8,83,234,11,0,249,42,16,64,120,171,0,0,249,11,4,64,249,232,43,1,41,234,243,1,50,104,1,64,121,169,8,0,249,73,0,128,82,203,0,0,176,107,33,57,145,168,36,1,41,41,0,128,82,40,176,64,120,225,35,0,145,168,36,3,41,200,0,0,176,8,33,60,145, + 8,1,11,75,234,7,0,185,232,7,0,185,232,0,0,176,0,16,64,249,8,117,69,249,0,1,63,214,243,3,0,42,160,3,95,248,255,253,255,151,224,3,19,42,255,131,0,145,253,251,64,169,243,7,66,248,192,3,95,214,192,3,95,214,243,83,189,169,245,11,0,249,253,251,1,169, + 253,99,0,145,255,195,0,209,232,0,0,176,201,0,0,144,41,193,58,145,8,9,64,249,243,3,2,170,168,3,30,248,200,0,0,144,8,1,60,145,233,35,0,169,200,0,0,144,8,65,61,145,201,0,0,144,41,129,62,145,232,39,1,169,200,0,0,144,8,193,63,145,232,19,0,249,129, + 1,0,54,160,3,94,248,212,0,0,176,148,2,1,145,222,253,255,151,224,3,19,170,225,3,20,170,255,195,0,145,253,251,65,169,245,11,64,249,243,83,195,168,89,10,0,20,232,3,0,145,20,217,96,248,224,3,20,170,151,251,255,151,245,3,0,170,1,168,0,145,224,3,19, + 170,38,10,0,148,193,0,0,176,33,128,3,145,224,3,19,170,66,5,128,82,92,10,0,148,160,3,94,248,200,253,255,151,224,3,19,170,225,3,20,170,226,3,21,170,255,195,0,145,253,251,65,169,245,11,64,249,243,83,195,168,147,10,0,20,243,83,190,169,253,123,1, + 169,253,67,0,145,193,0,0,176,33,240,5,145,243,3,0,170,124,10,0,148,193,0,0,144,33,64,57,145,224,3,19,170,120,10,0,148,224,3,19,170,207,10,0,148,200,0,0,208,8,181,69,249,0,1,63,214,31,4,0,49,32,4,0,84,224,3,19,170,200,10,0,148,200,0,0,208,33, + 4,128,82,226,0,128,82,8,77,69,249,1,2,160,114,227,3,31,170,100,0,128,82,5,16,128,82,230,3,31,170,243,3,0,170,0,1,63,214,31,4,0,177,192,0,0,84,200,0,0,208,8,73,69,249,0,1,63,214,32,0,128,82,14,0,0,20,212,0,0,208,192,0,0,176,0,96,12,145,148,42, + 70,249,128,2,63,214,200,0,0,208,224,3,19,170,8,45,70,249,0,1,63,214,192,0,0,176,0,160,7,145,128,2,63,214,224,3,31,42,253,123,65,169,243,83,194,168,192,3,95,214,243,83,188,169,245,91,1,169,247,19,0,249,253,251,2,169,253,163,0,145,243,3,1,170, + 244,3,0,170,224,3,1,170,129,32,128,82,215,9,0,148,224,3,19,170,127,10,0,148,245,3,0,170,224,3,19,170,151,10,0,148,215,0,0,208,225,3,0,170,224,3,20,170,247,194,69,249,226,3,21,42,224,2,63,214,245,3,0,42,224,3,19,170,115,10,0,148,214,0,0,208,31, + 64,53,235,214,190,69,249,33,2,0,84,192,2,63,214,31,232,1,113,193,1,0,84,224,3,19,170,1,0,130,82,191,9,0,148,224,3,19,170,103,10,0,148,245,3,0,170,224,3,19,170,127,10,0,148,225,3,0,170,224,3,20,170,226,3,21,42,224,2,63,214,245,3,0,42,85,1,0,52, + 224,3,19,170,92,10,0,148,31,64,53,235,201,0,0,84,225,3,21,42,224,3,19,170,15,10,0,148,224,3,31,42,6,0,0,20,192,2,63,214,232,0,176,82,31,4,0,113,8,60,0,51,0,176,136,26,253,251,66,169,247,19,64,249,245,91,65,169,243,83,196,168,192,3,95,214,243, + 83,189,169,245,11,0,249,253,251,1,169,253,99,0,145,255,131,0,209,232,0,0,176,243,3,1,170,244,3,0,170,8,9,64,249,224,3,1,170,129,32,128,82,232,15,0,249,148,9,0,148,224,3,19,170,225,3,20,170,188,9,0,148,224,3,19,170,84,10,0,148,245,3,0,170,224, + 3,19,170,56,10,0,148,31,12,0,241,67,2,0,84,168,6,64,121,31,233,0,113,65,1,0,84,168,10,64,121,31,113,1,113,129,1,0,84,168,2,64,121,8,121,26,18,8,5,1,81,31,105,0,113,226,0,0,84,46,0,0,20,31,113,1,113,129,0,0,84,168,2,64,121,31,113,1,113,32,5,0, + 84,232,243,1,178,224,3,0,145,232,163,0,169,232,3,0,249,87,9,0,148,225,3,0,145,224,3,31,170,145,255,255,151,0,7,248,55,224,3,0,145,26,10,0,148,245,3,0,170,224,3,0,145,48,10,0,148,225,3,0,170,224,3,19,170,226,3,21,170,162,9,0,148,224,3,0,145,42, + 10,0,148,129,11,128,82,180,20,0,148,160,4,0,180,245,3,0,170,224,3,0,145,36,10,0,148,168,2,0,203,224,3,0,145,8,9,0,145,21,253,65,147,31,10,0,148,225,3,0,170,224,3,19,170,226,3,21,170,145,9,0,148,224,3,19,170,225,3,20,170,191,9,0,148,224,3,0,145, + 55,9,0,148,224,3,19,170,57,255,255,151,128,2,0,55,212,0,0,208,192,0,0,176,0,192,6,145,148,42,70,249,128,2,63,214,224,3,19,170,12,10,0,148,200,0,0,208,8,45,70,249,0,1,63,214,192,0,0,176,0,160,7,145,128,2,63,214,85,0,128,82,245,0,176,114,14,0, + 0,20,181,0,136,82,21,0,176,114,9,0,0,20,245,3,31,42,9,0,0,20,200,0,0,208,245,3,0,42,192,0,0,176,0,0,6,145,8,41,70,249,0,1,63,214,224,3,0,145,23,9,0,148,224,15,64,249,216,252,255,151,224,3,21,42,255,131,0,145,253,251,65,169,245,11,64,249,243, + 83,195,168,192,3,95,214,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,253,123,4,169,253,3,1,145,255,3,1,209,232,0,0,176,245,3,0,170,192,0,0,176,0,192,7,145,8,9,64,249,243,3,1,170,249,0,176,82,232,31,0,249,91,0,0,148,248,3,0,170,192, + 0,0,176,0,32,8,145,87,0,0,148,246,3,0,170,192,0,0,176,0,128,8,145,83,0,0,148,72,6,128,82,55,3,8,42,24,4,0,180,246,3,0,180,244,3,0,170,160,3,0,180,218,0,0,208,239,3,24,170,255,55,0,185,72,83,66,249,0,1,63,214,225,211,0,145,224,3,21,170,0,3,63, + 214,192,3,0,52,247,3,0,42,232,243,1,178,224,99,0,145,232,35,2,169,232,15,0,249,223,8,0,148,225,3,23,42,224,99,0,145,160,9,0,148,128,3,0,55,200,0,0,208,8,189,69,249,0,1,63,214,8,60,0,18,31,4,0,113,8,1,25,42,23,176,136,26,224,99,0,145,213,8,0, + 148,224,31,64,249,150,252,255,151,224,3,23,42,255,3,1,145,253,123,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,192,3,95,214,200,0,0,208,8,189,69,249,0,1,63,214,8,60,0,18,31,4,0,113,8,1,25,42,23,176,136,26,239,255,255,23,224, + 99,0,145,160,9,0,148,72,83,66,249,225,55,64,185,239,3,22,170,227,3,0,170,0,1,63,214,224,3,21,170,226,3,23,42,192,2,63,214,96,251,255,52,224,99,0,145,255,11,0,249,255,15,0,185,147,9,0,148,72,83,66,249,239,3,20,170,0,1,63,214,193,0,0,176,33,192, + 8,145,226,67,0,145,227,51,0,145,128,2,63,214,192,249,255,52,225,11,64,249,129,249,255,180,224,3,19,170,236,8,0,148,247,3,31,42,207,255,255,23,243,15,30,248,253,251,0,169,253,35,0,145,232,0,0,176,73,46,64,249,225,3,0,170,8,65,75,185,243,0,0,208, + 40,121,104,248,233,0,0,208,41,169,75,185,8,1,64,145,8,5,64,185,63,1,8,107,108,1,0,84,96,210,69,249,192,0,0,180,194,0,0,208,66,208,69,249,253,251,64,169,243,7,66,248,64,0,31,214,253,251,64,169,243,7,66,248,192,3,95,214,243,0,0,208,115,162,46, + 145,161,11,0,249,224,3,19,170,108,10,0,148,104,2,64,185,161,11,64,249,243,0,0,208,31,5,0,49,161,253,255,84,211,0,0,208,192,0,0,176,0,0,13,145,115,30,70,249,225,3,31,170,2,0,129,82,96,2,63,214,192,0,0,181,192,0,0,176,0,32,14,145,225,3,31,170, + 2,0,129,82,96,2,63,214,243,0,0,208,96,210,5,249,224,0,0,208,0,160,46,145,137,10,0,148,161,11,64,249,217,255,255,23,243,83,190,169,253,123,1,169,253,67,0,145,255,131,0,209,232,0,0,176,212,0,0,208,8,9,64,249,232,15,0,249,255,11,0,249,96,1,0,180, + 8,0,64,249,137,82,66,249,8,1,64,249,239,3,8,170,32,1,63,214,193,0,0,176,33,0,10,145,226,67,0,145,0,1,63,214,64,2,0,52,243,3,31,42,224,11,64,249,0,1,0,180,255,11,0,249,137,82,66,249,8,0,64,249,8,9,64,249,239,3,8,170,32,1,63,214,0,1,63,214,224, + 15,64,249,17,252,255,151,224,3,19,42,255,131,0,145,253,123,65,169,243,83,194,168,192,3,95,214,224,11,64,249,192,253,255,180,8,0,64,249,137,82,66,249,255,15,0,185,8,13,64,249,239,3,8,170,32,1,63,214,225,51,0,145,0,1,63,214,232,15,64,185,31,5, + 0,113,243,23,159,26,64,252,255,53,226,255,255,23,243,83,189,169,245,11,0,249,253,251,1,169,253,99,0,145,255,67,1,209,232,0,0,176,244,3,0,170,245,243,1,178,8,9,64,249,224,195,0,145,243,3,1,170,168,3,30,248,245,215,3,169,245,27,0,249,40,8,0,148, + 224,99,0,145,245,87,2,169,245,15,0,249,36,8,0,148,224,3,0,145,245,215,0,169,245,3,0,249,32,8,0,148,128,2,64,249,160,1,0,180,8,0,64,121,104,1,0,52,225,195,0,145,151,254,255,151,96,0,0,52,244,3,0,42,13,0,0,20,224,195,0,145,247,8,0,148,225,99,0, + 145,8,255,255,151,6,0,0,20,225,195,0,145,226,99,0,145,227,3,0,145,224,3,20,170,44,0,0,148,244,3,0,42,32,2,0,52,224,3,31,170,96,2,0,249,224,3,0,145,10,8,0,148,224,99,0,145,8,8,0,148,224,195,0,145,6,8,0,148,160,3,94,248,199,251,255,151,224,3,20, + 42,255,67,1,145,253,251,65,169,245,11,64,249,243,83,195,168,192,3,95,214,224,3,0,145,196,8,0,148,192,1,0,55,193,0,0,176,33,64,10,145,224,99,0,145,125,8,0,148,224,3,0,145,187,8,0,148,244,3,0,170,224,3,0,145,209,8,0,148,225,3,0,170,224,99,0,145, + 226,3,20,170,132,8,0,148,224,99,0,145,178,8,0,148,244,3,0,170,224,99,0,145,200,8,0,148,225,3,20,170,200,8,0,148,244,3,31,42,217,255,255,23,243,83,186,169,245,91,1,169,247,99,2,169,249,107,3,169,251,115,4,169,253,123,5,169,253,67,1,145,255,3, + 2,209,232,0,0,176,243,3,3,170,244,3,2,170,8,9,64,249,245,3,1,170,246,3,0,170,252,3,31,42,248,243,1,178,247,0,0,176,168,131,26,248,8,0,0,20,224,67,1,145,208,7,0,148,224,99,0,145,206,7,0,148,156,7,0,17,159,23,0,113,160,23,0,84,200,26,64,185,138, + 0,128,82,201,118,64,57,74,1,28,75,31,5,0,113,89,1,156,26,137,0,0,52,200,34,64,185,8,37,217,26,136,254,7,54,200,0,0,176,9,129,14,145,63,3,0,113,200,0,0,176,8,1,16,145,224,99,0,145,233,35,5,169,200,0,0,176,9,129,17,145,200,0,0,176,8,1,19,145,248, + 99,2,169,233,35,6,169,200,114,64,57,201,0,0,176,41,129,20,145,248,15,0,249,233,59,0,249,4,9,64,122,232,67,1,145,26,89,121,248,251,7,159,26,167,7,0,148,226,99,0,145,224,3,25,42,225,3,27,42,113,253,255,151,224,99,0,145,131,8,0,148,225,3,27,42, + 226,3,31,42,227,3,20,170,228,3,21,170,75,3,0,148,0,19,0,55,224,99,0,145,123,8,0,148,225,3,27,42,34,0,128,82,227,3,20,170,228,3,21,170,67,3,0,148,0,18,0,55,248,99,4,169,232,66,75,185,73,46,64,249,40,121,104,248,233,0,0,208,41,185,75,185,8,1,64, + 145,8,5,64,185,63,1,8,107,76,27,0,84,232,0,0,208,8,217,69,249,72,247,255,180,232,66,75,185,73,46,64,249,40,121,104,248,233,0,0,208,41,201,75,185,8,1,64,145,8,5,64,185,63,1,8,107,172,28,0,84,232,0,0,208,8,225,69,249,200,245,255,180,232,0,0,208, + 219,0,0,208,255,27,0,249,8,217,69,249,105,83,66,249,239,3,8,170,32,1,63,214,231,195,0,145,224,3,31,170,225,3,26,170,226,3,31,170,227,3,31,42,228,3,31,42,229,3,31,170,230,3,31,42,0,1,63,214,224,2,248,55,232,0,0,208,105,83,66,249,224,27,64,249, + 8,225,69,249,255,43,0,249,239,3,8,170,32,1,63,214,227,67,1,145,225,3,31,42,226,3,31,42,228,3,31,170,0,1,63,214,200,0,0,208,251,27,64,249,8,213,69,249,0,1,63,214,200,0,0,208,225,3,31,42,226,3,27,170,8,241,69,249,0,1,63,214,255,27,0,249,232,66, + 75,185,73,46,64,249,40,121,104,248,233,0,0,208,41,217,75,185,8,1,64,145,8,5,64,185,63,1,8,107,44,25,0,84,232,0,0,208,201,0,0,208,8,233,69,249,72,239,255,180,41,81,66,249,234,243,1,50,239,3,8,170,255,43,7,41,32,1,63,214,32,0,128,82,225,227,0, + 145,227,243,0,145,0,3,160,114,226,3,31,170,0,1,63,214,31,232,1,113,161,237,255,84,232,59,64,185,104,237,255,52,224,67,1,145,248,227,5,169,248,43,0,249,51,7,0,148,225,59,64,185,224,67,1,145,244,7,0,148,32,236,7,54,232,0,0,208,224,67,1,145,27, + 233,69,249,13,8,0,148,200,0,0,208,239,3,27,170,226,3,0,170,8,81,66,249,0,1,63,214,32,0,128,82,225,227,0,145,227,243,0,145,0,3,160,114,96,3,63,214,64,234,255,53,224,67,1,145,243,11,0,249,255,7,0,148,232,63,64,185,136,1,0,52,243,3,31,42,27,184, + 0,145,96,163,94,248,225,3,26,170,148,24,0,148,64,6,0,52,232,63,64,185,115,6,0,17,123,67,1,145,127,2,8,107,3,255,255,84,224,67,1,145,17,7,0,148,243,11,64,249,64,255,255,23,200,0,0,208,192,0,0,176,0,128,10,145,8,41,70,249,0,1,63,214,83,0,128,82, + 243,0,176,114,22,0,0,20,83,2,0,180,200,0,0,176,8,225,4,145,201,0,0,176,41,1,5,145,224,3,19,170,232,39,5,169,200,0,0,176,8,65,5,145,201,0,0,176,41,97,5,145,232,39,6,169,200,0,0,176,8,161,5,145,232,59,0,249,232,67,1,145,1,89,121,248,58,7,0,148, + 224,99,0,145,243,6,0,148,243,3,31,42,160,131,90,248,179,250,255,151,224,3,19,42,255,3,2,145,253,123,69,169,251,115,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,198,168,192,3,95,214,122,3,64,121,104,227,95,120,224,3,21,170,105,195, + 95,120,106,163,95,120,97,163,93,248,250,35,8,41,233,43,9,41,35,7,0,148,224,67,1,145,220,6,0,148,224,3,1,145,225,3,21,170,1,3,0,148,243,11,64,249,251,3,0,42,84,4,0,180,59,4,0,54,224,3,20,170,225,1,128,82,236,6,0,148,225,67,1,145,224,3,26,42,98, + 1,128,82,67,1,128,82,248,227,5,248,248,99,5,169,232,23,0,148,96,223,255,53,225,67,1,145,224,3,20,170,251,15,0,185,11,7,0,148,123,0,128,82,225,67,1,145,224,3,26,42,98,1,128,82,67,1,128,82,221,23,0,148,0,222,255,53,224,3,20,170,193,0,0,176,33, + 144,23,145,65,7,0,148,225,67,1,145,224,3,20,170,62,7,0,148,123,7,0,113,65,254,255,84,251,15,64,185,187,220,7,54,173,255,255,23,251,0,0,208,123,227,46,145,224,3,27,170,148,8,0,148,104,3,64,185,31,5,0,49,33,228,255,84,200,0,0,208,192,0,0,176,0, + 32,24,145,8,201,69,249,0,1,63,214,200,0,0,208,193,0,0,176,33,160,23,145,8,209,69,249,0,1,63,214,232,0,0,208,0,217,5,249,224,0,0,208,0,224,46,145,182,8,0,148,17,255,255,23,251,0,0,208,123,35,47,145,224,3,27,170,125,8,0,148,104,3,64,185,31,5,0, + 49,193,226,255,84,200,0,0,208,192,0,0,176,0,32,24,145,8,201,69,249,0,1,63,214,200,0,0,208,193,0,0,176,33,160,24,145,8,209,69,249,0,1,63,214,232,0,0,208,0,225,5,249,224,0,0,176,0,32,47,145,159,8,0,148,6,255,255,23,251,0,0,176,123,99,47,145,224, + 3,27,170,102,8,0,148,104,3,64,185,31,5,0,49,65,230,255,84,200,0,0,176,192,0,0,144,0,32,24,145,8,201,69,249,0,1,63,214,200,0,0,176,193,0,0,144,33,0,25,145,8,209,69,249,0,1,63,214,232,0,0,176,0,233,5,249,224,0,0,176,0,96,47,145,136,8,0,148,34, + 255,255,23,243,83,190,169,253,123,1,169,253,67,0,145,255,131,0,209,232,0,0,144,8,9,64,249,232,15,0,249,224,7,0,180,40,120,64,57,243,3,1,170,104,0,0,52,104,118,64,57,72,7,0,53,8,0,64,249,255,11,0,249,212,0,0,176,137,82,66,249,8,1,64,249,239,3, + 8,170,32,1,63,214,193,0,0,144,33,32,12,145,226,67,0,145,0,1,63,214,232,3,0,42,224,11,64,249,136,4,248,55,96,5,0,180,104,122,64,57,232,1,0,53,8,0,64,249,137,82,66,249,255,15,0,185,8,21,64,249,239,3,8,170,32,1,63,214,225,51,0,145,0,1,63,214,160, + 0,248,55,232,15,64,185,31,5,0,113,65,0,0,84,104,26,0,185,224,11,64,249,104,118,64,57,40,2,0,53,8,0,64,249,138,82,66,249,233,243,1,50,233,15,0,185,8,13,64,249,239,3,8,170,64,1,63,214,225,51,0,145,0,1,63,214,192,0,248,55,232,15,64,185,136,0,0, + 52,41,0,128,82,104,34,0,185,105,118,0,57,224,11,64,249,0,1,0,180,255,11,0,249,137,82,66,249,8,0,64,249,8,9,64,249,239,3,8,170,32,1,63,214,0,1,63,214,224,15,64,249,233,249,255,151,255,131,0,145,253,123,65,169,243,83,194,168,192,3,95,214,243,83, + 187,169,245,91,1,169,247,99,2,169,252,27,0,249,253,251,3,169,253,227,0,145,255,67,3,209,232,0,0,144,8,9,64,249,168,3,28,248,99,13,0,180,245,243,1,178,246,227,1,145,224,135,7,169,224,3,2,170,243,3,3,170,244,3,2,170,245,87,9,169,255,155,0,185, + 255,147,0,185,223,178,1,184,226,71,0,249,158,253,255,151,64,229,5,79,8,0,0,18,224,195,0,145,245,59,0,249,245,195,0,145,232,83,2,57,224,131,1,173,224,131,2,173,255,5,0,148,160,98,0,145,253,5,0,148,160,194,0,145,251,5,0,148,224,227,1,145,225,195, + 0,145,173,3,0,148,225,227,1,145,224,3,20,170,139,255,255,151,129,0,0,208,33,160,0,145,0,9,128,82,199,7,0,148,244,3,0,170,32,9,0,180,224,131,199,60,193,6,192,61,56,0,128,82,232,79,64,249,215,0,0,176,160,131,153,60,161,131,154,60,168,131,27,248, + 232,0,0,176,152,14,0,185,0,205,69,249,168,0,0,240,8,65,56,145,136,2,0,249,224,0,0,180,8,0,64,249,233,82,66,249,8,5,64,249,239,3,8,170,32,1,63,214,0,1,63,214,168,0,0,240,8,129,55,145,160,131,217,60,136,2,0,249,161,131,218,60,168,131,91,248,105, + 2,64,249,128,134,0,173,136,78,3,169,40,5,64,249,233,82,66,249,239,3,8,170,32,1,63,214,224,3,19,170,0,1,63,214,224,131,199,60,193,6,192,61,224,3,0,145,232,79,64,249,225,3,20,170,152,66,0,185,224,7,0,173,232,19,0,249,38,0,0,148,136,2,64,249,233, + 82,66,249,243,3,0,42,8,9,64,249,239,3,8,170,32,1,63,214,224,3,20,170,0,1,63,214,160,194,0,145,187,5,0,148,160,98,0,145,185,5,0,148,224,195,0,145,183,5,0,148,160,3,92,248,120,249,255,151,224,3,19,42,255,67,3,145,253,251,67,169,252,27,64,249,247, + 99,66,169,245,91,65,169,243,83,197,168,192,3,95,214,115,0,136,82,19,0,176,114,244,255,255,23,224,131,199,60,193,6,192,61,224,3,0,145,232,79,64,249,225,3,20,170,224,7,0,173,232,19,0,249,3,0,0,148,243,3,0,42,228,255,255,23,243,83,188,169,245,91, + 1,169,247,99,2,169,253,123,3,169,253,195,0,145,255,131,2,209,232,0,0,144,244,3,0,170,233,243,1,178,8,9,64,249,224,35,0,145,246,3,1,170,168,131,28,248,233,39,1,169,233,7,0,249,141,5,0,148,128,2,64,249,136,114,64,57,32,1,0,180,9,0,64,121,233,0, + 0,52,31,1,0,113,40,0,128,82,225,35,0,145,21,5,136,26,0,252,255,151,7,0,0,20,225,35,0,145,224,3,20,170,226,3,31,170,227,3,31,170,21,121,31,83,155,253,255,151,247,3,0,42,243,3,0,42,160,1,0,52,243,2,248,55,224,35,0,145,121,5,0,148,160,131,92,248, + 58,249,255,151,224,3,19,42,255,131,2,145,253,123,67,169,247,99,66,169,245,91,65,169,243,83,196,168,192,3,95,214,152,206,64,169,224,35,0,145,76,6,0,148,33,0,128,82,226,3,21,42,227,3,24,170,228,3,19,170,229,3,22,170,186,6,0,148,243,3,0,42,115, + 253,255,54,136,114,64,57,40,253,255,53,232,0,0,144,73,46,64,249,255,2,0,113,8,65,75,185,246,23,159,26,191,2,0,113,245,23,159,26,247,0,0,176,40,121,104,248,233,0,0,176,41,233,75,185,8,1,64,145,8,5,64,185,63,1,8,107,204,7,0,84,224,242,69,249,0, + 251,255,180,200,0,0,176,193,0,0,144,33,224,25,145,8,209,69,249,0,1,63,214,64,250,255,180,244,0,0,144,148,226,38,145,225,3,31,170,224,3,20,170,226,3,31,170,157,250,255,151,96,249,255,55,232,0,0,144,8,185,73,185,31,13,0,113,3,1,0,84,232,0,0,144, + 8,53,39,145,9,1,64,57,137,0,48,54,8,49,64,248,8,249,81,146,8,1,0,180,128,18,64,249,159,2,0,185,232,0,0,144,159,18,0,249,8,113,69,249,0,1,63,214,185,255,255,23,8,32,160,82,64,229,5,79,9,1,128,82,232,23,0,249,232,163,0,145,224,0,0,144,0,224,38, + 145,232,39,8,169,232,159,0,145,41,0,128,82,193,0,0,144,33,100,57,145,232,39,7,169,232,155,0,145,229,195,0,145,232,39,6,169,232,131,0,145,137,0,128,82,226,3,31,170,227,3,31,170,196,0,128,82,245,159,0,57,246,155,0,57,243,35,0,185,224,131,1,173, + 232,39,5,169,181,250,255,151,222,255,255,23,244,0,0,176,148,162,47,145,224,3,20,170,248,6,0,148,136,2,64,185,31,5,0,49,161,247,255,84,200,0,0,176,192,0,0,144,0,96,25,145,8,29,70,249,225,3,31,170,2,0,129,82,0,1,63,214,224,242,5,249,224,0,0,176, + 0,160,47,145,30,7,0,148,177,255,255,23,0,0,0,0,0,0,0,0,226,3,1,170,225,3,31,170,2,0,0,20,0,0,0,0,243,83,189,169,245,11,0,249,253,251,1,169,253,99,0,145,255,3,2,209,232,0,0,144,8,9,64,249,168,3,30,248,34,6,0,180,245,243,1,178,160,255,59,169,224, + 3,1,170,243,3,2,170,244,3,1,170,191,215,60,169,191,243,28,248,181,131,29,248,191,131,29,184,161,131,28,248,125,252,255,151,64,229,5,79,8,0,0,18,224,3,0,145,245,35,0,249,245,3,0,145,168,67,29,56,224,3,0,173,224,3,1,173,222,4,0,148,160,98,0,145, + 220,4,0,148,160,194,0,145,218,4,0,148,160,35,1,209,225,3,0,145,140,2,0,148,161,35,1,209,224,3,20,170,106,254,255,151,160,35,1,209,225,3,19,170,155,252,255,151,243,3,0,42,160,194,0,145,209,4,0,148,160,98,0,145,207,4,0,148,224,3,0,145,205,4,0, + 148,160,3,94,248,142,248,255,151,224,3,19,42,255,3,2,145,253,251,65,169,245,11,64,249,243,83,195,168,192,3,95,214,115,0,136,82,19,0,176,114,246,255,255,23,243,83,189,169,245,11,0,249,253,251,1,169,253,99,0,145,255,195,0,209,232,0,0,144,8,9,64, + 249,168,3,30,248,194,3,0,180,244,10,128,82,244,0,176,114,160,3,0,180,245,3,1,170,97,3,0,180,232,243,1,178,225,99,0,145,243,3,2,170,232,163,1,169,232,163,0,169,35,0,0,148,128,2,0,54,225,35,0,145,224,3,21,170,245,35,0,145,30,0,0,148,224,1,0,54, + 232,3,31,170,233,99,0,145,42,105,104,184,171,106,104,184,95,1,11,107,104,2,0,84,3,2,0,84,8,17,0,145,31,65,0,241,33,255,255,84,232,3,31,42,14,0,0,20,116,0,136,82,20,0,176,114,160,3,94,248,91,248,255,151,224,3,20,42,255,195,0,145,253,251,65,169, + 245,11,64,249,243,83,195,168,192,3,95,214,8,0,128,18,2,0,0,20,40,0,128,82,244,3,31,42,104,2,0,185,243,255,255,23,243,83,189,169,245,91,1,169,253,123,2,169,253,131,0,145,255,67,0,209,232,0,0,144,243,3,1,170,244,3,0,170,8,9,64,249,245,3,31,170, + 246,3,31,42,232,7,0,249,40,0,128,82,255,3,0,249,11,0,0,20,52,9,0,145,40,0,128,82,3,0,0,20,232,3,31,42,127,122,53,184,191,10,0,241,181,6,0,145,246,151,159,26,191,18,0,241,64,2,0,84,40,255,7,54,225,3,0,145,224,3,20,170,66,1,128,82,63,25,0,148, + 233,3,64,249,96,122,53,184,63,1,20,235,160,0,0,84,137,0,0,180,40,1,64,121,31,185,0,113,64,253,255,84,232,3,31,42,181,253,255,181,63,1,20,235,97,253,255,84,224,7,64,249,35,248,255,151,192,2,0,18,255,67,0,145,253,123,66,169,245,91,65,169,243,83, + 195,168,192,3,95,214,227,3,0,170,224,3,31,170,225,3,31,170,226,3,31,170,52,254,255,23,243,83,187,169,245,91,1,169,247,99,2,169,252,27,0,249,253,251,3,169,253,227,0,145,255,195,8,209,232,0,0,144,246,3,2,42,245,3,1,42,8,9,64,249,247,3,0,170,224, + 131,0,145,65,21,128,82,2,65,128,82,243,3,4,170,244,3,3,170,168,3,28,248,24,65,128,82,24,248,255,151,232,243,1,178,248,15,0,185,223,2,0,114,232,3,0,249,232,0,0,144,233,135,97,178,8,129,69,249,35,67,128,82,32,21,137,154,228,3,0,145,225,3,23,170, + 226,3,31,42,67,0,160,114,0,1,63,214,247,3,31,42,96,1,0,52,160,3,92,248,242,247,255,151,224,2,0,18,255,195,8,145,253,251,67,169,252,27,64,249,247,99,66,169,245,91,65,169,243,83,197,168,192,3,95,214,247,0,0,144,168,0,0,240,8,225,56,145,191,2,0, + 114,224,3,64,249,201,0,0,144,41,33,22,145,247,134,69,249,228,131,0,145,33,17,136,154,229,51,0,145,226,3,31,170,227,3,31,170,224,2,63,214,246,3,0,42,224,3,0,53,232,15,64,185,31,13,0,113,131,3,0,84,225,131,0,145,224,3,19,170,86,4,0,148,245,2,0, + 54,224,3,64,249,8,65,128,82,193,0,0,144,33,112,22,145,228,131,0,145,229,51,0,145,226,3,31,170,227,3,31,170,232,15,0,185,224,2,63,214,246,3,0,42,128,1,0,53,232,15,64,185,31,13,0,113,35,1,0,84,193,0,0,144,33,240,5,145,224,3,19,170,131,4,0,148, + 225,131,0,145,224,3,19,170,128,4,0,148,246,3,31,42,232,0,0,144,224,3,64,249,8,121,69,249,0,1,63,214,247,3,31,42,118,248,255,53,232,15,64,185,31,13,0,113,3,248,255,84,224,3,19,170,205,4,0,148,129,11,128,82,87,15,0,148,0,1,0,180,245,3,0,170,232, + 243,1,178,0,8,0,145,225,67,0,145,232,35,1,169,90,255,255,151,96,0,0,55,247,3,31,42,178,255,255,23,148,0,0,180,161,10,0,145,224,3,20,170,35,4,0,148,224,67,0,145,225,3,19,170,3,0,0,148,247,3,0,42,169,255,255,23,243,83,190,169,253,123,1,169,253, + 67,0,145,243,3,1,170,232,3,31,170,201,0,0,144,41,161,22,145,10,104,104,184,43,105,104,184,95,1,11,107,168,0,0,84,3,1,0,84,8,17,0,145,31,65,0,241,33,255,255,84,224,3,19,170,253,123,65,169,243,83,194,168,202,249,255,23,212,0,0,176,192,0,0,144, + 0,224,22,145,148,42,70,249,128,2,63,214,224,3,19,170,158,4,0,148,200,0,0,176,8,45,70,249,0,1,63,214,192,0,0,144,0,160,7,145,128,2,63,214,224,3,31,42,253,123,65,169,243,83,194,168,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,170,0,0,20,0,0,0,0,0,0,0, + 0,0,0,0,0,8,48,0,145,9,1,64,185,0,0,176,18,63,1,0,107,224,0,0,84,32,5,0,17,10,125,95,136,95,1,9,107,129,0,0,84,0,125,10,136,138,255,255,53,192,3,95,214,95,63,3,213,244,255,255,23,0,0,0,0,0,0,0,0,243,15,30,248,253,251,0,169,253,35,0,145,9,0,176, + 18,10,48,0,145,2,0,0,20,95,63,3,213,75,1,64,185,127,1,9,107,0,4,0,84,104,5,0,81,76,125,95,136,159,1,11,107,33,255,255,84,72,253,12,136,140,255,255,53,168,2,0,53,211,0,0,176,191,59,3,213,0,1,0,180,8,0,64,249,105,82,66,249,8,17,64,249,239,3,8, + 170,32,1,63,214,33,0,128,82,0,1,63,214,232,0,0,176,0,205,69,249,224,0,0,180,8,0,64,249,105,82,66,249,8,9,64,249,239,3,8,170,32,1,63,214,0,1,63,214,232,3,31,42,224,3,8,42,253,251,64,169,243,7,66,248,192,3,95,214,232,119,31,50,251,255,255,23,0, + 0,0,0,243,83,190,169,253,123,1,169,253,67,0,145,255,3,1,209,233,0,0,144,232,3,2,170,243,3,0,170,41,9,64,249,169,131,30,248,33,5,248,55,212,0,0,176,255,7,0,249,136,4,0,180,9,1,64,249,35,1,64,249,137,82,66,249,239,3,3,170,32,1,63,214,193,0,0,144, + 33,32,26,145,226,35,0,145,224,3,8,170,96,0,63,214,226,7,64,249,225,3,0,42,96,30,64,249,137,82,66,249,8,0,64,249,8,13,64,249,239,3,8,170,32,1,63,214,0,1,63,214,224,7,64,249,0,1,0,180,255,7,0,249,137,82,66,249,8,0,64,249,8,9,64,249,239,3,8,170, + 32,1,63,214,0,1,63,214,160,131,94,248,10,247,255,151,224,3,31,42,255,3,1,145,253,123,65,169,243,83,194,168,192,3,95,214,226,3,31,170,232,255,255,23,105,66,64,185,41,5,0,113,203,250,255,84,96,134,64,173,224,67,0,145,104,26,64,249,225,3,19,170, + 105,66,0,185,224,135,0,173,232,27,0,249,150,253,255,151,128,253,255,54,225,3,0,42,96,30,64,249,201,0,0,176,41,81,66,249,8,0,64,249,8,13,64,249,239,3,8,170,32,1,63,214,226,3,31,170,0,1,63,214,225,255,255,23,0,0,0,0,0,0,0,0,0,0,0,0,243,83,190, + 169,253,123,1,169,253,67,0,145,243,3,0,170,0,28,64,249,244,3,1,42,168,0,0,240,8,129,55,145,104,2,0,249,32,1,0,180,127,30,0,249,201,0,0,176,8,0,64,249,41,81,66,249,8,9,64,249,239,3,8,170,32,1,63,214,0,1,63,214,232,11,2,50,104,14,0,185,116,0,0, + 52,224,3,19,170,238,4,0,148,224,3,19,170,253,123,65,169,243,83,194,168,192,3,95,214,0,0,0,0,32,0,32,212,32,0,32,212,253,123,191,169,253,3,0,145,95,0,0,249,40,44,64,41,42,36,65,41,232,0,0,53,203,0,0,53,95,1,3,113,129,0,0,84,12,192,168,82,63,1, + 12,107,96,2,0,84,44,113,134,82,76,209,169,114,31,1,12,107,72,0,136,82,8,0,176,114,193,2,0,84,12,59,153,82,76,122,169,114,127,1,12,107,65,2,0,84,203,182,150,82,75,226,169,114,95,1,11,107,193,1,0,84,202,157,141,82,42,184,169,114,63,1,10,107,65, + 1,0,84,64,0,0,249,201,0,0,176,8,0,64,249,41,81,66,249,8,5,64,249,239,3,8,170,32,1,63,214,0,1,63,214,232,3,31,42,224,3,8,42,253,123,193,168,192,3,95,214,243,83,189,169,245,91,1,169,253,123,2,169,253,131,0,145,255,67,0,209,232,0,0,144,246,0,0, + 144,243,3,0,170,8,9,64,249,244,0,0,176,232,7,0,249,200,66,75,185,73,46,64,249,40,121,104,248,233,0,0,176,41,249,75,185,8,1,64,145,8,5,64,185,63,1,8,107,140,12,0,84,136,250,69,249,213,0,0,176,40,2,0,180,224,3,19,170,97,16,128,82,222,2,0,148,224, + 3,19,170,134,3,0,148,148,250,69,249,224,3,0,185,224,3,19,170,157,3,0,148,168,82,66,249,239,3,20,170,225,3,0,170,0,1,63,214,224,3,0,145,128,2,63,214,0,6,0,52,200,66,75,185,73,46,64,249,246,0,0,176,40,121,104,248,233,0,0,176,41,9,76,185,8,1,64, + 145,8,5,64,185,63,1,8,107,204,5,0,84,200,2,70,249,246,0,176,82,8,4,0,180,169,82,66,249,239,3,8,170,255,3,0,249,32,1,63,214,224,3,0,145,0,1,63,214,244,3,0,42,0,2,248,55,225,3,64,249,224,3,19,170,228,2,0,148,0,1,0,55,200,0,0,176,8,189,69,249,0, + 1,63,214,8,60,0,18,31,4,0,113,8,1,22,42,20,176,136,26,232,0,0,144,224,3,64,249,8,145,69,249,0,1,63,214,224,7,64,249,84,246,255,151,224,3,20,42,255,67,0,145,253,123,66,169,245,91,65,169,243,83,195,168,192,3,95,214,8,146,128,82,212,2,8,42,246, + 255,255,23,232,3,64,185,224,3,19,170,1,5,0,81,0,3,0,148,232,255,175,18,31,0,0,114,244,19,136,26,238,255,255,23,244,0,0,144,148,34,48,145,224,3,20,170,97,4,0,148,136,2,64,185,31,5,0,49,161,249,255,84,200,0,0,144,160,0,0,240,0,224,35,145,8,29, + 70,249,225,3,31,170,2,0,129,82,0,1,63,214,192,0,0,180,200,0,0,144,161,0,0,240,33,64,36,145,8,209,69,249,0,1,63,214,192,2,6,249,224,0,0,144,0,32,48,145,129,4,0,148,187,255,255,23,245,3,20,170,244,0,0,144,148,226,47,145,224,3,20,170,71,4,0,148, + 136,2,64,185,244,3,21,170,31,5,0,49,161,242,255,84,200,0,0,144,160,0,0,240,0,0,27,145,8,201,69,249,0,1,63,214,200,0,0,144,161,0,0,240,33,96,26,145,8,209,69,249,0,1,63,214,128,250,5,249,224,0,0,144,0,224,47,145,105,4,0,148,134,255,255,23,243, + 83,190,169,253,123,1,169,253,67,0,145,255,67,1,209,200,0,0,240,244,3,1,170,243,3,0,170,8,9,64,249,160,0,0,240,0,64,28,145,161,0,0,240,33,128,27,145,226,3,19,170,227,3,20,170,228,3,31,170,37,0,128,82,230,3,31,170,231,3,31,170,168,131,30,248,255, + 3,0,249,88,0,0,148,160,0,0,240,0,224,29,145,161,0,0,240,33,96,29,145,98,34,0,145,131,98,0,145,228,3,31,170,229,3,31,42,230,3,31,170,231,3,31,170,255,3,0,249,76,0,0,148,244,243,1,178,224,195,0,145,244,211,3,169,244,27,0,249,38,2,0,148,160,0,0, + 240,0,128,38,145,225,195,0,145,35,3,0,148,224,0,0,54,161,0,0,240,33,64,39,145,224,195,0,145,236,2,0,148,8,0,0,18,104,114,0,57,224,195,0,145,28,2,0,148,224,195,0,145,255,211,2,169,244,211,3,169,21,2,0,148,160,0,0,240,0,64,31,145,161,0,0,240,33, + 192,30,145,226,163,0,145,227,195,0,145,100,98,0,145,102,130,0,145,103,118,0,145,229,3,31,42,255,3,0,249,42,0,0,148,224,35,0,145,244,255,1,169,244,211,0,169,5,2,0,148,116,122,0,145,160,0,0,240,0,192,32,145,161,0,0,240,33,32,32,145,226,131,0,145, + 227,35,0,145,100,98,0,145,229,3,31,42,230,3,31,170,231,3,31,170,244,3,0,249,25,0,0,148,104,122,64,57,168,1,0,53,160,0,0,240,0,192,34,145,161,0,0,240,33,192,33,145,226,131,0,145,227,35,0,145,100,98,0,145,229,3,31,42,230,3,31,170,231,3,31,170, + 244,3,0,249,11,0,0,148,224,35,0,145,235,1,0,148,224,195,0,145,233,1,0,148,160,131,94,248,170,245,255,151,255,67,1,145,253,123,65,169,243,83,194,168,192,3,95,214,243,83,186,169,245,91,1,169,247,99,2,169,249,107,3,169,251,115,4,169,253,123,5,169, + 253,67,1,145,255,67,0,209,200,0,0,240,179,11,64,249,245,3,7,170,8,9,64,249,246,3,6,170,250,3,5,42,244,3,4,170,248,3,3,170,247,3,2,170,249,3,1,170,219,0,0,240,232,7,0,249,101,0,0,54,40,0,128,82,104,195,39,57,225,3,24,170,200,2,0,148,160,2,0,54, + 224,3,24,170,166,2,0,148,224,2,0,249,150,0,0,180,224,3,24,170,139,2,0,148,32,11,0,54,20,2,0,180,224,2,64,249,32,1,0,180,211,19,0,148,31,4,0,113,232,23,159,26,136,2,0,185,51,1,0,180,40,0,128,82,104,2,0,57,6,0,0,20,232,3,31,42,250,255,255,23,186, + 1,0,55,104,195,103,57,104,1,0,53,224,7,64,249,115,245,255,151,255,67,0,145,253,123,69,169,251,115,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,198,168,192,3,95,214,255,3,0,249,200,0,0,240,35,3,128,82,8,129,69,249,161,0,0,240,33,0, + 37,145,228,3,0,145,224,135,97,178,226,3,31,42,67,0,160,114,0,1,63,214,232,3,64,249,220,0,0,240,250,3,0,42,156,123,69,249,224,3,8,170,128,3,63,214,218,2,0,52,255,3,0,249,200,0,0,240,160,255,159,146,35,3,128,82,8,129,69,249,161,0,0,240,33,0,37, + 145,228,3,0,145,0,0,176,242,226,3,31,42,67,0,160,114,0,1,63,214,232,3,64,249,250,3,0,42,224,3,8,170,128,3,63,214,95,3,0,113,232,23,159,26,104,195,39,57,58,250,255,53,3,0,0,20,40,0,128,82,104,195,39,57,160,255,159,146,225,3,25,170,226,3,23,170, + 0,0,176,242,227,3,24,170,228,3,20,170,229,3,22,170,230,3,21,170,231,3,19,170,77,0,0,148,96,248,7,55,224,135,97,178,225,3,25,170,226,3,23,170,227,3,24,170,228,3,20,170,229,3,22,170,230,3,21,170,231,3,19,170,67,0,0,148,185,255,255,23,243,2,64, + 249,224,7,64,249,42,245,255,151,224,3,22,170,225,3,19,170,226,3,21,170,255,67,0,145,253,123,69,169,251,115,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,198,168,1,0,0,20,243,83,188,169,245,91,1,169,247,99,2,169,253,123,3,169,253,195, + 0,145,243,3,2,170,193,4,0,180,245,3,1,170,244,3,0,170,55,0,128,82,10,0,0,20,192,10,0,145,100,19,0,148,233,34,192,26,136,2,64,185,31,20,0,113,41,53,159,26,8,1,9,42,136,2,0,185,223,2,0,121,224,3,21,170,129,5,128,82,176,12,0,148,64,1,0,180,8,0, + 21,203,246,3,0,170,224,3,21,170,8,253,65,147,24,5,0,145,197,242,255,151,31,3,0,235,130,254,255,84,235,255,255,23,168,2,64,121,72,1,0,52,224,3,21,170,76,19,0,148,40,0,128,82,31,20,0,113,137,2,64,185,8,33,192,26,8,53,159,26,40,1,8,42,136,2,0,185, + 40,0,128,82,104,2,0,57,253,123,67,169,247,99,66,169,245,91,65,169,243,83,196,168,192,3,95,214,243,83,186,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,251,4,169,253,35,1,145,255,131,1,209,200,0,0,240,249,3,0,170,251,243,1,178, + 8,9,64,249,224,163,0,145,243,3,7,170,244,3,6,170,245,3,5,170,246,3,4,170,247,3,3,170,248,3,2,170,250,3,1,170,168,3,27,248,251,111,3,169,251,23,0,249,14,1,0,148,224,163,0,145,50,254,255,151,224,67,0,145,251,239,1,169,251,11,0,249,8,1,0,148,224, + 3,1,145,251,239,4,169,251,35,0,249,4,1,0,148,225,3,1,145,224,3,31,170,62,247,255,151,160,8,248,55,224,3,1,145,224,1,0,148,129,11,128,82,106,12,0,148,232,3,0,170,128,0,0,181,224,3,1,145,218,1,0,148,232,3,0,170,224,67,0,145,1,9,0,145,60,1,0,148, + 224,3,1,145,245,0,0,148,255,7,0,249,26,7,0,180,72,3,64,121,200,6,0,52,232,243,1,178,224,3,26,170,232,163,4,169,232,35,0,249,115,242,255,151,232,3,0,170,224,3,1,145,1,169,0,145,247,0,0,148,161,0,0,240,33,0,37,145,224,3,1,145,106,1,0,148,224,3, + 1,145,225,3,26,170,103,1,0,148,224,3,1,145,190,1,0,148,200,0,0,240,225,3,0,170,228,35,0,145,8,129,69,249,224,3,25,170,226,3,31,42,35,0,128,82,0,1,63,214,250,3,0,42,224,3,1,145,212,0,0,148,249,3,31,42,26,3,0,53,224,163,0,145,175,1,0,148,232,7, + 64,249,225,3,0,170,226,3,24,170,227,3,23,170,228,3,22,170,229,3,21,170,224,3,8,170,230,3,20,170,231,3,19,170,52,0,0,148,64,3,0,54,57,0,128,82,200,0,0,240,224,7,64,249,8,121,69,249,0,1,63,214,5,0,0,20,224,67,0,145,52,1,0,148,198,255,255,23,249, + 3,31,42,224,67,0,145,185,0,0,148,224,163,0,145,183,0,0,148,160,3,91,248,120,244,255,151,32,3,0,18,255,131,1,145,253,251,68,169,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,198,168,192,3,95,214,224,67,0,145,137,1,0,148,232, + 7,64,249,225,3,0,170,226,3,24,170,227,3,23,170,228,3,22,170,229,3,21,170,224,3,8,170,230,3,20,170,231,3,19,170,14,0,0,148,96,251,7,55,224,7,64,249,161,0,0,240,33,96,38,145,226,3,24,170,227,3,23,170,228,3,22,170,229,3,21,170,230,3,20,170,231, + 3,19,170,3,0,0,148,249,3,0,42,208,255,255,23,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,253,123,4,169,253,3,1,145,255,67,0,209,200,0,0,240,246,3,3,170,245,3,2,170,8,9,64,249,247,3,1,170,248,3,0,170,232,7,0,249,165,3,0,180,224,3,24, + 170,225,3,23,170,226,3,21,170,227,3,22,170,249,3,6,170,250,3,5,170,72,0,0,148,64,1,0,54,224,3,22,170,66,1,0,148,224,0,0,55,161,2,64,249,224,3,26,170,226,3,25,170,26,255,255,151,52,0,128,82,2,0,0,20,244,3,31,42,224,7,64,249,51,244,255,151,224, + 3,20,42,255,67,0,145,253,123,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,192,3,95,214,244,3,4,170,132,4,0,180,136,0,128,82,229,19,0,145,230,3,0,145,232,127,0,41,200,0,0,240,224,3,24,170,8,125,69,249,225,3,31,170,226,3,23, + 170,3,2,128,82,228,3,31,170,243,3,7,170,0,1,63,214,128,1,0,52,224,3,24,170,225,3,23,170,226,3,21,170,227,3,22,170,30,0,0,148,0,252,7,54,160,2,64,249,128,1,0,180,100,18,0,148,31,4,0,113,3,0,0,20,232,7,64,185,31,5,0,113,232,23,159,26,136,2,0,185, + 52,0,128,82,211,250,255,180,116,2,0,57,212,255,255,23,232,3,31,42,250,255,255,23,224,7,64,249,4,244,255,151,224,3,24,170,225,3,23,170,226,3,21,170,227,3,22,170,255,67,0,145,253,123,68,169,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197, + 168,1,0,0,20,243,83,188,169,245,91,1,169,247,19,0,249,252,23,0,249,253,123,3,169,253,195,0,145,255,131,8,209,200,0,0,240,243,3,2,170,245,3,1,170,8,9,64,249,246,3,0,170,224,67,0,145,225,3,31,42,2,65,128,82,244,3,3,170,168,131,28,248,23,65,128, + 82,250,243,255,151,247,15,0,185,200,0,0,240,229,67,0,145,8,125,69,249,230,51,0,145,224,3,22,170,225,3,31,170,226,3,21,170,67,0,128,82,228,3,31,170,0,1,63,214,245,3,0,42,224,0,0,53,225,67,0,145,224,3,20,170,88,0,0,148,224,3,20,170,240,0,0,148, + 96,2,0,249,160,131,92,248,191,2,0,113,243,23,159,26,207,243,255,151,224,3,19,42,255,131,8,145,253,123,67,169,252,23,64,249,247,19,64,249,245,91,65,169,243,83,196,168,192,3,95,214,31,124,0,169,31,8,0,249,192,3,95,214,243,15,30,248,253,251,0,169, + 253,35,0,145,8,8,64,249,31,0,0,249,232,0,0,180,31,1,0,121,243,3,0,170,0,8,64,249,96,0,0,180,217,1,0,148,127,254,0,169,253,251,64,169,243,7,66,248,192,3,95,214,243,15,30,248,253,251,0,169,253,35,0,145,243,3,0,170,31,124,0,169,31,8,0,249,5,0,0, + 148,224,3,19,170,253,251,64,169,243,7,66,248,192,3,95,214,243,83,189,169,245,91,1,169,253,123,2,169,253,131,0,145,8,4,64,249,31,1,1,235,130,3,0,84,244,3,1,170,63,4,0,177,224,2,0,84,136,6,0,145,243,3,0,170,9,249,127,211,31,1,0,241,32,161,159, + 218,184,1,0,148,96,2,0,180,104,2,64,249,245,3,0,170,136,2,0,180,118,10,64,249,8,249,127,211,224,3,21,170,2,9,0,145,225,3,22,170,44,242,255,151,118,0,0,180,224,3,22,170,173,1,0,148,32,0,128,82,116,214,0,169,4,0,0,20,224,3,31,42,2,0,0,20,32,0, + 128,82,253,123,66,169,245,91,65,169,243,83,195,168,192,3,95,214,118,10,64,249,191,2,0,121,86,254,255,181,243,255,255,23,243,83,190,169,253,123,1,169,253,67,0,145,243,3,1,170,244,3,0,170,33,1,0,180,224,3,19,170,59,241,255,151,226,3,0,170,224, + 3,20,170,225,3,19,170,253,123,65,169,243,83,194,168,3,0,0,20,226,3,31,170,250,255,255,23,243,83,189,169,245,11,0,249,253,251,1,169,253,99,0,145,8,8,64,249,243,3,2,170,245,3,1,170,244,3,0,170,31,0,0,249,72,0,0,180,31,1,0,121,83,2,0,180,224,3, + 20,170,225,3,19,170,183,255,255,151,0,1,0,54,128,10,64,249,98,250,127,211,225,3,21,170,247,241,255,151,136,6,64,249,31,1,19,235,98,0,0,84,224,3,31,42,6,0,0,20,136,10,64,249,147,2,0,249,72,0,0,180,31,121,51,120,32,0,128,82,253,251,65,169,245, + 11,64,249,243,83,195,168,192,3,95,214,8,8,64,249,31,0,0,249,72,0,0,180,31,1,0,121,192,3,95,214,8,4,64,249,31,1,1,235,163,0,0,84,9,8,64,249,1,0,0,249,73,0,0,180,63,121,33,120,31,1,1,235,224,55,159,26,192,3,95,214,243,83,190,169,253,123,1,169, + 253,67,0,145,243,3,1,170,244,3,0,170,33,1,0,180,224,3,19,170,250,240,255,151,226,3,0,170,224,3,20,170,225,3,19,170,253,123,65,169,243,83,194,168,3,0,0,20,226,3,31,170,250,255,255,23,243,83,189,169,245,91,1,169,253,123,2,169,253,131,0,145,161, + 3,0,180,8,0,64,249,246,3,2,170,244,3,0,170,19,1,2,171,226,1,0,84,245,3,1,170,224,3,20,170,225,3,19,170,119,255,255,151,64,1,0,54,136,10,64,249,137,2,64,249,194,250,127,211,225,3,21,170,0,5,9,139,181,241,255,151,136,6,64,249,31,1,19,235,194,0, + 0,84,224,3,31,42,253,123,66,169,245,91,65,169,243,83,195,168,192,3,95,214,136,10,64,249,147,2,0,249,72,0,0,180,31,121,51,120,32,0,128,82,247,255,255,23,8,0,64,249,31,1,2,235,105,0,0,84,9,8,64,249,33,121,34,120,31,1,2,235,224,151,159,26,192,3, + 95,214,40,252,65,211,1,5,0,145,87,255,255,23,0,4,64,249,192,3,95,214,0,0,64,249,192,3,95,214,8,0,64,249,31,1,0,241,224,23,159,26,192,3,95,214,253,123,191,169,253,3,0,145,129,1,0,180,40,0,64,121,72,1,0,52,8,8,64,249,200,0,0,180,224,3,1,170,225, + 3,8,170,238,19,0,148,31,0,0,113,5,0,0,20,224,3,31,42,4,0,0,20,8,0,64,249,31,1,0,241,224,23,159,26,253,123,193,168,192,3,95,214,0,8,64,249,192,3,95,214,243,83,189,169,245,11,0,249,253,251,1,169,253,99,0,145,40,248,127,211,169,0,0,240,41,225,4, + 145,31,0,0,241,19,9,0,145,53,1,128,154,127,2,1,235,137,1,0,84,200,0,0,240,224,3,19,170,8,141,69,249,0,1,63,214,244,3,0,170,224,0,0,180,224,3,20,170,225,3,21,170,226,3,19,170,105,241,255,151,2,0,0,20,244,3,31,170,224,3,20,170,253,251,65,169,245, + 11,64,249,243,83,195,168,192,3,95,214,243,83,189,169,245,91,1,169,253,123,2,169,253,131,0,145,214,0,0,144,243,3,1,170,225,3,31,170,214,178,69,249,226,3,31,42,244,3,0,170,192,2,63,214,192,0,0,52,245,3,0,42,225,3,0,42,224,3,19,170,13,255,255,151, + 192,0,0,55,224,3,31,42,253,123,66,169,245,91,65,169,243,83,195,168,192,3,95,214,224,3,19,170,202,255,255,151,225,3,0,170,224,3,20,170,226,3,21,42,192,2,63,214,232,3,0,42,224,3,19,170,225,3,8,42,253,123,66,169,245,91,65,169,243,83,195,168,92, + 255,255,23,243,83,186,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,251,4,169,253,35,1,145,56,248,127,211,247,3,1,170,245,3,0,170,224,3,3,170,243,3,3,170,244,3,2,42,225,3,24,170,235,254,255,151,246,3,0,42,224,3,19,170,225,3,24, + 170,73,255,255,151,247,2,0,180,248,3,31,170,247,6,0,209,185,0,0,240,57,99,39,145,186,106,120,56,159,2,0,114,224,3,19,170,251,18,152,154,72,255,68,211,98,251,127,211,33,107,232,56,121,255,255,151,34,0,128,82,72,15,64,146,224,3,19,170,98,251,127, + 179,33,107,232,56,115,255,255,151,247,6,0,209,24,7,0,145,255,6,0,177,225,253,255,84,192,2,0,18,253,251,68,169,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,198,168,192,3,95,214,243,83,187,169,245,91,1,169,247,99,2,169,249,27, + 0,249,253,251,3,169,253,227,0,145,255,195,0,209,200,0,0,240,243,3,5,170,246,3,4,170,8,9,64,249,247,3,3,170,248,3,2,42,249,3,1,42,245,3,0,170,232,23,0,249,200,0,0,144,8,33,70,249,0,1,63,214,224,4,0,180,213,0,0,144,161,0,0,240,33,192,39,145,181, + 210,69,249,244,3,0,170,160,2,63,214,160,8,0,180,201,0,0,144,239,3,0,170,232,3,0,170,41,81,66,249,32,1,63,214,32,3,0,18,225,3,24,42,226,3,23,170,227,3,22,170,228,3,19,170,0,1,63,214,243,3,0,42,161,0,0,208,33,192,43,145,224,3,20,170,160,2,63,214, + 160,0,0,180,168,0,0,240,224,3,20,170,8,133,69,249,0,1,63,214,224,23,64,249,63,242,255,151,224,3,19,42,255,195,0,145,253,251,67,169,249,27,64,249,247,99,66,169,245,91,65,169,243,83,197,168,192,3,95,214,168,0,0,240,8,189,69,249,0,1,63,214,232, + 0,176,82,31,4,0,113,233,243,1,178,8,60,0,51,233,39,1,169,233,7,0,249,19,176,136,26,224,35,0,145,243,39,0,185,100,254,255,151,224,147,0,145,227,35,0,145,129,0,128,82,34,0,128,82,131,255,255,151,180,0,0,240,160,0,0,208,0,0,44,145,148,46,70,249, + 128,2,63,214,224,35,0,145,58,255,255,151,128,2,63,214,160,0,0,208,0,96,46,145,128,2,63,214,224,3,21,170,128,2,63,214,160,0,0,208,0,160,43,145,128,2,63,214,224,35,0,145,80,254,255,151,210,255,255,23,168,0,0,240,8,189,69,249,0,1,63,214,232,0,176, + 82,31,4,0,113,233,243,1,178,8,60,0,51,233,39,1,169,233,7,0,249,19,176,136,26,224,35,0,145,243,39,0,185,63,254,255,151,224,147,0,145,227,35,0,145,129,0,128,82,34,0,128,82,94,255,255,151,182,0,0,240,160,0,0,208,0,128,40,145,214,46,70,249,192,2, + 63,214,224,35,0,145,21,255,255,151,192,2,63,214,160,0,0,208,0,160,43,145,192,2,63,214,224,35,0,145,48,254,255,151,169,255,255,23,0,0,0,0,127,35,3,213,253,123,190,169,253,3,0,145,48,0,128,146,176,11,0,249,101,0,0,148,2,0,0,20,0,0,128,210,253, + 123,194,168,255,35,3,213,192,3,95,214,97,0,0,212,204,18,0,20,0,0,0,0,92,0,0,20,0,0,0,0,252,255,255,23,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,200,0,0,208,20,193,44,145,169,0,0,240,40,69,69,249,243,3,0,170, + 128,34,0,145,0,1,63,214,104,2,64,185,136,0,0,53,9,0,128,18,105,2,0,185,22,0,0,20,31,5,0,49,129,1,0,84,181,0,0,240,168,86,70,249,3,0,128,82,130,12,128,82,129,34,0,145,224,3,20,170,0,1,63,214,104,2,64,185,136,2,0,52,31,5,0,49,224,254,255,84,200, + 0,0,208,9,65,75,185,72,46,64,249,9,89,105,248,200,0,0,208,8,1,64,185,42,1,64,145,72,5,0,185,168,0,0,240,8,57,70,249,128,34,0,145,0,1,63,214,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,8,0,128,18,104,2,0,185,169,0,0, + 240,40,57,70,249,245,255,255,23,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,200,0,0,208,20,193,44,145,169,0,0,240,40,69,69,249,243,3,0,170,128,34,0,145,0,1,63,214,204,0,0,208,136,1,64,185,128,34,0,145,9,5,0,17,200,0,0,208,10,65,75, + 185,72,46,64,249,137,1,0,185,105,2,0,185,9,89,106,248,136,1,64,185,43,1,64,145,104,5,0,185,169,0,0,240,40,57,70,249,0,1,63,214,224,3,20,170,168,0,0,240,8,101,70,249,0,1,63,214,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0, + 127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,4,0,0,20,224,3,19,170,133,10,0,148,0,1,0,52,224,3,19,170,106,18,0,148,96,255,255,180,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,6,0,177,64,0,0,84,116,0,0,148, + 125,0,0,148,0,0,62,212,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,136,0,0,144,8,225,0,145,16,228,0,79,243,3,0,170,233,3,1,170,104,2,0,249,97,34,0,145,32,33,0,145,112,130,128,60,113,8,0,148,224,3,19,170,253,123,193,168,243, + 7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,9,4,64,249,136,0,0,144,8,33,1,145,63,1,0,241,32,17,136,154,192,3,95,214,0,0,0,0,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,136,0,0,144,8,225,0,145,244,3,0,170,128,34,0,145,136,2, + 0,249,243,3,1,42,128,8,0,148,147,0,0,54,1,3,128,210,224,3,20,170,102,255,255,151,224,3,20,170,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,136,0,0,144,9,225,1,145,31,8,0,249,138,0,0,144,72,161,1,145,8,36,0,169,192,3,95,214,0,0,0, + 0,136,0,0,144,8,225,0,145,8,132,0,248,107,8,0,20,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,136,0,0,144,8,225,0,145,16,228,0,79,243,3,0,170,233,3,1,170,104,2,0,249,97,34,0,145,32,33,0,145,112,130,128,60,53,8,0,148,136,0,0,144,8,161, + 1,145,104,2,0,249,224,3,19,170,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,136,0,0,144,9,129,2,145,31,8,0,249,138,0,0,144,72,65,2,145,8,36,0,169,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,136,0,0,144, + 8,225,0,145,16,228,0,79,243,3,0,170,233,3,1,170,104,2,0,249,97,34,0,145,32,33,0,145,112,130,128,60,23,8,0,148,136,0,0,144,8,65,2,145,104,2,0,249,224,3,19,170,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,253,123,189,169, + 253,3,0,145,224,67,0,145,188,255,255,151,200,0,0,176,1,65,10,145,224,67,0,145,8,5,0,148,0,0,62,212,127,35,3,213,253,123,189,169,253,3,0,145,224,67,0,145,212,255,255,151,200,0,0,176,1,97,12,145,224,67,0,145,254,4,0,148,0,0,62,212,127,35,3,213, + 243,15,31,248,253,123,191,169,253,3,0,145,136,0,0,144,8,1,3,145,243,3,0,170,104,2,0,249,97,0,0,54,1,3,128,210,2,255,255,151,224,3,19,170,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,189,169,245,91,1,169,247,19,0, + 249,253,123,190,169,253,3,0,145,245,3,0,170,246,3,1,170,0,0,128,82,205,3,0,148,8,28,0,83,72,7,0,52,162,3,0,148,19,28,0,83,179,67,0,57,52,0,128,82,215,0,0,208,232,162,75,185,72,7,0,53,40,0,128,82,232,162,11,185,59,4,0,148,8,28,0,83,168,2,0,52, + 146,4,0,148,61,3,0,148,70,3,0,148,168,0,0,240,1,161,19,145,169,0,0,240,32,65,19,145,111,13,0,148,128,1,0,53,59,4,0,148,8,28,0,83,40,1,0,52,168,0,0,240,1,33,19,145,169,0,0,240,32,1,19,145,82,13,0,148,72,0,128,82,232,162,11,185,20,0,128,82,224, + 3,19,42,153,3,0,148,244,2,0,53,117,4,0,148,243,3,0,170,104,2,64,249,168,1,0,180,69,3,0,148,8,28,0,83,72,1,0,52,104,2,64,249,226,3,22,170,65,0,128,82,224,3,21,170,239,3,8,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,202,0,0,208,72,69, + 75,185,9,5,0,17,73,69,11,185,32,0,128,82,2,0,0,20,0,0,128,82,253,123,194,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,224,0,128,82,91,4,0,148,0,0,62,212,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,190, + 169,253,3,0,145,20,28,0,83,201,0,0,208,40,69,75,185,31,1,0,113,236,0,0,84,0,0,128,82,253,123,194,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,8,5,0,81,40,69,11,185,76,3,0,148,19,28,0,83,179,67,0,57,213,0,0,208,168,162,75,185,31, + 9,0,113,1,2,0,84,5,4,0,148,242,2,0,148,89,4,0,148,191,162,11,185,224,3,19,42,88,3,0,148,1,0,128,82,224,3,20,42,127,3,0,148,8,28,0,83,31,1,0,113,243,7,159,26,9,4,0,148,224,3,19,42,228,255,255,23,224,0,128,82,47,4,0,148,0,0,62,212,0,0,0,0,127, + 35,3,213,253,123,191,169,253,3,0,145,33,2,0,52,63,4,0,113,128,1,0,84,63,8,0,113,224,0,0,84,63,12,0,113,96,0,0,84,32,0,128,82,12,0,0,20,18,4,0,148,2,0,0,20,254,3,0,148,0,28,0,83,7,0,0,20,225,3,2,170,114,255,255,151,4,0,0,20,95,0,0,241,224,7,159, + 26,190,255,255,151,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,189,169,245,91,1,169,247,19,0,249,253,123,189,169,253,3,0,145,246,3,0,170,244,3,1,42,180,23,0,185,245,3,2,170,181,219,1,169,244,0,0,53,200,0,0,208,8,69,75,185,31, + 1,0,113,108,0,0,84,0,0,128,82,83,0,0,20,136,6,0,81,31,5,0,113,136,0,0,144,23,33,3,145,8,3,0,84,232,2,64,249,136,0,0,181,41,0,128,82,169,19,0,185,12,0,0,20,226,3,21,170,225,3,20,42,224,3,22,170,239,3,8,170,177,0,0,240,49,82,66,249,32,2,63,214, + 224,1,63,214,243,3,0,42,179,19,0,185,83,7,0,52,226,3,21,170,225,3,20,42,224,3,22,170,188,255,255,151,243,3,0,42,179,19,0,185,115,6,0,52,226,3,21,170,225,3,20,42,224,3,22,170,76,56,0,148,243,3,0,42,179,19,0,185,159,6,0,113,96,10,64,122,65,2,0, + 84,226,3,21,170,1,0,128,82,224,3,22,170,67,56,0,148,191,2,0,241,224,7,159,26,125,255,255,151,232,2,64,249,40,1,0,180,226,3,21,170,1,0,128,82,224,3,22,170,239,3,8,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,159,2,0,113,132,26,67,122, + 193,2,0,84,226,3,21,170,225,3,20,42,224,3,22,170,152,255,255,151,243,3,0,42,179,19,0,185,243,1,0,52,232,2,64,249,104,0,0,181,51,0,128,82,10,0,0,20,226,3,21,170,225,3,20,42,224,3,22,170,239,3,8,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63, + 214,243,3,0,42,179,19,0,185,3,0,0,20,19,0,128,82,191,19,0,185,224,3,19,42,253,123,195,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,243,3,1,42,127, + 6,0,113,244,3,0,170,245,3,2,170,65,0,0,84,18,2,0,148,226,3,21,170,225,3,19,42,224,3,20,170,136,255,255,151,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,200,0,0, + 208,20,33,45,145,136,2,64,249,191,59,3,213,31,5,0,241,0,5,0,84,168,4,0,181,136,0,0,144,0,65,3,145,169,0,0,240,40,201,69,249,0,1,63,214,243,3,0,170,115,0,0,181,51,0,128,210,17,0,0,20,136,0,0,144,1,193,3,145,169,0,0,240,40,209,69,249,224,3,19, + 170,0,1,63,214,0,255,255,180,136,0,0,144,1,33,4,145,128,6,0,249,169,0,0,240,40,209,69,249,224,3,19,170,0,1,63,214,0,254,255,180,128,10,0,249,136,254,95,200,104,0,0,181,147,254,17,200,177,255,255,53,191,59,3,213,31,1,0,241,96,10,65,250,192,0, + 0,84,31,5,0,241,224,7,159,26,4,0,0,20,32,0,128,82,2,0,0,20,0,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,199,255,255,151,8,28,0,83,104,1,0,52,200,0,0,208,8,65,45,145,9,1,64,249,0, + 65,0,145,239,3,9,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,17,0,0,20,200,0,0,208,10,65,45,145,3,0,0,20,191,58,3,213,63,32,3,213,72,9,64,249,191,59,3,213,136,255,255,181,43,0,128,210,72,65,0,145,9,253,95,200,105,0,0,181,11,253,17, + 200,177,255,255,53,191,59,3,213,201,254,255,181,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,200,255,255,240,14,1,0,145,200,61,64,185,203,193,40,139,104,133,64,185,31,53,0,113,9,3,0,84,108,241,64,185,204,2,0,52,104,41,64,121,201,49,0,145, + 47,73,108,184,13,0,128,82,108,13,64,121,8,1,11,139,10,97,0,145,204,1,0,52,73,33,0,145,40,5,64,185,255,1,8,107,163,0,0,84,43,1,64,185,104,1,8,11,255,1,8,107,3,1,0,84,173,5,0,17,191,1,12,107,74,161,0,145,41,161,0,145,163,254,255,84,0,0,128,210, + 192,3,95,214,11,0,0,185,72,37,64,185,40,0,0,185,73,13,64,185,192,65,41,139,250,255,255,23,127,35,3,213,243,83,191,169,253,123,185,169,253,3,0,145,168,0,0,240,8,97,70,249,244,3,1,170,2,6,128,210,225,67,0,145,243,3,0,170,0,1,63,214,96,0,0,181, + 32,3,128,82,96,0,62,212,232,55,64,185,137,8,128,82,31,1,9,106,192,3,0,84,168,0,0,240,8,229,69,249,224,3,1,145,0,1,63,214,237,71,64,185,170,5,0,81,107,2,10,10,138,2,10,10,104,1,10,11,233,3,13,203,171,65,40,139,44,1,19,138,105,5,0,209,77,0,0,181, + 128,0,62,212,42,9,205,154,136,10,205,154,74,1,8,139,73,125,64,242,64,1,0,84,10,0,128,82,136,253,95,136,8,1,10,42,136,253,17,136,177,255,255,53,191,59,3,213,140,1,13,139,41,5,0,209,41,255,255,181,253,123,199,168,243,83,193,168,255,35,3,213,192, + 3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,190,169,253,3,0,145,246,3,0,42,244,3,1,170,225,83,0,145,224,67,0,145,157,255,255,151,243,3,0,170,147,0,0,181,136,0,128,82,136,2,0,185,24,0,0,20,201,0,0,208,40,113,75,185,245,19, + 64,185,72,1,0,53,40,0,128,82,40,113,11,185,232,23,64,185,104,0,248,55,32,3,128,82,96,0,62,212,225,3,21,170,224,3,19,170,177,255,255,151,168,0,0,240,8,93,70,249,227,3,20,170,226,3,22,42,225,3,21,170,224,3,19,170,0,1,63,214,96,0,0,53,32,3,128, + 82,96,0,62,212,253,123,194,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,136,0,0,144,8,177,65,185,136,3,96,54,80,255,255,151,200,0,0,208,10,161,45,145,72,1,64,185,9,5,0,17,73,1,0, + 185,63,5,0,113,129,0,0,84,65,17,0,145,128,0,128,82,196,255,255,151,15,255,255,151,8,28,0,83,104,1,0,52,200,0,0,208,8,97,45,145,9,1,64,249,0,33,0,145,239,3,9,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,4,0,0,20,191,59,3,213,200,0,0, + 208,31,177,5,249,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,190,169,253,3,0,145,136,0,0,144,8,177,65,185,104,3,96,54,44,255,255,151,200,0,0,208,10,161,45,145,72,1,64,185,9,5,0,81,73,1,0,185,137,0,0,53,64,5,64,185,225,67,0, + 145,161,255,255,151,236,254,255,151,8,28,0,83,104,1,0,52,200,0,0,208,8,97,45,145,9,1,64,249,0,33,0,145,239,3,9,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,4,0,0,20,191,59,3,213,200,0,0,208,31,177,5,249,253,123,194,168,255,35,3,213, + 192,3,95,214,0,0,0,0,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,184,169,253,3,0,145,245,3,0,170,248,3,1,170,174,255,255,151,16,228,0,79,200,255,255,240,13,1,0,145,170,34,64,41,185,30,64,185,245,227, + 3,169,240,23,128,61,255,127,6,169,160,65,40,139,168,38,65,41,255,115,0,185,224,39,0,249,182,65,40,139,171,65,41,139,168,38,66,41,172,65,40,139,8,9,128,82,232,51,0,185,186,65,41,139,170,1,0,55,232,195,0,145,232,11,0,249,187,255,255,151,168,0, + 0,240,8,53,70,249,227,67,0,145,34,0,128,82,1,0,128,82,160,22,0,24,0,1,63,214,0,0,128,210,169,0,0,20,8,3,11,203,212,2,64,249,23,253,67,147,139,89,119,248,104,253,127,211,10,1,0,82,234,83,0,185,170,0,0,52,168,9,0,145,1,65,43,139,225,47,0,249,4, + 0,0,20,104,61,0,18,232,91,0,185,225,47,64,249,155,0,0,144,104,51,65,249,19,0,128,210,168,1,0,180,225,195,0,145,0,0,128,82,239,3,8,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,243,3,0,170,19,16,0,181,225,47,64,249,224,39,64,249,104,51, + 65,249,116,7,0,181,104,1,0,180,225,195,0,145,32,0,128,82,239,3,8,170,177,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,244,3,0,170,180,4,0,181,224,39,64,249,168,0,0,208,8,25,70,249,2,0,128,82,1,0,128,210,0,1,63,214,244,3,0,170,180,3,0,181,168, + 0,0,208,8,189,69,249,0,1,63,214,104,0,0,240,8,53,65,249,224,115,0,185,72,1,0,180,225,195,0,145,96,0,128,82,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,244,3,0,170,180,1,0,181,232,195,0,145,232,15,0,249,109,255,255,151,168,0, + 0,208,8,53,70,249,227,99,0,145,34,0,128,82,1,0,128,82,0,13,0,24,0,1,63,214,224,55,64,249,91,0,0,20,200,254,95,200,212,254,17,200,209,255,255,53,191,59,3,213,31,1,20,235,161,0,0,84,168,0,0,208,8,133,69,249,224,3,20,170,0,1,63,214,104,51,65,249, + 225,47,64,249,244,51,0,249,72,1,0,180,225,195,0,145,64,0,128,82,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,225,47,64,249,243,3,0,170,179,6,0,181,168,22,64,185,40,2,0,52,168,30,64,185,232,1,0,52,136,62,64,185,10,170,136,82, + 137,194,40,139,40,1,64,185,31,1,10,107,33,1,0,84,40,9,64,185,31,1,25,107,193,0,0,84,40,25,64,249,159,2,8,235,97,0,0,84,83,91,119,248,115,4,0,181,168,0,0,208,8,209,69,249,224,3,20,170,0,1,63,214,243,3,0,170,179,3,0,181,168,0,0,208,8,189,69,249, + 0,1,63,214,104,0,0,240,8,53,65,249,224,115,0,185,72,1,0,180,225,195,0,145,128,0,128,82,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,243,3,0,170,179,1,0,181,232,195,0,145,232,19,0,249,33,255,255,151,168,0,0,208,8,53,70,249,227, + 131,0,145,34,0,128,82,1,0,128,82,160,3,0,24,0,1,63,214,245,254,255,151,243,55,64,249,19,3,0,249,104,51,65,249,72,1,0,180,225,195,0,145,255,115,0,185,160,0,128,82,244,79,6,169,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,11,255, + 255,151,224,3,19,170,253,123,200,168,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213,192,3,95,214,31,32,3,213,87,0,109,192,126,0,109,192,127,0,109,192,0,0,0,0,127,35,3,213,243,83,191,169,253,123,189,169,253, + 3,0,145,212,0,0,176,136,10,64,249,19,6,0,88,31,1,19,235,193,4,0,84,255,15,0,249,168,0,0,208,8,233,69,249,224,99,0,145,0,1,63,214,232,15,64,249,232,11,0,249,169,0,0,208,41,169,69,249,32,1,63,214,232,11,64,249,9,124,64,211,41,1,8,202,233,11,0, + 249,168,0,0,208,8,165,69,249,0,1,63,214,232,11,64,249,9,124,64,211,224,131,0,145,41,1,8,202,233,11,0,249,168,0,0,208,8,49,70,249,0,1,63,214,233,35,64,185,235,67,0,145,232,19,64,249,10,129,9,202,233,11,64,249,72,1,9,202,8,1,11,202,9,189,64,146, + 63,1,19,235,168,1,0,88,8,1,137,154,136,10,0,249,233,3,40,170,200,0,0,176,9,5,0,249,253,123,195,168,243,83,193,168,255,35,3,213,192,3,95,214,31,32,3,213,50,162,223,45,153,43,0,0,51,162,223,45,153,43,0,0,200,0,0,176,0,1,46,145,169,0,0,208,40,5, + 70,249,0,1,31,214,0,0,0,0,200,0,0,176,0,1,46,145,196,4,0,20,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,13,0,0,148,137,4,128,210,8,0,64,249,8,1,9,170,8,0,0,249,12,0,0,148,8,0,64,249,9,1,127,178,9,0,0,249,253,123,193,168,255,35,3,213,192, + 3,95,214,0,0,0,0,200,0,0,176,0,65,46,145,192,3,95,214,0,0,0,0,200,0,0,176,0,97,46,145,192,3,95,214,0,0,0,0,127,35,3,213,253,123,190,169,253,3,0,145,170,73,139,82,200,255,255,208,9,1,0,145,40,1,64,121,31,1,10,107,225,4,0,84,40,61,64,185,43,193, + 40,139,10,170,136,82,104,1,64,185,31,1,10,107,33,4,0,84,104,49,64,121,31,45,8,113,193,3,0,84,12,0,9,203,104,41,64,121,8,1,11,139,10,97,0,145,105,13,64,121,8,5,128,210,43,41,8,155,170,11,0,249,95,1,11,235,64,1,0,84,73,13,64,185,159,65,41,235, + 163,0,0,84,72,9,64,185,9,1,9,11,159,65,41,235,131,0,0,84,74,161,0,145,245,255,255,23,10,0,128,210,106,0,0,181,0,0,128,82,10,0,0,20,72,37,64,185,104,0,248,54,0,0,128,82,6,0,0,20,32,0,128,82,4,0,0,20,0,0,128,82,2,0,0,20,0,0,128,82,253,123,194, + 168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,49,1,0,148,192,1,0,52,232,3,18,170,9,5,64,249,200,0,0,176,10,161,46,145,3,0,0,20,63,1,8,235,96,1,0,84,72,253,95,200,104,0,0,181,73,253,17,200,177,255,255,53,191,59, + 3,213,40,255,255,181,0,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,32,0,128,82,252,255,255,23,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,19,28,0,83,23,1,0,148,192,0,0,52,179,0,0,53,200,0,0,176,8,161,46,145,31,253,159,200,191, + 59,3,213,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,202,0,0,176,72,145,110,57,31,0,0,113,41,0,128,82,41,1,136,26,73,145,46,57,255,0,0,148,90,4,0,148,8,28,0,83,104,0,0,53,0,0,128,82,8,0,0,20, + 193,5,0,148,8,28,0,83,136,0,0,53,0,0,128,82,99,4,0,148,249,255,255,23,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,200,0,0,176,8,145,110,57,19,28,0,83,41,28,0,83,72,0,0, + 52,169,0,0,53,224,3,19,42,183,5,0,148,224,3,19,42,79,4,0,148,32,0,128,82,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,212,0,0,176,136,130,111,57,243,3,0,42,104,3,0,53, + 127,6,0,113,200,3,0,84,212,0,0,148,128,1,0,52,115,1,0,53,200,0,0,176,0,193,46,145,13,8,0,148,160,0,0,53,200,0,0,176,0,33,47,145,9,8,0,148,128,1,0,52,0,0,128,82,13,0,0,20,200,0,0,176,8,193,46,145,201,0,0,176,41,33,47,145,10,0,128,146,10,41,0, + 169,42,41,0,169,10,9,0,249,42,9,0,249,40,0,128,82,136,130,47,57,32,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,160,0,128,82,124,0,0,148,0,0,62,212,127,35,3,213,243,83,189,169,245,91,1,169,247,99,2,169,253,123,191,169,253, + 3,0,145,246,3,0,170,243,3,1,42,247,3,2,170,248,3,3,170,244,3,4,42,245,3,5,170,168,0,0,148,31,0,0,113,96,10,65,122,33,1,0,84,226,3,23,170,1,0,128,82,224,3,22,170,239,3,24,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,225,3,21,170,224, + 3,20,42,92,9,0,148,253,123,193,168,247,99,66,169,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,0,0,128,82,176,255,255,151,8,28,0,83,31,1,0,113,224,7,159,26,253,123,193,168,255,35,3,213, + 192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,131,0,0,148,96,0,0,52,125,0,0,148,7,0,0,20,125,0,0,148,160,6,0,148,96,0,0,52,0,0,128,82,3,0,0,20,62,8,0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3, + 213,253,123,191,169,253,3,0,145,113,0,0,148,160,0,0,52,200,0,0,176,0,193,46,145,185,7,0,148,4,0,0,20,153,5,0,148,64,0,0,53,159,5,0,148,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,0,0,128,82,68,5, + 0,148,213,3,0,148,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,213,3,0,148,8,28,0,83,104,0,0,53,0,0,128,82,7,0,0,20,64,5,0,148,8,28,0,83,104,0,0,53,215,3,0,148,250,255,255,23,32,0,128,82,253,123, + 193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,61,5,0,148,204,3,0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,200,0,0,176,0,161,47,145,192,3,95,214,0,0,0,0,96,0,62,212,192,3,95,214,127, + 35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,168,0,0,240,8,161,10,145,169,0,0,240,52,193,10,145,19,33,0,145,8,33,0,145,31,1,20,235,66,1,0,84,104,134,64,248,200,0,0,180,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,127, + 2,20,235,3,255,255,84,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,168,0,0,240,8,225,10,145,169,0,0,240,52,1,11,145,19,33,0,145,8,33,0,145,31,1,20,235,66,1,0,84,104, + 134,64,248,200,0,0,180,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,127,2,20,235,3,255,255,84,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,128,82,192,3,95,214,32,0,128,82,192,3,95,214,200,0,0,176,8,241, + 75,185,31,1,0,113,224,7,159,26,192,3,95,214,0,0,0,0,192,3,95,214,31,32,3,213,31,32,3,213,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,188,169,253,3,0,145,245,3,0,170,243,3,1,170,244,4,0,88,179,1,0,180,104,2,64,185,104,1,32,54,169, + 2,64,249,42,129,95,248,32,33,0,209,72,33,64,249,83,25,64,249,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,168,0,0,208,8,65,70,249,225,67,0,145,224,3,19,170,0,1,63,214,224,11,0,249,179,0,0,180,104,2,64,185,72,0,24,55,64,0,0,181, + 52,2,0,88,227,99,0,145,243,131,2,169,130,0,128,82,244,215,1,169,33,0,128,82,160,1,0,24,168,0,0,208,8,53,70,249,0,1,63,214,253,123,196,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,32,5,147,25,0,0,0,0,0,64,153,1,0,0,0,0,99,115,109, + 224,0,0,0,0,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,190,169,253,3,0,145,246,3,3,170,200,98,64,169,247,3,0,170,212,30,64,249,250,3,1,170,10,1,24,203,136,2,64,185,104,0,248,54,8,121,64,146,20,1, + 24,139,201,50,65,57,72,17,0,209,211,74,64,185,63,1,0,113,89,1,136,154,232,6,64,185,201,12,128,82,31,1,9,106,65,8,0,84,247,11,1,169,136,2,64,185,127,2,8,107,162,14,0,84,123,0,0,240,149,82,51,139,168,6,64,185,63,67,40,235,67,6,0,84,168,10,64,185, + 63,67,40,235,226,5,0,84,168,18,64,185,168,5,0,52,168,14,64,185,31,5,0,113,32,1,0,84,195,42,64,249,2,67,40,139,225,3,26,170,224,67,0,145,224,233,255,151,32,5,248,55,31,0,0,113,77,4,0,84,232,2,64,185,233,12,0,24,31,1,9,107,193,1,0,84,104,135,65, + 249,136,1,0,180,96,35,12,145,235,12,0,148,32,1,0,52,104,135,65,249,33,0,128,82,224,3,23,170,239,3,8,170,177,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,168,18,64,185,34,0,128,82,225,3,26,170,0,67,40,139,191,233,255,151,168,18,64,185,226,3, + 23,170,227,2,64,185,224,3,26,170,197,34,64,249,196,22,64,249,1,67,40,139,168,0,0,208,8,69,70,249,0,1,63,214,187,233,255,151,136,2,64,185,115,6,0,17,127,2,8,107,98,7,0,84,199,255,255,23,0,0,128,82,57,0,0,20,200,18,64,249,21,1,24,203,50,0,0,20, + 140,82,51,139,136,5,64,185,63,67,40,235,163,5,0,84,136,9,64,185,63,67,40,235,66,5,0,84,232,6,64,185,7,1,27,114,32,3,0,84,11,0,128,82,170,2,0,52,142,82,51,139,143,82,51,139,141,82,43,139,168,5,64,185,191,66,40,235,131,1,0,84,168,9,64,185,191, + 66,40,235,34,1,0,84,201,17,64,185,168,17,64,185,31,1,9,107,161,0,0,84,233,13,64,185,168,13,64,185,31,1,9,107,128,0,0,84,107,5,0,17,127,1,10,107,227,253,255,84,127,1,10,107,97,2,0,84,136,17,64,185,168,0,0,52,191,66,40,235,97,1,0,84,199,1,0,53, + 9,0,0,20,104,6,0,17,195,42,64,249,200,74,0,185,137,13,64,185,225,3,26,170,32,0,128,82,2,67,41,139,151,233,255,151,115,6,0,17,138,2,64,185,127,2,10,107,163,249,255,84,32,0,128,82,253,123,194,168,251,35,64,249,249,107,67,169,247,99,66,169,245, + 91,65,169,243,83,197,168,255,35,3,213,192,3,95,214,99,115,109,224,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,19,0,249,253,123,191,169,253,3,0,145,246,3,0,170,212,14,64,185,245,3,1,42,20,2,0,52,151,2,128,210,147,6,0,81,244,3,19,42,215, + 12,0,148,201,18,64,185,8,48,64,249,106,34,23,155,64,193,41,139,8,4,64,185,191,2,8,107,141,0,0,84,8,8,64,185,191,2,8,107,109,0,0,84,116,254,255,53,0,0,128,210,253,123,193,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214, + 127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,1,170,225,3,0,170,224,3,19,170,47,13,0,148,225,3,0,42,224,3,19,170,214,255,255,151,31,0,0,241,224,7,159,26,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213, + 243,83,190,169,245,11,0,249,253,123,190,169,253,3,0,145,227,67,0,145,244,3,1,170,243,3,2,170,22,0,0,148,245,3,0,170,224,3,19,170,225,3,20,170,24,13,0,148,225,3,0,42,224,3,19,170,191,255,255,151,96,0,0,181,3,0,128,18,2,0,0,20,3,4,64,185,226,3, + 19,170,225,3,20,170,224,3,21,170,95,13,0,148,253,123,194,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,107,3,169,253,123,190,169,253,3,0,145,247,3,2,170,243,3,0,170, + 245,14,64,185,224,3,23,170,248,3,1,170,244,3,3,170,249,12,0,148,104,2,64,249,246,3,0,42,136,2,0,249,85,5,0,52,153,2,128,210,186,0,0,208,168,6,0,81,233,18,64,185,10,125,25,155,245,3,8,42,8,7,64,249,75,193,41,139,115,1,8,139,105,6,64,185,223,2, + 9,107,45,3,0,84,104,10,64,185,223,2,8,107,204,2,0,84,0,3,64,249,2,0,128,210,72,63,70,249,225,67,0,145,0,1,63,214,233,11,64,249,11,0,128,82,108,162,65,41,13,0,64,185,46,193,40,139,44,1,0,52,104,125,64,211,9,57,25,155,42,13,128,185,95,65,45,235, + 128,0,0,84,107,5,0,17,127,1,12,107,35,255,255,84,127,1,12,107,99,0,0,84,181,0,0,52,221,255,255,23,136,2,64,249,9,1,64,249,137,2,0,249,224,3,20,170,253,123,194,168,249,107,67,169,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95, + 214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,7,233,255,151,255,67,2,209,104,0,0,240,8,193,9,145,235,95,64,249,10,1,2,145,233,3,0,145,16,69,193,172,48,69,129,172,31,1,10,235,161,255,255,84,0,0,64,249,18,1,192,61,8,9,64,249,50,1,128,61, + 40,9,0,249,42,0,0,144,73,129,23,145,233,15,2,169,3,0,128,210,233,3,67,57,200,124,64,147,226,23,4,169,101,33,64,249,226,3,0,145,228,35,3,169,100,21,64,249,200,1,0,88,225,39,5,169,97,1,64,249,9,0,128,146,232,51,0,249,233,59,0,249,168,0,0,208,8, + 69,70,249,0,1,63,214,255,67,2,145,234,232,255,151,253,123,193,168,255,35,3,213,192,3,95,214,32,5,147,25,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,99,2,169,253,123,189,169,253,3,0,145,243,3,4,170,244,3,3,170,117,14,64,185,246,3,0,170, + 248,3,1,170,225,3,20,170,224,3,19,170,247,3,2,42,134,12,0,148,213,8,0,52,143,6,64,249,12,0,128,18,103,18,64,185,6,0,128,18,235,3,21,42,133,2,128,210,109,5,0,81,169,125,5,155,42,193,39,139,78,1,15,139,200,5,64,185,31,0,8,107,141,0,0,84,200,9, + 64,185,31,0,8,107,109,0,0,84,235,3,13,42,171,254,255,53,171,0,0,52,104,5,0,81,10,61,5,155,77,193,39,139,2,0,0,20,13,0,128,210,11,0,128,82,104,125,64,211,9,61,5,155,42,193,39,139,109,1,0,180,169,5,64,185,72,1,64,185,31,1,9,107,45,2,0,84,169,9, + 64,185,78,17,0,145,72,5,64,185,31,1,9,107,109,0,0,84,11,0,0,20,78,17,0,145,72,1,64,185,255,2,8,107,235,0,0,84,200,1,64,185,255,2,8,107,140,0,0,84,159,5,0,49,140,17,139,26,230,3,11,42,107,5,0,17,127,1,21,107,195,252,255,84,159,5,0,49,248,11,0, + 249,136,17,159,26,248,19,0,249,159,5,0,49,232,27,0,185,232,7,134,26,232,43,0,185,240,199,64,173,224,3,22,170,208,70,0,173,253,123,195,168,247,99,66,169,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,141,11,0,148,0,0,62,212,0,0,0,0,127, + 35,3,213,253,123,191,169,253,3,0,145,199,11,0,148,0,48,64,249,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,189,11,0,148,19,48,0,249,253,123,193,168,243,7,65,248,255,35,3,213,192, + 3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,179,11,0,148,0,52,64,249,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,169,11,0,148,19,52,0,249,253,123,193,168,243,7,65, + 248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,97,2,0,249,156,11,0,148,8,44,64,249,127,2,8,235,130,0,0,84,152,11,0,148,8,44,64,249,2,0,0,20,8,0,128,210,104,6,0,249,147,11,0,148,19,44, + 0,249,224,3,19,170,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,244,3,0,170,135,11,0,148,8,44,64,249,159,2,8,235,1,2,0,84,131,11,0,148,8,44,64,249,168,1,0,180,19,5,64,249,159, + 2,8,235,128,0,0,84,232,3,19,170,8,1,0,180,251,255,255,23,122,11,0,148,19,44,0,249,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,52,11,0,148,0,0,62,212,127,35,3,213,243,83,190,169,245,91,1,169,253,123,190,169,253,3,0,145,244,3,3,170, + 225,11,0,249,147,6,64,249,246,3,0,170,245,3,2,170,104,11,0,148,19,48,0,249,211,30,64,249,101,11,0,148,19,52,0,249,99,11,0,148,7,0,128,82,6,0,128,210,136,30,64,249,5,0,128,82,9,48,64,249,227,3,20,170,226,3,21,170,225,67,0,145,10,1,64,185,224, + 3,22,170,36,65,42,139,207,13,0,148,253,123,194,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,186,169,253,3,0,145,243,3,0,170,161,35,0,249,179,15,2,169,164,11,3,169,191,19,0,185,179,139, + 4,169,70,11,0,148,8,8,64,249,161,35,1,145,96,2,64,185,239,3,8,170,177,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,177,67,0,145,63,254,159,136,1,0,0,20,160,19,64,185,253,123,198,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,0, + 0,0,0,127,35,3,213,243,15,31,248,253,123,189,169,253,3,0,145,161,67,0,57,96,4,0,180,201,4,0,24,8,0,64,185,31,1,9,107,225,3,0,84,8,24,64,185,31,17,0,113,129,3,0,84,8,32,64,185,233,3,0,24,8,1,9,75,31,9,0,113,232,2,0,84,8,24,64,249,168,2,0,180, + 9,5,64,185,233,0,0,52,8,28,64,249,1,193,41,139,0,20,64,249,23,0,0,148,14,0,0,20,13,0,0,20,8,1,64,185,104,1,32,54,9,20,64,249,32,1,64,249,0,1,0,180,8,0,64,249,8,9,64,249,239,3,8,170,177,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,253,123,195, + 168,243,7,65,248,255,35,3,213,192,3,95,214,99,115,109,224,32,5,147,25,48,10,0,20,0,0,0,0,32,0,31,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,251,10,0,148,9,44,64,249,201,0,0,180,40,1,64,249,31,1,19,235,0,1, + 0,84,41,5,64,249,137,255,255,181,32,0,128,82,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,128,82,251,255,255,23,40,44,64,41,234,3,0,170,64,193,40,139,203,0,248,55,41,8,64,185,72,201,107,248,10,201,169,184,73,193,43,139,32,1,0,139, + 192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,116,2,64,249,9,4,0,24,136,2,64,185,31,1,9,107,0,1,0,84,169,3,0,24,31,1,9,107,160,0,0,84,105,3,0,24,31,1,9,107,224,1,0,84,9,0,0,20,209,10,0,148,8,48,64,185,31,1, + 0,113,173,0,0,84,205,10,0,148,8,48,64,185,9,5,0,81,9,48,0,185,0,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,196,10,0,148,20,16,0,249,115,6,64,249,193,10,0,148,19,20,0,249,235,9,0,148,0,0,62,212,31,32,3,213,82,67,67,224, + 77,79,67,224,99,115,109,224,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,244,3,0,170,136,34,64,57,245,3,1,170,8,3,0,52,137,2,64,249,201,2,0,180,40,1,192,57,234,3,9,170,104,0,0,52,72,29,192,56,232,255,255,53,86, + 1,9,203,192,6,0,145,206,9,0,148,243,3,0,170,51,1,0,180,130,2,64,249,193,6,0,145,7,17,0,148,232,3,19,170,41,0,128,82,168,2,0,249,169,34,0,57,19,0,128,210,224,3,19,170,188,9,0,148,4,0,0,20,136,2,64,249,191,34,0,57,168,2,0,249,253,123,193,168,245, + 91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,104,34,64,57,104,0,0,52,96,2,64,249,170,9,0,148,127,34,0,57,127,2,0,249,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95, + 214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,168,0,0,176,8,9,70,249,0,1,63,214,160,0,0,180,19,0,64,249,153,9,0,148,224,3,19,170,179,255,255,181,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,31,0,1,235,97,0,0,84, + 0,0,128,82,4,0,0,20,33,36,0,145,0,36,0,145,192,16,0,20,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,237,16,0,148,8,28,0,83,104,0,0,53,0,0,128,82,7,0,0,20,48,10,0,148,8,28,0,83,104,0,0,53,7,17,0,148,250,255,255,23,32,0,128,82,253,123, + 193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,8,28,0,83,104,0,0,53,63,10,0,148,250,16,0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,53,10,0,148, + 32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,73,10,0,148,31,0,0,241,224,7,159,26,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,0,0,128,210,128,10, + 0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,9,0,0,148,192,0,0,180,239,3,0,170,177,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,228,9,0,148,0,0,62,212,200,0,0,144,0,77,71,249,191, + 59,3,213,192,3,95,214,40,60,0,83,15,0,128,210,8,6,0,53,8,0,64,121,168,20,0,52,8,236,124,146,16,1,192,61,12,65,0,145,10,12,0,18,13,0,128,146,16,154,96,78,17,10,96,78,43,62,24,78,170,2,24,55,72,113,125,211,41,2,102,158,168,37,200,154,42,1,8,234, + 96,0,0,84,73,17,192,218,3,0,0,20,104,17,192,218,9,1,1,17,233,2,56,54,144,5,193,60,17,154,96,78,48,58,176,110,8,2,102,158,136,255,255,180,49,10,96,78,40,2,102,158,136,1,0,180,9,17,192,218,13,0,0,20,72,33,0,81,9,113,125,211,169,37,201,154,40,1, + 11,234,64,254,255,84,8,17,192,218,10,1,1,17,138,13,74,139,6,0,0,20,40,62,24,78,9,17,192,218,41,1,1,17,40,125,64,211,138,13,72,139,64,65,0,209,120,0,0,20,54,12,2,78,12,236,124,146,144,1,192,61,9,12,0,18,6,14,128,82,10,0,128,146,18,154,96,78,17, + 142,118,110,82,10,96,78,51,10,96,78,71,62,24,78,109,62,24,78,137,1,24,55,40,113,125,211,73,37,200,154,104,2,102,158,11,1,9,138,72,2,102,158,14,1,9,234,97,0,0,84,171,1,0,181,10,0,0,20,202,17,192,218,12,0,0,20,40,33,0,81,9,113,125,211,74,37,201, + 154,77,1,13,138,71,1,7,138,11,0,128,210,14,0,128,210,71,0,0,181,205,2,0,180,232,16,192,218,10,1,1,17,107,0,0,180,105,17,192,218,3,0,0,20,168,17,192,218,9,1,1,17,95,1,9,107,98,0,0,84,0,0,128,210,76,0,0,20,45,2,102,158,43,62,24,78,106,6,56,54, + 107,0,0,180,105,17,192,218,3,0,0,20,168,17,192,218,9,1,1,17,200,0,9,75,143,13,72,139,144,13,193,60,19,142,118,110,20,154,96,78,112,30,180,78,17,58,176,110,40,2,102,158,72,255,255,180,114,10,96,78,149,10,96,78,75,2,102,158,174,2,102,158,77,62, + 24,78,110,0,0,180,202,17,192,218,4,0,0,20,168,62,24,78,9,17,192,218,42,1,1,17,107,0,0,180,105,17,192,218,3,0,0,20,168,17,192,218,9,1,1,17,95,1,9,107,35,2,0,84,109,2,102,158,107,62,24,78,202,251,63,55,41,0,128,210,14,2,0,181,72,1,1,81,40,33,200, + 154,9,5,0,209,42,1,11,234,96,0,0,84,73,17,192,218,3,0,0,20,168,17,192,218,9,1,1,17,201,0,9,75,23,0,0,20,224,3,15,170,23,0,0,20,41,0,128,210,14,1,0,180,40,33,202,154,9,5,0,209,42,1,13,138,75,17,192,218,9,6,128,82,41,1,11,75,12,0,0,20,72,1,1,81, + 40,33,200,154,9,5,0,209,42,1,11,234,96,0,0,84,73,17,192,218,3,0,0,20,168,17,192,218,9,1,1,17,8,14,128,82,9,1,9,75,40,125,64,211,128,13,72,139,192,3,95,214,0,0,0,0,0,0,0,0,200,0,0,144,8,1,22,145,201,0,0,176,40,141,3,249,32,0,128,82,192,3,95,214, + 0,0,0,0,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,200,0,0,144,0,161,52,145,227,2,0,148,200,0,0,144,0,1,53,145,224,2,0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,32,0,128,82,192,3,95,214,31,32,3,213, + 0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,91,3,0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,200,0,0,144,19,9,64,249,224,3,19,170,225,23,0,148,224,3,19,170,155,0,0,148, + 224,3,19,170,83,24,0,148,224,3,19,170,49,25,0,148,224,3,19,170,185,0,0,148,32,0,128,82,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,0,0,128,82,220,254,255,151,0,28,0, + 83,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,212,0,0,176,128,110,67,249,234,230,255,151,0,1,0,53,128,110,67,249,200,0,0,144,19,193,0,145,31,0,19,235,96,0,0,84,73, + 23,0,148,147,110,3,249,32,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,211,0,0,176,96,154,67,249,60,23,0,148,127,154,3,249,211,0,0,176,96,158,67,249,56,23,0,148,127, + 158,3,249,211,0,0,176,96,94,67,249,52,23,0,148,127,94,3,249,211,0,0,176,96,98,67,249,48,23,0,148,127,98,3,249,32,0,128,82,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,104,0,0,208,0,65, + 12,145,1,0,4,145,60,23,0,148,0,28,0,83,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,8,28,0,83,232,0,0,52,200,0,0,176,8,149,67,249,72,0,0,180,220,24,0,148,32,0,128,82,6,0,0,20,104,0,0,208,0,65,12, + 145,1,0,4,145,90,23,0,148,0,28,0,83,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,0,28,0,83,138,17,0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169, + 253,3,0,145,255,17,0,148,31,0,0,241,224,7,159,26,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,49,18,0,148,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123, + 191,169,253,3,0,145,243,3,0,170,21,0,0,148,232,3,0,170,72,1,0,180,224,3,19,170,239,3,8,170,177,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,224,7,159,26,2,0,0,20,0,0,128,82,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,200, + 0,0,144,0,1,6,249,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,0,0,128,82,17,17,0,148,200,0,0,144,9,9,64,249,42,21,0,18,203,0,0,144,104,1,70,249,41,1,8,202,51,45,202,154,0,0,128,82,18,17,0,148,224,3,19,170,253, + 123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,200,0,0,144,0,17,76,185,191,59,3,213,192,3,95,214,2,0,128,82,65,0,128,82,94,0,0,20,0,0,0,0,34,0,128,82,1,0,128,82,0,0,128,82,89,0,0,20,200,0,0,144,0,5,6,249,192,3,95,214,0,0,0,0,127,35,3,213, + 243,15,31,248,253,123,190,169,253,3,0,145,104,0,0,208,1,65,16,145,48,0,128,146,169,0,0,176,40,33,46,145,191,67,1,169,9,253,223,200,243,3,0,42,162,67,0,145,0,0,128,82,32,1,63,214,0,2,0,52,104,0,0,208,1,161,16,145,168,0,0,176,8,129,46,145,160, + 11,64,249,9,253,223,200,32,1,63,214,232,3,0,170,232,0,0,180,224,3,19,42,239,3,8,170,177,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,160,11,64,249,160,0,0,180,168,0,0,176,8,33,44,145,9,253,223,200,32,1,63,214,253,123,194,168,243,7,65,248,255, + 35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,187,25,0,148,31,4,0,113,192,0,0,84,172,25,0,148,8,28,0,83,31,1,0,113,224,23,159,26,2,0,0,20,0,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243, + 15,31,248,253,123,191,169,253,3,0,145,243,3,0,42,235,255,255,151,8,28,0,83,72,1,0,52,168,0,0,176,8,1,45,145,9,253,223,200,32,1,63,214,168,0,0,176,8,193,50,145,9,253,223,200,225,3,19,42,32,1,63,214,224,3,19,42,180,255,255,151,168,0,0,176,8,225, + 42,145,9,253,223,200,224,3,19,42,32,1,63,214,0,0,62,212,0,0,0,0,127,35,3,213,243,15,31,248,253,123,187,169,253,3,0,145,48,0,128,146,176,35,0,249,243,3,0,42,162,135,2,41,98,3,0,53,168,0,0,176,8,65,46,145,9,253,223,200,0,0,128,210,32,1,63,214, + 160,2,0,180,8,0,64,121,169,73,139,82,31,1,9,107,33,2,0,84,8,60,64,185,10,170,136,82,9,192,40,139,40,1,64,185,31,1,10,107,97,1,0,84,40,49,64,121,31,45,8,113,1,1,0,84,40,133,64,185,31,57,0,113,169,0,0,84,40,249,64,185,104,0,0,52,224,3,19,42,138, + 255,255,151,168,99,0,145,191,67,0,57,168,23,0,249,169,83,0,145,168,67,0,145,169,35,3,169,72,0,128,82,163,115,0,145,168,163,3,41,162,163,0,145,161,131,0,145,160,71,0,145,79,0,0,148,31,32,3,213,168,23,64,185,168,0,0,52,253,123,197,168,243,7,65, + 248,255,35,3,213,192,3,95,214,224,3,19,42,174,255,255,151,0,0,62,212,127,35,3,213,243,83,191,169,253,123,189,169,253,3,0,145,243,3,0,170,180,0,0,240,136,82,112,57,200,6,0,53,33,0,128,82,168,0,0,240,0,65,48,145,159,229,255,151,104,2,64,249,9, + 1,64,185,201,2,0,53,168,0,0,240,10,9,64,249,73,21,0,18,170,15,0,249,168,0,0,240,8,5,70,249,31,1,10,235,96,1,0,84,72,1,8,202,9,45,201,154,2,0,128,210,1,0,128,82,0,0,128,210,239,3,9,170,177,0,0,144,49,82,66,249,32,2,63,214,224,1,63,214,168,0,0, + 240,0,161,52,145,5,0,0,20,63,5,0,113,129,0,0,84,168,0,0,240,0,1,53,145,88,1,0,148,104,2,64,249,9,1,64,185,201,0,0,53,168,0,0,144,1,129,20,145,169,0,0,144,32,1,20,145,156,2,0,148,168,0,0,144,1,193,20,145,169,0,0,144,32,161,20,145,151,2,0,148, + 104,6,64,249,9,1,64,185,169,0,0,53,41,0,128,82,137,82,48,57,104,10,64,249,9,1,0,57,253,123,195,168,243,83,193,168,255,35,3,213,192,3,95,214,223,6,0,148,0,0,62,212,0,0,0,0,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,244,3,2,170,243, + 3,3,170,179,11,0,249,32,0,64,185,24,16,0,148,224,3,20,170,178,255,255,151,96,2,64,185,30,16,0,148,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,189,169,253,3,0,145,245,3,0,42, + 117,11,0,52,168,6,0,81,31,5,0,113,233,0,0,84,10,25,0,148,200,2,128,82,8,0,0,185,33,22,0,148,212,2,128,82,83,0,0,20,40,19,0,148,179,0,0,240,97,130,48,145,130,32,128,82,0,0,128,210,115,28,0,148,104,130,48,145,201,0,0,144,40,85,3,249,201,0,0,144, + 52,77,67,249,116,0,0,180,136,2,192,57,72,0,0,53,116,130,48,145,228,131,0,145,255,255,1,169,227,99,0,145,2,0,128,210,1,0,128,210,224,3,20,170,97,0,0,148,246,135,65,169,34,0,128,210,224,3,22,170,63,0,0,148,243,3,0,170,19,1,0,181,232,24,0,148,136, + 1,128,82,8,0,0,185,0,0,128,210,154,21,0,148,148,1,128,82,48,0,0,20,98,14,22,139,228,131,0,145,227,99,0,145,225,3,19,170,224,3,20,170,78,0,0,148,191,6,0,113,33,1,0,84,232,15,64,249,203,0,0,144,115,93,3,249,0,0,128,210,8,5,0,81,202,0,0,144,72, + 177,6,185,30,0,0,20,225,67,0,145,255,11,0,249,224,3,19,170,86,25,0,148,244,3,0,42,244,0,0,52,224,11,64,249,128,21,0,148,224,3,19,170,255,11,0,249,125,21,0,148,20,0,0,20,234,11,64,249,9,0,128,210,72,1,64,249,235,3,10,170,136,0,0,180,104,141,64, + 248,41,5,0,145,200,255,255,181,203,0,0,144,105,177,6,185,255,11,0,249,200,0,0,144,10,93,3,249,0,0,128,210,109,21,0,148,255,11,0,249,224,3,19,170,106,21,0,148,20,0,128,82,224,3,20,42,253,123,195,168,245,91,65,169,243,83,194,168,255,35,3,213,192, + 3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,8,0,252,146,31,0,8,235,98,2,0,84,8,0,128,146,66,0,0,181,128,0,62,212,8,9,194,154,63,0,8,235,162,1,0,84,41,124,2,155,232,15,32,170,31,1,9,235,41,1,0,84,32,13,0,139,33,0,128,210,243, + 24,0,148,243,3,0,170,0,0,128,210,76,21,0,148,224,3,19,170,2,0,0,20,0,0,128,210,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,107,3,169,253,123,191,169,253,3,0,145,249,3,4,170, + 250,3,3,170,63,3,0,249,40,0,128,210,72,3,0,249,244,3,0,170,246,3,1,170,243,3,2,170,118,0,0,180,211,2,0,249,214,34,0,145,23,0,128,82,248,3,20,170,136,22,192,56,31,137,0,113,161,0,0,84,255,2,0,113,247,23,159,26,85,4,128,82,21,0,0,20,40,3,64,249, + 9,5,0,145,41,3,0,249,147,0,0,180,136,242,223,56,104,2,0,57,115,6,0,145,149,242,223,56,224,3,21,42,112,28,0,148,32,1,0,52,40,3,64,249,9,5,0,145,41,3,0,249,147,0,0,180,136,2,192,57,104,2,0,57,115,6,0,145,20,11,0,145,21,1,0,52,151,252,255,53,191, + 130,0,113,164,26,73,122,33,252,255,84,147,0,0,180,127,242,31,56,2,0,0,20,148,6,0,209,21,0,128,82,151,11,128,82,136,2,192,57,40,1,0,52,31,129,0,113,96,0,0,84,31,37,0,113,161,0,0,84,136,6,0,145,244,3,8,170,8,1,192,57,249,255,255,23,200,8,0,52, + 118,0,0,180,211,2,0,249,214,34,0,145,72,3,64,249,9,5,0,145,73,3,0,249,136,2,192,57,43,0,128,82,10,0,128,82,3,0,0,20,136,30,192,56,74,5,0,17,31,113,1,113,160,255,255,84,31,137,0,113,129,1,0,84,74,1,0,55,213,0,0,52,136,6,192,57,31,137,0,113,97, + 0,0,84,148,6,0,145,4,0,0,20,191,2,0,113,245,23,159,26,11,0,128,82,74,125,1,83,42,1,0,52,74,5,0,81,115,0,0,180,119,2,0,57,115,6,0,145,40,3,64,249,9,5,0,145,41,3,0,249,42,255,255,53,136,2,192,57,40,3,0,52,149,0,0,53,31,129,0,113,4,25,73,122,160, + 2,0,84,75,2,0,52,115,0,0,180,104,2,0,57,115,6,0,145,128,2,192,57,33,28,0,148,32,1,0,52,40,3,64,249,148,6,0,145,9,5,0,145,41,3,0,249,147,0,0,180,136,2,192,57,104,2,0,57,115,6,0,145,40,3,64,249,9,5,0,145,41,3,0,249,148,6,0,145,201,255,255,23,115, + 0,0,180,127,2,0,57,115,6,0,145,40,3,64,249,9,5,0,145,41,3,0,249,177,255,255,23,86,0,0,180,223,2,0,249,72,3,64,249,9,5,0,145,73,3,0,249,253,123,193,168,249,107,67,169,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,0,0,0, + 0,96,0,0,181,0,0,128,18,10,0,0,20,9,8,64,249,8,0,64,249,31,1,9,235,161,0,0,84,168,0,0,240,8,9,64,249,8,32,0,169,8,8,0,249,0,0,128,82,192,3,95,214,0,0,0,0,127,35,3,213,253,123,188,169,253,3,0,145,48,0,128,146,168,131,0,145,168,195,2,169,160,19, + 0,249,72,0,128,82,163,83,0,145,168,163,2,41,162,163,0,145,161,99,0,145,160,67,0,145,87,0,0,148,31,32,3,213,253,123,196,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,27,0,249,253,123,191,169,253,3,0,145, + 245,3,0,170,168,2,64,249,10,1,64,249,106,0,0,181,0,0,128,18,63,0,0,20,185,0,0,240,43,11,64,249,73,1,64,249,104,1,9,202,109,21,0,18,20,45,205,154,72,5,64,249,9,1,11,202,136,6,0,209,31,13,0,177,51,45,205,154,72,6,0,84,248,3,11,170,246,3,20,170, + 247,3,19,170,115,34,0,209,127,2,20,235,195,3,0,84,104,2,64,249,31,1,24,235,96,255,255,84,8,1,11,202,120,2,0,249,8,45,205,154,239,3,8,170,177,0,0,144,49,82,66,249,32,2,63,214,224,1,63,214,169,2,64,249,43,11,64,249,42,1,64,249,109,21,0,18,72,1, + 64,249,9,1,11,202,72,5,64,249,44,45,205,154,159,1,22,235,9,1,11,202,42,45,205,154,64,1,87,250,192,252,255,84,246,3,12,170,244,3,12,170,247,3,10,170,243,3,10,170,225,255,255,23,159,6,0,177,128,0,0,84,224,3,20,170,79,20,0,148,43,11,64,249,168, + 2,64,249,9,1,64,249,43,1,0,249,170,2,64,249,72,1,64,249,11,5,0,249,169,2,64,249,42,1,64,249,75,9,0,249,0,0,128,82,253,123,193,168,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169, + 253,123,190,169,253,3,0,145,243,3,2,170,244,3,3,170,180,11,0,249,32,0,64,185,120,14,0,148,224,3,19,170,164,255,255,151,243,3,0,42,128,2,64,185,125,14,0,148,224,3,19,42,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,46,0,0,20, + 31,32,3,213,31,32,3,213,0,0,0,0,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,48,0,128,146,176,11,0,249,168,0,0,240,19,97,53,145,224,3,19,170,69,0,0,148,31,32,3,213,96,34,0,145,90,0,0,148,31,32,3,213,168,0,0,240,19,185,70,249,83,1, + 0,180,104,2,64,249,244,3,19,170,168,0,0,180,224,3,8,170,15,20,0,148,136,142,64,248,168,255,255,181,224,3,19,170,11,20,0,148,168,0,0,240,19,181,70,249,83,1,0,180,104,2,64,249,244,3,19,170,168,0,0,180,224,3,8,170,3,20,0,148,136,142,64,248,168, + 255,255,181,224,3,19,170,255,19,0,148,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,180,0,0,240,136,174,70,249,104,0,0,180,0,0,128,82,23,0,0,20,95,17,0,148,8,28,0,148,243,3,0, + 170,179,0,0,181,0,0,128,210,236,19,0,148,0,0,128,18,15,0,0,20,224,3,19,170,66,0,0,148,96,0,0,181,20,0,128,18,5,0,0,20,168,0,0,240,0,185,6,249,128,174,6,249,20,0,128,82,0,0,128,210,223,19,0,148,224,3,19,170,221,19,0,148,224,3,20,42,253,123,193, + 168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,168,0,0,240,8,185,70,249,19,0,64,249,127,2,8,235,96,1,0,84,83,1,0,180,104,2,64,249,244,3,19,170,168,0,0,180,224,3,8,170,200,19,0,148, + 136,142,64,248,168,255,255,181,224,3,19,170,196,19,0,148,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,168,0,0,240,8,181,70,249,19,0,64,249,127,2,8,235,96,1,0,84,83,1, + 0,180,104,2,64,249,244,3,19,170,168,0,0,180,224,3,8,170,176,19,0,148,136,142,64,248,168,255,255,181,224,3,19,170,172,19,0,148,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,19,0, + 249,253,123,191,169,253,3,0,145,245,3,0,170,168,2,192,57,234,3,21,170,9,0,128,210,40,1,0,52,31,245,0,113,41,5,137,154,75,5,0,145,72,29,192,56,200,255,255,53,106,5,0,145,72,1,192,57,40,255,255,53,1,1,128,210,32,5,0,145,53,23,0,148,243,3,0,170, + 179,0,0,181,0,0,128,210,141,19,0,148,0,0,128,210,42,0,0,20,246,3,19,170,170,2,192,57,138,4,0,52,233,3,21,170,43,5,0,145,40,29,192,56,200,255,255,53,104,1,21,203,23,5,0,145,95,245,0,113,192,1,0,84,33,0,128,210,224,3,23,170,33,23,0,148,244,3,0, + 170,116,1,0,180,226,3,21,170,225,3,23,170,178,11,0,148,128,3,0,53,212,2,0,249,0,0,128,210,214,34,0,145,115,19,0,148,245,2,21,139,232,255,255,23,104,2,64,249,244,3,19,170,168,0,0,180,224,3,8,170,108,19,0,148,136,142,64,248,168,255,255,181,224, + 3,19,170,104,19,0,148,0,0,128,210,102,19,0,148,215,255,255,23,0,0,128,210,99,19,0,148,224,3,19,170,253,123,193,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,0,0,128,210, + 192,19,0,148,0,0,62,212,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,244,3,1,170,8,0,0,20,104,134,64,248,200,0,0,180,239,3,8,170,177,0,0,144,49,82,66,249,32,2,63,214,224,1,63,214,127,2,20,235,1,255,255,84,253,123,193,168, + 243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,244,3,1,170,127,2,20,235,64,1,0,84,104,134,64,248,168,255,255,180,239,3,8,170,177,0,0,144,49,82,66,249,32,2,63,214,224,1,63,214,224, + 254,255,52,2,0,0,20,0,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,8,1,0,24,31,0,8,107,96,0,0,84,0,0,128,82,3,0,0,20,224,3,8,42,4,0,0,20,192,3,95,214,99,115,109,224,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123, + 191,169,253,3,0,145,244,3,0,42,245,3,1,170,29,14,0,148,243,3,0,170,115,1,0,180,107,2,64,249,106,1,3,145,127,1,10,235,233,3,11,170,192,0,0,84,40,5,65,184,31,1,20,107,32,1,0,84,63,1,10,235,129,255,255,84,0,0,128,82,253,123,193,168,245,91,65,169, + 243,83,194,168,255,35,3,213,192,3,95,214,40,65,0,209,40,255,255,180,10,5,64,249,234,254,255,180,95,21,0,241,129,0,0,84,31,5,0,249,32,0,128,82,243,255,255,23,95,5,0,241,97,0,0,84,0,0,128,18,239,255,255,23,118,6,64,249,117,6,0,249,0,5,64,185,31, + 32,0,113,97,9,0,84,105,193,0,145,44,65,2,145,3,0,0,20,63,5,0,249,41,65,0,145,63,1,12,235,161,255,255,84,8,1,64,185,73,9,0,24,116,18,64,185,31,1,9,107,200,3,0,84,64,3,0,84,201,8,0,24,31,1,9,107,128,2,0,84,137,8,0,24,31,1,9,107,192,1,0,84,73,8, + 0,24,31,1,9,107,0,1,0,84,9,8,0,24,31,1,9,107,225,3,20,42,33,5,0,84,40,16,128,82,33,16,128,82,37,0,0,20,200,16,128,82,193,16,128,82,34,0,0,20,104,16,128,82,97,16,128,82,31,0,0,20,72,16,128,82,65,16,128,82,28,0,0,20,136,16,128,82,129,16,128,82, + 25,0,0,20,201,5,0,24,31,1,9,107,128,2,0,84,137,5,0,24,31,1,9,107,192,1,0,84,73,5,0,24,31,1,9,107,0,1,0,84,9,5,0,24,31,1,9,107,225,3,20,42,161,1,0,84,168,17,128,82,161,17,128,82,9,0,0,20,200,17,128,82,193,17,128,82,6,0,0,20,168,16,128,82,161, + 16,128,82,3,0,0,20,72,17,128,82,65,17,128,82,104,18,0,185,0,1,128,82,239,3,10,170,177,0,0,144,49,82,66,249,32,2,63,214,224,1,63,214,116,18,0,185,7,0,0,20,31,5,0,249,239,3,10,170,177,0,0,144,49,82,66,249,32,2,63,214,224,1,63,214,118,6,0,249,168, + 255,255,23,145,0,0,192,141,0,0,192,142,0,0,192,143,0,0,192,144,0,0,192,146,0,0,192,147,0,0,192,180,2,0,192,181,2,0,192,0,0,0,0,4,0,128,82,3,0,0,20,31,32,3,213,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,225,0,0,181,217,21, + 0,148,200,2,128,82,8,0,0,185,240,18,0,148,192,2,128,82,23,0,0,20,162,1,0,180,136,28,64,211,63,0,0,121,9,5,0,145,95,0,9,235,168,0,0,84,205,21,0,148,72,4,128,82,83,4,128,82,7,0,0,20,104,8,0,81,31,137,0,113,9,1,0,84,198,21,0,148,200,2,128,82,211, + 2,128,82,8,0,0,185,220,18,0,148,224,3,19,42,3,0,0,20,132,28,0,83,6,0,0,148,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,136,28,0,83,238,3,1,170,13,0,128,210,200,0,0,52,168,5,128,82,40, + 0,0,121,46,8,0,145,45,0,128,210,224,3,0,75,235,3,14,170,7,6,128,82,230,10,128,82,236,3,14,170,67,0,0,53,128,0,62,212,8,8,195,26,9,129,3,27,207,9,0,145,0,8,195,26,173,5,0,145,63,37,0,113,232,144,134,26,9,33,41,11,201,1,0,121,128,0,0,52,238,3, + 15,170,191,1,2,235,35,254,255,84,191,1,2,235,3,1,0,84,63,0,0,121,150,21,0,148,72,4,128,82,8,0,0,185,173,18,0,148,64,4,128,82,9,0,0,20,255,1,0,121,137,229,95,120,104,37,64,120,136,5,0,121,127,1,12,235,105,225,31,120,99,255,255,84,0,0,128,82,253, + 123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,168,0,0,240,8,65,71,185,104,1,0,53,224,0,0,181,125,21,0,148,200,2,128,82,8,0,0,185,148,18,0,148,0,0,176,18,6,0,0,20,65,255,255,180,82,0,0,148,3,0,0,20,2,0, + 128,210,5,0,0,148,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,189,169,253,3,0,145,245,3,1,170,225,3,2,170,243,3,0,170,243,0,0,181,101,21,0,148,200,2,128,82,8,0,0,185,124,18,0,148,0,0,176, + 18,54,0,0,20,85,255,255,180,224,67,0,145,73,0,0,148,235,15,64,249,104,157,64,249,168,0,0,181,225,3,21,170,224,3,19,170,51,0,0,148,38,0,0,20,104,0,0,208,22,1,34,145,96,38,64,120,31,0,4,113,66,1,0,84,12,28,64,211,200,10,0,145,9,121,108,120,137, + 0,0,54,104,137,64,249,20,105,108,56,7,0,0,20,20,28,0,83,5,0,0,20,225,99,0,145,100,26,0,148,235,15,64,249,20,60,0,83,160,38,64,120,31,0,4,113,66,1,0,84,12,28,64,211,200,10,0,145,9,121,108,120,137,0,0,54,104,137,64,249,9,105,108,56,7,0,0,20,9, + 28,0,83,5,0,0,20,225,99,0,145,84,26,0,148,235,15,64,249,9,60,0,83,128,2,9,75,64,0,0,53,212,251,255,53,232,163,64,57,168,0,0,52,234,11,64,249,72,169,67,185,9,121,30,18,73,169,3,185,253,123,195,168,245,91,65,169,243,83,194,168,255,35,3,213,192, + 3,95,214,0,0,0,0,237,3,0,170,170,37,64,120,43,36,64,120,72,5,1,81,31,101,0,113,73,129,0,17,104,5,1,81,76,129,137,26,105,129,0,17,31,101,0,113,104,129,137,26,128,1,8,75,64,0,0,53,140,254,255,53,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248, + 253,123,191,169,253,3,0,145,243,3,0,170,127,98,0,57,129,0,0,180,48,0,192,61,112,130,128,60,27,0,0,20,168,0,0,240,8,65,71,185,200,0,0,53,168,0,0,208,8,97,27,145,17,1,192,61,113,130,128,60,19,0,0,20,78,12,0,148,97,34,0,145,96,2,0,249,8,72,64,249, + 104,6,0,249,9,68,64,249,105,10,0,249,91,26,0,148,96,2,64,249,97,66,0,145,110,26,0,148,105,2,64,249,40,169,67,185,168,0,8,55,8,1,31,50,42,0,128,82,40,169,3,185,106,98,0,57,224,3,19,170,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0, + 0,0,0,127,35,3,213,243,83,191,169,253,123,186,169,253,3,0,145,168,0,0,240,8,65,71,185,255,19,0,249,255,195,0,57,255,35,1,57,255,67,1,57,255,99,1,57,8,1,0,53,168,0,0,208,8,97,27,145,16,1,192,61,233,227,0,145,48,1,128,61,41,0,128,82,233,35,1,57, + 224,127,1,169,35,0,128,82,224,131,0,145,66,1,128,82,225,67,0,145,182,0,0,148,232,35,65,57,244,3,0,42,31,9,0,113,161,0,0,84,234,19,64,249,72,169,67,185,9,121,30,18,73,169,3,185,232,67,65,57,168,0,0,52,224,131,0,145,243,79,64,185,41,0,0,148,19, + 32,0,185,232,99,65,57,168,0,0,52,224,131,0,145,243,87,64,185,35,0,0,148,19,36,0,185,224,3,20,42,253,123,198,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,244,3,0,170,136,162,64,57,31,9,0, + 113,161,0,0,84,138,2,64,249,72,169,67,185,9,121,30,18,73,169,3,185,136,194,64,57,168,0,0,52,224,3,20,170,147,46,64,185,12,0,0,148,19,32,0,185,136,226,64,57,168,0,0,52,224,3,20,170,147,54,64,185,6,0,0,148,19,36,0,185,253,123,193,168,243,83,193, + 168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,244,3,0,170,136,2,64,249,8,3,0,181,136,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,136,66,64,57,224,19,0,185,200,0,0,53,40,0,128,82,159,6,0,249,136,66,0, + 57,1,0,128,210,2,0,0,20,129,6,64,249,224,67,0,145,147,12,0,148,136,0,0,240,8,97,50,145,243,3,0,170,224,19,64,185,147,2,0,249,9,253,223,200,32,1,63,214,211,0,0,180,128,2,64,249,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,195,2,0, + 148,0,0,62,212,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,190,169,253,3,0,145,244,3,0,170,136,2,64,249,8,3,0,181,136,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,136,66,64,57,224,19,0,185,200,0,0,53,40,0,128,82,159,6,0,249,136, + 66,0,57,1,0,128,210,2,0,0,20,129,6,64,249,224,67,0,145,108,12,0,148,136,0,0,240,8,97,50,145,243,3,0,170,224,19,64,185,147,2,0,249,9,253,223,200,32,1,63,214,83,3,0,180,149,2,64,249,147,34,0,145,98,2,64,249,129,98,0,145,168,74,64,249,224,3,21, + 170,136,14,0,249,169,70,64,249,137,18,0,249,218,25,0,148,98,2,64,249,129,130,0,145,224,3,21,170,236,25,0,148,168,170,67,185,168,0,8,55,8,1,31,50,73,0,128,82,168,170,3,185,137,162,0,57,253,123,194,168,245,11,64,249,243,83,194,168,255,35,3,213, + 192,3,95,214,136,2,0,148,0,0,62,212,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,136,0,0,240,8,225,45,145,9,253,223,200,244,3,0,170,32,1,63,214,136,66,64,57,224,19,0,185,200,0,0,53,40,0,128,82,159,6,0,249,136,66,0,57,1,0,128,210,2, + 0,0,20,129,6,64,249,224,67,0,145,53,12,0,148,136,0,0,240,8,97,50,145,243,3,0,170,224,19,64,185,147,2,0,249,9,253,223,200,32,1,63,214,224,3,19,170,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,187,169,245,91,1,169, + 247,99,2,169,249,107,3,169,251,35,0,249,253,123,190,169,253,3,0,145,244,3,1,170,224,11,0,249,153,2,64,249,246,3,2,42,117,28,0,83,249,15,0,249,217,0,0,181,13,20,0,148,200,2,128,82,8,0,0,185,36,17,0,148,16,0,0,20,150,2,0,52,200,10,0,81,31,137, + 0,113,41,2,0,84,40,0,128,82,201,2,128,82,8,192,0,57,9,44,0,185,229,3,0,170,0,0,128,210,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,34,17,0,148,137,6,64,249,169,45,0,180,136,2,64,249,40,1,0,249,106,1,0,20,40,11,0,145,51,3,64,121,136,2,0,249, + 24,0,128,82,9,160,64,57,201,0,0,53,120,255,255,151,4,0,0,20,136,2,64,249,19,37,64,120,136,2,0,249,224,3,19,42,1,1,128,82,213,25,0,148,64,255,255,53,168,2,31,50,127,182,0,113,181,18,136,26,104,174,0,81,169,255,159,82,31,1,9,106,129,0,0,84,136, + 2,64,249,19,37,64,120,136,2,0,249,223,122,27,114,26,226,159,82,27,8,130,82,73,9,130,82,8,252,130,82,74,253,130,82,12,254,156,82,14,2,131,82,75,227,159,82,225,19,0,84,127,194,0,113,131,13,0,84,127,234,0,113,98,0,0,84,104,194,0,81,102,0,0,20,127, + 2,26,107,34,12,0,84,127,130,25,113,131,12,0,84,127,170,25,113,98,0,0,84,104,130,25,81,94,0,0,20,127,194,27,113,195,11,0,84,127,234,27,113,98,0,0,84,104,194,27,81,88,0,0,20,127,154,37,113,3,11,0,84,127,194,37,113,98,0,0,84,104,154,37,81,82,0, + 0,20,127,154,39,113,67,10,0,84,127,194,39,113,98,0,0,84,104,154,39,81,76,0,0,20,127,154,41,113,131,9,0,84,127,194,41,113,98,0,0,84,104,154,41,81,70,0,0,20,127,154,43,113,195,8,0,84,127,194,43,113,98,0,0,84,104,154,43,81,64,0,0,20,127,154,45, + 113,3,8,0,84,127,194,45,113,98,0,0,84,104,154,45,81,58,0,0,20,127,154,49,113,67,7,0,84,127,194,49,113,98,0,0,84,104,154,49,81,52,0,0,20,127,154,51,113,131,6,0,84,127,194,51,113,98,0,0,84,104,154,51,81,46,0,0,20,127,154,53,113,195,5,0,84,127, + 194,53,113,98,0,0,84,104,154,53,81,40,0,0,20,127,66,57,113,3,5,0,84,127,106,57,113,98,0,0,84,104,66,57,81,34,0,0,20,127,66,59,113,67,4,0,84,127,106,59,113,98,0,0,84,104,66,59,81,28,0,0,20,127,130,60,113,131,3,0,84,127,170,60,113,98,0,0,84,104, + 130,60,81,22,0,0,20,127,2,27,107,195,2,0,84,127,2,9,107,98,0,0,84,104,2,27,75,16,0,0,20,127,2,8,107,3,2,0,84,127,2,10,107,98,0,0,84,104,2,8,75,10,0,0,20,104,2,12,11,9,61,0,83,63,37,0,113,8,1,0,84,104,2,14,75,4,0,0,20,127,2,11,107,130,0,0,84, + 104,2,26,75,31,5,0,49,97,1,0,84,104,6,1,81,31,101,0,113,104,134,1,81,105,0,0,84,31,101,0,113,40,5,0,84,31,101,0,113,104,130,0,81,104,130,136,26,8,221,0,81,136,4,0,53,138,2,64,249,233,251,159,82,75,1,64,121,76,9,0,145,140,2,0,249,104,97,1,81, + 31,1,9,106,64,2,0,84,223,2,0,113,138,2,0,249,8,1,128,82,214,18,136,26,107,2,0,52,72,1,64,121,31,1,11,107,0,2,0,84,73,19,0,148,200,2,128,82,8,0,0,185,96,16,0,148,74,253,130,82,75,227,159,82,12,254,156,82,14,2,131,82,14,0,0,20,136,9,0,145,147, + 1,64,121,223,2,0,113,136,2,0,249,9,2,128,82,214,18,137,26,74,253,130,82,75,227,159,82,12,254,156,82,4,0,0,20,223,2,0,113,72,1,128,82,214,18,136,26,8,0,128,18,86,0,0,53,128,0,62,212,13,9,214,26,25,252,130,82,87,9,130,82,127,194,0,113,131,13,0, + 84,127,234,0,113,98,0,0,84,105,194,0,81,102,0,0,20,127,2,26,107,34,12,0,84,127,130,25,113,131,12,0,84,127,170,25,113,98,0,0,84,105,130,25,81,94,0,0,20,127,194,27,113,195,11,0,84,127,234,27,113,98,0,0,84,105,194,27,81,88,0,0,20,127,154,37,113, + 3,11,0,84,127,194,37,113,98,0,0,84,105,154,37,81,82,0,0,20,127,154,39,113,67,10,0,84,127,194,39,113,98,0,0,84,105,154,39,81,76,0,0,20,127,154,41,113,131,9,0,84,127,194,41,113,98,0,0,84,105,154,41,81,70,0,0,20,127,154,43,113,195,8,0,84,127,194, + 43,113,98,0,0,84,105,154,43,81,64,0,0,20,127,154,45,113,3,8,0,84,127,194,45,113,98,0,0,84,105,154,45,81,58,0,0,20,127,154,49,113,67,7,0,84,127,194,49,113,98,0,0,84,105,154,49,81,52,0,0,20,127,154,51,113,131,6,0,84,127,194,51,113,98,0,0,84,105, + 154,51,81,46,0,0,20,127,154,53,113,195,5,0,84,127,194,53,113,98,0,0,84,105,154,53,81,40,0,0,20,127,66,57,113,3,5,0,84,127,106,57,113,98,0,0,84,105,66,57,81,34,0,0,20,127,66,59,113,67,4,0,84,127,106,59,113,98,0,0,84,105,66,59,81,28,0,0,20,127, + 130,60,113,131,3,0,84,127,170,60,113,98,0,0,84,105,130,60,81,22,0,0,20,127,2,27,107,195,2,0,84,127,2,23,107,98,0,0,84,105,2,27,75,16,0,0,20,127,2,25,107,3,2,0,84,127,2,10,107,98,0,0,84,105,2,25,75,10,0,0,20,104,2,12,11,9,61,0,83,63,37,0,113, + 8,1,0,84,105,2,14,75,4,0,0,20,127,2,11,107,130,0,0,84,105,2,26,75,63,5,0,49,65,2,0,84,127,6,1,113,99,0,0,84,127,106,1,113,169,0,0,84,127,134,1,113,99,1,0,84,127,234,1,113,40,1,0,84,232,243,159,82,104,2,8,11,9,61,0,83,63,101,0,113,104,130,0,81, + 104,130,136,26,9,221,0,81,2,0,0,20,9,0,128,18,140,2,64,249,63,1,22,107,66,2,0,84,8,127,22,27,147,1,64,121,11,1,9,11,127,1,8,107,233,39,159,26,31,3,13,107,232,151,159,26,41,1,8,42,170,10,9,42,136,9,0,145,248,3,11,42,136,2,0,249,85,1,29,50,74, + 253,130,82,75,227,159,82,12,254,156,82,111,255,255,23,136,9,0,209,247,103,65,169,136,2,0,249,19,1,0,52,8,1,64,121,31,1,19,107,160,0,0,84,148,18,0,148,200,2,128,82,8,0,0,185,171,15,0,148,245,0,24,55,136,6,64,249,153,2,0,249,72,0,0,180,25,1,0, + 249,0,0,128,82,32,0,0,20,225,3,24,42,224,3,21,42,37,0,0,148,8,28,0,83,136,2,0,52,40,0,128,82,73,4,128,82,232,194,0,57,233,46,0,185,117,0,0,55,24,0,128,18,15,0,0,20,137,6,64,249,213,0,8,54,105,0,0,180,136,2,64,249,40,1,0,249,0,0,176,82,13,0,0, + 20,105,0,0,180,136,2,64,249,40,1,0,249,0,0,176,18,8,0,0,20,85,0,8,54,248,3,24,75,137,6,64,249,105,0,0,180,136,2,64,249,40,1,0,249,224,3,24,42,253,123,194,168,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213, + 192,3,95,214,128,1,16,55,160,0,0,54,192,0,8,54,8,0,176,82,63,0,8,107,232,0,0,84,0,0,128,82,6,0,0,20,8,0,176,18,63,0,8,107,224,151,159,26,2,0,0,20,32,0,128,82,192,3,95,214,255,67,0,209,255,255,159,136,232,255,223,136,255,67,0,145,6,15,0,20,0, + 0,0,0,92,24,0,20,31,32,3,213,31,32,3,213,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,147,9,0,148,8,12,64,249,232,0,0,180,239,3,8,170,145,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,1,0,0,20,136,0,0,148,0,0,62,212,41,0,64,121,8,0,64,121, + 10,1,9,75,234,0,0,53,11,0,1,203,169,0,0,52,41,44,64,120,104,105,97,120,10,1,9,75,138,255,255,52,232,3,10,75,9,125,31,83,32,125,74,75,192,3,95,214,127,35,3,213,243,83,191,169,253,123,186,169,253,3,0,145,168,0,0,240,8,65,71,185,255,19,0,249,255, + 195,0,57,255,35,1,57,255,67,1,57,255,99,1,57,8,1,0,53,168,0,0,208,8,97,27,145,16,1,192,61,233,227,0,145,48,1,128,61,41,0,128,82,233,35,1,57,224,7,1,169,65,0,0,180,32,0,0,249,35,0,128,82,225,67,0,145,224,131,0,145,249,253,255,151,232,35,65,57, + 244,3,0,42,31,9,0,113,161,0,0,84,234,19,64,249,72,169,67,185,9,121,30,18,73,169,3,185,232,67,65,57,168,0,0,52,224,131,0,145,243,79,64,185,108,253,255,151,19,32,0,185,232,99,65,57,168,0,0,52,224,131,0,145,243,87,64,185,102,253,255,151,19,36,0, + 185,224,3,20,42,253,123,198,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,8,0,64,121,169,73,139,82,31,1,9,107,97,1,0,84,8,60,64,185,10,170,136,82,9,192,40,139,40,1,64,185,31,1,10,107,161,0,0,84,40,49,64,121,31,45,8,113,224,23,159,26,192, + 3,95,214,0,0,128,82,192,3,95,214,8,60,64,185,11,0,128,82,9,192,40,139,40,41,64,121,44,13,64,121,8,1,9,139,0,97,0,145,204,1,0,52,10,32,0,145,73,5,64,185,63,64,41,235,163,0,0,84,72,1,64,185,41,1,8,11,63,64,41,235,227,0,0,84,107,5,0,17,127,1,12, + 107,0,160,0,145,74,161,0,145,163,254,255,84,0,0,128,210,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,180,255,255,240,128,2,0,145,209,255,255,151,96,0,0,53,0,0,128,82,13,0,0,20,136,2,0,145,97,2,8,203, + 128,2,0,145,218,255,255,151,96,0,0,181,0,0,128,82,6,0,0,20,8,36,64,185,233,127,104,42,32,1,0,18,2,0,0,20,0,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,83,15,0,148,96,0,0, + 180,192,2,128,82,94,15,0,148,168,0,0,208,8,25,64,185,104,0,8,54,224,0,128,82,96,0,62,212,96,0,128,82,165,247,255,151,0,0,62,212,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,8,0,0,176,0,193,7,145,137,0,0,240,40,109,69,249,0, + 1,63,214,168,0,0,208,0,29,0,185,31,4,0,49,160,1,0,84,168,0,0,208,19,1,54,145,136,0,0,240,8,121,69,249,225,3,19,170,0,1,63,214,160,0,0,52,40,0,128,18,104,122,0,185,32,0,128,82,3,0,0,20,6,0,0,148,0,0,128,82,253,123,193,168,243,7,65,248,255,35, + 3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,179,0,0,176,96,30,64,185,31,4,0,49,192,0,0,84,136,0,0,208,8,113,69,249,0,1,63,214,8,0,128,18,104,30,0,185,32,0,128,82,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95, + 214,127,35,3,213,253,123,191,169,253,3,0,145,7,0,0,148,128,0,0,180,253,123,193,168,255,35,3,213,192,3,95,214,184,255,255,151,0,0,62,212,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,182,0,0,176,200,30,64,185,31,5,0,49, + 97,0,0,84,0,0,128,210,50,0,0,20,136,0,0,208,8,189,69,249,0,1,63,214,244,3,0,42,192,30,64,185,136,0,0,208,8,117,69,249,0,1,63,214,245,3,0,170,191,6,0,177,0,1,0,84,53,4,0,181,192,30,64,185,136,0,0,208,8,121,69,249,1,0,128,146,0,1,63,214,96,0,0, + 53,21,0,128,210,25,0,0,20,1,16,128,210,32,0,128,210,159,23,0,148,243,3,0,170,192,30,64,185,136,0,0,208,8,121,69,249,147,1,0,180,225,3,19,170,0,1,63,214,192,0,0,52,40,0,128,18,104,122,0,185,245,3,19,170,19,0,128,210,7,0,0,20,192,30,64,185,136, + 0,0,208,8,121,69,249,1,0,128,210,0,1,63,214,21,0,128,210,224,3,19,170,226,254,255,151,136,0,0,208,8,77,70,249,224,3,20,42,0,1,63,214,224,3,21,170,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243, + 83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,180,0,0,176,128,30,64,185,31,4,0,49,64,2,0,84,211,0,0,181,136,0,0,208,8,117,69,249,0,1,63,214,243,3,0,170,128,30,64,185,136,0,0,208,8,121,69,249,1,0,128,210,0,1,63,214,243,0,0,180,168,0,0,176, + 8,1,54,145,127,2,8,235,96,0,0,84,224,3,19,170,189,254,255,151,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,192,0,0,180,168,0,0,176,8,1,54,145,31,0,8,235,64,0,0,84,179,254,255,23,192,3,95,214,0,0,0,0,34,0,64,249,1,0,0,20,40,48,65, + 57,73,16,0,209,31,1,0,113,71,0,137,154,32,3,0,180,15,24,64,185,45,4,64,249,168,193,47,139,168,2,0,180,14,20,64,185,12,0,128,82,14,2,0,52,136,125,125,211,9,193,47,139,42,105,109,184,171,193,42,139,255,0,11,235,131,0,0,84,140,5,0,17,159,1,14,107, + 3,255,255,84,204,0,0,52,136,5,0,81,169,77,40,139,42,193,47,139,64,5,64,185,192,3,95,214,0,0,128,18,254,255,255,23,47,255,255,23,234,3,2,170,8,0,64,249,73,29,64,185,0,201,105,184,31,8,0,49,129,0,0,84,34,0,64,249,224,3,10,170,218,255,255,23,192, + 3,95,214,41,28,64,185,8,0,64,249,2,201,41,184,192,3,95,214,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,244,3,3,42,227,67,0,145,243,3,2,170,197,242,255,151,104,30,64,185,9,0,64,249,42,193,40,139,233,11,0,249,73,5,64,185,159,2,9,107, + 77,0,0,84,84,5,0,185,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,190,169,253,3,0,145,227,67,0,145,243,3,2,170,178,242,255,151,104,30,64,185,9,0,64,249,233,11,0,249,41,193,40,139,32,5,64,185,253, + 123,194,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,27,0,249,251,31,0,249,253,123,187,169,253,3,0,145,248,3,0,170,243,3,1,170,179,99,3,169,245,3,2,170,179,87,2,169,247,3,3,42,183,19,0, + 185,99,243,255,151,251,3,0,170,187,35,0,249,226,3,21,170,225,3,19,170,224,3,24,170,185,255,255,151,244,3,0,42,37,255,255,151,8,48,64,185,9,5,0,17,9,48,0,185,159,6,0,49,142,18,87,122,237,7,0,84,159,6,0,49,141,10,0,84,168,6,64,185,159,2,8,107, + 42,10,0,84,150,126,125,147,78,243,255,151,168,10,64,185,9,192,40,139,52,105,118,184,180,23,0,185,73,243,255,151,168,10,64,185,9,192,40,139,42,1,22,139,75,5,64,185,75,1,0,52,67,243,255,151,168,10,64,185,9,192,40,139,42,1,22,139,83,5,64,185,62, + 243,255,151,8,192,51,139,179,19,64,249,2,0,0,20,8,0,128,210,136,3,0,180,226,3,20,42,225,3,21,170,224,3,24,170,155,255,255,151,121,42,64,249,51,243,255,151,168,10,64,185,9,192,40,139,42,1,22,139,75,5,64,185,75,1,0,52,45,243,255,151,168,10,64, + 185,9,192,40,139,42,1,22,139,83,5,64,185,40,243,255,151,0,192,51,139,179,19,64,249,2,0,0,20,0,0,128,210,99,32,128,82,226,3,25,170,225,3,24,170,248,220,255,151,224,3,27,170,38,243,255,151,5,0,0,20,181,207,66,169,179,19,0,249,184,239,67,169,183, + 83,66,41,180,27,0,185,192,255,255,23,224,254,255,151,8,48,64,185,31,1,0,113,173,0,0,84,220,254,255,151,8,48,64,185,9,5,0,81,9,48,0,185,159,6,0,49,142,18,87,122,204,1,0,84,226,3,20,42,225,3,21,170,224,3,24,170,110,255,255,151,253,123,197,168, + 251,31,64,249,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,137,254,255,151,136,254,255,151,0,0,62,212,127,35,3,213,243,83,190,169,245,91,1,169,253,123,190,169,253,3,0,145,244,3,2,170,246,3,0,170,224,3,20, + 170,245,3,1,170,47,255,255,151,243,3,0,42,224,3,22,170,227,67,0,145,226,3,20,170,225,3,21,170,35,242,255,151,226,3,20,170,225,3,21,170,224,3,22,170,103,255,255,151,127,2,0,107,109,1,0,84,226,3,19,42,225,3,20,170,224,67,0,145,73,255,255,151,227, + 3,19,42,226,3,20,170,225,3,21,170,224,3,22,170,72,255,255,151,6,0,0,20,226,3,20,170,225,3,21,170,224,3,22,170,87,255,255,151,243,3,0,42,224,3,19,42,253,123,194,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243, + 83,188,169,245,91,1,169,247,99,2,169,249,27,0,249,251,31,0,249,253,123,184,169,253,3,0,145,245,3,0,170,181,39,0,249,22,0,128,82,191,127,2,41,191,127,2,169,141,254,255,151,24,20,64,249,184,35,0,249,138,254,255,151,25,16,64,249,185,31,0,249,180, + 42,64,249,180,15,0,249,179,110,68,169,181,162,66,169,168,111,5,169,181,51,0,249,224,3,19,170,78,22,0,148,127,254,255,151,20,16,0,249,125,254,255,151,19,20,0,249,123,254,255,151,8,16,64,249,1,21,64,249,160,195,1,145,213,242,255,151,247,3,0,170, + 183,27,0,249,179,39,64,249,104,46,64,249,200,0,0,180,40,0,128,82,168,23,0,185,111,254,255,151,8,56,64,249,168,19,0,249,3,32,128,82,98,58,64,249,225,3,21,170,160,43,64,249,118,220,255,151,243,3,0,170,179,23,0,249,29,0,0,20,40,0,128,82,177,67, + 0,145,40,254,159,136,97,254,255,151,31,64,0,185,168,23,64,185,180,15,64,249,104,1,0,52,33,0,128,82,224,3,20,170,40,243,255,151,168,19,64,249,3,129,0,145,2,25,64,185,0,5,64,41,137,0,0,208,40,53,70,249,6,0,0,20,131,130,0,145,130,26,64,185,128, + 6,64,41,136,0,0,208,8,53,70,249,0,1,63,214,182,19,64,185,185,227,67,169,187,215,69,169,179,223,66,169,224,3,23,170,187,242,255,151,118,2,0,53,105,4,0,24,136,2,64,185,31,1,9,107,225,1,0,84,136,26,64,185,31,17,0,113,129,1,0,84,136,34,64,185,137, + 3,0,24,8,1,9,75,31,9,0,113,232,0,0,84,128,22,64,249,56,243,255,151,128,0,0,52,33,0,128,82,224,3,20,170,2,243,255,151,51,254,255,151,25,16,0,249,49,254,255,151,24,20,0,249,105,31,64,185,168,2,64,249,42,0,128,146,10,201,41,248,224,3,19,170,253, + 123,200,168,251,31,64,249,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,99,115,109,224,32,5,147,25,232,3,1,170,225,3,2,170,0,1,31,214,0,0,0,0,232,3,1,170,225,3,2,170,226,3,3,42,0,1,31,214,72,0,0,240,9,193, + 23,145,31,8,0,249,74,0,0,240,72,129,23,145,8,36,0,169,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,72,0,0,240,8,225,0,145,16,228,0,79,243,3,0,170,233,3,1,170,104,2,0,249,97,34,0,145,32,33,0,145,112,130,128,60,75, + 243,255,151,72,0,0,240,8,129,23,145,104,2,0,249,224,3,19,170,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,11,0,64,249,243,3,2,170,127,2,0,185,45,5,0,24,104,1,64,185,31,1,13,107, + 33,4,0,84,104,25,64,185,172,4,0,24,52,0,128,82,31,17,0,113,97,1,0,84,104,33,64,185,8,1,12,75,31,9,0,113,232,0,0,84,41,20,64,249,104,21,64,249,31,1,9,235,233,3,31,42,138,2,137,26,106,2,0,185,104,1,64,185,31,1,13,107,225,1,0,84,104,25,64,185,31, + 17,0,113,129,1,0,84,104,33,64,185,8,1,12,75,31,9,0,113,8,1,0,84,104,25,64,249,200,0,0,181,212,253,255,151,20,64,0,185,32,0,128,82,116,2,0,185,2,0,0,20,0,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,99,115,109,224,32,5,147, + 25,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,190,169,253,3,0,145,250,3,0,170,247,3,1,170,119,6,0,180,232,2,64,185,25,0,128,82,22,0,128,82,31,1,0,113,173,4,0,84,2,242,255,151,72,27,64,249,9,13,64, + 185,10,192,41,139,83,17,0,145,253,241,255,151,72,27,64,249,9,13,64,185,24,200,105,184,31,3,0,113,205,2,0,84,219,126,64,147,246,241,255,151,116,70,64,184,245,3,0,170,243,11,0,249,83,27,64,249,221,241,255,151,232,6,64,185,161,194,52,139,226,3, + 19,170,9,192,40,139,136,2,128,210,96,39,8,155,26,0,0,148,192,0,0,53,24,7,0,81,243,11,64,249,31,3,0,113,236,253,255,84,2,0,0,20,57,0,128,82,232,2,64,185,214,6,0,17,223,2,8,107,171,251,255,84,224,3,25,42,253,123,194,168,251,35,64,249,249,107,67, + 169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213,192,3,95,214,75,253,255,151,0,0,62,212,0,0,0,0,231,28,0,83,1,1,0,20,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,243,3,0,170,104,6,64,185,245,3,1,170,246,3,2, + 170,104,7,0,52,244,3,8,42,177,241,255,151,8,192,52,139,232,6,0,180,180,0,0,52,116,6,64,185,172,241,255,151,8,192,52,139,3,0,0,20,8,0,128,210,20,0,128,82,8,65,192,57,200,5,0,52,104,2,64,185,104,0,56,54,169,2,64,185,73,5,32,55,180,0,0,52,160,241, + 255,151,104,6,64,185,20,192,40,139,2,0,0,20,20,0,128,210,175,241,255,151,168,6,64,185,9,192,40,139,159,2,9,235,32,2,0,84,104,6,64,185,168,0,0,52,148,241,255,151,104,6,64,185,20,192,40,139,2,0,0,20,20,0,128,210,163,241,255,151,168,6,64,185,9, + 192,40,139,128,66,0,145,33,65,0,145,170,3,0,148,96,0,0,52,0,0,128,82,16,0,0,20,168,2,64,185,104,0,8,54,105,2,64,185,105,255,31,54,202,2,64,185,106,0,0,54,104,2,64,185,232,254,7,54,106,0,16,54,104,2,64,185,136,254,23,54,106,0,8,54,104,2,64,185, + 40,254,15,54,32,0,128,82,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,189,169,245,91,1,169,247,99,2,169,253,123,190,169,253,3,0,145,247,3,0,170,244,3,1,170,243,3,2,170,245,3,3,170,24,0,128,82,104, + 6,64,185,168,0,0,52,246,3,8,42,100,241,255,151,8,192,54,139,3,0,0,20,8,0,128,210,22,0,128,82,104,11,0,180,182,0,0,52,93,241,255,151,104,6,64,185,9,192,40,139,2,0,0,20,9,0,128,210,40,65,192,57,104,10,0,52,106,10,64,185,106,0,0,53,104,2,64,185, + 232,9,248,54,105,2,64,185,105,0,248,55,136,2,64,249,20,193,42,139,201,1,56,54,168,2,64,185,136,1,32,54,170,0,0,176,74,253,69,249,42,1,0,180,239,3,10,170,145,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,192,8,0,180,180,8,0,180,5,0,0,20,201,0, + 24,54,224,22,64,249,64,8,0,180,52,8,0,180,128,2,0,249,14,0,0,20,168,2,64,185,8,2,0,54,225,22,64,249,129,7,0,180,116,7,0,180,162,22,128,185,224,3,20,170,211,217,255,151,168,22,64,185,31,33,0,113,65,5,0,84,128,2,64,249,0,5,0,180,161,34,0,145,10, + 242,255,151,128,2,0,249,36,0,0,20,168,26,64,185,168,0,0,52,243,3,8,42,58,241,255,151,9,192,51,139,3,0,0,20,9,0,128,210,19,0,128,82,232,22,64,249,137,1,0,181,168,4,0,180,148,4,0,180,179,22,128,185,161,34,0,145,224,3,8,170,248,241,255,151,225, + 3,0,170,226,3,19,170,224,3,20,170,182,217,255,151,15,0,0,20,104,3,0,180,84,3,0,180,179,0,0,52,37,241,255,151,168,26,64,185,9,192,40,139,2,0,0,20,9,0,128,210,105,2,0,180,168,2,64,185,31,1,30,114,41,0,128,82,56,5,137,26,184,19,0,185,224,3,24,42, + 2,0,0,20,0,0,128,82,253,123,194,168,247,99,66,169,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,135,252,255,151,134,252,255,151,133,252,255,151,132,252,255,151,131,252,255,151,130,252,255,151,0,0,62,212,127,35,3,213,243,83,190,169,245, + 11,0,249,253,123,191,169,253,3,0,145,245,3,0,170,243,3,3,170,72,0,64,185,104,0,248,54,244,3,1,170,4,0,0,20,73,8,64,185,40,0,64,249,20,193,41,139,227,3,19,170,224,3,21,170,116,255,255,151,31,4,0,113,96,2,0,84,31,8,0,113,225,3,0,84,97,34,0,145, + 160,22,64,249,189,241,255,151,245,3,0,170,104,26,64,185,168,0,0,52,239,240,255,151,104,26,64,185,1,192,40,139,2,0,0,20,1,0,128,210,35,0,128,82,226,3,21,170,224,3,20,170,129,254,255,151,15,0,0,20,97,34,0,145,160,22,64,249,173,241,255,151,245, + 3,0,170,104,26,64,185,168,0,0,52,223,240,255,151,104,26,64,185,1,192,40,139,2,0,0,20,1,0,128,210,226,3,21,170,224,3,20,170,110,254,255,151,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,72,252,255,151,0,0,62,212,127,35, + 3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,191,169,253,3,0,145,248,3,2,170,244,3,0,170,224,3,24,170,246,3,1,170,245,3,3,170,243,3,4,170,247,3,5,42,249,3,6,170,250,28,0,83,67,20,0,148,116,252,255,151,234, + 17,0,24,8,64,64,185,203,17,0,24,204,17,0,24,219,17,0,24,168,2,0,53,137,2,64,185,63,1,10,107,64,2,0,84,63,1,11,107,1,1,0,84,136,26,64,185,31,61,0,113,225,0,0,84,136,50,64,249,202,15,0,88,31,1,10,235,32,1,0,84,63,1,12,107,224,0,0,84,104,2,64,185, + 9,113,0,18,63,1,27,107,99,0,0,84,104,38,64,185,8,13,0,55,138,6,64,185,200,12,128,82,95,1,8,106,224,4,0,84,105,6,64,185,73,12,0,52,55,12,0,53,202,3,40,54,136,2,64,185,31,1,12,107,1,2,0,84,162,18,64,249,225,3,21,170,224,3,19,170,191,252,255,151, + 31,4,0,49,11,12,0,84,104,6,64,185,31,0,8,107,170,11,0,84,227,3,0,42,224,3,22,170,226,3,19,170,225,3,21,170,5,253,255,151,78,0,0,20,31,1,11,107,65,1,0,84,131,30,64,249,127,4,0,49,100,160,73,122,42,10,0,84,128,22,64,249,226,3,19,170,225,3,21,170, + 250,252,255,151,67,0,0,20,226,3,19,170,225,3,21,170,224,3,22,170,127,239,255,151,62,0,0,20,104,14,64,185,104,2,0,53,104,2,64,185,138,9,0,24,9,113,0,18,63,1,10,107,227,0,0,84,104,34,64,185,168,0,0,52,92,240,255,151,104,34,64,185,9,192,40,139, + 9,1,0,181,104,2,64,185,9,113,0,18,63,1,27,107,163,5,0,84,104,38,64,185,9,9,2,83,73,5,0,52,136,2,64,185,201,6,0,24,31,1,9,107,161,3,0,84,136,26,64,185,31,13,0,113,67,3,0,84,136,34,64,185,31,1,27,107,233,2,0,84,136,26,64,249,9,9,64,185,137,2,0, + 52,88,240,255,151,136,26,64,249,9,9,64,185,10,192,41,139,234,1,0,180,231,3,26,42,230,3,25,170,229,3,23,42,228,3,19,170,227,3,21,170,226,3,24,170,225,3,22,170,224,3,20,170,239,3,10,170,145,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,11,0,0, + 20,231,3,25,170,230,3,23,42,229,3,26,42,228,3,19,170,227,3,21,170,226,3,24,170,225,3,22,170,224,3,20,170,21,0,0,148,32,0,128,82,253,123,193,168,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213,192,3,95,214, + 169,251,255,151,0,0,62,212,31,32,3,213,32,5,147,25,0,0,0,0,99,115,109,224,41,0,0,128,38,0,0,128,34,5,147,25,33,5,147,25,0,0,0,0,127,35,3,213,253,123,186,169,243,83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145,144,216, + 255,151,255,131,3,209,248,3,1,170,255,131,0,57,247,3,3,170,248,159,4,169,243,3,4,170,246,3,2,170,244,3,0,170,246,23,0,249,186,28,0,83,249,3,6,42,250,135,0,57,226,3,19,170,249,51,0,185,225,3,23,170,224,3,24,170,255,252,255,151,245,3,0,42,245, + 55,0,185,191,6,0,49,139,35,0,84,104,6,64,185,191,2,8,107,42,35,0,84,136,2,64,185,73,37,0,24,91,37,0,24,31,1,9,107,1,10,0,84,136,26,64,185,31,17,0,113,161,9,0,84,136,34,64,185,8,1,27,75,31,9,0,113,40,9,0,84,136,26,64,249,232,8,0,181,175,251,255, + 151,8,16,64,249,200,31,0,180,172,251,255,151,20,16,64,249,170,251,255,151,40,0,128,82,22,20,64,249,232,131,0,57,128,30,64,249,246,23,0,249,246,239,255,151,136,2,64,185,9,34,0,24,31,1,9,107,65,1,0,84,136,26,64,185,31,17,0,113,225,0,0,84,136,34, + 64,185,8,1,27,75,31,9,0,113,104,0,0,84,136,26,64,249,72,30,0,180,150,251,255,151,8,28,64,249,104,5,0,180,147,251,255,151,22,28,64,249,145,251,255,151,225,3,22,170,31,28,0,249,224,3,20,170,197,253,255,151,8,28,0,83,40,4,0,53,200,2,64,185,21,0, + 128,82,31,1,0,113,109,28,0,84,183,0,0,144,152,2,128,210,168,126,64,147,19,125,24,155,184,239,255,151,200,6,64,185,9,192,40,139,42,1,19,139,75,5,64,185,43,1,0,52,178,239,255,151,200,6,64,185,9,192,40,139,42,1,19,139,83,5,64,185,173,239,255,151, + 8,192,51,139,2,0,0,20,8,0,128,210,225,2,42,145,0,33,0,145,1,241,255,151,160,25,0,52,200,2,64,185,181,6,0,17,191,2,8,107,10,25,0,84,231,255,255,23,246,23,64,249,232,6,64,249,243,35,9,169,137,2,64,185,136,26,0,24,63,1,8,107,193,20,0,84,136,26, + 64,185,31,17,0,113,97,20,0,84,136,34,64,185,8,1,27,75,31,9,0,113,232,19,0,84,104,14,64,185,8,13,0,52,229,3,25,42,228,3,19,170,227,3,23,170,226,3,21,42,225,67,2,145,224,131,2,145,50,239,255,151,240,43,192,61,236,187,64,185,8,62,20,14,240,27,128, + 61,31,1,12,107,98,11,0,84,237,83,64,249,142,2,128,210,232,51,64,249,248,107,64,185,237,35,0,249,8,1,64,249,9,127,64,211,10,17,64,185,40,125,14,155,11,193,42,139,170,5,64,249,112,105,234,60,105,1,10,139,42,17,64,185,8,2,38,30,240,31,128,61,234, + 131,0,185,31,1,21,107,76,8,0,84,232,119,64,185,191,2,8,107,236,7,0,84,232,6,64,249,21,0,128,82,251,127,64,185,9,193,42,139,233,47,0,249,27,7,0,52,168,126,64,211,9,37,14,155,48,1,192,61,240,51,128,61,40,17,64,185,232,211,0,185,117,239,255,151, + 136,26,64,249,9,13,64,185,10,192,41,139,75,17,0,145,235,31,0,249,111,239,255,151,136,26,64,249,9,13,64,185,22,200,105,184,12,0,0,20,106,239,255,151,232,31,64,249,249,3,0,170,130,26,64,249,224,3,3,145,26,69,64,184,33,195,58,139,232,31,0,249,146, + 253,255,151,64,1,0,53,214,6,0,81,223,2,0,113,140,254,255,84,181,6,0,17,191,2,27,107,142,2,128,210,128,2,0,84,233,47,64,249,221,255,255,23,232,135,64,57,38,195,58,139,231,195,1,145,226,23,64,249,229,3,3,145,228,3,19,170,227,3,23,170,232,99,0, + 57,232,131,64,57,224,3,20,170,232,67,0,57,225,163,68,169,232,7,0,249,232,51,64,185,232,3,0,185,112,0,0,148,142,2,128,210,237,35,64,249,236,187,64,185,245,55,64,185,24,7,0,17,232,51,64,249,31,3,12,107,195,245,255,84,248,39,64,249,250,135,64,57, + 104,2,64,185,74,12,0,24,9,113,0,18,63,1,10,107,163,7,0,84,104,34,64,185,232,0,0,52,34,239,255,151,104,34,64,185,9,192,40,139,105,0,0,180,117,146,0,145,10,0,0,20,104,38,64,185,9,9,2,83,73,6,0,52,225,3,19,170,224,3,23,170,117,146,0,145,28,238, + 255,151,8,28,0,83,136,5,0,53,168,2,64,185,9,9,2,83,41,8,0,53,104,34,64,185,168,0,0,52,14,239,255,151,104,34,64,185,1,192,40,139,2,0,0,20,1,0,128,210,224,3,20,170,10,253,255,151,8,28,0,83,200,3,0,53,227,99,1,145,226,3,19,170,225,3,23,170,224, + 3,24,170,55,238,255,151,226,23,64,249,7,0,128,18,227,3,0,170,250,67,0,57,6,0,128,18,255,95,0,169,229,3,19,170,4,0,128,210,225,3,20,170,224,3,24,170,112,238,255,151,13,0,0,20,104,14,64,185,104,1,0,52,250,2,0,53,231,43,64,249,230,3,25,42,229,3, + 21,42,228,3,19,170,227,3,23,170,226,3,22,170,225,3,24,170,224,3,20,170,91,0,0,148,178,250,255,151,8,28,64,249,104,1,0,181,255,131,3,145,112,215,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83,65,169,253,123,198,168,255, + 35,3,213,192,3,95,214,101,250,255,151,208,249,255,151,33,0,128,82,224,3,20,170,111,239,255,151,224,3,3,145,135,252,255,151,136,0,0,240,1,1,14,145,224,3,3,145,229,236,255,151,154,250,255,151,20,16,0,249,152,250,255,151,232,23,64,249,8,20,0,249, + 193,249,255,151,0,0,62,212,31,32,3,213,99,115,109,224,32,5,147,25,33,5,147,25,0,0,0,0,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,190,169,253,3,0,145,255,131,0,209,248,3,1,170,226,27,0,249,249,3,3, + 170,250,3,4,170,246,3,0,170,226,3,26,170,225,3,25,170,224,3,24,170,227,227,0,145,245,3,5,170,243,3,6,170,251,3,7,170,229,237,255,151,247,3,0,170,211,0,0,180,227,3,19,170,226,3,21,170,225,3,23,170,224,3,22,170,178,253,255,151,116,11,64,185,115, + 3,64,185,165,238,255,151,231,3,20,42,226,27,64,249,230,3,19,42,245,103,0,169,229,3,26,170,169,14,64,185,227,3,23,170,232,163,66,57,225,3,22,170,4,192,41,139,224,3,24,170,232,67,0,57,18,238,255,151,255,131,0,145,253,123,194,168,251,35,64,249, + 249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,183,169,253,3,0,145,255,131,0,209,249,3,0,170,40,3,64,185,250,3,1,170, + 251,3,2,170,250,31,0,249,233,11,1,50,251,51,0,249,247,3,3,170,31,1,9,107,245,3,4,170,248,3,5,42,244,3,6,42,246,3,7,170,96,14,0,84,65,250,255,151,8,8,64,249,104,3,0,180,136,0,0,176,8,85,69,249,0,0,128,210,0,1,63,214,243,3,0,170,57,250,255,151, + 8,8,64,249,31,1,19,235,64,2,0,84,40,3,64,185,9,14,0,24,31,1,9,107,192,1,0,84,201,13,0,24,31,1,9,107,96,1,0,84,231,3,24,42,230,3,22,170,229,3,20,42,228,3,21,170,227,3,23,170,226,3,27,170,225,3,26,170,224,3,25,170,214,238,255,151,192,10,0,53,232, + 6,64,249,245,35,9,169,169,14,64,185,105,11,0,52,229,3,20,42,228,3,21,170,227,3,23,170,226,3,24,42,225,67,2,145,224,195,1,145,248,237,255,151,240,31,192,61,236,139,64,185,8,62,20,14,240,19,128,61,31,1,12,107,162,8,0,84,250,59,64,249,141,2,128, + 210,251,35,64,249,246,75,64,185,104,3,64,249,201,126,64,211,10,17,64,185,40,125,13,155,11,193,42,139,74,7,64,249,112,105,234,60,105,1,10,139,42,17,64,185,8,2,38,30,240,19,128,61,232,51,0,185,31,1,24,107,236,5,0,84,232,71,64,185,31,3,8,107,140, + 5,0,84,232,79,64,185,9,125,13,155,232,6,64,249,42,193,42,139,73,1,8,139,52,81,0,209,139,6,64,185,203,1,0,52,243,3,11,42,43,238,255,151,8,192,51,139,40,1,0,180,179,0,0,52,39,238,255,151,136,6,64,185,9,192,40,139,2,0,0,20,9,0,128,210,40,65,192, + 57,232,2,0,53,236,139,64,185,136,2,64,185,168,2,48,55,224,31,64,249,227,131,2,145,226,3,21,170,225,3,23,170,79,237,255,151,243,3,0,170,23,238,255,151,136,14,64,185,231,75,64,185,229,3,21,170,255,67,0,57,230,51,64,185,227,3,19,170,244,95,0,169, + 226,51,64,249,225,3,25,170,4,192,40,139,224,31,64,249,133,237,255,151,236,139,64,185,214,6,0,17,223,2,12,107,141,2,128,210,35,248,255,84,255,131,0,145,253,123,201,168,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,255, + 35,3,213,192,3,95,214,134,249,255,151,0,0,62,212,77,79,67,224,82,67,67,224,72,0,128,185,9,245,126,146,40,105,96,248,41,1,8,203,42,1,0,139,64,33,0,209,246,215,255,23,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,104,28,64,249,9,1,128,185,42, + 245,126,146,72,105,97,248,73,1,8,203,42,1,1,139,64,33,0,209,234,215,255,151,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,41,0,64,57,8,0,64,57,10,1,9,75,10,1,0,53,11,0,1,203,40,29,0,19,168,0,0,52,41,28,64,56,104,105,97,56,10, + 1,9,75,106,255,255,52,232,3,10,75,9,125,31,83,32,125,74,75,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,31,0,0,241,36,24,64,250,105,0,0,84,66,1,0,181,31,0,0,57,8,11,0,148,200,2,128,82,8,0,0,185,31,8,0,148,192,2,128,82,253,123, + 193,168,255,35,3,213,192,3,95,214,233,3,0,170,74,0,0,203,72,105,233,56,40,21,0,56,104,1,0,52,33,4,0,209,129,255,255,181,1,1,0,181,31,0,0,57,247,10,0,148,72,4,128,82,8,0,0,185,14,8,0,148,64,4,128,82,239,255,255,23,0,0,128,82,237,255,255,23,0, + 0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,19,0,249,253,123,191,169,253,3,0,145,168,0,0,144,20,161,57,145,19,0,128,82,181,0,0,144,22,5,128,210,151,0,0,176,104,126,64,211,0,81,22,155,232,2,70,249,2,0,128,82,1,244,129,82,0,1,63,214,0,1, + 0,52,168,146,78,185,115,6,0,17,9,5,0,17,169,146,14,185,179,254,255,52,32,0,128,82,3,0,0,20,8,0,0,148,0,0,128,82,253,123,193,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,189,169,245,91,1,169,247, + 19,0,249,253,123,191,169,253,3,0,145,181,0,0,144,179,146,78,185,179,1,0,52,168,0,0,144,20,161,57,145,22,5,128,210,151,0,0,176,115,6,0,81,233,82,69,249,96,82,22,155,32,1,63,214,168,146,78,185,9,5,0,81,169,146,14,185,51,255,255,53,32,0,128,82, + 253,123,193,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,168,0,0,144,10,9,64,249,169,0,0,144,40,65,61,145,9,129,3,145,80,13,8,78,16,65,129,172,31,1,9,235,193,255,255,84,16,1,128,61,32,0,128,82,10,9,0,249,192,3,95, + 214,0,0,0,0,0,0,0,0,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,8,28,0,83,232,1,0,53,168,0,0,144,19,129,58,145,137,0,0,176,53,33,44,145,116,162,2,145,96,134,64,248,192,0,0,180,31,4,0,177,96,0,0,84,168,254,223, + 200,0,1,63,214,127,130,31,248,127,2,20,235,1,255,255,84,32,0,128,82,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,72,0,0,240,2,161,38,145,72,0,0,240,1,193,38,145,67,16, + 0,145,0,0,128,82,183,0,0,148,224,0,0,180,239,3,0,170,145,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,2,0,0,20,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,136,0,0,176,8,97,43,145,9,253,223,200,32,1,31,214,136,0,0,176,8,129, + 43,145,9,253,223,200,32,1,31,214,136,0,0,176,8,161,43,145,9,253,223,200,32,1,31,214,136,0,0,176,8,193,43,145,9,253,223,200,32,1,31,214,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,245,3,2,42,72,0,0,240,2,1,39,145,243, + 3,0,170,244,3,1,42,72,0,0,240,1,33,39,145,67,32,0,145,224,1,128,82,140,0,0,148,225,3,20,42,232,3,0,170,224,3,19,170,8,1,0,180,226,3,21,42,239,3,8,170,145,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,5,0,0,20,136,0,0,176,8,225,47,145,9,253,223, + 200,32,1,63,214,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,107,3,169,253,123,191,169,253,3,0,145,255,67,0,209,245,3,2,170,72,0,0,240,2,161,39,145,243, + 3,0,170,244,3,1,42,72,0,0,240,1,193,39,145,246,3,3,42,67,32,0,145,32,2,128,82,247,3,4,170,248,3,5,42,249,3,6,170,250,3,7,170,96,0,0,148,233,3,0,170,224,3,19,170,9,2,0,180,232,51,64,249,231,3,26,170,230,3,25,170,229,3,24,42,228,3,23,170,227,3, + 22,42,232,3,0,249,226,3,21,170,225,3,20,42,239,3,9,170,145,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,12,0,0,20,1,0,128,82,18,0,0,148,136,0,0,176,8,129,48,145,9,253,223,200,229,3,24,42,228,3,23,170,227,3,22,42,226,3,21,170,225,3,20,42,32, + 1,63,214,255,67,0,145,253,123,193,168,249,107,67,169,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,72,0,0,240,2,1,40,145,243,3,0,170,244,3,1,42,72,0,0,240,1,33,40, + 145,67,32,0,145,96,2,128,82,46,0,0,148,232,3,0,170,224,3,19,170,8,1,0,180,225,3,20,42,239,3,8,170,145,0,0,176,49,82,66,249,32,2,63,214,224,1,63,214,2,0,0,20,99,16,0,148,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243, + 15,31,248,253,123,191,169,253,3,0,145,72,0,0,240,2,113,40,145,72,0,0,240,1,129,40,145,243,3,0,170,67,16,0,145,32,3,128,82,19,0,0,148,232,3,0,170,40,1,0,180,225,3,19,170,160,0,128,146,239,3,8,170,145,0,0,176,49,82,66,249,32,2,63,214,224,1,63, + 214,2,0,0,20,192,0,0,24,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,31,32,3,213,37,2,0,192,0,0,0,0,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,189,169,253,3,0,145,169,0,0,144,54,129,58, + 145,225,19,0,249,218,194,2,145,249,3,0,42,245,3,2,170,73,91,121,248,248,3,3,170,191,59,3,213,183,0,0,144,235,10,64,249,106,21,0,18,105,1,9,202,32,45,202,154,31,4,0,177,96,8,0,84,96,8,0,181,191,2,24,235,0,7,0,84,72,0,0,240,8,129,15,145,137,0, + 0,176,41,225,48,145,232,39,1,169,138,0,0,176,91,225,45,145,180,70,64,184,211,90,116,248,191,59,3,213,147,0,0,180,127,6,0,177,161,8,0,84,38,0,0,20,23,89,116,248,2,0,129,82,40,253,223,200,1,0,128,210,224,3,23,170,0,1,63,214,243,3,0,170,115,6,0, + 181,104,255,223,200,0,1,63,214,31,92,1,113,193,2,0,84,72,0,0,240,1,33,38,145,226,0,128,210,224,3,23,170,245,15,0,148,0,2,0,52,72,0,0,240,1,97,38,145,226,0,128,210,224,3,23,170,239,15,0,148,64,1,0,52,137,0,0,144,40,225,48,145,8,253,223,200,2, + 0,128,82,1,0,128,210,224,3,23,170,0,1,63,214,243,3,0,170,83,3,0,181,192,78,52,139,1,0,128,146,0,214,255,151,232,39,65,169,191,2,24,235,97,250,255,84,136,0,0,240,11,9,64,249,10,8,128,82,64,79,57,139,105,21,0,18,74,1,9,75,8,0,128,146,8,45,202, + 154,1,1,11,202,243,213,255,151,0,0,128,210,253,123,195,168,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213,192,3,95,214,192,78,52,139,225,3,19,170,231,213,255,151,192,0,0,180,136,0,0,144,8,33,44,145,9,253, + 223,200,224,3,19,170,32,1,63,214,136,0,0,144,8,129,46,145,225,19,64,249,9,253,223,200,224,3,19,170,32,1,63,214,243,3,0,170,179,251,255,180,136,0,0,240,10,9,64,249,11,8,128,82,64,79,57,139,73,21,0,18,105,1,9,75,104,46,201,154,1,1,10,202,208,213, + 255,151,224,3,19,170,221,255,255,23,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,168,0,0,144,20,65,1,145,19,0,128,82,181,0,0,144,22,5,128,210,104,126,64,211,0,81,22,155,2,0,128,82,1,244,129,82,216,254,255,151, + 32,1,0,52,168,130,66,185,115,6,0,17,127,58,0,113,9,5,0,17,169,130,2,185,163,254,255,84,32,0,128,82,4,0,0,20,0,0,128,82,7,0,0,148,0,0,128,82,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,189,169,245, + 91,1,169,247,19,0,249,253,123,191,169,253,3,0,145,182,0,0,144,211,130,66,185,211,1,0,52,168,0,0,144,20,65,1,145,136,0,0,144,21,129,42,145,23,5,128,210,115,6,0,81,169,254,223,200,96,82,23,155,32,1,63,214,200,130,66,185,9,5,0,81,201,130,2,185, + 51,255,255,53,32,0,128,82,253,123,193,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,0,0,0,0,168,0,0,144,8,65,1,145,9,124,64,147,10,5,128,210,32,33,10,155,138,0,0,144,73,193,42,145,40,253,223,200,0,1,31,214,0,0,0,0, + 168,0,0,144,8,65,1,145,9,124,64,147,10,5,128,210,32,33,10,155,138,0,0,144,73,161,48,145,40,253,223,200,0,1,31,214,0,0,0,0,0,0,0,0,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,136,0,0,144,8,161,46,145,9,253,223,200,32,1,63,214,168,0,0,144, + 0,69,1,249,31,0,0,241,224,7,159,26,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,168,0,0,144,31,69,1,249,32,0,128,82,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,8,0,0,144,0,129,28,145,105,254,255,151,136,0,0,240,0,33,0, + 185,31,4,0,49,97,0,0,84,0,0,128,82,7,0,0,20,138,0,0,148,128,0,0,181,0,0,128,82,9,0,0,148,250,255,255,23,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,147, + 0,0,240,96,34,64,185,31,4,0,49,128,0,0,84,82,254,255,151,8,0,128,18,104,34,0,185,32,0,128,82,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,136,0,0,144,8,225,45,145, + 9,253,223,200,32,1,63,214,243,3,0,42,149,0,0,240,160,34,64,185,31,4,0,49,224,0,0,84,64,254,255,151,128,0,0,180,31,4,0,177,244,3,128,154,30,0,0,20,160,34,64,185,1,0,128,146,61,254,255,151,96,0,0,53,20,0,128,210,24,0,0,20,1,121,128,210,32,0,128, + 210,243,8,0,148,244,3,0,170,160,34,64,185,212,0,0,181,1,0,128,210,50,254,255,151,0,0,128,210,72,5,0,148,244,255,255,23,225,3,20,170,45,254,255,151,192,0,0,53,160,34,64,185,1,0,128,210,41,254,255,151,224,3,20,170,247,255,255,23,224,3,20,170,243, + 0,0,148,0,0,128,210,59,5,0,148,136,0,0,144,8,97,50,145,9,253,223,200,224,3,19,42,32,1,63,214,244,0,0,180,224,3,20,170,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,194,246,255,151,0,0,62,212,127,35,3,213,243,83,191,169, + 253,123,191,169,253,3,0,145,148,0,0,240,128,34,64,185,31,4,0,49,0,1,0,84,8,254,255,151,243,3,0,170,147,0,0,180,127,6,0,177,64,4,0,84,28,0,0,20,128,34,64,185,1,0,128,146,4,254,255,151,160,3,0,52,1,121,128,210,32,0,128,210,188,8,0,148,243,3,0, + 170,128,34,64,185,211,0,0,181,1,0,128,210,251,253,255,151,0,0,128,210,17,5,0,148,18,0,0,20,225,3,19,170,246,253,255,151,192,0,0,53,128,34,64,185,1,0,128,210,242,253,255,151,224,3,19,170,247,255,255,23,224,3,19,170,188,0,0,148,0,0,128,210,4,5, + 0,148,224,3,19,170,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,146,246,255,151,0,0,62,212,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,136,0,0,144,8,225,45,145,9,253,223,200,32,1,63,214,243,3,0,42,149,0,0, + 240,160,34,64,185,31,4,0,49,224,0,0,84,210,253,255,151,128,0,0,180,31,4,0,177,244,3,128,154,30,0,0,20,160,34,64,185,1,0,128,146,207,253,255,151,96,0,0,53,20,0,128,210,24,0,0,20,1,121,128,210,32,0,128,210,133,8,0,148,244,3,0,170,160,34,64,185, + 212,0,0,181,1,0,128,210,196,253,255,151,0,0,128,210,218,4,0,148,244,255,255,23,225,3,20,170,191,253,255,151,192,0,0,53,160,34,64,185,1,0,128,210,187,253,255,151,224,3,20,170,247,255,255,23,224,3,20,170,133,0,0,148,0,0,128,210,205,4,0,148,136, + 0,0,144,8,97,50,145,9,253,223,200,224,3,19,42,32,1,63,214,224,3,20,170,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,148,0,0,240,128,34,64,185,31,4,0,49, + 96,1,0,84,156,253,255,151,243,3,0,170,19,1,0,180,128,34,64,185,1,0,128,210,155,253,255,151,224,3,19,170,153,0,0,148,224,3,19,170,175,4,0,148,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,190,169,245,11,0,249,253, + 123,191,169,253,3,0,145,149,0,0,240,160,34,64,185,244,3,1,170,31,4,0,49,160,1,0,84,132,253,255,151,243,3,0,170,51,1,0,180,127,6,0,177,65,4,0,84,0,0,128,210,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,160,34,64,185, + 1,0,128,146,123,253,255,151,224,254,255,52,1,121,128,210,32,0,128,210,51,8,0,148,243,3,0,170,160,34,64,185,211,0,0,181,1,0,128,210,114,253,255,151,0,0,128,210,136,4,0,148,236,255,255,23,225,3,19,170,109,253,255,151,192,0,0,53,160,34,64,185,1, + 0,128,210,105,253,255,151,224,3,19,170,247,255,255,23,224,3,19,170,51,0,0,148,0,0,128,210,123,4,0,148,8,121,128,210,128,78,8,155,222,255,255,23,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,147,0,0,180,88,0,0,148, + 224,3,19,170,110,4,0,148,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,244,3,0,170,128,74,64,249,243,3,1,170,192,1,0,180,136,14,0,148,168,0,0,144,8,141,67,249,128,74,64, + 249,31,0,8,235,0,1,0,84,136,0,0,240,8,1,22,145,31,0,8,235,128,0,0,84,8,16,64,185,72,0,0,53,176,14,0,148,147,74,0,249,115,0,0,180,224,3,19,170,68,14,0,148,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,187, + 169,253,3,0,145,232,99,0,145,224,15,0,249,232,31,0,249,232,99,0,145,232,35,0,249,136,0,128,82,232,35,5,41,168,0,0,144,8,97,28,145,169,0,128,82,232,27,0,249,42,0,128,82,233,39,4,41,233,195,0,145,10,40,0,185,227,131,0,145,233,39,0,249,72,0,0,176, + 9,1,20,145,232,15,64,249,226,227,0,145,225,147,0,145,224,67,0,145,9,1,0,249,233,15,64,249,136,0,0,240,8,193,0,145,42,169,3,185,234,15,64,249,72,69,0,249,233,15,64,249,106,8,128,82,42,121,1,121,232,15,64,249,10,133,3,121,233,15,64,249,63,209, + 1,249,70,0,0,148,227,163,0,145,226,3,1,145,225,179,0,145,224,67,0,145,85,0,0,148,253,123,197,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,188,169,253,3,0,145,169,0,128,82,224,23,0,249,232,163,0,145,233,167,2,41,137,0,128,82,232, + 27,0,249,232,163,0,145,233,167,3,41,9,0,64,249,232,31,0,249,72,0,0,176,8,1,20,145,63,1,8,235,128,0,0,84,224,3,9,170,6,4,0,148,224,23,64,249,0,56,64,249,3,4,0,148,232,23,64,249,0,45,64,249,0,4,0,148,232,23,64,249,0,49,64,249,253,3,0,148,232,23, + 64,249,0,53,64,249,250,3,0,148,232,23,64,249,0,37,64,249,247,3,0,148,232,23,64,249,0,41,64,249,244,3,0,148,232,23,64,249,0,61,64,249,241,3,0,148,232,23,64,249,0,65,64,249,238,3,0,148,232,23,64,249,0,225,65,249,235,3,0,148,227,83,0,145,226,195, + 0,145,225,99,0,145,224,67,0,145,52,0,0,148,227,115,0,145,226,227,0,145,225,131,0,145,224,67,0,145,75,0,0,148,253,123,196,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,244,3,2,170,243,3,3,170,179, + 11,0,249,32,0,64,185,24,254,255,151,136,2,64,249,9,1,64,249,32,69,64,249,50,211,255,151,96,2,64,185,28,254,255,151,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,244,3, + 2,170,243,3,3,170,179,11,0,249,32,0,64,185,4,254,255,151,136,6,64,249,9,1,64,249,138,2,64,249,33,1,64,249,64,1,64,249,82,255,255,151,96,2,64,185,6,254,255,151,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243, + 83,191,169,253,123,190,169,253,3,0,145,243,3,2,170,244,3,3,170,180,11,0,249,32,0,64,185,238,253,255,151,104,2,64,249,9,1,64,249,51,69,64,249,83,1,0,180,224,3,19,170,62,211,255,151,224,0,0,53,136,0,0,240,8,193,0,145,127,2,8,235,96,0,0,84,224, + 3,19,170,157,3,0,148,128,2,64,185,233,253,255,151,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,243,3,2,170,244,3,3,170,180,11,0,249,32,0,64,185,210,253,255,151,104,2,64,249, + 19,1,64,249,96,74,64,249,192,1,0,180,177,13,0,148,96,74,64,249,168,0,0,144,8,141,67,249,31,0,8,235,0,1,0,84,136,0,0,240,8,1,22,145,31,0,8,235,128,0,0,84,8,16,64,185,72,0,0,53,217,13,0,148,127,74,0,249,128,2,64,185,200,253,255,151,253,123,194, + 168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,224,0,128,82,177,253,255,151,19,0,128,82,0,0,128,82,34,15,0,148,128,0,0,53,30,0,0,148,95,0,0,148,51,0,128,82,224,0,128, + 82,178,253,255,151,224,3,19,42,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,168,0,0,144,20,65,10,145,19,0,128,210,96,106,116,248,96,0,0,180,241,14,0,148,127,106,52,248,115,34, + 0,145,127,2,16,241,67,255,255,84,32,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,27,0,249,253,123,184,169,253,3,0,145,136,0,0,144,8,193,46,145,9,253,223,200, + 224,67,0,145,32,1,63,214,232,167,64,121,168,5,0,52,233,47,64,249,105,5,0,180,40,1,64,185,52,17,0,145,9,0,132,82,31,9,64,113,150,194,40,139,19,177,137,26,224,3,19,42,235,14,0,148,168,0,0,144,8,145,70,185,127,2,8,107,21,193,147,26,213,3,0,52,169, + 0,0,144,56,65,10,145,136,0,0,144,23,193,45,145,19,0,128,210,25,9,128,210,192,134,64,248,31,4,0,177,32,2,0,84,31,8,0,177,224,1,0,84,137,2,64,57,169,1,0,54,137,0,24,55,232,254,223,200,0,1,63,214,32,1,0,52,104,254,70,147,8,123,104,248,105,22,64, + 146,42,33,25,155,201,130,95,248,73,21,0,249,136,2,64,57,72,225,0,57,115,6,0,145,148,6,0,145,181,6,0,81,85,253,255,53,253,123,200,168,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243, + 83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,191,169,253,3,0,145,168,0,0,144,23,65,10,145,136,0,0,144,24,225,46,145,137,0,0,144,57,193,45,145,20,0,128,82,58,0,128,146,10,9,128,210,59,16,128,82,150,126,64,147,200,254, + 70,147,232,122,104,248,201,22,64,146,51,33,10,155,105,22,64,249,40,9,0,145,31,5,0,241,169,0,0,84,104,226,64,57,8,1,25,50,104,226,0,57,43,0,0,20,123,226,0,57,244,0,0,52,159,6,0,113,96,0,0,84,96,1,128,18,4,0,0,20,64,1,128,18,2,0,0,20,32,1,128, + 18,8,255,223,200,0,1,63,214,245,3,0,170,168,6,0,145,31,5,0,241,73,2,0,84,40,255,223,200,0,1,63,214,224,1,0,52,8,28,0,18,117,22,0,249,31,9,0,113,161,0,0,84,104,226,64,57,8,1,26,50,104,226,0,57,16,0,0,20,31,13,0,113,10,9,128,210,193,1,0,84,104, + 226,64,57,8,1,29,50,223,255,255,23,104,226,64,57,122,22,0,249,8,1,26,50,104,226,0,57,168,0,0,144,9,149,67,249,105,0,0,180,40,121,118,248,26,25,0,185,10,9,128,210,148,6,0,17,159,14,0,113,225,248,255,84,253,123,193,168,251,35,64,249,249,107,67, + 169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,136,0,0,144,8,129,44,145,9,253,223,200,32,1,63,214,168,0,0,144,0,77,3,249,136,0,0,144,8,161,44,145,9,253,223,200, + 32,1,63,214,168,0,0,144,0,81,3,249,32,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,49,253,255,151,168,0,0,144,1,97,27,145,24,1,0,148,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,0,0, + 0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,180,0,0,144,136,146,91,57,104,2,0,53,168,0,0,144,19,33,27,145,137,0,0,240,40,193,0,145,104,10,0,249,137,0,0,240,41,193,13,145,136,0,0,240,8,129,9,145,104,38,0,169,85,253,255,151,226, + 3,0,170,64,0,128,18,99,66,0,145,33,0,128,82,44,1,0,148,40,0,128,82,136,146,27,57,32,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,189,169,243,83,1,169,245,91,2,169,253,3,0,145,253,208,255,151,255,67,0, + 209,243,3,1,170,158,0,0,148,244,3,0,42,84,18,0,52,136,0,0,240,22,1,18,145,10,0,128,82,11,6,128,210,85,125,64,211,168,126,11,155,9,105,118,184,63,1,20,107,32,10,0,84,74,5,0,17,95,21,0,113,35,255,255,84,8,189,159,82,159,2,8,107,32,9,0,84,136,0, + 0,144,8,97,48,145,9,253,223,200,128,62,0,83,32,1,63,214,96,8,0,52,40,189,159,82,159,2,8,107,33,1,0,84,104,6,0,185,127,18,1,249,127,26,0,185,127,58,0,121,127,10,0,185,127,194,0,248,127,22,0,185,111,0,0,20,136,0,0,144,8,97,44,145,9,253,223,200, + 225,3,0,145,224,3,20,42,32,1,63,214,192,5,0,52,34,32,128,82,1,0,128,82,96,98,0,145,97,210,255,151,232,3,64,185,116,6,0,185,127,18,1,249,31,9,0,113,65,4,0,84,232,27,64,57,234,27,0,145,72,2,0,52,72,5,64,57,8,2,0,52,73,1,64,57,63,1,8,107,104,1, + 0,84,8,1,9,75,12,5,0,17,43,5,0,17,105,66,43,139,140,5,0,81,107,5,0,17,40,97,64,57,8,1,30,50,40,97,0,57,76,255,255,53,72,45,64,56,8,254,255,53,42,0,128,82,74,5,0,17,105,66,42,139,95,253,3,113,40,97,64,57,8,1,29,50,40,97,0,57,67,255,255,84,96, + 6,64,185,48,1,0,148,41,0,128,82,96,18,1,249,2,0,0,20,9,0,128,82,105,10,0,185,202,255,255,23,136,0,0,240,8,225,70,185,104,7,0,53,0,0,128,18,60,0,0,20,34,32,128,82,1,0,128,82,96,98,0,145,47,210,255,151,136,0,0,208,6,193,17,145,12,0,128,210,141, + 0,128,82,197,0,128,210,199,66,0,145,168,50,5,155,235,12,8,139,105,1,64,57,169,2,0,52,104,5,64,57,104,2,0,52,110,1,64,57,223,1,8,107,200,1,0,84,207,5,0,17,255,5,4,113,98,1,0,84,106,66,47,139,137,105,102,56,206,5,0,17,72,97,64,57,239,5,0,17,40, + 1,8,42,72,97,0,57,104,5,64,57,223,1,8,107,169,254,255,84,104,45,64,56,168,253,255,53,140,5,0,145,173,5,0,81,205,252,255,53,40,0,128,82,116,162,0,41,224,3,20,42,252,0,0,148,10,0,128,210,96,18,1,249,108,50,0,145,203,0,128,82,14,3,128,210,205,18, + 0,145,168,42,14,155,107,5,0,81,74,5,0,145,169,121,104,120,137,37,0,120,107,255,255,53,224,3,19,170,2,1,0,148,3,0,0,20,224,3,19,170,53,0,0,148,0,0,128,82,255,67,0,145,106,208,255,151,245,91,66,169,243,83,65,169,253,123,195,168,255,35,3,213,192, + 3,95,214,127,35,3,213,243,15,31,248,253,123,189,169,253,3,0,145,243,3,0,42,224,67,0,145,1,0,128,210,253,239,255,151,137,0,0,240,63,225,6,185,127,10,0,49,193,0,0,84,40,0,128,82,40,225,6,185,105,0,0,240,40,97,46,145,7,0,0,20,127,14,0,49,33,1,0, + 84,40,0,128,82,40,225,6,185,105,0,0,240,40,65,44,145,9,253,223,200,32,1,63,214,243,3,0,42,7,0,0,20,127,18,0,49,161,0,0,84,40,0,128,82,40,225,6,185,232,15,64,249,19,13,64,185,232,163,64,57,168,0,0,52,234,11,64,249,72,169,67,185,9,121,30,18,73, + 169,3,185,224,3,19,42,253,123,195,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,96,98,0,145,34,32,128,82,1,0,128,82,188,209,255,151,136,0,0,208,12,193,0,145,127,66,0,248,138,97, + 0,145,127,18,1,249,107,98,0,145,127,194,0,248,41,32,128,82,127,22,0,185,72,21,64,56,41,5,0,81,104,21,0,56,169,255,255,53,138,101,4,145,107,102,4,145,9,32,128,82,72,21,64,56,41,5,0,81,104,21,0,56,169,255,255,53,253,123,193,168,243,7,65,248,255, + 35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,244,3,0,170,245,3,1,170,137,170,67,185,136,0,0,208,8,13,72,185,63,1,8,106,160,0,0,84,136,74,64,249,104,0,0,180,147,70,64,249,23,0,0,20,160,0,128, + 82,179,251,255,151,147,70,64,249,168,2,64,249,127,2,8,235,224,1,0,84,83,1,0,180,224,3,19,170,2,209,255,151,224,0,0,53,136,0,0,208,8,193,0,145,127,2,8,235,96,0,0,84,224,3,19,170,97,1,0,148,179,2,64,249,147,70,0,249,224,3,19,170,191,208,255,151, + 160,0,128,82,169,251,255,151,243,0,0,180,224,3,19,170,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,231,242,255,151,0,0,62,212,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,255,195,9,209,253,123,0,169,253,3,0,145, + 243,3,0,42,226,15,0,249,52,28,0,83,227,23,0,249,225,3,3,170,224,3,2,170,196,255,255,151,224,3,19,42,116,255,255,151,232,15,64,249,245,3,0,42,8,69,64,249,9,5,64,185,191,2,9,107,97,0,0,84,0,0,128,82,72,0,0,20,0,69,128,210,144,10,0,148,243,3,0, + 170,179,0,0,181,0,0,128,210,52,1,0,148,0,0,128,18,64,0,0,20,232,15,64,249,224,3,1,145,2,69,128,82,1,69,64,249,215,207,255,151,225,3,1,145,2,69,128,82,224,3,19,170,211,207,255,151,225,3,19,170,127,2,0,185,224,3,21,42,177,254,255,151,245,3,0,42, + 191,6,0,49,193,0,0,84,107,4,0,148,200,2,128,82,8,0,0,185,224,3,19,170,233,255,255,23,84,0,0,53,29,10,0,148,232,15,64,249,0,69,64,249,178,208,255,151,0,1,0,53,232,15,64,249,0,69,64,249,137,0,0,208,40,193,0,145,31,0,8,235,64,0,0,84,16,1,0,148, + 40,0,128,82,104,2,0,185,232,15,64,249,19,69,0,249,233,15,64,249,136,0,0,208,8,13,72,185,42,169,67,185,95,1,8,106,33,2,0,84,232,99,0,145,232,27,0,249,168,0,128,82,233,163,0,145,232,35,4,41,227,131,0,145,233,31,0,249,226,195,0,145,225,147,0,145, + 224,67,0,145,169,0,0,148,180,0,0,52,232,23,64,249,9,1,64,249,138,0,0,208,73,113,3,249,0,0,128,210,244,0,0,148,224,3,21,42,253,123,64,169,255,195,9,145,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,31,144,14,113,0,2,0,84,31,160,14,113, + 96,1,0,84,31,212,14,113,192,0,0,84,72,0,0,176,8,225,41,145,31,216,14,113,224,19,136,154,9,0,0,20,72,0,0,176,0,161,41,145,6,0,0,20,72,0,0,176,0,97,41,145,3,0,0,20,72,0,0,176,0,33,41,145,192,3,95,214,127,35,3,213,253,123,190,169,243,11,0,249,253, + 3,0,145,98,207,255,151,255,131,28,209,243,3,0,170,96,6,64,185,40,189,159,82,31,0,8,107,192,10,0,84,104,0,0,240,8,97,44,145,9,253,223,200,225,67,0,145,32,1,63,214,0,10,0,52,8,0,128,82,233,163,0,145,40,21,0,56,8,5,0,17,31,1,4,113,163,255,255,84, + 11,4,128,82,232,91,64,57,235,163,0,57,233,91,0,145,136,1,0,52,236,163,0,145,42,5,64,57,5,0,0,20,31,1,4,113,162,0,0,84,139,73,40,56,8,5,0,17,31,1,10,107,105,255,255,84,40,45,64,56,232,254,255,53,101,6,64,185,6,0,128,82,228,163,12,145,3,32,128, + 82,226,163,0,145,33,0,128,82,0,0,128,210,170,12,0,148,103,6,64,185,6,32,128,82,97,18,65,249,229,163,4,145,255,3,0,185,4,32,128,82,227,163,0,145,2,32,128,82,0,0,128,210,16,13,0,148,103,6,64,185,6,32,128,82,97,18,65,249,229,163,8,145,255,3,0,185, + 4,32,128,82,227,163,0,145,2,64,128,82,0,0,128,210,6,13,0,148,44,0,128,82,10,0,128,210,238,163,12,145,13,32,128,82,239,163,4,145,231,163,8,145,201,37,64,120,233,0,0,54,105,66,44,139,75,105,111,56,40,97,64,57,8,1,28,50,40,97,0,57,9,0,0,20,233, + 0,8,54,105,66,44,139,75,105,103,56,40,97,64,57,8,1,27,50,40,97,0,57,2,0,0,20,11,0,128,82,72,1,19,139,11,101,4,57,74,5,0,145,140,5,0,17,173,5,0,81,109,253,255,53,32,0,0,20,12,0,128,210,11,4,128,82,13,32,128,82,104,133,1,81,31,101,0,113,8,1,0, + 84,104,125,0,81,106,66,40,139,110,29,0,83,73,97,64,57,40,1,28,50,72,97,0,57,13,0,0,20,104,5,2,81,31,101,0,113,40,1,0,84,104,125,0,81,106,66,40,139,73,97,64,57,40,1,27,50,105,1,3,17,72,97,0,57,46,29,0,83,2,0,0,20,14,0,128,82,104,2,12,139,14,101, + 4,57,107,5,0,17,140,5,0,145,173,5,0,81,173,252,255,53,255,131,28,145,238,206,255,151,243,11,64,249,253,123,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,190,169,253,3,0,145,244,3,2,170,246,3,3,170, + 182,11,0,249,32,0,64,185,141,250,255,151,136,2,64,249,9,1,64,249,42,69,64,249,65,97,0,145,136,0,0,240,21,33,27,145,160,2,64,249,32,1,0,180,161,0,0,180,34,32,128,82,232,206,255,151,211,2,128,82,8,0,0,20,34,32,128,210,1,0,128,82,91,208,255,151, + 130,3,0,148,211,2,128,82,19,0,0,185,153,0,0,148,136,2,64,249,9,1,64,249,42,69,64,249,75,101,4,145,168,6,64,249,168,1,0,180,235,0,0,180,105,1,4,145,112,69,193,172,16,69,129,172,127,1,9,235,161,255,255,84,9,0,0,20,18,228,0,79,9,1,4,145,18,73,129, + 172,31,1,9,235,193,255,255,84,108,3,0,148,19,0,0,185,132,0,0,148,136,6,64,249,9,1,64,249,32,1,64,249,182,207,255,151,32,1,0,53,136,6,64,249,9,1,64,249,32,1,64,249,136,0,0,208,8,193,0,145,31,0,8,235,64,0,0,84,19,0,0,148,136,2,64,249,11,1,64,249, + 137,6,64,249,42,1,64,249,104,69,64,249,72,1,0,249,137,2,64,249,42,1,64,249,64,69,64,249,107,207,255,151,192,2,64,185,85,250,255,151,253,123,194,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253, + 123,191,169,253,3,0,145,64,2,0,180,226,3,0,170,136,0,0,240,0,69,65,249,105,0,0,240,40,129,47,145,9,253,223,200,1,0,128,82,32,1,63,214,32,1,0,53,104,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,106,3,0,148,243,3,0,42,54,3,0,148,19,0,0,185,253, + 123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,244,3,0,170,245,3,1,170,159,2,21,235,96,4,0,84,243,3,20,170,104,2,64,249,8,1,0,180,239,3,8,170,113,0,0,240,49,82,66,249,32, + 2,63,214,224,1,63,214,8,28,0,83,136,0,0,52,115,66,0,145,127,2,21,235,161,254,255,84,127,2,21,235,128,2,0,84,127,2,20,235,0,2,0,84,115,34,0,209,104,130,95,248,40,1,0,180,104,2,64,249,232,0,0,180,0,0,128,82,239,3,8,170,113,0,0,240,49,82,66,249, + 32,2,63,214,224,1,63,214,115,66,0,209,104,34,0,145,31,1,20,235,97,254,255,84,0,0,128,82,2,0,0,20,32,0,128,82,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145, + 244,3,0,170,243,3,1,170,159,2,19,235,128,1,0,84,104,130,95,248,232,0,0,180,0,0,128,82,239,3,8,170,113,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,115,66,0,209,127,2,20,235,193,254,255,84,32,0,128,82,253,123,193,168,243,83,193,168,255,35,3, + 213,192,3,95,214,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,0,0,128,210,97,0,0,20,160,0,128,82,96,0,62,212,192,3,95,214,0,0,0,0,136,0,0,240,0,117,3,249,192,3,95,214,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,99,2,169,253,123,191, + 169,253,3,0,145,248,3,5,170,243,3,0,170,0,3,64,249,244,3,1,170,245,3,2,170,246,3,3,42,247,3,4,170,128,0,0,181,224,3,24,170,141,238,255,151,96,2,0,180,8,220,65,249,40,2,0,180,228,3,23,170,227,3,22,42,226,3,21,170,225,3,20,170,224,3,19,170,239, + 3,8,170,113,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,253,123,193,168,247,99,66,169,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,136,0,0,240,0,161,27,145,225,3,24,170,22,0,0,148,136,0,0,208,9,9,64,249,11,0,64,249,228,3,23,170,227, + 3,22,42,42,21,0,18,41,1,11,202,226,3,21,170,44,45,202,154,225,3,20,170,224,3,19,170,236,0,0,180,239,3,12,170,113,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,229,255,255,23,191,255,255,151,0,0,62,212,0,0,0,0,127,35,3,213,243,83,191,169,253, + 123,191,169,253,3,0,145,243,3,1,170,104,66,64,57,244,3,0,170,200,1,0,53,104,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,40,0,128,82,127,6,0,249,104,66,0,57,105,0,0,240,40,97,50,145,9,253,223,200,32,1,63,214,8,0,128,210,2,0,0,20,104,6,64,249, + 128,14,8,139,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,187,169,253,3,0,145,136,0,0,240,8,65,71,185,255,11,0,249,255,131,0,57,255,227,0,57,255,3,1,57,255,35,1,57,8,1,0,53,136,0,0,208,8,97,27,145,16, + 1,192,61,233,163,0,145,48,1,128,61,41,0,128,82,233,227,0,57,229,67,0,145,149,255,255,151,224,67,0,145,179,237,255,151,253,123,197,168,255,35,3,213,192,3,95,214,0,0,0,0,136,0,0,240,8,193,27,145,0,1,0,169,0,1,1,169,192,3,95,214,0,0,0,0,127,35, + 3,213,253,123,190,169,253,3,0,145,227,83,0,145,226,67,0,145,225,99,0,145,224,67,0,145,104,0,128,82,232,163,2,41,187,0,0,148,253,123,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,27,0,249, + 251,31,0,249,253,123,189,169,253,3,0,145,243,3,0,42,21,0,128,210,27,0,128,82,52,0,128,82,180,67,0,57,127,46,0,113,140,5,0,84,32,1,0,84,127,10,0,113,192,5,0,84,127,18,0,113,160,0,0,84,127,26,0,113,64,5,0,84,127,34,0,113,65,3,0,84,244,249,255, + 151,245,3,0,170,85,1,0,181,0,0,128,18,253,123,195,168,251,31,64,249,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,169,2,64,249,72,0,0,144,8,225,66,249,42,17,8,139,5,0,0,20,40,5,64,185,31,1,19,107,160,0,0, + 84,41,65,0,145,63,1,10,235,97,255,255,84,9,0,128,210,201,0,0,181,33,2,0,148,200,2,128,82,8,0,0,185,56,255,255,151,230,255,255,23,55,33,0,145,20,0,128,82,191,67,0,57,9,0,0,20,127,62,0,113,128,0,0,84,104,86,0,81,31,5,0,113,104,254,255,84,224,3, + 19,42,92,0,0,148,247,3,0,170,24,0,128,210,116,0,0,52,96,0,128,82,7,249,255,151,246,2,64,249,136,0,0,208,25,65,0,145,180,0,0,52,40,3,64,249,10,21,0,18,201,2,8,202,54,45,202,154,223,6,0,241,96,4,0,84,182,8,0,180,127,46,0,113,232,1,0,84,8,34,129, + 82,8,37,211,26,136,1,0,54,184,6,64,249,184,19,0,249,191,6,0,249,127,34,0,113,193,2,0,84,67,249,255,151,27,16,64,185,187,23,0,185,64,249,255,151,136,17,128,82,8,16,0,185,127,34,0,113,193,1,0,84,72,0,0,144,9,229,66,249,168,2,64,249,10,17,9,139, + 75,0,0,144,104,233,66,249,73,17,8,139,170,15,0,249,95,1,9,235,192,0,0,84,95,5,0,249,74,65,0,145,251,255,255,23,40,3,64,249,232,2,0,249,116,0,0,52,96,0,128,82,226,248,255,151,223,6,0,241,97,0,0,84,0,0,128,82,164,255,255,23,127,34,0,113,65,1,0, + 84,35,249,255,151,1,16,64,185,0,1,128,82,239,3,22,170,113,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,7,0,0,20,224,3,19,42,239,3,22,170,113,0,0,240,49,82,66,249,32,2,63,214,224,1,63,214,127,46,0,113,136,253,255,84,8,34,129,82,8,37,211,26,40, + 253,7,54,184,6,0,249,127,34,0,113,193,252,255,84,12,249,255,151,27,16,0,185,227,255,255,23,116,0,0,52,96,0,128,82,191,248,255,151,96,0,128,82,181,231,255,151,0,0,62,212,0,0,0,0,31,8,0,113,192,2,0,84,31,24,0,113,32,2,0,84,31,60,0,113,96,1,0,84, + 31,84,0,113,160,0,0,84,31,88,0,113,96,1,0,84,0,0,128,210,14,0,0,20,136,0,0,240,8,193,27,145,0,33,0,145,10,0,0,20,136,0,0,240,8,193,27,145,0,97,0,145,6,0,0,20,136,0,0,240,0,1,28,145,3,0,0,20,136,0,0,240,0,193,27,145,192,3,95,214,127,35,3,213, + 243,83,191,169,253,123,190,169,253,3,0,145,243,3,3,170,179,11,0,249,32,0,64,185,143,248,255,151,136,0,0,208,9,9,64,249,42,21,0,18,139,0,0,240,104,129,67,249,41,1,8,202,52,45,202,154,96,2,64,185,144,248,255,151,224,3,20,170,253,123,194,168,243, + 83,193,168,255,35,3,213,192,3,95,214,136,0,0,208,0,137,3,249,192,3,95,214,0,0,0,0,32,0,128,82,97,0,0,20,31,32,3,213,0,0,0,0,127,35,3,213,243,15,31,248,253,123,187,169,253,3,0,145,136,0,0,208,8,65,71,185,255,11,0,249,255,131,0,57,243,3,0,170, + 255,227,0,57,255,3,1,57,255,35,1,57,8,1,0,53,136,0,0,176,8,97,27,145,16,1,192,61,233,163,0,145,48,1,128,61,41,0,128,82,233,227,0,57,179,0,0,181,0,0,128,82,72,0,0,148,243,3,0,42,16,0,0,20,225,67,0,145,224,3,19,170,21,0,0,148,96,0,0,52,19,0,128, + 18,10,0,0,20,104,22,64,185,191,59,3,213,8,45,11,83,168,0,0,52,224,3,19,170,218,11,0,148,127,11,0,148,224,254,255,53,19,0,128,82,224,67,0,145,157,236,255,151,224,3,19,42,253,123,197,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3, + 213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,243,3,0,170,105,22,64,185,246,3,1,170,191,59,3,213,40,5,0,18,31,9,0,113,129,3,0,84,63,5,26,114,64,3,0,84,104,82,64,169,21,1,20,75,116,2,0,249,191,2,0,113,127,18,0,185,141,2,0,84,186, + 11,0,148,227,3,22,170,226,3,21,42,225,3,20,170,166,12,0,148,191,2,0,107,192,0,0,84,1,2,128,82,96,82,0,145,97,205,255,151,0,0,128,18,9,0,0,20,104,22,64,185,191,59,3,213,8,9,2,83,136,0,0,52,65,0,128,18,96,82,0,145,140,205,255,151,0,0,128,82,253, + 123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,188,169,253,3,0,145,233,67,0,145,224,67,0,57,232,83,0,145,232,167,2,169,9,1,128,82,255,255,2,41,232,99,0,145,233,167,3,41,227,115,0,145,232,31,0, + 249,226,163,0,145,225,131,0,145,224,71,0,145,62,0,0,148,232,67,64,57,233,23,64,185,31,1,0,113,232,27,64,185,32,17,136,26,253,123,196,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,243,3,2,170,244, + 3,3,170,180,11,0,249,32,0,64,249,106,0,0,148,106,6,64,249,104,2,64,249,9,1,64,249,41,4,0,180,41,21,64,185,191,59,3,213,40,53,13,83,168,3,0,52,40,5,0,18,31,9,0,113,97,0,0,84,63,5,26,114,65,0,0,84,9,2,88,54,104,10,64,249,9,1,64,57,233,0,0,53,104, + 2,64,249,8,1,64,249,9,21,64,185,191,59,3,213,40,5,1,83,200,1,0,52,104,2,64,249,0,1,64,249,102,255,255,151,31,4,0,49,192,0,0,84,106,6,64,249,72,1,64,185,9,5,0,17,73,1,0,185,4,0,0,20,104,14,64,249,9,0,128,18,9,1,0,185,128,2,64,249,74,0,0,148,253, + 123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,186,169,253,3,0,145,245,3,2,170,244,3,3,170,180,31,0,249,32,0,64,185,195,247,255,151,136,0,0,208,19,149,67,249,137,0,0,208,40,33,71, + 185,118,206,40,139,179,27,0,249,127,2,22,235,160,4,0,84,104,2,64,249,168,15,0,249,170,2,64,249,200,1,0,180,9,21,64,185,191,59,3,213,40,53,13,83,72,1,0,52,40,5,0,18,31,9,0,113,97,0,0,84,63,5,26,114,225,0,0,84,201,0,88,55,72,1,64,185,9,5,0,17, + 73,1,0,185,115,34,0,145,235,255,255,23,170,10,64,249,169,6,64,249,168,2,64,249,171,99,0,145,171,35,0,249,168,39,0,249,169,43,0,249,170,47,0,249,168,15,64,249,168,19,0,249,168,23,0,249,163,131,0,145,162,3,1,145,161,163,0,145,160,67,0,145,152, + 255,255,151,238,255,255,23,128,2,64,185,159,247,255,151,253,123,198,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,104,0,0,208,8,193,42,145,9,253,223,200,0,192,0,145,32,1,31,214,0,0,0,0,104,0,0,208,8,161,48,145,9,253,223, + 200,0,192,0,145,32,1,31,214,0,0,0,0,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,107,3,169,253,123,191,169,253,3,0,145,147,0,0,208,104,34,71,185,116,0,128,82,104,0,0,53,8,64,128,82,3,0,0,20,31,13,0,113,136,178,136,26,1,1,128,210, + 104,34,7,185,0,125,64,147,208,0,0,148,152,0,0,208,0,151,3,249,0,0,128,210,40,253,255,151,8,151,67,249,136,1,0,181,1,1,128,210,116,34,7,185,96,0,128,210,198,0,0,148,0,151,3,249,0,0,128,210,31,253,255,151,8,151,67,249,104,0,0,181,0,0,128,18,31, + 0,0,20,136,0,0,176,19,193,27,145,137,0,0,208,55,65,10,145,21,0,128,210,22,0,128,210,116,0,128,82,26,9,128,210,57,0,128,18,2,0,128,82,1,244,129,82,96,194,0,145,250,245,255,151,8,151,67,249,169,254,70,147,170,22,64,146,211,106,40,248,232,122,105, + 248,73,33,26,155,43,21,64,249,104,9,0,145,31,9,0,241,72,0,0,84,121,26,0,185,181,6,0,145,214,34,0,145,115,98,1,145,148,6,0,81,180,253,255,53,0,0,128,82,253,123,193,168,249,107,67,169,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192, + 3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,181,254,255,151,70,14,0,148,104,0,0,208,21,129,42,145,19,0,128,210,116,0,128,82,150,0,0,208,200,150,67,249,96,106,104,248,116,14,0,148,200, + 150,67,249,105,106,104,248,170,254,223,200,32,193,0,145,64,1,63,214,115,34,0,145,148,6,0,81,212,254,255,53,192,150,67,249,218,252,255,151,223,150,3,249,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,232,3,18,170, + 8,49,64,249,9,189,64,185,32,33,8,83,192,3,95,214,0,0,0,0,232,3,18,170,8,49,64,249,9,17,64,249,42,9,64,185,64,125,31,83,192,3,95,214,127,35,3,213,253,123,190,169,253,3,0,145,255,19,0,185,246,255,255,151,8,28,0,83,104,0,0,53,224,67,0,145,38,246, + 255,151,232,19,64,185,31,5,0,113,224,7,159,26,253,123,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,183,247,255,151,128,0,0,181,136,0,0,176,0,225,31,145,2,0,0,20,0,128,0,145,253,123,193,168,255,35,3,213,192, + 3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,171,247,255,151,128,0,0,181,136,0,0,176,0,241,31,145,2,0,0,20,0,144,0,145,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,42,157,247,255, + 151,128,0,0,181,136,0,0,176,8,241,31,145,2,0,0,20,8,144,0,145,224,3,19,42,19,1,0,185,13,0,0,148,243,3,0,42,147,247,255,151,128,0,0,181,136,0,0,176,8,225,31,145,2,0,0,20,8,128,0,145,19,1,0,185,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95, + 214,72,0,0,176,10,65,4,145,9,0,128,82,43,125,125,211,104,105,106,184,31,0,8,107,224,1,0,84,41,5,0,17,63,181,0,113,67,255,255,84,8,76,0,81,31,69,0,113,104,0,0,84,160,1,128,82,9,0,0,20,8,240,2,81,31,57,0,113,10,1,128,82,201,2,128,82,64,145,137, + 26,3,0,0,20,72,17,0,145,96,105,104,184,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,1,170,52,0,128,82,96,54,0,185,116,226,0,57,224,255,255,151,96,46,0,185,116,194,0,57,253,123,193,168,243,83,193,168,255,35,3,213, + 192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,160,0,0,180,232,3,128,146,8,9,192,154,31,1,1,235,131,3,0,84,8,124,1,155,41,0,128,210,149,0,0,208,160,70,65,249,31,1,0,241,51,1,136,154,104,0,0,208,8,97, + 47,145,9,253,223,200,226,3,19,170,1,1,128,82,32,1,63,214,96,2,0,181,104,0,0,208,20,97,47,145,13,14,0,148,96,1,0,52,224,3,19,170,84,229,255,151,0,1,0,52,160,70,65,249,226,3,19,170,136,254,223,200,1,1,128,82,0,1,63,214,192,254,255,180,5,0,0,20, + 129,255,255,151,136,1,128,82,8,0,0,185,0,0,128,210,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,54,0,0,20,31,32,3,213,31,32,3,213,0,0,0,0,127,35,3,213,243,83,191,169,253,123,188,169,253,3,0,145,243,3,0,170,244,3,1,170, + 1,0,128,210,224,99,0,145,88,234,255,151,232,19,64,249,41,189,159,82,8,13,64,185,31,1,9,107,33,1,0,84,232,195,64,57,168,0,0,52,234,15,64,249,72,169,67,185,9,121,30,18,73,169,3,185,35,189,159,82,17,0,0,20,218,244,255,151,232,195,64,57,0,1,0,53, + 168,0,0,52,234,15,64,249,72,169,67,185,9,121,30,18,73,169,3,185,35,0,128,82,7,0,0,20,168,0,0,52,234,15,64,249,72,169,67,185,9,121,30,18,73,169,3,185,3,0,128,82,226,67,0,145,225,3,19,170,224,3,20,170,165,0,0,148,96,0,0,52,0,0,128,210,2,0,0,20, + 96,10,64,249,253,123,196,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,188,169,253,3,0,145,243,3,0,170,247,3,1,170,247,0,0,181,55,255,255,151,200,2,128,82, + 8,0,0,185,78,252,255,151,192,2,128,82,124,0,0,20,255,2,0,249,20,0,128,210,104,2,64,249,255,127,2,169,21,0,128,210,255,27,0,249,136,3,0,180,84,229,135,82,225,67,0,145,244,35,0,121,224,3,8,170,255,75,0,57,235,14,0,148,104,2,64,249,96,1,0,181,227, + 131,0,145,2,0,128,210,1,0,128,210,224,3,8,170,90,1,0,148,245,3,0,42,85,1,0,52,244,91,66,169,243,3,20,170,18,0,0,20,225,3,0,170,224,3,8,170,226,131,0,145,185,1,0,148,246,3,0,42,246,1,0,53,104,142,64,248,8,253,255,181,244,87,66,169,168,2,20,203, + 9,253,67,147,54,5,0,145,25,0,128,210,234,3,20,170,24,0,0,20,96,134,64,248,190,251,255,151,127,2,22,235,161,255,255,84,36,0,0,20,244,87,66,169,243,3,20,170,3,0,0,20,96,134,64,248,182,251,255,151,127,2,21,235,161,255,255,84,245,3,22,42,27,0,0, + 20,75,133,64,248,104,1,192,57,233,3,11,170,104,0,0,52,40,29,192,56,232,255,255,53,40,1,11,203,9,1,25,139,57,5,0,145,95,1,21,235,193,254,255,84,34,0,128,210,225,3,25,170,224,3,22,170,65,230,255,151,243,3,0,170,211,1,0,181,0,0,128,210,159,251, + 255,151,243,3,20,170,3,0,0,20,96,134,64,248,155,251,255,151,127,2,21,235,161,255,255,84,21,0,128,18,224,3,20,170,150,251,255,151,224,3,21,42,40,0,0,20,106,14,22,139,246,3,20,170,223,2,21,235,234,15,0,249,248,3,10,170,192,2,0,84,123,2,22,203, + 194,2,64,249,72,0,192,57,233,3,2,170,104,0,0,52,40,29,192,56,232,255,255,53,40,1,2,203,26,5,0,145,73,1,24,203,227,3,26,170,33,1,25,139,224,3,24,170,82,14,0,148,96,3,0,53,120,107,54,248,214,34,0,145,223,2,21,235,234,15,64,249,88,3,24,139,161, + 253,255,84,0,0,128,210,243,2,0,249,118,251,255,151,243,3,20,170,3,0,0,20,96,134,64,248,114,251,255,151,127,2,21,235,161,255,255,84,224,3,20,170,110,251,255,151,0,0,128,82,253,123,196,168,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169, + 243,83,197,168,255,35,3,213,192,3,95,214,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,0,0,128,210,201,251,255,151,0,0,62,212,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,248,103,2,169,253,123,191,169,253,3,0,145,244,3,0,170,243,3,1,170, + 248,3,3,42,116,1,0,181,104,162,64,57,136,0,0,52,96,10,64,249,79,251,255,151,127,162,0,57,104,66,0,145,127,14,0,249,31,1,0,249,127,18,0,249,83,0,0,20,136,2,192,57,104,3,0,53,104,14,64,249,168,2,0,181,104,162,64,57,136,0,0,52,96,10,64,249,65,251, + 255,151,127,162,0,57,64,0,128,210,116,66,0,145,149,4,0,148,31,0,0,241,128,2,0,249,136,1,128,82,0,1,159,26,31,0,0,113,233,23,159,154,31,0,0,113,232,23,159,26,104,162,0,57,105,14,0,249,96,0,0,52,60,0,0,20,116,66,0,145,136,2,64,249,31,1,0,121,227, + 255,255,23,5,0,128,82,4,0,128,210,3,0,128,18,226,3,20,170,33,1,128,82,224,3,24,42,204,2,0,148,246,3,0,42,217,126,64,147,200,126,64,147,40,1,0,181,105,0,0,208,40,225,45,145,9,253,223,200,32,1,63,214,127,254,255,151,102,254,255,151,0,0,64,185, + 37,0,0,20,105,14,64,249,31,1,9,235,169,2,0,84,104,162,64,57,136,0,0,52,96,10,64,249,19,251,255,151,127,162,0,57,192,126,127,147,117,66,0,145,103,4,0,148,31,0,0,241,160,2,0,249,136,1,128,82,0,1,159,26,31,0,0,113,41,3,159,154,31,0,0,113,232,23, + 159,26,104,162,0,57,105,14,0,249,96,0,0,52,14,0,0,20,117,66,0,145,164,2,64,249,229,3,9,42,3,0,128,18,226,3,20,170,33,1,128,82,224,3,24,42,161,2,0,148,8,124,64,147,8,251,255,180,8,5,0,209,104,18,0,249,0,0,128,82,253,123,193,168,248,103,66,169, + 245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,248,103,2,169,253,123,191,169,253,3,0,145,244,3,0,170,243,3,1,170,248,3,3,42,116,1,0,181,104,162,64,57,136,0,0,52,96,10,64,249,225,250,255, + 151,127,162,0,57,104,66,0,145,127,14,0,249,31,1,0,249,127,18,0,249,89,0,0,20,136,2,64,121,104,3,0,53,104,14,64,249,168,2,0,181,104,162,64,57,136,0,0,52,96,10,64,249,211,250,255,151,127,162,0,57,32,0,128,210,116,66,0,145,39,4,0,148,31,0,0,241, + 128,2,0,249,136,1,128,82,0,1,159,26,31,0,0,113,233,23,159,154,31,0,0,113,232,23,159,26,104,162,0,57,105,14,0,249,96,0,0,52,66,0,0,20,116,66,0,145,136,2,64,249,31,1,0,57,227,255,255,23,7,0,128,210,6,0,128,210,5,0,128,82,4,0,128,210,3,0,128,18, + 226,3,20,170,1,0,128,82,224,3,24,42,144,2,0,148,25,124,64,147,22,124,64,147,54,1,0,181,104,0,0,208,8,225,45,145,9,253,223,200,32,1,63,214,16,254,255,151,247,253,255,151,0,0,64,185,42,0,0,20,105,14,64,249,223,2,9,235,169,2,0,84,104,162,64,57, + 136,0,0,52,96,10,64,249,164,250,255,151,127,162,0,57,224,3,22,170,117,66,0,145,248,3,0,148,31,0,0,241,160,2,0,249,136,1,128,82,0,1,159,26,31,0,0,113,41,3,159,154,31,0,0,113,232,23,159,26,104,162,0,57,105,14,0,249,96,0,0,52,19,0,0,20,117,66,0, + 145,164,2,64,249,229,3,9,42,7,0,128,210,6,0,128,210,3,0,128,18,226,3,20,170,1,0,128,82,224,3,24,42,100,2,0,148,8,124,64,147,136,0,0,181,105,0,0,208,40,225,45,145,213,255,255,23,8,5,0,209,104,18,0,249,0,0,128,82,253,123,193,168,248,103,66,169, + 245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,27,0,249,253,123,191,169,253,3,0,145,246,3,0,170,200,2,192,57,233,3,22,170,249,3,1,170,245,3,2,170,244,3,3,170,104,0,0,52, + 40,29,192,56,232,255,255,53,40,1,22,203,23,5,0,145,232,3,53,170,255,2,8,235,41,1,0,84,128,1,128,82,253,123,193,168,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,232,2,21,139,24,5,0,145,224,3,24,170,33,0,128, + 210,253,253,255,151,243,3,0,170,245,0,0,180,227,3,21,170,226,3,25,170,225,3,24,170,224,3,19,170,36,13,0,148,224,6,0,53,1,3,21,203,227,3,23,170,226,3,22,170,96,2,21,139,30,13,0,148,32,6,0,53,136,166,64,169,31,1,9,235,129,4,0,84,128,2,64,249,160, + 1,0,181,1,1,128,210,128,0,128,210,231,253,255,151,128,2,0,249,0,0,128,210,64,250,255,151,136,2,64,249,8,2,0,180,136,6,0,249,8,129,0,145,136,10,0,249,22,0,0,20,40,1,0,203,21,253,67,147,10,0,240,146,191,2,10,235,232,0,0,84,2,1,128,210,161,250, + 127,211,174,1,0,148,224,0,0,181,0,0,128,210,47,250,255,151,224,3,19,170,148,1,128,82,44,250,255,151,13,0,0,20,8,12,21,139,128,34,0,169,9,16,21,139,0,0,128,210,137,10,0,249,37,250,255,151,136,6,64,249,19,1,0,249,137,6,64,249,42,33,0,145,138,6, + 0,249,20,0,128,82,0,0,128,210,29,250,255,151,224,3,20,42,183,255,255,23,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,0,0,128,210,127,250,255,151,0,0,62,212,0,0,0,0,127,35,3,213,253,123,187,169,243,83,1,169,245,91,2,169,247,99,3,169,249,35, + 0,249,253,3,0,145,153,200,255,151,255,67,11,209,244,3,0,170,224,3,1,170,245,3,2,170,83,23,0,88,11,0,0,20,8,0,192,57,8,189,0,81,9,29,0,83,63,181,0,113,104,0,0,84,105,38,200,154,201,0,0,55,225,3,0,170,224,3,20,170,57,13,0,148,31,0,20,235,161,254, + 255,84,9,0,192,57,63,233,0,113,65,1,0,84,136,6,0,145,31,0,8,235,224,0,0,84,227,3,21,170,2,0,128,210,1,0,128,210,224,3,20,170,116,255,255,151,152,0,0,20,40,189,0,81,9,29,0,83,63,181,0,113,168,0,0,84,105,38,200,154,105,0,0,54,42,0,128,82,2,0,0, + 20,10,0,128,82,8,0,20,203,255,255,0,169,95,1,0,113,255,255,1,169,224,35,0,145,255,23,0,249,225,3,20,170,255,195,0,57,249,7,136,154,176,253,255,151,104,0,0,176,8,33,43,145,9,253,223,200,5,0,128,82,4,0,128,210,3,0,128,82,226,35,2,145,1,0,128,82, + 32,1,63,214,243,3,0,170,127,6,0,177,161,1,0,84,227,3,21,170,2,0,128,210,1,0,128,210,224,3,20,170,79,255,255,151,232,195,64,57,243,3,0,42,104,0,0,52,224,15,64,249,196,249,255,151,224,3,19,42,109,0,0,20,168,38,64,169,41,1,8,203,56,253,67,147,1, + 0,128,210,255,255,5,169,224,227,0,145,255,255,6,169,255,63,0,249,255,3,2,57,238,231,255,151,232,35,64,249,41,189,159,82,8,13,64,185,31,1,9,107,33,1,0,84,232,67,65,57,168,0,0,52,234,31,64,249,72,169,67,185,9,121,30,18,73,169,3,185,35,189,159, + 82,17,0,0,20,112,242,255,151,232,67,65,57,0,1,0,53,168,0,0,52,234,31,64,249,72,169,67,185,9,121,30,18,73,169,3,185,35,0,128,82,7,0,0,20,168,0,0,52,234,31,64,249,72,169,67,185,9,121,30,18,73,169,3,185,3,0,128,82,226,3,0,145,225,99,1,145,224,211, + 2,145,169,254,255,151,246,55,64,249,31,0,0,113,224,19,150,154,8,0,192,57,31,185,0,113,225,0,0,84,8,4,192,57,104,1,0,52,31,185,0,113,97,0,0,84,8,8,192,57,232,0,0,52,227,3,21,170,226,3,25,170,225,3,20,170,13,255,255,151,247,3,0,42,87,4,0,53,232, + 3,66,57,104,0,0,52,224,3,22,170,129,249,255,151,104,0,0,176,8,65,43,145,9,253,223,200,225,35,2,145,224,3,19,170,32,1,63,214,128,247,255,53,170,34,64,169,9,1,10,203,43,253,67,147,31,3,11,235,224,0,0,84,8,0,0,144,3,65,15,145,64,13,24,139,97,1, + 24,203,2,1,128,210,61,11,0,148,104,0,0,176,8,1,43,145,9,253,223,200,224,3,19,170,32,1,63,214,232,195,64,57,104,0,0,52,224,15,64,249,102,249,255,151,0,0,128,82,15,0,0,20,232,3,66,57,104,0,0,52,224,3,22,170,96,249,255,151,104,0,0,176,8,1,43,145, + 9,253,223,200,224,3,19,170,32,1,63,214,232,195,64,57,104,0,0,52,224,15,64,249,87,249,255,151,224,3,23,42,255,67,11,145,234,199,255,151,249,35,64,249,247,99,67,169,245,91,66,169,243,83,65,169,253,123,197,168,255,35,3,213,192,3,95,214,1,8,0,0, + 0,32,0,0,31,0,1,235,98,0,0,84,0,0,128,18,3,0,0,20,31,0,1,235,224,151,159,26,192,3,95,214,0,0,0,0,127,35,3,213,253,123,190,169,243,83,1,169,253,3,0,145,204,199,255,151,255,131,9,209,104,0,0,176,8,1,46,145,9,253,223,200,243,3,1,170,84,124,64,211, + 162,32,128,82,225,99,1,145,32,1,63,214,0,1,0,53,104,0,0,176,8,225,45,145,9,253,223,200,32,1,63,214,145,252,255,151,0,0,128,82,42,0,0,20,1,0,128,210,243,211,2,169,224,35,0,145,243,211,3,169,255,39,0,249,255,67,1,57,92,231,255,151,232,11,64,249, + 41,189,159,82,8,13,64,185,31,1,9,107,33,1,0,84,232,131,64,57,168,0,0,52,234,7,64,249,72,169,67,185,9,121,30,18,73,169,3,185,35,189,159,82,17,0,0,20,222,241,255,151,232,131,64,57,0,1,0,53,168,0,0,52,234,7,64,249,72,169,67,185,9,121,30,18,73,169, + 3,185,35,0,128,82,7,0,0,20,168,0,0,52,234,7,64,249,72,169,67,185,9,121,30,18,73,169,3,185,3,0,128,82,226,3,0,145,225,163,0,145,224,99,1,145,9,0,0,148,224,39,64,249,255,131,9,145,152,199,255,151,243,83,65,169,253,123,194,168,255,35,3,213,192, + 3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,246,11,0,249,253,123,191,169,253,3,0,145,244,3,0,170,243,3,1,170,246,3,3,42,244,0,0,181,104,162,64,57,72,0,0,52,127,162,0,57,127,126,1,169,127,18,0,249,56,0,0,20,136,2,64,121,8,2,0,53,104,14,64,249, + 104,1,0,181,104,162,64,57,72,0,0,52,127,162,0,57,48,252,255,151,72,4,128,82,8,0,0,185,64,4,128,82,127,162,0,57,127,14,0,249,43,0,0,20,104,10,64,249,31,1,0,57,238,255,255,23,7,0,128,210,6,0,128,210,5,0,128,82,4,0,128,210,3,0,128,18,226,3,20,170, + 1,0,128,82,224,3,22,42,174,0,0,148,9,124,64,147,41,1,0,181,104,0,0,176,8,225,45,145,9,253,223,200,32,1,63,214,47,252,255,151,22,252,255,151,0,0,64,185,21,0,0,20,104,14,64,249,63,1,8,235,200,251,255,84,100,10,64,249,229,3,8,42,7,0,128,210,6,0, + 128,210,3,0,128,18,226,3,20,170,1,0,128,82,224,3,22,42,152,0,0,148,8,124,64,147,136,0,0,181,105,0,0,176,40,225,45,145,234,255,255,23,8,5,0,209,104,18,0,249,0,0,128,82,253,123,193,168,246,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,225, + 3,0,42,0,0,128,210,131,0,128,82,2,0,128,82,2,0,0,20,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,189,169,253,3,0,145,243,3,1,42,225,3,0,170,224,67,0,145,245,3,2,42,244,3,3,42,214,230,255,151,232,19,64,249,106,30,0,83,8,193,42,139, + 9,101,64,57,63,1,20,106,33,1,0,84,213,0,0,52,232,15,64,249,8,1,64,249,9,217,106,120,63,1,21,106,97,0,0,84,0,0,128,82,2,0,0,20,32,0,128,82,232,163,64,57,168,0,0,52,234,11,64,249,72,169,67,185,9,121,30,18,73,169,3,185,253,123,195,168,245,11,64, + 249,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,244,3,0,170,245,3,1,170,246,3,2,170,85,1,0,180,232,3,128,146,8,9,213,154,31,1,22,235,194,0,0,84,193,251,255,151,136,1,128, + 82,8,0,0,185,0,0,128,210,20,0,0,20,180,0,0,180,224,3,20,170,224,11,0,148,243,3,0,170,2,0,0,20,19,0,128,210,181,126,22,155,224,3,20,170,225,3,21,170,239,11,0,148,244,3,0,170,159,2,0,241,110,18,85,250,162,0,0,84,162,2,19,203,1,0,128,82,128,2,19, + 139,131,200,255,151,224,3,20,170,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,136,213,155,82,31,0,8,107,200,3,0,84,160,1,0,84,104,134,152,82,31,0,8,107,232,1,0,84,136,133,152,82,8,0,8,75,31,29,0,113,136,0,0,84,233,20, + 128,82,40,37,200,26,104,0,0,55,31,168,0,113,65,0,0,84,1,0,128,82,104,0,0,176,8,33,49,145,9,253,223,200,32,1,31,214,168,134,152,82,31,0,8,107,32,255,255,84,8,211,154,82,31,0,8,107,224,2,0,84,72,213,155,82,8,0,8,75,31,5,0,113,73,254,255,84,242, + 255,255,23,40,214,155,82,31,0,8,107,168,0,0,84,168,213,155,82,8,0,8,75,31,17,0,113,248,255,255,23,72,214,155,82,8,0,8,75,31,5,0,113,201,252,255,84,8,189,159,82,31,0,8,107,96,252,255,84,40,189,159,82,31,0,8,107,33,252,255,84,33,0,29,18,223,255, + 255,23,0,0,0,0,10,189,159,82,8,0,10,75,31,5,0,113,136,213,155,82,233,135,159,26,31,0,8,107,168,4,0,84,224,2,0,84,104,134,152,82,31,0,8,107,72,1,0,84,136,133,152,82,8,0,8,75,31,29,0,113,136,0,0,84,234,20,128,82,72,37,200,26,168,1,0,55,31,168, + 0,113,39,0,0,20,168,134,152,82,31,0,8,107,0,1,0,84,8,211,154,82,31,0,8,107,160,0,0,84,72,213,155,82,8,0,8,75,31,5,0,113,200,3,0,84,1,0,128,82,63,1,0,113,232,19,135,154,63,1,0,113,230,19,134,154,105,0,0,52,71,0,0,180,255,0,0,185,231,3,8,170,104, + 0,0,176,8,65,51,145,9,253,223,200,32,1,31,214,40,214,155,82,31,0,8,107,168,0,0,84,168,213,155,82,8,0,8,75,31,17,0,113,236,255,255,23,72,214,155,82,8,0,8,75,31,5,0,113,41,253,255,84,31,0,10,107,224,252,255,84,40,189,159,82,31,0,8,107,128,252, + 255,84,33,120,24,18,227,255,255,23,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,104,0,0,176,8,97,45,145,9,253,223,200,32,1,63,214,243,3,0,170,115,0,0,181,0,0,128,210,63,0,0,20,104,2,64,121,235,3,19,170,104,1,0, + 52,233,3,11,170,42,9,0,145,40,45,192,120,200,255,255,53,72,1,11,203,9,253,65,147,42,5,0,145,107,5,10,139,104,1,64,121,232,254,255,53,104,1,19,203,9,9,0,145,54,253,65,147,227,3,22,42,7,0,128,210,6,0,128,210,5,0,128,82,4,0,128,210,226,3,19,170, + 1,0,128,82,0,0,128,82,157,255,255,151,21,124,64,147,245,0,0,181,104,0,0,176,8,1,44,145,9,253,223,200,224,3,19,170,32,1,63,214,222,255,255,23,224,3,21,170,17,1,0,148,244,3,0,170,148,0,0,181,0,0,128,210,181,247,255,151,244,255,255,23,229,3,21, + 42,7,0,128,210,6,0,128,210,228,3,20,170,227,3,22,42,226,3,19,170,1,0,128,82,0,0,128,82,133,255,255,151,160,0,0,53,224,3,20,170,168,247,255,151,20,0,128,210,3,0,0,20,0,0,128,210,164,247,255,151,104,0,0,176,8,1,44,145,9,253,223,200,224,3,19,170, + 32,1,63,214,224,3,20,170,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,188,169,253,3,0,145,8,60,0,83,233,255,159,82,232,35,0,121,31,1,9,107,97,0,0,84,224,255,159,82,54,0,0,20,224,99,0,145,195,229, + 255,151,236,19,64,249,41,189,159,82,136,13,64,185,31,1,9,107,225,1,0,84,235,35,64,121,127,1,2,113,98,3,0,84,72,0,0,144,8,1,34,145,9,9,0,145,109,29,64,211,42,121,109,120,138,0,0,54,136,137,64,249,0,105,109,56,29,0,0,20,96,29,0,83,27,0,0,20,224, + 35,64,121,31,0,4,113,98,1,0,84,72,0,0,144,8,9,34,145,11,28,64,211,9,121,107,120,137,0,0,54,136,137,64,249,0,105,107,56,16,0,0,20,0,28,0,83,14,0,0,20,136,157,64,249,136,1,0,180,128,157,64,249,37,0,128,82,228,75,0,145,35,0,128,82,226,67,0,145, + 1,32,128,82,30,11,0,148,96,0,0,53,224,35,64,121,2,0,0,20,224,39,64,121,232,195,64,57,168,0,0,52,234,15,64,249,72,169,67,185,9,121,30,18,73,169,3,185,253,123,196,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0, + 145,243,3,1,170,136,0,0,176,8,141,67,249,105,2,64,249,63,1,8,235,0,1,0,84,136,0,0,144,8,13,72,185,9,168,67,185,63,1,8,106,97,0,0,84,13,2,0,148,96,2,0,249,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248, + 253,123,191,169,253,3,0,145,243,3,1,170,136,0,0,176,8,109,67,249,105,2,64,249,63,1,8,235,0,1,0,84,136,0,0,144,8,13,72,185,9,168,67,185,63,1,8,106,97,0,0,84,147,244,255,151,96,2,0,249,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0, + 0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,136,0,0,176,8,97,28,145,243,3,1,170,10,121,98,248,105,2,64,249,63,1,10,235,0,1,0,84,136,0,0,144,8,13,72,185,9,168,67,185,63,1,8,106,97,0,0,84,224,1,0,148,96,2,0,249,253,123,193,168,243, + 7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,136,0,0,176,8,97,27,145,243,3,1,170,10,121,98,248,105,2,64,249,63,1,10,235,0,1,0,84,136,0,0,144,8,13,72,185,9,168,67,185,63,1,8,106,97,0,0,84,102,244,255, + 151,96,2,0,249,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,136,0,0,176,0,1,29,145,33,0,128,82,133,198,255,23,127,35,3,213,253,123,190,169,253,3,0,145,227,83,0,145,226,67,0,145,225,99,0,145,224,67,0,145,136,0,128,82,232,163,2,41,5, + 0,0,148,253,123,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,189,169,253,3,0,145,244,3,3,170,180,19,0,249,32,0,64,185,40,241,255,151,191,67,0,57,136,0,0,176,21,97,28,145,243,3,21,170,150,0,0,144, + 179,15,0,249,168,34,0,145,127,2,8,235,96,1,0,84,201,2,22,145,104,2,64,249,31,1,9,235,160,0,0,84,193,2,22,145,224,3,19,170,184,1,0,148,96,2,0,249,115,34,0,145,243,255,255,23,128,2,64,185,29,241,255,151,253,123,195,168,245,91,65,169,243,83,194, + 168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,190,169,253,3,0,145,9,60,0,83,232,255,159,82,63,1,8,107,51,60,0,83,96,2,0,84,63,1,4,113,194,0,0,84,136,0,0,144,8,1,68,249,9,121,105,120,32,1,19,10,13,0,0,20,227,67,0,145, + 233,39,0,121,34,0,128,82,255,35,0,121,225,75,0,145,32,0,128,82,122,11,0,148,128,0,0,52,232,35,64,121,0,1,19,10,2,0,0,20,0,0,128,82,253,123,194,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169, + 253,3,0,145,31,128,0,177,104,3,0,84,31,0,0,241,40,0,128,210,19,1,128,154,104,0,0,176,8,97,47,145,149,0,0,176,160,70,65,249,9,253,223,200,226,3,19,170,1,0,128,82,32,1,63,214,96,2,0,181,104,0,0,176,20,97,47,145,93,8,0,148,96,1,0,52,224,3,19,170, + 164,223,255,151,0,1,0,52,160,70,65,249,226,3,19,170,136,254,223,200,1,0,128,82,0,1,63,214,192,254,255,180,5,0,0,20,209,249,255,151,136,1,128,82,8,0,0,185,0,0,128,210,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,127, + 35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,244,3,2,170,202,218,255,151,104,6,64,185,201,12,128,82,31,1,9,106,193,0,0,84,104,2,64,185,201,1,0,24,31,1,9,107,0,8,65,122,160,0,0,84,253,123,193,168,243,83,193,168,255,35,3,213, + 192,3,95,214,62,232,255,151,19,16,0,249,60,232,255,151,20,20,0,249,102,231,255,151,0,0,62,212,99,115,109,224,0,0,0,0,6,250,255,23,31,32,3,213,31,32,3,213,0,0,0,0,104,0,0,176,9,81,66,249,170,255,255,240,72,129,37,145,63,1,8,235,96,1,0,84,233, + 3,18,170,10,128,64,249,40,9,64,249,95,1,8,235,131,0,0,84,40,5,64,249,95,1,8,235,105,0,0,84,160,1,128,82,96,0,62,212,192,3,95,214,0,0,0,0,98,0,0,181,0,0,128,82,15,0,0,20,73,4,0,209,73,1,0,180,10,0,64,121,10,1,0,52,40,0,64,121,95,1,8,107,161,0, + 0,84,0,8,0,145,33,8,0,145,41,5,0,209,9,255,255,181,9,0,64,121,40,0,64,121,32,1,8,75,192,3,95,214,127,35,3,213,243,83,189,169,245,91,1,169,247,99,2,169,253,123,191,169,253,3,0,145,245,3,0,170,149,2,0,180,72,0,0,176,23,193,19,145,19,0,128,82,116, + 28,128,82,136,2,19,11,9,125,72,11,162,10,128,210,224,3,21,170,54,125,1,19,216,126,124,147,1,107,119,248,79,11,0,148,192,1,0,52,96,0,248,54,212,6,0,81,2,0,0,20,211,6,0,17,127,2,20,107,77,254,255,84,0,0,128,82,253,123,193,168,247,99,66,169,245, + 91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,232,34,0,145,9,107,104,184,233,254,255,55,40,125,64,147,31,145,3,241,130,254,255,84,40,0,0,240,8,65,42,145,41,125,124,147,32,105,104,184,240,255,255,23,0,0,0,0,127,35,3,213,243,83,190,169,245, + 91,1,169,253,123,191,169,253,3,0,145,243,3,0,170,96,66,0,145,103,197,255,151,96,114,64,249,64,0,0,180,100,197,255,151,96,122,64,249,64,0,0,180,97,197,255,151,96,118,64,249,64,0,0,180,94,197,255,151,96,130,64,249,64,0,0,180,91,197,255,151,104, + 0,0,240,22,161,27,145,116,226,0,145,213,0,128,82,136,2,95,248,31,1,22,235,128,0,0,84,128,2,64,249,64,0,0,180,81,197,255,151,136,130,94,248,136,0,0,180,128,130,95,248,64,0,0,180,76,197,255,151,148,130,0,145,181,6,0,81,117,254,255,53,105,146,64, + 249,233,0,0,180,40,0,0,208,8,65,42,145,63,1,8,235,96,0,0,84,32,113,5,145,65,197,255,151,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,243,3, + 0,170,51,5,0,180,96,66,0,145,106,197,255,151,96,114,64,249,64,0,0,180,103,197,255,151,96,122,64,249,64,0,0,180,100,197,255,151,96,118,64,249,64,0,0,180,97,197,255,151,96,130,64,249,64,0,0,180,94,197,255,151,104,0,0,240,22,161,27,145,116,226, + 0,145,213,0,128,82,136,2,95,248,31,1,22,235,128,0,0,84,128,2,64,249,64,0,0,180,84,197,255,151,136,130,94,248,136,0,0,180,128,130,95,248,64,0,0,180,79,197,255,151,148,130,0,145,181,6,0,81,117,254,255,53,105,146,64,249,233,0,0,180,40,0,0,208,8, + 65,42,145,63,1,8,235,96,0,0,84,32,113,5,145,68,197,255,151,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,189,169,245,91,1,169,247,19,0,249,253,123,191,169,253,3,0,145,243,3,0,170,105,126,64,249,105, + 3,0,180,104,0,0,240,8,65,32,145,63,1,8,235,224,2,0,84,104,114,64,249,168,2,0,180,8,1,64,185,104,2,0,53,96,122,64,249,192,0,0,180,8,0,64,185,136,0,0,53,143,245,255,151,96,126,64,249,109,9,0,148,96,118,64,249,192,0,0,180,8,0,64,185,136,0,0,53, + 136,245,255,151,96,126,64,249,180,9,0,148,96,114,64,249,132,245,255,151,96,126,64,249,130,245,255,151,104,130,64,249,200,1,0,180,8,1,64,185,136,1,0,53,104,134,64,249,0,249,3,209,123,245,255,151,104,138,64,249,0,1,2,209,120,245,255,151,104,142, + 64,249,0,1,2,209,117,245,255,151,96,130,64,249,115,245,255,151,96,146,64,249,35,0,0,148,104,0,0,240,23,161,27,145,118,162,4,145,116,226,0,145,213,0,128,82,136,2,95,248,31,1,23,235,0,1,0,84,128,2,64,249,192,0,0,180,8,0,64,185,136,0,0,53,100,245, + 255,151,192,2,64,249,98,245,255,151,136,130,94,248,200,0,0,180,128,130,95,248,128,0,0,180,8,0,64,185,72,0,0,53,91,245,255,151,214,34,0,145,148,130,0,145,181,6,0,81,149,253,255,53,224,3,19,170,85,245,255,151,253,123,193,168,247,19,64,249,245, + 91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,115,1,0,180,40,0,0,208,8,65,42,145,127,2,8,235,224,0,0,84,104,94,65,185,191,59,3,213,136,0,0,53,149,9,0,148,224,3,19,170,63, + 245,255,151,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,204,239,255,151,244,3,0,170,137,170,67,185,104,0,0,240,8,13,72,185,63,1,8,106,96,0,0,84,147,74,64,249,83,1,0,181,128,0, + 128,82,112,239,255,151,136,0,0,144,1,141,67,249,128,66,2,145,12,0,0,148,243,3,0,170,128,0,128,82,115,239,255,151,211,0,0,180,224,3,19,170,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,178,230,255,151,0,0,62,212,127,35,3,213,243,83, + 191,169,253,123,191,169,253,3,0,145,243,3,1,170,211,2,0,180,160,2,0,180,20,0,64,249,159,2,19,235,97,0,0,84,224,3,19,170,17,0,0,20,19,0,0,249,224,3,19,170,2,255,255,151,116,255,255,180,224,3,20,170,51,255,255,151,136,18,64,185,232,254,255,53, + 104,0,0,240,8,1,22,145,159,2,8,235,96,254,255,84,224,3,20,170,95,255,255,151,240,255,255,23,0,0,128,210,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,31,8,0,49,225,0,0,84,77,248,255,151,31, + 0,0,185,63,248,255,151,40,1,128,82,8,0,0,185,24,0,0,20,32,2,248,55,136,0,0,144,8,145,70,185,31,0,8,107,162,1,0,84,9,124,64,147,136,0,0,144,8,65,10,145,42,253,70,211,41,21,64,146,8,121,106,248,11,9,128,210,43,33,11,155,105,225,64,57,105,0,0,54, + 96,21,64,249,8,0,0,20,54,248,255,151,31,0,0,185,40,248,255,151,40,1,128,82,8,0,0,185,63,245,255,151,0,0,128,146,253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,243,3,0,42,115,5,248, + 55,136,0,0,144,8,145,70,185,127,2,8,107,226,4,0,84,104,126,64,147,20,253,70,211,137,0,0,144,53,65,10,145,8,21,64,146,10,9,128,210,22,125,10,155,168,122,116,248,202,2,8,139,73,225,64,57,137,3,0,54,72,21,64,249,31,5,0,177,32,3,0,84,249,9,0,148, + 31,4,0,113,1,2,0,84,51,1,0,52,127,6,0,113,160,0,0,84,127,10,0,113,97,1,0,84,96,1,128,18,4,0,0,20,64,1,128,18,2,0,0,20,32,1,128,18,104,0,0,144,8,129,50,145,9,253,223,200,1,0,128,210,32,1,63,214,168,122,116,248,10,0,128,146,0,0,128,82,9,1,22,139, + 42,21,0,249,7,0,0,20,239,247,255,151,40,1,128,82,8,0,0,185,248,247,255,151,31,0,0,185,0,0,128,18,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,27,0,249,253,123, + 191,169,253,3,0,145,1,9,128,210,0,8,128,210,53,248,255,151,243,3,0,170,115,0,0,181,19,0,128,210,31,0,0,20,8,64,130,210,117,2,8,139,127,2,21,235,96,3,0,84,116,194,0,145,23,0,128,146,88,65,161,82,89,1,128,82,2,0,128,82,1,244,129,82,128,194,0,209, + 150,194,0,209,108,237,255,151,136,54,64,57,151,254,63,169,10,0,128,82,152,10,0,185,153,50,0,57,8,17,29,18,136,54,0,57,200,194,42,139,73,5,0,17,234,3,9,42,31,249,0,57,63,21,0,113,99,255,255,84,148,34,1,145,136,194,0,209,31,1,21,235,97,253,255, + 84,0,0,128,210,109,244,255,151,224,3,19,170,253,123,193,168,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,243,3,0,170,19,2,0,180,8,64,130, + 210,117,2,8,139,127,2,21,235,244,3,19,170,32,1,0,84,104,0,0,144,22,129,42,145,200,254,223,200,224,3,20,170,0,1,63,214,148,34,1,145,159,2,21,235,97,255,255,84,224,3,19,170,79,244,255,151,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213, + 192,3,95,214,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,99,2,169,253,123,190,169,253,3,0,145,245,3,0,42,191,10,64,113,131,1,0,84,137,247,255,151,40,1,128,82,8,0,0,185,160,244,255,151,32,1,128,82,253,123,194,168,247,99,66,169,245,91, + 65,169,243,83,195,168,255,35,3,213,192,3,95,214,20,0,128,82,224,0,128,82,118,238,255,151,19,0,128,210,191,11,0,249,152,0,0,144,151,0,0,144,233,146,70,185,191,2,9,107,43,1,0,84,22,67,10,145,200,122,115,248,72,0,0,180,12,0,0,20,140,255,255,151, + 192,122,51,248,192,0,0,181,148,1,128,82,224,0,128,82,111,238,255,151,224,3,20,42,229,255,255,23,232,146,70,185,9,1,1,17,233,146,6,185,115,6,0,145,179,11,0,249,237,255,255,23,9,124,64,147,136,0,0,144,8,65,10,145,42,253,70,147,41,21,64,146,8,121, + 106,248,11,9,128,210,32,33,11,155,107,0,0,144,105,193,42,145,40,253,223,200,0,1,31,214,9,124,64,147,136,0,0,144,8,65,10,145,42,253,70,147,41,21,64,146,8,121,106,248,11,9,128,210,32,33,11,155,107,0,0,144,105,161,48,145,40,253,223,200,0,1,31,214, + 127,35,3,213,253,123,186,169,243,83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145,134,194,255,151,255,131,0,209,250,3,0,145,248,3,1,42,225,3,0,170,224,3,26,170,246,3,2,170,247,3,3,42,249,3,4,170,244,3,5,42,243,3,6,42, + 35,226,255,151,116,0,0,53,72,7,64,249,20,13,64,185,127,2,0,113,41,1,128,82,40,0,128,82,33,17,136,26,5,0,128,82,4,0,128,210,227,3,23,42,226,3,22,170,224,3,20,42,134,251,255,151,245,3,0,42,117,0,0,53,20,0,128,82,57,0,0,20,168,126,127,147,9,65, + 0,145,63,1,8,235,32,129,159,154,187,187,155,82,96,5,0,180,31,0,16,241,168,1,0,84,8,60,0,145,31,1,0,235,76,0,0,84,232,223,124,178,15,253,68,211,100,197,255,151,255,115,47,203,243,3,0,145,51,1,0,180,136,153,153,82,104,2,0,185,5,0,0,20,31,253,255, + 151,243,3,0,170,115,0,0,180,123,2,0,185,115,66,0,145,19,3,0,180,162,126,127,147,1,0,128,82,224,3,19,170,224,195,255,151,229,3,21,42,228,3,19,170,227,3,23,42,226,3,22,170,33,0,128,82,224,3,20,42,93,251,255,151,128,1,0,52,104,0,0,144,8,1,47,145, + 9,253,223,200,226,3,0,42,227,3,25,170,225,3,19,170,224,3,24,42,32,1,63,214,244,3,0,42,4,0,0,20,19,0,128,210,20,0,128,82,211,0,0,180,104,2,95,184,31,1,27,107,97,0,0,84,96,66,0,209,164,243,255,151,72,99,64,57,168,0,0,52,74,3,64,249,72,169,67,185, + 9,121,30,18,73,169,3,185,224,3,20,42,95,3,0,145,255,131,0,145,48,194,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83,65,169,253,123,198,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,188,169,245,91,1,169,247, + 99,2,169,249,27,0,249,253,123,189,169,253,3,0,145,255,67,0,209,249,3,1,170,225,3,0,170,224,131,0,145,248,3,2,42,247,3,3,170,246,3,4,42,245,3,5,170,244,3,6,42,243,3,7,42,181,225,255,151,232,131,64,185,231,3,19,42,230,3,20,42,229,3,21,170,228, + 3,22,42,232,3,0,185,227,3,23,170,226,3,24,42,225,3,25,170,224,163,0,145,16,0,0,148,232,227,64,57,168,0,0,52,234,19,64,249,72,169,67,185,9,121,30,18,73,169,3,185,255,67,0,145,253,123,195,168,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196, + 168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,186,169,243,83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145,234,193,255,151,255,67,0,209,250,67,0,145,244,3,4,42,69,3,0,249,159,2,0,113,243,3,0,170,251,3,1, + 170,249,3,2,42,245,3,3,170,246,3,6,42,247,3,7,42,237,0,0,84,129,126,64,147,224,3,21,170,141,8,0,148,31,0,20,107,20,4,0,17,20,160,148,26,119,0,0,53,104,2,64,249,23,13,64,185,72,115,64,185,42,1,128,82,41,0,128,82,5,0,128,82,4,0,128,210,31,1,0, + 113,65,17,137,26,227,3,20,42,226,3,21,170,224,3,23,42,226,250,255,151,248,3,0,42,120,0,0,53,0,0,128,82,147,0,0,20,8,127,127,147,9,65,0,145,63,1,8,235,32,129,159,154,128,16,0,180,137,153,153,82,31,0,16,241,136,1,0,84,8,60,0,145,31,1,0,235,76, + 0,0,84,232,223,124,178,15,253,68,211,192,196,255,151,255,115,47,203,243,67,0,145,51,1,0,180,105,2,0,185,6,0,0,20,124,252,255,151,243,3,0,170,147,0,0,180,168,187,155,82,104,2,0,185,115,66,0,145,19,14,0,180,229,3,24,42,228,3,19,170,227,3,20,42, + 226,3,21,170,33,0,128,82,224,3,23,42,189,250,255,151,0,13,0,52,7,0,128,210,255,3,0,249,6,0,128,210,5,0,128,82,4,0,128,210,227,3,24,42,226,3,19,170,225,3,25,42,224,3,27,170,28,236,255,151,245,3,0,42,149,11,0,52,57,2,80,54,150,11,0,52,191,2,22, + 107,12,11,0,84,68,3,64,249,7,0,128,210,6,0,128,210,255,3,0,249,229,3,22,42,227,3,24,42,226,3,19,170,225,3,25,42,224,3,27,170,12,236,255,151,245,3,0,42,213,9,0,53,75,0,0,20,168,126,127,147,9,65,0,145,63,1,8,235,32,129,159,154,32,7,0,180,31,0, + 16,241,136,1,0,84,8,60,0,145,31,1,0,235,76,0,0,84,232,223,124,178,15,253,68,211,130,196,255,151,255,115,47,203,244,67,0,145,52,1,0,180,136,153,153,82,5,0,0,20,62,252,255,151,244,3,0,170,148,0,0,180,168,187,155,82,136,2,0,185,148,66,0,145,212, + 4,0,180,7,0,128,210,255,3,0,249,6,0,128,210,229,3,21,42,228,3,20,170,227,3,24,42,226,3,19,170,225,3,25,42,224,3,27,170,230,235,255,151,96,3,0,52,7,0,128,210,6,0,128,210,227,3,21,42,226,3,20,170,1,0,128,82,224,3,23,42,246,0,0,53,5,0,128,82,4, + 0,128,210,165,250,255,151,245,3,0,42,245,0,0,53,14,0,0,20,68,3,64,249,229,3,22,42,159,250,255,151,245,3,0,42,85,1,0,52,136,2,95,184,182,187,155,82,31,1,22,107,129,2,0,84,128,66,0,209,189,242,255,151,17,0,0,20,20,0,128,210,20,1,0,180,136,2,95, + 184,182,187,155,82,31,1,22,107,161,0,0,84,128,66,0,209,180,242,255,151,2,0,0,20,182,187,155,82,21,0,128,82,5,0,0,20,19,0,128,210,21,0,128,82,243,0,0,180,182,187,155,82,104,2,95,184,31,1,22,107,97,0,0,84,96,66,0,209,167,242,255,151,224,3,21,42, + 95,67,0,209,255,67,0,145,57,193,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83,65,169,253,123,198,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,5,240,255,151,8,28,0,83,31,1,0,113,224,23,159,26, + 253,123,193,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,189,169,253,3,0,145,224,23,0,185,31,8,0,49,161,0,0,84,212,245,255,151,40,1,128,82,8,0,0,185,29,0,0,20,0,3,248,55,136,0,0,144,8,145,70,185,31,0,8,107,130,2,0,84,9,124,64,147,136,0, + 0,144,8,65,10,145,42,253,70,147,41,21,64,146,8,121,106,248,11,9,128,210,41,33,11,155,42,225,64,57,74,1,0,54,232,83,0,145,224,3,3,41,224,67,0,145,232,19,0,249,227,99,0,145,226,131,0,145,225,115,0,145,10,0,0,148,6,0,0,20,184,245,255,151,40,1,128, + 82,8,0,0,185,207,242,255,151,0,0,128,18,253,123,195,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,243,3,2,170,244,3,3,170,180,11,0,249,32,0,64,185,70,254,255,151,104,2,64,249,0,1,64,185,9,124,64,147,42, + 253,70,147,136,0,0,144,8,65,10,145,41,21,64,146,11,9,128,210,8,121,106,248,41,33,11,155,42,225,64,57,10,2,0,54,85,253,255,151,104,0,0,144,8,225,43,145,9,253,223,200,32,1,63,214,96,0,0,52,19,0,128,82,12,0,0,20,104,0,0,144,8,225,45,145,9,253,223, + 200,32,1,63,214,243,3,0,42,154,245,255,151,19,0,0,185,140,245,255,151,40,1,128,82,8,0,0,185,19,0,128,18,128,2,64,185,49,254,255,151,224,3,19,42,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,191,169,253, + 3,0,145,224,0,0,181,124,245,255,151,200,2,128,82,8,0,0,185,147,242,255,151,0,0,128,18,3,0,0,20,0,24,64,185,191,59,3,213,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,186,169,243,83,1,169,245,91,2,169,247,99,3,169,249, + 107,4,169,251,43,0,249,253,3,0,145,172,192,255,151,255,3,1,209,247,3,0,42,244,3,1,170,246,3,2,42,243,3,3,170,246,24,0,52,20,2,0,181,40,0,128,82,104,226,0,57,201,2,128,82,127,54,0,185,229,3,19,170,104,194,0,57,4,0,128,210,3,0,128,82,105,46,0, + 185,2,0,128,210,1,0,128,210,0,0,128,210,124,242,255,151,0,0,128,18,184,0,0,20,232,126,64,147,27,253,70,147,105,0,0,240,56,65,10,145,8,21,64,146,248,27,0,249,10,9,128,210,25,125,10,155,8,123,123,248,249,19,0,249,42,3,8,139,85,229,192,57,168,254, + 3,17,9,29,0,83,63,5,0,113,72,0,0,84,54,252,7,55,72,225,64,57,200,0,40,54,227,3,19,170,66,0,128,82,1,0,128,210,224,3,23,42,58,7,0,148,224,3,23,42,150,3,0,148,32,9,0,52,8,123,123,248,9,1,25,139,42,225,192,57,170,8,248,54,104,162,64,57,104,0,0, + 53,224,3,19,170,185,224,255,151,104,14,64,249,9,157,64,249,169,0,0,181,8,123,123,248,9,1,25,139,42,229,192,57,74,7,0,52,8,123,123,248,225,163,0,145,9,1,25,139,72,0,0,240,8,193,44,145,32,21,64,249,9,253,223,200,32,1,63,214,32,6,0,52,85,5,0,52, + 191,6,0,113,164,26,66,122,1,14,0,84,154,66,54,139,255,11,0,249,23,0,128,82,255,27,0,185,159,2,26,235,248,3,20,170,162,3,0,84,245,23,64,185,22,39,64,120,224,3,22,42,204,7,0,148,223,34,32,107,33,2,0,84,249,3,21,42,53,11,0,17,245,23,0,185,223,42, + 0,113,33,1,0,84,160,1,128,82,195,7,0,148,8,60,0,83,31,53,0,113,225,0,0,84,53,15,0,17,247,6,0,17,245,223,2,41,31,3,26,235,226,0,0,84,236,255,255,23,72,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,224,19,0,185,249,19,64,249,248,27,64,249,233, + 67,0,145,51,0,0,20,227,3,19,170,226,3,22,42,225,3,20,170,224,3,23,42,184,0,0,148,24,0,0,20,8,123,123,248,10,1,25,139,73,225,192,57,201,2,248,54,245,1,0,52,191,6,0,113,0,1,0,84,191,10,0,113,97,7,0,84,226,3,22,42,225,3,20,170,224,3,23,42,56,2, + 0,148,10,0,0,20,226,3,22,42,225,3,20,170,224,3,23,42,139,2,0,148,5,0,0,20,226,3,22,42,225,3,20,170,224,3,23,42,214,1,0,148,224,3,0,249,26,0,0,20,232,227,0,145,64,21,64,249,31,1,0,249,4,0,128,210,31,9,0,185,72,0,0,240,8,129,51,145,9,253,223,200, + 227,243,0,145,226,3,22,42,225,3,20,170,32,1,63,214,192,0,0,53,72,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,224,59,0,185,233,227,0,145,40,1,64,249,234,3,0,145,41,9,64,185,72,1,0,249,73,9,0,185,225,11,64,185,232,7,64,185,200,3,0,53,224,3, + 64,185,192,1,0,52,31,20,0,113,33,1,0,84,40,0,128,82,41,1,128,82,104,194,0,57,170,0,128,82,105,46,0,185,104,226,0,57,106,54,0,185,92,255,255,23,225,3,19,170,247,244,255,151,89,255,255,23,8,123,123,248,9,1,25,139,42,225,64,57,138,0,48,54,136,2, + 192,57,31,105,0,113,64,1,0,84,40,0,128,82,127,54,0,185,137,3,128,82,104,194,0,57,105,46,0,185,104,226,0,57,75,255,255,23,0,1,1,75,2,0,0,20,0,0,128,82,255,3,1,145,229,191,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83, + 65,169,253,123,198,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,188,169,245,91,1,169,247,99,2,169,249,27,0,249,251,31,0,249,253,123,190,169,253,3,0,145,245,3,0,42,181,19,0,185,247,3,1,170,248,3,2,42,243,3,3,170,191,10,0,49,1,2,0,84,52,0, + 128,82,116,226,0,57,127,54,0,185,116,194,0,57,40,1,128,82,104,46,0,185,0,0,128,18,253,123,194,168,251,31,64,249,249,27,64,249,247,99,66,169,245,91,65,169,243,83,196,168,255,35,3,213,192,3,95,214,213,0,248,55,104,0,0,240,8,145,70,185,191,2,8, + 107,40,0,128,82,67,0,0,84,8,0,128,82,52,0,128,82,200,1,0,53,116,226,0,57,127,54,0,185,116,194,0,57,40,1,128,82,104,46,0,185,229,3,19,170,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,0,0,128,210,134,241,255,151,226,255,255,23,168,126,64,147, + 25,253,70,147,105,0,0,240,59,65,10,145,8,21,64,146,10,9,128,210,9,125,10,155,169,15,0,249,104,123,121,248,9,1,9,139,42,225,64,57,10,253,7,54,224,3,21,42,237,252,255,151,22,0,128,18,104,123,121,248,169,15,64,249,9,1,9,139,42,225,64,57,234,0,0, + 55,116,194,0,57,40,1,128,82,104,46,0,185,116,226,0,57,127,54,0,185,7,0,0,20,227,3,19,170,226,3,24,42,225,3,23,170,224,3,21,42,206,254,255,151,246,3,0,42,224,3,21,42,229,252,255,151,224,3,22,42,191,255,255,23,127,35,3,213,253,123,186,169,243, + 83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145,116,191,255,151,255,131,2,209,250,3,0,145,244,3,0,42,67,27,0,249,136,126,64,147,105,0,0,240,57,65,10,145,22,253,70,147,8,21,64,146,48,0,128,146,86,19,0,249,9,9,128,210, + 80,67,0,249,248,3,1,170,27,125,9,155,40,123,118,248,88,55,0,249,9,1,27,139,40,21,64,249,72,51,0,249,8,67,34,139,72,31,0,249,73,0,0,240,40,225,44,145,9,253,223,200,32,1,63,214,79,27,64,249,64,43,0,185,232,161,64,57,136,0,0,53,224,3,15,170,154, + 223,255,151,79,27,64,249,232,13,64,249,23,0,128,210,95,7,0,249,78,31,64,249,21,0,128,82,243,3,24,170,9,13,64,185,31,3,14,235,73,47,0,185,194,30,0,84,136,126,64,147,84,15,64,185,106,0,0,208,70,193,34,145,7,253,70,147,71,27,7,169,104,2,192,57, + 37,0,128,82,95,7,0,185,56,0,128,82,72,3,0,57,40,189,159,82,63,1,8,107,97,10,0,84,43,123,103,248,13,0,128,82,104,193,45,139,9,1,27,139,42,249,192,57,138,0,0,52,173,5,0,17,191,21,0,113,75,255,255,84,204,1,19,203,191,1,0,113,173,6,0,84,40,123,118, + 248,105,3,8,139,42,249,64,57,200,200,234,56,14,5,0,17,214,1,13,75,159,193,54,235,43,20,0,84,40,123,103,248,75,35,2,145,234,3,13,42,9,1,27,139,44,249,0,145,136,21,192,56,74,5,0,81,104,21,0,56,170,255,255,53,10,0,128,82,223,2,0,113,45,1,0,84,235, + 3,19,170,76,35,2,145,104,21,192,56,73,1,13,11,74,5,0,17,95,1,22,107,136,201,41,56,107,255,255,84,71,19,64,249,10,0,128,210,40,123,103,248,73,1,27,139,74,5,0,145,173,5,0,81,41,1,8,139,63,249,0,57,77,255,255,53,223,17,0,113,95,35,0,249,184,20, + 133,26,72,35,2,145,2,127,64,211,72,39,0,249,228,3,15,170,67,3,1,145,65,35,1,145,64,19,0,145,9,6,0,148,31,4,0,177,64,21,0,84,214,6,0,81,17,0,0,20,104,2,64,57,214,200,232,56,200,6,0,17,159,193,40,235,107,16,0,84,31,17,0,113,95,79,5,169,184,20, + 133,26,2,127,64,211,228,3,15,170,67,67,1,145,65,99,1,145,64,19,0,145,247,5,0,148,31,4,0,177,0,19,0,84,115,194,54,139,40,0,0,20,40,123,118,248,108,3,8,139,138,245,64,57,106,1,16,54,136,249,192,57,66,0,128,210,105,2,192,57,65,67,2,145,72,67,2, + 57,104,31,128,82,72,1,8,10,73,71,2,57,136,245,0,57,21,0,0,20,232,13,64,249,107,2,192,57,9,1,64,249,106,29,0,83,42,217,234,120,170,1,248,54,118,6,0,145,223,2,14,235,194,13,0,84,227,3,15,170,66,0,128,210,225,3,19,170,64,19,0,145,11,5,0,148,31, + 4,0,49,0,15,0,84,243,3,22,170,8,0,0,20,34,0,128,210,225,3,19,170,227,3,15,170,64,19,0,145,2,5,0,148,31,4,0,49,224,13,0,84,64,43,64,185,7,0,128,210,6,0,128,210,165,0,128,82,68,99,2,145,227,3,24,42,66,19,0,145,1,0,128,82,115,6,0,145,4,248,255, + 151,246,3,0,42,118,12,0,52,72,0,0,240,8,129,51,145,87,51,64,249,4,0,128,210,9,253,223,200,67,115,0,145,226,3,22,42,65,99,2,145,224,3,23,170,32,1,63,214,32,10,0,52,72,55,64,249,106,2,8,75,72,31,64,185,84,1,21,11,84,15,0,185,31,1,22,107,3,10,0, + 84,72,3,192,57,31,41,0,113,65,2,0,84,168,1,128,82,72,51,0,121,72,0,0,240,8,129,51,145,9,253,223,200,4,0,128,210,67,115,0,145,34,0,128,82,65,99,0,145,224,3,23,170,32,1,63,214,96,7,0,52,72,31,64,185,232,7,0,52,148,6,0,17,84,15,0,185,181,6,0,17, + 78,31,64,249,127,2,14,235,34,7,0,84,87,7,64,249,79,27,64,249,86,19,64,249,71,27,71,169,73,47,64,185,69,255,255,23,14,0,128,82,159,1,0,241,173,1,0,84,71,19,64,249,15,0,128,210,200,1,13,11,41,123,103,248,106,195,40,139,232,105,243,56,206,5,0,17, + 207,125,64,147,255,1,12,235,75,1,9,139,104,249,0,57,235,254,255,84,136,1,20,11,72,15,0,185,64,7,64,249,34,0,0,20,13,0,128,82,159,1,0,241,77,255,255,84,71,19,64,249,11,0,128,210,40,123,103,248,105,3,11,139,173,5,0,17,42,1,8,139,105,105,243,56, + 171,125,64,147,127,1,12,235,73,249,0,57,11,255,255,84,238,255,255,23,71,19,64,249,139,249,0,57,40,123,103,248,106,3,8,139,73,245,64,57,40,1,30,50,137,6,0,17,72,245,0,57,73,15,0,185,230,255,255,23,72,0,0,240,8,225,45,145,9,253,223,200,32,1,63, + 214,64,11,0,185,224,255,255,23,87,7,64,249,224,3,23,170,225,3,21,42,255,131,2,145,88,190,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83,65,169,253,123,198,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,186, + 169,243,83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145,62,190,255,151,47,40,128,210,68,193,255,151,255,115,47,203,9,124,64,147,255,3,0,249,104,0,0,240,8,65,10,145,42,253,70,147,41,21,64,146,8,121,106,248,11,9,128,210, + 243,3,1,170,0,0,128,210,118,66,34,139,20,0,128,82,41,33,11,155,127,2,22,235,58,21,64,249,2,6,0,84,72,0,0,240,25,129,51,145,245,7,64,185,248,99,0,145,251,99,0,145,171,1,128,82,241,130,130,210,234,99,49,139,232,3,27,170,127,2,22,235,98,1,0,84, + 105,2,192,57,115,6,0,145,63,41,0,113,129,0,0,84,11,1,0,57,8,5,0,145,148,6,0,17,9,21,0,56,31,1,10,235,163,254,255,84,23,1,24,75,40,255,223,200,4,0,128,210,227,67,0,145,226,3,23,42,225,99,0,145,224,3,26,170,0,1,63,214,128,1,0,52,232,19,64,185, + 181,2,8,11,245,7,0,185,31,1,23,107,131,1,0,84,127,2,22,235,241,130,130,210,234,99,49,139,171,1,128,82,35,252,255,84,6,0,0,20,72,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,224,3,0,185,224,3,64,249,225,3,20,42,47,40,128,210,255,115,47,139, + 0,190,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83,65,169,253,123,198,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,186,169,243,83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145, + 230,189,255,151,47,40,128,210,236,192,255,151,255,115,47,203,9,124,64,147,255,3,0,249,104,0,0,240,8,65,10,145,42,253,70,147,41,21,64,146,8,121,106,248,11,9,128,210,243,3,1,170,0,0,128,210,118,66,34,139,20,0,128,82,41,33,11,155,127,2,22,235,57, + 21,64,249,2,6,0,84,72,0,0,240,24,129,51,145,245,7,64,185,250,99,0,145,170,1,128,82,209,130,130,210,251,99,49,139,235,99,0,145,232,3,26,170,127,2,22,235,98,1,0,84,105,2,64,121,115,10,0,145,63,41,0,113,129,0,0,84,10,1,0,121,8,9,0,145,148,10,0, + 17,9,37,0,120,31,1,27,235,163,254,255,84,8,1,11,203,23,253,65,147,8,255,223,200,4,0,128,210,227,67,0,145,226,122,31,83,225,99,0,145,224,3,25,170,0,1,63,214,96,1,0,52,232,19,64,185,181,2,8,11,31,5,23,107,245,7,0,185,99,1,0,84,127,2,22,235,170, + 1,128,82,235,99,0,145,35,252,255,84,6,0,0,20,72,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,224,3,0,185,224,3,64,249,225,3,20,42,47,40,128,210,255,115,47,139,168,189,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83, + 65,169,253,123,198,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,253,123,186,169,243,83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145,142,189,255,151,79,40,128,210,148,192,255,151,255,115,47,203,9,124,64,147,104, + 0,0,240,8,65,10,145,42,253,70,147,41,21,64,146,8,121,106,248,11,9,128,210,243,3,1,170,118,66,34,139,41,33,11,155,232,3,0,145,31,1,0,249,127,2,22,235,31,9,0,185,57,21,64,249,34,7,0,84,72,0,0,240,24,129,51,145,250,99,0,145,187,1,128,82,247,3,19, + 42,235,99,0,145,234,3,27,145,232,3,26,170,127,2,22,235,66,1,0,84,105,2,64,121,115,10,0,145,63,41,0,113,97,0,0,84,27,1,0,121,8,9,0,145,9,37,0,120,31,1,10,235,195,254,255,84,8,1,11,203,3,253,65,147,7,0,128,210,6,0,128,210,165,170,129,82,228,35, + 27,145,226,99,0,145,1,0,128,82,32,189,159,82,170,246,255,151,245,3,0,42,181,2,0,52,20,0,128,82,213,1,0,52,232,35,27,145,1,65,52,139,8,255,223,200,162,2,20,75,4,0,128,210,227,67,0,145,224,3,25,170,0,1,63,214,64,1,0,52,232,19,64,185,20,1,20,11, + 159,2,21,107,131,254,255,84,105,2,23,75,233,7,0,185,127,2,22,235,226,0,0,84,211,255,255,23,72,0,0,240,8,225,45,145,9,253,223,200,32,1,63,214,224,3,0,185,224,3,64,249,225,11,64,185,79,40,128,210,255,115,47,139,70,189,255,151,251,43,64,249,249, + 107,68,169,247,99,67,169,245,91,66,169,243,83,65,169,253,123,198,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,190,169,253,3,0,145,20,0,128,82,191,19,0,185,0,1,128,82,226,232,255,151,115,0,128,82,117, + 0,0,240,118,0,0,240,179,23,0,185,200,34,71,185,127,2,8,107,224,3,0,84,168,150,67,249,9,217,115,248,73,0,0,181,25,0,0,20,40,21,64,185,191,59,3,213,8,53,13,83,8,1,0,52,168,150,67,249,0,217,115,248,200,4,0,148,31,4,0,49,96,0,0,84,136,6,0,17,168, + 19,0,185,168,150,67,249,9,217,115,248,32,193,0,145,74,0,0,240,72,129,42,145,9,253,223,200,32,1,63,214,168,150,67,249,0,217,115,248,126,238,255,151,168,150,67,249,31,217,51,248,180,19,64,185,115,6,0,17,223,255,255,23,0,1,128,82,197,232,255,151, + 224,3,20,42,253,123,194,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,243,3,0,170,104,22,64,185,191,59,3,213,8,53,13,83,136,1,0,52,104,22,64,185,191,59,3,213,8,25,6,83,8,1,0, + 52,96,6,64,249,98,238,255,151,1,40,128,18,96,82,0,145,13,190,255,151,127,126,0,169,127,18,0,185,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,31,8,0,49,161,0,0,84,157,241,255,151,40,1,128,82, + 8,0,0,185,21,0,0,20,0,2,248,55,104,0,0,240,8,145,70,185,31,0,8,107,130,1,0,84,9,124,64,147,104,0,0,240,8,65,10,145,42,253,70,211,41,21,64,146,8,121,106,248,11,9,128,210,41,33,11,155,42,225,64,57,64,1,26,18,6,0,0,20,137,241,255,151,40,1,128,82, + 8,0,0,185,160,238,255,151,0,0,128,82,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,104,0,0,208,0,77,71,185,191,59,3,213,192,3,95,214,127,35,3,213,253,123,186,169,243,83,1,169,245,91,2,169,247,99,3,169,249,107,4,169,251,43,0,249,253,3,0,145, + 184,188,255,151,255,195,15,209,250,3,0,170,247,3,2,170,249,3,3,170,26,2,0,181,225,1,0,180,109,241,255,151,200,2,128,82,8,0,0,185,132,238,255,151,255,195,15,145,180,188,255,151,251,43,64,249,249,107,68,169,247,99,67,169,245,91,66,169,243,83,65, + 169,253,123,198,168,255,35,3,213,192,3,95,214,87,254,255,180,57,254,255,180,63,8,0,241,99,254,255,84,40,4,0,209,255,3,0,249,246,3,8,145,24,105,23,155,246,7,0,249,11,0,128,210,251,67,0,145,8,3,26,203,9,9,215,154,42,5,0,145,95,33,0,241,72,5,0, + 84,31,3,26,235,9,4,0,84,243,2,26,139,127,2,24,235,244,3,26,170,168,1,0,84,225,3,20,170,224,3,19,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,116,194,148,154,243,2,19,139,127,2,24,235,169,254,255,84,235,3,23,170, + 234,3,24,170,159,2,24,235,0,1,0,84,140,2,24,203,72,1,192,57,107,5,0,209,137,105,234,56,136,105,42,56,73,21,0,56,107,255,255,181,24,3,23,203,31,3,26,235,104,252,255,84,235,3,64,249,107,5,0,209,214,34,0,209,235,91,0,169,123,35,0,209,43,248,255, + 183,218,2,64,249,120,3,64,249,211,255,255,23,72,253,65,211,19,125,23,155,224,3,26,170,116,2,26,139,225,3,20,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,141,1,0,84,236,3,23,170,235,3,20,170,95,3,20,235,0,1,0,84, + 106,1,19,203,104,21,192,56,73,1,192,57,140,5,0,209,72,1,0,57,105,241,31,56,76,255,255,181,225,3,24,170,224,3,26,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,141,1,0,84,235,3,23,170,234,3,24,170,95,3,24,235,0,1, + 0,84,76,3,24,203,72,1,192,57,107,5,0,209,137,105,234,56,136,105,42,56,73,21,0,56,107,255,255,181,225,3,24,170,224,3,20,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,141,1,0,84,235,3,23,170,234,3,24,170,159,2,24, + 235,0,1,0,84,140,2,24,203,72,1,192,57,107,5,0,209,137,105,234,56,136,105,42,56,73,21,0,56,107,255,255,181,243,3,26,170,246,3,24,170,159,2,19,235,201,1,0,84,243,2,19,139,127,2,20,235,98,1,0,84,225,3,20,170,224,3,19,170,239,3,25,170,81,0,0,208, + 49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,173,254,255,84,13,0,0,20,243,2,19,139,127,2,24,235,72,1,0,84,225,3,20,170,224,3,19,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,173,254,255,84,245,3,22,170,214, + 2,23,203,223,2,20,235,73,1,0,84,225,3,20,170,224,3,22,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,31,0,0,113,140,254,255,84,223,2,19,235,227,1,0,84,235,3,23,170,234,3,22,170,127,2,22,235,0,1,0,84,108,2,22,203,72,1,192,57, + 107,5,0,209,137,105,234,56,136,105,42,56,73,21,0,56,107,255,255,181,159,2,22,235,148,18,147,154,201,255,255,23,159,2,21,235,162,1,0,84,181,2,23,203,191,2,20,235,73,1,0,84,225,3,20,170,224,3,21,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63, + 214,224,1,63,214,192,254,255,52,12,0,0,20,181,2,23,203,191,2,26,235,41,1,0,84,225,3,20,170,224,3,21,170,239,3,25,170,81,0,0,208,49,82,66,249,32,2,63,214,224,1,63,214,192,254,255,52,9,3,19,203,235,91,64,169,168,2,26,203,31,1,9,235,139,1,0,84, + 95,3,21,235,194,0,0,84,218,134,0,248,107,5,0,145,117,3,0,249,123,35,0,145,235,91,0,169,127,2,24,235,34,235,255,84,250,3,19,170,49,255,255,23,127,2,24,235,194,0,0,84,211,134,0,248,107,5,0,145,120,3,0,249,123,35,0,145,235,91,0,169,95,3,21,235, + 194,233,255,84,248,3,21,170,38,255,255,23,0,0,0,0,127,35,3,213,253,123,191,169,253,3,0,145,163,0,0,181,160,0,0,181,65,1,0,181,0,0,128,82,13,0,0,20,224,0,0,180,193,0,0,180,99,0,0,181,31,0,0,57,250,255,255,23,66,1,0,181,31,0,0,57,105,240,255,151, + 200,2,128,82,8,0,0,185,128,237,255,151,192,2,128,82,253,123,193,168,255,35,3,213,192,3,95,214,234,3,0,170,233,3,1,170,236,3,3,170,77,0,0,203,127,4,0,177,225,0,0,84,168,105,234,56,72,21,0,56,232,252,255,52,41,5,0,209,137,255,255,181,14,0,0,20, + 168,105,234,56,235,3,12,170,72,21,0,56,8,252,255,52,41,5,0,209,105,0,0,180,140,5,0,209,44,255,255,181,104,5,0,209,63,1,0,241,104,145,136,154,72,0,0,181,95,1,0,57,201,250,255,181,127,4,0,177,161,0,0,84,8,0,1,139,31,241,31,56,0,10,128,82,222,255, + 255,23,31,0,0,57,64,240,255,151,72,4,128,82,8,0,0,185,87,237,255,151,64,4,128,82,215,255,255,23,127,35,3,213,253,123,191,169,253,3,0,145,123,187,255,151,255,131,0,209,8,0,128,82,234,3,0,145,9,125,64,147,63,129,0,241,66,4,0,84,8,5,0,17,63,105, + 42,56,31,129,0,113,75,255,255,84,41,0,64,57,44,0,128,82,73,1,0,52,237,3,0,145,43,253,67,211,40,9,0,18,105,105,109,56,138,33,200,26,72,1,9,42,41,28,64,56,104,105,45,56,41,255,255,53,9,0,64,57,73,1,0,52,235,3,0,145,40,9,0,18,41,253,67,211,138, + 33,200,26,40,105,107,56,95,1,8,106,129,0,0,84,9,28,64,56,41,255,255,53,0,0,128,210,255,131,0,145,95,187,255,151,253,123,193,168,255,35,3,213,192,3,95,214,127,1,0,148,0,0,62,212,0,0,0,0,2,0,128,210,3,0,0,20,31,32,3,213,0,0,0,0,127,35,3,213,243, + 83,191,169,253,123,189,169,253,3,0,145,243,3,1,170,225,3,2,170,244,3,0,170,244,0,0,181,0,240,255,151,200,2,128,82,8,0,0,185,23,237,255,151,0,0,128,210,29,0,0,20,83,255,255,180,159,2,19,235,130,255,255,84,224,67,0,145,226,218,255,151,236,19,64, + 249,136,9,64,185,104,0,0,53,96,6,0,209,13,0,0,20,107,6,0,209,107,5,0,209,159,2,11,235,168,0,0,84,104,1,64,57,8,1,12,139,9,101,64,57,73,255,23,55,104,2,11,203,9,1,64,146,106,2,9,203,64,5,0,209,232,163,64,57,168,0,0,52,234,11,64,249,72,169,67, + 185,9,121,30,18,73,169,3,185,253,123,195,168,243,83,193,168,255,35,3,213,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,224,0,0,181,214,239,255,151,200,2,128,82,8,0,0,185,237,236,255,151,0,0,128,146,9,0,0,20,226,3,0,170,104,0,0,208,0, + 69,65,249,73,0,0,208,40,193,47,145,9,253,223,200,1,0,128,82,32,1,63,214,253,123,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,244,3,0,170,243,3,1,170,148,0,0,181,224,3,19,170,201, + 245,255,151,36,0,0,20,147,0,0,181,224,3,20,170,109,236,255,151,31,0,0,20,127,130,0,177,72,3,0,84,72,0,0,208,8,161,47,145,118,0,0,208,192,70,65,249,9,253,223,200,227,3,19,170,226,3,20,170,1,0,128,82,32,1,63,214,128,2,0,181,72,0,0,208,21,161,47, + 145,39,254,255,151,128,1,0,52,224,3,19,170,110,213,255,151,32,1,0,52,192,70,65,249,227,3,19,170,168,254,223,200,226,3,20,170,1,0,128,82,0,1,63,214,160,254,255,180,5,0,0,20,154,239,255,151,136,1,128,82,8,0,0,185,0,0,128,210,253,123,193,168,245, + 91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,99,2,169,253,123,191,169,253,3,0,145,255,67,0,209,243,3,3,42,127,2,0,113,245,3,0,170,246,3,1,42,244,3,2,170,247,3,4,170,248,3,5,42,237,0, + 0,84,97,126,64,147,224,3,20,170,71,186,255,151,31,0,19,107,19,4,0,17,19,160,147,26,7,0,128,210,255,3,0,249,6,0,128,210,229,3,24,42,228,3,23,170,227,3,19,42,226,3,20,170,225,3,22,42,224,3,21,170,56,229,255,151,255,67,0,145,253,123,193,168,247, + 99,66,169,245,91,65,169,243,83,195,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,147,8,0,180,104,0,0,176,20,65,32,145,136,14,64,249,96,14,64,249,31,0,8,235,64,0,0,84,20,236,255,151,96,18,64, + 249,136,18,64,249,31,0,8,235,64,0,0,84,15,236,255,151,96,22,64,249,136,22,64,249,31,0,8,235,64,0,0,84,10,236,255,151,96,26,64,249,136,26,64,249,31,0,8,235,64,0,0,84,5,236,255,151,96,30,64,249,136,30,64,249,31,0,8,235,64,0,0,84,0,236,255,151, + 96,34,64,249,136,34,64,249,31,0,8,235,64,0,0,84,251,235,255,151,96,38,64,249,136,38,64,249,31,0,8,235,64,0,0,84,246,235,255,151,96,54,64,249,136,54,64,249,31,0,8,235,64,0,0,84,241,235,255,151,96,58,64,249,136,58,64,249,31,0,8,235,64,0,0,84,236, + 235,255,151,96,62,64,249,136,62,64,249,31,0,8,235,64,0,0,84,231,235,255,151,96,66,64,249,136,66,64,249,31,0,8,235,64,0,0,84,226,235,255,151,96,70,64,249,136,70,64,249,31,0,8,235,64,0,0,84,221,235,255,151,96,74,64,249,136,74,64,249,31,0,8,235, + 64,0,0,84,216,235,255,151,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,191,169,253,3,0,145,243,3,0,170,147,3,0,180,104,0,0,176,20,65,32,145,136,2,64,249,96,2,64,249,31,0,8,235,64,0,0,84, + 198,235,255,151,96,6,64,249,136,6,64,249,31,0,8,235,64,0,0,84,193,235,255,151,96,10,64,249,136,10,64,249,31,0,8,235,64,0,0,84,188,235,255,151,96,46,64,249,136,46,64,249,31,0,8,235,64,0,0,84,183,235,255,151,96,50,64,249,136,50,64,249,31,0,8,235, + 64,0,0,84,178,235,255,151,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,243,3,0,170,179,10,0,180,116,226,0,145,127,2,20,235,245,3,19,170,160,0,0,84,160,134, + 64,248,160,235,255,151,191,2,20,235,161,255,255,84,149,226,0,145,3,0,0,20,128,134,64,248,154,235,255,151,159,2,21,235,161,255,255,84,116,194,1,145,117,66,3,145,3,0,0,20,128,134,64,248,147,235,255,151,159,2,21,235,161,255,255,84,116,66,3,145, + 117,194,4,145,3,0,0,20,128,134,64,248,140,235,255,151,159,2,21,235,161,255,255,84,116,194,4,145,117,2,5,145,3,0,0,20,128,134,64,248,133,235,255,151,159,2,21,235,161,255,255,84,96,162,64,249,129,235,255,151,96,166,64,249,127,235,255,151,96,170, + 64,249,125,235,255,151,116,130,5,145,117,98,6,145,3,0,0,20,128,134,64,248,120,235,255,151,159,2,21,235,161,255,255,84,116,98,6,145,117,66,7,145,3,0,0,20,128,134,64,248,113,235,255,151,159,2,21,235,161,255,255,84,116,66,7,145,117,194,8,145,3, + 0,0,20,128,134,64,248,106,235,255,151,159,2,21,235,161,255,255,84,116,194,8,145,117,66,10,145,3,0,0,20,128,134,64,248,99,235,255,151,159,2,21,235,161,255,255,84,116,66,10,145,117,130,10,145,3,0,0,20,128,134,64,248,92,235,255,151,159,2,21,235, + 161,255,255,84,96,82,65,249,88,235,255,151,96,86,65,249,86,235,255,151,96,90,65,249,84,235,255,151,96,94,65,249,82,235,255,151,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,255,67,0,209,224,3,0,185,224,3,64,185,96,0, + 62,212,255,67,0,145,192,3,95,214,127,35,3,213,253,123,191,169,253,3,0,145,0,1,128,82,246,255,255,151,253,123,193,168,255,35,3,213,192,3,95,214,255,67,0,209,224,3,0,249,64,0,128,82,96,0,62,212,255,67,0,145,192,3,95,214,72,0,0,208,8,1,47,145,9, + 253,223,200,32,1,31,214,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,244,3,0,170,245,3,1,170,246,3,2,170,243,3,3,170,85,9,0,180,54,9,0,180,168,2,192,57,136,0,0,53,20,9,0,180,159,2,0,121,70,0,0,20,104,162,64,57,104,0,0, + 53,224,3,19,170,245,217,255,151,106,14,64,249,40,189,159,82,64,13,64,185,31,0,8,107,129,1,0,84,104,0,0,208,3,1,46,145,228,3,19,170,226,3,22,170,225,3,21,170,224,3,20,170,153,0,0,148,9,0,128,18,31,0,0,113,32,177,128,26,51,0,0,20,72,157,64,249, + 168,0,0,181,116,5,0,180,168,2,64,57,136,2,0,121,40,0,0,20,169,2,64,57,72,1,64,249,9,217,233,120,137,3,248,54,67,9,64,185,127,4,0,113,77,1,0,84,223,2,3,107,11,1,0,84,159,2,0,241,229,7,159,26,228,3,20,170,226,3,21,170,33,1,128,82,162,242,255,151, + 224,0,0,53,104,14,64,249,9,9,64,185,223,194,41,235,195,0,0,84,168,6,192,57,136,0,0,52,104,14,64,249,0,9,64,185,20,0,0,20,40,0,128,82,73,5,128,82,104,194,0,57,105,46,0,185,0,0,128,18,14,0,0,20,159,2,0,241,229,7,159,26,228,3,20,170,35,0,128,82, + 226,3,21,170,33,1,128,82,139,242,255,151,96,254,255,52,32,0,128,82,4,0,0,20,104,0,0,208,31,193,5,249,0,0,128,82,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,237,3,0,170,98,0,0,181,0,0,128,82,16,0,0,20,170,37, + 64,120,43,36,64,120,72,5,1,81,31,101,0,113,73,129,0,17,104,5,1,81,76,129,137,26,105,129,0,17,31,101,0,113,104,129,137,26,128,1,8,75,128,0,0,53,108,0,0,52,66,4,0,209,66,254,255,181,192,3,95,214,104,0,0,208,0,137,75,185,192,3,95,214,0,0,0,0,233, + 3,0,170,40,1,192,57,0,0,128,210,200,0,0,52,31,0,1,235,128,0,0,84,0,4,0,145,8,104,233,56,136,255,255,53,192,3,95,214,4,0,0,20,31,32,3,213,31,32,3,213,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,190,169,253,3,0,145,244,3,0,42,245, + 3,1,170,246,3,2,42,243,3,3,170,173,245,255,151,31,4,0,177,225,0,0,84,40,0,128,82,41,1,128,82,104,194,0,57,105,46,0,185,0,0,128,146,31,0,0,20,72,0,0,208,8,65,50,145,9,253,223,200,227,3,22,42,226,67,0,145,225,3,21,170,32,1,63,214,0,1,0,53,72,0, + 0,208,8,225,45,145,9,253,223,200,32,1,63,214,225,3,19,170,39,238,255,151,240,255,255,23,224,11,64,249,31,4,0,177,160,253,255,84,137,126,64,147,104,0,0,208,8,65,10,145,42,253,70,147,41,21,64,146,8,121,106,248,11,9,128,210,43,33,11,155,168,31, + 128,82,106,225,64,57,72,1,8,10,104,225,0,57,253,123,194,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,15,31,248,253,123,190,169,253,3,0,145,243,3,0,170,224,67,0,145,44,1,0,148,31,16,0,241,8,1,0,84,232,19, + 64,185,233,255,159,82,31,1,9,107,169,255,159,82,41,129,136,26,83,0,0,180,105,2,0,121,253,123,194,168,243,7,65,248,255,35,3,213,192,3,95,214,127,35,3,213,243,83,187,169,245,91,1,169,247,99,2,169,249,107,3,169,251,35,0,249,253,123,190,169,253, + 3,0,145,247,3,1,170,243,2,64,249,248,3,0,170,246,3,2,170,249,3,3,170,245,3,4,170,120,8,0,180,244,3,24,170,150,5,0,180,122,0,128,210,251,255,159,82,104,2,192,57,104,0,0,53,34,0,128,210,8,0,0,20,104,6,192,57,104,0,0,53,66,0,128,210,4,0,0,20,104, + 10,192,57,31,1,0,113,66,7,154,154,228,3,21,170,227,3,25,170,225,3,19,170,224,67,0,145,252,0,0,148,31,4,0,177,224,3,0,84,96,3,0,180,232,19,64,185,31,1,27,107,169,1,0,84,223,6,0,241,73,2,0,84,10,65,64,81,8,0,155,82,214,6,0,209,8,41,74,42,234,19, + 0,185,136,2,0,121,232,6,128,82,10,85,22,51,138,46,0,120,2,0,0,20,136,2,0,121,136,10,0,145,148,10,0,145,19,0,19,139,214,6,0,209,54,251,255,181,244,3,8,170,136,2,24,203,243,2,0,249,0,253,65,147,10,0,0,20,19,0,128,210,159,2,0,121,250,255,255,23, + 243,2,0,249,73,5,128,82,40,0,128,82,169,46,0,185,168,194,0,57,0,0,128,146,253,123,194,168,251,35,64,249,249,107,67,169,247,99,66,169,245,91,65,169,243,83,197,168,255,35,3,213,192,3,95,214,20,0,128,210,118,0,128,210,104,2,192,57,104,0,0,53,34, + 0,128,210,8,0,0,20,104,6,192,57,104,0,0,53,66,0,128,210,4,0,0,20,104,10,192,57,31,1,0,113,194,6,150,154,228,3,21,170,227,3,25,170,225,3,19,170,0,0,128,210,188,0,0,148,31,4,0,177,0,252,255,84,224,0,0,180,31,16,0,241,65,0,0,84,148,6,0,145,19,0, + 19,139,148,6,0,145,232,255,255,23,224,3,20,170,220,255,255,23,127,35,3,213,253,123,190,169,253,3,0,145,224,35,0,121,34,1,0,148,0,1,0,52,226,83,0,145,33,0,128,82,224,67,0,145,57,1,0,148,96,0,0,52,224,35,64,121,2,0,0,20,224,255,159,82,253,123, + 194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247,19,0,249,253,123,191,169,253,3,0,145,244,3,3,170,147,30,64,249,246,3,1,170,245,3,0,170,247,3,2,170,225,3,20,170,98,18,0,145,224,3,22,170,236,225,255,151,168, + 6,64,185,201,12,128,82,42,0,128,82,31,1,9,106,104,6,64,185,73,5,138,26,63,1,8,106,224,0,0,84,227,3,20,170,226,3,23,170,225,3,22,170,224,3,21,170,47,208,255,151,2,0,0,20,32,0,128,82,253,123,193,168,247,19,64,249,245,91,65,169,243,83,195,168,255, + 35,3,213,192,3,95,214,127,35,3,213,243,15,31,248,253,123,187,169,253,3,0,145,104,0,0,176,8,65,71,185,255,11,0,249,255,131,0,57,255,227,0,57,255,3,1,57,255,35,1,57,8,1,0,53,104,0,0,144,8,97,27,145,16,1,192,61,233,163,0,145,48,1,128,61,41,0,128, + 82,233,227,0,57,225,67,0,145,62,0,0,148,243,3,0,42,224,67,0,145,63,216,255,151,224,3,19,42,253,123,197,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,11,0,249,253,123,191,169,253,3,0,145,243,3,0,170,245,3, + 1,170,211,1,0,181,40,0,128,82,201,2,128,82,168,194,0,57,229,3,21,170,169,46,0,185,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,0,0,128,210,6,234,255,151,0,0,128,18,26,0,0,20,104,22,64,185,20,0,128,18,191,59,3,213,8,53,13,83,72,2,0,52,225,3, + 21,170,224,3,19,170,134,235,255,151,244,3,0,42,224,3,19,170,23,251,255,151,224,3,19,170,79,247,255,151,225,3,21,170,87,1,0,148,96,0,248,54,20,0,128,18,5,0,0,20,96,22,64,249,96,0,0,180,125,233,255,151,127,22,0,249,224,3,19,170,170,1,0,148,224, + 3,20,42,253,123,193,168,245,11,64,249,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,243,3,0,170,179,11,0,249,244,3,1,170,51,2,0,181,40,0,128,82,136,194,0,57,201,2,128,82,137,46,0,185, + 229,3,20,170,4,0,128,210,3,0,128,82,2,0,128,210,1,0,128,210,0,0,128,210,210,233,255,151,0,0,128,18,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,104,22,64,185,191,59,3,213,8,49,12,83,224,3,19,170,104,0,0,52,133,1,0,148,245,255,255, + 23,9,236,255,151,225,3,20,170,224,3,19,170,170,255,255,151,244,3,0,42,224,3,19,170,9,236,255,151,224,3,20,42,237,255,255,23,127,35,3,213,253,123,191,169,253,3,0,145,213,183,255,151,255,67,0,209,104,0,0,176,8,65,46,145,127,0,0,241,107,16,136, + 154,63,0,0,241,41,0,128,210,8,0,0,208,8,201,55,145,70,16,137,154,63,0,0,241,39,16,136,154,63,0,0,241,15,16,159,154,102,0,0,181,32,0,128,146,90,0,0,20,104,13,64,121,232,3,0,53,236,0,64,57,231,4,0,145,204,0,56,55,79,0,0,180,236,1,0,185,159,1,0, + 113,224,7,159,154,80,0,0,20,136,9,27,18,31,1,3,113,97,0,0,84,77,0,128,82,10,0,0,20,136,13,28,18,31,129,3,113,97,0,0,84,109,0,128,82,5,0,0,20,136,17,29,18,31,193,3,113,1,8,0,84,141,0,128,82,232,0,128,82,8,1,13,75,41,33,200,26,42,5,0,81,76,1,12, + 10,238,3,13,42,101,17,0,145,12,0,0,20,109,17,64,57,14,29,0,83,108,1,64,185,168,249,3,17,9,29,0,83,63,9,0,113,192,153,65,122,227,5,0,84,101,17,0,145,223,1,13,107,130,5,0,84,223,1,6,235,201,32,142,154,234,0,1,203,8,0,0,20,230,20,192,56,74,5,0, + 145,200,4,26,18,31,1,2,113,97,4,0,84,200,20,0,18,12,25,12,42,95,1,9,235,3,255,255,84,63,1,14,235,226,0,0,84,200,1,41,75,108,1,0,185,173,0,0,121,9,29,0,83,105,13,0,121,191,255,255,23,8,0,155,82,136,1,8,75,31,253,31,113,105,2,0,84,159,65,68,113, + 34,2,0,84,40,3,0,88,41,0,160,82,232,3,0,249,233,11,0,185,168,9,0,209,233,3,0,145,40,121,104,184,159,1,8,107,3,1,0,84,79,0,0,180,236,1,0,185,159,1,0,113,224,3,142,154,225,3,11,170,35,1,0,148,4,0,0,20,225,3,4,170,224,3,11,170,23,1,0,148,255,67, + 0,145,113,183,255,151,253,123,193,168,255,35,3,213,192,3,95,214,31,32,3,213,128,0,0,0,0,8,0,0,127,35,3,213,243,15,31,248,253,123,191,169,253,3,0,145,115,0,0,144,96,218,68,249,31,8,0,177,193,1,0,84,40,0,0,240,0,33,55,145,73,0,0,176,40,97,42,145, + 9,253,223,200,6,0,128,210,5,0,128,82,100,0,128,82,3,0,128,210,98,0,128,82,1,0,168,82,32,1,63,214,96,218,4,249,31,4,0,177,224,7,159,26,253,123,193,168,243,7,65,248,255,35,3,213,192,3,95,214,0,0,0,0,127,35,3,213,243,83,189,169,245,91,1,169,247, + 19,0,249,253,123,191,169,253,3,0,145,72,0,0,176,8,97,51,145,244,3,0,170,119,0,0,144,224,218,68,249,9,253,223,200,245,3,1,42,246,3,2,170,4,0,128,210,227,3,22,170,226,3,21,42,225,3,20,170,32,1,63,214,243,3,0,42,147,4,0,53,72,0,0,176,8,225,45,145, + 9,253,223,200,32,1,63,214,31,24,0,113,193,3,0,84,224,218,68,249,31,12,0,177,168,0,0,84,72,0,0,176,8,65,42,145,9,253,223,200,32,1,63,214,40,0,0,240,0,33,55,145,73,0,0,176,40,97,42,145,9,253,223,200,6,0,128,210,5,0,128,82,100,0,128,82,3,0,128, + 210,98,0,128,82,1,0,168,82,32,1,63,214,72,0,0,176,8,97,51,145,4,0,128,210,224,218,4,249,9,253,223,200,227,3,22,170,226,3,21,42,225,3,20,170,32,1,63,214,243,3,0,42,224,3,19,42,253,123,193,168,247,19,64,249,245,91,65,169,243,83,195,168,255,35, + 3,213,192,3,95,214,0,0,0,0,0,0,0,0,0,0,0,0,104,0,0,144,0,217,68,249,31,12,0,177,168,0,0,84,72,0,0,176,8,65,42,145,9,253,223,200,32,1,31,214,192,3,95,214,0,0,0,0,127,35,3,213,243,83,190,169,245,91,1,169,253,123,191,169,253,3,0,145,244,3,0,42, + 245,3,1,170,105,243,255,151,31,4,0,177,118,0,0,176,97,0,0,84,19,0,128,82,29,0,0,20,202,74,65,249,159,6,0,113,97,0,0,84,72,33,67,57,168,0,0,55,159,10,0,113,65,1,0,84,72,1,66,57,8,1,0,54,64,0,128,82,89,243,255,151,243,3,0,170,32,0,128,82,86,243, + 255,151,31,0,19,235,224,253,255,84,224,3,20,42,82,243,255,151,72,0,0,176,8,65,42,145,9,253,223,200,32,1,63,214,0,253,255,53,72,0,0,176,8,225,45,145,9,253,223,200,32,1,63,214,243,3,0,42,224,3,20,42,108,243,255,151,136,126,64,147,201,66,10,145, + 11,253,70,147,10,21,64,146,40,121,107,248,12,9,128,210,73,33,12,155,63,225,0,57,211,0,0,52,225,3,21,170,224,3,19,42,202,235,255,151,0,0,128,18,2,0,0,20,0,0,128,82,253,123,193,168,245,91,65,169,243,83,194,168,255,35,3,213,192,3,95,214,0,0,0,0, + 127,35,3,213,253,123,189,169,253,3,0,145,224,23,0,185,31,8,0,49,1,1,0,84,40,0,128,82,63,52,0,185,41,1,128,82,40,224,0,57,40,192,0,57,41,44,0,185,38,0,0,20,0,3,248,55,104,0,0,176,8,145,70,185,31,0,8,107,130,2,0,84,9,124,64,147,104,0,0,176,8,65, + 10,145,42,253,70,147,41,21,64,146,8,121,106,248,11,9,128,210,41,33,11,155,42,225,64,57,74,1,0,54,232,83,0,145,232,7,2,169,224,3,3,41,225,115,0,145,224,67,0,145,227,99,0,145,226,131,0,145,19,0,0,148,15,0,0,20,40,0,128,82,40,224,0,57,41,1,128, + 82,63,52,0,185,229,3,1,170,40,192,0,57,4,0,128,210,41,44,0,185,3,0,128,82,1,0,128,210,2,0,128,210,0,0,128,210,109,232,255,151,0,0,128,18,253,123,195,168,255,35,3,213,192,3,95,214,127,35,3,213,243,83,191,169,253,123,190,169,253,3,0,145,243,3, + 2,170,244,3,3,170,180,11,0,249,32,0,64,185,214,243,255,151,104,2,64,249,0,1,64,185,9,124,64,147,107,6,64,249,42,253,70,147,104,0,0,176,8,65,10,145,41,21,64,146,12,9,128,210,8,121,106,248,41,33,12,155,42,225,64,57,170,0,0,54,225,3,11,170,115, + 255,255,151,243,3,0,42,6,0,0,20,40,0,128,82,104,193,0,57,41,1,128,82,105,45,0,185,19,0,128,18,128,2,64,185,202,243,255,151,224,3,19,42,253,123,194,168,243,83,193,168,255,35,3,213,192,3,95,214,232,127,64,178,31,124,0,169,8,12,0,249,1,0,128,82, + 31,16,0,185,31,32,0,185,31,20,0,249,0,80,0,145,82,183,255,23,0,0,0,0,40,0,128,82,31,0,0,249,73,5,128,82,40,192,0,57,41,44,0,185,0,0,128,146,192,3,95,214,0,0,0,0,63,0,0,249,192,3,95,214,31,32,3,213,32,0,128,82,192,3,95,214,127,35,3,213,253,123, + 191,169,128,255,255,208,0,48,6,145,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,160,67,64,57,165,202,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123, + 191,169,253,3,1,170,160,67,64,57,155,202,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,74,203,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35, + 3,213,253,123,191,169,253,3,1,170,8,0,64,249,4,1,64,185,229,3,0,170,136,255,255,208,3,193,30,145,161,23,64,185,162,131,65,169,234,202,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3, + 1,170,8,0,64,249,9,1,64,185,234,0,0,24,63,1,10,107,224,23,159,26,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,5,0,0,192,127,35,3,213,243,83,191,169,253,123,191,169,253,3,1,170,160,47,0,249,177,99,0,145,32,254,159,200,68,217,255,151,168, + 83,66,169,8,56,0,249,147,6,64,249,64,217,255,151,19,48,0,249,177,99,0,145,40,254,223,200,9,1,64,249,51,29,64,249,58,217,255,151,19,52,0,249,177,99,0,145,40,254,223,200,39,0,128,82,6,0,128,210,5,0,128,82,227,3,20,170,164,11,67,169,161,35,64,249, + 0,1,64,249,167,219,255,151,46,217,255,151,31,56,0,249,40,0,128,82,177,67,0,145,40,254,159,136,32,0,128,82,253,123,193,168,243,83,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,243,15,31,248,253,123,191,169,253,3,1,170,160,23,0,249, + 177,131,0,145,32,254,159,200,168,67,64,57,200,5,0,52,177,131,0,145,40,254,223,200,9,1,64,249,177,99,0,145,41,254,159,200,177,99,0,145,42,254,223,200,9,6,0,24,72,1,64,185,31,1,9,107,97,4,0,84,177,99,0,145,40,254,223,200,9,25,64,185,63,17,0,113, + 193,3,0,84,177,99,0,145,40,254,223,200,201,4,0,24,8,33,64,185,31,1,9,107,160,1,0,84,177,99,0,145,40,254,223,200,41,4,0,24,8,33,64,185,31,1,9,107,224,0,0,84,177,99,0,145,40,254,223,200,137,3,0,24,8,33,64,185,31,1,9,107,129,1,0,84,248,216,255, + 151,177,99,0,145,40,254,223,200,8,16,0,249,177,131,0,145,41,254,223,200,51,5,64,249,241,216,255,151,19,20,0,249,27,216,255,151,31,32,3,213,177,83,0,145,63,254,159,136,177,83,0,145,32,254,223,136,253,123,193,168,243,7,65,248,255,35,3,213,192, + 3,95,214,97,0,0,212,31,32,3,213,99,115,109,224,32,5,147,25,33,5,147,25,34,5,147,25,127,35,3,213,253,123,191,169,253,3,1,170,0,0,128,82,85,225,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169, + 253,3,1,170,168,11,64,249,0,1,64,185,74,225,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,160,19,0,249,8,0,64,249,9,1,64,185,169,23,0,185,104,1,0,24,63,1,8,107,232,23,159,26, + 177,67,0,145,40,254,159,136,177,67,0,145,32,254,223,136,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,99,115,109,224,127,35,3,213,253,123,191,169,253,3,1,170,8,0,64,249,9,1,64,185,170,0,128,82,10,0,184,114,63,1,10,107,224,23,159,26,253, + 123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,160,55,0,249,162,67,0,145,161,15,64,249,170,218,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,243,15,31,248,253, + 123,191,169,253,3,1,170,160,27,64,249,13,205,255,151,168,19,64,185,72,3,0,53,137,4,0,24,179,15,64,249,104,2,64,185,31,1,9,107,161,2,0,84,104,26,64,185,31,17,0,113,65,2,0,84,169,3,0,24,104,34,64,185,31,1,9,107,224,0,0,84,73,3,0,24,31,1,9,107, + 128,0,0,84,9,3,0,24,31,1,9,107,1,1,0,84,96,22,64,249,131,205,255,151,160,0,0,52,33,0,128,82,224,3,19,170,77,205,255,151,31,32,3,213,125,216,255,151,168,31,64,249,8,16,0,249,122,216,255,151,168,35,64,249,8,20,0,249,253,123,193,168,243,7,65,248, + 255,35,3,213,192,3,95,214,97,0,0,212,99,115,109,224,32,5,147,25,33,5,147,25,34,5,147,25,127,35,3,213,253,123,191,169,253,3,1,170,137,205,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253, + 3,1,170,98,216,255,151,8,48,64,185,31,1,0,113,173,0,0,84,94,216,255,151,8,48,64,185,9,5,0,81,9,48,0,185,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,224,0,128,82,204,224,255,151,31,32,3,213,253, + 123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,160,0,128,82,194,224,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,168,67,64,57,136, + 0,0,52,96,0,128,82,182,224,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,168,11,64,249,0,1,64,249,25,233,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0, + 212,127,35,3,213,253,123,191,169,253,3,1,170,168,31,64,249,0,1,64,185,160,224,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,168,19,64,249,0,1,64,185,149,224,255,151,31,32,3, + 213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,128,0,128,82,139,224,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,168,11,64, + 249,0,1,64,185,38,242,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,160,19,64,185,28,242,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213, + 253,123,191,169,253,3,1,170,0,1,128,82,108,224,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95,214,97,0,0,212,127,35,3,213,253,123,191,169,253,3,1,170,160,11,64,249,208,232,255,151,31,32,3,213,253,123,193,168,255,35,3,213,192,3,95, + 214,97,0,0,212,81,0,0,240,49,66,43,145,22,0,0,20,81,0,0,240,49,98,43,145,19,0,0,20,81,0,0,240,49,130,43,145,16,0,0,20,81,0,0,240,49,162,43,145,13,0,0,20,81,0,0,240,49,194,43,145,10,0,0,20,81,0,0,240,49,226,43,145,7,0,0,20,81,0,0,240,49,2,44, + 145,4,0,0,20,81,0,0,240,49,34,44,145,1,0,0,20,253,123,179,169,253,3,0,145,224,7,1,169,226,15,2,169,228,23,3,169,230,31,4,169,224,135,2,173,226,143,3,173,228,151,4,173,230,159,5,173,225,3,17,170,64,0,0,144,0,224,20,145,144,255,255,176,16,194, + 58,145,0,2,63,214,240,3,0,170,230,159,69,173,228,151,68,173,226,143,67,173,224,135,66,173,230,31,68,169,228,23,67,169,226,15,66,169,224,7,65,169,253,123,205,168,0,2,31,214,81,0,0,240,49,98,44,145,4,0,0,20,81,0,0,240,49,130,44,145,1,0,0,20,253, + 123,179,169,253,3,0,145,224,7,1,169,226,15,2,169,228,23,3,169,230,31,4,169,224,135,2,173,226,143,3,173,228,151,4,173,230,159,5,173,225,3,17,170,64,0,0,144,0,96,21,145,144,255,255,176,16,194,58,145,0,2,63,214,240,3,0,170,230,159,69,173,228,151, + 68,173,226,143,67,173,224,135,66,173,230,31,68,169,228,23,67,169,226,15,66,169,224,7,65,169,253,123,205,168,0,2,31,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,5,147,25,2,0,0,0,220,210,1,0,1,0,0,0,236,210,1,0,1,0,0,0,24,211,1,0,240,255,255,255,0,0,0,0,5, + 0,0,0,0,0,0,0,0,0,0,0,208,187,1,128,1,0,0,0,224,83,0,128,1,0,0,0,192,83,0,128,1,0,0,0,85,110,107,110,111,119,110,32,101,120,99,101,112,116,105,111,110,0,0,0,0,0,0,0,72,188,1,128,1,0,0,0,224,83,0,128,1,0,0,0,192,83,0,128,1,0,0,0,98,97,100,32, + 97,108,108,111,99,97,116,105,111,110,0,0,200,188,1,128,1,0,0,0,224,83,0,128,1,0,0,0,192,83,0,128,1,0,0,0,98,97,100,32,97,114,114,97,121,32,110,101,119,32,108,101,110,103,116,104,0,0,0,0,80,189,1,128,1,0,0,0,128,85,0,128,1,0,0,0,0,0,0,0,0,0,0, + 0,75,0,69,0,82,0,78,0,69,0,76,0,51,0,50,0,46,0,68,0,76,0,76,0,0,0,0,0,0,0,0,0,65,99,113,117,105,114,101,83,82,87,76,111,99,107,69,120,99,108,117,115,105,118,101,0,82,101,108,101,97,115,101,83,82,87,76,111,99,107,69,120,99,108,117,115,105,118, + 101,0,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,240,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,196, + 1,128,1,0,0,0,168,196,1,128,1,0,0,0,96,195,1,128,1,0,0,0,79,0,0,0,0,0,0,0,0,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,196,1,128,1,0,0,0,184,196,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,41,0,0,128,1, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,32,5,147,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,115,0,128,1,0,0,0,128,122,0,128,1,0,0,0,0,0,0,0,0,0,0,0,16,123,0,128,1,0,0,0,0,0,0,0,0,0,0,0,96,187,0,128,1,0,0,0,160,187,0,128,1,0,0,0,224,122,0,128,1,0,0,0,224,122,0,128,1,0,0,0, + 16,193,0,128,1,0,0,0,144,193,0,128,1,0,0,0,96,194,0,128,1,0,0,0,160,194,0,128,1,0,0,0,0,0,0,0,0,0,0,0,112,123,0,128,1,0,0,0,176,194,0,128,1,0,0,0,16,195,0,128,1,0,0,0,48,203,0,128,1,0,0,0,128,203,0,128,1,0,0,0,48,206,0,128,1,0,0,0,224,122,0, + 128,1,0,0,0,176,206,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,122,0,128,1,0,0,0,0,0,0,0,0,0,0,0,240,123,0,128,1,0,0,0,0,0,0,0,0,0,0,0,160,123,0,128,1,0,0,0,224,122,0,128,1,0,0,0,240,122,0,128,1,0,0,0,160,122,0,128,1,0,0,0,224,122,0,128, + 1,0,0,0,109,0,115,0,99,0,111,0,114,0,101,0,101,0,46,0,100,0,108,0,108,0,0,0,67,111,114,69,120,105,116,80,114,111,99,101,115,115,0,0,0,0,0,0,0,0,0,0,34,5,147,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,144,213,1,0,232,255,255,255,0,0,0,0,5,0,0, + 0,0,0,0,0,0,0,0,0,34,5,147,25,1,0,0,0,204,213,1,0,0,0,0,0,0,0,0,0,2,0,0,0,224,213,1,0,224,255,255,255,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,34,5,147,25,1,0,0,0,204,213,1,0,0,0,0,0,0,0,0,0,1,0,0,0,104,214,1,0,240,255,255,255,0,0,0,0,1,0,0,0,0,0,0,0, + 0,0,0,0,34,5,147,25,1,0,0,0,204,213,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,255,255,255,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,192,11,0,0,0,0,0,0,0,0,0,0,0,29,0,0,192,4,0,0,0,0,0,0,0,0,0,0,0,150,0,0,192,4,0,0,0,0,0,0,0,0,0,0,0,141,0,0,192,8,0, + 0,0,0,0,0,0,0,0,0,0,142,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,143,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,144,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,145,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,146,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,147,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,180,2, + 0,192,8,0,0,0,0,0,0,0,0,0,0,0,181,2,0,192,8,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,200,189,1,128,1,0,0,0,224,83,0,128,1,0,0,0,192,83,0,128,1,0,0,0,98,97,100,32,101,120,99,101,112,116,105,111,110,0,0,0,244,93,1, + 128,1,0,0,0,4,0,0,0,0,0,0,0,0,94,1,128,1,0,0,0,7,0,0,0,0,0,0,0,8,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,12,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,16,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,20,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,24,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0, + 28,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,32,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,40,94,1,128,1,0,0,0,8,0,0,0,0,0,0,0,52,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,56,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,60,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,64,94,1,128,1,0,0,0,2,0,0, + 0,0,0,0,0,68,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,72,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,76,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,80,94,1,128,1,0,0,0,3,0,0,0,0,0,0,0,84,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,88,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,92,94,1,128,1,0, + 0,0,1,0,0,0,0,0,0,0,96,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,100,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,104,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,108,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,112,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,116,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0, + 120,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,124,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,128,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,132,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,136,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,140,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,144,94,1,128,1,0,0, + 0,2,0,0,0,0,0,0,0,148,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,152,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,156,94,1,128,1,0,0,0,3,0,0,0,0,0,0,0,160,94,1,128,1,0,0,0,3,0,0,0,0,0,0,0,164,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,168,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,172, + 94,1,128,1,0,0,0,2,0,0,0,0,0,0,0,176,94,1,128,1,0,0,0,9,0,0,0,0,0,0,0,192,94,1,128,1,0,0,0,9,0,0,0,0,0,0,0,208,94,1,128,1,0,0,0,7,0,0,0,0,0,0,0,216,94,1,128,1,0,0,0,8,0,0,0,0,0,0,0,232,94,1,128,1,0,0,0,20,0,0,0,0,0,0,0,0,95,1,128,1,0,0,0,8,0, + 0,0,0,0,0,0,16,95,1,128,1,0,0,0,18,0,0,0,0,0,0,0,40,95,1,128,1,0,0,0,28,0,0,0,0,0,0,0,72,95,1,128,1,0,0,0,29,0,0,0,0,0,0,0,104,95,1,128,1,0,0,0,28,0,0,0,0,0,0,0,136,95,1,128,1,0,0,0,29,0,0,0,0,0,0,0,168,95,1,128,1,0,0,0,28,0,0,0,0,0,0,0,200, + 95,1,128,1,0,0,0,35,0,0,0,0,0,0,0,240,95,1,128,1,0,0,0,26,0,0,0,0,0,0,0,16,96,1,128,1,0,0,0,32,0,0,0,0,0,0,0,56,96,1,128,1,0,0,0,31,0,0,0,0,0,0,0,88,96,1,128,1,0,0,0,38,0,0,0,0,0,0,0,128,96,1,128,1,0,0,0,26,0,0,0,0,0,0,0,160,96,1,128,1,0,0,0, + 15,0,0,0,0,0,0,0,176,96,1,128,1,0,0,0,3,0,0,0,0,0,0,0,180,96,1,128,1,0,0,0,5,0,0,0,0,0,0,0,192,96,1,128,1,0,0,0,15,0,0,0,0,0,0,0,208,96,1,128,1,0,0,0,35,0,0,0,0,0,0,0,244,96,1,128,1,0,0,0,6,0,0,0,0,0,0,0,0,97,1,128,1,0,0,0,9,0,0,0,0,0,0,0,16, + 97,1,128,1,0,0,0,14,0,0,0,0,0,0,0,32,97,1,128,1,0,0,0,26,0,0,0,0,0,0,0,64,97,1,128,1,0,0,0,28,0,0,0,0,0,0,0,96,97,1,128,1,0,0,0,37,0,0,0,0,0,0,0,136,97,1,128,1,0,0,0,36,0,0,0,0,0,0,0,176,97,1,128,1,0,0,0,37,0,0,0,0,0,0,0,216,97,1,128,1,0,0,0, + 43,0,0,0,0,0,0,0,8,98,1,128,1,0,0,0,26,0,0,0,0,0,0,0,40,98,1,128,1,0,0,0,32,0,0,0,0,0,0,0,80,98,1,128,1,0,0,0,34,0,0,0,0,0,0,0,120,98,1,128,1,0,0,0,40,0,0,0,0,0,0,0,168,98,1,128,1,0,0,0,42,0,0,0,0,0,0,0,216,98,1,128,1,0,0,0,27,0,0,0,0,0,0,0, + 248,98,1,128,1,0,0,0,12,0,0,0,0,0,0,0,8,99,1,128,1,0,0,0,17,0,0,0,0,0,0,0,32,99,1,128,1,0,0,0,11,0,0,0,0,0,0,0,242,93,1,128,1,0,0,0,0,0,0,0,0,0,0,0,48,99,1,128,1,0,0,0,17,0,0,0,0,0,0,0,72,99,1,128,1,0,0,0,27,0,0,0,0,0,0,0,104,99,1,128,1,0,0, + 0,18,0,0,0,0,0,0,0,128,99,1,128,1,0,0,0,28,0,0,0,0,0,0,0,160,99,1,128,1,0,0,0,25,0,0,0,0,0,0,0,242,93,1,128,1,0,0,0,0,0,0,0,0,0,0,0,56,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,76,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,128,94,1,128,1,0,0,0,2,0,0,0,0,0,0,0, + 120,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,88,94,1,128,1,0,0,0,1,0,0,0,0,0,0,0,0,95,1,128,1,0,0,0,8,0,0,0,0,0,0,0,192,99,1,128,1,0,0,0,21,0,0,0,0,0,0,0,16,93,1,128,1,0,0,0,8,0,0,0,0,0,0,0,32,93,1,128,1,0,0,0,7,0,0,0,0,0,0,0,40,93,1,128,1,0,0,0,8,0, + 0,0,0,0,0,0,56,93,1,128,1,0,0,0,9,0,0,0,0,0,0,0,72,93,1,128,1,0,0,0,10,0,0,0,0,0,0,0,88,93,1,128,1,0,0,0,10,0,0,0,0,0,0,0,104,93,1,128,1,0,0,0,12,0,0,0,0,0,0,0,120,93,1,128,1,0,0,0,9,0,0,0,0,0,0,0,132,93,1,128,1,0,0,0,6,0,0,0,0,0,0,0,144,93, + 1,128,1,0,0,0,9,0,0,0,0,0,0,0,160,93,1,128,1,0,0,0,9,0,0,0,0,0,0,0,176,93,1,128,1,0,0,0,9,0,0,0,0,0,0,0,192,93,1,128,1,0,0,0,7,0,0,0,0,0,0,0,200,93,1,128,1,0,0,0,10,0,0,0,0,0,0,0,216,93,1,128,1,0,0,0,11,0,0,0,0,0,0,0,232,93,1,128,1,0,0,0,9,0, + 0,0,0,0,0,0,242,93,1,128,1,0,0,0,0,0,0,0,0,0,0,0,95,95,98,97,115,101,100,40,0,0,0,0,0,0,0,0,95,95,99,100,101,99,108,0,95,95,112,97,115,99,97,108,0,0,0,0,0,0,0,0,95,95,115,116,100,99,97,108,108,0,0,0,0,0,0,0,95,95,116,104,105,115,99,97,108,108, + 0,0,0,0,0,0,95,95,102,97,115,116,99,97,108,108,0,0,0,0,0,0,95,95,118,101,99,116,111,114,99,97,108,108,0,0,0,0,95,95,99,108,114,99,97,108,108,0,0,0,95,95,101,97,98,105,0,0,0,0,0,0,95,95,115,119,105,102,116,95,49,0,0,0,0,0,0,0,95,95,115,119,105, + 102,116,95,50,0,0,0,0,0,0,0,95,95,115,119,105,102,116,95,51,0,0,0,0,0,0,0,95,95,112,116,114,54,52,0,95,95,114,101,115,116,114,105,99,116,0,0,0,0,0,0,95,95,117,110,97,108,105,103,110,101,100,0,0,0,0,0,114,101,115,116,114,105,99,116,40,0,0,0,32, + 110,101,119,0,0,0,0,0,0,0,0,32,100,101,108,101,116,101,0,61,0,0,0,62,62,0,0,60,60,0,0,33,0,0,0,61,61,0,0,33,61,0,0,91,93,0,0,0,0,0,0,111,112,101,114,97,116,111,114,0,0,0,0,45,62,0,0,42,0,0,0,43,43,0,0,45,45,0,0,45,0,0,0,43,0,0,0,38,0,0,0,45, + 62,42,0,47,0,0,0,37,0,0,0,60,0,0,0,60,61,0,0,62,0,0,0,62,61,0,0,44,0,0,0,40,41,0,0,126,0,0,0,94,0,0,0,124,0,0,0,38,38,0,0,124,124,0,0,42,61,0,0,43,61,0,0,45,61,0,0,47,61,0,0,37,61,0,0,62,62,61,0,60,60,61,0,38,61,0,0,124,61,0,0,94,61,0,0,96,118, + 102,116,97,98,108,101,39,0,0,0,0,0,0,0,96,118,98,116,97,98,108,101,39,0,0,0,0,0,0,0,96,118,99,97,108,108,39,0,96,116,121,112,101,111,102,39,0,0,0,0,0,0,0,0,96,108,111,99,97,108,32,115,116,97,116,105,99,32,103,117,97,114,100,39,0,0,0,0,96,115, + 116,114,105,110,103,39,0,0,0,0,0,0,0,0,96,118,98,97,115,101,32,100,101,115,116,114,117,99,116,111,114,39,0,0,0,0,0,0,96,118,101,99,116,111,114,32,100,101,108,101,116,105,110,103,32,100,101,115,116,114,117,99,116,111,114,39,0,0,0,0,96,100,101, + 102,97,117,108,116,32,99,111,110,115,116,114,117,99,116,111,114,32,99,108,111,115,117,114,101,39,0,0,0,96,115,99,97,108,97,114,32,100,101,108,101,116,105,110,103,32,100,101,115,116,114,117,99,116,111,114,39,0,0,0,0,96,118,101,99,116,111,114, + 32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,96,118,101,99,116,111,114,32,100,101,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,96,118,101,99,116,111,114,32,118,98,97,115, + 101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,96,118,105,114,116,117,97,108,32,100,105,115,112,108,97,99,101,109,101,110,116,32,109,97,112,39,0,0,0,0,0,0,96,101,104,32,118,101,99,116,111,114, + 32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,0,0,0,96,101,104,32,118,101,99,116,111,114,32,100,101,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,96,101,104,32,118,101,99, + 116,111,114,32,118,98,97,115,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,96,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,99,108,111,115,117,114,101,39,0,0,0,0,0,0,96,117,100,116, + 32,114,101,116,117,114,110,105,110,103,39,0,96,69,72,0,96,82,84,84,73,0,0,0,0,0,0,0,96,108,111,99,97,108,32,118,102,116,97,98,108,101,39,0,96,108,111,99,97,108,32,118,102,116,97,98,108,101,32,99,111,110,115,116,114,117,99,116,111,114,32,99,108, + 111,115,117,114,101,39,0,32,110,101,119,91,93,0,0,0,0,0,0,32,100,101,108,101,116,101,91,93,0,0,0,0,0,0,0,96,111,109,110,105,32,99,97,108,108,115,105,103,39,0,0,96,112,108,97,99,101,109,101,110,116,32,100,101,108,101,116,101,32,99,108,111,115, + 117,114,101,39,0,0,0,0,0,0,96,112,108,97,99,101,109,101,110,116,32,100,101,108,101,116,101,91,93,32,99,108,111,115,117,114,101,39,0,0,0,0,96,109,97,110,97,103,101,100,32,118,101,99,116,111,114,32,99,111,110,115,116,114,117,99,116,111,114,32, + 105,116,101,114,97,116,111,114,39,0,0,0,96,109,97,110,97,103,101,100,32,118,101,99,116,111,114,32,100,101,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,96,101,104,32,118,101,99,116,111,114,32,99,111,112,121,32,99, + 111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,96,101,104,32,118,101,99,116,111,114,32,118,98,97,115,101,32,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0, + 0,0,0,0,96,100,121,110,97,109,105,99,32,105,110,105,116,105,97,108,105,122,101,114,32,102,111,114,32,39,0,0,0,0,0,0,96,100,121,110,97,109,105,99,32,97,116,101,120,105,116,32,100,101,115,116,114,117,99,116,111,114,32,102,111,114,32,39,0,0,0,0, + 0,0,0,0,96,118,101,99,116,111,114,32,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,0,96,118,101,99,116,111,114,32,118,98,97,115,101,32,99,111,112,121,32,99,111,110,115,116,114,117, + 99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,0,0,0,96,109,97,110,97,103,101,100,32,118,101,99,116,111,114,32,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,0,96,108, + 111,99,97,108,32,115,116,97,116,105,99,32,116,104,114,101,97,100,32,103,117,97,114,100,39,0,0,0,0,0,111,112,101,114,97,116,111,114,32,34,34,32,0,0,0,0,111,112,101,114,97,116,111,114,32,99,111,95,97,119,97,105,116,0,0,0,0,0,0,0,111,112,101,114, + 97,116,111,114,60,61,62,0,0,0,0,0,32,84,121,112,101,32,68,101,115,99,114,105,112,116,111,114,39,0,0,0,0,0,0,0,32,66,97,115,101,32,67,108,97,115,115,32,68,101,115,99,114,105,112,116,111,114,32,97,116,32,40,0,0,0,0,0,32,66,97,115,101,32,67,108, + 97,115,115,32,65,114,114,97,121,39,0,0,0,0,0,0,32,67,108,97,115,115,32,72,105,101,114,97,114,99,104,121,32,68,101,115,99,114,105,112,116,111,114,39,0,0,0,0,32,67,111,109,112,108,101,116,101,32,79,98,106,101,99,116,32,76,111,99,97,116,111,114, + 39,0,0,0,0,0,0,0,96,97,110,111,110,121,109,111,117,115,32,110,97,109,101,115,112,97,99,101,39,0,0,0,0,0,0,0,0,0,0,0,144,100,1,128,1,0,0,0,208,100,1,128,1,0,0,0,8,101,1,128,1,0,0,0,64,101,1,128,1,0,0,0,144,101,1,128,1,0,0,0,240,101,1,128,1,0, + 0,0,64,102,1,128,1,0,0,0,128,102,1,128,1,0,0,0,192,102,1,128,1,0,0,0,0,103,1,128,1,0,0,0,64,103,1,128,1,0,0,0,128,103,1,128,1,0,0,0,208,103,1,128,1,0,0,0,48,104,1,128,1,0,0,0,128,104,1,128,1,0,0,0,208,104,1,128,1,0,0,0,232,104,1,128,1,0,0,0, + 0,105,1,128,1,0,0,0,24,105,1,128,1,0,0,0,48,105,1,128,1,0,0,0,120,105,1,128,1,0,0,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,100,0,97,0,116,0,101,0,116,0,105,0,109,0,101,0,45,0, + 108,0,49,0,45,0,49,0,45,0,49,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,102,0,105,0,108,0,101,0,45,0,108,0,49,0,45,0,50,0,45,0,52,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110, + 0,45,0,99,0,111,0,114,0,101,0,45,0,102,0,105,0,108,0,101,0,45,0,108,0,49,0,45,0,50,0,45,0,50,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,108,0,111,0,99,0,97,0,108,0,105,0,122,0,97,0,116,0,105, + 0,111,0,110,0,45,0,108,0,49,0,45,0,50,0,45,0,49,0,0,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,108,0,111,0,99,0,97,0,108,0,105,0,122,0,97,0,116,0,105,0,111,0,110,0,45,0,111,0,98, + 0,115,0,111,0,108,0,101,0,116,0,101,0,45,0,108,0,49,0,45,0,50,0,45,0,48,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,112,0,114,0,111,0,99,0,101,0,115,0,115,0,116,0,104,0,114,0,101, + 0,97,0,100,0,115,0,45,0,108,0,49,0,45,0,49,0,45,0,50,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,115,0,116,0,114,0,105,0,110,0,103,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,0,0, + 97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,115,0,121,0,110,0,99,0,104,0,45,0,108,0,49,0,45,0,50,0,45,0,48,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111, + 0,114,0,101,0,45,0,115,0,121,0,115,0,105,0,110,0,102,0,111,0,45,0,108,0,49,0,45,0,50,0,45,0,49,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,119,0,105,0,110,0,114,0,116,0,45,0,108,0,49,0, + 45,0,49,0,45,0,48,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,120,0,115,0,116,0,97,0,116,0,101,0,45,0,108,0,50,0,45,0,49,0,45,0,48,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115, + 0,45,0,119,0,105,0,110,0,45,0,114,0,116,0,99,0,111,0,114,0,101,0,45,0,110,0,116,0,117,0,115,0,101,0,114,0,45,0,119,0,105,0,110,0,100,0,111,0,119,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0, + 110,0,45,0,115,0,101,0,99,0,117,0,114,0,105,0,116,0,121,0,45,0,115,0,121,0,115,0,116,0,101,0,109,0,102,0,117,0,110,0,99,0,116,0,105,0,111,0,110,0,115,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,101,0,120,0,116,0,45,0,109,0, + 115,0,45,0,119,0,105,0,110,0,45,0,110,0,116,0,117,0,115,0,101,0,114,0,45,0,100,0,105,0,97,0,108,0,111,0,103,0,98,0,111,0,120,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,101,0,120,0,116,0,45,0,109,0,115,0,45,0,119,0,105,0,110, + 0,45,0,110,0,116,0,117,0,115,0,101,0,114,0,45,0,119,0,105,0,110,0,100,0,111,0,119,0,115,0,116,0,97,0,116,0,105,0,111,0,110,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,97,0,100,0,118,0,97,0,112,0,105,0,51,0,50,0,0,0,0,0,0,0,0,0,107,0,101,0, + 114,0,110,0,101,0,108,0,51,0,50,0,0,0,0,0,0,0,0,0,107,0,101,0,114,0,110,0,101,0,108,0,98,0,97,0,115,0,101,0,0,0,0,0,110,0,116,0,100,0,108,0,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,97,0, + 112,0,112,0,109,0,111,0,100,0,101,0,108,0,45,0,114,0,117,0,110,0,116,0,105,0,109,0,101,0,45,0,108,0,49,0,45,0,49,0,45,0,50,0,0,0,0,0,117,0,115,0,101,0,114,0,51,0,50,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,0,0,101,0,120,0,116,0,45,0, + 109,0,115,0,45,0,0,0,16,0,0,0,0,0,0,0,65,114,101,70,105,108,101,65,112,105,115,65,78,83,73,0,7,0,0,0,16,0,0,0,73,110,105,116,105,97,108,105,122,101,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,69,120,0,0,0,0,0,3,0,0,0,16,0,0,0,76,67, + 77,97,112,83,116,114,105,110,103,69,120,0,0,0,3,0,0,0,16,0,0,0,76,111,99,97,108,101,78,97,109,101,84,111,76,67,73,68,0,0,0,0,19,0,0,0,65,112,112,80,111,108,105,99,121,71,101,116,80,114,111,99,101,115,115,84,101,114,109,105,110,97,116,105,111, + 110,77,101,116,104,111,100,0,0,0,0,106,0,97,0,45,0,74,0,80,0,0,0,0,0,0,0,122,0,104,0,45,0,67,0,78,0,0,0,0,0,0,0,107,0,111,0,45,0,75,0,82,0,0,0,0,0,0,0,122,0,104,0,45,0,84,0,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,109,1,128,1,0,0,0,84,109,1,128,1, + 0,0,0,88,109,1,128,1,0,0,0,92,109,1,128,1,0,0,0,96,109,1,128,1,0,0,0,100,109,1,128,1,0,0,0,104,109,1,128,1,0,0,0,108,109,1,128,1,0,0,0,116,109,1,128,1,0,0,0,128,109,1,128,1,0,0,0,136,109,1,128,1,0,0,0,152,109,1,128,1,0,0,0,164,109,1,128,1,0, + 0,0,176,109,1,128,1,0,0,0,188,109,1,128,1,0,0,0,192,109,1,128,1,0,0,0,196,109,1,128,1,0,0,0,200,109,1,128,1,0,0,0,204,109,1,128,1,0,0,0,208,109,1,128,1,0,0,0,212,109,1,128,1,0,0,0,216,109,1,128,1,0,0,0,220,109,1,128,1,0,0,0,224,109,1,128,1,0, + 0,0,228,109,1,128,1,0,0,0,232,109,1,128,1,0,0,0,240,109,1,128,1,0,0,0,248,109,1,128,1,0,0,0,4,110,1,128,1,0,0,0,12,110,1,128,1,0,0,0,204,109,1,128,1,0,0,0,20,110,1,128,1,0,0,0,28,110,1,128,1,0,0,0,36,110,1,128,1,0,0,0,48,110,1,128,1,0,0,0,64, + 110,1,128,1,0,0,0,72,110,1,128,1,0,0,0,88,110,1,128,1,0,0,0,100,110,1,128,1,0,0,0,104,110,1,128,1,0,0,0,112,110,1,128,1,0,0,0,128,110,1,128,1,0,0,0,152,110,1,128,1,0,0,0,1,0,0,0,0,0,0,0,168,110,1,128,1,0,0,0,176,110,1,128,1,0,0,0,184,110,1,128, + 1,0,0,0,192,110,1,128,1,0,0,0,200,110,1,128,1,0,0,0,208,110,1,128,1,0,0,0,216,110,1,128,1,0,0,0,224,110,1,128,1,0,0,0,240,110,1,128,1,0,0,0,0,111,1,128,1,0,0,0,16,111,1,128,1,0,0,0,40,111,1,128,1,0,0,0,64,111,1,128,1,0,0,0,80,111,1,128,1,0,0, + 0,104,111,1,128,1,0,0,0,112,111,1,128,1,0,0,0,120,111,1,128,1,0,0,0,128,111,1,128,1,0,0,0,136,111,1,128,1,0,0,0,144,111,1,128,1,0,0,0,152,111,1,128,1,0,0,0,160,111,1,128,1,0,0,0,168,111,1,128,1,0,0,0,176,111,1,128,1,0,0,0,184,111,1,128,1,0,0, + 0,192,111,1,128,1,0,0,0,200,111,1,128,1,0,0,0,216,111,1,128,1,0,0,0,240,111,1,128,1,0,0,0,0,112,1,128,1,0,0,0,136,111,1,128,1,0,0,0,16,112,1,128,1,0,0,0,32,112,1,128,1,0,0,0,48,112,1,128,1,0,0,0,64,112,1,128,1,0,0,0,88,112,1,128,1,0,0,0,104, + 112,1,128,1,0,0,0,128,112,1,128,1,0,0,0,148,112,1,128,1,0,0,0,156,112,1,128,1,0,0,0,168,112,1,128,1,0,0,0,192,112,1,128,1,0,0,0,232,112,1,128,1,0,0,0,0,113,1,128,1,0,0,0,83,117,110,0,77,111,110,0,84,117,101,0,87,101,100,0,84,104,117,0,70,114, + 105,0,83,97,116,0,83,117,110,100,97,121,0,0,77,111,110,100,97,121,0,0,0,0,0,0,84,117,101,115,100,97,121,0,87,101,100,110,101,115,100,97,121,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,70,114,105,100,97,121,0,0,0,0,0,0,83,97,116,117,114, + 100,97,121,0,0,0,0,74,97,110,0,70,101,98,0,77,97,114,0,65,112,114,0,77,97,121,0,74,117,110,0,74,117,108,0,65,117,103,0,83,101,112,0,79,99,116,0,78,111,118,0,68,101,99,0,0,0,0,0,74,97,110,117,97,114,121,0,70,101,98,114,117,97,114,121,0,0,0,0, + 77,97,114,99,104,0,0,0,65,112,114,105,108,0,0,0,74,117,110,101,0,0,0,0,74,117,108,121,0,0,0,0,65,117,103,117,115,116,0,0,0,0,0,0,83,101,112,116,101,109,98,101,114,0,0,0,0,0,0,0,79,99,116,111,98,101,114,0,78,111,118,101,109,98,101,114,0,0,0,0, + 0,0,0,0,68,101,99,101,109,98,101,114,0,0,0,0,65,77,0,0,80,77,0,0,0,0,0,0,77,77,47,100,100,47,121,121,0,0,0,0,0,0,0,0,100,100,100,100,44,32,77,77,77,77,32,100,100,44,32,121,121,121,121,0,0,0,0,0,72,72,58,109,109,58,115,115,0,0,0,0,0,0,0,0,83, + 0,117,0,110,0,0,0,77,0,111,0,110,0,0,0,84,0,117,0,101,0,0,0,87,0,101,0,100,0,0,0,84,0,104,0,117,0,0,0,70,0,114,0,105,0,0,0,83,0,97,0,116,0,0,0,83,0,117,0,110,0,100,0,97,0,121,0,0,0,0,0,77,0,111,0,110,0,100,0,97,0,121,0,0,0,0,0,84,0,117,0,101, + 0,115,0,100,0,97,0,121,0,0,0,87,0,101,0,100,0,110,0,101,0,115,0,100,0,97,0,121,0,0,0,0,0,0,0,84,0,104,0,117,0,114,0,115,0,100,0,97,0,121,0,0,0,0,0,0,0,0,0,70,0,114,0,105,0,100,0,97,0,121,0,0,0,0,0,83,0,97,0,116,0,117,0,114,0,100,0,97,0,121,0, + 0,0,0,0,0,0,0,0,74,0,97,0,110,0,0,0,70,0,101,0,98,0,0,0,77,0,97,0,114,0,0,0,65,0,112,0,114,0,0,0,77,0,97,0,121,0,0,0,74,0,117,0,110,0,0,0,74,0,117,0,108,0,0,0,65,0,117,0,103,0,0,0,83,0,101,0,112,0,0,0,79,0,99,0,116,0,0,0,78,0,111,0,118,0,0,0, + 68,0,101,0,99,0,0,0,74,0,97,0,110,0,117,0,97,0,114,0,121,0,0,0,70,0,101,0,98,0,114,0,117,0,97,0,114,0,121,0,0,0,0,0,0,0,0,0,77,0,97,0,114,0,99,0,104,0,0,0,0,0,0,0,65,0,112,0,114,0,105,0,108,0,0,0,0,0,0,0,74,0,117,0,110,0,101,0,0,0,0,0,0,0,0, + 0,74,0,117,0,108,0,121,0,0,0,0,0,0,0,0,0,65,0,117,0,103,0,117,0,115,0,116,0,0,0,0,0,83,0,101,0,112,0,116,0,101,0,109,0,98,0,101,0,114,0,0,0,0,0,0,0,79,0,99,0,116,0,111,0,98,0,101,0,114,0,0,0,78,0,111,0,118,0,101,0,109,0,98,0,101,0,114,0,0,0, + 0,0,0,0,0,0,68,0,101,0,99,0,101,0,109,0,98,0,101,0,114,0,0,0,0,0,65,0,77,0,0,0,0,0,80,0,77,0,0,0,0,0,0,0,0,0,77,0,77,0,47,0,100,0,100,0,47,0,121,0,121,0,0,0,0,0,0,0,0,0,100,0,100,0,100,0,100,0,44,0,32,0,77,0,77,0,77,0,77,0,32,0,100,0,100,0,44, + 0,32,0,121,0,121,0,121,0,121,0,0,0,72,0,72,0,58,0,109,0,109,0,58,0,115,0,115,0,0,0,0,0,0,0,0,0,101,0,110,0,45,0,85,0,83,0,0,0,0,0,0,0,1,0,0,0,22,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,4,0,0,0,24,0,0,0,5,0,0,0,13,0,0,0,6,0,0,0,9,0,0,0,7,0,0,0, + 12,0,0,0,8,0,0,0,12,0,0,0,9,0,0,0,12,0,0,0,10,0,0,0,7,0,0,0,11,0,0,0,8,0,0,0,12,0,0,0,22,0,0,0,13,0,0,0,22,0,0,0,15,0,0,0,2,0,0,0,16,0,0,0,13,0,0,0,17,0,0,0,18,0,0,0,18,0,0,0,2,0,0,0,33,0,0,0,13,0,0,0,53,0,0,0,2,0,0,0,65,0,0,0,13,0,0,0,67,0, + 0,0,2,0,0,0,80,0,0,0,17,0,0,0,82,0,0,0,13,0,0,0,83,0,0,0,13,0,0,0,87,0,0,0,22,0,0,0,89,0,0,0,11,0,0,0,108,0,0,0,13,0,0,0,109,0,0,0,32,0,0,0,112,0,0,0,28,0,0,0,114,0,0,0,9,0,0,0,128,0,0,0,10,0,0,0,129,0,0,0,10,0,0,0,130,0,0,0,9,0,0,0,131,0,0, + 0,22,0,0,0,132,0,0,0,13,0,0,0,145,0,0,0,41,0,0,0,158,0,0,0,13,0,0,0,161,0,0,0,2,0,0,0,164,0,0,0,11,0,0,0,167,0,0,0,13,0,0,0,183,0,0,0,17,0,0,0,206,0,0,0,2,0,0,0,215,0,0,0,11,0,0,0,89,4,0,0,42,0,0,0,24,7,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,40,0,40,0,40,0,40,0,40,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,72,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16, + 0,16,0,16,0,16,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,129,0,129,0,129,0,129,0,129,0,129,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,16,0,16,0,16, + 0,16,0,16,0,16,0,130,0,130,0,130,0,130,0,130,0,130,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,16,0,16,0,16,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,129,130,131,132,133,134,135,136,137,138,139,140,141, + 142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202, + 203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0,1,2,3,4,5,6,7,8,9,10,11,12, + 13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, + 119,120,121,122,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149, + 150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210, + 211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204, + 205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15, + 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96, + 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163, + 164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224, + 225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,40,0,40,0,40,0,40,0,40,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32, + 0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,72,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,129,1,129,1,129,1,129, + 1,129,1,129,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,0,16,0,16,0,16,0,16,0,16,0,130,1,130,1,130,1,130,1,130,1,130,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,16, + 0,16,0,16,0,16,0,32,0,32,0,32,0,32,0,32,0,32,0,40,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,8,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,18,1,16,0, + 16,0,48,0,16,0,16,0,16,0,16,0,20,0,20,0,16,0,18,1,16,0,16,0,16,0,20,0,18,1,16,0,16,0,16,0,16,0,16,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1, + 2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,16,0,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,208,136,1,128,1,0,0,0,2,0,0,0,0,0,0,0,216,136,1,128,1,0,0,0,3,0,0,0,0,0,0,0,224, + 136,1,128,1,0,0,0,4,0,0,0,0,0,0,0,232,136,1,128,1,0,0,0,5,0,0,0,0,0,0,0,248,136,1,128,1,0,0,0,6,0,0,0,0,0,0,0,0,137,1,128,1,0,0,0,7,0,0,0,0,0,0,0,8,137,1,128,1,0,0,0,8,0,0,0,0,0,0,0,16,137,1,128,1,0,0,0,9,0,0,0,0,0,0,0,24,137,1,128,1,0,0,0,10, + 0,0,0,0,0,0,0,32,137,1,128,1,0,0,0,11,0,0,0,0,0,0,0,40,137,1,128,1,0,0,0,12,0,0,0,0,0,0,0,48,137,1,128,1,0,0,0,13,0,0,0,0,0,0,0,56,137,1,128,1,0,0,0,14,0,0,0,0,0,0,0,64,137,1,128,1,0,0,0,15,0,0,0,0,0,0,0,72,137,1,128,1,0,0,0,16,0,0,0,0,0,0,0, + 80,137,1,128,1,0,0,0,17,0,0,0,0,0,0,0,88,137,1,128,1,0,0,0,18,0,0,0,0,0,0,0,96,137,1,128,1,0,0,0,19,0,0,0,0,0,0,0,104,137,1,128,1,0,0,0,20,0,0,0,0,0,0,0,112,137,1,128,1,0,0,0,21,0,0,0,0,0,0,0,120,137,1,128,1,0,0,0,22,0,0,0,0,0,0,0,128,137,1, + 128,1,0,0,0,24,0,0,0,0,0,0,0,136,137,1,128,1,0,0,0,25,0,0,0,0,0,0,0,144,137,1,128,1,0,0,0,26,0,0,0,0,0,0,0,152,137,1,128,1,0,0,0,27,0,0,0,0,0,0,0,160,137,1,128,1,0,0,0,28,0,0,0,0,0,0,0,168,137,1,128,1,0,0,0,29,0,0,0,0,0,0,0,176,137,1,128,1,0, + 0,0,30,0,0,0,0,0,0,0,184,137,1,128,1,0,0,0,31,0,0,0,0,0,0,0,192,137,1,128,1,0,0,0,32,0,0,0,0,0,0,0,200,137,1,128,1,0,0,0,33,0,0,0,0,0,0,0,208,137,1,128,1,0,0,0,34,0,0,0,0,0,0,0,216,137,1,128,1,0,0,0,35,0,0,0,0,0,0,0,224,137,1,128,1,0,0,0,36, + 0,0,0,0,0,0,0,232,137,1,128,1,0,0,0,37,0,0,0,0,0,0,0,240,137,1,128,1,0,0,0,38,0,0,0,0,0,0,0,248,137,1,128,1,0,0,0,39,0,0,0,0,0,0,0,0,138,1,128,1,0,0,0,41,0,0,0,0,0,0,0,8,138,1,128,1,0,0,0,42,0,0,0,0,0,0,0,16,138,1,128,1,0,0,0,43,0,0,0,0,0,0, + 0,24,138,1,128,1,0,0,0,44,0,0,0,0,0,0,0,32,138,1,128,1,0,0,0,45,0,0,0,0,0,0,0,40,138,1,128,1,0,0,0,47,0,0,0,0,0,0,0,48,138,1,128,1,0,0,0,54,0,0,0,0,0,0,0,56,138,1,128,1,0,0,0,55,0,0,0,0,0,0,0,64,138,1,128,1,0,0,0,56,0,0,0,0,0,0,0,72,138,1,128, + 1,0,0,0,57,0,0,0,0,0,0,0,80,138,1,128,1,0,0,0,62,0,0,0,0,0,0,0,88,138,1,128,1,0,0,0,63,0,0,0,0,0,0,0,96,138,1,128,1,0,0,0,64,0,0,0,0,0,0,0,104,138,1,128,1,0,0,0,65,0,0,0,0,0,0,0,112,138,1,128,1,0,0,0,67,0,0,0,0,0,0,0,120,138,1,128,1,0,0,0,68, + 0,0,0,0,0,0,0,128,138,1,128,1,0,0,0,70,0,0,0,0,0,0,0,136,138,1,128,1,0,0,0,71,0,0,0,0,0,0,0,144,138,1,128,1,0,0,0,73,0,0,0,0,0,0,0,152,138,1,128,1,0,0,0,74,0,0,0,0,0,0,0,160,138,1,128,1,0,0,0,75,0,0,0,0,0,0,0,168,138,1,128,1,0,0,0,78,0,0,0,0, + 0,0,0,176,138,1,128,1,0,0,0,79,0,0,0,0,0,0,0,184,138,1,128,1,0,0,0,80,0,0,0,0,0,0,0,192,138,1,128,1,0,0,0,86,0,0,0,0,0,0,0,200,138,1,128,1,0,0,0,87,0,0,0,0,0,0,0,208,138,1,128,1,0,0,0,90,0,0,0,0,0,0,0,216,138,1,128,1,0,0,0,101,0,0,0,0,0,0,0, + 224,138,1,128,1,0,0,0,127,0,0,0,0,0,0,0,232,138,1,128,1,0,0,0,1,4,0,0,0,0,0,0,240,138,1,128,1,0,0,0,2,4,0,0,0,0,0,0,0,139,1,128,1,0,0,0,3,4,0,0,0,0,0,0,16,139,1,128,1,0,0,0,4,4,0,0,0,0,0,0,120,106,1,128,1,0,0,0,5,4,0,0,0,0,0,0,32,139,1,128,1, + 0,0,0,6,4,0,0,0,0,0,0,48,139,1,128,1,0,0,0,7,4,0,0,0,0,0,0,64,139,1,128,1,0,0,0,8,4,0,0,0,0,0,0,80,139,1,128,1,0,0,0,9,4,0,0,0,0,0,0,0,113,1,128,1,0,0,0,11,4,0,0,0,0,0,0,96,139,1,128,1,0,0,0,12,4,0,0,0,0,0,0,112,139,1,128,1,0,0,0,13,4,0,0,0, + 0,0,0,128,139,1,128,1,0,0,0,14,4,0,0,0,0,0,0,144,139,1,128,1,0,0,0,15,4,0,0,0,0,0,0,160,139,1,128,1,0,0,0,16,4,0,0,0,0,0,0,176,139,1,128,1,0,0,0,17,4,0,0,0,0,0,0,72,106,1,128,1,0,0,0,18,4,0,0,0,0,0,0,104,106,1,128,1,0,0,0,19,4,0,0,0,0,0,0,192, + 139,1,128,1,0,0,0,20,4,0,0,0,0,0,0,208,139,1,128,1,0,0,0,21,4,0,0,0,0,0,0,224,139,1,128,1,0,0,0,22,4,0,0,0,0,0,0,240,139,1,128,1,0,0,0,24,4,0,0,0,0,0,0,0,140,1,128,1,0,0,0,25,4,0,0,0,0,0,0,16,140,1,128,1,0,0,0,26,4,0,0,0,0,0,0,32,140,1,128,1, + 0,0,0,27,4,0,0,0,0,0,0,48,140,1,128,1,0,0,0,28,4,0,0,0,0,0,0,64,140,1,128,1,0,0,0,29,4,0,0,0,0,0,0,80,140,1,128,1,0,0,0,30,4,0,0,0,0,0,0,96,140,1,128,1,0,0,0,31,4,0,0,0,0,0,0,112,140,1,128,1,0,0,0,32,4,0,0,0,0,0,0,128,140,1,128,1,0,0,0,33,4, + 0,0,0,0,0,0,144,140,1,128,1,0,0,0,34,4,0,0,0,0,0,0,160,140,1,128,1,0,0,0,35,4,0,0,0,0,0,0,176,140,1,128,1,0,0,0,36,4,0,0,0,0,0,0,192,140,1,128,1,0,0,0,37,4,0,0,0,0,0,0,208,140,1,128,1,0,0,0,38,4,0,0,0,0,0,0,224,140,1,128,1,0,0,0,39,4,0,0,0,0, + 0,0,240,140,1,128,1,0,0,0,41,4,0,0,0,0,0,0,0,141,1,128,1,0,0,0,42,4,0,0,0,0,0,0,16,141,1,128,1,0,0,0,43,4,0,0,0,0,0,0,32,141,1,128,1,0,0,0,44,4,0,0,0,0,0,0,48,141,1,128,1,0,0,0,45,4,0,0,0,0,0,0,72,141,1,128,1,0,0,0,47,4,0,0,0,0,0,0,88,141,1, + 128,1,0,0,0,50,4,0,0,0,0,0,0,104,141,1,128,1,0,0,0,52,4,0,0,0,0,0,0,120,141,1,128,1,0,0,0,53,4,0,0,0,0,0,0,136,141,1,128,1,0,0,0,54,4,0,0,0,0,0,0,152,141,1,128,1,0,0,0,55,4,0,0,0,0,0,0,168,141,1,128,1,0,0,0,56,4,0,0,0,0,0,0,184,141,1,128,1,0, + 0,0,57,4,0,0,0,0,0,0,200,141,1,128,1,0,0,0,58,4,0,0,0,0,0,0,216,141,1,128,1,0,0,0,59,4,0,0,0,0,0,0,232,141,1,128,1,0,0,0,62,4,0,0,0,0,0,0,248,141,1,128,1,0,0,0,63,4,0,0,0,0,0,0,8,142,1,128,1,0,0,0,64,4,0,0,0,0,0,0,24,142,1,128,1,0,0,0,65,4,0, + 0,0,0,0,0,40,142,1,128,1,0,0,0,67,4,0,0,0,0,0,0,56,142,1,128,1,0,0,0,68,4,0,0,0,0,0,0,80,142,1,128,1,0,0,0,69,4,0,0,0,0,0,0,96,142,1,128,1,0,0,0,70,4,0,0,0,0,0,0,112,142,1,128,1,0,0,0,71,4,0,0,0,0,0,0,128,142,1,128,1,0,0,0,73,4,0,0,0,0,0,0,144, + 142,1,128,1,0,0,0,74,4,0,0,0,0,0,0,160,142,1,128,1,0,0,0,75,4,0,0,0,0,0,0,176,142,1,128,1,0,0,0,76,4,0,0,0,0,0,0,192,142,1,128,1,0,0,0,78,4,0,0,0,0,0,0,208,142,1,128,1,0,0,0,79,4,0,0,0,0,0,0,224,142,1,128,1,0,0,0,80,4,0,0,0,0,0,0,240,142,1,128, + 1,0,0,0,82,4,0,0,0,0,0,0,0,143,1,128,1,0,0,0,86,4,0,0,0,0,0,0,16,143,1,128,1,0,0,0,87,4,0,0,0,0,0,0,32,143,1,128,1,0,0,0,90,4,0,0,0,0,0,0,48,143,1,128,1,0,0,0,101,4,0,0,0,0,0,0,64,143,1,128,1,0,0,0,107,4,0,0,0,0,0,0,80,143,1,128,1,0,0,0,108, + 4,0,0,0,0,0,0,96,143,1,128,1,0,0,0,129,4,0,0,0,0,0,0,112,143,1,128,1,0,0,0,1,8,0,0,0,0,0,0,128,143,1,128,1,0,0,0,4,8,0,0,0,0,0,0,88,106,1,128,1,0,0,0,7,8,0,0,0,0,0,0,144,143,1,128,1,0,0,0,9,8,0,0,0,0,0,0,160,143,1,128,1,0,0,0,10,8,0,0,0,0,0, + 0,176,143,1,128,1,0,0,0,12,8,0,0,0,0,0,0,192,143,1,128,1,0,0,0,16,8,0,0,0,0,0,0,208,143,1,128,1,0,0,0,19,8,0,0,0,0,0,0,224,143,1,128,1,0,0,0,20,8,0,0,0,0,0,0,240,143,1,128,1,0,0,0,22,8,0,0,0,0,0,0,0,144,1,128,1,0,0,0,26,8,0,0,0,0,0,0,16,144, + 1,128,1,0,0,0,29,8,0,0,0,0,0,0,40,144,1,128,1,0,0,0,44,8,0,0,0,0,0,0,56,144,1,128,1,0,0,0,59,8,0,0,0,0,0,0,80,144,1,128,1,0,0,0,62,8,0,0,0,0,0,0,96,144,1,128,1,0,0,0,67,8,0,0,0,0,0,0,112,144,1,128,1,0,0,0,107,8,0,0,0,0,0,0,136,144,1,128,1,0, + 0,0,1,12,0,0,0,0,0,0,152,144,1,128,1,0,0,0,4,12,0,0,0,0,0,0,168,144,1,128,1,0,0,0,7,12,0,0,0,0,0,0,184,144,1,128,1,0,0,0,9,12,0,0,0,0,0,0,200,144,1,128,1,0,0,0,10,12,0,0,0,0,0,0,216,144,1,128,1,0,0,0,12,12,0,0,0,0,0,0,232,144,1,128,1,0,0,0,26, + 12,0,0,0,0,0,0,248,144,1,128,1,0,0,0,59,12,0,0,0,0,0,0,16,145,1,128,1,0,0,0,107,12,0,0,0,0,0,0,32,145,1,128,1,0,0,0,1,16,0,0,0,0,0,0,48,145,1,128,1,0,0,0,4,16,0,0,0,0,0,0,64,145,1,128,1,0,0,0,7,16,0,0,0,0,0,0,80,145,1,128,1,0,0,0,9,16,0,0,0, + 0,0,0,96,145,1,128,1,0,0,0,10,16,0,0,0,0,0,0,112,145,1,128,1,0,0,0,12,16,0,0,0,0,0,0,128,145,1,128,1,0,0,0,26,16,0,0,0,0,0,0,144,145,1,128,1,0,0,0,59,16,0,0,0,0,0,0,160,145,1,128,1,0,0,0,1,20,0,0,0,0,0,0,176,145,1,128,1,0,0,0,4,20,0,0,0,0,0, + 0,192,145,1,128,1,0,0,0,7,20,0,0,0,0,0,0,208,145,1,128,1,0,0,0,9,20,0,0,0,0,0,0,224,145,1,128,1,0,0,0,10,20,0,0,0,0,0,0,240,145,1,128,1,0,0,0,12,20,0,0,0,0,0,0,0,146,1,128,1,0,0,0,26,20,0,0,0,0,0,0,16,146,1,128,1,0,0,0,59,20,0,0,0,0,0,0,40,146, + 1,128,1,0,0,0,1,24,0,0,0,0,0,0,56,146,1,128,1,0,0,0,9,24,0,0,0,0,0,0,72,146,1,128,1,0,0,0,10,24,0,0,0,0,0,0,88,146,1,128,1,0,0,0,12,24,0,0,0,0,0,0,104,146,1,128,1,0,0,0,26,24,0,0,0,0,0,0,120,146,1,128,1,0,0,0,59,24,0,0,0,0,0,0,144,146,1,128, + 1,0,0,0,1,28,0,0,0,0,0,0,160,146,1,128,1,0,0,0,9,28,0,0,0,0,0,0,176,146,1,128,1,0,0,0,10,28,0,0,0,0,0,0,192,146,1,128,1,0,0,0,26,28,0,0,0,0,0,0,208,146,1,128,1,0,0,0,59,28,0,0,0,0,0,0,232,146,1,128,1,0,0,0,1,32,0,0,0,0,0,0,248,146,1,128,1,0, + 0,0,9,32,0,0,0,0,0,0,8,147,1,128,1,0,0,0,10,32,0,0,0,0,0,0,24,147,1,128,1,0,0,0,59,32,0,0,0,0,0,0,40,147,1,128,1,0,0,0,1,36,0,0,0,0,0,0,56,147,1,128,1,0,0,0,9,36,0,0,0,0,0,0,72,147,1,128,1,0,0,0,10,36,0,0,0,0,0,0,88,147,1,128,1,0,0,0,59,36,0, + 0,0,0,0,0,104,147,1,128,1,0,0,0,1,40,0,0,0,0,0,0,120,147,1,128,1,0,0,0,9,40,0,0,0,0,0,0,136,147,1,128,1,0,0,0,10,40,0,0,0,0,0,0,152,147,1,128,1,0,0,0,1,44,0,0,0,0,0,0,168,147,1,128,1,0,0,0,9,44,0,0,0,0,0,0,184,147,1,128,1,0,0,0,10,44,0,0,0,0, + 0,0,200,147,1,128,1,0,0,0,1,48,0,0,0,0,0,0,216,147,1,128,1,0,0,0,9,48,0,0,0,0,0,0,232,147,1,128,1,0,0,0,10,48,0,0,0,0,0,0,248,147,1,128,1,0,0,0,1,52,0,0,0,0,0,0,8,148,1,128,1,0,0,0,9,52,0,0,0,0,0,0,24,148,1,128,1,0,0,0,10,52,0,0,0,0,0,0,40,148, + 1,128,1,0,0,0,1,56,0,0,0,0,0,0,56,148,1,128,1,0,0,0,10,56,0,0,0,0,0,0,72,148,1,128,1,0,0,0,1,60,0,0,0,0,0,0,88,148,1,128,1,0,0,0,10,60,0,0,0,0,0,0,104,148,1,128,1,0,0,0,1,64,0,0,0,0,0,0,120,148,1,128,1,0,0,0,10,64,0,0,0,0,0,0,136,148,1,128,1, + 0,0,0,10,68,0,0,0,0,0,0,152,148,1,128,1,0,0,0,10,72,0,0,0,0,0,0,168,148,1,128,1,0,0,0,10,76,0,0,0,0,0,0,184,148,1,128,1,0,0,0,10,80,0,0,0,0,0,0,200,148,1,128,1,0,0,0,4,124,0,0,0,0,0,0,216,148,1,128,1,0,0,0,26,124,0,0,0,0,0,0,232,148,1,128,1, + 0,0,0,97,0,114,0,0,0,0,0,98,0,103,0,0,0,0,0,99,0,97,0,0,0,0,0,122,0,104,0,45,0,67,0,72,0,83,0,0,0,0,0,99,0,115,0,0,0,0,0,100,0,97,0,0,0,0,0,100,0,101,0,0,0,0,0,101,0,108,0,0,0,0,0,101,0,110,0,0,0,0,0,101,0,115,0,0,0,0,0,102,0,105,0,0,0,0,0,102, + 0,114,0,0,0,0,0,104,0,101,0,0,0,0,0,104,0,117,0,0,0,0,0,105,0,115,0,0,0,0,0,105,0,116,0,0,0,0,0,106,0,97,0,0,0,0,0,107,0,111,0,0,0,0,0,110,0,108,0,0,0,0,0,110,0,111,0,0,0,0,0,112,0,108,0,0,0,0,0,112,0,116,0,0,0,0,0,114,0,111,0,0,0,0,0,114,0, + 117,0,0,0,0,0,104,0,114,0,0,0,0,0,115,0,107,0,0,0,0,0,115,0,113,0,0,0,0,0,115,0,118,0,0,0,0,0,116,0,104,0,0,0,0,0,116,0,114,0,0,0,0,0,117,0,114,0,0,0,0,0,105,0,100,0,0,0,0,0,117,0,107,0,0,0,0,0,98,0,101,0,0,0,0,0,115,0,108,0,0,0,0,0,101,0,116, + 0,0,0,0,0,108,0,118,0,0,0,0,0,108,0,116,0,0,0,0,0,102,0,97,0,0,0,0,0,118,0,105,0,0,0,0,0,104,0,121,0,0,0,0,0,97,0,122,0,0,0,0,0,101,0,117,0,0,0,0,0,109,0,107,0,0,0,0,0,97,0,102,0,0,0,0,0,107,0,97,0,0,0,0,0,102,0,111,0,0,0,0,0,104,0,105,0,0,0, + 0,0,109,0,115,0,0,0,0,0,107,0,107,0,0,0,0,0,107,0,121,0,0,0,0,0,115,0,119,0,0,0,0,0,117,0,122,0,0,0,0,0,116,0,116,0,0,0,0,0,112,0,97,0,0,0,0,0,103,0,117,0,0,0,0,0,116,0,97,0,0,0,0,0,116,0,101,0,0,0,0,0,107,0,110,0,0,0,0,0,109,0,114,0,0,0,0,0, + 115,0,97,0,0,0,0,0,109,0,110,0,0,0,0,0,103,0,108,0,0,0,0,0,107,0,111,0,107,0,0,0,115,0,121,0,114,0,0,0,100,0,105,0,118,0,0,0,0,0,0,0,0,0,0,0,97,0,114,0,45,0,83,0,65,0,0,0,0,0,0,0,98,0,103,0,45,0,66,0,71,0,0,0,0,0,0,0,99,0,97,0,45,0,69,0,83,0, + 0,0,0,0,0,0,99,0,115,0,45,0,67,0,90,0,0,0,0,0,0,0,100,0,97,0,45,0,68,0,75,0,0,0,0,0,0,0,100,0,101,0,45,0,68,0,69,0,0,0,0,0,0,0,101,0,108,0,45,0,71,0,82,0,0,0,0,0,0,0,102,0,105,0,45,0,70,0,73,0,0,0,0,0,0,0,102,0,114,0,45,0,70,0,82,0,0,0,0,0,0, + 0,104,0,101,0,45,0,73,0,76,0,0,0,0,0,0,0,104,0,117,0,45,0,72,0,85,0,0,0,0,0,0,0,105,0,115,0,45,0,73,0,83,0,0,0,0,0,0,0,105,0,116,0,45,0,73,0,84,0,0,0,0,0,0,0,110,0,108,0,45,0,78,0,76,0,0,0,0,0,0,0,110,0,98,0,45,0,78,0,79,0,0,0,0,0,0,0,112,0, + 108,0,45,0,80,0,76,0,0,0,0,0,0,0,112,0,116,0,45,0,66,0,82,0,0,0,0,0,0,0,114,0,111,0,45,0,82,0,79,0,0,0,0,0,0,0,114,0,117,0,45,0,82,0,85,0,0,0,0,0,0,0,104,0,114,0,45,0,72,0,82,0,0,0,0,0,0,0,115,0,107,0,45,0,83,0,75,0,0,0,0,0,0,0,115,0,113,0,45, + 0,65,0,76,0,0,0,0,0,0,0,115,0,118,0,45,0,83,0,69,0,0,0,0,0,0,0,116,0,104,0,45,0,84,0,72,0,0,0,0,0,0,0,116,0,114,0,45,0,84,0,82,0,0,0,0,0,0,0,117,0,114,0,45,0,80,0,75,0,0,0,0,0,0,0,105,0,100,0,45,0,73,0,68,0,0,0,0,0,0,0,117,0,107,0,45,0,85,0, + 65,0,0,0,0,0,0,0,98,0,101,0,45,0,66,0,89,0,0,0,0,0,0,0,115,0,108,0,45,0,83,0,73,0,0,0,0,0,0,0,101,0,116,0,45,0,69,0,69,0,0,0,0,0,0,0,108,0,118,0,45,0,76,0,86,0,0,0,0,0,0,0,108,0,116,0,45,0,76,0,84,0,0,0,0,0,0,0,102,0,97,0,45,0,73,0,82,0,0,0, + 0,0,0,0,118,0,105,0,45,0,86,0,78,0,0,0,0,0,0,0,104,0,121,0,45,0,65,0,77,0,0,0,0,0,0,0,97,0,122,0,45,0,65,0,90,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,101,0,117,0,45,0,69,0,83,0,0,0,0,0,0,0,109,0,107,0,45,0,77,0,75,0,0,0,0,0,0,0,116,0,110,0,45,0, + 90,0,65,0,0,0,0,0,0,0,120,0,104,0,45,0,90,0,65,0,0,0,0,0,0,0,122,0,117,0,45,0,90,0,65,0,0,0,0,0,0,0,97,0,102,0,45,0,90,0,65,0,0,0,0,0,0,0,107,0,97,0,45,0,71,0,69,0,0,0,0,0,0,0,102,0,111,0,45,0,70,0,79,0,0,0,0,0,0,0,104,0,105,0,45,0,73,0,78,0, + 0,0,0,0,0,0,109,0,116,0,45,0,77,0,84,0,0,0,0,0,0,0,115,0,101,0,45,0,78,0,79,0,0,0,0,0,0,0,109,0,115,0,45,0,77,0,89,0,0,0,0,0,0,0,107,0,107,0,45,0,75,0,90,0,0,0,0,0,0,0,107,0,121,0,45,0,75,0,71,0,0,0,0,0,0,0,115,0,119,0,45,0,75,0,69,0,0,0,0,0, + 0,0,117,0,122,0,45,0,85,0,90,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,116,0,116,0,45,0,82,0,85,0,0,0,0,0,0,0,98,0,110,0,45,0,73,0,78,0,0,0,0,0,0,0,112,0,97,0,45,0,73,0,78,0,0,0,0,0,0,0,103,0,117,0,45,0,73,0,78,0,0,0,0,0,0,0,116,0,97,0,45,0,73,0, + 78,0,0,0,0,0,0,0,116,0,101,0,45,0,73,0,78,0,0,0,0,0,0,0,107,0,110,0,45,0,73,0,78,0,0,0,0,0,0,0,109,0,108,0,45,0,73,0,78,0,0,0,0,0,0,0,109,0,114,0,45,0,73,0,78,0,0,0,0,0,0,0,115,0,97,0,45,0,73,0,78,0,0,0,0,0,0,0,109,0,110,0,45,0,77,0,78,0,0,0, + 0,0,0,0,99,0,121,0,45,0,71,0,66,0,0,0,0,0,0,0,103,0,108,0,45,0,69,0,83,0,0,0,0,0,0,0,107,0,111,0,107,0,45,0,73,0,78,0,0,0,0,0,115,0,121,0,114,0,45,0,83,0,89,0,0,0,0,0,100,0,105,0,118,0,45,0,77,0,86,0,0,0,0,0,113,0,117,0,122,0,45,0,66,0,79,0, + 0,0,0,0,110,0,115,0,45,0,90,0,65,0,0,0,0,0,0,0,109,0,105,0,45,0,78,0,90,0,0,0,0,0,0,0,97,0,114,0,45,0,73,0,81,0,0,0,0,0,0,0,100,0,101,0,45,0,67,0,72,0,0,0,0,0,0,0,101,0,110,0,45,0,71,0,66,0,0,0,0,0,0,0,101,0,115,0,45,0,77,0,88,0,0,0,0,0,0,0, + 102,0,114,0,45,0,66,0,69,0,0,0,0,0,0,0,105,0,116,0,45,0,67,0,72,0,0,0,0,0,0,0,110,0,108,0,45,0,66,0,69,0,0,0,0,0,0,0,110,0,110,0,45,0,78,0,79,0,0,0,0,0,0,0,112,0,116,0,45,0,80,0,84,0,0,0,0,0,0,0,115,0,114,0,45,0,83,0,80,0,45,0,76,0,97,0,116, + 0,110,0,0,0,0,0,115,0,118,0,45,0,70,0,73,0,0,0,0,0,0,0,97,0,122,0,45,0,65,0,90,0,45,0,67,0,121,0,114,0,108,0,0,0,0,0,115,0,101,0,45,0,83,0,69,0,0,0,0,0,0,0,109,0,115,0,45,0,66,0,78,0,0,0,0,0,0,0,117,0,122,0,45,0,85,0,90,0,45,0,67,0,121,0,114, + 0,108,0,0,0,0,0,113,0,117,0,122,0,45,0,69,0,67,0,0,0,0,0,97,0,114,0,45,0,69,0,71,0,0,0,0,0,0,0,122,0,104,0,45,0,72,0,75,0,0,0,0,0,0,0,100,0,101,0,45,0,65,0,84,0,0,0,0,0,0,0,101,0,110,0,45,0,65,0,85,0,0,0,0,0,0,0,101,0,115,0,45,0,69,0,83,0,0, + 0,0,0,0,0,102,0,114,0,45,0,67,0,65,0,0,0,0,0,0,0,115,0,114,0,45,0,83,0,80,0,45,0,67,0,121,0,114,0,108,0,0,0,0,0,115,0,101,0,45,0,70,0,73,0,0,0,0,0,0,0,113,0,117,0,122,0,45,0,80,0,69,0,0,0,0,0,97,0,114,0,45,0,76,0,89,0,0,0,0,0,0,0,122,0,104,0, + 45,0,83,0,71,0,0,0,0,0,0,0,100,0,101,0,45,0,76,0,85,0,0,0,0,0,0,0,101,0,110,0,45,0,67,0,65,0,0,0,0,0,0,0,101,0,115,0,45,0,71,0,84,0,0,0,0,0,0,0,102,0,114,0,45,0,67,0,72,0,0,0,0,0,0,0,104,0,114,0,45,0,66,0,65,0,0,0,0,0,0,0,115,0,109,0,106,0,45, + 0,78,0,79,0,0,0,0,0,97,0,114,0,45,0,68,0,90,0,0,0,0,0,0,0,122,0,104,0,45,0,77,0,79,0,0,0,0,0,0,0,100,0,101,0,45,0,76,0,73,0,0,0,0,0,0,0,101,0,110,0,45,0,78,0,90,0,0,0,0,0,0,0,101,0,115,0,45,0,67,0,82,0,0,0,0,0,0,0,102,0,114,0,45,0,76,0,85,0, + 0,0,0,0,0,0,98,0,115,0,45,0,66,0,65,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,115,0,109,0,106,0,45,0,83,0,69,0,0,0,0,0,97,0,114,0,45,0,77,0,65,0,0,0,0,0,0,0,101,0,110,0,45,0,73,0,69,0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,65,0,0,0,0,0,0,0,102,0,114,0, + 45,0,77,0,67,0,0,0,0,0,0,0,115,0,114,0,45,0,66,0,65,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,115,0,109,0,97,0,45,0,78,0,79,0,0,0,0,0,97,0,114,0,45,0,84,0,78,0,0,0,0,0,0,0,101,0,110,0,45,0,90,0,65,0,0,0,0,0,0,0,101,0,115,0,45,0,68,0,79,0,0,0,0,0, + 0,0,115,0,114,0,45,0,66,0,65,0,45,0,67,0,121,0,114,0,108,0,0,0,0,0,115,0,109,0,97,0,45,0,83,0,69,0,0,0,0,0,97,0,114,0,45,0,79,0,77,0,0,0,0,0,0,0,101,0,110,0,45,0,74,0,77,0,0,0,0,0,0,0,101,0,115,0,45,0,86,0,69,0,0,0,0,0,0,0,115,0,109,0,115,0, + 45,0,70,0,73,0,0,0,0,0,97,0,114,0,45,0,89,0,69,0,0,0,0,0,0,0,101,0,110,0,45,0,67,0,66,0,0,0,0,0,0,0,101,0,115,0,45,0,67,0,79,0,0,0,0,0,0,0,115,0,109,0,110,0,45,0,70,0,73,0,0,0,0,0,97,0,114,0,45,0,83,0,89,0,0,0,0,0,0,0,101,0,110,0,45,0,66,0,90, + 0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,69,0,0,0,0,0,0,0,97,0,114,0,45,0,74,0,79,0,0,0,0,0,0,0,101,0,110,0,45,0,84,0,84,0,0,0,0,0,0,0,101,0,115,0,45,0,65,0,82,0,0,0,0,0,0,0,97,0,114,0,45,0,76,0,66,0,0,0,0,0,0,0,101,0,110,0,45,0,90,0,87,0,0,0,0,0, + 0,0,101,0,115,0,45,0,69,0,67,0,0,0,0,0,0,0,97,0,114,0,45,0,75,0,87,0,0,0,0,0,0,0,101,0,110,0,45,0,80,0,72,0,0,0,0,0,0,0,101,0,115,0,45,0,67,0,76,0,0,0,0,0,0,0,97,0,114,0,45,0,65,0,69,0,0,0,0,0,0,0,101,0,115,0,45,0,85,0,89,0,0,0,0,0,0,0,97,0, + 114,0,45,0,66,0,72,0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,89,0,0,0,0,0,0,0,97,0,114,0,45,0,81,0,65,0,0,0,0,0,0,0,101,0,115,0,45,0,66,0,79,0,0,0,0,0,0,0,101,0,115,0,45,0,83,0,86,0,0,0,0,0,0,0,101,0,115,0,45,0,72,0,78,0,0,0,0,0,0,0,101,0,115,0,45, + 0,78,0,73,0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,82,0,0,0,0,0,0,0,122,0,104,0,45,0,67,0,72,0,84,0,0,0,0,0,115,0,114,0,0,0,0,0,232,138,1,128,1,0,0,0,66,0,0,0,0,0,0,0,56,138,1,128,1,0,0,0,44,0,0,0,0,0,0,0,48,163,1,128,1,0,0,0,113,0,0,0,0,0,0,0,208, + 136,1,128,1,0,0,0,0,0,0,0,0,0,0,0,64,163,1,128,1,0,0,0,216,0,0,0,0,0,0,0,80,163,1,128,1,0,0,0,218,0,0,0,0,0,0,0,96,163,1,128,1,0,0,0,177,0,0,0,0,0,0,0,112,163,1,128,1,0,0,0,160,0,0,0,0,0,0,0,128,163,1,128,1,0,0,0,143,0,0,0,0,0,0,0,144,163,1, + 128,1,0,0,0,207,0,0,0,0,0,0,0,160,163,1,128,1,0,0,0,213,0,0,0,0,0,0,0,176,163,1,128,1,0,0,0,210,0,0,0,0,0,0,0,192,163,1,128,1,0,0,0,169,0,0,0,0,0,0,0,208,163,1,128,1,0,0,0,185,0,0,0,0,0,0,0,224,163,1,128,1,0,0,0,196,0,0,0,0,0,0,0,240,163,1,128, + 1,0,0,0,220,0,0,0,0,0,0,0,0,164,1,128,1,0,0,0,67,0,0,0,0,0,0,0,16,164,1,128,1,0,0,0,204,0,0,0,0,0,0,0,32,164,1,128,1,0,0,0,191,0,0,0,0,0,0,0,48,164,1,128,1,0,0,0,200,0,0,0,0,0,0,0,32,138,1,128,1,0,0,0,41,0,0,0,0,0,0,0,64,164,1,128,1,0,0,0,155, + 0,0,0,0,0,0,0,88,164,1,128,1,0,0,0,107,0,0,0,0,0,0,0,224,137,1,128,1,0,0,0,33,0,0,0,0,0,0,0,112,164,1,128,1,0,0,0,99,0,0,0,0,0,0,0,216,136,1,128,1,0,0,0,1,0,0,0,0,0,0,0,128,164,1,128,1,0,0,0,68,0,0,0,0,0,0,0,144,164,1,128,1,0,0,0,125,0,0,0,0, + 0,0,0,160,164,1,128,1,0,0,0,183,0,0,0,0,0,0,0,224,136,1,128,1,0,0,0,2,0,0,0,0,0,0,0,184,164,1,128,1,0,0,0,69,0,0,0,0,0,0,0,248,136,1,128,1,0,0,0,4,0,0,0,0,0,0,0,200,164,1,128,1,0,0,0,71,0,0,0,0,0,0,0,216,164,1,128,1,0,0,0,135,0,0,0,0,0,0,0,0, + 137,1,128,1,0,0,0,5,0,0,0,0,0,0,0,232,164,1,128,1,0,0,0,72,0,0,0,0,0,0,0,8,137,1,128,1,0,0,0,6,0,0,0,0,0,0,0,248,164,1,128,1,0,0,0,162,0,0,0,0,0,0,0,8,165,1,128,1,0,0,0,145,0,0,0,0,0,0,0,24,165,1,128,1,0,0,0,73,0,0,0,0,0,0,0,40,165,1,128,1,0, + 0,0,179,0,0,0,0,0,0,0,56,165,1,128,1,0,0,0,171,0,0,0,0,0,0,0,224,138,1,128,1,0,0,0,65,0,0,0,0,0,0,0,72,165,1,128,1,0,0,0,139,0,0,0,0,0,0,0,16,137,1,128,1,0,0,0,7,0,0,0,0,0,0,0,88,165,1,128,1,0,0,0,74,0,0,0,0,0,0,0,24,137,1,128,1,0,0,0,8,0,0, + 0,0,0,0,0,104,165,1,128,1,0,0,0,163,0,0,0,0,0,0,0,120,165,1,128,1,0,0,0,205,0,0,0,0,0,0,0,136,165,1,128,1,0,0,0,172,0,0,0,0,0,0,0,152,165,1,128,1,0,0,0,201,0,0,0,0,0,0,0,168,165,1,128,1,0,0,0,146,0,0,0,0,0,0,0,184,165,1,128,1,0,0,0,186,0,0,0, + 0,0,0,0,200,165,1,128,1,0,0,0,197,0,0,0,0,0,0,0,216,165,1,128,1,0,0,0,180,0,0,0,0,0,0,0,232,165,1,128,1,0,0,0,214,0,0,0,0,0,0,0,248,165,1,128,1,0,0,0,208,0,0,0,0,0,0,0,8,166,1,128,1,0,0,0,75,0,0,0,0,0,0,0,24,166,1,128,1,0,0,0,192,0,0,0,0,0,0, + 0,40,166,1,128,1,0,0,0,211,0,0,0,0,0,0,0,32,137,1,128,1,0,0,0,9,0,0,0,0,0,0,0,56,166,1,128,1,0,0,0,209,0,0,0,0,0,0,0,72,166,1,128,1,0,0,0,221,0,0,0,0,0,0,0,88,166,1,128,1,0,0,0,215,0,0,0,0,0,0,0,104,166,1,128,1,0,0,0,202,0,0,0,0,0,0,0,120,166, + 1,128,1,0,0,0,181,0,0,0,0,0,0,0,136,166,1,128,1,0,0,0,193,0,0,0,0,0,0,0,152,166,1,128,1,0,0,0,212,0,0,0,0,0,0,0,168,166,1,128,1,0,0,0,164,0,0,0,0,0,0,0,184,166,1,128,1,0,0,0,173,0,0,0,0,0,0,0,200,166,1,128,1,0,0,0,223,0,0,0,0,0,0,0,216,166,1, + 128,1,0,0,0,147,0,0,0,0,0,0,0,232,166,1,128,1,0,0,0,224,0,0,0,0,0,0,0,248,166,1,128,1,0,0,0,187,0,0,0,0,0,0,0,8,167,1,128,1,0,0,0,206,0,0,0,0,0,0,0,24,167,1,128,1,0,0,0,225,0,0,0,0,0,0,0,40,167,1,128,1,0,0,0,219,0,0,0,0,0,0,0,56,167,1,128,1, + 0,0,0,222,0,0,0,0,0,0,0,72,167,1,128,1,0,0,0,217,0,0,0,0,0,0,0,88,167,1,128,1,0,0,0,198,0,0,0,0,0,0,0,240,137,1,128,1,0,0,0,35,0,0,0,0,0,0,0,104,167,1,128,1,0,0,0,101,0,0,0,0,0,0,0,40,138,1,128,1,0,0,0,42,0,0,0,0,0,0,0,120,167,1,128,1,0,0,0, + 108,0,0,0,0,0,0,0,8,138,1,128,1,0,0,0,38,0,0,0,0,0,0,0,136,167,1,128,1,0,0,0,104,0,0,0,0,0,0,0,40,137,1,128,1,0,0,0,10,0,0,0,0,0,0,0,152,167,1,128,1,0,0,0,76,0,0,0,0,0,0,0,72,138,1,128,1,0,0,0,46,0,0,0,0,0,0,0,168,167,1,128,1,0,0,0,115,0,0,0, + 0,0,0,0,48,137,1,128,1,0,0,0,11,0,0,0,0,0,0,0,184,167,1,128,1,0,0,0,148,0,0,0,0,0,0,0,200,167,1,128,1,0,0,0,165,0,0,0,0,0,0,0,216,167,1,128,1,0,0,0,174,0,0,0,0,0,0,0,232,167,1,128,1,0,0,0,77,0,0,0,0,0,0,0,248,167,1,128,1,0,0,0,182,0,0,0,0,0, + 0,0,8,168,1,128,1,0,0,0,188,0,0,0,0,0,0,0,200,138,1,128,1,0,0,0,62,0,0,0,0,0,0,0,24,168,1,128,1,0,0,0,136,0,0,0,0,0,0,0,144,138,1,128,1,0,0,0,55,0,0,0,0,0,0,0,40,168,1,128,1,0,0,0,127,0,0,0,0,0,0,0,56,137,1,128,1,0,0,0,12,0,0,0,0,0,0,0,56,168, + 1,128,1,0,0,0,78,0,0,0,0,0,0,0,80,138,1,128,1,0,0,0,47,0,0,0,0,0,0,0,72,168,1,128,1,0,0,0,116,0,0,0,0,0,0,0,152,137,1,128,1,0,0,0,24,0,0,0,0,0,0,0,88,168,1,128,1,0,0,0,175,0,0,0,0,0,0,0,104,168,1,128,1,0,0,0,90,0,0,0,0,0,0,0,64,137,1,128,1,0, + 0,0,13,0,0,0,0,0,0,0,120,168,1,128,1,0,0,0,79,0,0,0,0,0,0,0,24,138,1,128,1,0,0,0,40,0,0,0,0,0,0,0,136,168,1,128,1,0,0,0,106,0,0,0,0,0,0,0,208,137,1,128,1,0,0,0,31,0,0,0,0,0,0,0,152,168,1,128,1,0,0,0,97,0,0,0,0,0,0,0,72,137,1,128,1,0,0,0,14,0, + 0,0,0,0,0,0,168,168,1,128,1,0,0,0,80,0,0,0,0,0,0,0,80,137,1,128,1,0,0,0,15,0,0,0,0,0,0,0,184,168,1,128,1,0,0,0,149,0,0,0,0,0,0,0,200,168,1,128,1,0,0,0,81,0,0,0,0,0,0,0,88,137,1,128,1,0,0,0,16,0,0,0,0,0,0,0,216,168,1,128,1,0,0,0,82,0,0,0,0,0, + 0,0,64,138,1,128,1,0,0,0,45,0,0,0,0,0,0,0,232,168,1,128,1,0,0,0,114,0,0,0,0,0,0,0,96,138,1,128,1,0,0,0,49,0,0,0,0,0,0,0,248,168,1,128,1,0,0,0,120,0,0,0,0,0,0,0,168,138,1,128,1,0,0,0,58,0,0,0,0,0,0,0,8,169,1,128,1,0,0,0,130,0,0,0,0,0,0,0,96,137, + 1,128,1,0,0,0,17,0,0,0,0,0,0,0,208,138,1,128,1,0,0,0,63,0,0,0,0,0,0,0,24,169,1,128,1,0,0,0,137,0,0,0,0,0,0,0,40,169,1,128,1,0,0,0,83,0,0,0,0,0,0,0,104,138,1,128,1,0,0,0,50,0,0,0,0,0,0,0,56,169,1,128,1,0,0,0,121,0,0,0,0,0,0,0,0,138,1,128,1,0, + 0,0,37,0,0,0,0,0,0,0,72,169,1,128,1,0,0,0,103,0,0,0,0,0,0,0,248,137,1,128,1,0,0,0,36,0,0,0,0,0,0,0,88,169,1,128,1,0,0,0,102,0,0,0,0,0,0,0,104,169,1,128,1,0,0,0,142,0,0,0,0,0,0,0,48,138,1,128,1,0,0,0,43,0,0,0,0,0,0,0,120,169,1,128,1,0,0,0,109, + 0,0,0,0,0,0,0,136,169,1,128,1,0,0,0,131,0,0,0,0,0,0,0,192,138,1,128,1,0,0,0,61,0,0,0,0,0,0,0,152,169,1,128,1,0,0,0,134,0,0,0,0,0,0,0,176,138,1,128,1,0,0,0,59,0,0,0,0,0,0,0,168,169,1,128,1,0,0,0,132,0,0,0,0,0,0,0,88,138,1,128,1,0,0,0,48,0,0,0, + 0,0,0,0,184,169,1,128,1,0,0,0,157,0,0,0,0,0,0,0,200,169,1,128,1,0,0,0,119,0,0,0,0,0,0,0,216,169,1,128,1,0,0,0,117,0,0,0,0,0,0,0,232,169,1,128,1,0,0,0,85,0,0,0,0,0,0,0,104,137,1,128,1,0,0,0,18,0,0,0,0,0,0,0,248,169,1,128,1,0,0,0,150,0,0,0,0,0, + 0,0,8,170,1,128,1,0,0,0,84,0,0,0,0,0,0,0,24,170,1,128,1,0,0,0,151,0,0,0,0,0,0,0,112,137,1,128,1,0,0,0,19,0,0,0,0,0,0,0,40,170,1,128,1,0,0,0,141,0,0,0,0,0,0,0,136,138,1,128,1,0,0,0,54,0,0,0,0,0,0,0,56,170,1,128,1,0,0,0,126,0,0,0,0,0,0,0,120,137, + 1,128,1,0,0,0,20,0,0,0,0,0,0,0,72,170,1,128,1,0,0,0,86,0,0,0,0,0,0,0,128,137,1,128,1,0,0,0,21,0,0,0,0,0,0,0,88,170,1,128,1,0,0,0,87,0,0,0,0,0,0,0,104,170,1,128,1,0,0,0,152,0,0,0,0,0,0,0,120,170,1,128,1,0,0,0,140,0,0,0,0,0,0,0,136,170,1,128,1, + 0,0,0,159,0,0,0,0,0,0,0,152,170,1,128,1,0,0,0,168,0,0,0,0,0,0,0,136,137,1,128,1,0,0,0,22,0,0,0,0,0,0,0,168,170,1,128,1,0,0,0,88,0,0,0,0,0,0,0,144,137,1,128,1,0,0,0,23,0,0,0,0,0,0,0,184,170,1,128,1,0,0,0,89,0,0,0,0,0,0,0,184,138,1,128,1,0,0,0, + 60,0,0,0,0,0,0,0,200,170,1,128,1,0,0,0,133,0,0,0,0,0,0,0,216,170,1,128,1,0,0,0,167,0,0,0,0,0,0,0,232,170,1,128,1,0,0,0,118,0,0,0,0,0,0,0,248,170,1,128,1,0,0,0,156,0,0,0,0,0,0,0,160,137,1,128,1,0,0,0,25,0,0,0,0,0,0,0,8,171,1,128,1,0,0,0,91,0, + 0,0,0,0,0,0,232,137,1,128,1,0,0,0,34,0,0,0,0,0,0,0,24,171,1,128,1,0,0,0,100,0,0,0,0,0,0,0,40,171,1,128,1,0,0,0,190,0,0,0,0,0,0,0,56,171,1,128,1,0,0,0,195,0,0,0,0,0,0,0,72,171,1,128,1,0,0,0,176,0,0,0,0,0,0,0,88,171,1,128,1,0,0,0,184,0,0,0,0,0, + 0,0,104,171,1,128,1,0,0,0,203,0,0,0,0,0,0,0,120,171,1,128,1,0,0,0,199,0,0,0,0,0,0,0,168,137,1,128,1,0,0,0,26,0,0,0,0,0,0,0,136,171,1,128,1,0,0,0,92,0,0,0,0,0,0,0,232,148,1,128,1,0,0,0,227,0,0,0,0,0,0,0,152,171,1,128,1,0,0,0,194,0,0,0,0,0,0,0, + 176,171,1,128,1,0,0,0,189,0,0,0,0,0,0,0,200,171,1,128,1,0,0,0,166,0,0,0,0,0,0,0,224,171,1,128,1,0,0,0,153,0,0,0,0,0,0,0,176,137,1,128,1,0,0,0,27,0,0,0,0,0,0,0,248,171,1,128,1,0,0,0,154,0,0,0,0,0,0,0,8,172,1,128,1,0,0,0,93,0,0,0,0,0,0,0,112,138, + 1,128,1,0,0,0,51,0,0,0,0,0,0,0,24,172,1,128,1,0,0,0,122,0,0,0,0,0,0,0,216,138,1,128,1,0,0,0,64,0,0,0,0,0,0,0,40,172,1,128,1,0,0,0,138,0,0,0,0,0,0,0,152,138,1,128,1,0,0,0,56,0,0,0,0,0,0,0,56,172,1,128,1,0,0,0,128,0,0,0,0,0,0,0,160,138,1,128,1, + 0,0,0,57,0,0,0,0,0,0,0,72,172,1,128,1,0,0,0,129,0,0,0,0,0,0,0,184,137,1,128,1,0,0,0,28,0,0,0,0,0,0,0,88,172,1,128,1,0,0,0,94,0,0,0,0,0,0,0,104,172,1,128,1,0,0,0,110,0,0,0,0,0,0,0,192,137,1,128,1,0,0,0,29,0,0,0,0,0,0,0,120,172,1,128,1,0,0,0,95, + 0,0,0,0,0,0,0,128,138,1,128,1,0,0,0,53,0,0,0,0,0,0,0,136,172,1,128,1,0,0,0,124,0,0,0,0,0,0,0,216,137,1,128,1,0,0,0,32,0,0,0,0,0,0,0,152,172,1,128,1,0,0,0,98,0,0,0,0,0,0,0,200,137,1,128,1,0,0,0,30,0,0,0,0,0,0,0,168,172,1,128,1,0,0,0,96,0,0,0, + 0,0,0,0,120,138,1,128,1,0,0,0,52,0,0,0,0,0,0,0,184,172,1,128,1,0,0,0,158,0,0,0,0,0,0,0,208,172,1,128,1,0,0,0,123,0,0,0,0,0,0,0,16,138,1,128,1,0,0,0,39,0,0,0,0,0,0,0,232,172,1,128,1,0,0,0,105,0,0,0,0,0,0,0,248,172,1,128,1,0,0,0,111,0,0,0,0,0, + 0,0,8,173,1,128,1,0,0,0,3,0,0,0,0,0,0,0,24,173,1,128,1,0,0,0,226,0,0,0,0,0,0,0,40,173,1,128,1,0,0,0,144,0,0,0,0,0,0,0,56,173,1,128,1,0,0,0,161,0,0,0,0,0,0,0,72,173,1,128,1,0,0,0,178,0,0,0,0,0,0,0,88,173,1,128,1,0,0,0,170,0,0,0,0,0,0,0,104,173, + 1,128,1,0,0,0,70,0,0,0,0,0,0,0,120,173,1,128,1,0,0,0,112,0,0,0,0,0,0,0,97,0,102,0,45,0,122,0,97,0,0,0,0,0,0,0,97,0,114,0,45,0,97,0,101,0,0,0,0,0,0,0,97,0,114,0,45,0,98,0,104,0,0,0,0,0,0,0,97,0,114,0,45,0,100,0,122,0,0,0,0,0,0,0,97,0,114,0,45, + 0,101,0,103,0,0,0,0,0,0,0,97,0,114,0,45,0,105,0,113,0,0,0,0,0,0,0,97,0,114,0,45,0,106,0,111,0,0,0,0,0,0,0,97,0,114,0,45,0,107,0,119,0,0,0,0,0,0,0,97,0,114,0,45,0,108,0,98,0,0,0,0,0,0,0,97,0,114,0,45,0,108,0,121,0,0,0,0,0,0,0,97,0,114,0,45,0, + 109,0,97,0,0,0,0,0,0,0,97,0,114,0,45,0,111,0,109,0,0,0,0,0,0,0,97,0,114,0,45,0,113,0,97,0,0,0,0,0,0,0,97,0,114,0,45,0,115,0,97,0,0,0,0,0,0,0,97,0,114,0,45,0,115,0,121,0,0,0,0,0,0,0,97,0,114,0,45,0,116,0,110,0,0,0,0,0,0,0,97,0,114,0,45,0,121, + 0,101,0,0,0,0,0,0,0,97,0,122,0,45,0,97,0,122,0,45,0,99,0,121,0,114,0,108,0,0,0,0,0,97,0,122,0,45,0,97,0,122,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,98,0,101,0,45,0,98,0,121,0,0,0,0,0,0,0,98,0,103,0,45,0,98,0,103,0,0,0,0,0,0,0,98,0,110,0,45,0,105, + 0,110,0,0,0,0,0,0,0,98,0,115,0,45,0,98,0,97,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,99,0,97,0,45,0,101,0,115,0,0,0,0,0,0,0,99,0,115,0,45,0,99,0,122,0,0,0,0,0,0,0,99,0,121,0,45,0,103,0,98,0,0,0,0,0,0,0,100,0,97,0,45,0,100,0,107,0,0,0,0,0,0,0,100, + 0,101,0,45,0,97,0,116,0,0,0,0,0,0,0,100,0,101,0,45,0,99,0,104,0,0,0,0,0,0,0,100,0,101,0,45,0,100,0,101,0,0,0,0,0,0,0,100,0,101,0,45,0,108,0,105,0,0,0,0,0,0,0,100,0,101,0,45,0,108,0,117,0,0,0,0,0,0,0,100,0,105,0,118,0,45,0,109,0,118,0,0,0,0,0, + 101,0,108,0,45,0,103,0,114,0,0,0,0,0,0,0,101,0,110,0,45,0,97,0,117,0,0,0,0,0,0,0,101,0,110,0,45,0,98,0,122,0,0,0,0,0,0,0,101,0,110,0,45,0,99,0,97,0,0,0,0,0,0,0,101,0,110,0,45,0,99,0,98,0,0,0,0,0,0,0,101,0,110,0,45,0,103,0,98,0,0,0,0,0,0,0,101, + 0,110,0,45,0,105,0,101,0,0,0,0,0,0,0,101,0,110,0,45,0,106,0,109,0,0,0,0,0,0,0,101,0,110,0,45,0,110,0,122,0,0,0,0,0,0,0,101,0,110,0,45,0,112,0,104,0,0,0,0,0,0,0,101,0,110,0,45,0,116,0,116,0,0,0,0,0,0,0,101,0,110,0,45,0,117,0,115,0,0,0,0,0,0,0, + 101,0,110,0,45,0,122,0,97,0,0,0,0,0,0,0,101,0,110,0,45,0,122,0,119,0,0,0,0,0,0,0,101,0,115,0,45,0,97,0,114,0,0,0,0,0,0,0,101,0,115,0,45,0,98,0,111,0,0,0,0,0,0,0,101,0,115,0,45,0,99,0,108,0,0,0,0,0,0,0,101,0,115,0,45,0,99,0,111,0,0,0,0,0,0,0, + 101,0,115,0,45,0,99,0,114,0,0,0,0,0,0,0,101,0,115,0,45,0,100,0,111,0,0,0,0,0,0,0,101,0,115,0,45,0,101,0,99,0,0,0,0,0,0,0,101,0,115,0,45,0,101,0,115,0,0,0,0,0,0,0,101,0,115,0,45,0,103,0,116,0,0,0,0,0,0,0,101,0,115,0,45,0,104,0,110,0,0,0,0,0,0, + 0,101,0,115,0,45,0,109,0,120,0,0,0,0,0,0,0,101,0,115,0,45,0,110,0,105,0,0,0,0,0,0,0,101,0,115,0,45,0,112,0,97,0,0,0,0,0,0,0,101,0,115,0,45,0,112,0,101,0,0,0,0,0,0,0,101,0,115,0,45,0,112,0,114,0,0,0,0,0,0,0,101,0,115,0,45,0,112,0,121,0,0,0,0, + 0,0,0,101,0,115,0,45,0,115,0,118,0,0,0,0,0,0,0,101,0,115,0,45,0,117,0,121,0,0,0,0,0,0,0,101,0,115,0,45,0,118,0,101,0,0,0,0,0,0,0,101,0,116,0,45,0,101,0,101,0,0,0,0,0,0,0,101,0,117,0,45,0,101,0,115,0,0,0,0,0,0,0,102,0,97,0,45,0,105,0,114,0,0, + 0,0,0,0,0,102,0,105,0,45,0,102,0,105,0,0,0,0,0,0,0,102,0,111,0,45,0,102,0,111,0,0,0,0,0,0,0,102,0,114,0,45,0,98,0,101,0,0,0,0,0,0,0,102,0,114,0,45,0,99,0,97,0,0,0,0,0,0,0,102,0,114,0,45,0,99,0,104,0,0,0,0,0,0,0,102,0,114,0,45,0,102,0,114,0,0, + 0,0,0,0,0,102,0,114,0,45,0,108,0,117,0,0,0,0,0,0,0,102,0,114,0,45,0,109,0,99,0,0,0,0,0,0,0,103,0,108,0,45,0,101,0,115,0,0,0,0,0,0,0,103,0,117,0,45,0,105,0,110,0,0,0,0,0,0,0,104,0,101,0,45,0,105,0,108,0,0,0,0,0,0,0,104,0,105,0,45,0,105,0,110, + 0,0,0,0,0,0,0,104,0,114,0,45,0,98,0,97,0,0,0,0,0,0,0,104,0,114,0,45,0,104,0,114,0,0,0,0,0,0,0,104,0,117,0,45,0,104,0,117,0,0,0,0,0,0,0,104,0,121,0,45,0,97,0,109,0,0,0,0,0,0,0,105,0,100,0,45,0,105,0,100,0,0,0,0,0,0,0,105,0,115,0,45,0,105,0,115, + 0,0,0,0,0,0,0,105,0,116,0,45,0,99,0,104,0,0,0,0,0,0,0,105,0,116,0,45,0,105,0,116,0,0,0,0,0,0,0,106,0,97,0,45,0,106,0,112,0,0,0,0,0,0,0,107,0,97,0,45,0,103,0,101,0,0,0,0,0,0,0,107,0,107,0,45,0,107,0,122,0,0,0,0,0,0,0,107,0,110,0,45,0,105,0,110, + 0,0,0,0,0,0,0,107,0,111,0,107,0,45,0,105,0,110,0,0,0,0,0,107,0,111,0,45,0,107,0,114,0,0,0,0,0,0,0,107,0,121,0,45,0,107,0,103,0,0,0,0,0,0,0,108,0,116,0,45,0,108,0,116,0,0,0,0,0,0,0,108,0,118,0,45,0,108,0,118,0,0,0,0,0,0,0,109,0,105,0,45,0,110, + 0,122,0,0,0,0,0,0,0,109,0,107,0,45,0,109,0,107,0,0,0,0,0,0,0,109,0,108,0,45,0,105,0,110,0,0,0,0,0,0,0,109,0,110,0,45,0,109,0,110,0,0,0,0,0,0,0,109,0,114,0,45,0,105,0,110,0,0,0,0,0,0,0,109,0,115,0,45,0,98,0,110,0,0,0,0,0,0,0,109,0,115,0,45,0, + 109,0,121,0,0,0,0,0,0,0,109,0,116,0,45,0,109,0,116,0,0,0,0,0,0,0,110,0,98,0,45,0,110,0,111,0,0,0,0,0,0,0,110,0,108,0,45,0,98,0,101,0,0,0,0,0,0,0,110,0,108,0,45,0,110,0,108,0,0,0,0,0,0,0,110,0,110,0,45,0,110,0,111,0,0,0,0,0,0,0,110,0,115,0,45, + 0,122,0,97,0,0,0,0,0,0,0,112,0,97,0,45,0,105,0,110,0,0,0,0,0,0,0,112,0,108,0,45,0,112,0,108,0,0,0,0,0,0,0,112,0,116,0,45,0,98,0,114,0,0,0,0,0,0,0,112,0,116,0,45,0,112,0,116,0,0,0,0,0,0,0,113,0,117,0,122,0,45,0,98,0,111,0,0,0,0,0,113,0,117,0, + 122,0,45,0,101,0,99,0,0,0,0,0,113,0,117,0,122,0,45,0,112,0,101,0,0,0,0,0,114,0,111,0,45,0,114,0,111,0,0,0,0,0,0,0,114,0,117,0,45,0,114,0,117,0,0,0,0,0,0,0,115,0,97,0,45,0,105,0,110,0,0,0,0,0,0,0,115,0,101,0,45,0,102,0,105,0,0,0,0,0,0,0,115,0, + 101,0,45,0,110,0,111,0,0,0,0,0,0,0,115,0,101,0,45,0,115,0,101,0,0,0,0,0,0,0,115,0,107,0,45,0,115,0,107,0,0,0,0,0,0,0,115,0,108,0,45,0,115,0,105,0,0,0,0,0,0,0,115,0,109,0,97,0,45,0,110,0,111,0,0,0,0,0,115,0,109,0,97,0,45,0,115,0,101,0,0,0,0,0, + 115,0,109,0,106,0,45,0,110,0,111,0,0,0,0,0,115,0,109,0,106,0,45,0,115,0,101,0,0,0,0,0,115,0,109,0,110,0,45,0,102,0,105,0,0,0,0,0,115,0,109,0,115,0,45,0,102,0,105,0,0,0,0,0,115,0,113,0,45,0,97,0,108,0,0,0,0,0,0,0,115,0,114,0,45,0,98,0,97,0,45, + 0,99,0,121,0,114,0,108,0,0,0,0,0,115,0,114,0,45,0,98,0,97,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,115,0,114,0,45,0,115,0,112,0,45,0,99,0,121,0,114,0,108,0,0,0,0,0,115,0,114,0,45,0,115,0,112,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,115,0,118,0,45, + 0,102,0,105,0,0,0,0,0,0,0,115,0,118,0,45,0,115,0,101,0,0,0,0,0,0,0,115,0,119,0,45,0,107,0,101,0,0,0,0,0,0,0,115,0,121,0,114,0,45,0,115,0,121,0,0,0,0,0,116,0,97,0,45,0,105,0,110,0,0,0,0,0,0,0,116,0,101,0,45,0,105,0,110,0,0,0,0,0,0,0,116,0,104, + 0,45,0,116,0,104,0,0,0,0,0,0,0,116,0,110,0,45,0,122,0,97,0,0,0,0,0,0,0,116,0,114,0,45,0,116,0,114,0,0,0,0,0,0,0,116,0,116,0,45,0,114,0,117,0,0,0,0,0,0,0,117,0,107,0,45,0,117,0,97,0,0,0,0,0,0,0,117,0,114,0,45,0,112,0,107,0,0,0,0,0,0,0,117,0,122, + 0,45,0,117,0,122,0,45,0,99,0,121,0,114,0,108,0,0,0,0,0,117,0,122,0,45,0,117,0,122,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,118,0,105,0,45,0,118,0,110,0,0,0,0,0,0,0,120,0,104,0,45,0,122,0,97,0,0,0,0,0,0,0,122,0,104,0,45,0,99,0,104,0,115,0,0,0,0, + 0,122,0,104,0,45,0,99,0,104,0,116,0,0,0,0,0,122,0,104,0,45,0,99,0,110,0,0,0,0,0,0,0,122,0,104,0,45,0,104,0,107,0,0,0,0,0,0,0,122,0,104,0,45,0,109,0,111,0,0,0,0,0,0,0,122,0,104,0,45,0,115,0,103,0,0,0,0,0,0,0,122,0,104,0,45,0,116,0,119,0,0,0,0, + 0,0,0,122,0,117,0,45,0,122,0,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,5,147,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,80,222,1,0,112,255,255,255,0,0,0,0,5,0,0,0,80,7,2,128,1,0,0,0,240,7,2,128,1,0,0,0,67,0,79,0,78,0,79,0,85,0,84,0,36,0,0,0,0,0,0, + 0,0,0,0,0,96,59,0,128,1,0,0,0,112,59,0,128,1,0,0,0,176,59,0,128,1,0,0,0,96,60,0,128,1,0,0,0,144,61,0,128,1,0,0,0,0,0,0,0,0,0,0,0,96,59,0,128,1,0,0,0,112,59,0,128,1,0,0,0,176,59,0,128,1,0,0,0,144,119,0,128,1,0,0,0,0,62,0,128,1,0,0,0,69,0,66,0, + 87,0,101,0,98,0,86,0,105,0,101,0,119,0,0,0,0,0,0,0,69,0,66,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,92,0,97,0,114,0,109,0,54,0,52,0,92,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,87,0,101,0,98,0,86, + 0,105,0,101,0,119,0,46,0,100,0,108,0,108,0,0,0,0,0,0,0,0,0,0,0,0,0,123,0,70,0,51,0,48,0,49,0,55,0,50,0,50,0,54,0,45,0,70,0,69,0,50,0,65,0,45,0,52,0,50,0,57,0,53,0,45,0,56,0,66,0,68,0,70,0,45,0,48,0,48,0,67,0,51,0,65,0,57,0,65,0,55,0,69,0,52, + 0,67,0,53,0,125,0,0,0,0,0,123,0,50,0,67,0,68,0,56,0,65,0,48,0,48,0,55,0,45,0,69,0,49,0,56,0,57,0,45,0,52,0,48,0,57,0,68,0,45,0,65,0,50,0,67,0,56,0,45,0,57,0,65,0,70,0,52,0,69,0,70,0,51,0,67,0,55,0,50,0,65,0,65,0,125,0,0,0,0,0,123,0,48,0,68,0, + 53,0,48,0,66,0,70,0,69,0,67,0,45,0,67,0,68,0,54,0,65,0,45,0,52,0,70,0,57,0,65,0,45,0,57,0,54,0,52,0,67,0,45,0,67,0,55,0,52,0,49,0,54,0,69,0,51,0,65,0,67,0,66,0,49,0,48,0,125,0,0,0,0,0,123,0,54,0,53,0,67,0,51,0,53,0,66,0,49,0,52,0,45,0,54,0,67, + 0,49,0,68,0,45,0,52,0,49,0,50,0,50,0,45,0,65,0,67,0,52,0,54,0,45,0,55,0,49,0,52,0,56,0,67,0,67,0,57,0,68,0,54,0,52,0,57,0,55,0,125,0,0,0,0,0,123,0,66,0,69,0,53,0,57,0,69,0,56,0,70,0,68,0,45,0,48,0,56,0,57,0,65,0,45,0,52,0,49,0,49,0,66,0,45,0, + 65,0,51,0,66,0,48,0,45,0,48,0,53,0,49,0,68,0,57,0,69,0,52,0,49,0,55,0,56,0,49,0,56,0,125,0,0,0,0,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,92,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,92,0,69,0,100,0,103,0,101,0,85,0,112,0, + 100,0,97,0,116,0,101,0,92,0,67,0,108,0,105,0,101,0,110,0,116,0,115,0,92,0,123,0,53,0,54,0,69,0,66,0,49,0,56,0,70,0,56,0,45,0,66,0,48,0,48,0,56,0,45,0,52,0,67,0,66,0,68,0,45,0,66,0,54,0,68,0,50,0,45,0,56,0,67,0,57,0,55,0,70,0,69,0,55,0,69,0,57, + 0,48,0,54,0,50,0,125,0,0,0,0,0,0,0,0,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,92,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,92,0,69,0,100,0,103,0,101,0,85,0,112,0,100,0,97,0,116,0,101,0,92,0,67,0,108,0,105,0,101,0,110,0,116, + 0,83,0,116,0,97,0,116,0,101,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,98,0,101,0,116,0,97,0,0,0,0,0,0,0,0,0,100,0,101,0,118,0,0,0,99,0,97,0,110,0,97,0,114,0,121,0,0,0,0,0,105,0,110,0,116,0,101,0,114,0,110,0,97,0,108,0,0,0,0,0,92,0,0,0,87,101,98,86,105, + 101,119,50,58,32,70,97,105,108,101,100,32,116,111,32,102,105,110,100,32,116,104,101,32,97,112,112,32,101,120,101,32,112,97,116,104,46,10,0,0,0,0,0,87,101,98,86,105,101,119,50,58,32,70,97,105,108,101,100,32,116,111,32,102,105,110,100,32,116,104, + 101,32,87,101,98,86,105,101,119,50,32,99,108,105,101,110,116,32,100,108,108,32,97,116,58,32,0,0,0,10,0,0,0,0,0,0,0,71,101,116,70,105,108,101,86,101,114,115,105,111,110,73,110,102,111,83,105,122,101,87,0,71,101,116,70,105,108,101,86,101,114,115, + 105,111,110,73,110,102,111,87,0,0,0,0,0,86,101,114,81,117,101,114,121,86,97,108,117,101,87,0,0,92,0,83,0,116,0,114,0,105,0,110,0,103,0,70,0,105,0,108,0,101,0,73,0,110,0,102,0,111,0,92,0,48,0,52,0,48,0,57,0,48,0,52,0,66,0,48,0,92,0,80,0,114,0, + 111,0,100,0,117,0,99,0,116,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,0,0,76,57,162,14,230,150,227,74,143,154,132,115,171,239,55,50,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,101,98,86,105,101,119,50,58,32,70,97,105,108,101,100,32,116,111,32,102,105, + 110,100,32,97,110,32,105,110,115,116,97,108,108,101,100,32,87,101,98,86,105,101,119,50,32,114,117,110,116,105,109,101,32,111,114,32,110,111,110,45,115,116,97,98,108,101,32,77,105,99,114,111,115,111,102,116,32,69,100,103,101,32,105,110,115,116, + 97,108,108,97,116,105,111,110,46,10,0,0,0,0,0,0,159,83,141,196,159,227,28,68,174,104,31,102,229,112,189,197,87,101,98,86,105,101,119,50,58,32,115,107,105,112,112,101,100,32,105,110,97,99,99,101,115,115,105,98,108,101,32,0,0,0,0,0,0,0,0,0,97, + 0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,118,0,101,0,114,0,115,0,105,0,111,0,110,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,46,0,100,0,108,0,108,0,0,0,0,0,118,0,101,0,114,0,115,0,105,0,111,0,110,0,46, + 0,100,0,108,0,108,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,83,0,116,0,97,0,98,0,108,0,101,0,95,0,56,0,119,0,101,0,107,0,121,0,98, + 0,51,0,100,0,56,0,98,0,98,0,119,0,101,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,66,0,101,0,116,0,97,0,95,0,56,0,119,0,101,0,107, + 0,121,0,98,0,51,0,100,0,56,0,98,0,98,0,119,0,101,0,0,0,0,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,68,0,101,0,118,0,95,0,56,0, + 119,0,101,0,107,0,121,0,98,0,51,0,100,0,56,0,98,0,98,0,119,0,101,0,0,0,0,0,0,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,67,0,97, + 0,110,0,97,0,114,0,121,0,95,0,56,0,119,0,101,0,107,0,121,0,98,0,51,0,100,0,56,0,98,0,98,0,119,0,101,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109, + 0,101,0,46,0,73,0,110,0,116,0,101,0,114,0,110,0,97,0,108,0,95,0,56,0,119,0,101,0,107,0,121,0,98,0,51,0,100,0,56,0,98,0,98,0,119,0,101,0,0,0,0,0,0,0,0,0,108,0,111,0,99,0,97,0,116,0,105,0,111,0,110,0,0,0,0,0,112,0,118,0,0,0,0,0,0,0,0,0,86,0,0, + 0,0,0,0,0,104,2,0,0,0,0,0,0,87,101,98,86,105,101,119,50,58,32,115,107,105,112,112,101,100,32,97,110,32,105,110,99,111,109,112,97,116,105,98,108,101,32,118,101,114,115,105,111,110,32,0,0,46,0,0,0,84,114,121,67,114,101,97,116,101,80,97,99,107, + 97,103,101,68,101,112,101,110,100,101,110,99,121,0,0,0,0,0,0,107,0,101,0,114,0,110,0,101,0,108,0,98,0,97,0,115,0,101,0,46,0,100,0,108,0,108,0,0,0,0,0,65,100,100,80,97,99,107,97,103,101,68,101,112,101,110,100,101,110,99,121,0,0,0,0,71,101,116, + 67,117,114,114,101,110,116,80,97,99,107,97,103,101,73,110,102,111,0,0,0,65,0,68,0,86,0,65,0,80,0,73,0,51,0,50,0,46,0,100,0,108,0,108,0,0,0,0,0,0,0,0,0,69,118,101,110,116,82,101,103,105,115,116,101,114,0,0,0,94,117,109,185,25,3,146,78,162,150, + 35,67,111,70,161,252,71,101,116,67,117,114,114,101,110,116,65,112,112,108,105,99,97,116,105,111,110,85,115,101,114,77,111,100,101,108,73,100,0,0,0,0,0,0,0,0,75,0,101,0,114,0,110,0,101,0,108,0,51,0,50,0,46,0,100,0,108,0,108,0,0,0,0,0,0,0,0,0, + 66,0,114,0,111,0,119,0,115,0,101,0,114,0,69,0,120,0,101,0,99,0,117,0,116,0,97,0,98,0,108,0,101,0,70,0,111,0,108,0,100,0,101,0,114,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,66,0,82,0,79,0,87,0,83,0,69,0,82,0,95,0,69,0,88,0,69,0,67,0, + 85,0,84,0,65,0,66,0,76,0,69,0,95,0,70,0,79,0,76,0,68,0,69,0,82,0,0,0,0,0,85,0,115,0,101,0,114,0,68,0,97,0,116,0,97,0,70,0,111,0,108,0,100,0,101,0,114,0,0,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,85,0,83,0,69,0,82,0,95,0,68,0,65,0,84, + 0,65,0,95,0,70,0,79,0,76,0,68,0,69,0,82,0,0,0,0,0,0,0,82,0,101,0,108,0,101,0,97,0,115,0,101,0,67,0,104,0,97,0,110,0,110,0,101,0,108,0,115,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,82,0,69,0,76,0,69,0,65,0,83,0,69,0,95,0,67,0,72,0,65, + 0,78,0,78,0,69,0,76,0,83,0,0,0,0,0,0,0,67,0,104,0,97,0,110,0,110,0,101,0,108,0,83,0,101,0,97,0,114,0,99,0,104,0,75,0,105,0,110,0,100,0,0,0,0,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,67,0,72,0,65,0,78,0,78,0,69,0,76,0,95,0,83,0,69,0, + 65,0,82,0,67,0,72,0,95,0,75,0,73,0,78,0,68,0,0,0,0,0,0,0,0,0,82,0,101,0,108,0,101,0,97,0,115,0,101,0,67,0,104,0,97,0,110,0,110,0,101,0,108,0,80,0,114,0,101,0,102,0,101,0,114,0,101,0,110,0,99,0,101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,87,0,69,0, + 66,0,86,0,73,0,69,0,87,0,50,0,95,0,82,0,69,0,76,0,69,0,65,0,83,0,69,0,95,0,67,0,72,0,65,0,78,0,78,0,69,0,76,0,95,0,80,0,82,0,69,0,70,0,69,0,82,0,69,0,78,0,67,0,69,0,0,0,115,0,104,0,101,0,108,0,108,0,51,0,50,0,46,0,100,0,108,0,108,0,0,0,71,101, + 116,67,117,114,114,101,110,116,80,114,111,99,101,115,115,69,120,112,108,105,99,105,116,65,112,112,85,115,101,114,77,111,100,101,108,73,68,0,0,0,0,0,0,0,0,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,92,0,80,0,111,0,108,0,105,0,99,0,105,0, + 101,0,115,0,92,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,92,0,69,0,100,0,103,0,101,0,92,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,92,0,0,0,0,0,42,0,0,0,0,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,85,0,83,0,69,0,95,0, + 69,0,68,0,71,0,69,0,95,0,86,0,73,0,69,0,87,0,0,0,0,0,49,0,0,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,0,0,0,0,0,0,0,0,67,114,101,97,116,101,87,101,98,86,105,101,119,69,110,118,105,114,111,110,109,101,110,116,87,105,116,104,79, + 112,116,105,111,110,115,73,110,116,101,114,110,97,108,0,0,0,0,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,58,0,32,0,67,0,111,0,114,0,101,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,69,0,110,0,118,0,105,0,114,0,111,0,110,0,109,0,101,0,110, + 0,116,0,32,0,102,0,97,0,105,0,108,0,101,0,100,0,32,0,119,0,104,0,101,0,110,0,32,0,116,0,114,0,121,0,105,0,110,0,103,0,32,0,116,0,111,0,32,0,99,0,97,0,108,0,108,0,32,0,105,0,110,0,116,0,111,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0, + 66,0,114,0,111,0,119,0,115,0,101,0,114,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,46,0,100,0,108,0,108,0,46,0,32,0,104,0,114,0,61,0,48,0,120,0,0,0,10,0,0,0,0,0,0,0,68,108,108,67,97,110,85,110,108,111,97,100,78,111,119,0,87,0,101,0,98,0,86,0,105, + 0,101,0,119,0,50,0,58,0,32,0,67,0,111,0,114,0,101,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,69,0,110,0,118,0,105,0,114,0,111,0,110,0,109,0,101,0,110,0,116,0,32,0,102,0,97,0,105,0,108,0,101,0,100,0,32,0,119,0,104,0,101,0,110,0,32,0,116,0, + 114,0,121,0,105,0,110,0,103,0,32,0,116,0,111,0,32,0,76,0,111,0,97,0,100,0,76,0,105,0,98,0,114,0,97,0,114,0,121,0,58,0,32,0,104,0,114,0,61,0,48,0,120,0,0,0,0,0,32,0,112,0,97,0,116,0,104,0,61,0,0,0,0,0,0,32,2,128,1,0,0,0,8,32,2,128,1,0,0,0,64, + 251,1,128,1,0,0,0,248,196,1,128,1,0,0,0,0,0,0,0,0,0,48,0,1,0,0,0,0,0,0,0,0,0,0,0,32,250,1,0,248,187,1,0,208,187,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,16,188,1,0,0,0,0,0,0,0,0,0,32,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,250, + 1,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,248,187,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,248,249,1,0,112,188,1,0,72,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,136,188,1,0,0,0,0,0,0,0,0,0,160,188,1, + 0,32,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,249,1,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,112,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,72,250,1,0,240,188,1,0,200,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,3,0,0,0,8,189,1,0,0,0,0,0,0,0,0,0,40,189,1,0,160,188,1,0,32,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,250,1,0,2,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,240,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,160,250, + 1,0,120,189,1,0,80,189,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,144,189,1,0,0,0,0,0,0,0,0,0,160,189,1,0,0,0,0,0,0,0,0,0,0,0,0,0,160,250,1,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,120,189,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,0,0,0,0,0,0,0,0,120,250,1,0,240,189,1,0,200,189,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,190,1,0,0,0,0,0,0,0,0,0,32,190,1,0,32,188,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,250,1,0,1,0,0,0,0,0,0,0,255,255,255,255, + 0,0,0,0,64,0,0,0,240,189,1,0,0,0,0,0,0,0,0,0,0,0,0,0,69,84,87,48,16,0,0,1,134,14,4,136,43,5,138,187,6,11,2,0,0,0,0,0,0,64,0,0,95,0,0,67,114,101,97,116,101,87,101,98,86,105,101,119,69,110,118,105,114,111,110,109,101,110,116,69,114,114,111,114, + 0,72,82,69,83,85,76,84,0,135,15,67,108,105,101,110,116,68,108,108,70,111,117,110,100,0,132,3,73,110,115,116,97,108,108,101,100,82,117,110,116,105,109,101,0,132,3,80,97,114,116,65,95,80,114,105,118,84,97,103,115,0,10,4,126,221,29,149,255,242, + 63,91,113,55,226,241,160,221,152,4,52,0,77,105,99,114,111,115,111,102,116,46,77,83,69,100,103,101,87,101,98,86,105,101,119,46,76,111,97,100,101,114,0,19,0,1,26,115,80,79,207,137,130,71,179,224,220,232,201,4,118,186,1,0,0,0,0,0,0,0,88,207,211, + 101,0,0,0,0,2,0,0,0,76,0,0,0,68,191,1,0,68,167,1,0,0,0,0,0,88,207,211,101,0,0,0,0,13,0,0,0,208,3,0,0,144,191,1,0,144,167,1,0,82,83,68,83,177,245,175,126,237,156,7,23,76,76,68,32,80,68,66,46,1,0,0,0,68,58,92,97,92,95,119,111,114,107,92,101,92, + 115,114,99,92,111,117,116,92,82,101,108,101,97,115,101,92,87,101,98,86,105,101,119,50,76,111,97,100,101,114,46,100,108,108,46,112,100,98,0,0,79,71,80,0,16,0,0,21,64,0,0,46,116,101,120,116,36,116,101,120,116,0,0,112,81,0,0,236,228,0,0,46,116, + 101,120,116,36,109,110,0,0,0,0,12,58,1,0,8,0,0,0,46,116,101,120,116,36,117,110,108,105,107,101,108,121,0,0,20,58,1,0,172,6,0,0,46,116,101,120,116,36,120,0,0,16,0,0,80,1,0,0,46,116,101,120,116,0,0,0,0,80,1,0,191,98,0,0,46,114,100,97,116,97,36, + 114,100,97,116,97,0,0,0,0,168,187,1,0,40,0,0,0,46,114,100,97,116,97,36,84,0,0,0,0,208,187,1,0,40,2,0,0,46,114,100,97,116,97,36,114,0,0,0,0,72,190,1,0,16,0,0,0,46,114,100,97,116,97,36,122,69,84,87,48,0,0,0,0,88,190,1,0,107,0,0,0,46,114,100,97, + 116,97,36,122,69,84,87,49,0,0,0,0,195,190,1,0,69,0,0,0,46,114,100,97,116,97,36,122,69,84,87,50,0,0,0,0,8,191,1,0,1,0,0,0,46,114,100,97,116,97,36,122,69,84,87,57,0,0,0,0,160,196,1,0,32,0,0,0,46,48,48,99,102,103,0,0,192,196,1,0,8,0,0,0,46,67,82, + 84,36,88,67,65,0,0,0,0,200,196,1,0,8,0,0,0,46,67,82,84,36,88,67,90,0,0,0,0,208,196,1,0,8,0,0,0,46,67,82,84,36,88,73,65,0,0,0,0,216,196,1,0,16,0,0,0,46,67,82,84,36,88,73,67,0,0,0,0,232,196,1,0,8,0,0,0,46,67,82,84,36,88,73,90,0,0,0,0,240,196,1, + 0,8,0,0,0,46,67,82,84,36,88,76,65,0,0,0,0,248,196,1,0,8,0,0,0,46,67,82,84,36,88,76,90,0,0,0,0,0,197,1,0,8,0,0,0,46,67,82,84,36,88,80,65,0,0,0,0,8,197,1,0,16,0,0,0,46,67,82,84,36,88,80,88,0,0,0,0,24,197,1,0,8,0,0,0,46,67,82,84,36,88,80,88,65, + 0,0,0,32,197,1,0,8,0,0,0,46,67,82,84,36,88,80,90,0,0,0,0,40,197,1,0,8,0,0,0,46,67,82,84,36,88,84,65,0,0,0,0,48,197,1,0,8,0,0,0,46,67,82,84,36,88,84,90,0,0,0,0,241,199,1,0,40,0,0,0,46,105,100,97,116,97,36,50,0,0,0,0,32,200,1,0,104,2,0,0,46,105, + 100,97,116,97,36,52,0,0,0,0,136,202,1,0,104,2,0,0,46,105,100,97,116,97,36,53,0,0,0,0,240,204,1,0,166,5,0,0,46,105,100,97,116,97,36,54,0,0,0,0,150,210,1,0,13,0,0,0,46,105,100,97,116,97,36,55,0,0,0,0,168,210,1,0,8,0,0,0,46,114,116,99,36,73,65, + 65,0,0,0,0,176,210,1,0,8,0,0,0,46,114,116,99,36,73,90,90,0,0,0,0,184,210,1,0,8,0,0,0,46,114,116,99,36,84,65,65,0,0,0,0,192,210,1,0,8,0,0,0,46,114,116,99,36,84,90,90,0,0,0,0,200,210,1,0,172,15,0,0,46,120,100,97,116,97,0,0,144,226,1,0,40,1,0,0, + 46,120,100,97,116,97,36,120,0,0,0,0,0,80,1,0,73,8,0,0,46,114,100,97,116,97,0,0,0,240,1,0,176,9,0,0,46,100,97,116,97,36,100,97,116,97,0,0,248,249,1,0,159,0,0,0,46,100,97,116,97,36,114,0,160,250,1,0,32,0,0,0,46,100,97,116,97,36,114,115,0,0,0,0, + 48,251,1,0,115,16,0,0,46,98,115,115,0,0,0,0,0,240,1,0,112,0,0,0,46,100,97,116,97,0,0,0,0,16,2,0,208,11,0,0,46,112,100,97,116,97,36,112,100,97,116,97,0,0,0,0,0,32,2,0,1,0,0,0,46,116,108,115,36,116,108,115,0,0,0,0,4,32,2,0,4,0,0,0,46,116,108,115, + 36,0,0,0,8,32,2,0,1,0,0,0,46,116,108,115,36,90,90,90,0,0,0,0,0,48,2,0,88,0,0,0,46,114,115,114,99,36,48,49,0,0,0,0,96,48,2,0,40,5,0,0,46,114,115,114,99,36,48,50,0,0,0,0,0,16,0,0,64,16,0,0,64,17,0,0,96,18,0,0,124,18,0,0,128,18,0,0,212,18,0,0,48, + 19,0,0,80,19,0,0,128,19,0,0,160,19,0,0,0,20,0,0,0,21,0,0,96,21,0,0,128,22,0,0,144,22,0,0,224,22,0,0,32,23,0,0,96,23,0,0,112,23,0,0,176,23,0,0,240,23,0,0,64,24,0,0,128,24,0,0,48,25,0,0,72,25,0,0,128,25,0,0,32,27,0,0,80,31,0,0,56,32,0,0,160,49, + 0,0,32,54,0,0,48,54,0,0,32,55,0,0,192,56,0,0,96,59,0,0,112,59,0,0,176,59,0,0,96,60,0,0,144,61,0,0,0,62,0,0,192,83,0,0,224,83,0,0,128,85,0,0,176,87,0,0,192,89,0,0,96,105,0,0,128,115,0,0,144,119,0,0,128,122,0,0,160,122,0,0,224,122,0,0,240,122, + 0,0,16,123,0,0,112,123,0,0,160,123,0,0,240,123,0,0,240,161,0,0,224,165,0,0,96,187,0,0,160,187,0,0,16,193,0,0,144,193,0,0,96,194,0,0,160,194,0,0,176,194,0,0,16,195,0,0,32,199,0,0,48,203,0,0,128,203,0,0,48,206,0,0,176,206,0,0,0,228,0,0,48,229, + 0,0,208,243,0,0,16,253,0,0,144,14,1,0,0,44,1,0,32,55,1,0,0,0,0,0,96,105,0,128,1,0,0,0,0,16,0,128,1,0,0,0,0,0,0,0,0,0,0,0,160,19,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,14,1,128,1,0,0,0,0,228,0,128,1,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,253,0,128,1,0,0,0,32,55,1,128,1,0,0,0,48,229,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,170,198,1,0,192,250,1,0,208,250,1,0,152,197,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,183,198,1,0,200,250,1,0,24,251,1,0,224,197,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,197,1,0,0,0,0,0,8,198,1,0,0,0,0,0,30,198,1,0,0,0,0,0,48,198,1,0,0,0,0,0,70,198,1,0,0,0,0,0,84, + 198,1,0,0,0,0,0,100,198,1,0,0,0,0,0,116,198,1,0,0,0,0,0,0,0,0,0,0,0,0,0,136,198,1,0,0,0,0,0,154,198,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,118,101,110,116,82,101,103,105,115,116,101,114,0,0,0,69,118,101,110,116,83,101,116,73,110,102,111,114,109, + 97,116,105,111,110,0,0,0,69,118,101,110,116,85,110,114,101,103,105,115,116,101,114,0,0,0,69,118,101,110,116,87,114,105,116,101,84,114,97,110,115,102,101,114,0,0,0,0,82,101,103,67,108,111,115,101,75,101,121,0,0,0,82,101,103,71,101,116,86,97,108, + 117,101,87,0,0,0,0,82,101,103,79,112,101,110,75,101,121,69,120,87,0,0,0,82,101,103,81,117,101,114,121,86,97,108,117,101,69,120,87,0,0,0,0,67,111,84,97,115,107,77,101,109,65,108,108,111,99,0,0,0,0,67,111,84,97,115,107,77,101,109,70,114,101,101, + 0,65,68,86,65,80,73,51,50,46,100,108,108,0,111,108,101,51,50,46,100,108,108,0,0,0,0,0,0,0,0,0,0,0,0,0,233,198,1,0,1,0,0,0,5,0,0,0,5,0,0,0,252,198,1,0,16,199,1,0,36,199,1,0,87,101,98,86,105,101,119,50,76,111,97,100,101,114,46,100,108,108,0,32, + 55,0,0,192,56,0,0,160,49,0,0,32,54,0,0,48,54,0,0,46,199,1,0,69,199,1,0,99,199,1,0,140,199,1,0,185,199,1,0,0,0,1,0,2,0,3,0,4,0,67,111,109,112,97,114,101,66,114,111,119,115,101,114,86,101,114,115,105,111,110,115,0,67,114,101,97,116,101,67,111, + 114,101,87,101,98,86,105,101,119,50,69,110,118,105,114,111,110,109,101,110,116,0,67,114,101,97,116,101,67,111,114,101,87,101,98,86,105,101,119,50,69,110,118,105,114,111,110,109,101,110,116,87,105,116,104,79,112,116,105,111,110,115,0,71,101,116, + 65,118,97,105,108,97,98,108,101,67,111,114,101,87,101,98,86,105,101,119,50,66,114,111,119,115,101,114,86,101,114,115,105,111,110,83,116,114,105,110,103,0,71,101,116,65,118,97,105,108,97,98,108,101,67,111,114,101,87,101,98,86,105,101,119,50,66, + 114,111,119,115,101,114,86,101,114,115,105,111,110,83,116,114,105,110,103,87,105,116,104,79,112,116,105,111,110,115,0,32,200,1,0,0,0,0,0,0,0,0,0,150,210,1,0,136,202,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,204,1,0,0,0,0, + 0,10,205,1,0,0,0,0,0,24,205,1,0,0,0,0,0,38,205,1,0,0,0,0,0,62,205,1,0,0,0,0,0,78,205,1,0,0,0,0,0,102,205,1,0,0,0,0,0,116,205,1,0,0,0,0,0,128,205,1,0,0,0,0,0,148,205,1,0,0,0,0,0,164,205,1,0,0,0,0,0,176,205,1,0,0,0,0,0,186,205,1,0,0,0,0,0,200, + 205,1,0,0,0,0,0,214,205,1,0,0,0,0,0,234,205,1,0,0,0,0,0,4,206,1,0,0,0,0,0,18,206,1,0,0,0,0,0,28,206,1,0,0,0,0,0,40,206,1,0,0,0,0,0,58,206,1,0,0,0,0,0,76,206,1,0,0,0,0,0,94,206,1,0,0,0,0,0,116,206,1,0,0,0,0,0,136,206,1,0,0,0,0,0,158,206,1,0,0, + 0,0,0,180,206,1,0,0,0,0,0,206,206,1,0,0,0,0,0,232,206,1,0,0,0,0,0,254,206,1,0,0,0,0,0,12,207,1,0,0,0,0,0,28,207,1,0,0,0,0,0,50,207,1,0,0,0,0,0,72,207,1,0,0,0,0,0,92,207,1,0,0,0,0,0,104,207,1,0,0,0,0,0,122,207,1,0,0,0,0,0,140,207,1,0,0,0,0,0, + 158,207,1,0,0,0,0,0,174,207,1,0,0,0,0,0,192,207,1,0,0,0,0,0,208,207,1,0,0,0,0,0,234,207,1,0,0,0,0,0,246,207,1,0,0,0,0,0,2,208,1,0,0,0,0,0,16,208,1,0,0,0,0,0,28,208,1,0,0,0,0,0,68,208,1,0,0,0,0,0,98,208,1,0,0,0,0,0,120,208,1,0,0,0,0,0,144,208, + 1,0,0,0,0,0,162,208,1,0,0,0,0,0,178,208,1,0,0,0,0,0,202,208,1,0,0,0,0,0,220,208,1,0,0,0,0,0,238,208,1,0,0,0,0,0,254,208,1,0,0,0,0,0,20,209,1,0,0,0,0,0,42,209,1,0,0,0,0,0,64,209,1,0,0,0,0,0,90,209,1,0,0,0,0,0,108,209,1,0,0,0,0,0,134,209,1,0,0, + 0,0,0,160,209,1,0,0,0,0,0,180,209,1,0,0,0,0,0,194,209,1,0,0,0,0,0,214,209,1,0,0,0,0,0,230,209,1,0,0,0,0,0,246,209,1,0,0,0,0,0,18,210,1,0,0,0,0,0,38,210,1,0,0,0,0,0,56,210,1,0,0,0,0,0,72,210,1,0,0,0,0,0,100,210,1,0,0,0,0,0,122,210,1,0,0,0,0,0, + 138,210,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,204,1,0,0,0,0,0,10,205,1,0,0,0,0,0,24,205,1,0,0,0,0,0,38,205,1,0,0,0,0,0,62,205,1,0,0,0,0,0,78,205,1,0,0,0,0,0,102,205,1,0,0,0,0,0,116,205,1,0,0,0,0,0,128,205,1,0,0,0,0,0,148,205,1,0,0,0,0,0,164,205,1, + 0,0,0,0,0,176,205,1,0,0,0,0,0,186,205,1,0,0,0,0,0,200,205,1,0,0,0,0,0,214,205,1,0,0,0,0,0,234,205,1,0,0,0,0,0,4,206,1,0,0,0,0,0,18,206,1,0,0,0,0,0,28,206,1,0,0,0,0,0,40,206,1,0,0,0,0,0,58,206,1,0,0,0,0,0,76,206,1,0,0,0,0,0,94,206,1,0,0,0,0,0, + 116,206,1,0,0,0,0,0,136,206,1,0,0,0,0,0,158,206,1,0,0,0,0,0,180,206,1,0,0,0,0,0,206,206,1,0,0,0,0,0,232,206,1,0,0,0,0,0,254,206,1,0,0,0,0,0,12,207,1,0,0,0,0,0,28,207,1,0,0,0,0,0,50,207,1,0,0,0,0,0,72,207,1,0,0,0,0,0,92,207,1,0,0,0,0,0,104,207, + 1,0,0,0,0,0,122,207,1,0,0,0,0,0,140,207,1,0,0,0,0,0,158,207,1,0,0,0,0,0,174,207,1,0,0,0,0,0,192,207,1,0,0,0,0,0,208,207,1,0,0,0,0,0,234,207,1,0,0,0,0,0,246,207,1,0,0,0,0,0,2,208,1,0,0,0,0,0,16,208,1,0,0,0,0,0,28,208,1,0,0,0,0,0,68,208,1,0,0, + 0,0,0,98,208,1,0,0,0,0,0,120,208,1,0,0,0,0,0,144,208,1,0,0,0,0,0,162,208,1,0,0,0,0,0,178,208,1,0,0,0,0,0,202,208,1,0,0,0,0,0,220,208,1,0,0,0,0,0,238,208,1,0,0,0,0,0,254,208,1,0,0,0,0,0,20,209,1,0,0,0,0,0,42,209,1,0,0,0,0,0,64,209,1,0,0,0,0,0, + 90,209,1,0,0,0,0,0,108,209,1,0,0,0,0,0,134,209,1,0,0,0,0,0,160,209,1,0,0,0,0,0,180,209,1,0,0,0,0,0,194,209,1,0,0,0,0,0,214,209,1,0,0,0,0,0,230,209,1,0,0,0,0,0,246,209,1,0,0,0,0,0,18,210,1,0,0,0,0,0,38,210,1,0,0,0,0,0,56,210,1,0,0,0,0,0,72,210, + 1,0,0,0,0,0,100,210,1,0,0,0,0,0,122,210,1,0,0,0,0,0,138,210,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,99,113,117,105,114,101,83,82,87,76,111,99,107,69,120,99,108,117,115,105,118,101,0,148,0,67,108,111,115,101,72,97,110,100,108,101,0,218,0,67,114,101, + 97,116,101,70,105,108,101,87,0,35,1,68,101,108,101,116,101,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,0,68,1,69,110,99,111,100,101,80,111,105,110,116,101,114,0,72,1,69,110,116,101,114,67,114,105,116,105,99,97,108,83,101,99,116,105, + 111,110,0,0,119,1,69,120,105,116,80,114,111,99,101,115,115,0,142,1,70,105,110,100,67,108,111,115,101,0,148,1,70,105,110,100,70,105,114,115,116,70,105,108,101,69,120,87,0,0,165,1,70,105,110,100,78,101,120,116,70,105,108,101,87,0,179,1,70,108, + 115,65,108,108,111,99,0,0,180,1,70,108,115,70,114,101,101,0,181,1,70,108,115,71,101,116,86,97,108,117,101,0,182,1,70,108,115,83,101,116,86,97,108,117,101,0,184,1,70,108,117,115,104,70,105,108,101,66,117,102,102,101,114,115,0,0,195,1,70,114,101, + 101,69,110,118,105,114,111,110,109,101,110,116,83,116,114,105,110,103,115,87,0,196,1,70,114,101,101,76,105,98,114,97,114,121,0,203,1,71,101,116,65,67,80,0,0,218,1,71,101,116,67,80,73,110,102,111,0,239,1,71,101,116,67,111,109,109,97,110,100,76, + 105,110,101,65,0,240,1,71,101,116,67,111,109,109,97,110,100,76,105,110,101,87,0,21,2,71,101,116,67,111,110,115,111,108,101,77,111,100,101,0,0,25,2,71,101,116,67,111,110,115,111,108,101,79,117,116,112,117,116,67,80,0,0,49,2,71,101,116,67,117, + 114,114,101,110,116,80,114,111,99,101,115,115,0,50,2,71,101,116,67,117,114,114,101,110,116,80,114,111,99,101,115,115,73,100,0,54,2,71,101,116,67,117,114,114,101,110,116,84,104,114,101,97,100,73,100,0,0,81,2,71,101,116,69,110,118,105,114,111, + 110,109,101,110,116,83,116,114,105,110,103,115,87,0,0,83,2,71,101,116,69,110,118,105,114,111,110,109,101,110,116,86,97,114,105,97,98,108,101,87,0,95,2,71,101,116,70,105,108,101,65,116,116,114,105,98,117,116,101,115,87,0,0,104,2,71,101,116,70, + 105,108,101,84,121,112,101,0,123,2,71,101,116,76,97,115,116,69,114,114,111,114,0,0,143,2,71,101,116,77,111,100,117,108,101,70,105,108,101,78,97,109,101,87,0,0,146,2,71,101,116,77,111,100,117,108,101,72,97,110,100,108,101,69,120,87,0,0,147,2, + 71,101,116,77,111,100,117,108,101,72,97,110,100,108,101,87,0,0,180,2,71,101,116,79,69,77,67,80,0,0,203,2,71,101,116,80,114,111,99,65,100,100,114,101,115,115,0,0,210,2,71,101,116,80,114,111,99,101,115,115,72,101,97,112,0,0,239,2,71,101,116,83, + 116,97,114,116,117,112,73,110,102,111,87,0,241,2,71,101,116,83,116,100,72,97,110,100,108,101,0,0,246,2,71,101,116,83,116,114,105,110,103,84,121,112,101,87,0,0,2,3,71,101,116,83,121,115,116,101,109,73,110,102,111,0,8,3,71,101,116,83,121,115,116, + 101,109,84,105,109,101,65,115,70,105,108,101,84,105,109,101,0,104,3,72,101,97,112,65,108,108,111,99,0,108,3,72,101,97,112,70,114,101,101,0,0,111,3,72,101,97,112,82,101,65,108,108,111,99,0,113,3,72,101,97,112,83,105,122,101,0,0,130,3,73,110,105, + 116,105,97,108,105,122,101,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,65,110,100,83,112,105,110,67,111,117,110,116,0,131,3,73,110,105,116,105,97,108,105,122,101,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,69,120,0,134, + 3,73,110,105,116,105,97,108,105,122,101,83,76,105,115,116,72,101,97,100,0,138,3,73,110,116,101,114,108,111,99,107,101,100,70,108,117,115,104,83,76,105,115,116,0,170,3,73,115,86,97,108,105,100,67,111,100,101,80,97,103,101,0,208,3,76,67,77,97, + 112,83,116,114,105,110,103,87,0,0,220,3,76,101,97,118,101,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,0,0,225,3,76,111,97,100,76,105,98,114,97,114,121,69,120,65,0,0,226,3,76,111,97,100,76,105,98,114,97,114,121,69,120,87,0,0,227,3, + 76,111,97,100,76,105,98,114,97,114,121,87,0,0,13,4,77,117,108,116,105,66,121,116,101,84,111,87,105,100,101,67,104,97,114,0,52,4,79,117,116,112,117,116,68,101,98,117,103,83,116,114,105,110,103,65,0,0,53,4,79,117,116,112,117,116,68,101,98,117, + 103,83,116,114,105,110,103,87,0,0,107,4,81,117,101,114,121,80,101,114,102,111,114,109,97,110,99,101,67,111,117,110,116,101,114,0,130,4,82,97,105,115,101,69,120,99,101,112,116,105,111,110,0,0,211,4,82,101,108,101,97,115,101,83,82,87,76,111,99, + 107,69,120,99,108,117,115,105,118,101,0,247,4,82,116,108,76,111,111,107,117,112,70,117,110,99,116,105,111,110,69,110,116,114,121,0,0,249,4,82,116,108,80,99,84,111,70,105,108,101,72,101,97,100,101,114,0,252,4,82,116,108,85,110,119,105,110,100, + 69,120,0,78,5,83,101,116,70,105,108,101,80,111,105,110,116,101,114,69,120,0,0,93,5,83,101,116,76,97,115,116,69,114,114,111,114,0,0,120,5,83,101,116,83,116,100,72,97,110,100,108,101,0,0,174,5,83,108,101,101,112,67,111,110,100,105,116,105,111, + 110,86,97,114,105,97,98,108,101,83,82,87,0,188,5,84,101,114,109,105,110,97,116,101,80,114,111,99,101,115,115,0,0,253,5,86,105,114,116,117,97,108,80,114,111,116,101,99,116,0,0,255,5,86,105,114,116,117,97,108,81,117,101,114,121,0,0,16,6,87,97, + 107,101,65,108,108,67,111,110,100,105,116,105,111,110,86,97,114,105,97,98,108,101,0,0,47,6,87,105,100,101,67,104,97,114,84,111,77,117,108,116,105,66,121,116,101,0,66,6,87,114,105,116,101,67,111,110,115,111,108,101,87,0,67,6,87,114,105,116,101, + 70,105,108,101,0,75,69,82,78,69,76,51,50,46,100,108,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,80,8,8,0,64,0,225,131,252,228,128,114,0,0,0,80,1,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0, + 0,0,0,0,0,1,0,0,0,1,0,0,0,0,211,1,0,64,0,0,0,0,0,0,0,0,0,0,0,20,58,1,0,0,0,0,0,0,0,0,0,132,81,0,0,0,0,0,0,8,0,80,8,4,0,0,0,129,252,228,227,128,114,0,0,0,80,1,0,52,0,64,16,42,0,64,0,225,129,208,130,36,252,228,227,21,0,64,16,12,0,64,0,225,129, + 212,1,252,228,227,227,10,0,0,8,225,133,252,228,79,0,80,24,70,0,64,0,225,131,209,4,200,130,38,252,228,227,227,227,64,106,0,0,2,0,0,0,0,86,0,0,112,86,0,0,52,58,1,0,0,0,0,0,240,86,0,0,252,86,0,0,52,58,1,0,0,0,0,0,10,0,64,8,6,0,0,0,129,252,228,227, + 43,0,80,16,11,0,64,0,225,131,208,130,36,252,228,227,64,106,0,0,4,0,0,0,84,87,0,0,116,87,0,0,92,58,1,0,0,0,0,0,72,87,0,0,148,87,0,0,132,58,1,0,0,0,0,0,160,87,0,0,172,87,0,0,92,58,1,0,0,0,0,0,160,87,0,0,172,87,0,0,132,58,1,0,0,0,0,0,9,0,64,8,5, + 0,0,0,129,252,228,227,106,0,112,24,225,133,209,4,200,130,38,252,228,227,227,227,64,106,0,0,1,0,0,0,96,88,0,0,156,89,0,0,168,58,1,0,156,89,0,0,16,0,64,8,12,0,0,0,129,252,228,227,53,0,112,8,225,131,252,228,64,106,0,0,1,0,0,0,172,99,0,0,100,100, + 0,0,232,58,1,0,100,100,0,0,13,0,64,8,8,0,0,0,129,252,228,227,24,0,64,8,19,0,64,0,225,129,252,228,42,0,64,16,35,0,64,0,225,129,34,252,228,227,227,227,1,0,0,8,228,0,0,0,46,0,80,8,40,0,0,0,225,129,252,228,96,185,0,0,232,255,255,255,87,0,64,24,79, + 0,64,0,225,133,201,4,200,130,38,252,228,227,227,227,26,0,64,16,20,0,64,0,225,129,34,252,228,227,227,227,27,0,112,16,225,139,34,252,228,227,227,227,64,106,0,0,1,0,0,0,48,115,0,0,96,115,0,0,28,59,1,0,96,115,0,0,40,0,64,8,35,0,0,0,129,34,252,228, + 20,0,64,16,14,0,64,0,225,129,212,1,252,228,227,227,41,0,64,16,26,0,64,0,225,129,34,252,228,227,227,227,46,0,80,16,40,0,64,0,225,133,212,1,252,228,227,227,64,106,0,0,1,0,0,0,216,115,0,0,236,115,0,0,188,59,1,0,236,115,0,0,68,0,64,16,58,0,0,0,129, + 212,1,252,228,227,227,227,12,0,0,8,225,129,252,228,20,0,112,16,225,129,212,1,252,228,227,227,64,106,0,0,1,0,0,0,200,125,0,0,228,125,0,0,204,60,1,0,0,0,0,0,41,0,112,16,225,131,212,1,252,228,227,227,128,114,0,0,64,84,1,0,0,0,0,0,120,126,0,0,255, + 255,255,255,168,126,0,0,0,0,0,0,184,126,0,0,255,255,255,255,25,0,0,16,225,129,212,1,252,228,227,227,58,0,80,16,51,0,64,0,225,137,212,1,252,228,227,227,128,114,0,0,112,84,1,0,255,255,255,255,56,116,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,127,0,0,255, + 255,255,255,76,128,0,0,0,0,0,0,67,0,80,16,61,0,64,0,225,133,34,252,228,227,227,227,64,106,0,0,1,0,0,0,168,128,0,0,28,129,0,0,32,61,1,0,124,129,0,0,19,0,64,8,14,0,0,0,129,252,228,227,17,0,112,16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0, + 0,172,129,0,0,180,129,0,0,244,60,1,0,0,0,0,0,11,0,64,8,7,0,0,0,129,252,228,227,18,0,112,8,225,135,252,228,128,114,0,0,160,84,1,0,0,0,0,0,172,134,0,0,0,0,0,0,19,0,112,16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,44,136,0,0,56,136,0,0, + 244,60,1,0,0,0,0,0,42,0,112,16,225,131,34,252,228,227,227,227,128,114,0,0,208,84,1,0,82,0,64,24,69,0,64,0,225,129,209,4,200,130,38,252,228,227,227,227,135,0,64,16,21,0,64,0,225,129,200,130,36,252,228,227,37,0,64,16,31,0,64,0,225,131,34,252,228, + 227,227,227,58,0,64,16,51,0,64,0,225,131,208,130,36,252,228,227,5,0,32,8,1,228,227,227,14,0,16,8,225,129,252,228,0,255,0,0,1,0,0,0,32,157,0,0,40,157,0,0,1,0,0,0,40,157,0,0,49,0,0,8,228,0,0,0,71,0,0,8,228,0,0,0,27,0,112,16,225,129,34,252,228, + 227,227,227,64,106,0,0,1,0,0,0,236,158,0,0,48,159,0,0,108,61,1,0,48,159,0,0,13,0,64,8,9,0,0,0,129,252,228,227,7,0,64,8,5,0,128,0,2,228,2,228,1,0,0,8,228,0,0,0,21,0,64,48,14,0,64,3,226,10,74,202,8,201,134,201,4,200,130,44,228,74,202,8,201,134, + 201,4,200,130,44,228,21,0,64,48,14,0,64,3,226,10,74,202,8,201,134,201,4,200,130,44,228,74,202,8,201,134,201,4,200,130,44,228,15,0,0,8,225,129,252,228,10,0,64,8,5,0,64,0,225,129,252,228,118,0,80,32,107,0,64,0,225,137,210,7,209,134,201,4,200,130, + 40,252,228,227,227,227,64,106,0,0,3,0,0,0,252,163,0,0,176,164,0,0,144,62,1,0,176,164,0,0,196,163,0,0,200,164,0,0,180,62,1,0,0,0,0,0,36,165,0,0,40,165,0,0,180,62,1,0,0,0,0,0,15,0,64,8,11,0,0,0,129,252,228,227,122,0,80,32,112,0,64,0,225,143,210, + 7,209,134,201,4,200,130,40,252,228,227,227,227,64,106,0,0,2,0,0,0,152,166,0,0,184,166,0,0,160,61,1,0,184,166,0,0,152,166,0,0,40,167,0,0,208,61,1,0,0,0,0,0,12,0,64,8,8,0,0,0,129,252,228,227,48,0,64,16,39,0,0,0,129,212,1,252,228,227,227,227,63, + 0,64,32,53,0,64,0,225,131,210,8,201,134,201,4,200,130,42,252,228,227,227,227,124,0,80,24,111,0,64,0,225,131,201,4,200,130,38,252,228,227,227,227,64,106,0,0,2,0,0,0,232,171,0,0,8,173,0,0,1,0,0,0,64,173,0,0,44,173,0,0,64,173,0,0,1,0,0,0,64,173, + 0,0,58,0,80,16,51,0,64,0,225,129,208,130,36,252,228,227,64,106,0,0,1,0,0,0,128,173,0,0,20,174,0,0,1,0,0,0,40,174,0,0,167,0,64,32,149,0,64,0,225,129,210,8,201,134,201,4,200,130,42,252,228,227,227,227,79,1,80,32,48,1,0,0,225,210,10,201,136,201, + 6,200,132,200,2,139,252,228,227,227,96,185,0,0,152,255,255,255,150,0,64,32,137,0,0,0,225,145,210,8,201,134,201,4,200,130,42,252,228,227,227,227,6,0,64,8,5,0,128,0,1,228,228,0,11,0,64,16,6,0,64,0,228,1,236,228,228,0,0,0,5,0,64,16,3,0,0,1,226, + 2,66,228,66,228,0,0,18,0,0,8,228,0,0,0,57,0,0,8,228,0,0,0,19,0,0,8,228,0,0,0,72,0,0,8,228,0,0,0,33,0,64,8,13,0,64,0,225,129,252,228,127,0,64,32,91,0,64,0,225,133,210,8,201,134,201,4,200,130,42,252,228,227,227,227,62,0,64,16,55,0,64,0,225,129, + 208,130,36,252,228,227,48,0,64,16,42,0,64,0,225,129,34,252,228,227,227,227,51,0,64,16,16,0,64,0,225,129,208,130,36,252,228,227,19,0,112,16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,172,201,0,0,188,201,0,0,244,60,1,0,0,0,0,0,21,0,112, + 16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,252,201,0,0,20,202,0,0,244,60,1,0,0,0,0,0,28,0,112,16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,84,202,0,0,136,202,0,0,244,60,1,0,0,0,0,0,33,0,112,16,225,131,34,252,228,227,227,227, + 64,106,0,0,1,0,0,0,196,202,0,0,12,203,0,0,244,60,1,0,0,0,0,0,20,0,112,16,225,129,212,1,252,228,227,227,64,106,0,0,1,0,0,0,76,203,0,0,100,203,0,0,240,62,1,0,0,0,0,0,166,0,48,16,225,200,132,200,2,133,252,228,96,185,0,0,200,255,255,255,47,0,80, + 16,40,0,64,0,225,129,208,130,36,252,228,227,0,255,0,0,1,0,0,0,64,211,0,0,136,211,0,0,24,63,1,0,0,0,0,0,100,0,96,24,225,64,192,39,208,130,36,252,228,227,227,227,133,0,48,16,225,208,2,131,252,228,227,227,96,185,0,0,216,255,255,255,81,0,112,16, + 225,131,200,130,36,252,228,227,64,106,0,0,1,0,0,0,216,215,0,0,216,216,0,0,244,60,1,0,0,0,0,0,15,0,0,8,228,0,0,0,2,0,0,8,228,0,0,0,13,0,0,8,228,0,0,0,14,0,0,8,228,0,0,0,18,0,0,8,228,0,0,0,17,0,16,8,228,0,0,0,240,23,0,0,0,0,0,0,59,0,64,24,29,0, + 64,0,225,129,201,4,200,130,38,252,228,227,227,227,155,0,80,32,28,0,64,0,225,133,210,7,209,134,201,4,200,130,40,252,228,227,227,227,64,106,0,0,2,0,0,0,240,221,0,0,160,222,0,0,64,63,1,0,0,0,0,0,44,223,0,0,68,223,0,0,64,63,1,0,0,0,0,0,22,0,112, + 16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,208,223,0,0,236,223,0,0,244,60,1,0,0,0,0,0,51,0,112,16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,44,226,0,0,188,226,0,0,112,63,1,0,0,0,0,0,61,0,112,16,225,139,200,130,36,252,228,227, + 64,106,0,0,1,0,0,0,0,227,0,0,176,227,0,0,156,63,1,0,0,0,0,0,155,0,64,32,140,0,64,0,225,135,210,8,201,134,201,4,200,130,42,252,228,227,227,227,109,0,96,24,225,129,201,68,200,130,38,252,228,227,227,227,115,0,96,24,225,129,201,68,200,130,38,252, + 228,227,227,227,103,0,64,24,22,0,64,0,225,129,209,134,201,4,200,130,40,252,228,227,200,0,80,24,190,0,0,0,225,209,136,201,6,200,132,200,2,137,252,228,96,185,0,0,168,255,255,255,69,0,48,16,225,200,2,131,252,228,227,227,96,185,0,0,216,255,255,255, + 76,0,96,16,225,129,208,194,36,252,228,227,35,0,112,16,225,133,200,130,36,252,228,227,64,106,0,0,1,0,0,0,108,253,0,0,184,253,0,0,200,63,1,0,0,0,0,0,27,0,64,16,16,0,64,0,225,129,34,252,228,227,227,227,41,0,64,56,33,0,64,3,202,12,201,138,201,8, + 200,134,200,4,66,7,228,202,12,201,138,201,8,200,134,200,4,66,7,228,0,0,6,0,64,8,5,0,64,0,228,228,0,0,11,0,0,8,225,131,228,0,45,0,64,24,28,0,64,0,225,129,201,4,200,130,38,252,228,227,227,227,30,0,80,16,24,0,64,0,225,129,34,252,228,227,227,227, + 64,106,0,0,1,0,0,0,76,4,1,0,96,4,1,0,244,63,1,0,0,0,0,0,48,0,80,24,14,0,64,0,225,131,201,4,200,130,38,252,228,227,227,227,64,106,0,0,2,0,0,0,52,8,1,0,112,8,1,0,240,62,1,0,0,0,0,0,128,8,1,0,152,8,1,0,240,62,1,0,0,0,0,0,111,0,48,32,225,210,10, + 201,136,201,6,200,132,200,2,139,252,228,227,227,96,185,0,0,152,255,255,255,202,0,48,32,225,210,10,201,136,201,6,200,132,200,2,139,252,228,227,227,96,185,0,0,152,255,255,255,99,0,0,8,228,0,0,0,47,0,112,16,225,131,34,252,228,227,227,227,64,106, + 0,0,1,0,0,0,132,15,1,0,0,16,1,0,28,64,1,0,0,0,0,0,224,0,48,32,225,210,10,201,136,201,6,200,132,200,2,139,252,228,227,227,96,185,0,0,152,255,255,255,88,0,80,32,22,0,64,0,225,131,210,7,209,134,201,4,200,130,40,252,228,227,227,227,64,106,0,0,1, + 0,0,0,236,20,1,0,48,21,1,0,72,64,1,0,0,0,0,0,53,1,48,32,225,210,10,201,136,201,6,200,132,200,2,139,252,228,227,227,88,49,1,0,144,173,1,0,155,255,255,255,0,0,0,0,200,21,1,0,255,255,255,255,87,0,48,32,225,210,10,201,136,201,6,200,132,200,2,139, + 252,228,227,227,96,185,0,0,152,255,255,255,97,0,48,32,225,210,10,201,136,201,6,200,132,200,2,139,252,228,227,227,96,185,0,0,152,255,255,255,54,0,112,16,225,131,200,130,36,252,228,227,64,106,0,0,1,0,0,0,132,30,1,0,24,31,1,0,112,64,1,0,0,0,0,0, + 3,1,80,32,20,0,0,0,225,210,10,201,136,201,6,200,132,200,2,139,252,228,227,227,96,185,0,0,152,255,255,255,62,0,64,8,20,0,64,0,225,129,252,228,45,0,80,8,39,0,0,0,225,129,252,228,96,185,0,0,232,255,255,255,7,1,0,8,228,0,0,0,12,0,0,8,228,0,0,0,110, + 0,64,32,73,0,64,0,225,131,210,8,201,134,201,4,200,130,42,252,228,227,227,227,40,0,80,16,20,0,64,0,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,176,51,1,0,192,51,1,0,152,64,1,0,0,0,0,0,118,0,80,8,111,0,0,0,225,129,252,228,96,185,0,0,232, + 255,255,255,38,0,112,16,225,131,34,252,228,227,227,227,64,106,0,0,1,0,0,0,68,57,1,0,156,57,1,0,28,64,1,0,0,0,0,0,46,0,64,24,34,0,128,1,226,1,65,212,3,228,2,65,212,3,228,227,24,0,128,8,12,0,64,0,22,0,64,0,225,129,228,227,45,0,160,25,226,1,65, + 212,3,228,2,65,212,3,228,227,57,0,128,32,29,0,192,1,52,0,192,1,226,3,67,208,130,38,228,3,67,208,130,38,228,227,227,227,54,0,160,16,226,2,66,36,228,227,227,227,64,0,160,16,226,5,69,209,4,230,40,228,120,0,224,33,226,3,67,208,130,38,228,2,67,208, + 130,38,228,227,227,227,106,0,64,32,61,0,0,2,226,8,72,230,230,230,42,228,4,72,230,230,230,42,228,227,55,0,128,16,19,0,128,0,22,0,128,0,226,1,65,212,3,228,227,227,52,0,64,24,33,0,64,1,226,2,66,36,228,2,66,36,228,227,227,227,85,0,64,32,55,0,192, + 1,226,3,67,208,130,38,228,5,67,208,130,38,228,227,227,227,119,1,64,40,246,0,64,2,226,10,74,230,230,230,230,44,228,8,74,230,230,230,230,44,228,227,227,227,76,0,96,25,226,2,66,36,228,2,66,36,228,227,227,227,130,0,64,40,110,0,64,2,226,7,71,210, + 70,230,230,42,228,13,71,210,70,230,230,42,228,227,227,227,156,0,64,32,42,0,192,1,226,6,70,230,230,40,228,10,70,230,230,40,228,227,227,227,60,0,64,32,52,0,192,1,226,3,67,208,130,38,228,8,67,208,130,38,228,227,227,227,54,0,64,32,43,0,192,1,226, + 3,67,208,130,38,228,3,67,208,130,38,228,227,227,227,50,0,160,25,226,4,68,230,38,228,1,68,230,38,228,227,124,0,64,40,39,0,64,2,226,7,71,210,70,230,230,42,228,192,35,71,210,70,230,230,42,228,227,227,36,0,128,16,16,0,128,0,33,0,128,0,226,2,66,36, + 228,227,227,227,43,0,64,16,38,0,128,0,226,1,65,212,3,228,227,227,73,0,64,24,44,0,64,1,226,2,66,36,228,4,66,36,228,227,227,227,27,0,160,16,226,2,66,36,228,227,227,227,143,0,64,24,78,0,128,1,226,4,68,230,38,228,1,68,230,38,228,227,108,0,96,25, + 226,2,66,36,228,5,66,36,228,227,227,227,135,0,128,40,51,0,64,2,127,0,64,2,226,10,74,230,230,230,230,44,228,1,74,230,230,230,230,44,228,227,227,227,51,0,160,16,226,6,70,230,230,40,228,227,150,0,64,40,117,0,128,2,226,9,73,210,8,230,230,230,44, + 228,6,73,210,8,230,230,230,44,228,227,93,0,128,32,36,0,0,2,86,0,0,2,226,8,72,230,230,230,42,228,1,72,230,230,230,42,228,227,50,0,160,42,226,6,70,210,69,209,4,230,40,228,192,34,70,210,69,209,4,230,40,228,15,0,160,16,226,1,65,212,3,228,227,227, + 11,0,160,16,226,1,65,212,3,228,227,227,43,0,64,16,35,0,128,0,226,4,68,230,38,228,227,227,16,0,64,16,11,0,128,0,226,2,66,36,228,227,227,227,34,0,160,16,226,3,67,208,130,38,228,227,35,0,64,16,25,0,128,0,226,4,68,230,38,228,227,227,29,0,160,16, + 226,3,67,208,130,38,228,227,35,0,128,16,18,0,128,0,31,0,128,0,226,4,68,230,38,228,227,227,50,0,160,24,226,9,73,210,8,230,230,230,44,228,227,227,127,0,64,40,51,0,64,2,226,7,71,209,134,230,230,42,228,3,71,209,134,230,230,42,228,227,227,227,0,0, + 0,0,80,84,0,0,0,0,0,0,176,226,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,200,226,1,0,240,226,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,248,249,1,0,0,0,0,0,255,255,255,255,0,0,0,0,24,0,0,0,96,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,250,1,0,0,0, + 0,0,255,255,255,255,0,0,0,0,24,0,0,0,112,83,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,84,0,0,0,0,0,0,56,227,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,88,227,1,0,200,226,1,0,240,226,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,250,1,0,0,0,0, + 0,255,255,255,255,0,0,0,0,24,0,0,0,216,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,84,0,0,0,0,0,0,160,227,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,184,227,1,0,240,226,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,250,1,0,0,0,0,0,255,255,255,255,0, + 0,0,0,24,0,0,0,8,168,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,255,255,255,205,93,32,210,102,212,255,255,50,162,223,45,153,43,0,0,2,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,0,0,0,0,0,0,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,0,0,0,0,0,0,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88, + 89,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,4,8,0,0,0,0,0,0,0,0,0,0,0,0,164,3,0,0,96,130,121,130,33,0,0,0,0,0,0,0,166,223,0,0,0,0,0,0,161,165,0,0,0,0,0,0,129,159,224,252,0,0,0,0,64,126,128,252,0,0,0,0,168,3,0,0,193,163,218,163,32,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,129,254,0,0,0,0,0,0,64,254,0,0,0,0,0,0,181,3,0,0,193,163,218,163,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,254,0,0,0,0,0,0,65,254,0,0,0,0,0,0,182,3,0,0,207,162,228,162,26,0,229,162,232,162,91,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,129,254,0,0,0,0,0,0,64,126,161,254,0,0,0,0,81,5,0,0,81,218,94,218,32,0,95,218,106,218,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,211,216,222,224,249,0,0,49,126,129,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,115,1,128,1, + 0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,246,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,246,1,128,1,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,246,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,246,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,246,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,248,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,118,1,128,1,0,0,0,128,119,1,128,1,0,0,0,144,106,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,128,245,1,128,1,0,0,0,48,240,1,128,1,0,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,2,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,8,0,0,0,130,120,1,128,1,0,0,0,117,152,0,0,254,255,255,255,168,248,1,128,1,0,0,0,68,7,2,128,1,0,0,0,68,7,2,128,1,0,0,0,68, + 7,2,128,1,0,0,0,68,7,2,128,1,0,0,0,68,7,2,128,1,0,0,0,68,7,2,128,1,0,0,0,68,7,2,128,1,0,0,0,68,7,2,128,1,0,0,0,68,7,2,128,1,0,0,0,127,127,127,127,127,127,127,127,172,248,1,128,1,0,0,0,72,7,2,128,1,0,0,0,72,7,2,128,1,0,0,0,72,7,2,128,1,0,0,0, + 72,7,2,128,1,0,0,0,72,7,2,128,1,0,0,0,72,7,2,128,1,0,0,0,72,7,2,128,1,0,0,0,46,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,212,190,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,192,80,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,98,97,100,95,97,108,108,111,99,64,115,116,100,64,64,0,0,0,0,0,192,80,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,101,120,99,101,112,116,105,111,110, + 64,115,116,100,64,64,0,0,0,0,0,192,80,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,98,97,100,95,97,114,114,97,121,95,110,101,119,95,108,101,110,103,116,104,64,115,116,100,64,64,0,0,192,80,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,98,97,100,95,101, + 120,99,101,112,116,105,111,110,64,115,116,100,64,64,0,192,80,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,116,121,112,101,95,105,110,102,111,64,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,64,1,128,1,0,0,0,204,64,1,128,1,0,0,0,216,64,1,128,1,0,0,0, + 228,64,1,128,1,0,0,0,240,64,1,128,1,0,0,0,252,64,1,128,1,0,0,0,8,65,1,128,1,0,0,0,20,65,1,128,1,0,0,0,0,0,0,0,0,0,0,0,140,65,1,128,1,0,0,0,152,65,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,132,212,1,0,64,16,0,0,20,215,1,0,64,17,0,0,28,215,1,0,96,18,0,0,84,215,1,0,124,18,0,0,96,215,1,0,128,18,0,0,104,215,1,0,212, + 18,0,0,136,215,1,0,48,19,0,0,64,217,1,0,80,19,0,0,76,217,1,0,128,19,0,0,92,217,1,0,160,19,0,0,108,217,1,0,0,20,0,0,116,217,1,0,0,21,0,0,124,217,1,0,96,21,0,0,132,217,1,0,128,22,0,0,32,219,1,0,144,22,0,0,64,219,1,0,224,22,0,0,48,219,1,0,32,23, + 0,0,40,219,1,0,96,23,0,0,32,219,1,0,112,23,0,0,24,219,1,0,176,23,0,0,24,219,1,0,240,23,0,0,56,219,1,0,64,24,0,0,40,219,1,0,128,24,0,0,204,220,1,0,48,25,0,0,240,220,1,0,72,25,0,0,252,220,1,0,128,25,0,0,180,221,1,0,32,27,0,0,244,222,1,0,80,31, + 0,0,252,222,1,0,128,31,0,0,124,223,1,0,56,32,0,0,144,223,1,0,152,32,0,0,160,223,1,0,80,33,0,0,176,223,1,0,52,34,0,0,204,223,1,0,12,35,0,0,216,223,1,0,12,36,0,0,228,223,1,0,236,37,0,0,248,223,1,0,148,39,0,0,16,224,1,0,112,40,0,0,36,224,1,0,64, + 41,0,0,56,224,1,0,148,42,0,0,80,224,1,0,112,48,0,0,108,224,1,0,160,49,0,0,124,224,1,0,168,51,0,0,152,224,1,0,48,54,0,0,176,224,1,0,32,55,0,0,200,224,1,0,248,55,0,0,224,224,1,0,212,56,0,0,240,224,1,0,196,58,0,0,12,225,1,0,176,59,0,0,32,225,1, + 0,96,60,0,0,48,225,1,0,144,61,0,0,68,225,1,0,8,62,0,0,169,0,224,0,176,62,0,0,80,225,1,0,236,64,0,0,100,225,1,0,156,66,0,0,116,225,1,0,184,68,0,0,148,225,1,0,132,69,0,0,160,225,1,0,220,71,0,0,188,225,1,0,80,73,0,0,216,225,1,0,36,74,0,0,240,225, + 1,0,96,74,0,0,252,225,1,0,140,74,0,0,8,226,1,0,56,75,0,0,24,226,1,0,120,75,0,0,40,226,1,0,60,76,0,0,24,226,1,0,124,76,0,0,52,226,1,0,84,77,0,0,77,0,224,0,168,77,0,0,68,226,1,0,28,78,0,0,80,226,1,0,168,78,0,0,100,226,1,0,112,79,0,0,116,226,1, + 0,112,81,0,0,200,210,1,0,184,81,0,0,52,211,1,0,136,82,0,0,141,0,66,1,24,83,0,0,68,211,1,0,112,83,0,0,77,0,65,1,224,83,0,0,81,0,66,1,96,84,0,0,89,0,65,1,216,84,0,0,89,0,65,1,48,85,0,0,84,211,1,0,88,85,0,0,84,211,1,0,128,85,0,0,65,0,65,1,192,85, + 0,0,92,211,1,0,0,87,0,0,164,211,1,0,176,87,0,0,105,0,192,0,24,88,0,0,8,212,1,0,192,89,0,0,81,0,195,1,16,90,0,0,217,0,66,1,232,90,0,0,141,0,192,0,16,92,0,0,205,0,66,4,224,92,0,0,173,0,68,2,144,93,0,0,145,0,192,0,32,94,0,0,141,0,64,1,176,94,0, + 0,109,3,201,6,48,98,0,0,213,0,66,2,64,99,0,0,61,0,192,0,160,99,0,0,60,212,1,0,120,100,0,0,104,212,1,0,216,100,0,0,65,0,65,1,24,101,0,0,101,0,192,0,128,101,0,0,77,0,65,1,208,101,0,0,116,212,1,0,120,102,0,0,133,0,70,2,0,103,0,0,45,0,192,0,48,103, + 0,0,69,0,192,0,120,103,0,0,61,0,192,0,184,103,0,0,37,0,192,0,224,103,0,0,69,0,192,0,40,104,0,0,37,0,192,0,104,104,0,0,101,0,66,1,208,104,0,0,101,0,66,1,112,105,0,0,185,0,67,3,64,106,0,0,113,2,201,3,184,108,0,0,129,0,69,2,56,109,0,0,69,0,65,1, + 128,109,0,0,117,0,67,2,248,109,0,0,13,1,72,3,8,111,0,0,140,212,1,0,192,111,0,0,160,212,1,0,32,113,0,0,33,0,192,0,64,113,0,0,45,0,65,1,112,113,0,0,33,0,192,0,144,113,0,0,45,0,65,1,192,113,0,0,89,0,65,1,24,114,0,0,180,212,1,0,128,114,0,0,133,0, + 68,2,8,115,0,0,196,212,1,0,128,115,0,0,20,213,1,0,72,116,0,0,244,212,1,0,192,116,0,0,4,213,1,0,104,117,0,0,161,0,196,1,8,118,0,0,61,0,65,1,72,118,0,0,65,0,65,1,168,118,0,0,69,0,192,0,240,118,0,0,45,0,192,0,32,119,0,0,33,0,192,0,64,119,0,0,37, + 0,192,0,104,119,0,0,37,0,192,0,144,119,0,0,76,213,1,0,160,122,0,0,53,0,192,0,240,122,0,0,33,0,192,0,16,123,0,0,85,0,65,1,112,123,0,0,37,0,192,0,160,123,0,0,81,0,66,1,240,123,0,0,101,0,65,1,88,124,0,0,45,0,192,0,136,124,0,0,77,0,192,0,216,124, + 0,0,37,0,192,0,0,125,0,0,37,0,192,0,40,125,0,0,33,0,192,0,72,125,0,0,89,0,65,1,176,125,0,0,84,213,1,0,64,126,0,0,120,213,1,0,232,126,0,0,61,0,192,0,40,127,0,0,168,213,1,0,144,127,0,0,180,213,1,0,120,128,0,0,240,213,1,0,136,129,0,0,36,214,1,0, + 208,129,0,0,161,1,196,2,112,131,0,0,121,0,65,1,232,131,0,0,85,2,200,2,120,134,0,0,84,214,1,0,192,134,0,0,73,1,199,2,8,136,0,0,112,214,1,0,104,136,0,0,148,214,1,0,16,137,0,0,141,0,66,1,160,137,0,0,93,0,66,1,0,138,0,0,93,0,66,1,96,138,0,0,168, + 214,1,0,168,139,0,0,81,0,66,1,248,139,0,0,89,0,66,1,120,140,0,0,188,214,1,0,168,142,0,0,149,0,65,1,64,143,0,0,205,0,192,0,16,144,0,0,85,0,192,0,104,144,0,0,37,1,196,2,208,145,0,0,165,0,65,1,120,146,0,0,201,0,194,3,64,147,0,0,113,0,66,1,176,147, + 0,0,204,214,1,0,72,148,0,0,220,214,1,0,48,149,0,0,129,0,194,1,176,149,0,0,233,6,201,3,208,156,0,0,236,214,1,0,248,156,0,0,244,214,1,0,104,157,0,0,205,0,194,3,216,158,0,0,36,215,1,0,72,159,0,0,168,215,1,0,136,159,0,0,121,0,65,1,0,160,0,0,73,0, + 65,1,72,160,0,0,176,215,1,0,112,160,0,0,5,1,196,1,120,161,0,0,121,0,66,1,200,162,0,0,81,0,194,1,24,163,0,0,65,0,193,1,88,163,0,0,188,215,1,0,48,165,0,0,173,0,68,2,224,165,0,0,24,216,1,0,8,168,0,0,89,0,65,1,96,168,0,0,193,0,66,1,40,169,0,0,116, + 216,1,0,48,170,0,0,41,1,196,1,88,171,0,0,140,216,1,0,72,173,0,0,200,216,1,0,48,174,0,0,240,216,1,0,208,176,0,0,8,217,1,0,16,182,0,0,217,0,201,3,232,182,0,0,40,217,1,0,96,185,0,0,61,0,192,0,224,185,0,0,140,217,1,0,104,186,0,0,137,0,69,2,240,186, + 0,0,113,0,69,2,160,187,0,0,109,0,195,1,16,188,0,0,85,0,192,0,168,188,0,0,141,0,195,1,56,189,0,0,241,0,200,2,40,190,0,0,113,0,66,1,152,190,0,0,109,0,65,1,16,191,0,0,152,217,1,0,16,193,0,0,129,0,196,1,144,193,0,0,117,0,69,2,96,194,0,0,57,0,192, + 0,176,194,0,0,85,0,192,0,16,195,0,0,65,0,65,1,80,195,0,0,176,217,1,0,72,196,0,0,192,217,1,0,8,197,0,0,237,0,195,1,248,197,0,0,89,0,66,1,80,198,0,0,208,217,1,0,32,199,0,0,53,0,65,1,88,199,0,0,117,0,66,1,208,199,0,0,197,0,192,2,152,200,0,0,237, + 0,64,2,136,201,0,0,224,217,1,0,216,201,0,0,4,218,1,0,48,202,0,0,40,218,1,0,160,202,0,0,76,218,1,0,48,203,0,0,112,218,1,0,128,203,0,0,77,0,66,1,208,203,0,0,5,1,71,6,216,204,0,0,81,1,73,3,48,206,0,0,77,0,192,0,128,206,0,0,41,0,192,0,176,206,0, + 0,121,0,66,1,40,207,0,0,148,218,1,0,192,209,0,0,177,0,65,2,112,210,0,0,133,0,65,1,248,210,0,0,168,218,1,0,184,211,0,0,208,218,1,0,152,213,0,0,224,218,1,0,176,215,0,0,244,218,1,0,248,216,0,0,105,0,65,1,96,217,0,0,197,0,195,1,40,218,0,0,97,0,66, + 1,192,218,0,0,80,219,1,0,176,219,0,0,109,0,66,1,32,220,0,0,101,0,192,2,160,220,0,0,53,0,64,1,216,220,0,0,100,219,1,0,176,223,0,0,164,219,1,0,40,224,0,0,189,0,65,3,232,224,0,0,181,0,196,1,160,225,0,0,101,0,64,2,8,226,0,0,200,219,1,0,216,226,0, + 0,236,219,1,0,0,228,0,0,37,1,200,2,48,229,0,0,125,0,196,1,224,229,0,0,61,0,64,1,32,230,0,0,49,0,192,0,80,230,0,0,49,0,192,0,128,230,0,0,105,0,65,1,72,231,0,0,61,0,66,1,136,231,0,0,185,0,195,1,80,232,0,0,201,0,194,2,24,233,0,0,16,220,1,0,136, + 235,0,0,40,220,1,0,64,237,0,0,56,220,1,0,16,239,0,0,72,220,1,0,176,240,0,0,92,220,1,0,240,243,0,0,120,220,1,0,8,245,0,0,140,220,1,0,80,246,0,0,149,0,195,2,232,246,0,0,169,0,196,1,88,249,0,0,65,1,196,1,152,250,0,0,9,1,64,2,160,251,0,0,85,0,65, + 1,248,251,0,0,85,0,65,1,80,252,0,0,89,0,65,1,168,252,0,0,89,0,65,1,16,253,0,0,53,0,64,1,72,253,0,0,152,220,1,0,216,253,0,0,129,0,193,1,88,254,0,0,169,0,195,1,0,255,0,0,188,220,1,0,16,0,1,0,4,221,1,0,200,0,1,0,205,0,196,1,152,1,1,0,209,0,196, + 1,104,2,1,0,89,1,69,2,192,3,1,0,81,0,65,1,16,4,1,0,24,221,1,0,136,4,1,0,129,0,66,1,8,5,1,0,153,0,192,0,160,5,1,0,241,0,196,1,144,6,1,0,217,0,199,2,104,7,1,0,109,0,196,1,216,7,1,0,64,221,1,0,248,8,1,0,124,221,1,0,184,10,1,0,173,0,199,3,104,11, + 1,0,152,221,1,0,144,14,1,0,41,0,192,0,184,14,1,0,169,0,192,1,96,15,1,0,188,221,1,0,32,16,1,0,61,0,192,0,96,16,1,0,224,221,1,0,224,19,1,0,252,221,1,0,64,21,1,0,44,222,1,0,24,26,1,0,88,222,1,0,120,27,1,0,88,222,1,0,216,28,1,0,116,222,1,0,96,30, + 1,0,144,222,1,0,56,31,1,0,97,0,65,1,152,31,1,0,133,0,192,0,48,32,1,0,180,222,1,0,64,36,1,0,212,222,1,0,56,37,1,0,224,222,1,0,0,38,1,0,185,0,66,2,184,38,1,0,85,0,192,0,16,39,1,0,205,0,196,1,224,39,1,0,153,0,70,2,120,40,1,0,53,1,66,1,176,41,1, + 0,149,0,66,1,72,42,1,0,129,1,195,1,200,43,1,0,25,0,128,0,224,43,1,0,33,0,192,0,0,44,1,0,25,0,128,0,40,44,1,0,109,1,196,1,48,46,1,0,213,0,68,2,8,47,1,0,81,0,193,1,88,47,1,0,4,223,1,0,16,49,1,0,69,0,64,1,88,49,1,0,145,0,69,2,232,49,1,0,117,0,65, + 3,96,50,1,0,205,0,195,1,48,51,1,0,28,223,1,0,208,51,1,0,68,223,1,0,168,53,1,0,109,0,65,1,24,54,1,0,253,0,69,2,72,55,1,0,253,0,196,1,72,56,1,0,217,0,192,1,32,57,1,0,88,223,1,0,20,58,1,0,32,211,1,0,52,58,1,0,152,211,1,0,92,58,1,0,152,211,1,0,132, + 58,1,0,252,211,1,0,168,58,1,0,48,212,1,0,232,58,1,0,92,212,1,0,28,59,1,0,232,212,1,0,188,59,1,0,60,213,1,0,204,60,1,0,152,211,1,0,244,60,1,0,72,214,1,0,32,61,1,0,24,214,1,0,108,61,1,0,72,215,1,0,160,61,1,0,88,216,1,0,208,61,1,0,100,216,1,0,144, + 62,1,0,252,211,1,0,180,62,1,0,12,216,1,0,240,62,1,0,152,211,1,0,24,63,1,0,152,211,1,0,64,63,1,0,88,216,1,0,112,63,1,0,72,214,1,0,156,63,1,0,72,214,1,0,200,63,1,0,72,214,1,0,244,63,1,0,152,211,1,0,28,64,1,0,72,214,1,0,72,64,1,0,152,211,1,0,112, + 64,1,0,152,211,1,0,152,64,1,0,152,211,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,16,0,0,0,24,0, + 0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,48,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,9,4,0,0,72,0,0,0,96,48,2,0,40,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,5,52,0,0,0,86,0,83,0,95,0,86,0,69,0,82,0,83,0,73,0,79,0,78,0,95,0,73,0,78,0,70,0, + 79,0,0,0,0,0,189,4,239,254,0,0,1,0,0,0,1,0,46,0,61,9,0,0,1,0,46,0,61,9,63,0,0,0,0,0,0,0,4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,4,0,0,1,0,83,0,116,0,114,0,105,0,110,0,103,0,70,0,105,0,108,0,101,0,73,0,110,0,102,0,111,0,0,0,100,4,0,0,1,0, + 48,0,52,0,48,0,57,0,48,0,52,0,98,0,48,0,0,0,76,0,22,0,1,0,67,0,111,0,109,0,112,0,97,0,110,0,121,0,78,0,97,0,109,0,101,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111, + 0,110,0,0,0,134,0,47,0,1,0,70,0,105,0,108,0,101,0,68,0,101,0,115,0,99,0,114,0,105,0,112,0,116,0,105,0,111,0,110,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,69,0,100,0,103,0,101,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0, + 101,0,100,0,32,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,32,0,76,0,111,0,97,0,100,0,101,0,114,0,0,0,0,0,56,0,12,0,1,0,70,0,105,0,108,0,101,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,0,0,0,0,49,0,46, + 0,48,0,46,0,50,0,51,0,54,0,53,0,46,0,52,0,54,0,0,0,70,0,19,0,1,0,73,0,110,0,116,0,101,0,114,0,110,0,97,0,108,0,78,0,97,0,109,0,101,0,0,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,76,0,111,0,97,0,100,0,101,0,114,0,46,0,100,0,108,0,108,0,0,0, + 0,0,144,0,54,0,1,0,76,0,101,0,103,0,97,0,108,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,0,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,67,0,111,0,114,0,112,0, + 111,0,114,0,97,0,116,0,105,0,111,0,110,0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,0,78,0,19,0,1,0,79,0,114,0,105,0,103,0,105,0,110,0,97,0,108,0,70,0,105,0, + 108,0,101,0,110,0,97,0,109,0,101,0,0,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,76,0,111,0,97,0,100,0,101,0,114,0,46,0,100,0,108,0,108,0,0,0,0,0,126,0,47,0,1,0,80,0,114,0,111,0,100,0,117,0,99,0,116,0,78,0,97,0,109,0,101,0,0,0,0,0,77,0,105, + 0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,69,0,100,0,103,0,101,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,32,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,32,0,76,0,111,0,97,0,100,0,101, + 0,114,0,0,0,0,0,60,0,12,0,1,0,80,0,114,0,111,0,100,0,117,0,99,0,116,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,0,0,49,0,46,0,48,0,46,0,50,0,51,0,54,0,53,0,46,0,52,0,54,0,0,0,60,0,10,0,1,0,67,0,111,0,109,0,112,0,97,0,110,0,121,0,83,0,104,0,111, + 0,114,0,116,0,78,0,97,0,109,0,101,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,0,0,134,0,47,0,1,0,80,0,114,0,111,0,100,0,117,0,99,0,116,0,83,0,104,0,111,0,114,0,116,0,78,0,97,0,109,0,101,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111, + 0,102,0,116,0,32,0,69,0,100,0,103,0,101,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,32,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,32,0,76,0,111,0,97,0,100,0,101,0,114,0,0,0,0,0,110,0,41,0, + 1,0,76,0,97,0,115,0,116,0,67,0,104,0,97,0,110,0,103,0,101,0,0,0,52,0,56,0,100,0,49,0,56,0,99,0,98,0,55,0,48,0,49,0,97,0,101,0,50,0,102,0,97,0,57,0,50,0,48,0,52,0,57,0,98,0,57,0,54,0,56,0,97,0,98,0,54,0,99,0,49,0,52,0,53,0,55,0,50,0,50,0,100, + 0,49,0,48,0,101,0,49,0,50,0,0,0,0,0,40,0,2,0,1,0,79,0,102,0,102,0,105,0,99,0,105,0,97,0,108,0,32,0,66,0,117,0,105,0,108,0,100,0,0,0,49,0,0,0,68,0,0,0,1,0,86,0,97,0,114,0,70,0,105,0,108,0,101,0,73,0,110,0,102,0,111,0,0,0,0,0,36,0,4,0,0,0,84,0, + 114,0,97,0,110,0,115,0,108,0,97,0,116,0,105,0,111,0,110,0,0,0,0,0,9,4,176,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,1,0,72,1,0,0,48,160,56,160,64,160,96,160,104,160,112,160,136,160,144,160,152,160,184,160,192,160,120,161,144,161,152,161,160,161,80,162,88,162,8,163,16,163,32,163, + 48,163,56,163,64,163,72,163,80,163,88,163,96,163,104,163,120,163,128,163,136,163,144,163,152,163,160,163,168,163,176,163,200,163,216,163,232,163,240,163,248,163,0,164,8,164,216,165,224,165,232,165,0,166,16,166,32,166,48,166,64,166,80,166,96, + 166,112,166,128,166,144,166,160,166,176,166,192,166,208,166,224,166,240,166,0,167,16,167,32,167,48,167,64,167,80,167,96,167,112,167,128,167,144,167,160,167,176,167,192,167,208,167,224,167,240,167,0,168,16,168,32,168,48,168,64,168,80,168,96,168, + 112,168,128,168,144,168,160,168,176,168,192,168,208,168,224,168,240,168,0,169,16,169,32,169,48,169,64,169,80,169,96,169,112,169,128,169,144,169,160,169,176,169,192,169,208,169,224,169,240,169,0,170,16,170,32,170,48,170,64,170,80,170,96,170,112, + 170,128,170,144,170,160,170,176,170,192,170,208,170,224,170,240,170,0,171,16,171,32,171,48,171,64,171,80,171,96,171,112,171,128,171,144,171,160,171,176,171,192,171,208,171,224,171,240,171,0,172,16,172,32,172,48,172,64,172,80,172,96,172,112,172, + 128,172,144,172,160,172,176,172,192,172,208,172,224,172,240,172,0,173,0,0,0,96,1,0,224,0,0,0,224,163,232,163,240,163,248,163,0,164,8,164,16,164,24,164,32,164,40,164,48,164,56,164,64,164,72,164,80,164,88,164,96,164,104,164,112,164,120,164,128, + 164,144,170,152,170,160,170,168,170,176,170,184,170,192,170,200,170,208,170,216,170,224,170,232,170,240,170,248,170,0,171,8,171,16,171,24,171,32,171,40,171,48,171,56,171,64,171,72,171,80,171,88,171,96,171,104,171,112,171,120,171,128,171,136, + 171,144,171,152,171,160,171,168,171,176,171,184,171,192,171,200,171,208,171,216,171,224,171,240,171,248,171,0,172,8,172,16,172,24,172,32,172,40,172,48,172,56,172,64,172,72,172,80,172,88,172,96,172,104,172,112,172,120,172,128,172,136,172,144, + 172,152,172,160,172,168,172,176,172,184,172,192,172,200,172,208,172,216,172,224,172,232,172,240,172,248,172,0,173,8,173,16,173,24,173,32,173,40,173,48,173,56,173,64,173,72,173,0,112,1,0,184,0,0,0,152,170,168,170,184,170,200,170,216,170,232,170, + 248,170,8,171,24,171,40,171,56,171,72,171,88,171,104,171,120,171,136,171,152,171,168,171,184,171,200,171,216,171,232,171,248,171,8,172,24,172,40,172,56,172,72,172,88,172,104,172,120,172,136,172,152,172,168,172,184,172,200,172,216,172,232,172, + 248,172,8,173,24,173,40,173,56,173,72,173,88,173,104,173,120,173,136,173,152,173,168,173,184,173,200,173,216,173,232,173,248,173,8,174,24,174,40,174,56,174,72,174,88,174,104,174,120,174,136,174,152,174,168,174,184,174,200,174,216,174,232,174, + 248,174,8,175,24,175,40,175,56,175,72,175,88,175,104,175,120,175,136,175,152,175,168,175,184,175,200,175,216,175,232,175,248,175,0,0,0,128,1,0,36,1,0,0,8,160,24,160,40,160,56,160,72,160,88,160,104,160,120,160,136,160,152,160,168,160,184,160, + 200,160,216,160,232,160,248,160,8,161,24,161,40,161,56,161,72,161,88,161,104,161,120,161,136,161,152,161,168,161,184,161,200,161,216,161,232,161,248,161,8,162,24,162,40,162,56,162,72,162,88,162,104,162,120,162,136,162,152,162,168,162,184,162, + 200,162,216,162,232,162,248,162,8,163,24,163,40,163,56,163,72,163,88,163,104,163,120,163,136,163,152,163,168,163,184,163,200,163,216,163,232,163,248,163,8,164,24,164,40,164,56,164,72,164,88,164,104,164,120,164,136,164,152,164,168,164,184,164, + 200,164,216,164,232,164,248,164,8,165,24,165,40,165,56,165,72,165,88,165,104,165,120,165,136,165,152,165,168,165,184,165,200,165,216,165,232,165,248,165,8,166,24,166,40,166,56,166,72,166,88,166,104,166,120,166,136,166,152,166,168,166,184,166, + 200,166,216,166,232,166,248,166,8,167,24,167,40,167,56,167,72,167,88,167,104,167,120,167,136,167,152,167,168,167,184,167,200,167,216,167,232,167,248,167,8,168,24,168,40,168,56,168,72,168,88,168,104,168,120,168,136,168,152,168,168,168,184,168, + 200,168,0,0,0,144,1,0,108,1,0,0,240,164,0,165,16,165,32,165,48,165,64,165,80,165,96,165,112,165,128,165,144,165,160,165,176,165,192,165,208,165,224,165,240,165,0,166,16,166,32,166,48,166,64,166,80,166,96,166,112,166,128,166,144,166,160,166,176, + 166,192,166,208,166,224,166,240,166,0,167,16,167,32,167,48,167,64,167,80,167,96,167,112,167,128,167,144,167,160,167,176,167,192,167,208,167,224,167,240,167,0,168,16,168,32,168,48,168,64,168,80,168,96,168,112,168,128,168,144,168,160,168,176,168, + 192,168,208,168,224,168,240,168,0,169,16,169,32,169,48,169,64,169,80,169,96,169,112,169,128,169,144,169,160,169,176,169,192,169,208,169,224,169,240,169,0,170,16,170,32,170,48,170,64,170,80,170,96,170,112,170,128,170,144,170,160,170,176,170,192, + 170,208,170,224,170,240,170,0,171,16,171,32,171,48,171,64,171,80,171,96,171,112,171,128,171,144,171,160,171,176,171,192,171,208,171,224,171,240,171,0,172,16,172,32,172,48,172,64,172,80,172,96,172,112,172,128,172,144,172,160,172,176,172,192,172, + 208,172,224,172,240,172,0,173,16,173,32,173,48,173,64,173,80,173,96,173,112,173,128,173,144,173,160,173,176,173,192,173,208,173,224,173,240,173,0,174,16,174,32,174,48,174,64,174,80,174,96,174,112,174,128,174,144,174,160,174,176,174,192,174,208, + 174,224,174,240,174,0,175,16,175,32,175,48,175,64,175,80,175,96,175,112,175,128,175,144,175,160,175,176,175,192,175,208,175,224,175,240,175,0,0,0,160,1,0,136,0,0,0,0,160,16,160,32,160,48,160,64,160,80,160,96,160,112,160,128,160,144,160,160,160, + 176,160,192,160,208,160,224,160,240,160,0,161,16,161,32,161,48,161,64,161,80,161,96,161,112,161,128,161,144,161,160,161,176,161,192,161,208,161,224,161,240,161,0,162,16,162,32,162,48,162,64,162,80,162,96,162,112,162,128,162,144,162,160,162,176, + 162,192,162,208,162,224,162,240,162,0,163,16,163,32,163,184,173,192,173,224,173,232,173,240,173,248,173,0,174,16,174,24,174,32,174,40,174,48,174,0,0,0,176,1,0,16,0,0,0,168,171,176,171,184,171,192,171,0,192,1,0,24,0,0,0,160,164,168,164,184,164, + 216,164,224,164,8,165,16,165,24,165,0,240,1,0,104,0,0,0,128,165,200,165,232,165,8,166,40,166,72,166,120,166,144,166,152,166,160,166,216,166,224,166,0,168,16,168,24,168,32,168,40,168,48,168,56,168,64,168,72,168,80,168,88,168,104,168,112,168,120, + 168,128,168,136,168,144,168,152,168,160,168,192,169,248,169,32,170,72,170,120,170,160,170,208,170,216,170,224,170,232,170,240,170,248,170,0,171,8,171,24,171,32,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,232,39,0,0,0,2,2,0,48,130,39,215,6,9,42,134,72, + 134,247,13,1,7,2,160,130,39,200,48,130,39,196,2,1,1,49,15,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,48,92,6,10,43,6,1,4,1,130,55,2,1,4,160,78,48,76,48,23,6,10,43,6,1,4,1,130,55,2,1,15,48,9,3,1,0,160,4,162,2,128,0,48,49,48,13,6,9,96,134,72,1,101, + 3,4,2,1,5,0,4,32,83,49,22,34,225,40,117,81,106,28,87,65,233,140,37,107,55,173,237,230,4,217,113,176,253,126,13,16,97,137,47,175,160,130,13,133,48,130,6,3,48,130,3,235,160,3,2,1,2,2,19,51,0,0,3,164,203,227,86,184,203,127,228,39,0,0,0,0,3,164, + 48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,126,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105, + 99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,40,48,38,6,3,85,4,3,19,31,77,105,99,114,111,115,111,102,116,32,67,111,100,101,32,83,105,103,110,105,110,103,32,80,67,65,32,50,48,49,49,48,30,23,13,50,51,49,48,49,57,49, + 57,53,49,53,53,90,23,13,50,52,49,48,49,54,49,57,53,49,53,53,90,48,116,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3, + 85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,30,48,28,6,3,85,4,3,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,48,130,1,34,48,13,6,9,42,134,72,134,247, + 13,1,1,1,5,0,3,130,1,15,0,48,130,1,10,2,130,1,1,0,219,186,45,50,154,234,129,89,235,136,249,215,63,101,133,20,5,217,106,22,213,220,217,220,142,109,201,11,120,196,114,216,99,247,176,230,190,221,248,180,155,79,177,239,233,148,142,168,175,107,101, + 215,84,32,232,248,236,243,51,238,229,44,87,74,113,108,121,230,157,104,57,39,180,237,106,36,182,216,193,16,114,106,250,186,227,190,105,146,100,143,32,161,22,126,135,155,107,176,18,159,76,210,51,136,42,63,137,109,135,208,214,161,139,70,80,25,202, + 59,183,85,229,66,33,250,79,80,6,5,88,183,222,189,122,212,78,224,1,82,192,188,83,62,30,184,202,2,80,95,193,33,136,223,171,100,216,168,15,141,212,221,24,185,202,11,177,144,191,238,71,227,75,252,228,151,59,121,223,130,112,135,141,1,47,216,223,173, + 225,236,233,220,124,137,119,178,164,80,176,194,131,138,67,33,147,122,104,214,196,96,2,109,19,88,9,191,85,145,71,141,28,150,198,55,36,220,176,150,168,61,125,213,139,115,4,47,253,43,203,87,225,174,250,144,110,121,144,3,46,232,149,73,197,203,51, + 160,182,181,2,3,1,0,1,163,130,1,130,48,130,1,126,48,31,6,3,85,29,37,4,24,48,22,6,10,43,6,1,4,1,130,55,10,3,21,6,8,43,6,1,5,5,7,3,3,48,29,6,3,85,29,14,4,22,4,20,226,195,165,151,136,221,111,57,242,153,145,5,120,7,200,252,136,142,168,85,48,84,6, + 3,85,29,17,4,77,48,75,164,73,48,71,49,45,48,43,6,3,85,4,11,19,36,77,105,99,114,111,115,111,102,116,32,73,114,101,108,97,110,100,32,79,112,101,114,97,116,105,111,110,115,32,76,105,109,105,116,101,100,49,22,48,20,6,3,85,4,5,19,13,50,51,48,50,49, + 55,43,53,48,49,54,55,49,48,31,6,3,85,29,35,4,24,48,22,128,20,72,110,100,229,80,5,211,130,170,23,55,55,34,181,109,168,202,117,2,149,48,84,6,3,85,29,31,4,77,48,75,48,73,160,71,160,69,134,67,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114, + 111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,114,108,47,77,105,99,67,111,100,83,105,103,80,67,65,50,48,49,49,95,50,48,49,49,45,48,55,45,48,56,46,99,114,108,48,97,6,8,43,6,1,5,5,7,1,1,4,85,48,83,48,81,6,8,43,6,1,5,5,7,48, + 2,134,69,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,101,114,116,115,47,77,105,99,67,111,100,83,105,103,80,67,65,50,48,49,49,95,50,48,49,49,45,48,55,45,48,56,46,99, + 114,116,48,12,6,3,85,29,19,1,1,255,4,2,48,0,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,122,220,16,76,109,248,84,226,112,43,238,135,93,145,91,111,246,36,81,233,70,98,171,9,118,222,171,130,79,218,210,84,76,85,221,97,49,52,158,200,247, + 61,104,254,139,205,78,66,255,220,69,233,86,38,162,9,23,71,194,16,135,235,61,235,83,197,3,49,196,94,15,7,166,113,249,206,93,198,64,175,64,212,217,86,163,91,12,40,207,185,88,235,58,147,31,207,68,73,211,165,28,240,217,97,180,133,90,157,127,103, + 8,172,219,184,69,49,248,167,9,170,194,229,232,69,154,39,111,174,38,146,146,211,147,56,12,218,139,66,171,147,200,6,252,4,210,109,235,175,127,222,39,202,90,64,113,132,51,38,52,150,212,200,88,36,183,192,3,174,174,33,184,89,210,139,11,42,145,249, + 184,138,202,100,65,96,217,44,141,248,206,196,216,14,58,174,168,201,186,89,137,175,2,232,74,19,226,62,89,134,130,85,72,4,238,80,31,108,125,183,63,54,100,126,245,142,171,4,14,237,67,27,14,153,84,110,47,116,180,151,209,157,111,194,231,144,133,8, + 97,135,38,42,55,179,225,249,48,8,79,217,100,216,14,170,209,227,100,171,84,209,16,113,37,230,231,185,229,180,123,254,41,134,194,175,14,31,53,239,128,14,152,37,247,48,128,120,48,35,112,178,51,138,248,131,201,35,197,214,196,180,247,190,98,222,178, + 10,209,35,78,50,177,87,50,250,199,35,238,130,218,100,136,211,178,209,178,103,153,215,24,97,194,236,39,22,222,230,104,130,173,159,210,103,62,110,27,170,20,169,229,1,166,84,206,12,168,180,95,54,225,217,135,127,97,19,151,14,15,136,142,169,80,174, + 199,144,236,56,78,89,56,28,226,188,190,44,21,65,112,76,91,145,194,78,167,209,30,117,49,156,231,225,162,41,254,153,149,195,95,114,59,198,231,82,116,181,124,174,2,108,96,229,144,43,114,232,154,226,203,190,26,166,93,138,246,151,228,160,178,204, + 189,9,14,162,133,12,44,180,78,135,252,230,48,40,109,208,173,188,251,71,54,97,38,190,137,244,145,125,6,7,50,10,217,179,54,55,211,235,9,114,153,195,38,199,242,29,86,150,65,142,60,211,91,64,233,68,161,206,255,47,232,200,235,26,144,183,48,130,7, + 122,48,130,5,98,160,3,2,1,2,2,10,97,14,144,210,0,0,0,0,0,3,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,129,136,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82, + 101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,50,48,48,6,3,85,4,3,19,41,77,105,99,114,111,115,111,102,116,32,82,111,111,116,32,67,101,114,116,105,102,105, + 99,97,116,101,32,65,117,116,104,111,114,105,116,121,32,50,48,49,49,48,30,23,13,49,49,48,55,48,56,50,48,53,57,48,57,90,23,13,50,54,48,55,48,56,50,49,48,57,48,57,90,48,126,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115, + 104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,40,48,38,6,3,85,4,3,19,31,77,105,99,114,111,115, + 111,102,116,32,67,111,100,101,32,83,105,103,110,105,110,103,32,80,67,65,32,50,48,49,49,48,130,2,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,2,15,0,48,130,2,10,2,130,2,1,0,171,240,250,114,16,28,46,173,216,110,170,130,16,77,52,186,242,182, + 88,33,159,66,27,42,107,233,90,80,170,184,6,56,26,4,73,186,127,195,12,30,221,55,107,198,18,216,11,240,56,194,153,6,176,200,57,213,1,20,49,66,211,137,13,121,100,135,126,148,96,36,108,175,158,73,156,233,104,94,210,223,155,83,178,10,44,195,175,217, + 169,43,174,122,9,175,215,150,89,202,96,26,5,233,102,118,232,50,82,38,18,47,231,171,8,80,207,179,68,183,93,216,196,46,3,117,171,104,243,203,109,243,58,92,161,22,244,70,186,224,56,100,172,110,100,53,120,166,160,99,15,45,211,64,147,248,227,222, + 7,13,213,92,121,165,73,41,231,13,190,160,19,119,190,148,61,239,251,227,43,90,16,31,77,86,40,162,122,114,224,18,58,183,73,94,216,237,237,67,145,131,217,123,178,123,134,27,217,62,177,140,93,232,137,79,132,26,242,161,47,89,228,144,59,45,174,51, + 88,197,183,62,254,50,211,179,3,61,177,178,175,146,56,126,210,157,128,44,245,78,86,145,33,53,37,195,57,110,100,127,83,186,156,15,173,25,35,132,203,244,186,3,134,141,247,95,240,208,82,191,140,148,135,188,192,33,116,37,95,24,40,182,204,39,40,56, + 37,152,57,74,54,207,124,177,146,174,28,35,167,169,102,236,97,31,106,225,40,73,157,95,136,226,37,93,211,33,75,62,82,196,181,87,63,36,3,240,209,122,91,47,213,35,227,112,93,15,81,70,119,179,248,0,225,188,172,2,130,95,219,192,21,179,189,27,212,85, + 75,231,57,161,15,233,35,73,188,24,184,68,124,69,228,193,195,114,122,224,114,231,36,223,191,70,153,197,239,194,28,87,219,131,141,236,77,73,48,167,171,142,223,236,91,159,175,252,221,176,102,226,193,151,129,123,237,214,237,75,231,73,41,167,19,40, + 166,167,125,103,128,230,138,98,120,95,178,47,132,215,87,156,92,191,119,40,40,241,237,109,195,40,143,44,143,64,55,79,193,225,133,68,137,196,9,76,197,212,165,67,47,116,149,247,110,248,120,32,88,44,19,93,96,149,154,62,79,51,132,218,176,136,23,222, + 158,78,244,150,176,188,70,160,108,152,210,224,214,136,140,11,2,3,1,0,1,163,130,1,237,48,130,1,233,48,16,6,9,43,6,1,4,1,130,55,21,1,4,3,2,1,0,48,29,6,3,85,29,14,4,22,4,20,72,110,100,229,80,5,211,130,170,23,55,55,34,181,109,168,202,117,2,149,48, + 25,6,9,43,6,1,4,1,130,55,20,2,4,12,30,10,0,83,0,117,0,98,0,67,0,65,48,11,6,3,85,29,15,4,4,3,2,1,134,48,15,6,3,85,29,19,1,1,255,4,5,48,3,1,1,255,48,31,6,3,85,29,35,4,24,48,22,128,20,114,45,58,2,49,144,67,185,20,5,78,225,234,167,199,49,209,35, + 137,52,48,90,6,3,85,29,31,4,83,48,81,48,79,160,77,160,75,134,73,104,116,116,112,58,47,47,99,114,108,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,47,99,114,108,47,112,114,111,100,117,99,116,115,47,77,105,99,82,111,111,67, + 101,114,65,117,116,50,48,49,49,95,50,48,49,49,95,48,51,95,50,50,46,99,114,108,48,94,6,8,43,6,1,5,5,7,1,1,4,82,48,80,48,78,6,8,43,6,1,5,5,7,48,2,134,66,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47, + 112,107,105,47,99,101,114,116,115,47,77,105,99,82,111,111,67,101,114,65,117,116,50,48,49,49,95,50,48,49,49,95,48,51,95,50,50,46,99,114,116,48,129,159,6,3,85,29,32,4,129,151,48,129,148,48,129,145,6,9,43,6,1,4,1,130,55,46,3,48,129,131,48,63,6, + 8,43,6,1,5,5,7,2,1,22,51,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,100,111,99,115,47,112,114,105,109,97,114,121,99,112,115,46,104,116,109,48,64,6,8,43,6,1,5,5,7,2,2, + 48,52,30,50,32,29,0,76,0,101,0,103,0,97,0,108,0,95,0,112,0,111,0,108,0,105,0,99,0,121,0,95,0,115,0,116,0,97,0,116,0,101,0,109,0,101,0,110,0,116,0,46,32,29,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,103,242,134,165,152,224,84,121,26, + 46,211,216,116,103,34,155,11,150,17,225,99,146,153,66,150,125,210,121,12,144,193,101,95,46,44,62,248,195,114,209,109,131,254,190,63,232,10,202,59,191,71,169,163,243,105,219,99,191,34,53,165,151,93,101,132,144,125,139,70,80,85,216,12,146,124, + 210,26,75,28,243,60,66,139,82,208,176,253,107,227,62,7,46,41,155,230,61,27,165,212,181,29,119,148,57,226,233,100,201,68,61,120,122,35,243,19,125,166,144,116,131,141,244,203,38,2,70,42,194,138,16,187,164,169,5,12,155,237,104,250,104,46,149,160, + 42,63,42,107,88,73,99,31,9,105,110,90,152,150,228,131,244,192,143,243,70,43,222,252,59,208,189,53,239,110,37,174,229,175,39,237,208,221,243,14,175,153,40,151,152,77,14,61,11,242,8,137,214,31,195,50,24,226,240,197,45,206,91,158,180,73,57,10,198, + 10,194,198,173,174,229,178,217,219,21,136,81,69,88,56,50,113,39,26,127,177,244,39,248,222,44,58,32,105,152,178,89,137,104,110,111,167,183,116,195,64,5,6,166,1,42,40,62,130,63,19,77,102,11,192,179,77,245,225,143,127,28,111,21,125,69,167,118,229, + 64,42,101,163,195,93,82,98,134,195,29,99,54,151,134,223,218,243,248,242,22,161,154,39,225,205,165,151,208,238,93,99,65,227,91,7,156,135,62,6,119,6,209,6,177,117,31,20,190,97,97,181,240,220,198,27,4,190,223,65,199,14,40,238,222,101,47,236,151, + 246,161,92,150,216,0,214,161,70,189,89,243,151,165,9,75,72,16,153,128,31,208,0,41,197,177,155,165,63,69,119,30,53,198,210,162,162,159,122,122,34,250,72,149,31,171,251,71,35,128,245,158,248,191,107,183,75,151,226,235,117,120,26,236,234,55,153, + 121,24,75,255,214,179,35,104,117,230,175,250,252,139,235,11,128,234,105,59,175,252,48,237,4,76,142,223,223,117,109,99,145,61,209,157,86,78,79,191,128,87,34,161,120,17,50,33,122,239,65,10,177,63,251,168,204,164,93,193,161,136,155,87,113,86,78, + 72,69,192,66,201,155,118,91,10,128,72,107,253,121,159,193,189,109,109,106,201,82,115,19,13,122,80,205,49,130,25,197,48,130,25,193,2,1,1,48,129,149,48,126,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103, + 116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,40,48,38,6,3,85,4,3,19,31,77,105,99,114,111,115,111,102,116,32, + 67,111,100,101,32,83,105,103,110,105,110,103,32,80,67,65,32,50,48,49,49,2,19,51,0,0,3,164,203,227,86,184,203,127,228,39,0,0,0,0,3,164,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,160,129,212,48,25,6,9,42,134,72,134,247,13,1,9,3,49,12,6,10,43,6,1,4, + 1,130,55,2,1,4,48,28,6,10,43,6,1,4,1,130,55,2,1,11,49,14,48,12,6,10,43,6,1,4,1,130,55,2,1,21,48,47,6,9,42,134,72,134,247,13,1,9,4,49,34,4,32,238,215,210,46,252,165,190,63,241,22,207,10,184,30,235,157,183,136,165,41,166,40,40,198,128,57,115,87, + 81,74,237,2,48,104,6,10,43,6,1,4,1,130,55,2,1,12,49,90,48,88,160,56,128,54,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,69,0,100,0,103,0,101,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,32,0,83,0,68,0,75,161,28,128,26,104, + 116,116,112,115,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,32,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,4,130,1,0,7,51,21,57,61,69,43,192,175,81,166,68,37,152,75,99,30,95,214,153,207,12,134,212,33,137,150,209,108, + 84,100,66,228,106,63,4,164,137,231,66,246,168,183,215,48,42,16,123,19,51,127,103,170,211,67,33,86,102,253,107,219,73,243,73,131,126,116,147,40,158,247,246,178,207,100,169,213,182,11,54,95,130,39,217,179,152,73,143,15,124,173,103,119,106,26,161, + 73,63,199,57,52,108,32,118,41,193,14,141,220,57,216,150,54,126,194,152,200,234,23,234,78,138,115,95,121,122,26,38,242,56,4,227,196,117,27,139,7,119,115,18,151,113,233,12,226,121,13,38,112,171,67,177,82,248,248,73,29,127,33,72,208,114,28,241, + 198,247,175,218,24,232,156,71,27,34,176,114,95,77,146,206,65,73,43,122,140,5,98,99,113,144,209,93,245,7,151,34,148,208,191,43,39,218,181,31,48,140,74,165,172,98,97,152,244,180,40,251,29,142,167,85,32,109,195,248,184,66,233,246,250,220,201,149, + 143,171,18,81,147,97,195,145,50,253,151,32,92,122,245,30,66,166,62,226,192,177,36,105,161,130,23,41,48,130,23,37,6,10,43,6,1,4,1,130,55,3,3,1,49,130,23,21,48,130,23,17,6,9,42,134,72,134,247,13,1,7,2,160,130,23,2,48,130,22,254,2,1,3,49,15,48, + 13,6,9,96,134,72,1,101,3,4,2,1,5,0,48,130,1,89,6,11,42,134,72,134,247,13,1,9,16,1,4,160,130,1,72,4,130,1,68,48,130,1,64,2,1,1,6,10,43,6,1,4,1,132,89,10,3,1,48,49,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,4,32,85,222,115,171,191,149,39,179,250,177, + 243,114,25,117,231,248,76,246,143,84,15,38,14,86,176,1,141,241,159,241,123,134,2,6,101,186,159,255,244,49,24,19,50,48,50,52,48,50,50,48,48,56,49,56,52,56,46,56,55,49,90,48,4,128,2,1,244,160,129,216,164,129,213,48,129,210,49,11,48,9,6,3,85,4, + 6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110, + 49,45,48,43,6,3,85,4,11,19,36,77,105,99,114,111,115,111,102,116,32,73,114,101,108,97,110,100,32,79,112,101,114,97,116,105,111,110,115,32,76,105,109,105,116,101,100,49,38,48,36,6,3,85,4,11,19,29,84,104,97,108,101,115,32,84,83,83,32,69,83,78,58, + 48,56,52,50,45,52,66,69,54,45,67,50,57,65,49,37,48,35,6,3,85,4,3,19,28,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,83,101,114,118,105,99,101,160,130,17,120,48,130,7,39,48,130,5,15,160,3,2,1,2,2,19,51,0,0,1,218, + 142,213,201,90,0,209,17,177,0,1,0,0,1,218,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110, + 100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50,48,49,48, + 48,30,23,13,50,51,49,48,49,50,49,57,48,54,53,57,90,23,13,50,53,48,49,49,48,49,57,48,54,53,57,90,48,129,210,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101, + 100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,45,48,43,6,3,85,4,11,19,36,77,105,99,114,111,115,111,102,116,32,73,114,101,108,97,110,100,32,79,112,101,114,97, + 116,105,111,110,115,32,76,105,109,105,116,101,100,49,38,48,36,6,3,85,4,11,19,29,84,104,97,108,101,115,32,84,83,83,32,69,83,78,58,48,56,52,50,45,52,66,69,54,45,67,50,57,65,49,37,48,35,6,3,85,4,3,19,28,77,105,99,114,111,115,111,102,116,32,84,105, + 109,101,45,83,116,97,109,112,32,83,101,114,118,105,99,101,48,130,2,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,2,15,0,48,130,2,10,2,130,2,1,0,147,144,6,8,118,181,81,81,214,63,35,64,14,13,13,255,27,113,90,215,72,221,60,208,35,74,61,36,40, + 237,46,123,176,41,207,83,65,74,23,142,240,216,190,170,30,220,38,224,73,194,148,93,156,174,229,197,167,249,123,62,147,16,131,110,68,237,127,49,14,107,241,175,192,65,19,168,128,72,3,194,126,180,222,110,235,192,177,149,156,37,136,114,238,154,224, + 10,224,95,236,232,157,94,152,44,91,92,188,167,165,108,238,192,246,106,234,127,210,235,222,99,23,151,148,171,108,62,51,2,166,81,228,147,70,218,248,120,11,134,141,9,235,194,157,142,45,195,51,98,185,247,1,242,247,26,237,177,130,190,95,215,171,108, + 49,153,218,105,151,223,190,185,105,46,80,239,251,160,15,19,21,131,60,163,243,76,137,159,165,11,158,73,195,246,46,36,81,12,85,134,165,117,117,207,195,23,165,1,122,236,223,186,73,12,121,222,237,175,53,4,100,196,114,149,174,234,134,252,20,121,9, + 96,204,36,33,165,152,243,251,59,16,130,149,229,61,204,239,25,221,34,170,190,229,0,44,31,84,106,32,230,153,72,205,209,49,190,221,83,3,194,102,121,255,53,245,164,202,192,125,72,84,66,48,96,176,58,186,244,188,145,23,64,233,28,111,49,198,255,254, + 233,77,140,139,134,113,236,178,144,192,23,19,41,213,172,177,189,86,242,184,173,250,194,176,98,247,143,125,11,154,39,110,131,234,48,173,192,163,65,168,24,154,177,164,214,16,114,145,120,165,163,214,1,241,12,178,229,13,74,132,107,135,235,149,119, + 204,92,188,107,73,48,108,160,81,179,197,81,224,123,104,61,140,61,207,80,221,112,151,217,4,237,157,135,53,247,200,3,34,164,33,166,233,41,175,154,246,175,70,197,225,203,205,57,142,32,41,15,35,126,179,79,219,238,139,54,207,200,145,88,98,100,232, + 207,110,185,61,184,247,120,5,87,255,73,44,104,57,96,146,66,37,114,62,203,25,14,252,229,231,100,155,46,26,221,62,205,98,221,29,46,23,33,112,70,215,186,15,187,146,172,21,244,83,29,17,37,161,29,157,35,161,176,105,172,72,200,60,146,29,131,173,188, + 140,157,149,174,238,226,87,231,124,40,216,254,162,147,2,3,1,0,1,163,130,1,73,48,130,1,69,48,29,6,3,85,29,14,4,22,4,20,161,124,141,201,81,61,102,19,149,139,49,20,87,8,77,128,191,15,95,69,48,31,6,3,85,29,35,4,24,48,22,128,20,159,167,21,93,0,94, + 98,93,131,244,229,210,101,167,27,83,53,25,233,114,48,95,6,3,85,29,31,4,88,48,86,48,84,160,82,160,80,134,78,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,114,108,47,77, + 105,99,114,111,115,111,102,116,37,50,48,84,105,109,101,45,83,116,97,109,112,37,50,48,80,67,65,37,50,48,50,48,49,48,40,49,41,46,99,114,108,48,108,6,8,43,6,1,5,5,7,1,1,4,96,48,94,48,92,6,8,43,6,1,5,5,7,48,2,134,80,104,116,116,112,58,47,47,119, + 119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,101,114,116,115,47,77,105,99,114,111,115,111,102,116,37,50,48,84,105,109,101,45,83,116,97,109,112,37,50,48,80,67,65,37,50,48,50,48,49,48,40,49,41,46, + 99,114,116,48,12,6,3,85,29,19,1,1,255,4,2,48,0,48,22,6,3,85,29,37,1,1,255,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,14,6,3,85,29,15,1,1,255,4,4,3,2,7,128,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,185,131,85,212,237,184,141,35,0,75,120,212, + 237,142,51,192,148,219,126,211,24,204,161,172,106,251,23,50,130,16,86,151,198,218,42,147,242,14,109,10,226,171,87,26,29,88,118,191,43,144,219,137,243,221,55,78,6,254,235,114,207,234,156,248,206,198,117,197,47,38,79,121,165,139,176,219,128,69, + 89,148,86,44,149,97,120,215,96,30,67,195,54,150,102,4,156,99,193,138,47,188,134,143,37,171,135,191,22,37,72,33,238,177,53,251,149,67,230,29,63,234,187,61,116,20,106,3,50,61,126,22,115,238,202,108,142,223,47,159,30,116,88,76,91,5,36,135,238,183, + 218,108,119,167,118,151,170,109,57,150,253,23,220,105,63,134,20,139,19,250,13,158,143,188,17,40,138,191,66,25,236,160,95,38,164,83,79,29,93,106,253,98,191,172,95,194,134,139,228,132,147,3,190,90,173,17,53,162,247,177,168,148,228,138,106,102, + 66,245,182,32,112,242,159,207,111,30,119,110,86,39,45,116,86,212,61,63,159,130,255,103,78,124,54,179,213,25,158,57,189,187,41,183,160,133,173,18,124,247,43,137,55,206,69,91,234,60,52,154,222,127,77,237,216,83,99,191,184,244,143,30,190,134,157, + 246,23,89,240,39,200,56,247,237,194,221,241,77,125,145,132,198,73,9,90,5,149,166,199,114,247,219,243,138,218,20,206,156,207,145,24,147,236,117,105,81,34,94,216,10,233,29,49,159,92,35,49,113,223,208,5,165,74,58,145,147,59,210,157,18,179,22,198, + 112,18,94,248,85,168,101,41,88,72,248,40,189,69,63,126,232,103,52,197,108,201,239,52,8,80,81,55,38,40,177,231,238,202,47,192,43,29,240,88,245,65,75,207,139,39,110,130,123,66,42,119,32,0,219,145,78,25,47,72,144,242,63,8,198,182,187,105,38,31, + 78,133,30,126,103,45,221,211,58,245,247,248,17,232,118,42,31,77,176,168,162,166,30,124,244,10,127,197,45,99,17,41,107,126,50,255,131,246,91,161,164,185,119,214,182,124,14,125,242,107,155,14,242,195,231,30,79,63,126,251,211,75,230,253,143,143, + 34,25,169,217,244,239,185,45,172,157,215,153,6,108,147,169,197,13,29,19,102,10,79,167,141,93,231,48,130,7,113,48,130,5,89,160,3,2,1,2,2,19,51,0,0,0,21,197,231,107,158,2,155,73,153,0,0,0,0,0,21,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,129, + 136,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112, + 111,114,97,116,105,111,110,49,50,48,48,6,3,85,4,3,19,41,77,105,99,114,111,115,111,102,116,32,82,111,111,116,32,67,101,114,116,105,102,105,99,97,116,101,32,65,117,116,104,111,114,105,116,121,32,50,48,49,48,48,30,23,13,50,49,48,57,51,48,49,56, + 50,50,50,53,90,23,13,51,48,48,57,51,48,49,56,51,50,50,53,90,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85, + 4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50,48,49,48,48,130,2,34,48,13,6,9, + 42,134,72,134,247,13,1,1,1,5,0,3,130,2,15,0,48,130,2,10,2,130,2,1,0,228,225,166,76,231,180,114,33,11,121,162,203,215,36,121,189,14,213,130,211,253,238,156,7,7,210,169,108,78,117,200,202,53,87,246,1,127,108,74,224,226,189,185,62,23,96,51,255, + 92,79,199,102,247,149,83,113,90,226,126,74,90,254,184,54,103,133,70,35,12,181,141,19,207,119,50,192,16,24,232,96,125,106,82,131,68,183,166,142,70,107,7,20,243,197,118,245,134,80,220,193,68,200,113,92,81,49,55,160,10,56,110,141,237,215,15,216, + 38,83,124,57,97,2,122,196,170,253,114,105,175,29,171,172,246,54,190,53,38,100,218,152,59,186,26,123,51,173,128,91,126,140,16,28,157,82,254,182,232,98,37,220,106,15,207,93,244,254,142,83,207,214,236,133,86,77,239,221,188,141,164,227,145,143,178, + 57,44,81,156,233,112,105,13,202,54,45,112,142,49,200,53,40,189,227,180,135,36,195,224,201,143,126,181,84,143,220,250,5,85,152,109,104,59,154,70,189,237,164,174,122,41,55,172,203,235,131,69,231,70,110,202,50,213,192,134,48,92,79,44,226,98,178, + 205,185,226,141,136,228,150,172,1,74,187,190,113,169,23,91,103,96,222,248,146,145,30,29,61,253,32,207,115,125,65,154,70,117,205,196,95,52,221,18,137,214,253,165,32,125,126,252,217,158,69,223,182,114,47,219,125,95,128,186,219,170,126,54,236,54, + 76,246,43,110,168,18,81,232,191,5,3,163,209,115,166,77,55,116,148,28,52,130,15,240,16,242,183,71,24,237,167,232,153,124,63,76,219,175,94,194,243,213,216,115,61,67,78,193,51,57,76,142,2,188,66,104,46,16,234,132,81,70,226,209,189,106,24,90,97, + 1,115,202,103,162,94,215,40,118,2,226,51,24,114,215,167,32,240,194,250,18,10,215,99,111,12,201,54,100,139,91,160,166,131,33,93,95,48,116,145,148,148,216,185,80,249,11,137,97,243,54,6,53,24,132,71,219,220,27,209,253,178,212,28,197,107,246,92, + 82,81,93,18,219,37,186,175,80,5,122,108,197,17,29,114,239,141,249,82,196,133,23,147,192,60,21,219,26,55,199,8,21,24,63,120,171,69,182,245,30,135,94,218,143,158,22,114,105,198,174,123,183,183,62,106,226,46,173,2,3,1,0,1,163,130,1,221,48,130,1, + 217,48,18,6,9,43,6,1,4,1,130,55,21,1,4,5,2,3,1,0,1,48,35,6,9,43,6,1,4,1,130,55,21,2,4,22,4,20,42,167,82,254,100,196,154,190,130,145,60,70,53,41,207,16,255,47,4,238,48,29,6,3,85,29,14,4,22,4,20,159,167,21,93,0,94,98,93,131,244,229,210,101,167, + 27,83,53,25,233,114,48,92,6,3,85,29,32,4,85,48,83,48,81,6,12,43,6,1,4,1,130,55,76,131,125,1,1,48,65,48,63,6,8,43,6,1,5,5,7,2,1,22,51,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111, + 112,115,47,68,111,99,115,47,82,101,112,111,115,105,116,111,114,121,46,104,116,109,48,19,6,3,85,29,37,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,25,6,9,43,6,1,4,1,130,55,20,2,4,12,30,10,0,83,0,117,0,98,0,67,0,65,48,11,6,3,85,29,15,4,4,3,2,1,134,48,15, + 6,3,85,29,19,1,1,255,4,5,48,3,1,1,255,48,31,6,3,85,29,35,4,24,48,22,128,20,213,246,86,203,143,232,162,92,98,104,209,61,148,144,91,215,206,154,24,196,48,86,6,3,85,29,31,4,79,48,77,48,75,160,73,160,71,134,69,104,116,116,112,58,47,47,99,114,108, + 46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,47,99,114,108,47,112,114,111,100,117,99,116,115,47,77,105,99,82,111,111,67,101,114,65,117,116,95,50,48,49,48,45,48,54,45,50,51,46,99,114,108,48,90,6,8,43,6,1,5,5,7,1,1,4,78,48, + 76,48,74,6,8,43,6,1,5,5,7,48,2,134,62,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,47,99,101,114,116,115,47,77,105,99,82,111,111,67,101,114,65,117,116,95,50,48,49,48,45,48,54,45,50,51, + 46,99,114,116,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,157,85,125,252,42,173,225,44,31,103,1,49,36,91,225,158,114,75,252,169,111,234,92,20,182,62,78,71,100,120,177,6,147,151,61,49,51,181,57,215,194,113,54,63,218,100,108,124,208, + 117,57,109,187,15,49,228,194,143,251,108,209,161,148,24,34,238,233,102,103,58,83,77,221,152,186,182,30,120,216,54,46,156,169,130,86,0,3,176,5,190,137,232,105,224,186,9,238,123,223,106,111,190,41,203,110,216,63,72,117,1,217,24,222,109,130,12, + 245,109,35,84,228,120,83,117,36,87,185,221,159,243,142,61,198,243,104,223,101,246,164,86,170,247,149,182,40,85,39,208,36,189,64,160,191,25,182,18,18,17,93,61,39,224,64,150,56,172,247,249,41,137,195,188,23,176,84,133,66,179,252,12,158,139,25, + 137,231,240,11,106,129,194,129,25,66,25,82,117,138,54,194,29,195,97,115,46,44,107,123,110,63,44,9,120,20,233,145,178,169,91,223,73,163,116,12,188,236,145,128,210,61,230,74,62,102,59,79,187,134,250,50,26,217,150,244,143,246,145,1,246,206,198, + 116,253,246,76,114,111,16,171,117,48,197,52,176,122,216,80,254,10,88,221,64,60,199,84,109,157,99,116,72,44,177,78,71,45,193,20,4,113,191,100,249,36,190,115,109,202,142,9,189,179,1,87,73,84,100,217,115,215,127,30,91,68,1,142,90,25,145,107,13, + 159,164,40,220,103,25,40,36,186,56,75,154,110,251,33,84,107,106,69,17,71,169,241,183,174,200,232,137,94,79,157,210,208,76,118,181,87,84,9,177,105,1,68,126,124,161,97,108,115,254,10,187,236,65,102,61,105,253,203,193,65,73,126,126,147,190,203, + 248,59,228,183,21,191,180,206,62,165,49,81,132,188,191,2,193,130,162,123,23,29,21,137,141,112,254,231,181,208,40,26,137,11,143,54,218,186,76,249,155,255,10,233,52,248,36,53,103,43,224,13,184,230,140,153,214,225,34,234,240,39,66,61,37,148,230, + 116,116,91,106,209,158,62,237,126,160,49,51,125,188,203,233,123,191,56,112,68,209,144,241,200,171,58,138,58,8,98,127,217,112,99,83,77,141,238,130,109,165,5,16,193,113,6,106,16,180,29,85,51,88,179,161,112,102,242,161,130,2,212,48,130,2,61,2,1, + 1,48,130,1,0,161,129,216,164,129,213,48,129,210,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99, + 114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,45,48,43,6,3,85,4,11,19,36,77,105,99,114,111,115,111,102,116,32,73,114,101,108,97,110,100,32,79,112,101,114,97,116,105,111,110,115,32,76,105,109,105,116,101,100,49,38,48, + 36,6,3,85,4,11,19,29,84,104,97,108,101,115,32,84,83,83,32,69,83,78,58,48,56,52,50,45,52,66,69,54,45,67,50,57,65,49,37,48,35,6,3,85,4,3,19,28,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,83,101,114,118,105,99,101, + 162,35,10,1,1,48,7,6,5,43,14,3,2,26,3,21,0,66,162,31,33,137,99,29,70,205,161,141,63,194,56,87,70,127,236,72,13,160,129,131,48,129,128,164,126,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116, + 111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84, + 105,109,101,45,83,116,97,109,112,32,80,67,65,32,50,48,49,48,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,2,5,0,233,126,208,210,48,34,24,15,50,48,50,52,48,50,50,48,49,53,49,56,52,50,90,24,15,50,48,50,52,48,50,50,49,49,53,49,56,52,50,90,48,116,48, + 58,6,10,43,6,1,4,1,132,89,10,4,1,49,44,48,42,48,10,2,5,0,233,126,208,210,2,1,0,48,7,2,1,0,2,2,14,60,48,7,2,1,0,2,2,17,101,48,10,2,5,0,233,128,34,82,2,1,0,48,54,6,10,43,6,1,4,1,132,89,10,4,2,49,40,48,38,48,12,6,10,43,6,1,4,1,132,89,10,3,2,160, + 10,48,8,2,1,0,2,3,7,161,32,161,10,48,8,2,1,0,2,3,1,134,160,48,13,6,9,42,134,72,134,247,13,1,1,5,5,0,3,129,129,0,13,119,1,74,32,183,115,183,177,212,159,226,166,206,102,15,230,160,237,166,209,131,154,144,89,6,85,34,208,14,63,64,199,214,232,87, + 19,13,115,0,4,58,46,29,146,249,9,6,60,156,147,69,82,190,131,80,231,192,49,138,216,143,176,77,203,241,241,65,234,219,89,246,174,100,231,188,173,153,187,94,29,228,59,115,171,192,186,75,210,92,215,225,183,42,177,5,32,107,255,101,124,243,42,176, + 136,36,68,12,33,193,103,164,159,212,16,213,247,109,131,123,89,229,176,253,58,51,128,141,49,130,4,13,48,130,4,9,2,1,1,48,129,147,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16, + 48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45, + 83,116,97,109,112,32,80,67,65,32,50,48,49,48,2,19,51,0,0,1,218,142,213,201,90,0,209,17,177,0,1,0,0,1,218,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,160,130,1,74,48,26,6,9,42,134,72,134,247,13,1,9,3,49,13,6,11,42,134,72,134,247,13,1,9,16,1,4,48,47, + 6,9,42,134,72,134,247,13,1,9,4,49,34,4,32,207,44,139,82,75,169,73,178,48,239,49,40,193,71,167,180,97,211,139,21,69,220,244,82,129,108,244,81,94,135,196,205,48,129,250,6,11,42,134,72,134,247,13,1,9,16,2,47,49,129,234,48,129,231,48,129,228,48, + 129,189,4,32,34,165,163,105,98,192,239,158,164,222,247,144,227,212,45,61,211,109,8,230,88,226,110,181,191,157,210,2,59,24,61,198,48,129,152,48,129,128,164,126,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104, + 105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111, + 102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50,48,49,48,2,19,51,0,0,1,218,142,213,201,90,0,209,17,177,0,1,0,0,1,218,48,34,4,32,41,12,185,146,237,226,148,210,117,25,61,203,117,145,100,56,96,90,49,48,67,196,18,51,193,104,99,146, + 16,165,15,178,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,4,130,2,0,44,193,55,168,168,81,156,190,152,81,37,226,185,235,126,111,156,12,10,54,188,9,44,94,21,236,249,212,129,150,53,26,248,202,27,158,251,78,45,125,128,193,165,218,226,7,22,63,24,136, + 195,197,40,169,136,107,174,67,11,19,86,65,180,141,142,195,132,21,103,32,219,170,69,224,46,120,170,56,200,117,205,202,3,117,190,77,223,89,110,32,188,239,40,189,75,70,14,169,95,112,216,179,120,173,188,104,229,234,164,233,139,251,155,26,240,245, + 175,103,146,51,138,214,182,184,67,206,199,155,29,145,192,60,7,225,188,4,251,252,190,248,90,199,124,121,159,57,155,2,179,73,16,25,179,156,121,24,37,219,155,127,61,53,219,13,11,57,126,37,164,121,253,143,26,133,145,138,115,53,209,205,58,18,215, + 7,211,34,64,233,181,143,166,200,163,143,7,152,95,133,69,172,79,133,36,90,99,16,190,245,130,18,192,162,141,207,198,121,254,243,220,148,195,55,78,81,207,115,133,199,110,156,66,231,232,188,44,184,207,131,87,237,84,81,185,180,39,1,242,132,116,250, + 147,198,36,12,119,135,50,144,186,203,24,10,48,49,85,148,2,158,168,211,59,33,179,247,174,163,90,37,219,220,61,43,255,176,243,41,131,253,96,43,6,16,86,22,12,188,140,157,205,255,88,116,247,9,218,131,15,212,112,158,226,200,16,137,254,2,65,68,185, + 197,65,203,191,42,247,41,227,51,234,201,12,127,33,178,145,164,23,103,87,8,98,250,252,155,234,198,95,101,117,6,200,200,239,11,151,245,168,99,150,189,190,40,167,237,150,135,119,201,82,138,62,249,146,51,254,124,153,168,71,60,19,142,191,173,249, + 88,71,64,10,81,134,113,83,166,81,119,88,159,108,39,116,99,213,176,248,44,118,84,191,31,68,123,194,188,120,110,185,197,35,123,197,244,33,84,251,136,78,247,247,149,3,128,41,252,207,26,41,180,255,199,108,200,30,26,11,234,19,253,226,120,190,245, + 89,11,70,47,103,181,177,201,17,79,39,144,248,95,107,120,69,191,242,59,2,131,115,88,201,236,84,208,233,131,79,162,232,9,235,222,167,57,172,180,44,244,175,134,135,108,3,167,14,24,207,9,229,27,104,117,55,87,6,240,0,0,0,0,0 + }; + #else + static constexpr unsigned char dllData[162392] = { + 77,90,120,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,0,0,14,31,186,14,0,180,9,205,33,184,1,76,205,33,84,104,105,115,32,112,114,111,103,114,97,109,32,99,97,110,110, + 111,116,32,98,101,32,114,117,110,32,105,110,32,68,79,83,32,109,111,100,101,46,36,0,0,80,69,0,0,100,134,10,0,88,207,211,101,0,0,0,0,0,0,0,0,240,0,34,32,11,2,14,0,0,80,1,0,0,252,0,0,0,0,0,0,48,78,0,0,0,16,0,0,0,0,0,128,1,0,0,0,0,16,0,0,0,2,0,0, + 5,0,2,0,0,0,0,0,5,0,2,0,0,0,0,0,0,208,2,0,0,4,0,0,96,172,2,0,3,0,96,65,0,0,16,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,16,0,0,0,113,243,1,0,48,1,0,0,161,244,1,0,40,0,0,0,0,176,2,0,136,5,0,0,0,64,2,0,12,21,0,0,0,82, + 2,0,88,40,0,0,0,192,2,0,172,6,0,0,12,235,1,0,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,152,231,1,0,40,0,0,0,192,97,1,0,64,1,0,0,0,0,0,0,0,0,0,0,136,247,1,0,184,2,0,0,232,241,1,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,116,101,120,116,0,0, + 0,141,79,1,0,0,16,0,0,0,80,1,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,96,46,114,100,97,116,97,0,0,212,180,0,0,0,96,1,0,0,182,0,0,0,84,1,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,64,46,100,97,116,97,0,0,0,20,30,0,0,0,32,2,0,0,12,0,0,0,10,2,0,0,0,0,0,0, + 0,0,0,0,0,0,0,64,0,0,192,46,112,100,97,116,97,0,0,12,21,0,0,0,64,2,0,0,22,0,0,0,22,2,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,64,46,103,120,102,103,0,0,0,176,16,0,0,0,96,2,0,0,18,0,0,0,44,2,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,64,46,114,101,116,112,108, + 110,101,140,0,0,0,0,128,2,0,0,2,0,0,0,62,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,116,108,115,0,0,0,0,9,0,0,0,0,144,2,0,0,2,0,0,0,64,2,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,192,95,82,68,65,84,65,0,0,92,1,0,0,0,160,2,0,0,2,0,0,0,66,2,0,0,0,0,0,0,0,0, + 0,0,0,0,0,64,0,0,64,46,114,115,114,99,0,0,0,136,5,0,0,0,176,2,0,0,6,0,0,0,68,2,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,64,46,114,101,108,111,99,0,0,172,6,0,0,0,192,2,0,0,8,0,0,0,74,2,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,72,131,236,64,72,139,5,28,16,2, + 0,72,49,224,72,137,68,36,56,72,139,65,8,15,16,64,240,15,41,68,36,32,72,131,121,32,0,117,102,72,137,206,76,141,73,32,72,137,81,40,76,137,65,48,72,141,21,87,0,0,0,72,141,76,36,32,73,137,240,255,21,180,26,2,0,133,192,116,35,15,183,240,129,206,0, + 0,7,128,133,192,15,78,240,72,139,76,36,56,72,49,225,232,117,180,0,0,137,240,72,131,196,64,94,195,76,139,70,8,72,139,78,32,69,15,183,8,186,2,0,0,0,255,21,126,26,2,0,49,246,235,208,185,5,0,0,0,205,41,86,72,131,236,64,76,139,156,36,128,0,0,0,77, + 133,219,116,47,76,139,84,36,112,131,250,1,117,43,65,15,182,192,141,112,1,132,192,184,0,1,0,0,15,69,198,65,137,3,77,137,75,16,77,137,83,24,73,139,67,40,72,133,192,117,19,72,131,196,64,94,195,133,210,117,237,65,199,3,0,0,0,0,235,228,72,139,116, + 36,120,77,139,91,48,76,137,92,36,48,72,137,116,36,40,76,137,84,36,32,255,21,41,224,1,0,235,205,86,87,72,131,236,88,72,137,208,68,139,148,36,144,0,0,0,76,139,156,36,152,0,0,0,72,139,21,255,14,2,0,72,49,226,72,137,84,36,80,15,182,48,193,230,24, + 72,141,84,36,64,137,50,15,183,112,1,137,114,4,72,139,112,3,72,137,114,8,72,141,112,11,72,139,121,8,73,137,59,72,139,121,8,15,183,63,65,137,123,8,65,199,67,12,2,0,0,0,73,137,115,16,15,183,64,11,65,137,67,24,65,199,67,28,1,0,0,0,199,68,36,60,170, + 170,170,170,72,141,5,170,216,1,0,72,141,53,99,217,1,0,41,198,137,116,36,60,72,139,73,32,76,137,92,36,40,68,137,84,36,32,255,21,105,25,2,0,137,198,72,139,76,36,80,72,49,225,232,34,179,0,0,137,240,72,131,196,88,95,94,195,195,86,87,83,72,131,236, + 80,76,137,198,72,139,5,79,14,2,0,72,49,224,72,137,68,36,72,72,141,5,114,201,1,0,72,137,68,36,32,72,141,5,180,201,1,0,72,137,68,36,40,72,141,5,246,201,1,0,72,137,68,36,48,72,141,5,56,202,1,0,72,137,68,36,56,72,141,5,122,202,1,0,72,137,68,36,64, + 132,210,116,38,72,141,61,184,202,1,0,72,139,76,36,72,72,49,225,232,171,178,0,0,72,137,241,72,137,250,72,131,196,80,91,95,94,233,69,40,0,0,72,99,193,72,139,124,196,32,72,137,249,232,253,121,0,0,72,137,195,72,141,80,42,72,137,241,232,144,39,0, + 0,72,141,21,19,203,1,0,65,184,42,0,0,0,72,137,241,232,67,40,0,0,72,139,76,36,72,72,49,225,232,88,178,0,0,72,137,241,72,137,250,73,137,216,72,131,196,80,91,95,94,233,1,41,0,0,86,87,72,131,236,56,72,137,206,72,141,21,93,203,1,0,232,186,40,0,0, + 72,141,21,79,200,1,0,72,137,241,232,171,40,0,0,72,137,241,232,185,41,0,0,72,137,193,255,21,150,229,1,0,131,248,255,116,112,72,137,241,232,163,41,0,0,72,137,198,72,199,68,36,48,0,0,0,0,199,68,36,40,128,0,0,0,199,68,36,32,3,0,0,0,72,137,193,186, + 33,0,16,0,65,184,7,0,0,0,69,49,201,255,21,134,228,1,0,72,131,248,255,116,13,72,137,193,255,21,103,228,1,0,176,1,235,36,72,141,13,92,204,1,0,72,139,61,37,230,1,0,255,215,72,137,241,255,21,34,230,1,0,72,141,13,43,203,1,0,255,215,49,192,72,131, + 196,56,95,94,195,65,86,86,87,83,72,131,236,40,72,137,214,72,137,207,186,4,1,0,0,72,137,241,232,138,38,0,0,72,137,241,232,196,40,0,0,72,137,195,72,137,241,232,3,41,0,0,72,137,249,72,137,194,65,137,216,255,21,242,228,1,0,137,195,65,137,198,72, + 137,241,232,157,40,0,0,76,57,240,117,60,255,21,210,228,1,0,131,248,122,117,49,186,0,16,0,0,72,137,241,232,62,38,0,0,72,137,241,232,120,40,0,0,72,137,195,72,137,241,232,183,40,0,0,72,137,249,72,137,194,65,137,216,255,21,166,228,1,0,137,195,133, + 219,116,30,137,223,72,137,241,232,78,40,0,0,72,57,248,118,15,72,137,241,72,137,250,232,80,39,0,0,49,192,235,21,255,21,116,228,1,0,137,193,15,183,193,13,0,0,7,128,133,201,15,78,193,72,131,196,40,91,95,94,65,94,195,65,86,86,87,83,72,131,236,72, + 72,137,214,72,137,207,72,139,5,245,11,2,0,72,49,224,72,137,68,36,64,186,4,1,0,0,72,137,241,232,174,37,0,0,72,137,241,72,137,250,232,57,38,0,0,72,137,241,232,39,40,0,0,72,137,195,72,137,241,232,216,39,0,0,72,131,248,3,114,53,15,183,67,2,102,131, + 248,58,117,27,102,131,123,4,92,117,36,15,183,3,131,224,223,131,192,191,102,131,248,26,115,21,233,205,0,0,0,102,131,248,92,117,10,102,131,59,92,15,132,189,0,0,0,72,184,170,170,170,170,170,170,170,170,72,141,92,36,32,72,137,67,16,15,40,5,37,198, + 1,0,15,41,3,72,137,217,232,194,36,0,0,49,201,72,137,218,232,128,254,255,255,133,192,15,136,204,0,0,0,72,141,92,36,32,72,137,217,232,89,39,0,0,73,137,198,72,137,217,232,146,39,0,0,72,137,241,72,137,194,77,137,240,232,192,37,0,0,72,137,217,232, + 124,39,0,0,72,137,193,102,186,92,0,232,86,87,0,0,72,133,192,15,132,130,0,0,0,72,137,195,76,141,116,36,32,76,137,241,232,87,39,0,0,72,41,195,72,131,195,2,72,209,251,76,137,241,232,69,39,0,0,72,137,241,72,137,194,73,137,216,232,115,37,0,0,72,137, + 241,72,137,250,232,22,38,0,0,76,137,241,232,60,36,0,0,72,137,241,232,55,253,255,255,49,219,132,192,117,81,72,141,13,199,200,1,0,72,139,61,222,227,1,0,255,215,72,137,241,232,254,38,0,0,72,137,193,255,21,211,227,1,0,72,141,13,220,200,1,0,255,215, + 187,2,0,7,128,235,32,187,5,64,0,128,235,15,137,195,72,141,13,97,200,1,0,255,21,165,227,1,0,72,141,76,36,32,232,221,35,0,0,72,139,76,36,64,72,49,225,232,22,175,0,0,137,216,72,131,196,72,91,95,94,65,94,195,65,87,65,86,86,87,85,83,72,131,236,88, + 72,137,214,72,137,203,72,139,5,57,10,2,0,72,49,224,72,137,68,36,80,72,141,13,116,200,1,0,232,90,1,0,0,73,137,199,72,141,13,125,200,1,0,232,75,1,0,0,73,137,198,72,141,13,130,200,1,0,232,60,1,0,0,189,50,0,7,128,77,133,255,116,124,77,133,246,116, + 119,72,137,199,72,133,192,116,111,72,141,84,36,76,199,2,0,0,0,0,72,137,217,76,137,248,255,21,225,218,1,0,133,192,116,112,137,197,72,184,170,170,170,170,170,170,170,170,76,141,124,36,48,73,137,71,16,15,40,5,113,196,1,0,65,15,41,7,76,137,249,232, + 13,35,0,0,137,234,76,137,249,232,167,37,0,0,132,192,117,80,255,21,233,225,1,0,15,183,232,129,205,0,0,7,128,133,192,15,78,232,72,141,76,36,48,232,243,34,0,0,72,139,76,36,80,72,49,225,232,44,174,0,0,137,232,72,131,196,88,91,93,95,94,65,94,65,95, + 195,255,21,175,225,1,0,15,183,232,129,205,0,0,7,128,133,192,15,78,232,235,206,72,141,76,36,48,232,159,37,0,0,139,84,36,76,72,137,217,65,137,232,73,137,193,76,137,240,255,21,55,218,1,0,133,192,116,140,72,141,92,36,40,72,199,3,0,0,0,0,76,141,116, + 36,36,65,199,6,0,0,0,0,72,141,76,36,48,232,99,37,0,0,72,141,21,136,199,1,0,72,137,193,73,137,216,77,137,241,72,137,248,255,21,248,217,1,0,133,192,15,132,73,255,255,255,72,139,84,36,40,72,133,210,15,132,59,255,255,255,72,137,241,232,54,35,0,0, + 49,237,233,64,255,255,255,86,72,131,236,32,72,137,206,139,5,69,38,2,0,139,13,131,20,2,0,101,72,139,20,37,88,0,0,0,72,139,12,202,59,129,4,0,0,0,127,35,72,139,13,27,38,2,0,72,133,201,116,15,72,137,242,72,131,196,32,94,72,255,37,255,224,1,0,49, + 192,72,131,196,32,94,195,72,141,13,0,38,2,0,232,251,40,0,0,131,61,244,37,2,0,255,117,200,72,141,13,227,199,1,0,49,210,65,184,0,8,0,0,255,21,109,225,1,0,72,133,192,117,21,72,141,13,15,200,1,0,49,210,65,184,0,8,0,0,255,21,83,225,1,0,72,137,5,180, + 37,2,0,72,141,13,181,37,2,0,232,24,41,0,0,235,132,86,72,131,236,64,72,139,5,26,8,2,0,72,49,224,72,137,68,36,56,72,199,68,36,48,0,0,0,0,72,133,201,116,28,72,139,1,72,139,0,72,141,21,207,198,1,0,76,141,68,36,48,255,21,244,216,1,0,133,192,116,55, + 49,246,72,139,76,36,48,72,133,201,116,22,72,199,68,36,48,0,0,0,0,72,139,1,72,139,64,16,255,21,206,216,1,0,72,139,76,36,56,72,49,225,232,113,172,0,0,137,240,72,131,196,64,94,195,72,139,76,36,48,72,133,201,116,191,72,141,116,36,44,199,6,0,0,0, + 0,72,139,1,72,139,64,24,72,137,242,255,21,148,216,1,0,131,62,1,64,15,148,198,133,192,117,153,235,153,65,86,86,87,83,72,129,236,152,0,0,0,15,41,180,36,128,0,0,0,72,137,214,72,137,207,72,139,5,94,7,2,0,72,49,224,72,137,68,36,120,72,187,170,170, + 170,170,170,170,170,170,72,141,76,36,96,72,137,89,16,15,40,53,244,193,1,0,15,41,49,232,148,32,0,0,72,141,76,36,64,72,137,89,16,15,41,49,232,131,32,0,0,72,141,76,36,32,72,137,89,16,15,41,49,232,114,32,0,0,72,139,15,72,133,201,116,49,102,131,57, + 0,116,43,72,141,84,36,96,232,239,250,255,255,133,192,116,4,137,199,235,54,72,141,76,36,96,232,66,35,0,0,72,141,84,36,64,72,137,193,232,137,252,255,255,235,23,72,141,84,36,96,76,141,68,36,64,76,141,76,36,32,72,137,249,232,191,0,0,0,137,199,133, + 192,116,71,49,192,72,137,6,72,141,76,36,32,232,31,32,0,0,72,141,76,36,64,232,21,32,0,0,72,141,76,36,96,232,11,32,0,0,72,139,76,36,120,72,49,225,232,68,171,0,0,137,248,15,40,180,36,128,0,0,0,72,129,196,152,0,0,0,91,95,94,65,94,195,72,141,76,36, + 32,232,133,34,0,0,132,192,117,58,72,141,21,72,197,1,0,72,141,124,36,64,72,137,249,232,151,33,0,0,72,141,92,36,32,72,137,217,232,92,34,0,0,73,137,198,72,137,217,232,149,34,0,0,72,137,249,72,137,194,77,137,240,232,163,33,0,0,72,141,124,36,64,72, + 137,249,232,54,34,0,0,72,137,195,72,137,249,232,111,34,0,0,72,137,193,72,137,218,232,106,34,0,0,49,255,233,73,255,255,255,65,87,65,86,65,85,65,84,86,87,85,83,72,129,236,232,0,0,0,15,41,180,36,208,0,0,0,76,137,76,36,88,76,137,199,72,137,84,36, + 80,73,137,206,72,139,5,209,5,2,0,72,49,224,72,137,132,36,200,0,0,0,15,40,53,119,192,1,0,76,141,124,36,96,49,237,235,27,76,137,233,232,32,31,0,0,76,137,249,232,24,31,0,0,255,197,131,253,5,15,132,90,3,0,0,65,189,4,0,0,0,65,41,237,65,131,126,24, + 1,68,15,69,237,65,128,126,29,0,116,10,65,139,70,32,68,15,163,232,115,210,65,128,126,28,0,15,149,192,69,133,237,65,15,148,196,65,32,196,72,141,5,61,197,1,0,72,137,132,36,160,0,0,0,72,141,5,140,197,1,0,72,137,132,36,168,0,0,0,72,141,5,215,197, + 1,0,72,137,132,36,176,0,0,0,72,141,5,32,198,1,0,72,137,132,36,184,0,0,0,72,141,5,111,198,1,0,72,137,132,36,192,0,0,0,68,137,235,72,139,180,220,160,0,0,0,72,184,170,170,170,170,170,170,170,170,72,137,68,36,112,15,41,116,36,96,76,137,249,232,84, + 30,0,0,68,137,233,68,137,226,77,137,248,232,134,246,255,255,76,137,249,232,56,33,0,0,72,139,76,36,80,72,137,76,36,32,72,137,193,68,137,226,69,49,192,73,137,249,232,234,13,0,0,132,192,15,133,142,2,0,0,76,137,249,232,13,33,0,0,72,139,76,36,80, + 72,137,76,36,32,72,137,193,68,137,226,65,176,1,73,137,249,232,191,13,0,0,132,192,15,133,99,2,0,0,15,41,180,36,144,0,0,0,139,5,26,34,2,0,139,13,72,16,2,0,101,72,139,20,37,88,0,0,0,72,139,12,202,59,129,4,0,0,0,15,143,247,3,0,0,72,131,61,235,33, + 2,0,0,65,189,0,0,0,0,15,132,161,254,255,255,139,5,241,33,2,0,139,13,15,16,2,0,101,72,139,20,37,88,0,0,0,72,139,12,202,59,129,4,0,0,0,15,143,12,4,0,0,72,131,61,194,33,2,0,0,15,132,110,254,255,255,76,137,172,36,128,0,0,0,72,139,5,157,33,2,0,72, + 141,140,36,128,0,0,0,72,137,76,36,56,68,137,108,36,48,76,137,108,36,40,68,137,108,36,32,49,201,72,137,242,69,49,192,69,49,201,255,21,232,212,1,0,133,192,120,83,76,137,172,36,160,0,0,0,72,139,5,109,33,2,0,72,139,140,36,128,0,0,0,76,137,108,36, + 32,49,210,69,49,192,76,141,140,36,160,0,0,0,255,21,181,212,1,0,76,139,164,36,128,0,0,0,255,21,31,220,1,0,72,137,193,49,210,77,137,224,255,21,73,220,1,0,76,137,172,36,128,0,0,0,139,5,59,33,2,0,139,13,73,15,2,0,101,72,139,20,37,88,0,0,0,72,139, + 12,202,59,129,4,0,0,0,15,143,148,3,0,0,72,139,5,13,33,2,0,72,133,192,76,141,172,36,160,0,0,0,15,132,158,253,255,255,199,132,36,140,0,0,0,170,170,170,170,199,132,36,136,0,0,0,0,0,0,0,185,1,0,24,0,72,141,148,36,136,0,0,0,69,49,192,76,141,140,36, + 140,0,0,0,255,21,32,212,1,0,131,248,122,15,133,97,253,255,255,131,188,36,136,0,0,0,0,15,132,83,253,255,255,72,184,170,170,170,170,170,170,170,170,72,137,132,36,176,0,0,0,15,41,180,36,160,0,0,0,76,137,233,232,63,28,0,0,139,148,36,136,0,0,0,76, + 137,233,232,212,30,0,0,132,192,15,132,18,253,255,255,76,139,37,113,32,2,0,76,137,233,232,19,31,0,0,185,1,0,24,0,72,141,148,36,136,0,0,0,73,137,192,76,141,140,36,140,0,0,0,76,137,224,255,21,160,211,1,0,133,192,15,133,218,252,255,255,76,137,233, + 232,226,30,0,0,131,188,36,140,0,0,0,0,116,48,73,137,196,73,131,196,46,69,49,237,73,139,76,36,234,72,137,242,232,135,98,0,0,133,192,15,132,206,0,0,0,65,255,197,73,131,196,80,68,59,172,36,140,0,0,0,114,218,72,141,140,36,160,0,0,0,233,142,252,255, + 255,72,141,13,38,193,1,0,255,21,100,219,1,0,190,2,0,7,128,235,110,72,139,76,36,88,72,133,201,116,88,72,141,5,202,191,1,0,72,137,132,36,160,0,0,0,72,141,5,189,191,1,0,72,137,132,36,168,0,0,0,72,141,5,184,191,1,0,72,137,132,36,176,0,0,0,72,141, + 5,177,191,1,0,72,137,132,36,184,0,0,0,72,141,5,176,191,1,0,72,137,132,36,192,0,0,0,72,139,148,220,160,0,0,0,232,47,28,0,0,72,141,76,36,96,232,51,27,0,0,49,246,72,139,140,36,200,0,0,0,72,49,225,232,103,166,0,0,137,240,15,40,180,36,208,0,0,0,72, + 129,196,232,0,0,0,91,93,95,94,65,92,65,93,65,94,65,95,195,65,15,183,52,36,137,180,36,144,0,0,0,65,15,183,68,36,254,137,132,36,148,0,0,0,65,15,183,68,36,252,137,132,36,152,0,0,0,65,15,183,68,36,250,137,132,36,156,0,0,0,73,139,84,36,218,76,139, + 100,36,80,76,137,225,232,176,27,0,0,76,141,172,36,160,0,0,0,76,137,233,232,174,26,0,0,72,141,140,36,144,0,0,0,76,137,226,232,62,12,0,0,65,137,196,72,133,255,15,132,166,0,0,0,69,132,228,15,132,157,0,0,0,186,15,0,0,0,72,137,249,232,216,26,0,0, + 72,184,170,170,170,170,170,170,170,170,72,137,132,36,174,0,0,0,15,41,180,36,160,0,0,0,65,184,11,0,0,0,137,241,76,137,234,65,185,10,0,0,0,232,150,95,0,0,133,192,15,133,36,251,255,255,68,136,100,36,79,72,137,249,76,137,234,232,38,27,0,0,65,188, + 3,0,0,0,65,184,11,0,0,0,137,241,76,137,234,65,185,10,0,0,0,232,98,95,0,0,133,192,15,133,240,250,255,255,72,137,249,72,141,21,160,194,1,0,232,211,27,0,0,72,137,249,76,137,234,232,200,27,0,0,65,255,204,117,195,68,138,100,36,79,69,132,228,15,132, + 195,250,255,255,233,63,254,255,255,72,141,13,253,29,2,0,232,232,32,0,0,131,61,241,29,2,0,255,15,133,240,251,255,255,72,141,13,120,194,1,0,255,21,174,216,1,0,72,137,193,72,141,21,76,194,1,0,255,21,174,216,1,0,72,137,5,191,29,2,0,72,141,13,192, + 29,2,0,232,19,33,0,0,233,187,251,255,255,72,141,13,191,29,2,0,232,154,32,0,0,131,61,179,29,2,0,255,15,133,219,251,255,255,72,141,13,42,194,1,0,255,21,96,216,1,0,72,137,193,72,141,21,56,194,1,0,255,21,96,216,1,0,72,137,5,129,29,2,0,72,141,13, + 130,29,2,0,232,197,32,0,0,233,166,251,255,255,72,141,13,129,29,2,0,232,76,32,0,0,131,61,117,29,2,0,255,15,133,83,252,255,255,72,141,13,220,193,1,0,255,21,18,216,1,0,72,137,193,72,141,21,255,193,1,0,255,21,18,216,1,0,72,137,5,67,29,2,0,72,141, + 13,68,29,2,0,232,119,32,0,0,233,30,252,255,255,86,87,72,131,236,56,72,139,5,117,255,1,0,72,49,224,72,137,68,36,48,72,133,201,15,132,203,0,0,0,72,137,214,128,122,30,0,116,10,128,126,29,0,15,133,184,0,0,0,72,141,124,36,40,72,199,7,0,0,0,0,72,139, + 1,72,139,0,72,141,21,136,190,1,0,73,137,248,255,21,55,208,1,0,72,139,15,133,192,120,116,72,133,201,15,132,134,0,0,0,128,126,30,0,117,47,72,141,84,36,36,199,2,0,0,0,0,72,139,1,72,139,64,40,255,21,9,208,1,0,133,192,120,14,131,124,36,36,1,117,7, + 199,70,24,1,0,0,0,72,139,76,36,40,128,126,29,0,117,48,72,141,84,36,36,199,2,170,170,170,170,72,139,1,72,139,64,24,255,21,212,207,1,0,133,192,120,15,139,68,36,36,133,192,116,7,198,70,29,1,137,70,32,72,139,76,36,40,72,133,201,116,22,72,199,68, + 36,40,0,0,0,0,72,139,1,72,139,64,16,255,21,161,207,1,0,72,139,76,36,48,72,49,225,232,68,163,0,0,144,72,131,196,56,95,94,195,204,204,204,204,204,204,204,204,204,204,204,204,65,87,65,86,65,84,86,87,83,72,129,236,8,1,0,0,15,41,180,36,240,0,0,0, + 72,139,5,89,254,1,0,72,49,224,72,137,132,36,232,0,0,0,77,133,201,15,132,231,1,0,0,76,137,203,77,137,198,15,40,53,240,184,1,0,76,141,188,36,152,0,0,0,65,15,17,119,24,49,192,65,137,71,32,65,137,71,24,65,137,71,27,73,137,15,73,137,87,8,77,137,71, + 16,76,137,193,232,228,245,255,255,65,136,71,28,72,184,170,170,170,170,170,170,170,170,72,141,180,36,128,0,0,0,72,137,70,16,15,41,54,15,41,118,240,15,41,118,224,15,41,118,208,76,141,100,36,80,76,137,225,232,52,23,0,0,72,141,124,36,104,72,137, + 249,232,39,23,0,0,72,137,241,232,31,23,0,0,76,137,249,76,137,226,232,111,13,0,0,76,137,241,76,137,250,232,39,254,255,255,72,141,21,122,61,1,0,185,72,0,0,0,232,36,29,0,0,73,137,198,72,133,192,15,132,53,1,0,0,72,139,132,36,184,0,0,0,72,137,132, + 36,224,0,0,0,15,16,132,36,152,0,0,0,15,16,140,36,168,0,0,0,15,41,140,36,208,0,0,0,15,41,132,36,192,0,0,0,65,199,70,12,1,0,0,0,72,141,5,213,183,1,0,73,137,6,72,139,13,187,26,2,0,72,133,201,116,13,72,139,1,72,139,64,8,255,21,57,206,1,0,72,141, + 5,130,183,1,0,73,137,6,15,40,132,36,192,0,0,0,15,40,140,36,208,0,0,0,65,15,17,70,16,65,15,17,78,32,72,139,132,36,224,0,0,0,73,137,70,48,73,137,94,56,72,139,3,72,139,64,8,72,137,217,255,21,245,205,1,0,65,199,70,64,1,0,0,0,72,139,132,36,184,0, + 0,0,72,141,76,36,32,72,137,65,32,15,16,132,36,152,0,0,0,15,16,140,36,168,0,0,0,15,41,73,16,15,41,1,76,137,242,232,146,0,0,0,137,195,73,139,6,72,139,64,16,76,137,241,255,21,171,205,1,0,72,137,241,232,13,22,0,0,72,137,249,232,5,22,0,0,72,141,76, + 36,80,232,251,21,0,0,72,139,140,36,232,0,0,0,72,49,225,232,49,161,0,0,137,216,15,40,180,36,240,0,0,0,72,129,196,8,1,0,0,91,95,94,65,92,65,94,65,95,195,187,3,64,0,128,235,206,15,16,132,36,152,0,0,0,15,16,140,36,168,0,0,0,72,141,76,36,32,15,41, + 1,15,41,73,16,72,139,132,36,184,0,0,0,72,137,65,32,76,137,242,232,4,0,0,0,137,195,235,128,65,87,65,86,86,87,85,83,72,129,236,232,0,0,0,15,41,180,36,208,0,0,0,73,137,214,72,137,207,72,139,5,255,251,1,0,72,49,224,72,137,132,36,200,0,0,0,72,184, + 170,170,170,170,170,170,170,170,72,141,76,36,48,72,137,65,16,15,40,53,146,182,1,0,15,41,49,232,50,21,0,0,15,182,95,28,72,139,15,72,133,201,116,29,102,131,57,0,116,23,128,251,1,187,2,0,0,0,131,219,0,72,141,84,36,48,232,160,239,255,255,235,21, + 1,219,72,141,84,36,48,72,137,249,69,49,192,69,49,201,232,145,245,255,255,137,197,137,198,133,192,117,46,72,139,119,8,76,139,127,16,72,141,76,36,48,232,212,23,0,0,76,137,116,36,40,76,137,124,36,32,72,137,193,178,1,65,137,216,73,137,241,232,24, + 25,0,0,137,198,133,246,120,52,72,141,76,36,48,232,194,20,0,0,72,139,140,36,200,0,0,0,72,49,225,232,248,159,0,0,137,240,15,40,180,36,208,0,0,0,72,129,196,232,0,0,0,91,93,95,94,65,94,65,95,195,128,127,28,0,117,198,133,237,64,15,148,199,133,219, + 15,148,195,139,5,215,24,2,0,139,13,213,6,2,0,101,72,139,20,37,88,0,0,0,72,139,12,202,59,129,4,0,0,0,15,143,16,1,0,0,72,139,13,169,24,2,0,72,133,201,116,138,72,141,21,109,189,1,0,255,21,79,211,1,0,72,133,192,15,132,116,255,255,255,72,141,13,135, + 4,2,0,49,210,69,49,192,232,149,234,255,255,133,192,15,136,91,255,255,255,131,61,110,4,2,0,3,114,9,246,5,122,4,2,0,64,117,39,72,139,13,124,4,2,0,199,5,82,4,2,0,0,0,0,0,72,199,5,103,4,2,0,0,0,0,0,255,21,105,5,2,0,233,34,255,255,255,72,184,255, + 255,255,255,255,191,255,255,72,35,5,67,4,2,0,117,198,72,141,68,36,88,72,199,0,0,0,0,1,72,141,76,36,87,136,25,72,141,84,36,86,64,136,58,76,141,68,36,80,65,137,48,76,141,76,36,96,65,15,41,113,16,65,15,41,49,73,137,65,80,73,199,65,88,8,0,0,0,73, + 137,73,64,184,1,0,0,0,73,137,65,72,73,137,81,48,73,137,65,56,77,137,65,32,73,199,65,40,4,0,0,0,76,137,76,36,40,199,68,36,32,6,0,0,0,72,141,13,183,3,2,0,72,141,21,17,196,1,0,69,49,192,69,49,201,232,198,234,255,255,233,61,255,255,255,72,141,13, + 161,23,2,0,232,92,26,0,0,131,61,149,23,2,0,255,15,133,215,254,255,255,72,141,13,54,188,1,0,49,210,65,184,0,8,0,0,255,21,202,210,1,0,72,137,5,107,23,2,0,72,141,13,108,23,2,0,232,143,26,0,0,233,170,254,255,255,204,204,73,137,208,49,210,233,6,0, + 0,0,204,204,204,204,204,204,65,87,65,86,65,84,86,87,83,72,129,236,184,0,0,0,15,41,180,36,160,0,0,0,72,139,5,105,249,1,0,72,49,224,72,137,132,36,152,0,0,0,77,133,192,15,132,236,0,0,0,76,137,198,72,137,215,15,40,53,0,180,1,0,72,141,92,36,112,15, + 17,115,24,199,67,32,0,0,0,0,15,87,192,15,17,67,8,72,199,67,23,0,0,0,0,72,137,11,72,137,83,16,72,137,209,232,244,240,255,255,136,67,28,72,184,170,170,170,170,170,170,170,170,76,141,124,36,80,73,137,71,16,65,15,41,55,65,15,41,119,240,65,15,41, + 119,224,65,15,41,119,208,76,141,116,36,32,76,137,241,232,68,18,0,0,76,141,100,36,56,76,137,225,232,55,18,0,0,76,137,249,232,47,18,0,0,72,137,217,76,137,242,232,127,8,0,0,72,137,249,72,137,218,232,55,249,255,255,72,137,217,72,137,242,232,47,241, + 255,255,137,198,76,137,249,232,22,18,0,0,76,137,225,232,14,18,0,0,76,137,241,232,6,18,0,0,72,139,140,36,152,0,0,0,72,49,225,232,60,157,0,0,137,240,15,40,180,36,160,0,0,0,72,129,196,184,0,0,0,91,95,94,65,92,65,94,65,95,195,190,3,64,0,128,235, + 206,204,204,204,204,204,204,204,204,204,204,86,87,83,72,131,236,80,72,139,5,74,248,1,0,72,49,224,72,137,68,36,72,77,133,192,116,99,191,87,0,7,128,72,133,201,116,94,72,137,211,72,133,210,116,86,76,137,198,15,40,5,217,178,1,0,72,141,84,36,48,15, + 41,2,15,41,68,36,32,232,99,0,0,0,191,87,0,7,128,132,192,116,49,72,141,84,36,32,72,137,217,232,77,0,0,0,132,192,116,32,49,192,139,76,132,32,57,76,132,48,119,50,114,41,72,255,192,72,131,248,4,117,235,49,192,235,40,191,3,64,0,128,72,139,76,36,72, + 72,49,225,232,128,156,0,0,137,248,72,131,196,80,91,95,94,195,184,255,255,255,255,235,5,184,1,0,0,0,137,6,49,255,235,215,65,87,65,86,86,87,85,83,72,131,236,56,72,137,214,72,137,207,72,139,5,147,247,1,0,72,49,224,72,137,68,36,48,72,141,92,36,40, + 72,199,3,0,0,0,0,64,181,1,69,49,255,69,49,246,235,38,72,131,192,2,72,137,199,235,8,66,199,4,190,0,0,0,0,73,131,255,3,73,141,71,1,65,15,147,198,73,137,199,72,131,248,4,116,60,64,246,197,1,116,221,72,137,249,72,137,218,65,184,10,0,0,0,232,103, + 102,0,0,66,137,4,190,72,139,68,36,40,72,57,248,116,11,72,133,192,116,6,102,131,56,46,116,170,49,237,77,133,255,117,180,72,57,248,117,175,65,128,230,1,72,139,76,36,48,72,49,225,232,185,155,0,0,68,137,240,72,131,196,56,91,93,95,94,65,94,65,95, + 195,204,204,204,204,204,204,204,204,204,73,137,201,49,201,49,210,69,49,192,233,97,248,255,255,65,87,65,86,65,84,86,87,85,83,72,129,236,96,2,0,0,76,137,206,68,137,199,137,211,73,137,207,72,139,5,182,246,1,0,72,49,224,72,137,132,36,88,2,0,0,76, + 141,116,36,80,65,184,8,2,0,0,76,137,241,178,170,232,78,63,0,0,199,68,36,60,8,2,0,0,72,184,170,170,170,170,170,170,170,170,72,141,84,36,48,72,137,2,64,15,182,199,72,199,193,2,0,0,128,72,41,193,72,137,84,36,32,49,237,76,137,250,69,49,192,65,185, + 25,2,2,0,255,21,93,1,2,0,133,192,116,36,72,139,140,36,88,2,0,0,72,49,225,232,249,154,0,0,137,232,72,129,196,96,2,0,0,91,93,95,94,65,92,65,94,65,95,195,72,139,188,36,192,2,0,0,72,141,5,206,183,1,0,72,141,21,223,176,1,0,132,219,72,15,69,208,72, + 139,76,36,48,76,141,100,36,60,76,137,100,36,40,76,137,116,36,32,69,49,192,69,49,201,255,21,1,1,2,0,65,137,198,133,192,117,117,131,124,36,60,3,114,110,76,141,124,36,80,72,137,249,76,137,250,232,55,16,0,0,69,49,246,132,219,116,87,199,68,36,60, + 8,2,0,0,72,139,76,36,48,76,137,100,36,40,76,137,124,36,32,72,141,21,114,183,1,0,69,49,192,69,49,201,255,21,178,0,2,0,65,137,198,133,192,117,38,131,124,36,60,3,114,31,72,141,21,111,179,1,0,72,137,249,232,201,16,0,0,72,141,84,36,80,72,137,249, + 232,188,16,0,0,69,49,246,72,139,76,36,48,255,21,98,0,2,0,49,237,69,133,246,15,133,14,255,255,255,131,124,36,60,3,15,130,3,255,255,255,72,137,249,232,166,17,0,0,72,137,193,102,186,92,0,232,128,65,0,0,72,133,192,116,34,72,137,195,72,131,195,2, + 15,40,5,229,175,1,0,72,141,84,36,64,15,41,2,72,137,217,232,113,253,255,255,132,192,117,7,49,237,233,193,254,255,255,72,133,246,116,11,72,137,241,72,137,218,232,102,15,0,0,72,141,76,36,64,72,137,250,232,7,0,0,0,137,197,233,157,254,255,255,86, + 87,72,131,236,40,72,137,214,49,192,72,141,21,172,182,1,0,68,139,4,16,68,57,4,1,119,12,114,24,72,131,192,4,72,131,248,16,117,234,72,137,241,72,131,196,40,95,94,233,45,231,255,255,72,141,13,145,182,1,0,72,139,61,218,205,1,0,255,215,72,137,241, + 232,250,16,0,0,72,137,193,255,21,207,205,1,0,72,141,13,216,178,1,0,255,215,49,192,72,131,196,40,95,94,195,204,204,204,204,204,204,204,204,204,204,204,204,204,233,205,1,0,0,204,204,204,204,204,204,204,204,204,204,204,139,65,12,61,255,255,255, + 127,116,12,141,80,1,240,15,177,81,12,117,236,235,5,186,255,255,255,127,137,208,195,204,204,86,72,131,236,32,139,65,12,61,255,255,255,127,116,66,141,112,255,240,15,177,113,12,117,236,133,246,117,57,72,133,201,116,18,72,139,1,72,139,64,32,186, + 1,0,0,0,255,21,28,197,1,0,72,139,13,133,17,2,0,49,246,72,133,201,116,20,72,139,1,72,139,64,16,255,21,1,197,1,0,235,5,190,254,255,255,127,137,240,72,131,196,32,94,195,204,204,86,87,72,131,236,104,72,137,206,72,139,5,216,243,1,0,72,49,224,72,137, + 68,36,96,133,210,120,125,72,199,68,36,40,0,0,0,0,77,133,192,116,106,73,139,0,72,139,0,72,141,21,81,182,1,0,72,141,124,36,40,76,137,193,73,137,248,255,21,168,196,1,0,137,194,76,139,7,72,139,78,56,72,139,1,72,139,64,24,255,21,146,196,1,0,72,139, + 76,36,40,72,133,201,116,22,72,199,68,36,40,0,0,0,0,72,139,1,72,139,64,16,255,21,114,196,1,0,72,139,76,36,96,72,49,225,232,21,152,0,0,49,192,72,131,196,104,95,94,195,69,49,192,235,180,139,70,64,133,192,15,142,120,255,255,255,255,200,137,70,64, + 72,139,70,48,72,141,76,36,48,72,137,65,32,15,16,70,16,15,16,78,32,15,41,73,16,15,41,1,72,137,242,232,248,246,255,255,133,192,121,173,72,139,78,56,72,139,17,76,139,74,24,137,194,69,49,192,76,137,200,255,21,6,196,1,0,235,146,204,204,204,204,86, + 87,72,131,236,40,137,215,72,137,206,72,141,5,62,173,1,0,72,137,1,72,139,73,56,72,133,201,116,21,72,199,70,56,0,0,0,0,72,139,1,72,139,64,16,255,21,205,195,1,0,199,70,12,1,0,0,192,133,255,116,8,72,137,241,232,82,18,0,0,72,137,240,72,131,196,40, + 95,94,195,15,11,72,131,236,40,73,199,0,0,0,0,0,68,139,26,68,139,82,4,68,139,74,8,139,82,12,69,133,219,117,22,69,133,210,117,17,65,129,249,192,0,0,0,117,8,129,250,0,0,0,70,116,40,184,2,64,0,128,65,129,251,137,51,138,78,117,44,65,129,250,216,201, + 210,75,117,35,65,129,249,182,181,18,79,117,26,129,250,238,108,193,77,117,18,73,137,8,72,139,1,72,139,64,8,255,21,66,195,1,0,49,192,72,131,196,40,195,204,204,204,86,87,83,72,131,236,48,72,137,206,72,139,5,31,242,1,0,72,49,224,72,137,68,36,40, + 139,5,233,15,2,0,139,13,215,253,1,0,101,72,139,20,37,88,0,0,0,72,139,12,202,59,129,4,0,0,0,15,143,255,0,0,0,72,131,61,186,15,2,0,0,116,66,186,131,0,0,0,72,137,241,232,169,11,0,0,72,137,241,232,227,13,0,0,72,141,124,36,32,137,7,72,139,29,149, + 15,2,0,72,137,241,232,23,14,0,0,72,137,249,72,137,194,72,137,216,255,21,182,194,1,0,133,192,15,132,151,0,0,0,139,5,136,15,2,0,139,13,102,253,1,0,101,72,139,20,37,88,0,0,0,72,139,12,202,59,129,4,0,0,0,15,143,220,0,0,0,72,139,5,90,15,2,0,72,133, + 192,116,95,72,141,76,36,32,72,199,1,0,0,0,0,255,21,107,194,1,0,137,199,133,192,120,48,72,139,84,36,32,72,137,241,232,180,11,0,0,132,192,117,20,255,21,150,201,1,0,15,183,248,129,207,0,0,7,128,133,192,15,78,248,72,139,76,36,32,255,21,85,252,1, + 0,72,139,76,36,40,72,49,225,232,216,149,0,0,137,248,72,131,196,48,91,95,94,195,191,144,4,7,128,235,226,139,84,36,32,255,202,72,137,241,232,35,12,0,0,49,201,132,192,191,255,255,0,128,15,69,249,235,198,72,141,13,196,14,2,0,232,111,17,0,0,131,61, + 184,14,2,0,255,15,133,232,254,255,255,72,141,13,165,179,1,0,255,21,53,201,1,0,72,141,21,118,179,1,0,72,137,193,255,21,53,201,1,0,72,137,5,134,14,2,0,72,141,13,135,14,2,0,232,154,17,0,0,233,179,254,255,255,72,141,13,134,14,2,0,232,33,17,0,0,131, + 61,122,14,2,0,255,15,133,11,255,255,255,72,141,13,101,181,1,0,49,255,49,210,65,184,0,8,0,0,255,21,141,201,1,0,72,133,192,116,19,72,141,21,97,181,1,0,72,137,193,255,21,216,200,1,0,72,137,199,72,137,61,54,14,2,0,72,141,13,55,14,2,0,232,58,17,0, + 0,233,196,254,255,255,65,87,65,86,65,84,86,87,83,72,129,236,200,0,0,0,15,41,188,36,176,0,0,0,15,41,180,36,160,0,0,0,72,137,215,72,137,206,72,139,5,24,240,1,0,72,49,224,72,137,132,36,152,0,0,0,49,219,72,137,92,36,64,15,87,246,15,17,116,36,48, + 72,137,92,36,32,198,68,36,40,1,72,141,13,9,179,1,0,72,141,21,210,178,1,0,73,137,240,73,137,249,232,195,1,0,0,72,131,199,24,76,141,70,8,72,137,92,36,64,15,17,116,36,48,72,137,92,36,32,198,68,36,40,0,72,141,13,56,179,1,0,72,141,21,19,179,1,0,73, + 137,249,232,145,1,0,0,73,190,170,170,170,170,170,170,170,170,72,141,188,36,128,0,0,0,76,137,119,16,15,40,61,68,170,1,0,15,41,63,72,137,249,232,225,8,0,0,72,141,13,246,180,1,0,72,137,250,232,34,12,0,0,132,192,116,23,72,141,21,17,181,1,0,72,141, + 140,36,128,0,0,0,232,124,11,0,0,136,70,28,72,141,188,36,128,0,0,0,72,137,249,232,185,8,0,0,69,49,255,72,141,92,36,120,76,137,59,76,137,119,16,15,41,63,72,141,188,36,128,0,0,0,72,137,249,232,133,8,0,0,72,141,70,29,72,141,78,32,76,141,102,24,76, + 137,124,36,64,72,137,68,36,56,72,137,76,36,48,68,136,124,36,40,76,137,100,36,32,72,141,13,205,178,1,0,72,141,21,166,178,1,0,73,137,216,73,137,249,232,207,0,0,0,72,141,124,36,112,76,137,63,72,141,92,36,80,76,137,115,16,15,41,59,72,137,217,232, + 43,8,0,0,76,141,118,30,76,137,116,36,64,15,17,116,36,48,68,136,124,36,40,76,137,100,36,32,72,141,13,216,178,1,0,72,141,21,173,178,1,0,73,137,248,73,137,217,232,130,0,0,0,68,56,126,30,117,52,76,137,116,36,64,15,87,192,15,17,68,36,48,76,137,100, + 36,32,198,68,36,40,0,72,141,13,14,179,1,0,72,141,21,213,178,1,0,76,141,68,36,112,76,141,76,36,80,232,72,0,0,0,72,141,76,36,80,232,200,7,0,0,72,141,140,36,128,0,0,0,232,187,7,0,0,72,139,140,36,152,0,0,0,72,49,225,232,241,146,0,0,15,40,180,36, + 160,0,0,0,15,40,188,36,176,0,0,0,72,129,196,200,0,0,0,91,95,94,65,92,65,94,65,95,195,65,87,65,86,65,85,65,84,86,87,85,83,72,131,236,88,77,137,206,76,137,198,73,137,215,76,139,164,36,224,0,0,0,72,139,188,36,216,0,0,0,72,139,156,36,208,0,0,0,64, + 138,172,36,200,0,0,0,76,139,172,36,192,0,0,0,72,139,5,208,237,1,0,72,49,224,72,137,68,36,80,64,132,237,116,7,198,5,180,247,1,0,1,76,137,242,232,100,10,0,0,132,192,116,78,76,137,241,232,2,10,0,0,72,137,6,72,133,219,116,16,76,137,241,232,178,9, + 0,0,132,192,15,132,88,1,0,0,77,133,237,116,55,72,139,14,72,133,201,116,29,232,246,79,0,0,49,201,131,248,1,15,148,193,65,137,77,0,77,133,228,116,25,65,198,4,36,1,235,18,49,201,235,236,64,132,237,117,40,128,61,78,247,1,0,0,117,31,72,139,76,36, + 80,72,49,225,232,255,145,0,0,144,72,131,196,88,91,93,95,94,65,92,65,93,65,94,65,95,195,76,137,100,36,64,76,141,100,36,72,73,199,4,36,0,0,0,0,76,137,100,36,32,72,141,21,55,178,1,0,72,199,193,1,0,0,128,69,49,192,65,185,25,0,2,0,255,21,9,248,1, + 0,137,197,73,139,12,36,255,21,237,247,1,0,133,237,116,78,72,199,68,36,72,0,0,0,0,76,137,100,36,32,72,141,21,252,177,1,0,72,199,193,2,0,0,128,69,49,192,65,185,25,0,2,0,255,21,206,247,1,0,137,197,72,139,76,36,72,255,21,177,247,1,0,133,237,15,148, + 5,168,246,1,0,76,139,100,36,64,15,133,81,255,255,255,235,12,198,5,148,246,1,0,1,76,139,100,36,64,76,137,100,36,56,72,137,124,36,48,72,137,92,36,40,76,137,108,36,32,72,199,193,2,0,0,128,76,137,250,73,137,240,77,137,241,232,12,1,0,0,132,192,15, + 133,18,255,255,255,76,137,100,36,56,72,137,124,36,48,72,137,92,36,40,76,137,108,36,32,72,199,193,1,0,0,128,76,137,250,73,137,240,77,137,241,232,219,0,0,0,233,228,254,255,255,72,139,54,72,139,76,36,80,72,49,225,232,224,144,0,0,72,137,217,72,137, + 242,73,137,248,72,131,196,88,91,93,95,94,65,92,65,93,65,94,65,95,233,0,0,0,0,65,87,65,86,86,87,85,83,72,131,236,40,76,137,198,72,133,210,15,132,128,0,0,0,72,137,211,72,137,207,189,1,0,0,0,235,32,73,141,78,2,232,84,78,0,0,186,1,0,0,0,137,193, + 211,226,131,248,5,15,67,213,9,23,102,65,199,6,0,0,72,137,217,102,186,44,0,232,249,55,0,0,72,133,192,116,30,73,137,198,73,137,199,73,41,223,73,209,255,73,255,199,72,137,217,232,201,87,0,0,73,57,199,115,205,235,177,102,131,59,0,116,30,72,137,217, + 232,0,78,0,0,186,1,0,0,0,137,193,211,226,185,1,0,0,0,131,248,5,15,67,209,9,23,198,6,1,72,131,196,40,91,93,95,94,65,94,65,95,195,65,87,65,86,65,84,86,87,85,83,72,129,236,192,0,0,0,15,41,180,36,176,0,0,0,76,137,206,76,137,199,73,137,214,72,137, + 203,72,139,5,54,235,1,0,72,49,224,72,137,132,36,168,0,0,0,73,188,170,170,170,170,170,170,170,170,76,141,124,36,112,77,137,103,16,15,40,53,201,165,1,0,65,15,41,55,76,137,249,232,101,4,0,0,76,137,249,232,205,248,255,255,72,141,76,36,80,76,137, + 97,16,15,41,49,232,76,4,0,0,76,141,188,36,144,0,0,0,77,137,103,16,65,15,41,55,76,137,249,232,52,4,0,0,49,201,76,137,250,232,242,221,255,255,133,192,15,136,166,1,0,0,72,141,140,36,144,0,0,0,232,15,7,0,0,72,137,193,102,186,92,0,232,233,54,0,0, + 72,133,192,117,13,72,141,140,36,144,0,0,0,232,241,6,0,0,72,131,192,2,72,141,76,36,80,72,137,194,232,234,4,0,0,72,141,140,36,144,0,0,0,232,235,3,0,0,72,199,68,36,72,0,0,0,0,77,133,246,15,132,90,1,0,0,102,65,131,62,0,15,132,79,1,0,0,76,141,188, + 36,144,0,0,0,77,137,103,16,65,15,41,55,76,137,241,232,112,86,0,0,72,141,80,42,76,137,249,232,226,3,0,0,72,141,21,81,175,1,0,76,137,249,232,109,5,0,0,76,137,249,76,137,242,232,98,5,0,0,76,137,249,232,112,6,0,0,72,141,76,36,72,72,137,76,36,32, + 49,237,72,137,217,72,137,194,69,49,192,65,185,1,0,0,0,255,21,253,244,1,0,137,195,76,137,249,232,93,3,0,0,133,219,15,133,216,0,0,0,76,139,164,36,56,1,0,0,76,139,188,36,48,1,0,0,76,139,180,36,40,1,0,0,72,139,156,36,32,1,0,0,72,141,76,36,112,232, + 19,6,0,0,72,139,76,36,72,76,137,100,36,56,76,137,124,36,48,76,137,116,36,40,72,137,92,36,32,72,137,194,73,137,248,73,137,241,232,199,0,0,0,64,181,1,132,192,117,98,72,141,76,36,80,232,219,5,0,0,72,139,76,36,72,76,137,100,36,56,76,137,124,36,48, + 76,137,116,36,40,72,137,92,36,32,72,137,194,73,137,248,73,137,241,232,143,0,0,0,132,192,117,45,72,139,76,36,72,76,137,100,36,56,76,137,124,36,48,76,137,116,36,40,72,137,92,36,32,72,141,21,174,174,1,0,73,137,248,73,137,241,232,96,0,0,0,137,197, + 72,139,76,36,72,255,21,22,244,1,0,235,17,72,141,76,36,80,232,30,4,0,0,233,135,254,255,255,49,237,72,141,76,36,80,232,115,2,0,0,72,141,76,36,112,232,105,2,0,0,72,139,140,36,168,0,0,0,72,49,225,232,159,141,0,0,137,232,15,40,180,36,176,0,0,0,72, + 129,196,192,0,0,0,91,93,95,94,65,92,65,94,65,95,195,65,87,65,86,65,85,65,84,86,87,85,83,72,131,236,72,76,137,207,76,137,198,72,137,211,73,137,206,76,139,172,36,200,0,0,0,76,139,188,36,192,0,0,0,76,139,164,36,184,0,0,0,72,139,172,36,176,0,0,0, + 72,139,5,136,232,1,0,72,49,224,72,137,68,36,64,77,133,228,116,86,76,137,241,72,137,218,73,137,240,73,137,249,232,16,1,0,0,132,192,116,31,72,137,249,232,120,4,0,0,132,192,117,19,72,139,22,76,137,225,77,137,248,232,66,252,255,255,64,182,1,235, + 2,49,246,72,139,76,36,64,72,49,225,232,240,140,0,0,137,240,72,131,196,72,91,93,95,94,65,92,65,93,65,94,65,95,195,72,133,237,15,132,148,0,0,0,72,141,68,36,60,199,0,0,0,0,0,72,141,76,36,56,199,1,4,0,0,0,72,137,76,36,48,72,137,68,36,40,72,199,68, + 36,32,0,0,0,0,76,137,241,49,210,73,137,216,65,185,16,0,0,0,255,21,223,242,1,0,133,192,116,43,76,137,241,72,137,218,73,137,240,73,137,249,232,112,0,0,0,132,192,15,132,123,255,255,255,72,139,14,72,133,201,116,46,232,45,74,0,0,131,248,1,235,5,131, + 124,36,60,1,15,148,192,15,182,192,137,69,0,64,182,1,77,133,237,15,132,81,255,255,255,65,198,69,0,1,233,71,255,255,255,49,192,235,224,72,139,76,36,64,72,49,225,232,51,140,0,0,76,137,241,72,137,218,73,137,240,73,137,249,72,131,196,72,91,93,95, + 94,65,92,65,93,65,94,65,95,233,0,0,0,0,65,87,65,86,86,87,83,72,129,236,80,2,0,0,76,137,207,76,137,198,72,137,211,73,137,206,72,139,5,57,231,1,0,72,49,224,72,137,132,36,72,2,0,0,76,141,124,36,64,65,184,8,2,0,0,76,137,249,49,210,232,209,47,0,0, + 72,141,68,36,60,199,0,8,2,0,0,72,137,68,36,48,76,137,124,36,40,72,199,68,36,32,0,0,0,0,76,137,241,49,210,73,137,216,65,185,2,0,0,0,255,21,231,241,1,0,137,195,133,192,117,24,72,141,84,36,64,72,137,249,232,56,1,0,0,72,137,249,232,38,3,0,0,72,137, + 6,133,219,15,148,195,72,139,140,36,72,2,0,0,72,49,225,232,108,139,0,0,137,216,72,129,196,80,2,0,0,91,95,94,65,94,65,95,195,204,204,204,72,137,200,15,87,192,15,17,1,72,199,65,16,0,0,0,0,195,86,72,131,236,32,72,199,1,0,0,0,0,72,139,65,16,72,133, + 192,116,29,72,137,206,102,199,0,0,0,72,139,73,16,72,133,201,116,12,232,19,6,0,0,15,87,192,15,17,70,8,72,131,196,32,94,195,86,72,131,236,32,72,137,206,15,87,192,15,17,1,72,199,65,16,0,0,0,0,232,9,0,0,0,72,137,240,72,131,196,32,94,195,65,87,65, + 86,86,87,83,72,131,236,32,64,182,1,72,57,81,8,115,115,72,137,215,72,131,250,255,116,104,72,137,203,72,137,248,72,255,192,72,141,68,63,2,72,199,193,255,255,255,255,72,15,73,200,232,159,5,0,0,72,133,192,116,69,73,137,198,72,139,3,72,133,192,116, + 46,76,139,123,16,76,141,4,69,2,0,0,0,76,137,241,76,137,250,232,216,138,0,0,77,133,255,116,8,76,137,249,232,115,5,0,0,76,137,115,16,72,137,123,8,235,14,102,65,199,6,0,0,76,139,123,16,235,221,49,246,137,240,72,131,196,32,91,95,94,65,94,65,95,195, + 204,86,87,72,131,236,40,72,137,214,72,137,207,72,133,210,116,28,72,137,241,232,175,81,0,0,73,137,192,72,137,249,72,137,242,72,131,196,40,95,94,233,5,0,0,0,69,49,192,235,234,65,86,86,87,83,72,131,236,40,76,137,199,73,137,214,72,137,203,72,199, + 1,0,0,0,0,72,139,65,16,72,133,192,116,5,102,199,0,0,0,64,182,1,72,133,255,116,39,72,137,217,72,137,250,232,254,254,255,255,132,192,116,22,72,139,75,16,76,141,4,63,76,137,242,232,36,138,0,0,72,57,123,8,115,14,49,246,137,240,72,131,196,40,91,95, + 94,65,94,195,72,137,59,72,139,67,16,72,133,192,116,232,102,199,4,120,0,0,235,224,72,199,1,0,0,0,0,72,139,65,16,72,133,192,116,5,102,199,0,0,0,195,72,139,65,8,72,57,208,114,18,72,137,17,72,139,73,16,72,133,201,116,6,102,199,4,81,0,0,72,57,208, + 15,147,192,195,86,87,72,131,236,40,72,137,214,72,137,207,72,133,210,116,28,72,137,241,232,207,80,0,0,73,137,192,72,137,249,72,137,242,72,131,196,40,95,94,233,5,0,0,0,69,49,192,235,234,65,87,65,86,86,87,83,72,131,236,32,64,182,1,72,133,210,116, + 64,77,137,198,72,137,207,72,139,25,76,1,195,114,48,73,137,215,72,137,249,72,137,218,232,41,254,255,255,132,192,116,30,72,139,15,72,1,201,72,3,79,16,77,1,246,76,137,250,77,137,240,232,71,137,0,0,72,57,95,8,115,16,49,246,137,240,72,131,196,32, + 91,95,94,65,94,65,95,195,72,137,31,72,139,71,16,72,133,192,116,230,102,199,4,88,0,0,235,222,204,72,139,1,76,57,192,118,9,72,139,73,16,102,66,137,20,65,76,57,192,15,151,192,195,72,209,234,72,255,194,233,191,253,255,255,204,72,139,65,8,195,204, + 72,139,1,195,72,131,57,0,15,148,192,195,72,131,236,40,72,133,210,116,34,102,131,58,0,116,28,72,139,65,16,72,133,192,116,15,72,137,209,72,137,194,232,175,79,0,0,133,192,235,8,49,192,235,7,72,131,57,0,15,148,192,72,131,196,40,195,204,72,139,65, + 16,195,204,86,87,83,72,131,236,32,72,133,201,72,141,61,61,161,1,0,72,15,69,249,72,141,28,85,2,0,0,0,72,57,211,118,33,72,137,217,255,21,149,238,1,0,72,133,192,116,19,72,137,198,72,137,193,72,137,250,73,137,216,232,103,136,0,0,235,2,49,246,72, + 137,240,72,131,196,32,91,95,94,195,86,87,83,72,131,236,32,72,137,214,72,137,207,49,210,69,49,192,255,21,112,187,1,0,133,192,116,16,137,195,137,194,72,137,241,232,246,252,255,255,132,192,117,10,49,192,72,131,196,32,91,95,94,195,72,137,241,232, + 108,255,255,255,72,137,249,72,137,194,65,137,216,255,21,59,187,1,0,137,194,72,137,241,72,131,196,32,91,95,94,233,20,254,255,255,204,204,65,87,65,86,65,85,65,84,86,87,85,83,72,131,236,40,76,137,206,68,137,195,72,137,215,73,137,206,76,141,60,18, + 76,137,201,76,137,250,232,147,252,255,255,136,68,36,39,72,137,241,76,137,250,232,216,253,255,255,72,133,255,116,84,72,255,207,49,237,76,141,37,85,168,1,0,69,15,182,44,46,132,219,73,137,239,76,15,69,255,79,141,4,63,68,137,232,193,232,4,66,15, + 190,20,32,72,137,241,232,108,254,255,255,78,141,4,125,1,0,0,0,65,131,229,15,67,15,190,84,37,0,72,137,241,232,82,254,255,255,72,255,197,72,131,199,255,114,184,138,68,36,39,72,131,196,40,91,93,95,94,65,92,65,93,65,94,65,95,195,65,86,86,87,85,83, + 72,131,236,96,76,137,206,68,137,197,65,137,214,72,137,203,72,139,5,43,226,1,0,72,49,224,72,137,68,36,88,255,21,61,187,1,0,72,133,192,116,121,72,137,199,72,141,21,207,167,1,0,72,137,193,255,21,125,186,1,0,72,133,192,15,132,247,0,0,0,72,139,140, + 36,184,0,0,0,76,139,140,36,176,0,0,0,72,137,76,36,32,68,137,241,137,234,73,137,240,255,21,225,178,1,0,137,198,72,141,21,138,168,1,0,72,137,249,255,21,63,186,1,0,72,133,192,116,9,72,137,249,255,21,153,185,1,0,72,139,76,36,88,72,49,225,232,100, + 134,0,0,137,240,72,131,196,96,91,93,95,94,65,94,195,255,21,233,185,1,0,15,183,240,129,206,0,0,7,128,133,192,15,78,240,76,141,116,36,84,65,137,54,72,184,170,170,170,170,170,170,170,170,72,141,124,36,48,72,137,71,16,15,40,5,33,156,1,0,15,41,7, + 72,137,249,232,190,250,255,255,186,4,0,0,0,76,137,241,65,176,1,73,137,249,232,91,254,255,255,72,141,13,14,168,1,0,76,139,53,117,186,1,0,65,255,214,72,137,249,232,140,253,255,255,72,137,193,65,255,214,72,141,13,133,168,1,0,65,255,214,72,137,217, + 65,255,214,72,141,13,203,167,1,0,65,255,214,72,137,249,232,124,250,255,255,233,76,255,255,255,255,21,79,185,1,0,15,183,240,129,206,0,0,7,128,133,192,15,78,240,76,141,116,36,84,65,137,54,72,184,170,170,170,170,170,170,170,170,72,141,92,36,48, + 72,137,67,16,15,40,5,135,155,1,0,15,41,3,72,137,217,232,36,250,255,255,186,4,0,0,0,76,137,241,65,176,1,73,137,217,232,193,253,255,255,72,141,13,152,166,1,0,76,139,53,219,185,1,0,65,255,214,72,137,217,232,242,252,255,255,72,137,193,65,255,214, + 72,141,13,65,167,1,0,65,255,214,72,137,217,232,242,249,255,255,233,164,254,255,255,184,1,0,0,0,195,204,72,131,236,40,232,139,2,0,0,235,2,51,192,72,131,196,40,195,204,204,233,7,76,0,0,204,204,204,233,115,2,0,0,204,204,204,233,235,255,255,255, + 204,204,204,72,137,92,36,8,87,72,131,236,32,186,160,15,0,0,72,141,13,122,235,1,0,255,21,252,184,1,0,72,141,13,13,32,1,0,255,21,135,184,1,0,72,139,216,72,133,192,117,21,72,141,13,64,32,1,0,255,21,114,184,1,0,72,139,216,72,133,192,116,127,72,141, + 21,75,32,1,0,72,139,203,255,21,106,184,1,0,72,141,21,91,32,1,0,72,139,203,72,139,248,255,21,87,184,1,0,72,133,255,116,21,72,133,192,116,16,72,137,61,62,235,1,0,72,137,5,63,235,1,0,235,30,69,51,201,69,51,192,51,201,65,141,81,1,255,21,27,183,1, + 0,72,137,5,236,234,1,0,72,133,192,116,36,51,201,232,192,3,0,0,132,192,116,25,72,141,13,141,1,0,0,232,236,1,0,0,72,139,92,36,48,51,192,72,131,196,32,95,195,185,7,0,0,0,232,93,5,0,0,204,64,83,72,131,236,32,72,139,217,72,141,13,176,234,1,0,255, + 21,234,182,1,0,131,59,0,117,17,131,11,255,235,52,185,100,0,0,0,232,158,0,0,0,235,234,131,59,255,116,239,101,72,139,4,37,88,0,0,0,139,13,4,235,1,0,65,184,4,0,0,0,72,139,20,200,139,5,0,223,1,0,65,137,4,16,72,141,13,101,234,1,0,72,131,196,32,91, + 72,255,37,25,184,1,0,204,64,83,72,131,236,32,72,139,217,72,141,13,72,234,1,0,255,21,130,182,1,0,139,5,204,222,1,0,72,141,13,53,234,1,0,139,21,179,234,1,0,255,192,137,5,183,222,1,0,137,3,101,72,139,4,37,88,0,0,0,65,185,4,0,0,0,76,139,4,208,139, + 5,156,222,1,0,67,137,4,1,255,21,194,183,1,0,72,131,196,32,91,233,100,0,0,0,64,83,72,131,236,32,72,139,5,19,234,1,0,139,217,72,133,192,116,29,68,139,193,72,141,21,218,233,1,0,72,141,13,195,233,1,0,72,131,196,32,91,72,255,37,135,175,1,0,72,141, + 13,192,233,1,0,255,21,122,183,1,0,72,139,13,171,233,1,0,69,51,192,139,211,255,21,80,184,1,0,72,141,13,161,233,1,0,72,131,196,32,91,72,255,37,213,181,1,0,204,72,131,236,40,72,139,5,185,233,1,0,72,133,192,116,18,72,141,13,109,233,1,0,72,131,196, + 40,72,255,37,50,175,1,0,72,139,13,99,233,1,0,255,21,165,183,1,0,72,139,13,86,233,1,0,72,131,196,40,72,255,37,91,183,1,0,204,204,204,72,131,236,40,72,141,13,69,233,1,0,255,21,111,181,1,0,72,139,13,48,233,1,0,72,133,201,116,6,255,21,69,181,1,0, + 72,131,196,40,195,64,83,72,131,236,32,72,139,217,235,15,72,139,203,232,217,44,0,0,133,192,116,19,72,139,203,232,129,73,0,0,72,133,192,116,231,72,131,196,32,91,195,72,131,251,255,116,6,232,67,6,0,0,204,232,93,6,0,0,204,72,131,236,40,232,15,0, + 0,0,72,247,216,27,192,247,216,255,200,72,131,196,40,195,204,64,83,72,131,236,32,72,131,61,22,233,1,0,255,72,139,217,117,7,232,36,52,0,0,235,15,72,139,211,72,141,13,0,233,1,0,232,135,51,0,0,51,210,133,192,72,15,68,211,72,139,194,72,131,196,32, + 91,195,204,204,72,131,236,24,76,139,193,184,77,90,0,0,102,57,5,21,189,255,255,117,120,72,99,13,72,189,255,255,72,141,21,5,189,255,255,72,3,202,129,57,80,69,0,0,117,95,184,11,2,0,0,102,57,65,24,117,84,76,43,194,15,183,81,20,72,131,194,24,72,3, + 209,15,183,65,6,72,141,12,128,76,141,12,202,72,137,20,36,73,59,209,116,24,139,74,12,76,59,193,114,10,139,66,8,3,193,76,59,192,114,8,72,131,194,40,235,223,51,210,72,133,210,117,4,50,192,235,20,131,122,36,0,125,4,50,192,235,10,176,1,235,6,50,192, + 235,2,50,192,72,131,196,24,195,72,131,236,40,232,59,7,0,0,133,192,116,33,101,72,139,4,37,48,0,0,0,72,139,72,8,235,5,72,59,200,116,20,51,192,240,72,15,177,13,20,232,1,0,117,238,50,192,72,131,196,40,195,176,1,235,247,204,204,204,64,83,72,131,236, + 32,138,217,232,251,6,0,0,51,210,133,192,116,11,132,219,117,7,72,135,21,230,231,1,0,72,131,196,32,91,195,64,83,72,131,236,32,15,182,5,219,231,1,0,133,201,187,1,0,0,0,15,68,195,136,5,203,231,1,0,232,14,5,0,0,232,1,36,0,0,132,192,117,4,50,192,235, + 20,232,176,42,0,0,132,192,117,9,51,201,232,17,36,0,0,235,234,138,195,72,131,196,32,91,195,204,204,204,64,83,72,131,236,32,128,61,143,231,1,0,0,138,217,116,4,132,210,117,12,232,146,42,0,0,138,203,232,227,35,0,0,176,1,72,131,196,32,91,195,204, + 204,204,64,83,72,131,236,32,128,61,100,231,1,0,0,139,217,117,103,131,249,1,119,106,232,81,6,0,0,133,192,116,40,133,219,117,36,72,141,13,78,231,1,0,232,173,49,0,0,133,192,117,16,72,141,13,86,231,1,0,232,157,49,0,0,133,192,116,46,50,192,235,51, + 102,15,111,5,41,28,1,0,72,131,200,255,243,15,127,5,29,231,1,0,72,137,5,38,231,1,0,243,15,127,5,38,231,1,0,72,137,5,47,231,1,0,198,5,249,230,1,0,1,176,1,72,131,196,32,91,195,185,5,0,0,0,232,58,1,0,0,204,204,72,137,92,36,8,72,137,108,36,16,72, + 137,116,36,24,87,72,131,236,32,73,139,249,73,139,240,139,218,72,139,233,232,188,5,0,0,133,192,117,22,131,251,1,117,17,76,139,198,51,210,72,139,205,72,139,199,255,21,30,172,1,0,72,139,84,36,88,139,76,36,80,72,139,92,36,48,72,139,108,36,56,72, + 139,116,36,64,72,131,196,32,95,233,24,56,0,0,72,131,236,40,51,201,232,9,255,255,255,132,192,15,149,192,72,131,196,40,195,204,204,204,72,131,236,40,232,95,5,0,0,133,192,116,7,232,162,3,0,0,235,25,232,71,5,0,0,139,200,232,8,45,0,0,133,192,116, + 4,50,192,235,7,232,183,52,0,0,176,1,72,131,196,40,195,72,131,236,40,232,43,5,0,0,133,192,116,16,72,141,13,44,230,1,0,72,131,196,40,233,247,48,0,0,232,18,42,0,0,133,192,117,5,232,29,42,0,0,72,131,196,40,195,72,131,236,40,51,201,232,69,41,0,0, + 72,131,196,40,233,120,34,0,0,72,131,236,40,232,127,34,0,0,132,192,117,4,50,192,235,18,232,54,41,0,0,132,192,117,7,232,125,34,0,0,235,236,176,1,72,131,196,40,195,72,131,236,40,232,47,41,0,0,232,102,34,0,0,176,1,72,131,196,40,195,204,204,204,131, + 37,229,229,1,0,0,195,72,137,92,36,8,85,72,141,172,36,64,251,255,255,72,129,236,192,5,0,0,139,217,185,23,0,0,0,255,21,234,178,1,0,133,192,116,4,139,203,205,41,185,3,0,0,0,232,196,255,255,255,51,210,72,141,77,240,65,184,208,4,0,0,232,143,34,0, + 0,72,141,77,240,255,21,37,179,1,0,72,139,157,232,0,0,0,72,141,149,216,4,0,0,72,139,203,69,51,192,255,21,19,179,1,0,72,133,192,116,60,72,131,100,36,56,0,72,141,141,224,4,0,0,72,139,149,216,4,0,0,76,139,200,72,137,76,36,48,76,139,195,72,141,141, + 232,4,0,0,72,137,76,36,40,72,141,77,240,72,137,76,36,32,51,201,255,21,242,178,1,0,72,139,133,200,4,0,0,72,141,76,36,80,72,137,133,232,0,0,0,51,210,72,141,133,200,4,0,0,65,184,152,0,0,0,72,131,192,8,72,137,133,136,0,0,0,232,248,33,0,0,72,139, + 133,200,4,0,0,72,137,68,36,96,199,68,36,80,21,0,0,64,199,68,36,84,1,0,0,0,255,21,6,178,1,0,131,248,1,72,141,68,36,80,72,137,68,36,64,72,141,69,240,15,148,195,72,137,68,36,72,51,201,255,21,165,178,1,0,72,141,76,36,64,255,21,202,178,1,0,133,192, + 117,12,132,219,117,8,141,72,3,232,190,254,255,255,72,139,156,36,208,5,0,0,72,129,196,192,5,0,0,93,195,204,64,83,72,131,236,32,72,139,217,72,139,194,72,141,13,109,25,1,0,15,87,192,72,137,11,72,141,83,8,72,141,72,8,15,17,2,232,107,31,0,0,72,139, + 195,72,131,196,32,91,195,204,204,204,204,204,204,72,131,121,8,0,72,141,5,76,25,1,0,72,15,69,65,8,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,72,137,92,36,8,87,72,131,236,32,72,141,5,23,25,1,0,72,139,249,72,137,1,139,218,72,131, + 193,8,232,170,31,0,0,246,195,1,116,13,186,24,0,0,0,72,139,207,232,244,247,255,255,72,139,92,36,48,72,139,199,72,131,196,32,95,195,204,204,72,131,97,16,0,72,141,5,24,25,1,0,72,137,65,8,72,141,5,253,24,1,0,72,137,1,72,139,193,195,204,204,72,141, + 5,189,24,1,0,72,137,1,72,131,193,8,233,85,31,0,0,204,64,83,72,131,236,32,72,139,217,72,139,194,72,141,13,157,24,1,0,15,87,192,72,137,11,72,141,83,8,72,141,72,8,15,17,2,232,155,30,0,0,72,141,5,176,24,1,0,72,137,3,72,139,195,72,131,196,32,91,195, + 72,131,97,16,0,72,141,5,208,24,1,0,72,137,65,8,72,141,5,181,24,1,0,72,137,1,72,139,193,195,204,204,64,83,72,131,236,32,72,139,217,72,139,194,72,141,13,65,24,1,0,15,87,192,72,137,11,72,141,83,8,72,141,72,8,15,17,2,232,63,30,0,0,72,141,5,124,24, + 1,0,72,137,3,72,139,195,72,131,196,32,91,195,72,131,236,72,72,141,76,36,32,232,38,255,255,255,72,141,21,179,202,1,0,72,141,76,36,32,232,129,13,0,0,204,72,131,236,72,72,141,76,36,32,232,118,255,255,255,72,141,21,27,203,1,0,72,141,76,36,32,232, + 97,13,0,0,204,72,137,92,36,16,72,137,116,36,24,87,72,131,236,16,51,192,51,201,15,162,68,139,193,69,51,219,68,139,210,65,129,240,110,116,101,108,65,129,242,105,110,101,73,68,139,203,139,240,51,201,65,141,67,1,69,11,208,15,162,65,129,241,71,101, + 110,117,137,4,36,69,11,209,137,92,36,4,139,249,137,76,36,8,137,84,36,12,117,91,72,131,13,183,214,1,0,255,37,240,63,255,15,72,199,5,159,214,1,0,0,128,0,0,61,192,6,1,0,116,40,61,96,6,2,0,116,33,61,112,6,2,0,116,26,5,176,249,252,255,131,248,32, + 119,36,72,185,1,0,1,0,1,0,0,0,72,15,163,193,115,20,68,139,5,81,226,1,0,65,131,200,1,68,137,5,70,226,1,0,235,7,68,139,5,61,226,1,0,184,7,0,0,0,68,141,72,251,59,240,124,38,51,201,15,162,137,4,36,68,139,219,137,92,36,4,137,76,36,8,137,84,36,12, + 15,186,227,9,115,10,69,11,193,68,137,5,10,226,1,0,199,5,16,214,1,0,1,0,0,0,68,137,13,13,214,1,0,15,186,231,20,15,131,145,0,0,0,68,137,13,248,213,1,0,187,6,0,0,0,137,29,241,213,1,0,15,186,231,27,115,121,15,186,231,28,115,115,51,201,15,1,208,72, + 193,226,32,72,11,208,72,137,84,36,32,72,139,68,36,32,34,195,58,195,117,87,139,5,195,213,1,0,131,200,8,199,5,178,213,1,0,3,0,0,0,137,5,176,213,1,0,65,246,195,32,116,56,131,200,32,199,5,153,213,1,0,5,0,0,0,137,5,151,213,1,0,184,0,0,3,208,68,35, + 216,68,59,216,117,24,72,139,68,36,32,36,224,60,224,117,13,131,13,120,213,1,0,64,137,29,110,213,1,0,72,139,92,36,40,51,192,72,139,116,36,48,72,131,196,16,95,195,184,1,0,0,0,195,204,204,51,192,57,5,64,225,1,0,15,149,192,195,194,0,0,204,204,204, + 204,204,204,204,204,204,204,204,204,204,64,83,72,131,236,32,72,141,5,131,22,1,0,72,139,217,72,137,1,246,194,1,116,10,186,24,0,0,0,232,230,244,255,255,72,139,195,72,131,196,32,91,195,204,72,137,92,36,8,72,137,116,36,16,72,137,124,36,32,65,86, + 72,131,236,32,72,139,242,76,139,241,51,201,232,178,248,255,255,132,192,15,132,200,0,0,0,232,69,248,255,255,138,216,136,68,36,64,64,183,1,131,61,109,224,1,0,0,15,133,197,0,0,0,199,5,93,224,1,0,1,0,0,0,232,228,249,255,255,132,192,116,79,232,143, + 10,0,0,232,58,10,0,0,232,81,10,0,0,72,141,21,46,166,1,0,72,141,13,255,165,1,0,232,142,49,0,0,133,192,117,41,232,205,249,255,255,132,192,116,32,72,141,21,222,165,1,0,72,141,13,207,165,1,0,232,42,49,0,0,199,5,8,224,1,0,2,0,0,0,64,50,255,138,203, + 232,2,248,255,255,64,132,255,117,63,232,44,10,0,0,72,139,216,72,131,56,0,116,36,72,139,200,232,19,247,255,255,132,192,116,24,76,139,198,186,2,0,0,0,73,139,206,72,139,3,76,139,13,82,165,1,0,65,255,209,255,5,25,224,1,0,184,1,0,0,0,235,2,51,192, + 72,139,92,36,48,72,139,116,36,56,72,139,124,36,72,72,131,196,32,65,94,195,185,7,0,0,0,232,252,249,255,255,144,204,204,204,72,137,92,36,8,87,72,131,236,48,64,138,249,139,5,217,223,1,0,133,192,127,13,51,192,72,139,92,36,64,72,131,196,48,95,195, + 255,200,137,5,192,223,1,0,232,43,247,255,255,138,216,136,68,36,32,131,61,86,223,1,0,2,117,55,232,39,249,255,255,232,74,9,0,0,232,193,9,0,0,131,37,62,223,1,0,0,138,203,232,59,247,255,255,51,210,64,138,207,232,161,247,255,255,246,216,27,219,131, + 227,1,232,41,249,255,255,139,195,235,162,185,7,0,0,0,232,119,249,255,255,144,144,204,204,204,204,204,204,204,204,204,72,131,236,40,133,210,116,57,131,234,1,116,40,131,234,1,116,22,131,250,1,116,10,184,1,0,0,0,72,131,196,40,195,232,38,249,255, + 255,235,5,232,247,248,255,255,15,182,192,72,131,196,40,195,73,139,208,72,131,196,40,233,27,254,255,255,77,133,192,15,149,193,72,131,196,40,233,36,255,255,255,72,139,196,72,137,88,32,76,137,64,24,137,80,16,72,137,72,8,86,87,65,86,72,131,236,64, + 73,139,240,139,250,76,139,241,133,210,117,15,57,21,228,222,1,0,127,7,51,192,233,238,0,0,0,141,66,255,131,248,1,119,69,72,139,5,52,20,1,0,72,133,192,117,10,199,68,36,48,1,0,0,0,235,20,255,21,231,163,1,0,139,216,137,68,36,48,133,192,15,132,178, + 0,0,0,76,139,198,139,215,73,139,206,232,60,255,255,255,139,216,137,68,36,48,133,192,15,132,151,0,0,0,76,139,198,139,215,73,139,206,232,46,242,255,255,139,216,137,68,36,48,131,255,1,117,54,133,192,117,50,76,139,198,51,210,73,139,206,232,18,242, + 255,255,72,133,246,15,149,193,232,110,254,255,255,72,139,5,187,19,1,0,72,133,192,116,14,76,139,198,51,210,73,139,206,255,21,112,163,1,0,133,255,116,5,131,255,3,117,64,76,139,198,139,215,73,139,206,232,202,254,255,255,139,216,137,68,36,48,133, + 192,116,41,72,139,5,129,19,1,0,72,133,192,117,9,141,88,1,137,92,36,48,235,20,76,139,198,139,215,73,139,206,255,21,45,163,1,0,139,216,137,68,36,48,235,6,51,219,137,92,36,48,139,195,72,139,92,36,120,72,131,196,64,65,94,95,94,195,204,204,204,204, + 204,204,204,204,204,204,204,204,204,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,73,139,248,139,218,72,139,241,131,250,1,117,5,232,155,6,0,0,76,139,199,139,211,72,139,206,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,233,131, + 254,255,255,204,204,204,72,137,92,36,8,87,72,131,236,32,72,139,5,135,221,1,0,191,1,0,0,0,72,59,199,116,118,72,133,192,117,108,72,141,13,217,18,1,0,255,21,243,169,1,0,72,139,216,72,133,192,117,5,72,139,223,235,56,72,141,21,223,18,1,0,72,139,203, + 255,21,230,169,1,0,72,133,192,116,230,72,141,21,226,18,1,0,72,137,5,67,221,1,0,72,139,203,255,21,202,169,1,0,72,133,192,116,202,72,137,5,54,221,1,0,51,192,240,72,15,177,29,27,221,1,0,117,5,72,59,223,116,13,72,59,199,15,149,192,235,7,64,138,199, + 235,2,50,192,72,139,92,36,48,72,131,196,32,95,195,204,204,72,137,92,36,8,72,137,116,36,16,72,137,124,36,24,76,99,5,22,177,255,255,72,141,53,211,176,255,255,76,3,198,72,139,218,72,139,249,65,131,184,132,0,0,0,13,118,72,69,139,144,240,0,0,0,69, + 51,201,69,133,210,116,57,65,15,183,72,20,69,15,183,88,6,72,131,193,24,69,139,84,50,12,73,3,200,69,133,219,116,30,139,65,12,68,59,208,114,10,139,81,8,3,194,68,59,208,114,30,65,255,193,72,131,193,40,69,59,203,114,226,51,192,72,139,92,36,8,72,139, + 116,36,16,72,139,124,36,24,195,137,23,139,65,36,137,3,139,65,12,72,3,198,235,225,204,204,204,72,137,92,36,8,87,72,129,236,128,0,0,0,72,139,250,65,184,48,0,0,0,72,141,84,36,32,72,139,217,255,21,64,170,1,0,72,133,192,117,5,141,72,25,205,41,246, + 68,36,68,68,116,82,72,141,76,36,80,255,21,220,168,1,0,68,139,76,36,84,51,210,69,139,193,73,247,216,76,35,195,65,141,73,255,139,193,35,203,35,199,3,193,72,255,200,73,3,193,73,247,241,51,210,72,139,200,72,139,199,73,247,241,72,3,200,139,193,133, + 201,116,14,240,65,131,8,0,77,3,193,72,131,232,1,117,242,72,139,156,36,144,0,0,0,72,129,196,128,0,0,0,95,195,72,139,196,72,137,88,8,72,137,112,16,87,72,131,236,32,72,139,250,139,241,72,141,80,32,72,141,72,24,232,170,254,255,255,72,139,216,72, + 133,192,117,8,199,7,4,0,0,0,235,76,131,61,179,219,1,0,0,117,39,247,68,36,72,0,0,0,128,199,5,159,219,1,0,1,0,0,0,117,7,185,25,0,0,0,205,41,139,84,36,64,72,139,203,232,6,255,255,255,139,84,36,64,76,139,207,68,139,198,72,139,203,255,21,79,169,1, + 0,133,192,117,5,141,72,25,205,41,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,204,204,64,83,72,131,236,32,247,5,108,17,1,0,0,16,0,0,15,132,142,0,0,0,232,129,253,255,255,187,1,0,0,0,132,192,116,24,72,139,5,17,219,1,0,72,141,13,26,219, + 1,0,255,21,36,160,1,0,235,25,243,144,72,139,5,9,219,1,0,72,133,192,117,242,240,72,15,177,29,251,218,1,0,117,233,139,5,251,218,1,0,3,195,137,5,243,218,1,0,59,195,117,17,72,141,21,236,218,1,0,185,4,0,0,0,232,250,254,255,255,232,33,253,255,255, + 132,192,116,26,72,139,5,190,218,1,0,72,141,13,191,218,1,0,72,131,196,32,91,72,255,37,195,159,1,0,72,199,5,168,218,1,0,0,0,0,0,72,131,196,32,91,195,204,204,72,131,236,40,247,5,194,16,1,0,0,16,0,0,116,126,232,219,252,255,255,132,192,116,24,72, + 139,5,112,218,1,0,72,141,13,121,218,1,0,255,21,131,159,1,0,235,28,243,144,72,139,5,104,218,1,0,72,133,192,117,242,141,72,1,240,72,15,177,13,87,218,1,0,117,230,131,5,86,218,1,0,255,117,16,139,13,82,218,1,0,72,141,84,36,48,232,96,254,255,255,232, + 135,252,255,255,132,192,116,22,72,139,5,36,218,1,0,72,141,13,37,218,1,0,255,21,47,159,1,0,235,11,72,199,5,18,218,1,0,0,0,0,0,72,131,196,40,195,204,72,137,92,36,16,72,137,116,36,24,72,137,124,36,32,85,65,84,65,85,65,86,65,87,72,139,236,72,131, + 236,112,76,139,226,76,139,241,232,150,254,255,255,65,139,70,4,76,141,5,183,173,255,255,69,139,126,8,73,3,192,65,139,86,12,77,3,248,65,139,78,16,73,3,208,69,139,110,20,73,3,200,72,131,101,224,0,77,3,232,72,131,101,232,0,15,87,192,131,101,240, + 0,69,139,70,28,72,137,69,200,65,139,6,68,137,69,48,199,69,176,72,0,0,0,76,137,117,184,76,137,101,192,15,17,69,208,168,1,117,41,72,141,69,176,72,137,69,48,232,212,254,255,255,51,210,76,141,77,48,185,87,0,109,192,68,141,66,1,255,21,175,166,1,0, + 51,192,233,4,2,0,0,73,139,63,73,139,244,72,43,242,72,193,254,3,139,246,72,139,4,241,72,193,232,63,131,240,1,137,69,208,116,19,139,4,241,72,141,13,17,173,255,255,72,3,193,72,137,69,216,235,7,15,183,4,241,137,69,216,72,139,5,248,15,1,0,51,219, + 72,133,192,116,31,72,141,85,176,51,201,255,21,21,158,1,0,72,139,216,72,133,192,15,133,118,1,0,0,72,139,5,210,15,1,0,72,133,255,15,133,161,0,0,0,72,133,192,116,21,72,141,85,176,141,79,1,255,21,231,157,1,0,72,139,248,72,133,192,117,108,72,139, + 77,200,69,51,192,51,210,255,21,216,165,1,0,72,139,248,72,133,192,117,85,255,21,10,165,1,0,137,69,240,72,139,5,144,15,1,0,72,133,192,116,21,72,141,85,176,141,79,3,255,21,166,157,1,0,72,139,248,72,133,192,117,43,72,141,69,176,72,137,69,48,232, + 225,253,255,255,51,210,76,141,77,48,185,126,0,109,192,68,141,66,1,255,21,188,165,1,0,72,139,69,232,233,15,1,0,0,72,139,199,73,135,7,72,59,199,117,9,72,139,207,255,21,55,164,1,0,72,139,5,40,15,1,0,72,137,125,224,72,133,192,116,18,72,141,85,176, + 185,2,0,0,0,255,21,64,157,1,0,72,139,216,72,133,219,15,133,157,0,0,0,65,57,94,20,116,45,65,57,94,28,116,39,72,99,71,60,129,60,56,80,69,0,0,117,26,139,77,48,57,76,56,8,117,17,72,59,124,56,48,117,10,73,139,92,245,0,72,133,219,117,106,72,139,85, + 216,72,139,207,255,21,100,164,1,0,72,139,216,72,133,192,117,85,255,21,46,164,1,0,137,69,240,72,139,5,180,14,1,0,72,133,192,116,21,72,141,85,176,141,75,4,255,21,202,156,1,0,72,139,216,72,133,192,117,43,72,141,69,176,72,137,69,48,232,5,253,255, + 255,51,210,76,141,77,48,185,127,0,109,192,68,141,66,1,255,21,224,164,1,0,232,63,252,255,255,72,139,93,232,73,137,28,36,72,139,5,92,14,1,0,72,133,192,116,27,131,101,240,0,72,141,85,176,185,5,0,0,0,72,137,125,224,72,137,93,232,255,21,108,156,1, + 0,232,183,252,255,255,72,139,195,76,141,92,36,112,73,139,91,56,73,139,115,64,73,139,123,72,73,139,227,65,95,65,94,65,93,65,92,93,195,204,204,72,137,92,36,32,85,72,139,236,72,131,236,32,72,139,5,40,203,1,0,72,187,50,162,223,45,153,43,0,0,72,59, + 195,117,116,72,131,101,24,0,72,141,77,24,255,21,178,163,1,0,72,139,69,24,72,137,69,16,255,21,36,163,1,0,139,192,72,49,69,16,255,21,16,163,1,0,139,192,72,141,77,32,72,49,69,16,255,21,32,164,1,0,139,69,32,72,141,77,16,72,193,224,32,72,51,69,32, + 72,51,69,16,72,51,193,72,185,255,255,255,255,255,255,0,0,72,35,193,72,185,51,162,223,45,153,43,0,0,72,59,195,72,15,68,193,72,137,5,165,202,1,0,72,139,92,36,72,72,247,208,72,137,5,142,202,1,0,72,131,196,32,93,195,72,141,13,161,214,1,0,72,255, + 37,90,163,1,0,204,204,72,141,13,145,214,1,0,233,240,17,0,0,72,131,236,40,232,19,0,0,0,72,131,8,36,232,18,0,0,0,72,131,8,2,72,131,196,40,195,204,72,141,5,121,214,1,0,195,72,141,5,121,214,1,0,195,72,141,5,121,214,1,0,195,72,137,92,36,8,87,72,131, + 236,32,72,141,29,143,170,1,0,72,141,61,136,170,1,0,235,18,72,139,3,72,133,192,116,6,255,21,32,155,1,0,72,131,195,8,72,59,223,114,233,72,139,92,36,48,72,131,196,32,95,195,72,137,92,36,8,87,72,131,236,32,72,141,29,99,170,1,0,72,141,61,92,170,1, + 0,235,18,72,139,3,72,133,192,116,6,255,21,228,154,1,0,72,131,195,8,72,59,223,114,233,72,139,92,36,48,72,131,196,32,95,195,72,137,92,36,24,72,137,116,36,32,87,72,131,236,80,72,139,218,72,139,241,191,32,5,147,25,72,133,210,116,29,246,2,16,116, + 24,72,139,9,72,131,233,8,72,139,1,72,139,88,48,72,139,64,64,255,21,148,154,1,0,72,141,84,36,32,72,139,203,255,21,230,162,1,0,72,137,68,36,32,72,133,219,116,15,246,3,8,117,5,72,133,192,117,5,191,0,64,153,1,186,1,0,0,0,72,137,124,36,40,76,141, + 76,36,40,72,137,116,36,48,185,99,115,109,224,72,137,92,36,56,72,137,68,36,64,68,141,66,3,255,21,128,162,1,0,72,139,92,36,112,72,139,116,36,120,72,131,196,80,95,195,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,84,65,85,65,86,65,87,72, + 131,236,64,72,139,233,77,139,249,73,139,200,73,139,240,76,139,234,232,244,57,0,0,77,139,103,8,77,139,55,73,139,95,56,77,43,244,246,69,4,102,65,139,127,72,15,133,220,0,0,0,72,137,108,36,48,72,137,116,36,56,59,59,15,131,118,1,0,0,139,247,72,3, + 246,139,68,243,4,76,59,240,15,130,170,0,0,0,139,68,243,8,76,59,240,15,131,157,0,0,0,131,124,243,16,0,15,132,146,0,0,0,131,124,243,12,1,116,23,139,68,243,12,72,141,76,36,48,73,3,196,73,139,213,255,208,133,192,120,125,126,116,129,125,0,99,115, + 109,224,117,40,72,131,61,177,12,1,0,0,116,30,72,141,13,168,12,1,0,232,203,56,0,0,133,192,116,14,186,1,0,0,0,72,139,205,255,21,145,12,1,0,139,76,243,16,65,184,1,0,0,0,73,3,204,73,139,213,232,4,57,0,0,73,139,71,64,76,139,197,139,84,243,16,73,139, + 205,68,139,77,0,73,3,212,72,137,68,36,40,73,139,71,40,72,137,68,36,32,255,21,139,161,1,0,232,6,57,0,0,255,199,233,53,255,255,255,51,192,233,177,0,0,0,73,139,119,32,73,43,244,233,150,0,0,0,139,207,72,3,201,139,68,203,4,76,59,240,15,130,130,0, + 0,0,139,68,203,8,76,59,240,115,121,68,139,85,4,65,131,226,32,116,68,69,51,201,133,210,116,56,69,139,193,77,3,192,66,139,68,195,4,72,59,240,114,32,66,139,68,195,8,72,59,240,115,22,139,68,203,16,66,57,68,195,16,117,11,139,68,203,12,66,57,68,195, + 12,116,8,65,255,193,68,59,202,114,200,68,59,202,117,55,139,68,203,16,133,192,116,12,72,59,240,117,30,69,133,210,117,37,235,23,141,71,1,73,139,213,65,137,71,72,68,139,68,203,12,177,1,77,3,196,65,255,208,255,199,139,19,59,250,15,130,96,255,255, + 255,184,1,0,0,0,76,141,92,36,64,73,139,91,48,73,139,107,56,73,139,115,64,73,139,227,65,95,65,94,65,93,65,92,95,195,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,138,25,76,141,81,1,136,26,65,139,241,76,141,53,225, + 166,255,255,73,139,232,76,139,218,72,139,249,246,195,4,116,36,65,15,182,10,131,225,15,74,15,190,132,49,16,99,1,0,66,138,140,49,32,99,1,0,76,43,208,65,139,66,252,211,232,137,66,4,246,195,8,116,10,65,139,2,73,131,194,4,137,66,8,246,195,16,116, + 10,65,139,2,73,131,194,4,137,66,12,73,99,2,77,141,66,4,69,51,201,68,56,76,36,48,117,80,246,195,2,116,75,72,141,20,40,15,182,10,131,225,15,74,15,190,132,49,16,99,1,0,66,138,140,49,32,99,1,0,72,43,208,68,139,82,252,65,211,234,69,137,75,16,69,133, + 210,116,32,139,2,139,74,4,72,141,82,8,59,198,116,10,65,255,193,69,59,202,114,235,235,9,65,137,75,16,235,3,137,66,16,246,195,1,116,37,65,15,182,8,131,225,15,74,15,190,148,49,16,99,1,0,66,138,140,49,32,99,1,0,76,43,194,65,139,80,252,211,234,65, + 137,83,20,72,139,92,36,16,76,43,199,72,139,108,36,24,73,139,192,72,139,116,36,32,72,139,124,36,40,65,94,195,204,204,76,139,65,16,76,141,29,217,165,255,255,76,137,65,8,76,139,201,65,15,182,8,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25, + 32,99,1,0,76,43,192,65,139,64,252,211,232,77,137,65,8,65,137,65,24,65,15,182,8,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,76,43,192,65,139,64,252,77,137,65,8,211,232,65,137,65,28,65,15,182,8,131,225,15,74,15,190,132,25,16, + 99,1,0,66,138,140,25,32,99,1,0,76,43,192,65,139,64,252,77,137,65,8,211,232,65,137,65,32,65,139,0,73,131,192,4,131,122,8,0,77,137,65,8,65,137,65,36,15,132,27,1,0,0,68,139,82,8,65,15,182,8,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32, + 99,1,0,76,43,192,65,139,64,252,77,137,65,8,211,232,65,137,65,24,65,15,182,8,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,76,43,192,65,139,64,252,77,137,65,8,211,232,65,137,65,28,65,15,182,8,131,225,15,74,15,190,132,25,16,99, + 1,0,66,138,140,25,32,99,1,0,76,43,192,65,139,64,252,73,141,80,4,77,137,65,8,211,232,65,137,65,32,65,139,0,73,137,81,8,65,137,65,36,15,182,10,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,72,43,208,139,66,252,211,232,73,137,81, + 8,65,137,65,24,15,182,10,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,72,43,208,139,66,252,211,232,73,137,81,8,65,137,65,28,15,182,10,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,72,43,208,139,66,252,76,141, + 66,4,211,232,73,137,81,8,65,137,65,32,139,2,77,137,65,8,65,137,65,36,73,131,234,1,15,133,233,254,255,255,195,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,32,139,121,12,139,242,133,255,72,139,233,116,43,141,95,255,139, + 251,232,22,54,0,0,72,141,20,155,72,139,64,96,72,141,12,144,72,99,69,16,72,3,193,59,112,4,126,5,59,112,8,126,6,133,219,235,211,51,192,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,131,196,32,95,195,204,204,64,83,72,131,236,32,72,139,218, + 72,139,209,72,139,203,232,24,55,0,0,139,208,72,139,203,232,126,255,255,255,72,133,192,15,149,192,72,131,196,32,91,195,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,76,141,76,36,72,73,139,216,72,139,250,232,69,0,0,0,72,139,215,72,139, + 203,72,139,240,232,211,54,0,0,139,208,72,139,203,232,57,255,255,255,72,133,192,117,6,65,131,201,255,235,4,68,139,72,4,76,139,195,72,139,215,72,139,206,232,180,61,0,0,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,72,137,92,36,16,72,137, + 108,36,24,86,87,65,84,65,86,65,87,72,131,236,32,65,139,112,12,76,139,225,73,139,200,73,139,249,77,139,240,76,139,250,232,110,54,0,0,77,139,20,36,139,232,76,137,23,133,246,116,119,73,99,70,16,141,78,255,139,241,72,141,12,137,72,141,28,136,73, + 3,95,8,59,107,4,126,226,59,107,8,127,221,73,139,15,72,141,84,36,80,69,51,192,255,21,73,156,1,0,76,99,67,16,51,201,76,3,68,36,80,68,139,75,12,68,139,16,69,133,201,116,23,73,141,80,12,72,99,2,73,59,194,116,11,255,193,72,131,194,20,65,59,201,114, + 237,65,59,201,115,153,73,139,4,36,72,141,12,137,73,99,76,136,16,72,139,12,1,72,137,15,72,139,92,36,88,72,139,199,72,139,108,36,96,72,131,196,32,65,95,65,94,65,92,95,94,195,64,85,72,141,108,36,225,72,129,236,224,0,0,0,72,139,5,115,194,1,0,72, + 51,196,72,137,69,15,76,139,85,119,72,141,5,9,6,1,0,15,16,0,76,139,217,72,141,76,36,48,15,16,72,16,15,17,1,15,16,64,32,15,17,73,16,15,16,72,48,15,17,65,32,15,16,64,64,15,17,73,48,15,16,72,80,15,17,65,64,15,16,64,96,15,17,73,80,15,16,136,128,0, + 0,0,15,17,65,96,15,16,64,112,72,139,128,144,0,0,0,15,17,65,112,15,17,137,128,0,0,0,72,137,129,144,0,0,0,72,141,5,112,62,0,0,73,139,11,72,137,69,143,72,139,69,79,72,137,69,159,72,99,69,95,72,137,69,167,72,139,69,87,72,137,69,183,15,182,69,127, + 72,137,69,199,73,139,66,64,72,137,68,36,40,73,139,66,40,76,137,77,151,69,51,201,76,137,69,175,76,141,68,36,48,72,137,85,191,73,139,18,72,137,68,36,32,72,199,69,207,32,5,147,25,255,21,18,155,1,0,72,139,77,15,72,51,204,232,70,102,0,0,72,129,196, + 224,0,0,0,93,195,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,84,65,85,65,86,65,87,72,131,236,64,72,139,156,36,144,0,0,0,76,139,226,72,139,233,73,139,209,72,139,203,73,139,249,69,139,248,68,139,115,12,232,141,52,0,0,69,51,210,139, + 240,69,133,246,15,132,235,0,0,0,76,139,95,8,131,200,255,72,99,91,16,68,139,200,68,139,232,65,139,214,68,141,66,255,75,141,12,128,73,141,4,139,59,116,24,4,126,6,59,116,24,8,126,8,65,139,208,69,133,192,117,224,69,139,194,133,210,116,16,141,66, + 255,72,141,4,128,72,141,20,131,73,3,211,235,3,73,139,210,73,141,12,27,65,131,203,255,72,133,210,116,15,139,66,4,57,1,126,35,139,66,8,57,65,4,127,27,68,59,57,124,22,68,59,121,4,127,16,69,59,203,65,139,192,69,139,232,65,15,69,193,68,139,200,65, + 255,192,72,131,193,20,69,59,198,114,197,69,59,203,76,137,100,36,32,65,139,194,76,137,100,36,48,65,15,69,193,76,141,92,36,64,73,139,91,48,73,139,115,64,137,68,36,40,65,141,69,1,15,16,68,36,32,68,15,69,208,72,139,197,68,137,84,36,56,15,16,76,36, + 48,243,15,127,69,0,243,15,127,77,16,73,139,107,56,73,139,227,65,95,65,94,65,93,65,92,95,195,232,123,49,0,0,204,204,204,138,2,36,1,195,204,204,204,72,131,236,40,65,246,0,1,72,139,9,72,137,76,36,48,116,13,65,139,64,20,72,139,12,8,72,137,76,36, + 48,65,131,201,255,72,141,76,36,48,232,115,62,0,0,72,131,196,40,195,204,204,64,85,72,141,108,36,225,72,129,236,224,0,0,0,72,139,5,243,191,1,0,72,51,196,72,137,69,15,76,139,85,119,72,141,5,233,2,1,0,15,16,0,76,139,217,72,141,76,36,48,15,16,72, + 16,15,17,1,15,16,64,32,15,17,73,16,15,16,72,48,15,17,65,32,15,16,64,64,15,17,73,48,15,16,72,80,15,17,65,64,15,16,64,96,15,17,73,80,15,16,136,128,0,0,0,15,17,65,96,15,16,64,112,72,139,128,144,0,0,0,15,17,65,112,15,17,137,128,0,0,0,72,137,129, + 144,0,0,0,72,141,5,224,64,0,0,72,137,69,143,72,139,69,79,72,137,69,159,72,99,69,95,76,137,69,175,76,139,69,111,72,137,69,167,15,182,69,127,72,137,69,199,73,139,72,24,77,139,64,32,73,3,74,8,77,3,66,8,72,99,69,103,72,137,69,231,73,139,66,64,72, + 137,68,36,40,73,139,66,40,76,137,77,151,69,51,201,72,137,77,183,73,139,11,72,137,85,191,73,139,18,76,137,69,215,76,141,68,36,48,72,137,68,36,32,72,199,69,207,32,5,147,25,255,21,118,152,1,0,72,139,77,15,72,51,204,232,170,99,0,0,72,129,196,224, + 0,0,0,93,195,204,72,139,1,72,139,209,73,137,1,65,246,0,1,116,14,65,139,72,20,72,139,2,72,139,12,1,73,137,9,73,139,193,195,204,204,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,96,72,137,84,36,32,72,139, + 250,15,41,112,232,72,139,233,72,137,84,36,48,51,219,137,92,36,40,72,141,80,216,15,40,116,36,32,72,139,207,102,15,127,112,216,69,139,240,51,246,232,106,248,255,255,68,139,15,51,210,69,133,201,15,132,194,0,0,0,76,139,71,8,76,141,21,53,158,255, + 255,72,139,71,24,139,203,68,59,240,124,27,72,193,232,32,68,59,240,127,18,133,201,139,218,139,242,15,68,217,137,92,36,40,15,40,116,36,32,65,15,182,8,255,194,131,225,15,74,15,190,132,17,16,99,1,0,66,138,140,17,32,99,1,0,76,43,192,65,139,64,252, + 211,232,76,137,71,8,137,71,24,65,15,182,8,131,225,15,74,15,190,132,17,16,99,1,0,66,138,140,17,32,99,1,0,76,43,192,65,139,64,252,211,232,76,137,71,8,137,71,28,65,15,182,8,131,225,15,74,15,190,132,17,16,99,1,0,66,138,140,17,32,99,1,0,76,43,192, + 65,139,64,252,211,232,76,137,71,8,137,71,32,65,139,0,73,131,192,4,76,137,71,8,137,71,36,65,59,209,15,133,73,255,255,255,255,198,102,15,127,116,36,64,72,141,84,36,64,137,116,36,56,72,139,207,232,129,247,255,255,15,16,68,36,48,76,141,92,36,96, + 72,139,197,73,139,91,16,73,139,115,32,73,139,123,40,243,15,127,117,0,15,40,116,36,80,243,15,127,69,16,73,139,107,24,73,139,227,65,94,195,204,204,204,72,131,236,40,232,71,47,0,0,72,139,64,96,72,131,196,40,195,204,204,64,83,72,131,236,32,72,139, + 217,232,46,47,0,0,72,137,88,96,72,131,196,32,91,195,72,131,236,40,232,27,47,0,0,72,139,64,104,72,131,196,40,195,204,204,64,83,72,131,236,32,72,139,217,232,2,47,0,0,72,137,88,104,72,131,196,32,91,195,64,83,72,131,236,32,72,139,217,72,137,17,232, + 231,46,0,0,72,59,88,88,115,11,232,220,46,0,0,72,139,72,88,235,2,51,201,72,137,75,8,232,203,46,0,0,72,137,88,88,72,139,195,72,131,196,32,91,195,204,204,72,137,92,36,8,87,72,131,236,32,72,139,249,232,170,46,0,0,72,59,120,88,117,53,232,159,46,0, + 0,72,139,80,88,72,133,210,116,39,72,139,90,8,72,59,250,116,10,72,139,211,72,133,219,116,22,235,237,232,126,46,0,0,72,137,88,88,72,139,92,36,48,72,131,196,32,95,195,232,166,45,0,0,204,204,72,139,196,72,137,88,16,72,137,104,24,72,137,112,32,87, + 72,131,236,64,73,139,89,8,73,139,249,73,139,240,72,137,80,8,72,139,233,232,62,46,0,0,72,137,88,96,72,139,93,56,232,49,46,0,0,72,137,88,104,232,40,46,0,0,72,139,79,56,76,139,207,76,139,198,139,17,72,139,205,72,3,80,96,51,192,136,68,36,56,72,137, + 68,36,48,137,68,36,40,72,137,84,36,32,72,141,84,36,80,232,95,66,0,0,72,139,92,36,88,72,139,108,36,96,72,139,116,36,104,72,131,196,64,95,195,204,204,72,139,196,72,137,88,16,72,137,104,24,72,137,112,32,87,72,131,236,96,131,96,220,0,73,139,249, + 131,96,224,0,73,139,240,131,96,228,0,72,139,233,131,96,232,0,131,96,236,0,73,139,89,8,198,64,216,0,72,137,80,8,232,158,45,0,0,72,137,88,96,72,139,93,56,232,145,45,0,0,72,137,88,104,232,136,45,0,0,72,139,79,56,72,141,84,36,64,76,139,71,8,198, + 68,36,32,0,139,9,72,3,72,96,72,139,71,16,68,139,8,232,60,244,255,255,198,68,36,56,0,72,141,68,36,64,72,131,100,36,48,0,72,141,84,36,112,131,100,36,40,0,76,139,207,76,139,198,72,137,68,36,32,72,139,205,232,167,65,0,0,76,141,92,36,96,73,139,91, + 24,73,139,107,32,73,139,115,40,73,139,227,95,195,204,72,139,196,76,137,72,32,76,137,64,24,72,137,80,16,72,137,72,8,83,72,131,236,112,72,139,217,131,96,200,0,72,137,72,224,76,137,64,232,232,244,44,0,0,72,141,84,36,88,139,11,72,139,64,16,255,21, + 243,139,1,0,199,68,36,64,0,0,0,0,235,0,139,68,36,64,72,131,196,112,91,195,204,204,204,72,139,196,76,137,72,32,76,137,64,24,72,137,80,16,72,137,72,8,83,72,131,236,112,72,139,217,131,96,200,0,72,137,72,224,76,137,64,232,232,160,44,0,0,72,141,84, + 36,88,139,11,72,139,64,16,255,21,159,139,1,0,199,68,36,64,0,0,0,0,235,0,139,68,36,64,72,131,196,112,91,195,204,204,204,204,204,204,204,204,204,204,204,72,133,201,116,103,136,84,36,16,72,131,236,72,129,57,99,115,109,224,117,83,131,121,24,4,117, + 77,139,65,32,45,32,5,147,25,131,248,2,119,64,72,139,65,48,72,133,192,116,55,72,99,80,4,133,210,116,17,72,3,81,56,72,139,73,40,232,54,0,0,0,235,32,235,30,246,0,16,116,25,72,139,65,40,72,139,8,72,133,201,116,13,72,139,1,72,139,64,16,255,21,24, + 139,1,0,72,131,196,72,195,204,204,204,72,131,236,40,232,199,37,0,0,204,204,204,72,255,226,204,64,83,72,131,236,32,72,139,217,232,226,43,0,0,72,139,80,88,235,9,72,57,26,116,18,72,139,82,8,72,133,210,117,242,141,66,1,72,131,196,32,91,195,51,192, + 235,246,204,72,99,2,72,3,193,131,122,4,0,124,22,76,99,74,4,72,99,82,8,73,139,12,9,76,99,4,10,77,3,193,73,3,192,195,204,72,137,92,36,8,87,72,131,236,32,72,139,57,72,139,217,129,63,82,67,67,224,116,18,129,63,77,79,67,224,116,10,129,63,99,115,109, + 224,116,34,235,19,232,109,43,0,0,131,120,48,0,126,8,232,98,43,0,0,255,72,48,72,139,92,36,48,51,192,72,131,196,32,95,195,232,77,43,0,0,72,137,120,32,72,139,91,8,232,64,43,0,0,72,137,88,40,232,7,37,0,0,204,204,204,72,137,92,36,8,72,137,116,36, + 16,72,137,124,36,24,65,86,72,131,236,32,128,121,8,0,76,139,242,72,139,241,116,76,72,139,1,72,133,192,116,68,72,131,207,255,72,255,199,128,60,56,0,117,247,72,141,79,1,232,189,36,0,0,72,139,216,72,133,192,116,28,76,139,6,72,141,87,1,72,139,200, + 232,102,100,0,0,72,139,195,65,198,70,8,1,73,137,6,51,219,72,139,203,232,125,36,0,0,235,10,72,139,1,72,137,2,198,66,8,0,72,139,92,36,48,72,139,116,36,56,72,139,124,36,64,72,131,196,32,65,94,195,204,204,204,64,83,72,131,236,32,128,121,8,0,72,139, + 217,116,8,72,139,9,232,65,36,0,0,72,131,35,0,198,67,8,0,72,131,196,32,91,195,204,204,204,64,83,72,131,236,32,255,21,88,145,1,0,72,133,192,116,19,72,139,24,72,139,200,232,20,36,0,0,72,139,195,72,133,219,117,237,72,131,196,32,91,195,204,204,72, + 59,202,116,25,72,131,194,9,72,141,65,9,72,43,208,138,8,58,12,16,117,10,72,255,192,132,201,117,242,51,192,195,27,192,131,200,1,195,204,72,131,236,40,232,7,100,0,0,132,192,117,4,50,192,235,18,232,166,41,0,0,132,192,117,7,232,57,100,0,0,235,236, + 176,1,72,131,196,40,195,72,131,236,40,132,201,117,10,232,207,41,0,0,232,30,100,0,0,176,1,72,131,196,40,195,204,204,204,72,131,236,40,232,183,41,0,0,176,1,72,131,196,40,195,72,131,236,40,232,231,41,0,0,72,133,192,15,149,192,72,131,196,40,195, + 72,131,236,40,51,201,232,145,42,0,0,176,1,72,131,196,40,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,72,131,236,40,232,19,0,0,0,72,133,192,116,6,255,21,156,136,1,0,232,195,40,0,0,204,204,204,72,139,5,101,198,1,0,144,195,204,204, + 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,87,139,194,72,139,249,73,139,200,243,170,73,139,193,95,195,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,72,139,193,76,139,201,76,141,21,19,151,255, + 255,15,182,210,73,187,1,1,1,1,1,1,1,1,76,15,175,218,102,73,15,110,195,73,131,248,15,15,135,131,0,0,0,15,31,0,73,3,200,71,139,140,130,0,160,2,0,77,3,202,65,255,225,76,137,89,241,68,137,89,249,102,68,137,89,253,68,136,89,255,195,76,137,89,242, + 68,137,89,250,102,68,137,89,254,195,102,102,102,102,102,102,102,15,31,132,0,0,0,0,0,76,137,89,243,68,137,89,251,68,136,89,255,195,15,31,0,76,137,89,244,68,137,89,252,195,76,137,89,245,102,68,137,89,253,68,136,89,255,195,76,137,89,247,68,136, + 89,255,195,76,137,89,246,102,68,137,89,254,195,76,137,89,248,195,144,102,15,108,192,73,131,248,32,119,12,243,15,127,1,243,66,15,127,68,1,240,195,131,61,91,182,1,0,3,15,130,221,1,0,0,76,59,5,86,182,1,0,118,22,76,59,5,85,182,1,0,119,13,246,5,44, + 194,1,0,2,15,133,238,254,255,255,196,227,125,24,192,1,76,139,201,73,131,225,31,73,131,233,32,73,43,201,73,43,209,77,3,193,73,129,248,0,1,0,0,118,101,76,59,5,28,182,1,0,15,135,206,0,0,0,102,102,102,102,102,102,15,31,132,0,0,0,0,0,197,253,127, + 1,197,253,127,65,32,197,253,127,65,64,197,253,127,65,96,197,253,127,129,128,0,0,0,197,253,127,129,160,0,0,0,197,253,127,129,192,0,0,0,197,253,127,129,224,0,0,0,72,129,193,0,1,0,0,73,129,232,0,1,0,0,73,129,248,0,1,0,0,115,182,77,141,72,31,73, + 131,225,224,77,139,217,73,193,235,5,71,139,156,154,64,160,2,0,77,3,218,65,255,227,196,161,126,127,132,9,0,255,255,255,196,161,126,127,132,9,32,255,255,255,196,161,126,127,132,9,64,255,255,255,196,161,126,127,132,9,96,255,255,255,196,161,126, + 127,68,9,128,196,161,126,127,68,9,160,196,161,126,127,68,9,192,196,161,126,127,68,1,224,197,254,127,0,197,248,119,195,102,102,102,102,102,15,31,132,0,0,0,0,0,197,253,231,1,197,253,231,65,32,197,253,231,65,64,197,253,231,65,96,197,253,231,129, + 128,0,0,0,197,253,231,129,160,0,0,0,197,253,231,129,192,0,0,0,197,253,231,129,224,0,0,0,72,129,193,0,1,0,0,73,129,232,0,1,0,0,73,129,248,0,1,0,0,115,182,77,141,72,31,73,131,225,224,77,139,217,73,193,235,5,71,139,156,154,100,160,2,0,77,3,218, + 65,255,227,196,161,125,231,132,9,0,255,255,255,196,161,125,231,132,9,32,255,255,255,196,161,125,231,132,9,64,255,255,255,196,161,125,231,132,9,96,255,255,255,196,161,125,231,68,9,128,196,161,125,231,68,9,160,196,161,125,231,68,9,192,196,161, + 126,127,68,1,224,197,254,127,0,15,174,248,197,248,119,195,102,102,15,31,132,0,0,0,0,0,76,59,5,121,180,1,0,118,13,246,5,88,192,1,0,2,15,133,26,253,255,255,76,139,201,73,131,225,15,73,131,233,16,73,43,201,73,43,209,77,3,193,73,129,248,128,0,0, + 0,118,75,102,102,102,102,102,15,31,132,0,0,0,0,0,102,15,127,1,102,15,127,65,16,102,15,127,65,32,102,15,127,65,48,102,15,127,65,64,102,15,127,65,80,102,15,127,65,96,102,15,127,65,112,72,129,193,128,0,0,0,73,129,232,128,0,0,0,73,129,248,128,0, + 0,0,115,194,77,141,72,15,73,131,225,240,77,139,217,73,193,235,4,71,139,156,154,136,160,2,0,77,3,218,65,255,227,243,66,15,127,68,9,128,243,66,15,127,68,9,144,243,66,15,127,68,9,160,243,66,15,127,68,9,176,243,66,15,127,68,9,192,243,66,15,127,68, + 9,208,243,66,15,127,68,9,224,243,66,15,127,68,1,240,243,15,127,0,195,76,139,193,68,15,183,202,51,201,131,61,144,179,1,0,2,125,43,73,139,208,65,15,183,0,73,131,192,2,102,133,192,117,243,73,131,232,2,76,59,194,116,6,102,69,57,8,117,241,102,69, + 57,8,73,15,68,200,72,139,193,195,72,139,209,235,18,102,69,57,8,73,15,68,208,102,65,57,8,116,87,73,131,192,2,65,141,64,1,168,14,117,230,102,65,59,201,117,36,184,1,0,255,255,102,15,110,200,235,4,73,131,192,16,243,65,15,111,0,102,15,58,99,200,21, + 117,239,72,99,193,73,141,4,64,195,102,65,15,110,201,243,65,15,111,0,102,15,58,99,200,65,115,7,72,99,193,73,141,20,64,116,6,73,131,192,16,235,228,72,139,194,195,204,204,204,204,204,204,204,204,204,204,204,204,204,72,141,5,105,184,1,0,72,137,5, + 90,202,1,0,176,1,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,72,131,236,40,72,141,13,77,192,1,0,232,212,8,0,0,72,141,13,89,192,1,0,232,200,8,0,0,176,1,72,131,196,40,195,204,204,204,204,204,204,204,204,204,204,204,204,204, + 176,1,195,204,204,204,204,204,204,204,204,204,204,204,204,204,176,1,195,204,204,204,204,204,204,204,204,204,204,204,204,204,72,131,236,40,232,159,12,0,0,176,1,72,131,196,40,195,176,1,195,204,204,204,204,204,204,204,204,204,204,204,204,204,176, + 1,195,204,204,204,204,204,204,204,204,204,204,204,204,204,64,83,72,131,236,32,72,139,29,91,178,1,0,72,139,203,232,79,124,0,0,72,139,203,232,151,1,0,0,72,139,203,232,103,126,0,0,72,139,203,232,115,129,0,0,72,139,203,232,227,1,0,0,176,1,72,131, + 196,32,91,195,204,204,204,51,201,233,25,250,255,255,204,204,204,204,204,204,204,204,204,64,83,72,131,236,32,72,139,13,43,201,1,0,131,200,255,240,15,193,1,131,248,1,117,31,72,139,13,24,201,1,0,72,141,29,25,178,1,0,72,59,203,116,12,232,7,121,0, + 0,72,137,29,0,201,1,0,176,1,72,131,196,32,91,195,72,131,236,40,72,139,13,69,201,1,0,232,232,120,0,0,72,139,13,65,201,1,0,72,131,37,49,201,1,0,0,232,212,120,0,0,72,139,13,157,200,1,0,72,131,37,37,201,1,0,0,232,192,120,0,0,72,139,13,145,200,1, + 0,72,131,37,129,200,1,0,0,232,172,120,0,0,72,131,37,124,200,1,0,0,176,1,72,131,196,40,195,204,204,204,204,204,176,1,195,204,72,141,21,181,246,0,0,72,141,13,174,245,0,0,233,189,120,0,0,204,72,131,236,40,132,201,116,22,72,131,61,192,200,1,0,0, + 116,5,232,229,128,0,0,176,1,72,131,196,40,195,72,141,21,131,246,0,0,72,141,13,124,245,0,0,72,131,196,40,233,27,121,0,0,204,204,204,72,131,236,40,232,103,99,0,0,176,1,72,131,196,40,195,72,131,236,40,232,243,100,0,0,72,133,192,15,149,192,72,131, + 196,40,195,72,131,236,40,232,167,101,0,0,176,1,72,131,196,40,195,72,137,92,36,8,87,72,131,236,32,72,139,249,232,54,0,0,0,51,219,72,133,192,116,26,73,186,112,32,211,28,223,15,237,209,72,139,207,255,21,224,129,1,0,133,192,15,149,195,139,195,72, + 139,92,36,48,72,131,196,32,95,195,204,204,72,137,13,245,188,1,0,195,64,83,72,131,236,32,51,201,232,63,98,0,0,144,72,139,5,151,176,1,0,139,200,131,225,63,72,139,29,211,188,1,0,72,51,216,72,211,203,51,201,232,58,98,0,0,72,139,195,72,131,196,32, + 91,195,204,139,5,198,188,1,0,144,195,69,51,192,65,141,80,2,233,224,0,0,0,51,210,51,201,68,141,66,1,233,211,0,0,0,204,204,204,72,137,13,153,188,1,0,195,64,83,72,131,236,48,72,199,68,36,32,254,255,255,255,139,217,72,131,100,36,72,0,76,141,68,36, + 72,72,141,21,109,245,0,0,51,201,255,21,125,136,1,0,72,139,76,36,72,133,192,116,41,72,141,21,109,245,0,0,255,21,127,136,1,0,72,133,192,116,18,73,186,112,123,90,94,155,135,1,162,139,203,255,21,8,129,1,0,72,139,76,36,72,72,133,201,116,7,255,21, + 192,135,1,0,144,72,131,196,48,91,195,204,72,131,236,40,232,135,132,0,0,131,248,1,116,12,232,73,132,0,0,132,192,15,148,192,235,2,50,192,72,131,196,40,195,204,204,204,64,83,72,131,236,32,139,217,232,207,255,255,255,132,192,116,17,255,21,181,135, + 1,0,72,139,200,139,211,255,21,66,137,1,0,139,203,232,67,255,255,255,139,203,255,21,19,135,1,0,204,204,204,68,137,68,36,24,137,84,36,16,85,72,139,236,72,131,236,80,72,199,69,224,254,255,255,255,72,137,92,36,96,139,217,69,133,192,117,74,51,201, + 255,21,187,135,1,0,72,133,192,116,61,185,77,90,0,0,102,57,8,117,51,72,99,72,60,72,3,200,129,57,80,69,0,0,117,36,184,11,2,0,0,102,57,65,24,117,25,131,185,132,0,0,0,14,118,16,131,185,248,0,0,0,0,116,7,139,203,232,201,254,255,255,198,69,40,0,72, + 141,69,24,72,137,69,232,72,141,69,32,72,137,69,240,72,141,69,40,72,137,69,248,184,2,0,0,0,137,69,212,137,69,216,76,141,77,212,76,141,69,232,72,141,85,216,72,141,77,208,232,233,0,0,0,144,131,125,32,0,116,11,72,139,92,36,96,72,131,196,80,93,195, + 139,203,232,8,255,255,255,204,204,204,204,64,83,72,131,236,48,72,139,217,128,61,4,187,1,0,0,15,133,169,0,0,0,184,1,0,0,0,135,5,239,186,1,0,72,139,1,139,8,133,201,117,62,72,139,5,135,174,1,0,72,139,21,208,186,1,0,72,59,208,116,34,139,200,131, + 225,63,72,51,194,72,211,200,73,186,112,40,217,120,69,46,1,153,69,51,192,51,210,51,201,255,21,113,127,1,0,72,141,13,194,187,1,0,235,12,131,249,1,117,13,72,141,13,204,187,1,0,232,171,4,0,0,144,72,139,3,131,56,0,117,19,72,141,21,215,127,1,0,72, + 141,13,176,127,1,0,232,187,10,0,0,72,141,21,212,127,1,0,72,141,13,197,127,1,0,232,168,10,0,0,72,139,67,8,131,56,0,117,14,198,5,92,186,1,0,1,72,139,67,16,198,0,1,72,131,196,48,91,195,232,182,25,0,0,144,204,72,137,92,36,8,76,137,76,36,32,87,72, + 131,236,32,73,139,217,73,139,248,139,10,232,112,95,0,0,144,72,139,207,232,15,255,255,255,144,139,11,232,123,95,0,0,72,139,92,36,48,72,131,196,32,95,195,72,137,92,36,8,85,86,87,65,86,65,87,72,139,236,72,131,236,48,51,255,68,139,241,133,201,15, + 132,83,1,0,0,141,65,255,131,248,1,118,22,232,111,130,0,0,141,95,22,137,24,232,181,117,0,0,139,251,233,53,1,0,0,232,121,105,0,0,72,141,29,210,185,1,0,65,184,4,1,0,0,72,139,211,51,201,232,246,141,0,0,72,139,53,83,196,1,0,72,137,29,44,196,1,0,72, + 133,246,116,5,64,56,62,117,3,72,139,243,72,141,69,72,72,137,125,64,76,141,77,64,72,137,68,36,32,69,51,192,72,137,125,72,51,210,72,139,206,232,81,1,0,0,76,139,125,64,65,184,1,0,0,0,72,139,85,72,73,139,207,232,219,0,0,0,72,139,216,72,133,192,117, + 24,232,226,129,0,0,187,12,0,0,0,51,201,137,24,232,12,116,0,0,233,106,255,255,255,78,141,4,248,72,139,211,72,141,69,72,72,139,206,76,141,77,64,72,137,68,36,32,232,255,0,0,0,65,131,254,1,117,22,139,69,64,255,200,72,137,29,169,195,1,0,137,5,155, + 195,1,0,51,201,235,105,72,141,85,56,72,137,125,56,72,139,203,232,243,130,0,0,139,240,133,192,116,25,72,139,77,56,232,176,115,0,0,72,139,203,72,137,125,56,232,164,115,0,0,139,254,235,63,72,139,85,56,72,139,207,72,139,194,72,57,58,116,12,72,141, + 64,8,72,255,193,72,57,56,117,244,137,13,71,195,1,0,51,201,72,137,125,56,72,137,21,66,195,1,0,232,109,115,0,0,72,139,203,72,137,125,56,232,97,115,0,0,72,139,92,36,96,139,199,72,131,196,48,65,95,65,94,95,94,93,195,204,204,64,83,72,131,236,32,72, + 184,255,255,255,255,255,255,255,31,76,139,202,72,59,200,115,61,51,210,72,131,200,255,73,247,240,76,59,200,115,47,72,193,225,3,77,15,175,200,72,139,193,72,247,208,73,59,193,118,28,73,3,201,186,1,0,0,0,232,194,129,0,0,51,201,72,139,216,232,252, + 114,0,0,72,139,195,235,2,51,192,72,131,196,32,91,195,204,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,84,65,85,65,86,65,87,72,131,236,32,76,139,100,36,112,77,139,233,73,139,216,76,139,242,72,139,249,73,131,36,36,0,73,199,1, + 1,0,0,0,72,133,210,116,7,72,137,26,73,131,198,8,64,50,237,128,63,34,76,139,255,117,15,64,132,237,64,182,34,64,15,148,197,72,255,199,235,58,73,255,4,36,72,133,219,116,7,138,7,136,3,72,255,195,15,190,55,72,255,199,139,206,232,44,142,0,0,133,192, + 116,20,73,255,4,36,72,133,219,116,7,138,7,136,3,72,255,195,73,141,127,2,64,132,246,116,28,64,132,237,117,170,64,128,254,32,116,6,64,128,254,9,117,158,72,133,219,116,9,198,67,255,0,235,3,72,255,207,64,50,246,138,7,132,192,15,132,214,0,0,0,60, + 32,116,4,60,9,117,7,72,255,199,138,7,235,241,132,192,15,132,191,0,0,0,77,133,246,116,7,73,137,30,73,131,198,8,73,255,69,0,186,1,0,0,0,51,192,235,5,72,255,199,255,192,138,15,128,249,92,116,244,128,249,34,117,49,132,194,117,24,64,132,246,116,10, + 56,79,1,117,5,72,255,199,235,9,51,210,64,132,246,64,15,148,198,209,232,235,17,255,200,72,133,219,116,6,198,3,92,72,255,195,73,255,4,36,133,192,117,235,138,7,132,192,116,70,64,132,246,117,8,60,32,116,61,60,9,116,57,133,210,116,45,72,133,219,116, + 5,136,3,72,255,195,15,190,15,232,68,141,0,0,133,192,116,19,73,255,4,36,72,255,199,72,133,219,116,7,138,7,136,3,72,255,195,73,255,4,36,72,255,199,233,101,255,255,255,72,133,219,116,6,198,3,0,72,255,195,73,255,4,36,233,32,255,255,255,77,133,246, + 116,4,73,131,38,0,73,255,69,0,72,139,92,36,80,72,139,108,36,88,72,139,116,36,96,72,131,196,32,65,95,65,94,65,93,65,92,95,195,204,204,204,72,133,201,117,4,131,200,255,195,72,139,65,16,72,57,1,117,18,72,139,5,235,169,1,0,72,137,1,72,137,65,8,72, + 137,65,16,51,192,195,204,72,137,84,36,16,72,137,76,36,8,85,72,139,236,72,131,236,64,72,141,69,16,72,137,69,232,76,141,77,40,72,141,69,24,72,137,69,240,76,141,69,232,184,2,0,0,0,72,141,85,224,72,141,77,32,137,69,40,137,69,224,232,42,3,0,0,72, + 131,196,64,93,195,76,139,220,73,137,75,8,72,131,236,56,73,199,67,240,254,255,255,255,73,141,67,8,73,137,67,232,184,2,0,0,0,137,68,36,80,137,68,36,88,77,141,75,24,77,141,67,232,73,141,83,32,73,141,75,16,232,35,3,0,0,144,72,131,196,56,195,204, + 72,139,209,72,141,13,182,182,1,0,233,101,255,255,255,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,86,65,87,72,131,236,32,72,139,1,51,237,76,139,249,72,139,16,72,133,210,15,132,104,1,0,0,76,139,21,13,169,1,0,65,139,202,73,139,242, + 72,51,50,131,225,63,77,139,202,72,211,206,76,51,74,8,73,139,218,72,51,90,16,73,211,201,72,211,203,76,59,203,15,133,167,0,0,0,72,43,222,184,0,2,0,0,72,193,251,3,72,59,216,72,139,251,72,15,71,248,141,69,32,72,3,251,72,15,68,248,72,59,251,114,30, + 68,141,69,8,72,139,215,72,139,206,232,17,140,0,0,51,201,76,139,240,232,195,111,0,0,77,133,246,117,40,72,141,123,4,65,184,8,0,0,0,72,139,215,72,139,206,232,237,139,0,0,51,201,76,139,240,232,159,111,0,0,77,133,246,15,132,202,0,0,0,76,139,21,111, + 168,1,0,77,141,12,222,73,141,28,254,73,139,246,72,139,203,73,43,201,72,131,193,7,72,193,233,3,76,59,203,72,15,71,205,72,133,201,116,16,73,139,194,73,139,249,243,72,171,76,139,21,58,168,1,0,65,184,64,0,0,0,73,141,121,8,65,139,200,65,139,194,131, + 224,63,43,200,73,139,71,8,72,139,16,65,139,192,72,211,202,73,51,210,73,137,17,72,139,21,11,168,1,0,139,202,131,225,63,43,193,138,200,73,139,7,72,211,206,72,51,242,72,139,8,72,137,49,65,139,200,72,139,21,233,167,1,0,139,194,131,224,63,43,200, + 73,139,7,72,211,207,72,51,250,72,139,16,72,137,122,8,72,139,21,203,167,1,0,139,194,131,224,63,68,43,192,73,139,7,65,138,200,72,211,203,72,51,218,72,139,8,51,192,72,137,89,16,235,3,131,200,255,72,139,92,36,64,72,139,108,36,72,72,139,116,36,80, + 72,131,196,32,65,95,65,94,95,195,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,86,65,87,72,131,236,32,72,139,1,72,139,241,72,139,16,72,133,210,117,8,131,200,255,233,217,0,0,0,76,139,5,91,167,1,0,65,139,200,73,139,248,72,51,58,131,225, + 63,72,211,207,73,139,216,72,51,90,8,72,211,203,72,141,71,255,72,131,248,253,15,135,169,0,0,0,65,139,200,77,139,240,131,225,63,76,139,255,72,139,235,72,131,235,8,72,59,223,114,95,72,139,3,73,59,198,116,239,73,51,192,76,137,51,72,211,200,73,186, + 112,72,218,86,150,62,241,133,255,21,19,120,1,0,76,139,5,244,166,1,0,72,139,6,65,139,200,131,225,63,77,139,200,72,139,16,73,139,192,76,51,10,72,51,66,8,73,211,201,72,211,200,77,59,207,117,5,72,59,197,116,166,77,139,249,73,139,249,72,139,232,72, + 139,216,235,152,72,131,255,255,116,15,72,139,207,232,207,109,0,0,76,139,5,168,166,1,0,72,139,6,72,139,8,76,137,1,72,139,6,72,139,8,76,137,65,8,72,139,6,72,139,8,76,137,65,16,51,192,72,139,92,36,64,72,139,108,36,72,72,139,116,36,80,72,131,196, + 32,65,95,65,94,95,195,72,137,92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,217,73,139,248,139,10,232,244,87,0,0,144,72,139,207,232,11,253,255,255,139,248,139,11,232,254,87,0,0,139,199,72,139,92,36,48,72,131,196,32,95,195,204,72,137,92,36,8, + 76,137,76,36,32,87,72,131,236,32,73,139,217,73,139,248,139,10,232,184,87,0,0,144,72,139,207,232,127,254,255,255,139,248,139,11,232,194,87,0,0,139,199,72,139,92,36,48,72,131,196,32,95,195,204,233,71,0,0,0,204,204,204,72,131,236,56,72,199,68,36, + 32,254,255,255,255,72,141,13,124,179,1,0,232,159,0,0,0,144,72,141,13,119,179,1,0,232,174,0,0,0,144,72,139,13,122,179,1,0,232,189,0,0,0,72,139,13,102,179,1,0,72,131,196,56,233,241,0,0,0,204,72,137,92,36,8,87,72,131,236,32,51,255,72,57,61,57,179, + 1,0,116,4,51,192,235,79,232,150,97,0,0,232,245,138,0,0,72,139,216,72,133,192,117,12,51,201,232,154,108,0,0,131,200,255,235,49,72,139,203,232,245,0,0,0,72,133,192,117,5,131,207,255,235,14,72,137,5,20,179,1,0,72,137,5,245,178,1,0,51,201,232,110, + 108,0,0,72,139,203,232,102,108,0,0,139,199,72,139,92,36,48,72,131,196,32,95,195,204,72,131,236,40,72,139,9,72,59,13,226,178,1,0,116,5,232,35,0,0,0,72,131,196,40,195,204,204,72,131,236,40,72,139,9,72,59,13,190,178,1,0,116,5,232,75,0,0,0,72,131, + 196,40,195,204,204,72,133,201,116,59,72,137,92,36,8,87,72,131,236,32,72,139,1,72,139,217,72,139,249,235,15,72,139,200,232,254,107,0,0,72,141,127,8,72,139,7,72,133,192,117,236,72,139,203,232,234,107,0,0,72,139,92,36,48,72,131,196,32,95,195,204, + 204,204,72,133,201,116,59,72,137,92,36,8,87,72,131,236,32,72,139,1,72,139,217,72,139,249,235,15,72,139,200,232,186,107,0,0,72,141,127,8,72,139,7,72,133,192,117,236,72,139,203,232,166,107,0,0,72,139,92,36,48,72,131,196,32,95,195,204,204,204,72, + 139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,48,72,139,241,51,201,76,139,198,138,22,235,37,128,250,61,72,141,65,1,72,15,68,193,72,139,200,72,131,200,255,72,255,192,65,128,60,0,0,117,246,73,255,192,76,3,192,65, + 138,16,132,210,117,215,72,255,193,186,8,0,0,0,232,249,121,0,0,72,139,216,72,133,192,117,11,51,201,232,46,107,0,0,51,192,235,114,76,139,243,138,6,132,192,116,95,72,131,205,255,72,255,197,128,60,46,0,117,247,72,255,197,60,61,116,53,186,1,0,0,0, + 72,139,205,232,188,121,0,0,72,139,248,72,133,192,116,37,76,139,198,72,139,213,72,139,200,232,74,79,0,0,51,201,133,192,117,71,73,137,62,73,131,198,8,232,216,106,0,0,72,3,245,235,172,72,139,203,232,171,254,255,255,51,201,232,196,106,0,0,235,141, + 51,201,232,187,106,0,0,72,139,195,72,139,92,36,64,72,139,108,36,72,72,139,116,36,80,72,139,124,36,88,72,131,196,48,65,94,195,72,131,100,36,32,0,69,51,201,69,51,192,51,210,232,194,107,0,0,204,204,72,59,202,116,59,72,137,92,36,8,87,72,131,236, + 32,72,139,250,72,139,217,72,139,3,72,133,192,116,16,73,186,112,72,218,86,150,62,241,133,255,21,83,116,1,0,72,131,195,8,72,59,223,117,223,72,139,92,36,48,72,131,196,32,95,195,204,204,204,72,137,92,36,8,87,72,131,236,32,72,139,250,72,139,217,72, + 59,202,116,37,72,139,3,72,133,192,116,20,73,186,112,48,82,94,71,39,5,211,255,21,15,116,1,0,133,192,117,11,72,131,195,8,72,59,223,235,217,51,192,72,139,92,36,48,72,131,196,32,95,195,204,184,99,115,109,224,59,200,116,3,51,192,195,139,200,233,1, + 0,0,0,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,32,72,139,242,139,249,232,142,86,0,0,69,51,201,72,139,216,72,133,192,116,31,72,139,8,72,139,193,76,141,129,192,0,0,0,73,59,200,116,13,57,56,116,32,72,131,192,16,73,59,192, + 117,243,51,192,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,131,196,32,95,195,72,133,192,116,228,76,139,64,8,77,133,192,116,219,73,131,248,5,117,10,76,137,72,8,65,141,64,252,235,205,73,131,248,1,117,5,131,200,255,235,194,72,139,107,8, + 72,137,115,8,131,120,4,8,15,133,196,0,0,0,72,131,193,48,72,141,145,144,0,0,0,235,8,76,137,73,8,72,131,193,16,72,59,202,117,243,129,56,141,0,0,192,139,123,16,116,122,129,56,142,0,0,192,116,107,129,56,143,0,0,192,116,92,129,56,144,0,0,192,116, + 77,129,56,145,0,0,192,116,62,129,56,146,0,0,192,116,47,129,56,147,0,0,192,116,32,129,56,180,2,0,192,116,17,129,56,181,2,0,192,139,215,117,64,186,141,0,0,0,235,54,186,142,0,0,0,235,47,186,133,0,0,0,235,40,186,138,0,0,0,235,33,186,132,0,0,0,235, + 26,186,129,0,0,0,235,19,186,134,0,0,0,235,12,186,131,0,0,0,235,5,186,130,0,0,0,137,83,16,73,186,112,51,211,48,79,31,156,139,185,8,0,0,0,73,139,192,255,21,135,114,1,0,137,123,16,235,26,76,137,72,8,73,186,112,115,215,80,73,134,193,198,139,72,4, + 73,139,192,255,21,104,114,1,0,72,137,107,8,233,2,255,255,255,204,204,204,72,131,236,56,198,68,36,32,0,232,6,0,0,0,72,131,196,56,195,204,64,83,72,131,236,48,51,192,68,139,209,72,133,210,117,25,232,3,118,0,0,187,22,0,0,0,137,24,232,71,105,0,0, + 139,195,72,131,196,48,91,195,77,133,192,116,226,15,182,76,36,96,102,137,2,72,141,65,1,76,59,192,119,12,232,212,117,0,0,187,34,0,0,0,235,207,65,141,65,254,187,34,0,0,0,59,195,119,184,136,76,36,96,65,139,202,72,131,196,48,91,233,3,0,0,0,204,204, + 204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,86,65,87,72,131,236,32,69,51,255,65,139,233,73,139,240,72,139,218,68,139,209,76,139,218,65,139,255,68,56,124,36,96,116,17,65,141,71,45,65,247,218,102,137,2,141,120,212,76,141,90,2,77, + 139,195,51,210,65,139,194,247,245,65,139,194,77,139,203,139,202,51,210,247,245,131,249,9,73,141,83,2,68,139,208,184,87,0,0,0,68,141,112,217,102,65,15,70,198,72,255,199,102,3,193,102,65,137,3,69,133,210,116,8,76,139,218,72,59,254,114,190,72,59, + 254,114,25,102,68,137,59,232,20,117,0,0,187,34,0,0,0,137,24,232,88,104,0,0,139,195,235,35,102,68,137,58,65,15,183,0,65,15,183,9,102,65,137,1,73,131,233,2,102,65,137,8,73,131,192,2,77,59,193,114,227,51,192,72,139,92,36,64,72,139,108,36,72,72, + 139,116,36,80,72,131,196,32,65,95,65,94,95,195,72,131,236,40,131,61,93,183,1,0,0,117,45,72,133,201,117,26,232,177,116,0,0,199,0,22,0,0,0,232,246,103,0,0,184,255,255,255,127,72,131,196,40,195,72,133,210,116,225,72,131,196,40,233,66,1,0,0,69,51, + 192,72,131,196,40,233,2,0,0,0,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,86,65,87,72,131,236,64,72,139,250,72,139,217,72,133,201,117,26,232,88,116,0,0,199,0,22,0,0,0,232,157,103,0,0,184,255,255,255,127,233,219,0,0,0,72,133, + 255,116,225,73,139,208,72,141,76,36,32,232,37,1,0,0,72,139,76,36,40,72,131,185,56,1,0,0,0,117,18,72,139,215,72,139,203,232,203,0,0,0,139,240,233,147,0,0,0,65,190,0,1,0,0,76,141,61,211,8,1,0,15,183,3,72,141,91,2,102,65,59,198,115,26,15,182,208, + 65,246,68,87,2,1,116,10,72,139,129,16,1,0,0,138,20,2,15,182,194,235,18,72,141,84,36,40,15,183,200,232,99,133,0,0,72,139,76,36,40,15,183,232,15,183,7,139,245,72,131,199,2,102,65,59,198,115,26,15,182,208,65,246,68,87,2,1,116,10,72,139,129,16,1, + 0,0,138,20,2,15,182,194,235,18,72,141,84,36,40,15,183,200,232,37,133,0,0,72,139,76,36,40,15,183,192,43,240,117,8,133,237,15,133,122,255,255,255,128,124,36,56,0,116,12,72,139,68,36,32,131,160,168,3,0,0,253,139,198,72,139,92,36,96,72,139,108,36, + 104,72,139,116,36,112,72,131,196,64,65,95,65,94,95,195,204,204,204,76,139,218,76,139,209,69,15,183,2,77,141,82,2,65,15,183,19,77,141,91,2,65,141,64,191,131,248,25,69,141,72,32,141,66,191,69,15,71,200,141,74,32,131,248,25,65,139,193,15,71,202, + 43,193,117,5,69,133,201,117,201,195,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,198,65,24,0,72,139,249,72,141,113,8,72,133,210,116,5,15,16,2,235,16,131,61,129,181,1,0,0,117,13,15,16,5,176,164,1,0,243,15,127,6,235,78,232,81,80,0, + 0,72,137,7,72,139,214,72,139,136,144,0,0,0,72,137,14,72,139,136,136,0,0,0,72,137,79,16,72,139,200,232,50,133,0,0,72,139,15,72,141,87,16,232,90,133,0,0,72,139,15,139,129,168,3,0,0,168,2,117,13,131,200,2,137,129,168,3,0,0,198,71,24,1,72,139,92, + 36,48,72,139,199,72,139,116,36,56,72,131,196,32,95,195,204,72,137,92,36,8,72,137,124,36,16,85,72,139,236,72,131,236,112,72,131,101,192,0,131,61,242,180,1,0,0,198,69,208,0,198,69,232,0,198,69,240,0,198,69,248,0,117,16,15,16,5,17,164,1,0,198,69, + 232,1,243,15,127,69,216,72,131,101,184,0,72,141,85,176,72,137,77,176,65,177,1,72,141,77,192,65,184,10,0,0,0,232,57,1,0,0,128,125,232,2,139,248,117,11,72,139,77,192,131,161,168,3,0,0,253,128,125,240,0,116,15,139,93,236,72,141,77,192,232,44,0, + 0,0,137,88,32,128,125,248,0,116,15,139,93,244,72,141,77,192,232,23,0,0,0,137,88,36,76,141,92,36,112,139,199,73,139,91,16,73,139,123,24,73,139,227,93,195,64,87,72,131,236,32,72,131,57,0,72,139,249,117,73,72,137,92,36,56,255,21,14,117,1,0,128, + 127,16,0,137,68,36,48,117,12,51,210,198,71,16,1,72,137,87,8,235,4,72,139,87,8,72,141,76,36,48,232,138,81,0,0,139,76,36,48,72,139,216,72,137,7,255,21,34,118,1,0,72,133,219,72,139,92,36,56,116,9,72,139,7,72,131,196,32,95,195,232,166,13,0,0,204, + 204,204,204,204,204,204,204,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,72,139,249,232,121,255,255,255,72,141,87,24,72,139,200,72,139,240,76,139,128,144,0,0,0,76,137,2,76,139,128,136,0,0,0,76,137,71,32,76,139,71,8,232,1,132,0,0, + 76,139,71,8,72,141,87,32,72,139,206,232,41,132,0,0,139,134,168,3,0,0,168,2,117,13,131,200,2,137,134,168,3,0,0,198,71,40,2,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,204,204,72,137,92,36,24,72,137,76,36,8,85,86,87,65,84,65,85,65,86, + 65,87,72,129,236,160,0,0,0,76,139,34,51,237,65,15,182,241,69,139,248,76,137,164,36,144,0,0,0,72,139,250,77,133,228,117,18,232,155,112,0,0,199,0,22,0,0,0,232,224,99,0,0,235,50,69,133,255,116,69,65,141,64,254,131,248,34,118,60,72,137,76,36,40, + 69,51,201,198,65,48,1,69,51,192,199,65,44,22,0,0,0,51,210,51,201,72,137,108,36,32,232,120,101,0,0,72,139,79,8,72,133,201,15,132,93,6,0,0,72,139,7,72,137,1,233,82,6,0,0,65,15,183,28,36,73,141,68,36,2,72,137,2,68,139,245,64,56,105,40,117,20,232, + 217,254,255,255,235,13,72,139,7,15,183,24,72,131,192,2,72,137,7,186,8,0,0,0,15,183,203,232,29,132,0,0,133,192,117,226,139,198,185,253,255,0,0,131,206,2,102,131,251,45,15,69,240,141,67,213,102,133,193,117,13,72,139,7,15,183,24,72,131,192,2,72, + 137,7,199,132,36,232,0,0,0,112,10,0,0,184,102,10,0,0,199,68,36,48,230,10,0,0,185,48,0,0,0,199,68,36,52,240,10,0,0,186,16,255,0,0,199,68,36,56,102,11,0,0,65,184,96,6,0,0,199,68,36,60,112,11,0,0,68,141,88,128,199,68,36,64,102,12,0,0,65,185,240, + 6,0,0,199,68,36,68,112,12,0,0,65,186,102,9,0,0,199,68,36,72,230,12,0,0,199,68,36,76,240,12,0,0,199,68,36,80,102,13,0,0,199,68,36,84,112,13,0,0,199,68,36,88,80,14,0,0,199,68,36,92,90,14,0,0,199,68,36,96,208,14,0,0,199,68,36,100,218,14,0,0,199, + 68,36,104,32,15,0,0,199,68,36,108,42,15,0,0,199,68,36,112,64,16,0,0,199,68,36,116,74,16,0,0,199,68,36,120,224,23,0,0,199,68,36,124,234,23,0,0,199,132,36,128,0,0,0,16,24,0,0,199,132,36,132,0,0,0,26,255,0,0,199,132,36,136,0,0,0,25,0,0,0,65,247, + 199,239,255,255,255,15,133,66,2,0,0,102,59,217,15,130,193,1,0,0,102,131,251,58,115,10,15,183,195,43,193,233,172,1,0,0,102,59,218,15,131,148,1,0,0,102,65,59,216,15,130,158,1,0,0,185,106,6,0,0,102,59,217,115,11,15,183,195,65,43,192,233,132,1,0, + 0,102,65,59,217,15,130,127,1,0,0,185,250,6,0,0,102,59,217,115,11,15,183,195,65,43,193,233,101,1,0,0,102,65,59,218,15,130,96,1,0,0,185,112,9,0,0,102,59,217,115,11,15,183,195,65,43,194,233,70,1,0,0,102,65,59,219,15,130,65,1,0,0,185,240,9,0,0,102, + 59,217,115,11,15,183,195,65,43,195,233,39,1,0,0,102,59,216,15,130,35,1,0,0,102,59,156,36,232,0,0,0,115,13,15,183,195,45,102,10,0,0,233,7,1,0,0,139,76,36,48,102,59,217,15,130,255,0,0,0,102,59,92,36,52,15,130,57,255,255,255,139,76,36,56,102,59, + 217,15,130,231,0,0,0,102,59,92,36,60,15,130,33,255,255,255,139,76,36,64,102,59,217,15,130,207,0,0,0,102,59,92,36,68,15,130,9,255,255,255,139,76,36,72,102,59,217,15,130,183,0,0,0,102,59,92,36,76,15,130,241,254,255,255,139,76,36,80,102,59,217, + 15,130,159,0,0,0,102,59,92,36,84,15,130,217,254,255,255,139,76,36,88,102,59,217,15,130,135,0,0,0,102,59,92,36,92,15,130,193,254,255,255,139,76,36,96,102,59,217,114,115,102,59,92,36,100,15,130,173,254,255,255,139,76,36,104,102,59,217,114,95,102, + 59,92,36,108,15,130,153,254,255,255,139,76,36,112,102,59,217,114,75,102,59,92,36,116,15,130,133,254,255,255,139,76,36,120,102,59,217,114,55,102,59,92,36,124,15,130,113,254,255,255,139,140,36,128,0,0,0,15,183,195,102,43,193,102,131,248,9,119, + 25,233,89,254,255,255,102,59,156,36,132,0,0,0,115,10,15,183,195,43,194,131,248,255,117,38,139,148,36,136,0,0,0,15,183,203,141,65,191,59,194,141,65,159,118,8,59,194,15,135,182,0,0,0,59,194,119,3,131,193,224,141,65,201,69,51,210,133,192,15,133, + 164,0,0,0,72,139,15,65,185,223,255,0,0,15,183,17,76,141,65,2,76,137,7,141,66,168,102,65,133,193,116,105,69,133,255,72,137,15,65,141,66,8,65,15,69,199,68,139,248,102,133,210,116,24,102,57,17,116,19,232,174,108,0,0,199,0,22,0,0,0,232,243,95,0, + 0,69,51,210,51,210,131,200,255,65,247,247,65,187,97,0,0,0,189,96,6,0,0,68,139,200,65,189,16,255,0,0,69,141,99,207,102,65,59,220,15,130,197,1,0,0,102,131,251,58,115,49,15,183,203,65,43,204,233,175,1,0,0,65,15,183,24,73,141,64,2,72,137,7,184,16, + 0,0,0,69,133,255,65,15,69,199,68,139,248,235,169,69,51,210,184,10,0,0,0,235,234,102,65,59,221,15,131,111,1,0,0,102,59,221,15,130,123,1,0,0,184,106,6,0,0,102,59,216,115,10,15,183,203,43,205,233,98,1,0,0,184,240,6,0,0,102,59,216,15,130,89,1,0, + 0,141,72,10,102,59,217,115,10,15,183,203,43,200,233,66,1,0,0,184,102,9,0,0,102,59,216,15,130,57,1,0,0,141,72,10,102,59,217,114,224,141,65,118,102,59,216,15,130,37,1,0,0,141,72,10,102,59,217,114,204,141,65,118,102,59,216,15,130,17,1,0,0,102,59, + 156,36,232,0,0,0,114,182,139,68,36,48,102,59,216,15,130,250,0,0,0,102,59,92,36,52,114,162,139,68,36,56,102,59,216,15,130,230,0,0,0,102,59,92,36,60,114,142,139,68,36,64,102,59,216,15,130,210,0,0,0,102,59,92,36,68,15,130,118,255,255,255,139,68, + 36,72,102,59,216,15,130,186,0,0,0,102,59,92,36,76,15,130,94,255,255,255,139,68,36,80,102,59,216,15,130,162,0,0,0,102,59,92,36,84,15,130,70,255,255,255,139,68,36,88,102,59,216,15,130,138,0,0,0,102,59,92,36,92,15,130,46,255,255,255,139,68,36,96, + 102,59,216,114,118,102,59,92,36,100,15,130,26,255,255,255,139,68,36,104,102,59,216,114,98,102,59,92,36,108,15,130,6,255,255,255,139,68,36,112,102,59,216,114,78,102,59,92,36,116,15,130,242,254,255,255,139,68,36,120,102,59,216,114,58,102,59,92, + 36,124,15,130,222,254,255,255,139,148,36,128,0,0,0,15,183,195,102,43,194,102,131,248,9,119,28,15,183,203,43,202,235,16,102,59,156,36,132,0,0,0,115,11,15,183,203,65,43,205,131,249,255,117,52,15,183,203,131,249,65,114,5,131,249,90,118,11,65,59, + 203,114,31,102,131,251,122,119,25,15,183,195,102,65,43,195,102,59,132,36,136,0,0,0,119,3,131,193,224,131,193,201,235,3,131,201,255,76,139,7,65,59,207,115,56,65,15,183,24,65,139,198,65,15,175,199,141,20,8,65,139,202,59,208,65,139,194,15,146,193, + 69,59,241,68,139,242,15,151,192,11,200,73,141,64,2,193,225,2,131,201,8,72,137,7,11,241,233,189,253,255,255,76,139,172,36,224,0,0,0,73,141,64,254,76,139,164,36,144,0,0,0,189,2,0,0,0,72,137,7,102,133,219,116,21,102,57,24,116,16,232,18,106,0,0, + 199,0,22,0,0,0,232,87,93,0,0,64,246,198,8,117,22,72,139,71,8,76,137,39,72,133,192,116,3,76,137,32,51,192,233,146,0,0,0,65,184,0,0,0,128,69,141,72,255,64,246,198,4,116,9,184,1,0,0,0,139,206,235,30,64,246,198,1,116,89,64,132,245,116,7,69,59,240, + 118,84,235,5,69,59,241,118,80,185,1,0,0,0,139,198,35,238,65,198,69,48,1,65,199,69,44,34,0,0,0,133,200,117,6,65,131,206,255,235,48,72,139,87,8,133,237,116,16,72,133,210,116,6,72,139,15,72,137,10,65,139,192,235,42,72,133,210,116,6,72,139,15,72, + 137,10,65,139,193,235,26,64,132,245,116,3,65,247,222,72,139,87,8,72,133,210,116,6,72,139,15,72,137,10,65,139,198,72,139,156,36,240,0,0,0,72,129,196,160,0,0,0,65,95,65,94,65,93,65,92,95,94,93,195,204,204,199,68,36,16,0,0,0,0,139,68,36,16,233, + 99,91,0,0,204,204,204,233,159,125,0,0,204,204,204,72,131,236,40,232,155,70,0,0,72,139,64,24,72,133,192,116,18,73,186,112,72,218,86,150,62,241,133,255,21,46,101,1,0,235,0,232,67,5,0,0,144,204,204,15,183,2,68,15,183,1,68,43,192,117,25,72,43,202, + 102,133,192,116,17,72,131,194,2,15,183,2,68,15,183,4,17,68,43,192,116,234,65,139,192,65,193,232,31,247,216,193,232,31,65,43,192,195,204,204,204,139,5,174,147,1,0,76,139,193,72,139,209,131,248,5,15,140,130,0,0,0,65,246,192,1,116,17,51,201,102, + 57,10,15,132,249,0,0,0,72,131,194,2,235,241,131,225,31,184,32,0,0,0,72,43,193,72,247,217,77,27,201,51,201,76,35,200,73,209,233,75,141,4,72,76,59,192,116,14,102,57,10,116,9,72,131,194,2,72,59,208,117,242,73,43,208,72,209,250,73,59,209,15,133, + 186,0,0,0,73,141,20,80,197,233,239,210,197,237,117,10,197,253,215,193,133,192,117,6,72,131,194,32,235,238,197,248,119,102,57,10,15,132,142,0,0,0,72,131,194,2,235,241,131,248,1,124,118,65,246,192,1,116,13,51,201,102,57,10,116,118,72,131,194,2, + 235,245,131,225,15,184,16,0,0,0,72,43,193,72,247,217,77,27,201,51,201,76,35,200,73,209,233,75,141,4,72,76,59,192,116,14,102,57,10,116,9,72,131,194,2,72,59,208,117,242,73,43,208,72,209,250,73,59,209,117,59,73,141,20,80,15,87,201,102,15,111,193, + 102,15,117,2,102,15,215,192,133,192,117,6,72,131,194,16,235,234,102,57,10,116,19,72,131,194,2,235,245,51,201,102,57,10,116,6,72,131,194,2,235,245,73,43,208,72,209,250,72,139,194,195,204,204,204,139,5,130,146,1,0,76,139,210,76,139,193,131,248, + 5,15,140,204,0,0,0,65,246,192,1,116,41,72,141,4,81,72,139,209,72,59,200,15,132,161,1,0,0,51,201,102,57,10,15,132,150,1,0,0,72,131,194,2,72,59,208,117,238,233,136,1,0,0,131,225,31,184,32,0,0,0,72,43,193,73,139,208,72,247,217,77,27,219,76,35,216, + 73,209,235,77,59,211,77,15,66,218,51,201,75,141,4,88,76,59,192,116,14,102,57,10,116,9,72,131,194,2,72,59,208,117,242,73,43,208,72,209,250,73,59,211,15,133,69,1,0,0,77,141,12,80,73,139,194,73,43,195,72,131,224,224,72,3,194,73,141,20,64,76,59, + 202,116,29,197,241,239,201,196,193,117,117,9,197,253,215,193,133,192,197,248,119,117,9,73,131,193,32,76,59,202,117,227,75,141,4,80,235,10,102,65,57,9,116,9,73,131,193,2,76,59,200,117,241,73,139,209,233,235,0,0,0,131,248,1,15,140,198,0,0,0,65, + 246,192,1,116,41,72,141,4,81,73,139,208,76,59,192,15,132,204,0,0,0,51,201,102,57,10,15,132,193,0,0,0,72,131,194,2,72,59,208,117,238,233,179,0,0,0,131,225,15,184,16,0,0,0,72,43,193,73,139,208,72,247,217,77,27,219,76,35,216,73,209,235,77,59,211, + 77,15,66,218,51,201,75,141,4,88,76,59,192,116,14,102,57,10,116,9,72,131,194,2,72,59,208,117,242,73,43,208,72,209,250,73,59,211,117,116,73,139,194,77,141,12,80,73,43,195,15,87,201,72,131,224,240,72,3,194,73,141,20,64,235,21,102,15,111,193,102, + 65,15,117,1,102,15,215,192,133,192,117,9,73,131,193,16,76,59,202,117,230,75,141,4,80,235,14,102,65,57,9,15,132,55,255,255,255,73,131,193,2,76,59,200,117,237,233,41,255,255,255,72,141,4,81,73,139,208,76,59,192,116,16,51,201,102,57,10,116,9,72, + 131,194,2,72,59,208,117,242,73,43,208,72,209,250,72,139,194,195,204,204,72,137,92,36,8,72,137,124,36,16,85,72,139,236,72,131,236,112,72,131,101,192,0,131,61,58,168,1,0,0,198,69,208,0,198,69,232,0,198,69,240,0,198,69,248,0,117,16,15,16,5,89,151, + 1,0,198,69,232,1,243,15,127,69,216,72,137,77,176,72,137,85,184,72,133,210,116,3,72,137,10,65,177,1,72,141,85,176,72,141,77,192,232,128,244,255,255,128,125,232,2,139,248,117,11,72,139,77,192,131,161,168,3,0,0,253,128,125,240,0,116,15,139,93,236, + 72,141,77,192,232,115,243,255,255,137,88,32,128,125,248,0,116,15,139,93,244,72,141,77,192,232,94,243,255,255,137,88,36,76,141,92,36,112,139,199,73,139,91,16,73,139,123,24,73,139,227,93,195,204,204,204,204,204,204,204,184,77,90,0,0,102,57,1,117, + 30,72,99,81,60,72,3,209,129,58,80,69,0,0,117,15,51,192,185,11,2,0,0,102,57,74,24,15,148,192,195,51,192,195,204,204,204,204,204,76,99,65,60,69,51,201,76,3,193,76,139,210,65,15,183,64,20,69,15,183,88,6,72,131,192,24,73,3,192,69,133,219,116,30, + 139,80,12,76,59,210,114,10,139,72,8,3,202,76,59,209,114,14,65,255,193,72,131,192,40,69,59,203,114,226,51,192,195,204,204,204,204,204,204,204,204,204,204,204,204,72,137,92,36,8,87,72,131,236,32,72,139,217,72,141,61,92,111,255,255,72,139,207,232, + 100,255,255,255,133,192,116,34,72,43,223,72,139,211,72,139,207,232,130,255,255,255,72,133,192,116,15,139,64,36,193,232,31,247,208,131,224,1,235,2,51,192,72,139,92,36,48,72,131,196,32,95,195,204,204,204,204,204,204,204,204,204,102,102,15,31,132, + 0,0,0,0,0,72,137,76,36,8,72,137,84,36,24,68,137,68,36,16,73,199,193,32,5,147,25,235,8,204,204,204,204,204,204,102,144,195,204,204,204,204,204,204,102,15,31,132,0,0,0,0,0,195,204,204,204,72,139,5,253,95,1,0,72,141,21,142,185,255,255,72,59,194, + 116,35,101,72,139,4,37,48,0,0,0,72,139,137,152,0,0,0,72,59,72,16,114,6,72,59,72,8,118,7,185,13,0,0,0,205,41,195,204,72,131,236,40,232,7,91,0,0,72,133,192,116,10,185,22,0,0,0,232,40,91,0,0,246,5,181,142,1,0,2,116,42,185,23,0,0,0,255,21,144,103, + 1,0,133,192,116,7,185,7,0,0,0,205,41,65,184,1,0,0,0,186,21,0,0,64,65,141,72,2,232,33,87,0,0,185,3,0,0,0,232,11,222,255,255,204,204,204,72,131,236,40,72,141,13,145,1,0,0,232,124,120,0,0,137,5,106,142,1,0,131,248,255,116,37,72,141,21,26,156,1, + 0,139,200,232,59,121,0,0,133,192,116,14,199,5,125,156,1,0,254,255,255,255,176,1,235,7,232,8,0,0,0,50,192,72,131,196,40,195,204,72,131,236,40,139,13,46,142,1,0,131,249,255,116,12,232,120,120,0,0,131,13,29,142,1,0,255,176,1,72,131,196,40,195,204, + 204,72,131,236,40,232,19,0,0,0,72,133,192,116,5,72,131,196,40,195,232,36,255,255,255,204,204,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,131,61,226,141,1,0,255,117,7,51,192,233,144,0,0,0,255,21,23,102,1,0,139,13,205,141,1,0,139, + 248,232,98,120,0,0,72,131,202,255,51,246,72,59,194,116,103,72,133,192,116,5,72,139,240,235,93,139,13,171,141,1,0,232,138,120,0,0,133,192,116,78,186,128,0,0,0,141,74,129,232,153,119,0,0,139,13,143,141,1,0,72,139,216,72,133,192,116,36,72,139,208, + 232,99,120,0,0,133,192,116,18,72,139,195,199,67,120,254,255,255,255,72,139,222,72,139,240,235,13,139,13,99,141,1,0,51,210,232,64,120,0,0,72,139,203,232,244,248,255,255,139,207,255,21,216,102,1,0,72,139,198,72,139,92,36,48,72,139,116,36,56,72, + 131,196,32,95,195,204,64,83,72,131,236,32,72,139,217,139,13,41,141,1,0,131,249,255,116,51,72,133,219,117,14,232,182,119,0,0,139,13,20,141,1,0,72,139,216,51,210,232,238,119,0,0,72,133,219,116,20,72,141,5,186,154,1,0,72,59,216,116,8,72,139,203, + 232,145,248,255,255,72,131,196,32,91,195,204,204,204,204,204,204,204,72,131,236,40,72,133,201,116,17,72,141,5,144,154,1,0,72,59,200,116,5,232,106,248,255,255,72,131,196,40,195,204,76,139,2,233,0,0,0,0,64,83,72,131,236,32,73,139,216,72,133,201, + 116,82,76,99,89,24,76,139,82,8,75,141,4,26,72,133,192,116,65,68,139,65,20,69,51,201,69,133,192,116,48,75,141,12,203,74,99,20,17,73,3,210,72,59,218,114,8,65,255,193,69,59,200,114,232,69,133,201,116,19,65,141,73,255,73,141,4,202,66,139,68,24,4, + 72,131,196,32,91,195,131,200,255,235,245,232,127,253,255,255,204,204,204,72,131,236,40,77,99,72,28,77,139,208,72,139,1,65,139,4,1,131,248,254,117,11,76,139,2,73,139,202,232,118,255,255,255,72,131,196,40,195,204,72,99,82,28,72,139,1,68,137,4, + 2,195,72,137,92,36,8,87,72,131,236,32,65,139,249,73,139,216,76,141,76,36,64,232,166,200,255,255,72,139,8,72,99,67,28,72,137,76,36,64,59,124,8,4,126,4,137,124,8,4,72,139,92,36,48,72,131,196,32,95,195,204,64,83,72,131,236,32,76,141,76,36,64,73, + 139,216,232,113,200,255,255,72,139,8,72,99,67,28,72,137,76,36,64,139,68,8,4,72,131,196,32,91,195,204,204,204,76,139,2,233,0,0,0,0,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,131,205,255,73,139,216,131,121,16,0,76,139, + 210,15,132,172,0,0,0,76,99,73,16,76,141,53,73,107,255,255,72,139,122,8,51,246,76,3,207,69,51,192,139,213,65,15,182,9,131,225,15,74,15,190,132,49,16,99,1,0,66,138,140,49,32,99,1,0,76,43,200,69,139,89,252,65,211,235,69,133,219,116,108,73,139,66, + 16,68,139,16,65,15,182,9,131,225,15,74,15,190,132,49,16,99,1,0,66,138,140,49,32,99,1,0,76,43,200,65,139,65,252,211,232,3,240,139,198,73,3,194,72,3,199,72,59,216,114,43,65,15,182,9,65,255,192,131,225,15,74,15,190,132,49,16,99,1,0,66,138,140,49, + 32,99,1,0,76,43,200,65,139,81,252,211,234,255,202,69,59,195,114,165,69,133,192,15,68,213,139,194,235,2,139,197,72,139,92,36,16,72,139,108,36,24,72,139,116,36,32,72,139,124,36,40,65,94,195,204,204,204,76,139,220,73,137,91,24,77,137,75,32,137, + 84,36,16,85,86,87,65,84,65,85,65,86,65,87,72,131,236,32,72,139,65,8,64,50,237,69,50,246,73,137,67,8,51,255,77,139,225,69,139,232,72,139,217,72,141,112,255,76,139,254,57,57,126,67,69,139,99,16,65,59,252,117,6,72,139,240,64,181,1,65,59,253,117, + 6,76,139,248,65,182,1,64,132,237,116,5,69,132,246,117,26,72,141,84,36,96,72,139,203,232,13,1,0,0,255,199,59,59,125,7,72,139,68,36,96,235,198,76,139,100,36,120,73,139,4,36,73,137,116,36,8,15,16,3,15,17,0,15,16,75,16,15,17,72,16,72,139,132,36, + 128,0,0,0,72,139,8,76,137,120,8,15,16,3,15,17,1,15,16,75,16,72,139,92,36,112,15,17,73,16,72,131,196,32,65,95,65,94,65,93,65,92,95,94,93,195,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,48,72,139,124,36,96,139,218,73,139,240,76,139,209, + 72,139,87,8,73,59,80,8,119,119,72,57,81,8,119,113,73,139,64,8,72,139,202,73,43,74,8,72,43,194,72,59,200,125,45,65,15,16,2,15,17,68,36,32,73,59,82,8,118,75,72,139,76,36,32,72,141,84,36,40,232,83,0,0,0,72,139,68,36,40,255,195,72,57,71,8,119,228, + 235,45,65,139,217,15,16,7,15,17,68,36,32,73,57,80,8,118,28,72,139,76,36,32,72,141,84,36,40,232,36,0,0,0,72,139,76,36,40,255,203,72,57,78,8,119,228,139,195,235,3,131,200,255,72,139,92,36,64,72,139,116,36,72,72,131,196,48,95,195,76,139,2,76,141, + 29,2,105,255,255,76,139,209,76,139,202,65,15,182,8,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,76,43,192,65,139,64,252,211,232,139,200,76,137,2,131,225,3,193,232,2,65,137,66,16,65,137,74,20,141,65,255,131,248,1,118,22,131,249, + 3,117,74,72,139,2,139,8,72,131,192,4,72,137,2,65,137,74,24,195,72,139,2,139,8,72,131,192,4,72,137,2,65,137,74,24,72,139,18,15,182,10,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,72,43,208,139,66,252,211,232,73,137,17,65,137, + 66,28,195,131,122,12,0,76,139,201,15,132,193,0,0,0,72,99,82,12,73,3,208,76,141,5,85,104,255,255,72,137,81,8,15,182,10,131,225,15,74,15,190,132,1,16,99,1,0,66,138,140,1,32,99,1,0,72,43,208,139,66,252,211,232,73,137,81,8,65,137,1,73,137,81,16, + 15,182,10,131,225,15,74,15,190,132,1,16,99,1,0,66,138,140,1,32,99,1,0,72,43,208,139,66,252,211,232,73,137,81,8,65,137,65,24,15,182,10,131,225,15,74,15,190,132,1,16,99,1,0,66,138,140,1,32,99,1,0,72,43,208,139,66,252,211,232,73,137,81,8,65,137, + 65,28,15,182,10,131,225,15,74,15,190,132,1,16,99,1,0,66,138,140,1,32,99,1,0,72,43,208,139,66,252,211,232,65,137,65,32,72,141,66,4,73,137,81,8,139,10,73,137,65,8,65,137,73,36,235,3,131,33,0,73,139,193,195,204,204,204,64,83,72,131,236,32,51,192, + 15,87,192,136,65,24,72,139,217,72,137,65,28,72,137,65,36,15,17,65,48,76,137,65,64,68,137,73,72,57,66,12,116,69,72,99,82,12,73,3,208,76,141,5,96,103,255,255,72,137,81,8,15,182,10,131,225,15,74,15,190,132,1,16,99,1,0,66,138,140,1,32,99,1,0,72, + 43,208,139,66,252,211,232,72,139,203,137,3,72,137,83,8,72,137,83,16,232,15,0,0,0,235,2,137,1,72,139,195,72,131,196,32,91,195,204,204,51,192,76,141,29,19,103,255,255,136,65,24,15,87,192,72,137,65,28,76,139,193,72,137,65,36,15,17,65,48,72,139, + 65,8,68,138,8,72,141,80,1,68,136,73,24,72,137,81,8,65,246,193,1,116,39,15,182,10,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,72,43,208,139,66,252,211,232,65,137,64,28,73,137,80,8,65,246,193,2,116,14,139,2,72,131,194,4,73,137, + 80,8,65,137,64,32,65,246,193,4,116,39,15,182,10,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,72,43,208,139,66,252,211,232,65,137,64,36,73,137,80,8,139,2,76,141,82,4,65,137,64,40,177,48,65,138,193,77,137,80,8,34,193,65,246,193, + 8,116,64,60,16,117,16,73,99,10,73,141,66,4,73,137,64,8,73,137,72,48,195,68,34,201,65,128,249,32,15,133,184,0,0,0,73,99,2,73,141,82,4,73,137,80,8,73,137,64,48,72,141,66,4,72,99,10,73,137,64,8,233,149,0,0,0,60,16,117,48,65,15,182,10,131,225,15, + 74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,76,43,208,65,139,64,72,65,139,82,252,211,234,3,194,77,137,80,8,73,137,64,48,195,68,34,201,65,128,249,32,117,92,65,15,182,10,65,139,80,72,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32, + 99,1,0,76,43,208,65,139,66,252,211,232,77,137,80,8,141,12,2,73,137,72,48,65,15,182,10,131,225,15,74,15,190,132,25,16,99,1,0,66,138,140,25,32,99,1,0,76,43,208,65,139,66,252,211,232,77,137,80,8,141,12,2,73,137,72,56,195,68,137,76,36,32,76,137, + 68,36,24,72,137,76,36,8,83,86,87,65,84,65,85,65,86,65,87,72,131,236,48,69,139,225,73,139,240,72,139,218,76,139,249,232,41,200,255,255,76,139,232,72,137,68,36,40,76,139,198,72,139,211,73,139,207,232,35,249,255,255,139,248,232,92,247,255,255,255, + 64,48,131,255,255,15,132,235,0,0,0,65,59,252,15,142,226,0,0,0,131,255,255,15,142,20,1,0,0,59,126,4,15,141,11,1,0,0,76,99,247,232,221,199,255,255,72,99,78,8,74,141,4,240,139,60,1,137,124,36,32,232,201,199,255,255,72,99,78,8,74,141,4,240,131,124, + 1,4,0,116,28,232,181,199,255,255,72,99,78,8,74,141,4,240,72,99,92,1,4,232,163,199,255,255,72,3,195,235,2,51,192,72,133,192,116,89,68,139,199,72,139,214,73,139,207,232,193,248,255,255,232,132,199,255,255,72,99,78,8,74,141,4,240,131,124,1,4,0, + 116,28,232,112,199,255,255,72,99,78,8,74,141,4,240,72,99,92,1,4,232,94,199,255,255,72,3,195,235,2,51,192,65,184,3,1,0,0,73,139,215,72,139,200,232,166,113,0,0,73,139,205,232,82,199,255,255,235,30,68,139,164,36,136,0,0,0,72,139,180,36,128,0,0, + 0,76,139,124,36,112,76,139,108,36,40,139,124,36,32,137,124,36,36,233,12,255,255,255,232,96,246,255,255,131,120,48,0,126,8,232,85,246,255,255,255,72,48,131,255,255,116,5,65,59,252,127,36,68,139,199,72,139,214,73,139,207,232,34,248,255,255,72, + 131,196,48,65,95,65,94,65,93,65,92,95,94,91,195,232,97,245,255,255,144,232,91,245,255,255,144,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,32,72,139,233,73,139,248,73,139,200,72,139,242,232,71,247,255,255,76,141,76, + 36,72,76,139,199,72,139,214,72,139,205,139,216,232,150,192,255,255,76,139,199,72,139,214,72,139,205,232,4,248,255,255,59,216,126,35,68,139,195,72,141,76,36,72,72,139,215,232,168,247,255,255,68,139,203,76,139,199,72,139,214,72,139,205,232,163, + 247,255,255,235,16,76,139,199,72,139,214,72,139,205,232,207,247,255,255,139,216,72,139,108,36,56,139,195,72,139,92,36,48,72,139,116,36,64,72,131,196,32,95,195,204,204,204,204,204,204,64,83,86,87,65,84,65,85,65,86,65,87,72,131,236,112,72,139, + 249,69,51,255,68,137,124,36,32,68,33,188,36,176,0,0,0,76,33,124,36,40,76,33,188,36,200,0,0,0,232,75,245,255,255,76,139,104,40,76,137,108,36,64,232,61,245,255,255,72,139,64,32,72,137,132,36,192,0,0,0,72,139,119,80,72,137,180,36,184,0,0,0,72,139, + 71,72,72,137,68,36,48,72,139,95,64,72,139,71,48,72,137,68,36,72,76,139,119,40,76,137,116,36,80,72,139,203,232,2,244,255,255,232,249,244,255,255,72,137,112,32,232,240,244,255,255,72,137,88,40,232,231,244,255,255,72,139,80,32,72,139,82,40,72,141, + 76,36,96,232,221,197,255,255,76,139,224,72,137,68,36,56,76,57,127,88,116,28,199,132,36,176,0,0,0,1,0,0,0,232,183,244,255,255,72,139,72,112,72,137,140,36,200,0,0,0,65,184,0,1,0,0,73,139,214,72,139,76,36,72,232,168,111,0,0,72,139,216,72,137,68, + 36,40,72,139,188,36,192,0,0,0,235,120,199,68,36,32,1,0,0,0,232,121,244,255,255,131,96,64,0,72,139,180,36,184,0,0,0,131,188,36,176,0,0,0,0,116,33,178,1,72,139,206,232,233,199,255,255,72,139,132,36,200,0,0,0,76,141,72,32,68,139,64,24,139,80,4, + 139,8,235,13,76,141,78,32,68,139,70,24,139,86,4,139,14,255,21,127,91,1,0,68,139,124,36,32,72,139,92,36,40,76,139,108,36,64,72,139,188,36,192,0,0,0,76,139,116,36,80,76,139,100,36,56,73,139,204,232,74,197,255,255,69,133,255,117,50,129,62,99,115, + 109,224,117,42,131,126,24,4,117,36,139,70,32,45,32,5,147,25,131,248,2,119,23,72,139,78,40,232,237,199,255,255,133,192,116,10,178,1,72,139,206,232,95,199,255,255,232,202,243,255,255,72,137,120,32,232,193,243,255,255,76,137,104,40,72,139,68,36, + 48,72,99,72,28,73,139,6,72,199,4,1,254,255,255,255,72,139,195,72,131,196,112,65,95,65,94,65,93,65,92,95,94,91,195,204,204,72,139,196,83,86,87,65,84,65,85,65,86,65,87,72,129,236,0,1,0,0,15,41,112,184,72,139,5,124,129,1,0,72,51,196,72,137,132, + 36,224,0,0,0,69,139,233,73,139,216,72,139,242,76,139,225,72,137,76,36,112,72,137,76,36,96,68,137,76,36,72,232,249,195,255,255,72,137,68,36,104,72,139,214,72,139,203,232,149,245,255,255,139,248,76,141,118,72,76,137,116,36,120,65,131,62,0,116, + 23,232,35,243,255,255,131,120,120,254,15,133,120,2,0,0,65,139,62,131,239,2,235,31,232,12,243,255,255,131,120,120,254,116,20,232,1,243,255,255,139,120,120,232,249,242,255,255,199,64,120,254,255,255,255,232,237,242,255,255,255,64,48,72,131,198, + 8,72,137,180,36,128,0,0,0,131,123,8,0,116,63,72,99,83,8,72,3,22,15,182,10,131,225,15,76,141,5,164,96,255,255,74,15,190,132,1,16,99,1,0,66,15,182,140,1,32,99,1,0,72,43,208,139,66,252,211,232,137,132,36,192,0,0,0,72,137,148,36,200,0,0,0,235,16, + 131,164,36,192,0,0,0,0,72,139,148,36,200,0,0,0,72,141,132,36,192,0,0,0,72,137,68,36,48,72,137,84,36,56,72,141,132,36,192,0,0,0,72,137,68,36,80,72,137,84,36,88,72,141,68,36,80,72,137,68,36,32,76,141,76,36,48,69,139,197,139,215,72,141,140,36,192, + 0,0,0,232,152,245,255,255,144,72,141,132,36,192,0,0,0,72,137,132,36,152,0,0,0,72,139,132,36,200,0,0,0,72,137,132,36,160,0,0,0,76,139,124,36,56,76,59,248,15,130,54,1,0,0,76,59,124,36,88,15,134,43,1,0,0,72,141,84,36,56,72,139,76,36,48,232,207, + 246,255,255,76,137,124,36,56,72,139,92,36,48,15,16,115,16,15,17,180,36,136,0,0,0,15,40,68,36,48,102,15,127,132,36,176,0,0,0,72,141,84,36,56,72,139,203,232,158,246,255,255,139,67,16,76,43,248,76,137,124,36,56,72,141,68,36,48,72,137,68,36,32,68, + 139,207,76,141,132,36,176,0,0,0,65,139,213,72,141,76,36,80,232,193,245,255,255,139,248,137,68,36,68,131,100,36,64,0,69,51,201,102,15,111,198,102,15,115,216,8,102,15,126,192,102,15,115,222,4,102,15,126,241,133,201,68,15,69,200,68,137,76,36,64, + 69,133,201,15,132,129,0,0,0,141,71,2,65,137,6,141,65,255,131,248,1,118,22,73,99,201,72,3,14,65,184,3,1,0,0,73,139,212,232,83,108,0,0,235,54,72,139,68,36,96,72,139,16,131,249,2,117,13,139,132,36,148,0,0,0,76,139,4,16,235,11,68,139,132,36,148, + 0,0,0,76,3,194,73,99,201,72,3,14,65,185,3,1,0,0,232,203,108,0,0,72,139,76,36,104,232,197,193,255,255,235,27,139,124,36,68,76,139,100,36,112,76,139,116,36,120,72,139,180,36,128,0,0,0,68,139,108,36,72,233,156,254,255,255,232,218,240,255,255,131, + 120,48,0,126,8,232,207,240,255,255,255,72,48,72,139,140,36,224,0,0,0,72,51,204,232,124,35,0,0,15,40,180,36,240,0,0,0,72,129,196,0,1,0,0,65,95,65,94,65,93,65,92,95,94,91,195,232,216,239,255,255,144,204,204,204,204,204,204,204,204,204,204,204, + 72,139,196,83,86,87,65,84,65,85,65,87,72,129,236,168,0,0,0,72,139,249,69,51,228,68,137,100,36,32,68,33,164,36,240,0,0,0,76,33,100,36,40,76,33,100,36,64,68,136,96,128,68,33,96,132,68,33,96,136,68,33,96,140,68,33,96,144,68,33,96,148,232,67,240, + 255,255,72,139,64,40,72,137,68,36,56,232,53,240,255,255,72,139,64,32,72,137,68,36,48,72,139,119,80,72,137,180,36,248,0,0,0,72,139,95,64,72,139,71,48,72,137,68,36,80,76,139,127,40,72,139,71,72,72,137,68,36,112,72,139,71,104,72,137,68,36,120,139, + 71,120,137,132,36,232,0,0,0,139,71,56,137,132,36,224,0,0,0,72,139,203,232,229,238,255,255,232,220,239,255,255,72,137,112,32,232,211,239,255,255,72,137,88,40,232,202,239,255,255,72,139,80,32,72,139,82,40,72,141,140,36,136,0,0,0,232,189,192,255, + 255,76,139,232,72,137,68,36,72,76,57,103,88,116,25,199,132,36,240,0,0,0,1,0,0,0,232,151,239,255,255,72,139,72,112,72,137,76,36,64,65,184,0,1,0,0,73,139,215,72,139,76,36,80,232,219,106,0,0,72,139,216,72,137,68,36,40,72,131,248,2,125,19,72,139, + 92,196,112,72,133,219,15,132,24,1,0,0,72,137,92,36,40,73,139,215,72,139,203,232,223,106,0,0,72,139,124,36,56,76,139,124,36,48,235,124,199,68,36,32,1,0,0,0,232,54,239,255,255,131,96,64,0,232,45,239,255,255,139,140,36,232,0,0,0,137,72,120,72,139, + 180,36,248,0,0,0,131,188,36,240,0,0,0,0,116,30,178,1,72,139,206,232,151,194,255,255,72,139,68,36,64,76,141,72,32,68,139,64,24,139,80,4,139,8,235,13,76,141,78,32,68,139,70,24,139,86,4,139,14,255,21,48,86,1,0,68,139,100,36,32,72,139,92,36,40,72, + 139,124,36,56,76,139,124,36,48,76,139,108,36,72,73,139,205,232,3,192,255,255,69,133,228,117,50,129,62,99,115,109,224,117,42,131,126,24,4,117,36,139,70,32,45,32,5,147,25,131,248,2,119,23,72,139,78,40,232,166,194,255,255,133,192,116,10,178,1,72, + 139,206,232,24,194,255,255,232,131,238,255,255,76,137,120,32,232,122,238,255,255,72,137,120,40,232,113,238,255,255,139,140,36,224,0,0,0,137,72,120,232,98,238,255,255,199,64,120,254,255,255,255,72,139,195,72,129,196,168,0,0,0,65,95,65,93,65,92, + 95,94,91,195,232,126,237,255,255,144,204,72,139,194,73,139,208,72,255,224,204,204,204,73,139,192,76,139,210,72,139,208,69,139,193,73,255,226,204,72,131,97,16,0,72,141,5,40,195,0,0,72,137,65,8,72,141,5,13,195,0,0,72,137,1,72,139,193,195,204,204, + 64,83,72,131,236,32,72,139,217,72,139,194,72,141,13,169,188,0,0,15,87,192,72,137,11,72,141,83,8,72,141,72,8,15,17,2,232,167,194,255,255,72,141,5,212,194,0,0,72,137,3,72,139,195,72,131,196,32,91,195,72,137,92,36,8,87,72,131,236,32,76,139,9,73, + 139,216,65,131,32,0,65,184,99,115,109,224,69,57,1,117,90,65,131,121,24,4,191,1,0,0,0,65,186,32,5,147,25,117,27,65,139,65,32,65,43,194,131,248,2,119,15,72,139,66,40,73,57,65,40,139,11,15,68,207,137,11,69,57,1,117,40,65,131,121,24,4,117,33,65, + 139,73,32,65,43,202,131,249,2,119,21,73,131,121,48,0,117,14,232,88,237,255,255,137,120,64,139,199,137,59,235,2,51,192,72,139,92,36,48,72,131,196,32,95,195,204,204,72,137,92,36,8,87,72,131,236,32,65,139,248,77,139,193,232,99,255,255,255,139,216, + 133,192,117,8,232,32,237,255,255,137,120,120,139,195,72,139,92,36,48,72,131,196,32,95,195,72,137,92,36,8,72,137,108,36,24,72,137,116,36,32,87,65,84,65,85,65,86,65,87,72,131,236,32,72,139,234,76,139,233,72,133,210,15,132,188,0,0,0,69,50,255,51, + 246,57,50,15,142,143,0,0,0,232,175,189,255,255,72,139,208,73,139,69,48,76,99,96,12,73,131,196,4,76,3,226,232,152,189,255,255,72,139,208,73,139,69,48,72,99,72,12,68,139,52,10,69,133,246,126,84,72,99,198,72,141,4,128,72,137,68,36,88,232,115,189, + 255,255,73,139,93,48,72,139,248,73,99,4,36,72,3,248,232,52,189,255,255,72,139,84,36,88,76,139,195,72,99,77,4,72,141,4,144,72,139,215,72,3,200,232,53,1,0,0,133,192,117,14,65,255,206,73,131,196,4,69,133,246,127,189,235,3,65,183,1,255,198,59,117, + 0,15,140,113,255,255,255,72,139,92,36,80,65,138,199,72,139,108,36,96,72,139,116,36,104,72,131,196,32,65,95,65,94,65,93,65,92,95,195,232,96,235,255,255,204,204,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,32,51,237,72, + 139,249,57,41,126,80,51,246,232,172,188,255,255,72,99,79,4,72,3,198,131,124,1,4,0,116,27,232,153,188,255,255,72,99,79,4,72,3,198,72,99,92,1,4,232,136,188,255,255,72,3,195,235,2,51,192,72,141,72,8,72,141,21,86,132,1,0,232,113,193,255,255,133, + 192,116,33,255,197,72,131,198,20,59,47,124,178,50,192,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,131,196,32,95,195,176,1,235,231,233,107,8,0,0,204,204,204,72,131,236,88,72,137,100,36,72,138,132,36,152,0,0,0,136,68,36,56,72,139,132, + 36,144,0,0,0,72,137,68,36,48,139,132,36,136,0,0,0,137,68,36,40,72,139,132,36,128,0,0,0,72,137,68,36,32,232,98,10,0,0,137,68,36,64,72,141,21,9,0,0,0,72,139,204,232,207,103,0,0,144,139,68,36,64,72,131,196,88,195,204,72,139,196,72,137,88,8,72,137, + 104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,32,51,219,77,139,240,72,139,234,72,139,249,57,89,4,15,132,240,0,0,0,72,99,113,4,232,174,187,255,255,76,139,200,76,3,206,15,132,219,0,0,0,133,246,116,15,72,99,119,4,232,149,187,255,255,72,141, + 12,6,235,5,72,139,203,139,243,56,89,16,15,132,186,0,0,0,246,7,128,116,10,246,69,0,16,15,133,171,0,0,0,133,246,116,17,232,105,187,255,255,72,139,240,72,99,71,4,72,3,240,235,3,72,139,243,232,129,187,255,255,72,139,200,72,99,69,4,72,3,200,72,59, + 241,116,75,57,95,4,116,17,232,60,187,255,255,72,139,240,72,99,71,4,72,3,240,235,3,72,139,243,232,84,187,255,255,76,99,69,4,73,131,192,16,76,3,192,72,141,70,16,76,43,192,15,182,8,66,15,182,20,0,43,202,117,7,72,255,192,133,210,117,237,133,201, + 116,4,51,192,235,57,176,2,132,69,0,116,5,246,7,8,116,36,65,246,6,1,116,5,246,7,1,116,25,65,246,6,4,116,5,246,7,4,116,14,65,132,6,116,4,132,7,116,5,187,1,0,0,0,139,195,235,5,184,1,0,0,0,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,139, + 124,36,72,72,131,196,32,65,94,195,204,204,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,32,51,219,77,139,240,72,139,234,72,139,249,57,89,8,15,132,245,0,0,0,72,99,113,8,232,110,186,255,255,76,139,200,76, + 3,206,15,132,224,0,0,0,133,246,116,15,72,99,119,8,232,85,186,255,255,72,141,12,6,235,5,72,139,203,139,243,56,89,16,15,132,191,0,0,0,246,71,4,128,116,10,246,69,0,16,15,133,175,0,0,0,133,246,116,17,232,40,186,255,255,72,139,240,72,99,71,8,72,3, + 240,235,3,72,139,243,232,64,186,255,255,72,139,200,72,99,69,4,72,3,200,72,59,241,116,75,57,95,8,116,17,232,251,185,255,255,72,139,240,72,99,71,8,72,3,240,235,3,72,139,243,232,19,186,255,255,76,99,69,4,73,131,192,16,76,3,192,72,141,70,16,76,43, + 192,15,182,8,66,15,182,20,0,43,202,117,7,72,255,192,133,210,117,237,133,201,116,4,51,192,235,61,176,2,132,69,0,116,6,246,71,4,8,116,39,65,246,6,1,116,6,246,71,4,1,116,27,65,246,6,4,116,6,246,71,4,4,116,15,65,132,6,116,5,132,71,4,116,5,187,1, + 0,0,0,139,195,235,5,184,1,0,0,0,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,139,124,36,72,72,131,196,32,65,94,195,204,204,72,137,92,36,8,72,137,116,36,16,72,137,124,36,24,65,85,65,86,65,87,72,131,236,48,77,139,241,73,139,216,72,139, + 242,76,139,233,51,255,65,57,120,4,116,15,77,99,120,4,232,42,185,255,255,73,141,20,7,235,6,72,139,215,68,139,255,72,133,210,15,132,119,1,0,0,69,133,255,116,17,232,11,185,255,255,72,139,200,72,99,67,4,72,3,200,235,3,72,139,207,64,56,121,16,15, + 132,84,1,0,0,57,123,8,117,8,57,59,15,141,71,1,0,0,57,59,124,10,72,99,67,8,72,3,6,72,139,240,246,3,128,116,50,65,246,6,16,116,44,72,139,5,93,130,1,0,72,133,192,116,32,255,21,26,71,1,0,72,133,192,15,132,47,1,0,0,72,133,246,15,132,38,1,0,0,72,137, + 6,72,139,200,235,95,246,3,8,116,27,73,139,77,40,72,133,201,15,132,17,1,0,0,72,133,246,15,132,8,1,0,0,72,137,14,235,63,65,246,6,1,116,74,73,139,85,40,72,133,210,15,132,245,0,0,0,72,133,246,15,132,236,0,0,0,77,99,70,20,72,139,206,232,184,26,0, + 0,65,131,126,20,8,15,133,171,0,0,0,72,57,62,15,132,162,0,0,0,72,139,14,73,141,86,8,232,200,187,255,255,72,137,6,233,142,0,0,0,65,57,126,24,116,15,73,99,94,24,232,77,184,255,255,72,141,12,3,235,5,72,139,207,139,223,72,133,201,117,52,73,57,125, + 40,15,132,148,0,0,0,72,133,246,15,132,139,0,0,0,73,99,94,20,73,141,86,8,73,139,77,40,232,125,187,255,255,72,139,208,76,139,195,72,139,206,232,63,26,0,0,235,59,73,57,125,40,116,105,72,133,246,116,100,133,219,116,17,232,245,183,255,255,72,139, + 200,73,99,70,24,72,3,200,235,3,72,139,207,72,133,201,116,71,65,138,6,36,4,246,216,27,201,247,217,255,193,139,249,137,76,36,32,139,199,235,2,51,192,72,139,92,36,80,72,139,116,36,88,72,139,124,36,96,72,131,196,48,65,95,65,94,65,93,195,232,9,230, + 255,255,232,4,230,255,255,232,255,229,255,255,232,250,229,255,255,232,245,229,255,255,144,232,239,229,255,255,144,204,204,72,137,92,36,8,72,137,116,36,16,72,137,124,36,24,65,85,65,86,65,87,72,131,236,48,77,139,241,73,139,216,72,139,242,76,139, + 233,51,255,65,57,120,8,116,15,77,99,120,8,232,42,183,255,255,73,141,20,7,235,6,72,139,215,68,139,255,72,133,210,15,132,122,1,0,0,69,133,255,116,17,232,11,183,255,255,72,139,200,72,99,67,8,72,3,200,235,3,72,139,207,64,56,121,16,15,132,87,1,0, + 0,57,123,12,117,9,57,123,4,15,141,73,1,0,0,57,123,4,124,9,139,67,12,72,3,6,72,139,240,246,67,4,128,116,50,65,246,6,16,116,44,72,139,5,91,128,1,0,72,133,192,116,32,255,21,24,69,1,0,72,133,192,15,132,48,1,0,0,72,133,246,15,132,39,1,0,0,72,137, + 6,72,139,200,235,96,246,67,4,8,116,27,73,139,77,40,72,133,201,15,132,17,1,0,0,72,133,246,15,132,8,1,0,0,72,137,14,235,63,65,246,6,1,116,74,73,139,85,40,72,133,210,15,132,245,0,0,0,72,133,246,15,132,236,0,0,0,77,99,70,20,72,139,206,232,181,24, + 0,0,65,131,126,20,8,15,133,171,0,0,0,72,57,62,15,132,162,0,0,0,72,139,14,73,141,86,8,232,197,185,255,255,72,137,6,233,142,0,0,0,65,57,126,24,116,15,73,99,94,24,232,74,182,255,255,72,141,12,3,235,5,72,139,207,139,223,72,133,201,117,52,73,57,125, + 40,15,132,148,0,0,0,72,133,246,15,132,139,0,0,0,73,99,94,20,73,141,86,8,73,139,77,40,232,122,185,255,255,72,139,208,76,139,195,72,139,206,232,60,24,0,0,235,59,73,57,125,40,116,105,72,133,246,116,100,133,219,116,17,232,242,181,255,255,72,139, + 200,73,99,70,24,72,3,200,235,3,72,139,207,72,133,201,116,71,65,138,6,36,4,246,216,27,201,247,217,255,193,139,249,137,76,36,32,139,199,235,2,51,192,72,139,92,36,80,72,139,116,36,88,72,139,124,36,96,72,131,196,48,65,95,65,94,65,93,195,232,6,228, + 255,255,232,1,228,255,255,232,252,227,255,255,232,247,227,255,255,232,242,227,255,255,144,232,236,227,255,255,144,204,204,204,72,137,92,36,8,72,137,116,36,16,72,137,124,36,24,65,86,72,131,236,32,73,139,249,76,139,241,51,219,65,57,24,125,5,72, + 139,242,235,7,73,99,112,8,72,3,50,232,201,251,255,255,131,232,1,116,60,131,248,1,117,103,72,141,87,8,73,139,78,40,232,162,184,255,255,76,139,240,57,95,24,116,12,232,49,181,255,255,72,99,95,24,72,3,216,65,185,1,0,0,0,77,139,198,72,139,211,72, + 139,206,232,6,246,255,255,235,48,72,141,87,8,73,139,78,40,232,107,184,255,255,76,139,240,57,95,24,116,12,232,250,180,255,255,72,99,95,24,72,3,216,77,139,198,72,139,211,72,139,206,232,201,245,255,255,144,72,139,92,36,48,72,139,116,36,56,72,139, + 124,36,64,72,131,196,32,65,94,195,232,41,227,255,255,144,72,137,92,36,8,72,137,116,36,16,72,137,124,36,24,65,86,72,131,236,32,73,139,249,76,139,241,51,219,65,57,88,4,125,5,72,139,242,235,7,65,139,112,12,72,3,50,232,8,253,255,255,131,232,1,116, + 60,131,248,1,117,103,72,141,87,8,73,139,78,40,232,225,183,255,255,76,139,240,57,95,24,116,12,232,112,180,255,255,72,99,95,24,72,3,216,65,185,1,0,0,0,77,139,198,72,139,211,72,139,206,232,69,245,255,255,235,48,72,141,87,8,73,139,78,40,232,170, + 183,255,255,76,139,240,57,95,24,116,12,232,57,180,255,255,72,99,95,24,72,3,216,77,139,198,72,139,211,72,139,206,232,8,245,255,255,144,72,139,92,36,48,72,139,116,36,56,72,139,124,36,64,72,131,196,32,65,94,195,232,104,226,255,255,144,204,204,204, + 72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,80,72,139,249,73,139,241,73,139,200,77,139,240,72,139,234,232,255,225,255,255,232,246,226,255,255,72,139,156,36,128,0,0,0,185,41,0,0,128,186,38,0,0,128,131,120, + 64,0,117,56,129,63,99,115,109,224,116,48,57,15,117,16,131,127,24,15,117,14,72,129,127,96,32,5,147,25,116,28,57,23,116,24,139,3,37,255,255,255,31,61,34,5,147,25,114,10,246,67,36,1,15,133,143,1,0,0,246,71,4,102,15,132,142,0,0,0,131,123,4,0,15, + 132,123,1,0,0,131,188,36,136,0,0,0,0,15,133,109,1,0,0,246,71,4,32,116,93,57,23,117,55,76,139,70,32,72,139,214,72,139,203,232,195,227,255,255,131,248,255,15,140,107,1,0,0,59,67,4,15,141,98,1,0,0,68,139,200,72,139,205,72,139,214,76,139,195,232, + 160,234,255,255,233,44,1,0,0,57,15,117,30,68,139,79,56,65,131,249,255,15,140,58,1,0,0,68,59,75,4,15,141,48,1,0,0,72,139,79,40,235,206,76,139,195,72,139,214,72,139,205,232,99,172,255,255,233,247,0,0,0,131,123,12,0,117,66,139,3,37,255,255,255, + 31,61,33,5,147,25,114,20,131,123,32,0,116,14,232,159,178,255,255,72,99,75,32,72,3,193,117,32,139,3,37,255,255,255,31,61,34,5,147,25,15,130,189,0,0,0,139,67,36,193,232,2,168,1,15,132,175,0,0,0,129,63,99,115,109,224,117,110,131,127,24,3,114,104, + 129,127,32,34,5,147,25,118,95,72,139,71,48,131,120,8,0,116,85,232,124,178,255,255,72,139,79,48,76,139,208,72,99,81,8,76,3,210,116,64,15,182,140,36,152,0,0,0,76,139,206,139,132,36,136,0,0,0,77,139,198,137,76,36,56,72,139,213,72,139,140,36,144, + 0,0,0,72,137,76,36,48,72,139,207,137,68,36,40,73,139,194,72,137,92,36,32,255,21,98,64,1,0,235,62,72,139,132,36,144,0,0,0,76,139,206,72,137,68,36,56,77,139,198,139,132,36,136,0,0,0,72,139,213,137,68,36,48,72,139,207,138,132,36,152,0,0,0,136,68, + 36,40,72,137,92,36,32,232,187,2,0,0,184,1,0,0,0,72,139,92,36,96,72,139,108,36,104,72,139,116,36,112,72,139,124,36,120,72,131,196,80,65,94,195,232,46,224,255,255,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,86,65,87,72,129,236, + 128,0,0,0,72,139,217,73,139,233,73,139,200,77,139,248,76,139,242,232,197,223,255,255,232,188,224,255,255,72,139,188,36,192,0,0,0,51,246,65,184,41,0,0,128,65,185,38,0,0,128,57,112,64,117,43,129,59,99,115,109,224,116,35,68,57,3,117,16,131,123, + 24,15,117,15,72,129,123,96,32,5,147,25,116,14,68,57,11,116,9,246,7,32,15,133,242,1,0,0,246,67,4,102,15,132,26,1,0,0,57,119,8,15,132,223,1,0,0,72,99,87,8,76,141,61,56,78,255,255,72,3,85,8,15,182,10,131,225,15,74,15,190,132,57,16,99,1,0,66,138, + 140,57,32,99,1,0,72,43,208,139,66,252,211,232,133,192,15,132,169,1,0,0,57,180,36,200,0,0,0,15,133,156,1,0,0,246,67,4,32,15,132,177,0,0,0,68,57,11,117,99,76,139,69,32,72,139,213,72,139,207,232,102,226,255,255,68,139,200,131,248,255,15,140,148, + 1,0,0,57,119,8,116,39,72,99,87,8,72,3,85,8,15,182,10,131,225,15,74,15,190,132,57,16,99,1,0,66,138,140,57,32,99,1,0,72,43,208,139,114,252,211,238,68,59,206,15,141,95,1,0,0,73,139,206,72,139,213,76,139,199,232,31,236,255,255,233,42,1,0,0,68,57, + 3,117,68,68,139,75,56,65,131,249,255,15,140,57,1,0,0,72,99,87,8,72,3,85,8,15,182,10,131,225,15,74,15,190,132,57,16,99,1,0,66,138,140,57,32,99,1,0,72,43,208,139,66,252,211,232,68,59,200,15,141,9,1,0,0,72,139,75,40,235,167,76,139,199,72,139,213, + 73,139,206,232,35,173,255,255,233,206,0,0,0,76,139,69,8,72,141,76,36,80,72,139,215,232,177,228,255,255,57,116,36,80,117,9,246,7,64,15,132,174,0,0,0,129,59,99,115,109,224,117,109,131,123,24,3,114,103,129,123,32,34,5,147,25,118,94,72,139,67,48, + 57,112,8,116,85,232,233,175,255,255,72,139,75,48,76,139,208,72,99,81,8,76,3,210,116,64,15,182,140,36,216,0,0,0,76,139,205,139,132,36,200,0,0,0,77,139,199,137,76,36,56,73,139,214,72,139,140,36,208,0,0,0,72,137,76,36,48,72,139,203,137,68,36,40, + 73,139,194,72,137,124,36,32,255,21,207,61,1,0,235,62,72,139,132,36,208,0,0,0,76,139,205,72,137,68,36,56,77,139,199,139,132,36,200,0,0,0,73,139,214,137,68,36,48,72,139,203,138,132,36,216,0,0,0,136,68,36,40,72,137,124,36,32,232,0,5,0,0,184,1,0, + 0,0,76,141,156,36,128,0,0,0,73,139,91,32,73,139,107,40,73,139,115,48,73,139,227,65,95,65,94,95,195,232,153,221,255,255,204,64,85,83,86,87,65,84,65,85,65,86,65,87,72,141,108,36,216,72,129,236,40,1,0,0,72,139,5,68,108,1,0,72,51,196,72,137,69,16, + 72,139,189,144,0,0,0,76,139,226,76,139,173,168,0,0,0,77,139,248,76,137,68,36,104,72,139,217,72,137,84,36,120,76,139,199,73,139,204,76,137,109,152,73,139,209,198,68,36,96,0,73,139,241,232,222,231,255,255,68,139,240,131,248,255,15,140,97,4,0,0, + 59,71,4,15,141,88,4,0,0,129,59,99,115,109,224,15,133,201,0,0,0,131,123,24,4,15,133,191,0,0,0,139,67,32,45,32,5,147,25,131,248,2,15,135,174,0,0,0,72,131,123,48,0,15,133,163,0,0,0,232,174,221,255,255,72,131,120,32,0,15,132,175,3,0,0,232,158,221, + 255,255,72,139,88,32,232,149,221,255,255,72,139,75,56,198,68,36,96,1,76,139,120,40,76,137,124,36,104,232,110,174,255,255,129,59,99,115,109,224,117,30,131,123,24,4,117,24,139,67,32,45,32,5,147,25,131,248,2,119,11,72,131,123,48,0,15,132,203,3, + 0,0,232,83,221,255,255,72,131,120,56,0,116,60,232,71,221,255,255,76,139,120,56,232,62,221,255,255,73,139,215,72,139,203,72,131,96,56,0,232,30,240,255,255,132,192,117,21,73,139,207,232,2,241,255,255,132,192,15,132,106,3,0,0,233,65,3,0,0,76,139, + 124,36,104,72,139,70,8,72,137,69,192,72,137,125,184,129,59,99,115,109,224,15,133,187,2,0,0,131,123,24,4,15,133,177,2,0,0,139,67,32,45,32,5,147,25,131,248,2,15,135,160,2,0,0,69,51,255,68,57,127,12,15,134,196,1,0,0,139,133,160,0,0,0,72,141,85, + 184,137,68,36,40,72,141,77,216,76,139,206,72,137,124,36,32,69,139,198,232,50,169,255,255,15,16,69,216,243,15,127,69,200,102,15,115,216,8,102,15,126,192,59,69,240,15,131,135,1,0,0,76,139,77,216,68,139,109,208,76,137,77,128,72,139,69,200,72,139, + 0,72,99,80,16,65,139,197,72,141,12,128,73,139,65,8,76,141,4,138,65,15,16,4,0,73,99,76,0,16,137,77,176,102,15,126,192,15,17,69,160,65,59,198,15,143,54,1,0,0,72,139,69,160,72,193,232,32,68,59,240,15,143,37,1,0,0,69,139,231,72,139,209,72,3,86,8, + 76,139,125,168,73,193,239,32,72,137,85,144,69,133,255,15,132,243,0,0,0,65,139,196,72,141,12,128,15,16,4,138,15,17,69,248,139,68,138,16,137,69,8,232,224,172,255,255,72,139,75,48,72,131,192,4,72,99,81,12,72,3,194,72,137,68,36,112,232,199,172,255, + 255,72,139,75,48,72,99,81,12,139,12,16,137,76,36,100,133,201,126,60,232,175,172,255,255,72,139,76,36,112,76,139,67,48,72,99,9,72,3,193,72,141,77,248,72,139,208,72,137,69,136,232,128,240,255,255,133,192,117,37,139,68,36,100,72,131,68,36,112,4, + 255,200,137,68,36,100,133,192,127,196,65,255,196,69,59,231,116,111,72,139,85,144,233,108,255,255,255,138,133,152,0,0,0,76,139,206,76,139,100,36,120,72,139,203,76,139,68,36,104,73,139,212,136,68,36,88,138,68,36,96,136,68,36,80,72,139,69,152,72, + 137,68,36,72,139,133,160,0,0,0,137,68,36,64,72,141,69,160,72,137,68,36,56,72,139,69,136,72,137,68,36,48,72,141,69,248,72,137,68,36,40,72,137,124,36,32,232,166,6,0,0,235,12,76,139,100,36,120,235,9,76,139,100,36,120,76,139,77,128,69,51,255,65, + 255,197,68,59,109,240,15,130,133,254,255,255,139,7,37,255,255,255,31,61,33,5,147,25,15,130,250,0,0,0,68,57,127,32,116,14,232,159,171,255,255,72,99,79,32,72,3,193,117,33,139,71,36,193,232,2,168,1,15,132,216,0,0,0,72,139,215,72,139,206,232,241, + 164,255,255,132,192,15,133,197,0,0,0,139,71,36,193,232,2,168,1,15,133,13,1,0,0,68,57,127,32,116,17,232,92,171,255,255,72,139,208,72,99,71,32,72,3,208,235,3,73,139,215,72,139,203,232,133,237,255,255,132,192,15,133,141,0,0,0,76,141,77,136,76,139, + 199,72,139,214,73,139,204,232,47,165,255,255,138,141,152,0,0,0,76,139,200,76,139,68,36,104,72,139,211,136,76,36,80,131,201,255,72,137,116,36,72,76,137,124,36,64,137,76,36,56,137,76,36,48,73,139,204,72,137,124,36,40,76,137,124,36,32,232,191,165, + 255,255,235,61,131,127,12,0,118,55,128,189,152,0,0,0,0,15,133,157,0,0,0,139,133,160,0,0,0,76,139,206,76,137,108,36,56,77,139,199,137,68,36,48,73,139,212,68,137,116,36,40,72,139,203,72,137,124,36,32,232,76,6,0,0,232,251,217,255,255,72,131,120, + 56,0,117,103,72,139,77,16,72,51,204,232,168,12,0,0,72,129,196,40,1,0,0,65,95,65,94,65,93,65,92,95,94,91,93,195,178,1,72,139,203,232,90,173,255,255,72,141,77,248,232,157,235,255,255,72,141,21,18,92,1,0,72,141,77,248,232,241,157,255,255,204,232, + 123,211,255,255,204,232,165,217,255,255,72,137,88,32,232,156,217,255,255,72,139,76,36,104,72,137,72,40,232,94,211,255,255,204,232,196,216,255,255,204,204,204,204,64,85,83,86,87,65,84,65,85,65,86,65,87,72,141,172,36,120,255,255,255,72,129,236, + 136,1,0,0,72,139,5,105,103,1,0,72,51,196,72,137,69,112,76,139,181,240,0,0,0,76,139,250,76,139,165,8,1,0,0,72,139,217,72,137,84,36,120,73,139,206,73,139,209,76,137,101,160,73,139,241,198,68,36,96,0,77,139,232,232,131,219,255,255,131,126,72,0, + 139,248,116,23,232,26,217,255,255,131,120,120,254,15,133,129,4,0,0,139,126,72,131,239,2,235,31,232,3,217,255,255,131,120,120,254,116,20,232,248,216,255,255,139,120,120,232,240,216,255,255,199,64,120,254,255,255,255,131,255,255,15,140,81,4,0, + 0,65,131,126,8,0,76,141,5,180,70,255,255,116,41,73,99,86,8,72,3,86,8,15,182,10,131,225,15,74,15,190,132,1,16,99,1,0,66,138,140,1,32,99,1,0,72,43,208,139,66,252,211,232,235,2,51,192,59,248,15,141,16,4,0,0,129,59,99,115,109,224,15,133,196,0,0, + 0,131,123,24,4,15,133,186,0,0,0,139,67,32,45,32,5,147,25,131,248,2,15,135,169,0,0,0,72,131,123,48,0,15,133,158,0,0,0,232,104,216,255,255,72,131,120,32,0,15,132,108,3,0,0,232,88,216,255,255,72,139,88,32,232,79,216,255,255,72,139,75,56,198,68, + 36,96,1,76,139,104,40,232,45,169,255,255,129,59,99,115,109,224,117,30,131,123,24,4,117,24,139,67,32,45,32,5,147,25,131,248,2,119,11,72,131,123,48,0,15,132,136,3,0,0,232,18,216,255,255,72,131,120,56,0,116,60,232,6,216,255,255,76,139,120,56,232, + 253,215,255,255,73,139,215,72,139,203,72,131,96,56,0,232,221,234,255,255,132,192,117,21,73,139,207,232,193,235,255,255,132,192,15,132,44,3,0,0,233,3,3,0,0,76,139,124,36,120,76,139,70,8,72,141,77,240,73,139,214,232,47,221,255,255,129,59,99,115, + 109,224,15,133,122,2,0,0,131,123,24,4,15,133,112,2,0,0,139,67,32,45,32,5,147,25,131,248,2,15,135,95,2,0,0,131,125,240,0,15,134,58,2,0,0,139,133,0,1,0,0,72,141,85,240,137,68,36,40,72,141,77,168,76,139,206,76,137,116,36,32,68,139,199,232,176,166, + 255,255,15,16,69,168,243,15,127,69,136,102,15,115,216,8,102,15,126,192,59,69,192,15,131,253,1,0,0,76,139,125,168,139,69,144,76,137,125,128,137,68,36,104,65,15,16,71,24,102,72,15,126,192,15,17,69,136,59,199,15,143,51,1,0,0,72,193,232,32,59,248, + 15,143,39,1,0,0,72,139,70,16,72,141,85,136,76,139,70,8,72,141,77,32,68,139,8,232,80,221,255,255,139,69,32,69,51,228,68,137,100,36,100,137,68,36,108,133,192,15,132,248,0,0,0,15,16,69,56,15,16,77,72,15,17,69,200,242,15,16,69,88,242,15,17,69,232, + 15,17,77,216,232,174,167,255,255,72,139,75,48,72,131,192,4,72,99,81,12,72,3,194,72,137,68,36,112,232,149,167,255,255,72,139,75,48,72,99,81,12,68,139,60,16,69,133,255,126,58,232,127,167,255,255,76,139,67,48,76,139,224,72,139,68,36,112,72,99,8, + 76,3,225,72,141,77,200,73,139,212,232,145,236,255,255,133,192,117,48,72,131,68,36,112,4,65,255,207,69,133,255,127,203,68,139,100,36,100,72,141,77,32,232,41,221,255,255,65,255,196,68,137,100,36,100,68,59,100,36,108,116,89,233,96,255,255,255,138, + 133,248,0,0,0,76,139,206,72,139,84,36,120,77,139,197,136,68,36,88,72,139,203,138,68,36,96,136,68,36,80,72,139,69,160,72,137,68,36,72,139,133,0,1,0,0,137,68,36,64,72,141,69,136,72,137,68,36,56,72,141,69,200,76,137,100,36,48,72,137,68,36,40,76, + 137,116,36,32,232,101,4,0,0,76,139,125,128,77,139,71,8,72,141,21,206,67,255,255,65,15,182,8,131,225,15,72,15,190,132,17,16,99,1,0,138,140,17,32,99,1,0,76,43,192,65,139,64,252,211,232,77,137,71,8,65,137,71,24,65,15,182,8,131,225,15,72,15,190, + 132,17,16,99,1,0,138,140,17,32,99,1,0,76,43,192,65,139,64,252,211,232,77,137,71,8,65,137,71,28,65,15,182,8,131,225,15,72,15,190,132,17,16,99,1,0,138,140,17,32,99,1,0,76,43,192,65,139,64,252,211,232,139,76,36,104,65,137,71,32,255,193,77,137,71, + 8,73,141,64,4,65,139,16,73,137,71,8,65,137,87,36,137,76,36,104,59,77,192,15,130,18,254,255,255,65,246,6,64,116,81,73,139,214,72,139,206,232,7,163,255,255,132,192,15,132,148,0,0,0,235,60,131,125,240,0,118,54,128,189,248,0,0,0,0,15,133,151,0,0, + 0,139,133,0,1,0,0,76,139,206,76,137,100,36,56,77,139,197,137,68,36,48,73,139,215,137,124,36,40,72,139,203,76,137,116,36,32,232,57,4,0,0,232,248,212,255,255,72,131,120,56,0,117,98,72,139,77,112,72,51,204,232,165,7,0,0,72,129,196,136,1,0,0,65, + 95,65,94,65,93,65,92,95,94,91,93,195,178,1,72,139,203,232,87,168,255,255,72,141,77,136,232,154,230,255,255,72,141,21,15,87,1,0,72,141,77,136,232,238,152,255,255,204,232,120,206,255,255,204,232,162,212,255,255,72,137,88,32,232,153,212,255,255, + 76,137,104,40,232,96,206,255,255,204,232,198,211,255,255,204,204,72,139,196,72,137,88,8,76,137,64,24,85,86,87,65,84,65,85,65,86,65,87,72,131,236,96,76,139,172,36,192,0,0,0,77,139,249,76,139,226,76,141,72,16,72,139,233,77,139,197,73,139,215,73, + 139,204,232,255,158,255,255,76,139,140,36,208,0,0,0,76,139,240,72,139,180,36,200,0,0,0,77,133,201,116,14,76,139,198,72,139,208,72,139,205,232,121,239,255,255,72,139,140,36,216,0,0,0,139,89,8,139,57,232,195,164,255,255,72,99,78,12,77,139,206, + 76,139,132,36,176,0,0,0,72,3,193,138,140,36,248,0,0,0,72,139,213,136,76,36,80,73,139,204,76,137,124,36,72,72,137,116,36,64,137,92,36,56,137,124,36,48,76,137,108,36,40,72,137,68,36,32,232,79,159,255,255,72,139,156,36,160,0,0,0,72,131,196,96,65, + 95,65,94,65,93,65,92,95,94,93,195,204,204,204,72,139,196,72,137,88,32,76,137,64,24,72,137,80,16,85,86,87,65,84,65,85,65,86,65,87,72,141,104,193,72,129,236,192,0,0,0,129,57,3,0,0,128,73,139,241,77,139,248,76,139,241,116,110,232,121,211,255,255, + 68,139,101,111,72,139,125,103,72,131,120,16,0,116,117,51,201,255,21,234,56,1,0,72,139,216,232,90,211,255,255,72,57,88,16,116,95,65,129,62,77,79,67,224,116,86,65,129,62,82,67,67,224,68,139,109,119,116,77,72,139,69,127,76,139,206,72,139,85,79, + 77,139,199,68,137,100,36,56,73,139,206,72,137,68,36,48,68,137,108,36,40,72,137,124,36,32,232,72,166,255,255,133,192,116,31,72,139,156,36,24,1,0,0,72,129,196,192,0,0,0,65,95,65,94,65,93,65,92,95,94,93,195,68,139,109,119,72,139,70,8,72,137,69, + 175,72,137,125,167,131,127,12,0,15,134,58,1,0,0,68,137,108,36,40,72,141,85,167,76,139,206,72,137,124,36,32,69,139,196,72,141,77,223,232,66,159,255,255,15,16,69,223,243,15,127,69,183,102,15,115,216,8,102,15,126,192,59,69,247,115,151,76,139,77, + 223,68,139,125,191,76,137,77,71,72,139,69,183,72,139,0,72,99,80,16,65,139,199,72,141,12,128,73,139,65,8,76,141,4,138,65,15,16,4,0,73,99,84,0,16,137,85,215,102,15,126,192,15,17,69,199,65,59,196,15,143,168,0,0,0,72,139,69,199,72,193,232,32,68, + 59,224,15,143,151,0,0,0,72,139,69,207,72,139,94,8,72,193,232,32,72,131,195,236,72,141,12,128,72,141,20,138,72,3,218,131,123,4,0,116,45,76,99,107,4,232,216,162,255,255,73,3,197,116,27,69,133,237,116,14,232,201,162,255,255,72,99,75,4,72,3,193, + 235,2,51,192,128,120,16,0,117,77,68,139,109,119,246,3,64,117,68,72,139,69,127,76,139,206,76,139,69,87,73,139,206,72,139,85,79,198,68,36,88,0,198,68,36,80,1,72,137,68,36,72,72,141,69,199,68,137,108,36,64,72,137,68,36,56,72,131,100,36,48,0,72, + 137,92,36,40,72,137,124,36,32,232,51,253,255,255,68,139,109,119,65,255,199,76,139,77,71,68,59,125,247,15,130,11,255,255,255,233,145,254,255,255,232,216,208,255,255,204,204,204,204,72,139,196,72,137,88,8,76,137,64,24,85,86,87,65,84,65,85,65,86, + 65,87,72,131,236,96,76,139,172,36,192,0,0,0,77,139,249,76,139,226,76,141,72,16,72,139,233,77,139,197,73,139,215,73,139,204,232,123,160,255,255,76,139,140,36,208,0,0,0,76,139,240,72,139,180,36,200,0,0,0,77,133,201,116,14,76,139,198,72,139,208, + 72,139,205,232,73,237,255,255,72,139,140,36,216,0,0,0,139,89,8,139,57,232,211,161,255,255,72,99,78,16,77,139,206,76,139,132,36,176,0,0,0,72,3,193,138,140,36,248,0,0,0,72,139,213,136,76,36,80,73,139,204,76,137,124,36,72,72,137,116,36,64,137,92, + 36,56,137,124,36,48,76,137,108,36,40,72,137,68,36,32,232,223,158,255,255,72,139,156,36,160,0,0,0,72,131,196,96,65,95,65,94,65,93,65,92,95,94,93,195,204,204,204,64,85,83,86,87,65,84,65,85,65,86,65,87,72,141,108,36,200,72,129,236,56,1,0,0,72,139, + 5,172,94,1,0,72,51,196,72,137,69,40,129,57,3,0,0,128,73,139,249,72,139,133,184,0,0,0,76,139,234,76,139,181,160,0,0,0,72,139,241,72,137,68,36,112,76,137,68,36,120,15,132,117,2,0,0,232,107,208,255,255,68,139,165,176,0,0,0,68,139,189,168,0,0,0, + 72,131,120,16,0,116,90,51,201,255,21,214,53,1,0,72,139,216,232,70,208,255,255,72,57,88,16,116,68,129,62,77,79,67,224,116,60,129,62,82,67,67,224,116,52,72,139,68,36,112,76,139,207,76,139,68,36,120,73,139,213,68,137,124,36,56,72,139,206,72,137, + 68,36,48,68,137,100,36,40,76,137,116,36,32,232,228,162,255,255,133,192,15,133,1,2,0,0,76,139,71,8,72,141,77,0,73,139,214,232,92,213,255,255,131,125,0,0,15,134,7,2,0,0,68,137,100,36,40,72,141,85,0,76,139,207,76,137,116,36,32,69,139,199,72,141, + 77,144,232,9,159,255,255,15,16,69,144,243,15,127,69,128,102,15,115,216,8,102,15,126,192,59,69,168,15,131,175,1,0,0,76,139,69,144,76,141,13,127,61,255,255,139,69,136,76,137,68,36,104,137,68,36,96,65,15,16,64,24,102,72,15,126,192,15,17,69,128, + 65,59,199,15,143,231,0,0,0,72,193,232,32,68,59,248,15,143,218,0,0,0,72,139,71,16,72,141,85,128,76,139,71,8,72,141,77,176,68,139,8,232,159,213,255,255,72,139,69,192,72,141,77,176,72,137,69,184,232,10,214,255,255,72,139,69,192,72,141,77,176,139, + 93,176,72,137,69,184,232,246,213,255,255,131,235,1,116,15,72,141,77,176,232,232,213,255,255,72,131,235,1,117,241,131,125,208,0,116,40,232,195,159,255,255,72,99,85,208,72,3,194,116,26,133,210,116,14,232,177,159,255,255,72,99,77,208,72,3,193,235, + 2,51,192,128,120,16,0,117,79,246,69,204,64,117,73,72,139,68,36,112,76,139,207,76,139,68,36,120,73,139,213,198,68,36,88,0,72,139,206,198,68,36,80,1,72,137,68,36,72,72,141,69,128,68,137,100,36,64,72,137,68,36,56,72,141,69,200,72,131,100,36,48, + 0,72,137,68,36,40,76,137,116,36,32,232,9,253,255,255,76,139,68,36,104,76,141,13,117,60,255,255,73,139,80,8,15,182,10,131,225,15,74,15,190,132,9,16,99,1,0,66,138,140,9,32,99,1,0,72,43,208,139,66,252,211,232,73,137,80,8,65,137,64,24,15,182,10, + 131,225,15,74,15,190,132,9,16,99,1,0,66,138,140,9,32,99,1,0,72,43,208,139,66,252,211,232,73,137,80,8,65,137,64,28,15,182,10,131,225,15,74,15,190,132,9,16,99,1,0,66,138,140,9,32,99,1,0,72,43,208,139,66,252,211,232,65,137,64,32,72,141,66,4,73, + 137,80,8,139,10,65,137,72,36,139,76,36,96,255,193,73,137,64,8,137,76,36,96,59,77,168,15,130,104,254,255,255,72,139,77,40,72,51,204,232,175,0,0,0,72,129,196,56,1,0,0,65,95,65,94,65,93,65,92,95,94,91,93,195,232,18,205,255,255,204,204,64,83,69, + 139,24,72,139,218,65,131,227,248,76,139,201,65,246,0,4,76,139,209,116,19,65,139,64,8,77,99,80,4,247,216,76,3,209,72,99,200,76,35,209,73,99,195,74,139,20,16,72,139,67,16,139,72,8,72,139,67,8,246,68,1,3,15,116,11,15,182,68,1,3,131,224,240,76,3, + 200,76,51,202,73,139,201,91,233,57,0,0,0,204,72,131,236,40,77,139,65,56,72,139,202,73,139,209,232,145,255,255,255,184,1,0,0,0,72,131,196,40,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,72, + 59,13,65,91,1,0,117,16,72,193,193,16,102,247,193,255,255,117,1,195,72,193,201,16,233,146,74,0,0,204,204,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,87,86,72,139,249,72,139,242,73,139,200,243,164,94,95,195,204,204,204,204,204,204,102, + 102,15,31,132,0,0,0,0,0,72,139,193,76,141,21,198,58,255,255,73,131,248,15,15,135,12,1,0,0,102,102,102,102,15,31,132,0,0,0,0,0,71,139,140,130,176,160,2,0,77,3,202,65,255,225,195,144,76,139,2,139,74,8,68,15,183,74,12,68,15,182,82,14,76,137,0,137, + 72,8,102,68,137,72,12,68,136,80,14,195,76,139,2,15,183,74,8,68,15,182,74,10,76,137,0,102,137,72,8,68,136,72,10,195,15,183,10,102,137,8,195,144,139,10,68,15,183,66,4,68,15,182,74,6,137,8,102,68,137,64,4,68,136,72,6,195,76,139,2,139,74,8,68,15, + 183,74,12,76,137,0,137,72,8,102,68,137,72,12,195,15,183,10,68,15,182,66,2,102,137,8,68,136,64,2,195,144,76,139,2,139,74,8,68,15,182,74,12,76,137,0,137,72,8,68,136,72,12,195,76,139,2,15,183,74,8,76,137,0,102,137,72,8,195,76,139,2,15,182,74,8, + 76,137,0,136,72,8,195,76,139,2,139,74,8,76,137,0,137,72,8,195,139,10,68,15,183,66,4,137,8,102,68,137,64,4,195,139,10,68,15,182,66,4,137,8,68,136,64,4,195,72,139,10,72,137,8,195,15,182,10,136,8,195,139,10,137,8,195,144,73,131,248,32,119,23,243, + 15,111,10,243,66,15,111,84,2,240,243,15,127,9,243,66,15,127,84,1,240,195,72,59,209,115,14,78,141,12,2,73,59,201,15,130,65,4,0,0,144,131,61,129,89,1,0,3,15,130,227,2,0,0,73,129,248,0,32,0,0,118,22,73,129,248,0,0,24,0,119,13,246,5,82,101,1,0,2, + 15,133,100,254,255,255,197,254,111,2,196,161,126,111,108,2,224,73,129,248,0,1,0,0,15,134,196,0,0,0,76,139,201,73,131,225,31,73,131,233,32,73,43,201,73,43,209,77,3,193,73,129,248,0,1,0,0,15,134,163,0,0,0,73,129,248,0,0,24,0,15,135,62,1,0,0,102, + 102,102,102,102,102,15,31,132,0,0,0,0,0,197,254,111,10,197,254,111,82,32,197,254,111,90,64,197,254,111,98,96,197,253,127,9,197,253,127,81,32,197,253,127,89,64,197,253,127,97,96,197,254,111,138,128,0,0,0,197,254,111,146,160,0,0,0,197,254,111, + 154,192,0,0,0,197,254,111,162,224,0,0,0,197,253,127,137,128,0,0,0,197,253,127,145,160,0,0,0,197,253,127,153,192,0,0,0,197,253,127,161,224,0,0,0,72,129,193,0,1,0,0,72,129,194,0,1,0,0,73,129,232,0,1,0,0,73,129,248,0,1,0,0,15,131,120,255,255,255, + 77,141,72,31,73,131,225,224,77,139,217,73,193,235,5,71,139,156,154,240,160,2,0,77,3,218,65,255,227,196,161,126,111,140,10,0,255,255,255,196,161,126,127,140,9,0,255,255,255,196,161,126,111,140,10,32,255,255,255,196,161,126,127,140,9,32,255,255, + 255,196,161,126,111,140,10,64,255,255,255,196,161,126,127,140,9,64,255,255,255,196,161,126,111,140,10,96,255,255,255,196,161,126,127,140,9,96,255,255,255,196,161,126,111,76,10,128,196,161,126,127,76,9,128,196,161,126,111,76,10,160,196,161,126, + 127,76,9,160,196,161,126,111,76,10,192,196,161,126,127,76,9,192,196,161,126,127,108,1,224,197,254,127,0,197,248,119,195,102,144,197,254,111,10,197,254,111,82,32,197,254,111,90,64,197,254,111,98,96,197,253,231,9,197,253,231,81,32,197,253,231, + 89,64,197,253,231,97,96,197,254,111,138,128,0,0,0,197,254,111,146,160,0,0,0,197,254,111,154,192,0,0,0,197,254,111,162,224,0,0,0,197,253,231,137,128,0,0,0,197,253,231,145,160,0,0,0,197,253,231,153,192,0,0,0,197,253,231,161,224,0,0,0,72,129,193, + 0,1,0,0,72,129,194,0,1,0,0,73,129,232,0,1,0,0,73,129,248,0,1,0,0,15,131,120,255,255,255,77,141,72,31,73,131,225,224,77,139,217,73,193,235,5,71,139,156,154,20,161,2,0,77,3,218,65,255,227,196,161,126,111,140,10,0,255,255,255,196,161,125,231,140, + 9,0,255,255,255,196,161,126,111,140,10,32,255,255,255,196,161,125,231,140,9,32,255,255,255,196,161,126,111,140,10,64,255,255,255,196,161,125,231,140,9,64,255,255,255,196,161,126,111,140,10,96,255,255,255,196,161,125,231,140,9,96,255,255,255, + 196,161,126,111,76,10,128,196,161,125,231,76,9,128,196,161,126,111,76,10,160,196,161,125,231,76,9,160,196,161,126,111,76,10,192,196,161,125,231,76,9,192,196,161,126,127,108,1,224,197,254,127,0,15,174,248,197,248,119,195,102,102,102,102,102,102, + 102,15,31,132,0,0,0,0,0,73,129,248,0,8,0,0,118,13,246,5,120,98,1,0,2,15,133,138,251,255,255,243,15,111,2,243,66,15,111,108,2,240,73,129,248,128,0,0,0,15,134,142,0,0,0,76,139,201,73,131,225,15,73,131,233,16,73,43,201,73,43,209,77,3,193,73,129, + 248,128,0,0,0,118,113,15,31,68,0,0,243,15,111,10,243,15,111,82,16,243,15,111,90,32,243,15,111,98,48,102,15,127,9,102,15,127,81,16,102,15,127,89,32,102,15,127,97,48,243,15,111,74,64,243,15,111,82,80,243,15,111,90,96,243,15,111,98,112,102,15,127, + 73,64,102,15,127,81,80,102,15,127,89,96,102,15,127,97,112,72,129,193,128,0,0,0,72,129,194,128,0,0,0,73,129,232,128,0,0,0,73,129,248,128,0,0,0,115,148,77,141,72,15,73,131,225,240,77,139,217,73,193,235,4,71,139,156,154,56,161,2,0,77,3,218,65,255, + 227,243,66,15,111,76,10,128,243,66,15,127,76,9,128,243,66,15,111,76,10,144,243,66,15,127,76,9,144,243,66,15,111,76,10,160,243,66,15,127,76,9,160,243,66,15,111,76,10,176,243,66,15,127,76,9,176,243,66,15,111,76,10,192,243,66,15,127,76,9,192,243, + 66,15,111,76,10,208,243,66,15,127,76,9,208,243,66,15,111,76,10,224,243,66,15,127,76,9,224,243,66,15,127,108,1,240,243,15,127,0,195,102,15,31,132,0,0,0,0,0,76,139,217,76,139,210,72,43,209,73,3,200,15,16,68,17,240,72,131,233,16,73,131,232,16,246, + 193,15,116,23,72,139,193,72,131,225,240,15,16,200,15,16,4,17,15,17,8,76,139,193,77,43,195,77,139,200,73,193,233,7,116,111,15,41,1,235,20,102,102,102,102,102,15,31,132,0,0,0,0,0,15,41,65,16,15,41,9,15,16,68,17,240,15,16,76,17,224,72,129,233,128, + 0,0,0,15,41,65,112,15,41,73,96,15,16,68,17,80,15,16,76,17,64,73,255,201,15,41,65,80,15,41,73,64,15,16,68,17,48,15,16,76,17,32,15,41,65,48,15,41,73,32,15,16,68,17,16,15,16,12,17,117,174,15,41,65,16,73,131,224,127,15,40,193,77,139,200,73,193,233, + 4,116,26,102,102,15,31,132,0,0,0,0,0,15,17,1,72,131,233,16,15,16,4,17,73,255,201,117,240,73,131,224,15,116,8,65,15,16,10,65,15,17,11,15,17,1,73,139,195,195,204,204,204,64,83,72,131,236,32,51,219,72,133,201,116,12,72,133,210,116,7,77,133,192, + 117,27,136,25,232,74,41,0,0,187,22,0,0,0,137,24,232,142,28,0,0,139,195,72,131,196,32,91,195,76,139,201,76,43,193,67,138,4,8,65,136,1,73,255,193,132,192,116,228,72,131,234,1,117,236,72,133,210,117,217,136,25,232,16,41,0,0,187,34,0,0,0,235,196, + 204,64,83,72,131,236,32,51,219,72,141,21,193,98,1,0,69,51,192,72,141,12,155,72,141,12,202,186,160,15,0,0,232,64,63,0,0,133,192,116,17,255,5,202,98,1,0,255,195,131,251,1,114,211,176,1,235,7,232,10,0,0,0,50,192,72,131,196,32,91,195,204,204,64, + 83,72,131,236,32,139,29,164,98,1,0,235,29,72,141,5,115,98,1,0,255,203,72,141,12,155,72,141,12,200,255,21,43,43,1,0,255,13,133,98,1,0,133,219,117,223,176,1,72,131,196,32,91,195,204,204,204,204,204,204,204,204,204,72,137,124,36,8,72,139,5,140, + 83,1,0,72,141,61,29,99,1,0,185,31,0,0,0,243,72,171,72,139,124,36,8,176,1,195,204,204,204,204,204,204,204,204,204,204,204,204,204,64,83,72,131,236,32,132,201,117,47,72,141,29,63,98,1,0,72,139,11,72,133,201,116,16,72,131,249,255,116,6,255,21,35, + 43,1,0,72,131,35,0,72,131,195,8,72,141,5,196,98,1,0,72,59,216,117,216,176,1,72,131,196,32,91,195,204,204,204,72,131,236,40,76,141,13,221,173,0,0,51,201,76,141,5,208,173,0,0,72,141,21,209,173,0,0,232,88,2,0,0,72,133,192,116,21,73,186,112,48,82, + 94,71,39,5,211,72,131,196,40,72,255,37,2,36,1,0,184,1,0,0,0,72,131,196,40,195,72,255,37,137,42,1,0,204,72,255,37,137,42,1,0,204,72,255,37,137,42,1,0,204,72,255,37,137,42,1,0,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,65,139,240,76, + 141,13,135,173,0,0,139,218,76,141,5,118,173,0,0,72,139,249,72,141,21,116,173,0,0,185,15,0,0,0,232,222,1,0,0,72,133,192,116,26,73,186,112,218,210,50,80,62,160,130,68,139,198,139,211,72,139,207,255,21,133,35,1,0,235,11,139,211,72,139,207,255,21, + 48,43,1,0,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,80,65,139,217,73,139,248,139,242,76,141,13,53,173,0,0,72,139,233,76,141,5,35,173,0,0,72,141,21,36,173,0,0,185,17,0, + 0,0,232,102,1,0,0,76,139,216,72,133,192,116,95,73,186,112,226,87,80,98,31,161,227,72,139,148,36,160,0,0,0,68,139,203,72,139,140,36,152,0,0,0,76,139,199,72,139,132,36,128,0,0,0,72,137,84,36,64,139,214,72,137,76,36,56,72,139,140,36,144,0,0,0,72, + 137,76,36,48,139,140,36,136,0,0,0,137,76,36,40,72,139,205,72,137,68,36,32,73,139,195,255,21,197,34,1,0,235,50,51,210,72,139,205,232,61,0,0,0,139,200,68,139,203,139,132,36,136,0,0,0,76,139,199,137,68,36,40,139,214,72,139,132,36,128,0,0,0,72,137, + 68,36,32,255,21,121,42,1,0,72,139,92,36,96,72,139,108,36,104,72,139,116,36,112,72,131,196,80,95,195,72,137,92,36,8,87,72,131,236,32,139,250,76,141,13,113,172,0,0,72,139,217,72,141,21,103,172,0,0,185,19,0,0,0,76,141,5,83,172,0,0,232,138,0,0,0, + 72,133,192,116,23,73,186,112,50,216,84,35,6,221,234,139,215,72,139,203,255,21,52,34,1,0,235,8,72,139,203,232,38,67,0,0,72,139,92,36,48,72,131,196,32,95,195,204,204,204,64,83,72,131,236,32,72,139,217,76,141,13,44,172,0,0,185,25,0,0,0,76,141,5, + 28,172,0,0,72,141,21,25,172,0,0,232,48,0,0,0,72,133,192,116,32,73,186,112,192,209,52,218,23,192,189,72,139,211,72,199,193,250,255,255,255,72,131,196,32,91,72,255,37,207,33,1,0,184,37,2,0,192,72,131,196,32,91,195,72,137,92,36,8,72,137,108,36, + 16,72,137,116,36,24,87,65,84,65,85,65,86,65,87,72,131,236,32,68,139,249,76,141,53,94,48,255,255,72,131,207,255,77,139,225,73,139,232,76,139,234,79,139,148,254,192,47,2,0,144,76,139,29,105,80,1,0,77,51,211,65,139,203,131,225,63,73,211,202,76, + 59,215,15,132,235,0,0,0,77,133,210,116,8,73,139,194,233,224,0,0,0,77,59,196,15,132,186,0,0,0,139,117,0,73,139,156,246,16,47,2,0,144,72,133,219,116,14,72,59,223,15,133,250,0,0,0,233,135,0,0,0,77,139,180,246,32,117,1,0,51,210,73,139,206,65,184, + 0,8,0,0,255,21,30,41,1,0,72,139,216,72,133,192,15,133,176,0,0,0,255,21,68,40,1,0,131,248,87,117,69,141,88,176,73,139,206,68,139,195,72,141,21,127,170,0,0,232,194,65,0,0,133,192,116,44,68,139,195,72,141,21,124,170,0,0,73,139,206,232,172,65,0, + 0,133,192,116,22,69,51,192,51,210,73,139,206,255,21,202,40,1,0,72,139,216,72,133,192,117,96,72,139,199,76,141,53,120,47,255,255,73,135,132,246,16,47,2,0,72,131,197,4,73,59,236,15,133,77,255,255,255,76,139,29,132,79,1,0,65,139,195,185,64,0,0, + 0,131,224,63,43,200,72,211,207,73,51,251,75,135,188,254,192,47,2,0,51,192,72,139,92,36,80,72,139,108,36,88,72,139,116,36,96,72,131,196,32,65,95,65,94,65,93,65,92,95,195,72,139,195,76,141,53,24,47,255,255,73,135,132,246,16,47,2,0,72,133,192,116, + 9,72,139,203,255,21,10,39,1,0,73,139,213,72,139,203,255,21,150,39,1,0,72,133,192,116,142,76,139,5,18,79,1,0,186,64,0,0,0,65,139,200,131,225,63,43,209,138,202,72,139,208,72,211,202,73,51,208,75,135,148,254,192,47,2,0,235,137,204,204,204,204,204, + 204,204,204,64,83,72,131,236,32,51,219,72,141,21,113,95,1,0,69,51,192,72,141,12,155,72,141,12,202,186,160,15,0,0,232,4,252,255,255,133,192,116,17,255,5,130,97,1,0,255,195,131,251,14,114,211,176,1,235,9,51,201,232,16,0,0,0,50,192,72,131,196,32, + 91,195,204,204,204,204,204,204,204,204,64,83,72,131,236,32,139,29,84,97,1,0,235,29,72,141,5,27,95,1,0,255,203,72,141,12,155,72,141,12,200,255,21,235,37,1,0,255,13,53,97,1,0,133,219,117,223,176,1,72,131,196,32,91,195,204,72,99,193,72,141,12,128, + 72,141,5,234,94,1,0,72,141,12,200,72,255,37,207,37,1,0,204,204,204,72,99,193,72,141,12,128,72,141,5,206,94,1,0,72,141,12,200,72,255,37,51,39,1,0,204,204,204,72,131,236,40,255,21,158,38,1,0,72,133,192,72,137,5,228,96,1,0,15,149,192,72,131,196, + 40,195,204,204,204,204,72,131,37,208,96,1,0,0,176,1,195,204,204,204,204,204,72,131,236,40,72,141,13,165,3,0,0,232,8,251,255,255,137,5,250,77,1,0,131,248,255,117,4,50,192,235,21,232,184,1,0,0,72,133,192,117,9,51,201,232,16,0,0,0,235,233,176,1, + 72,131,196,40,195,204,204,204,204,204,204,204,72,131,236,40,139,13,198,77,1,0,131,249,255,116,12,232,204,250,255,255,131,13,181,77,1,0,255,176,1,72,131,196,40,195,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,255,21,207,37,1,0,139, + 13,145,77,1,0,51,246,139,216,131,249,255,116,29,232,155,250,255,255,72,139,248,72,133,192,116,10,72,131,248,255,72,15,68,254,235,114,139,13,107,77,1,0,72,131,202,255,232,130,250,255,255,133,192,117,5,72,139,254,235,90,186,200,3,0,0,185,1,0,0, + 0,232,14,35,0,0,139,13,68,77,1,0,72,139,248,72,133,192,117,16,51,210,232,85,250,255,255,51,201,232,54,20,0,0,235,206,72,139,215,232,68,250,255,255,133,192,117,18,139,13,26,77,1,0,51,210,232,51,250,255,255,72,139,207,235,219,72,139,207,232,46, + 3,0,0,51,201,232,7,20,0,0,139,203,255,21,119,38,1,0,72,133,255,116,19,72,139,92,36,48,72,139,199,72,139,116,36,56,72,131,196,32,95,195,232,246,189,255,255,204,204,64,83,72,131,236,32,139,13,204,76,1,0,131,249,255,116,27,232,218,249,255,255,72, + 139,216,72,133,192,116,8,72,131,248,255,116,120,235,109,139,13,172,76,1,0,72,131,202,255,232,195,249,255,255,133,192,116,99,186,200,3,0,0,185,1,0,0,0,232,84,34,0,0,139,13,138,76,1,0,72,139,216,72,133,192,117,16,51,210,232,155,249,255,255,51, + 201,232,124,19,0,0,235,54,72,139,211,232,138,249,255,255,133,192,117,18,139,13,96,76,1,0,51,210,232,121,249,255,255,72,139,203,235,219,72,139,203,232,116,2,0,0,51,201,232,77,19,0,0,72,139,195,72,131,196,32,91,195,232,83,189,255,255,204,204,204, + 72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,255,21,87,36,1,0,139,13,25,76,1,0,51,246,139,216,131,249,255,116,29,232,35,249,255,255,72,139,248,72,133,192,116,10,72,131,248,255,72,15,68,254,235,114,139,13,243,75,1,0,72,131,202,255,232,10, + 249,255,255,133,192,117,5,72,139,254,235,90,186,200,3,0,0,185,1,0,0,0,232,150,33,0,0,139,13,204,75,1,0,72,139,248,72,133,192,117,16,51,210,232,221,248,255,255,51,201,232,190,18,0,0,235,206,72,139,215,232,204,248,255,255,133,192,117,18,139,13, + 162,75,1,0,51,210,232,187,248,255,255,72,139,207,235,219,72,139,207,232,182,1,0,0,51,201,232,143,18,0,0,139,203,255,21,255,36,1,0,72,139,92,36,48,72,139,199,72,139,116,36,56,72,131,196,32,95,195,64,83,72,131,236,32,139,13,96,75,1,0,131,249,255, + 116,42,232,110,248,255,255,72,139,216,72,133,192,116,29,139,13,72,75,1,0,51,210,232,97,248,255,255,72,139,203,232,49,2,0,0,72,139,203,232,57,18,0,0,72,131,196,32,91,195,204,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,139,13,19,75, + 1,0,51,219,72,139,242,131,249,255,116,27,232,28,248,255,255,72,139,248,72,133,192,116,8,72,131,248,255,116,121,235,109,139,13,238,74,1,0,72,131,202,255,232,5,248,255,255,133,192,116,100,186,200,3,0,0,185,1,0,0,0,232,150,32,0,0,139,13,204,74, + 1,0,72,139,248,72,133,192,117,16,51,210,232,221,247,255,255,51,201,232,190,17,0,0,235,55,72,139,215,232,204,247,255,255,133,192,117,18,139,13,162,74,1,0,51,210,232,187,247,255,255,72,139,207,235,219,72,139,207,232,182,0,0,0,51,201,232,143,17, + 0,0,72,105,222,200,3,0,0,72,3,223,72,139,116,36,56,72,139,195,72,139,92,36,48,72,131,196,32,95,195,204,204,204,204,204,204,204,204,204,204,72,133,201,116,26,83,72,131,236,32,72,139,217,232,70,1,0,0,72,139,203,232,78,17,0,0,72,131,196,32,91,195, + 72,137,92,36,8,87,72,131,236,32,72,139,249,72,139,218,72,139,137,144,0,0,0,72,133,201,116,44,232,75,61,0,0,72,139,143,144,0,0,0,72,59,13,89,97,1,0,116,23,72,141,5,88,79,1,0,72,59,200,116,11,131,121,16,0,117,5,232,204,61,0,0,72,137,159,144,0, + 0,0,72,133,219,116,8,72,139,203,232,132,60,0,0,72,139,92,36,48,72,131,196,32,95,195,204,64,85,72,139,236,72,131,236,80,72,137,77,216,72,141,69,216,72,137,69,232,76,141,77,32,186,1,0,0,0,76,141,69,232,184,5,0,0,0,137,69,32,137,69,40,72,141,69, + 216,72,137,69,240,72,141,69,224,72,137,69,248,184,4,0,0,0,137,69,208,137,69,212,72,141,5,209,96,1,0,72,137,69,224,137,81,40,72,141,13,123,143,0,0,72,139,69,216,72,137,8,72,141,13,125,73,1,0,72,139,69,216,137,144,168,3,0,0,72,139,69,216,72,137, + 136,136,0,0,0,141,74,66,72,139,69,216,72,141,85,40,102,137,136,188,0,0,0,72,139,69,216,102,137,136,194,1,0,0,72,141,77,24,72,139,69,216,72,131,160,160,3,0,0,0,232,22,1,0,0,76,141,77,208,76,141,69,240,72,141,85,212,72,141,77,24,232,65,1,0,0,72, + 131,196,80,93,195,204,204,204,64,85,72,139,236,72,131,236,64,72,141,69,232,72,137,77,232,72,137,69,240,72,141,21,236,142,0,0,184,5,0,0,0,137,69,32,137,69,40,72,141,69,232,72,137,69,248,184,4,0,0,0,137,69,224,137,69,228,72,139,1,72,59,194,116, + 12,72,139,200,232,198,15,0,0,72,139,77,232,72,139,73,112,232,185,15,0,0,72,139,77,232,72,139,73,88,232,172,15,0,0,72,139,77,232,72,139,73,96,232,159,15,0,0,72,139,77,232,72,139,73,104,232,146,15,0,0,72,139,77,232,72,139,73,72,232,133,15,0,0, + 72,139,77,232,72,139,73,80,232,120,15,0,0,72,139,77,232,72,139,73,120,232,107,15,0,0,72,139,77,232,72,139,137,128,0,0,0,232,91,15,0,0,72,139,77,232,72,139,137,192,3,0,0,232,75,15,0,0,76,141,77,32,76,141,69,240,72,141,85,40,72,141,77,24,232,166, + 0,0,0,76,141,77,224,76,141,69,248,72,141,85,228,72,141,77,24,232,241,0,0,0,72,131,196,64,93,195,204,204,204,72,137,92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,217,73,139,248,139,10,232,124,249,255,255,144,72,139,7,72,139,8,72,139,129,136, + 0,0,0,240,255,0,139,11,232,128,249,255,255,72,139,92,36,48,72,131,196,32,95,195,204,72,137,92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,217,73,139,248,139,10,232,60,249,255,255,144,72,139,71,8,72,139,16,72,139,15,72,139,18,72,139,9,232,94, + 253,255,255,144,139,11,232,58,249,255,255,72,139,92,36,48,72,131,196,32,95,195,204,204,204,72,137,92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,217,73,139,248,139,10,232,244,248,255,255,144,72,139,7,72,139,8,72,139,137,136,0,0,0,72,133,201, + 116,30,131,200,255,240,15,193,1,131,248,1,117,18,72,141,5,86,71,1,0,72,59,200,116,6,232,68,14,0,0,144,139,11,232,216,248,255,255,72,139,92,36,48,72,131,196,32,95,195,204,72,137,92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,217,73,139,248,139, + 10,232,148,248,255,255,144,72,139,15,51,210,72,139,9,232,190,252,255,255,144,139,11,232,154,248,255,255,72,139,92,36,48,72,131,196,32,95,195,204,204,204,204,204,204,204,204,204,204,204,64,83,72,131,236,32,185,7,0,0,0,232,88,248,255,255,51,219, + 51,201,232,159,63,0,0,133,192,117,12,232,94,0,0,0,232,73,1,0,0,179,1,185,7,0,0,0,232,81,248,255,255,138,195,72,131,196,32,91,195,204,204,204,204,204,72,137,92,36,8,87,72,131,236,32,51,219,72,141,61,77,89,1,0,72,139,12,59,72,133,201,116,10,232, + 7,63,0,0,72,131,36,59,0,72,131,195,8,72,129,251,0,4,0,0,114,217,72,139,92,36,48,176,1,72,131,196,32,95,195,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,129,236,144,0,0,0,72,141,72,136,255,21,170,30,1,0,69,51,246, + 102,68,57,116,36,98,15,132,154,0,0,0,72,139,68,36,104,72,133,192,15,132,140,0,0,0,72,99,24,72,141,112,4,191,0,32,0,0,72,3,222,57,56,15,76,56,139,207,232,218,62,0,0,59,61,188,92,1,0,15,79,61,181,92,1,0,133,255,116,96,65,139,238,72,131,59,255, + 116,71,72,131,59,254,116,65,246,6,1,116,60,246,6,8,117,13,72,139,11,255,21,255,29,1,0,133,192,116,42,72,139,197,76,141,5,129,88,1,0,72,139,205,72,193,249,6,131,224,63,73,139,12,200,72,141,20,192,72,139,3,72,137,68,209,40,138,6,136,68,209,56, + 72,255,197,72,255,198,72,131,195,8,72,131,239,1,117,163,76,141,156,36,144,0,0,0,73,139,91,16,73,139,107,24,73,139,115,32,73,139,123,40,73,139,227,65,94,195,204,204,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72, + 131,236,32,51,246,69,51,246,72,99,206,72,141,61,8,88,1,0,72,139,193,131,225,63,72,193,248,6,72,141,28,201,72,139,60,199,72,139,68,223,40,72,131,192,2,72,131,248,1,118,10,128,76,223,56,128,233,139,0,0,0,198,68,223,56,129,139,206,133,246,116,22, + 131,233,1,116,10,131,249,1,185,244,255,255,255,235,12,185,245,255,255,255,235,5,185,246,255,255,255,255,21,105,29,1,0,72,139,232,72,141,72,1,72,131,249,1,118,45,72,139,200,255,21,11,29,1,0,133,192,116,32,15,182,192,72,137,108,223,40,131,248, + 2,117,7,128,76,223,56,64,235,49,131,248,3,117,44,128,76,223,56,8,235,37,128,76,223,56,64,72,199,68,223,40,254,255,255,255,72,139,5,250,91,1,0,72,133,192,116,11,73,139,4,6,199,64,24,254,255,255,255,255,198,73,131,198,8,131,254,3,15,133,49,255, + 255,255,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,139,124,36,72,72,131,196,32,65,94,195,204,204,204,204,204,204,204,204,72,131,236,40,255,21,54,28,1,0,72,137,5,55,91,1,0,255,21,49,28,1,0,72,137,5,50,91,1,0,176,1,72,131,196,40,195, + 204,204,204,204,204,204,204,204,204,204,204,176,1,195,204,72,131,236,40,232,119,246,255,255,72,141,21,36,91,1,0,72,139,200,72,131,196,40,233,56,4,0,0,72,131,236,40,128,61,25,91,1,0,0,117,76,72,141,13,76,71,1,0,72,137,13,245,90,1,0,72,141,5,254, + 67,1,0,72,141,13,39,70,1,0,72,137,5,232,90,1,0,72,137,13,209,90,1,0,232,252,246,255,255,76,141,13,213,90,1,0,76,139,192,178,1,185,253,255,255,255,232,158,4,0,0,198,5,203,90,1,0,1,176,1,72,131,196,40,195,72,137,92,36,24,72,137,108,36,32,86,87, + 65,84,65,86,65,87,72,131,236,64,72,139,5,123,67,1,0,72,51,196,72,137,68,36,56,72,139,242,232,147,2,0,0,51,219,139,248,133,192,15,132,84,2,0,0,76,141,37,208,71,1,0,68,139,243,73,139,196,141,107,1,57,56,15,132,70,1,0,0,68,3,245,72,131,192,48,65, + 131,254,5,114,235,129,255,232,253,0,0,15,132,37,1,0,0,15,183,207,255,21,29,28,1,0,133,192,15,132,20,1,0,0,184,233,253,0,0,59,248,117,38,72,137,70,4,72,137,158,32,2,0,0,137,94,24,102,137,94,28,72,141,126,12,15,183,195,185,6,0,0,0,102,243,171, + 233,217,1,0,0,72,141,84,36,32,139,207,255,21,209,26,1,0,133,192,15,132,196,0,0,0,72,141,78,24,51,210,65,184,1,1,0,0,232,128,139,255,255,131,124,36,32,2,137,126,4,72,137,158,32,2,0,0,15,133,148,0,0,0,72,141,76,36,38,56,92,36,38,116,44,56,89,1, + 116,39,15,182,65,1,15,182,17,59,208,119,20,43,194,141,122,1,141,20,40,128,76,55,24,4,3,253,72,43,213,117,244,72,131,193,2,56,25,117,212,72,141,70,26,185,254,0,0,0,128,8,8,72,3,197,72,43,205,117,245,139,78,4,129,233,164,3,0,0,116,46,131,233,4, + 116,32,131,233,13,116,18,59,205,116,5,72,139,195,235,34,72,139,5,187,157,0,0,235,25,72,139,5,170,157,0,0,235,16,72,139,5,153,157,0,0,235,7,72,139,5,136,157,0,0,72,137,134,32,2,0,0,235,2,139,235,137,110,8,233,19,255,255,255,57,29,55,89,1,0,15, + 133,254,0,0,0,131,200,255,233,0,1,0,0,72,141,78,24,51,210,65,184,1,1,0,0,232,168,138,255,255,65,139,198,77,141,76,36,16,76,141,29,73,70,1,0,65,190,4,0,0,0,76,141,60,64,73,193,231,4,77,3,207,73,139,209,65,56,25,116,62,56,90,1,116,57,68,15,182, + 2,15,182,66,1,68,59,192,119,36,69,141,80,1,65,129,250,1,1,0,0,115,23,65,138,3,68,3,197,65,8,68,50,24,68,3,213,15,182,66,1,68,59,192,118,224,72,131,194,2,56,26,117,194,73,131,193,8,76,3,221,76,43,245,117,174,137,126,4,137,110,8,129,239,164,3, + 0,0,116,41,131,239,4,116,27,131,239,13,116,13,59,253,117,34,72,139,29,211,156,0,0,235,25,72,139,29,194,156,0,0,235,16,72,139,29,177,156,0,0,235,7,72,139,29,160,156,0,0,73,141,124,36,4,72,137,158,32,2,0,0,73,3,255,72,141,86,12,185,6,0,0,0,15, + 183,7,72,141,127,2,102,137,2,72,141,82,2,72,43,205,117,237,72,139,206,232,117,4,0,0,235,8,72,139,206,232,171,0,0,0,51,192,72,139,76,36,56,72,51,204,232,172,229,255,255,76,141,92,36,64,73,139,91,64,73,139,107,72,73,139,227,65,95,65,94,65,92,95, + 94,195,204,204,204,64,83,72,131,236,64,139,217,51,210,72,141,76,36,32,232,160,162,255,255,131,37,229,87,1,0,0,131,251,254,117,18,199,5,214,87,1,0,1,0,0,0,255,21,24,25,1,0,235,21,131,251,253,117,20,199,5,191,87,1,0,1,0,0,0,255,21,121,24,1,0,139, + 216,235,23,131,251,252,117,18,72,139,68,36,40,199,5,161,87,1,0,1,0,0,0,139,88,12,128,124,36,56,0,116,12,72,139,76,36,32,131,161,168,3,0,0,253,139,195,72,131,196,64,91,195,204,204,204,72,137,92,36,8,87,72,131,236,32,72,139,217,51,210,72,131,193, + 24,65,184,1,1,0,0,232,242,136,255,255,51,210,72,141,123,12,15,183,194,76,141,13,82,64,1,0,72,137,83,4,76,139,195,72,137,147,32,2,0,0,141,74,6,102,243,171,72,141,5,79,64,1,0,139,250,76,43,192,74,141,12,15,72,255,199,138,65,24,65,136,68,8,48,72, + 129,255,1,1,0,0,124,232,72,141,5,44,65,1,0,72,43,216,74,141,12,10,72,255,194,138,129,25,1,0,0,136,132,11,50,2,0,0,72,129,250,0,1,0,0,124,227,72,139,92,36,48,72,131,196,32,95,195,72,137,92,36,16,72,137,116,36,24,87,72,131,236,32,72,139,242,72, + 139,249,139,5,161,71,1,0,133,129,168,3,0,0,116,19,72,131,185,144,0,0,0,0,116,9,72,139,153,136,0,0,0,235,100,185,5,0,0,0,232,32,241,255,255,144,72,139,159,136,0,0,0,72,137,92,36,48,72,59,30,116,62,72,133,219,116,34,131,200,255,240,15,193,3,131, + 248,1,117,22,72,141,5,126,63,1,0,72,139,76,36,48,72,59,200,116,5,232,103,6,0,0,72,139,6,72,137,135,136,0,0,0,72,137,68,36,48,240,255,0,72,139,92,36,48,185,5,0,0,0,232,226,240,255,255,72,133,219,116,19,72,139,195,72,139,92,36,56,72,139,116,36, + 64,72,131,196,32,95,195,232,61,176,255,255,144,72,139,196,72,137,88,8,72,137,112,16,76,137,72,32,76,137,64,24,85,87,65,86,72,141,168,120,254,255,255,72,129,236,112,2,0,0,68,138,242,139,217,73,139,209,73,139,200,232,19,255,255,255,139,203,232, + 244,253,255,255,72,139,141,160,1,0,0,139,248,76,139,129,136,0,0,0,65,59,64,4,117,7,51,192,233,254,1,0,0,185,40,2,0,0,232,9,40,0,0,72,139,216,72,133,192,117,15,51,201,232,182,5,0,0,131,200,255,233,221,1,0,0,72,139,133,160,1,0,0,72,141,76,36,64, + 186,4,0,0,0,68,139,194,72,139,128,136,0,0,0,68,141,74,124,15,16,0,15,16,72,16,15,17,1,15,16,64,32,15,17,73,16,15,16,72,48,15,17,65,32,15,16,64,64,15,17,73,48,15,16,72,80,15,17,65,64,15,16,64,96,15,17,73,80,15,16,72,112,73,3,193,15,17,65,96,73, + 3,201,15,17,73,240,73,131,232,1,117,182,15,16,0,15,16,72,16,72,139,64,32,15,17,1,15,17,73,16,72,137,65,32,72,139,203,72,141,68,36,64,15,16,0,15,16,72,16,15,17,1,15,16,64,32,15,17,73,16,15,16,72,48,15,17,65,32,15,16,64,64,15,17,73,48,15,16,72, + 80,15,17,65,64,15,16,64,96,15,17,73,80,15,16,72,112,73,3,193,15,17,65,96,73,3,201,15,17,73,240,72,131,234,1,117,182,15,16,0,15,16,72,16,72,139,64,32,15,17,1,15,17,73,16,72,137,65,32,139,207,33,19,72,139,211,232,3,250,255,255,131,207,255,139, + 240,59,199,117,26,232,117,18,0,0,72,139,203,199,0,22,0,0,0,232,159,4,0,0,139,199,233,199,0,0,0,69,132,246,117,5,232,182,37,0,0,72,139,133,160,1,0,0,72,139,136,136,0,0,0,139,199,240,15,193,1,3,199,117,31,72,139,133,160,1,0,0,72,139,136,136,0, + 0,0,72,141,5,105,61,1,0,72,59,200,116,5,232,87,4,0,0,199,3,1,0,0,0,72,139,133,160,1,0,0,72,137,152,136,0,0,0,72,139,133,160,1,0,0,139,136,168,3,0,0,133,13,12,69,1,0,117,84,72,141,133,160,1,0,0,72,137,68,36,48,76,141,76,36,36,72,141,133,168,1, + 0,0,72,137,68,36,56,76,141,68,36,48,184,5,0,0,0,72,141,84,36,40,72,141,76,36,32,137,68,36,36,137,68,36,40,232,32,2,0,0,69,132,246,116,17,72,139,133,168,1,0,0,72,139,8,72,137,13,130,67,1,0,51,201,232,211,3,0,0,139,198,76,141,156,36,112,2,0,0, + 73,139,91,32,73,139,115,40,73,139,227,65,94,95,93,195,204,72,137,92,36,16,72,137,124,36,24,85,72,141,172,36,128,249,255,255,72,129,236,128,7,0,0,72,139,5,119,60,1,0,72,51,196,72,137,133,112,6,0,0,72,139,249,139,73,4,129,249,233,253,0,0,15,132, + 71,1,0,0,72,141,84,36,80,255,21,64,20,1,0,133,192,15,132,52,1,0,0,51,192,72,141,76,36,112,187,0,1,0,0,136,1,255,192,72,255,193,59,195,114,245,138,68,36,86,72,141,84,36,86,198,68,36,112,32,235,32,68,15,182,66,1,15,182,200,235,11,59,203,115,12, + 198,68,12,112,32,255,193,65,59,200,118,240,72,131,194,2,138,2,132,192,117,220,139,71,4,76,141,68,36,112,131,100,36,48,0,68,139,203,137,68,36,40,186,1,0,0,0,72,141,133,112,2,0,0,51,201,72,137,68,36,32,232,185,53,0,0,131,100,36,64,0,76,141,76, + 36,112,139,71,4,68,139,195,72,139,151,32,2,0,0,51,201,137,68,36,56,72,141,69,112,137,92,36,48,72,137,68,36,40,137,92,36,32,232,22,55,0,0,131,100,36,64,0,76,141,76,36,112,139,71,4,65,184,0,2,0,0,72,139,151,32,2,0,0,51,201,137,68,36,56,72,141, + 133,112,1,0,0,137,92,36,48,72,137,68,36,40,137,92,36,32,232,221,54,0,0,76,141,69,112,76,43,199,76,141,141,112,1,0,0,76,43,207,72,141,149,112,2,0,0,72,141,71,25,246,2,1,116,10,128,8,16,65,138,76,0,231,235,17,246,2,2,116,10,128,8,32,65,138,76, + 1,231,235,2,50,201,136,136,0,1,0,0,72,131,194,2,72,255,192,72,131,235,1,117,205,235,63,51,210,72,141,79,25,187,0,1,0,0,68,141,66,159,65,141,64,32,131,248,25,119,8,128,9,16,141,66,32,235,16,65,131,248,25,119,8,128,9,32,141,66,224,235,2,50,192, + 136,129,0,1,0,0,255,194,72,255,193,59,211,114,204,72,139,141,112,6,0,0,72,51,204,232,126,223,255,255,76,141,156,36,128,7,0,0,73,139,91,24,73,139,123,32,73,139,227,93,195,204,72,137,92,36,8,76,137,76,36,32,87,72,131,236,64,73,139,249,73,139,216, + 139,10,232,52,236,255,255,144,72,139,3,72,139,8,72,139,129,136,0,0,0,72,131,192,24,72,137,68,36,88,72,139,13,134,81,1,0,72,137,76,36,32,72,133,201,116,111,72,133,192,116,93,65,184,2,0,0,0,69,139,200,65,141,80,126,15,16,0,15,17,1,15,16,72,16, + 15,17,73,16,15,16,64,32,15,17,65,32,15,16,72,48,15,17,73,48,15,16,64,64,15,17,65,64,15,16,72,80,15,17,73,80,15,16,64,96,15,17,65,96,72,3,202,15,16,72,112,15,17,73,240,72,3,194,73,131,233,1,117,182,138,0,136,1,235,39,51,210,65,184,1,1,0,0,232, + 181,130,255,255,232,224,14,0,0,199,0,22,0,0,0,232,37,2,0,0,65,184,2,0,0,0,65,141,80,126,72,139,3,72,139,8,72,139,129,136,0,0,0,72,5,25,1,0,0,72,137,68,36,40,72,139,13,220,80,1,0,72,137,76,36,48,72,133,201,116,94,72,133,192,116,76,15,16,0,15, + 17,1,15,16,72,16,15,17,73,16,15,16,64,32,15,17,65,32,15,16,72,48,15,17,73,48,15,16,64,64,15,17,65,64,15,16,72,80,15,17,73,80,15,16,64,96,15,17,65,96,72,3,202,15,16,72,112,15,17,73,240,72,3,194,73,131,232,1,117,182,235,29,51,210,65,184,0,1,0, + 0,232,20,130,255,255,232,63,14,0,0,199,0,22,0,0,0,232,132,1,0,0,72,139,67,8,72,139,8,72,139,17,131,200,255,240,15,193,2,131,248,1,117,27,72,139,67,8,72,139,8,72,141,5,80,57,1,0,72,57,1,116,8,72,139,9,232,59,0,0,0,72,139,3,72,139,16,72,139,67, + 8,72,139,8,72,139,130,136,0,0,0,72,137,1,72,139,3,72,139,8,72,139,129,136,0,0,0,240,255,0,139,15,232,169,234,255,255,72,139,92,36,80,72,131,196,64,95,195,204,204,72,133,201,116,54,83,72,131,236,32,76,139,193,51,210,72,139,13,154,75,1,0,255,21, + 124,17,1,0,133,192,117,22,255,21,10,17,1,0,139,200,232,35,14,0,0,139,216,232,148,13,0,0,137,24,72,131,196,32,91,195,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,72,139,242,72,139,249,72,59,202,116,104,72,139,217,72,139,3,72,133,192,116,20, + 73,186,112,162,92,92,196,158,148,223,255,21,135,9,1,0,132,192,116,9,72,131,195,16,72,59,222,117,219,72,59,222,116,59,72,59,223,116,50,72,131,195,248,72,131,123,248,0,116,26,72,139,3,72,133,192,116,18,73,186,112,59,89,62,117,166,153,151,51,201, + 255,21,75,9,1,0,72,131,235,16,72,141,67,8,72,59,199,117,210,50,192,235,2,176,1,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,72,137,92,36,8,87,72,131,236,32,72,139,218,72,139,249,72,59,202,116,36,72,139,67,248,72,133,192,116,18,73,186, + 112,59,89,62,117,166,153,151,51,201,255,21,248,8,1,0,72,131,235,16,72,59,223,117,220,72,139,92,36,48,176,1,72,131,196,32,95,195,204,204,72,131,236,56,72,131,100,36,32,0,69,51,201,69,51,192,51,210,51,201,232,55,3,0,0,72,131,196,56,195,204,204, + 72,131,236,40,185,23,0,0,0,255,21,137,16,1,0,133,192,116,7,185,5,0,0,0,205,41,65,184,1,0,0,0,186,23,4,0,192,65,141,72,1,232,26,0,0,0,255,21,140,15,1,0,72,139,200,186,23,4,0,192,72,131,196,40,72,255,37,17,17,1,0,204,72,137,92,36,16,72,137,116, + 36,24,85,87,65,86,72,141,172,36,16,251,255,255,72,129,236,240,5,0,0,72,139,5,60,55,1,0,72,51,196,72,137,133,224,4,0,0,65,139,248,139,242,139,217,131,249,255,116,5,232,253,92,255,255,51,210,72,141,76,36,112,65,184,152,0,0,0,232,199,127,255,255, + 51,210,72,141,77,16,65,184,208,4,0,0,232,182,127,255,255,72,141,68,36,112,72,137,68,36,72,72,141,77,16,72,141,69,16,72,137,68,36,80,255,21,57,16,1,0,76,139,181,8,1,0,0,72,141,84,36,64,73,139,206,69,51,192,255,21,41,16,1,0,72,133,192,116,54,72, + 131,100,36,56,0,72,141,76,36,88,72,139,84,36,64,76,139,200,72,137,76,36,48,77,139,198,72,141,76,36,96,72,137,76,36,40,72,141,77,16,72,137,76,36,32,51,201,255,21,14,16,1,0,72,139,133,8,5,0,0,72,137,133,8,1,0,0,72,141,133,8,5,0,0,72,131,192,8, + 137,116,36,112,72,137,133,168,0,0,0,72,139,133,8,5,0,0,72,137,69,128,137,124,36,116,255,21,61,15,1,0,51,201,139,248,255,21,243,15,1,0,72,141,76,36,72,255,21,24,16,1,0,133,192,117,16,133,255,117,12,131,251,255,116,7,139,203,232,8,92,255,255,72, + 139,141,224,4,0,0,72,51,204,232,213,218,255,255,76,141,156,36,240,5,0,0,73,139,91,40,73,139,115,48,73,139,227,65,94,95,93,195,204,72,137,13,45,77,1,0,195,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,48,72,139,233,65,139,217, + 72,139,76,36,104,73,139,248,72,139,242,232,162,0,0,0,72,133,192,116,71,72,139,128,184,3,0,0,72,133,192,116,59,73,186,112,42,87,52,72,31,188,214,72,139,76,36,96,72,139,214,72,137,76,36,32,76,139,199,72,139,205,68,139,203,255,21,179,6,1,0,72,139, + 92,36,64,72,139,108,36,72,72,139,116,36,80,72,131,196,48,95,195,72,139,84,36,104,72,141,13,170,76,1,0,232,177,0,0,0,76,139,24,72,139,5,107,53,1,0,76,51,216,139,200,131,225,63,73,211,203,77,133,219,116,15,73,186,112,42,87,52,72,31,188,214,73, + 139,195,235,149,72,139,68,36,96,68,139,203,76,139,199,72,137,68,36,32,72,139,214,72,139,205,232,137,253,255,255,204,72,137,92,36,16,72,137,116,36,24,87,72,131,236,32,72,139,49,51,255,72,139,217,72,133,246,117,59,255,21,94,13,1,0,137,68,36,48, + 64,56,123,16,117,10,72,137,123,8,198,67,16,1,235,4,72,139,123,8,72,139,215,72,141,76,36,48,232,217,233,255,255,139,76,36,48,72,139,240,72,137,3,255,21,113,14,1,0,72,139,92,36,56,72,139,198,72,139,116,36,64,72,131,196,32,95,195,204,204,72,137, + 92,36,8,72,137,116,36,16,87,72,131,236,32,51,219,72,139,250,72,139,241,56,90,16,117,24,255,21,242,12,1,0,139,200,72,137,95,8,198,71,16,1,255,21,42,14,1,0,235,4,72,139,90,8,72,141,4,222,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,72, + 137,92,36,8,85,72,139,236,72,131,236,112,72,131,101,192,0,131,61,231,75,1,0,0,198,69,208,0,198,69,232,0,198,69,240,0,198,69,248,0,117,16,15,16,5,6,59,1,0,198,69,232,1,243,15,127,69,216,72,141,69,192,72,137,68,36,40,72,139,69,48,72,137,68,36, + 32,232,42,254,255,255,128,125,232,2,117,11,72,139,69,192,131,160,168,3,0,0,253,128,125,240,0,116,15,139,93,236,72,141,77,192,232,43,151,255,255,137,88,32,128,125,248,0,116,15,139,93,244,72,141,77,192,232,22,151,255,255,137,88,36,72,139,156,36, + 128,0,0,0,72,131,196,112,93,195,204,72,137,13,13,75,1,0,72,137,13,14,75,1,0,72,137,13,15,75,1,0,72,137,13,16,75,1,0,195,204,204,204,76,139,220,72,131,236,40,184,3,0,0,0,77,141,75,16,77,141,67,8,137,68,36,56,73,141,83,24,137,68,36,64,73,141,75, + 8,232,131,2,0,0,72,131,196,40,195,204,204,72,137,92,36,24,72,137,116,36,32,87,65,84,65,85,65,86,65,87,72,131,236,64,139,217,69,51,255,68,33,124,36,120,65,182,1,68,136,116,36,112,139,209,131,234,2,116,39,131,234,2,116,82,131,234,2,116,29,131, + 234,2,116,72,131,234,3,116,67,131,234,4,116,14,131,234,6,116,9,131,250,1,15,133,130,0,0,0,131,233,2,15,132,180,0,0,0,131,233,4,15,132,144,0,0,0,131,233,9,15,132,153,0,0,0,131,233,6,15,132,135,0,0,0,131,249,1,116,121,51,255,233,148,0,0,0,232, + 228,230,255,255,76,139,248,72,133,192,117,29,131,200,255,76,141,92,36,64,73,139,91,64,73,139,115,72,73,139,227,65,95,65,94,65,93,65,92,95,195,72,139,0,72,139,13,169,121,0,0,72,193,225,4,72,3,200,235,9,57,88,4,116,11,72,131,192,16,72,59,193,117, + 242,51,192,72,133,192,117,18,232,150,7,0,0,199,0,22,0,0,0,232,219,250,255,255,235,169,72,141,120,8,69,50,246,68,136,116,36,112,235,34,72,141,61,212,73,1,0,235,25,72,141,61,195,73,1,0,235,16,72,141,61,202,73,1,0,235,7,72,141,61,169,73,1,0,69, + 51,237,69,132,246,116,10,65,141,77,3,232,0,228,255,255,144,72,139,55,69,132,246,116,18,72,139,5,80,50,1,0,139,200,131,225,63,72,51,240,72,211,206,72,131,254,1,15,132,139,0,0,0,72,133,246,15,132,6,1,0,0,65,188,16,9,0,0,131,251,11,119,53,65,15, + 163,220,115,47,77,139,111,8,76,137,108,36,48,73,131,103,8,0,131,251,8,117,82,232,117,228,255,255,139,64,16,137,68,36,120,137,68,36,32,232,101,228,255,255,199,64,16,140,0,0,0,131,251,8,117,49,72,139,5,198,120,0,0,72,193,224,4,73,3,7,72,139,13, + 192,120,0,0,72,193,225,4,72,3,200,72,137,68,36,40,72,59,193,116,29,72,131,96,8,0,72,131,192,16,235,235,72,139,5,181,49,1,0,72,137,7,235,6,65,188,16,9,0,0,69,132,246,116,10,185,3,0,0,0,232,87,227,255,255,72,131,254,1,117,7,51,192,233,153,254, + 255,255,131,251,8,117,35,232,240,227,255,255,73,186,112,51,211,48,79,31,156,139,139,80,16,139,203,72,139,198,76,139,5,131,2,1,0,65,255,208,235,24,73,186,112,115,215,80,73,134,193,198,139,203,72,139,198,72,139,21,104,2,1,0,255,210,131,251,11, + 119,180,65,15,163,220,115,174,77,137,111,8,131,251,8,117,165,232,161,227,255,255,139,76,36,120,137,72,16,235,151,69,132,246,116,8,141,78,3,232,219,226,255,255,185,3,0,0,0,232,169,128,255,255,144,204,204,204,204,72,137,92,36,8,76,137,76,36,32, + 87,72,131,236,32,73,139,249,139,10,232,151,226,255,255,144,72,139,5,239,48,1,0,139,200,131,225,63,72,139,29,43,72,1,0,72,51,216,72,211,203,139,15,232,146,226,255,255,72,139,195,72,139,92,36,48,72,131,196,32,95,195,72,137,13,25,72,1,0,195,72, + 139,5,185,48,1,0,72,139,21,10,72,1,0,139,200,72,51,208,131,225,63,72,211,202,72,133,210,15,149,192,195,72,139,5,153,48,1,0,76,139,193,72,139,21,231,71,1,0,139,200,131,225,63,72,51,208,72,211,202,72,133,210,117,3,51,192,195,73,186,112,113,84, + 88,230,7,136,216,73,139,200,72,139,194,72,255,37,125,1,1,0,204,177,1,233,97,1,0,0,204,72,137,92,36,8,72,137,124,36,16,85,72,139,236,72,131,236,96,72,131,101,192,0,72,139,217,131,61,195,71,1,0,0,198,69,208,0,198,69,232,0,198,69,240,0,198,69,248, + 0,117,16,15,16,5,226,54,1,0,198,69,232,1,243,15,127,69,216,72,133,219,117,11,51,201,232,17,1,0,0,139,248,235,50,72,141,85,192,232,120,0,0,0,133,192,116,5,131,207,255,235,32,139,67,20,144,193,232,11,168,1,116,19,72,139,203,232,100,48,0,0,139, + 200,232,61,47,0,0,133,192,117,221,51,255,128,125,232,2,117,11,72,139,69,192,131,160,168,3,0,0,253,128,125,240,0,116,15,139,93,236,72,141,77,192,232,220,146,255,255,137,88,32,128,125,248,0,116,15,139,93,244,72,141,77,192,232,199,146,255,255,137, + 88,36,72,139,92,36,112,139,199,72,139,124,36,120,72,131,196,96,93,195,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,32,72,139,217,72,139,234,139,73,20,139,193,36,3,144,60,2,117,79,246,193,192,116,74,139,59,43,123,8,131, + 99,16,0,72,139,115,8,72,137,51,133,255,126,54,72,139,203,232,193,47,0,0,76,139,205,68,139,199,72,139,214,139,200,232,225,50,0,0,59,248,116,10,240,131,75,20,16,131,200,255,235,18,139,67,20,144,193,232,2,168,1,116,5,240,131,99,20,253,51,192,72, + 139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,131,196,32,95,195,136,76,36,8,85,72,139,236,72,131,236,64,131,101,40,0,72,141,69,40,131,101,32,0,76,141,77,224,72,137,69,232,76,141,69,232,72,141,69,16,72,137,69,240,72,141,85,228,72,141,69,32, + 72,137,69,248,72,141,77,24,184,8,0,0,0,137,69,224,137,69,228,232,176,0,0,0,128,125,16,0,139,69,32,15,69,69,40,72,131,196,64,93,195,204,204,204,72,137,92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,249,73,139,216,72,139,10,232,99,1,0,0,144,72, + 139,83,8,72,139,3,72,139,8,72,133,201,116,92,139,73,20,144,139,193,193,232,13,36,1,116,79,139,193,36,3,60,2,117,5,246,193,192,117,10,15,186,225,11,114,4,255,2,235,56,72,139,67,16,128,56,0,117,16,72,139,3,72,139,8,139,65,20,144,209,232,36,1,116, + 31,72,139,11,72,139,9,232,203,253,255,255,131,248,255,116,8,72,139,67,8,255,0,235,7,72,139,67,24,131,8,255,72,139,15,232,251,0,0,0,72,139,92,36,48,72,131,196,32,95,195,72,137,92,36,8,76,137,76,36,32,86,87,65,86,72,131,236,96,73,139,249,73,139, + 240,139,10,232,129,223,255,255,144,72,139,29,73,69,1,0,72,99,5,58,69,1,0,76,141,52,195,72,137,92,36,56,73,59,222,15,132,137,0,0,0,72,139,3,72,137,68,36,32,72,139,22,72,133,192,116,34,139,72,20,144,139,193,193,232,13,36,1,116,21,139,193,36,3, + 60,2,117,5,246,193,192,117,14,15,186,225,11,114,8,255,2,72,131,195,8,235,186,72,139,86,16,72,139,78,8,72,139,6,76,141,68,36,32,76,137,68,36,64,72,137,68,36,72,72,137,76,36,80,72,137,84,36,88,72,139,68,36,32,72,137,68,36,40,72,137,68,36,48,76, + 141,76,36,40,76,141,68,36,64,72,141,84,36,48,72,141,140,36,136,0,0,0,232,157,254,255,255,235,169,139,15,232,236,222,255,255,72,139,156,36,128,0,0,0,72,131,196,96,65,94,95,94,195,204,204,204,72,131,193,48,72,255,37,153,4,1,0,204,72,131,193,48, + 72,255,37,13,6,1,0,204,204,204,204,204,204,204,204,204,204,204,204,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,32,139,5,65,68,1,0,51,219,191,3,0,0,0,133,192,117,7,184,0,2,0,0,235,5,59,199,15,76,199,72, + 99,200,186,8,0,0,0,137,5,28,68,1,0,232,139,2,0,0,51,201,72,137,5,22,68,1,0,232,193,243,255,255,72,57,29,10,68,1,0,117,47,186,8,0,0,0,137,61,245,67,1,0,72,139,207,232,97,2,0,0,51,201,72,137,5,236,67,1,0,232,151,243,255,255,72,57,29,224,67,1,0, + 117,5,131,200,255,235,117,72,139,235,72,141,53,79,51,1,0,76,141,53,48,51,1,0,73,141,78,48,69,51,192,186,160,15,0,0,232,135,217,255,255,72,139,5,176,67,1,0,76,141,5,17,63,1,0,72,139,213,72,193,250,6,76,137,52,3,72,139,197,131,224,63,72,141,12, + 192,73,139,4,208,72,139,76,200,40,72,131,193,2,72,131,249,2,119,6,199,6,254,255,255,255,72,255,197,73,131,198,88,72,131,195,8,72,131,198,88,72,131,239,1,117,158,51,192,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,139,124,36,72,72,131, + 196,32,65,94,195,204,64,83,72,131,236,32,232,105,251,255,255,232,160,56,0,0,51,219,72,139,13,47,67,1,0,72,139,12,11,232,66,57,0,0,72,139,5,31,67,1,0,72,139,12,3,72,131,193,48,255,21,25,3,1,0,72,131,195,8,72,131,251,24,117,209,72,139,13,0,67, + 1,0,232,171,242,255,255,72,131,37,243,66,1,0,0,72,131,196,32,91,195,204,101,72,139,4,37,48,0,0,0,72,139,72,96,139,129,188,0,0,0,193,232,8,36,1,195,204,204,204,101,72,139,4,37,48,0,0,0,72,139,72,96,72,139,65,32,139,64,8,193,232,31,195,64,83,72, + 131,236,32,51,219,137,92,36,48,232,215,255,255,255,132,192,117,10,72,141,76,36,48,232,37,218,255,255,131,124,36,48,1,15,149,195,139,195,72,131,196,32,91,195,204,72,131,236,40,232,243,222,255,255,72,133,192,117,9,72,141,5,227,50,1,0,235,4,72, + 131,192,32,72,131,196,40,195,72,131,236,40,232,211,222,255,255,72,133,192,117,9,72,141,5,199,50,1,0,235,4,72,131,192,36,72,131,196,40,195,64,83,72,131,236,32,139,217,232,175,222,255,255,72,133,192,117,9,72,141,5,163,50,1,0,235,4,72,131,192,36, + 139,203,137,24,232,32,0,0,0,139,216,232,141,222,255,255,72,141,13,130,50,1,0,72,133,192,116,4,72,141,72,32,137,25,72,131,196,32,91,195,204,51,192,76,141,13,207,140,0,0,73,139,209,68,141,64,8,59,10,116,43,255,192,73,3,208,131,248,45,114,242,141, + 65,237,131,248,17,119,6,184,13,0,0,0,195,129,193,68,255,255,255,184,22,0,0,0,131,249,14,65,15,70,192,195,65,139,68,193,4,195,204,204,204,64,83,72,131,236,32,72,139,218,198,66,56,1,137,74,52,232,163,255,255,255,137,67,44,198,67,48,1,72,131,196, + 32,91,195,204,204,64,83,72,131,236,32,76,139,194,72,139,217,72,133,201,116,14,51,210,72,141,66,224,72,247,243,73,59,192,114,67,73,15,175,216,184,1,0,0,0,72,133,219,72,15,68,216,235,21,232,30,56,0,0,133,192,116,40,72,139,203,232,238,120,255,255, + 133,192,116,28,72,139,13,167,60,1,0,76,139,195,186,8,0,0,0,255,21,121,2,1,0,72,133,192,116,209,235,13,232,165,254,255,255,199,0,12,0,0,0,51,192,72,131,196,32,91,195,204,204,204,233,3,0,0,0,204,204,204,72,137,92,36,8,85,86,87,65,84,65,85,65,86, + 65,87,72,139,236,72,131,236,80,69,51,255,76,139,234,72,139,217,72,133,210,117,23,232,98,254,255,255,65,141,93,22,137,24,232,167,241,255,255,139,195,233,215,1,0,0,15,87,192,76,137,58,72,139,1,243,15,127,69,224,76,137,125,240,72,133,192,15,132, + 157,0,0,0,72,141,85,72,102,199,69,72,42,63,72,139,200,68,136,125,74,232,111,60,0,0,72,139,11,72,133,192,117,60,76,141,77,224,69,51,192,51,210,232,201,4,0,0,139,240,133,192,116,58,72,139,125,224,72,139,223,72,59,125,232,15,132,221,0,0,0,72,139, + 11,232,34,240,255,255,72,131,195,8,72,59,93,232,117,238,233,198,0,0,0,76,141,69,224,72,139,208,232,19,6,0,0,139,240,133,192,117,9,72,131,195,8,72,139,3,235,130,72,139,125,224,72,139,223,72,59,125,232,15,132,154,0,0,0,72,139,11,232,223,239,255, + 255,72,131,195,8,72,59,93,232,117,238,233,131,0,0,0,72,139,125,224,73,131,204,255,72,139,117,232,73,139,215,76,139,246,72,137,85,80,76,43,247,72,139,199,73,193,254,3,73,255,198,72,59,254,116,34,76,139,0,73,139,204,72,255,193,69,56,60,8,117,247, + 72,255,194,72,131,192,8,72,3,209,72,59,198,117,226,72,137,85,80,65,184,1,0,0,0,73,139,206,232,44,124,255,255,72,139,216,72,133,192,117,50,51,201,232,105,239,255,255,72,139,223,72,59,254,116,17,72,139,11,232,89,239,255,255,72,131,195,8,72,59, + 222,117,239,65,139,244,72,139,207,232,69,239,255,255,139,198,233,141,0,0,0,74,141,12,240,76,139,247,72,137,77,88,76,139,225,72,59,254,116,76,72,43,199,72,137,69,72,77,139,6,73,131,207,255,73,255,199,67,128,60,56,0,117,246,72,139,209,73,255,199, + 73,43,212,77,139,207,72,3,85,80,73,139,204,232,35,58,0,0,133,192,117,94,72,139,69,72,72,139,77,88,78,137,36,48,77,3,231,73,131,198,8,76,59,246,117,187,51,201,73,137,93,0,232,212,238,255,255,72,139,223,72,59,254,116,17,72,139,11,232,196,238,255, + 255,72,131,195,8,72,59,222,117,239,72,139,207,232,179,238,255,255,51,192,72,139,156,36,144,0,0,0,72,131,196,80,65,95,65,94,65,93,65,92,95,94,93,195,72,131,100,36,32,0,69,51,201,69,51,192,51,210,51,201,232,188,239,255,255,204,204,204,204,72,139, + 196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,48,69,51,246,65,139,233,72,139,218,72,139,249,72,133,201,117,36,68,56,114,40,116,13,72,139,74,16,232,71,238,255,255,68,136,115,40,76,137,115,16,76,137,115,24,76,137,115, + 32,233,14,1,0,0,68,56,49,117,85,76,57,114,24,117,69,68,56,114,40,116,13,72,139,74,16,232,24,238,255,255,68,136,115,40,185,2,0,0,0,232,78,16,0,0,72,137,67,16,73,139,214,72,247,216,27,192,247,208,131,224,12,15,148,194,133,192,15,148,193,136,75, + 40,72,137,83,24,133,192,15,133,192,0,0,0,72,139,67,16,102,68,137,48,235,157,65,131,201,255,68,137,116,36,40,76,139,199,76,137,116,36,32,139,205,65,141,81,10,232,152,10,0,0,72,99,240,133,192,117,22,255,21,223,254,0,0,139,200,232,176,251,255,255, + 232,107,251,255,255,139,0,235,125,72,139,83,24,72,59,242,118,65,68,56,115,40,116,13,72,139,75,16,232,135,237,255,255,68,136,115,40,72,141,12,54,232,190,15,0,0,72,137,67,16,73,139,214,72,247,216,27,192,247,208,131,224,12,72,15,68,214,133,192, + 15,148,193,136,75,40,72,137,83,24,133,192,117,51,72,139,67,16,65,131,201,255,137,84,36,40,76,139,199,139,205,72,137,68,36,32,65,141,81,10,232,18,10,0,0,72,152,72,133,192,15,132,118,255,255,255,72,255,200,72,137,67,32,51,192,72,139,92,36,64,72, + 139,108,36,72,72,139,116,36,80,72,139,124,36,88,72,131,196,48,65,94,195,204,204,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,64,69,51,246,65,139,233,72,139,218,72,139,249,72,133,201,117,36,68,56,114,40, + 116,13,72,139,74,16,232,203,236,255,255,68,136,115,40,76,137,115,16,76,137,115,24,76,137,115,32,233,32,1,0,0,102,68,57,49,117,84,76,57,114,24,117,69,68,56,114,40,116,13,72,139,74,16,232,155,236,255,255,68,136,115,40,185,1,0,0,0,232,209,14,0, + 0,72,137,67,16,73,139,214,72,247,216,27,192,247,208,131,224,12,15,148,194,133,192,15,148,193,136,75,40,72,137,83,24,133,192,15,133,209,0,0,0,72,139,67,16,68,136,48,235,157,76,137,116,36,56,65,131,201,255,76,137,116,36,48,76,139,199,68,137,116, + 36,40,51,210,139,205,76,137,116,36,32,232,164,9,0,0,72,99,240,133,192,117,25,255,21,91,253,0,0,139,200,232,44,250,255,255,232,231,249,255,255,139,0,233,132,0,0,0,72,139,83,24,72,59,242,118,64,68,56,115,40,116,13,72,139,75,16,232,0,236,255,255, + 68,136,115,40,72,139,206,232,56,14,0,0,72,137,67,16,73,139,214,72,247,216,27,192,247,208,131,224,12,72,15,68,214,133,192,15,148,193,136,75,40,72,137,83,24,133,192,117,59,72,139,67,16,65,131,201,255,76,137,116,36,56,76,139,199,76,137,116,36,48, + 139,205,137,84,36,40,51,210,72,137,68,36,32,232,20,9,0,0,72,152,72,133,192,15,132,108,255,255,255,72,255,200,72,137,67,32,51,192,72,139,92,36,80,72,139,108,36,88,72,139,116,36,96,72,139,124,36,104,72,131,196,64,65,94,195,204,72,137,92,36,8,72, + 137,108,36,16,72,137,116,36,24,87,65,84,65,85,65,86,65,87,72,131,236,48,72,131,205,255,73,139,241,51,255,77,139,240,76,139,234,76,139,225,72,255,197,64,56,60,41,117,247,186,1,0,0,0,73,139,198,72,3,234,72,247,208,72,59,232,118,32,141,66,11,72, + 139,92,36,96,72,139,108,36,104,72,139,116,36,112,72,131,196,48,65,95,65,94,65,93,65,92,95,195,77,141,120,1,76,3,253,73,139,207,232,187,249,255,255,72,139,216,77,133,246,116,25,77,139,206,77,139,197,73,139,215,72,139,200,232,14,54,0,0,133,192, + 15,133,213,0,0,0,77,43,254,74,141,12,51,73,139,215,76,139,205,77,139,196,232,241,53,0,0,133,192,15,133,184,0,0,0,76,139,118,16,68,141,120,8,76,57,118,8,15,133,141,0,0,0,72,57,62,117,43,65,139,215,141,72,4,232,91,249,255,255,51,201,72,137,6,232, + 149,234,255,255,72,139,6,72,133,192,116,66,72,137,70,8,72,131,192,32,72,137,70,16,235,93,76,43,54,72,184,255,255,255,255,255,255,255,127,73,193,254,3,76,59,240,119,30,72,139,14,75,141,44,54,72,139,213,77,139,199,232,155,6,0,0,72,133,192,117, + 22,51,201,232,75,234,255,255,72,139,203,191,12,0,0,0,232,62,234,255,255,235,37,74,141,12,240,72,137,6,72,137,78,8,72,141,12,232,72,137,78,16,51,201,232,34,234,255,255,72,139,78,8,72,137,25,76,1,126,8,51,201,232,16,234,255,255,139,199,233,222, + 254,255,255,69,51,201,72,137,124,36,32,69,51,192,51,210,51,201,232,45,235,255,255,204,64,85,83,86,87,65,84,65,85,65,86,72,141,172,36,192,253,255,255,72,129,236,64,3,0,0,72,139,5,179,34,1,0,72,51,196,72,137,133,48,2,0,0,77,139,224,72,139,249, + 72,187,1,8,0,0,0,32,0,0,72,59,209,116,34,138,2,44,47,60,45,119,10,72,15,190,192,72,15,163,195,114,16,72,139,207,232,26,58,0,0,72,139,208,72,59,199,117,222,68,138,2,65,128,248,58,117,30,72,141,71,1,72,59,208,116,21,77,139,204,69,51,192,51,210, + 72,139,207,232,248,253,255,255,233,163,2,0,0,65,128,232,47,69,51,246,65,128,248,45,119,12,73,15,190,192,72,15,163,195,176,1,114,3,65,138,198,72,43,215,76,137,116,36,64,72,255,194,76,137,116,36,72,246,216,76,137,116,36,80,72,141,76,36,112,76, + 137,116,36,88,77,27,237,76,137,116,36,96,76,35,234,68,136,116,36,104,51,210,76,137,108,36,56,232,206,131,255,255,72,139,68,36,120,185,233,253,0,0,57,72,12,117,23,68,56,117,136,116,12,72,139,68,36,112,131,160,168,3,0,0,253,68,139,201,235,56,232, + 163,206,255,255,133,192,117,26,68,56,117,136,116,12,72,139,68,36,112,131,160,168,3,0,0,253,65,185,1,0,0,0,235,21,68,56,117,136,116,12,72,139,68,36,112,131,160,168,3,0,0,253,69,139,206,76,141,68,36,48,72,139,207,72,141,84,36,64,232,34,250,255, + 255,72,139,76,36,80,76,141,69,224,133,192,68,137,116,36,40,76,137,116,36,32,73,15,69,206,69,51,201,51,210,255,21,254,248,0,0,72,139,216,72,131,248,255,117,42,77,139,204,69,51,192,51,210,72,139,207,232,237,252,255,255,139,216,68,56,116,36,104, + 116,10,72,139,76,36,80,232,82,232,255,255,139,195,233,131,1,0,0,73,139,116,36,8,73,43,52,36,72,193,254,3,51,210,76,137,117,176,72,141,77,144,76,137,117,184,76,137,117,192,76,137,117,200,76,137,117,208,68,136,117,216,232,215,130,255,255,72,139, + 69,152,185,233,253,0,0,57,72,12,117,22,68,56,117,168,116,11,72,139,69,144,131,160,168,3,0,0,253,68,139,201,235,54,232,174,205,255,255,133,192,117,25,68,56,117,168,116,11,72,139,69,144,131,160,168,3,0,0,253,65,185,1,0,0,0,235,20,68,56,117,168, + 116,11,72,139,69,144,131,160,168,3,0,0,253,69,139,206,76,141,68,36,48,72,141,85,176,72,141,77,12,232,171,250,255,255,76,139,117,192,51,210,133,192,73,139,206,72,15,69,202,128,57,46,117,31,138,65,1,132,192,117,15,56,85,216,116,58,73,139,206,232, + 135,231,255,255,235,48,60,46,117,5,56,81,2,116,232,77,139,204,77,139,197,72,139,215,232,246,251,255,255,68,139,232,133,192,117,116,56,69,216,116,8,73,139,206,232,90,231,255,255,76,139,108,36,56,72,141,85,224,72,139,203,255,21,208,247,0,0,69, + 51,246,133,192,15,133,255,254,255,255,73,139,4,36,73,139,84,36,8,72,43,208,72,193,250,3,72,59,242,116,23,72,43,214,72,141,12,240,76,141,13,130,0,0,0,69,141,70,8,232,41,46,0,0,72,139,203,255,21,128,247,0,0,68,56,116,36,104,116,10,72,139,76,36, + 80,232,247,230,255,255,51,192,235,43,128,125,216,0,116,8,73,139,206,232,229,230,255,255,72,139,203,255,21,84,247,0,0,128,124,36,104,0,116,10,72,139,76,36,80,232,203,230,255,255,65,139,197,72,139,141,48,2,0,0,72,51,204,232,81,196,255,255,72,129, + 196,64,3,0,0,65,94,65,93,65,92,95,94,91,93,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,72,59,202,115,4,131,200,255,195,51,192,72,59,202,15,151,192,195,204,204,72,137,92,36,16,72,137,124,36,24,85,72,141,172,36,96,254,255,255, + 72,129,236,160,2,0,0,72,139,5,67,31,1,0,72,51,196,72,137,133,144,1,0,0,65,139,248,72,139,218,65,184,5,1,0,0,72,141,85,128,255,21,123,247,0,0,133,192,117,20,255,21,105,247,0,0,139,200,232,58,244,255,255,51,192,233,164,0,0,0,72,131,100,36,104, + 0,72,141,76,36,40,72,139,199,72,137,92,36,72,51,210,72,137,68,36,80,72,137,68,36,96,72,137,92,36,88,198,68,36,112,0,232,185,128,255,255,72,139,68,36,48,65,185,233,253,0,0,68,57,72,12,117,21,128,124,36,64,0,116,71,72,139,68,36,40,131,160,168, + 3,0,0,253,235,57,232,142,203,255,255,133,192,117,26,56,68,36,64,116,12,72,139,68,36,40,131,160,168,3,0,0,253,65,185,1,0,0,0,235,22,128,124,36,64,0,116,12,72,139,68,36,40,131,160,168,3,0,0,253,69,51,201,76,141,68,36,32,72,141,84,36,72,72,141, + 77,128,232,43,0,0,0,139,68,36,104,72,139,141,144,1,0,0,72,51,204,232,16,195,255,255,76,141,156,36,160,2,0,0,73,139,91,24,73,139,123,32,73,139,227,93,195,204,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,64,51,237,65, + 139,241,72,139,218,72,139,249,72,133,201,117,27,64,56,106,40,116,4,64,136,106,40,72,137,106,16,72,137,106,24,72,137,106,32,233,195,0,0,0,102,57,41,117,52,72,57,106,24,117,37,64,56,106,40,116,4,64,136,106,40,232,207,242,255,255,185,34,0,0,0,137, + 8,139,193,64,136,107,40,72,137,107,24,233,149,0,0,0,72,139,66,16,64,136,40,235,190,72,137,108,36,56,65,131,201,255,72,137,108,36,48,76,139,199,137,108,36,40,51,210,139,206,72,137,108,36,32,232,49,2,0,0,72,99,208,133,192,117,22,255,21,232,245, + 0,0,139,200,232,185,242,255,255,232,116,242,255,255,139,0,235,76,72,139,75,24,72,59,209,118,12,64,56,107,40,116,141,64,136,107,40,235,135,72,139,67,16,65,131,201,255,72,137,108,36,56,76,139,199,72,137,108,36,48,51,210,137,76,36,40,139,206,72, + 137,68,36,32,232,216,1,0,0,72,152,72,133,192,116,167,72,255,200,72,137,67,32,51,192,72,139,92,36,80,72,139,108,36,88,72,139,116,36,96,72,131,196,64,95,195,204,204,204,139,209,65,185,4,0,0,0,51,201,69,51,192,233,2,0,0,0,204,204,72,137,92,36,8, + 72,137,116,36,16,87,72,131,236,64,139,218,65,139,249,72,139,209,65,139,240,72,141,76,36,32,232,200,126,255,255,72,139,68,36,48,15,182,211,64,132,124,2,25,117,24,133,246,116,16,72,139,68,36,40,72,139,8,15,183,4,81,133,198,117,4,51,192,235,5,184, + 1,0,0,0,128,124,36,56,0,116,12,72,139,76,36,32,131,161,168,3,0,0,253,72,139,92,36,80,72,139,116,36,88,72,131,196,64,95,195,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,32,73,139,232,72,139,218,72,139,241,72,133,210,116, + 29,51,210,72,141,66,224,72,247,243,73,59,192,115,15,232,79,241,255,255,199,0,12,0,0,0,51,192,235,65,72,133,246,116,10,232,143,52,0,0,72,139,248,235,2,51,255,72,15,175,221,72,139,206,72,139,211,232,181,52,0,0,72,139,240,72,133,192,116,22,72,59, + 251,115,17,72,43,223,72,141,12,56,76,139,195,51,210,232,215,100,255,255,72,139,198,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,131,196,32,95,195,204,204,204,184,172,222,0,0,59,200,119,79,116,68,184,51,196,0,0,59,200,119,31,116,57,139, + 193,131,232,42,116,50,45,2,196,0,0,116,43,131,232,1,116,38,131,232,1,116,33,131,248,3,235,26,139,193,45,53,196,0,0,116,19,45,99,18,0,0,116,72,45,18,8,0,0,116,5,131,248,1,117,2,51,210,72,255,37,212,244,0,0,139,193,45,173,222,0,0,116,238,131,232, + 1,116,233,131,232,1,116,228,131,232,1,116,223,131,232,1,116,218,131,232,1,116,213,131,232,1,116,208,45,53,31,0,0,116,201,131,248,1,117,198,131,226,8,235,193,72,137,92,36,8,87,141,129,24,2,255,255,69,139,217,131,248,1,73,139,216,184,172,222,0, + 0,65,15,150,194,51,255,59,200,119,65,116,120,184,51,196,0,0,59,200,119,31,116,109,139,193,131,232,42,116,102,45,2,196,0,0,116,95,131,232,1,116,90,131,232,1,116,85,131,248,3,235,72,139,193,45,53,196,0,0,116,71,45,99,18,0,0,116,64,45,18,8,0,0, + 235,44,139,193,45,173,222,0,0,116,48,131,232,1,116,43,131,232,1,116,38,131,232,1,116,33,131,232,1,116,28,131,232,1,116,23,131,232,1,116,18,45,53,31,0,0,116,11,131,248,1,116,6,15,186,242,7,235,2,139,215,72,139,68,36,72,69,132,210,76,139,76,36, + 64,76,139,192,76,15,69,199,76,15,69,207,116,7,72,133,192,116,2,137,56,76,137,68,36,72,76,139,195,76,137,76,36,64,69,139,203,72,139,92,36,16,95,72,255,37,142,244,0,0,204,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65, + 86,72,131,236,64,255,21,165,242,0,0,51,246,72,139,216,72,133,192,117,7,51,192,233,195,0,0,0,72,139,235,102,57,48,116,29,72,131,200,255,72,255,192,102,57,116,69,0,117,246,72,141,108,69,0,72,131,197,2,102,57,117,0,117,227,72,137,116,36,56,72,43, + 235,72,137,116,36,48,72,131,197,2,72,209,253,76,139,195,68,139,205,137,116,36,40,51,210,72,137,116,36,32,51,201,232,159,254,255,255,76,99,240,133,192,117,11,72,139,203,255,21,219,241,0,0,235,150,73,139,206,232,93,3,0,0,72,139,248,72,133,192, + 117,9,51,201,232,10,225,255,255,235,220,72,137,116,36,56,68,139,205,72,137,116,36,48,76,139,195,68,137,116,36,40,51,210,51,201,72,137,124,36,32,232,81,254,255,255,133,192,117,10,72,139,207,232,217,224,255,255,235,10,51,201,232,208,224,255,255, + 72,139,247,72,139,203,255,21,124,241,0,0,72,139,198,72,139,92,36,80,72,139,108,36,88,72,139,116,36,96,72,139,124,36,104,72,131,196,64,65,94,195,204,204,102,137,76,36,8,72,131,236,88,184,255,255,0,0,102,59,200,15,132,213,0,0,0,72,141,76,36,48, + 232,63,123,255,255,76,139,84,36,56,65,187,0,1,0,0,65,129,122,12,233,253,0,0,117,42,15,183,76,36,96,65,141,67,128,102,59,200,115,88,15,182,193,76,141,5,238,130,0,0,65,246,68,64,2,1,116,5,15,182,201,235,37,15,182,209,235,118,15,183,84,36,96,102, + 65,59,211,115,39,15,182,194,76,141,5,199,130,0,0,65,246,68,64,2,1,116,16,15,182,202,73,139,130,16,1,0,0,15,182,20,8,235,73,15,182,210,235,68,73,131,186,56,1,0,0,0,116,58,73,139,138,56,1,0,0,72,141,68,36,112,199,68,36,40,1,0,0,0,76,141,68,36, + 96,65,185,1,0,0,0,72,137,68,36,32,65,139,211,232,176,49,0,0,15,183,84,36,96,133,192,116,5,15,183,84,36,112,128,124,36,72,0,116,12,72,139,76,36,48,131,161,168,3,0,0,253,15,183,194,72,131,196,88,195,204,204,204,64,83,72,131,236,32,72,139,5,227, + 47,1,0,72,139,218,72,57,2,116,22,139,129,168,3,0,0,133,5,107,32,1,0,117,8,232,84,14,0,0,72,137,3,72,131,196,32,91,195,204,204,204,64,83,72,131,236,32,72,139,5,111,47,1,0,72,139,218,72,57,2,116,22,139,129,168,3,0,0,133,5,55,32,1,0,117,8,232,32, + 212,255,255,72,137,3,72,131,196,32,91,195,204,204,204,64,83,72,131,236,32,72,141,5,123,47,1,0,72,139,218,74,139,4,192,72,57,2,116,22,139,129,168,3,0,0,133,5,255,31,1,0,117,8,232,232,13,0,0,72,137,3,72,131,196,32,91,195,204,204,204,64,83,72,131, + 236,32,72,141,5,3,47,1,0,72,139,218,74,139,4,192,72,57,2,116,22,139,129,168,3,0,0,133,5,199,31,1,0,117,8,232,176,211,255,255,72,137,3,72,131,196,32,91,195,204,204,204,184,1,0,0,0,135,5,53,47,1,0,195,204,204,204,204,76,139,220,72,131,236,40,184, + 4,0,0,0,77,141,75,16,77,141,67,8,137,68,36,56,73,141,83,24,137,68,36,64,73,141,75,8,232,7,0,0,0,72,131,196,40,195,204,204,72,137,92,36,8,72,137,116,36,16,76,137,76,36,32,87,72,131,236,48,73,139,249,139,10,232,250,200,255,255,144,72,141,29,178, + 46,1,0,72,141,53,179,28,1,0,72,137,92,36,32,72,141,5,167,46,1,0,72,59,216,116,25,72,57,51,116,14,72,139,214,72,139,203,232,134,13,0,0,72,137,3,72,131,195,8,235,214,139,15,232,214,200,255,255,72,139,92,36,64,72,139,116,36,72,72,131,196,48,95, + 195,204,204,72,137,92,36,16,87,72,131,236,32,184,255,255,0,0,15,183,218,102,59,200,116,72,184,0,1,0,0,102,59,200,115,18,72,139,5,200,30,1,0,15,183,201,15,183,4,72,35,195,235,46,51,255,102,137,76,36,64,76,141,76,36,48,102,137,124,36,48,72,141, + 84,36,64,141,79,1,68,139,193,232,196,51,0,0,133,192,116,7,15,183,68,36,48,235,208,51,192,72,139,92,36,56,72,131,196,32,95,195,64,83,72,131,236,32,72,139,217,72,131,249,224,119,60,72,133,201,184,1,0,0,0,72,15,68,216,235,21,232,170,36,0,0,133, + 192,116,37,72,139,203,232,122,101,255,255,133,192,116,25,72,139,13,51,41,1,0,76,139,195,51,210,255,21,8,239,0,0,72,133,192,116,212,235,13,232,52,235,255,255,199,0,12,0,0,0,51,192,72,131,196,32,91,195,204,204,72,137,92,36,8,87,72,131,236,32,73, + 139,248,72,139,217,232,255,76,255,255,246,67,4,102,117,13,129,59,99,115,109,224,117,5,131,248,1,116,11,72,139,92,36,48,72,131,196,32,95,195,232,252,135,255,255,72,137,88,32,232,243,135,255,255,72,137,120,40,232,186,129,255,255,204,204,233,199, + 235,255,255,204,204,204,64,83,72,131,236,32,72,139,217,76,141,13,248,129,0,0,51,201,76,141,5,231,129,0,0,72,141,21,232,129,0,0,232,107,1,0,0,72,133,192,116,15,72,139,203,72,131,196,32,91,72,255,37,183,230,0,0,72,131,196,32,91,72,255,37,91,239, + 0,0,204,204,204,64,83,72,131,236,32,139,217,76,141,13,201,129,0,0,185,1,0,0,0,76,141,5,181,129,0,0,72,141,21,182,129,0,0,232,33,1,0,0,139,203,72,133,192,116,12,72,131,196,32,91,72,255,37,110,230,0,0,72,131,196,32,91,72,255,37,26,239,0,0,204, + 204,64,83,72,131,236,32,139,217,76,141,13,145,129,0,0,185,2,0,0,0,76,141,5,125,129,0,0,72,141,21,126,129,0,0,232,217,0,0,0,139,203,72,133,192,116,12,72,131,196,32,91,72,255,37,38,230,0,0,72,131,196,32,91,72,255,37,218,238,0,0,204,204,72,137, + 92,36,8,87,72,131,236,32,72,139,218,76,141,13,92,129,0,0,139,249,72,141,21,83,129,0,0,185,3,0,0,0,76,141,5,63,129,0,0,232,138,0,0,0,72,139,211,139,207,72,133,192,116,8,255,21,218,229,0,0,235,6,255,21,154,238,0,0,72,139,92,36,48,72,131,196,32, + 95,195,204,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,65,139,240,76,141,13,27,129,0,0,139,218,76,141,5,10,129,0,0,72,139,249,72,141,21,112,111,0,0,185,4,0,0,0,232,46,0,0,0,139,211,72,139,207,72,133,192,116,11,68,139,198,255,21, + 123,229,0,0,235,6,255,21,59,237,0,0,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,204,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,84,65,85,65,86,65,87,72,131,236,32,139,249,76,141,61,11,244,254,255,73,131,206,255,77, + 139,225,73,139,232,76,139,234,73,139,132,255,208,55,2,0,144,73,59,198,15,132,235,0,0,0,72,133,192,15,133,228,0,0,0,77,59,193,15,132,209,0,0,0,139,117,0,73,139,156,247,184,55,2,0,144,72,133,219,116,11,73,59,222,15,133,153,0,0,0,235,107,77,139, + 188,247,232,139,1,0,51,210,73,139,207,65,184,0,8,0,0,255,21,229,236,0,0,72,139,216,72,133,192,117,86,255,21,15,236,0,0,131,248,87,117,45,68,141,67,7,73,139,207,72,141,21,76,110,0,0,232,143,5,0,0,133,192,116,22,69,51,192,51,210,73,139,207,255, + 21,173,236,0,0,72,139,216,72,133,192,117,30,73,139,198,76,141,61,91,243,254,255,73,135,132,247,184,55,2,0,72,131,197,4,73,59,236,233,103,255,255,255,72,139,195,76,141,61,61,243,254,255,73,135,132,247,184,55,2,0,72,133,192,116,9,72,139,203,255, + 21,47,235,0,0,73,139,213,72,139,203,255,21,187,235,0,0,72,133,192,116,13,72,139,200,73,135,140,255,208,55,2,0,235,10,77,135,180,255,208,55,2,0,51,192,72,139,92,36,80,72,139,108,36,88,72,139,116,36,96,72,131,196,32,65,95,65,94,65,93,65,92,95, + 195,204,204,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,72,131,236,40,72,137,76,36,48,72,137,84,36,56,68,137,68,36,64,72,139,18,72,139,193,232,162,131,255,255,255,208,232,203,131,255,255,72,139,200,72,139,84,36,56,72,139,18,65,184,2, + 0,0,0,232,133,131,255,255,72,131,196,40,195,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,72,131,236,40,72,137,76,36,48,72,137,84,36,56,68,137,68,36,64,72,139,18,72,139,193,232,82,131,255,255,255,208,232,123,131,255,255,72,131,196,40,195, + 204,204,204,204,204,204,72,131,236,40,72,137,76,36,48,72,137,84,36,56,72,139,84,36,56,72,139,18,65,184,2,0,0,0,232,31,131,255,255,72,131,196,40,195,204,204,204,204,204,204,15,31,64,0,72,131,236,40,72,137,76,36,48,72,137,84,36,56,76,137,68,36, + 64,68,137,76,36,72,69,139,193,72,139,193,232,237,130,255,255,72,139,76,36,64,255,208,232,17,131,255,255,72,139,200,72,139,84,36,56,65,184,2,0,0,0,232,206,130,255,255,72,131,196,40,195,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72, + 137,120,32,65,86,72,131,236,32,77,139,81,56,72,139,242,77,139,240,72,139,233,73,139,209,72,139,206,73,139,249,65,139,26,72,193,227,4,73,3,218,76,141,67,4,232,226,181,255,255,139,69,4,36,102,246,216,184,1,0,0,0,27,210,247,218,3,208,133,83,4,116, + 17,76,139,207,77,139,198,72,139,214,72,139,205,232,110,72,255,255,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,139,124,36,72,72,131,196,32,65,94,195,204,204,204,72,137,84,36,16,72,137,76,36,8,72,131,236,40,69,51,201,69,51,192,72,139, + 84,36,56,72,139,76,36,48,255,21,196,234,0,0,72,131,196,40,195,204,204,204,137,76,36,8,72,131,236,40,185,23,0,0,0,255,21,41,234,0,0,133,192,116,8,139,68,36,48,139,200,205,41,72,141,13,158,41,1,0,232,93,1,0,0,72,139,68,36,40,72,137,5,133,42,1, + 0,72,141,68,36,40,72,131,192,8,72,137,5,21,42,1,0,72,139,5,110,42,1,0,72,137,5,223,40,1,0,199,5,197,40,1,0,9,4,0,192,199,5,191,40,1,0,1,0,0,0,199,5,201,40,1,0,1,0,0,0,184,8,0,0,0,72,107,192,0,72,141,13,193,40,1,0,139,84,36,48,72,137,20,1,72, + 141,13,50,125,0,0,232,213,1,0,0,72,131,196,40,195,72,131,236,40,185,8,0,0,0,232,86,255,255,255,72,131,196,40,195,204,204,204,204,204,72,137,76,36,8,72,131,236,56,185,23,0,0,0,255,21,116,233,0,0,133,192,116,7,185,2,0,0,0,205,41,72,141,13,234, + 40,1,0,232,25,1,0,0,72,139,68,36,56,72,137,5,209,41,1,0,72,141,68,36,56,72,131,192,8,72,137,5,97,41,1,0,72,139,5,186,41,1,0,72,137,5,43,40,1,0,72,139,68,36,64,72,137,5,47,41,1,0,199,5,5,40,1,0,9,4,0,192,199,5,255,39,1,0,1,0,0,0,199,5,9,40,1, + 0,1,0,0,0,184,8,0,0,0,72,107,192,0,72,141,13,1,40,1,0,72,199,4,1,2,0,0,0,184,8,0,0,0,72,107,192,0,72,139,13,241,15,1,0,72,137,76,4,32,184,8,0,0,0,72,107,192,1,72,139,13,212,15,1,0,72,137,76,4,32,72,141,13,72,124,0,0,232,235,0,0,0,72,131,196, + 56,195,204,204,72,137,92,36,32,87,72,131,236,64,72,139,217,255,21,9,233,0,0,72,139,187,248,0,0,0,72,141,84,36,80,72,139,207,69,51,192,255,21,249,232,0,0,72,133,192,116,50,72,131,100,36,56,0,72,141,76,36,88,72,139,84,36,80,76,139,200,72,137,76, + 36,48,76,139,199,72,141,76,36,96,72,137,76,36,40,51,201,72,137,92,36,32,255,21,226,232,0,0,72,139,92,36,104,72,131,196,64,95,195,204,204,204,64,83,86,87,72,131,236,64,72,139,217,255,21,155,232,0,0,72,139,179,248,0,0,0,51,255,69,51,192,72,141, + 84,36,96,72,139,206,255,21,137,232,0,0,72,133,192,116,57,72,131,100,36,56,0,72,141,76,36,104,72,139,84,36,96,76,139,200,72,137,76,36,48,76,139,198,72,141,76,36,112,72,137,76,36,40,51,201,72,137,92,36,32,255,21,114,232,0,0,255,199,131,255,2,124, + 177,72,131,196,64,95,94,91,195,204,204,204,64,83,72,131,236,32,72,139,217,51,201,255,21,119,232,0,0,72,139,203,255,21,158,232,0,0,255,21,216,230,0,0,72,139,200,186,9,4,0,192,72,131,196,32,91,72,255,37,92,232,0,0,204,204,204,204,204,204,204,204, + 204,204,102,102,15,31,132,0,0,0,0,0,72,43,209,77,133,192,116,106,247,193,7,0,0,0,116,29,15,182,1,58,4,10,117,93,72,255,193,73,255,200,116,82,132,192,116,78,72,247,193,7,0,0,0,117,227,73,187,128,128,128,128,128,128,128,128,73,186,255,254,254, + 254,254,254,254,254,141,4,10,37,255,15,0,0,61,248,15,0,0,119,192,72,139,1,72,59,4,10,117,183,72,131,193,8,73,131,232,8,118,15,77,141,12,2,72,247,208,73,35,193,73,133,195,116,207,51,192,195,72,27,192,72,131,200,1,195,204,204,204,77,133,192,117, + 24,51,192,195,15,183,1,102,133,192,116,19,102,59,2,117,14,72,131,193,2,72,131,194,2,73,131,232,1,117,229,15,183,1,15,183,10,43,193,195,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,65,86,65,87,72,131,236,32,72,139,233,72,133,201,116,71, + 51,219,76,141,61,155,237,254,255,191,227,0,0,0,141,4,31,65,184,85,0,0,0,153,72,139,205,43,194,209,248,72,99,240,76,139,246,77,3,246,75,139,148,247,16,167,1,0,232,39,44,0,0,133,192,116,41,121,5,141,126,255,235,3,141,94,1,59,223,126,199,51,192, + 72,139,92,36,64,72,139,108,36,72,72,139,116,36,80,72,131,196,32,65,95,65,94,95,195,75,99,132,247,24,167,1,0,133,192,120,217,72,61,228,0,0,0,115,209,72,3,192,65,139,132,199,176,140,1,0,235,198,204,240,255,65,16,72,139,129,224,0,0,0,72,133,192, + 116,3,240,255,0,72,139,129,240,0,0,0,72,133,192,116,3,240,255,0,72,139,129,232,0,0,0,72,133,192,116,3,240,255,0,72,139,129,0,1,0,0,72,133,192,116,3,240,255,0,72,141,65,56,65,184,6,0,0,0,72,141,21,199,19,1,0,72,57,80,240,116,11,72,139,16,72,133, + 210,116,3,240,255,2,72,131,120,232,0,116,12,72,139,80,248,72,133,210,116,3,240,255,2,72,131,192,32,73,131,232,1,117,203,72,139,137,32,1,0,0,233,33,2,0,0,204,72,131,236,40,72,133,201,15,132,150,0,0,0,65,131,201,255,240,68,1,73,16,72,139,129,224, + 0,0,0,72,133,192,116,4,240,68,1,8,72,139,129,240,0,0,0,72,133,192,116,4,240,68,1,8,72,139,129,232,0,0,0,72,133,192,116,4,240,68,1,8,72,139,129,0,1,0,0,72,133,192,116,4,240,68,1,8,72,141,65,56,65,184,6,0,0,0,72,141,21,37,19,1,0,72,57,80,240,116, + 12,72,139,16,72,133,210,116,4,240,68,1,10,72,131,120,232,0,116,13,72,139,80,248,72,133,210,116,4,240,68,1,10,72,131,192,32,73,131,232,1,117,201,72,139,137,32,1,0,0,232,165,1,0,0,72,131,196,40,195,72,137,92,36,8,72,137,108,36,16,72,137,116,36, + 24,87,72,131,236,32,72,139,129,248,0,0,0,72,139,217,72,133,192,116,121,72,141,13,242,19,1,0,72,59,193,116,109,72,139,131,224,0,0,0,72,133,192,116,97,131,56,0,117,92,72,139,139,240,0,0,0,72,133,201,116,22,131,57,0,117,17,232,222,210,255,255,72, + 139,139,248,0,0,0,232,46,37,0,0,72,139,139,232,0,0,0,72,133,201,116,22,131,57,0,117,17,232,188,210,255,255,72,139,139,248,0,0,0,232,24,38,0,0,72,139,139,224,0,0,0,232,164,210,255,255,72,139,139,248,0,0,0,232,152,210,255,255,72,139,131,0,1,0, + 0,72,133,192,116,71,131,56,0,117,66,72,139,139,8,1,0,0,72,129,233,254,0,0,0,232,116,210,255,255,72,139,139,16,1,0,0,191,128,0,0,0,72,43,207,232,96,210,255,255,72,139,139,24,1,0,0,72,43,207,232,81,210,255,255,72,139,139,0,1,0,0,232,69,210,255, + 255,72,139,139,32,1,0,0,232,205,0,0,0,72,141,179,40,1,0,0,189,6,0,0,0,72,141,123,56,72,141,5,210,17,1,0,72,57,71,240,116,26,72,139,15,72,133,201,116,18,131,57,0,117,13,232,10,210,255,255,72,139,14,232,2,210,255,255,72,131,127,232,0,116,19,72, + 139,79,248,72,133,201,116,10,131,57,0,117,5,232,232,209,255,255,72,131,198,8,72,131,199,32,72,131,237,1,117,177,72,139,203,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,131,196,32,95,233,190,209,255,255,204,204,72,133,201,116,28,72,141, + 5,88,102,0,0,72,59,200,116,16,184,1,0,0,0,240,15,193,129,92,1,0,0,255,192,195,184,255,255,255,127,195,204,72,133,201,116,26,72,141,5,48,102,0,0,72,59,200,116,14,131,200,255,240,15,193,129,92,1,0,0,255,200,195,184,255,255,255,127,195,204,204, + 204,72,133,201,116,49,83,72,131,236,32,72,141,5,3,102,0,0,72,139,217,72,59,200,116,24,139,129,92,1,0,0,144,133,192,117,13,232,23,37,0,0,72,139,203,232,59,209,255,255,72,131,196,32,91,195,204,72,137,92,36,8,87,72,131,236,32,232,113,188,255,255, + 72,141,184,144,0,0,0,139,136,168,3,0,0,139,5,238,17,1,0,133,200,116,8,72,139,31,72,133,219,117,44,185,4,0,0,0,232,124,187,255,255,144,72,139,21,52,33,1,0,72,139,207,232,40,0,0,0,72,139,216,185,4,0,0,0,232,123,187,255,255,72,133,219,116,14,72, + 139,195,72,139,92,36,48,72,131,196,32,95,195,232,219,122,255,255,144,204,204,72,137,92,36,8,87,72,131,236,32,72,139,250,72,133,210,116,70,72,133,201,116,65,72,139,25,72,59,218,117,5,72,139,199,235,54,72,137,57,72,139,207,232,45,252,255,255,72, + 133,219,116,235,72,139,203,232,172,252,255,255,131,123,16,0,117,221,72,141,5,195,14,1,0,72,59,216,116,209,72,139,203,232,58,253,255,255,235,199,51,192,72,139,92,36,48,72,131,196,32,95,195,204,204,204,72,131,236,40,131,249,254,117,21,232,54,222, + 255,255,131,32,0,232,14,222,255,255,199,0,9,0,0,0,235,78,133,201,120,50,59,13,236,31,1,0,115,42,72,99,201,76,141,5,224,27,1,0,72,139,193,131,225,63,72,193,232,6,72,141,20,201,73,139,4,192,246,68,208,56,1,116,7,72,139,68,208,40,235,28,232,235, + 221,255,255,131,32,0,232,195,221,255,255,199,0,9,0,0,0,232,8,209,255,255,72,131,200,255,72,131,196,40,195,204,204,204,72,137,92,36,8,72,137,116,36,16,72,137,124,36,24,65,86,72,131,236,32,72,99,217,133,201,120,114,59,29,122,31,1,0,115,106,72, + 139,195,76,141,53,110,27,1,0,131,224,63,72,139,243,72,193,238,6,72,141,60,192,73,139,4,246,246,68,248,56,1,116,71,72,131,124,248,40,255,116,63,232,76,39,0,0,131,248,1,117,39,133,219,116,22,43,216,116,11,59,216,117,27,185,244,255,255,255,235, + 12,185,245,255,255,255,235,5,185,246,255,255,255,51,210,255,21,228,225,0,0,73,139,4,246,72,131,76,248,40,255,51,192,235,22,232,25,221,255,255,199,0,9,0,0,0,232,46,221,255,255,131,32,0,131,200,255,72,139,92,36,48,72,139,116,36,56,72,139,124,36, + 64,72,131,196,32,65,94,195,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,32,186,72,0,0,0,141,74,248,232,195,221,255,255,51,246,72,139,216,72,133,192,116,91,72,141,168,0,18,0,0,72,59,197,116,76,72,141,120,48,72,141,79, + 208,69,51,192,186,160,15,0,0,232,252,180,255,255,72,131,79,248,255,72,141,79,14,128,103,13,248,139,198,72,137,55,199,71,8,0,0,10,10,198,71,12,10,64,136,49,255,192,72,255,193,131,248,5,114,243,72,131,199,72,72,141,71,208,72,59,197,117,184,72, + 139,243,51,201,232,155,206,255,255,72,139,92,36,48,72,139,198,72,139,116,36,64,72,139,108,36,56,72,131,196,32,95,195,204,204,204,72,133,201,116,74,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,72,141,177,0,18,0,0,72,139,217,72,139,249,72, + 59,206,116,18,72,139,207,255,21,169,222,0,0,72,131,199,72,72,59,254,117,238,72,139,203,232,64,206,255,255,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,72,137,92,36,8,72,137,116,36,16,72,137,124,36,24,65,87,72,131,236,48,139,241,129, + 249,0,32,0,0,114,41,232,212,219,255,255,187,9,0,0,0,137,24,232,24,207,255,255,139,195,72,139,92,36,64,72,139,116,36,72,72,139,124,36,80,72,131,196,48,65,95,195,51,255,141,79,7,232,94,184,255,255,144,139,223,139,5,141,29,1,0,72,137,92,36,32,59, + 240,124,54,76,141,61,125,25,1,0,73,57,60,223,116,2,235,34,232,144,254,255,255,73,137,4,223,72,133,192,117,5,141,120,12,235,20,139,5,92,29,1,0,131,192,64,137,5,83,29,1,0,72,255,195,235,193,185,7,0,0,0,232,40,184,255,255,139,199,235,138,72,99, + 209,76,141,5,54,25,1,0,72,139,194,131,226,63,72,193,248,6,72,141,12,210,73,139,4,192,72,141,12,200,72,255,37,201,221,0,0,204,72,99,209,76,141,5,14,25,1,0,72,139,194,131,226,63,72,193,248,6,72,141,12,210,73,139,4,192,72,141,12,200,72,255,37,33, + 223,0,0,204,64,85,65,84,65,85,65,86,65,87,72,131,236,96,72,141,108,36,48,72,137,93,96,72,137,117,104,72,137,125,112,72,139,5,242,5,1,0,72,51,197,72,137,69,40,68,139,234,69,139,249,72,139,209,77,139,224,72,141,77,8,232,178,103,255,255,139,189, + 136,0,0,0,133,255,117,7,72,139,69,16,139,120,12,247,157,144,0,0,0,69,139,207,77,139,196,139,207,27,210,131,100,36,40,0,72,131,100,36,32,0,131,226,8,255,194,232,156,233,255,255,76,99,240,133,192,117,7,51,255,233,208,0,0,0,73,139,246,72,3,246, + 72,141,70,16,72,59,240,72,27,201,72,35,200,15,132,157,0,0,0,72,129,249,0,4,0,0,119,49,72,141,65,15,72,59,193,119,10,72,184,240,255,255,255,255,255,255,15,72,131,224,240,232,76,36,0,0,72,43,224,72,141,92,36,48,72,133,219,116,109,199,3,204,204, + 0,0,235,19,232,158,238,255,255,72,139,216,72,133,192,116,10,199,0,221,221,0,0,72,131,195,16,72,133,219,116,73,76,139,198,51,210,72,139,203,232,206,77,255,255,69,139,207,68,137,116,36,40,77,139,196,72,137,92,36,32,186,1,0,0,0,139,207,232,246, + 232,255,255,133,192,116,28,76,139,141,128,0,0,0,68,139,192,72,139,211,65,139,205,255,21,120,221,0,0,139,248,235,9,51,219,51,255,72,133,219,116,17,72,141,75,240,129,57,221,221,0,0,117,5,232,226,203,255,255,128,125,32,0,116,11,72,139,69,8,131, + 160,168,3,0,0,253,139,199,72,139,77,40,72,51,205,232,91,169,255,255,72,139,93,96,72,139,117,104,72,139,125,112,72,141,101,48,65,95,65,94,65,93,65,92,93,195,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,112,72,139,242,73,139,217,72,139,209, + 65,139,248,72,141,76,36,80,232,63,102,255,255,139,132,36,192,0,0,0,72,141,76,36,88,137,68,36,64,76,139,203,139,132,36,184,0,0,0,68,139,199,137,68,36,56,72,139,214,139,132,36,176,0,0,0,137,68,36,48,72,139,132,36,168,0,0,0,72,137,68,36,40,139, + 132,36,160,0,0,0,137,68,36,32,232,39,0,0,0,128,124,36,104,0,116,12,72,139,76,36,80,131,161,168,3,0,0,253,76,141,92,36,112,73,139,91,16,73,139,115,24,73,139,227,95,195,204,204,64,85,65,84,65,85,65,86,65,87,72,131,236,96,72,141,108,36,80,72,137, + 93,64,72,137,117,72,72,137,125,80,72,139,5,202,3,1,0,72,51,197,72,137,69,8,72,99,125,96,73,139,241,69,139,224,76,139,234,72,139,217,133,255,126,20,72,139,215,73,139,201,232,236,34,0,0,59,199,141,120,1,124,2,139,248,68,139,117,120,69,133,246, + 117,7,72,139,3,68,139,112,12,247,157,128,0,0,0,68,139,207,76,139,198,65,139,206,27,210,131,100,36,40,0,72,131,100,36,32,0,131,226,8,255,194,232,97,231,255,255,51,210,76,99,248,133,192,15,132,115,2,0,0,73,139,199,72,3,192,72,141,72,16,72,59,193, + 72,27,192,72,35,193,15,132,61,2,0,0,73,184,240,255,255,255,255,255,255,15,72,61,0,4,0,0,119,49,72,141,72,15,72,59,200,119,3,73,139,200,72,131,225,240,72,139,193,232,13,34,0,0,72,43,225,72,141,92,36,80,72,133,219,15,132,5,2,0,0,199,3,204,204, + 0,0,235,24,72,139,200,232,88,236,255,255,51,210,72,139,216,72,133,192,116,10,199,0,221,221,0,0,72,131,195,16,72,133,219,15,132,216,1,0,0,68,137,124,36,40,68,139,207,76,139,198,72,137,92,36,32,186,1,0,0,0,65,139,206,232,182,230,255,255,51,210, + 133,192,15,132,177,1,0,0,72,137,84,36,64,69,139,207,72,137,84,36,56,76,139,195,72,137,84,36,48,73,139,205,137,84,36,40,72,137,84,36,32,65,139,212,232,55,176,255,255,51,210,72,99,240,133,192,15,132,123,1,0,0,65,184,0,4,0,0,69,133,224,116,81,139, + 69,112,133,192,15,132,108,1,0,0,59,240,15,143,93,1,0,0,72,137,84,36,64,69,139,207,72,137,84,36,56,76,139,195,72,137,84,36,48,73,139,205,137,68,36,40,65,139,212,72,139,69,104,72,137,68,36,32,232,223,175,255,255,51,210,139,240,133,192,15,133,43, + 1,0,0,233,31,1,0,0,72,139,206,72,3,201,72,141,65,16,72,59,200,72,27,201,72,35,200,15,132,230,0,0,0,73,59,200,119,53,72,141,65,15,72,59,193,119,10,72,184,240,255,255,255,255,255,255,15,72,131,224,240,232,220,32,0,0,72,43,224,72,141,124,36,80, + 72,133,255,15,132,205,0,0,0,199,7,204,204,0,0,235,21,232,42,235,255,255,51,210,72,139,248,72,133,192,116,10,199,0,221,221,0,0,72,131,199,16,72,133,255,15,132,163,0,0,0,72,137,84,36,64,69,139,207,72,137,84,36,56,76,139,195,72,137,84,36,48,73, + 139,205,137,116,36,40,65,139,212,72,137,124,36,32,232,48,175,255,255,51,210,133,192,116,94,139,69,112,68,139,206,72,137,84,36,56,76,139,199,72,137,84,36,48,65,139,206,133,192,117,22,137,84,36,40,72,137,84,36,32,232,222,229,255,255,139,240,133, + 192,117,26,235,46,137,68,36,40,72,139,69,104,72,137,68,36,32,232,196,229,255,255,139,240,133,192,116,27,72,141,79,240,129,57,221,221,0,0,117,46,232,65,200,255,255,235,39,72,139,250,72,133,255,116,17,72,141,79,240,129,57,221,221,0,0,117,5,232, + 38,200,255,255,51,246,235,10,72,139,218,139,242,72,133,219,116,17,72,141,75,240,129,57,221,221,0,0,117,5,232,7,200,255,255,139,198,72,139,77,8,72,51,205,232,145,165,255,255,72,139,93,64,72,139,117,72,72,139,125,80,72,141,101,16,65,95,65,94,65, + 93,65,92,93,195,204,204,204,204,204,204,204,72,131,236,40,232,183,188,255,255,51,201,132,192,15,148,193,139,193,72,131,196,40,195,204,137,76,36,8,72,131,236,56,72,99,209,131,250,254,117,13,232,115,213,255,255,199,0,9,0,0,0,235,108,133,201,120, + 88,59,21,81,23,1,0,115,80,72,139,202,76,141,5,69,19,1,0,131,225,63,72,139,194,72,193,248,6,72,141,12,201,73,139,4,192,246,68,200,56,1,116,45,72,141,68,36,64,137,84,36,80,137,84,36,88,76,141,76,36,80,72,141,84,36,88,72,137,68,36,32,76,141,68, + 36,32,72,141,76,36,72,232,29,0,0,0,235,19,232,10,213,255,255,199,0,9,0,0,0,232,79,200,255,255,131,200,255,72,131,196,56,195,204,204,204,72,137,92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,249,73,139,216,139,10,232,136,249,255,255,144,72,139, + 3,72,99,8,72,139,209,72,139,193,72,193,248,6,76,141,5,176,18,1,0,131,226,63,72,141,20,210,73,139,4,192,246,68,208,56,1,116,35,232,133,246,255,255,72,139,200,255,21,136,215,0,0,51,219,133,192,117,29,255,21,252,215,0,0,139,216,232,173,212,255, + 255,137,24,232,134,212,255,255,199,0,9,0,0,0,131,203,255,139,15,232,78,249,255,255,139,195,72,139,92,36,48,72,131,196,32,95,195,204,72,131,236,40,72,133,201,117,21,232,90,212,255,255,199,0,22,0,0,0,232,159,199,255,255,131,200,255,235,4,139,65, + 24,144,72,131,196,40,195,204,64,85,83,86,87,65,84,65,85,65,86,65,87,72,139,236,72,131,236,120,51,255,69,139,240,76,99,249,73,139,217,72,139,242,69,133,192,15,132,200,2,0,0,72,133,210,117,55,65,198,65,56,1,69,51,192,65,137,121,52,51,210,65,198, + 65,48,1,51,201,65,199,65,44,22,0,0,0,69,51,201,72,137,92,36,40,72,137,124,36,32,232,253,200,255,255,131,200,255,233,142,2,0,0,73,139,199,72,141,13,191,17,1,0,131,224,63,77,139,231,73,193,252,6,76,137,101,232,76,141,44,192,74,139,12,225,66,138, + 68,233,57,136,69,184,254,200,60,1,119,9,65,139,198,247,208,168,1,116,146,66,246,68,233,56,32,116,14,51,210,65,139,207,68,141,66,2,232,4,30,0,0,65,139,207,72,137,125,208,232,104,12,0,0,72,141,21,105,17,1,0,133,192,15,132,20,1,0,0,74,139,4,226, + 66,56,124,232,56,15,141,5,1,0,0,64,56,123,40,117,15,72,139,203,232,4,98,255,255,72,141,21,61,17,1,0,72,139,67,24,72,57,184,56,1,0,0,117,15,74,139,4,226,66,56,124,232,57,15,132,212,0,0,0,74,139,12,226,72,141,85,224,74,139,76,233,40,255,21,62, + 214,0,0,133,192,15,132,178,0,0,0,15,190,77,184,133,201,15,132,131,0,0,0,131,233,1,116,9,131,249,1,15,133,57,1,0,0,78,141,36,54,72,137,125,192,76,139,254,73,59,244,115,92,68,139,117,196,65,15,183,7,15,183,200,102,137,69,184,232,236,31,0,0,15, + 183,77,184,102,59,193,117,54,65,131,198,2,68,137,117,196,102,131,249,10,117,29,185,13,0,0,0,232,203,31,0,0,185,13,0,0,0,102,59,193,117,20,65,255,198,68,137,117,196,255,199,73,131,199,2,77,59,252,115,11,235,177,255,21,251,213,0,0,137,69,192,76, + 139,101,232,233,186,0,0,0,69,139,206,72,137,92,36,32,76,139,198,72,141,77,192,65,139,215,232,88,2,0,0,242,15,16,0,139,120,8,233,156,0,0,0,72,141,21,77,16,1,0,74,139,12,226,66,56,124,233,56,125,82,15,190,77,184,133,201,116,54,131,233,1,116,29, + 131,249,1,15,133,128,0,0,0,69,139,206,72,141,77,192,76,139,198,65,139,215,232,142,7,0,0,235,184,69,139,206,72,141,77,192,76,139,198,65,139,215,232,150,8,0,0,235,164,69,139,206,72,141,77,192,76,139,198,65,139,215,232,98,6,0,0,235,144,74,139,76, + 233,40,76,141,77,196,51,192,69,139,198,72,33,68,36,32,72,139,214,72,137,69,192,137,69,200,255,21,253,214,0,0,133,192,117,9,255,21,59,213,0,0,137,69,192,139,125,200,242,15,16,69,192,242,15,17,69,208,72,141,21,172,15,1,0,72,139,69,208,72,193,232, + 32,133,192,117,92,139,69,208,133,192,116,44,131,248,5,117,23,198,67,48,1,199,67,44,9,0,0,0,198,67,56,1,137,67,52,233,172,253,255,255,139,77,208,72,139,211,232,82,210,255,255,233,156,253,255,255,74,139,4,226,66,246,68,232,56,64,116,5,128,62,26, + 116,31,131,99,52,0,198,67,48,1,199,67,44,28,0,0,0,198,67,56,1,233,115,253,255,255,139,69,212,43,199,235,2,51,192,72,131,196,120,65,95,65,94,65,93,65,92,95,94,91,93,195,204,204,72,137,92,36,24,72,137,84,36,16,137,76,36,8,86,65,84,65,85,65,86, + 65,87,72,131,236,48,73,139,217,69,139,232,72,99,241,131,254,254,117,45,65,198,65,56,1,65,131,97,52,0,65,198,65,48,1,65,199,65,44,9,0,0,0,131,200,255,72,139,92,36,112,72,131,196,48,65,95,65,94,65,93,65,92,94,195,133,201,120,15,59,53,200,18,1, + 0,115,7,184,1,0,0,0,235,2,51,192,133,192,117,51,65,198,65,56,1,65,131,97,52,0,65,198,65,48,1,65,199,65,44,9,0,0,0,72,137,92,36,40,72,131,100,36,32,0,69,51,201,69,51,192,51,210,51,201,232,180,197,255,255,235,158,72,139,198,76,139,254,73,193,255, + 6,72,141,13,117,14,1,0,131,224,63,76,141,36,192,74,139,4,249,66,246,68,224,56,1,116,169,139,206,232,27,245,255,255,65,131,206,255,72,141,5,80,14,1,0,74,139,4,248,66,246,68,224,56,1,117,21,198,67,48,1,199,67,44,9,0,0,0,198,67,56,1,131,99,52,0, + 235,21,76,139,203,69,139,197,72,139,84,36,104,139,206,232,237,251,255,255,68,139,240,139,206,232,251,244,255,255,65,139,198,233,38,255,255,255,204,204,204,72,139,196,85,86,87,65,84,65,85,65,86,65,87,72,141,104,169,72,129,236,208,0,0,0,72,199, + 69,247,254,255,255,255,72,137,88,8,72,139,5,4,251,0,0,72,51,196,72,137,69,23,73,139,240,76,137,69,191,76,99,242,72,139,217,72,139,69,127,72,137,69,167,73,139,198,77,139,238,73,193,253,6,76,137,109,199,72,141,13,171,218,254,255,131,224,63,76, + 141,60,192,74,139,132,233,0,51,2,0,74,139,68,248,40,72,137,69,231,69,139,225,77,3,224,76,137,101,159,255,21,187,210,0,0,137,69,183,51,255,76,139,85,167,65,56,122,40,117,12,73,139,202,232,44,94,255,255,76,139,85,167,73,139,74,24,139,73,12,137, + 77,187,51,192,72,137,3,137,67,8,76,57,101,191,15,131,143,3,0,0,77,139,206,73,193,249,6,76,137,77,239,139,215,138,6,136,69,143,137,125,147,65,188,1,0,0,0,76,141,29,42,218,254,255,129,249,233,253,0,0,15,133,123,1,0,0,139,215,76,139,247,74,141, + 12,253,62,0,0,0,75,3,140,203,0,51,2,0,64,56,57,116,14,255,194,73,255,198,72,255,193,73,131,254,5,124,237,77,133,246,15,142,224,0,0,0,75,139,132,235,0,51,2,0,66,15,182,76,248,62,70,15,190,164,25,208,40,2,0,65,255,196,65,139,196,43,194,137,69, + 175,72,139,85,159,72,43,214,76,99,192,76,59,194,15,143,120,2,0,0,72,139,207,74,141,20,253,62,0,0,0,75,3,148,203,0,51,2,0,138,2,136,68,13,255,72,255,193,72,255,194,73,59,206,124,239,77,133,192,126,26,72,141,77,255,73,3,206,72,139,214,232,176, + 158,255,255,76,139,85,167,76,141,29,117,217,254,255,72,139,215,75,139,140,235,0,51,2,0,72,3,202,66,136,124,249,62,72,255,194,73,59,214,124,232,72,137,125,207,72,141,69,255,72,137,69,215,139,199,65,131,252,4,15,148,192,255,192,68,139,224,68,139, + 192,76,137,84,36,32,76,141,77,207,72,141,85,215,72,141,77,147,232,167,25,0,0,72,131,248,255,15,132,96,2,0,0,139,69,175,255,200,72,99,200,72,3,241,233,251,0,0,0,15,182,6,78,15,190,172,24,208,40,2,0,65,141,77,1,76,139,69,159,76,43,198,72,99,193, + 73,59,192,15,143,216,1,0,0,72,137,125,175,72,137,117,223,139,199,131,249,4,15,148,192,255,192,68,139,240,68,139,192,76,137,84,36,32,76,141,77,175,72,141,85,223,72,141,77,147,232,60,25,0,0,72,131,248,255,15,132,245,1,0,0,73,3,245,69,139,230,76, + 139,109,199,233,145,0,0,0,79,139,132,235,0,51,2,0,67,138,76,248,61,246,193,4,116,33,67,138,68,248,62,136,69,7,138,6,136,69,8,128,225,251,67,136,76,248,61,65,184,2,0,0,0,72,141,85,7,235,73,68,15,182,14,73,139,66,24,72,139,8,102,66,57,60,73,125, + 49,76,141,118,1,76,59,117,159,15,131,112,1,0,0,77,139,202,65,184,2,0,0,0,72,139,214,72,141,77,147,232,123,21,0,0,131,248,255,15,132,117,1,0,0,73,139,246,235,27,77,139,196,72,139,214,77,139,202,72,141,77,147,232,91,21,0,0,131,248,255,15,132,85, + 1,0,0,72,255,198,72,137,124,36,56,72,137,124,36,48,199,68,36,40,5,0,0,0,72,141,69,15,72,137,68,36,32,69,139,204,76,141,69,147,51,210,139,77,183,232,151,220,255,255,68,139,240,133,192,15,132,27,1,0,0,72,137,124,36,32,76,141,77,151,68,139,192, + 72,141,85,15,76,139,101,231,73,139,204,255,21,235,209,0,0,133,192,15,132,238,0,0,0,139,214,43,85,191,3,83,8,137,83,4,68,57,117,151,15,130,225,0,0,0,128,125,143,10,117,62,184,13,0,0,0,102,137,69,143,72,137,124,36,32,76,141,77,151,68,141,64,244, + 72,141,85,143,73,139,204,255,21,165,209,0,0,133,192,15,132,168,0,0,0,131,125,151,1,15,130,166,0,0,0,255,67,8,255,67,4,139,83,4,72,59,117,159,15,131,147,0,0,0,76,139,85,167,76,139,77,239,139,77,187,233,1,253,255,255,72,133,210,126,36,73,43,246, + 75,139,140,235,0,51,2,0,73,3,206,66,138,4,54,66,136,68,249,62,255,199,73,255,198,72,99,199,72,59,194,124,223,1,83,4,235,85,77,133,192,126,39,72,139,215,76,139,77,199,75,139,140,203,0,51,2,0,72,3,202,138,4,50,66,136,68,249,62,255,199,72,255,194, + 72,99,199,73,59,192,124,224,68,1,67,4,235,35,71,136,76,248,62,75,139,132,235,0,51,2,0,66,128,76,248,61,4,141,66,1,137,67,4,235,8,255,21,55,207,0,0,137,3,72,139,195,72,139,77,23,72,51,204,232,142,155,255,255,72,139,156,36,16,1,0,0,72,129,196, + 208,0,0,0,65,95,65,94,65,93,65,92,95,94,93,195,204,204,204,72,137,92,36,8,72,137,108,36,24,86,87,65,86,184,80,20,0,0,232,152,21,0,0,72,43,224,72,139,5,150,246,0,0,72,51,196,72,137,132,36,64,20,0,0,76,99,210,72,139,249,73,139,194,65,139,233,72, + 193,248,6,72,141,13,76,9,1,0,65,131,226,63,73,3,232,73,139,240,72,139,4,193,75,141,20,210,76,139,116,208,40,51,192,72,137,7,137,71,8,76,59,197,115,111,72,141,92,36,64,72,59,245,115,36,138,6,72,255,198,60,10,117,9,255,71,8,198,3,13,72,255,195, + 136,3,72,255,195,72,141,132,36,63,20,0,0,72,59,216,114,215,72,131,100,36,32,0,72,141,68,36,64,43,216,76,141,76,36,48,68,139,195,72,141,84,36,64,73,139,206,255,21,7,208,0,0,133,192,116,18,139,68,36,48,1,71,4,59,195,114,15,72,59,245,114,155,235, + 8,255,21,51,206,0,0,137,7,72,139,199,72,139,140,36,64,20,0,0,72,51,204,232,134,154,255,255,76,141,156,36,80,20,0,0,73,139,91,32,73,139,107,48,73,139,227,65,94,95,94,195,204,204,72,137,92,36,8,72,137,108,36,24,86,87,65,86,184,80,20,0,0,232,148, + 20,0,0,72,43,224,72,139,5,146,245,0,0,72,51,196,72,137,132,36,64,20,0,0,76,99,210,72,139,249,73,139,194,65,139,233,72,193,248,6,72,141,13,72,8,1,0,65,131,226,63,73,3,232,73,139,240,72,139,4,193,75,141,20,210,76,139,116,208,40,51,192,72,137,7, + 137,71,8,76,59,197,15,131,130,0,0,0,72,141,92,36,64,72,59,245,115,49,15,183,6,72,131,198,2,102,131,248,10,117,16,131,71,8,2,185,13,0,0,0,102,137,11,72,131,195,2,102,137,3,72,131,195,2,72,141,132,36,62,20,0,0,72,59,216,114,202,72,131,100,36,32, + 0,72,141,68,36,64,72,43,216,76,141,76,36,48,72,209,251,72,141,84,36,64,3,219,73,139,206,68,139,195,255,21,236,206,0,0,133,192,116,18,139,68,36,48,1,71,4,59,195,114,15,72,59,245,114,136,235,8,255,21,24,205,0,0,137,7,72,139,199,72,139,140,36,64, + 20,0,0,72,51,204,232,107,153,255,255,76,141,156,36,80,20,0,0,73,139,91,32,73,139,107,48,73,139,227,65,94,95,94,195,204,204,204,72,137,92,36,8,72,137,108,36,24,86,87,65,84,65,86,65,87,184,112,20,0,0,232,116,19,0,0,72,43,224,72,139,5,114,244,0, + 0,72,51,196,72,137,132,36,96,20,0,0,76,99,210,72,139,217,73,139,194,69,139,241,72,193,248,6,72,141,13,40,7,1,0,65,131,226,63,77,3,240,77,139,248,73,139,248,72,139,4,193,75,141,20,210,76,139,100,208,40,51,192,72,137,3,77,59,198,137,67,8,15,131, + 206,0,0,0,72,141,68,36,80,73,59,254,115,45,15,183,15,72,131,199,2,102,131,249,10,117,12,186,13,0,0,0,102,137,16,72,131,192,2,102,137,8,72,131,192,2,72,141,140,36,248,6,0,0,72,59,193,114,206,72,131,100,36,56,0,72,141,76,36,80,72,131,100,36,48, + 0,76,141,68,36,80,72,43,193,199,68,36,40,85,13,0,0,72,141,140,36,0,7,0,0,72,209,248,72,137,76,36,32,68,139,200,185,233,253,0,0,51,210,232,58,216,255,255,139,232,133,192,116,73,51,246,133,192,116,51,72,131,100,36,32,0,72,141,148,36,0,7,0,0,139, + 206,76,141,76,36,64,68,139,197,72,3,209,73,139,204,68,43,198,255,21,131,205,0,0,133,192,116,24,3,116,36,64,59,245,114,205,139,199,65,43,199,137,67,4,73,59,254,233,52,255,255,255,255,21,169,203,0,0,137,3,72,139,195,72,139,140,36,96,20,0,0,72, + 51,204,232,252,151,255,255,76,141,156,36,112,20,0,0,73,139,91,48,73,139,107,64,73,139,227,65,95,65,94,65,92,95,94,195,72,137,92,36,16,87,72,131,236,48,131,100,36,32,0,185,8,0,0,0,232,175,164,255,255,144,187,3,0,0,0,137,92,36,36,59,29,103,10, + 1,0,116,110,72,99,251,72,139,5,99,10,1,0,72,139,12,248,72,133,201,117,2,235,85,139,65,20,144,193,232,13,36,1,116,25,72,139,13,70,10,1,0,72,139,12,249,232,133,21,0,0,131,248,255,116,4,255,68,36,32,72,139,5,45,10,1,0,72,139,12,248,72,131,193,48, + 255,21,39,202,0,0,72,139,13,24,10,1,0,72,139,12,249,232,191,185,255,255,72,139,5,8,10,1,0,72,131,36,248,0,255,195,235,134,185,8,0,0,0,232,65,164,255,255,139,68,36,32,72,139,92,36,72,72,131,196,48,95,195,204,204,64,83,72,131,236,32,139,65,20, + 72,139,217,193,232,13,144,168,1,116,40,139,65,20,144,193,232,6,168,1,116,29,72,139,73,8,232,108,185,255,255,240,129,99,20,191,254,255,255,51,192,72,137,67,8,72,137,3,137,67,16,72,131,196,32,91,195,204,204,72,131,236,40,131,249,254,117,13,232, + 10,199,255,255,199,0,9,0,0,0,235,66,133,201,120,46,59,13,232,8,1,0,115,38,72,99,201,72,141,21,220,4,1,0,72,139,193,131,225,63,72,193,232,6,72,141,12,201,72,139,4,194,15,182,68,200,56,131,224,64,235,18,232,203,198,255,255,199,0,9,0,0,0,232,16, + 186,255,255,51,192,72,131,196,40,195,204,139,5,26,15,1,0,144,195,65,84,65,85,65,86,72,129,236,80,4,0,0,72,139,5,180,241,0,0,72,51,196,72,137,132,36,16,4,0,0,77,139,225,77,139,240,76,139,233,72,133,201,117,26,72,133,210,116,21,232,121,198,255, + 255,199,0,22,0,0,0,232,190,185,255,255,233,169,3,0,0,77,133,246,116,230,77,133,228,116,225,72,131,250,2,15,130,149,3,0,0,72,137,156,36,72,4,0,0,72,137,172,36,64,4,0,0,72,137,180,36,56,4,0,0,72,137,188,36,48,4,0,0,76,137,188,36,40,4,0,0,76,141, + 122,255,77,15,175,254,76,3,249,51,201,72,137,76,36,32,102,102,102,15,31,132,0,0,0,0,0,51,210,73,139,199,73,43,197,73,247,246,72,141,88,1,72,131,251,8,15,135,155,0,0,0,77,59,253,118,117,75,141,52,46,73,139,221,72,139,254,73,59,247,119,42,15,31, + 0,73,186,112,137,222,94,149,183,117,147,72,139,211,72,139,207,73,139,196,255,21,247,193,0,0,133,192,72,15,79,223,73,3,254,73,59,255,118,217,77,139,198,73,139,215,73,59,223,116,36,73,43,223,102,102,102,15,31,132,0,0,0,0,0,15,182,2,15,182,12,19, + 136,4,19,136,10,72,141,82,1,73,131,232,1,117,234,77,43,254,77,59,253,119,148,72,139,76,36,32,72,131,233,1,72,137,76,36,32,15,136,134,2,0,0,76,139,108,204,48,76,139,188,204,32,2,0,0,233,76,255,255,255,72,209,235,73,15,175,222,74,141,52,43,73, + 186,112,137,222,94,149,183,117,147,72,139,214,73,139,205,73,139,196,255,21,104,193,0,0,133,192,126,47,77,139,206,76,139,198,76,59,238,116,36,102,15,31,132,0,0,0,0,0,65,15,182,0,73,139,208,72,43,211,15,182,10,136,2,65,136,8,73,255,192,73,131, + 233,1,117,229,73,186,112,137,222,94,149,183,117,147,73,139,215,73,139,205,73,139,196,255,21,28,193,0,0,133,192,126,48,77,139,198,73,139,215,77,59,239,116,37,77,139,205,77,43,207,15,31,128,0,0,0,0,15,182,2,65,15,182,12,17,65,136,4,17,136,10,72, + 141,82,1,73,131,232,1,117,232,73,186,112,137,222,94,149,183,117,147,73,139,215,72,139,206,73,139,196,255,21,207,192,0,0,133,192,126,51,77,139,198,73,139,215,73,59,247,116,40,76,139,206,77,43,207,102,102,15,31,132,0,0,0,0,0,15,182,2,65,15,182, + 12,17,65,136,4,17,136,10,72,141,82,1,73,131,232,1,117,232,73,139,221,73,139,255,102,144,72,59,243,118,43,73,3,222,72,59,222,115,35,73,186,112,137,222,94,149,183,117,147,72,139,214,72,139,203,73,139,196,255,21,106,192,0,0,133,192,126,219,235, + 41,15,31,64,0,73,3,222,73,59,223,119,29,73,186,112,137,222,94,149,183,117,147,72,139,214,72,139,203,73,139,196,255,21,63,192,0,0,133,192,126,219,72,139,239,73,43,254,72,59,254,118,29,73,186,112,137,222,94,149,183,117,147,72,139,214,72,139,207, + 73,139,196,255,21,23,192,0,0,133,192,127,216,72,59,251,114,56,77,139,198,72,139,215,116,30,76,139,203,76,43,207,15,182,2,65,15,182,12,17,65,136,4,17,136,10,72,141,82,1,73,131,232,1,117,232,72,59,247,72,139,195,72,15,69,198,72,139,240,233,70, + 255,255,255,72,59,245,115,40,144,73,43,238,72,59,238,118,31,73,186,112,137,222,94,149,183,117,147,72,139,214,72,139,205,73,139,196,255,21,175,191,0,0,133,192,116,219,235,37,73,43,238,73,59,237,118,29,73,186,112,137,222,94,149,183,117,147,72, + 139,214,72,139,205,73,139,196,255,21,136,191,0,0,133,192,116,219,73,139,207,72,139,197,72,43,203,73,43,197,72,59,193,72,139,76,36,32,124,43,76,59,237,115,21,76,137,108,204,48,72,137,172,204,32,2,0,0,72,255,193,72,137,76,36,32,73,59,223,15,131, + 158,253,255,255,76,139,235,233,3,253,255,255,73,59,223,115,21,72,137,92,204,48,76,137,188,204,32,2,0,0,72,255,193,72,137,76,36,32,76,59,237,15,131,115,253,255,255,76,139,253,233,216,252,255,255,72,139,188,36,48,4,0,0,72,139,180,36,56,4,0,0,72, + 139,172,36,64,4,0,0,72,139,156,36,72,4,0,0,76,139,188,36,40,4,0,0,72,139,140,36,16,4,0,0,72,51,204,232,128,146,255,255,72,129,196,80,4,0,0,65,94,65,93,65,92,195,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,69,51,210,73,139,216,76, + 139,218,77,133,201,117,49,72,133,201,117,49,72,133,210,116,20,232,116,194,255,255,187,22,0,0,0,137,24,232,184,181,255,255,68,139,211,72,139,92,36,48,65,139,194,72,139,116,36,56,72,131,196,32,95,195,72,133,201,116,212,77,133,219,116,207,77,133, + 201,117,5,68,136,17,235,217,72,133,219,117,5,68,136,17,235,187,72,43,217,72,139,209,77,139,195,73,139,249,73,131,249,255,117,20,138,4,19,136,2,72,255,194,132,192,116,177,73,131,232,1,117,238,235,46,138,4,19,72,139,247,136,2,72,255,194,132,192, + 116,154,73,131,232,1,116,6,72,131,239,1,117,229,77,133,192,72,141,70,255,72,15,68,198,72,133,192,117,3,68,136,18,77,133,192,15,133,114,255,255,255,73,131,249,255,117,14,70,136,84,25,255,69,141,80,80,233,94,255,255,255,68,136,17,232,187,193,255, + 255,187,34,0,0,0,233,66,255,255,255,204,72,137,92,36,8,72,137,116,36,16,87,76,139,210,72,141,53,139,204,254,255,65,131,226,15,72,139,250,73,43,250,72,139,218,76,139,193,15,87,219,73,141,66,255,243,15,111,15,72,131,248,14,119,115,139,132,134, + 108,54,1,0,72,3,198,255,224,102,15,115,217,1,235,96,102,15,115,217,2,235,89,102,15,115,217,3,235,82,102,15,115,217,4,235,75,102,15,115,217,5,235,68,102,15,115,217,6,235,61,102,15,115,217,7,235,54,102,15,115,217,8,235,47,102,15,115,217,9,235, + 40,102,15,115,217,10,235,33,102,15,115,217,11,235,26,102,15,115,217,12,235,19,102,15,115,217,13,235,12,102,15,115,217,14,235,5,102,15,115,217,15,15,87,192,65,185,15,0,0,0,102,15,116,193,102,15,215,192,133,192,15,132,51,1,0,0,15,188,208,77,133, + 210,117,6,69,141,89,242,235,20,69,51,219,139,194,185,16,0,0,0,73,43,202,72,59,193,65,15,146,195,65,139,193,43,194,65,59,193,15,135,207,0,0,0,139,140,134,168,54,1,0,72,3,206,255,225,102,15,115,249,1,102,15,115,217,1,233,180,0,0,0,102,15,115,249, + 2,102,15,115,217,2,233,165,0,0,0,102,15,115,249,3,102,15,115,217,3,233,150,0,0,0,102,15,115,249,4,102,15,115,217,4,233,135,0,0,0,102,15,115,249,5,102,15,115,217,5,235,123,102,15,115,249,6,102,15,115,217,6,235,111,102,15,115,249,7,102,15,115, + 217,7,235,99,102,15,115,249,8,102,15,115,217,8,235,87,102,15,115,249,9,102,15,115,217,9,235,75,102,15,115,249,10,102,15,115,217,10,235,63,102,15,115,249,11,102,15,115,217,11,235,51,102,15,115,249,12,102,15,115,217,12,235,39,102,15,115,249,13, + 102,15,115,217,13,235,27,102,15,115,249,14,102,15,115,217,14,235,15,102,15,115,249,15,102,15,115,217,15,235,3,15,87,201,69,133,219,15,133,226,0,0,0,243,15,111,87,16,102,15,111,194,102,15,116,195,102,15,215,192,133,192,117,53,72,139,211,73,139, + 200,72,139,92,36,16,72,139,116,36,24,95,233,211,1,0,0,77,133,210,117,208,68,56,87,1,15,132,168,0,0,0,72,139,92,36,16,72,139,116,36,24,95,233,180,1,0,0,15,188,200,139,193,73,43,194,72,131,192,16,72,131,248,16,119,185,68,43,201,65,131,249,15,119, + 121,66,139,140,142,232,54,1,0,72,3,206,255,225,102,15,115,250,1,235,101,102,15,115,250,2,235,94,102,15,115,250,3,235,87,102,15,115,250,4,235,80,102,15,115,250,5,235,73,102,15,115,250,6,235,66,102,15,115,250,7,235,59,102,15,115,250,8,235,52,102, + 15,115,250,9,235,45,102,15,115,250,10,235,38,102,15,115,250,11,235,31,102,15,115,250,12,235,24,102,15,115,250,13,235,17,102,15,115,250,14,235,10,102,15,115,250,15,235,3,15,87,210,102,15,235,202,65,15,182,0,132,192,116,56,15,31,64,0,15,31,132, + 0,0,0,0,0,15,190,192,102,15,110,192,102,15,96,192,102,15,96,192,102,15,112,192,0,102,15,116,193,102,15,215,192,133,192,117,26,65,15,182,64,1,73,255,192,132,192,117,212,51,192,72,139,92,36,16,72,139,116,36,24,95,195,72,139,92,36,16,73,139,192, + 72,139,116,36,24,95,195,15,31,0,162,51,1,0,169,51,1,0,176,51,1,0,183,51,1,0,190,51,1,0,197,51,1,0,204,51,1,0,211,51,1,0,218,51,1,0,225,51,1,0,232,51,1,0,239,51,1,0,246,51,1,0,253,51,1,0,4,52,1,0,94,52,1,0,109,52,1,0,124,52,1,0,139,52,1,0,154, + 52,1,0,166,52,1,0,178,52,1,0,190,52,1,0,202,52,1,0,214,52,1,0,226,52,1,0,238,52,1,0,250,52,1,0,6,53,1,0,18,53,1,0,30,53,1,0,156,53,1,0,163,53,1,0,170,53,1,0,177,53,1,0,184,53,1,0,191,53,1,0,198,53,1,0,205,53,1,0,212,53,1,0,219,53,1,0,226,53, + 1,0,233,53,1,0,240,53,1,0,247,53,1,0,254,53,1,0,5,54,1,0,72,131,236,88,72,139,5,245,232,0,0,72,51,196,72,137,68,36,64,51,192,76,139,202,72,131,248,32,76,139,193,115,119,198,68,4,32,0,72,255,192,72,131,248,32,124,240,138,2,235,31,15,182,208,72, + 193,234,3,15,182,192,131,224,7,15,182,76,20,32,15,171,193,73,255,193,136,76,20,32,65,138,1,132,192,117,221,235,31,65,15,182,193,186,1,0,0,0,65,15,182,201,131,225,7,72,193,232,3,211,226,132,84,4,32,117,31,73,255,192,69,138,8,69,132,201,117,217, + 51,192,72,139,76,36,64,72,51,204,232,42,141,255,255,72,131,196,88,195,73,139,192,235,233,232,179,215,255,255,204,204,204,69,51,192,233,0,0,0,0,72,137,92,36,8,87,72,131,236,64,72,139,218,72,139,249,72,133,201,117,20,232,38,189,255,255,199,0,22, + 0,0,0,232,107,176,255,255,51,192,235,96,72,133,219,116,231,72,59,251,115,242,73,139,208,72,141,76,36,32,232,244,73,255,255,72,139,76,36,48,72,141,83,255,131,121,8,0,116,36,72,255,202,72,59,250,119,10,15,182,2,246,68,8,25,4,117,238,72,139,203, + 72,43,202,72,139,211,131,225,1,72,43,209,72,255,202,128,124,36,56,0,116,12,72,139,76,36,32,131,161,168,3,0,0,253,72,139,194,72,139,92,36,80,72,131,196,64,95,195,72,131,236,40,72,133,201,117,25,232,158,188,255,255,199,0,22,0,0,0,232,227,175,255, + 255,72,131,200,255,72,131,196,40,195,76,139,193,51,210,72,139,13,102,250,0,0,72,131,196,40,72,255,37,83,192,0,0,204,204,204,72,137,92,36,8,87,72,131,236,32,72,139,218,72,139,249,72,133,201,117,10,72,139,202,232,207,208,255,255,235,31,72,133, + 219,117,7,232,127,174,255,255,235,17,72,131,251,224,118,45,232,58,188,255,255,199,0,12,0,0,0,51,192,72,139,92,36,48,72,131,196,32,95,195,232,106,245,255,255,133,192,116,223,72,139,203,232,58,54,255,255,133,192,116,211,72,139,13,243,249,0,0,76, + 139,203,76,139,199,51,210,255,21,213,191,0,0,72,133,192,116,209,235,196,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36,24,87,72,131,236,80,73,99,217,73,139,248,139,242,72,139,233,69,133,201,126,20,72,139,211,73,139,200,232,53,84,255,255, + 59,195,141,88,1,124,2,139,216,72,131,100,36,64,0,68,139,203,72,131,100,36,56,0,76,139,199,72,131,100,36,48,0,139,214,139,132,36,136,0,0,0,72,139,205,137,68,36,40,72,139,132,36,128,0,0,0,72,137,68,36,32,232,74,148,255,255,72,139,92,36,96,72,139, + 108,36,104,72,139,116,36,112,72,131,196,80,95,195,204,72,133,201,15,132,0,1,0,0,83,72,131,236,32,72,139,217,72,139,73,24,72,59,13,136,238,0,0,116,5,232,129,173,255,255,72,139,75,32,72,59,13,126,238,0,0,116,5,232,111,173,255,255,72,139,75,40, + 72,59,13,116,238,0,0,116,5,232,93,173,255,255,72,139,75,48,72,59,13,106,238,0,0,116,5,232,75,173,255,255,72,139,75,56,72,59,13,96,238,0,0,116,5,232,57,173,255,255,72,139,75,64,72,59,13,86,238,0,0,116,5,232,39,173,255,255,72,139,75,72,72,59,13, + 76,238,0,0,116,5,232,21,173,255,255,72,139,75,104,72,59,13,90,238,0,0,116,5,232,3,173,255,255,72,139,75,112,72,59,13,80,238,0,0,116,5,232,241,172,255,255,72,139,75,120,72,59,13,70,238,0,0,116,5,232,223,172,255,255,72,139,139,128,0,0,0,72,59, + 13,57,238,0,0,116,5,232,202,172,255,255,72,139,139,136,0,0,0,72,59,13,44,238,0,0,116,5,232,181,172,255,255,72,139,139,144,0,0,0,72,59,13,31,238,0,0,116,5,232,160,172,255,255,72,131,196,32,91,195,204,204,72,133,201,116,102,83,72,131,236,32,72, + 139,217,72,139,9,72,59,13,105,237,0,0,116,5,232,122,172,255,255,72,139,75,8,72,59,13,95,237,0,0,116,5,232,104,172,255,255,72,139,75,16,72,59,13,85,237,0,0,116,5,232,86,172,255,255,72,139,75,88,72,59,13,139,237,0,0,116,5,232,68,172,255,255,72, + 139,75,96,72,59,13,129,237,0,0,116,5,232,50,172,255,255,72,131,196,32,91,195,72,133,201,15,132,254,0,0,0,72,137,92,36,8,72,137,108,36,16,86,72,131,236,32,189,7,0,0,0,72,139,217,139,213,232,225,0,0,0,72,141,75,56,139,213,232,214,0,0,0,141,117, + 5,139,214,72,141,75,112,232,200,0,0,0,72,141,139,208,0,0,0,139,214,232,186,0,0,0,72,141,139,48,1,0,0,141,85,251,232,171,0,0,0,72,139,139,64,1,0,0,232,195,171,255,255,72,139,139,72,1,0,0,232,183,171,255,255,72,139,139,80,1,0,0,232,171,171,255, + 255,72,141,139,96,1,0,0,139,213,232,121,0,0,0,72,141,139,152,1,0,0,139,213,232,107,0,0,0,72,141,139,208,1,0,0,139,214,232,93,0,0,0,72,141,139,48,2,0,0,139,214,232,79,0,0,0,72,141,139,144,2,0,0,141,85,251,232,64,0,0,0,72,139,139,160,2,0,0,232, + 88,171,255,255,72,139,139,168,2,0,0,232,76,171,255,255,72,139,139,176,2,0,0,232,64,171,255,255,72,139,139,184,2,0,0,232,52,171,255,255,72,139,92,36,48,72,139,108,36,56,72,131,196,32,94,195,72,137,92,36,8,87,72,131,236,32,72,141,60,209,72,139, + 217,72,59,207,116,17,72,139,11,232,6,171,255,255,72,131,195,8,72,59,223,117,239,72,139,92,36,48,72,131,196,32,95,195,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,72,43,209,73,131,248,8,114,34,246, + 193,7,116,20,102,144,138,1,58,4,17,117,44,72,255,193,73,255,200,246,193,7,117,238,77,139,200,73,193,233,3,117,31,77,133,192,116,15,138,1,58,4,17,117,12,72,255,193,73,255,200,117,241,72,51,192,195,27,192,131,216,255,195,144,73,193,233,2,116,55, + 72,139,1,72,59,4,17,117,91,72,139,65,8,72,59,68,17,8,117,76,72,139,65,16,72,59,68,17,16,117,61,72,139,65,24,72,59,68,17,24,117,46,72,131,193,32,73,255,201,117,205,73,131,224,31,77,139,200,73,193,233,3,116,155,72,139,1,72,59,4,17,117,27,72,131, + 193,8,73,255,201,117,238,73,131,224,7,235,131,72,131,193,8,72,131,193,8,72,131,193,8,72,139,12,10,72,15,200,72,15,201,72,59,193,27,192,131,216,255,195,204,72,255,37,129,187,0,0,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120, + 32,65,86,72,131,236,48,69,51,246,73,139,217,73,139,232,72,139,242,72,139,249,72,133,210,15,132,35,1,0,0,77,133,192,15,132,26,1,0,0,68,56,50,117,18,72,133,201,15,132,19,1,0,0,102,68,137,49,233,10,1,0,0,69,56,113,40,117,8,72,139,203,232,33,70, + 255,255,72,139,83,24,68,139,82,12,65,129,250,233,253,0,0,117,39,76,141,13,201,255,0,0,72,137,92,36,32,76,139,197,72,139,214,72,139,207,232,114,2,0,0,131,201,255,133,192,15,72,193,233,198,0,0,0,76,57,178,56,1,0,0,117,20,72,133,255,15,132,164, + 0,0,0,15,182,6,102,137,7,233,153,0,0,0,15,182,14,72,139,2,102,68,57,52,72,125,97,68,139,74,8,65,131,249,1,126,43,65,59,233,124,38,65,139,198,72,133,255,76,139,198,186,9,0,0,0,15,149,192,65,139,202,137,68,36,40,72,137,124,36,32,232,242,197,255, + 255,133,192,117,19,72,139,67,24,72,99,72,8,72,59,233,114,15,68,56,118,1,116,9,72,139,67,24,139,64,8,235,75,198,67,48,1,131,200,255,199,67,44,42,0,0,0,235,59,65,139,198,65,185,1,0,0,0,72,133,255,76,139,198,65,139,202,15,149,192,137,68,36,40,65, + 141,81,8,72,137,124,36,32,232,155,197,255,255,133,192,116,197,184,1,0,0,0,235,9,76,137,53,229,254,0,0,51,192,72,139,92,36,64,72,139,108,36,72,72,139,116,36,80,72,139,124,36,88,72,131,196,48,65,94,195,76,139,218,76,139,209,77,133,192,117,3,51, + 192,195,65,15,183,10,77,141,82,2,65,15,183,19,77,141,91,2,141,65,191,131,248,25,68,141,73,32,141,66,191,68,15,71,201,131,248,25,141,74,32,65,139,193,15,71,202,43,193,117,11,69,133,201,116,6,73,131,232,1,117,196,195,204,139,5,126,254,0,0,195, + 204,204,204,204,204,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,72,131,236,16,76,137,20,36,76,137,92,36,8,77,51,219,76,141,84,36,24,76,43,208,77,15,66,211,101,76,139,28,37,16,0,0,0,77,59,211,115,22,102,65,129,226,0,240,77,141,155,0,240, + 255,255,65,198,3,0,77,59,211,117,240,76,139,20,36,76,139,92,36,8,72,131,196,16,195,204,204,51,192,56,1,116,14,72,59,194,116,9,72,255,192,128,60,8,0,117,242,195,204,204,204,233,3,0,0,0,204,204,204,72,137,92,36,8,72,137,108,36,16,72,137,116,36, + 24,87,72,131,236,48,72,99,249,73,139,217,139,207,65,139,240,72,139,234,232,53,215,255,255,72,131,248,255,117,17,198,67,48,1,199,67,44,9,0,0,0,72,131,200,255,235,86,68,139,206,76,141,68,36,32,72,139,213,72,139,200,255,21,214,185,0,0,133,192,117, + 18,255,21,140,184,0,0,139,200,72,139,211,232,234,181,255,255,235,208,72,139,68,36,32,72,131,248,255,116,197,72,139,215,76,141,5,243,242,0,0,131,226,63,72,139,207,72,193,249,6,72,141,20,210,73,139,12,200,128,100,209,56,253,72,139,92,36,64,72, + 139,108,36,72,72,139,116,36,80,72,131,196,48,95,195,204,204,204,64,83,72,131,236,64,72,139,68,36,112,72,139,217,72,141,76,36,48,72,137,68,36,32,232,67,4,0,0,72,131,248,4,119,26,139,84,36,48,185,253,255,0,0,129,250,255,255,0,0,15,71,209,72,133, + 219,116,3,102,137,19,72,131,196,64,91,195,204,72,137,92,36,16,72,137,108,36,24,87,65,84,65,85,65,86,65,87,72,131,236,48,72,139,58,51,192,77,139,225,73,139,232,76,139,250,76,139,241,72,133,201,15,132,231,0,0,0,72,139,217,77,133,192,15,132,176, + 0,0,0,76,139,172,36,128,0,0,0,56,7,117,8,65,184,1,0,0,0,235,28,56,71,1,117,8,65,184,2,0,0,0,235,15,138,71,2,246,216,77,27,192,73,247,216,73,131,192,3,77,139,204,76,137,108,36,32,72,139,215,72,141,76,36,96,232,154,3,0,0,72,139,208,72,131,248, + 255,116,123,51,192,72,133,210,116,108,139,76,36,96,129,249,255,255,0,0,118,59,72,131,253,1,118,73,129,193,0,0,255,255,65,184,0,216,0,0,139,193,137,76,36,96,193,232,10,72,255,205,102,65,11,192,102,137,3,184,255,3,0,0,102,35,200,72,131,195,2,184, + 0,220,0,0,102,11,200,51,192,102,137,11,72,3,250,72,131,195,2,72,131,237,1,15,133,88,255,255,255,73,43,222,73,137,63,72,209,251,72,139,195,233,140,0,0,0,72,139,248,102,137,3,235,231,73,137,63,65,198,69,48,1,65,199,69,44,42,0,0,0,235,110,72,139, + 172,36,128,0,0,0,72,139,216,56,7,117,8,65,184,1,0,0,0,235,28,56,71,1,117,8,65,184,2,0,0,0,235,15,138,71,2,246,216,77,27,192,73,247,216,73,131,192,3,77,139,204,72,137,108,36,32,72,139,215,51,201,232,191,2,0,0,72,131,248,255,116,24,72,133,192, + 116,142,72,131,248,4,117,3,72,255,195,72,3,248,72,255,195,51,192,235,168,198,69,48,1,199,69,44,42,0,0,0,72,131,200,255,72,139,92,36,104,72,139,108,36,112,72,131,196,48,65,95,65,94,65,93,65,92,95,195,204,204,102,137,76,36,8,72,131,236,40,232, + 70,4,0,0,133,192,116,31,76,141,68,36,56,186,1,0,0,0,72,141,76,36,48,232,130,4,0,0,133,192,116,7,15,183,68,36,48,235,5,184,255,255,0,0,72,131,196,40,195,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,72,137,120,32,65,86,72,131,236,32, + 73,139,89,56,72,139,242,77,139,240,72,139,233,73,139,209,72,139,206,73,139,249,76,141,67,4,232,180,129,255,255,139,69,4,36,102,246,216,184,1,0,0,0,69,27,192,65,247,216,68,3,192,68,133,67,4,116,17,76,139,207,77,139,198,72,139,214,72,139,205,232, + 244,32,255,255,72,139,92,36,48,72,139,108,36,56,72,139,116,36,64,72,139,124,36,72,72,131,196,32,65,94,195,204,72,137,92,36,8,72,137,124,36,16,85,72,139,236,72,131,236,96,72,131,101,192,0,131,61,178,244,0,0,0,198,69,208,0,198,69,232,0,198,69, + 240,0,198,69,248,0,117,16,15,16,5,209,227,0,0,198,69,232,1,243,15,127,69,216,72,141,85,192,232,247,0,0,0,128,125,232,2,139,248,117,11,72,139,77,192,131,161,168,3,0,0,253,128,125,240,0,116,15,139,93,236,72,141,77,192,232,2,64,255,255,137,88,32, + 128,125,248,0,116,15,139,93,244,72,141,77,192,232,237,63,255,255,137,88,36,72,139,92,36,112,139,199,72,139,124,36,120,72,131,196,96,93,195,72,139,196,72,137,88,8,72,137,112,16,87,72,131,236,48,72,139,250,72,139,217,72,133,201,117,37,72,137,80, + 240,69,51,201,72,33,72,232,69,51,192,198,66,48,1,199,66,44,22,0,0,0,51,210,232,121,166,255,255,131,200,255,235,85,139,65,20,131,206,255,193,232,13,144,168,1,116,61,232,213,172,255,255,72,139,203,139,240,232,223,233,255,255,72,139,203,232,203, + 220,255,255,139,200,72,139,215,232,149,4,0,0,133,192,121,5,131,206,255,235,19,72,139,75,40,72,133,201,116,10,232,74,163,255,255,72,131,99,40,0,72,139,203,232,173,5,0,0,139,198,72,139,92,36,64,72,139,116,36,72,72,131,196,48,95,195,204,204,204, + 72,139,196,72,137,88,16,72,137,72,8,87,72,131,236,48,72,139,250,72,139,217,72,133,201,117,46,198,66,48,1,199,66,44,22,0,0,0,72,137,80,240,72,33,72,232,69,51,201,69,51,192,51,210,232,209,165,255,255,131,200,255,72,139,92,36,72,72,131,196,48,95, + 195,139,65,20,144,193,232,12,36,1,116,7,232,63,5,0,0,235,224,232,140,174,255,255,144,72,139,215,72,139,203,232,236,254,255,255,139,248,72,139,203,232,130,174,255,255,139,199,235,196,204,204,64,83,85,86,87,65,84,65,86,65,87,72,131,236,64,72,139, + 5,118,219,0,0,72,51,196,72,137,68,36,48,72,139,180,36,160,0,0,0,76,141,21,199,248,0,0,69,51,219,72,141,61,95,42,0,0,77,133,201,72,139,194,76,139,226,77,15,69,209,72,133,210,65,141,107,1,72,15,69,250,68,139,253,77,15,69,248,72,247,216,77,27,246, + 76,35,241,77,133,255,117,12,72,199,192,254,255,255,255,233,77,1,0,0,102,69,57,90,6,117,104,68,15,182,15,72,255,199,69,132,201,120,23,77,133,246,116,3,69,137,14,69,132,201,65,15,149,195,73,139,195,233,35,1,0,0,65,138,193,36,224,60,192,117,5,65, + 176,2,235,30,65,138,193,36,240,60,224,117,5,65,176,3,235,16,65,138,193,36,248,60,240,15,133,239,0,0,0,65,176,4,65,15,182,192,185,7,0,0,0,43,200,139,213,211,226,65,138,216,43,213,65,35,209,235,41,69,138,66,4,65,139,18,65,138,90,6,65,141,64,254, + 60,2,15,135,188,0,0,0,64,58,221,15,130,179,0,0,0,65,58,216,15,131,170,0,0,0,15,182,235,73,59,239,68,139,205,77,15,67,207,235,30,15,182,15,72,255,199,138,193,36,192,60,128,15,133,137,0,0,0,139,194,131,225,63,193,224,6,139,209,11,208,72,139,199, + 73,43,196,73,59,193,114,215,76,59,205,115,28,65,15,182,192,65,42,217,102,65,137,66,4,15,182,195,102,65,137,66,6,65,137,18,233,3,255,255,255,141,130,0,40,255,255,61,255,7,0,0,118,68,129,250,0,0,17,0,115,60,65,15,182,192,199,68,36,32,128,0,0,0, + 199,68,36,36,0,8,0,0,199,68,36,40,0,0,1,0,59,84,132,24,114,26,77,133,246,116,3,65,137,22,247,218,73,139,210,72,27,201,72,35,205,232,84,9,0,0,235,11,72,139,214,73,139,202,232,51,9,0,0,72,139,76,36,48,72,51,204,232,122,126,255,255,72,131,196,64, + 65,95,65,94,65,92,95,94,93,91,195,204,204,204,64,83,72,131,236,64,72,139,5,75,227,0,0,51,219,72,131,248,254,117,46,72,137,92,36,48,68,141,67,3,137,92,36,40,72,141,13,47,121,0,0,69,51,201,68,137,68,36,32,186,0,0,0,64,255,21,228,176,0,0,72,137, + 5,21,227,0,0,72,131,248,255,15,149,195,139,195,72,131,196,64,91,195,204,204,72,139,196,72,137,88,8,72,137,104,16,72,137,112,24,87,72,131,236,64,72,131,96,216,0,73,139,248,77,139,200,139,242,68,139,194,72,139,233,72,139,209,72,139,13,211,226, + 0,0,255,21,37,179,0,0,139,216,133,192,117,106,255,21,105,177,0,0,131,248,6,117,95,72,139,13,181,226,0,0,72,131,249,253,119,6,255,21,97,176,0,0,72,131,100,36,48,0,72,141,13,156,120,0,0,131,100,36,40,0,65,184,3,0,0,0,69,51,201,68,137,68,36,32, + 186,0,0,0,64,255,21,70,176,0,0,72,131,100,36,32,0,76,139,207,72,139,200,72,137,5,107,226,0,0,68,139,198,72,139,213,255,21,183,178,0,0,139,216,72,139,108,36,88,139,195,72,139,92,36,80,72,139,116,36,96,72,131,196,64,95,195,204,204,204,204,204, + 204,72,131,236,40,72,139,13,53,226,0,0,72,131,249,253,119,6,255,21,225,175,0,0,72,131,196,40,195,72,137,92,36,8,72,137,116,36,16,87,72,131,236,32,72,99,249,72,139,242,139,207,232,36,207,255,255,72,131,248,255,117,4,51,219,235,90,72,139,5,39, + 235,0,0,185,2,0,0,0,131,255,1,117,9,64,132,184,200,0,0,0,117,13,59,249,117,32,246,128,128,0,0,0,1,116,23,232,238,206,255,255,185,1,0,0,0,72,139,216,232,225,206,255,255,72,59,195,116,190,139,207,232,213,206,255,255,72,139,200,255,21,104,175,0, + 0,133,192,117,170,255,21,78,176,0,0,139,216,139,207,232,49,207,255,255,72,139,215,76,141,5,195,234,0,0,131,226,63,72,139,207,72,193,249,6,72,141,20,210,73,139,12,200,198,68,209,56,0,133,219,116,15,72,139,214,139,203,232,126,173,255,255,131,200, + 255,235,2,51,192,72,139,92,36,48,72,139,116,36,56,72,131,196,32,95,195,204,204,204,137,76,36,8,72,131,236,88,76,99,193,69,51,201,65,131,248,254,117,24,198,66,56,1,68,137,74,52,198,66,48,1,199,66,44,9,0,0,0,233,141,0,0,0,133,201,120,96,68,59, + 5,77,238,0,0,115,87,73,139,200,76,141,21,65,234,0,0,131,225,63,73,139,192,72,193,248,6,72,141,12,201,73,139,4,194,246,68,200,56,1,116,52,72,141,68,36,96,72,137,84,36,64,68,137,68,36,120,72,141,84,36,48,68,137,68,36,48,76,141,76,36,120,76,141, + 68,36,56,72,137,68,36,56,72,141,76,36,112,232,54,0,0,0,235,44,198,66,56,1,69,51,192,68,137,74,52,51,201,198,66,48,1,72,137,84,36,40,199,66,44,9,0,0,0,51,210,76,137,76,36,32,232,247,160,255,255,131,200,255,72,131,196,88,195,204,204,204,72,137, + 92,36,8,76,137,76,36,32,87,72,131,236,32,73,139,249,73,139,216,139,10,232,100,208,255,255,144,72,139,3,72,99,8,76,139,209,72,139,83,8,72,139,193,72,193,248,6,76,141,13,136,233,0,0,65,131,226,63,79,141,4,210,73,139,4,193,66,246,68,192,56,1,116, + 9,232,27,254,255,255,139,216,235,14,198,66,48,1,199,66,44,9,0,0,0,131,203,255,139,15,232,62,208,255,255,139,195,72,139,92,36,48,72,131,196,32,95,195,204,131,73,24,255,51,192,72,137,1,72,137,65,8,137,65,16,72,137,65,28,72,137,65,40,135,65,20, + 195,204,204,204,204,204,204,204,204,204,204,204,204,72,131,236,88,102,15,127,116,36,32,131,61,171,243,0,0,0,15,133,233,2,0,0,102,15,40,216,102,15,40,224,102,15,115,211,52,102,72,15,126,192,102,15,251,29,15,118,0,0,102,15,40,232,102,15,84,45, + 211,117,0,0,102,15,47,45,203,117,0,0,15,132,133,2,0,0,102,15,40,208,243,15,230,243,102,15,87,237,102,15,47,197,15,134,47,2,0,0,102,15,219,21,247,117,0,0,242,15,92,37,127,118,0,0,102,15,47,53,7,119,0,0,15,132,216,1,0,0,102,15,84,37,89,119,0,0, + 76,139,200,72,35,5,223,117,0,0,76,35,13,232,117,0,0,73,209,225,73,3,193,102,72,15,110,200,102,15,47,37,245,118,0,0,15,130,223,0,0,0,72,193,232,44,102,15,235,21,67,118,0,0,102,15,235,13,59,118,0,0,76,141,13,164,135,0,0,242,15,92,202,242,65,15, + 89,12,193,102,15,40,209,102,15,40,193,76,141,13,107,119,0,0,242,15,16,29,131,118,0,0,242,15,16,13,75,118,0,0,242,15,89,218,242,15,89,202,242,15,89,194,102,15,40,224,242,15,88,29,83,118,0,0,242,15,88,13,27,118,0,0,242,15,89,224,242,15,89,218, + 242,15,89,200,242,15,88,29,39,118,0,0,242,15,88,202,242,15,89,220,242,15,88,203,242,15,16,45,147,117,0,0,242,15,89,13,75,117,0,0,242,15,89,238,242,15,92,233,242,65,15,16,4,193,72,141,21,6,127,0,0,242,15,16,20,194,242,15,16,37,89,117,0,0,242, + 15,89,230,242,15,88,196,242,15,88,213,242,15,88,194,102,15,111,116,36,32,72,131,196,88,195,102,102,102,102,102,102,15,31,132,0,0,0,0,0,242,15,16,21,72,117,0,0,242,15,92,5,80,117,0,0,242,15,88,208,102,15,40,200,242,15,94,202,242,15,16,37,76,118, + 0,0,242,15,16,45,100,118,0,0,102,15,40,240,242,15,89,241,242,15,88,201,102,15,40,209,242,15,89,209,242,15,89,226,242,15,89,234,242,15,88,37,16,118,0,0,242,15,88,45,40,118,0,0,242,15,89,209,242,15,89,226,242,15,89,210,242,15,89,209,242,15,89, + 234,242,15,16,21,172,116,0,0,242,15,88,229,242,15,92,230,242,15,16,53,140,116,0,0,102,15,40,216,102,15,219,29,16,118,0,0,242,15,92,195,242,15,88,224,102,15,40,195,102,15,40,204,242,15,89,226,242,15,89,194,242,15,89,206,242,15,89,222,242,15,88, + 196,242,15,88,193,242,15,88,195,102,15,111,116,36,32,72,131,196,88,195,102,15,235,21,145,116,0,0,242,15,92,21,137,116,0,0,242,15,16,234,102,15,219,21,237,115,0,0,102,72,15,126,208,102,15,115,213,52,102,15,250,45,11,117,0,0,243,15,230,245,233, + 241,253,255,255,102,144,117,30,242,15,16,13,102,115,0,0,68,139,5,159,117,0,0,232,138,6,0,0,235,72,15,31,132,0,0,0,0,0,242,15,16,13,104,115,0,0,68,139,5,133,117,0,0,232,108,6,0,0,235,42,102,102,15,31,132,0,0,0,0,0,72,59,5,57,115,0,0,116,23,72, + 59,5,32,115,0,0,116,206,72,11,5,71,115,0,0,102,72,15,110,192,102,144,102,15,111,116,36,32,72,131,196,88,195,15,31,68,0,0,72,51,192,197,225,115,208,52,196,225,249,126,192,197,225,251,29,43,115,0,0,197,250,230,243,197,249,219,45,239,114,0,0,197, + 249,47,45,231,114,0,0,15,132,65,2,0,0,197,209,239,237,197,249,47,197,15,134,227,1,0,0,197,249,219,21,27,115,0,0,197,251,92,37,163,115,0,0,197,249,47,53,43,116,0,0,15,132,142,1,0,0,197,249,219,13,13,115,0,0,197,249,219,29,21,115,0,0,197,225,115, + 243,1,197,225,212,201,196,225,249,126,200,197,217,219,37,95,116,0,0,197,249,47,37,23,116,0,0,15,130,177,0,0,0,72,193,232,44,197,233,235,21,101,115,0,0,197,241,235,13,93,115,0,0,76,141,13,198,132,0,0,197,243,92,202,196,193,115,89,12,193,76,141, + 13,149,116,0,0,197,243,89,193,197,251,16,29,169,115,0,0,197,251,16,45,113,115,0,0,196,226,241,169,29,136,115,0,0,196,226,241,169,45,31,115,0,0,242,15,16,224,196,226,241,169,29,98,115,0,0,197,251,89,224,196,226,209,185,200,196,226,225,185,204, + 197,243,89,13,140,114,0,0,197,251,16,45,196,114,0,0,196,226,201,171,233,242,65,15,16,4,193,72,141,21,66,124,0,0,242,15,16,20,194,197,235,88,213,196,226,201,185,5,144,114,0,0,197,251,88,194,197,249,111,116,36,32,72,131,196,88,195,144,197,251, + 16,21,152,114,0,0,197,251,92,5,160,114,0,0,197,235,88,208,197,251,94,202,197,251,16,37,160,115,0,0,197,251,16,45,184,115,0,0,197,251,89,241,197,243,88,201,197,243,89,209,196,226,233,169,37,115,115,0,0,196,226,233,169,45,138,115,0,0,197,235,89, + 209,197,219,89,226,197,235,89,210,197,235,89,209,197,211,89,234,197,219,88,229,197,219,92,230,197,249,219,29,134,115,0,0,197,251,92,195,197,219,88,224,197,219,89,13,230,113,0,0,197,219,89,37,238,113,0,0,197,227,89,5,230,113,0,0,197,227,89,29, + 206,113,0,0,197,251,88,196,197,251,88,193,197,251,88,195,197,249,111,116,36,32,72,131,196,88,195,197,233,235,21,255,113,0,0,197,235,92,21,247,113,0,0,197,209,115,210,52,197,233,219,21,90,113,0,0,197,249,40,194,197,209,250,45,126,114,0,0,197, + 250,230,245,233,64,254,255,255,15,31,68,0,0,117,46,197,251,16,13,214,112,0,0,68,139,5,15,115,0,0,232,250,3,0,0,197,249,111,116,36,32,72,131,196,88,195,102,102,102,102,102,102,102,15,31,132,0,0,0,0,0,197,251,16,13,200,112,0,0,68,139,5,229,114, + 0,0,232,204,3,0,0,197,249,111,116,36,32,72,131,196,88,195,144,72,59,5,153,112,0,0,116,39,72,59,5,128,112,0,0,116,206,72,11,5,167,112,0,0,102,72,15,110,200,68,139,5,179,114,0,0,232,150,3,0,0,235,4,15,31,64,0,197,249,111,116,36,32,72,131,196,88, + 195,204,72,131,33,0,72,131,200,255,198,66,48,1,199,66,44,42,0,0,0,195,72,131,34,0,72,139,193,195,72,139,196,83,72,131,236,80,242,15,16,132,36,128,0,0,0,139,217,242,15,16,140,36,136,0,0,0,186,192,255,0,0,137,72,200,72,139,140,36,144,0,0,0,242, + 15,17,64,224,242,15,17,72,232,242,15,17,88,216,76,137,64,208,232,36,7,0,0,72,141,76,36,32,232,146,159,255,255,133,192,117,7,139,203,232,143,3,0,0,242,15,16,68,36,64,72,131,196,80,91,195,204,204,204,72,137,92,36,8,72,137,116,36,16,87,72,131,236, + 32,139,217,72,139,242,131,227,31,139,249,246,193,8,116,20,64,132,246,121,15,185,1,0,0,0,232,99,7,0,0,131,227,247,235,87,185,4,0,0,0,64,132,249,116,17,72,15,186,230,9,115,10,232,72,7,0,0,131,227,251,235,60,64,246,199,1,116,22,72,15,186,230,10, + 115,15,185,8,0,0,0,232,44,7,0,0,131,227,254,235,32,64,246,199,2,116,26,72,15,186,230,11,115,19,64,246,199,16,116,10,185,16,0,0,0,232,10,7,0,0,131,227,253,64,246,199,16,116,20,72,15,186,230,12,115,13,185,32,0,0,0,232,240,6,0,0,131,227,239,72, + 139,116,36,56,51,192,133,219,72,139,92,36,48,15,148,192,72,131,196,32,95,195,204,204,72,139,196,85,83,86,87,65,86,72,141,104,201,72,129,236,224,0,0,0,15,41,112,200,72,139,5,61,207,0,0,72,51,196,72,137,69,239,139,242,76,139,241,186,192,255,0, + 0,185,128,31,0,0,65,139,249,73,139,216,232,4,6,0,0,139,77,95,72,137,68,36,72,72,137,92,36,64,242,15,16,68,36,64,72,139,84,36,72,242,15,17,68,36,64,232,225,254,255,255,242,15,16,117,119,133,192,117,64,131,125,127,2,117,17,139,69,191,131,224,227, + 242,15,17,117,175,131,200,3,137,69,191,68,139,69,95,72,141,68,36,64,72,137,68,36,40,72,141,84,36,72,72,141,69,111,68,139,206,72,141,76,36,80,72,137,68,36,32,232,72,2,0,0,232,235,157,255,255,132,192,116,52,133,255,116,48,72,139,68,36,72,77,139, + 198,242,15,16,68,36,64,139,207,242,15,16,93,111,139,85,103,72,137,68,36,48,242,15,17,68,36,40,242,15,17,116,36,32,232,245,253,255,255,235,28,139,207,232,212,1,0,0,72,139,76,36,72,186,192,255,0,0,232,69,5,0,0,242,15,16,68,36,64,72,139,77,239, + 72,51,204,232,3,115,255,255,15,40,180,36,208,0,0,0,72,129,196,224,0,0,0,65,94,95,94,91,93,195,204,204,204,204,204,204,204,204,204,204,204,204,204,64,83,72,131,236,16,69,51,192,51,201,68,137,5,134,235,0,0,69,141,72,1,65,139,193,15,162,137,4,36, + 184,0,16,0,24,137,76,36,8,35,200,137,92,36,4,137,84,36,12,59,200,117,44,51,201,15,1,208,72,193,226,32,72,11,208,72,137,84,36,32,72,139,68,36,32,68,139,5,70,235,0,0,36,6,60,6,69,15,68,193,68,137,5,55,235,0,0,68,137,5,52,235,0,0,51,192,72,131, + 196,16,91,195,72,139,196,72,131,236,104,15,41,112,232,15,40,241,65,139,209,15,40,216,65,131,232,1,116,42,65,131,248,1,117,105,68,137,64,216,15,87,210,242,15,17,80,208,69,139,200,242,15,17,64,200,199,64,192,33,0,0,0,199,64,184,8,0,0,0,235,45, + 199,68,36,64,1,0,0,0,15,87,192,242,15,17,68,36,56,65,185,2,0,0,0,242,15,17,92,36,48,199,68,36,40,34,0,0,0,199,68,36,32,4,0,0,0,72,139,140,36,144,0,0,0,242,15,17,116,36,120,76,139,68,36,120,232,211,253,255,255,15,40,198,15,40,116,36,80,72,131, + 196,104,195,204,204,204,204,204,204,204,204,204,204,72,131,236,56,72,141,5,69,135,0,0,65,185,27,0,0,0,72,137,68,36,32,232,69,255,255,255,72,131,196,56,195,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,72,131,236,8,15,174,28,36,139,4,36, + 72,131,196,8,195,137,76,36,8,15,174,84,36,8,195,15,174,92,36,8,185,192,255,255,255,33,76,36,8,15,174,84,36,8,195,102,15,46,5,250,134,0,0,115,20,102,15,46,5,248,134,0,0,118,10,242,72,15,45,200,242,72,15,42,193,195,204,204,204,72,131,236,40,131, + 233,1,116,23,131,233,1,116,5,131,249,1,117,24,232,104,161,255,255,199,0,34,0,0,0,235,11,232,91,161,255,255,199,0,33,0,0,0,72,131,196,40,195,72,131,236,72,131,100,36,48,0,72,139,68,36,120,72,137,68,36,40,72,139,68,36,112,72,137,68,36,32,232,6, + 0,0,0,72,131,196,72,195,204,72,139,196,72,137,88,16,72,137,112,24,72,137,120,32,72,137,72,8,85,72,139,236,72,131,236,32,72,139,218,65,139,241,51,210,191,13,0,0,192,137,81,4,72,139,69,16,137,80,8,72,139,69,16,137,80,12,65,246,192,16,116,13,72, + 139,69,16,191,143,0,0,192,131,72,4,1,65,246,192,2,116,13,72,139,69,16,191,147,0,0,192,131,72,4,2,65,246,192,1,116,13,72,139,69,16,191,145,0,0,192,131,72,4,4,65,246,192,4,116,13,72,139,69,16,191,142,0,0,192,131,72,4,8,65,246,192,8,116,13,72,139, + 69,16,191,144,0,0,192,131,72,4,16,72,139,77,16,72,139,3,72,193,232,7,193,224,4,247,208,51,65,8,131,224,16,49,65,8,72,139,77,16,72,139,3,72,193,232,9,193,224,3,247,208,51,65,8,131,224,8,49,65,8,72,139,77,16,72,139,3,72,193,232,10,193,224,2,247, + 208,51,65,8,131,224,4,49,65,8,72,139,77,16,72,139,3,72,193,232,11,3,192,247,208,51,65,8,131,224,2,49,65,8,139,3,72,139,77,16,72,193,232,12,247,208,51,65,8,131,224,1,49,65,8,232,143,2,0,0,72,139,208,168,1,116,8,72,139,77,16,131,73,12,16,246,194, + 4,116,8,72,139,77,16,131,73,12,8,246,194,8,116,8,72,139,69,16,131,72,12,4,246,194,16,116,8,72,139,69,16,131,72,12,2,246,194,32,116,8,72,139,69,16,131,72,12,1,139,3,185,0,96,0,0,72,35,193,116,62,72,61,0,32,0,0,116,38,72,61,0,64,0,0,116,14,72, + 59,193,117,48,72,139,69,16,131,8,3,235,39,72,139,69,16,131,32,254,72,139,69,16,131,8,2,235,23,72,139,69,16,131,32,253,72,139,69,16,131,8,1,235,7,72,139,69,16,131,32,252,72,139,69,16,129,230,255,15,0,0,193,230,5,129,32,31,0,254,255,72,139,69, + 16,9,48,72,139,69,16,72,139,117,56,131,72,32,1,131,125,64,0,116,51,72,139,69,16,186,225,255,255,255,33,80,32,72,139,69,48,139,8,72,139,69,16,137,72,16,72,139,69,16,131,72,96,1,72,139,69,16,33,80,96,72,139,69,16,139,14,137,72,80,235,72,72,139, + 77,16,65,184,227,255,255,255,139,65,32,65,35,192,131,200,2,137,65,32,72,139,69,48,72,139,8,72,139,69,16,72,137,72,16,72,139,69,16,131,72,96,1,72,139,85,16,139,66,96,65,35,192,131,200,2,137,66,96,72,139,69,16,72,139,22,72,137,80,80,232,180,0, + 0,0,51,210,76,141,77,16,139,207,68,141,66,1,255,21,34,163,0,0,72,139,77,16,246,65,8,16,116,5,72,15,186,51,7,246,65,8,8,116,5,72,15,186,51,9,246,65,8,4,116,5,72,15,186,51,10,246,65,8,2,116,5,72,15,186,51,11,246,65,8,1,116,5,72,15,186,51,12,139, + 1,131,224,3,116,48,131,232,1,116,31,131,232,1,116,14,131,248,1,117,40,72,129,11,0,96,0,0,235,31,72,15,186,51,13,72,15,186,43,14,235,19,72,15,186,51,14,72,15,186,43,13,235,7,72,129,35,255,159,255,255,131,125,64,0,116,7,139,65,80,137,6,235,7,72, + 139,65,80,72,137,6,72,139,92,36,56,72,139,116,36,64,72,139,124,36,72,72,131,196,32,93,195,64,83,72,131,236,32,232,69,252,255,255,139,216,131,227,63,232,85,252,255,255,139,195,72,131,196,32,91,195,204,204,204,72,137,92,36,24,72,137,116,36,32, + 87,72,131,236,32,72,139,218,72,139,249,232,22,252,255,255,139,240,137,68,36,56,139,203,247,209,129,201,127,128,255,255,35,200,35,251,11,207,137,76,36,48,128,61,149,210,0,0,0,116,37,246,193,64,116,32,232,249,251,255,255,235,33,198,5,128,210,0, + 0,0,139,76,36,48,131,225,191,232,228,251,255,255,139,116,36,56,235,8,131,225,191,232,214,251,255,255,139,198,72,139,92,36,64,72,139,116,36,72,72,131,196,32,95,195,72,131,236,40,232,171,251,255,255,131,224,63,72,131,196,40,195,204,204,204,64, + 83,72,131,236,32,72,139,217,232,146,251,255,255,131,227,63,11,195,139,200,72,131,196,32,91,233,145,251,255,255,204,204,204,204,204,204,204,102,102,15,31,132,0,0,0,0,0,255,224,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, + 204,204,204,102,102,15,31,132,0,0,0,0,0,255,37,58,153,0,0,72,137,84,36,16,85,72,131,236,32,72,139,234,72,184,0,0,0,0,0,0,0,0,72,131,196,32,93,195,204,64,85,72,139,234,72,139,1,51,201,129,56,5,0,0,192,15,148,193,139,193,93,195,204,64,85,72,131, + 236,32,72,139,234,138,77,64,72,131,196,32,93,233,106,235,254,255,204,64,85,72,131,236,32,72,139,234,138,77,32,232,88,235,254,255,144,72,131,196,32,93,195,204,64,85,72,131,236,32,72,139,234,72,131,196,32,93,233,65,237,254,255,204,64,85,72,131, + 236,48,72,139,234,72,139,1,139,16,72,137,76,36,40,137,84,36,32,76,141,13,18,244,254,255,76,139,69,112,139,85,104,72,139,77,96,232,54,236,254,255,144,72,131,196,48,93,195,204,64,83,85,87,72,131,236,64,72,139,234,72,137,77,80,72,137,77,72,232, + 98,57,255,255,72,139,141,128,0,0,0,72,137,72,112,72,139,189,152,0,0,0,72,139,95,8,232,71,57,255,255,72,137,88,96,72,139,69,72,72,139,8,72,139,89,56,232,51,57,255,255,72,137,88,104,72,139,77,72,198,68,36,56,1,72,131,100,36,48,0,131,100,36,40, + 0,72,139,133,160,0,0,0,72,137,68,36,32,76,139,207,76,139,133,144,0,0,0,72,139,149,136,0,0,0,72,139,9,232,94,77,255,255,232,241,56,255,255,72,131,96,112,0,199,69,64,1,0,0,0,184,1,0,0,0,72,131,196,64,95,93,91,195,204,64,83,85,87,72,131,236,64, + 72,139,234,72,137,77,80,72,137,77,72,232,191,56,255,255,72,139,141,128,0,0,0,72,137,72,112,72,139,189,152,0,0,0,72,139,95,8,232,164,56,255,255,72,137,88,96,72,139,69,72,72,139,8,72,139,89,56,232,144,56,255,255,72,137,88,104,232,135,56,255,255, + 139,141,184,0,0,0,137,72,120,72,139,77,72,198,68,36,56,1,72,131,100,36,48,0,131,100,36,40,0,72,139,133,160,0,0,0,72,137,68,36,32,76,139,207,76,139,133,144,0,0,0,72,139,149,136,0,0,0,72,139,9,232,181,76,255,255,232,64,56,255,255,72,131,96,112, + 0,199,69,64,1,0,0,0,184,1,0,0,0,72,131,196,64,95,93,91,195,204,64,83,85,72,131,236,40,72,139,234,72,137,77,56,72,137,77,48,128,125,88,0,116,108,72,139,69,48,72,139,8,72,137,77,40,72,139,69,40,129,56,99,115,109,224,117,85,72,139,69,40,131,120, + 24,4,117,75,72,139,69,40,129,120,32,32,5,147,25,116,26,72,139,69,40,129,120,32,33,5,147,25,116,13,72,139,69,40,129,120,32,34,5,147,25,117,36,232,193,55,255,255,72,139,77,40,72,137,72,32,72,139,69,48,72,139,88,8,232,172,55,255,255,72,137,88,40, + 232,115,49,255,255,144,199,69,32,0,0,0,0,139,69,32,72,131,196,40,93,91,195,204,64,85,72,131,236,32,72,139,234,51,201,72,131,196,32,93,233,63,119,255,255,204,64,85,72,131,236,32,72,139,234,72,139,69,72,139,8,72,131,196,32,93,233,37,119,255,255, + 204,64,85,72,131,236,32,72,139,234,72,137,77,40,72,139,1,139,8,137,77,36,51,192,129,249,99,115,109,224,15,148,192,137,69,32,139,69,32,72,131,196,32,93,195,204,204,204,204,64,85,72,131,236,32,72,139,234,72,139,1,51,201,129,56,5,0,0,192,15,148, + 193,139,193,72,131,196,32,93,195,204,64,85,72,131,236,64,72,139,234,232,2,55,255,255,199,64,120,254,255,255,255,72,131,196,64,93,195,204,64,85,72,131,236,32,72,139,234,72,137,77,88,76,141,69,32,72,139,149,184,0,0,0,232,15,73,255,255,144,72,131, + 196,32,93,195,204,64,83,85,72,131,236,40,72,139,234,72,139,77,56,232,0,8,255,255,131,125,32,0,117,72,72,139,157,184,0,0,0,129,59,99,115,109,224,117,57,131,123,24,4,117,51,129,123,32,32,5,147,25,116,18,129,123,32,33,5,147,25,116,9,129,123,32, + 34,5,147,25,117,24,72,139,75,40,232,141,10,255,255,133,192,116,11,178,1,72,139,203,232,255,9,255,255,144,232,105,54,255,255,72,139,141,192,0,0,0,72,137,72,32,232,89,54,255,255,72,139,77,64,72,137,72,40,72,131,196,40,93,91,195,204,64,85,72,131, + 236,32,72,139,234,72,137,141,128,0,0,0,76,141,77,32,68,139,133,232,0,0,0,72,139,149,248,0,0,0,232,226,72,255,255,144,72,131,196,32,93,195,204,64,83,85,72,131,236,40,72,139,234,72,139,77,72,232,75,7,255,255,131,125,32,0,117,72,72,139,157,248, + 0,0,0,129,59,99,115,109,224,117,57,131,123,24,4,117,51,129,123,32,32,5,147,25,116,18,129,123,32,33,5,147,25,116,9,129,123,32,34,5,147,25,117,24,72,139,75,40,232,216,9,255,255,133,192,116,11,178,1,72,139,203,232,74,9,255,255,144,232,180,53,255, + 255,72,139,77,48,72,137,72,32,232,167,53,255,255,72,139,77,56,72,137,72,40,232,154,53,255,255,139,141,224,0,0,0,137,72,120,72,131,196,40,93,91,195,204,64,85,72,131,236,32,72,139,234,232,223,9,255,255,144,72,131,196,32,93,195,204,64,85,72,131, + 236,32,72,139,234,232,101,53,255,255,131,120,48,0,126,8,232,90,53,255,255,255,72,48,72,131,196,32,93,195,204,64,85,72,131,236,48,72,139,234,232,166,9,255,255,144,72,131,196,48,93,195,204,64,85,72,131,236,48,72,139,234,232,44,53,255,255,131,120, + 48,0,126,8,232,33,53,255,255,255,72,48,72,131,196,48,93,195,204,64,85,72,131,236,32,72,139,234,185,7,0,0,0,72,131,196,32,93,233,195,116,255,255,204,64,85,72,131,236,32,72,139,234,72,139,69,104,139,8,72,131,196,32,93,233,169,116,255,255,204,64, + 85,72,131,236,32,72,139,234,185,5,0,0,0,72,131,196,32,93,233,144,116,255,255,204,64,85,72,131,236,32,72,139,234,128,125,112,0,116,11,185,3,0,0,0,232,118,116,255,255,144,72,131,196,32,93,195,204,64,85,72,131,236,32,72,139,234,72,139,77,72,72, + 139,9,72,131,196,32,93,233,136,149,255,255,204,64,85,72,131,236,32,72,139,234,72,139,133,152,0,0,0,139,8,72,131,196,32,93,233,55,116,255,255,204,64,85,72,131,236,32,72,139,234,72,139,69,88,139,8,72,131,196,32,93,233,29,116,255,255,204,64,85, + 72,131,236,32,72,139,234,185,4,0,0,0,72,131,196,32,93,233,4,116,255,255,204,64,85,72,131,236,32,72,139,234,72,139,69,72,139,8,72,131,196,32,93,233,238,187,255,255,204,64,85,72,131,236,48,72,139,234,139,77,96,72,131,196,48,93,233,215,187,255, + 255,204,64,85,72,131,236,32,72,139,234,185,8,0,0,0,72,131,196,32,93,233,186,115,255,255,204,64,85,72,131,236,48,72,139,234,72,139,77,64,72,131,196,48,93,233,214,148,255,255,204,64,85,72,131,236,32,72,139,234,72,139,1,129,56,5,0,0,192,116,12, + 129,56,29,0,0,192,116,4,51,192,235,5,184,1,0,0,0,72,131,196,32,93,195,204,72,141,5,138,204,0,0,233,84,0,0,0,72,141,5,134,204,0,0,233,72,0,0,0,72,141,5,130,204,0,0,233,60,0,0,0,72,141,5,126,204,0,0,233,48,0,0,0,72,141,5,122,204,0,0,233,36,0,0, + 0,72,141,5,118,204,0,0,233,24,0,0,0,72,141,5,114,204,0,0,233,12,0,0,0,72,141,5,110,204,0,0,233,0,0,0,0,81,82,65,80,65,81,72,131,236,72,102,15,127,4,36,102,15,127,76,36,16,102,15,127,84,36,32,102,15,127,92,36,48,72,139,208,72,141,13,238,146,0, + 0,232,21,243,254,255,102,15,111,4,36,102,15,111,76,36,16,102,15,111,84,36,32,102,15,111,92,36,48,72,131,196,72,65,89,65,88,90,89,255,224,72,141,5,31,204,0,0,233,12,0,0,0,72,141,5,27,204,0,0,233,0,0,0,0,81,82,65,80,65,81,72,131,236,72,102,15, + 127,4,36,102,15,127,76,36,16,102,15,127,84,36,32,102,15,127,92,36,48,72,139,208,72,141,13,163,146,0,0,232,170,242,254,255,102,15,111,4,36,102,15,111,76,36,16,102,15,111,84,36,32,102,15,111,92,36,48,72,131,196,72,65,89,65,88,90,89,255,224,204, + 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204, + 204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,115,0,121,0,110,0,99,0,104,0,45,0,108,0,49,0,45,0,50,0,45,0,48,0,46,0,100,0,108,0,108,0,0,0,0,0,0,0,0,0,107,0,101,0,114,0,110,0,101,0,108,0,51,0,50,0, + 46,0,100,0,108,0,108,0,0,0,0,0,0,0,0,0,83,108,101,101,112,67,111,110,100,105,116,105,111,110,86,97,114,105,97,98,108,101,67,83,0,0,0,0,0,0,0,0,87,97,107,101,65,108,108,67,111,110,100,105,116,105,111,110,86,97,114,105,97,98,108,101,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,192,231,1,128,1,0,0,0,176,71,0,128,1,0,0,0,144,71,0,128,1,0,0,0,85,110,107,110,111,119,110,32,101,120,99,101,112,116,105,111,110,0,0,0,0,0,0,0,56,232,1,128, + 1,0,0,0,176,71,0,128,1,0,0,0,144,71,0,128,1,0,0,0,98,97,100,32,97,108,108,111,99,97,116,105,111,110,0,0,184,232,1,128,1,0,0,0,176,71,0,128,1,0,0,0,144,71,0,128,1,0,0,0,98,97,100,32,97,114,114,97,121,32,110,101,119,32,108,101,110,103,116,104, + 0,0,0,0,64,233,1,128,1,0,0,0,208,74,0,128,1,0,0,0,0,0,0,0,0,0,0,0,75,0,69,0,82,0,78,0,69,0,76,0,51,0,50,0,46,0,68,0,76,0,76,0,0,0,0,0,0,0,0,0,65,99,113,117,105,114,101,83,82,87,76,111,99,107,69,120,99,108,117,115,105,118,101,0,82,101,108,101, + 97,115,101,83,82,87,76,111,99,107,69,120,99,108,117,115,105,118,101,0,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,40,32,2,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,241,1,128,1,0,0,0,48,241,1,128,1,0,0,0,232,239,1,128,1,0,0,0,79,0,0,0,0,0,0,0,0,5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,241,1,128,1,0,0,0,64,241,1,128,1,0,0,0,72,241,1,128,1,0,0,0,80,241,1, + 128,1,0,0,0,88,241,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,254,255,253,255,254,255,252,255,254,255,253,255,254,255,251,25,18,25,11,25,18,25,4,25,18,25,11,25,18,25,0,41,0,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0, + 0,32,5,147,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,41,0,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,32,5,147,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,101,0,128,1,0,0,0,32,109,0,128,1,0,0,0,0,0,0,0,0,0,0,0,192,109,0,128,1,0,0,0,0,0,0,0,0,0,0,0,144,204,0,128,1,0,0,0,192,204,0,128,1,0,0,0,160,109,0, + 128,1,0,0,0,176,109,0,128,1,0,0,0,64,209,0,128,1,0,0,0,144,209,0,128,1,0,0,0,0,210,0,128,1,0,0,0,32,210,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,110,0,128,1,0,0,0,48,210,0,128,1,0,0,0,112,210,0,128,1,0,0,0,96,217,0,128,1,0,0,0,160,217,0,128,1,0,0,0,224, + 219,0,128,1,0,0,0,16,220,0,128,1,0,0,0,48,220,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,110,0,128,1,0,0,0,0,0,0,0,0,0,0,0,80,110,0,128,1,0,0,0,0,0,0,0,0,0,0,0,16,110,0,128,1,0,0,0,128,109,0,128,1,0,0,0,144,109,0,128,1,0,0,0,64,109,0, + 128,1,0,0,0,112,109,0,128,1,0,0,0,109,0,115,0,99,0,111,0,114,0,101,0,101,0,46,0,100,0,108,0,108,0,0,0,67,111,114,69,120,105,116,80,114,111,99,101,115,115,0,0,34,5,147,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,48,4,2,0,32,0,0,0,0,0,0,0,5,0,0, + 0,34,5,147,25,1,0,0,0,76,4,2,0,0,0,0,0,0,0,0,0,1,0,0,0,88,4,2,0,48,0,0,0,0,0,0,0,5,0,0,0,34,5,147,25,1,0,0,0,76,4,2,0,0,0,0,0,0,0,0,0,1,0,0,0,240,4,2,0,40,0,0,0,0,0,0,0,1,0,0,0,34,5,147,25,1,0,0,0,76,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32, + 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,5,0,0,192,11,0,0,0,0,0,0,0,0,0,0,0,29,0,0,192,4,0,0,0,0,0,0,0,0,0,0,0,150,0,0,192,4,0,0,0,0,0,0,0,0,0,0,0,141,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,142,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,143,0,0,192,8,0,0,0,0,0,0, + 0,0,0,0,0,144,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,145,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,146,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,147,0,0,192,8,0,0,0,0,0,0,0,0,0,0,0,180,2,0,192,8,0,0,0,0,0,0,0,0,0,0,0,181,2,0,192,8,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0, + 0,3,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,184,233,1,128,1,0,0,0,176,71,0,128,1,0,0,0,144,71,0,128,1,0,0,0,98,97,100,32,101,120,99,101,112,116,105,111,110,0,0,0,80,110,1,128,1,0,0,0,8,0,0,0,0,0,0,0,96,110,1,128,1,0,0,0,7,0,0,0,0,0,0,0,104,110,1,128,1, + 0,0,0,8,0,0,0,0,0,0,0,120,110,1,128,1,0,0,0,9,0,0,0,0,0,0,0,136,110,1,128,1,0,0,0,10,0,0,0,0,0,0,0,152,110,1,128,1,0,0,0,10,0,0,0,0,0,0,0,168,110,1,128,1,0,0,0,12,0,0,0,0,0,0,0,184,110,1,128,1,0,0,0,9,0,0,0,0,0,0,0,196,110,1,128,1,0,0,0,6,0, + 0,0,0,0,0,0,208,110,1,128,1,0,0,0,9,0,0,0,0,0,0,0,224,110,1,128,1,0,0,0,9,0,0,0,0,0,0,0,240,110,1,128,1,0,0,0,9,0,0,0,0,0,0,0,0,111,1,128,1,0,0,0,7,0,0,0,0,0,0,0,8,111,1,128,1,0,0,0,10,0,0,0,0,0,0,0,24,111,1,128,1,0,0,0,11,0,0,0,0,0,0,0,40,111, + 1,128,1,0,0,0,9,0,0,0,0,0,0,0,50,111,1,128,1,0,0,0,0,0,0,0,0,0,0,0,52,111,1,128,1,0,0,0,4,0,0,0,0,0,0,0,64,111,1,128,1,0,0,0,7,0,0,0,0,0,0,0,72,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,76,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,80,111,1,128,1,0,0,0,2,0,0, + 0,0,0,0,0,84,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,88,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,92,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,96,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,104,111,1,128,1,0,0,0,8,0,0,0,0,0,0,0,116,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,120,111, + 1,128,1,0,0,0,1,0,0,0,0,0,0,0,124,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,128,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,132,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,136,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,140,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,144,111,1,128,1,0,0,0, + 3,0,0,0,0,0,0,0,148,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,152,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,156,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,160,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,164,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,168,111,1,128,1,0,0,0,2,0,0,0,0,0,0, + 0,172,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,176,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,180,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,184,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,188,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,192,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,196,111,1,128, + 1,0,0,0,2,0,0,0,0,0,0,0,200,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,204,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,208,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,212,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,216,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,220,111,1,128,1,0,0,0,3,0,0, + 0,0,0,0,0,224,111,1,128,1,0,0,0,3,0,0,0,0,0,0,0,228,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,232,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,236,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,240,111,1,128,1,0,0,0,9,0,0,0,0,0,0,0,0,112,1,128,1,0,0,0,9,0,0,0,0,0,0,0,16,112, + 1,128,1,0,0,0,7,0,0,0,0,0,0,0,24,112,1,128,1,0,0,0,8,0,0,0,0,0,0,0,40,112,1,128,1,0,0,0,20,0,0,0,0,0,0,0,64,112,1,128,1,0,0,0,8,0,0,0,0,0,0,0,80,112,1,128,1,0,0,0,18,0,0,0,0,0,0,0,104,112,1,128,1,0,0,0,28,0,0,0,0,0,0,0,136,112,1,128,1,0,0,0, + 29,0,0,0,0,0,0,0,168,112,1,128,1,0,0,0,28,0,0,0,0,0,0,0,200,112,1,128,1,0,0,0,29,0,0,0,0,0,0,0,232,112,1,128,1,0,0,0,28,0,0,0,0,0,0,0,8,113,1,128,1,0,0,0,35,0,0,0,0,0,0,0,48,113,1,128,1,0,0,0,26,0,0,0,0,0,0,0,80,113,1,128,1,0,0,0,32,0,0,0,0, + 0,0,0,120,113,1,128,1,0,0,0,31,0,0,0,0,0,0,0,152,113,1,128,1,0,0,0,38,0,0,0,0,0,0,0,192,113,1,128,1,0,0,0,26,0,0,0,0,0,0,0,224,113,1,128,1,0,0,0,15,0,0,0,0,0,0,0,240,113,1,128,1,0,0,0,3,0,0,0,0,0,0,0,244,113,1,128,1,0,0,0,5,0,0,0,0,0,0,0,0,114, + 1,128,1,0,0,0,15,0,0,0,0,0,0,0,16,114,1,128,1,0,0,0,35,0,0,0,0,0,0,0,52,114,1,128,1,0,0,0,6,0,0,0,0,0,0,0,64,114,1,128,1,0,0,0,9,0,0,0,0,0,0,0,80,114,1,128,1,0,0,0,14,0,0,0,0,0,0,0,96,114,1,128,1,0,0,0,26,0,0,0,0,0,0,0,128,114,1,128,1,0,0,0, + 28,0,0,0,0,0,0,0,160,114,1,128,1,0,0,0,37,0,0,0,0,0,0,0,200,114,1,128,1,0,0,0,36,0,0,0,0,0,0,0,240,114,1,128,1,0,0,0,37,0,0,0,0,0,0,0,24,115,1,128,1,0,0,0,43,0,0,0,0,0,0,0,72,115,1,128,1,0,0,0,26,0,0,0,0,0,0,0,104,115,1,128,1,0,0,0,32,0,0,0, + 0,0,0,0,144,115,1,128,1,0,0,0,34,0,0,0,0,0,0,0,184,115,1,128,1,0,0,0,40,0,0,0,0,0,0,0,232,115,1,128,1,0,0,0,42,0,0,0,0,0,0,0,24,116,1,128,1,0,0,0,27,0,0,0,0,0,0,0,56,116,1,128,1,0,0,0,12,0,0,0,0,0,0,0,72,116,1,128,1,0,0,0,17,0,0,0,0,0,0,0,96, + 116,1,128,1,0,0,0,11,0,0,0,0,0,0,0,50,111,1,128,1,0,0,0,0,0,0,0,0,0,0,0,112,116,1,128,1,0,0,0,17,0,0,0,0,0,0,0,136,116,1,128,1,0,0,0,27,0,0,0,0,0,0,0,168,116,1,128,1,0,0,0,18,0,0,0,0,0,0,0,192,116,1,128,1,0,0,0,28,0,0,0,0,0,0,0,224,116,1,128, + 1,0,0,0,25,0,0,0,0,0,0,0,50,111,1,128,1,0,0,0,0,0,0,0,0,0,0,0,120,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,140,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,192,111,1,128,1,0,0,0,2,0,0,0,0,0,0,0,184,111,1,128,1,0,0,0,1,0,0,0,0,0,0,0,152,111,1,128,1,0,0,0,1,0,0, + 0,0,0,0,0,64,112,1,128,1,0,0,0,8,0,0,0,0,0,0,0,0,117,1,128,1,0,0,0,21,0,0,0,0,0,0,0,95,95,98,97,115,101,100,40,0,0,0,0,0,0,0,0,95,95,99,100,101,99,108,0,95,95,112,97,115,99,97,108,0,0,0,0,0,0,0,0,95,95,115,116,100,99,97,108,108,0,0,0,0,0,0,0, + 95,95,116,104,105,115,99,97,108,108,0,0,0,0,0,0,95,95,102,97,115,116,99,97,108,108,0,0,0,0,0,0,95,95,118,101,99,116,111,114,99,97,108,108,0,0,0,0,95,95,99,108,114,99,97,108,108,0,0,0,95,95,101,97,98,105,0,0,0,0,0,0,95,95,115,119,105,102,116, + 95,49,0,0,0,0,0,0,0,95,95,115,119,105,102,116,95,50,0,0,0,0,0,0,0,95,95,115,119,105,102,116,95,51,0,0,0,0,0,0,0,95,95,112,116,114,54,52,0,95,95,114,101,115,116,114,105,99,116,0,0,0,0,0,0,95,95,117,110,97,108,105,103,110,101,100,0,0,0,0,0,114, + 101,115,116,114,105,99,116,40,0,0,0,32,110,101,119,0,0,0,0,0,0,0,0,32,100,101,108,101,116,101,0,61,0,0,0,62,62,0,0,60,60,0,0,33,0,0,0,61,61,0,0,33,61,0,0,91,93,0,0,0,0,0,0,111,112,101,114,97,116,111,114,0,0,0,0,45,62,0,0,42,0,0,0,43,43,0,0,45, + 45,0,0,45,0,0,0,43,0,0,0,38,0,0,0,45,62,42,0,47,0,0,0,37,0,0,0,60,0,0,0,60,61,0,0,62,0,0,0,62,61,0,0,44,0,0,0,40,41,0,0,126,0,0,0,94,0,0,0,124,0,0,0,38,38,0,0,124,124,0,0,42,61,0,0,43,61,0,0,45,61,0,0,47,61,0,0,37,61,0,0,62,62,61,0,60,60,61, + 0,38,61,0,0,124,61,0,0,94,61,0,0,96,118,102,116,97,98,108,101,39,0,0,0,0,0,0,0,96,118,98,116,97,98,108,101,39,0,0,0,0,0,0,0,96,118,99,97,108,108,39,0,96,116,121,112,101,111,102,39,0,0,0,0,0,0,0,0,96,108,111,99,97,108,32,115,116,97,116,105,99, + 32,103,117,97,114,100,39,0,0,0,0,96,115,116,114,105,110,103,39,0,0,0,0,0,0,0,0,96,118,98,97,115,101,32,100,101,115,116,114,117,99,116,111,114,39,0,0,0,0,0,0,96,118,101,99,116,111,114,32,100,101,108,101,116,105,110,103,32,100,101,115,116,114, + 117,99,116,111,114,39,0,0,0,0,96,100,101,102,97,117,108,116,32,99,111,110,115,116,114,117,99,116,111,114,32,99,108,111,115,117,114,101,39,0,0,0,96,115,99,97,108,97,114,32,100,101,108,101,116,105,110,103,32,100,101,115,116,114,117,99,116,111, + 114,39,0,0,0,0,96,118,101,99,116,111,114,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,96,118,101,99,116,111,114,32,100,101,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0, + 96,118,101,99,116,111,114,32,118,98,97,115,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,96,118,105,114,116,117,97,108,32,100,105,115,112,108,97,99,101,109,101,110,116,32,109,97,112,39,0,0,0, + 0,0,0,96,101,104,32,118,101,99,116,111,114,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,0,0,0,96,101,104,32,118,101,99,116,111,114,32,100,101,115,116,114,117,99,116,111,114,32,105,116,101,114,97, + 116,111,114,39,0,96,101,104,32,118,101,99,116,111,114,32,118,98,97,115,101,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,96,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,99,108,111,115, + 117,114,101,39,0,0,0,0,0,0,96,117,100,116,32,114,101,116,117,114,110,105,110,103,39,0,96,69,72,0,96,82,84,84,73,0,0,0,0,0,0,0,96,108,111,99,97,108,32,118,102,116,97,98,108,101,39,0,96,108,111,99,97,108,32,118,102,116,97,98,108,101,32,99,111, + 110,115,116,114,117,99,116,111,114,32,99,108,111,115,117,114,101,39,0,32,110,101,119,91,93,0,0,0,0,0,0,32,100,101,108,101,116,101,91,93,0,0,0,0,0,0,0,96,111,109,110,105,32,99,97,108,108,115,105,103,39,0,0,96,112,108,97,99,101,109,101,110,116, + 32,100,101,108,101,116,101,32,99,108,111,115,117,114,101,39,0,0,0,0,0,0,96,112,108,97,99,101,109,101,110,116,32,100,101,108,101,116,101,91,93,32,99,108,111,115,117,114,101,39,0,0,0,0,96,109,97,110,97,103,101,100,32,118,101,99,116,111,114,32, + 99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,96,109,97,110,97,103,101,100,32,118,101,99,116,111,114,32,100,101,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,96,101,104,32, + 118,101,99,116,111,114,32,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,96,101,104,32,118,101,99,116,111,114,32,118,98,97,115,101,32,99,111,112,121,32,99,111,110,115,116,114,117,99,116, + 111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,96,100,121,110,97,109,105,99,32,105,110,105,116,105,97,108,105,122,101,114,32,102,111,114,32,39,0,0,0,0,0,0,96,100,121,110,97,109,105,99,32,97,116,101,120,105,116,32,100,101,115,116,114, + 117,99,116,111,114,32,102,111,114,32,39,0,0,0,0,0,0,0,0,96,118,101,99,116,111,114,32,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,0,96,118,101,99,116,111,114,32,118,98,97,115,101, + 32,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,105,116,101,114,97,116,111,114,39,0,0,0,0,0,0,0,0,96,109,97,110,97,103,101,100,32,118,101,99,116,111,114,32,99,111,112,121,32,99,111,110,115,116,114,117,99,116,111,114,32,105, + 116,101,114,97,116,111,114,39,0,0,0,0,0,0,96,108,111,99,97,108,32,115,116,97,116,105,99,32,116,104,114,101,97,100,32,103,117,97,114,100,39,0,0,0,0,0,111,112,101,114,97,116,111,114,32,34,34,32,0,0,0,0,111,112,101,114,97,116,111,114,32,99,111, + 95,97,119,97,105,116,0,0,0,0,0,0,0,111,112,101,114,97,116,111,114,60,61,62,0,0,0,0,0,32,84,121,112,101,32,68,101,115,99,114,105,112,116,111,114,39,0,0,0,0,0,0,0,32,66,97,115,101,32,67,108,97,115,115,32,68,101,115,99,114,105,112,116,111,114,32, + 97,116,32,40,0,0,0,0,0,32,66,97,115,101,32,67,108,97,115,115,32,65,114,114,97,121,39,0,0,0,0,0,0,32,67,108,97,115,115,32,72,105,101,114,97,114,99,104,121,32,68,101,115,99,114,105,112,116,111,114,39,0,0,0,0,32,67,111,109,112,108,101,116,101,32, + 79,98,106,101,99,116,32,76,111,99,97,116,111,114,39,0,0,0,0,0,0,0,96,97,110,111,110,121,109,111,117,115,32,110,97,109,101,115,112,97,99,101,39,0,0,0,0,0,0,0,0,0,0,0,208,117,1,128,1,0,0,0,16,118,1,128,1,0,0,0,72,118,1,128,1,0,0,0,128,118,1,128, + 1,0,0,0,208,118,1,128,1,0,0,0,48,119,1,128,1,0,0,0,128,119,1,128,1,0,0,0,192,119,1,128,1,0,0,0,0,120,1,128,1,0,0,0,64,120,1,128,1,0,0,0,128,120,1,128,1,0,0,0,192,120,1,128,1,0,0,0,16,121,1,128,1,0,0,0,112,121,1,128,1,0,0,0,192,121,1,128,1,0, + 0,0,16,122,1,128,1,0,0,0,40,122,1,128,1,0,0,0,64,122,1,128,1,0,0,0,88,122,1,128,1,0,0,0,112,122,1,128,1,0,0,0,184,122,1,128,1,0,0,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,100, + 0,97,0,116,0,101,0,116,0,105,0,109,0,101,0,45,0,108,0,49,0,45,0,49,0,45,0,49,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,102,0,105,0,108,0,101,0,45,0,108,0,49,0,45,0,50,0,45,0,52,0,0,0,97,0, + 112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,102,0,105,0,108,0,101,0,45,0,108,0,49,0,45,0,50,0,45,0,50,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,108, + 0,111,0,99,0,97,0,108,0,105,0,122,0,97,0,116,0,105,0,111,0,110,0,45,0,108,0,49,0,45,0,50,0,45,0,49,0,0,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,108,0,111,0,99,0,97,0,108,0,105, + 0,122,0,97,0,116,0,105,0,111,0,110,0,45,0,111,0,98,0,115,0,111,0,108,0,101,0,116,0,101,0,45,0,108,0,49,0,45,0,50,0,45,0,48,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,112,0,114, + 0,111,0,99,0,101,0,115,0,115,0,116,0,104,0,114,0,101,0,97,0,100,0,115,0,45,0,108,0,49,0,45,0,49,0,45,0,50,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,115,0,116,0,114,0,105,0,110,0,103, + 0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,115,0,121,0,110,0,99,0,104,0,45,0,108,0,49,0,45,0,50,0,45,0,48,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45, + 0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,115,0,121,0,115,0,105,0,110,0,102,0,111,0,45,0,108,0,49,0,45,0,50,0,45,0,49,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0, + 45,0,119,0,105,0,110,0,114,0,116,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,120,0,115,0,116,0,97,0,116,0,101,0,45,0,108,0,50,0,45,0,49,0,45, + 0,48,0,0,0,0,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,114,0,116,0,99,0,111,0,114,0,101,0,45,0,110,0,116,0,117,0,115,0,101,0,114,0,45,0,119,0,105,0,110,0,100,0,111,0,119,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0, + 97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,115,0,101,0,99,0,117,0,114,0,105,0,116,0,121,0,45,0,115,0,121,0,115,0,116,0,101,0,109,0,102,0,117,0,110,0,99,0,116,0,105,0,111,0,110,0,115,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0, + 0,0,0,0,0,0,0,0,0,0,0,101,0,120,0,116,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,110,0,116,0,117,0,115,0,101,0,114,0,45,0,100,0,105,0,97,0,108,0,111,0,103,0,98,0,111,0,120,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,101, + 0,120,0,116,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,110,0,116,0,117,0,115,0,101,0,114,0,45,0,119,0,105,0,110,0,100,0,111,0,119,0,115,0,116,0,97,0,116,0,105,0,111,0,110,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,0,0,0,0,97,0,100,0,118,0,97, + 0,112,0,105,0,51,0,50,0,0,0,0,0,0,0,0,0,107,0,101,0,114,0,110,0,101,0,108,0,51,0,50,0,0,0,0,0,0,0,0,0,107,0,101,0,114,0,110,0,101,0,108,0,98,0,97,0,115,0,101,0,0,0,0,0,110,0,116,0,100,0,108,0,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,0,112,0,105, + 0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,97,0,112,0,112,0,109,0,111,0,100,0,101,0,108,0,45,0,114,0,117,0,110,0,116,0,105,0,109,0,101,0,45,0,108,0,49,0,45,0,49,0,45,0,50,0,0,0,0,0,117,0,115,0,101,0,114,0,51,0,50,0,0,0,0,0,97,0,112,0,105, + 0,45,0,109,0,115,0,45,0,0,0,101,0,120,0,116,0,45,0,109,0,115,0,45,0,0,0,16,0,0,0,0,0,0,0,65,114,101,70,105,108,101,65,112,105,115,65,78,83,73,0,7,0,0,0,16,0,0,0,73,110,105,116,105,97,108,105,122,101,67,114,105,116,105,99,97,108,83,101,99,116, + 105,111,110,69,120,0,0,0,0,0,3,0,0,0,16,0,0,0,76,67,77,97,112,83,116,114,105,110,103,69,120,0,0,0,3,0,0,0,16,0,0,0,76,111,99,97,108,101,78,97,109,101,84,111,76,67,73,68,0,0,0,0,19,0,0,0,65,112,112,80,111,108,105,99,121,71,101,116,80,114,111, + 99,101,115,115,84,101,114,109,105,110,97,116,105,111,110,77,101,116,104,111,100,0,0,0,0,168,123,1,128,1,0,0,0,184,123,1,128,1,0,0,0,200,123,1,128,1,0,0,0,216,123,1,128,1,0,0,0,106,0,97,0,45,0,74,0,80,0,0,0,0,0,0,0,122,0,104,0,45,0,67,0,78,0, + 0,0,0,0,0,0,107,0,111,0,45,0,75,0,82,0,0,0,0,0,0,0,122,0,104,0,45,0,84,0,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,126,1,128,1,0,0,0,180,126,1,128,1,0,0,0,184,126,1,128,1,0,0,0,188,126,1,128,1,0,0,0,192,126,1,128,1,0,0,0,196,126,1,128,1,0,0,0,200, + 126,1,128,1,0,0,0,204,126,1,128,1,0,0,0,212,126,1,128,1,0,0,0,224,126,1,128,1,0,0,0,232,126,1,128,1,0,0,0,248,126,1,128,1,0,0,0,4,127,1,128,1,0,0,0,16,127,1,128,1,0,0,0,28,127,1,128,1,0,0,0,32,127,1,128,1,0,0,0,36,127,1,128,1,0,0,0,40,127,1, + 128,1,0,0,0,44,127,1,128,1,0,0,0,48,127,1,128,1,0,0,0,52,127,1,128,1,0,0,0,56,127,1,128,1,0,0,0,60,127,1,128,1,0,0,0,64,127,1,128,1,0,0,0,68,127,1,128,1,0,0,0,72,127,1,128,1,0,0,0,80,127,1,128,1,0,0,0,88,127,1,128,1,0,0,0,100,127,1,128,1,0,0, + 0,108,127,1,128,1,0,0,0,44,127,1,128,1,0,0,0,116,127,1,128,1,0,0,0,124,127,1,128,1,0,0,0,132,127,1,128,1,0,0,0,144,127,1,128,1,0,0,0,160,127,1,128,1,0,0,0,168,127,1,128,1,0,0,0,184,127,1,128,1,0,0,0,196,127,1,128,1,0,0,0,200,127,1,128,1,0,0, + 0,208,127,1,128,1,0,0,0,224,127,1,128,1,0,0,0,248,127,1,128,1,0,0,0,1,0,0,0,0,0,0,0,8,128,1,128,1,0,0,0,16,128,1,128,1,0,0,0,24,128,1,128,1,0,0,0,32,128,1,128,1,0,0,0,40,128,1,128,1,0,0,0,48,128,1,128,1,0,0,0,56,128,1,128,1,0,0,0,64,128,1,128, + 1,0,0,0,80,128,1,128,1,0,0,0,96,128,1,128,1,0,0,0,112,128,1,128,1,0,0,0,136,128,1,128,1,0,0,0,160,128,1,128,1,0,0,0,176,128,1,128,1,0,0,0,200,128,1,128,1,0,0,0,208,128,1,128,1,0,0,0,216,128,1,128,1,0,0,0,224,128,1,128,1,0,0,0,232,128,1,128,1, + 0,0,0,240,128,1,128,1,0,0,0,248,128,1,128,1,0,0,0,0,129,1,128,1,0,0,0,8,129,1,128,1,0,0,0,16,129,1,128,1,0,0,0,24,129,1,128,1,0,0,0,32,129,1,128,1,0,0,0,40,129,1,128,1,0,0,0,56,129,1,128,1,0,0,0,80,129,1,128,1,0,0,0,96,129,1,128,1,0,0,0,232, + 128,1,128,1,0,0,0,112,129,1,128,1,0,0,0,128,129,1,128,1,0,0,0,144,129,1,128,1,0,0,0,160,129,1,128,1,0,0,0,184,129,1,128,1,0,0,0,200,129,1,128,1,0,0,0,224,129,1,128,1,0,0,0,244,129,1,128,1,0,0,0,252,129,1,128,1,0,0,0,8,130,1,128,1,0,0,0,32,130, + 1,128,1,0,0,0,72,130,1,128,1,0,0,0,96,130,1,128,1,0,0,0,83,117,110,0,77,111,110,0,84,117,101,0,87,101,100,0,84,104,117,0,70,114,105,0,83,97,116,0,83,117,110,100,97,121,0,0,77,111,110,100,97,121,0,0,0,0,0,0,84,117,101,115,100,97,121,0,87,101, + 100,110,101,115,100,97,121,0,0,0,0,0,0,0,84,104,117,114,115,100,97,121,0,0,0,0,70,114,105,100,97,121,0,0,0,0,0,0,83,97,116,117,114,100,97,121,0,0,0,0,74,97,110,0,70,101,98,0,77,97,114,0,65,112,114,0,77,97,121,0,74,117,110,0,74,117,108,0,65,117, + 103,0,83,101,112,0,79,99,116,0,78,111,118,0,68,101,99,0,0,0,0,0,74,97,110,117,97,114,121,0,70,101,98,114,117,97,114,121,0,0,0,0,77,97,114,99,104,0,0,0,65,112,114,105,108,0,0,0,74,117,110,101,0,0,0,0,74,117,108,121,0,0,0,0,65,117,103,117,115, + 116,0,0,0,0,0,0,83,101,112,116,101,109,98,101,114,0,0,0,0,0,0,0,79,99,116,111,98,101,114,0,78,111,118,101,109,98,101,114,0,0,0,0,0,0,0,0,68,101,99,101,109,98,101,114,0,0,0,0,65,77,0,0,80,77,0,0,0,0,0,0,77,77,47,100,100,47,121,121,0,0,0,0,0,0, + 0,0,100,100,100,100,44,32,77,77,77,77,32,100,100,44,32,121,121,121,121,0,0,0,0,0,72,72,58,109,109,58,115,115,0,0,0,0,0,0,0,0,83,0,117,0,110,0,0,0,77,0,111,0,110,0,0,0,84,0,117,0,101,0,0,0,87,0,101,0,100,0,0,0,84,0,104,0,117,0,0,0,70,0,114,0, + 105,0,0,0,83,0,97,0,116,0,0,0,83,0,117,0,110,0,100,0,97,0,121,0,0,0,0,0,77,0,111,0,110,0,100,0,97,0,121,0,0,0,0,0,84,0,117,0,101,0,115,0,100,0,97,0,121,0,0,0,87,0,101,0,100,0,110,0,101,0,115,0,100,0,97,0,121,0,0,0,0,0,0,0,84,0,104,0,117,0,114, + 0,115,0,100,0,97,0,121,0,0,0,0,0,0,0,0,0,70,0,114,0,105,0,100,0,97,0,121,0,0,0,0,0,83,0,97,0,116,0,117,0,114,0,100,0,97,0,121,0,0,0,0,0,0,0,0,0,74,0,97,0,110,0,0,0,70,0,101,0,98,0,0,0,77,0,97,0,114,0,0,0,65,0,112,0,114,0,0,0,77,0,97,0,121,0, + 0,0,74,0,117,0,110,0,0,0,74,0,117,0,108,0,0,0,65,0,117,0,103,0,0,0,83,0,101,0,112,0,0,0,79,0,99,0,116,0,0,0,78,0,111,0,118,0,0,0,68,0,101,0,99,0,0,0,74,0,97,0,110,0,117,0,97,0,114,0,121,0,0,0,70,0,101,0,98,0,114,0,117,0,97,0,114,0,121,0,0,0, + 0,0,0,0,0,0,77,0,97,0,114,0,99,0,104,0,0,0,0,0,0,0,65,0,112,0,114,0,105,0,108,0,0,0,0,0,0,0,74,0,117,0,110,0,101,0,0,0,0,0,0,0,0,0,74,0,117,0,108,0,121,0,0,0,0,0,0,0,0,0,65,0,117,0,103,0,117,0,115,0,116,0,0,0,0,0,83,0,101,0,112,0,116,0,101,0, + 109,0,98,0,101,0,114,0,0,0,0,0,0,0,79,0,99,0,116,0,111,0,98,0,101,0,114,0,0,0,78,0,111,0,118,0,101,0,109,0,98,0,101,0,114,0,0,0,0,0,0,0,0,0,68,0,101,0,99,0,101,0,109,0,98,0,101,0,114,0,0,0,0,0,65,0,77,0,0,0,0,0,80,0,77,0,0,0,0,0,0,0,0,0,77,0, + 77,0,47,0,100,0,100,0,47,0,121,0,121,0,0,0,0,0,0,0,0,0,100,0,100,0,100,0,100,0,44,0,32,0,77,0,77,0,77,0,77,0,32,0,100,0,100,0,44,0,32,0,121,0,121,0,121,0,121,0,0,0,72,0,72,0,58,0,109,0,109,0,58,0,115,0,115,0,0,0,0,0,0,0,0,0,101,0,110,0,45,0, + 85,0,83,0,0,0,0,0,0,0,1,0,0,0,22,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,2,0,0,0,4,0,0,0,24,0,0,0,5,0,0,0,13,0,0,0,6,0,0,0,9,0,0,0,7,0,0,0,12,0,0,0,8,0,0,0,12,0,0,0,9,0,0,0,12,0,0,0,10,0,0,0,7,0,0,0,11,0,0,0,8,0,0,0,12,0,0,0,22,0,0,0,13,0,0,0,22,0,0,0, + 15,0,0,0,2,0,0,0,16,0,0,0,13,0,0,0,17,0,0,0,18,0,0,0,18,0,0,0,2,0,0,0,33,0,0,0,13,0,0,0,53,0,0,0,2,0,0,0,65,0,0,0,13,0,0,0,67,0,0,0,2,0,0,0,80,0,0,0,17,0,0,0,82,0,0,0,13,0,0,0,83,0,0,0,13,0,0,0,87,0,0,0,22,0,0,0,89,0,0,0,11,0,0,0,108,0,0,0,13, + 0,0,0,109,0,0,0,32,0,0,0,112,0,0,0,28,0,0,0,114,0,0,0,9,0,0,0,128,0,0,0,10,0,0,0,129,0,0,0,10,0,0,0,130,0,0,0,9,0,0,0,131,0,0,0,22,0,0,0,132,0,0,0,13,0,0,0,145,0,0,0,41,0,0,0,158,0,0,0,13,0,0,0,161,0,0,0,2,0,0,0,164,0,0,0,11,0,0,0,167,0,0,0, + 13,0,0,0,183,0,0,0,17,0,0,0,206,0,0,0,2,0,0,0,215,0,0,0,11,0,0,0,89,4,0,0,42,0,0,0,24,7,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,40,0,40,0,40,0,40,0,40,0,32,0,32,0,32,0,32,0,32,0, + 32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,72,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,129, + 0,129,0,129,0,129,0,129,0,129,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,16,0,16,0,16,0,16,0,16,0,16,0,130,0,130,0,130,0,130,0,130,0,130,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0, + 2,0,2,0,2,0,2,0,16,0,16,0,16,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170, + 171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51, + 52,53,54,55,56,57,58,59,60,61,62,63,64,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118, + 119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179, + 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240, + 241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173, + 174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234, + 235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55, + 56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127,128,129,130,131,132, + 133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193, + 194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254, + 255,0,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,40,0,40,0,40,0,40,0,40,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,72,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16, + 0,16,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,132,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,129,1,129,1,129,1,129,1,129,1,129,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,0,16,0,16,0,16,0,16, + 0,16,0,130,1,130,1,130,1,130,1,130,1,130,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,16,0,16,0,16,0,16,0,32,0,32,0,32,0,32,0,32,0,32,0,40,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32, + 0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,8,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,18,1,16,0,16,0,48,0,16,0,16,0,16,0,16,0,20,0,20,0,16,0,18,1,16,0,16,0,16,0,20,0,18,1,16,0,16,0,16,0,16,0,16,0,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,16,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,16,0,2,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1, + 1,1,0,0,0,0,0,140,1,128,1,0,0,0,192,119,1,128,1,0,0,0,40,122,1,128,1,0,0,0,97,0,112,0,105,0,45,0,109,0,115,0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,102,0,105,0,98,0,101,0,114,0,115,0,45,0,108,0,49,0,45,0,49,0,45,0,49,0,0,0,0, + 0,0,0,0,0,0,0,2,0,0,0,70,108,115,65,108,108,111,99,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,70,108,115,70,114,101,101,0,0,0,0,0,2,0,0,0,70,108,115,71,101,116,86,97,108,117,101,0,0,0,0,0,0,0,0,0,2,0,0,0,70,108,115,83,101,116,86,97,108,117,101,0,0,0,0, + 0,1,0,0,0,2,0,0,0,0,56,2,128,1,0,0,0,160,56,2,128,1,0,0,0,1,0,0,0,0,0,0,0,240,154,1,128,1,0,0,0,2,0,0,0,0,0,0,0,248,154,1,128,1,0,0,0,3,0,0,0,0,0,0,0,0,155,1,128,1,0,0,0,4,0,0,0,0,0,0,0,8,155,1,128,1,0,0,0,5,0,0,0,0,0,0,0,24,155,1,128,1,0,0, + 0,6,0,0,0,0,0,0,0,32,155,1,128,1,0,0,0,7,0,0,0,0,0,0,0,40,155,1,128,1,0,0,0,8,0,0,0,0,0,0,0,48,155,1,128,1,0,0,0,9,0,0,0,0,0,0,0,56,155,1,128,1,0,0,0,10,0,0,0,0,0,0,0,64,155,1,128,1,0,0,0,11,0,0,0,0,0,0,0,72,155,1,128,1,0,0,0,12,0,0,0,0,0,0, + 0,80,155,1,128,1,0,0,0,13,0,0,0,0,0,0,0,88,155,1,128,1,0,0,0,14,0,0,0,0,0,0,0,96,155,1,128,1,0,0,0,15,0,0,0,0,0,0,0,104,155,1,128,1,0,0,0,16,0,0,0,0,0,0,0,112,155,1,128,1,0,0,0,17,0,0,0,0,0,0,0,120,155,1,128,1,0,0,0,18,0,0,0,0,0,0,0,128,155, + 1,128,1,0,0,0,19,0,0,0,0,0,0,0,136,155,1,128,1,0,0,0,20,0,0,0,0,0,0,0,144,155,1,128,1,0,0,0,21,0,0,0,0,0,0,0,152,155,1,128,1,0,0,0,22,0,0,0,0,0,0,0,160,155,1,128,1,0,0,0,24,0,0,0,0,0,0,0,168,155,1,128,1,0,0,0,25,0,0,0,0,0,0,0,176,155,1,128,1, + 0,0,0,26,0,0,0,0,0,0,0,184,155,1,128,1,0,0,0,27,0,0,0,0,0,0,0,192,155,1,128,1,0,0,0,28,0,0,0,0,0,0,0,200,155,1,128,1,0,0,0,29,0,0,0,0,0,0,0,208,155,1,128,1,0,0,0,30,0,0,0,0,0,0,0,216,155,1,128,1,0,0,0,31,0,0,0,0,0,0,0,224,155,1,128,1,0,0,0,32, + 0,0,0,0,0,0,0,232,155,1,128,1,0,0,0,33,0,0,0,0,0,0,0,240,155,1,128,1,0,0,0,34,0,0,0,0,0,0,0,248,155,1,128,1,0,0,0,35,0,0,0,0,0,0,0,0,156,1,128,1,0,0,0,36,0,0,0,0,0,0,0,8,156,1,128,1,0,0,0,37,0,0,0,0,0,0,0,16,156,1,128,1,0,0,0,38,0,0,0,0,0,0, + 0,24,156,1,128,1,0,0,0,39,0,0,0,0,0,0,0,32,156,1,128,1,0,0,0,41,0,0,0,0,0,0,0,40,156,1,128,1,0,0,0,42,0,0,0,0,0,0,0,48,156,1,128,1,0,0,0,43,0,0,0,0,0,0,0,56,156,1,128,1,0,0,0,44,0,0,0,0,0,0,0,64,156,1,128,1,0,0,0,45,0,0,0,0,0,0,0,72,156,1,128, + 1,0,0,0,47,0,0,0,0,0,0,0,80,156,1,128,1,0,0,0,54,0,0,0,0,0,0,0,88,156,1,128,1,0,0,0,55,0,0,0,0,0,0,0,96,156,1,128,1,0,0,0,56,0,0,0,0,0,0,0,104,156,1,128,1,0,0,0,57,0,0,0,0,0,0,0,112,156,1,128,1,0,0,0,62,0,0,0,0,0,0,0,120,156,1,128,1,0,0,0,63, + 0,0,0,0,0,0,0,128,156,1,128,1,0,0,0,64,0,0,0,0,0,0,0,136,156,1,128,1,0,0,0,65,0,0,0,0,0,0,0,144,156,1,128,1,0,0,0,67,0,0,0,0,0,0,0,152,156,1,128,1,0,0,0,68,0,0,0,0,0,0,0,160,156,1,128,1,0,0,0,70,0,0,0,0,0,0,0,168,156,1,128,1,0,0,0,71,0,0,0,0, + 0,0,0,176,156,1,128,1,0,0,0,73,0,0,0,0,0,0,0,184,156,1,128,1,0,0,0,74,0,0,0,0,0,0,0,192,156,1,128,1,0,0,0,75,0,0,0,0,0,0,0,200,156,1,128,1,0,0,0,78,0,0,0,0,0,0,0,208,156,1,128,1,0,0,0,79,0,0,0,0,0,0,0,216,156,1,128,1,0,0,0,80,0,0,0,0,0,0,0,224, + 156,1,128,1,0,0,0,86,0,0,0,0,0,0,0,232,156,1,128,1,0,0,0,87,0,0,0,0,0,0,0,240,156,1,128,1,0,0,0,90,0,0,0,0,0,0,0,248,156,1,128,1,0,0,0,101,0,0,0,0,0,0,0,0,157,1,128,1,0,0,0,127,0,0,0,0,0,0,0,8,157,1,128,1,0,0,0,1,4,0,0,0,0,0,0,16,157,1,128,1, + 0,0,0,2,4,0,0,0,0,0,0,32,157,1,128,1,0,0,0,3,4,0,0,0,0,0,0,48,157,1,128,1,0,0,0,4,4,0,0,0,0,0,0,216,123,1,128,1,0,0,0,5,4,0,0,0,0,0,0,64,157,1,128,1,0,0,0,6,4,0,0,0,0,0,0,80,157,1,128,1,0,0,0,7,4,0,0,0,0,0,0,96,157,1,128,1,0,0,0,8,4,0,0,0,0, + 0,0,112,157,1,128,1,0,0,0,9,4,0,0,0,0,0,0,96,130,1,128,1,0,0,0,11,4,0,0,0,0,0,0,128,157,1,128,1,0,0,0,12,4,0,0,0,0,0,0,144,157,1,128,1,0,0,0,13,4,0,0,0,0,0,0,160,157,1,128,1,0,0,0,14,4,0,0,0,0,0,0,176,157,1,128,1,0,0,0,15,4,0,0,0,0,0,0,192,157, + 1,128,1,0,0,0,16,4,0,0,0,0,0,0,208,157,1,128,1,0,0,0,17,4,0,0,0,0,0,0,168,123,1,128,1,0,0,0,18,4,0,0,0,0,0,0,200,123,1,128,1,0,0,0,19,4,0,0,0,0,0,0,224,157,1,128,1,0,0,0,20,4,0,0,0,0,0,0,240,157,1,128,1,0,0,0,21,4,0,0,0,0,0,0,0,158,1,128,1,0, + 0,0,22,4,0,0,0,0,0,0,16,158,1,128,1,0,0,0,24,4,0,0,0,0,0,0,32,158,1,128,1,0,0,0,25,4,0,0,0,0,0,0,48,158,1,128,1,0,0,0,26,4,0,0,0,0,0,0,64,158,1,128,1,0,0,0,27,4,0,0,0,0,0,0,80,158,1,128,1,0,0,0,28,4,0,0,0,0,0,0,96,158,1,128,1,0,0,0,29,4,0,0, + 0,0,0,0,112,158,1,128,1,0,0,0,30,4,0,0,0,0,0,0,128,158,1,128,1,0,0,0,31,4,0,0,0,0,0,0,144,158,1,128,1,0,0,0,32,4,0,0,0,0,0,0,160,158,1,128,1,0,0,0,33,4,0,0,0,0,0,0,176,158,1,128,1,0,0,0,34,4,0,0,0,0,0,0,192,158,1,128,1,0,0,0,35,4,0,0,0,0,0,0, + 208,158,1,128,1,0,0,0,36,4,0,0,0,0,0,0,224,158,1,128,1,0,0,0,37,4,0,0,0,0,0,0,240,158,1,128,1,0,0,0,38,4,0,0,0,0,0,0,0,159,1,128,1,0,0,0,39,4,0,0,0,0,0,0,16,159,1,128,1,0,0,0,41,4,0,0,0,0,0,0,32,159,1,128,1,0,0,0,42,4,0,0,0,0,0,0,48,159,1,128, + 1,0,0,0,43,4,0,0,0,0,0,0,64,159,1,128,1,0,0,0,44,4,0,0,0,0,0,0,80,159,1,128,1,0,0,0,45,4,0,0,0,0,0,0,104,159,1,128,1,0,0,0,47,4,0,0,0,0,0,0,120,159,1,128,1,0,0,0,50,4,0,0,0,0,0,0,136,159,1,128,1,0,0,0,52,4,0,0,0,0,0,0,152,159,1,128,1,0,0,0,53, + 4,0,0,0,0,0,0,168,159,1,128,1,0,0,0,54,4,0,0,0,0,0,0,184,159,1,128,1,0,0,0,55,4,0,0,0,0,0,0,200,159,1,128,1,0,0,0,56,4,0,0,0,0,0,0,216,159,1,128,1,0,0,0,57,4,0,0,0,0,0,0,232,159,1,128,1,0,0,0,58,4,0,0,0,0,0,0,248,159,1,128,1,0,0,0,59,4,0,0,0, + 0,0,0,8,160,1,128,1,0,0,0,62,4,0,0,0,0,0,0,24,160,1,128,1,0,0,0,63,4,0,0,0,0,0,0,40,160,1,128,1,0,0,0,64,4,0,0,0,0,0,0,56,160,1,128,1,0,0,0,65,4,0,0,0,0,0,0,72,160,1,128,1,0,0,0,67,4,0,0,0,0,0,0,88,160,1,128,1,0,0,0,68,4,0,0,0,0,0,0,112,160, + 1,128,1,0,0,0,69,4,0,0,0,0,0,0,128,160,1,128,1,0,0,0,70,4,0,0,0,0,0,0,144,160,1,128,1,0,0,0,71,4,0,0,0,0,0,0,160,160,1,128,1,0,0,0,73,4,0,0,0,0,0,0,176,160,1,128,1,0,0,0,74,4,0,0,0,0,0,0,192,160,1,128,1,0,0,0,75,4,0,0,0,0,0,0,208,160,1,128,1, + 0,0,0,76,4,0,0,0,0,0,0,224,160,1,128,1,0,0,0,78,4,0,0,0,0,0,0,240,160,1,128,1,0,0,0,79,4,0,0,0,0,0,0,0,161,1,128,1,0,0,0,80,4,0,0,0,0,0,0,16,161,1,128,1,0,0,0,82,4,0,0,0,0,0,0,32,161,1,128,1,0,0,0,86,4,0,0,0,0,0,0,48,161,1,128,1,0,0,0,87,4,0, + 0,0,0,0,0,64,161,1,128,1,0,0,0,90,4,0,0,0,0,0,0,80,161,1,128,1,0,0,0,101,4,0,0,0,0,0,0,96,161,1,128,1,0,0,0,107,4,0,0,0,0,0,0,112,161,1,128,1,0,0,0,108,4,0,0,0,0,0,0,128,161,1,128,1,0,0,0,129,4,0,0,0,0,0,0,144,161,1,128,1,0,0,0,1,8,0,0,0,0,0, + 0,160,161,1,128,1,0,0,0,4,8,0,0,0,0,0,0,184,123,1,128,1,0,0,0,7,8,0,0,0,0,0,0,176,161,1,128,1,0,0,0,9,8,0,0,0,0,0,0,192,161,1,128,1,0,0,0,10,8,0,0,0,0,0,0,208,161,1,128,1,0,0,0,12,8,0,0,0,0,0,0,224,161,1,128,1,0,0,0,16,8,0,0,0,0,0,0,240,161, + 1,128,1,0,0,0,19,8,0,0,0,0,0,0,0,162,1,128,1,0,0,0,20,8,0,0,0,0,0,0,16,162,1,128,1,0,0,0,22,8,0,0,0,0,0,0,32,162,1,128,1,0,0,0,26,8,0,0,0,0,0,0,48,162,1,128,1,0,0,0,29,8,0,0,0,0,0,0,72,162,1,128,1,0,0,0,44,8,0,0,0,0,0,0,88,162,1,128,1,0,0,0, + 59,8,0,0,0,0,0,0,112,162,1,128,1,0,0,0,62,8,0,0,0,0,0,0,128,162,1,128,1,0,0,0,67,8,0,0,0,0,0,0,144,162,1,128,1,0,0,0,107,8,0,0,0,0,0,0,168,162,1,128,1,0,0,0,1,12,0,0,0,0,0,0,184,162,1,128,1,0,0,0,4,12,0,0,0,0,0,0,200,162,1,128,1,0,0,0,7,12,0, + 0,0,0,0,0,216,162,1,128,1,0,0,0,9,12,0,0,0,0,0,0,232,162,1,128,1,0,0,0,10,12,0,0,0,0,0,0,248,162,1,128,1,0,0,0,12,12,0,0,0,0,0,0,8,163,1,128,1,0,0,0,26,12,0,0,0,0,0,0,24,163,1,128,1,0,0,0,59,12,0,0,0,0,0,0,48,163,1,128,1,0,0,0,107,12,0,0,0,0, + 0,0,64,163,1,128,1,0,0,0,1,16,0,0,0,0,0,0,80,163,1,128,1,0,0,0,4,16,0,0,0,0,0,0,96,163,1,128,1,0,0,0,7,16,0,0,0,0,0,0,112,163,1,128,1,0,0,0,9,16,0,0,0,0,0,0,128,163,1,128,1,0,0,0,10,16,0,0,0,0,0,0,144,163,1,128,1,0,0,0,12,16,0,0,0,0,0,0,160, + 163,1,128,1,0,0,0,26,16,0,0,0,0,0,0,176,163,1,128,1,0,0,0,59,16,0,0,0,0,0,0,192,163,1,128,1,0,0,0,1,20,0,0,0,0,0,0,208,163,1,128,1,0,0,0,4,20,0,0,0,0,0,0,224,163,1,128,1,0,0,0,7,20,0,0,0,0,0,0,240,163,1,128,1,0,0,0,9,20,0,0,0,0,0,0,0,164,1,128, + 1,0,0,0,10,20,0,0,0,0,0,0,16,164,1,128,1,0,0,0,12,20,0,0,0,0,0,0,32,164,1,128,1,0,0,0,26,20,0,0,0,0,0,0,48,164,1,128,1,0,0,0,59,20,0,0,0,0,0,0,72,164,1,128,1,0,0,0,1,24,0,0,0,0,0,0,88,164,1,128,1,0,0,0,9,24,0,0,0,0,0,0,104,164,1,128,1,0,0,0, + 10,24,0,0,0,0,0,0,120,164,1,128,1,0,0,0,12,24,0,0,0,0,0,0,136,164,1,128,1,0,0,0,26,24,0,0,0,0,0,0,152,164,1,128,1,0,0,0,59,24,0,0,0,0,0,0,176,164,1,128,1,0,0,0,1,28,0,0,0,0,0,0,192,164,1,128,1,0,0,0,9,28,0,0,0,0,0,0,208,164,1,128,1,0,0,0,10, + 28,0,0,0,0,0,0,224,164,1,128,1,0,0,0,26,28,0,0,0,0,0,0,240,164,1,128,1,0,0,0,59,28,0,0,0,0,0,0,8,165,1,128,1,0,0,0,1,32,0,0,0,0,0,0,24,165,1,128,1,0,0,0,9,32,0,0,0,0,0,0,40,165,1,128,1,0,0,0,10,32,0,0,0,0,0,0,56,165,1,128,1,0,0,0,59,32,0,0,0, + 0,0,0,72,165,1,128,1,0,0,0,1,36,0,0,0,0,0,0,88,165,1,128,1,0,0,0,9,36,0,0,0,0,0,0,104,165,1,128,1,0,0,0,10,36,0,0,0,0,0,0,120,165,1,128,1,0,0,0,59,36,0,0,0,0,0,0,136,165,1,128,1,0,0,0,1,40,0,0,0,0,0,0,152,165,1,128,1,0,0,0,9,40,0,0,0,0,0,0,168, + 165,1,128,1,0,0,0,10,40,0,0,0,0,0,0,184,165,1,128,1,0,0,0,1,44,0,0,0,0,0,0,200,165,1,128,1,0,0,0,9,44,0,0,0,0,0,0,216,165,1,128,1,0,0,0,10,44,0,0,0,0,0,0,232,165,1,128,1,0,0,0,1,48,0,0,0,0,0,0,248,165,1,128,1,0,0,0,9,48,0,0,0,0,0,0,8,166,1,128, + 1,0,0,0,10,48,0,0,0,0,0,0,24,166,1,128,1,0,0,0,1,52,0,0,0,0,0,0,40,166,1,128,1,0,0,0,9,52,0,0,0,0,0,0,56,166,1,128,1,0,0,0,10,52,0,0,0,0,0,0,72,166,1,128,1,0,0,0,1,56,0,0,0,0,0,0,88,166,1,128,1,0,0,0,10,56,0,0,0,0,0,0,104,166,1,128,1,0,0,0,1, + 60,0,0,0,0,0,0,120,166,1,128,1,0,0,0,10,60,0,0,0,0,0,0,136,166,1,128,1,0,0,0,1,64,0,0,0,0,0,0,152,166,1,128,1,0,0,0,10,64,0,0,0,0,0,0,168,166,1,128,1,0,0,0,10,68,0,0,0,0,0,0,184,166,1,128,1,0,0,0,10,72,0,0,0,0,0,0,200,166,1,128,1,0,0,0,10,76, + 0,0,0,0,0,0,216,166,1,128,1,0,0,0,10,80,0,0,0,0,0,0,232,166,1,128,1,0,0,0,4,124,0,0,0,0,0,0,248,166,1,128,1,0,0,0,26,124,0,0,0,0,0,0,8,167,1,128,1,0,0,0,97,0,114,0,0,0,0,0,98,0,103,0,0,0,0,0,99,0,97,0,0,0,0,0,122,0,104,0,45,0,67,0,72,0,83,0, + 0,0,0,0,99,0,115,0,0,0,0,0,100,0,97,0,0,0,0,0,100,0,101,0,0,0,0,0,101,0,108,0,0,0,0,0,101,0,110,0,0,0,0,0,101,0,115,0,0,0,0,0,102,0,105,0,0,0,0,0,102,0,114,0,0,0,0,0,104,0,101,0,0,0,0,0,104,0,117,0,0,0,0,0,105,0,115,0,0,0,0,0,105,0,116,0,0,0, + 0,0,106,0,97,0,0,0,0,0,107,0,111,0,0,0,0,0,110,0,108,0,0,0,0,0,110,0,111,0,0,0,0,0,112,0,108,0,0,0,0,0,112,0,116,0,0,0,0,0,114,0,111,0,0,0,0,0,114,0,117,0,0,0,0,0,104,0,114,0,0,0,0,0,115,0,107,0,0,0,0,0,115,0,113,0,0,0,0,0,115,0,118,0,0,0,0, + 0,116,0,104,0,0,0,0,0,116,0,114,0,0,0,0,0,117,0,114,0,0,0,0,0,105,0,100,0,0,0,0,0,117,0,107,0,0,0,0,0,98,0,101,0,0,0,0,0,115,0,108,0,0,0,0,0,101,0,116,0,0,0,0,0,108,0,118,0,0,0,0,0,108,0,116,0,0,0,0,0,102,0,97,0,0,0,0,0,118,0,105,0,0,0,0,0,104, + 0,121,0,0,0,0,0,97,0,122,0,0,0,0,0,101,0,117,0,0,0,0,0,109,0,107,0,0,0,0,0,97,0,102,0,0,0,0,0,107,0,97,0,0,0,0,0,102,0,111,0,0,0,0,0,104,0,105,0,0,0,0,0,109,0,115,0,0,0,0,0,107,0,107,0,0,0,0,0,107,0,121,0,0,0,0,0,115,0,119,0,0,0,0,0,117,0,122, + 0,0,0,0,0,116,0,116,0,0,0,0,0,112,0,97,0,0,0,0,0,103,0,117,0,0,0,0,0,116,0,97,0,0,0,0,0,116,0,101,0,0,0,0,0,107,0,110,0,0,0,0,0,109,0,114,0,0,0,0,0,115,0,97,0,0,0,0,0,109,0,110,0,0,0,0,0,103,0,108,0,0,0,0,0,107,0,111,0,107,0,0,0,115,0,121,0, + 114,0,0,0,100,0,105,0,118,0,0,0,0,0,0,0,0,0,0,0,97,0,114,0,45,0,83,0,65,0,0,0,0,0,0,0,98,0,103,0,45,0,66,0,71,0,0,0,0,0,0,0,99,0,97,0,45,0,69,0,83,0,0,0,0,0,0,0,99,0,115,0,45,0,67,0,90,0,0,0,0,0,0,0,100,0,97,0,45,0,68,0,75,0,0,0,0,0,0,0,100, + 0,101,0,45,0,68,0,69,0,0,0,0,0,0,0,101,0,108,0,45,0,71,0,82,0,0,0,0,0,0,0,102,0,105,0,45,0,70,0,73,0,0,0,0,0,0,0,102,0,114,0,45,0,70,0,82,0,0,0,0,0,0,0,104,0,101,0,45,0,73,0,76,0,0,0,0,0,0,0,104,0,117,0,45,0,72,0,85,0,0,0,0,0,0,0,105,0,115,0, + 45,0,73,0,83,0,0,0,0,0,0,0,105,0,116,0,45,0,73,0,84,0,0,0,0,0,0,0,110,0,108,0,45,0,78,0,76,0,0,0,0,0,0,0,110,0,98,0,45,0,78,0,79,0,0,0,0,0,0,0,112,0,108,0,45,0,80,0,76,0,0,0,0,0,0,0,112,0,116,0,45,0,66,0,82,0,0,0,0,0,0,0,114,0,111,0,45,0,82, + 0,79,0,0,0,0,0,0,0,114,0,117,0,45,0,82,0,85,0,0,0,0,0,0,0,104,0,114,0,45,0,72,0,82,0,0,0,0,0,0,0,115,0,107,0,45,0,83,0,75,0,0,0,0,0,0,0,115,0,113,0,45,0,65,0,76,0,0,0,0,0,0,0,115,0,118,0,45,0,83,0,69,0,0,0,0,0,0,0,116,0,104,0,45,0,84,0,72,0, + 0,0,0,0,0,0,116,0,114,0,45,0,84,0,82,0,0,0,0,0,0,0,117,0,114,0,45,0,80,0,75,0,0,0,0,0,0,0,105,0,100,0,45,0,73,0,68,0,0,0,0,0,0,0,117,0,107,0,45,0,85,0,65,0,0,0,0,0,0,0,98,0,101,0,45,0,66,0,89,0,0,0,0,0,0,0,115,0,108,0,45,0,83,0,73,0,0,0,0,0, + 0,0,101,0,116,0,45,0,69,0,69,0,0,0,0,0,0,0,108,0,118,0,45,0,76,0,86,0,0,0,0,0,0,0,108,0,116,0,45,0,76,0,84,0,0,0,0,0,0,0,102,0,97,0,45,0,73,0,82,0,0,0,0,0,0,0,118,0,105,0,45,0,86,0,78,0,0,0,0,0,0,0,104,0,121,0,45,0,65,0,77,0,0,0,0,0,0,0,97,0, + 122,0,45,0,65,0,90,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,101,0,117,0,45,0,69,0,83,0,0,0,0,0,0,0,109,0,107,0,45,0,77,0,75,0,0,0,0,0,0,0,116,0,110,0,45,0,90,0,65,0,0,0,0,0,0,0,120,0,104,0,45,0,90,0,65,0,0,0,0,0,0,0,122,0,117,0,45,0,90,0,65,0,0, + 0,0,0,0,0,97,0,102,0,45,0,90,0,65,0,0,0,0,0,0,0,107,0,97,0,45,0,71,0,69,0,0,0,0,0,0,0,102,0,111,0,45,0,70,0,79,0,0,0,0,0,0,0,104,0,105,0,45,0,73,0,78,0,0,0,0,0,0,0,109,0,116,0,45,0,77,0,84,0,0,0,0,0,0,0,115,0,101,0,45,0,78,0,79,0,0,0,0,0,0,0, + 109,0,115,0,45,0,77,0,89,0,0,0,0,0,0,0,107,0,107,0,45,0,75,0,90,0,0,0,0,0,0,0,107,0,121,0,45,0,75,0,71,0,0,0,0,0,0,0,115,0,119,0,45,0,75,0,69,0,0,0,0,0,0,0,117,0,122,0,45,0,85,0,90,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,116,0,116,0,45,0,82,0,85, + 0,0,0,0,0,0,0,98,0,110,0,45,0,73,0,78,0,0,0,0,0,0,0,112,0,97,0,45,0,73,0,78,0,0,0,0,0,0,0,103,0,117,0,45,0,73,0,78,0,0,0,0,0,0,0,116,0,97,0,45,0,73,0,78,0,0,0,0,0,0,0,116,0,101,0,45,0,73,0,78,0,0,0,0,0,0,0,107,0,110,0,45,0,73,0,78,0,0,0,0,0, + 0,0,109,0,108,0,45,0,73,0,78,0,0,0,0,0,0,0,109,0,114,0,45,0,73,0,78,0,0,0,0,0,0,0,115,0,97,0,45,0,73,0,78,0,0,0,0,0,0,0,109,0,110,0,45,0,77,0,78,0,0,0,0,0,0,0,99,0,121,0,45,0,71,0,66,0,0,0,0,0,0,0,103,0,108,0,45,0,69,0,83,0,0,0,0,0,0,0,107,0, + 111,0,107,0,45,0,73,0,78,0,0,0,0,0,115,0,121,0,114,0,45,0,83,0,89,0,0,0,0,0,100,0,105,0,118,0,45,0,77,0,86,0,0,0,0,0,113,0,117,0,122,0,45,0,66,0,79,0,0,0,0,0,110,0,115,0,45,0,90,0,65,0,0,0,0,0,0,0,109,0,105,0,45,0,78,0,90,0,0,0,0,0,0,0,97,0, + 114,0,45,0,73,0,81,0,0,0,0,0,0,0,100,0,101,0,45,0,67,0,72,0,0,0,0,0,0,0,101,0,110,0,45,0,71,0,66,0,0,0,0,0,0,0,101,0,115,0,45,0,77,0,88,0,0,0,0,0,0,0,102,0,114,0,45,0,66,0,69,0,0,0,0,0,0,0,105,0,116,0,45,0,67,0,72,0,0,0,0,0,0,0,110,0,108,0,45, + 0,66,0,69,0,0,0,0,0,0,0,110,0,110,0,45,0,78,0,79,0,0,0,0,0,0,0,112,0,116,0,45,0,80,0,84,0,0,0,0,0,0,0,115,0,114,0,45,0,83,0,80,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,115,0,118,0,45,0,70,0,73,0,0,0,0,0,0,0,97,0,122,0,45,0,65,0,90,0,45,0,67,0,121, + 0,114,0,108,0,0,0,0,0,115,0,101,0,45,0,83,0,69,0,0,0,0,0,0,0,109,0,115,0,45,0,66,0,78,0,0,0,0,0,0,0,117,0,122,0,45,0,85,0,90,0,45,0,67,0,121,0,114,0,108,0,0,0,0,0,113,0,117,0,122,0,45,0,69,0,67,0,0,0,0,0,97,0,114,0,45,0,69,0,71,0,0,0,0,0,0,0, + 122,0,104,0,45,0,72,0,75,0,0,0,0,0,0,0,100,0,101,0,45,0,65,0,84,0,0,0,0,0,0,0,101,0,110,0,45,0,65,0,85,0,0,0,0,0,0,0,101,0,115,0,45,0,69,0,83,0,0,0,0,0,0,0,102,0,114,0,45,0,67,0,65,0,0,0,0,0,0,0,115,0,114,0,45,0,83,0,80,0,45,0,67,0,121,0,114, + 0,108,0,0,0,0,0,115,0,101,0,45,0,70,0,73,0,0,0,0,0,0,0,113,0,117,0,122,0,45,0,80,0,69,0,0,0,0,0,97,0,114,0,45,0,76,0,89,0,0,0,0,0,0,0,122,0,104,0,45,0,83,0,71,0,0,0,0,0,0,0,100,0,101,0,45,0,76,0,85,0,0,0,0,0,0,0,101,0,110,0,45,0,67,0,65,0,0, + 0,0,0,0,0,101,0,115,0,45,0,71,0,84,0,0,0,0,0,0,0,102,0,114,0,45,0,67,0,72,0,0,0,0,0,0,0,104,0,114,0,45,0,66,0,65,0,0,0,0,0,0,0,115,0,109,0,106,0,45,0,78,0,79,0,0,0,0,0,97,0,114,0,45,0,68,0,90,0,0,0,0,0,0,0,122,0,104,0,45,0,77,0,79,0,0,0,0,0, + 0,0,100,0,101,0,45,0,76,0,73,0,0,0,0,0,0,0,101,0,110,0,45,0,78,0,90,0,0,0,0,0,0,0,101,0,115,0,45,0,67,0,82,0,0,0,0,0,0,0,102,0,114,0,45,0,76,0,85,0,0,0,0,0,0,0,98,0,115,0,45,0,66,0,65,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,115,0,109,0,106,0,45, + 0,83,0,69,0,0,0,0,0,97,0,114,0,45,0,77,0,65,0,0,0,0,0,0,0,101,0,110,0,45,0,73,0,69,0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,65,0,0,0,0,0,0,0,102,0,114,0,45,0,77,0,67,0,0,0,0,0,0,0,115,0,114,0,45,0,66,0,65,0,45,0,76,0,97,0,116,0,110,0,0,0,0,0,115, + 0,109,0,97,0,45,0,78,0,79,0,0,0,0,0,97,0,114,0,45,0,84,0,78,0,0,0,0,0,0,0,101,0,110,0,45,0,90,0,65,0,0,0,0,0,0,0,101,0,115,0,45,0,68,0,79,0,0,0,0,0,0,0,115,0,114,0,45,0,66,0,65,0,45,0,67,0,121,0,114,0,108,0,0,0,0,0,115,0,109,0,97,0,45,0,83,0, + 69,0,0,0,0,0,97,0,114,0,45,0,79,0,77,0,0,0,0,0,0,0,101,0,110,0,45,0,74,0,77,0,0,0,0,0,0,0,101,0,115,0,45,0,86,0,69,0,0,0,0,0,0,0,115,0,109,0,115,0,45,0,70,0,73,0,0,0,0,0,97,0,114,0,45,0,89,0,69,0,0,0,0,0,0,0,101,0,110,0,45,0,67,0,66,0,0,0,0, + 0,0,0,101,0,115,0,45,0,67,0,79,0,0,0,0,0,0,0,115,0,109,0,110,0,45,0,70,0,73,0,0,0,0,0,97,0,114,0,45,0,83,0,89,0,0,0,0,0,0,0,101,0,110,0,45,0,66,0,90,0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,69,0,0,0,0,0,0,0,97,0,114,0,45,0,74,0,79,0,0,0,0,0,0,0,101, + 0,110,0,45,0,84,0,84,0,0,0,0,0,0,0,101,0,115,0,45,0,65,0,82,0,0,0,0,0,0,0,97,0,114,0,45,0,76,0,66,0,0,0,0,0,0,0,101,0,110,0,45,0,90,0,87,0,0,0,0,0,0,0,101,0,115,0,45,0,69,0,67,0,0,0,0,0,0,0,97,0,114,0,45,0,75,0,87,0,0,0,0,0,0,0,101,0,110,0,45, + 0,80,0,72,0,0,0,0,0,0,0,101,0,115,0,45,0,67,0,76,0,0,0,0,0,0,0,97,0,114,0,45,0,65,0,69,0,0,0,0,0,0,0,101,0,115,0,45,0,85,0,89,0,0,0,0,0,0,0,97,0,114,0,45,0,66,0,72,0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,89,0,0,0,0,0,0,0,97,0,114,0,45,0,81,0,65, + 0,0,0,0,0,0,0,101,0,115,0,45,0,66,0,79,0,0,0,0,0,0,0,101,0,115,0,45,0,83,0,86,0,0,0,0,0,0,0,101,0,115,0,45,0,72,0,78,0,0,0,0,0,0,0,101,0,115,0,45,0,78,0,73,0,0,0,0,0,0,0,101,0,115,0,45,0,80,0,82,0,0,0,0,0,0,0,122,0,104,0,45,0,67,0,72,0,84,0, + 0,0,0,0,115,0,114,0,0,0,0,0,8,157,1,128,1,0,0,0,66,0,0,0,0,0,0,0,88,156,1,128,1,0,0,0,44,0,0,0,0,0,0,0,80,181,1,128,1,0,0,0,113,0,0,0,0,0,0,0,240,154,1,128,1,0,0,0,0,0,0,0,0,0,0,0,96,181,1,128,1,0,0,0,216,0,0,0,0,0,0,0,112,181,1,128,1,0,0,0, + 218,0,0,0,0,0,0,0,128,181,1,128,1,0,0,0,177,0,0,0,0,0,0,0,144,181,1,128,1,0,0,0,160,0,0,0,0,0,0,0,160,181,1,128,1,0,0,0,143,0,0,0,0,0,0,0,176,181,1,128,1,0,0,0,207,0,0,0,0,0,0,0,192,181,1,128,1,0,0,0,213,0,0,0,0,0,0,0,208,181,1,128,1,0,0,0,210, + 0,0,0,0,0,0,0,224,181,1,128,1,0,0,0,169,0,0,0,0,0,0,0,240,181,1,128,1,0,0,0,185,0,0,0,0,0,0,0,0,182,1,128,1,0,0,0,196,0,0,0,0,0,0,0,16,182,1,128,1,0,0,0,220,0,0,0,0,0,0,0,32,182,1,128,1,0,0,0,67,0,0,0,0,0,0,0,48,182,1,128,1,0,0,0,204,0,0,0,0, + 0,0,0,64,182,1,128,1,0,0,0,191,0,0,0,0,0,0,0,80,182,1,128,1,0,0,0,200,0,0,0,0,0,0,0,64,156,1,128,1,0,0,0,41,0,0,0,0,0,0,0,96,182,1,128,1,0,0,0,155,0,0,0,0,0,0,0,120,182,1,128,1,0,0,0,107,0,0,0,0,0,0,0,0,156,1,128,1,0,0,0,33,0,0,0,0,0,0,0,144, + 182,1,128,1,0,0,0,99,0,0,0,0,0,0,0,248,154,1,128,1,0,0,0,1,0,0,0,0,0,0,0,160,182,1,128,1,0,0,0,68,0,0,0,0,0,0,0,176,182,1,128,1,0,0,0,125,0,0,0,0,0,0,0,192,182,1,128,1,0,0,0,183,0,0,0,0,0,0,0,0,155,1,128,1,0,0,0,2,0,0,0,0,0,0,0,216,182,1,128, + 1,0,0,0,69,0,0,0,0,0,0,0,24,155,1,128,1,0,0,0,4,0,0,0,0,0,0,0,232,182,1,128,1,0,0,0,71,0,0,0,0,0,0,0,248,182,1,128,1,0,0,0,135,0,0,0,0,0,0,0,32,155,1,128,1,0,0,0,5,0,0,0,0,0,0,0,8,183,1,128,1,0,0,0,72,0,0,0,0,0,0,0,40,155,1,128,1,0,0,0,6,0,0, + 0,0,0,0,0,24,183,1,128,1,0,0,0,162,0,0,0,0,0,0,0,40,183,1,128,1,0,0,0,145,0,0,0,0,0,0,0,56,183,1,128,1,0,0,0,73,0,0,0,0,0,0,0,72,183,1,128,1,0,0,0,179,0,0,0,0,0,0,0,88,183,1,128,1,0,0,0,171,0,0,0,0,0,0,0,0,157,1,128,1,0,0,0,65,0,0,0,0,0,0,0, + 104,183,1,128,1,0,0,0,139,0,0,0,0,0,0,0,48,155,1,128,1,0,0,0,7,0,0,0,0,0,0,0,120,183,1,128,1,0,0,0,74,0,0,0,0,0,0,0,56,155,1,128,1,0,0,0,8,0,0,0,0,0,0,0,136,183,1,128,1,0,0,0,163,0,0,0,0,0,0,0,152,183,1,128,1,0,0,0,205,0,0,0,0,0,0,0,168,183, + 1,128,1,0,0,0,172,0,0,0,0,0,0,0,184,183,1,128,1,0,0,0,201,0,0,0,0,0,0,0,200,183,1,128,1,0,0,0,146,0,0,0,0,0,0,0,216,183,1,128,1,0,0,0,186,0,0,0,0,0,0,0,232,183,1,128,1,0,0,0,197,0,0,0,0,0,0,0,248,183,1,128,1,0,0,0,180,0,0,0,0,0,0,0,8,184,1,128, + 1,0,0,0,214,0,0,0,0,0,0,0,24,184,1,128,1,0,0,0,208,0,0,0,0,0,0,0,40,184,1,128,1,0,0,0,75,0,0,0,0,0,0,0,56,184,1,128,1,0,0,0,192,0,0,0,0,0,0,0,72,184,1,128,1,0,0,0,211,0,0,0,0,0,0,0,64,155,1,128,1,0,0,0,9,0,0,0,0,0,0,0,88,184,1,128,1,0,0,0,209, + 0,0,0,0,0,0,0,104,184,1,128,1,0,0,0,221,0,0,0,0,0,0,0,120,184,1,128,1,0,0,0,215,0,0,0,0,0,0,0,136,184,1,128,1,0,0,0,202,0,0,0,0,0,0,0,152,184,1,128,1,0,0,0,181,0,0,0,0,0,0,0,168,184,1,128,1,0,0,0,193,0,0,0,0,0,0,0,184,184,1,128,1,0,0,0,212,0, + 0,0,0,0,0,0,200,184,1,128,1,0,0,0,164,0,0,0,0,0,0,0,216,184,1,128,1,0,0,0,173,0,0,0,0,0,0,0,232,184,1,128,1,0,0,0,223,0,0,0,0,0,0,0,248,184,1,128,1,0,0,0,147,0,0,0,0,0,0,0,8,185,1,128,1,0,0,0,224,0,0,0,0,0,0,0,24,185,1,128,1,0,0,0,187,0,0,0, + 0,0,0,0,40,185,1,128,1,0,0,0,206,0,0,0,0,0,0,0,56,185,1,128,1,0,0,0,225,0,0,0,0,0,0,0,72,185,1,128,1,0,0,0,219,0,0,0,0,0,0,0,88,185,1,128,1,0,0,0,222,0,0,0,0,0,0,0,104,185,1,128,1,0,0,0,217,0,0,0,0,0,0,0,120,185,1,128,1,0,0,0,198,0,0,0,0,0,0, + 0,16,156,1,128,1,0,0,0,35,0,0,0,0,0,0,0,136,185,1,128,1,0,0,0,101,0,0,0,0,0,0,0,72,156,1,128,1,0,0,0,42,0,0,0,0,0,0,0,152,185,1,128,1,0,0,0,108,0,0,0,0,0,0,0,40,156,1,128,1,0,0,0,38,0,0,0,0,0,0,0,168,185,1,128,1,0,0,0,104,0,0,0,0,0,0,0,72,155, + 1,128,1,0,0,0,10,0,0,0,0,0,0,0,184,185,1,128,1,0,0,0,76,0,0,0,0,0,0,0,104,156,1,128,1,0,0,0,46,0,0,0,0,0,0,0,200,185,1,128,1,0,0,0,115,0,0,0,0,0,0,0,80,155,1,128,1,0,0,0,11,0,0,0,0,0,0,0,216,185,1,128,1,0,0,0,148,0,0,0,0,0,0,0,232,185,1,128, + 1,0,0,0,165,0,0,0,0,0,0,0,248,185,1,128,1,0,0,0,174,0,0,0,0,0,0,0,8,186,1,128,1,0,0,0,77,0,0,0,0,0,0,0,24,186,1,128,1,0,0,0,182,0,0,0,0,0,0,0,40,186,1,128,1,0,0,0,188,0,0,0,0,0,0,0,232,156,1,128,1,0,0,0,62,0,0,0,0,0,0,0,56,186,1,128,1,0,0,0, + 136,0,0,0,0,0,0,0,176,156,1,128,1,0,0,0,55,0,0,0,0,0,0,0,72,186,1,128,1,0,0,0,127,0,0,0,0,0,0,0,88,155,1,128,1,0,0,0,12,0,0,0,0,0,0,0,88,186,1,128,1,0,0,0,78,0,0,0,0,0,0,0,112,156,1,128,1,0,0,0,47,0,0,0,0,0,0,0,104,186,1,128,1,0,0,0,116,0,0, + 0,0,0,0,0,184,155,1,128,1,0,0,0,24,0,0,0,0,0,0,0,120,186,1,128,1,0,0,0,175,0,0,0,0,0,0,0,136,186,1,128,1,0,0,0,90,0,0,0,0,0,0,0,96,155,1,128,1,0,0,0,13,0,0,0,0,0,0,0,152,186,1,128,1,0,0,0,79,0,0,0,0,0,0,0,56,156,1,128,1,0,0,0,40,0,0,0,0,0,0, + 0,168,186,1,128,1,0,0,0,106,0,0,0,0,0,0,0,240,155,1,128,1,0,0,0,31,0,0,0,0,0,0,0,184,186,1,128,1,0,0,0,97,0,0,0,0,0,0,0,104,155,1,128,1,0,0,0,14,0,0,0,0,0,0,0,200,186,1,128,1,0,0,0,80,0,0,0,0,0,0,0,112,155,1,128,1,0,0,0,15,0,0,0,0,0,0,0,216, + 186,1,128,1,0,0,0,149,0,0,0,0,0,0,0,232,186,1,128,1,0,0,0,81,0,0,0,0,0,0,0,120,155,1,128,1,0,0,0,16,0,0,0,0,0,0,0,248,186,1,128,1,0,0,0,82,0,0,0,0,0,0,0,96,156,1,128,1,0,0,0,45,0,0,0,0,0,0,0,8,187,1,128,1,0,0,0,114,0,0,0,0,0,0,0,128,156,1,128, + 1,0,0,0,49,0,0,0,0,0,0,0,24,187,1,128,1,0,0,0,120,0,0,0,0,0,0,0,200,156,1,128,1,0,0,0,58,0,0,0,0,0,0,0,40,187,1,128,1,0,0,0,130,0,0,0,0,0,0,0,128,155,1,128,1,0,0,0,17,0,0,0,0,0,0,0,240,156,1,128,1,0,0,0,63,0,0,0,0,0,0,0,56,187,1,128,1,0,0,0, + 137,0,0,0,0,0,0,0,72,187,1,128,1,0,0,0,83,0,0,0,0,0,0,0,136,156,1,128,1,0,0,0,50,0,0,0,0,0,0,0,88,187,1,128,1,0,0,0,121,0,0,0,0,0,0,0,32,156,1,128,1,0,0,0,37,0,0,0,0,0,0,0,104,187,1,128,1,0,0,0,103,0,0,0,0,0,0,0,24,156,1,128,1,0,0,0,36,0,0,0, + 0,0,0,0,120,187,1,128,1,0,0,0,102,0,0,0,0,0,0,0,136,187,1,128,1,0,0,0,142,0,0,0,0,0,0,0,80,156,1,128,1,0,0,0,43,0,0,0,0,0,0,0,152,187,1,128,1,0,0,0,109,0,0,0,0,0,0,0,168,187,1,128,1,0,0,0,131,0,0,0,0,0,0,0,224,156,1,128,1,0,0,0,61,0,0,0,0,0, + 0,0,184,187,1,128,1,0,0,0,134,0,0,0,0,0,0,0,208,156,1,128,1,0,0,0,59,0,0,0,0,0,0,0,200,187,1,128,1,0,0,0,132,0,0,0,0,0,0,0,120,156,1,128,1,0,0,0,48,0,0,0,0,0,0,0,216,187,1,128,1,0,0,0,157,0,0,0,0,0,0,0,232,187,1,128,1,0,0,0,119,0,0,0,0,0,0,0, + 248,187,1,128,1,0,0,0,117,0,0,0,0,0,0,0,8,188,1,128,1,0,0,0,85,0,0,0,0,0,0,0,136,155,1,128,1,0,0,0,18,0,0,0,0,0,0,0,24,188,1,128,1,0,0,0,150,0,0,0,0,0,0,0,40,188,1,128,1,0,0,0,84,0,0,0,0,0,0,0,56,188,1,128,1,0,0,0,151,0,0,0,0,0,0,0,144,155,1, + 128,1,0,0,0,19,0,0,0,0,0,0,0,72,188,1,128,1,0,0,0,141,0,0,0,0,0,0,0,168,156,1,128,1,0,0,0,54,0,0,0,0,0,0,0,88,188,1,128,1,0,0,0,126,0,0,0,0,0,0,0,152,155,1,128,1,0,0,0,20,0,0,0,0,0,0,0,104,188,1,128,1,0,0,0,86,0,0,0,0,0,0,0,160,155,1,128,1,0, + 0,0,21,0,0,0,0,0,0,0,120,188,1,128,1,0,0,0,87,0,0,0,0,0,0,0,136,188,1,128,1,0,0,0,152,0,0,0,0,0,0,0,152,188,1,128,1,0,0,0,140,0,0,0,0,0,0,0,168,188,1,128,1,0,0,0,159,0,0,0,0,0,0,0,184,188,1,128,1,0,0,0,168,0,0,0,0,0,0,0,168,155,1,128,1,0,0,0, + 22,0,0,0,0,0,0,0,200,188,1,128,1,0,0,0,88,0,0,0,0,0,0,0,176,155,1,128,1,0,0,0,23,0,0,0,0,0,0,0,216,188,1,128,1,0,0,0,89,0,0,0,0,0,0,0,216,156,1,128,1,0,0,0,60,0,0,0,0,0,0,0,232,188,1,128,1,0,0,0,133,0,0,0,0,0,0,0,248,188,1,128,1,0,0,0,167,0, + 0,0,0,0,0,0,8,189,1,128,1,0,0,0,118,0,0,0,0,0,0,0,24,189,1,128,1,0,0,0,156,0,0,0,0,0,0,0,192,155,1,128,1,0,0,0,25,0,0,0,0,0,0,0,40,189,1,128,1,0,0,0,91,0,0,0,0,0,0,0,8,156,1,128,1,0,0,0,34,0,0,0,0,0,0,0,56,189,1,128,1,0,0,0,100,0,0,0,0,0,0,0, + 72,189,1,128,1,0,0,0,190,0,0,0,0,0,0,0,88,189,1,128,1,0,0,0,195,0,0,0,0,0,0,0,104,189,1,128,1,0,0,0,176,0,0,0,0,0,0,0,120,189,1,128,1,0,0,0,184,0,0,0,0,0,0,0,136,189,1,128,1,0,0,0,203,0,0,0,0,0,0,0,152,189,1,128,1,0,0,0,199,0,0,0,0,0,0,0,200, + 155,1,128,1,0,0,0,26,0,0,0,0,0,0,0,168,189,1,128,1,0,0,0,92,0,0,0,0,0,0,0,8,167,1,128,1,0,0,0,227,0,0,0,0,0,0,0,184,189,1,128,1,0,0,0,194,0,0,0,0,0,0,0,208,189,1,128,1,0,0,0,189,0,0,0,0,0,0,0,232,189,1,128,1,0,0,0,166,0,0,0,0,0,0,0,0,190,1,128, + 1,0,0,0,153,0,0,0,0,0,0,0,208,155,1,128,1,0,0,0,27,0,0,0,0,0,0,0,24,190,1,128,1,0,0,0,154,0,0,0,0,0,0,0,40,190,1,128,1,0,0,0,93,0,0,0,0,0,0,0,144,156,1,128,1,0,0,0,51,0,0,0,0,0,0,0,56,190,1,128,1,0,0,0,122,0,0,0,0,0,0,0,248,156,1,128,1,0,0,0, + 64,0,0,0,0,0,0,0,72,190,1,128,1,0,0,0,138,0,0,0,0,0,0,0,184,156,1,128,1,0,0,0,56,0,0,0,0,0,0,0,88,190,1,128,1,0,0,0,128,0,0,0,0,0,0,0,192,156,1,128,1,0,0,0,57,0,0,0,0,0,0,0,104,190,1,128,1,0,0,0,129,0,0,0,0,0,0,0,216,155,1,128,1,0,0,0,28,0,0, + 0,0,0,0,0,120,190,1,128,1,0,0,0,94,0,0,0,0,0,0,0,136,190,1,128,1,0,0,0,110,0,0,0,0,0,0,0,224,155,1,128,1,0,0,0,29,0,0,0,0,0,0,0,152,190,1,128,1,0,0,0,95,0,0,0,0,0,0,0,160,156,1,128,1,0,0,0,53,0,0,0,0,0,0,0,168,190,1,128,1,0,0,0,124,0,0,0,0,0, + 0,0,248,155,1,128,1,0,0,0,32,0,0,0,0,0,0,0,184,190,1,128,1,0,0,0,98,0,0,0,0,0,0,0,232,155,1,128,1,0,0,0,30,0,0,0,0,0,0,0,200,190,1,128,1,0,0,0,96,0,0,0,0,0,0,0,152,156,1,128,1,0,0,0,52,0,0,0,0,0,0,0,216,190,1,128,1,0,0,0,158,0,0,0,0,0,0,0,240, + 190,1,128,1,0,0,0,123,0,0,0,0,0,0,0,48,156,1,128,1,0,0,0,39,0,0,0,0,0,0,0,8,191,1,128,1,0,0,0,105,0,0,0,0,0,0,0,24,191,1,128,1,0,0,0,111,0,0,0,0,0,0,0,40,191,1,128,1,0,0,0,3,0,0,0,0,0,0,0,56,191,1,128,1,0,0,0,226,0,0,0,0,0,0,0,72,191,1,128,1, + 0,0,0,144,0,0,0,0,0,0,0,88,191,1,128,1,0,0,0,161,0,0,0,0,0,0,0,104,191,1,128,1,0,0,0,178,0,0,0,0,0,0,0,120,191,1,128,1,0,0,0,170,0,0,0,0,0,0,0,136,191,1,128,1,0,0,0,70,0,0,0,0,0,0,0,152,191,1,128,1,0,0,0,112,0,0,0,0,0,0,0,97,0,102,0,45,0,122, + 0,97,0,0,0,0,0,0,0,97,0,114,0,45,0,97,0,101,0,0,0,0,0,0,0,97,0,114,0,45,0,98,0,104,0,0,0,0,0,0,0,97,0,114,0,45,0,100,0,122,0,0,0,0,0,0,0,97,0,114,0,45,0,101,0,103,0,0,0,0,0,0,0,97,0,114,0,45,0,105,0,113,0,0,0,0,0,0,0,97,0,114,0,45,0,106,0,111, + 0,0,0,0,0,0,0,97,0,114,0,45,0,107,0,119,0,0,0,0,0,0,0,97,0,114,0,45,0,108,0,98,0,0,0,0,0,0,0,97,0,114,0,45,0,108,0,121,0,0,0,0,0,0,0,97,0,114,0,45,0,109,0,97,0,0,0,0,0,0,0,97,0,114,0,45,0,111,0,109,0,0,0,0,0,0,0,97,0,114,0,45,0,113,0,97,0,0, + 0,0,0,0,0,97,0,114,0,45,0,115,0,97,0,0,0,0,0,0,0,97,0,114,0,45,0,115,0,121,0,0,0,0,0,0,0,97,0,114,0,45,0,116,0,110,0,0,0,0,0,0,0,97,0,114,0,45,0,121,0,101,0,0,0,0,0,0,0,97,0,122,0,45,0,97,0,122,0,45,0,99,0,121,0,114,0,108,0,0,0,0,0,97,0,122, + 0,45,0,97,0,122,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,98,0,101,0,45,0,98,0,121,0,0,0,0,0,0,0,98,0,103,0,45,0,98,0,103,0,0,0,0,0,0,0,98,0,110,0,45,0,105,0,110,0,0,0,0,0,0,0,98,0,115,0,45,0,98,0,97,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,99,0,97, + 0,45,0,101,0,115,0,0,0,0,0,0,0,99,0,115,0,45,0,99,0,122,0,0,0,0,0,0,0,99,0,121,0,45,0,103,0,98,0,0,0,0,0,0,0,100,0,97,0,45,0,100,0,107,0,0,0,0,0,0,0,100,0,101,0,45,0,97,0,116,0,0,0,0,0,0,0,100,0,101,0,45,0,99,0,104,0,0,0,0,0,0,0,100,0,101,0, + 45,0,100,0,101,0,0,0,0,0,0,0,100,0,101,0,45,0,108,0,105,0,0,0,0,0,0,0,100,0,101,0,45,0,108,0,117,0,0,0,0,0,0,0,100,0,105,0,118,0,45,0,109,0,118,0,0,0,0,0,101,0,108,0,45,0,103,0,114,0,0,0,0,0,0,0,101,0,110,0,45,0,97,0,117,0,0,0,0,0,0,0,101,0, + 110,0,45,0,98,0,122,0,0,0,0,0,0,0,101,0,110,0,45,0,99,0,97,0,0,0,0,0,0,0,101,0,110,0,45,0,99,0,98,0,0,0,0,0,0,0,101,0,110,0,45,0,103,0,98,0,0,0,0,0,0,0,101,0,110,0,45,0,105,0,101,0,0,0,0,0,0,0,101,0,110,0,45,0,106,0,109,0,0,0,0,0,0,0,101,0,110, + 0,45,0,110,0,122,0,0,0,0,0,0,0,101,0,110,0,45,0,112,0,104,0,0,0,0,0,0,0,101,0,110,0,45,0,116,0,116,0,0,0,0,0,0,0,101,0,110,0,45,0,117,0,115,0,0,0,0,0,0,0,101,0,110,0,45,0,122,0,97,0,0,0,0,0,0,0,101,0,110,0,45,0,122,0,119,0,0,0,0,0,0,0,101,0, + 115,0,45,0,97,0,114,0,0,0,0,0,0,0,101,0,115,0,45,0,98,0,111,0,0,0,0,0,0,0,101,0,115,0,45,0,99,0,108,0,0,0,0,0,0,0,101,0,115,0,45,0,99,0,111,0,0,0,0,0,0,0,101,0,115,0,45,0,99,0,114,0,0,0,0,0,0,0,101,0,115,0,45,0,100,0,111,0,0,0,0,0,0,0,101,0, + 115,0,45,0,101,0,99,0,0,0,0,0,0,0,101,0,115,0,45,0,101,0,115,0,0,0,0,0,0,0,101,0,115,0,45,0,103,0,116,0,0,0,0,0,0,0,101,0,115,0,45,0,104,0,110,0,0,0,0,0,0,0,101,0,115,0,45,0,109,0,120,0,0,0,0,0,0,0,101,0,115,0,45,0,110,0,105,0,0,0,0,0,0,0,101, + 0,115,0,45,0,112,0,97,0,0,0,0,0,0,0,101,0,115,0,45,0,112,0,101,0,0,0,0,0,0,0,101,0,115,0,45,0,112,0,114,0,0,0,0,0,0,0,101,0,115,0,45,0,112,0,121,0,0,0,0,0,0,0,101,0,115,0,45,0,115,0,118,0,0,0,0,0,0,0,101,0,115,0,45,0,117,0,121,0,0,0,0,0,0,0, + 101,0,115,0,45,0,118,0,101,0,0,0,0,0,0,0,101,0,116,0,45,0,101,0,101,0,0,0,0,0,0,0,101,0,117,0,45,0,101,0,115,0,0,0,0,0,0,0,102,0,97,0,45,0,105,0,114,0,0,0,0,0,0,0,102,0,105,0,45,0,102,0,105,0,0,0,0,0,0,0,102,0,111,0,45,0,102,0,111,0,0,0,0,0, + 0,0,102,0,114,0,45,0,98,0,101,0,0,0,0,0,0,0,102,0,114,0,45,0,99,0,97,0,0,0,0,0,0,0,102,0,114,0,45,0,99,0,104,0,0,0,0,0,0,0,102,0,114,0,45,0,102,0,114,0,0,0,0,0,0,0,102,0,114,0,45,0,108,0,117,0,0,0,0,0,0,0,102,0,114,0,45,0,109,0,99,0,0,0,0,0, + 0,0,103,0,108,0,45,0,101,0,115,0,0,0,0,0,0,0,103,0,117,0,45,0,105,0,110,0,0,0,0,0,0,0,104,0,101,0,45,0,105,0,108,0,0,0,0,0,0,0,104,0,105,0,45,0,105,0,110,0,0,0,0,0,0,0,104,0,114,0,45,0,98,0,97,0,0,0,0,0,0,0,104,0,114,0,45,0,104,0,114,0,0,0,0, + 0,0,0,104,0,117,0,45,0,104,0,117,0,0,0,0,0,0,0,104,0,121,0,45,0,97,0,109,0,0,0,0,0,0,0,105,0,100,0,45,0,105,0,100,0,0,0,0,0,0,0,105,0,115,0,45,0,105,0,115,0,0,0,0,0,0,0,105,0,116,0,45,0,99,0,104,0,0,0,0,0,0,0,105,0,116,0,45,0,105,0,116,0,0,0, + 0,0,0,0,106,0,97,0,45,0,106,0,112,0,0,0,0,0,0,0,107,0,97,0,45,0,103,0,101,0,0,0,0,0,0,0,107,0,107,0,45,0,107,0,122,0,0,0,0,0,0,0,107,0,110,0,45,0,105,0,110,0,0,0,0,0,0,0,107,0,111,0,107,0,45,0,105,0,110,0,0,0,0,0,107,0,111,0,45,0,107,0,114,0, + 0,0,0,0,0,0,107,0,121,0,45,0,107,0,103,0,0,0,0,0,0,0,108,0,116,0,45,0,108,0,116,0,0,0,0,0,0,0,108,0,118,0,45,0,108,0,118,0,0,0,0,0,0,0,109,0,105,0,45,0,110,0,122,0,0,0,0,0,0,0,109,0,107,0,45,0,109,0,107,0,0,0,0,0,0,0,109,0,108,0,45,0,105,0,110, + 0,0,0,0,0,0,0,109,0,110,0,45,0,109,0,110,0,0,0,0,0,0,0,109,0,114,0,45,0,105,0,110,0,0,0,0,0,0,0,109,0,115,0,45,0,98,0,110,0,0,0,0,0,0,0,109,0,115,0,45,0,109,0,121,0,0,0,0,0,0,0,109,0,116,0,45,0,109,0,116,0,0,0,0,0,0,0,110,0,98,0,45,0,110,0,111, + 0,0,0,0,0,0,0,110,0,108,0,45,0,98,0,101,0,0,0,0,0,0,0,110,0,108,0,45,0,110,0,108,0,0,0,0,0,0,0,110,0,110,0,45,0,110,0,111,0,0,0,0,0,0,0,110,0,115,0,45,0,122,0,97,0,0,0,0,0,0,0,112,0,97,0,45,0,105,0,110,0,0,0,0,0,0,0,112,0,108,0,45,0,112,0,108, + 0,0,0,0,0,0,0,112,0,116,0,45,0,98,0,114,0,0,0,0,0,0,0,112,0,116,0,45,0,112,0,116,0,0,0,0,0,0,0,113,0,117,0,122,0,45,0,98,0,111,0,0,0,0,0,113,0,117,0,122,0,45,0,101,0,99,0,0,0,0,0,113,0,117,0,122,0,45,0,112,0,101,0,0,0,0,0,114,0,111,0,45,0,114, + 0,111,0,0,0,0,0,0,0,114,0,117,0,45,0,114,0,117,0,0,0,0,0,0,0,115,0,97,0,45,0,105,0,110,0,0,0,0,0,0,0,115,0,101,0,45,0,102,0,105,0,0,0,0,0,0,0,115,0,101,0,45,0,110,0,111,0,0,0,0,0,0,0,115,0,101,0,45,0,115,0,101,0,0,0,0,0,0,0,115,0,107,0,45,0, + 115,0,107,0,0,0,0,0,0,0,115,0,108,0,45,0,115,0,105,0,0,0,0,0,0,0,115,0,109,0,97,0,45,0,110,0,111,0,0,0,0,0,115,0,109,0,97,0,45,0,115,0,101,0,0,0,0,0,115,0,109,0,106,0,45,0,110,0,111,0,0,0,0,0,115,0,109,0,106,0,45,0,115,0,101,0,0,0,0,0,115,0, + 109,0,110,0,45,0,102,0,105,0,0,0,0,0,115,0,109,0,115,0,45,0,102,0,105,0,0,0,0,0,115,0,113,0,45,0,97,0,108,0,0,0,0,0,0,0,115,0,114,0,45,0,98,0,97,0,45,0,99,0,121,0,114,0,108,0,0,0,0,0,115,0,114,0,45,0,98,0,97,0,45,0,108,0,97,0,116,0,110,0,0,0, + 0,0,115,0,114,0,45,0,115,0,112,0,45,0,99,0,121,0,114,0,108,0,0,0,0,0,115,0,114,0,45,0,115,0,112,0,45,0,108,0,97,0,116,0,110,0,0,0,0,0,115,0,118,0,45,0,102,0,105,0,0,0,0,0,0,0,115,0,118,0,45,0,115,0,101,0,0,0,0,0,0,0,115,0,119,0,45,0,107,0,101, + 0,0,0,0,0,0,0,115,0,121,0,114,0,45,0,115,0,121,0,0,0,0,0,116,0,97,0,45,0,105,0,110,0,0,0,0,0,0,0,116,0,101,0,45,0,105,0,110,0,0,0,0,0,0,0,116,0,104,0,45,0,116,0,104,0,0,0,0,0,0,0,116,0,110,0,45,0,122,0,97,0,0,0,0,0,0,0,116,0,114,0,45,0,116,0, + 114,0,0,0,0,0,0,0,116,0,116,0,45,0,114,0,117,0,0,0,0,0,0,0,117,0,107,0,45,0,117,0,97,0,0,0,0,0,0,0,117,0,114,0,45,0,112,0,107,0,0,0,0,0,0,0,117,0,122,0,45,0,117,0,122,0,45,0,99,0,121,0,114,0,108,0,0,0,0,0,117,0,122,0,45,0,117,0,122,0,45,0,108, + 0,97,0,116,0,110,0,0,0,0,0,118,0,105,0,45,0,118,0,110,0,0,0,0,0,0,0,120,0,104,0,45,0,122,0,97,0,0,0,0,0,0,0,122,0,104,0,45,0,99,0,104,0,115,0,0,0,0,0,122,0,104,0,45,0,99,0,104,0,116,0,0,0,0,0,122,0,104,0,45,0,99,0,110,0,0,0,0,0,0,0,122,0,104, + 0,45,0,104,0,107,0,0,0,0,0,0,0,122,0,104,0,45,0,109,0,111,0,0,0,0,0,0,0,122,0,104,0,45,0,115,0,103,0,0,0,0,0,0,0,122,0,104,0,45,0,116,0,119,0,0,0,0,0,0,0,122,0,117,0,45,0,122,0,97,0,0,0,0,0,0,0,34,5,147,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, + 0,0,56,15,2,0,168,0,0,0,0,0,0,0,5,0,0,0,67,0,79,0,78,0,79,0,85,0,84,0,36,0,0,0,0,0,0,0,0,0,240,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,255,3,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,14,229,38,21,123,203,219,63,0,0,0,0,0,0,0,0,0,0,0,0,120,203,219,63,0,0,0,0,0,0,0,0,53, + 149,113,40,55,169,168,62,0,0,0,0,0,0,0,0,0,0,0,80,19,68,211,63,0,0,0,0,0,0,0,0,37,62,98,222,63,239,3,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,96,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,0,0,0,0,0,0,0,85,85,85,85,85,85,213,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,63,0,0,0,0,0,0,0,0,154,153,153,153,153,153,201,63,0,0,0,0,0,0,0,0,85,85,85,85,85,85,197,63,0,0,0,0,0, + 0,0,0,0,0,0,0,0,248,143,192,0,0,0,0,0,0,0,0,253,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,238,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,241,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255, + 127,0,0,0,0,0,0,0,0,230,84,85,85,85,85,181,63,0,0,0,0,0,0,0,0,212,198,186,153,153,153,137,63,0,0,0,0,0,0,0,0,159,81,241,7,35,73,98,63,0,0,0,0,0,0,0,0,240,255,93,200,52,128,60,63,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,1,0,0,0, + 2,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,158,189,91,63,0,0,0,112,212,175,107,63,0,0,0,96,149,185,116,63,0,0,0,160,118,148,123,63,0,0,0,160,77,52,129,63,0,0,0,80,8,155,132,63,0,0,0,192,113,254,135,63,0,0,0,128,144,94,139,63,0,0,0,240, + 106,187,142,63,0,0,0,160,131,10,145,63,0,0,0,224,181,181,146,63,0,0,0,80,79,95,148,63,0,0,0,0,83,7,150,63,0,0,0,208,195,173,151,63,0,0,0,240,164,82,153,63,0,0,0,32,249,245,154,63,0,0,0,112,195,151,156,63,0,0,0,160,6,56,158,63,0,0,0,176,197,214, + 159,63,0,0,0,160,1,186,160,63,0,0,0,32,225,135,161,63,0,0,0,192,2,85,162,63,0,0,0,192,103,33,163,63,0,0,0,144,17,237,163,63,0,0,0,128,1,184,164,63,0,0,0,224,56,130,165,63,0,0,0,16,185,75,166,63,0,0,0,64,131,20,167,63,0,0,0,192,152,220,167,63, + 0,0,0,208,250,163,168,63,0,0,0,192,170,106,169,63,0,0,0,208,169,48,170,63,0,0,0,32,249,245,170,63,0,0,0,0,154,186,171,63,0,0,0,144,141,126,172,63,0,0,0,16,213,65,173,63,0,0,0,160,113,4,174,63,0,0,0,112,100,198,174,63,0,0,0,176,174,135,175,63, + 0,0,0,192,40,36,176,63,0,0,0,240,38,132,176,63,0,0,0,144,210,227,176,63,0,0,0,48,44,67,177,63,0,0,0,64,52,162,177,63,0,0,0,96,235,0,178,63,0,0,0,16,82,95,178,63,0,0,0,224,104,189,178,63,0,0,0,80,48,27,179,63,0,0,0,224,168,120,179,63,0,0,0,48, + 211,213,179,63,0,0,0,160,175,50,180,63,0,0,0,208,62,143,180,63,0,0,0,32,129,235,180,63,0,0,0,48,119,71,181,63,0,0,0,96,33,163,181,63,0,0,0,64,128,254,181,63,0,0,0,64,148,89,182,63,0,0,0,240,93,180,182,63,0,0,0,176,221,14,183,63,0,0,0,0,20,105, + 183,63,0,0,0,96,1,195,183,63,0,0,0,48,166,28,184,63,0,0,0,0,3,118,184,63,0,0,0,48,24,207,184,63,0,0,0,64,230,39,185,63,0,0,0,144,109,128,185,63,0,0,0,160,174,216,185,63,0,0,0,208,169,48,186,63,0,0,0,160,95,136,186,63,0,0,0,112,208,223,186,63, + 0,0,0,176,252,54,187,63,0,0,0,208,228,141,187,63,0,0,0,48,137,228,187,63,0,0,0,64,234,58,188,63,0,0,0,112,8,145,188,63,0,0,0,16,228,230,188,63,0,0,0,160,125,60,189,63,0,0,0,128,213,145,189,63,0,0,0,0,236,230,189,63,0,0,0,160,193,59,190,63,0, + 0,0,176,86,144,190,63,0,0,0,160,171,228,190,63,0,0,0,192,192,56,191,63,0,0,0,128,150,140,191,63,0,0,0,48,45,224,191,63,0,0,0,160,194,25,192,63,0,0,0,112,79,67,192,63,0,0,0,96,189,108,192,63,0,0,0,128,12,150,192,63,0,0,0,0,61,191,192,63,0,0,0, + 16,79,232,192,63,0,0,0,240,66,17,193,63,0,0,0,160,24,58,193,63,0,0,0,128,208,98,193,63,0,0,0,144,106,139,193,63,0,0,0,16,231,179,193,63,0,0,0,48,70,220,193,63,0,0,0,16,136,4,194,63,0,0,0,224,172,44,194,63,0,0,0,208,180,84,194,63,0,0,0,240,159, + 124,194,63,0,0,0,128,110,164,194,63,0,0,0,176,32,204,194,63,0,0,0,144,182,243,194,63,0,0,0,80,48,27,195,63,0,0,0,32,142,66,195,63,0,0,0,32,208,105,195,63,0,0,0,128,246,144,195,63,0,0,0,96,1,184,195,63,0,0,0,224,240,222,195,63,0,0,0,48,197,5, + 196,63,0,0,0,112,126,44,196,63,0,0,0,208,28,83,196,63,0,0,0,112,160,121,196,63,0,0,0,112,9,160,196,63,0,0,0,0,88,198,196,63,0,0,0,48,140,236,196,63,0,0,0,64,166,18,197,63,0,0,0,48,166,56,197,63,0,0,0,80,140,94,197,63,0,0,0,144,88,132,197,63, + 0,0,0,64,11,170,197,63,0,0,0,112,164,207,197,63,0,0,0,64,36,245,197,63,0,0,0,208,138,26,198,63,0,0,0,80,216,63,198,63,0,0,0,208,12,101,198,63,0,0,0,128,40,138,198,63,0,0,0,128,43,175,198,63,0,0,0,224,21,212,198,63,0,0,0,208,231,248,198,63,0, + 0,0,112,161,29,199,63,0,0,0,224,66,66,199,63,0,0,0,64,204,102,199,63,0,0,0,160,61,139,199,63,0,0,0,48,151,175,199,63,0,0,0,16,217,211,199,63,0,0,0,80,3,248,199,63,0,0,0,32,22,28,200,63,0,0,0,144,17,64,200,63,0,0,0,192,245,99,200,63,0,0,0,224, + 194,135,200,63,0,0,0,0,121,171,200,63,0,0,0,48,24,207,200,63,0,0,0,160,160,242,200,63,0,0,0,112,18,22,201,63,0,0,0,176,109,57,201,63,0,0,0,128,178,92,201,63,0,0,0,0,225,127,201,63,0,0,0,80,249,162,201,63,0,0,0,112,251,197,201,63,0,0,0,176,231, + 232,201,63,0,0,0,240,189,11,202,63,0,0,0,128,126,46,202,63,0,0,0,96,41,81,202,63,0,0,0,160,190,115,202,63,0,0,0,112,62,150,202,63,0,0,0,240,168,184,202,63,0,0,0,32,254,218,202,63,0,0,0,48,62,253,202,63,0,0,0,48,105,31,203,63,0,0,0,64,127,65, + 203,63,0,0,0,112,128,99,203,63,0,0,0,240,108,133,203,63,0,0,0,176,68,167,203,63,0,0,0,240,7,201,203,63,0,0,0,192,182,234,203,63,0,0,0,48,81,12,204,63,0,0,0,80,215,45,204,63,0,0,0,80,73,79,204,63,0,0,0,64,167,112,204,63,0,0,0,48,241,145,204,63, + 0,0,0,64,39,179,204,63,0,0,0,128,73,212,204,63,0,0,0,16,88,245,204,63,0,0,0,0,83,22,205,63,0,0,0,96,58,55,205,63,0,0,0,96,14,88,205,63,0,0,0,0,207,120,205,63,0,0,0,112,124,153,205,63,0,0,0,160,22,186,205,63,0,0,0,208,157,218,205,63,0,0,0,240, + 17,251,205,63,0,0,0,48,115,27,206,63,0,0,0,160,193,59,206,63,0,0,0,80,253,91,206,63,0,0,0,96,38,124,206,63,0,0,0,224,60,156,206,63,0,0,0,224,64,188,206,63,0,0,0,128,50,220,206,63,0,0,0,208,17,252,206,63,0,0,0,224,222,27,207,63,0,0,0,208,153, + 59,207,63,0,0,0,160,66,91,207,63,0,0,0,128,217,122,207,63,0,0,0,112,94,154,207,63,0,0,0,144,209,185,207,63,0,0,0,240,50,217,207,63,0,0,0,160,130,248,207,63,0,0,0,80,224,11,208,63,0,0,0,160,118,27,208,63,0,0,0,48,4,43,208,63,0,0,0,16,137,58,208, + 63,0,0,0,64,5,74,208,63,0,0,0,224,120,89,208,63,0,0,0,240,227,104,208,63,0,0,0,112,70,120,208,63,0,0,0,128,160,135,208,63,0,0,0,16,242,150,208,63,0,0,0,48,59,166,208,63,0,0,0,240,123,181,208,63,0,0,0,80,180,196,208,63,0,0,0,96,228,211,208,63, + 0,0,0,48,12,227,208,63,0,0,0,192,43,242,208,63,0,0,0,16,67,1,209,63,0,0,0,64,82,16,209,63,0,0,0,64,89,31,209,63,0,0,0,48,88,46,209,63,0,0,0,0,79,61,209,63,0,0,0,208,61,76,209,63,0,0,0,160,36,91,209,63,0,0,0,112,3,106,209,63,0,0,0,80,218,120, + 209,63,0,0,0,64,169,135,209,63,0,0,0,96,112,150,209,63,0,0,0,160,47,165,209,63,0,0,0,16,231,179,209,63,0,0,0,192,150,194,209,63,0,0,0,176,62,209,209,63,0,0,0,240,222,223,209,63,0,0,0,112,119,238,209,63,0,0,0,96,8,253,209,63,0,0,0,160,145,11, + 210,63,0,0,0,80,19,26,210,63,0,0,0,112,141,40,210,63,0,0,0,16,0,55,210,63,0,0,0,48,107,69,210,63,0,0,0,208,206,83,210,63,0,0,0,0,43,98,210,63,0,0,0,208,127,112,210,63,0,0,0,64,205,126,210,63,0,0,0,96,19,141,210,63,0,0,0,32,82,155,210,63,0,0, + 0,160,137,169,210,63,0,0,0,224,185,183,210,63,0,0,0,224,226,197,210,63,0,0,0,176,4,212,210,63,0,0,0,80,31,226,210,63,0,0,0,192,50,240,210,63,0,0,0,32,63,254,210,63,0,0,0,112,68,12,211,63,0,0,0,176,66,26,211,63,0,0,0,224,57,40,211,63,0,0,0,16, + 42,54,211,63,0,0,0,80,19,68,211,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,32,178,34,188,10,178,61,212,13,46,51,105,15,177,61,87,210,126,232,13,149,206,61,105,109,98,59,68,243,211,61,87,62,54,165,234,90,244,61,11,191,225,60,104,67,196,61,17,165, + 198,96,205,137,249,61,159,46,31,32,111,98,253,61,205,189,218,184,139,79,233,61,21,48,66,239,216,136,0,62,173,121,43,166,19,4,8,62,196,211,238,192,23,151,5,62,2,73,212,173,119,74,173,61,14,48,55,240,63,118,14,62,195,246,6,71,215,98,225,61,20, + 188,77,31,204,1,6,62,191,229,246,81,224,243,234,61,235,243,26,30,11,122,9,62,199,2,192,112,137,163,192,61,81,199,87,0,0,46,16,62,14,110,205,238,0,91,21,62,175,181,3,112,41,134,223,61,109,163,54,179,185,87,16,62,79,234,6,74,200,75,19,62,173,188, + 161,158,218,67,22,62,42,234,247,180,167,102,29,62,239,252,247,56,224,178,246,61,136,240,112,198,84,233,243,61,179,202,58,9,9,114,4,62,167,93,39,231,143,112,29,62,231,185,113,119,158,223,31,62,96,6,10,167,191,39,8,62,20,188,77,31,204,1,22,62, + 91,94,106,16,246,55,6,62,75,98,124,241,19,106,18,62,58,98,128,206,178,62,9,62,222,148,21,233,209,48,20,62,49,160,143,16,16,107,29,62,65,242,186,11,156,135,22,62,43,188,166,94,1,8,255,61,108,103,198,205,61,182,41,62,44,171,196,188,44,2,43,62, + 68,101,221,125,208,23,249,61,158,55,3,87,96,64,21,62,96,27,122,148,139,209,12,62,126,169,124,39,101,173,23,62,169,95,159,197,77,136,17,62,130,208,6,96,196,17,23,62,248,8,49,60,46,9,47,62,58,225,43,227,197,20,23,62,154,79,115,253,167,187,38,62, + 131,132,224,181,143,244,253,61,149,11,77,199,155,47,35,62,19,12,121,72,232,115,249,61,110,88,198,8,188,204,30,62,152,74,82,249,233,21,33,62,184,49,49,89,64,23,47,62,53,56,100,37,139,207,27,62,128,237,139,29,168,95,31,62,228,217,41,249,77,74, + 36,62,148,12,34,216,32,152,18,62,9,227,4,147,72,11,42,62,254,101,166,171,86,77,31,62,99,81,54,25,144,12,33,62,54,39,89,254,120,15,248,61,202,28,200,37,136,82,16,62,106,116,109,125,83,149,224,61,96,6,10,167,191,39,24,62,60,147,69,236,168,176, + 6,62,169,219,245,27,248,90,16,62,21,213,85,38,250,226,23,62,191,228,174,191,236,89,13,62,163,63,104,218,47,139,29,62,55,55,58,253,221,184,36,62,4,18,174,97,126,130,19,62,159,15,233,73,123,140,44,62,29,89,151,21,240,234,41,62,54,123,49,110,166, + 170,25,62,85,6,114,9,86,114,46,62,84,172,122,252,51,28,38,62,82,162,97,207,43,102,41,62,48,39,196,17,200,67,24,62,54,203,90,11,187,100,32,62,164,1,39,132,12,52,10,62,214,121,143,181,85,142,26,62,154,157,94,156,33,45,233,61,106,253,127,13,230, + 99,63,62,20,99,81,217,14,155,46,62,12,53,98,25,144,35,41,62,129,94,120,56,136,111,50,62,175,166,171,76,106,91,59,62,28,118,142,220,106,34,240,61,237,26,58,49,215,74,60,62,23,141,115,124,232,100,21,62,24,102,138,241,236,143,51,62,102,118,119, + 245,158,146,61,62,184,160,141,240,59,72,57,62,38,88,170,238,14,221,59,62,186,55,2,89,221,196,57,62,199,202,235,224,233,243,26,62,172,13,39,130,83,206,53,62,186,185,42,83,116,79,57,62,84,134,136,149,39,52,7,62,240,75,227,11,0,90,12,62,130,208, + 6,96,196,17,39,62,248,140,237,180,37,0,37,62,160,210,242,206,139,209,46,62,84,117,10,12,46,40,33,62,202,167,89,51,243,112,13,62,37,64,168,19,126,127,43,62,30,137,33,195,110,48,51,62,80,117,139,3,248,199,63,62,100,29,215,140,53,176,62,62,116, + 148,133,34,200,118,58,62,227,134,222,82,198,14,61,62,175,88,134,224,204,164,47,62,158,10,192,210,162,132,59,62,209,91,194,242,176,165,32,62,153,246,91,34,96,214,61,62,55,240,155,133,15,177,8,62,225,203,144,181,35,136,62,62,246,150,30,243,17, + 19,54,62,154,15,162,92,135,31,46,62,165,185,57,73,114,149,44,62,226,88,62,122,149,5,56,62,52,3,159,234,38,241,47,62,9,86,142,89,245,83,57,62,72,196,86,248,111,193,54,62,244,97,242,15,34,203,36,62,162,83,61,213,32,225,53,62,86,242,137,97,127, + 82,58,62,15,156,212,255,252,86,56,62,218,215,40,130,46,12,48,62,224,223,68,148,208,19,241,61,166,89,234,14,99,16,37,62,17,215,50,15,120,46,38,62,207,248,16,26,217,62,237,61,133,205,75,126,74,101,35,62,33,173,128,73,120,91,5,62,100,110,177,212, + 45,47,33,62,12,245,57,217,173,196,55,62,252,128,113,98,132,23,40,62,97,73,225,199,98,81,234,61,99,81,54,25,144,12,49,62,136,118,161,43,77,60,55,62,129,61,233,224,165,232,42,62,175,33,22,240,198,176,42,62,102,91,221,116,139,30,48,62,148,84,187, + 236,111,32,45,62,0,204,79,114,139,180,240,61,41,226,97,11,31,131,63,62,175,188,7,196,151,26,248,61,170,183,203,28,108,40,62,62,147,10,34,73,11,99,40,62,92,44,162,193,21,11,255,61,70,9,28,231,69,84,53,62,133,109,6,248,48,230,59,62,57,108,217, + 240,223,153,37,62,129,176,143,177,133,204,54,62,200,168,30,0,109,71,52,62,31,211,22,158,136,63,55,62,135,42,121,13,16,87,51,62,246,1,97,174,121,209,59,62,226,246,195,86,16,163,12,62,251,8,156,98,112,40,61,62,63,103,210,128,56,186,58,62,166,125, + 41,203,51,54,44,62,2,234,239,153,56,132,33,62,230,8,32,157,201,204,59,62,80,211,189,68,5,0,56,62,225,106,96,38,194,145,43,62,223,43,182,38,223,122,42,62,201,110,130,200,79,118,24,62,240,104,15,229,61,79,31,62,227,149,121,117,202,96,247,61,71, + 81,128,211,126,102,252,61,111,223,106,25,246,51,55,62,107,131,62,243,16,183,47,62,19,16,100,186,110,136,57,62,26,140,175,208,104,83,251,61,113,41,141,27,105,140,53,62,251,8,109,34,101,148,254,61,151,0,63,6,126,88,51,62,24,159,18,2,231,24,54, + 62,84,172,122,252,51,28,54,62,74,96,8,132,166,7,63,62,33,84,148,228,191,52,60,62,11,48,65,14,240,177,56,62,99,27,214,132,66,67,63,62,54,116,57,94,9,99,58,62,222,25,185,86,134,66,52,62,166,217,178,1,146,202,54,62,28,147,42,58,130,56,39,62,48, + 146,23,14,136,17,60,62,254,82,109,141,220,61,49,62,23,233,34,137,213,238,51,62,80,221,107,132,146,89,41,62,139,39,46,95,77,219,13,62,196,53,6,42,241,165,241,61,52,60,44,136,240,66,70,62,94,71,246,167,155,238,42,62,228,96,74,131,127,75,38,62, + 46,121,67,226,66,13,41,62,1,79,19,8,32,39,76,62,91,207,214,22,46,120,74,62,72,102,218,121,92,80,68,62,33,205,77,234,212,169,76,62,188,213,124,98,61,125,41,62,19,170,188,249,92,177,32,62,221,118,207,99,32,91,49,62,72,39,170,243,230,131,41,62, + 148,233,255,244,100,76,63,62,15,90,232,124,186,190,70,62,184,166,78,253,105,156,59,62,171,164,95,131,165,106,43,62,209,237,15,121,195,204,67,62,224,79,64,196,76,192,41,62,157,216,117,122,75,115,64,62,18,22,224,196,4,68,27,62,148,72,206,194,101, + 197,64,62,205,53,217,65,20,199,51,62,78,59,107,85,146,164,114,61,67,220,65,3,9,250,32,62,244,217,227,9,112,143,46,62,69,138,4,139,246,27,75,62,86,169,250,223,82,238,62,62,189,101,228,0,9,107,69,62,102,118,119,245,158,146,77,62,96,226,55,134, + 162,110,72,62,240,162,12,241,175,101,70,62,116,236,72,175,253,17,47,62,199,209,164,134,27,190,76,62,101,118,168,254,91,176,37,62,29,74,26,10,194,206,65,62,159,155,64,10,95,205,65,62,112,80,38,200,86,54,69,62,96,34,40,53,216,126,55,62,210,185, + 64,48,188,23,36,62,242,239,121,123,239,142,64,62,233,87,220,57,111,199,77,62,87,244,12,167,147,4,76,62,12,166,165,206,214,131,74,62,186,87,197,13,112,214,48,62,10,189,232,18,108,201,68,62,21,35,227,147,25,44,61,62,66,130,95,19,33,199,34,62,125, + 116,218,77,62,154,39,62,43,167,65,105,159,248,252,61,49,8,241,2,167,73,33,62,219,117,129,124,75,173,78,62,10,231,99,254,48,105,78,62,47,238,217,190,6,225,65,62,146,28,241,130,43,104,45,62,124,164,219,136,241,7,58,62,246,114,193,45,52,249,64, + 62,37,62,98,222,63,239,3,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,32,224,31,224,31,224,255,63,240,7,252,1,127,192,255,63,18,250,1,170,28,161,255,63,32,248,129,31,248,129,255,63,181,219,160,172,16,99,255,63,113,66,74,158,101,68,255,63,181,10,35,68, + 246,37,255,63,8,31,124,240,193,7,255,63,2,142,69,248,199,233,254,63,192,236,1,179,7,204,254,63,235,1,186,122,128,174,254,63,103,183,240,171,49,145,254,63,228,80,151,165,26,116,254,63,116,229,1,201,58,87,254,63,115,26,220,121,145,58,254,63,30, + 30,30,30,30,30,254,63,30,224,1,30,224,1,254,63,138,134,248,227,214,229,253,63,202,29,160,220,1,202,253,63,219,129,185,118,96,174,253,63,138,127,30,35,242,146,253,63,52,44,184,84,182,119,253,63,178,114,117,128,172,92,253,63,29,212,65,29,212,65, + 253,63,26,91,252,163,44,39,253,63,116,192,110,143,181,12,253,63,198,191,68,92,110,242,252,63,11,155,3,137,86,216,252,63,231,203,1,150,109,190,252,63,145,225,94,5,179,164,252,63,66,138,251,90,38,139,252,63,28,199,113,28,199,113,252,63,134,73, + 13,209,148,88,252,63,240,248,195,1,143,63,252,63,28,160,46,57,181,38,252,63,224,192,129,3,7,14,252,63,139,141,134,238,131,245,251,63,247,6,148,137,43,221,251,63,123,62,136,101,253,196,251,63,208,186,193,20,249,172,251,63,35,255,24,43,30,149, + 251,63,139,51,218,61,108,125,251,63,5,238,190,227,226,101,251,63,79,27,232,180,129,78,251,63,206,6,216,74,72,55,251,63,217,128,108,64,54,32,251,63,164,34,217,49,75,9,251,63,40,175,161,188,134,242,250,63,94,144,148,127,232,219,250,63,27,112,197, + 26,112,197,250,63,253,235,135,47,29,175,250,63,190,99,106,96,239,152,250,63,89,225,48,81,230,130,250,63,109,26,208,166,1,109,250,63,74,138,104,7,65,87,250,63,26,164,65,26,164,65,250,63,160,28,197,135,42,44,250,63,2,75,122,249,211,22,250,63,26, + 160,1,26,160,1,250,63,217,51,16,149,142,236,249,63,45,104,107,23,159,215,249,63,2,161,228,78,209,194,249,63,218,16,85,234,36,174,249,63,154,153,153,153,153,153,249,63,255,192,142,13,47,133,249,63,114,184,12,248,228,112,249,63,174,119,227,11, + 187,92,249,63,224,233,214,252,176,72,249,63,230,44,155,127,198,52,249,63,41,226,208,73,251,32,249,63,213,144,1,18,79,13,249,63,250,24,156,143,193,249,248,63,63,55,241,122,82,230,248,63,211,24,48,141,1,211,248,63,58,255,98,128,206,191,248,63, + 170,243,107,15,185,172,248,63,156,137,1,246,192,153,248,63,74,176,171,240,229,134,248,63,185,146,192,188,39,116,248,63,24,134,97,24,134,97,248,63,20,6,120,194,0,79,248,63,221,190,178,122,151,60,248,63,160,164,130,1,74,42,248,63,24,24,24,24,24, + 24,248,63,6,24,96,128,1,6,248,63,64,127,1,253,5,244,247,63,29,79,90,81,37,226,247,63,244,5,125,65,95,208,247,63,124,1,46,146,179,190,247,63,195,236,224,8,34,173,247,63,139,57,182,107,170,155,247,63,200,164,120,129,76,138,247,63,13,198,154,17, + 8,121,247,63,177,169,52,228,220,103,247,63,109,117,1,194,202,86,247,63,70,23,93,116,209,69,247,63,141,254,65,197,240,52,247,63,188,222,70,127,40,36,247,63,9,124,156,109,120,19,247,63,112,129,11,92,224,2,247,63,23,96,242,22,96,242,246,63,199, + 55,67,107,247,225,246,63,97,200,129,38,166,209,246,63,23,108,193,22,108,193,246,63,61,26,163,10,73,177,246,63,144,114,83,209,60,161,246,63,192,208,136,58,71,145,246,63,23,104,129,22,104,129,246,63,26,103,1,54,159,113,246,63,249,34,81,106,236, + 97,246,63,163,74,59,133,79,82,246,63,100,33,11,89,200,66,246,63,222,192,138,184,86,51,246,63,64,98,1,119,250,35,246,63,148,174,49,104,179,20,246,63,6,22,88,96,129,5,246,63,252,45,41,52,100,246,245,63,231,21,208,184,91,231,245,63,165,226,236, + 195,103,216,245,63,87,16,147,43,136,201,245,63,145,250,71,198,188,186,245,63,192,90,1,107,5,172,245,63,170,204,35,241,97,157,245,63,237,88,129,48,210,142,245,63,96,5,88,1,86,128,245,63,58,107,80,60,237,113,245,63,226,82,124,186,151,99,245,63, + 85,85,85,85,85,85,245,63,254,130,187,230,37,71,245,63,235,15,244,72,9,57,245,63,75,5,168,86,255,42,245,63,21,248,226,234,7,29,245,63,197,196,17,225,34,15,245,63,21,80,1,21,80,1,245,63,155,76,221,98,143,243,244,63,57,5,47,167,224,229,244,63,76, + 44,220,190,67,216,244,63,110,175,37,135,184,202,244,63,225,143,166,221,62,189,244,63,91,191,82,160,214,175,244,63,74,1,118,173,127,162,244,63,103,208,178,227,57,149,244,63,128,72,1,34,5,136,244,63,123,20,174,71,225,122,244,63,102,96,89,52,206, + 109,244,63,154,207,245,199,203,96,244,63,202,118,199,226,217,83,244,63,251,217,98,101,248,70,244,63,77,238,171,48,39,58,244,63,135,31,213,37,102,45,244,63,81,89,94,38,181,32,244,63,20,20,20,20,20,20,244,63,102,101,14,209,130,7,244,63,251,19, + 176,63,1,251,243,63,7,175,165,66,143,238,243,63,2,169,228,188,44,226,243,63,198,117,170,145,217,213,243,63,231,171,123,164,149,201,243,63,85,41,35,217,96,189,243,63,20,59,177,19,59,177,243,63,34,200,122,56,36,165,243,63,99,127,24,44,28,153,243, + 63,142,8,102,211,34,141,243,63,20,56,129,19,56,129,243,63,238,69,201,209,91,117,243,63,72,7,222,243,141,105,243,63,248,42,159,95,206,93,243,63,193,120,43,251,28,82,243,63,70,19,224,172,121,70,243,63,178,188,87,91,228,58,243,63,250,29,106,237, + 92,47,243,63,191,16,43,74,227,35,243,63,182,235,233,88,119,24,243,63,144,209,48,1,25,13,243,63,96,2,196,42,200,1,243,63,104,47,161,189,132,246,242,63,75,209,254,161,78,235,242,63,151,128,75,192,37,224,242,63,160,80,45,1,10,213,242,63,160,44, + 129,77,251,201,242,63,17,55,90,142,249,190,242,63,64,43,1,173,4,180,242,63,5,193,243,146,28,169,242,63,158,18,228,41,65,158,242,63,165,4,184,91,114,147,242,63,19,176,136,18,176,136,242,63,77,206,161,56,250,125,242,63,53,39,129,184,80,115,242, + 63,39,1,214,124,179,104,242,63,241,146,128,112,34,94,242,63,178,119,145,126,157,83,242,63,146,36,73,146,36,73,242,63,91,96,23,151,183,62,242,63,223,188,154,120,86,52,242,63,42,18,160,34,1,42,242,63,120,251,33,129,183,31,242,63,230,85,72,128, + 121,21,242,63,217,192,103,12,71,11,242,63,18,32,1,18,32,1,242,63,112,31,193,125,4,247,241,63,76,184,127,60,244,236,241,63,116,184,63,59,239,226,241,63,189,74,46,103,245,216,241,63,29,129,162,173,6,207,241,63,89,224,28,252,34,197,241,63,41,237, + 70,64,74,187,241,63,227,186,242,103,124,177,241,63,150,123,26,97,185,167,241,63,158,17,224,25,1,158,241,63,156,162,140,128,83,148,241,63,219,43,144,131,176,138,241,63,18,24,129,17,24,129,241,63,132,214,27,25,138,119,241,63,121,115,66,137,6,110, + 241,63,1,50,252,80,141,100,241,63,13,39,117,95,30,91,241,63,201,213,253,163,185,81,241,63,59,205,10,14,95,72,241,63,36,71,52,141,14,63,241,63,17,200,53,17,200,53,241,63,172,192,237,137,139,44,241,63,51,48,93,231,88,35,241,63,38,72,167,25,48, + 26,241,63,17,17,17,17,17,17,241,63,128,16,1,190,251,7,241,63,17,240,254,16,240,254,240,63,162,37,179,250,237,245,240,63,144,156,230,107,245,236,240,63,17,96,130,85,6,228,240,63,150,70,143,168,32,219,240,63,58,158,53,86,68,210,240,63,59,218,188, + 79,113,201,240,63,113,65,139,134,167,192,240,63,200,157,37,236,230,183,240,63,181,236,46,114,47,175,240,63,167,16,104,10,129,166,240,63,96,131,175,166,219,157,240,63,84,9,1,57,63,149,240,63,226,101,117,179,171,140,240,63,132,16,66,8,33,132,240, + 63,226,234,184,41,159,123,240,63,198,247,71,10,38,115,240,63,251,18,121,156,181,106,240,63,252,169,241,210,77,98,240,63,134,117,114,160,238,89,240,63,4,52,215,247,151,81,240,63,197,100,22,204,73,73,240,63,16,4,65,16,4,65,240,63,252,71,130,183, + 198,56,240,63,26,94,31,181,145,48,240,63,233,41,119,252,100,40,240,63,8,4,2,129,64,32,240,63,55,122,81,54,36,24,240,63,16,16,16,16,16,16,240,63,128,0,1,2,4,8,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,0,0,108,111,103,49,48,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,255,63,67,255,255,255,255,255,255,63,195,176,43,0,128,1,0,0,0,192,43,0,128,1,0,0,0,224,43,0,128,1,0,0,0,64,44,0,128,1,0,0,0,48,45,0,128,1,0,0,0,0,0,0,0,0,0,0,0,176,43,0,128,1,0,0,0,192,43,0,128,1,0,0,0,224,43,0,128,1,0,0,0,128, + 104,0,128,1,0,0,0,128,45,0,128,1,0,0,0,0,0,0,0,0,0,0,0,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,69,0,66,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,0,0,0,0,0,0,69,0,66,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,92,0,120,0,54, + 0,52,0,92,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,46,0,100,0,108,0,108,0,0,0,123,0,70,0,51,0,48,0,49,0,55,0,50,0,50,0,54,0,45,0,70,0,69,0,50,0,65,0,45,0, + 52,0,50,0,57,0,53,0,45,0,56,0,66,0,68,0,70,0,45,0,48,0,48,0,67,0,51,0,65,0,57,0,65,0,55,0,69,0,52,0,67,0,53,0,125,0,0,0,123,0,50,0,67,0,68,0,56,0,65,0,48,0,48,0,55,0,45,0,69,0,49,0,56,0,57,0,45,0,52,0,48,0,57,0,68,0,45,0,65,0,50,0,67,0,56,0, + 45,0,57,0,65,0,70,0,52,0,69,0,70,0,51,0,67,0,55,0,50,0,65,0,65,0,125,0,0,0,123,0,48,0,68,0,53,0,48,0,66,0,70,0,69,0,67,0,45,0,67,0,68,0,54,0,65,0,45,0,52,0,70,0,57,0,65,0,45,0,57,0,54,0,52,0,67,0,45,0,67,0,55,0,52,0,49,0,54,0,69,0,51,0,65,0, + 67,0,66,0,49,0,48,0,125,0,0,0,123,0,54,0,53,0,67,0,51,0,53,0,66,0,49,0,52,0,45,0,54,0,67,0,49,0,68,0,45,0,52,0,49,0,50,0,50,0,45,0,65,0,67,0,52,0,54,0,45,0,55,0,49,0,52,0,56,0,67,0,67,0,57,0,68,0,54,0,52,0,57,0,55,0,125,0,0,0,123,0,66,0,69,0, + 53,0,57,0,69,0,56,0,70,0,68,0,45,0,48,0,56,0,57,0,65,0,45,0,52,0,49,0,49,0,66,0,45,0,65,0,51,0,66,0,48,0,45,0,48,0,53,0,49,0,68,0,57,0,69,0,52,0,49,0,55,0,56,0,49,0,56,0,125,0,0,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,92,0,77,0,105,0, + 99,0,114,0,111,0,115,0,111,0,102,0,116,0,92,0,69,0,100,0,103,0,101,0,85,0,112,0,100,0,97,0,116,0,101,0,92,0,67,0,108,0,105,0,101,0,110,0,116,0,115,0,92,0,123,0,53,0,54,0,69,0,66,0,49,0,56,0,70,0,56,0,45,0,66,0,48,0,48,0,56,0,45,0,52,0,67,0,66, + 0,68,0,45,0,66,0,54,0,68,0,50,0,45,0,56,0,67,0,57,0,55,0,70,0,69,0,55,0,69,0,57,0,48,0,54,0,50,0,125,0,0,0,0,0,0,0,0,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,92,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,92,0,69,0,100,0,103, + 0,101,0,85,0,112,0,100,0,97,0,116,0,101,0,92,0,67,0,108,0,105,0,101,0,110,0,116,0,83,0,116,0,97,0,116,0,101,0,92,0,0,0,0,0,98,0,101,0,116,0,97,0,0,0,100,0,101,0,118,0,0,0,99,0,97,0,110,0,97,0,114,0,121,0,0,0,105,0,110,0,116,0,101,0,114,0,110, + 0,97,0,108,0,0,0,92,0,0,0,87,101,98,86,105,101,119,50,58,32,70,97,105,108,101,100,32,116,111,32,102,105,110,100,32,116,104,101,32,97,112,112,32,101,120,101,32,112,97,116,104,46,10,0,87,101,98,86,105,101,119,50,58,32,70,97,105,108,101,100,32, + 116,111,32,102,105,110,100,32,116,104,101,32,87,101,98,86,105,101,119,50,32,99,108,105,101,110,116,32,100,108,108,32,97,116,58,32,0,10,0,71,101,116,70,105,108,101,86,101,114,115,105,111,110,73,110,102,111,83,105,122,101,87,0,71,101,116,70,105, + 108,101,86,101,114,115,105,111,110,73,110,102,111,87,0,86,101,114,81,117,101,114,121,86,97,108,117,101,87,0,0,92,0,83,0,116,0,114,0,105,0,110,0,103,0,70,0,105,0,108,0,101,0,73,0,110,0,102,0,111,0,92,0,48,0,52,0,48,0,57,0,48,0,52,0,66,0,48,0, + 92,0,80,0,114,0,111,0,100,0,117,0,99,0,116,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,0,0,0,0,76,57,162,14,230,150,227,74,143,154,132,115,171,239,55,50,32,0,0,0,87,101,98,86,105,101,119,50,58,32,70,97,105,108,101,100,32,116,111,32,102,105,110, + 100,32,97,110,32,105,110,115,116,97,108,108,101,100,32,87,101,98,86,105,101,119,50,32,114,117,110,116,105,109,101,32,111,114,32,110,111,110,45,115,116,97,98,108,101,32,77,105,99,114,111,115,111,102,116,32,69,100,103,101,32,105,110,115,116,97, + 108,108,97,116,105,111,110,46,10,0,0,159,83,141,196,159,227,28,68,174,104,31,102,229,112,189,197,87,101,98,86,105,101,119,50,58,32,115,107,105,112,112,101,100,32,105,110,97,99,99,101,115,115,105,98,108,101,32,0,97,0,112,0,105,0,45,0,109,0,115, + 0,45,0,119,0,105,0,110,0,45,0,99,0,111,0,114,0,101,0,45,0,118,0,101,0,114,0,115,0,105,0,111,0,110,0,45,0,108,0,49,0,45,0,49,0,45,0,48,0,46,0,100,0,108,0,108,0,0,0,118,0,101,0,114,0,115,0,105,0,111,0,110,0,46,0,100,0,108,0,108,0,0,0,77,0,105, + 0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,83,0,116,0,97,0,98,0,108,0,101,0,95,0,56,0,119,0,101,0,107,0,121,0,98,0,51,0,100,0,56,0,98,0,98,0,119,0, + 101,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,66,0,101,0,116,0,97,0,95,0,56,0,119,0,101,0,107,0,121,0,98,0,51,0,100,0,56,0,98,0,98, + 0,119,0,101,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,68,0,101,0,118,0,95,0,56,0,119,0,101,0,107,0,121,0,98,0,51,0,100,0,56,0,98,0, + 98,0,119,0,101,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,67,0,97,0,110,0,97,0,114,0,121,0,95,0,56,0,119,0,101,0,107,0,121,0,98,0,51, + 0,100,0,56,0,98,0,98,0,119,0,101,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,46,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,82,0,117,0,110,0,116,0,105,0,109,0,101,0,46,0,73,0,110,0,116,0,101,0,114,0,110,0,97,0,108,0,95,0,56,0, + 119,0,101,0,107,0,121,0,98,0,51,0,100,0,56,0,98,0,98,0,119,0,101,0,0,0,0,0,108,0,111,0,99,0,97,0,116,0,105,0,111,0,110,0,0,0,0,0,112,0,118,0,0,0,0,0,0,0,0,0,86,0,0,0,0,0,0,0,104,2,0,0,0,0,0,0,87,101,98,86,105,101,119,50,58,32,115,107,105,112, + 112,101,100,32,97,110,32,105,110,99,111,109,112,97,116,105,98,108,101,32,118,101,114,115,105,111,110,32,0,0,46,0,0,0,84,114,121,67,114,101,97,116,101,80,97,99,107,97,103,101,68,101,112,101,110,100,101,110,99,121,0,0,107,0,101,0,114,0,110,0,101, + 0,108,0,98,0,97,0,115,0,101,0,46,0,100,0,108,0,108,0,0,0,65,100,100,80,97,99,107,97,103,101,68,101,112,101,110,100,101,110,99,121,0,71,101,116,67,117,114,114,101,110,116,80,97,99,107,97,103,101,73,110,102,111,0,0,65,0,68,0,86,0,65,0,80,0,73, + 0,51,0,50,0,46,0,100,0,108,0,108,0,0,0,69,118,101,110,116,82,101,103,105,115,116,101,114,0,0,0,94,117,109,185,25,3,146,78,162,150,35,67,111,70,161,252,71,101,116,67,117,114,114,101,110,116,65,112,112,108,105,99,97,116,105,111,110,85,115,101, + 114,77,111,100,101,108,73,100,0,0,75,0,101,0,114,0,110,0,101,0,108,0,51,0,50,0,46,0,100,0,108,0,108,0,0,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,69,0,120,0,101,0,99,0,117,0,116,0,97,0,98,0,108,0,101,0,70,0,111,0,108,0,100,0,101,0,114,0,0,0, + 87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,66,0,82,0,79,0,87,0,83,0,69,0,82,0,95,0,69,0,88,0,69,0,67,0,85,0,84,0,65,0,66,0,76,0,69,0,95,0,70,0,79,0,76,0,68,0,69,0,82,0,0,0,85,0,115,0,101,0,114,0,68,0,97,0,116,0,97,0,70,0,111,0,108,0,100,0, + 101,0,114,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,85,0,83,0,69,0,82,0,95,0,68,0,65,0,84,0,65,0,95,0,70,0,79,0,76,0,68,0,69,0,82,0,0,0,82,0,101,0,108,0,101,0,97,0,115,0,101,0,67,0,104,0,97,0,110,0,110,0,101,0,108,0,115,0,0,0,87,0,69, + 0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,82,0,69,0,76,0,69,0,65,0,83,0,69,0,95,0,67,0,72,0,65,0,78,0,78,0,69,0,76,0,83,0,0,0,67,0,104,0,97,0,110,0,110,0,101,0,108,0,83,0,101,0,97,0,114,0,99,0,104,0,75,0,105,0,110,0,100,0,0,0,87,0,69,0,66,0,86,0, + 73,0,69,0,87,0,50,0,95,0,67,0,72,0,65,0,78,0,78,0,69,0,76,0,95,0,83,0,69,0,65,0,82,0,67,0,72,0,95,0,75,0,73,0,78,0,68,0,0,0,82,0,101,0,108,0,101,0,97,0,115,0,101,0,67,0,104,0,97,0,110,0,110,0,101,0,108,0,80,0,114,0,101,0,102,0,101,0,114,0,101, + 0,110,0,99,0,101,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,82,0,69,0,76,0,69,0,65,0,83,0,69,0,95,0,67,0,72,0,65,0,78,0,78,0,69,0,76,0,95,0,80,0,82,0,69,0,70,0,69,0,82,0,69,0,78,0,67,0,69,0,0,0,115,0,104,0,101,0,108,0,108,0,51,0,50,0, + 46,0,100,0,108,0,108,0,0,0,71,101,116,67,117,114,114,101,110,116,80,114,111,99,101,115,115,69,120,112,108,105,99,105,116,65,112,112,85,115,101,114,77,111,100,101,108,73,68,0,83,0,111,0,102,0,116,0,119,0,97,0,114,0,101,0,92,0,80,0,111,0,108,0, + 105,0,99,0,105,0,101,0,115,0,92,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,92,0,69,0,100,0,103,0,101,0,92,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,92,0,0,0,0,0,42,0,0,0,87,0,69,0,66,0,86,0,73,0,69,0,87,0,50,0,95,0,85,0,83,0,69, + 0,95,0,69,0,68,0,71,0,69,0,95,0,86,0,73,0,69,0,87,0,0,0,49,0,0,0,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,0,67,114,101,97,116,101,87,101,98,86,105,101,119,69,110,118,105,114,111,110,109,101,110,116,87,105,116,104,79,112,116,105,111, + 110,115,73,110,116,101,114,110,97,108,0,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,58,0,32,0,67,0,111,0,114,0,101,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,69,0,110,0,118,0,105,0,114,0,111,0,110,0,109,0,101,0,110,0,116,0,32,0,102,0,97, + 0,105,0,108,0,101,0,100,0,32,0,119,0,104,0,101,0,110,0,32,0,116,0,114,0,121,0,105,0,110,0,103,0,32,0,116,0,111,0,32,0,99,0,97,0,108,0,108,0,32,0,105,0,110,0,116,0,111,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,66,0,114,0,111,0,119, + 0,115,0,101,0,114,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,46,0,100,0,108,0,108,0,46,0,32,0,104,0,114,0,61,0,48,0,120,0,0,0,10,0,0,0,68,108,108,67,97,110,85,110,108,111,97,100,78,111,119,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,58,0,32, + 0,67,0,111,0,114,0,101,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,69,0,110,0,118,0,105,0,114,0,111,0,110,0,109,0,101,0,110,0,116,0,32,0,102,0,97,0,105,0,108,0,101,0,100,0,32,0,119,0,104,0,101,0,110,0,32,0,116,0,114,0,121,0,105,0,110,0,103, + 0,32,0,116,0,111,0,32,0,76,0,111,0,97,0,100,0,76,0,105,0,98,0,114,0,97,0,114,0,121,0,58,0,32,0,104,0,114,0,61,0,48,0,120,0,0,0,32,0,112,0,97,0,116,0,104,0,61,0,0,0,0,0,0,144,2,128,1,0,0,0,8,144,2,128,1,0,0,0,244,43,2,128,1,0,0,0,168,241,1,128, + 1,0,0,0,0,0,0,0,0,0,48,0,1,0,0,0,0,0,0,0,0,0,0,0,80,42,2,0,232,231,1,0,192,231,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,232,1,0,0,0,0,0,0,0,0,0,16,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,80,42,2,0,0,0,0,0,0,0,0,0,255,255,255,255, + 0,0,0,0,64,0,0,0,232,231,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,40,42,2,0,96,232,1,0,56,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,120,232,1,0,0,0,0,0,0,0,0,0,144,232,1,0,16,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,40,42,2,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,96,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,120,42,2,0,224,232,1,0,184,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,248,232,1,0,0,0,0,0,0,0,0, + 0,24,233,1,0,144,232,1,0,16,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,42,2,0,2,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,224,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,208,42,2,0,104,233,1,0,64,233,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,128,233,1,0,0,0,0,0,0,0,0,0,144,233,1,0,0,0,0,0,0,0,0,0,0,0,0,0,208,42,2,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,104,233,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,168,42,2,0,224, + 233,1,0,184,233,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,248,233,1,0,0,0,0,0,0,0,0,0,16,234,1,0,16,232,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,42,2,0,1,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,64,0,0,0,224,233,1,0,0,0,0,0,0,0, + 0,0,0,0,0,0,69,84,87,48,16,0,0,1,134,14,4,136,43,5,138,187,6,11,2,0,0,0,0,0,0,64,0,0,95,0,0,67,114,101,97,116,101,87,101,98,86,105,101,119,69,110,118,105,114,111,110,109,101,110,116,69,114,114,111,114,0,72,82,69,83,85,76,84,0,135,15,67,108,105, + 101,110,116,68,108,108,70,111,117,110,100,0,132,3,73,110,115,116,97,108,108,101,100,82,117,110,116,105,109,101,0,132,3,80,97,114,116,65,95,80,114,105,118,84,97,103,115,0,10,4,126,221,29,149,255,242,63,91,113,55,226,241,160,221,152,4,52,0,77, + 105,99,114,111,115,111,102,116,46,77,83,69,100,103,101,87,101,98,86,105,101,119,46,76,111,97,100,101,114,0,19,0,1,26,115,80,79,207,137,130,71,179,224,220,232,201,4,118,186,1,0,0,0,1,10,5,0,10,130,6,2,4,2,2,2,1,2,0,0,0,0,0,0,88,207,211,101,0, + 0,0,0,2,0,0,0,80,0,0,0,96,235,1,0,96,223,1,0,0,0,0,0,88,207,211,101,0,0,0,0,13,0,0,0,52,4,0,0,176,235,1,0,176,223,1,0,0,0,0,0,88,207,211,101,0,0,0,0,20,0,0,0,4,0,0,0,228,239,1,0,228,227,1,0,82,83,68,83,233,130,234,112,182,120,41,148,76,76,68, + 32,80,68,66,46,1,0,0,0,68,58,92,97,92,95,119,111,114,107,92,101,92,115,114,99,92,111,117,116,92,82,101,108,101,97,115,101,95,120,54,52,92,87,101,98,86,105,101,119,50,76,111,97,100,101,114,46,100,108,108,46,112,100,98,0,0,79,71,80,0,16,0,0,88, + 47,0,0,46,116,101,120,116,36,116,101,120,116,0,0,173,63,0,0,6,0,0,0,46,116,101,120,116,36,95,48,50,0,0,0,180,63,0,0,217,19,1,0,46,116,101,120,116,36,109,110,0,0,0,0,192,87,1,0,43,0,0,0,46,116,101,120,116,36,109,110,36,48,48,0,246,87,1,0,118, + 6,0,0,46,116,101,120,116,36,120,0,0,16,0,0,30,1,0,0,46,116,101,120,116,0,0,0,0,96,1,0,72,127,0,0,46,114,100,97,116,97,36,114,100,97,116,97,0,0,0,0,152,231,1,0,40,0,0,0,46,114,100,97,116,97,36,84,0,0,0,0,192,231,1,0,40,2,0,0,46,114,100,97,116, + 97,36,114,0,0,0,0,56,234,1,0,16,0,0,0,46,114,100,97,116,97,36,122,69,84,87,48,0,0,0,0,72,234,1,0,107,0,0,0,46,114,100,97,116,97,36,122,69,84,87,49,0,0,0,0,179,234,1,0,69,0,0,0,46,114,100,97,116,97,36,122,69,84,87,50,0,0,0,0,248,234,1,0,1,0,0, + 0,46,114,100,97,116,97,36,122,69,84,87,57,0,0,0,0,40,241,1,0,56,0,0,0,46,48,48,99,102,103,0,0,96,241,1,0,8,0,0,0,46,67,82,84,36,88,67,65,0,0,0,0,104,241,1,0,8,0,0,0,46,67,82,84,36,88,67,90,0,0,0,0,112,241,1,0,8,0,0,0,46,67,82,84,36,88,73,65, + 0,0,0,0,120,241,1,0,32,0,0,0,46,67,82,84,36,88,73,67,0,0,0,0,152,241,1,0,8,0,0,0,46,67,82,84,36,88,73,90,0,0,0,0,160,241,1,0,8,0,0,0,46,67,82,84,36,88,76,65,0,0,0,0,168,241,1,0,8,0,0,0,46,67,82,84,36,88,76,90,0,0,0,0,176,241,1,0,8,0,0,0,46,67, + 82,84,36,88,80,65,0,0,0,0,184,241,1,0,16,0,0,0,46,67,82,84,36,88,80,88,0,0,0,0,200,241,1,0,8,0,0,0,46,67,82,84,36,88,80,88,65,0,0,0,208,241,1,0,8,0,0,0,46,67,82,84,36,88,80,90,0,0,0,0,216,241,1,0,8,0,0,0,46,67,82,84,36,88,84,65,0,0,0,0,224,241, + 1,0,8,0,0,0,46,67,82,84,36,88,84,90,0,0,0,0,161,244,1,0,40,0,0,0,46,105,100,97,116,97,36,50,0,0,0,0,208,244,1,0,184,2,0,0,46,105,100,97,116,97,36,52,0,0,0,0,136,247,1,0,184,2,0,0,46,105,100,97,116,97,36,53,0,0,0,0,64,250,1,0,46,6,0,0,46,105, + 100,97,116,97,36,54,0,0,0,0,110,0,2,0,13,0,0,0,46,105,100,97,116,97,36,55,0,0,0,0,128,0,2,0,8,0,0,0,46,114,116,99,36,73,65,65,0,0,0,0,136,0,2,0,8,0,0,0,46,114,116,99,36,73,90,90,0,0,0,0,144,0,2,0,8,0,0,0,46,114,116,99,36,84,65,65,0,0,0,0,152, + 0,2,0,8,0,0,0,46,114,116,99,36,84,90,90,0,0,0,0,160,0,2,0,192,18,0,0,46,120,100,97,116,97,0,0,136,19,2,0,40,1,0,0,46,120,100,97,116,97,36,120,0,0,0,0,0,96,1,0,225,8,0,0,46,114,100,97,116,97,0,0,0,32,2,0,197,9,0,0,46,100,97,116,97,36,100,97,116, + 97,0,0,40,42,2,0,159,0,0,0,46,100,97,116,97,36,114,0,208,42,2,0,32,0,0,0,46,100,97,116,97,36,114,115,0,0,0,0,96,43,2,0,66,18,0,0,46,98,115,115,0,0,0,0,0,32,2,0,112,0,0,0,46,100,97,116,97,0,0,0,0,64,2,0,244,20,0,0,46,112,100,97,116,97,36,112, + 100,97,116,97,0,0,0,0,0,64,2,0,24,0,0,0,46,112,100,97,116,97,0,0,0,96,2,0,176,16,0,0,46,103,120,102,103,36,121,0,0,128,2,0,128,0,0,0,46,114,101,116,112,108,110,101,36,114,101,116,112,108,110,101,0,0,0,0,0,144,2,0,1,0,0,0,46,116,108,115,36,116, + 108,115,0,0,0,0,4,144,2,0,4,0,0,0,46,116,108,115,36,0,0,0,8,144,2,0,1,0,0,0,46,116,108,115,36,90,90,90,0,0,0,0,0,160,2,0,88,1,0,0,95,82,68,65,84,65,36,82,68,65,84,65,0,0,0,0,0,176,2,0,88,0,0,0,46,114,115,114,99,36,48,49,0,0,0,0,96,176,2,0,40, + 5,0,0,46,114,115,114,99,36,48,50,0,0,0,0,1,0,0,0,149,16,0,0,176,33,0,0,144,38,0,0,160,38,0,0,208,39,0,0,64,41,0,0,176,43,0,0,192,43,0,0,224,43,0,0,64,44,0,0,48,45,0,0,128,45,0,0,224,63,0,0,32,66,0,0,144,71,0,0,176,71,0,0,192,74,0,0,208,74,0, + 0,160,76,0,0,48,78,0,0,176,101,0,0,128,104,0,0,192,104,0,0,224,104,0,0,32,109,0,0,64,109,0,0,112,109,0,0,128,109,0,0,144,109,0,0,160,109,0,0,176,109,0,0,192,109,0,0,0,110,0,0,16,110,0,0,80,110,0,0,176,110,0,0,240,144,0,0,16,145,0,0,32,145,0, + 0,80,147,0,0,160,156,0,0,144,161,0,0,224,196,0,0,16,197,0,0,48,197,0,0,144,204,0,0,192,204,0,0,64,209,0,0,144,209,0,0,0,210,0,0,32,210,0,0,48,210,0,0,112,210,0,0,224,213,0,0,96,217,0,0,160,217,0,0,224,219,0,0,16,220,0,0,48,220,0,0,48,243,0,0, + 80,244,0,0,176,0,1,0,128,8,1,0,48,13,1,0,128,13,1,0,176,13,1,0,224,13,1,0,144,15,1,0,144,17,1,0,112,31,1,0,112,60,1,0,32,63,1,0,144,71,1,0,224,73,1,0,0,82,1,0,16,83,1,0,64,83,1,0,208,87,1,0,240,87,1,0,0,0,0,0,192,74,0,128,1,0,0,0,208,87,1,128, + 1,0,0,0,192,74,0,128,1,0,0,0,240,87,1,128,1,0,0,0,240,87,1,128,1,0,0,0,0,0,0,0,0,0,0,0,48,197,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,0,128,1,0,0,0,112,31,1,128,1,0,0,0,48,243,0,128,1,0,0,0,0,82,1,128,1,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,8,1,128,1,0,0,0,144,71,1,128,1,0,0,0,80,244,0,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,90,243,1,0,240,42,2,0,0,43,2,0,72,242,1,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,0,0,103,243,1,0,248,42,2,0,72,43,2,0,144,242,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,242,1,0,0,0,0,0,184,242,1,0,0,0,0,0,206,242,1,0,0,0,0,0,224,242,1,0,0,0,0,0,246,242,1,0,0,0,0, + 0,4,243,1,0,0,0,0,0,20,243,1,0,0,0,0,0,36,243,1,0,0,0,0,0,0,0,0,0,0,0,0,0,56,243,1,0,0,0,0,0,74,243,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,69,118,101,110,116,82,101,103,105,115,116,101,114,0,0,0,69,118,101,110,116,83,101,116,73,110,102,111,114,109, + 97,116,105,111,110,0,0,0,69,118,101,110,116,85,110,114,101,103,105,115,116,101,114,0,0,0,69,118,101,110,116,87,114,105,116,101,84,114,97,110,115,102,101,114,0,0,0,0,82,101,103,67,108,111,115,101,75,101,121,0,0,0,82,101,103,71,101,116,86,97,108, + 117,101,87,0,0,0,0,82,101,103,79,112,101,110,75,101,121,69,120,87,0,0,0,82,101,103,81,117,101,114,121,86,97,108,117,101,69,120,87,0,0,0,0,67,111,84,97,115,107,77,101,109,65,108,108,111,99,0,0,0,0,67,111,84,97,115,107,77,101,109,70,114,101,101, + 0,65,68,86,65,80,73,51,50,46,100,108,108,0,111,108,101,51,50,46,100,108,108,0,0,0,0,0,0,0,0,0,0,0,0,0,153,243,1,0,1,0,0,0,5,0,0,0,5,0,0,0,172,243,1,0,192,243,1,0,212,243,1,0,87,101,98,86,105,101,119,50,76,111,97,100,101,114,46,100,108,108,0, + 208,39,0,0,64,41,0,0,176,33,0,0,144,38,0,0,160,38,0,0,222,243,1,0,245,243,1,0,19,244,1,0,60,244,1,0,105,244,1,0,0,0,1,0,2,0,3,0,4,0,67,111,109,112,97,114,101,66,114,111,119,115,101,114,86,101,114,115,105,111,110,115,0,67,114,101,97,116,101,67, + 111,114,101,87,101,98,86,105,101,119,50,69,110,118,105,114,111,110,109,101,110,116,0,67,114,101,97,116,101,67,111,114,101,87,101,98,86,105,101,119,50,69,110,118,105,114,111,110,109,101,110,116,87,105,116,104,79,112,116,105,111,110,115,0,71,101, + 116,65,118,97,105,108,97,98,108,101,67,111,114,101,87,101,98,86,105,101,119,50,66,114,111,119,115,101,114,86,101,114,115,105,111,110,83,116,114,105,110,103,0,71,101,116,65,118,97,105,108,97,98,108,101,67,111,114,101,87,101,98,86,105,101,119, + 50,66,114,111,119,115,101,114,86,101,114,115,105,111,110,83,116,114,105,110,103,87,105,116,104,79,112,116,105,111,110,115,0,208,244,1,0,0,0,0,0,0,0,0,0,110,0,2,0,136,247,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,250,1,0,0, + 0,0,0,78,250,1,0,0,0,0,0,94,250,1,0,0,0,0,0,108,250,1,0,0,0,0,0,132,250,1,0,0,0,0,0,148,250,1,0,0,0,0,0,172,250,1,0,0,0,0,0,186,250,1,0,0,0,0,0,198,250,1,0,0,0,0,0,218,250,1,0,0,0,0,0,234,250,1,0,0,0,0,0,246,250,1,0,0,0,0,0,0,251,1,0,0,0,0,0, + 14,251,1,0,0,0,0,0,28,251,1,0,0,0,0,0,48,251,1,0,0,0,0,0,74,251,1,0,0,0,0,0,88,251,1,0,0,0,0,0,98,251,1,0,0,0,0,0,110,251,1,0,0,0,0,0,128,251,1,0,0,0,0,0,146,251,1,0,0,0,0,0,164,251,1,0,0,0,0,0,186,251,1,0,0,0,0,0,206,251,1,0,0,0,0,0,228,251, + 1,0,0,0,0,0,250,251,1,0,0,0,0,0,20,252,1,0,0,0,0,0,46,252,1,0,0,0,0,0,68,252,1,0,0,0,0,0,82,252,1,0,0,0,0,0,98,252,1,0,0,0,0,0,120,252,1,0,0,0,0,0,142,252,1,0,0,0,0,0,162,252,1,0,0,0,0,0,174,252,1,0,0,0,0,0,192,252,1,0,0,0,0,0,210,252,1,0,0, + 0,0,0,228,252,1,0,0,0,0,0,244,252,1,0,0,0,0,0,6,253,1,0,0,0,0,0,22,253,1,0,0,0,0,0,48,253,1,0,0,0,0,0,60,253,1,0,0,0,0,0,72,253,1,0,0,0,0,0,86,253,1,0,0,0,0,0,98,253,1,0,0,0,0,0,138,253,1,0,0,0,0,0,160,253,1,0,0,0,0,0,184,253,1,0,0,0,0,0,204, + 253,1,0,0,0,0,0,232,253,1,0,0,0,0,0,250,253,1,0,0,0,0,0,10,254,1,0,0,0,0,0,34,254,1,0,0,0,0,0,52,254,1,0,0,0,0,0,70,254,1,0,0,0,0,0,86,254,1,0,0,0,0,0,108,254,1,0,0,0,0,0,130,254,1,0,0,0,0,0,152,254,1,0,0,0,0,0,178,254,1,0,0,0,0,0,196,254,1, + 0,0,0,0,0,210,254,1,0,0,0,0,0,230,254,1,0,0,0,0,0,0,255,1,0,0,0,0,0,20,255,1,0,0,0,0,0,32,255,1,0,0,0,0,0,46,255,1,0,0,0,0,0,66,255,1,0,0,0,0,0,78,255,1,0,0,0,0,0,98,255,1,0,0,0,0,0,114,255,1,0,0,0,0,0,130,255,1,0,0,0,0,0,160,255,1,0,0,0,0,0, + 180,255,1,0,0,0,0,0,192,255,1,0,0,0,0,0,202,255,1,0,0,0,0,0,216,255,1,0,0,0,0,0,230,255,1,0,0,0,0,0,2,0,2,0,0,0,0,0,20,0,2,0,0,0,0,0,36,0,2,0,0,0,0,0,60,0,2,0,0,0,0,0,82,0,2,0,0,0,0,0,98,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,64,250,1,0,0,0,0,0,78,250, + 1,0,0,0,0,0,94,250,1,0,0,0,0,0,108,250,1,0,0,0,0,0,132,250,1,0,0,0,0,0,148,250,1,0,0,0,0,0,172,250,1,0,0,0,0,0,186,250,1,0,0,0,0,0,198,250,1,0,0,0,0,0,218,250,1,0,0,0,0,0,234,250,1,0,0,0,0,0,246,250,1,0,0,0,0,0,0,251,1,0,0,0,0,0,14,251,1,0,0, + 0,0,0,28,251,1,0,0,0,0,0,48,251,1,0,0,0,0,0,74,251,1,0,0,0,0,0,88,251,1,0,0,0,0,0,98,251,1,0,0,0,0,0,110,251,1,0,0,0,0,0,128,251,1,0,0,0,0,0,146,251,1,0,0,0,0,0,164,251,1,0,0,0,0,0,186,251,1,0,0,0,0,0,206,251,1,0,0,0,0,0,228,251,1,0,0,0,0,0, + 250,251,1,0,0,0,0,0,20,252,1,0,0,0,0,0,46,252,1,0,0,0,0,0,68,252,1,0,0,0,0,0,82,252,1,0,0,0,0,0,98,252,1,0,0,0,0,0,120,252,1,0,0,0,0,0,142,252,1,0,0,0,0,0,162,252,1,0,0,0,0,0,174,252,1,0,0,0,0,0,192,252,1,0,0,0,0,0,210,252,1,0,0,0,0,0,228,252, + 1,0,0,0,0,0,244,252,1,0,0,0,0,0,6,253,1,0,0,0,0,0,22,253,1,0,0,0,0,0,48,253,1,0,0,0,0,0,60,253,1,0,0,0,0,0,72,253,1,0,0,0,0,0,86,253,1,0,0,0,0,0,98,253,1,0,0,0,0,0,138,253,1,0,0,0,0,0,160,253,1,0,0,0,0,0,184,253,1,0,0,0,0,0,204,253,1,0,0,0,0, + 0,232,253,1,0,0,0,0,0,250,253,1,0,0,0,0,0,10,254,1,0,0,0,0,0,34,254,1,0,0,0,0,0,52,254,1,0,0,0,0,0,70,254,1,0,0,0,0,0,86,254,1,0,0,0,0,0,108,254,1,0,0,0,0,0,130,254,1,0,0,0,0,0,152,254,1,0,0,0,0,0,178,254,1,0,0,0,0,0,196,254,1,0,0,0,0,0,210, + 254,1,0,0,0,0,0,230,254,1,0,0,0,0,0,0,255,1,0,0,0,0,0,20,255,1,0,0,0,0,0,32,255,1,0,0,0,0,0,46,255,1,0,0,0,0,0,66,255,1,0,0,0,0,0,78,255,1,0,0,0,0,0,98,255,1,0,0,0,0,0,114,255,1,0,0,0,0,0,130,255,1,0,0,0,0,0,160,255,1,0,0,0,0,0,180,255,1,0,0, + 0,0,0,192,255,1,0,0,0,0,0,202,255,1,0,0,0,0,0,216,255,1,0,0,0,0,0,230,255,1,0,0,0,0,0,2,0,2,0,0,0,0,0,20,0,2,0,0,0,0,0,36,0,2,0,0,0,0,0,60,0,2,0,0,0,0,0,82,0,2,0,0,0,0,0,98,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,148,0,67,108,111,115,101,72,97,110,100, + 108,101,0,206,0,67,114,101,97,116,101,69,118,101,110,116,87,0,0,218,0,67,114,101,97,116,101,70,105,108,101,87,0,35,1,68,101,108,101,116,101,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,0,69,1,69,110,99,111,100,101,80,111,105,110,116, + 101,114,0,73,1,69,110,116,101,114,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,0,0,120,1,69,120,105,116,80,114,111,99,101,115,115,0,143,1,70,105,110,100,67,108,111,115,101,0,149,1,70,105,110,100,70,105,114,115,116,70,105,108,101,69, + 120,87,0,0,166,1,70,105,110,100,78,101,120,116,70,105,108,101,87,0,180,1,70,108,115,65,108,108,111,99,0,0,181,1,70,108,115,70,114,101,101,0,182,1,70,108,115,71,101,116,86,97,108,117,101,0,183,1,70,108,115,83,101,116,86,97,108,117,101,0,185,1, + 70,108,117,115,104,70,105,108,101,66,117,102,102,101,114,115,0,0,196,1,70,114,101,101,69,110,118,105,114,111,110,109,101,110,116,83,116,114,105,110,103,115,87,0,197,1,70,114,101,101,76,105,98,114,97,114,121,0,204,1,71,101,116,65,67,80,0,0,219, + 1,71,101,116,67,80,73,110,102,111,0,240,1,71,101,116,67,111,109,109,97,110,100,76,105,110,101,65,0,241,1,71,101,116,67,111,109,109,97,110,100,76,105,110,101,87,0,22,2,71,101,116,67,111,110,115,111,108,101,77,111,100,101,0,0,26,2,71,101,116,67, + 111,110,115,111,108,101,79,117,116,112,117,116,67,80,0,0,50,2,71,101,116,67,117,114,114,101,110,116,80,114,111,99,101,115,115,0,51,2,71,101,116,67,117,114,114,101,110,116,80,114,111,99,101,115,115,73,100,0,55,2,71,101,116,67,117,114,114,101, + 110,116,84,104,114,101,97,100,73,100,0,0,83,2,71,101,116,69,110,118,105,114,111,110,109,101,110,116,83,116,114,105,110,103,115,87,0,0,85,2,71,101,116,69,110,118,105,114,111,110,109,101,110,116,86,97,114,105,97,98,108,101,87,0,97,2,71,101,116, + 70,105,108,101,65,116,116,114,105,98,117,116,101,115,87,0,0,106,2,71,101,116,70,105,108,101,84,121,112,101,0,125,2,71,101,116,76,97,115,116,69,114,114,111,114,0,0,145,2,71,101,116,77,111,100,117,108,101,70,105,108,101,78,97,109,101,87,0,0,148, + 2,71,101,116,77,111,100,117,108,101,72,97,110,100,108,101,69,120,87,0,0,149,2,71,101,116,77,111,100,117,108,101,72,97,110,100,108,101,87,0,0,182,2,71,101,116,79,69,77,67,80,0,0,205,2,71,101,116,80,114,111,99,65,100,100,114,101,115,115,0,0,212, + 2,71,101,116,80,114,111,99,101,115,115,72,101,97,112,0,0,241,2,71,101,116,83,116,97,114,116,117,112,73,110,102,111,87,0,243,2,71,101,116,83,116,100,72,97,110,100,108,101,0,0,248,2,71,101,116,83,116,114,105,110,103,84,121,112,101,87,0,0,4,3,71, + 101,116,83,121,115,116,101,109,73,110,102,111,0,10,3,71,101,116,83,121,115,116,101,109,84,105,109,101,65,115,70,105,108,101,84,105,109,101,0,108,3,72,101,97,112,65,108,108,111,99,0,112,3,72,101,97,112,70,114,101,101,0,0,115,3,72,101,97,112,82, + 101,65,108,108,111,99,0,117,3,72,101,97,112,83,105,122,101,0,0,134,3,73,110,105,116,105,97,108,105,122,101,67,114,105,116,105,99,97,108,83,101,99,116,105,111,110,65,110,100,83,112,105,110,67,111,117,110,116,0,138,3,73,110,105,116,105,97,108, + 105,122,101,83,76,105,115,116,72,101,97,100,0,142,3,73,110,116,101,114,108,111,99,107,101,100,70,108,117,115,104,83,76,105,115,116,0,160,3,73,115,68,101,98,117,103,103,101,114,80,114,101,115,101,110,116,0,168,3,73,115,80,114,111,99,101,115,115, + 111,114,70,101,97,116,117,114,101,80,114,101,115,101,110,116,0,174,3,73,115,86,97,108,105,100,67,111,100,101,80,97,103,101,0,212,3,76,67,77,97,112,83,116,114,105,110,103,87,0,0,224,3,76,101,97,118,101,67,114,105,116,105,99,97,108,83,101,99,116, + 105,111,110,0,0,229,3,76,111,97,100,76,105,98,114,97,114,121,69,120,65,0,0,230,3,76,111,97,100,76,105,98,114,97,114,121,69,120,87,0,0,231,3,76,111,97,100,76,105,98,114,97,114,121,87,0,0,18,4,77,117,108,116,105,66,121,116,101,84,111,87,105,100, + 101,67,104,97,114,0,57,4,79,117,116,112,117,116,68,101,98,117,103,83,116,114,105,110,103,65,0,0,58,4,79,117,116,112,117,116,68,101,98,117,103,83,116,114,105,110,103,87,0,0,112,4,81,117,101,114,121,80,101,114,102,111,114,109,97,110,99,101,67, + 111,117,110,116,101,114,0,135,4,82,97,105,115,101,69,120,99,101,112,116,105,111,110,0,0,236,4,82,101,115,101,116,69,118,101,110,116,0,0,245,4,82,116,108,67,97,112,116,117,114,101,67,111,110,116,101,120,116,0,253,4,82,116,108,76,111,111,107,117, + 112,70,117,110,99,116,105,111,110,69,110,116,114,121,0,0,255,4,82,116,108,80,99,84,111,70,105,108,101,72,101,97,100,101,114,0,2,5,82,116,108,85,110,119,105,110,100,0,3,5,82,116,108,85,110,119,105,110,100,69,120,0,4,5,82,116,108,86,105,114,116, + 117,97,108,85,110,119,105,110,100,0,0,72,5,83,101,116,69,118,101,110,116,0,0,85,5,83,101,116,70,105,108,101,80,111,105,110,116,101,114,69,120,0,0,100,5,83,101,116,76,97,115,116,69,114,114,111,114,0,0,127,5,83,101,116,83,116,100,72,97,110,100, + 108,101,0,0,164,5,83,101,116,85,110,104,97,110,100,108,101,100,69,120,99,101,112,116,105,111,110,70,105,108,116,101,114,0,196,5,84,101,114,109,105,110,97,116,101,80,114,111,99,101,115,115,0,0,214,5,84,108,115,65,108,108,111,99,0,0,215,5,84,108, + 115,70,114,101,101,0,216,5,84,108,115,71,101,116,86,97,108,117,101,0,217,5,84,108,115,83,101,116,86,97,108,117,101,0,230,5,85,110,104,97,110,100,108,101,100,69,120,99,101,112,116,105,111,110,70,105,108,116,101,114,0,0,5,6,86,105,114,116,117, + 97,108,80,114,111,116,101,99,116,0,0,7,6,86,105,114,116,117,97,108,81,117,101,114,121,0,0,17,6,87,97,105,116,70,111,114,83,105,110,103,108,101,79,98,106,101,99,116,69,120,0,55,6,87,105,100,101,67,104,97,114,84,111,77,117,108,116,105,66,121,116, + 101,0,74,6,87,114,105,116,101,67,111,110,115,111,108,101,87,0,75,6,87,114,105,116,101,70,105,108,101,0,75,69,82,78,69,76,51,50,46,100,108,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,4,1,0,4,66,0,0,64,100, + 0,0,176,0,2,0,120,189,0,2,0,192,0,2,0,208,0,2,0,4,8,16,2,0,0,2,200,0,2,0,2,17,128,246,87,1,0,22,2,8,2,0,25,10,2,0,10,50,6,80,64,100,0,0,228,0,2,0,105,238,0,2,0,240,0,2,0,112,2,8,0,0,0,0,1,6,2,0,6,50,2,48,1,4,1,0,4,66,0,0,1,10,4,0,10,52,6,0,10, + 50,6,112,9,4,1,0,4,34,0,0,0,87,0,0,1,0,0,0,223,66,0,0,105,67,0,0,20,88,1,0,105,67,0,0,1,2,1,0,2,80,0,0,1,20,8,0,20,100,8,0,20,84,7,0,20,52,6,0,20,50,16,112,1,21,5,0,21,52,186,0,21,1,184,0,6,80,0,0,1,4,1,0,4,130,0,0,1,15,6,0,15,100,6,0,15,52, + 5,0,15,18,11,112,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,17,21,8,0,21,116,9,0,21,100,7,0,21,52,6,0,21,50,17,224,0,87,0,0,2,0,0,0,52,75,0,0,163,75,0,0,44,88,1,0,0,0,0,0,6,76,0,0,17,76,0,0,44,88,1,0,0,0,0,0,1,6,2,0,6,50,2,80,17,10,4,0,10,52,8,0,10,82, + 6,112,0,87,0,0,4,0,0,0,75,76,0,0,106,76,0,0,67,88,1,0,0,0,0,0,64,76,0,0,130,76,0,0,92,88,1,0,0,0,0,0,139,76,0,0,150,76,0,0,67,88,1,0,0,0,0,0,139,76,0,0,151,76,0,0,92,88,1,0,0,0,0,0,9,26,6,0,26,52,15,0,26,114,22,224,20,112,19,96,0,87,0,0,1,0, + 0,0,37,77,0,0,11,78,0,0,112,88,1,0,11,78,0,0,1,6,2,0,6,82,2,80,1,15,6,0,15,100,7,0,15,52,6,0,15,50,11,112,1,15,6,0,15,116,3,0,10,100,2,0,5,52,1,0,1,13,4,0,13,52,18,0,13,242,6,112,1,16,6,0,16,100,7,0,16,52,6,0,16,50,12,112,1,31,12,0,31,116,23, + 0,31,100,22,0,31,52,21,0,31,210,24,240,22,224,20,208,18,192,16,80,1,13,4,0,13,52,9,0,13,50,6,80,1,15,6,0,15,100,15,0,15,52,14,0,15,146,11,112,1,28,12,0,28,100,16,0,28,84,15,0,28,52,14,0,28,114,24,240,22,224,20,208,18,192,16,112,1,21,9,0,21,116, + 5,0,21,100,4,0,21,84,3,0,21,52,2,0,21,224,0,0,1,22,10,0,22,84,12,0,22,52,11,0,22,50,18,240,16,224,14,192,12,112,11,96,25,28,3,0,14,1,28,0,2,80,0,0,168,196,0,0,208,0,0,0,1,37,12,0,37,104,5,0,25,116,17,0,25,100,16,0,25,84,15,0,25,52,14,0,25,178, + 21,224,1,20,8,0,20,100,13,0,20,84,12,0,20,52,11,0,20,114,16,112,1,20,8,0,20,100,17,0,20,84,16,0,20,52,15,0,20,178,16,112,9,24,2,0,24,210,20,48,0,87,0,0,1,0,0,0,39,101,0,0,71,101,0,0,73,89,1,0,71,101,0,0,1,8,4,0,8,114,4,112,3,80,2,48,9,24,2,0, + 24,210,20,48,0,87,0,0,1,0,0,0,123,101,0,0,155,101,0,0,166,88,1,0,155,101,0,0,9,13,1,0,13,130,0,0,0,87,0,0,1,0,0,0,233,101,0,0,248,101,0,0,250,89,1,0,248,101,0,0,1,7,3,0,7,66,3,80,2,48,0,0,1,21,8,0,21,116,8,0,21,100,7,0,21,52,6,0,21,50,17,224, + 2,1,3,0,2,22,0,6,1,112,0,0,1,0,0,0,17,6,2,0,6,50,2,48,0,87,0,0,1,0,0,0,138,111,0,0,163,111,0,0,144,90,1,0,0,0,0,0,25,15,2,0,6,82,2,48,184,99,0,0,152,101,1,0,50,112,0,0,255,255,255,255,25,30,4,0,30,52,12,0,17,146,10,80,184,99,0,0,192,101,1,0, + 255,255,255,255,32,102,0,0,0,0,0,0,78,113,0,0,0,0,0,0,9,6,2,0,6,82,2,48,0,87,0,0,1,0,0,0,145,113,0,0,234,113,0,0,192,90,1,0,53,114,0,0,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,89,114,0,0,98,114,0,0,166,90,1,0,0,0,0,0,1,19,8,0,19,52, + 12,0,19,82,12,240,10,224,8,112,7,96,6,80,1,28,12,0,28,100,12,0,28,84,11,0,28,52,10,0,28,50,24,240,22,224,20,208,18,192,16,112,1,18,2,0,18,114,11,80,17,19,1,0,11,98,0,0,184,99,0,0,232,101,1,0,0,0,0,0,204,118,0,0,0,0,0,0,1,24,10,0,24,100,10,0, + 24,84,9,0,24,52,8,0,24,50,20,240,18,224,16,112,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,213,121,0,0,223,121,0,0,166,90,1,0,0,0,0,0,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,17,122,0,0,27,122,0,0,166,90,1,0,0,0,0,0,17,13,1,0, + 4,98,0,0,184,99,0,0,16,102,1,0,1,15,4,0,15,52,6,0,15,50,11,112,1,25,10,0,25,116,11,0,25,100,10,0,25,84,9,0,25,52,8,0,25,82,21,224,1,4,1,0,4,98,0,0,1,6,2,0,6,82,2,48,1,24,10,0,24,100,14,0,24,84,13,0,24,52,12,0,24,114,20,240,18,224,16,112,1,18, + 6,0,18,116,17,0,18,52,16,0,18,210,11,80,1,6,2,0,6,50,2,112,33,5,2,0,5,52,7,0,80,131,0,0,95,131,0,0,196,5,2,0,33,0,0,0,80,131,0,0,95,131,0,0,196,5,2,0,1,28,11,0,28,52,30,0,28,1,20,0,21,240,19,224,17,208,15,192,13,112,12,96,11,80,0,0,25,4,1,0, + 4,66,0,0,236,9,1,0,1,0,0,0,2,140,0,0,20,140,0,0,1,0,0,0,20,140,0,0,9,10,4,0,10,52,6,0,10,50,6,112,0,87,0,0,1,0,0,0,157,144,0,0,208,144,0,0,240,90,1,0,208,144,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,30,10,0,30,52,14,0,30,50,26,240,24,224,22,208,20,192, + 18,112,17,96,16,80,1,15,6,0,15,100,9,0,15,52,8,0,15,82,11,112,25,30,8,0,30,82,26,240,24,224,22,208,20,192,18,112,17,96,16,48,0,87,0,0,3,0,0,0,2,155,0,0,148,155,0,0,151,92,1,0,148,155,0,0,199,154,0,0,187,155,0,0,173,92,1,0,0,0,0,0,246,155,0,0, + 252,155,0,0,173,92,1,0,0,0,0,0,25,16,8,0,16,210,12,240,10,224,8,208,6,192,4,112,3,96,2,48,0,87,0,0,2,0,0,0,117,157,0,0,154,157,0,0,44,91,1,0,154,157,0,0,117,157,0,0,18,158,0,0,81,91,1,0,0,0,0,0,25,43,11,0,25,104,15,0,21,1,32,0,14,240,12,224, + 10,208,8,192,6,112,5,96,4,48,0,0,40,14,1,0,2,0,0,0,193,160,0,0,33,161,0,0,208,92,1,0,33,161,0,0,221,159,0,0,65,161,0,0,230,92,1,0,0,0,0,0,227,0,0,0,25,19,8,0,19,1,21,0,12,240,10,208,8,192,6,112,5,96,4,48,0,87,0,0,4,0,0,0,146,162,0,0,221,162, + 0,0,215,91,1,0,221,162,0,0,146,162,0,0,89,163,0,0,6,92,1,0,0,0,0,0,217,163,0,0,223,163,0,0,215,91,1,0,221,162,0,0,217,163,0,0,223,163,0,0,6,92,1,0,0,0,0,0,1,28,12,0,28,100,13,0,28,84,12,0,28,52,10,0,28,50,24,240,22,224,20,208,18,192,16,112,17, + 4,1,0,4,162,0,0,0,87,0,0,1,0,0,0,153,166,0,0,226,166,0,0,16,91,1,0,0,0,0,0,1,6,2,0,6,114,2,80,1,25,10,0,25,116,9,0,25,100,8,0,25,84,7,0,25,52,6,0,25,50,21,224,9,25,10,0,25,116,12,0,25,100,11,0,25,52,10,0,25,82,21,240,19,224,17,208,0,87,0,0,2, + 0,0,0,249,169,0,0,46,171,0,0,1,0,0,0,104,171,0,0,78,171,0,0,104,171,0,0,1,0,0,0,104,171,0,0,9,25,10,0,25,116,12,0,25,100,11,0,25,52,10,0,25,82,21,240,19,224,17,208,0,87,0,0,2,0,0,0,250,171,0,0,49,173,0,0,1,0,0,0,107,173,0,0,81,173,0,0,107,173, + 0,0,1,0,0,0,107,173,0,0,9,21,8,0,21,116,8,0,21,100,7,0,21,52,6,0,21,50,17,224,0,87,0,0,1,0,0,0,162,173,0,0,24,174,0,0,1,0,0,0,46,174,0,0,9,21,8,0,21,116,8,0,21,100,7,0,21,52,6,0,21,50,17,224,0,87,0,0,1,0,0,0,99,174,0,0,217,174,0,0,1,0,0,0,239, + 174,0,0,1,25,10,0,25,116,15,0,25,100,14,0,25,84,13,0,25,52,12,0,25,146,21,224,1,27,10,0,27,100,22,0,27,84,21,0,27,52,20,0,27,242,20,240,18,224,16,112,25,39,10,0,25,1,37,0,13,240,11,224,9,208,7,192,5,112,4,96,3,48,2,80,168,196,0,0,16,1,0,0,25, + 42,10,0,28,1,49,0,13,240,11,224,9,208,7,192,5,112,4,96,3,48,2,80,168,196,0,0,112,1,0,0,1,26,10,0,26,52,20,0,26,178,22,240,20,224,18,208,16,192,14,112,13,96,12,80,1,37,11,0,37,52,35,0,37,1,24,0,26,240,24,224,22,208,20,192,18,112,17,96,16,80,0, + 0,25,39,10,0,25,1,39,0,13,240,11,224,9,208,7,192,5,112,4,96,3,48,2,80,168,196,0,0,40,1,0,0,1,2,1,0,2,48,0,0,1,0,0,0,0,0,0,0,2,2,4,0,3,22,0,6,2,96,1,112,1,0,0,0,1,5,2,0,5,116,1,0,1,20,8,0,20,100,14,0,20,84,13,0,20,52,12,0,20,146,16,112,1,10,2, + 0,10,50,6,48,1,9,2,0,9,146,2,80,1,9,2,0,9,114,2,80,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,77,216,0,0,93,216,0,0,166,90,1,0,0,0,0,0,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,141,216,0,0,163,216,0,0,166,90,1,0,0,0,0,0,17,15, + 4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,213,216,0,0,5,217,0,0,166,90,1,0,0,0,0,0,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,53,217,0,0,67,217,0,0,166,90,1,0,0,0,0,0,17,6,2,0,6,50,2,48,0,87,0,0,1,0,0,0,114,217,0,0,137,217,0,0,9,93, + 1,0,0,0,0,0,1,28,11,0,28,116,23,0,28,100,22,0,28,84,21,0,28,52,20,0,28,1,18,0,21,224,0,0,25,37,10,0,22,84,17,0,22,52,16,0,22,114,18,240,16,224,14,192,12,112,11,96,168,196,0,0,56,0,0,0,1,6,2,0,6,114,2,48,25,15,6,0,15,100,8,0,15,52,7,0,15,50,11, + 112,236,9,1,0,1,0,0,0,169,224,0,0,248,224,0,0,60,93,1,0,0,0,0,0,1,37,9,0,37,100,83,0,37,52,82,0,37,1,78,0,23,224,21,112,20,80,0,0,25,43,7,0,26,116,244,0,26,52,243,0,26,1,240,0,11,80,0,0,168,196,0,0,112,7,0,0,17,15,4,0,15,52,10,0,15,114,11,112, + 0,87,0,0,1,0,0,0,149,229,0,0,52,231,0,0,34,93,1,0,0,0,0,0,25,46,9,0,29,100,196,0,29,52,195,0,29,1,190,0,14,224,12,112,11,80,0,0,168,196,0,0,224,5,0,0,1,20,8,0,20,100,10,0,20,84,9,0,20,52,8,0,20,82,16,112,1,15,6,0,15,100,8,0,15,52,7,0,15,50,11, + 112,1,13,4,0,13,52,16,0,13,210,6,80,1,7,1,0,7,66,0,0,17,23,10,0,23,100,17,0,23,52,16,0,23,114,19,240,17,224,15,208,13,192,11,112,0,87,0,0,2,0,0,0,201,237,0,0,126,238,0,0,85,93,1,0,0,0,0,0,252,238,0,0,20,239,0,0,85,93,1,0,0,0,0,0,17,15,4,0,15, + 52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,50,239,0,0,75,239,0,0,166,90,1,0,0,0,0,0,1,18,6,0,18,116,15,0,18,52,14,0,18,178,11,80,1,12,2,0,12,114,5,80,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,170,241,0,0,21,242,0,0,118,93,1,0,0,0,0,0,17,18, + 6,0,18,52,16,0,18,178,14,224,12,112,11,96,0,87,0,0,1,0,0,0,72,242,0,0,241,242,0,0,145,93,1,0,0,0,0,0,1,23,10,0,23,52,18,0,23,146,16,240,14,224,12,208,10,192,8,112,7,96,6,80,1,25,10,0,25,116,13,0,25,100,12,0,25,84,11,0,25,52,10,0,25,114,21,224, + 1,28,12,0,28,100,14,0,28,84,13,0,28,52,12,0,28,82,24,240,22,224,20,208,18,192,16,112,25,43,9,0,26,1,104,0,11,224,9,208,7,192,5,112,4,96,3,48,2,80,0,0,168,196,0,0,48,3,0,0,25,43,7,0,26,116,88,0,26,52,87,0,26,1,84,0,11,80,0,0,168,196,0,0,144,2, + 0,0,1,20,8,0,20,100,12,0,20,84,11,0,20,52,10,0,20,114,16,112,1,15,6,0,15,100,11,0,15,52,10,0,15,114,11,112,1,6,3,0,6,52,2,0,6,112,0,0,1,9,1,0,9,162,0,0,17,20,6,0,20,100,9,0,20,52,8,0,20,82,16,112,0,87,0,0,1,0,0,0,207,8,1,0,7,9,1,0,174,93,1,0, + 0,0,0,0,1,10,4,0,10,52,7,0,10,50,6,112,0,0,0,0,1,4,1,0,4,66,0,0,1,4,1,0,4,66,0,0,1,4,1,0,4,66,0,0,1,4,1,0,4,66,0,0,1,14,1,0,14,66,0,0,1,8,1,0,8,66,0,0,1,9,1,0,9,98,0,0,1,10,4,0,10,52,13,0,10,114,6,112,1,8,4,0,8,114,4,112,3,96,2,48,1,0,0,0,17, + 10,4,0,10,52,6,0,10,50,6,112,0,87,0,0,1,0,0,0,77,22,1,0,95,22,1,0,200,93,1,0,0,0,0,0,1,20,6,0,20,100,7,0,20,52,6,0,20,50,16,112,17,21,8,0,21,116,10,0,21,100,9,0,21,52,8,0,21,82,17,240,0,87,0,0,1,0,0,0,107,25,1,0,178,25,1,0,9,93,1,0,0,0,0,0,25, + 45,13,53,31,116,20,0,27,100,19,0,23,52,18,0,19,51,14,178,10,240,8,224,6,208,4,192,2,80,0,0,168,196,0,0,88,0,0,0,1,15,6,0,15,100,17,0,15,52,16,0,15,210,11,112,25,45,13,85,31,116,20,0,27,100,19,0,23,52,18,0,19,83,14,178,10,240,8,224,6,208,4,192, + 2,80,0,0,168,196,0,0,88,0,0,0,1,8,1,0,8,98,0,0,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,57,32,1,0,147,32,1,0,225,93,1,0,0,0,0,0,1,20,9,0,20,226,13,240,11,224,9,208,7,192,5,112,4,96,3,48,2,80,0,0,17,27,8,0,27,52,14,0,27,82,23,240,21, + 224,19,208,17,192,15,96,0,87,0,0,1,0,0,0,169,36,1,0,230,36,1,0,251,93,1,0,0,0,0,0,25,51,11,0,37,52,34,0,25,1,26,0,14,240,12,224,10,208,8,192,6,112,5,96,4,80,0,0,96,66,1,0,168,191,1,0,203,0,0,0,0,0,0,0,212,38,1,0,255,255,255,255,25,45,9,0,27, + 84,144,2,27,52,142,2,27,1,138,2,14,224,12,112,11,96,0,0,168,196,0,0,64,20,0,0,25,49,11,0,31,84,150,2,31,52,148,2,31,1,142,2,18,240,16,224,14,192,12,112,11,96,0,0,168,196,0,0,96,20,0,0,17,10,4,0,10,52,9,0,10,82,6,112,0,87,0,0,1,0,0,0,26,45,1, + 0,153,45,1,0,18,94,1,0,0,0,0,0,25,31,5,0,13,1,138,0,6,224,4,208,2,192,0,0,168,196,0,0,16,4,0,0,33,40,10,0,40,244,133,0,32,116,134,0,24,100,135,0,16,84,136,0,8,52,137,0,96,46,1,0,187,46,1,0,168,15,2,0,33,0,0,0,96,46,1,0,187,46,1,0,168,15,2,0, + 1,11,5,0,11,100,3,0,11,52,2,0,11,112,0,0,25,19,1,0,4,162,0,0,168,196,0,0,64,0,0,0,1,10,4,0,10,52,10,0,10,114,6,112,1,14,2,0,14,50,10,48,1,24,6,0,24,84,7,0,24,52,6,0,24,50,20,96,1,0,0,0,0,0,0,0,1,4,1,0,4,18,0,0,1,23,10,0,23,84,14,0,23,52,13,0, + 23,82,19,240,17,224,15,208,13,192,11,112,1,9,1,0,9,66,0,0,1,16,6,0,16,100,9,0,16,52,8,0,16,82,12,112,17,16,4,0,16,52,9,0,16,82,12,112,0,87,0,0,1,0,0,0,129,68,1,0,142,68,1,0,43,94,1,0,0,0,0,0,25,30,8,0,15,114,11,240,9,224,7,192,5,112,4,96,3,80, + 2,48,168,196,0,0,48,0,0,0,1,8,1,0,8,162,0,0,17,15,4,0,15,52,6,0,15,50,11,112,0,87,0,0,1,0,0,0,93,73,1,0,163,73,1,0,225,93,1,0,0,0,0,0,0,0,0,0,1,10,3,0,10,104,2,0,4,162,0,0,1,8,2,0,8,146,4,48,25,38,9,0,24,104,13,0,20,1,28,0,9,224,7,112,6,96,5, + 48,4,80,0,0,168,196,0,0,192,0,0,0,1,6,2,0,6,18,2,48,1,11,3,0,11,104,5,0,7,194,0,0,1,4,1,0,4,2,0,0,1,27,8,0,27,116,9,0,27,100,8,0,27,52,7,0,27,50,20,80,9,15,6,0,15,100,9,0,15,52,8,0,15,50,11,112,0,87,0,0,1,0,0,0,82,87,1,0,89,87,1,0,67,94,1,0, + 89,87,1,0,1,5,2,0,5,114,1,96,1,5,2,0,5,114,1,96,1,6,3,0,6,162,2,112,1,96,0,0,1,7,4,0,7,146,3,48,2,112,1,96,1,6,3,0,6,98,2,112,1,96,0,0,1,9,5,0,9,66,5,48,4,112,3,96,2,224,0,0,1,9,5,0,9,130,5,48,4,112,3,96,2,224,0,0,1,12,7,0,12,162,8,48,7,80,6, + 112,5,96,4,224,2,240,0,0,1,5,2,0,5,50,1,96,1,5,2,0,5,114,1,96,1,20,8,0,20,104,8,0,12,1,19,0,5,48,4,112,3,96,2,224,1,27,12,0,27,104,13,0,19,1,29,0,12,48,11,80,10,112,9,96,8,192,6,208,4,224,2,240,1,24,10,0,24,104,15,0,16,1,33,0,9,48,8,112,7,96, + 6,192,4,224,2,240,1,23,10,0,23,104,13,0,15,1,29,0,8,48,7,80,6,112,5,96,4,224,2,240,1,24,10,0,24,104,10,0,16,1,23,0,9,48,8,112,7,96,6,192,4,224,2,240,1,12,7,0,12,98,8,48,7,80,6,112,5,96,4,224,2,240,0,0,1,17,9,0,17,1,76,0,10,48,9,80,8,112,7,96, + 6,192,4,224,2,240,0,0,1,6,3,0,6,66,2,112,1,96,0,0,1,6,3,0,6,194,2,112,1,96,0,0,1,7,4,0,7,82,3,48,2,112,1,96,1,32,12,0,32,104,10,0,24,120,11,0,16,1,25,0,9,48,8,112,7,96,6,192,4,224,2,240,1,16,9,0,16,162,12,48,11,80,10,112,9,96,8,192,6,208,4,224, + 2,240,0,0,1,12,7,0,12,66,8,48,7,80,6,112,5,96,4,224,2,240,0,0,1,25,11,0,25,104,11,0,17,1,24,0,10,48,9,80,8,112,7,96,6,192,4,224,2,240,0,0,1,16,9,0,16,130,12,48,11,80,10,112,9,96,8,192,6,208,4,224,2,240,0,0,1,14,7,0,14,1,74,0,7,48,6,112,5,96, + 4,224,2,240,0,0,1,11,6,0,11,50,7,48,6,112,5,96,4,224,2,240,1,7,4,0,7,50,3,48,2,112,1,96,1,16,9,0,16,66,12,48,11,80,10,112,9,96,8,192,6,208,4,224,2,240,0,0,1,10,6,0,10,178,6,48,5,80,4,112,3,96,2,224,0,0,0,0,20,72,0,0,0,0,0,0,168,19,2,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,192,19,2,0,232,19,2,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,40,42,2,0,0,0,0,0,255,255,255,255,0,0,0,0,24,0,0,0,40,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,42,2,0,0,0,0,0,255,255,255,255,0,0,0,0,24,0,0,0,88,71,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,72,0,0,0,0,0,0,48,20,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,80,20,2,0,192,19,2,0,232,19,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,42,2,0,0,0,0,0,255,255,255,255,0,0,0,0,24,0,0,0,132,72,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,72,0,0,0,0,0,0,152,20,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,176,20,2,0,232,19,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,42,2,0,0,0,0,0,255,255,255,255,0,0,0,0,24,0,0,0,28,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,255,255,255,1,0,0,0,2,0,0,0,0,0,8,0,0,0,0,0,0,0,0,2,0,0,0,0,205,93,32,210,102,212,255,255,50,162,223,45,153,43,0,0,2,0,0,0, + 255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,0,0,0,0,0,0,65,66,67,68,69,70,71,72,73,74,75,76,77, + 78,79,80,81,82,83,84,85,86,87,88,89,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,0,0,0,0,0,0,65,66,67,68,69,70, + 71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,4,8,0,0,0,0,0,0,0,0,0,0,0,0,164,3,0,0,96,130,121,130,33,0,0,0,0,0,0,0,166,223,0,0,0,0,0,0,161,165,0,0,0,0,0,0,129,159,224,252,0,0,0,0,64,126,128,252,0,0, + 0,0,168,3,0,0,193,163,218,163,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,254,0,0,0,0,0,0,64,254,0,0,0,0,0,0,181,3,0,0,193,163,218,163,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,254,0,0,0,0,0,0,65,254,0,0,0,0,0,0,182,3,0,0, + 207,162,228,162,26,0,229,162,232,162,91,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,254,0,0,0,0,0,0,64,126,161,254,0,0,0,0,81,5,0,0,81,218,94,218,32,0,95,218,106,218,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,129,211,216,222,224,249,0,0,49,126,129,254,0, + 0,0,0,224,132,1,128,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,38,2,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,38,2,128,1,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,38,2,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,38,2,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,38,2,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,40,2,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,135,1,128,1,0,0,0,224,136,1,128,1,0,0,0,240,123,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,144,37,2,128,1,0,0,0,80,32,2,128,1,0,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,32,0,0, + 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,8,0,0,0,226,137,1,128,1,0,0,0,0,0,0,0,0,0,0,0,117,152,0,0,254,255,255,255,0,0,0,0,0,0,0,0,200,40,2,128,1, + 0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,112,61,2,128,1,0,0,0,127,127,127,127,127,127,127,127,204,40,2,128,1, + 0,0,0,116,61,2,128,1,0,0,0,116,61,2,128,1,0,0,0,116,61,2,128,1,0,0,0,116,61,2,128,1,0,0,0,116,61,2,128,1,0,0,0,116,61,2,128,1,0,0,0,116,61,2,128,1,0,0,0,46,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,0,0,0,0,0, + 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,234,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,96,97,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,98,97,100,95,97,108,108,111,99,64,115, + 116,100,64,64,0,0,0,0,0,96,97,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,101,120,99,101,112,116,105,111,110,64,115,116,100,64,64,0,0,0,0,0,96,97,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,98,97,100,95,97,114,114,97,121,95,110,101,119,95,108,101, + 110,103,116,104,64,115,116,100,64,64,0,0,96,97,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,98,97,100,95,101,120,99,101,112,116,105,111,110,64,115,116,100,64,64,0,96,97,1,128,1,0,0,0,0,0,0,0,0,0,0,0,46,63,65,86,116,121,112,101,95,105,110,102,111, + 64,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,111,94,1,128,1,0,0,0,123,94,1,128,1,0,0,0,135,94,1,128,1,0,0,0,147,94,1,128,1,0,0,0,159,94,1,128,1,0,0,0,171,94,1,128,1,0,0,0,183,94,1,128,1,0,0,0,195,94,1,128,1,0,0,0,0,0,0,0,0,0,0,0,34,95,1,128,1,0,0, + 0,46,95,1,128,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,149,16,0,0,116,17,2,0,149,16,0,0,9,17,0,0,124,17,2,0,9,17,0,0,199,17,0,0,132,17,2,0,200,17,0,0,157,18,0,0,144,17,2,0, + 157,18,0,0,80,19,0,0,156,17,2,0,80,19,0,0,29,20,0,0,168,17,2,0,29,20,0,0,214,21,0,0,184,17,2,0,214,21,0,0,93,23,0,0,200,17,2,0,93,23,0,0,2,24,0,0,220,17,2,0,2,24,0,0,169,24,0,0,228,17,2,0,169,24,0,0,37,26,0,0,236,17,2,0,37,26,0,0,166,32,0,0, + 0,18,2,0,166,32,0,0,164,33,0,0,156,17,2,0,176,33,0,0,5,36,0,0,28,18,2,0,5,36,0,0,142,38,0,0,52,18,2,0,160,38,0,0,198,39,0,0,76,18,2,0,208,39,0,0,124,40,0,0,144,17,2,0,124,40,0,0,55,41,0,0,100,18,2,0,79,41,0,0,58,43,0,0,120,18,2,0,58,43,0,0,163, + 43,0,0,144,18,2,0,224,43,0,0,62,44,0,0,220,17,2,0,64,44,0,0,44,45,0,0,156,18,2,0,48,45,0,0,128,45,0,0,144,18,2,0,130,45,0,0,245,45,0,0,252,0,2,0,248,45,0,0,227,47,0,0,168,18,2,0,227,47,0,0,16,50,0,0,180,18,2,0,16,50,0,0,30,52,0,0,208,18,2,0, + 30,52,0,0,198,52,0,0,232,18,2,0,198,52,0,0,93,55,0,0,252,18,2,0,93,55,0,0,206,56,0,0,24,19,2,0,206,56,0,0,133,57,0,0,48,19,2,0,154,57,0,0,210,57,0,0,220,17,2,0,210,57,0,0,246,57,0,0,220,17,2,0,246,57,0,0,139,58,0,0,68,19,2,0,140,58,0,0,190,58, + 0,0,144,18,2,0,190,58,0,0,52,59,0,0,168,17,2,0,108,59,0,0,158,59,0,0,144,18,2,0,158,59,0,0,19,60,0,0,68,19,2,0,74,60,0,0,129,60,0,0,252,0,2,0,136,60,0,0,216,60,0,0,84,19,2,0,216,60,0,0,54,61,0,0,84,19,2,0,56,61,0,0,224,61,0,0,96,19,2,0,224,61, + 0,0,173,63,0,0,120,19,2,0,180,63,0,0,199,63,0,0,160,0,2,0,224,63,0,0,176,64,0,0,4,1,2,0,176,64,0,0,23,65,0,0,244,0,2,0,24,65,0,0,120,65,0,0,244,0,2,0,120,65,0,0,219,65,0,0,244,0,2,0,220,65,0,0,29,66,0,0,252,0,2,0,32,66,0,0,72,66,0,0,252,0,2, + 0,72,66,0,0,132,66,0,0,244,0,2,0,132,66,0,0,155,66,0,0,252,0,2,0,156,66,0,0,214,66,0,0,244,0,2,0,216,66,0,0,112,67,0,0,16,1,2,0,112,67,0,0,169,67,0,0,252,0,2,0,172,67,0,0,208,67,0,0,244,0,2,0,208,67,0,0,25,68,0,0,244,0,2,0,28,68,0,0,69,68,0, + 0,244,0,2,0,72,68,0,0,211,68,0,0,244,0,2,0,212,68,0,0,52,69,0,0,56,1,2,0,52,69,0,0,73,69,0,0,252,0,2,0,76,69,0,0,128,69,0,0,252,0,2,0,128,69,0,0,176,69,0,0,252,0,2,0,176,69,0,0,196,69,0,0,252,0,2,0,196,69,0,0,236,69,0,0,252,0,2,0,236,69,0,0, + 1,70,0,0,252,0,2,0,12,70,0,0,87,71,0,0,76,1,2,0,88,71,0,0,138,71,0,0,244,0,2,0,176,71,0,0,242,71,0,0,4,1,2,0,40,72,0,0,100,72,0,0,244,0,2,0,132,72,0,0,192,72,0,0,244,0,2,0,192,72,0,0,224,72,0,0,92,1,2,0,224,72,0,0,0,73,0,0,92,1,2,0,0,73,0,0, + 172,74,0,0,100,1,2,0,208,74,0,0,251,74,0,0,244,0,2,0,252,74,0,0,18,76,0,0,132,1,2,0,20,76,0,0,152,76,0,0,200,1,2,0,160,76,0,0,240,76,0,0,252,0,2,0,240,76,0,0,33,78,0,0,28,2,2,0,48,78,0,0,109,78,0,0,76,2,2,0,112,78,0,0,14,79,0,0,4,1,2,0,16,79, + 0,0,169,79,0,0,92,2,2,0,172,79,0,0,68,80,0,0,108,2,2,0,68,80,0,0,210,80,0,0,120,2,2,0,212,80,0,0,126,81,0,0,244,0,2,0,128,81,0,0,19,82,0,0,252,0,2,0,20,82,0,0,234,84,0,0,136,2,2,0,236,84,0,0,152,85,0,0,164,2,2,0,180,85,0,0,207,85,0,0,252,0,2, + 0,232,85,0,0,36,86,0,0,4,1,2,0,36,86,0,0,96,86,0,0,4,1,2,0,96,86,0,0,0,87,0,0,176,2,2,0,0,87,0,0,247,88,0,0,192,2,2,0,248,88,0,0,26,90,0,0,220,2,2,0,224,91,0,0,66,92,0,0,56,1,2,0,68,92,0,0,110,92,0,0,244,0,2,0,112,92,0,0,212,92,0,0,76,2,2,0, + 212,92,0,0,160,93,0,0,244,2,2,0,160,93,0,0,163,94,0,0,12,3,2,0,164,94,0,0,226,95,0,0,192,2,2,0,236,95,0,0,30,96,0,0,252,0,2,0,32,96,0,0,63,97,0,0,12,3,2,0,100,97,0,0,205,98,0,0,32,3,2,0,208,98,0,0,226,98,0,0,252,0,2,0,228,98,0,0,252,98,0,0,244, + 0,2,0,252,98,0,0,14,99,0,0,252,0,2,0,16,99,0,0,40,99,0,0,244,0,2,0,40,99,0,0,98,99,0,0,244,0,2,0,100,99,0,0,183,99,0,0,4,1,2,0,184,99,0,0,62,100,0,0,60,3,2,0,64,100,0,0,255,100,0,0,80,3,2,0,0,101,0,0,81,101,0,0,100,3,2,0,84,101,0,0,165,101,0, + 0,144,3,2,0,176,101,0,0,29,102,0,0,176,3,2,0,32,102,0,0,42,102,0,0,252,0,2,0,48,102,0,0,95,102,0,0,244,0,2,0,132,102,0,0,234,102,0,0,4,1,2,0,236,102,0,0,121,103,0,0,220,3,2,0,124,103,0,0,161,103,0,0,244,0,2,0,164,103,0,0,206,103,0,0,244,0,2, + 0,248,103,0,0,32,104,0,0,252,0,2,0,32,104,0,0,57,104,0,0,252,0,2,0,60,104,0,0,76,104,0,0,252,0,2,0,76,104,0,0,96,104,0,0,252,0,2,0,96,104,0,0,114,104,0,0,252,0,2,0,128,104,0,0,154,104,0,0,252,0,2,0,192,104,0,0,208,104,0,0,240,3,2,0,224,104,0, + 0,104,108,0,0,252,3,2,0,64,109,0,0,99,109,0,0,252,0,2,0,144,109,0,0,160,109,0,0,252,0,2,0,192,109,0,0,253,109,0,0,244,0,2,0,16,110,0,0,80,110,0,0,244,0,2,0,80,110,0,0,171,110,0,0,252,0,2,0,200,110,0,0,253,110,0,0,252,0,2,0,0,111,0,0,16,111,0, + 0,252,0,2,0,16,111,0,0,36,111,0,0,252,0,2,0,36,111,0,0,52,111,0,0,252,0,2,0,52,111,0,0,114,111,0,0,4,1,2,0,124,111,0,0,179,111,0,0,0,4,2,0,224,111,0,0,79,112,0,0,32,4,2,0,80,112,0,0,113,112,0,0,252,0,2,0,116,112,0,0,166,112,0,0,244,0,2,0,168, + 112,0,0,109,113,0,0,56,4,2,0,112,113,0,0,59,114,0,0,96,4,2,0,60,114,0,0,116,114,0,0,128,4,2,0,116,114,0,0,250,115,0,0,164,4,2,0,252,115,0,0,89,116,0,0,244,0,2,0,92,116,0,0,33,118,0,0,184,4,2,0,76,118,0,0,148,118,0,0,212,4,2,0,148,118,0,0,215, + 118,0,0,220,4,2,0,232,118,0,0,152,120,0,0,248,4,2,0,152,120,0,0,184,121,0,0,248,4,2,0,184,121,0,0,243,121,0,0,16,5,2,0,244,121,0,0,47,122,0,0,52,5,2,0,56,122,0,0,123,122,0,0,88,5,2,0,124,122,0,0,239,122,0,0,4,1,2,0,240,122,0,0,10,123,0,0,252, + 0,2,0,12,123,0,0,38,123,0,0,252,0,2,0,40,123,0,0,105,123,0,0,104,5,2,0,108,123,0,0,173,123,0,0,104,5,2,0,176,123,0,0,191,124,0,0,116,5,2,0,192,124,0,0,1,125,0,0,104,5,2,0,4,125,0,0,75,125,0,0,4,1,2,0,96,125,0,0,225,126,0,0,56,1,2,0,228,126,0, + 0,247,126,0,0,140,5,2,0,248,126,0,0,97,127,0,0,148,5,2,0,100,127,0,0,72,128,0,0,248,4,2,0,72,128,0,0,142,128,0,0,252,0,2,0,144,128,0,0,193,129,0,0,156,5,2,0,4,130,0,0,159,130,0,0,76,2,2,0,160,130,0,0,80,131,0,0,180,5,2,0,80,131,0,0,95,131,0, + 0,196,5,2,0,95,131,0,0,168,131,0,0,204,5,2,0,168,131,0,0,183,131,0,0,224,5,2,0,192,131,0,0,54,132,0,0,76,2,2,0,56,132,0,0,210,139,0,0,240,5,2,0,240,139,0,0,26,140,0,0,12,6,2,0,88,143,0,0,9,144,0,0,180,5,2,0,144,144,0,0,221,144,0,0,44,6,2,0,240, + 144,0,0,8,145,0,0,80,6,2,0,16,145,0,0,17,145,0,0,84,6,2,0,32,145,0,0,33,145,0,0,88,6,2,0,92,145,0,0,178,145,0,0,252,0,2,0,180,145,0,0,251,145,0,0,252,0,2,0,252,145,0,0,30,146,0,0,252,0,2,0,32,146,0,0,57,146,0,0,252,0,2,0,60,146,0,0,251,146,0, + 0,76,2,2,0,252,146,0,0,73,147,0,0,244,0,2,0,80,147,0,0,111,147,0,0,252,0,2,0,120,147,0,0,222,147,0,0,244,0,2,0,224,147,0,0,7,148,0,0,252,0,2,0,20,148,0,0,79,148,0,0,4,1,2,0,80,148,0,0,121,148,0,0,244,0,2,0,132,148,0,0,113,149,0,0,220,2,2,0,116, + 149,0,0,66,150,0,0,92,6,2,0,68,150,0,0,244,150,0,0,116,6,2,0,104,152,0,0,226,152,0,0,244,0,2,0,120,154,0,0,2,156,0,0,132,6,2,0,4,156,0,0,154,156,0,0,56,1,2,0,160,156,0,0,138,158,0,0,208,6,2,0,140,158,0,0,133,161,0,0,12,7,2,0,144,161,0,0,224, + 163,0,0,84,7,2,0,28,164,0,0,88,164,0,0,244,0,2,0,88,164,0,0,222,164,0,0,4,1,2,0,224,164,0,0,16,165,0,0,4,1,2,0,16,165,0,0,253,165,0,0,176,7,2,0,0,166,0,0,136,166,0,0,56,1,2,0,144,166,0,0,235,166,0,0,204,7,2,0,236,166,0,0,41,168,0,0,244,7,2,0, + 44,168,0,0,110,169,0,0,244,7,2,0,112,169,0,0,110,171,0,0,12,8,2,0,112,171,0,0,113,173,0,0,76,8,2,0,116,173,0,0,52,174,0,0,140,8,2,0,52,174,0,0,245,174,0,0,184,8,2,0,248,174,0,0,47,177,0,0,228,8,2,0,48,177,0,0,196,179,0,0,252,8,2,0,196,179,0, + 0,153,184,0,0,20,9,2,0,156,184,0,0,151,189,0,0,52,9,2,0,152,189,0,0,105,190,0,0,84,9,2,0,108,190,0,0,133,192,0,0,108,9,2,0,136,192,0,0,89,193,0,0,84,9,2,0,92,193,0,0,75,196,0,0,136,9,2,0,76,196,0,0,167,196,0,0,168,9,2,0,168,196,0,0,197,196,0, + 0,252,0,2,0,224,196,0,0,254,196,0,0,176,9,2,0,16,197,0,0,32,197,0,0,184,9,2,0,48,197,0,0,165,203,0,0,196,9,2,0,168,203,0,0,7,204,0,0,244,0,2,0,8,204,0,0,78,204,0,0,244,0,2,0,80,204,0,0,135,204,0,0,244,0,2,0,144,204,0,0,179,204,0,0,200,9,2,0, + 192,204,0,0,1,205,0,0,244,0,2,0,4,205,0,0,72,205,0,0,252,0,2,0,104,205,0,0,216,205,0,0,76,2,2,0,216,205,0,0,196,206,0,0,208,9,2,0,196,206,0,0,33,207,0,0,4,1,2,0,36,207,0,0,124,207,0,0,244,0,2,0,124,207,0,0,56,209,0,0,184,4,2,0,64,209,0,0,136, + 209,0,0,244,0,2,0,144,209,0,0,199,209,0,0,244,0,2,0,0,210,0,0,28,210,0,0,252,0,2,0,48,210,0,0,105,210,0,0,252,0,2,0,112,210,0,0,146,210,0,0,252,0,2,0,148,210,0,0,103,211,0,0,76,2,2,0,104,211,0,0,10,212,0,0,244,0,2,0,12,212,0,0,212,212,0,0,76, + 2,2,0,212,212,0,0,21,213,0,0,244,0,2,0,24,213,0,0,214,213,0,0,76,2,2,0,224,213,0,0,0,214,0,0,228,9,2,0,0,214,0,0,103,214,0,0,4,1,2,0,104,214,0,0,53,215,0,0,236,9,2,0,56,215,0,0,45,216,0,0,244,9,2,0,48,216,0,0,111,216,0,0,252,9,2,0,112,216,0, + 0,181,216,0,0,32,10,2,0,184,216,0,0,23,217,0,0,68,10,2,0,24,217,0,0,85,217,0,0,104,10,2,0,96,217,0,0,155,217,0,0,140,10,2,0,160,217,0,0,224,217,0,0,4,1,2,0,224,217,0,0,205,218,0,0,172,10,2,0,208,218,0,0,216,219,0,0,244,7,2,0,224,219,0,0,5,220, + 0,0,252,0,2,0,20,220,0,0,48,220,0,0,252,0,2,0,48,220,0,0,144,220,0,0,252,0,2,0,144,220,0,0,77,223,0,0,200,10,2,0,80,223,0,0,205,223,0,0,232,10,2,0,208,223,0,0,104,224,0,0,4,1,2,0,104,224,0,0,32,225,0,0,240,10,2,0,32,225,0,0,143,227,0,0,24,11, + 2,0,144,227,0,0,119,229,0,0,48,11,2,0,120,229,0,0,70,231,0,0,76,11,2,0,72,231,0,0,132,231,0,0,228,9,2,0,132,231,0,0,24,232,0,0,76,2,2,0,24,232,0,0,94,232,0,0,4,1,2,0,96,232,0,0,126,232,0,0,140,5,2,0,128,232,0,0,199,232,0,0,252,0,2,0,200,232, + 0,0,35,234,0,0,112,11,2,0,44,234,0,0,248,234,0,0,144,11,2,0,248,234,0,0,98,235,0,0,164,11,2,0,100,235,0,0,176,235,0,0,76,2,2,0,176,235,0,0,75,236,0,0,180,11,2,0,108,236,0,0,154,236,0,0,192,11,2,0,156,236,0,0,21,239,0,0,200,11,2,0,24,239,0,0, + 96,239,0,0,8,12,2,0,204,239,0,0,158,240,0,0,44,12,2,0,160,240,0,0,44,241,0,0,56,1,2,0,44,241,0,0,137,241,0,0,60,12,2,0,140,241,0,0,40,242,0,0,68,12,2,0,40,242,0,0,9,243,0,0,104,12,2,0,48,243,0,0,79,244,0,0,244,7,2,0,80,244,0,0,171,244,0,0,244, + 0,2,0,224,244,0,0,15,245,0,0,244,0,2,0,16,245,0,0,48,245,0,0,252,0,2,0,48,245,0,0,80,245,0,0,252,0,2,0,80,245,0,0,151,245,0,0,244,0,2,0,224,245,0,0,2,246,0,0,244,0,2,0,4,246,0,0,121,246,0,0,244,0,2,0,132,246,0,0,197,248,0,0,144,12,2,0,200,248, + 0,0,65,250,0,0,116,5,2,0,68,250,0,0,207,251,0,0,168,12,2,0,208,251,0,0,84,253,0,0,192,12,2,0,84,253,0,0,161,0,1,0,220,12,2,0,196,0,1,0,229,1,1,0,252,12,2,0,232,1,1,0,1,3,1,0,24,13,2,0,24,3,1,0,139,3,1,0,44,13,2,0,140,3,1,0,33,4,1,0,56,1,2,0, + 180,4,1,0,146,5,1,0,60,13,2,0,148,5,1,0,162,6,1,0,168,12,2,0,164,6,1,0,149,7,1,0,72,13,2,0,152,7,1,0,201,7,1,0,244,0,2,0,204,7,1,0,253,7,1,0,244,0,2,0,0,8,1,0,53,8,1,0,244,0,2,0,56,8,1,0,109,8,1,0,244,0,2,0,128,8,1,0,174,8,1,0,192,11,2,0,176, + 8,1,0,30,9,1,0,80,13,2,0,32,9,1,0,140,9,1,0,120,13,2,0,140,9,1,0,234,9,1,0,244,0,2,0,236,9,1,0,55,10,1,0,4,1,2,0,64,10,1,0,133,10,1,0,244,0,2,0,136,10,1,0,206,10,1,0,244,0,2,0,208,10,1,0,22,11,1,0,244,0,2,0,24,11,1,0,105,11,1,0,4,1,2,0,108,11, + 1,0,205,11,1,0,76,2,2,0,208,11,1,0,30,13,1,0,184,4,2,0,48,13,1,0,112,13,1,0,136,13,2,0,128,13,1,0,170,13,1,0,144,13,2,0,176,13,1,0,214,13,1,0,152,13,2,0,224,13,1,0,39,14,1,0,160,13,2,0,40,14,1,0,173,14,1,0,244,7,2,0,176,14,1,0,217,14,1,0,168, + 13,2,0,220,14,1,0,120,15,1,0,176,13,2,0,120,15,1,0,139,15,1,0,252,0,2,0,144,15,1,0,98,16,1,0,184,13,2,0,100,16,1,0,209,16,1,0,192,13,2,0,212,16,1,0,69,17,1,0,204,13,2,0,72,17,1,0,124,17,1,0,244,0,2,0,144,17,1,0,13,18,1,0,216,13,2,0,60,18,1,0, + 223,18,1,0,248,4,2,0,108,19,1,0,20,20,1,0,252,0,2,0,20,20,1,0,138,21,1,0,56,1,2,0,220,21,1,0,19,22,1,0,228,9,2,0,20,22,1,0,130,22,1,0,220,13,2,0,132,22,1,0,233,22,1,0,4,1,2,0,236,22,1,0,97,23,1,0,252,0,2,0,100,23,1,0,30,24,1,0,220,3,2,0,32,24, + 1,0,197,24,1,0,56,1,2,0,200,24,1,0,24,25,1,0,0,14,2,0,24,25,1,0,192,25,1,0,16,14,2,0,16,26,1,0,159,27,1,0,60,14,2,0,160,27,1,0,54,28,1,0,100,14,2,0,56,28,1,0,105,31,1,0,116,14,2,0,112,31,1,0,135,31,1,0,252,0,2,0,136,31,1,0,25,32,1,0,156,14,2, + 0,28,32,1,0,167,32,1,0,164,14,2,0,168,32,1,0,207,32,1,0,252,0,2,0,208,32,1,0,214,35,1,0,200,14,2,0,216,35,1,0,245,36,1,0,224,14,2,0,248,36,1,0,109,41,1,0,12,15,2,0,112,41,1,0,114,42,1,0,64,15,2,0,116,42,1,0,141,43,1,0,64,15,2,0,144,43,1,0,0, + 45,1,0,96,15,2,0,0,45,1,0,178,45,1,0,132,15,2,0,180,45,1,0,246,45,1,0,244,0,2,0,248,45,1,0,87,46,1,0,252,0,2,0,96,46,1,0,187,46,1,0,168,15,2,0,187,46,1,0,80,50,1,0,192,15,2,0,80,50,1,0,110,50,1,0,228,15,2,0,112,50,1,0,95,51,1,0,76,2,2,0,96,51, + 1,0,40,55,1,0,244,15,2,0,40,55,1,0,198,55,1,0,4,16,2,0,208,55,1,0,100,56,1,0,20,16,2,0,100,56,1,0,157,56,1,0,252,0,2,0,160,56,1,0,26,57,1,0,4,1,2,0,28,57,1,0,163,57,1,0,208,9,2,0,164,57,1,0,174,58,1,0,32,16,2,0,176,58,1,0,28,59,1,0,228,9,2,0, + 28,59,1,0,36,60,1,0,40,16,2,0,36,60,1,0,86,60,1,0,4,1,2,0,112,60,1,0,55,61,1,0,56,16,2,0,64,61,1,0,184,62,1,0,116,5,2,0,32,63,1,0,110,63,1,0,64,16,2,0,144,63,1,0,57,64,1,0,144,11,2,0,60,64,1,0,127,64,1,0,232,10,2,0,128,64,1,0,34,66,1,0,72,16, + 2,0,36,66,1,0,95,66,1,0,96,16,2,0,96,66,1,0,223,66,1,0,244,7,2,0,224,66,1,0,120,67,1,0,44,12,2,0,120,67,1,0,29,68,1,0,104,16,2,0,32,68,1,0,154,68,1,0,120,16,2,0,156,68,1,0,117,70,1,0,156,16,2,0,120,70,1,0,202,70,1,0,232,10,2,0,204,70,1,0,138, + 71,1,0,24,13,2,0,144,71,1,0,172,71,1,0,252,0,2,0,172,71,1,0,121,72,1,0,76,2,2,0,124,72,1,0,61,73,1,0,184,16,2,0,64,73,1,0,183,73,1,0,192,16,2,0,224,73,1,0,139,79,1,0,232,16,2,0,168,79,1,0,13,80,1,0,244,16,2,0,16,80,1,0,202,80,1,0,76,2,2,0,204, + 80,1,0,243,81,1,0,252,16,2,0,0,82,1,0,112,82,1,0,28,17,2,0,112,82,1,0,6,83,1,0,36,17,2,0,16,83,1,0,48,83,1,0,140,5,2,0,64,83,1,0,80,83,1,0,48,17,2,0,144,83,1,0,192,83,1,0,252,0,2,0,192,83,1,0,231,83,1,0,92,1,2,0,232,83,1,0,240,86,1,0,56,17,2, + 0,240,86,1,0,13,87,1,0,244,0,2,0,16,87,1,0,140,87,1,0,76,17,2,0,140,87,1,0,157,87,1,0,252,0,2,0,160,87,1,0,191,87,1,0,244,0,2,0,208,87,1,0,213,87,1,0,120,1,2,0,240,87,1,0,246,87,1,0,128,1,2,0,246,87,1,0,20,88,1,0,212,0,2,0,20,88,1,0,44,88,1, + 0,48,1,2,0,44,88,1,0,67,88,1,0,192,1,2,0,67,88,1,0,92,88,1,0,192,1,2,0,92,88,1,0,112,88,1,0,192,1,2,0,112,88,1,0,166,88,1,0,68,2,2,0,166,88,1,0,73,89,1,0,132,3,2,0,73,89,1,0,250,89,1,0,132,3,2,0,250,89,1,0,144,90,1,0,208,3,2,0,144,90,1,0,166, + 90,1,0,192,1,2,0,166,90,1,0,192,90,1,0,192,1,2,0,192,90,1,0,237,90,1,0,192,1,2,0,240,90,1,0,16,91,1,0,192,1,2,0,16,91,1,0,44,91,1,0,236,7,2,0,44,91,1,0,81,91,1,0,192,1,2,0,81,91,1,0,215,91,1,0,208,3,2,0,215,91,1,0,6,92,1,0,192,1,2,0,6,92,1,0, + 151,92,1,0,208,3,2,0,151,92,1,0,173,92,1,0,192,1,2,0,173,92,1,0,208,92,1,0,192,1,2,0,208,92,1,0,230,92,1,0,68,2,2,0,230,92,1,0,9,93,1,0,68,2,2,0,9,93,1,0,34,93,1,0,192,1,2,0,34,93,1,0,60,93,1,0,192,1,2,0,60,93,1,0,85,93,1,0,192,1,2,0,85,93,1, + 0,118,93,1,0,192,1,2,0,118,93,1,0,145,93,1,0,192,1,2,0,145,93,1,0,174,93,1,0,192,1,2,0,174,93,1,0,200,93,1,0,192,1,2,0,200,93,1,0,225,93,1,0,192,1,2,0,225,93,1,0,251,93,1,0,192,1,2,0,251,93,1,0,18,94,1,0,68,2,2,0,18,94,1,0,43,94,1,0,192,1,2, + 0,43,94,1,0,67,94,1,0,68,2,2,0,67,94,1,0,111,94,1,0,192,1,2,0,207,94,1,0,34,95,1,0,252,234,1,0,58,95,1,0,141,95,1,0,252,234,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,141,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,142,0,0,0,0,0, + 0,0,112,59,89,62,117,166,153,151,143,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,144,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,9,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,12,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,15,0,0,0,0,0,0,0,112, + 59,89,62,117,166,153,151,18,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,21,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,24,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,27,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,30,0,0,0,0,0,0,0,112,162,92,92, + 196,158,148,223,33,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,36,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,39,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,42,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,63,0,0,0,0,0,0,0,112,32,211,28,223,15,237, + 209,66,0,0,0,0,0,0,0,112,144,91,18,231,158,112,206,70,0,0,0,0,0,0,0,112,195,88,118,91,135,80,255,171,0,0,0,0,0,0,0,112,48,82,94,71,39,5,211,176,0,0,0,0,0,0,0,112,115,215,80,73,134,193,198,189,0,0,0,0,0,0,0,112,72,218,86,150,62,241,133,192,0, + 0,0,0,0,0,0,112,144,91,18,231,158,112,206,201,0,0,0,0,0,0,0,112,123,90,94,155,135,1,162,208,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,209,0,0,0,0,0,0,0,112,123,90,94,155,135,1,162,213,0,0,0,0,0,0,0,112,24,208,62,105,6,221,210,214,0,0,0,0,0, + 0,0,112,162,208,54,121,166,188,181,223,0,0,0,0,0,0,0,112,160,220,50,37,142,160,214,204,0,0,0,0,0,0,0,112,50,209,16,192,166,197,233,215,0,0,0,0,0,0,0,112,32,90,120,127,62,217,148,240,0,0,0,0,0,0,0,112,138,89,122,190,62,93,213,166,0,0,0,0,0,0, + 0,112,192,210,86,138,39,213,128,167,0,0,0,0,0,0,0,112,178,209,48,98,54,108,160,168,0,0,0,0,0,0,0,112,192,210,86,138,39,213,128,169,0,0,0,0,0,0,0,112,210,218,126,186,182,29,203,180,0,0,0,0,0,0,0,112,58,222,80,57,55,152,140,191,0,0,0,0,0,0,0,112, + 58,222,80,57,55,152,140,201,0,0,0,0,0,0,0,112,187,89,52,77,7,204,146,206,0,0,0,0,0,0,0,112,169,219,120,170,134,240,181,103,1,0,0,0,0,0,0,112,48,82,94,71,39,5,211,120,1,0,0,0,0,0,0,112,72,218,86,150,62,241,133,141,1,0,0,0,0,0,0,112,48,82,94,71, + 39,5,211,143,1,0,0,0,0,0,0,112,225,222,26,242,62,8,166,145,1,0,0,0,0,0,0,112,35,211,80,86,150,108,199,147,1,0,0,0,0,0,0,112,75,92,20,68,62,212,216,148,1,0,0,0,0,0,0,112,250,208,122,253,159,148,138,161,1,0,0,0,0,0,0,112,73,212,60,232,54,45,176, + 15,0,0,0,0,0,0,0,112,234,209,62,212,150,149,139,16,0,0,0,0,0,0,0,112,186,217,52,186,143,28,218,34,0,0,0,0,0,0,0,112,74,222,82,131,30,212,184,35,0,0,0,0,0,0,0,112,74,222,82,131,30,212,184,125,0,0,0,0,0,0,0,112,123,93,24,82,30,16,170,145,0,0,0, + 0,0,0,0,112,83,216,28,102,63,93,136,146,0,0,0,0,0,0,0,112,83,216,28,102,63,93,136,68,0,0,0,0,0,0,0,112,64,86,30,89,166,192,254,69,0,0,0,0,0,0,0,112,248,210,52,12,30,137,221,70,0,0,0,0,0,0,0,112,64,86,30,89,166,192,254,80,0,0,0,0,0,0,0,112,48, + 220,54,32,38,196,255,95,1,0,0,0,0,0,0,112,200,91,90,248,30,93,194,126,1,0,0,0,0,0,0,112,43,216,90,94,175,185,190,129,1,0,0,0,0,0,0,112,242,91,30,240,54,136,173,172,1,0,0,0,0,0,0,112,51,212,82,0,158,124,181,12,0,0,0,0,0,0,0,112,144,91,18,231, + 158,112,206,12,0,0,0,0,0,0,0,112,168,83,20,211,143,244,167,24,0,0,0,0,0,0,0,112,72,218,86,150,62,241,133,11,0,0,0,0,0,0,0,112,64,86,30,89,166,192,254,115,0,0,0,0,0,0,0,112,81,89,58,69,166,37,173,116,0,0,0,0,0,0,0,112,48,86,88,78,31,104,239,175, + 1,0,0,0,0,0,0,112,131,91,92,64,46,208,181,18,0,0,0,0,0,0,0,112,72,218,86,150,62,241,133,17,0,0,0,0,0,0,0,112,145,216,52,82,159,0,222,22,2,0,0,0,0,0,0,112,162,92,92,196,158,148,223,23,2,0,0,0,0,0,0,112,59,89,62,117,166,153,151,26,2,0,0,0,0,0, + 0,112,48,82,94,71,39,5,211,29,2,0,0,0,0,0,0,112,241,88,124,246,15,116,136,30,2,0,0,0,0,0,0,112,227,86,26,117,14,121,252,31,2,0,0,0,0,0,0,112,202,88,30,128,14,169,190,32,2,0,0,0,0,0,0,112,80,85,22,4,190,93,167,41,2,0,0,0,0,0,0,112,218,210,50, + 80,62,160,130,43,2,0,0,0,0,0,0,112,226,87,80,98,31,161,227,45,2,0,0,0,0,0,0,112,50,216,84,35,6,221,234,52,2,0,0,0,0,0,0,112,139,221,18,13,158,253,244,76,2,0,0,0,0,0,0,112,202,223,16,83,166,221,253,34,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223, + 35,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,36,0,0,0,0,0,0,0,112,184,93,82,15,166,232,195,37,0,0,0,0,0,0,0,112,184,93,82,15,166,232,195,28,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,29,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,31,1,0,0,0, + 0,0,0,112,162,92,92,196,158,148,223,32,1,0,0,0,0,0,0,112,59,89,62,117,166,153,151,36,1,0,0,0,0,0,0,112,50,218,22,61,175,201,212,37,1,0,0,0,0,0,0,112,50,218,22,61,175,201,212,38,1,0,0,0,0,0,0,112,50,218,22,61,175,201,212,39,1,0,0,0,0,0,0,112, + 72,218,86,150,62,241,133,50,1,0,0,0,0,0,0,112,193,220,122,76,190,165,239,51,1,0,0,0,0,0,0,112,144,91,18,231,158,112,206,52,1,0,0,0,0,0,0,112,66,93,80,54,55,192,170,62,1,0,0,0,0,0,0,112,48,88,30,56,46,213,206,70,1,0,0,0,0,0,0,112,48,88,30,56, + 46,213,206,87,1,0,0,0,0,0,0,112,88,220,52,231,151,177,172,92,1,0,0,0,0,0,0,112,72,210,90,125,167,180,245,97,1,0,0,0,0,0,0,112,171,209,92,11,7,76,255,102,1,0,0,0,0,0,0,112,185,210,20,215,182,61,220,41,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223, + 42,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,48,0,0,0,0,0,0,0,112,72,218,86,150,62,241,133,49,0,0,0,0,0,0,0,112,72,218,86,150,62,241,133,85,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,86,0,0,0,0,0,0,0,112,59,89,62,117,166,153,151,238,0,0,0, + 0,0,0,0,112,89,219,82,193,23,245,142,241,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,8,1,0,0,0,0,0,0,112,49,92,60,173,23,184,160,9,1,0,0,0,0,0,0,112,120,210,116,218,190,213,167,10,1,0,0,0,0,0,0,112,242,92,86,121,14,140,148,11,1,0,0,0,0,0,0,112, + 194,217,92,28,167,189,138,12,1,0,0,0,0,0,0,112,33,95,124,138,30,253,162,24,1,0,0,0,0,0,0,112,242,92,86,121,14,140,148,32,1,0,0,0,0,0,0,112,243,82,28,26,167,201,255,16,0,0,0,0,0,0,0,112,144,91,18,231,158,112,206,15,0,0,0,0,0,0,0,112,27,83,80, + 174,159,40,233,16,0,0,0,0,0,0,0,112,27,83,80,174,159,40,233,175,0,0,0,0,0,0,0,112,72,218,86,150,62,241,133,177,0,0,0,0,0,0,0,112,42,87,52,72,31,188,214,196,0,0,0,0,0,0,0,112,17,89,58,165,190,168,250,197,0,0,0,0,0,0,0,112,144,91,18,231,158,112, + 206,201,0,0,0,0,0,0,0,112,240,84,126,197,39,248,249,212,0,0,0,0,0,0,0,112,43,216,90,94,175,185,190,226,0,0,0,0,0,0,0,112,137,216,116,89,39,48,171,231,0,0,0,0,0,0,0,112,42,87,52,72,31,188,214,135,0,0,0,0,0,0,0,112,144,91,18,231,158,112,206,140, + 0,0,0,0,0,0,0,112,9,214,88,197,167,149,194,145,0,0,0,0,0,0,0,112,120,210,116,218,190,213,167,163,0,0,0,0,0,0,0,112,19,217,62,90,62,125,224,49,0,0,0,0,0,0,0,112,144,91,18,231,158,112,206,50,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,51,0,0,0, + 0,0,0,0,112,113,84,88,230,7,136,216,27,1,0,0,0,0,0,0,112,48,82,94,71,39,5,211,30,1,0,0,0,0,0,0,112,154,90,124,7,159,137,173,42,1,0,0,0,0,0,0,112,251,89,24,177,166,168,134,62,1,0,0,0,0,0,0,112,27,214,52,81,7,165,132,77,1,0,0,0,0,0,0,112,24,219, + 62,243,46,241,162,82,1,0,0,0,0,0,0,112,161,93,114,221,151,180,137,81,0,0,0,0,0,0,0,112,170,218,54,199,167,92,233,82,0,0,0,0,0,0,0,112,170,218,54,199,167,92,233,86,0,0,0,0,0,0,0,112,48,82,94,71,39,5,211,91,0,0,0,0,0,0,0,112,72,218,86,150,62,241, + 133,38,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,39,0,0,0,0,0,0,0,112,162,92,92,196,158,148,223,85,0,0,0,0,0,0,0,112,34,80,80,99,142,88,255,69,0,0,0,0,0,0,0,112,58,215,124,67,30,201,215,72,0,0,0,0,0,0,0,112,97,88,62,171,7,133,181,76,0,0,0, + 0,0,0,0,112,58,210,80,58,143,124,188,77,0,0,0,0,0,0,0,112,227,86,26,117,14,121,252,78,0,0,0,0,0,0,0,112,216,218,120,187,6,21,238,12,0,0,0,0,0,0,0,112,200,222,126,236,182,196,156,9,2,0,0,0,0,0,0,112,120,88,24,146,6,117,189,58,2,0,0,0,0,0,0,112, + 120,88,24,146,6,117,189,61,2,0,0,0,0,0,0,112,41,82,58,29,39,240,188,63,2,0,0,0,0,0,0,112,42,90,92,104,143,72,170,72,2,0,0,0,0,0,0,112,82,215,58,223,30,65,144,73,2,0,0,0,0,0,0,112,8,209,16,47,7,245,253,110,2,0,0,0,0,0,0,112,137,222,94,149,183, + 117,147,102,0,0,0,0,0,0,0,112,202,208,90,241,38,205,233,130,0,0,0,0,0,0,0,112,104,85,24,140,150,236,202,160,0,0,0,0,0,0,0,112,34,88,48,236,7,77,254,164,0,0,0,0,0,0,0,112,203,91,84,244,54,4,182,18,0,0,0,0,0,0,0,112,168,83,16,15,174,128,181,16, + 0,0,0,0,0,0,0,112,114,210,24,13,23,133,143,16,0,0,0,0,0,0,0,112,64,92,120,86,46,245,231,120,0,0,0,0,0,0,0,112,17,87,120,50,143,88,181,48,0,0,0,0,0,0,0,112,82,219,52,252,63,25,242,49,0,0,0,0,0,0,0,112,90,218,84,16,62,85,239,50,0,0,0,0,0,0,0,112, + 219,218,126,155,143,172,162,51,0,0,0,0,0,0,0,112,161,214,116,65,174,168,195,52,0,0,0,0,0,0,0,112,106,221,56,205,143,224,178,248,1,0,0,0,0,0,0,112,72,218,86,150,62,241,133,19,2,0,0,0,0,0,0,112,72,218,86,150,62,241,133,82,2,0,0,0,0,0,0,112,210, + 221,18,159,62,213,189,15,0,0,0,0,0,0,0,112,120,220,60,117,183,13,188,13,0,0,0,0,0,0,0,112,168,83,20,211,143,244,167,12,0,0,0,0,0,0,0,112,200,222,126,236,182,196,156,11,0,0,0,0,0,0,0,112,202,214,82,134,39,44,217,180,4,0,0,0,0,0,0,112,203,91,26, + 148,142,169,238,64,0,0,0,0,0,0,0,112,210,218,120,169,134,112,190,65,0,0,0,0,0,0,0,112,210,218,120,169,134,112,190,66,0,0,0,0,0,0,0,112,210,218,120,169,134,112,190,67,0,0,0,0,0,0,0,112,250,211,58,151,182,89,181,68,0,0,0,0,0,0,0,112,250,211,58, + 151,182,89,181,69,0,0,0,0,0,0,0,112,49,91,26,149,15,200,255,73,0,0,0,0,0,0,0,112,96,216,30,44,22,105,139,79,0,0,0,0,0,0,0,112,32,90,54,157,47,12,204,86,0,0,0,0,0,0,0,112,10,214,58,126,175,209,250,104,0,0,0,0,0,0,0,112,120,210,116,218,190,213, + 167,106,0,0,0,0,0,0,0,112,9,221,20,82,142,108,156,107,0,0,0,0,0,0,0,112,11,86,120,28,191,208,252,108,0,0,0,0,0,0,0,112,120,210,116,218,190,213,167,109,0,0,0,0,0,0,0,112,115,215,80,73,134,193,198,110,0,0,0,0,0,0,0,112,115,215,80,73,134,193,198, + 69,0,0,0,0,0,0,0,112,144,223,114,176,14,149,205,77,0,0,0,0,0,0,0,112,251,87,122,84,159,209,251,90,0,0,0,0,0,0,0,112,251,87,122,84,159,209,251,9,0,0,0,0,0,0,0,112,48,82,94,71,39,5,211,46,0,0,0,0,0,0,0,112,120,210,116,218,190,213,167,61,0,0,0, + 0,0,0,0,112,67,221,62,30,190,168,234,34,0,0,0,0,0,0,0,112,154,90,124,7,159,137,173,189,0,0,0,0,0,0,0,112,171,212,122,237,142,93,139,191,0,0,0,0,0,0,0,112,171,212,122,237,142,93,139,217,0,0,0,0,0,0,0,112,96,213,118,163,182,200,202,219,0,0,0,0, + 0,0,0,112,192,93,80,124,15,177,187,220,0,0,0,0,0,0,0,112,192,93,80,124,15,177,187,221,0,0,0,0,0,0,0,112,192,93,80,124,15,177,187,39,0,0,0,0,0,0,0,112,48,82,94,71,39,5,211,57,0,0,0,0,0,0,0,112,170,218,54,199,167,92,233,12,0,0,0,0,0,0,0,112,120, + 210,116,218,190,213,167,35,0,0,0,0,0,0,0,112,48,82,94,71,39,5,211,25,0,0,0,0,0,0,0,112,122,81,20,51,63,16,196,17,0,0,0,0,0,0,0,112,211,223,60,202,55,137,155,16,0,0,0,0,0,0,0,112,1,223,80,108,159,116,155,17,0,0,0,0,0,0,0,112,1,223,80,108,159, + 116,155,50,0,0,0,0,0,0,0,112,1,223,80,108,159,116,155,51,0,0,0,0,0,0,0,112,203,88,48,75,135,133,186,17,0,0,0,0,0,0,0,112,155,93,18,136,30,104,187,15,0,0,0,0,0,0,0,112,211,92,90,123,62,89,181,12,0,0,0,0,0,0,0,112,209,210,84,127,6,73,145,63,0, + 0,0,0,0,0,0,112,202,217,120,84,151,173,195,44,0,0,0,0,0,0,0,112,202,217,120,84,151,173,195,88,0,0,0,0,0,0,0,112,2,211,92,77,47,181,238,99,0,0,0,0,0,0,0,112,250,210,116,60,55,57,206,12,0,0,0,0,0,0,0,112,201,82,116,96,159,189,162,139,0,0,0,0,0, + 0,0,112,59,209,56,232,54,81,134,70,0,0,0,0,0,0,0,112,202,214,82,134,39,44,217,39,0,0,0,0,0,0,0,112,9,86,22,73,143,101,214,11,0,0,0,0,0,0,0,112,113,213,94,195,159,80,230,173,0,0,0,0,0,0,0,112,152,92,28,253,143,76,227,200,0,0,0,0,0,0,0,112,152, + 92,28,253,143,76,227,175,0,0,0,0,0,0,0,112,185,83,86,17,23,196,151,176,0,0,0,0,0,0,0,112,138,210,92,13,135,180,204,54,0,0,0,0,0,0,0,112,99,90,52,207,30,45,133,152,0,0,0,0,0,0,0,112,154,90,124,7,159,137,173,185,0,0,0,0,0,0,0,112,251,89,24,177, + 166,168,134,186,0,0,0,0,0,0,0,112,251,89,24,177,166,168,134,96,0,0,0,0,0,0,0,112,40,212,122,191,174,164,184,42,0,0,0,0,0,0,0,112,48,82,94,71,39,5,211,43,0,0,0,0,0,0,0,112,200,94,126,69,47,81,155,45,0,0,0,0,0,0,0,112,72,218,86,150,62,241,133, + 166,0,0,0,0,0,0,0,112,0,94,92,18,54,65,202,167,0,0,0,0,0,0,0,112,0,94,92,18,54,65,202,194,0,0,0,0,0,0,0,112,48,86,22,243,151,228,199,114,0,0,0,0,0,0,0,112,187,82,124,201,22,25,133,23,0,0,0,0,0,0,0,112,194,82,84,180,55,40,253,24,0,0,0,0,0,0,0, + 112,193,211,82,32,166,228,217,38,0,0,0,0,0,0,0,112,139,219,118,227,135,88,244,39,0,0,0,0,0,0,0,112,18,88,50,195,159,60,203,43,0,0,0,0,0,0,0,112,128,222,126,117,38,232,216,27,0,0,0,0,0,0,0,112,48,82,94,71,39,5,211,36,0,0,0,0,0,0,0,112,75,86,20, + 39,134,21,190,38,0,0,0,0,0,0,0,112,11,209,30,206,183,200,163,69,0,0,0,0,0,0,0,112,115,215,80,73,134,193,198,76,0,0,0,0,0,0,0,112,168,208,126,242,183,121,213,79,0,0,0,0,0,0,0,112,115,208,94,156,191,24,170,28,0,0,0,0,0,0,0,112,40,85,80,128,183, + 108,205,29,0,0,0,0,0,0,0,112,203,213,48,7,190,44,152,30,0,0,0,0,0,0,0,112,40,85,80,128,183,108,205,31,0,0,0,0,0,0,0,112,202,218,26,182,23,184,153,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,101,116,112,111,108,105,110,101,86,49,0,16,0,0,0,23,0,0,0,5,0,0,0,51,0,0,0,16,0,0,0,25,0,0,0,5,0,0,0,23,0,0,0,16,0,0,0,35,0,0,0,5,0,0,0,76,0,0,0,0, + 0,0,0,82,101,116,112,111,108,105,110,101,86,49,0,16,0,0,0,3,0,0,0,4,0,0,0,16,0,0,0,82,101,116,112,111,108,105,110,101,86,49,0,0,0,0,0,0,0,0,0,82,101,116,112,111,108,105,110,101,86,49,0,16,0,0,0,3,0,0,0,8,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,105,0,0,46,105,0,0,59,105,0,0,41,105,0,0,100,105,0,0,84,105,0,0,55,105,0,0,37,105,0,0,138,105,0,0,119,105,0,0,128,105,0,0,105,105,0,0,96,105,0,0,80,105,0,0,51,105,0,0,33,105,0,0,187,106, + 0,0,180,106,0,0,173,106,0,0,166,106,0,0,159,106,0,0,149,106,0,0,139,106,0,0,129,106,0,0,119,106,0,0,123,107,0,0,116,107,0,0,109,107,0,0,102,107,0,0,95,107,0,0,85,107,0,0,75,107,0,0,65,107,0,0,55,107,0,0,99,108,0,0,92,108,0,0,85,108,0,0,78,108, + 0,0,71,108,0,0,64,108,0,0,57,108,0,0,50,108,0,0,43,108,0,0,0,0,0,0,94,197,0,0,68,198,0,0,152,197,0,0,207,197,0,0,74,198,0,0,47,198,0,0,32,198,0,0,160,197,0,0,61,198,0,0,5,198,0,0,246,197,0,0,128,197,0,0,19,198,0,0,224,197,0,0,184,197,0,0,96, + 197,0,0,38,200,0,0,31,200,0,0,17,200,0,0,3,200,0,0,245,199,0,0,225,199,0,0,205,199,0,0,185,199,0,0,165,199,0,0,86,201,0,0,79,201,0,0,65,201,0,0,51,201,0,0,37,201,0,0,17,201,0,0,253,200,0,0,233,200,0,0,213,200,0,0,178,202,0,0,171,202,0,0,157, + 202,0,0,143,202,0,0,129,202,0,0,115,202,0,0,101,202,0,0,87,202,0,0,73,202,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,16,0,0,0,24,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,1,0,1,0,0,0,48,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,9,4,0,0,72,0,0,0,96,176,2,0,40,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,5,52,0,0,0,86,0,83,0,95,0,86,0,69,0,82,0,83,0,73,0,79,0,78,0,95,0,73,0,78,0,70,0,79,0,0,0,0,0,189,4,239,254,0,0, + 1,0,0,0,1,0,46,0,61,9,0,0,1,0,46,0,61,9,63,0,0,0,0,0,0,0,4,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,4,0,0,1,0,83,0,116,0,114,0,105,0,110,0,103,0,70,0,105,0,108,0,101,0,73,0,110,0,102,0,111,0,0,0,100,4,0,0,1,0,48,0,52,0,48,0,57,0,48,0,52,0,98, + 0,48,0,0,0,76,0,22,0,1,0,67,0,111,0,109,0,112,0,97,0,110,0,121,0,78,0,97,0,109,0,101,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0,110,0,0,0,134,0,47,0,1,0,70,0,105, + 0,108,0,101,0,68,0,101,0,115,0,99,0,114,0,105,0,112,0,116,0,105,0,111,0,110,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,69,0,100,0,103,0,101,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,32,0,66,0,114,0,111,0,119, + 0,115,0,101,0,114,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,32,0,76,0,111,0,97,0,100,0,101,0,114,0,0,0,0,0,56,0,12,0,1,0,70,0,105,0,108,0,101,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,0,0,0,0,49,0,46,0,48,0,46,0,50,0,51,0,54,0,53,0,46,0, + 52,0,54,0,0,0,70,0,19,0,1,0,73,0,110,0,116,0,101,0,114,0,110,0,97,0,108,0,78,0,97,0,109,0,101,0,0,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,76,0,111,0,97,0,100,0,101,0,114,0,46,0,100,0,108,0,108,0,0,0,0,0,144,0,54,0,1,0,76,0,101,0,103,0, + 97,0,108,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,0,0,67,0,111,0,112,0,121,0,114,0,105,0,103,0,104,0,116,0,32,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,67,0,111,0,114,0,112,0,111,0,114,0,97,0,116,0,105,0,111,0, + 110,0,46,0,32,0,65,0,108,0,108,0,32,0,114,0,105,0,103,0,104,0,116,0,115,0,32,0,114,0,101,0,115,0,101,0,114,0,118,0,101,0,100,0,46,0,0,0,78,0,19,0,1,0,79,0,114,0,105,0,103,0,105,0,110,0,97,0,108,0,70,0,105,0,108,0,101,0,110,0,97,0,109,0,101,0, + 0,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,76,0,111,0,97,0,100,0,101,0,114,0,46,0,100,0,108,0,108,0,0,0,0,0,126,0,47,0,1,0,80,0,114,0,111,0,100,0,117,0,99,0,116,0,78,0,97,0,109,0,101,0,0,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102, + 0,116,0,32,0,69,0,100,0,103,0,101,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,32,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,32,0,76,0,111,0,97,0,100,0,101,0,114,0,0,0,0,0,60,0,12,0,1,0,80, + 0,114,0,111,0,100,0,117,0,99,0,116,0,86,0,101,0,114,0,115,0,105,0,111,0,110,0,0,0,49,0,46,0,48,0,46,0,50,0,51,0,54,0,53,0,46,0,52,0,54,0,0,0,60,0,10,0,1,0,67,0,111,0,109,0,112,0,97,0,110,0,121,0,83,0,104,0,111,0,114,0,116,0,78,0,97,0,109,0,101, + 0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,0,0,134,0,47,0,1,0,80,0,114,0,111,0,100,0,117,0,99,0,116,0,83,0,104,0,111,0,114,0,116,0,78,0,97,0,109,0,101,0,0,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,69,0,100,0,103, + 0,101,0,32,0,69,0,109,0,98,0,101,0,100,0,100,0,101,0,100,0,32,0,66,0,114,0,111,0,119,0,115,0,101,0,114,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,32,0,76,0,111,0,97,0,100,0,101,0,114,0,0,0,0,0,110,0,41,0,1,0,76,0,97,0,115,0,116,0,67,0,104, + 0,97,0,110,0,103,0,101,0,0,0,52,0,56,0,100,0,49,0,56,0,99,0,98,0,55,0,48,0,49,0,97,0,101,0,50,0,102,0,97,0,57,0,50,0,48,0,52,0,57,0,98,0,57,0,54,0,56,0,97,0,98,0,54,0,99,0,49,0,52,0,53,0,55,0,50,0,50,0,100,0,49,0,48,0,101,0,49,0,50,0,0,0,0,0, + 40,0,2,0,1,0,79,0,102,0,102,0,105,0,99,0,105,0,97,0,108,0,32,0,66,0,117,0,105,0,108,0,100,0,0,0,49,0,0,0,68,0,0,0,1,0,86,0,97,0,114,0,70,0,105,0,108,0,101,0,73,0,110,0,102,0,111,0,0,0,0,0,36,0,4,0,0,0,84,0,114,0,97,0,110,0,115,0,108,0,97,0,116, + 0,105,0,111,0,110,0,0,0,0,0,9,4,176,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,1,0,76,1,0,0,208,160,216,160,224,160,0,161,8,161,16,161,40,161,48,161,56,161,88,161,96,161,24,162,48,162,56,162,64,162,216,162,224,162,232,162,240,162,248,162,104,164,112,164,128,164,144,164,152,164,160, + 164,168,164,176,164,184,164,192,164,200,164,216,164,224,164,232,164,240,164,248,164,0,165,8,165,16,165,40,165,56,165,72,165,80,165,88,165,96,165,104,165,24,167,32,167,40,167,64,167,80,167,96,167,112,167,128,167,144,167,160,167,176,167,192,167, + 208,167,224,167,240,167,0,168,16,168,32,168,48,168,64,168,80,168,96,168,112,168,128,168,144,168,160,168,176,168,192,168,208,168,224,168,240,168,0,169,16,169,32,169,48,169,64,169,80,169,96,169,112,169,128,169,144,169,160,169,176,169,192,169,208, + 169,224,169,240,169,0,170,16,170,32,170,48,170,64,170,80,170,96,170,112,170,128,170,144,170,160,170,176,170,192,170,208,170,224,170,240,170,0,171,16,171,32,171,48,171,64,171,80,171,96,171,112,171,128,171,144,171,160,171,176,171,192,171,208,171, + 224,171,240,171,0,172,16,172,32,172,48,172,64,172,80,172,96,172,112,172,128,172,144,172,160,172,176,172,192,172,208,172,224,172,240,172,0,173,16,173,32,173,48,173,64,173,80,173,96,173,112,173,128,173,144,173,160,173,176,173,192,173,208,173,224, + 173,240,173,0,174,16,174,32,174,48,174,64,174,0,112,1,0,232,0,0,0,32,165,40,165,48,165,56,165,64,165,72,165,80,165,88,165,96,165,104,165,112,165,120,165,128,165,136,165,144,165,152,165,160,165,168,165,176,165,184,165,192,165,136,171,144,171, + 152,171,160,171,240,171,248,171,0,172,8,172,16,172,24,172,32,172,40,172,48,172,56,172,64,172,72,172,80,172,88,172,96,172,104,172,112,172,120,172,128,172,136,172,144,172,152,172,160,172,168,172,176,172,184,172,192,172,200,172,208,172,216,172, + 224,172,232,172,240,172,248,172,0,173,8,173,16,173,24,173,32,173,40,173,48,173,56,173,64,173,80,173,88,173,96,173,104,173,112,173,120,173,128,173,136,173,144,173,152,173,160,173,168,173,176,173,184,173,192,173,200,173,208,173,216,173,224,173, + 232,173,240,173,248,173,0,174,8,174,16,174,24,174,32,174,40,174,48,174,56,174,64,174,72,174,80,174,88,174,96,174,104,174,112,174,120,174,128,174,136,174,144,174,152,174,160,174,168,174,0,128,1,0,124,0,0,0,232,171,240,171,248,171,160,172,168, + 172,184,172,200,172,216,172,232,172,248,172,8,173,24,173,40,173,56,173,72,173,88,173,104,173,120,173,136,173,152,173,168,173,184,173,200,173,216,173,232,173,248,173,8,174,24,174,40,174,56,174,72,174,88,174,104,174,120,174,136,174,152,174,168, + 174,184,174,200,174,216,174,232,174,248,174,8,175,24,175,40,175,56,175,72,175,88,175,104,175,120,175,136,175,152,175,168,175,184,175,200,175,216,175,232,175,248,175,0,144,1,0,104,1,0,0,8,160,24,160,40,160,56,160,72,160,88,160,104,160,120,160, + 136,160,152,160,168,160,184,160,200,160,216,160,232,160,248,160,8,161,24,161,40,161,56,161,72,161,88,161,104,161,120,161,136,161,152,161,168,161,184,161,200,161,216,161,232,161,248,161,8,162,24,162,40,162,56,162,72,162,88,162,104,162,120,162, + 136,162,152,162,168,162,184,162,200,162,216,162,232,162,248,162,8,163,24,163,40,163,56,163,72,163,88,163,104,163,120,163,136,163,152,163,168,163,184,163,200,163,216,163,232,163,248,163,8,164,24,164,40,164,56,164,72,164,88,164,104,164,120,164, + 136,164,152,164,168,164,184,164,200,164,216,164,232,164,248,164,8,165,24,165,40,165,56,165,72,165,88,165,104,165,120,165,136,165,152,165,168,165,184,165,200,165,216,165,232,165,248,165,8,166,24,166,40,166,56,166,72,166,88,166,104,166,120,166, + 136,166,152,166,168,166,184,166,200,166,216,166,232,166,248,166,8,167,24,167,40,167,56,167,72,167,88,167,104,167,120,167,136,167,152,167,168,167,184,167,200,167,216,167,232,167,248,167,8,168,24,168,40,168,56,168,72,168,88,168,104,168,120,168, + 136,168,152,168,168,168,184,168,200,168,216,168,232,168,248,168,8,169,24,169,40,169,56,169,72,169,88,169,104,169,120,169,136,169,152,169,168,169,184,169,200,169,216,169,232,169,248,169,8,170,24,170,40,170,56,170,72,170,88,170,104,170,120,170, + 136,170,152,170,168,170,184,170,200,170,216,170,232,170,0,0,0,160,1,0,40,1,0,0,16,167,32,167,48,167,64,167,80,167,96,167,112,167,128,167,144,167,160,167,176,167,192,167,208,167,224,167,240,167,0,168,16,168,32,168,48,168,64,168,80,168,96,168, + 112,168,128,168,144,168,160,168,176,168,192,168,208,168,224,168,240,168,0,169,16,169,32,169,48,169,64,169,80,169,96,169,112,169,128,169,144,169,160,169,176,169,192,169,208,169,224,169,240,169,0,170,16,170,32,170,48,170,64,170,80,170,96,170,112, + 170,128,170,144,170,160,170,176,170,192,170,208,170,224,170,240,170,0,171,16,171,32,171,48,171,64,171,80,171,96,171,112,171,128,171,144,171,160,171,176,171,192,171,208,171,224,171,240,171,0,172,16,172,32,172,48,172,64,172,80,172,96,172,112,172, + 128,172,144,172,160,172,176,172,192,172,208,172,224,172,240,172,0,173,16,173,32,173,48,173,64,173,80,173,96,173,112,173,128,173,144,173,160,173,176,173,192,173,208,173,224,173,240,173,0,174,16,174,32,174,48,174,64,174,80,174,96,174,112,174,128, + 174,144,174,160,174,176,174,192,174,208,174,224,174,240,174,0,175,16,175,32,175,48,175,64,175,80,175,96,175,112,175,128,175,144,175,160,175,176,175,192,175,208,175,224,175,240,175,0,0,0,176,1,0,180,0,0,0,0,160,16,160,32,160,48,160,64,160,80, + 160,96,160,112,160,128,160,144,160,160,160,176,160,192,160,208,160,224,160,240,160,0,161,16,161,32,161,48,161,64,161,80,161,96,161,112,161,128,161,144,161,160,161,176,161,192,161,208,161,224,161,240,161,0,162,16,162,32,162,48,162,64,162,80,162, + 96,162,112,162,128,162,144,162,160,162,176,162,192,162,208,162,224,162,240,162,0,163,16,163,32,163,48,163,64,163,80,163,96,163,112,163,128,163,144,163,160,163,176,163,192,163,208,163,224,163,240,163,0,164,16,164,32,164,48,164,64,164,80,164,96, + 164,112,164,128,164,144,164,160,164,176,164,192,164,208,164,224,164,240,164,0,165,16,165,32,165,48,165,64,165,0,0,0,208,1,0,28,0,0,0,128,170,136,170,144,170,152,170,160,170,176,170,184,170,192,170,200,170,208,170,0,224,1,0,16,0,0,0,152,167,160, + 167,168,167,176,167,0,240,1,0,36,0,0,0,40,161,48,161,56,161,64,161,72,161,88,161,120,161,128,161,136,161,144,161,184,161,192,161,200,161,0,0,0,32,2,0,104,0,0,0,144,165,216,165,248,165,24,166,56,166,88,166,136,166,160,166,168,166,176,166,232, + 166,240,166,16,168,48,168,56,168,64,168,72,168,80,168,88,168,96,168,104,168,112,168,120,168,136,168,144,168,152,168,160,168,168,168,176,168,184,168,192,168,240,169,40,170,80,170,120,170,168,170,208,170,0,171,8,171,16,171,24,171,32,171,40,171, + 48,171,56,171,72,171,80,171,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,40,0,0,0,2, + 2,0,48,130,40,69,6,9,42,134,72,134,247,13,1,7,2,160,130,40,54,48,130,40,50,2,1,1,49,15,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,48,92,6,10,43,6,1,4,1,130,55,2,1,4,160,78,48,76,48,23,6,10,43,6,1,4,1,130,55,2,1,15,48,9,3,1,0,160,4,162,2,128,0,48, + 49,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,4,32,11,105,152,247,85,229,42,251,198,72,113,139,182,189,55,29,134,68,207,155,212,130,22,79,100,2,54,120,18,102,171,51,160,130,13,133,48,130,6,3,48,130,3,235,160,3,2,1,2,2,19,51,0,0,3,164,203,227,86,184, + 203,127,228,39,0,0,0,0,3,164,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,126,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48, + 28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,40,48,38,6,3,85,4,3,19,31,77,105,99,114,111,115,111,102,116,32,67,111,100,101,32,83,105,103,110,105,110,103,32,80,67,65,32,50,48,49,49,48, + 30,23,13,50,51,49,48,49,57,49,57,53,49,53,53,90,23,13,50,52,49,48,49,54,49,57,53,49,53,53,90,48,116,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109, + 111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,30,48,28,6,3,85,4,3,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,48,130,1,34, + 48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,1,15,0,48,130,1,10,2,130,1,1,0,219,186,45,50,154,234,129,89,235,136,249,215,63,101,133,20,5,217,106,22,213,220,217,220,142,109,201,11,120,196,114,216,99,247,176,230,190,221,248,180,155,79,177,239, + 233,148,142,168,175,107,101,215,84,32,232,248,236,243,51,238,229,44,87,74,113,108,121,230,157,104,57,39,180,237,106,36,182,216,193,16,114,106,250,186,227,190,105,146,100,143,32,161,22,126,135,155,107,176,18,159,76,210,51,136,42,63,137,109,135, + 208,214,161,139,70,80,25,202,59,183,85,229,66,33,250,79,80,6,5,88,183,222,189,122,212,78,224,1,82,192,188,83,62,30,184,202,2,80,95,193,33,136,223,171,100,216,168,15,141,212,221,24,185,202,11,177,144,191,238,71,227,75,252,228,151,59,121,223,130, + 112,135,141,1,47,216,223,173,225,236,233,220,124,137,119,178,164,80,176,194,131,138,67,33,147,122,104,214,196,96,2,109,19,88,9,191,85,145,71,141,28,150,198,55,36,220,176,150,168,61,125,213,139,115,4,47,253,43,203,87,225,174,250,144,110,121,144, + 3,46,232,149,73,197,203,51,160,182,181,2,3,1,0,1,163,130,1,130,48,130,1,126,48,31,6,3,85,29,37,4,24,48,22,6,10,43,6,1,4,1,130,55,10,3,21,6,8,43,6,1,5,5,7,3,3,48,29,6,3,85,29,14,4,22,4,20,226,195,165,151,136,221,111,57,242,153,145,5,120,7,200, + 252,136,142,168,85,48,84,6,3,85,29,17,4,77,48,75,164,73,48,71,49,45,48,43,6,3,85,4,11,19,36,77,105,99,114,111,115,111,102,116,32,73,114,101,108,97,110,100,32,79,112,101,114,97,116,105,111,110,115,32,76,105,109,105,116,101,100,49,22,48,20,6,3, + 85,4,5,19,13,50,51,48,50,49,55,43,53,48,49,54,55,49,48,31,6,3,85,29,35,4,24,48,22,128,20,72,110,100,229,80,5,211,130,170,23,55,55,34,181,109,168,202,117,2,149,48,84,6,3,85,29,31,4,77,48,75,48,73,160,71,160,69,134,67,104,116,116,112,58,47,47, + 119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,114,108,47,77,105,99,67,111,100,83,105,103,80,67,65,50,48,49,49,95,50,48,49,49,45,48,55,45,48,56,46,99,114,108,48,97,6,8,43,6,1,5,5,7,1,1,4,85,48, + 83,48,81,6,8,43,6,1,5,5,7,48,2,134,69,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,101,114,116,115,47,77,105,99,67,111,100,83,105,103,80,67,65,50,48,49,49,95,50,48, + 49,49,45,48,55,45,48,56,46,99,114,116,48,12,6,3,85,29,19,1,1,255,4,2,48,0,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,122,220,16,76,109,248,84,226,112,43,238,135,93,145,91,111,246,36,81,233,70,98,171,9,118,222,171,130,79,218,210,84, + 76,85,221,97,49,52,158,200,247,61,104,254,139,205,78,66,255,220,69,233,86,38,162,9,23,71,194,16,135,235,61,235,83,197,3,49,196,94,15,7,166,113,249,206,93,198,64,175,64,212,217,86,163,91,12,40,207,185,88,235,58,147,31,207,68,73,211,165,28,240, + 217,97,180,133,90,157,127,103,8,172,219,184,69,49,248,167,9,170,194,229,232,69,154,39,111,174,38,146,146,211,147,56,12,218,139,66,171,147,200,6,252,4,210,109,235,175,127,222,39,202,90,64,113,132,51,38,52,150,212,200,88,36,183,192,3,174,174,33, + 184,89,210,139,11,42,145,249,184,138,202,100,65,96,217,44,141,248,206,196,216,14,58,174,168,201,186,89,137,175,2,232,74,19,226,62,89,134,130,85,72,4,238,80,31,108,125,183,63,54,100,126,245,142,171,4,14,237,67,27,14,153,84,110,47,116,180,151, + 209,157,111,194,231,144,133,8,97,135,38,42,55,179,225,249,48,8,79,217,100,216,14,170,209,227,100,171,84,209,16,113,37,230,231,185,229,180,123,254,41,134,194,175,14,31,53,239,128,14,152,37,247,48,128,120,48,35,112,178,51,138,248,131,201,35,197, + 214,196,180,247,190,98,222,178,10,209,35,78,50,177,87,50,250,199,35,238,130,218,100,136,211,178,209,178,103,153,215,24,97,194,236,39,22,222,230,104,130,173,159,210,103,62,110,27,170,20,169,229,1,166,84,206,12,168,180,95,54,225,217,135,127,97, + 19,151,14,15,136,142,169,80,174,199,144,236,56,78,89,56,28,226,188,190,44,21,65,112,76,91,145,194,78,167,209,30,117,49,156,231,225,162,41,254,153,149,195,95,114,59,198,231,82,116,181,124,174,2,108,96,229,144,43,114,232,154,226,203,190,26,166, + 93,138,246,151,228,160,178,204,189,9,14,162,133,12,44,180,78,135,252,230,48,40,109,208,173,188,251,71,54,97,38,190,137,244,145,125,6,7,50,10,217,179,54,55,211,235,9,114,153,195,38,199,242,29,86,150,65,142,60,211,91,64,233,68,161,206,255,47,232, + 200,235,26,144,183,48,130,7,122,48,130,5,98,160,3,2,1,2,2,10,97,14,144,210,0,0,0,0,0,3,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,129,136,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49, + 16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,50,48,48,6,3,85,4,3,19,41,77,105,99,114,111,115,111,102,116,32,82,111,111,116, + 32,67,101,114,116,105,102,105,99,97,116,101,32,65,117,116,104,111,114,105,116,121,32,50,48,49,49,48,30,23,13,49,49,48,55,48,56,50,48,53,57,48,57,90,23,13,50,54,48,55,48,56,50,49,48,57,48,57,90,48,126,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48, + 17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,40,48,38,6,3,85, + 4,3,19,31,77,105,99,114,111,115,111,102,116,32,67,111,100,101,32,83,105,103,110,105,110,103,32,80,67,65,32,50,48,49,49,48,130,2,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,2,15,0,48,130,2,10,2,130,2,1,0,171,240,250,114,16,28,46,173,216, + 110,170,130,16,77,52,186,242,182,88,33,159,66,27,42,107,233,90,80,170,184,6,56,26,4,73,186,127,195,12,30,221,55,107,198,18,216,11,240,56,194,153,6,176,200,57,213,1,20,49,66,211,137,13,121,100,135,126,148,96,36,108,175,158,73,156,233,104,94,210, + 223,155,83,178,10,44,195,175,217,169,43,174,122,9,175,215,150,89,202,96,26,5,233,102,118,232,50,82,38,18,47,231,171,8,80,207,179,68,183,93,216,196,46,3,117,171,104,243,203,109,243,58,92,161,22,244,70,186,224,56,100,172,110,100,53,120,166,160, + 99,15,45,211,64,147,248,227,222,7,13,213,92,121,165,73,41,231,13,190,160,19,119,190,148,61,239,251,227,43,90,16,31,77,86,40,162,122,114,224,18,58,183,73,94,216,237,237,67,145,131,217,123,178,123,134,27,217,62,177,140,93,232,137,79,132,26,242, + 161,47,89,228,144,59,45,174,51,88,197,183,62,254,50,211,179,3,61,177,178,175,146,56,126,210,157,128,44,245,78,86,145,33,53,37,195,57,110,100,127,83,186,156,15,173,25,35,132,203,244,186,3,134,141,247,95,240,208,82,191,140,148,135,188,192,33,116, + 37,95,24,40,182,204,39,40,56,37,152,57,74,54,207,124,177,146,174,28,35,167,169,102,236,97,31,106,225,40,73,157,95,136,226,37,93,211,33,75,62,82,196,181,87,63,36,3,240,209,122,91,47,213,35,227,112,93,15,81,70,119,179,248,0,225,188,172,2,130,95, + 219,192,21,179,189,27,212,85,75,231,57,161,15,233,35,73,188,24,184,68,124,69,228,193,195,114,122,224,114,231,36,223,191,70,153,197,239,194,28,87,219,131,141,236,77,73,48,167,171,142,223,236,91,159,175,252,221,176,102,226,193,151,129,123,237, + 214,237,75,231,73,41,167,19,40,166,167,125,103,128,230,138,98,120,95,178,47,132,215,87,156,92,191,119,40,40,241,237,109,195,40,143,44,143,64,55,79,193,225,133,68,137,196,9,76,197,212,165,67,47,116,149,247,110,248,120,32,88,44,19,93,96,149,154, + 62,79,51,132,218,176,136,23,222,158,78,244,150,176,188,70,160,108,152,210,224,214,136,140,11,2,3,1,0,1,163,130,1,237,48,130,1,233,48,16,6,9,43,6,1,4,1,130,55,21,1,4,3,2,1,0,48,29,6,3,85,29,14,4,22,4,20,72,110,100,229,80,5,211,130,170,23,55,55, + 34,181,109,168,202,117,2,149,48,25,6,9,43,6,1,4,1,130,55,20,2,4,12,30,10,0,83,0,117,0,98,0,67,0,65,48,11,6,3,85,29,15,4,4,3,2,1,134,48,15,6,3,85,29,19,1,1,255,4,5,48,3,1,1,255,48,31,6,3,85,29,35,4,24,48,22,128,20,114,45,58,2,49,144,67,185,20, + 5,78,225,234,167,199,49,209,35,137,52,48,90,6,3,85,29,31,4,83,48,81,48,79,160,77,160,75,134,73,104,116,116,112,58,47,47,99,114,108,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,47,99,114,108,47,112,114,111,100,117,99,116, + 115,47,77,105,99,82,111,111,67,101,114,65,117,116,50,48,49,49,95,50,48,49,49,95,48,51,95,50,50,46,99,114,108,48,94,6,8,43,6,1,5,5,7,1,1,4,82,48,80,48,78,6,8,43,6,1,5,5,7,48,2,134,66,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111, + 115,111,102,116,46,99,111,109,47,112,107,105,47,99,101,114,116,115,47,77,105,99,82,111,111,67,101,114,65,117,116,50,48,49,49,95,50,48,49,49,95,48,51,95,50,50,46,99,114,116,48,129,159,6,3,85,29,32,4,129,151,48,129,148,48,129,145,6,9,43,6,1,4, + 1,130,55,46,3,48,129,131,48,63,6,8,43,6,1,5,5,7,2,1,22,51,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,100,111,99,115,47,112,114,105,109,97,114,121,99,112,115,46,104,116, + 109,48,64,6,8,43,6,1,5,5,7,2,2,48,52,30,50,32,29,0,76,0,101,0,103,0,97,0,108,0,95,0,112,0,111,0,108,0,105,0,99,0,121,0,95,0,115,0,116,0,97,0,116,0,101,0,109,0,101,0,110,0,116,0,46,32,29,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,103, + 242,134,165,152,224,84,121,26,46,211,216,116,103,34,155,11,150,17,225,99,146,153,66,150,125,210,121,12,144,193,101,95,46,44,62,248,195,114,209,109,131,254,190,63,232,10,202,59,191,71,169,163,243,105,219,99,191,34,53,165,151,93,101,132,144,125, + 139,70,80,85,216,12,146,124,210,26,75,28,243,60,66,139,82,208,176,253,107,227,62,7,46,41,155,230,61,27,165,212,181,29,119,148,57,226,233,100,201,68,61,120,122,35,243,19,125,166,144,116,131,141,244,203,38,2,70,42,194,138,16,187,164,169,5,12,155, + 237,104,250,104,46,149,160,42,63,42,107,88,73,99,31,9,105,110,90,152,150,228,131,244,192,143,243,70,43,222,252,59,208,189,53,239,110,37,174,229,175,39,237,208,221,243,14,175,153,40,151,152,77,14,61,11,242,8,137,214,31,195,50,24,226,240,197,45, + 206,91,158,180,73,57,10,198,10,194,198,173,174,229,178,217,219,21,136,81,69,88,56,50,113,39,26,127,177,244,39,248,222,44,58,32,105,152,178,89,137,104,110,111,167,183,116,195,64,5,6,166,1,42,40,62,130,63,19,77,102,11,192,179,77,245,225,143,127, + 28,111,21,125,69,167,118,229,64,42,101,163,195,93,82,98,134,195,29,99,54,151,134,223,218,243,248,242,22,161,154,39,225,205,165,151,208,238,93,99,65,227,91,7,156,135,62,6,119,6,209,6,177,117,31,20,190,97,97,181,240,220,198,27,4,190,223,65,199, + 14,40,238,222,101,47,236,151,246,161,92,150,216,0,214,161,70,189,89,243,151,165,9,75,72,16,153,128,31,208,0,41,197,177,155,165,63,69,119,30,53,198,210,162,162,159,122,122,34,250,72,149,31,171,251,71,35,128,245,158,248,191,107,183,75,151,226, + 235,117,120,26,236,234,55,153,121,24,75,255,214,179,35,104,117,230,175,250,252,139,235,11,128,234,105,59,175,252,48,237,4,76,142,223,223,117,109,99,145,61,209,157,86,78,79,191,128,87,34,161,120,17,50,33,122,239,65,10,177,63,251,168,204,164,93, + 193,161,136,155,87,113,86,78,72,69,192,66,201,155,118,91,10,128,72,107,253,121,159,193,189,109,109,106,201,82,115,19,13,122,80,205,49,130,26,51,48,130,26,47,2,1,1,48,129,149,48,126,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10, + 87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,40,48,38,6,3,85,4,3,19,31,77,105,99, + 114,111,115,111,102,116,32,67,111,100,101,32,83,105,103,110,105,110,103,32,80,67,65,32,50,48,49,49,2,19,51,0,0,3,164,203,227,86,184,203,127,228,39,0,0,0,0,3,164,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,160,129,212,48,25,6,9,42,134,72,134,247,13, + 1,9,3,49,12,6,10,43,6,1,4,1,130,55,2,1,4,48,28,6,10,43,6,1,4,1,130,55,2,1,11,49,14,48,12,6,10,43,6,1,4,1,130,55,2,1,21,48,47,6,9,42,134,72,134,247,13,1,9,4,49,34,4,32,211,51,74,254,224,208,185,104,144,149,188,46,17,252,59,119,136,174,219,123, + 72,227,79,180,18,25,208,24,4,57,162,249,48,104,6,10,43,6,1,4,1,130,55,2,1,12,49,90,48,88,160,56,128,54,0,77,0,105,0,99,0,114,0,111,0,115,0,111,0,102,0,116,0,32,0,69,0,100,0,103,0,101,0,32,0,87,0,101,0,98,0,86,0,105,0,101,0,119,0,50,0,32,0,83, + 0,68,0,75,161,28,128,26,104,116,116,112,115,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,32,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,4,130,1,0,192,226,10,132,156,226,168,128,19,108,3,242,1,206,167,234,13,204,13,92, + 223,27,78,79,74,236,242,219,135,97,51,225,164,182,65,169,20,76,147,34,247,116,111,55,178,93,213,173,250,111,139,237,227,189,119,99,133,90,145,34,127,198,218,89,97,117,85,233,82,177,228,31,87,138,126,185,201,179,14,210,54,83,246,147,130,89,37, + 29,231,122,218,125,172,165,153,195,218,148,102,17,1,91,184,187,167,207,10,236,230,87,164,106,21,53,172,13,16,106,51,247,82,8,82,45,58,60,33,3,177,26,143,101,204,216,229,188,114,42,22,243,109,26,123,72,109,6,225,80,139,200,116,90,74,194,216,157, + 221,95,153,198,27,240,164,10,178,169,239,178,82,90,249,156,217,60,147,137,201,47,156,94,253,186,69,2,17,199,39,60,186,79,235,139,21,83,111,91,141,172,40,250,221,166,61,9,118,146,252,205,133,5,106,153,8,207,115,247,160,151,148,230,87,29,186,77, + 94,91,202,105,207,9,109,47,236,239,177,118,168,32,110,120,238,150,123,175,67,73,96,1,18,100,112,58,232,233,204,23,161,130,23,151,48,130,23,147,6,10,43,6,1,4,1,130,55,3,3,1,49,130,23,131,48,130,23,127,6,9,42,134,72,134,247,13,1,7,2,160,130,23, + 112,48,130,23,108,2,1,3,49,15,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,48,130,1,82,6,11,42,134,72,134,247,13,1,9,16,1,4,160,130,1,65,4,130,1,61,48,130,1,57,2,1,1,6,10,43,6,1,4,1,132,89,10,3,1,48,49,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,4,32,175, + 26,102,228,62,220,205,124,197,64,104,98,10,8,41,254,112,146,108,43,76,228,229,154,92,91,75,129,217,230,162,138,2,6,101,206,5,181,125,110,24,19,50,48,50,52,48,50,50,48,48,56,49,56,53,51,46,50,50,54,90,48,4,128,2,1,244,160,129,209,164,129,206, + 48,129,203,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114, + 112,111,114,97,116,105,111,110,49,37,48,35,6,3,85,4,11,19,28,77,105,99,114,111,115,111,102,116,32,65,109,101,114,105,99,97,32,79,112,101,114,97,116,105,111,110,115,49,39,48,37,6,3,85,4,11,19,30,110,83,104,105,101,108,100,32,84,83,83,32,69,83, + 78,58,65,48,48,48,45,48,53,69,48,45,68,57,52,55,49,37,48,35,6,3,85,4,3,19,28,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,83,101,114,118,105,99,101,160,130,17,237,48,130,7,32,48,130,5,8,160,3,2,1,2,2,19,51,0,0, + 1,235,224,24,108,181,182,239,56,237,0,1,0,0,1,235,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109, + 111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50, + 48,49,48,48,30,23,13,50,51,49,50,48,54,49,56,52,53,51,52,90,23,13,50,53,48,51,48,53,49,56,52,53,51,52,90,48,129,203,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19, + 7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,37,48,35,6,3,85,4,11,19,28,77,105,99,114,111,115,111,102,116,32,65,109,101,114,105,99,97,32,79,112,101, + 114,97,116,105,111,110,115,49,39,48,37,6,3,85,4,11,19,30,110,83,104,105,101,108,100,32,84,83,83,32,69,83,78,58,65,48,48,48,45,48,53,69,48,45,68,57,52,55,49,37,48,35,6,3,85,4,3,19,28,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116, + 97,109,112,32,83,101,114,118,105,99,101,48,130,2,34,48,13,6,9,42,134,72,134,247,13,1,1,1,5,0,3,130,2,15,0,48,130,2,10,2,130,2,1,0,193,21,104,33,218,86,224,87,119,137,167,77,104,170,38,133,6,230,27,53,206,225,72,169,164,182,242,117,228,218,193, + 252,48,91,161,74,48,241,99,206,76,252,91,159,184,28,152,131,134,155,2,100,119,228,242,23,30,202,58,124,235,198,122,1,222,27,175,191,221,95,102,229,46,128,139,10,78,112,47,131,96,84,254,119,205,237,156,231,244,169,53,154,155,137,219,180,186,197, + 64,199,226,135,69,137,126,117,32,39,10,151,161,6,225,204,74,129,192,192,138,120,161,79,204,107,160,149,149,1,50,251,167,198,219,126,124,44,115,90,98,133,153,156,188,139,152,26,118,245,77,143,109,158,151,66,133,106,253,16,4,110,10,141,211,137, + 17,163,51,98,233,226,152,147,218,80,249,134,119,119,85,161,147,122,147,106,201,169,41,144,33,149,211,231,10,241,91,191,30,66,25,118,252,190,207,145,11,222,136,211,116,82,203,230,242,125,32,10,32,89,253,215,2,237,221,237,42,69,105,170,30,139, + 29,30,214,174,121,0,63,120,103,0,207,250,44,234,45,167,108,5,29,237,206,58,182,69,250,194,52,191,147,154,47,227,106,84,109,163,242,122,110,30,31,62,17,196,78,112,194,239,196,245,201,245,212,65,209,173,152,159,238,180,143,192,55,24,187,29,95, + 32,0,252,226,119,212,216,140,195,219,98,161,188,203,156,115,250,2,63,72,92,163,249,162,173,28,117,166,43,49,23,62,219,87,204,7,30,196,157,68,31,188,27,186,37,100,222,193,43,60,175,76,46,13,87,111,168,76,228,114,22,3,72,196,1,152,74,19,39,121, + 132,125,151,50,38,243,106,70,233,218,205,132,37,5,154,177,7,56,12,198,133,212,75,16,212,44,224,10,80,216,33,129,186,173,72,110,117,242,59,147,194,253,40,160,132,185,244,91,43,153,93,69,131,64,169,215,107,255,36,137,126,230,111,220,244,183,250, + 251,67,233,126,170,212,126,20,58,104,195,41,216,232,91,122,172,236,148,76,102,97,253,126,65,100,51,54,250,97,44,235,233,229,245,46,134,38,220,250,206,212,151,154,227,116,152,206,80,119,79,63,56,58,251,149,73,94,205,114,39,85,180,218,162,101, + 229,150,165,88,223,106,244,126,38,63,201,57,2,3,1,0,1,163,130,1,73,48,130,1,69,48,29,6,3,85,29,14,4,22,4,20,116,158,5,172,214,85,204,110,226,164,253,59,152,211,216,31,170,1,234,225,48,31,6,3,85,29,35,4,24,48,22,128,20,159,167,21,93,0,94,98,93, + 131,244,229,210,101,167,27,83,53,25,233,114,48,95,6,3,85,29,31,4,88,48,86,48,84,160,82,160,80,134,78,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,114,108,47,77,105, + 99,114,111,115,111,102,116,37,50,48,84,105,109,101,45,83,116,97,109,112,37,50,48,80,67,65,37,50,48,50,48,49,48,40,49,41,46,99,114,108,48,108,6,8,43,6,1,5,5,7,1,1,4,96,48,94,48,92,6,8,43,6,1,5,5,7,48,2,134,80,104,116,116,112,58,47,47,119,119, + 119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,99,101,114,116,115,47,77,105,99,114,111,115,111,102,116,37,50,48,84,105,109,101,45,83,116,97,109,112,37,50,48,80,67,65,37,50,48,50,48,49,48,40,49,41,46,99, + 114,116,48,12,6,3,85,29,19,1,1,255,4,2,48,0,48,22,6,3,85,29,37,1,1,255,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,14,6,3,85,29,15,1,1,255,4,4,3,2,7,128,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,131,116,223,47,160,247,124,11,229,86,100,253, + 254,91,206,220,253,6,221,109,98,180,176,235,125,103,137,4,57,105,224,236,169,161,249,96,246,46,115,201,76,146,136,17,172,103,136,231,45,247,3,32,39,204,144,203,4,124,88,120,3,58,246,240,169,218,172,45,70,140,224,218,222,174,210,58,20,143,107, + 134,56,94,104,172,77,54,112,89,204,118,75,15,9,100,47,219,194,16,55,189,69,205,29,25,37,93,228,24,55,9,105,39,87,123,175,85,171,181,224,94,121,17,36,214,32,19,90,65,47,66,166,141,142,167,61,220,70,0,24,85,246,139,20,102,192,172,215,17,189,37, + 175,73,70,222,35,98,3,169,28,66,227,16,91,70,35,80,251,90,135,92,48,143,159,72,70,177,119,203,251,41,195,102,119,2,126,204,205,174,88,25,79,110,23,130,27,211,205,131,7,113,120,168,45,86,40,255,97,228,202,140,58,116,142,238,80,178,91,43,18,215, + 243,1,225,178,44,43,137,114,3,10,120,203,86,193,180,19,150,209,243,100,32,114,199,132,135,22,212,217,221,81,84,119,16,182,69,4,237,111,115,197,154,153,235,248,207,153,170,35,102,5,208,59,125,215,143,19,135,97,133,90,252,21,220,34,235,188,72, + 204,207,142,48,0,110,232,240,77,172,41,107,50,193,191,223,123,45,16,116,100,230,205,114,66,88,201,4,41,17,52,159,148,221,250,141,111,179,237,31,231,27,34,106,69,157,199,181,157,101,93,109,95,235,49,2,1,227,254,245,220,186,158,103,2,173,87,14, + 169,180,7,95,182,107,241,99,220,130,17,201,0,0,229,155,145,49,62,30,113,139,91,77,70,79,162,232,93,154,245,42,83,121,9,217,92,254,116,195,226,104,79,18,18,66,174,239,6,40,246,158,43,64,177,34,218,85,227,42,160,248,190,53,121,83,80,214,118,53, + 219,91,22,190,136,138,191,89,43,219,159,107,61,197,197,251,195,102,141,250,230,242,206,163,57,144,57,239,217,250,155,184,189,142,115,62,107,77,137,82,28,66,113,114,236,150,78,137,149,67,35,150,200,119,4,17,106,45,170,184,114,137,234,91,84,118, + 200,183,30,51,103,137,235,132,239,103,211,225,229,161,198,217,167,55,145,216,8,48,130,7,113,48,130,5,89,160,3,2,1,2,2,19,51,0,0,0,21,197,231,107,158,2,155,73,153,0,0,0,0,0,21,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,48,129,136,49,11,48,9,6, + 3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105, + 111,110,49,50,48,48,6,3,85,4,3,19,41,77,105,99,114,111,115,111,102,116,32,82,111,111,116,32,67,101,114,116,105,102,105,99,97,116,101,32,65,117,116,104,111,114,105,116,121,32,50,48,49,48,48,30,23,13,50,49,48,57,51,48,49,56,50,50,50,53,90,23,13, + 51,48,48,57,51,48,49,56,51,50,50,53,90,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99, + 114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50,48,49,48,48,130,2,34,48,13,6,9,42,134,72,134,247,13, + 1,1,1,5,0,3,130,2,15,0,48,130,2,10,2,130,2,1,0,228,225,166,76,231,180,114,33,11,121,162,203,215,36,121,189,14,213,130,211,253,238,156,7,7,210,169,108,78,117,200,202,53,87,246,1,127,108,74,224,226,189,185,62,23,96,51,255,92,79,199,102,247,149, + 83,113,90,226,126,74,90,254,184,54,103,133,70,35,12,181,141,19,207,119,50,192,16,24,232,96,125,106,82,131,68,183,166,142,70,107,7,20,243,197,118,245,134,80,220,193,68,200,113,92,81,49,55,160,10,56,110,141,237,215,15,216,38,83,124,57,97,2,122, + 196,170,253,114,105,175,29,171,172,246,54,190,53,38,100,218,152,59,186,26,123,51,173,128,91,126,140,16,28,157,82,254,182,232,98,37,220,106,15,207,93,244,254,142,83,207,214,236,133,86,77,239,221,188,141,164,227,145,143,178,57,44,81,156,233,112, + 105,13,202,54,45,112,142,49,200,53,40,189,227,180,135,36,195,224,201,143,126,181,84,143,220,250,5,85,152,109,104,59,154,70,189,237,164,174,122,41,55,172,203,235,131,69,231,70,110,202,50,213,192,134,48,92,79,44,226,98,178,205,185,226,141,136, + 228,150,172,1,74,187,190,113,169,23,91,103,96,222,248,146,145,30,29,61,253,32,207,115,125,65,154,70,117,205,196,95,52,221,18,137,214,253,165,32,125,126,252,217,158,69,223,182,114,47,219,125,95,128,186,219,170,126,54,236,54,76,246,43,110,168, + 18,81,232,191,5,3,163,209,115,166,77,55,116,148,28,52,130,15,240,16,242,183,71,24,237,167,232,153,124,63,76,219,175,94,194,243,213,216,115,61,67,78,193,51,57,76,142,2,188,66,104,46,16,234,132,81,70,226,209,189,106,24,90,97,1,115,202,103,162, + 94,215,40,118,2,226,51,24,114,215,167,32,240,194,250,18,10,215,99,111,12,201,54,100,139,91,160,166,131,33,93,95,48,116,145,148,148,216,185,80,249,11,137,97,243,54,6,53,24,132,71,219,220,27,209,253,178,212,28,197,107,246,92,82,81,93,18,219,37, + 186,175,80,5,122,108,197,17,29,114,239,141,249,82,196,133,23,147,192,60,21,219,26,55,199,8,21,24,63,120,171,69,182,245,30,135,94,218,143,158,22,114,105,198,174,123,183,183,62,106,226,46,173,2,3,1,0,1,163,130,1,221,48,130,1,217,48,18,6,9,43,6, + 1,4,1,130,55,21,1,4,5,2,3,1,0,1,48,35,6,9,43,6,1,4,1,130,55,21,2,4,22,4,20,42,167,82,254,100,196,154,190,130,145,60,70,53,41,207,16,255,47,4,238,48,29,6,3,85,29,14,4,22,4,20,159,167,21,93,0,94,98,93,131,244,229,210,101,167,27,83,53,25,233,114, + 48,92,6,3,85,29,32,4,85,48,83,48,81,6,12,43,6,1,4,1,130,55,76,131,125,1,1,48,65,48,63,6,8,43,6,1,5,5,7,2,1,22,51,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,111,112,115,47,68,111,99, + 115,47,82,101,112,111,115,105,116,111,114,121,46,104,116,109,48,19,6,3,85,29,37,4,12,48,10,6,8,43,6,1,5,5,7,3,8,48,25,6,9,43,6,1,4,1,130,55,20,2,4,12,30,10,0,83,0,117,0,98,0,67,0,65,48,11,6,3,85,29,15,4,4,3,2,1,134,48,15,6,3,85,29,19,1,1,255, + 4,5,48,3,1,1,255,48,31,6,3,85,29,35,4,24,48,22,128,20,213,246,86,203,143,232,162,92,98,104,209,61,148,144,91,215,206,154,24,196,48,86,6,3,85,29,31,4,79,48,77,48,75,160,73,160,71,134,69,104,116,116,112,58,47,47,99,114,108,46,109,105,99,114,111, + 115,111,102,116,46,99,111,109,47,112,107,105,47,99,114,108,47,112,114,111,100,117,99,116,115,47,77,105,99,82,111,111,67,101,114,65,117,116,95,50,48,49,48,45,48,54,45,50,51,46,99,114,108,48,90,6,8,43,6,1,5,5,7,1,1,4,78,48,76,48,74,6,8,43,6,1, + 5,5,7,48,2,134,62,104,116,116,112,58,47,47,119,119,119,46,109,105,99,114,111,115,111,102,116,46,99,111,109,47,112,107,105,47,99,101,114,116,115,47,77,105,99,82,111,111,67,101,114,65,117,116,95,50,48,49,48,45,48,54,45,50,51,46,99,114,116,48,13, + 6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,2,1,0,157,85,125,252,42,173,225,44,31,103,1,49,36,91,225,158,114,75,252,169,111,234,92,20,182,62,78,71,100,120,177,6,147,151,61,49,51,181,57,215,194,113,54,63,218,100,108,124,208,117,57,109,187,15,49, + 228,194,143,251,108,209,161,148,24,34,238,233,102,103,58,83,77,221,152,186,182,30,120,216,54,46,156,169,130,86,0,3,176,5,190,137,232,105,224,186,9,238,123,223,106,111,190,41,203,110,216,63,72,117,1,217,24,222,109,130,12,245,109,35,84,228,120, + 83,117,36,87,185,221,159,243,142,61,198,243,104,223,101,246,164,86,170,247,149,182,40,85,39,208,36,189,64,160,191,25,182,18,18,17,93,61,39,224,64,150,56,172,247,249,41,137,195,188,23,176,84,133,66,179,252,12,158,139,25,137,231,240,11,106,129, + 194,129,25,66,25,82,117,138,54,194,29,195,97,115,46,44,107,123,110,63,44,9,120,20,233,145,178,169,91,223,73,163,116,12,188,236,145,128,210,61,230,74,62,102,59,79,187,134,250,50,26,217,150,244,143,246,145,1,246,206,198,116,253,246,76,114,111, + 16,171,117,48,197,52,176,122,216,80,254,10,88,221,64,60,199,84,109,157,99,116,72,44,177,78,71,45,193,20,4,113,191,100,249,36,190,115,109,202,142,9,189,179,1,87,73,84,100,217,115,215,127,30,91,68,1,142,90,25,145,107,13,159,164,40,220,103,25,40, + 36,186,56,75,154,110,251,33,84,107,106,69,17,71,169,241,183,174,200,232,137,94,79,157,210,208,76,118,181,87,84,9,177,105,1,68,126,124,161,97,108,115,254,10,187,236,65,102,61,105,253,203,193,65,73,126,126,147,190,203,248,59,228,183,21,191,180, + 206,62,165,49,81,132,188,191,2,193,130,162,123,23,29,21,137,141,112,254,231,181,208,40,26,137,11,143,54,218,186,76,249,155,255,10,233,52,248,36,53,103,43,224,13,184,230,140,153,214,225,34,234,240,39,66,61,37,148,230,116,116,91,106,209,158,62, + 237,126,160,49,51,125,188,203,233,123,191,56,112,68,209,144,241,200,171,58,138,58,8,98,127,217,112,99,83,77,141,238,130,109,165,5,16,193,113,6,106,16,180,29,85,51,88,179,161,112,102,242,161,130,3,80,48,130,2,56,2,1,1,48,129,249,161,129,209,164, + 129,206,48,129,203,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32, + 67,111,114,112,111,114,97,116,105,111,110,49,37,48,35,6,3,85,4,11,19,28,77,105,99,114,111,115,111,102,116,32,65,109,101,114,105,99,97,32,79,112,101,114,97,116,105,111,110,115,49,39,48,37,6,3,85,4,11,19,30,110,83,104,105,101,108,100,32,84,83, + 83,32,69,83,78,58,65,48,48,48,45,48,53,69,48,45,68,57,52,55,49,37,48,35,6,3,85,4,3,19,28,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,83,101,114,118,105,99,101,162,35,10,1,1,48,7,6,5,43,14,3,2,26,3,21,0,128,6,137, + 117,187,92,48,193,136,20,181,74,48,50,122,152,189,187,165,222,160,129,131,48,129,128,164,126,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109, + 111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50, + 48,49,48,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,2,5,0,233,126,114,166,48,34,24,15,50,48,50,52,48,50,50,48,48,48,51,54,53,52,90,24,15,50,48,50,52,48,50,50,49,48,48,51,54,53,52,90,48,119,48,61,6,10,43,6,1,4,1,132,89,10,4,1,49,47,48,45,48,10, + 2,5,0,233,126,114,166,2,1,0,48,10,2,1,0,2,2,27,143,2,1,255,48,7,2,1,0,2,2,18,211,48,10,2,5,0,233,127,196,38,2,1,0,48,54,6,10,43,6,1,4,1,132,89,10,4,2,49,40,48,38,48,12,6,10,43,6,1,4,1,132,89,10,3,2,160,10,48,8,2,1,0,2,3,7,161,32,161,10,48,8, + 2,1,0,2,3,1,134,160,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,3,130,1,1,0,151,68,194,222,8,249,150,245,17,97,109,145,35,119,119,166,148,143,15,15,103,7,87,63,201,15,212,246,127,147,238,1,254,174,125,130,174,162,247,207,83,251,26,236,207,21,154, + 5,219,215,30,97,110,38,205,99,177,239,247,46,43,26,139,139,203,26,139,65,67,166,135,71,177,198,195,225,36,38,220,74,127,91,5,204,127,78,61,206,192,131,239,30,156,158,38,154,9,175,67,139,112,246,27,32,182,118,115,246,29,29,50,63,32,195,143,196, + 215,218,56,136,6,151,177,82,14,152,197,158,75,219,163,150,7,133,103,26,143,164,58,227,179,141,2,43,31,251,70,8,241,92,74,199,179,207,124,193,138,197,52,227,136,115,208,147,214,44,171,248,48,192,12,244,194,35,247,202,213,205,77,92,110,88,68,47, + 89,213,173,246,4,151,133,16,31,173,85,15,28,61,97,200,54,94,217,164,185,144,1,210,106,195,191,215,214,86,156,171,204,159,225,98,201,235,8,170,120,122,17,66,203,33,92,117,31,123,177,230,189,70,210,171,191,126,224,192,125,66,41,1,154,73,13,83, + 161,79,176,139,49,130,4,13,48,130,4,9,2,1,1,48,129,147,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109,111,110,100,49,30,48,28,6,3,85,4,10, + 19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50,48,49,48,2,19,51,0,0,1,235,224,24,108, + 181,182,239,56,237,0,1,0,0,1,235,48,13,6,9,96,134,72,1,101,3,4,2,1,5,0,160,130,1,74,48,26,6,9,42,134,72,134,247,13,1,9,3,49,13,6,11,42,134,72,134,247,13,1,9,16,1,4,48,47,6,9,42,134,72,134,247,13,1,9,4,49,34,4,32,151,201,61,68,146,194,121,175, + 104,163,91,181,115,157,179,26,219,162,16,40,222,203,8,254,199,174,146,145,241,209,116,227,48,129,250,6,11,42,134,72,134,247,13,1,9,16,2,47,49,129,234,48,129,231,48,129,228,48,129,189,4,32,206,183,107,190,95,105,3,225,127,196,129,13,59,100,216, + 52,148,128,134,221,139,53,236,207,190,161,212,151,97,44,44,248,48,129,152,48,129,128,164,126,48,124,49,11,48,9,6,3,85,4,6,19,2,85,83,49,19,48,17,6,3,85,4,8,19,10,87,97,115,104,105,110,103,116,111,110,49,16,48,14,6,3,85,4,7,19,7,82,101,100,109, + 111,110,100,49,30,48,28,6,3,85,4,10,19,21,77,105,99,114,111,115,111,102,116,32,67,111,114,112,111,114,97,116,105,111,110,49,38,48,36,6,3,85,4,3,19,29,77,105,99,114,111,115,111,102,116,32,84,105,109,101,45,83,116,97,109,112,32,80,67,65,32,50, + 48,49,48,2,19,51,0,0,1,235,224,24,108,181,182,239,56,237,0,1,0,0,1,235,48,34,4,32,99,50,207,7,160,52,223,26,165,199,43,140,131,152,3,80,142,109,149,133,27,194,4,244,248,221,140,193,186,222,175,79,48,13,6,9,42,134,72,134,247,13,1,1,11,5,0,4,130, + 2,0,1,147,32,201,2,127,98,23,169,207,23,92,32,32,203,102,44,86,147,219,251,237,185,12,55,55,142,37,249,236,40,102,230,56,42,206,158,156,235,205,189,162,29,36,84,105,4,33,28,197,222,114,232,202,0,218,60,44,106,231,52,225,137,84,106,209,221,192, + 242,113,122,45,13,238,79,193,77,55,161,17,193,2,219,94,5,255,248,208,46,179,126,28,152,121,10,1,75,104,39,120,202,43,234,226,134,226,246,227,121,158,122,165,221,132,76,187,52,105,214,190,70,112,187,213,255,85,230,106,148,37,105,134,117,164,9, + 224,247,137,230,65,2,69,72,206,148,23,207,217,8,91,126,77,119,255,104,221,138,0,135,130,220,196,236,75,201,60,245,6,15,138,82,166,90,18,21,72,69,61,142,232,225,22,160,146,138,116,140,240,89,133,144,60,235,86,26,101,254,202,116,215,53,169,187, + 165,180,30,139,23,211,119,37,77,45,21,7,41,21,68,202,176,39,189,198,174,63,164,37,199,222,190,96,162,227,2,137,112,145,13,58,122,199,31,21,212,45,251,106,254,156,186,55,127,187,7,68,160,148,171,216,251,143,0,153,165,69,16,223,21,81,211,195,214, + 226,102,124,29,255,88,178,102,160,68,0,211,61,167,2,88,100,59,210,170,168,149,61,205,16,62,1,6,247,114,194,202,132,154,19,44,120,108,249,96,201,144,88,76,228,98,102,254,66,106,58,112,32,17,211,63,111,89,163,136,5,230,38,221,177,12,22,211,70, + 207,31,84,171,137,139,83,106,161,118,63,232,176,151,33,15,64,176,128,224,231,243,76,9,140,135,140,83,27,66,101,240,205,31,178,62,4,70,130,113,123,54,237,140,161,104,91,132,177,226,133,5,222,51,53,223,200,197,206,40,246,115,17,254,152,119,167, + 22,222,182,45,33,134,154,174,111,64,201,160,117,114,72,136,114,16,20,46,240,147,134,86,165,154,248,97,159,68,122,56,148,82,72,28,238,107,226,248,81,191,167,35,91,170,206,29,252,86,98,206,145,53,46,48,13,82,227,91,248,87,7,183,57,183,222,175, + 157,85,31,13,5,19,242,5,122,153,235,103,98,124,199,63,39,155,46,68,3,99,3,41,121,86,235,187,96,128,37,208,149,9,228,85,0,0,0,0,0,0,0 + }; + #endif + + return DISTRHO_NAMESPACE::MemoryDLL (dllData, sizeof (dllData)); +} + +#endif + +#endif // CHOC_WEBVIEW_HEADER_INCLUDED diff --git a/dpf/distrho/src/DistrhoDefines.h b/dpf/distrho/src/DistrhoDefines.h index 452e802..3b1d97a 100644 --- a/dpf/distrho/src/DistrhoDefines.h +++ b/dpf/distrho/src/DistrhoDefines.h @@ -212,6 +212,8 @@ private: \ /* Useful macros */ #define ARRAY_SIZE(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0])) +#define STRINGIFY2(s) #s +#define STRINGIFY(s) STRINGIFY2(s) /* Useful typedefs */ typedef unsigned char uchar; @@ -223,5 +225,6 @@ typedef unsigned long long int ulonglong; /* Deprecated macros */ #define DISTRHO_DECLARE_NON_COPY_CLASS(ClassName) DISTRHO_DECLARE_NON_COPYABLE(ClassName) #define DISTRHO_DECLARE_NON_COPY_STRUCT(StructName) DISTRHO_DECLARE_NON_COPYABLE(StructName) +#define DISTRHO_MACRO_AS_STRING(MACRO) STRINGIFY2(MACRO) #endif // DISTRHO_DEFINES_H_INCLUDED diff --git a/dpf/distrho/src/DistrhoPlugin.cpp b/dpf/distrho/src/DistrhoPlugin.cpp index 3436d47..e2ffadb 100644 --- a/dpf/distrho/src/DistrhoPlugin.cpp +++ b/dpf/distrho/src/DistrhoPlugin.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -246,6 +246,7 @@ void Plugin::setState(const char*, const char*) {} void Plugin::bufferSizeChanged(uint32_t) {} void Plugin::sampleRateChanged(double) {} +void Plugin::ioChanged(uint16_t, uint16_t) {} // ----------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginAU.cpp b/dpf/distrho/src/DistrhoPluginAU.cpp new file mode 100644 index 0000000..3276c03 --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginAU.cpp @@ -0,0 +1,3205 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// TODO +// - g_nextBundlePath vs d_nextBundlePath cleanup +// - scale points to kAudioUnitParameterFlag_ValuesHaveStrings +// - report latency changes + +#include "DistrhoPluginInternal.hpp" +#include "../DistrhoPluginUtils.hpp" + +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT +# include "../extra/RingBuffer.hpp" +#endif + +#include +#include + +#include +#include + +#ifndef DISTRHO_PLUGIN_BRAND_ID +# error DISTRHO_PLUGIN_BRAND_ID undefined! +#endif + +#ifndef DISTRHO_PLUGIN_UNIQUE_ID +# error DISTRHO_PLUGIN_UNIQUE_ID undefined! +#endif + +START_NAMESPACE_DISTRHO + +// -------------------------------------------------------------------------------------------------------------------- + +#ifndef __MAC_12_3 +enum { + kAudioUnitProperty_MIDIOutputBufferSizeHint = 66, +}; +#endif + +// -------------------------------------------------------------------------------------------------------------------- + +static const char* AudioUnitPropertyID2Str(const AudioUnitPropertyID prop) noexcept +{ + switch (prop) + { + #define PROP(s) case s: return #s; + PROP(kAudioUnitProperty_ClassInfo) + PROP(kAudioUnitProperty_MakeConnection) + PROP(kAudioUnitProperty_SampleRate) + PROP(kAudioUnitProperty_ParameterList) + PROP(kAudioUnitProperty_ParameterInfo) + #if !TARGET_OS_IPHONE + PROP(kAudioUnitProperty_FastDispatch) + #endif + PROP(kAudioUnitProperty_CPULoad) + PROP(kAudioUnitProperty_StreamFormat) + PROP(kAudioUnitProperty_ElementCount) + PROP(kAudioUnitProperty_Latency) + PROP(kAudioUnitProperty_SupportedNumChannels) + PROP(kAudioUnitProperty_MaximumFramesPerSlice) + PROP(kAudioUnitProperty_ParameterValueStrings) + PROP(kAudioUnitProperty_AudioChannelLayout) + PROP(kAudioUnitProperty_TailTime) + PROP(kAudioUnitProperty_BypassEffect) + PROP(kAudioUnitProperty_LastRenderError) + PROP(kAudioUnitProperty_SetRenderCallback) + PROP(kAudioUnitProperty_FactoryPresets) + PROP(kAudioUnitProperty_RenderQuality) + PROP(kAudioUnitProperty_HostCallbacks) + PROP(kAudioUnitProperty_InPlaceProcessing) + PROP(kAudioUnitProperty_ElementName) + PROP(kAudioUnitProperty_SupportedChannelLayoutTags) + PROP(kAudioUnitProperty_PresentPreset) + PROP(kAudioUnitProperty_DependentParameters) + PROP(kAudioUnitProperty_InputSamplesInOutput) + PROP(kAudioUnitProperty_ShouldAllocateBuffer) + PROP(kAudioUnitProperty_FrequencyResponse) + PROP(kAudioUnitProperty_ParameterHistoryInfo) + PROP(kAudioUnitProperty_NickName) + PROP(kAudioUnitProperty_OfflineRender) + PROP(kAudioUnitProperty_ParameterIDName) + PROP(kAudioUnitProperty_ParameterStringFromValue) + PROP(kAudioUnitProperty_ParameterClumpName) + PROP(kAudioUnitProperty_ParameterValueFromString) + PROP(kAudioUnitProperty_PresentationLatency) + PROP(kAudioUnitProperty_ClassInfoFromDocument) + PROP(kAudioUnitProperty_RequestViewController) + PROP(kAudioUnitProperty_ParametersForOverview) + PROP(kAudioUnitProperty_SupportsMPE) + PROP(kAudioUnitProperty_RenderContextObserver) + PROP(kAudioUnitProperty_LastRenderSampleTime) + PROP(kAudioUnitProperty_LoadedOutOfProcess) + #if !TARGET_OS_IPHONE + PROP(kAudioUnitProperty_SetExternalBuffer) + PROP(kAudioUnitProperty_GetUIComponentList) + PROP(kAudioUnitProperty_CocoaUI) + PROP(kAudioUnitProperty_IconLocation) + PROP(kAudioUnitProperty_AUHostIdentifier) + #endif + PROP(kAudioUnitProperty_MIDIOutputCallbackInfo) + PROP(kAudioUnitProperty_MIDIOutputCallback) + PROP(kAudioUnitProperty_MIDIOutputEventListCallback) + PROP(kAudioUnitProperty_AudioUnitMIDIProtocol) + PROP(kAudioUnitProperty_HostMIDIProtocol) + PROP(kAudioUnitProperty_MIDIOutputBufferSizeHint) + PROP(kMusicDeviceProperty_DualSchedulingMode) + #undef PROP + // DPF specific properties + #define PROPX(s) (s[0] << 24) | (s[1] << 16) | (s[2] << 8) | (s[3] << 0) + #define PROP(s) case PROPX(#s): return #s; + PROP(DPFi) + PROP(DPFe) + PROP(DPFp) + PROP(DPFn) + PROP(DPFo) + PROP(DPFl) + PROP(DPFs) + PROP(DPFa) + #undef PROP + #undef PROPX + } + return "[unknown]"; +} + +static const char* AudioUnitScope2Str(const AudioUnitScope scope) noexcept +{ + switch (scope) + { + #define SCOPE(s) case s: return #s; + SCOPE(kAudioUnitScope_Global) + SCOPE(kAudioUnitScope_Input) + SCOPE(kAudioUnitScope_Output) + SCOPE(kAudioUnitScope_Group) + SCOPE(kAudioUnitScope_Part) + SCOPE(kAudioUnitScope_Note) + SCOPE(kAudioUnitScope_Layer) + SCOPE(kAudioUnitScope_LayerItem) + #undef SCOPE + } + return "[unknown]"; +} + +static const char* AudioUnitSelector2Str(const SInt16 selector) noexcept +{ + switch (selector) + { + #define SEL(s) case s: return #s; + SEL(kAudioUnitInitializeSelect) + SEL(kAudioUnitUninitializeSelect) + SEL(kAudioUnitGetPropertyInfoSelect) + SEL(kAudioUnitGetPropertySelect) + SEL(kAudioUnitSetPropertySelect) + SEL(kAudioUnitAddPropertyListenerSelect) + SEL(kAudioUnitRemovePropertyListenerSelect) + SEL(kAudioUnitRemovePropertyListenerWithUserDataSelect) + SEL(kAudioUnitAddRenderNotifySelect) + SEL(kAudioUnitRemoveRenderNotifySelect) + SEL(kAudioUnitGetParameterSelect) + SEL(kAudioUnitSetParameterSelect) + SEL(kAudioUnitScheduleParametersSelect) + SEL(kAudioUnitRenderSelect) + SEL(kAudioUnitResetSelect) + SEL(kAudioUnitComplexRenderSelect) + SEL(kAudioUnitProcessSelect) + SEL(kAudioUnitProcessMultipleSelect) + SEL(kMusicDeviceMIDIEventSelect) + SEL(kMusicDeviceSysExSelect) + SEL(kMusicDevicePrepareInstrumentSelect) + SEL(kMusicDeviceReleaseInstrumentSelect) + SEL(kMusicDeviceStartNoteSelect) + SEL(kMusicDeviceStopNoteSelect) + SEL(kMusicDeviceMIDIEventListSelect) + SEL(kAudioOutputUnitStartSelect) + SEL(kAudioOutputUnitStopSelect) + #undef SEL + } + return "[unknown]"; +} + +#if 0 +static OSStatus FastDispatchGetParameter(void*, AudioUnitParameterID, AudioUnitScope, AudioUnitElement, Float32*); +static OSStatus FastDispatchSetParameter(void*, AudioUnitParameterID, AudioUnitScope, AudioUnitElement, Float32, UInt32); +static OSStatus FastDispatchRender(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32, UInt32, AudioBufferList*); +#endif + +// -------------------------------------------------------------------------------------------------------------------- + +static constexpr const uint32_t kType = d_cconst(STRINGIFY(DISTRHO_PLUGIN_AU_TYPE)); +static constexpr const uint32_t kSubType = d_cconst(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)); +static constexpr const uint32_t kManufacturer = d_cconst(STRINGIFY(DISTRHO_PLUGIN_BRAND_ID)); + +static constexpr const uint32_t kWantedAudioFormat = kAudioFormatFlagsNativeFloatPacked + | kAudioFormatFlagIsNonInterleaved; + + +// -------------------------------------------------------------------------------------------------------------------- +// clang `std::max` is not constexpr compatible, we need to define our own + +template +static inline constexpr T d_max(const T a, const T b) { return a > b ? a : b; } + +// -------------------------------------------------------------------------------------------------------------------- + +static constexpr const AUChannelInfo kChannelInfo[] = { + { DISTRHO_PLUGIN_NUM_INPUTS, DISTRHO_PLUGIN_NUM_OUTPUTS }, + #ifdef DISTRHO_PLUGIN_EXTRA_IO + DISTRHO_PLUGIN_EXTRA_IO + #endif +}; + +#ifdef DISTRHO_PLUGIN_EXTRA_IO +#if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 +#error DISTRHO_PLUGIN_EXTRA_IO defined but no IO available +#endif + +static inline +bool isInputNumChannelsValid(const uint16_t numChannels) +{ + for (uint16_t i = 0; i < ARRAY_SIZE(kChannelInfo); ++i) + { + if (kChannelInfo[i].inChannels == numChannels) + return true; + } + return false; +} + +static inline +bool isOutputNumChannelsValid(const uint16_t numChannels) +{ + for (uint16_t i = 0; i < ARRAY_SIZE(kChannelInfo); ++i) + { + if (kChannelInfo[i].outChannels == numChannels) + return true; + } + return false; +} + +static inline +bool isNumChannelsComboValid(const uint16_t numInputs, const uint16_t numOutputs) +{ + for (uint16_t i = 0; i < ARRAY_SIZE(kChannelInfo); ++i) + { + if (kChannelInfo[i].inChannels == numInputs && kChannelInfo[i].outChannels == numOutputs) + return true; + } + return false; +} +#endif + +// -------------------------------------------------------------------------------------------------------------------- + +struct PropertyListener { + AudioUnitPropertyID prop; + AudioUnitPropertyListenerProc proc; + void* userData; +}; + +struct RenderListener { + AURenderCallback proc; + void* userData; +}; + +typedef std::vector PropertyListeners; +typedef std::vector RenderListeners; + +// -------------------------------------------------------------------------------------------------------------------- + +typedef struct { + UInt32 numPackets; + MIDIPacket packets[kMaxMidiEvents]; +} d_MIDIPacketList; + +// -------------------------------------------------------------------------------------------------------------------- + +#if ! DISTRHO_PLUGIN_WANT_MIDI_OUTPUT +static constexpr const writeMidiFunc writeMidiCallback = nullptr; +#endif +#if ! DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST +static constexpr const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr; +#endif +#if ! DISTRHO_PLUGIN_WANT_STATE +static constexpr const updateStateValueFunc updateStateValueCallback = nullptr; +#endif +#if DISTRHO_PLUGIN_WANT_TIMEPOS +static constexpr const double kDefaultTicksPerBeat = 1920.0; +#endif + +typedef std::map StringMap; + +// -------------------------------------------------------------------------------------------------------------------- + +class PluginAU +{ +public: + PluginAU(const AudioUnit component) + : fPlugin(this, writeMidiCallback, requestParameterValueChangeCallback, updateStateValueCallback), + fComponent(component), + fLastRenderError(noErr), + fPropertyListeners(), + fRenderListeners(), + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + fInputConnectionBus(0), + fInputConnectionUnit(nullptr), + fSampleRateForInput(d_nextSampleRate), + #ifdef DISTRHO_PLUGIN_EXTRA_IO + fNumInputs(DISTRHO_PLUGIN_NUM_INPUTS), + #endif + #endif + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + fSampleRateForOutput(d_nextSampleRate), + #ifdef DISTRHO_PLUGIN_EXTRA_IO + fNumOutputs(DISTRHO_PLUGIN_NUM_OUTPUTS), + #endif + #endif + #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + fAudioBufferList(nullptr), + #endif + fUsingRenderListeners(false), + fParameterCount(fPlugin.getParameterCount()), + fLastParameterValues(nullptr), + fBypassParameterIndex(UINT32_MAX) + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + , fMidiEventCount(0) + #endif + #if DISTRHO_PLUGIN_WANT_PROGRAMS + , fCurrentProgram(-1) + , fLastFactoryProgram(0) + , fProgramCount(fPlugin.getProgramCount()) + , fFactoryPresetsData(nullptr) + #endif + #if DISTRHO_PLUGIN_WANT_STATE + , fStateCount(fPlugin.getStateCount()) + #endif + { + if (fParameterCount != 0) + { + fLastParameterValues = new float[fParameterCount]; + std::memset(fLastParameterValues, 0, sizeof(float) * fParameterCount); + + for (uint32_t i=0; ipresetNumber = 0; + fFactoryPresetsData->presetName = CFSTR("Default"); + } + #endif + + fUserPresetData.presetNumber = -1; + fUserPresetData.presetName = CFSTR(""); + + #if DISTRHO_PLUGIN_WANT_STATE + for (uint32_t i=0; i(outData) = retrieveClassInfo(); + return noErr; + + case kAudioUnitProperty_SampleRate: + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (inScope == kAudioUnitScope_Input) + { + *static_cast(outData) = fSampleRateForInput; + } + else + #endif + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + if (inScope == kAudioUnitScope_Output) + { + *static_cast(outData) = fSampleRateForOutput; + } + else + #endif + { + return kAudioUnitErr_InvalidScope; + } + return noErr; + + case kAudioUnitProperty_ParameterList: + { + AudioUnitParameterID* const paramList = static_cast(outData); + + for (uint32_t i=0; i(outData); + std::memset(info, 0, sizeof(*info)); + + const ParameterRanges& ranges(fPlugin.getParameterRanges(inElement)); + + info->flags = kAudioUnitParameterFlag_IsHighResolution + | kAudioUnitParameterFlag_IsReadable + | kAudioUnitParameterFlag_HasCFNameString; + + if (fPlugin.getParameterDesignation(inElement) == kParameterDesignationBypass) + { + info->flags |= kAudioUnitParameterFlag_IsWritable; + info->unit = kAudioUnitParameterUnit_Boolean; + + d_strncpy(info->name, "Bypass", sizeof(info->name)); + info->cfNameString = CFSTR("Bypass"); + } + else + { + const uint32_t hints = fPlugin.getParameterHints(inElement); + + info->flags |= kAudioUnitParameterFlag_CFNameRelease; + + if (hints & kParameterIsOutput) + { + info->flags |= kAudioUnitParameterFlag_MeterReadOnly; + } + else + { + info->flags |= kAudioUnitParameterFlag_IsWritable; + + if ((hints & kParameterIsAutomatable) == 0x0) + info->flags |= kAudioUnitParameterFlag_NonRealTime; + } + + if (hints & kParameterIsBoolean) + info->unit = kAudioUnitParameterUnit_Boolean; + else if (hints & kParameterIsInteger) + info->unit = kAudioUnitParameterUnit_Indexed; + else + info->unit = kAudioUnitParameterUnit_Generic; + + // | kAudioUnitParameterFlag_ValuesHaveStrings; + + const String& name(fPlugin.getParameterName(inElement)); + d_strncpy(info->name, name, sizeof(info->name)); + info->cfNameString = CFStringCreateWithCString(nullptr, name, kCFStringEncodingUTF8); + } + + info->minValue = ranges.min; + info->maxValue = ranges.max; + info->defaultValue = ranges.def; + } + return noErr; + + #if 0 + case kAudioUnitProperty_FastDispatch: + switch (inElement) + { + case kAudioUnitGetParameterSelect: + *static_cast(outData) = FastDispatchGetParameter; + return noErr; + case kAudioUnitSetParameterSelect: + *static_cast(outData) = FastDispatchSetParameter; + return noErr; + case kAudioUnitRenderSelect: + *static_cast(outData) = FastDispatchRender; + return noErr; + } + d_stdout("WIP FastDispatch(%d:%x:%s)", inElement, inElement, AudioUnitPropertyID2Str(inElement)); + return kAudioUnitErr_InvalidElement; + #endif + + case kAudioUnitProperty_StreamFormat: + { + AudioStreamBasicDescription* const desc = static_cast(outData); + std::memset(desc, 0, sizeof(*desc)); + + if (inElement != 0) + return kAudioUnitErr_InvalidElement; + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (inScope == kAudioUnitScope_Input) + { + #ifdef DISTRHO_PLUGIN_EXTRA_IO + desc->mChannelsPerFrame = fNumInputs; + #else + desc->mChannelsPerFrame = DISTRHO_PLUGIN_NUM_INPUTS; + #endif + } + else + #endif + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + if (inScope == kAudioUnitScope_Output) + { + #ifdef DISTRHO_PLUGIN_EXTRA_IO + desc->mChannelsPerFrame = fNumOutputs; + #else + desc->mChannelsPerFrame = DISTRHO_PLUGIN_NUM_OUTPUTS; + #endif + } + else + #endif + { + return kAudioUnitErr_InvalidScope; + } + + desc->mFormatID = kAudioFormatLinearPCM; + desc->mFormatFlags = kWantedAudioFormat; + desc->mSampleRate = fPlugin.getSampleRate(); + desc->mBitsPerChannel = 32; + desc->mBytesPerFrame = sizeof(float); + desc->mBytesPerPacket = sizeof(float); + desc->mFramesPerPacket = 1; + } + return noErr; + + case kAudioUnitProperty_ElementCount: + switch (inScope) + { + case kAudioUnitScope_Global: + *static_cast(outData) = 1; + break; + case kAudioUnitScope_Input: + *static_cast(outData) = DISTRHO_PLUGIN_NUM_INPUTS != 0 ? 1 : 0; + break; + case kAudioUnitScope_Output: + *static_cast(outData) = DISTRHO_PLUGIN_NUM_OUTPUTS != 0 ? 1 : 0; + break; + default: + *static_cast(outData) = 0; + break; + } + return noErr; + + #if DISTRHO_PLUGIN_WANT_LATENCY + case kAudioUnitProperty_Latency: + *static_cast(outData) = static_cast(fPlugin.getLatency()) / fPlugin.getSampleRate(); + return noErr; + #endif + + case kAudioUnitProperty_SupportedNumChannels: + std::memcpy(outData, kChannelInfo, sizeof(kChannelInfo)); + return noErr; + + case kAudioUnitProperty_MaximumFramesPerSlice: + *static_cast(outData) = fPlugin.getBufferSize(); + return noErr; + + case kAudioUnitProperty_LastRenderError: + *static_cast(outData) = fLastRenderError; + fLastRenderError = noErr; + return noErr; + + case kAudioUnitProperty_BypassEffect: + *static_cast(outData) = fPlugin.getParameterValue(fBypassParameterIndex) > 0.5f ? 1 : 0; + return noErr; + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + case kAudioUnitProperty_SetRenderCallback: + std::memcpy(outData, &fInputRenderCallback, sizeof(AURenderCallbackStruct)); + return noErr; + #endif + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + case kAudioUnitProperty_FactoryPresets: + if (const CFMutableArrayRef presetsRef = CFArrayCreateMutable(nullptr, fProgramCount, nullptr)) + { + for (uint32_t i=0; i(outData) = presetsRef; + return noErr; + } + return kAudio_ParamError; + #endif + + #if DISTRHO_PLUGIN_WANT_TIMEPOS + case kAudioUnitProperty_HostCallbacks: + std::memcpy(outData, &fHostCallbackInfo, sizeof(HostCallbackInfo)); + return noErr; + #endif + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + case kAudioUnitProperty_InPlaceProcessing: + *static_cast(outData) = 1; + return noErr; + #endif + + case kAudioUnitProperty_PresentPreset: + #if DISTRHO_PLUGIN_WANT_PROGRAMS + if (fCurrentProgram >= 0) + { + std::memcpy(outData, &fFactoryPresetsData[fCurrentProgram], sizeof(AUPreset)); + } + else + #endif + { + std::memcpy(outData, &fUserPresetData, sizeof(AUPreset)); + } + return noErr; + + #if DISTRHO_PLUGIN_HAS_UI + case kAudioUnitProperty_CocoaUI: + { + AudioUnitCocoaViewInfo* const info = static_cast(outData); + std::memset(info, 0, sizeof(*info)); + + NSString* const bundlePathString = [[NSString alloc] + initWithBytes:d_nextBundlePath + length:strlen(d_nextBundlePath) + encoding:NSUTF8StringEncoding]; + + info->mCocoaAUViewBundleLocation = static_cast([[NSURL fileURLWithPath: bundlePathString] retain]); + + #define MACRO_STR3(a, b, c) a "_" b "_" c + #define MACRO_STR2(a, b, c) MACRO_STR3(#a, #b, #c) + #define MACRO_STR(a, b, c) MACRO_STR2(a, b, c) + + info->mCocoaAUViewClass[0] = CFSTR("CocoaAUView_" MACRO_STR(DISTRHO_PLUGIN_AU_TYPE, + DISTRHO_PLUGIN_UNIQUE_ID, + DISTRHO_PLUGIN_BRAND_ID)); + + #undef MACRO_STR + #undef MACRO_STR2 + #undef MACRO_STR3 + + [bundlePathString release]; + } + return noErr; + #endif + + #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + case kAudioUnitProperty_MIDIOutputCallbackInfo: + { + CFStringRef refs[1] = { CFSTR("MIDI Output") }; + *static_cast(outData) = CFArrayCreate(nullptr, + reinterpret_cast(refs), + 1, + &kCFTypeArrayCallBacks); + } + return noErr; + #endif + + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + /* FIXME implement the event list stuff + case kAudioUnitProperty_AudioUnitMIDIProtocol: + *static_cast(outData) = kMIDIProtocol_1_0; + return noErr; + */ + #endif + + case 'DPFp': + *static_cast(outData) = fPlugin.getParameterValue(inElement); + return noErr; + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + case 'DPFo': + *static_cast(outData) = fLastFactoryProgram; + return noErr; + #endif + + #if DISTRHO_PLUGIN_WANT_STATE + case 'DPFl': + if (const CFMutableArrayRef keysRef = CFArrayCreateMutable(nullptr, + fStateCount, + &kCFTypeArrayCallBacks)) + { + for (uint32_t i=0; i(outData) = keysRef; + return noErr; + } + return kAudio_ParamError; + + case 'DPFs': + { + const String& key(fPlugin.getStateKey(inElement)); + #if DISTRHO_PLUGIN_WANT_FULL_STATE + fStateMap[key] = fPlugin.getStateValue(key); + #endif + + *static_cast(outData) = CFStringCreateWithCString(nullptr, + fStateMap[key], + kCFStringEncodingUTF8); + } + return noErr; + #endif + + #if DISTRHO_PLUGIN_HAS_UI && DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + case 'DPFa': + *static_cast(outData) = fPlugin.getInstancePointer(); + return noErr; + #endif + } + + d_stdout("TODO GetProperty(%d:%x:%s, %d:%s, %d, ...)", + inProp, inProp, AudioUnitPropertyID2Str(inProp), inScope, AudioUnitScope2Str(inScope), inElement); + return kAudioUnitErr_InvalidProperty; + } + + OSStatus auSetProperty(const AudioUnitPropertyID inProp, + const AudioUnitScope inScope, + const AudioUnitElement inElement, + const void* const inData, + const UInt32 inDataSize) + { + switch (inProp) + { + case kAudioUnitProperty_ClassInfo: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(CFPropertyListRef), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + const CFPropertyListRef propList = *static_cast(inData); + DISTRHO_SAFE_ASSERT_RETURN(CFGetTypeID(propList) == CFDictionaryGetTypeID(), kAudioUnitErr_InvalidPropertyValue); + + restoreClassInfo(static_cast(propList)); + } + return noErr; + + case kAudioUnitProperty_MakeConnection: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(AudioUnitConnection), inDataSize, kAudioUnitErr_InvalidPropertyValue); + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + { + const AudioUnitConnection conn = *static_cast(inData); + + if (conn.sourceAudioUnit == nullptr) + { + fInputConnectionBus = 0; + fInputConnectionUnit = nullptr; + return noErr; + } + + AudioStreamBasicDescription desc; + std::memset(&desc, 0, sizeof(desc)); + UInt32 dataSize = sizeof(AudioStreamBasicDescription); + if (AudioUnitGetProperty(conn.sourceAudioUnit, + kAudioUnitProperty_StreamFormat, + kAudioUnitScope_Output, + conn.sourceOutputNumber, &desc, &dataSize) != noErr) + return kAudioUnitErr_InvalidPropertyValue; + + DISTRHO_SAFE_ASSERT_INT_RETURN(desc.mFormatID == kAudioFormatLinearPCM, + desc.mFormatID, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_INT_RETURN(desc.mBitsPerChannel == 32, + desc.mBitsPerChannel, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_INT_RETURN(desc.mBytesPerFrame == sizeof(float), + desc.mBytesPerFrame, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_INT_RETURN(desc.mBytesPerPacket == sizeof(float), + desc.mBytesPerPacket, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_INT_RETURN(desc.mFramesPerPacket == 1, + desc.mFramesPerPacket, kAudioUnitErr_FormatNotSupported); + DISTRHO_SAFE_ASSERT_INT_RETURN(desc.mFormatFlags == kWantedAudioFormat, + desc.mFormatFlags, kAudioUnitErr_FormatNotSupported); + #ifdef DISTRHO_PLUGIN_EXTRA_IO + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc.mChannelsPerFrame == fNumInputs, + desc.mChannelsPerFrame, kAudioUnitErr_FormatNotSupported); + #else + DISTRHO_SAFE_ASSERT_UINT_RETURN(desc.mChannelsPerFrame == DISTRHO_PLUGIN_NUM_INPUTS, + desc.mChannelsPerFrame, kAudioUnitErr_FormatNotSupported); + #endif + + fInputConnectionBus = conn.sourceOutputNumber; + fInputConnectionUnit = conn.sourceAudioUnit; + } + return noErr; + #else + return kAudioUnitErr_PropertyNotInUse; + #endif + + case kAudioUnitProperty_SampleRate: + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + #elif DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + #else + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); + #endif + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(Float64), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 || DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + const Float64 sampleRate = *static_cast(inData); + #endif + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (inScope == kAudioUnitScope_Input) + { + if (d_isNotEqual(fSampleRateForInput, sampleRate)) + { + fSampleRateForInput = sampleRate; + d_nextSampleRate = sampleRate; + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + if (d_isEqual(fSampleRateForOutput, sampleRate)) + #endif + { + fPlugin.setSampleRate(sampleRate, true); + } + + notifyPropertyListeners(inProp, inScope, inElement); + } + return noErr; + } + #endif + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + if (inScope == kAudioUnitScope_Output) + { + if (d_isNotEqual(fSampleRateForOutput, sampleRate)) + { + fSampleRateForOutput = sampleRate; + d_nextSampleRate = sampleRate; + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (d_isEqual(fSampleRateForInput, sampleRate)) + #endif + { + fPlugin.setSampleRate(sampleRate, true); + } + + notifyPropertyListeners(inProp, inScope, inElement); + } + return noErr; + } + #endif + } + return kAudioUnitErr_PropertyNotInUse; + + case kAudioUnitProperty_StreamFormat: + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input || inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + #elif DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Output, inScope, kAudioUnitErr_InvalidScope); + #else + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); + #endif + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(AudioStreamBasicDescription), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + const AudioStreamBasicDescription* const desc = static_cast(inData); + + if (desc->mFormatID != kAudioFormatLinearPCM) + return kAudioUnitErr_FormatNotSupported; + if (desc->mBitsPerChannel != 32) + return kAudioUnitErr_FormatNotSupported; + if (desc->mBytesPerFrame != sizeof(float)) + return kAudioUnitErr_FormatNotSupported; + if (desc->mBytesPerPacket != sizeof(float)) + return kAudioUnitErr_FormatNotSupported; + if (desc->mFramesPerPacket != 1) + return kAudioUnitErr_FormatNotSupported; + if (desc->mFormatFlags != kWantedAudioFormat) + return kAudioUnitErr_FormatNotSupported; + + #ifndef DISTRHO_PLUGIN_EXTRA_IO + if (desc->mChannelsPerFrame != (inScope == kAudioUnitScope_Input ? DISTRHO_PLUGIN_NUM_INPUTS + : DISTRHO_PLUGIN_NUM_OUTPUTS)) + return kAudioUnitErr_FormatNotSupported; + #endif + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (inScope == kAudioUnitScope_Input) + { + bool changed = false; + + #ifdef DISTRHO_PLUGIN_EXTRA_IO + if (! isInputNumChannelsValid(desc->mChannelsPerFrame)) + return kAudioUnitErr_FormatNotSupported; + + if (fNumInputs != desc->mChannelsPerFrame) + { + changed = true; + fNumInputs = desc->mChannelsPerFrame; + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + if (isNumChannelsComboValid(fNumInputs, fNumOutputs)) + #endif + { + fPlugin.setAudioPortIO(fNumInputs, fNumOutputs); + } + } + #endif + + if (d_isNotEqual(fSampleRateForInput, desc->mSampleRate)) + { + changed = true; + fSampleRateForInput = desc->mSampleRate; + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + if (d_isEqual(fSampleRateForOutput, desc->mSampleRate)) + #endif + { + fPlugin.setSampleRate(desc->mSampleRate, true); + } + + notifyPropertyListeners(kAudioUnitProperty_SampleRate, inScope, inElement); + } + + if (changed) + notifyPropertyListeners(inProp, inScope, inElement); + + return noErr; + } + #endif + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + if (inScope == kAudioUnitScope_Output) + { + bool changed = false; + + #ifdef DISTRHO_PLUGIN_EXTRA_IO + if (! isOutputNumChannelsValid(desc->mChannelsPerFrame)) + return kAudioUnitErr_FormatNotSupported; + + if (fNumOutputs != desc->mChannelsPerFrame) + { + changed = true; + fNumOutputs = desc->mChannelsPerFrame; + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (isNumChannelsComboValid(fNumInputs, fNumOutputs)) + #endif + { + fPlugin.setAudioPortIO(fNumInputs, fNumOutputs); + } + } + #endif + + if (d_isNotEqual(fSampleRateForOutput, desc->mSampleRate)) + { + changed = true; + fSampleRateForOutput = desc->mSampleRate; + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (d_isEqual(fSampleRateForInput, desc->mSampleRate)) + #endif + { + fPlugin.setSampleRate(desc->mSampleRate, true); + } + + notifyPropertyListeners(kAudioUnitProperty_SampleRate, inScope, inElement); + } + + if (changed) + notifyPropertyListeners(inProp, inScope, inElement); + + return noErr; + } + #endif + } + return kAudioUnitErr_PropertyNotInUse; + + case kAudioUnitProperty_MaximumFramesPerSlice: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(UInt32), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + const UInt32 bufferSize = *static_cast(inData); + + if (fPlugin.setBufferSize(bufferSize, true)) + notifyPropertyListeners(inProp, inScope, inElement); + } + return noErr; + + case kAudioUnitProperty_BypassEffect: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(UInt32), inDataSize, kAudioUnitErr_InvalidPropertyValue); + DISTRHO_SAFE_ASSERT_RETURN(fBypassParameterIndex != UINT32_MAX, kAudioUnitErr_PropertyNotInUse); + { + const bool bypass = *static_cast(inData) != 0; + + if ((fLastParameterValues[fBypassParameterIndex] > 0.5f) != bypass) + { + const float value = bypass ? 1.f : 0.f; + fLastParameterValues[fBypassParameterIndex] = value; + fPlugin.setParameterValue(fBypassParameterIndex, value); + notifyPropertyListeners(inProp, inScope, inElement); + } + } + return noErr; + + case kAudioUnitProperty_SetRenderCallback: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Input, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(AURenderCallbackStruct), inDataSize, kAudioUnitErr_InvalidPropertyValue); + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + std::memcpy(&fInputRenderCallback, inData, sizeof(AURenderCallbackStruct)); + return noErr; + #else + return kAudioUnitErr_PropertyNotInUse; + #endif + + case kAudioUnitProperty_HostCallbacks: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + #if DISTRHO_PLUGIN_WANT_TIMEPOS + { + const UInt32 usableDataSize = std::min(inDataSize, static_cast(sizeof(HostCallbackInfo))); + const bool changed = std::memcmp(&fHostCallbackInfo, inData, usableDataSize) != 0; + + std::memcpy(&fHostCallbackInfo, inData, usableDataSize); + + if (sizeof(HostCallbackInfo) > usableDataSize) + std::memset(&fHostCallbackInfo + usableDataSize, 0, sizeof(HostCallbackInfo) - usableDataSize); + + if (changed) + notifyPropertyListeners(inProp, inScope, inElement); + } + return noErr; + #else + return kAudioUnitErr_PropertyNotInUse; + #endif + + case kAudioUnitProperty_InPlaceProcessing: + // nothing to do + return noErr; + + case kAudioUnitProperty_PresentPreset: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(AUPreset), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + const int32_t presetNumber = static_cast(inData)->presetNumber; + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + if (presetNumber >= 0) + { + if (fCurrentProgram != presetNumber) + { + fCurrentProgram = presetNumber; + fLastFactoryProgram = presetNumber; + fPlugin.loadProgram(fLastFactoryProgram); + notifyPropertyListeners('DPFo', kAudioUnitScope_Global, 0); + } + } + else + { + fCurrentProgram = presetNumber; + CFRelease(fUserPresetData.presetName); + std::memcpy(&fUserPresetData, inData, sizeof(AUPreset)); + } + #else + DISTRHO_SAFE_ASSERT_INT_RETURN(presetNumber < 0, presetNumber, kAudioUnitErr_InvalidPropertyValue); + CFRelease(fUserPresetData.presetName); + std::memcpy(&fUserPresetData, inData, sizeof(AUPreset)); + #endif + } + return noErr; + + case kAudioUnitProperty_MIDIOutputCallback: + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(AUMIDIOutputCallbackStruct), inDataSize, kAudioUnitErr_InvalidPropertyValue); + #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + std::memcpy(&fMidiOutput, inData, sizeof(AUMIDIOutputCallbackStruct)); + return noErr; + #else + return kAudioUnitErr_PropertyNotInUse; + #endif + + case 'DPFi': + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(uint16_t), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + const uint16_t magic = *static_cast(inData); + + if (magic != 1337) + return noErr; + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + notifyPropertyListeners('DPFo', kAudioUnitScope_Global, 0); + #endif + + #if DISTRHO_PLUGIN_WANT_STATE + for (uint32_t i=0; i(inData); + + if (flag != 1 && flag != 2) + return noErr; + + AudioUnitEvent event; + std::memset(&event, 0, sizeof(event)); + + event.mEventType = flag == 1 ? kAudioUnitEvent_BeginParameterChangeGesture + : kAudioUnitEvent_EndParameterChangeGesture; + event.mArgument.mParameter.mAudioUnit = fComponent; + event.mArgument.mParameter.mParameterID = inElement; + event.mArgument.mParameter.mScope = kAudioUnitScope_Global; + AUEventListenerNotify(NULL, NULL, &event); + } + return noErr; + + case 'DPFp': + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fParameterCount, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(float), inDataSize, kAudioUnitErr_InvalidPropertyValue); + { + const float value = *static_cast(inData); + DISTRHO_SAFE_ASSERT_RETURN(std::isfinite(value), kAudioUnitErr_InvalidParameterValue); + + if (d_isEqual(fLastParameterValues[inElement], value)) + return noErr; + + fLastParameterValues[inElement] = value; + fPlugin.setParameterValue(inElement, value); + + AudioUnitEvent event; + std::memset(&event, 0, sizeof(event)); + + event.mEventType = kAudioUnitEvent_ParameterValueChange; + event.mArgument.mParameter.mAudioUnit = fComponent; + event.mArgument.mParameter.mParameterID = inElement; + event.mArgument.mParameter.mScope = kAudioUnitScope_Global; + AUEventListenerNotify(NULL, NULL, &event); + + if (fBypassParameterIndex == inElement) + notifyPropertyListeners(kAudioUnitProperty_BypassEffect, kAudioUnitScope_Global, 0); + } + return noErr; + + case 'DPFn': + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement == 0, inElement, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(uint8_t) * 3, inDataSize, kAudioUnitErr_InvalidPropertyValue); + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + { + const uint8_t* const midiData = static_cast(inData); + + if (midiData[0] == 0) + return noErr; + + fNotesRingBuffer.writeCustomData(midiData, 3); + fNotesRingBuffer.commitWrite(); + } + return noErr; + #else + return kAudioUnitErr_PropertyNotInUse; + #endif + + case 'DPFs': + DISTRHO_SAFE_ASSERT_UINT_RETURN(inScope == kAudioUnitScope_Global, inScope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(inDataSize == sizeof(CFStringRef), inDataSize, kAudioUnitErr_InvalidPropertyValue); + #if DISTRHO_PLUGIN_WANT_STATE + DISTRHO_SAFE_ASSERT_UINT_RETURN(inElement < fStateCount, inElement, kAudioUnitErr_InvalidElement); + { + const CFStringRef valueRef = *static_cast(inData); + DISTRHO_SAFE_ASSERT_RETURN(valueRef != nullptr && CFGetTypeID(valueRef) == CFStringGetTypeID(), + kAudioUnitErr_InvalidPropertyValue); + + const CFIndex valueLen = CFStringGetLength(valueRef); + char* const value = static_cast(std::malloc(valueLen + 1)); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr, kAudio_ParamError); + DISTRHO_SAFE_ASSERT_RETURN(CFStringGetCString(valueRef, value, valueLen + 1, kCFStringEncodingUTF8), + kAudioUnitErr_InvalidPropertyValue); + + const String& key(fPlugin.getStateKey(inElement)); + + // save this key as needed + if (fPlugin.wantStateKey(key)) + fStateMap[key] = value; + + fPlugin.setState(key, value); + + std::free(value); + } + return noErr; + #else + return kAudioUnitErr_PropertyNotInUse; + #endif + + // unwanted properties + case kMusicDeviceProperty_DualSchedulingMode: + return kAudioUnitErr_PropertyNotInUse; + } + + d_stdout("TODO SetProperty(%d:%x:%s, %d:%s, %d, %p, %u)", + inProp, inProp, AudioUnitPropertyID2Str(inProp), inScope, AudioUnitScope2Str(inScope), inElement, inData, inDataSize); + return kAudioUnitErr_InvalidProperty; + } + + OSStatus auAddPropertyListener(const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + const PropertyListener pl = { + prop, proc, userData + }; + + fPropertyListeners.push_back(pl); + return noErr; + } + + OSStatus auRemovePropertyListener(const AudioUnitPropertyID prop, const AudioUnitPropertyListenerProc proc) + { + for (PropertyListeners::iterator it = fPropertyListeners.begin(); it != fPropertyListeners.end(); ++it) + { + const PropertyListener& pl(*it); + + if (pl.prop == prop && pl.proc == proc) + { + fPropertyListeners.erase(it); + return auRemovePropertyListener(prop, proc); + } + } + + return noErr; + } + + OSStatus auRemovePropertyListenerWithUserData(const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + for (PropertyListeners::iterator it = fPropertyListeners.begin(); it != fPropertyListeners.end(); ++it) + { + const PropertyListener& pl(*it); + + if (pl.prop == prop && pl.proc == proc && pl.userData == userData) + { + fPropertyListeners.erase(it); + return auRemovePropertyListenerWithUserData(prop, proc, userData); + } + } + + return noErr; + } + + OSStatus auAddRenderNotify(const AURenderCallback proc, void* const userData) + { + fUsingRenderListeners = true; + + const RenderListener rl = { + proc, userData + }; + + fRenderListeners.push_back(rl); + return noErr; + } + + OSStatus auRemoveRenderNotify(const AURenderCallback proc, void* const userData) + { + for (RenderListeners::iterator it = fRenderListeners.begin(); it != fRenderListeners.end(); ++it) + { + const RenderListener& rl(*it); + + if (rl.proc == proc && rl.userData == userData) + { + fRenderListeners.erase(it); + return auRemoveRenderNotify(proc, userData); + } + } + + if (fRenderListeners.empty()) + fUsingRenderListeners = false; + + return noErr; + } + + OSStatus auGetParameter(const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + AudioUnitParameterValue* const value) + { + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Global, scope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(param < fParameterCount, param, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(elem == 0, elem, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr, kAudio_ParamError); + + *value = fPlugin.getParameterValue(param); + return noErr; + } + + OSStatus auSetParameter(const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + const AudioUnitParameterValue value, + UInt32 /* bufferOffset */) + { + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Global, scope, kAudioUnitErr_InvalidScope); + DISTRHO_SAFE_ASSERT_UINT_RETURN(param < fParameterCount, param, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_UINT_RETURN(elem == 0, elem, kAudioUnitErr_InvalidElement); + DISTRHO_SAFE_ASSERT_RETURN(std::isfinite(value), kAudioUnitErr_InvalidParameterValue); + + if (d_isNotEqual(fLastParameterValues[param], value)) + { + fLastParameterValues[param] = value; + fPlugin.setParameterValue(param, value); + + // TODO flag param only, notify listeners later on bg thread (sem_post etc) + notifyPropertyListeners('DPFp', kAudioUnitScope_Global, param); + + if (fBypassParameterIndex == elem) + notifyPropertyListeners(kAudioUnitProperty_BypassEffect, kAudioUnitScope_Global, 0); + } + + return noErr; + } + + OSStatus auScheduleParameters(const AudioUnitParameterEvent* const events, const UInt32 numEvents) + { + for (UInt32 i=0; imNumberBuffers == fAudioBufferList->mNumberBuffers, + ioData->mNumberBuffers, kAudio_ParamError); + #else + DISTRHO_SAFE_ASSERT_UINT_RETURN(ioData->mNumberBuffers == 0, ioData->mNumberBuffers, kAudio_ParamError); + #endif + + if (inFramesToProcess > fPlugin.getBufferSize()) + { + setLastRenderError(kAudioUnitErr_TooManyFramesToProcess); + return kAudioUnitErr_TooManyFramesToProcess; + } + + #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + for (uint16_t i = 0; i < ioData->mNumberBuffers; ++i) + { + if (ioData->mBuffers[i].mDataByteSize != sizeof(float) * inFramesToProcess) + { + setLastRenderError(kAudio_ParamError); + return kAudio_ParamError; + } + } + #endif + } + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + #ifdef DISTRHO_PLUGIN_EXTRA_IO + const uint32_t numInputs = fNumInputs; + #else + constexpr const uint32_t numInputs = DISTRHO_PLUGIN_NUM_INPUTS; + #endif + const float* inputs[numInputs]; + #else + constexpr const float** inputs = nullptr; + #endif + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + #ifdef DISTRHO_PLUGIN_EXTRA_IO + const uint32_t numOutputs = fNumOutputs; + #else + constexpr const uint32_t numOutputs = DISTRHO_PLUGIN_NUM_OUTPUTS; + #endif + float* outputs[numOutputs]; + #else + constexpr float** outputs = nullptr; + #endif + + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + if (fInputConnectionUnit != nullptr) + { + AudioUnitRenderActionFlags ioActionFlags = 0; + const OSStatus err = AudioUnitRender(fInputConnectionUnit, + &ioActionFlags, + inTimeStamp, + fInputConnectionBus, + inFramesToProcess, + fAudioBufferList); + + if (err != noErr) + { + setLastRenderError(err); + return err; + } + + for (uint16_t i = 0; i < numInputs; ++i) + inputs[i] = static_cast(fAudioBufferList->mBuffers[i].mData); + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + for (uint16_t i = 0; i < numOutputs; ++i) + { + if (ioData->mBuffers[i].mData == nullptr) + ioData->mBuffers[i].mData = fAudioBufferList->mBuffers[i].mData; + + outputs[i] = static_cast(ioData->mBuffers[i].mData); + } + #endif + } + else if (fInputRenderCallback.inputProc != nullptr) + { + bool adjustDataByteSize, usingHostBuffer = true; + UInt32 prevDataByteSize; + + for (uint16_t i = 0; i < ioData->mNumberBuffers; ++i) + { + if (ioData->mBuffers[i].mData == nullptr) + { + usingHostBuffer = false; + ioData->mBuffers[i].mData = fAudioBufferList->mBuffers[i].mData; + } + } + + if (! usingHostBuffer) + { + prevDataByteSize = fAudioBufferList->mBuffers[0].mDataByteSize; + adjustDataByteSize = prevDataByteSize != sizeof(float) * inFramesToProcess; + + if (adjustDataByteSize) + { + for (uint16_t i = 0; i < ioData->mNumberBuffers; ++i) + fAudioBufferList->mBuffers[i].mDataByteSize = sizeof(float) * inFramesToProcess; + } + } + else + { + adjustDataByteSize = false; + } + + AudioUnitRenderActionFlags rActionFlags = 0; + AudioBufferList* const rData = usingHostBuffer ? ioData : fAudioBufferList; + const OSStatus err = fInputRenderCallback.inputProc(fInputRenderCallback.inputProcRefCon, + &rActionFlags, + inTimeStamp, + inBusNumber, + inFramesToProcess, + rData); + + if (err != noErr) + { + if (adjustDataByteSize) + { + for (uint16_t i = 0; i < ioData->mNumberBuffers; ++i) + fAudioBufferList->mBuffers[i].mDataByteSize = prevDataByteSize; + } + + setLastRenderError(err); + return err; + } + + if (usingHostBuffer) + { + for (uint16_t i = 0; i < numInputs; ++i) + inputs[i] = static_cast(ioData->mBuffers[i].mData); + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + for (uint16_t i = 0; i < numOutputs; ++i) + outputs[i] = static_cast(ioData->mBuffers[i].mData); + #endif + + } + else + { + for (uint16_t i = 0; i < numInputs; ++i) + inputs[i] = static_cast(fAudioBufferList->mBuffers[i].mData); + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + for (uint16_t i = 0; i < numOutputs; ++i) + outputs[i] = static_cast(ioData->mBuffers[i].mData); + #endif + } + } + else + #endif // DISTRHO_PLUGIN_NUM_INPUTS != 0 + { + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + for (uint16_t i = 0; i < numInputs; ++i) + { + if (ioData->mBuffers[i].mData == nullptr) + { + ioData->mBuffers[i].mData = fAudioBufferList->mBuffers[i].mData; + std::memset(ioData->mBuffers[i].mData, 0, sizeof(float) * inFramesToProcess); + } + + inputs[i] = static_cast(ioData->mBuffers[i].mData); + } + #endif + + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + for (uint16_t i = 0; i < numOutputs; ++i) + { + if (ioData->mBuffers[i].mData == nullptr) + ioData->mBuffers[i].mData = fAudioBufferList->mBuffers[i].mData; + + outputs[i] = static_cast(ioData->mBuffers[i].mData); + } + #endif + } + + if (fUsingRenderListeners) + { + AudioUnitRenderActionFlags ioActionFlags = actionFlags | kAudioUnitRenderAction_PreRender; + notifyRenderListeners(&ioActionFlags, inTimeStamp, inBusNumber, inFramesToProcess, ioData); + } + + run(inputs, outputs, inFramesToProcess, inTimeStamp); + + if (fUsingRenderListeners) + { + AudioUnitRenderActionFlags ioActionFlags = actionFlags | kAudioUnitRenderAction_PostRender; + notifyRenderListeners(&ioActionFlags, inTimeStamp, inBusNumber, inFramesToProcess, ioData); + } + + return noErr; + } + + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + OSStatus auMIDIEvent(const UInt32 inStatus, + const UInt32 inData1, + const UInt32 inData2, + const UInt32 inOffsetSampleFrame) + { + if (fMidiEventCount >= kMaxMidiEvents) + return noErr; + + MidiEvent& midiEvent(fMidiEvents[fMidiEventCount++]); + midiEvent.frame = inOffsetSampleFrame; + midiEvent.data[0] = inStatus; + midiEvent.data[1] = inData1; + midiEvent.data[2] = inData2; + + switch (inStatus) + { + case 0x80: + case 0x90: + case 0xA0: + case 0xB0: + case 0xE0: + midiEvent.size = 3; + break; + case 0xC0: + case 0xD0: + midiEvent.size = 2; + break; + case 0xF0: + switch (inStatus & 0x0F) + { + case 0x0: + case 0x4: + case 0x5: + case 0x7: + case 0x9: + case 0xD: + // unsupported + kAudioUnitErr_InvalidPropertyValue; + case 0x1: + case 0x2: + case 0x3: + case 0xE: + midiEvent.size = 3; + break; + case 0x6: + case 0x8: + case 0xA: + case 0xB: + case 0xC: + case 0xF: + midiEvent.size = 1; + break; + } + break; + default: + // invalid + return kAudioUnitErr_InvalidPropertyValue; + } + + #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 + // handle case of plugin having no working audio, simulate audio-side processing + run(nullptr, nullptr, std::max(1u, inOffsetSampleFrame), nullptr); + #endif + + return noErr; + } + + OSStatus auSysEx(const UInt8* const inData, const UInt32 inLength) + { + if (fMidiEventCount >= kMaxMidiEvents) + return noErr; + + MidiEvent& midiEvent(fMidiEvents[fMidiEventCount++]); + midiEvent.frame = fMidiEventCount != 1 ? fMidiEvents[fMidiEventCount - 1].frame : 0; + midiEvent.size = inLength; + + // FIXME who owns inData ?? + if (inLength > MidiEvent::kDataSize) + { + std::memset(midiEvent.data, 0, MidiEvent::kDataSize); + midiEvent.dataExt = inData; + } + else + { + std::memcpy(midiEvent.data, inData, inLength); + } + + #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS == 0 + // handle case of plugin having no working audio, simulate audio-side processing + run(nullptr, nullptr, 1, nullptr); + #endif + + return noErr; + } + #endif + + // ---------------------------------------------------------------------------------------------------------------- + +private: + PluginExporter fPlugin; + + // AU component + const AudioUnit fComponent; + + // AUv2 related fields + OSStatus fLastRenderError; + PropertyListeners fPropertyListeners; + RenderListeners fRenderListeners; + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + UInt32 fInputConnectionBus; + AudioUnit fInputConnectionUnit; + AURenderCallbackStruct fInputRenderCallback; + Float64 fSampleRateForInput; + #ifdef DISTRHO_PLUGIN_EXTRA_IO + uint32_t fNumInputs; + #endif + #endif + #if DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + Float64 fSampleRateForOutput; + #ifdef DISTRHO_PLUGIN_EXTRA_IO + uint32_t fNumOutputs; + #endif + #endif + #if DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + AudioBufferList* fAudioBufferList; + #endif + bool fUsingRenderListeners; + + // Caching + const uint32_t fParameterCount; + float* fLastParameterValues; + uint32_t fBypassParameterIndex; + + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + uint32_t fMidiEventCount; + MidiEvent fMidiEvents[kMaxMidiEvents]; + SmallStackRingBuffer fNotesRingBuffer; + #endif + + #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + AUMIDIOutputCallbackStruct fMidiOutput; + d_MIDIPacketList fMidiOutputPackets; + #endif + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + int32_t fCurrentProgram; + uint32_t fLastFactoryProgram; + uint32_t fProgramCount; + AUPreset* fFactoryPresetsData; + #endif + AUPreset fUserPresetData; + + #if DISTRHO_PLUGIN_WANT_STATE + const uint32_t fStateCount; + StringMap fStateMap; + #endif + + #if DISTRHO_PLUGIN_WANT_TIMEPOS + HostCallbackInfo fHostCallbackInfo; + TimePosition fTimePosition; + #endif + + // ---------------------------------------------------------------------------------------------------------------- + + void notifyPropertyListeners(const AudioUnitPropertyID prop, const AudioUnitScope scope, const AudioUnitElement elem) + { + for (PropertyListeners::iterator it = fPropertyListeners.begin(); it != fPropertyListeners.end(); ++it) + { + const PropertyListener& pl(*it); + + if (pl.prop == prop) + pl.proc(pl.userData, fComponent, prop, scope, elem); + } + } + + void notifyRenderListeners(AudioUnitRenderActionFlags* const ioActionFlags, + const AudioTimeStamp* const inTimeStamp, + const UInt32 inBusNumber, + const UInt32 inNumberFrames, + AudioBufferList* const ioData) + { + for (RenderListeners::iterator it = fRenderListeners.begin(); it != fRenderListeners.end(); ++it) + { + const RenderListener& rl(*it); + + rl.proc(rl.userData, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData); + } + } + + // ---------------------------------------------------------------------------------------------------------------- + + void run(const float** inputs, float** outputs, const uint32_t frames, const AudioTimeStamp* const inTimeStamp) + { + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + if (fMidiEventCount != kMaxMidiEvents && fNotesRingBuffer.isDataAvailableForReading()) + { + uint8_t midiData[3]; + const uint32_t frame = fMidiEventCount != 0 ? fMidiEvents[fMidiEventCount - 1].frame : 0; + + while (fNotesRingBuffer.isDataAvailableForReading()) + { + if (! fNotesRingBuffer.readCustomData(midiData, 3)) + break; + + MidiEvent& midiEvent(fMidiEvents[fMidiEventCount++]); + midiEvent.frame = frame; + midiEvent.size = 3; + std::memcpy(midiEvent.data, midiData, 3); + + if (fMidiEventCount == kMaxMidiEvents) + break; + } + } + #endif + + #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + fMidiOutputPackets.numPackets = 0; + #endif + + #if DISTRHO_PLUGIN_WANT_TIMEPOS + if (fHostCallbackInfo.beatAndTempoProc != nullptr || + fHostCallbackInfo.musicalTimeLocationProc != nullptr || + fHostCallbackInfo.transportStateProc != nullptr) + { + // reused values so we can check null and return value together + Boolean b1 = false; + Float32 f1 = 4.f; // initial value for beats per bar + Float64 g1 = 0.0; + Float64 g2 = 0.0; + UInt32 u1 = 0; + + if (fHostCallbackInfo.musicalTimeLocationProc != nullptr + && fHostCallbackInfo.musicalTimeLocationProc(fHostCallbackInfo.hostUserData, + nullptr, &f1, &u1, nullptr) == noErr) + { + fTimePosition.bbt.beatsPerBar = f1; + fTimePosition.bbt.beatType = u1; + } + else + { + fTimePosition.bbt.beatsPerBar = 4.f; + fTimePosition.bbt.beatType = 4.f; + } + + if (fHostCallbackInfo.beatAndTempoProc != nullptr + && fHostCallbackInfo.beatAndTempoProc(fHostCallbackInfo.hostUserData, &g1, &g2) == noErr) + { + const double beat = static_cast(g1); + + fTimePosition.bbt.valid = true; + fTimePosition.bbt.bar = static_cast(beat / f1) + 1; + fTimePosition.bbt.beat = static_cast(std::fmod(beat, f1)) + 1; + fTimePosition.bbt.tick = std::fmod(g1, 1.0) * 1920.0; + fTimePosition.bbt.beatsPerMinute = g2; + } + else + { + fTimePosition.bbt.valid = false; + fTimePosition.bbt.bar = 1; + fTimePosition.bbt.beat = 1; + fTimePosition.bbt.tick = 0.0; + fTimePosition.bbt.beatsPerMinute = 120.0; + } + + if (fHostCallbackInfo.transportStateProc != nullptr + && fHostCallbackInfo.transportStateProc(fHostCallbackInfo.hostUserData, + &b1, nullptr, &g1, nullptr, nullptr, nullptr) == noErr) + { + fTimePosition.playing = b1; + fTimePosition.frame = static_cast(g1); + } + else + { + fTimePosition.playing = false; + fTimePosition.frame = 0; + } + + fTimePosition.bbt.barStartTick = kDefaultTicksPerBeat * + fTimePosition.bbt.beatsPerBar * + (fTimePosition.bbt.bar - 1); + + fPlugin.setTimePosition(fTimePosition); + } + #endif + + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + fPlugin.run(inputs, outputs, frames, fMidiEvents, fMidiEventCount); + fMidiEventCount = 0; + #else + fPlugin.run(inputs, outputs, frames); + #endif + + #if DISTRHO_PLUGIN_WANT_MIDI_OUTPUT + if (fMidiOutputPackets.numPackets != 0 && fMidiOutput.midiOutputCallback != nullptr) + { + fMidiOutput.midiOutputCallback(fMidiOutput.userData, + inTimeStamp, + 0, + reinterpret_cast(&fMidiOutputPackets)); + } + #else + // unused + (void)inTimeStamp; + #endif + + float value; + AudioUnitEvent event; + std::memset(&event, 0, sizeof(event)); + event.mEventType = kAudioUnitEvent_ParameterValueChange; + event.mArgument.mParameter.mAudioUnit = fComponent; + event.mArgument.mParameter.mScope = kAudioUnitScope_Global; + + for (uint32_t i=0; imNumberBuffers; ++i) + delete[] static_cast(fAudioBufferList->mBuffers[i].mData); + } + + #ifdef DISTRHO_PLUGIN_EXTRA_IO + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + const uint16_t numBuffers = std::max(fNumInputs, fNumOutputs); + #elif DISTRHO_PLUGIN_NUM_INPUTS != 0 + const uint16_t numBuffers = fNumInputs; + #else + const uint16_t numBuffers = fNumOutputs; + #endif + #else + constexpr const uint16_t numBuffers = d_max(DISTRHO_PLUGIN_NUM_INPUTS, DISTRHO_PLUGIN_NUM_OUTPUTS); + #endif + const uint32_t bufferSize = fPlugin.getBufferSize(); + + if (! alloc) + { + std::free(fAudioBufferList); + fAudioBufferList = nullptr; + return true; + } + + if (AudioBufferList* const abl = static_cast( + std::realloc(fAudioBufferList, sizeof(uint32_t) + sizeof(AudioBuffer) * numBuffers))) + { + abl->mNumberBuffers = numBuffers; + + for (uint16_t i = 0; i < numBuffers; ++i) + { + abl->mBuffers[i].mNumberChannels = 1; + abl->mBuffers[i].mData = new float[bufferSize]; + abl->mBuffers[i].mDataByteSize = sizeof(float) * bufferSize; + } + + fAudioBufferList = abl; + return true; + } + + std::free(fAudioBufferList); + fAudioBufferList = nullptr; + return false; + } + #endif + + // ---------------------------------------------------------------------------------------------------------------- + + CFMutableDictionaryRef retrieveClassInfo() + { + CFMutableDictionaryRef clsInfo = CFDictionaryCreateMutable(nullptr, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + SInt32 value; + + value = 0; + if (const CFNumberRef num = CFNumberCreate(nullptr, kCFNumberSInt32Type, &value)) + { + CFDictionarySetValue(clsInfo, CFSTR(kAUPresetVersionKey), num); + CFRelease(num); + } + + value = kType; + if (const CFNumberRef num = CFNumberCreate(nullptr, kCFNumberSInt32Type, &value)) + { + CFDictionarySetValue(clsInfo, CFSTR(kAUPresetTypeKey), num); + CFRelease(num); + } + + value = kSubType; + if (const CFNumberRef num = CFNumberCreate(nullptr, kCFNumberSInt32Type, &value)) + { + CFDictionarySetValue(clsInfo, CFSTR(kAUPresetSubtypeKey), num); + CFRelease(num); + } + + value = kManufacturer; + if (const CFNumberRef num = CFNumberCreate(nullptr, kCFNumberSInt32Type, &value)) + { + CFDictionarySetValue(clsInfo, CFSTR(kAUPresetManufacturerKey), num); + CFRelease(num); + } + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + if (fCurrentProgram >= 0) + { + CFDictionarySetValue(clsInfo, CFSTR(kAUPresetNameKey), fFactoryPresetsData[fCurrentProgram].presetName); + } + else + #endif + { + CFDictionarySetValue(clsInfo, CFSTR(kAUPresetNameKey), fUserPresetData.presetName); + } + + if (const CFMutableDictionaryRef data = CFDictionaryCreateMutable(nullptr, + 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)) + { + #if DISTRHO_PLUGIN_WANT_PROGRAMS + const SInt32 program = fCurrentProgram; + if (const CFNumberRef programRef = CFNumberCreate(nullptr, kCFNumberSInt32Type, &program)) + { + CFDictionarySetValue(data, CFSTR("program"), programRef); + CFRelease(programRef); + } + #endif + + #if DISTRHO_PLUGIN_WANT_FULL_STATE + // Update current state + for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) + { + const String& key(cit->first); + fStateMap[key] = fPlugin.getStateValue(key); + } + #endif + + #if DISTRHO_PLUGIN_WANT_STATE + if (const CFMutableArrayRef statesRef = CFArrayCreateMutable(nullptr, + fStateCount, + &kCFTypeArrayCallBacks)) + { + for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) + { + const String& key(cit->first); + const String& value(cit->second); + + #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS && ! DISTRHO_PLUGIN_HAS_UI + bool wantStateKey = true; + + for (uint32_t i=0; i(&keyRef), + reinterpret_cast(&valueRef), + 1, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)) + { + CFArrayAppendValue(statesRef, dictRef); + CFRelease(dictRef); + } + + CFRelease(keyRef); + CFRelease(valueRef); + } + + CFDictionarySetValue(data, CFSTR("states"), statesRef); + CFRelease(statesRef); + } + #endif + + if (const CFMutableArrayRef paramsRef = CFArrayCreateMutable(nullptr, + fParameterCount, + &kCFTypeArrayCallBacks)) + { + for (uint32_t i=0; i(&keyRef), + reinterpret_cast(&valueRef), + 1, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)) + { + CFArrayAppendValue(paramsRef, dictRef); + CFRelease(dictRef); + } + + CFRelease(keyRef); + CFRelease(valueRef); + } + + CFDictionarySetValue(data, CFSTR("params"), paramsRef); + CFRelease(paramsRef); + } + + CFDictionarySetValue(clsInfo, CFSTR(kAUPresetDataKey), data); + CFRelease(data); + } + + return clsInfo; + } + + void restoreClassInfo(const CFDictionaryRef clsInfo) + { + CFDictionaryRef data = nullptr; + DISTRHO_SAFE_ASSERT_RETURN(CFDictionaryGetValueIfPresent(clsInfo, + CFSTR(kAUPresetDataKey), + reinterpret_cast(&data)),); + DISTRHO_SAFE_ASSERT_RETURN(CFGetTypeID(data) == CFDictionaryGetTypeID(),); + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + CFNumberRef programRef = nullptr; + if (CFDictionaryGetValueIfPresent(data, CFSTR("program"), reinterpret_cast(&programRef)) + && CFGetTypeID(programRef) == CFNumberGetTypeID()) + { + SInt32 program = -1; + if (CFNumberGetValue(programRef, kCFNumberSInt32Type, &program)) + { + fCurrentProgram = program; + + if (program >= 0) + { + fLastFactoryProgram = program; + fPlugin.loadProgram(fLastFactoryProgram); + notifyPropertyListeners('DPFo', kAudioUnitScope_Global, 0); + } + + notifyPropertyListeners(kAudioUnitProperty_PresentPreset, kAudioUnitScope_Global, 0); + } + } + #endif + + #if DISTRHO_PLUGIN_WANT_STATE + CFArrayRef statesRef = nullptr; + if (CFDictionaryGetValueIfPresent(data, CFSTR("states"), reinterpret_cast(&statesRef)) + && CFGetTypeID(statesRef) == CFArrayGetTypeID()) + { + const CFIndex numStates = CFArrayGetCount(statesRef); + char* key = nullptr; + char* value = nullptr; + CFIndex keyLen = -1; + CFIndex valueLen = -1; + + for (CFIndex i=0; i(CFArrayGetValueAtIndex(statesRef, i)); + DISTRHO_SAFE_ASSERT_BREAK(CFGetTypeID(state) == CFDictionaryGetTypeID()); + DISTRHO_SAFE_ASSERT_BREAK(CFDictionaryGetCount(state) == 1); + + CFStringRef keyRef = nullptr; + CFStringRef valueRef = nullptr; + CFDictionaryGetKeysAndValues(state, + reinterpret_cast(&keyRef), + reinterpret_cast(&valueRef)); + DISTRHO_SAFE_ASSERT_BREAK(keyRef != nullptr && CFGetTypeID(keyRef) == CFStringGetTypeID()); + DISTRHO_SAFE_ASSERT_BREAK(valueRef != nullptr && CFGetTypeID(valueRef) == CFStringGetTypeID()); + + const CFIndex keyRefLen = CFStringGetLength(keyRef); + if (keyLen < keyRefLen) + { + keyLen = keyRefLen; + key = static_cast(std::realloc(key, keyLen + 1)); + } + DISTRHO_SAFE_ASSERT_BREAK(CFStringGetCString(keyRef, key, keyLen + 1, kCFStringEncodingASCII)); + + if (! fPlugin.wantStateKey(key)) + continue; + + const CFIndex valueRefLen = CFStringGetLength(valueRef); + if (valueLen < valueRefLen) + { + valueLen = valueRefLen; + value = static_cast(std::realloc(value, valueLen + 1)); + } + DISTRHO_SAFE_ASSERT_BREAK(CFStringGetCString(valueRef, value, valueLen + 1, kCFStringEncodingUTF8)); + + const String dkey(key); + fStateMap[dkey] = value; + fPlugin.setState(key, value); + + for (uint32_t j=0; j(¶msRef)) + && CFGetTypeID(paramsRef) == CFArrayGetTypeID()) + { + const CFIndex numParams = CFArrayGetCount(paramsRef); + char* symbol = nullptr; + CFIndex symbolLen = -1; + + for (CFIndex i=0; i(CFArrayGetValueAtIndex(paramsRef, i)); + DISTRHO_SAFE_ASSERT_BREAK(CFGetTypeID(param) == CFDictionaryGetTypeID()); + DISTRHO_SAFE_ASSERT_BREAK(CFDictionaryGetCount(param) == 1); + + CFStringRef keyRef = nullptr; + CFNumberRef valueRef = nullptr; + CFDictionaryGetKeysAndValues(param, + reinterpret_cast(&keyRef), + reinterpret_cast(&valueRef)); + DISTRHO_SAFE_ASSERT_BREAK(keyRef != nullptr && CFGetTypeID(keyRef) == CFStringGetTypeID()); + DISTRHO_SAFE_ASSERT_BREAK(valueRef != nullptr && CFGetTypeID(valueRef) == CFNumberGetTypeID()); + + float value = 0.f; + DISTRHO_SAFE_ASSERT_BREAK(CFNumberGetValue(valueRef, kCFNumberFloat32Type, &value)); + + const CFIndex keyRefLen = CFStringGetLength(keyRef); + if (symbolLen < keyRefLen) + { + symbolLen = keyRefLen; + symbol = static_cast(std::realloc(symbol, symbolLen + 1)); + } + DISTRHO_SAFE_ASSERT_BREAK(CFStringGetCString(keyRef, symbol, symbolLen + 1, kCFStringEncodingASCII)); + + for (uint32_t j=0; j sizeof(MIDIPacket::data)) + return true; + if (fMidiOutputPackets.numPackets == kMaxMidiEvents) + return false; + + const uint8_t* const midiData = midiEvent.size > MidiEvent::kDataSize ? midiEvent.dataExt : midiEvent.data; + MIDIPacket& packet(fMidiOutputPackets.packets[fMidiOutputPackets.numPackets++]); + packet.timeStamp = midiEvent.frame; + packet.length = midiEvent.size; + std::memcpy(packet.data, midiData, midiEvent.size); + return true; + } + + static bool writeMidiCallback(void* const ptr, const MidiEvent& midiEvent) + { + return static_cast(ptr)->writeMidi(midiEvent); + } + #endif + + #if DISTRHO_PLUGIN_WANT_PARAMETER_VALUE_CHANGE_REQUEST + bool requestParameterValueChange(const uint32_t index, const float value) + { + AudioUnitEvent event; + std::memset(&event, 0, sizeof(event)); + event.mEventType = kAudioUnitEvent_ParameterValueChange; + event.mArgument.mParameter.mAudioUnit = fComponent; + event.mArgument.mParameter.mParameterID = index; + event.mArgument.mParameter.mScope = kAudioUnitScope_Global; + + fLastParameterValues[index] = value; + AUEventListenerNotify(NULL, NULL, &event); + notifyPropertyListeners('DPFp', kAudioUnitScope_Global, index); + return true; + } + + static bool requestParameterValueChangeCallback(void* const ptr, const uint32_t index, const float value) + { + return static_cast(ptr)->requestParameterValueChange(index, value); + } + #endif + + #if DISTRHO_PLUGIN_WANT_STATE + bool updateState(const char* const key, const char* const newValue) + { + fPlugin.setState(key, newValue); + + for (uint32_t i=0; i(ptr)->updateState(key, newValue); + } + #endif + + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginAU) +}; + +// -------------------------------------------------------------------------------------------------------------------- + +struct AudioComponentPlugInInstance { + AudioComponentPlugInInterface acpi; + PluginAU* plugin; + + AudioComponentPlugInInstance() noexcept + : acpi(), + plugin(nullptr) + { + std::memset(&acpi, 0, sizeof(acpi)); + acpi.Open = Open; + acpi.Close = Close; + acpi.Lookup = Lookup; + acpi.reserved = nullptr; + } + + ~AudioComponentPlugInInstance() + { + delete plugin; + } + + static OSStatus Open(void* const self, const AudioUnit component) + { + static_cast(self)->plugin = new PluginAU(component); + return noErr; + } + + static OSStatus Close(void* const self) + { + delete static_cast(self); + return noErr; + } + + static AudioComponentMethod Lookup(const SInt16 selector) + { + d_debug("AudioComponentPlugInInstance::Lookup(%3d:%s)", selector, AudioUnitSelector2Str(selector)); + + switch (selector) + { + case kAudioUnitInitializeSelect: + return reinterpret_cast(Initialize); + case kAudioUnitUninitializeSelect: + return reinterpret_cast(Uninitialize); + case kAudioUnitGetPropertyInfoSelect: + return reinterpret_cast(GetPropertyInfo); + case kAudioUnitGetPropertySelect: + return reinterpret_cast(GetProperty); + case kAudioUnitSetPropertySelect: + return reinterpret_cast(SetProperty); + case kAudioUnitAddPropertyListenerSelect: + return reinterpret_cast(AddPropertyListener); + case kAudioUnitRemovePropertyListenerSelect: + return reinterpret_cast(RemovePropertyListener); + case kAudioUnitRemovePropertyListenerWithUserDataSelect: + return reinterpret_cast(RemovePropertyListenerWithUserData); + case kAudioUnitAddRenderNotifySelect: + return reinterpret_cast(AddRenderNotify); + case kAudioUnitRemoveRenderNotifySelect: + return reinterpret_cast(RemoveRenderNotify); + case kAudioUnitGetParameterSelect: + return reinterpret_cast(GetParameter); + case kAudioUnitSetParameterSelect: + return reinterpret_cast(SetParameter); + case kAudioUnitScheduleParametersSelect: + return reinterpret_cast(ScheduleParameters); + case kAudioUnitRenderSelect: + return reinterpret_cast(Render); + /* + case kAudioUnitComplexRenderSelect: + return reinterpret_cast(ComplexRender); + */ + case kAudioUnitResetSelect: + return reinterpret_cast(Reset); + /* + case kAudioUnitProcessSelect: + return reinterpret_cast(Process); + case kAudioUnitProcessMultipleSelect: + return reinterpret_cast(ProcessMultiple); + */ + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + case kMusicDeviceMIDIEventSelect: + return reinterpret_cast(MIDIEvent); + case kMusicDeviceSysExSelect: + return reinterpret_cast(SysEx); + #else + case kMusicDeviceMIDIEventSelect: + case kMusicDeviceSysExSelect: + return nullptr; + #endif + } + + d_stdout("TODO Lookup(%3d:%s)", selector, AudioUnitSelector2Str(selector)); + return nullptr; + } + + static OSStatus Initialize(AudioComponentPlugInInstance* const self) + { + d_debug("AudioComponentPlugInInstance::Initialize(%p)", self); + return self->plugin->auInitialize(); + } + + static OSStatus Uninitialize(AudioComponentPlugInInstance* const self) + { + d_debug("AudioComponentPlugInInstance::Uninitialize(%p)", self); + return self->plugin->auUninitialize(); + } + + static OSStatus GetPropertyInfo(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID inProp, + const AudioUnitScope inScope, + const AudioUnitElement inElement, + UInt32* const outDataSize, + Boolean* const outWritable) + { + d_debug("AudioComponentPlugInInstance::GetPropertyInfo(%p, %d:%x:%s, %d:%s, %d, ...)", + self, inProp, inProp, AudioUnitPropertyID2Str(inProp), inScope, AudioUnitScope2Str(inScope), inElement); + + UInt32 dataSize = 0; + Boolean writable = false; + const OSStatus res = self->plugin->auGetPropertyInfo(inProp, inScope, inElement, dataSize, writable); + + if (outDataSize != nullptr) + *outDataSize = dataSize; + + if (outWritable != nullptr) + *outWritable = writable; + + return res; + } + + static OSStatus GetProperty(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID inProp, + const AudioUnitScope inScope, + const AudioUnitElement inElement, + void* const outData, + UInt32* const ioDataSize) + { + d_debug("AudioComponentPlugInInstance::GetProperty(%p, %d:%x:%s, %d:%s, %d, ...)", + self, inProp, inProp, AudioUnitPropertyID2Str(inProp), inScope, AudioUnitScope2Str(inScope), inElement); + DISTRHO_SAFE_ASSERT_RETURN(ioDataSize != nullptr, kAudio_ParamError); + + Boolean writable; + UInt32 outDataSize = 0; + OSStatus res; + + if (outData == nullptr) + { + res = self->plugin->auGetPropertyInfo(inProp, inScope, inElement, outDataSize, writable); + *ioDataSize = outDataSize; + return res; + } + + const UInt32 inDataSize = *ioDataSize; + if (inDataSize == 0) + return kAudio_ParamError; + + res = self->plugin->auGetPropertyInfo(inProp, inScope, inElement, outDataSize, writable); + + if (res != noErr) + return res; + + void* outBuffer; + uint8_t* tmpBuffer; + if (inDataSize < outDataSize) + { + tmpBuffer = new uint8_t[outDataSize]; + outBuffer = tmpBuffer; + } + else + { + tmpBuffer = nullptr; + outBuffer = outData; + } + + res = self->plugin->auGetProperty(inProp, inScope, inElement, outBuffer); + + if (res != noErr) + { + *ioDataSize = 0; + return res; + } + + if (tmpBuffer != nullptr) + { + memcpy(outData, tmpBuffer, inDataSize); + delete[] tmpBuffer; + } + else + { + *ioDataSize = outDataSize; + } + + return noErr; + } + + static OSStatus SetProperty(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID inProp, + const AudioUnitScope inScope, + const AudioUnitElement inElement, + const void* const inData, + const UInt32 inDataSize) + { + d_debug("AudioComponentPlugInInstance::SetProperty(%p, %d:%x:%s, %d:%s, %d, %p, %u)", + self, inProp, inProp, AudioUnitPropertyID2Str(inProp), inScope, AudioUnitScope2Str(inScope), inElement, inData, inDataSize); + return self->plugin->auSetProperty(inProp, inScope, inElement, inData, inDataSize); + } + + static OSStatus AddPropertyListener(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + d_debug("AudioComponentPlugInInstance::AddPropertyListener(%p, %d:%x:%s, %p, %p)", + self, prop, prop, AudioUnitPropertyID2Str(prop), proc, userData); + return self->plugin->auAddPropertyListener(prop, proc, userData); + } + + static OSStatus RemovePropertyListener(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc) + { + d_debug("AudioComponentPlugInInstance::RemovePropertyListener(%p, %d:%x:%s, %p)", + self, prop, prop, AudioUnitPropertyID2Str(prop), proc); + return self->plugin->auRemovePropertyListener(prop, proc); + } + + static OSStatus RemovePropertyListenerWithUserData(AudioComponentPlugInInstance* const self, + const AudioUnitPropertyID prop, + const AudioUnitPropertyListenerProc proc, + void* const userData) + { + d_debug("AudioComponentPlugInInstance::RemovePropertyListenerWithUserData(%p, %d:%x:%s, %p, %p)", + self, prop, prop, AudioUnitPropertyID2Str(prop), proc, userData); + return self->plugin->auRemovePropertyListenerWithUserData(prop, proc, userData); + } + + static OSStatus AddRenderNotify(AudioComponentPlugInInstance* const self, + const AURenderCallback proc, + void* const userData) + { + d_debug("AudioComponentPlugInInstance::AddRenderNotify(%p, %p, %p)", self, proc, userData); + return self->plugin->auAddRenderNotify(proc, userData); + } + + static OSStatus RemoveRenderNotify(AudioComponentPlugInInstance* const self, + const AURenderCallback proc, + void* const userData) + { + d_debug("AudioComponentPlugInInstance::RemoveRenderNotify(%p, %p, %p)", self, proc, userData); + return self->plugin->auRemoveRenderNotify(proc, userData); + } + + static OSStatus GetParameter(AudioComponentPlugInInstance* const self, + const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + AudioUnitParameterValue* const value) + { + d_debug("AudioComponentPlugInInstance::GetParameter(%p, %d, %d:%s, %d, %p)", + self, param, scope, AudioUnitScope2Str(scope), elem, value); + return self->plugin->auGetParameter(param, scope, elem, value); + } + + static OSStatus SetParameter(AudioComponentPlugInInstance* const self, + const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + const AudioUnitParameterValue value, + const UInt32 bufferOffset) + { + d_debug("AudioComponentPlugInInstance::SetParameter(%p, %d %d:%s, %d, %f, %u)", + self, param, scope, AudioUnitScope2Str(scope), elem, value, bufferOffset); + return self->plugin->auSetParameter(param, scope, elem, value, bufferOffset); + } + + static OSStatus ScheduleParameters(AudioComponentPlugInInstance* const self, + const AudioUnitParameterEvent* const events, + const UInt32 numEvents) + { + d_debug("AudioComponentPlugInInstance::ScheduleParameters(%p, %p, %u)", self, events, numEvents); + return self->plugin->auScheduleParameters(events, numEvents); + } + + static OSStatus Reset(AudioComponentPlugInInstance* const self, + const AudioUnitScope scope, + const AudioUnitElement elem) + { + d_debug("AudioComponentPlugInInstance::Reset(%p, %d:%s, %d)", self, scope, AudioUnitScope2Str(scope), elem); + return self->plugin->auReset(scope, elem); + } + + static OSStatus Render(AudioComponentPlugInInstance* const self, + AudioUnitRenderActionFlags* ioActionFlags, + const AudioTimeStamp* const inTimeStamp, + const UInt32 inOutputBusNumber, + const UInt32 inNumberFrames, + AudioBufferList* const ioData) + { + const AudioUnitRenderActionFlags actionFlags = ioActionFlags != nullptr ? *ioActionFlags : 0; + + if ((actionFlags & kAudioUnitRenderAction_DoNotCheckRenderArgs) == 0x0) + { + DISTRHO_SAFE_ASSERT_RETURN(inTimeStamp != nullptr, kAudio_ParamError); + DISTRHO_SAFE_ASSERT_RETURN(ioData != nullptr, kAudio_ParamError); + } + + return self->plugin->auRender(actionFlags, inTimeStamp, inOutputBusNumber, inNumberFrames, ioData); + } + + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + static OSStatus MIDIEvent(AudioComponentPlugInInstance* const self, + const UInt32 inStatus, + const UInt32 inData1, + const UInt32 inData2, + const UInt32 inOffsetSampleFrame) + { + return self->plugin->auMIDIEvent(inStatus, inData1, inData2, inOffsetSampleFrame); + } + + static OSStatus SysEx(AudioComponentPlugInInstance* const self, const UInt8* const inData, const UInt32 inLength) + { + return self->plugin->auSysEx(inData, inLength); + } + #endif + + DISTRHO_DECLARE_NON_COPYABLE(AudioComponentPlugInInstance) +}; + +#if 0 +static OSStatus FastDispatchGetParameter(void* const self, + const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + Float32* const value) +{ + d_debug("FastDispatchGetParameter(%p, %d, %d:%s, %d, %p)", + self, param, scope, AudioUnitScope2Str(scope), elem, value); + return static_cast(self)->plugin->auGetParameter(param, scope, elem, value); +} + +static OSStatus FastDispatchSetParameter(void* const self, + const AudioUnitParameterID param, + const AudioUnitScope scope, + const AudioUnitElement elem, + const Float32 value, + const UInt32 bufferOffset) +{ + d_debug("FastDispatchSetParameter(%p, %d %d:%s, %d, %f, %u)", + self, param, scope, AudioUnitScope2Str(scope), elem, value, bufferOffset); + return static_cast(self)->plugin->auSetParameter(param, scope, elem, value, bufferOffset); +} + +static OSStatus FastDispatchRender(void* const self, + AudioUnitRenderActionFlags* const ioActionFlags, + const AudioTimeStamp* const inTimeStamp, + const UInt32 inBusNumber, + const UInt32 inNumberFrames, + AudioBufferList* const ioData) +{ + DISTRHO_SAFE_ASSERT_RETURN(inTimeStamp != nullptr, kAudio_ParamError); + DISTRHO_SAFE_ASSERT_RETURN(ioData != nullptr, kAudio_ParamError); + + return static_cast(self)->plugin->auRender(ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, *ioData); +} +#endif + +// -------------------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +DISTRHO_PLUGIN_EXPORT +void* PluginAUFactory(const AudioComponentDescription* const desc) +{ + USE_NAMESPACE_DISTRHO + + DISTRHO_SAFE_ASSERT_UINT2_RETURN(desc->componentType == kType, desc->componentType, kType, nullptr); + DISTRHO_SAFE_ASSERT_UINT2_RETURN(desc->componentSubType == kSubType, desc->componentSubType, kSubType, nullptr); + DISTRHO_SAFE_ASSERT_UINT2_RETURN(desc->componentManufacturer == kManufacturer, desc->componentManufacturer, kManufacturer, nullptr); + + if (d_nextBufferSize == 0) + d_nextBufferSize = 1156; + + if (d_isZero(d_nextSampleRate)) + d_nextSampleRate = 44100.0; + + if (d_nextBundlePath == nullptr) + { + static String bundlePath; + + String tmpPath(getBinaryFilename()); + tmpPath.truncate(tmpPath.rfind(DISTRHO_OS_SEP)); + tmpPath.truncate(tmpPath.rfind(DISTRHO_OS_SEP)); + + if (tmpPath.endsWith(DISTRHO_OS_SEP_STR "Contents")) + { + tmpPath.truncate(tmpPath.rfind(DISTRHO_OS_SEP)); + bundlePath = tmpPath; + } + else + { + bundlePath = "error"; + } + + d_nextBundlePath = bundlePath.buffer(); + } + + d_nextCanRequestParameterValueChanges = true; + + return new AudioComponentPlugInInstance(); +} + +// -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginCLAP.cpp b/dpf/distrho/src/DistrhoPluginCLAP.cpp index eafc05d..04933eb 100644 --- a/dpf/distrho/src/DistrhoPluginCLAP.cpp +++ b/dpf/distrho/src/DistrhoPluginCLAP.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -29,7 +29,7 @@ # error DISTRHO_PLUGIN_CLAP_ID undefined! #endif -#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) # undef DISTRHO_PLUGIN_HAS_UI # define DISTRHO_PLUGIN_HAS_UI 0 #endif @@ -57,7 +57,7 @@ #include "clap/ext/thread-check.h" #include "clap/ext/timer-support.h" -#if (defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS)) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS) # define DPF_CLAP_USING_HOST_TIMER 0 #else # define DPF_CLAP_USING_HOST_TIMER 1 @@ -211,7 +211,9 @@ public: #endif const bool isFloating) : fPlugin(plugin), + #if DISTRHO_PLUGIN_WANT_STATE fPluginEventQueue(eventQueue), + #endif fEventQueue(eventQueue->fEventQueue), fCachedParameters(eventQueue->fCachedParameters), #if DISTRHO_PLUGIN_WANT_PROGRAMS @@ -280,10 +282,10 @@ public: double scaleFactor = fScaleFactor; #if defined(DISTRHO_UI_DEFAULT_WIDTH) && defined(DISTRHO_UI_DEFAULT_HEIGHT) - *width = DISTRHO_UI_DEFAULT_WIDTH; - *height = DISTRHO_UI_DEFAULT_HEIGHT; if (d_isZero(scaleFactor)) scaleFactor = 1.0; + *width = DISTRHO_UI_DEFAULT_WIDTH * scaleFactor; + *height = DISTRHO_UI_DEFAULT_HEIGHT * scaleFactor; #else UIExporter tmpUI(nullptr, 0, fPlugin.getSampleRate(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, d_nextBundlePath, @@ -371,10 +373,10 @@ public: { // fix width if (reqRatio > ratio) - *width = static_cast(*height * ratio + 0.5); + *width = d_roundToIntPositive(*height * ratio); // fix height else - *height = static_cast(static_cast(*width) / ratio + 0.5); + *height = d_roundToIntPositive(static_cast(*width) / ratio); } } @@ -534,7 +536,9 @@ public: private: // Plugin and UI PluginExporter& fPlugin; + #if DISTRHO_PLUGIN_WANT_STATE ClapEventQueue* const fPluginEventQueue; + #endif ClapEventQueue::Queue& fEventQueue; ClapEventQueue::CachedParameters& fCachedParameters; #if DISTRHO_PLUGIN_WANT_PROGRAMS @@ -600,8 +604,8 @@ private: // Set state for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { - const String& key = cit->first; - const String& value = cit->second; + const String& key(cit->first); + const String& value(cit->second); // TODO skip DSP only states @@ -1433,7 +1437,7 @@ public: // Update current state for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { - const String& key = cit->first; + const String& key(cit->first); fStateMap[key] = fPlugin.getStateValue(key); } #endif @@ -1457,8 +1461,8 @@ public: for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { - const String& key = cit->first; - const String& value = cit->second; + const String& key(cit->first); + const String& value(cit->second); // join key and value String tmpStr; @@ -1764,23 +1768,11 @@ public: { fPlugin.setState(key, value); - // check if we want to save this key - if (! fPlugin.wantStateKey(key)) - return; - - // check if key already exists - for (StringMap::iterator it=fStateMap.begin(), ite=fStateMap.end(); it != ite; ++it) + if (fPlugin.wantStateKey(key)) { - const String& dkey(it->first); - - if (dkey == key) - { - it->second = value; - return; - } + const String dkey(key); + fStateMap[dkey] = value; } - - d_stderr("Failed to find plugin state with key \"%s\"", key); } #endif diff --git a/dpf/distrho/src/DistrhoPluginChecks.h b/dpf/distrho/src/DistrhoPluginChecks.h index 9785b18..fb05181 100644 --- a/dpf/distrho/src/DistrhoPluginChecks.h +++ b/dpf/distrho/src/DistrhoPluginChecks.h @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -23,7 +23,7 @@ #include "DistrhoPluginInfo.h" -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- // Check if all required macros are defined #ifndef DISTRHO_PLUGIN_NAME @@ -42,17 +42,13 @@ # error DISTRHO_PLUGIN_URI undefined! #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- // Define optional macros if not done yet #ifndef DISTRHO_PLUGIN_HAS_UI # define DISTRHO_PLUGIN_HAS_UI 0 #endif -#ifndef DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# define DISTRHO_PLUGIN_HAS_EXTERNAL_UI 0 -#endif - #ifndef DISTRHO_PLUGIN_IS_RT_SAFE # define DISTRHO_PLUGIN_IS_RT_SAFE 0 #endif @@ -95,47 +91,94 @@ #endif #ifndef DISTRHO_UI_FILE_BROWSER -# if defined(DGL_FILE_BROWSER_DISABLED) || DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# define DISTRHO_UI_FILE_BROWSER 0 -# else -# define DISTRHO_UI_FILE_BROWSER 1 -# endif +# define DISTRHO_UI_FILE_BROWSER 0 +#endif + +#ifndef DISTRHO_UI_WEB_VIEW +# define DISTRHO_UI_WEB_VIEW 0 #endif #ifndef DISTRHO_UI_USER_RESIZABLE # define DISTRHO_UI_USER_RESIZABLE 0 #endif +// -------------------------------------------------------------------------------------------------------------------- +// set UI type + +#ifndef DISTRHO_UI_USE_CAIRO +# define DISTRHO_UI_USE_CAIRO 0 +#endif + +#ifndef DISTRHO_UI_USE_CUSTOM +# define DISTRHO_UI_USE_CUSTOM 0 +#endif + +#ifndef DISTRHO_UI_USE_EXTERNAL +# define DISTRHO_UI_USE_EXTERNAL 0 +#endif + #ifndef DISTRHO_UI_USE_NANOVG # define DISTRHO_UI_USE_NANOVG 0 #endif -// ----------------------------------------------------------------------- -// Define DISTRHO_PLUGIN_HAS_EMBED_UI if needed +#ifndef DISTRHO_UI_USE_WEB_VIEW +# define DISTRHO_UI_USE_WEB_VIEW 0 +#endif + +// -------------------------------------------------------------------------------------------------------------------- +// Define DISTRHO_UI_WEB_VIEW if needed -#ifndef DISTRHO_PLUGIN_HAS_EMBED_UI -# if (defined(DGL_CAIRO) && defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && defined(HAVE_OPENGL)) -# define DISTRHO_PLUGIN_HAS_EMBED_UI 1 -# else -# define DISTRHO_PLUGIN_HAS_EMBED_UI 0 -# endif +#if DISTRHO_UI_USE_WEB_VIEW && !DISTRHO_UI_WEB_VIEW +# undef DISTRHO_UI_WEB_VIEW +# define DISTRHO_UI_WEB_VIEW 1 #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- // Define DISTRHO_UI_URI if needed #ifndef DISTRHO_UI_URI # define DISTRHO_UI_URI DISTRHO_PLUGIN_URI "#DPF_UI" #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- +// Test for wrong compiler macros + +#if defined(DISTRHO_PLUGIN_HAS_EMBED_UI) +# warning DISTRHO_PLUGIN_HAS_EMBED_UI has been removed, it is now always on +#endif + +#if defined(DISTRHO_PLUGIN_HAS_EXTERNAL_UI) +# error DISTRHO_PLUGIN_HAS_EXTERNAL_UI has been replaced by DISTRHO_UI_USE_EXTERNAL +#endif + +#ifdef DISTRHO_UI_FILEBROWSER +# error typo detected use DISTRHO_UI_FILE_BROWSER instead of DISTRHO_UI_FILEBROWSER +#endif + +#ifdef DISTRHO_UI_WEBVIEW +# error typo detected use DISTRHO_UI_WEB_VIEW instead of DISTRHO_UI_WEBVIEW +#endif + +#ifdef DISTRHO_UI_USE_WEBVIEW +# error typo detected use DISTRHO_UI_USE_WEB_VIEW instead of DISTRHO_UI_USE_WEBVIEW +#endif + +#if DISTRHO_UI_FILE_BROWSER && !defined(DGL_USE_FILE_BROWSER) +# error invalid build config: file browser requested but `USE_FILE_BROWSER` build option is not set +#endif + +#if DISTRHO_UI_WEB_VIEW && !defined(DGL_USE_WEB_VIEW) +# error invalid build config: web view requested but `USE_WEB_VIEW` build option is not set +#endif + +// -------------------------------------------------------------------------------------------------------------------- // Test if synth has audio outputs #if DISTRHO_PLUGIN_IS_SYNTH && DISTRHO_PLUGIN_NUM_OUTPUTS == 0 # error Synths need audio output to work! #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- // Enable MIDI input if synth, test if midi-input disabled when synth #ifndef DISTRHO_PLUGIN_WANT_MIDI_INPUT @@ -144,7 +187,7 @@ # error Synths need MIDI input to work! #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- // Enable state if plugin wants state files (deprecated) #ifdef DISTRHO_PLUGIN_WANT_STATEFILES @@ -156,7 +199,7 @@ # endif #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- // Enable full state if plugin exports presets #if DISTRHO_PLUGIN_WANT_PROGRAMS && DISTRHO_PLUGIN_WANT_STATE && defined(DISTRHO_PLUGIN_WANT_FULL_STATE_WAS_NOT_SET) @@ -165,29 +208,15 @@ # define DISTRHO_PLUGIN_WANT_FULL_STATE 1 #endif -// ----------------------------------------------------------------------- -// Disable file browser if using external UI - -#if DISTRHO_UI_FILE_BROWSER && DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# warning file browser APIs do not work for external UIs -# undef DISTRHO_UI_FILE_BROWSER 0 -# define DISTRHO_UI_FILE_BROWSER 0 -#endif - -// ----------------------------------------------------------------------- -// Disable UI if DGL or external UI is not available +// -------------------------------------------------------------------------------------------------------------------- +// Disable UI if DGL is not available -#if (defined(DGL_CAIRO) && ! defined(HAVE_CAIRO)) || (defined(DGL_OPENGL) && ! defined(HAVE_OPENGL)) -# undef DISTRHO_PLUGIN_HAS_EMBED_UI -# define DISTRHO_PLUGIN_HAS_EMBED_UI 0 -#endif - -#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#if DISTRHO_PLUGIN_HAS_UI && !defined(HAVE_DGL) # undef DISTRHO_PLUGIN_HAS_UI # define DISTRHO_PLUGIN_HAS_UI 0 #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- // Make sure both default width and height are provided #if defined(DISTRHO_UI_DEFAULT_WIDTH) && !defined(DISTRHO_UI_DEFAULT_HEIGHT) @@ -198,13 +227,65 @@ # error DISTRHO_UI_DEFAULT_HEIGHT is defined but DISTRHO_UI_DEFAULT_WIDTH is not #endif -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- +// Define DISTRHO_PLUGIN_AU_TYPE if needed + +#ifndef DISTRHO_PLUGIN_AU_TYPE +# if (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS != 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 +# define DISTRHO_PLUGIN_AU_TYPE aumf /* kAudioUnitType_MusicEffect */ +# elif (DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT) && DISTRHO_PLUGIN_NUM_INPUTS + DISTRHO_PLUGIN_NUM_OUTPUTS != 0 +# define DISTRHO_PLUGIN_AU_TYPE aumu /* kAudioUnitType_MusicDevice */ +# elif DISTRHO_PLUGIN_WANT_MIDI_INPUT || DISTRHO_PLUGIN_WANT_MIDI_OUTPUT +# define DISTRHO_PLUGIN_AU_TYPE aumi /* kAudioUnitType_MIDIProcessor */ +# elif DISTRHO_PLUGIN_NUM_INPUTS == 0 && DISTRHO_PLUGIN_NUM_OUTPUTS != 0 +# define DISTRHO_PLUGIN_AU_TYPE augn /* kAudioUnitType_Generator */ +# else +# define DISTRHO_PLUGIN_AU_TYPE aufx /* kAudioUnitType_Effect */ +# endif +#endif + +// -------------------------------------------------------------------------------------------------------------------- +// Check that symbol macros are well defined + +#ifdef DISTRHO_PROPER_CPP11_SUPPORT + +#ifdef DISTRHO_PLUGIN_AU_TYPE +static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_AU_TYPE)) == 5, "The macro DISTRHO_PLUGIN_AU_TYPE has incorrect length"); +# if DISTRHO_PLUGIN_NUM_INPUTS == 0 || DISTRHO_PLUGIN_NUM_OUTPUTS == 0 +static constexpr const char _aut[5] = STRINGIFY(DISTRHO_PLUGIN_AU_TYPE); +static_assert(_aut[0] != 'a' || _aut[0] != 'u' || _aut[0] != 'm' || _aut[0] != 'u', + "The 'aumu' type requires both audio input and output"); +# endif +#endif + +#ifdef DISTRHO_PLUGIN_BRAND_ID +static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_BRAND_ID)) == 5, "The macro DISTRHO_PLUGIN_BRAND_ID has incorrect length"); +#endif + +#ifdef DISTRHO_PLUGIN_UNIQUE_ID +static_assert(sizeof(STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID)) == 5, "The macro DISTRHO_PLUGIN_UNIQUE_ID has incorrect length"); +#endif + +#endif + +// -------------------------------------------------------------------------------------------------------------------- // Prevent users from messing about with DPF internals #ifdef DISTRHO_UI_IS_STANDALONE # error DISTRHO_UI_IS_STANDALONE must not be defined #endif -// ----------------------------------------------------------------------- +#ifdef DPF_USING_LD_LINUX_WEBVIEW +# error DPF_USING_LD_LINUX_WEBVIEW must not be defined +#endif + +// -------------------------------------------------------------------------------------------------------------------- +// Set DPF_USING_LD_LINUX_WEBVIEW for internal use + +#if DISTRHO_UI_WEB_VIEW && defined(DISTRHO_OS_LINUX) +# define DPF_USING_LD_LINUX_WEBVIEW +#endif + +// -------------------------------------------------------------------------------------------------------------------- #endif // DISTRHO_PLUGIN_CHECKS_H_INCLUDED diff --git a/dpf/distrho/src/DistrhoPluginExport.cpp b/dpf/distrho/src/DistrhoPluginExport.cpp new file mode 100644 index 0000000..f4cd550 --- /dev/null +++ b/dpf/distrho/src/DistrhoPluginExport.cpp @@ -0,0 +1,281 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoPluginInternal.hpp" +#include "../DistrhoPluginUtils.hpp" + +#ifndef DISTRHO_PLUGIN_BRAND_ID +# error DISTRHO_PLUGIN_BRAND_ID undefined! +#endif + +#ifndef DISTRHO_PLUGIN_UNIQUE_ID +# error DISTRHO_PLUGIN_UNIQUE_ID undefined! +#endif + +#include +#include + +USE_NAMESPACE_DISTRHO + +// -------------------------------------------------------------------------------------------------------------------- + +void generate_au_plist(const PluginExporter& plugin, + const char* const basename, + const char* const license) +{ + std::cout << "Writing Info.plist..."; std::cout.flush(); + std::fstream outputFile("Info.plist", std::ios::out); + + const uint32_t version = plugin.getVersion(); + + const uint32_t majorVersion = (version & 0xFF0000) >> 16; + const uint32_t minorVersion = (version & 0x00FF00) >> 8; + const uint32_t microVersion = (version & 0x0000FF) >> 0; + + outputFile << "\n"; + outputFile << "\n"; + outputFile << "\n"; + outputFile << " \n"; + outputFile << " CFBundleExecutable\n"; + outputFile << " " << basename << "\n"; + outputFile << " CFBundleIconFile\n"; + outputFile << " \n"; + outputFile << " CFBundleIdentifier\n"; + outputFile << " " DISTRHO_PLUGIN_CLAP_ID "\n"; + outputFile << " CFBundleName\n"; + outputFile << " " << basename << "\n"; + outputFile << " CFBundleDisplayName\n"; + outputFile << " " << plugin.getName() << "\n"; + outputFile << " CFBundlePackageType\n"; + outputFile << " BNDL\n"; + outputFile << " CFBundleSignature\n"; + outputFile << " " << "????" << "\n"; + outputFile << " CFBundleShortVersionString\n"; + outputFile << " " << majorVersion << "." << minorVersion << "." << microVersion << "\n"; + outputFile << " CFBundleVersion\n"; + outputFile << " " << majorVersion << "." << minorVersion << "." << microVersion << "\n"; + if (license != nullptr && license[0] != '\0') + { + outputFile << " NSHumanReadableCopyright\n"; + outputFile << " " << license << "\n"; + } + outputFile << " NSHighResolutionCapable\n"; + outputFile << " \n"; + outputFile << " AudioComponents\n"; + outputFile << " \n"; + outputFile << " \n"; + outputFile << " name\n"; + outputFile << " " << plugin.getMaker() << ": " << plugin.getName() << "\n"; + outputFile << " description\n"; + outputFile << " " << plugin.getDescription() << "\n"; + outputFile << " factoryFunction\n"; + outputFile << " PluginAUFactory\n"; + outputFile << " type\n"; + outputFile << " " STRINGIFY(DISTRHO_PLUGIN_AU_TYPE) "\n"; + outputFile << " subtype\n"; + outputFile << " " STRINGIFY(DISTRHO_PLUGIN_UNIQUE_ID) "\n"; + outputFile << " manufacturer\n"; + outputFile << " " STRINGIFY(DISTRHO_PLUGIN_BRAND_ID) "\n"; + outputFile << " version\n"; + outputFile << " " << version << "\n"; + outputFile << " resourceUsage\n"; + outputFile << " \n"; + outputFile << " network.client\n"; + outputFile << " \n"; + outputFile << " temporary-exception.files.all.read-write\n"; + outputFile << " \n"; + outputFile << " \n"; + outputFile << " \n"; + outputFile << " \n"; + outputFile << " \n"; + outputFile << "\n"; + + outputFile.close(); + std::cout << " done!" << std::endl; +} + +// -------------------------------------------------------------------------------------------------------------------- + +int main(int argc, char* argv[]) +{ + if (argc <= 1) + return 1; + + // Dummy plugin to get data from + d_nextBufferSize = 512; + d_nextSampleRate = 44100.0; + d_nextPluginIsDummy = true; + PluginExporter plugin(nullptr, nullptr, nullptr, nullptr); + d_nextBufferSize = 0; + d_nextSampleRate = 0.0; + d_nextPluginIsDummy = false; + + String license(plugin.getLicense()); + + if (license.isEmpty()) + {} + // License as URL, use as-is + else if (license.contains("://")) + {} + // License contains quotes, use as-is + else if (license.contains('"')) + {} + // Regular license string, convert to URL as much as we can + else + { + const String uplicense(license.asUpper()); + + // for reference, see https://spdx.org/licenses/ + + // common licenses + /**/ if (uplicense == "AGPL-1.0-ONLY" || + uplicense == "AGPL1" || + uplicense == "AGPLV1") + { + license = "http://spdx.org/licenses/AGPL-1.0-only.html"; + } + else if (uplicense == "AGPL-1.0-OR-LATER" || + uplicense == "AGPL1+" || + uplicense == "AGPLV1+") + { + license = "http://spdx.org/licenses/AGPL-1.0-or-later.html"; + } + else if (uplicense == "AGPL-3.0-ONLY" || + uplicense == "AGPL3" || + uplicense == "AGPLV3") + { + license = "http://spdx.org/licenses/AGPL-3.0-only.html"; + } + else if (uplicense == "AGPL-3.0-OR-LATER" || + uplicense == "AGPL3+" || + uplicense == "AGPLV3+") + { + license = "http://spdx.org/licenses/AGPL-3.0-or-later.html"; + } + else if (uplicense == "APACHE-2.0" || + uplicense == "APACHE2" || + uplicense == "APACHE-2") + { + license = "http://spdx.org/licenses/Apache-2.0.html"; + } + else if (uplicense == "BSD-2-CLAUSE" || + uplicense == "BSD2" || + uplicense == "BSD-2") + { + license = "http://spdx.org/licenses/BSD-2-Clause.html"; + } + else if (uplicense == "BSD-3-CLAUSE" || + uplicense == "BSD3" || + uplicense == "BSD-3") + { + license = "http://spdx.org/licenses/BSD-3-Clause.html"; + } + else if (uplicense == "GPL-2.0-ONLY" || + uplicense == "GPL2" || + uplicense == "GPLV2") + { + license = "http://spdx.org/licenses/GPL-2.0-only.html"; + } + else if (uplicense == "GPL-2.0-OR-LATER" || + uplicense == "GPL2+" || + uplicense == "GPLV2+" || + uplicense == "GPLV2.0+" || + uplicense == "GPL V2+") + { + license = "http://spdx.org/licenses/GPL-2.0-or-later.html"; + } + else if (uplicense == "GPL-3.0-ONLY" || + uplicense == "GPL3" || + uplicense == "GPLV3") + { + license = "http://spdx.org/licenses/GPL-3.0-only.html"; + } + else if (uplicense == "GPL-3.0-OR-LATER" || + uplicense == "GPL3+" || + uplicense == "GPLV3+" || + uplicense == "GPLV3.0+" || + uplicense == "GPL V3+") + { + license = "http://spdx.org/licenses/GPL-3.0-or-later.html"; + } + else if (uplicense == "ISC") + { + license = "http://spdx.org/licenses/ISC.html"; + } + else if (uplicense == "LGPL-2.0-ONLY" || + uplicense == "LGPL2" || + uplicense == "LGPLV2") + { + license = "http://spdx.org/licenses/LGPL-2.0-only.html"; + } + else if (uplicense == "LGPL-2.0-OR-LATER" || + uplicense == "LGPL2+" || + uplicense == "LGPLV2+") + { + license = "http://spdx.org/licenses/LGPL-2.0-or-later.html"; + } + else if (uplicense == "LGPL-2.1-ONLY" || + uplicense == "LGPL2.1" || + uplicense == "LGPLV2.1") + { + license = "http://spdx.org/licenses/LGPL-2.1-only.html"; + } + else if (uplicense == "LGPL-2.1-OR-LATER" || + uplicense == "LGPL2.1+" || + uplicense == "LGPLV2.1+") + { + license = "http://spdx.org/licenses/LGPL-2.1-or-later.html"; + } + else if (uplicense == "LGPL-3.0-ONLY" || + uplicense == "LGPL3" || + uplicense == "LGPLV3") + { + license = "http://spdx.org/licenses/LGPL-2.0-only.html"; + } + else if (uplicense == "LGPL-3.0-OR-LATER" || + uplicense == "LGPL3+" || + uplicense == "LGPLV3+") + { + license = "http://spdx.org/licenses/LGPL-3.0-or-later.html"; + } + else if (uplicense == "MIT") + { + license = "http://spdx.org/licenses/MIT.html"; + } + + // generic fallbacks + else if (uplicense.startsWith("GPL")) + { + license = "http://opensource.org/licenses/gpl-license"; + } + else if (uplicense.startsWith("LGPL")) + { + license = "http://opensource.org/licenses/lgpl-license"; + } + + // unknown or not handled yet, log a warning + else + { + d_stderr("Unknown license string '%s'", license.buffer()); + } + } + + generate_au_plist(plugin, argv[1], license); + + return 0; +} + +// -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginInternal.hpp b/dpf/distrho/src/DistrhoPluginInternal.hpp index fdc6f7b..e42fe86 100644 --- a/dpf/distrho/src/DistrhoPluginInternal.hpp +++ b/dpf/distrho/src/DistrhoPluginInternal.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -309,6 +309,9 @@ struct Plugin::PrivateData { #if DISTRHO_PLUGIN_WANT_STATE bool updateStateValueCallback(const char* const key, const char* const value) { + DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0', false); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr, false); + d_stdout("updateStateValueCallback %p", updateStateValueCallbackFunc); if (updateStateValueCallbackFunc != nullptr) return updateStateValueCallbackFunc(callbacksPtr, key, value); @@ -756,6 +759,24 @@ public: fPlugin->setParameterValue(index, value); } + /* + bool getParameterIndexForSymbol(const char* const symbol, uint32_t& index) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, false); + + for (uint32_t i=0; i < fData->parameterCount; ++i) + { + if (fData->parameters[i].symbol == symbol) + { + index = i; + return true; + } + } + + return false; + } + */ + uint32_t getPortGroupCount() const noexcept { DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, 0); @@ -868,7 +889,7 @@ public: } #endif -# if DISTRHO_PLUGIN_WANT_FULL_STATE + #if DISTRHO_PLUGIN_WANT_FULL_STATE String getStateValue(const char* const key) const { DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, sFallbackString); @@ -876,7 +897,7 @@ public: return fPlugin->getState(key); } -# endif + #endif void setState(const char* const key, const char* const value) { @@ -947,7 +968,7 @@ public: } } -#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT void run(const float** const inputs, float** const outputs, const uint32_t frames, const MidiEvent* const midiEvents, const uint32_t midiEventCount) { @@ -964,7 +985,7 @@ public: fPlugin->run(inputs, outputs, frames, midiEvents, midiEventCount); fData->isProcessing = false; } -#else + #else void run(const float** const inputs, float** const outputs, const uint32_t frames) { DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); @@ -980,7 +1001,21 @@ public: fPlugin->run(inputs, outputs, frames); fData->isProcessing = false; } -#endif + #endif + + // ------------------------------------------------------------------- + + #ifdef DISTRHO_PLUGIN_TARGET_AU + void setAudioPortIO(const uint16_t numInputs, const uint16_t numOutputs) + { + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + + if (fIsActive) fPlugin->deactivate(); + fPlugin->ioChanged(numInputs, numOutputs); + if (fIsActive) fPlugin->activate(); + } + #endif // ------------------------------------------------------------------- @@ -996,14 +1031,14 @@ public: return fData->sampleRate; } - void setBufferSize(const uint32_t bufferSize, const bool doCallback = false) + bool setBufferSize(const uint32_t bufferSize, const bool doCallback = false) { - DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr,); - DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(fData != nullptr, false); + DISTRHO_SAFE_ASSERT_RETURN(fPlugin != nullptr, false); DISTRHO_SAFE_ASSERT(bufferSize >= 2); if (fData->bufferSize == bufferSize) - return; + return false; fData->bufferSize = bufferSize; @@ -1013,6 +1048,8 @@ public: fPlugin->bufferSizeChanged(bufferSize); if (fIsActive) fPlugin->activate(); } + + return true; } void setSampleRate(const double sampleRate, const bool doCallback = false) diff --git a/dpf/distrho/src/DistrhoPluginJACK.cpp b/dpf/distrho/src/DistrhoPluginJACK.cpp index 5a76f4c..5965191 100644 --- a/dpf/distrho/src/DistrhoPluginJACK.cpp +++ b/dpf/distrho/src/DistrhoPluginJACK.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -44,7 +44,9 @@ # undef Point #endif -#ifndef DISTRHO_OS_WINDOWS +#ifdef DISTRHO_OS_WINDOWS +# include +#else # include # include #endif @@ -86,6 +88,10 @@ static const writeMidiFunc writeMidiCallback = nullptr; static const requestParameterValueChangeFunc requestParameterValueChangeCallback = nullptr; #endif +#ifdef DPF_USING_LD_LINUX_WEBVIEW +int dpf_webview_start(int argc, char* argv[]); +#endif + // ----------------------------------------------------------------------- static volatile bool gCloseSignalReceived = false; @@ -234,20 +240,26 @@ public: std::fflush(stdout); -#if DISTRHO_PLUGIN_HAS_UI + #if DISTRHO_PLUGIN_HAS_UI + String title(fPlugin.getMaker()); + + if (title.isNotEmpty()) + title += ": "; + if (const char* const name = jackbridge_get_client_name(fClient)) - fUI.setWindowTitle(name); + title += name; else - fUI.setWindowTitle(fPlugin.getName()); + title += fPlugin.getName(); + fUI.setWindowTitle(title); fUI.exec(this); -#else + #else while (! gCloseSignalReceived) d_sleep(1); // unused (void)winId; -#endif + #endif } ~PluginJack() @@ -955,6 +967,11 @@ int main(int argc, char* argv[]) { USE_NAMESPACE_DISTRHO; + #ifdef DISTRHO_OS_WINDOWS + OleInitialize(nullptr); + CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + #endif + initSignalHandler(); #ifndef STATIC_BUILD @@ -965,15 +982,11 @@ int main(int argc, char* argv[]) String tmpPath(getBinaryFilename()); tmpPath.truncate(tmpPath.rfind(DISTRHO_OS_SEP)); #if defined(DISTRHO_OS_MAC) - if (tmpPath.endsWith("/MacOS")) + if (tmpPath.endsWith("/Contents/MacOS")) { - tmpPath.truncate(tmpPath.rfind('/')); - if (tmpPath.endsWith("/Contents")) - { - tmpPath.truncate(tmpPath.rfind('/')); - bundlePath = tmpPath; - d_nextBundlePath = bundlePath.buffer(); - } + tmpPath.truncate(tmpPath.length() - 15); + bundlePath = tmpPath; + d_nextBundlePath = bundlePath.buffer(); } #else #ifdef DISTRHO_OS_WINDOWS @@ -990,6 +1003,11 @@ int main(int argc, char* argv[]) } #endif + #ifdef DPF_USING_LD_LINUX_WEBVIEW + if (argc >= 2 && std::strcmp(argv[1], "dpf-ld-linux-webview") == 0) + return dpf_webview_start(argc, argv); + #endif + if (argc == 2 && std::strcmp(argv[1], "selftest") == 0) { #ifdef DPF_RUNTIME_TESTING @@ -1027,6 +1045,10 @@ int main(int argc, char* argv[]) } hasConsole = true; + + // tell windows to output console output as utf-8 + SetConsoleCP(CP_UTF8); + SetConsoleOutputCP(CP_UTF8); } #endif @@ -1155,6 +1177,11 @@ int main(int argc, char* argv[]) } #endif + #ifdef DISTRHO_OS_WINDOWS + CoUninitialize(); + OleUninitialize(); + #endif + return 0; } diff --git a/dpf/distrho/src/DistrhoPluginLV2.cpp b/dpf/distrho/src/DistrhoPluginLV2.cpp index 26608c8..d279195 100644 --- a/dpf/distrho/src/DistrhoPluginLV2.cpp +++ b/dpf/distrho/src/DistrhoPluginLV2.cpp @@ -459,7 +459,7 @@ public: if (fLastPositionData.barBeat >= 0.0f) { - const double rest = std::fmod(fLastPositionData.barBeat, 1.0f); + const double rest = std::fmod(fLastPositionData.barBeat, 1.0); fTimePosition.bbt.beat = std::round(fLastPositionData.barBeat - rest + 1.0); fTimePosition.bbt.tick = rest * fTimePosition.bbt.ticksPerBeat; } @@ -590,7 +590,7 @@ public: const LV2_Atom* property = nullptr; const LV2_Atom* value = nullptr; - lv2_atom_object_get(object, fURIDs.patchProperty, &property, fURIDs.patchValue, &value, nullptr); + lv2_atom_object_get(object, fURIDs.patchProperty, &property, fURIDs.patchValue, &value, 0); if (property != nullptr && property->type == fURIDs.atomURID && value != nullptr && (value->type == fURIDs.atomPath || value->type == fURIDs.atomString)) @@ -1122,7 +1122,7 @@ public: const LV2_Atom* property = nullptr; const LV2_Atom* value = nullptr; - lv2_atom_object_get(object, fURIDs.patchProperty, &property, fURIDs.patchValue, &value, nullptr); + lv2_atom_object_get(object, fURIDs.patchProperty, &property, fURIDs.patchValue, &value, 0); DISTRHO_SAFE_ASSERT_RETURN(property != nullptr, LV2_WORKER_ERR_UNKNOWN); DISTRHO_SAFE_ASSERT_RETURN(property->type == fURIDs.atomURID, LV2_WORKER_ERR_UNKNOWN); DISTRHO_SAFE_ASSERT_RETURN(value != nullptr, LV2_WORKER_ERR_UNKNOWN); @@ -1353,38 +1353,26 @@ private: // save this key if necessary if (fPlugin.wantStateKey(key)) - updateInternalState(key, newValue, false); + { + const String dkey(key); + fStateMap[dkey] = newValue; + } } bool updateState(const char* const key, const char* const newValue) { fPlugin.setState(key, newValue); - return updateInternalState(key, newValue, true); - } - bool updateInternalState(const char* const key, const char* const newValue, const bool sendToUI) - { // key must already exist - for (StringToStringMap::iterator it=fStateMap.begin(), ite=fStateMap.end(); it != ite; ++it) + for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) { - const String& dkey(it->first); - - if (dkey == key) + if (fPlugin.getStateKey(i) == key) { - it->second = newValue; + const String dkey(key); + fStateMap[dkey] = newValue; - if (sendToUI) - { - for (uint32_t i=0, count=fPlugin.getStateCount(); i < count; ++i) - { - if (fPlugin.getStateKey(i) == key) - { - if ((fPlugin.getStateHints(i) & kStateIsOnlyForDSP) == 0x0) - fNeededUiSends[i] = true; - break; - } - } - } + if ((fPlugin.getStateHints(i) & kStateIsOnlyForDSP) == 0x0) + fNeededUiSends[i] = true; return true; } diff --git a/dpf/distrho/src/DistrhoPluginLV2export.cpp b/dpf/distrho/src/DistrhoPluginLV2export.cpp index 916b86f..ba3cb19 100644 --- a/dpf/distrho/src/DistrhoPluginLV2export.cpp +++ b/dpf/distrho/src/DistrhoPluginLV2export.cpp @@ -74,12 +74,12 @@ # define DISTRHO_PLUGIN_USES_CUSTOM_MODGUI 0 #endif -#if DISTRHO_PLUGIN_HAS_EMBED_UI -# if DISTRHO_OS_HAIKU +#if DISTRHO_PLUGIN_HAS_UI +# if defined(DISTRHO_OS_HAIKU) # define DISTRHO_LV2_UI_TYPE "BeUI" -# elif DISTRHO_OS_MAC +# elif defined(DISTRHO_OS_MAC) # define DISTRHO_LV2_UI_TYPE "CocoaUI" -# elif DISTRHO_OS_WINDOWS +# elif defined(DISTRHO_OS_WINDOWS) # define DISTRHO_LV2_UI_TYPE "WindowsUI" # else # define DISTRHO_LV2_UI_TYPE "X11UI" @@ -155,7 +155,7 @@ static constexpr const char* const lv2ManifestUiExtensionData[] = { }; static constexpr const char* const lv2ManifestUiOptionalFeatures[] = { - #if DISTRHO_PLUGIN_HAS_EMBED_UI + #if DISTRHO_PLUGIN_HAS_UI #if !DISTRHO_UI_USER_RESIZABLE "ui:noUserResize", #endif @@ -1003,8 +1003,10 @@ void lv2_generate_ttl(const char* const basename) { const String license(plugin.getLicense()); + if (license.isEmpty()) + {} // Using URL as license - if (license.contains("://")) + else if (license.contains("://")) { pluginString += " doap:license <" + license + "> ;\n\n"; } @@ -1253,7 +1255,7 @@ void lv2_generate_ttl(const char* const basename) std::cout << " done!" << std::endl; } - #if DISTRHO_PLUGIN_USES_MODGUI && DISTRHO_PLUGIN_HAS_EMBED_UI && !DISTRHO_PLUGIN_USES_CUSTOM_MODGUI + #if DISTRHO_PLUGIN_USES_MODGUI && !DISTRHO_PLUGIN_USES_CUSTOM_MODGUI { std::cout << "Writing modgui.ttl..."; std::cout.flush(); std::fstream modguiFile("modgui.ttl", std::ios::out); @@ -1548,7 +1550,7 @@ void lv2_generate_ttl(const char* const basename) stylesheetFile.close(); std::cout << " done!" << std::endl; } - #endif // DISTRHO_PLUGIN_USES_MODGUI && DISTRHO_PLUGIN_HAS_EMBED_UI && !DISTRHO_PLUGIN_USES_CUSTOM_MODGUI + #endif // DISTRHO_PLUGIN_USES_MODGUI && !DISTRHO_PLUGIN_USES_CUSTOM_MODGUI // --------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginVST.hpp b/dpf/distrho/src/DistrhoPluginVST.hpp index 9164b41..2d488ca 100644 --- a/dpf/distrho/src/DistrhoPluginVST.hpp +++ b/dpf/distrho/src/DistrhoPluginVST.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -23,17 +23,7 @@ #include #include -#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EMBED_UI -# undef DISTRHO_PLUGIN_HAS_UI -# define DISTRHO_PLUGIN_HAS_UI 0 -#endif - -#if DISTRHO_PLUGIN_HAS_UI && ! defined(HAVE_DGL) && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# undef DISTRHO_PLUGIN_HAS_UI -# define DISTRHO_PLUGIN_HAS_UI 0 -#endif - -#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#if DISTRHO_PLUGIN_HAS_UI # include "Base.hpp" #endif @@ -45,7 +35,7 @@ // -------------------------------------------------------------------------------------------------------------------- -#ifdef DISTRHO_PROPER_CPP11_SUPPORT +#if defined(DISTRHO_PROPER_CPP11_SUPPORT) || defined(DISTRHO_OS_MAC) # include #else // quick and dirty std::atomic replacement for the things we need @@ -224,7 +214,7 @@ void snprintf_u32_utf16(int16_t* const dst, const uint32_t value, const size_t s return snprintf_utf16_t(dst, value, "%u", size); } -#if DISTRHO_PLUGIN_HAS_UI && ! DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#if DISTRHO_PLUGIN_HAS_UI // -------------------------------------------------------------------------------------------------------------------- // translate a vstgui-based key character and code to matching values used by DPF diff --git a/dpf/distrho/src/DistrhoPluginVST2.cpp b/dpf/distrho/src/DistrhoPluginVST2.cpp index 9559d4c..b9b9926 100644 --- a/dpf/distrho/src/DistrhoPluginVST2.cpp +++ b/dpf/distrho/src/DistrhoPluginVST2.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -178,10 +178,8 @@ public: nullptr, // TODO file request d_nextBundlePath, plugin->getInstancePointer(), - scaleFactor) - #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI - , fKeyboardModifiers(0) - #endif + scaleFactor), + fKeyboardModifiers(0) #if DISTRHO_PLUGIN_WANT_MIDI_INPUT , fNotesRingBuffer() #endif @@ -242,7 +240,6 @@ public: } #endif - #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI int handlePluginKeyEvent(const bool down, const int32_t index, const intptr_t value) { d_stdout("handlePluginKeyEvent %i %i %li\n", down, index, (long int)value); @@ -281,7 +278,6 @@ public: value >= 0 ? static_cast(value) : 0, fKeyboardModifiers) ? 1 : 0; } - #endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI // ---------------------------------------------------------------------------------------------------------------- @@ -347,9 +343,7 @@ private: // Plugin UI UIExporter fUI; - #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI uint16_t fKeyboardModifiers; - #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT RingBufferControl fNotesRingBuffer; #endif @@ -429,7 +423,7 @@ public: memset(parameterChecks, 0, sizeof(bool)*parameterCount); } - #if DISTRHO_OS_MAC + #ifdef DISTRHO_OS_MAC #ifdef __LP64__ fUsingNsView = true; #else @@ -602,10 +596,10 @@ public: { double scaleFactor = fLastScaleFactor; #if defined(DISTRHO_UI_DEFAULT_WIDTH) && defined(DISTRHO_UI_DEFAULT_HEIGHT) - fVstRect.right = DISTRHO_UI_DEFAULT_WIDTH; - fVstRect.bottom = DISTRHO_UI_DEFAULT_HEIGHT; if (d_isZero(scaleFactor)) scaleFactor = 1.0; + fVstRect.right = DISTRHO_UI_DEFAULT_WIDTH * scaleFactor; + fVstRect.bottom = DISTRHO_UI_DEFAULT_HEIGHT * scaleFactor; #else UIExporter tmpUI(nullptr, 0, fPlugin.getSampleRate(), nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, d_nextBundlePath, @@ -627,7 +621,7 @@ public: delete fVstUI; // for hosts which don't pair create/destroy calls (Minihost Modular) fVstUI = nullptr; - #if DISTRHO_OS_MAC + #ifdef DISTRHO_OS_MAC if (! fUsingNsView) { d_stderr("Host doesn't support hasCockosViewAsConfig, cannot use UI"); @@ -678,7 +672,6 @@ public: fVstUI->idle(); break; - #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI case VST_EFFECT_OPCODE_3B: // key down if (fVstUI != nullptr) return fVstUI->handlePluginKeyEvent(true, index, value); @@ -688,7 +681,6 @@ public: if (fVstUI != nullptr) return fVstUI->handlePluginKeyEvent(false, index, value); break; - #endif #endif // DISTRHO_PLUGIN_HAS_UI #if DISTRHO_PLUGIN_WANT_STATE @@ -917,7 +909,7 @@ public: case VST_EFFECT_OPCODE_SUPPORTS: if (const char* const canDo = (const char*)ptr) { - #if DISTRHO_OS_MAC && DISTRHO_PLUGIN_HAS_UI + #if defined(DISTRHO_OS_MAC) && DISTRHO_PLUGIN_HAS_UI if (std::strcmp(canDo, "hasCockosViewAsConfig") == 0) { fUsingNsView = true; @@ -1084,7 +1076,7 @@ public: if (fMidiEventCount != kMaxMidiEvents && fNotesRingBuffer.isDataAvailableForReading()) { uint8_t midiData[3]; - uint32_t frame = fMidiEventCount != 0 ? fMidiEvents[fMidiEventCount-1].frame : 0; + const uint32_t frame = fMidiEventCount != 0 ? fMidiEvents[fMidiEventCount - 1].frame : 0; while (fNotesRingBuffer.isDataAvailableForReading()) { @@ -1140,7 +1132,7 @@ private: UIVst* fVstUI; vst_rect fVstRect; float fLastScaleFactor; - #if DISTRHO_OS_MAC + #ifdef DISTRHO_OS_MAC bool fUsingNsView; #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT @@ -1286,22 +1278,11 @@ private: fPlugin.setState(key, value); // check if we want to save this key - if (! fPlugin.wantStateKey(key)) - return; - - // check if key already exists - for (StringMap::iterator it=fStateMap.begin(), ite=fStateMap.end(); it != ite; ++it) + if (fPlugin.wantStateKey(key)) { - const String& dkey(it->first); - - if (dkey == key) - { - it->second = value; - return; - } + const String dkey(key); + fStateMap[dkey] = value; } - - d_stderr("Failed to find plugin state with key \"%s\"", key); } #endif }; @@ -1607,11 +1588,7 @@ static void VST_FUNCTION_INTERFACE vst_processReplacingCallback(vst_effect* cons END_NAMESPACE_DISTRHO DISTRHO_PLUGIN_EXPORT -#if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WASM) || defined(DISTRHO_OS_WINDOWS) -const vst_effect* VSTPluginMain(vst_host_callback audioMaster); -#else -const vst_effect* VSTPluginMain(vst_host_callback audioMaster) asm ("main"); -#endif +const vst_effect* VSTPluginMain(vst_host_callback); DISTRHO_PLUGIN_EXPORT const vst_effect* VSTPluginMain(const vst_host_callback audioMaster) @@ -1735,4 +1712,19 @@ const vst_effect* VSTPluginMain(const vst_host_callback audioMaster) return effect; } +#if !(defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WASM) || defined(DISTRHO_OS_WINDOWS) || DISTRHO_UI_WEB_VIEW) +DISTRHO_PLUGIN_EXPORT +const vst_effect* VSTPluginMainCompat(vst_host_callback) asm ("main"); + +DISTRHO_PLUGIN_EXPORT +const vst_effect* VSTPluginMainCompat(const vst_host_callback audioMaster) +{ + // protect main symbol against running as executable + if (reinterpret_cast(audioMaster) < 0xff) + return nullptr; + + return VSTPluginMain(audioMaster); +} +#endif + // -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoPluginVST3.cpp b/dpf/distrho/src/DistrhoPluginVST3.cpp index 467b136..c1f2ae4 100644 --- a/dpf/distrho/src/DistrhoPluginVST3.cpp +++ b/dpf/distrho/src/DistrhoPluginVST3.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -92,11 +92,17 @@ static constexpr const uint32_t dpf_id_view = d_cconst('v', 'i', 'e', 'w'); // -------------------------------------------------------------------------------------------------------------------- // plugin specific uids (values are filled in during plugin init) -static dpf_tuid dpf_tuid_class = { dpf_id_entry, dpf_id_clas, 0, 0 }; -static dpf_tuid dpf_tuid_component = { dpf_id_entry, dpf_id_comp, 0, 0 }; -static dpf_tuid dpf_tuid_controller = { dpf_id_entry, dpf_id_ctrl, 0, 0 }; -static dpf_tuid dpf_tuid_processor = { dpf_id_entry, dpf_id_proc, 0, 0 }; -static dpf_tuid dpf_tuid_view = { dpf_id_entry, dpf_id_view, 0, 0 }; +#if defined(DISTRHO_PLUGIN_BRAND_ID) && !defined(DPF_VST3_DONT_USE_BRAND_ID) +static constexpr const uint32_t dpf_id_brand = d_cconst(STRINGIFY(DISTRHO_PLUGIN_BRAND_ID)); +#else +static constexpr const uint32_t dpf_id_brand = 0; +#endif + +static dpf_tuid dpf_tuid_class = { dpf_id_entry, dpf_id_clas, 0, dpf_id_brand }; +static dpf_tuid dpf_tuid_component = { dpf_id_entry, dpf_id_comp, 0, dpf_id_brand }; +static dpf_tuid dpf_tuid_controller = { dpf_id_entry, dpf_id_ctrl, 0, dpf_id_brand }; +static dpf_tuid dpf_tuid_processor = { dpf_id_entry, dpf_id_proc, 0, dpf_id_brand }; +static dpf_tuid dpf_tuid_view = { dpf_id_entry, dpf_id_view, 0, dpf_id_brand }; // -------------------------------------------------------------------------------------------------------------------- // Utility functions @@ -1180,7 +1186,7 @@ public: // Update current state for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { - const String& key = cit->first; + const String& key(cit->first); fStateMap[key] = fPlugin.getStateValue(key); } #endif @@ -1204,8 +1210,8 @@ public: for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { - const String& key = cit->first; - const String& value = cit->second; + const String& key(cit->first); + const String& value(cit->second); // join key and value String tmpStr; @@ -1419,7 +1425,7 @@ public: fTimePosition.bbt.valid = true; fTimePosition.bbt.bar = static_cast(ppqPos) / ppqPerBar + 1; - fTimePosition.bbt.beat = d_roundToIntPositive(barBeats - rest) + 1; + fTimePosition.bbt.beat = static_cast(barBeats - rest) + 1; fTimePosition.bbt.tick = rest * fTimePosition.bbt.ticksPerBeat; fTimePosition.bbt.beatsPerBar = ctx->time_sig_numerator; fTimePosition.bbt.beatType = ctx->time_sig_denom; @@ -1968,24 +1974,24 @@ public: { #if DPF_VST3_USES_SEPARATE_CONTROLLER case kVst3InternalParameterBufferSize: - return std::max(0.0, std::min(1.0, plain / DPF_VST3_MAX_BUFFER_SIZE)); + return std::max(0.0, std::min(1.0, plain / DPF_VST3_MAX_BUFFER_SIZE)); case kVst3InternalParameterSampleRate: - return std::max(0.0, std::min(1.0, plain / DPF_VST3_MAX_SAMPLE_RATE)); + return std::max(0.0, std::min(1.0, plain / DPF_VST3_MAX_SAMPLE_RATE)); #endif #if DISTRHO_PLUGIN_WANT_LATENCY case kVst3InternalParameterLatency: - return std::max(0.0, std::min(1.0, plain / DPF_VST3_MAX_LATENCY)); + return std::max(0.0, std::min(1.0, plain / DPF_VST3_MAX_LATENCY)); #endif #if DISTRHO_PLUGIN_WANT_PROGRAMS case kVst3InternalParameterProgram: - return std::max(0.0, std::min(1.0, plain / fProgramCountMinusOne)); + return std::max(0.0, std::min(1.0, plain / fProgramCountMinusOne)); #endif } #endif #if DISTRHO_PLUGIN_WANT_MIDI_INPUT if (rindex < kVst3InternalParameterCount) - return std::max(0.0, std::min(1.0, plain / 127)); + return std::max(0.0, std::min(1.0, plain / 127)); #endif const uint32_t index = static_cast(rindex - kVst3InternalParameterCount); @@ -2194,7 +2200,7 @@ public: // Update current state from plugin side for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { - const String& key = cit->first; + const String& key(cit->first); fStateMap[key] = fPlugin.getStateValue(key); } #endif @@ -2203,8 +2209,8 @@ public: // Set state for (StringMap::const_iterator cit=fStateMap.begin(), cite=fStateMap.end(); cit != cite; ++cit) { - const String& key = cit->first; - const String& value = cit->second; + const String& key(cit->first); + const String& value(cit->second); sendStateSetToUI(key, value); } @@ -2399,20 +2405,8 @@ public: // save this key as needed if (fPlugin.wantStateKey(key)) { - for (StringMap::iterator it=fStateMap.begin(), ite=fStateMap.end(); it != ite; ++it) - { - const String& dkey(it->first); - - if (dkey == key) - { - it->second = value; - std::free(key16); - std::free(value16); - return V3_OK; - } - } - - d_stderr("Failed to find plugin state with key \"%s\"", key); + const String dkey(key); + fStateMap[dkey] = value; } std::free(key16); @@ -3103,7 +3097,7 @@ private: event.midi_cc_out.cc_number = data[1]; event.midi_cc_out.value = data[2]; if (midiEvent.size == 4) - event.midi_cc_out.value2 = midiEvent.size == 4; + event.midi_cc_out.value2 = data[3]; break; /* TODO how do we deal with program changes?? case 0xC0: @@ -4577,8 +4571,13 @@ static const char* getPluginCategories() categories = DISTRHO_PLUGIN_VST3_CATEGORIES; #elif DISTRHO_PLUGIN_IS_SYNTH categories = "Instrument"; + #else + categories = "Fx"; #endif firstInit = false; + + // An empty category is considered invalid in Cubase + DISTRHO_SAFE_ASSERT(categories.isNotEmpty()); } return categories.buffer(); @@ -4864,7 +4863,7 @@ struct dpf_factory : v3_plugin_factory_cpp { DISTRHO_NAMESPACE::strncpy_utf16(info->name, sPlugin->getName(), ARRAY_SIZE(info->name)); DISTRHO_NAMESPACE::strncpy_utf16(info->vendor, sPlugin->getMaker(), ARRAY_SIZE(info->vendor)); DISTRHO_NAMESPACE::strncpy_utf16(info->version, getPluginVersion(), ARRAY_SIZE(info->version)); - DISTRHO_NAMESPACE::strncpy_utf16(info->sdk_version, "Travesty 3.7.4", ARRAY_SIZE(info->sdk_version)); + DISTRHO_NAMESPACE::strncpy_utf16(info->sdk_version, "VST 3.7.4", ARRAY_SIZE(info->sdk_version)); if (idx == 0) { diff --git a/dpf/distrho/src/DistrhoUI.cpp b/dpf/distrho/src/DistrhoUI.cpp index 5f0527c..a4e8112 100644 --- a/dpf/distrho/src/DistrhoUI.cpp +++ b/dpf/distrho/src/DistrhoUI.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2023 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -15,8 +15,8 @@ */ #include "DistrhoDetails.hpp" +#include "DistrhoPluginUtils.hpp" #include "src/DistrhoPluginChecks.h" -#include "src/DistrhoDefines.h" #include @@ -26,6 +26,15 @@ # include #endif +#if defined(DISTRHO_OS_WINDOWS) +# include +# include +#elif defined(HAVE_X11) +# define Window X11Window +# include +# undef Window +#endif + #if DISTRHO_UI_FILE_BROWSER && !defined(DISTRHO_OS_MAC) # define DISTRHO_PUGL_NAMESPACE_MACRO_HELPER(NS, SEP, FUNCTION) NS ## SEP ## FUNCTION # define DISTRHO_PUGL_NAMESPACE_MACRO(NS, FUNCTION) DISTRHO_PUGL_NAMESPACE_MACRO_HELPER(NS, _, FUNCTION) @@ -50,35 +59,29 @@ START_NAMESPACE_DISTRHO # include "../extra/FileBrowserDialogImpl.hpp" END_NAMESPACE_DISTRHO +# define Window X11Window # include "../extra/FileBrowserDialogImpl.cpp" +# undef Window #endif -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# if defined(DISTRHO_OS_WINDOWS) -# include -# include -# elif defined(HAVE_X11) -# include -# endif -#else -# include "src/TopLevelWidgetPrivateData.hpp" -# include "src/WindowPrivateData.hpp" +#if DISTRHO_UI_WEB_VIEW && !defined(DISTRHO_OS_MAC) +# define DISTRHO_WEB_VIEW_HPP_INCLUDED +# define WEB_VIEW_NAMESPACE DISTRHO_NAMESPACE +# define WEB_VIEW_DISTRHO_NAMESPACE +START_NAMESPACE_DISTRHO +# include "../extra/WebViewImpl.hpp" +END_NAMESPACE_DISTRHO +# define Window X11Window +# include "../extra/WebViewImpl.cpp" +# undef Window #endif +#include "src/TopLevelWidgetPrivateData.hpp" +#include "src/WindowPrivateData.hpp" #include "DistrhoUIPrivateData.hpp" START_NAMESPACE_DISTRHO -/* ------------------------------------------------------------------------------------------------------------ - * Static data, see DistrhoUIInternal.hpp */ - -const char* g_nextBundlePath = nullptr; -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -uintptr_t g_nextWindowId = 0; -double g_nextScaleFactor = 1.0; -#endif - -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI /* ------------------------------------------------------------------------------------------------------------ * get global scale factor */ @@ -91,23 +94,23 @@ static double getDesktopScaleFactor(const uintptr_t parentWindowHandle) if (const char* const scale = getenv("DPF_SCALE_FACTOR")) return std::max(1.0, std::atof(scale)); -#if defined(DISTRHO_OS_WINDOWS) + #if defined(DISTRHO_OS_WINDOWS) if (const HMODULE Shcore = LoadLibraryA("Shcore.dll")) { typedef HRESULT(WINAPI* PFN_GetProcessDpiAwareness)(HANDLE, DWORD*); typedef HRESULT(WINAPI* PFN_GetScaleFactorForMonitor)(HMONITOR, DWORD*); -# if defined(__GNUC__) && (__GNUC__ >= 9) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wcast-function-type" -# endif + #if defined(__GNUC__) && (__GNUC__ >= 9) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-function-type" + #endif const PFN_GetProcessDpiAwareness GetProcessDpiAwareness = (PFN_GetProcessDpiAwareness)GetProcAddress(Shcore, "GetProcessDpiAwareness"); const PFN_GetScaleFactorForMonitor GetScaleFactorForMonitor = (PFN_GetScaleFactorForMonitor)GetProcAddress(Shcore, "GetScaleFactorForMonitor"); -# if defined(__GNUC__) && (__GNUC__ >= 9) -# pragma GCC diagnostic pop -# endif + #if defined(__GNUC__) && (__GNUC__ >= 9) + #pragma GCC diagnostic pop + #endif DWORD dpiAware = 0; DWORD scaleFactor = 100; @@ -123,7 +126,7 @@ static double getDesktopScaleFactor(const uintptr_t parentWindowHandle) FreeLibrary(Shcore); return static_cast(scaleFactor) / 100.0; } -#elif defined(HAVE_X11) + #elif defined(HAVE_X11) ::Display* const display = XOpenDisplay(nullptr); DISTRHO_SAFE_ASSERT_RETURN(display != nullptr, 1.0); @@ -154,7 +157,7 @@ static double getDesktopScaleFactor(const uintptr_t parentWindowHandle) XCloseDisplay(display); return dpi / 96; -#endif + #endif return 1.0; @@ -163,80 +166,167 @@ static double getDesktopScaleFactor(const uintptr_t parentWindowHandle) } #endif // !DISTRHO_OS_MAC -#endif - /* ------------------------------------------------------------------------------------------------------------ * UI::PrivateData special handling */ UI::PrivateData* UI::PrivateData::s_nextPrivateData = nullptr; -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -ExternalWindow::PrivateData -#else -PluginWindow& -#endif -UI::PrivateData::createNextWindow(UI* const ui, uint width, uint height, const bool adjustForScaleFactor) +PluginWindow& UI::PrivateData::createNextWindow(UI* const ui, uint width, uint height) { - UI::PrivateData* const pData = s_nextPrivateData; - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - const double scaleFactor = d_isNotZero(pData->scaleFactor) ? pData->scaleFactor : getDesktopScaleFactor(pData->winId); + UI::PrivateData* const uiData = s_nextPrivateData; + const double scaleFactor = d_isNotZero(uiData->scaleFactor) ? uiData->scaleFactor : getDesktopScaleFactor(uiData->winId); - if (adjustForScaleFactor && d_isNotZero(scaleFactor) && d_isNotEqual(scaleFactor, 1.0)) + if (d_isNotZero(scaleFactor) && d_isNotEqual(scaleFactor, 1.0)) { width *= scaleFactor; height *= scaleFactor; } - pData->window = new PluginWindow(ui, pData->app); - ExternalWindow::PrivateData ewData; - ewData.parentWindowHandle = pData->winId; - ewData.width = width; - ewData.height = height; - ewData.scaleFactor = scaleFactor; - ewData.title = DISTRHO_PLUGIN_NAME; - ewData.isStandalone = DISTRHO_UI_IS_STANDALONE; - return ewData; - #else - const double scaleFactor = pData->scaleFactor; + d_stdout("createNextWindow %u %u %f", width, height, scaleFactor); + uiData->window = new PluginWindow(ui, uiData->app, uiData->winId, width, height, scaleFactor); - if (adjustForScaleFactor && d_isNotZero(scaleFactor) && d_isNotEqual(scaleFactor, 1.0)) + if (uiData->callbacksPtr != nullptr) { - width *= scaleFactor; - height *= scaleFactor; - } + #if DISTRHO_UI_USE_WEB_VIEW + String path; + if (uiData->bundlePath != nullptr) + { + path = getResourcePath(uiData->bundlePath); + } + else + { + path = getBinaryFilename(); + path.truncate(path.rfind(DISTRHO_OS_SEP)); + path += "/resources"; + } - pData->window = new PluginWindow(ui, pData->app, pData->winId, width, height, scaleFactor); + // TODO convert win32 paths to web + // TODO encode paths (e.g. %20 for space) + WebViewOptions opts; + opts.initialJS = "" +"editParameter = function(index, started){ postMessage('editparam '+index+' '+(started ? 1 : 0)) };" +"setParameterValue = function(index, value){ postMessage('setparam '+index+' '+value) };" +#if DISTRHO_PLUGIN_WANT_STATE +"setState = function(key, value){ postMessage('setstate '+key+' '+value) };" +"requestStateFile = function(key){ postMessage('reqstatefile '+key) };" +#endif +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT +"sendNote = function(channel, note, velocity){ postMessage('sendnote '+channel+' '+note+' '+velocity) };" +#endif + ; + opts.callback = webViewMessageCallback; + opts.callbackPtr = uiData; + uiData->webview = webViewCreate("file://" + path + "/index.html", uiData->winId, width, height, scaleFactor, opts); + #endif + } // If there are no callbacks, this is most likely a temporary window, so ignore idle callbacks - if (pData->callbacksPtr == nullptr) - pData->window->setIgnoreIdleCallbacks(); + else + { + uiData->window->setIgnoreIdleCallbacks(); + } + + return uiData->window.getObject(); +} - return pData->window.getObject(); +#if DISTRHO_UI_USE_WEB_VIEW +void UI::PrivateData::webViewMessageCallback(void* const arg, char* const msg) +{ + UI::PrivateData* const uiData = static_cast(arg); + + if (std::strncmp(msg, "setparam ", 9) == 0) + { + const char* const strindex = msg + 9; + char* strvalue = nullptr; + const ulong index = std::strtoul(strindex, &strvalue, 10); + DISTRHO_SAFE_ASSERT_RETURN(strvalue != nullptr && strindex != strvalue,); + + float value; + { + const ScopedSafeLocale ssl; + value = std::atof(strvalue); + } + uiData->setParamCallback(index + uiData->parameterOffset, value); + return; + } + + if (std::strncmp(msg, "editparam ", 10) == 0) + { + const char* const strindex = msg + 10; + char* strvalue = nullptr; + const ulong index = std::strtoul(strindex, &strvalue, 10); + DISTRHO_SAFE_ASSERT_RETURN(strvalue != nullptr && strindex != strvalue,); + + const bool started = strvalue[0] != '0'; + uiData->editParamCallback(index + uiData->parameterOffset, started); + return; + } + + #if DISTRHO_PLUGIN_WANT_STATE + if (std::strncmp(msg, "setstate ", 9) == 0) + { + char* const key = msg + 9; + char* const sep = std::strchr(key, ' '); + DISTRHO_SAFE_ASSERT_RETURN(sep != nullptr,); + *sep = 0; + char* const value = sep + 1; + + uiData->setStateCallback(key, value); + return; + } + + if (std::strncmp(msg, "reqstatefile ", 13) == 0) + { + const char* const key = msg + 13; + uiData->fileRequestCallback(key); + return; + } #endif + + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + if (std::strncmp(msg, "sendnote ", 9) == 0) + { + const char* const strchannel = msg + 9; + char* strnote = nullptr; + char* strvelocity = nullptr; + char* end = nullptr; + + const ulong channel = std::strtoul(strchannel, &strnote, 10); + DISTRHO_SAFE_ASSERT_RETURN(strnote != nullptr && strchannel != strnote,); + + const ulong note = std::strtoul(strnote, &strvelocity, 10); + DISTRHO_SAFE_ASSERT_RETURN(strvelocity != nullptr && strchannel != strvelocity,); + + const ulong velocity = std::strtoul(strvelocity, &end, 10); + DISTRHO_SAFE_ASSERT_RETURN(end != nullptr && strvelocity != end,); + + uiData->sendNoteCallback(channel, note, velocity); + return; + } + #endif + + d_stderr("UI received unknown message '%s'", msg); } +#endif /* ------------------------------------------------------------------------------------------------------------ * UI */ UI::UI(const uint width, const uint height, const bool automaticallyScaleAndSetAsMinimumSize) : UIWidget(UI::PrivateData::createNextWindow(this, + // width #ifdef DISTRHO_UI_DEFAULT_WIDTH width == 0 ? DISTRHO_UI_DEFAULT_WIDTH : #endif width, + // height #ifdef DISTRHO_UI_DEFAULT_HEIGHT height == 0 ? DISTRHO_UI_DEFAULT_HEIGHT : #endif - height, - #ifdef DISTRHO_UI_DEFAULT_WIDTH - width == 0 - #else - false - #endif + height )), uiData(UI::PrivateData::s_nextPrivateData) { -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI if (width != 0 && height != 0) { Widget::setSize(width, height); @@ -250,14 +340,14 @@ UI::UI(const uint width, const uint height, const bool automaticallyScaleAndSetA Widget::setSize(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT); } #endif -#else - // unused - (void)automaticallyScaleAndSetAsMinimumSize; -#endif } UI::~UI() { + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + webViewDestroy(uiData->webview); + #endif } /* ------------------------------------------------------------------------------------------------------------ @@ -265,15 +355,11 @@ UI::~UI() bool UI::isResizable() const noexcept { -#if DISTRHO_UI_USER_RESIZABLE -# if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - return true; -# else + #if DISTRHO_UI_USER_RESIZABLE return uiData->window->isResizable(); -# endif -#else + #else return false; -#endif + #endif } uint UI::getBackgroundColor() const noexcept @@ -344,33 +430,94 @@ void* UI::getPluginInstancePointer() const noexcept } #endif -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI /* ------------------------------------------------------------------------------------------------------------ - * External UI helpers (static calls) */ + * DSP/Plugin Callbacks */ -const char* UI::getNextBundlePath() noexcept +void UI::parameterChanged(const uint32_t index, const float value) { - return g_nextBundlePath; + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + { + char msg[128]; + { + const ScopedSafeLocale ssl; + std::snprintf(msg, sizeof(msg) - 1, + "typeof(parameterChanged) === 'function' && parameterChanged(%u,%f)", index, value); + } + webViewEvaluateJS(uiData->webview, msg); + } + #else + // unused + (void)index; + (void)value; + #endif } -double UI::getNextScaleFactor() noexcept +#if DISTRHO_PLUGIN_WANT_PROGRAMS +void UI::programLoaded(const uint32_t index) { - return g_nextScaleFactor; + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + { + char msg[128]; + std::snprintf(msg, sizeof(msg) - 1, + "typeof(programLoaded) === 'function' && programLoaded(%u)", index); + webViewEvaluateJS(uiData->webview, msg); + } + #else + // unused + (void)index; + #endif } +#endif -# if DISTRHO_PLUGIN_HAS_EMBED_UI -uintptr_t UI::getNextWindowId() noexcept +#if DISTRHO_PLUGIN_WANT_STATE +void UI::stateChanged(const char* const key, const char* const value) { - return g_nextWindowId; + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + { + const size_t keylen = std::strlen(key); + const size_t valuelen = std::strlen(value); + const size_t msglen = keylen + valuelen + 60; + if (char* const msg = static_cast(std::malloc(msglen))) + { + // TODO escape \\' + std::snprintf(msg, msglen - 1, + "typeof(stateChanged) === 'function' && stateChanged('%s','%s')", key, value); + msg[msglen - 1] = '\0'; + webViewEvaluateJS(uiData->webview, msg); + std::free(msg); + } + } + #else + // unused + (void)key; + (void)value; + #endif } -# endif -#endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#endif /* ------------------------------------------------------------------------------------------------------------ * DSP/Plugin Callbacks (optional) */ -void UI::sampleRateChanged(double) +void UI::sampleRateChanged(const double sampleRate) { + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + { + char msg[128]; + { + const ScopedSafeLocale ssl; + std::snprintf(msg, sizeof(msg) - 1, + "typeof(sampleRateChanged) === 'function' && sampleRateChanged(%f)", sampleRate); + } + webViewEvaluateJS(uiData->webview, msg); + } + #else + // unused + (void)sampleRate; + #endif } /* ------------------------------------------------------------------------------------------------------------ @@ -380,7 +527,6 @@ void UI::uiScaleFactorChanged(double) { } -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI std::vector UI::getClipboardDataOfferTypes() { return uiData->window->getClipboardDataOfferTypes(); @@ -409,7 +555,6 @@ void UI::uiReshape(const uint width, const uint height) // NOTE this must be the same as Window::onReshape pData->fallbackOnResize(width, height); } -#endif // !DISTRHO_PLUGIN_HAS_EXTERNAL_UI #if DISTRHO_UI_FILE_BROWSER void UI::uiFileBrowserSelected(const char*) @@ -420,19 +565,11 @@ void UI::uiFileBrowserSelected(const char*) /* ------------------------------------------------------------------------------------------------------------ * UI Resize Handling, internal */ -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -void UI::sizeChanged(const uint width, const uint height) -{ - UIWidget::sizeChanged(width, height); - - uiData->setSizeCallback(width, height); -} -#else void UI::onResize(const ResizeEvent& ev) { UIWidget::onResize(ev); - #if !(defined(DISTRHO_PLUGIN_TARGET_VST3) || defined(DISTRHO_PLUGIN_TARGET_CLAP)) + #if ! DISTRHO_UI_USES_SIZE_REQUEST if (uiData->initializing) return; @@ -442,10 +579,10 @@ void UI::onResize(const ResizeEvent& ev) #endif } -// NOTE: only used for VST3 and CLAP +// NOTE: only used for CLAP and VST3 void UI::requestSizeChange(const uint width, const uint height) { - #if defined(DISTRHO_PLUGIN_TARGET_VST3) || defined(DISTRHO_PLUGIN_TARGET_CLAP) + #if DISTRHO_UI_USES_SIZE_REQUEST if (uiData->initializing) uiData->window->setSizeFromHost(width, height); else @@ -456,7 +593,6 @@ void UI::requestSizeChange(const uint width, const uint height) (void)height; #endif } -#endif // ----------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoUIAU.mm b/dpf/distrho/src/DistrhoUIAU.mm new file mode 100644 index 0000000..c0987f5 --- /dev/null +++ b/dpf/distrho/src/DistrhoUIAU.mm @@ -0,0 +1,502 @@ +/* + * DISTRHO Plugin Framework (DPF) + * Copyright (C) 2012-2024 Filipe Coelho + * + * Permission to use, copy, modify, and/or distribute this software for any purpose with + * or without fee is hereby granted, provided that the above copyright notice and this + * permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER + * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include "DistrhoUIInternal.hpp" + +#define Point AudioUnitPoint +#define Size AudioUnitSize + +#include +#include +#include + +#undef Point +#undef Size + +#ifndef DISTRHO_PLUGIN_BRAND_ID +# error DISTRHO_PLUGIN_BRAND_ID undefined! +#endif + +#ifndef DISTRHO_PLUGIN_UNIQUE_ID +# error DISTRHO_PLUGIN_UNIQUE_ID undefined! +#endif + +START_NAMESPACE_DISTRHO + +// -------------------------------------------------------------------------------------------------------------------- + +#if ! DISTRHO_PLUGIN_WANT_STATE +static constexpr const setStateFunc setStateCallback = nullptr; +#endif +#if ! DISTRHO_PLUGIN_WANT_MIDI_INPUT +static constexpr const sendNoteFunc sendNoteCallback = nullptr; +#endif + +// unsupported in AU +static constexpr const fileRequestFunc fileRequestCallback = nullptr; + +// -------------------------------------------------------------------------------------------------------------------- +// Static data, see DistrhoPlugin.cpp + +extern double d_nextSampleRate; +extern const char* d_nextBundlePath; + +// -------------------------------------------------------------------------------------------------------------------- + +class DPF_UI_AU +{ +public: + DPF_UI_AU(const AudioUnit component, + NSView* const view, + const double sampleRate, + void* const instancePointer) + : fComponent(component), + fParentView(view), + fTimerRef(nullptr), + fUI(this, + reinterpret_cast(view), + sampleRate, + editParameterCallback, + setParameterCallback, + setStateCallback, + sendNoteCallback, + setSizeCallback, + fileRequestCallback, + d_nextBundlePath, + instancePointer) + { + #if DISTRHO_PLUGIN_WANT_STATE + // create state keys + { + CFArrayRef keysRef = nullptr; + UInt32 dataSize = sizeof(CFArrayRef); + if (AudioUnitGetProperty(fComponent, 'DPFl', kAudioUnitScope_Global, 0, &keysRef, &dataSize) == noErr + && dataSize == sizeof(CFArrayRef)) + { + const CFIndex numStates = CFArrayGetCount(keysRef); + char* key = nullptr; + CFIndex keyLen = -1; + + fStateKeys.resize(numStates); + + for (CFIndex i=0; i(CFArrayGetValueAtIndex(keysRef, i)); + DISTRHO_SAFE_ASSERT_BREAK(CFGetTypeID(keyRef) == CFStringGetTypeID()); + + const CFIndex keyRefLen = CFStringGetLength(keyRef); + if (keyLen < keyRefLen) + { + keyLen = keyRefLen; + key = static_cast(std::realloc(key, keyLen + 1)); + } + DISTRHO_SAFE_ASSERT_BREAK(CFStringGetCString(keyRef, key, keyLen + 1, kCFStringEncodingASCII)); + + fStateKeys[i] = key; + } + + CFRelease(keysRef); + std::free(key); + } + } + #endif + + // setup idle timer + constexpr const CFTimeInterval interval = 60 * 0.0001; + + CFRunLoopTimerContext context = {}; + context.info = this; + fTimerRef = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0, + _idleCallback, &context); + DISTRHO_SAFE_ASSERT_RETURN(fTimerRef != nullptr,); + + CFRunLoopAddTimer(CFRunLoopGetCurrent(), fTimerRef, kCFRunLoopCommonModes); + + AudioUnitAddPropertyListener(fComponent, kAudioUnitProperty_SampleRate, auPropertyChangedCallback, this); + AudioUnitAddPropertyListener(fComponent, 'DPFp', auPropertyChangedCallback, this); + #if DISTRHO_PLUGIN_WANT_PROGRAMS + AudioUnitAddPropertyListener(fComponent, 'DPFo', auPropertyChangedCallback, this); + #endif + #if DISTRHO_PLUGIN_WANT_STATE + AudioUnitAddPropertyListener(fComponent, 'DPFs', auPropertyChangedCallback, this); + #endif + } + + ~DPF_UI_AU() + { + AudioUnitRemovePropertyListenerWithUserData(fComponent, kAudioUnitProperty_SampleRate, auPropertyChangedCallback, this); + AudioUnitRemovePropertyListenerWithUserData(fComponent, 'DPFp', auPropertyChangedCallback, this); + #if DISTRHO_PLUGIN_WANT_PROGRAMS + AudioUnitRemovePropertyListenerWithUserData(fComponent, 'DPFo', auPropertyChangedCallback, this); + #endif + #if DISTRHO_PLUGIN_WANT_STATE + AudioUnitRemovePropertyListenerWithUserData(fComponent, 'DPFs', auPropertyChangedCallback, this); + #endif + + if (fTimerRef != nullptr) + { + CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), fTimerRef, kCFRunLoopCommonModes); + CFRelease(fTimerRef); + } + } + + void postSetup() + { + const double scaleFactor = fUI.getScaleFactor(); + const NSSize size = NSMakeSize(fUI.getWidth() / scaleFactor, fUI.getHeight() / scaleFactor); + + [fParentView setFrameSize:size]; + [fParentView setHidden:NO]; + } + +private: + const AudioUnit fComponent; + NSView* const fParentView; + CFRunLoopTimerRef fTimerRef; + + UIExporter fUI; + + #if DISTRHO_PLUGIN_WANT_STATE + std::vector fStateKeys; + #endif + + // ---------------------------------------------------------------------------------------------------------------- + // Idle setup + + void idleCallback() + { + fUI.idleFromNativeIdle(); + } + + static void _idleCallback(CFRunLoopTimerRef, void* const info) + { + static_cast(info)->idleCallback(); + } + + // ---------------------------------------------------------------------------------------------------------------- + // AU callbacks + + void auSampleRateChanged(const AudioUnitScope scope) + { + Float64 sampleRate = 0; + UInt32 dataSize = sizeof(Float64); + if (AudioUnitGetProperty(fComponent, kAudioUnitProperty_SampleRate, scope, 0, &sampleRate, &dataSize) == noErr + && dataSize == sizeof(Float64)) + { + fUI.setSampleRate(sampleRate, true); + } + } + + void auParameterChanged(const AudioUnitElement elem) + { + float value = 0; + UInt32 dataSize = sizeof(float); + if (AudioUnitGetProperty(fComponent, 'DPFp', kAudioUnitScope_Global, elem, &value, &dataSize) == noErr + && dataSize == sizeof(float)) + { + fUI.parameterChanged(elem, value); + } + } + + #if DISTRHO_PLUGIN_WANT_PROGRAMS + void auProgramChanged() + { + uint32_t program = 0; + UInt32 dataSize = sizeof(uint32_t); + if (AudioUnitGetProperty(fComponent, 'DPFo', kAudioUnitScope_Global, 0, &program, &dataSize) == noErr + && dataSize == sizeof(uint32_t)) + { + fUI.programLoaded(program); + } + } + #endif + + #if DISTRHO_PLUGIN_WANT_STATE + void auStateChanged(const AudioUnitElement elem) + { + DISTRHO_SAFE_ASSERT_RETURN(elem < fStateKeys.size(),); + + CFStringRef valueRef = nullptr; + UInt32 dataSize = sizeof(valueRef); + if (AudioUnitGetProperty(fComponent, 'DPFs', kAudioUnitScope_Global, elem, &valueRef, &dataSize) == noErr + && dataSize == sizeof(CFStringRef) + && valueRef != nullptr + && CFGetTypeID(valueRef) == CFStringGetTypeID()) + { + const CFIndex valueLen = CFStringGetLength(valueRef); + char* const value = static_cast(std::malloc(valueLen + 1)); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(CFStringGetCString(valueRef, value, valueLen + 1, kCFStringEncodingUTF8),); + + fUI.stateChanged(fStateKeys[elem], value); + + CFRelease(valueRef); + std::free(value); + } + } + #endif + + static void auPropertyChangedCallback(void* const userData, + const AudioUnit component, + const AudioUnitPropertyID prop, + const AudioUnitScope scope, + const AudioUnitElement elem) + { + DPF_UI_AU* const self = static_cast(userData); + + DISTRHO_SAFE_ASSERT_RETURN(self != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(self->fComponent == component,); + + switch (prop) + { + case kAudioUnitProperty_SampleRate: + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Input || scope == kAudioUnitScope_Output, scope,); + self->auSampleRateChanged(scope); + break; + case 'DPFp': + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Global, scope,); + self->auParameterChanged(elem); + break; + #if DISTRHO_PLUGIN_WANT_PROGRAMS + case 'DPFo': + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Global, scope,); + self->auProgramChanged(); + break; + #endif + #if DISTRHO_PLUGIN_WANT_STATE + case 'DPFs': + DISTRHO_SAFE_ASSERT_UINT_RETURN(scope == kAudioUnitScope_Global, scope,); + self->auStateChanged(elem); + break; + #endif + } + } + + // ---------------------------------------------------------------------------------------------------------------- + // DPF callbacks + + void editParameter(const uint32_t rindex, const bool started) const + { + const uint8_t flag = started ? 1 : 2; + AudioUnitSetProperty(fComponent, 'DPFe', kAudioUnitScope_Global, rindex, &flag, sizeof(uint8_t)); + + if (! started) + { + const uint8_t cancel = 0; + AudioUnitSetProperty(fComponent, 'DPFe', kAudioUnitScope_Global, rindex, &cancel, sizeof(uint8_t)); + } + } + + static void editParameterCallback(void* const ptr, const uint32_t rindex, const bool started) + { + static_cast(ptr)->editParameter(rindex, started); + } + + // ---------------------------------------------------------------------------------------------------------------- + + void setParameter(const uint32_t rindex, const float value) + { + AudioUnitSetProperty(fComponent, 'DPFp', kAudioUnitScope_Global, rindex, &value, sizeof(float)); + } + + static void setParameterCallback(void* const ptr, const uint32_t rindex, const float value) + { + static_cast(ptr)->setParameter(rindex, value); + } + + // ---------------------------------------------------------------------------------------------------------------- + + #if DISTRHO_PLUGIN_WANT_STATE + void setState(const char* const key, const char* const value) + { + const std::vector::iterator it = std::find(fStateKeys.begin(), fStateKeys.end(), key); + DISTRHO_SAFE_ASSERT_RETURN(it != fStateKeys.end(),); + + if (const CFStringRef valueRef = CFStringCreateWithCString(nullptr, value, kCFStringEncodingUTF8)) + { + const uint32_t index = it - fStateKeys.begin(); + AudioUnitSetProperty(fComponent, 'DPFs', kAudioUnitScope_Global, index, &valueRef, sizeof(CFStringRef)); + CFRelease(valueRef); + } + } + + static void setStateCallback(void* const ptr, const char* const key, const char* const value) + { + static_cast(ptr)->setState(key, value); + } + #endif + + // ---------------------------------------------------------------------------------------------------------------- + + #if DISTRHO_PLUGIN_WANT_MIDI_INPUT + void sendNote(const uint8_t channel, const uint8_t note, const uint8_t velocity) + { + const uint8_t data[3] = { static_cast((velocity != 0 ? 0x90 : 0x80) | channel), note, velocity }; + AudioUnitSetProperty(fComponent, 'DPFn', kAudioUnitScope_Global, 0, data, sizeof(data)); + + const uint8_t cancel[3] = { 0, 0, 0 }; + AudioUnitSetProperty(fComponent, 'DPFn', kAudioUnitScope_Global, 0, cancel, sizeof(cancel)); + } + + static void sendNoteCallback(void* const ptr, const uint8_t channel, const uint8_t note, const uint8_t velocity) + { + static_cast(ptr)->sendNote(channel, note, velocity); + } + #endif + + // ---------------------------------------------------------------------------------------------------------------- + + void setSize(const uint width, const uint height) + { + const double scaleFactor = fUI.getScaleFactor(); + const NSSize size = NSMakeSize(width / scaleFactor, height / scaleFactor); + + [fParentView setFrameSize:size]; + } + + static void setSizeCallback(void* const ptr, const uint width, const uint height) + { + static_cast(ptr)->setSize(width, height); + } +}; + +// -------------------------------------------------------------------------------------------------------------------- + +END_NAMESPACE_DISTRHO + +// -------------------------------------------------------------------------------------------------------------------- + +#define MACRO_NAME2(a, b, c, d, e, f) a ## b ## c ## d ## e ## f +#define MACRO_NAME(a, b, c, d, e, f) MACRO_NAME2(a, b, c, d, e, f) + +// -------------------------------------------------------------------------------------------------------------------- + +#define COCOA_VIEW_CLASS_NAME \ + MACRO_NAME(CocoaView_, DISTRHO_PLUGIN_AU_TYPE, _, DISTRHO_PLUGIN_UNIQUE_ID, _, DISTRHO_PLUGIN_BRAND_ID) + +@interface COCOA_VIEW_CLASS_NAME : NSView +{ +@public + DPF_UI_AU* ui; +} +@end + +@implementation COCOA_VIEW_CLASS_NAME + +- (id) initWithPreferredSize:(NSSize)size +{ + ui = nullptr; + self = [super initWithFrame: NSMakeRect(0, 0, size.width, size.height)]; + [self setHidden:YES]; + return self; +} + +- (BOOL) acceptsFirstResponder +{ + return YES; +} + +- (void) dealloc +{ + delete ui; + ui = nullptr; + + [super dealloc]; +} + +- (BOOL) isFlipped +{ + return YES; +} + +@end + +// -------------------------------------------------------------------------------------------------------------------- + +#define COCOA_UI_CLASS_NAME \ + MACRO_NAME(CocoaAUView_, DISTRHO_PLUGIN_AU_TYPE, _, DISTRHO_PLUGIN_UNIQUE_ID, _, DISTRHO_PLUGIN_BRAND_ID) + +@interface COCOA_UI_CLASS_NAME : NSObject +{ + COCOA_VIEW_CLASS_NAME* view; +} +@end + +@implementation COCOA_UI_CLASS_NAME + +- (NSString*) description +{ + return @DISTRHO_PLUGIN_NAME; +} + +- (unsigned) interfaceVersion +{ + return 0; +} + +- (NSView*) uiViewForAudioUnit:(AudioUnit)component withSize:(NSSize)inPreferredSize +{ + Float64 sampleRate = d_nextSampleRate; + void* instancePointer = nullptr; + AudioUnitScope scope; + UInt32 dataSize; + + // fetch direct access pointer + #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS + dataSize = sizeof(void*); + AudioUnitGetProperty(component, 'DPFa', kAudioUnitScope_Global, 0, &instancePointer, &dataSize); + #endif + + // fetch current sample rate + #if DISTRHO_PLUGIN_NUM_INPUTS != 0 + dataSize = sizeof(Float64); + AudioUnitGetProperty(component, kAudioUnitProperty_SampleRate, kAudioUnitScope_Input, 0, &sampleRate, &dataSize); + #elif DISTRHO_PLUGIN_NUM_OUTPUTS != 0 + dataSize = sizeof(Float64); + AudioUnitGetProperty(component, kAudioUnitProperty_SampleRate, kAudioUnitScope_Output, 0, &sampleRate, &dataSize); + #endif + + #if defined(DISTRHO_UI_DEFAULT_WIDTH) && defined(DISTRHO_UI_DEFAULT_HEIGHT) + inPreferredSize = NSMakeSize(DISTRHO_UI_DEFAULT_WIDTH, DISTRHO_UI_DEFAULT_HEIGHT); + #endif + + // create view + view = [[[COCOA_VIEW_CLASS_NAME alloc] initWithPreferredSize:inPreferredSize] autorelease]; + view->ui = new DPF_UI_AU(component, view, sampleRate, instancePointer); + view->ui->postSetup(); + + // request data from DSP side + { + const uint16_t magic = 1337; + AudioUnitSetProperty(component, 'DPFi', kAudioUnitScope_Global, 0, &magic, sizeof(uint16_t)); + const uint16_t cancel = 0; + AudioUnitSetProperty(component, 'DPFi', kAudioUnitScope_Global, 0, &cancel, sizeof(uint16_t)); + } + + return view; + + // maybe unused + (void)scope; +} + +@end + +// -------------------------------------------------------------------------------------------------------------------- + +#undef MACRO_NAME +#undef MACRO_NAME2 + +// -------------------------------------------------------------------------------------------------------------------- diff --git a/dpf/distrho/src/DistrhoUIDSSI.cpp b/dpf/distrho/src/DistrhoUIDSSI.cpp index 6b96a8e..17caf13 100644 --- a/dpf/distrho/src/DistrhoUIDSSI.cpp +++ b/dpf/distrho/src/DistrhoUIDSSI.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2021 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -26,11 +26,24 @@ START_NAMESPACE_DISTRHO +// -------------------------------------------------------------------------------------------------------------------- + #if ! DISTRHO_PLUGIN_WANT_MIDI_INPUT static constexpr const sendNoteFunc sendNoteCallback = nullptr; #endif -// ----------------------------------------------------------------------- +// unused in DSSI, we only use external and standalone UIs +static constexpr const setSizeFunc setSizeCallback = nullptr; + +// unsupported in DSSI +static constexpr const fileRequestFunc fileRequestCallback = nullptr; + +#ifdef DPF_USING_LD_LINUX_WEBVIEW +int dpf_webview_start(int argc, char* argv[]); +#endif + +// -------------------------------------------------------------------------------------------------------------------- + struct OscData { lo_address addr; @@ -98,7 +111,7 @@ class UIDssi : public DGL_NAMESPACE::IdleCallback public: UIDssi(const OscData& oscData, const char* const uiTitle, const double sampleRate) : fUI(this, 0, sampleRate, nullptr, - setParameterCallback, setStateCallback, sendNoteCallback, nullptr, nullptr), + setParameterCallback, setStateCallback, sendNoteCallback, setSizeCallback, fileRequestCallback), fHostClosed(false), fOscData(oscData) { @@ -378,6 +391,11 @@ int main(int argc, char* argv[]) { USE_NAMESPACE_DISTRHO + #ifdef DPF_USING_LD_LINUX_WEBVIEW + if (argc >= 2 && std::strcmp(argv[1], "dpf-ld-linux-webview") == 0) + return dpf_webview_start(argc - 1, argv + 1); + #endif + // dummy test mode if (argc == 1) { @@ -395,7 +413,7 @@ int main(int argc, char* argv[]) if (argc != 5) { - fprintf(stderr, "Usage: %s \n", argv[0]); + d_stderr("Usage: %s ", argv[0]); return 1; } diff --git a/dpf/distrho/src/DistrhoUIInternal.hpp b/dpf/distrho/src/DistrhoUIInternal.hpp index 00239a8..e9ae05c 100644 --- a/dpf/distrho/src/DistrhoUIInternal.hpp +++ b/dpf/distrho/src/DistrhoUIInternal.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -21,15 +21,6 @@ START_NAMESPACE_DISTRHO -// ----------------------------------------------------------------------- -// Static data, see DistrhoUI.cpp - -extern const char* g_nextBundlePath; -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -extern uintptr_t g_nextWindowId; -extern double g_nextScaleFactor; -#endif - // ----------------------------------------------------------------------- // UI exporter class @@ -79,41 +70,23 @@ public: uiData->setSizeCallbackFunc = setSizeCall; uiData->fileRequestCallbackFunc = fileRequestCall; - g_nextBundlePath = bundlePath; -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - g_nextWindowId = winId; - g_nextScaleFactor = scaleFactor; -#endif UI::PrivateData::s_nextPrivateData = uiData; UI* const uiPtr = createUI(); - g_nextBundlePath = nullptr; -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - g_nextWindowId = 0; - g_nextScaleFactor = 0.0; -#else // enter context called in the PluginWindow constructor, see DistrhoUIPrivateData.hpp uiData->window->leaveContext(); -#endif UI::PrivateData::s_nextPrivateData = nullptr; DISTRHO_SAFE_ASSERT_RETURN(uiPtr != nullptr,); ui = uiPtr; uiData->initializing = false; - -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI - // unused - (void)bundlePath; -#endif } ~UIExporter() { quit(); -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI uiData->window->enterContextForDeletion(); -#endif delete ui; delete uiData; } @@ -137,13 +110,9 @@ public: bool getGeometryConstraints(uint& minimumWidth, uint& minimumHeight, bool& keepAspectRatio) const noexcept { -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - uiData->window->getGeometryConstraints(minimumWidth, minimumHeight, keepAspectRatio); -#else const DGL_NAMESPACE::Size size(uiData->window->getGeometryConstraints(keepAspectRatio)); minimumWidth = size.getWidth(); minimumHeight = size.getHeight(); -#endif return true; } @@ -225,13 +194,20 @@ public: uiData->window->focus(); uiData->app.addIdleCallback(cb); uiData->app.exec(); + uiData->app.removeIdleCallback(cb); } void exec_idle() { DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr, ); + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + webViewIdle(uiData->webview); + #endif + ui->uiIdle(); + uiData->app.repaintIfNeeeded(); } void showAndFocus() @@ -246,7 +222,14 @@ public: DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr, false); uiData->app.idle(); + + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + webViewIdle(uiData->webview); + #endif + ui->uiIdle(); + uiData->app.repaintIfNeeeded(); return ! uiData->app.isQuitting(); } @@ -261,25 +244,29 @@ public: uiData->app.quit(); } - #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI void repaint() { uiData->window->repaint(); } - #endif // ------------------------------------------------------------------- - #if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS) + #if defined(DISTRHO_OS_MAC) || defined(DISTRHO_OS_WINDOWS) void idleFromNativeIdle() { DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); uiData->app.triggerIdleCallbacks(); + + #if DISTRHO_UI_USE_WEB_VIEW + if (uiData->webview != nullptr) + webViewIdle(uiData->webview); + #endif + ui->uiIdle(); + uiData->app.repaintIfNeeeded(); } - #if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI void addIdleCallbackForNativeIdle(IdleCallback* const cb, const uint timerFrequencyInMs) { uiData->window->addIdleCallback(cb, timerFrequencyInMs); @@ -290,28 +277,18 @@ public: uiData->window->removeIdleCallback(cb); } #endif - #endif // ------------------------------------------------------------------- void setWindowOffset(const int x, const int y) { - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - // TODO - (void)x; (void)y; - #else uiData->window->setOffset(x, y); - #endif } - #if defined(DISTRHO_PLUGIN_TARGET_VST3) || defined(DISTRHO_PLUGIN_TARGET_CLAP) + #if DISTRHO_UI_USES_SIZE_REQUEST void setWindowSizeFromHost(const uint width, const uint height) { - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - ui->setSize(width, height); - #else uiData->window->setSizeFromHost(width, height); - #endif } #endif @@ -322,11 +299,7 @@ public: void setWindowTransientWinId(const uintptr_t transientParentWindowHandle) { -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - ui->setTransientWindowId(transientParentWindowHandle); -#else uiData->window->setTransientParent(transientParentWindowHandle); -#endif } bool setWindowVisible(const bool yesNo) @@ -336,7 +309,6 @@ public: return ! uiData->app.isQuitting(); } -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI bool handlePluginKeyboardVST(const bool press, const bool special, const uint keychar, const uint keycode, const uint16_t mods) { using namespace DGL_NAMESPACE; @@ -369,7 +341,6 @@ public: return ret; } -#endif // ------------------------------------------------------------------- @@ -380,14 +351,12 @@ public: ui->uiScaleFactorChanged(scaleFactor); } -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI void notifyFocusChanged(const bool focus) { DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); ui->uiFocus(focus, DGL_NAMESPACE::kCrossingNormal); } -#endif void setSampleRate(const double sampleRate, const bool doCallback = false) { diff --git a/dpf/distrho/src/DistrhoUILV2.cpp b/dpf/distrho/src/DistrhoUILV2.cpp index 390412e..d7b0af6 100644 --- a/dpf/distrho/src/DistrhoUILV2.cpp +++ b/dpf/distrho/src/DistrhoUILV2.cpp @@ -49,6 +49,9 @@ static constexpr const setStateFunc setStateCallback = nullptr; static constexpr const sendNoteFunc sendNoteCallback = nullptr; #endif +// unwanted in LV2, resize extension is deprecated and hosts can do it without extensions +static constexpr const setSizeFunc setSizeCallback = nullptr; + // ----------------------------------------------------------------------- template @@ -96,7 +99,7 @@ public: setParameterCallback, setStateCallback, sendNoteCallback, - nullptr, // resize is very messy, hosts can do it without extensions + setSizeCallback, fileRequestCallback, bundlePath, dspPtr, scaleFactor, bgColor, fgColor, appClassName) { diff --git a/dpf/distrho/src/DistrhoUIPrivateData.hpp b/dpf/distrho/src/DistrhoUIPrivateData.hpp index 2dffd15..bcbcbfc 100644 --- a/dpf/distrho/src/DistrhoUIPrivateData.hpp +++ b/dpf/distrho/src/DistrhoUIPrivateData.hpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -23,33 +23,38 @@ # include "DistrhoPluginVST.hpp" #endif -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# include "../extra/Sleep.hpp" -// TODO import and use file browser here -#else -# include "../../dgl/src/ApplicationPrivateData.hpp" -# include "../../dgl/src/WindowPrivateData.hpp" -# include "../../dgl/src/pugl.hpp" -#endif +#include "../../dgl/src/ApplicationPrivateData.hpp" +#include "../../dgl/src/WindowPrivateData.hpp" +#include "../../dgl/src/pugl.hpp" -#if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER # include # include #endif +#if DISTRHO_UI_USE_WEB_VIEW +# include "extra/WebView.hpp" +#endif + #if defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_DSSI) # define DISTRHO_UI_IS_STANDALONE 1 #else # define DISTRHO_UI_IS_STANDALONE 0 #endif -#if defined(DISTRHO_PLUGIN_TARGET_VST3) || defined(DISTRHO_PLUGIN_TARGET_CLAP) -# define DISTRHO_UI_USES_SIZE_REQUEST true +#if defined(DISTRHO_PLUGIN_TARGET_AU) +# define DISTRHO_UI_USES_SCHEDULED_REPAINTS 1 #else -# define DISTRHO_UI_USES_SIZE_REQUEST false +# define DISTRHO_UI_USES_SCHEDULED_REPAINTS 0 #endif -#ifdef DISTRHO_PLUGIN_TARGET_VST2 +#if defined(DISTRHO_PLUGIN_TARGET_CLAP) || defined(DISTRHO_PLUGIN_TARGET_VST3) +# define DISTRHO_UI_USES_SIZE_REQUEST 1 +#else +# define DISTRHO_UI_USES_SIZE_REQUEST 0 +#endif + +#if defined(DISTRHO_PLUGIN_TARGET_AU) || defined(DISTRHO_PLUGIN_TARGET_VST2) # undef DISTRHO_UI_USER_RESIZABLE # define DISTRHO_UI_USER_RESIZABLE 0 #endif @@ -59,54 +64,6 @@ START_NAMESPACE_DISTRHO // ----------------------------------------------------------------------- // Plugin Application, will set class name based on plugin details -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -struct PluginApplication -{ - DGL_NAMESPACE::IdleCallback* idleCallback; - UI* ui; - - explicit PluginApplication(const char*) - : idleCallback(nullptr), - ui(nullptr) {} - - void addIdleCallback(DGL_NAMESPACE::IdleCallback* const cb) - { - DISTRHO_SAFE_ASSERT_RETURN(cb != nullptr,); - DISTRHO_SAFE_ASSERT_RETURN(idleCallback == nullptr,); - - idleCallback = cb; - } - - bool isQuitting() const noexcept - { - return ui->isQuitting(); - } - - bool isStandalone() const noexcept - { - return DISTRHO_UI_IS_STANDALONE; - } - - void exec() - { - while (ui->isRunning()) - { - d_msleep(30); - idleCallback->idleCallback(); - } - - if (! ui->isQuitting()) - ui->close(); - } - - // these are not needed - void idle() {} - void quit() {} - void triggerIdleCallbacks() {} - - DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginApplication) -}; -#else class PluginApplication : public DGL_NAMESPACE::Application { public: @@ -137,49 +94,17 @@ public: pData->triggerIdleCallbacks(); } + void repaintIfNeeeded() + { + pData->repaintIfNeeeded(); + } + DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginApplication) }; -#endif // ----------------------------------------------------------------------- // Plugin Window, will pass some Window events to UI -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -class PluginWindow -{ - UI* const ui; - -public: - explicit PluginWindow(UI* const uiPtr, PluginApplication& app) - : ui(uiPtr) - { - app.ui = ui; - } - - // fetch cached data - uint getWidth() const noexcept { return ui->pData.width; } - uint getHeight() const noexcept { return ui->pData.height; } - double getScaleFactor() const noexcept { return ui->pData.scaleFactor; } - - // direct mappings - void close() { ui->close(); } - void focus() { ui->focus(); } - void show() { ui->show(); } - bool isResizable() const noexcept { return ui->isResizable(); } - bool isVisible() const noexcept { return ui->isVisible(); } - void setTitle(const char* const title) { ui->setTitle(title); } - void setVisible(const bool visible) { ui->setVisible(visible); } - uintptr_t getNativeWindowHandle() const noexcept { return ui->getNativeWindowHandle(); } - void getGeometryConstraints(uint& minimumWidth, uint& minimumHeight, bool& keepAspectRatio) const noexcept - { - minimumWidth = ui->pData.minWidth; - minimumHeight = ui->pData.minHeight; - keepAspectRatio = ui->pData.keepAspectRatio; - } - - DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginWindow) -}; -#else // DISTRHO_PLUGIN_HAS_EXTERNAL_UI class PluginWindow : public DGL_NAMESPACE::Window { UI* const ui; @@ -194,7 +119,10 @@ public: const uint height, const double scaleFactor) : Window(app, parentWindowHandle, width, height, scaleFactor, - DISTRHO_UI_USER_RESIZABLE, DISTRHO_UI_USES_SIZE_REQUEST, false), + DISTRHO_UI_USER_RESIZABLE, + DISTRHO_UI_USES_SCHEDULED_REPAINTS, + DISTRHO_UI_USES_SIZE_REQUEST, + false), ui(uiPtr), initializing(true), receivedReshapeDuringInit(false) @@ -219,11 +147,15 @@ public: if (pData->view == nullptr) return; - if (receivedReshapeDuringInit) - ui->uiReshape(getWidth(), getHeight()); - initializing = false; puglBackendLeave(pData->view); + + if (receivedReshapeDuringInit) + { + puglBackendEnter(pData->view); + ui->uiReshape(getWidth(), getHeight()); + puglBackendLeave(pData->view); + } } // used for temporary windows (VST/CLAP get size without active/visible view) @@ -239,7 +171,7 @@ public: puglBackendEnter(pData->view); } - #if defined(DISTRHO_PLUGIN_TARGET_VST3) || defined(DISTRHO_PLUGIN_TARGET_CLAP) + #if DISTRHO_UI_USES_SIZE_REQUEST void setSizeFromHost(const uint width, const uint height) { puglSetSizeAndDefault(pData->view, width, height); @@ -295,13 +227,12 @@ protected: ui->uiScaleFactorChanged(scaleFactor); } -# if DISTRHO_UI_FILE_BROWSER + #if DISTRHO_UI_FILE_BROWSER void onFileSelected(const char* filename) override; -# endif + #endif DISTRHO_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(PluginWindow) }; -#endif // DISTRHO_PLUGIN_HAS_EXTERNAL_UI // ----------------------------------------------------------------------- // UI callbacks @@ -320,6 +251,9 @@ struct UI::PrivateData { // DGL PluginApplication app; ScopedPointer window; + #if DISTRHO_UI_USE_WEB_VIEW + WebViewHandle webview; + #endif // DSP double sampleRate; @@ -331,7 +265,7 @@ struct UI::PrivateData { uint fgColor; double scaleFactor; uintptr_t winId; - #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER char* uiStateFileKeyRequest; std::map lastUsedDirnames; #endif @@ -352,6 +286,9 @@ struct UI::PrivateData { PrivateData(const char* const appClassName) noexcept : app(appClassName), window(nullptr), + #if DISTRHO_UI_USE_WEB_VIEW + webview(nullptr), + #endif sampleRate(0), parameterOffset(0), dspPtr(nullptr), @@ -359,7 +296,7 @@ struct UI::PrivateData { fgColor(0xffffffff), scaleFactor(1.0), winId(0), - #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER uiStateFileKeyRequest(nullptr), #endif bundlePath(nullptr), @@ -395,7 +332,7 @@ struct UI::PrivateData { ~PrivateData() noexcept { - #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER std::free(uiStateFileKeyRequest); #endif std::free(bundlePath); @@ -415,6 +352,9 @@ struct UI::PrivateData { void setStateCallback(const char* const key, const char* const value) { + DISTRHO_SAFE_ASSERT_RETURN(key != nullptr && key[0] != '\0',); + DISTRHO_SAFE_ASSERT_RETURN(value != nullptr,); + if (setStateCallbackFunc != nullptr) setStateCallbackFunc(callbacksPtr, key, value); } @@ -427,19 +367,20 @@ struct UI::PrivateData { void setSizeCallback(const uint width, const uint height) { + DISTRHO_SAFE_ASSERT_RETURN(width != 0 && height != 0,); + if (setSizeCallbackFunc != nullptr) setSizeCallbackFunc(callbacksPtr, width, height); } // implemented below, after PluginWindow - bool fileRequestCallback(const char* const key); + bool fileRequestCallback(const char* key); static UI::PrivateData* s_nextPrivateData; -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - static ExternalWindow::PrivateData createNextWindow(UI* ui, uint width, uint height, bool adjustForScaleFactor); -#else - static PluginWindow& createNextWindow(UI* ui, uint width, uint height, bool adjustForScaleFactor); -#endif + static PluginWindow& createNextWindow(UI* ui, uint width, uint height); + #if DISTRHO_UI_USE_WEB_VIEW + static void webViewMessageCallback(void* arg, char* msg); + #endif }; // ----------------------------------------------------------------------- @@ -450,7 +391,7 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) if (fileRequestCallbackFunc != nullptr) return fileRequestCallbackFunc(callbacksPtr, key); - #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER std::free(uiStateFileKeyRequest); uiStateFileKeyRequest = strdup(key); DISTRHO_SAFE_ASSERT_RETURN(uiStateFileKeyRequest != nullptr, false); @@ -472,7 +413,7 @@ inline bool UI::PrivateData::fileRequestCallback(const char* const key) // ----------------------------------------------------------------------- // PluginWindow onFileSelected that require UI::PrivateData definitions -#if DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI +#if DISTRHO_UI_FILE_BROWSER inline void PluginWindow::onFileSelected(const char* const filename) { DISTRHO_SAFE_ASSERT_RETURN(ui != nullptr,); @@ -480,7 +421,7 @@ inline void PluginWindow::onFileSelected(const char* const filename) if (initializing) return; - #if DISTRHO_PLUGIN_WANT_STATE && DISTRHO_UI_FILE_BROWSER && !DISTRHO_PLUGIN_HAS_EXTERNAL_UI + #if DISTRHO_PLUGIN_WANT_STATE if (char* const key = ui->uiData->uiStateFileKeyRequest) { ui->uiData->uiStateFileKeyRequest = nullptr; diff --git a/dpf/distrho/src/DistrhoUIVST3.cpp b/dpf/distrho/src/DistrhoUIVST3.cpp index 5d9e6d7..0ecf675 100644 --- a/dpf/distrho/src/DistrhoUIVST3.cpp +++ b/dpf/distrho/src/DistrhoUIVST3.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -21,15 +21,6 @@ #include "travesty/host.h" #include "travesty/view.h" -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI -# if defined(DISTRHO_OS_MAC) -# include -# elif defined(DISTRHO_OS_WINDOWS) -# include -# define DPF_VST3_WIN32_TIMER_ID 1 -# endif -#endif - /* TODO items: * - mousewheel event * - file request? @@ -92,10 +83,10 @@ static void applyGeometryConstraints(const uint minimumWidth, { // fix width if (reqRatio > ratio) - rect->right = static_cast(rect->bottom * ratio + 0.5); + rect->right = d_roundToIntPositive(rect->bottom * ratio); // fix height else - rect->bottom = static_cast(static_cast(rect->right) / ratio + 0.5); + rect->bottom = d_roundToIntPositive(static_cast(rect->right) / ratio); } } @@ -110,7 +101,6 @@ static void applyGeometryConstraints(const uint minimumWidth, // -------------------------------------------------------------------------------------------------------------------- -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI static uint translateVST3Modifiers(const int64_t modifiers) noexcept { using namespace DGL_NAMESPACE; @@ -134,115 +124,9 @@ static uint translateVST3Modifiers(const int64_t modifiers) noexcept return dglmods; } -#endif - -// -------------------------------------------------------------------------------------------------------------------- -#if DISTRHO_PLUGIN_HAS_EXTERNAL_UI && !DPF_VST3_USING_HOST_RUN_LOOP /** - * Helper class for getting a native idle timer via native APIs. - */ -class NativeIdleHelper -{ -public: - NativeIdleHelper(IdleCallback* const callback) - : fCallback(callback), - #ifdef DISTRHO_OS_MAC - fTimerRef(nullptr) - #else - fTimerWindow(nullptr), - fTimerWindowClassName() - #endif - { - } - - void registerNativeIdleCallback() - { - #ifdef DISTRHO_OS_MAC - constexpr const CFTimeInterval interval = DPF_VST3_TIMER_INTERVAL * 0.0001; - - CFRunLoopTimerContext context = {}; - context.info = this; - fTimerRef = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0, - platformIdleTimerCallback, &context); - DISTRHO_SAFE_ASSERT_RETURN(fTimerRef != nullptr,); - - CFRunLoopAddTimer(CFRunLoopGetCurrent(), fTimerRef, kCFRunLoopCommonModes); - #else - /* - * Create an invisible window to handle a timer. - * There is no need for implementing a window proc because DefWindowProc already calls the - * callback function when processing WM_TIMER messages. - */ - fTimerWindowClassName = ( - #ifdef DISTRHO_PLUGIN_BRAND - DISTRHO_PLUGIN_BRAND - #else - DISTRHO_MACRO_AS_STRING(DISTRHO_NAMESPACE) - #endif - "-" DISTRHO_PLUGIN_NAME "-" - ); - - char suffix[9]; - std::snprintf(suffix, sizeof(suffix), "%08x", std::rand()); - suffix[sizeof(suffix)-1] = '\0'; - fTimerWindowClassName += suffix; - - WNDCLASSEX cls; - ZeroMemory(&cls, sizeof(cls)); - cls.cbSize = sizeof(WNDCLASSEX); - cls.cbWndExtra = sizeof(LONG_PTR); - cls.lpszClassName = fTimerWindowClassName.buffer(); - cls.lpfnWndProc = DefWindowProc; - RegisterClassEx(&cls); - - fTimerWindow = CreateWindowEx(0, cls.lpszClassName, "DPF Timer Helper", - 0, 0, 0, 0, 0, HWND_MESSAGE, nullptr, nullptr, nullptr); - DISTRHO_SAFE_ASSERT_RETURN(fTimerWindow != nullptr,); - - SetWindowLongPtr(fTimerWindow, GWLP_USERDATA, reinterpret_cast(static_cast(this))); - SetTimer(fTimerWindow, DPF_VST3_WIN32_TIMER_ID, DPF_VST3_TIMER_INTERVAL, - static_cast(platformIdleTimerCallback)); - #endif - } - - void unregisterNativeIdleCallback() - { - #ifdef DISTRHO_OS_MAC - CFRunLoopRemoveTimer(CFRunLoopGetCurrent(), fTimerRef, kCFRunLoopCommonModes); - CFRelease(fTimerRef); - #else - DISTRHO_SAFE_ASSERT_RETURN(fTimerWindow != nullptr,); - KillTimer(fTimerWindow, DPF_VST3_WIN32_TIMER_ID); - DestroyWindow(fTimerWindow); - UnregisterClass(fTimerWindowClassName, nullptr); - #endif - } - -private: - IdleCallback* const fCallback; - - #ifdef DISTRHO_OS_MAC - CFRunLoopTimerRef fTimerRef; - - static void platformIdleTimerCallback(CFRunLoopTimerRef, void* const info) - { - static_cast(info)->fCallback->idleCallback(); - } - #else - HWND fTimerWindow; - String fTimerWindowClassName; - - static void WINAPI platformIdleTimerCallback(const HWND hwnd, UINT, UINT_PTR, DWORD) - { - reinterpret_cast(GetWindowLongPtr(hwnd, GWLP_USERDATA))->fCallback->idleCallback(); - } - #endif -}; -#endif - -/** - * Helper class for getting a native idle timer, either through pugl or via native APIs. + * Helper class for getting a native idle timer. */ #if !DPF_VST3_USING_HOST_RUN_LOOP class NativeIdleCallback : public IdleCallback @@ -250,49 +134,25 @@ class NativeIdleCallback : public IdleCallback public: NativeIdleCallback(UIExporter& ui) : fCallbackRegistered(false), - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - fIdleHelper(this) - #else - fUI(ui) - #endif - { - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - // unused - (void)ui; - #endif - } + fUI(ui) {} void registerNativeIdleCallback() { DISTRHO_SAFE_ASSERT_RETURN(!fCallbackRegistered,); fCallbackRegistered = true; - - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - fIdleHelper.registerNativeIdleCallback(); - #else fUI.addIdleCallbackForNativeIdle(this, DPF_VST3_TIMER_INTERVAL); - #endif } void unregisterNativeIdleCallback() { DISTRHO_SAFE_ASSERT_RETURN(fCallbackRegistered,); fCallbackRegistered = false; - - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - fIdleHelper.unregisterNativeIdleCallback(); - #else fUI.removeIdleCallbackForNativeIdle(this); - #endif } private: bool fCallbackRegistered; - #if DISTRHO_PLUGIN_HAS_EXTERNAL_UI - NativeIdleHelper fIdleHelper; - #else UIExporter& fUI; - #endif }; #endif @@ -392,7 +252,6 @@ public: // ---------------------------------------------------------------------------------------------------------------- // v3_plugin_view interface calls -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI v3_result onWheel(float /*distance*/) { // TODO @@ -432,7 +291,6 @@ public: fUI.notifyFocusChanged(state); return V3_OK; } -#endif v3_result getSize(v3_view_rect* const rect) const noexcept { @@ -889,6 +747,7 @@ private: { DISTRHO_SAFE_ASSERT_RETURN(fView != nullptr,); DISTRHO_SAFE_ASSERT_RETURN(fFrame != nullptr,); + DISTRHO_SAFE_ASSERT_RETURN(width != 0 && height != 0,); #ifdef DISTRHO_OS_MAC const double scaleFactor = fUI.getScaleFactor(); @@ -1463,7 +1322,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { static v3_result V3_API on_wheel(void* const self, const float distance) { -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI d_debug("dpf_plugin_view::on_wheel => %p %f", self, distance); dpf_plugin_view* const view = *static_cast(self); @@ -1471,16 +1329,10 @@ struct dpf_plugin_view : v3_plugin_view_cpp { DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); return uivst3->onWheel(distance); -#else - return V3_NOT_IMPLEMENTED; - // unused - (void)self; (void)distance; -#endif } static v3_result V3_API on_key_down(void* const self, const int16_t key_char, const int16_t key_code, const int16_t modifiers) { -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI d_debug("dpf_plugin_view::on_key_down => %p %i %i %i", self, key_char, key_code, modifiers); dpf_plugin_view* const view = *static_cast(self); @@ -1488,16 +1340,10 @@ struct dpf_plugin_view : v3_plugin_view_cpp { DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); return uivst3->onKeyDown(key_char, key_code, modifiers); -#else - return V3_NOT_IMPLEMENTED; - // unused - (void)self; (void)key_char; (void)key_code; (void)modifiers; -#endif } static v3_result V3_API on_key_up(void* const self, const int16_t key_char, const int16_t key_code, const int16_t modifiers) { -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI d_debug("dpf_plugin_view::on_key_up => %p %i %i %i", self, key_char, key_code, modifiers); dpf_plugin_view* const view = *static_cast(self); @@ -1505,11 +1351,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); return uivst3->onKeyUp(key_char, key_code, modifiers); -#else - return V3_NOT_IMPLEMENTED; - // unused - (void)self; (void)key_char; (void)key_code; (void)modifiers; -#endif } static v3_result V3_API get_size(void* const self, v3_view_rect* const rect) @@ -1526,10 +1367,10 @@ struct dpf_plugin_view : v3_plugin_view_cpp { double scaleFactor = view->scale != nullptr ? view->scale->scaleFactor : 0.0; #if defined(DISTRHO_UI_DEFAULT_WIDTH) && defined(DISTRHO_UI_DEFAULT_HEIGHT) - rect->right = DISTRHO_UI_DEFAULT_WIDTH; - rect->bottom = DISTRHO_UI_DEFAULT_HEIGHT; if (d_isZero(scaleFactor)) scaleFactor = 1.0; + rect->right = DISTRHO_UI_DEFAULT_WIDTH * scaleFactor; + rect->bottom = DISTRHO_UI_DEFAULT_HEIGHT * scaleFactor; #else UIExporter tmpUI(nullptr, 0, view->sampleRate, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, d_nextBundlePath, @@ -1539,6 +1380,7 @@ struct dpf_plugin_view : v3_plugin_view_cpp { scaleFactor = tmpUI.getScaleFactor(); tmpUI.quit(); #endif + rect->left = rect->top = 0; #ifdef DISTRHO_OS_MAC rect->right /= scaleFactor; @@ -1567,7 +1409,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { static v3_result V3_API on_focus(void* const self, const v3_bool state) { -#if !DISTRHO_PLUGIN_HAS_EXTERNAL_UI d_debug("dpf_plugin_view::on_focus => %p %u", self, state); dpf_plugin_view* const view = *static_cast(self); @@ -1575,11 +1416,6 @@ struct dpf_plugin_view : v3_plugin_view_cpp { DISTRHO_SAFE_ASSERT_RETURN(uivst3 != nullptr, V3_NOT_INITIALIZED); return uivst3->onFocus(state); -#else - return V3_NOT_IMPLEMENTED; - // unused - (void)self; (void)state; -#endif } static v3_result V3_API set_frame(void* const self, v3_plugin_frame** const frame) diff --git a/dpf/distrho/src/DistrhoUtils.cpp b/dpf/distrho/src/DistrhoUtils.cpp index cf01598..c7146fc 100644 --- a/dpf/distrho/src/DistrhoUtils.cpp +++ b/dpf/distrho/src/DistrhoUtils.cpp @@ -1,6 +1,6 @@ /* * DISTRHO Plugin Framework (DPF) - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * Permission to use, copy, modify, and/or distribute this software for any purpose with * or without fee is hereby granted, provided that the above copyright notice and this @@ -19,6 +19,7 @@ #endif #include "../extra/String.hpp" +#include "../DistrhoPluginUtils.hpp" #include "../DistrhoStandaloneUtils.hpp" #ifdef DISTRHO_OS_WINDOWS @@ -49,7 +50,7 @@ BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID) START_NAMESPACE_DISTRHO -// ----------------------------------------------------------------------- +// -------------------------------------------------------------------------------------------------------------------- const char* getBinaryFilename() { @@ -77,7 +78,9 @@ const char* getBinaryFilename() const char* getPluginFormatName() noexcept { -#if defined(DISTRHO_PLUGIN_TARGET_CARLA) +#if defined(DISTRHO_PLUGIN_TARGET_AU) + return "AudioUnit"; +#elif defined(DISTRHO_PLUGIN_TARGET_CARLA) return "Carla"; #elif defined(DISTRHO_PLUGIN_TARGET_JACK) #if defined(DISTRHO_OS_WASM) @@ -110,7 +113,7 @@ const char* getResourcePath(const char* const bundlePath) noexcept { DISTRHO_SAFE_ASSERT_RETURN(bundlePath != nullptr, nullptr); - #if defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_VST2) || defined(DISTRHO_PLUGIN_TARGET_CLAP) + #if defined(DISTRHO_PLUGIN_TARGET_AU) || defined(DISTRHO_PLUGIN_TARGET_JACK) || defined(DISTRHO_PLUGIN_TARGET_VST2) || defined(DISTRHO_PLUGIN_TARGET_CLAP) static String resourcePath; if (resourcePath.isEmpty()) @@ -163,6 +166,11 @@ bool requestBufferSizeChange(uint) { return false; } bool requestMIDI() { return false; } #endif -// ----------------------------------------------------------------------- +/* define webview start */ +#ifdef DPF_USING_LD_LINUX_WEBVIEW +int dpf_webview_start(int argc, char* argv[]); +#endif + +// -------------------------------------------------------------------------------------------------------------------- END_NAMESPACE_DISTRHO diff --git a/dpf/distrho/src/jackbridge/JackBridge.cpp b/dpf/distrho/src/jackbridge/JackBridge.cpp index 518f763..18676ae 100644 --- a/dpf/distrho/src/jackbridge/JackBridge.cpp +++ b/dpf/distrho/src/jackbridge/JackBridge.cpp @@ -475,12 +475,12 @@ struct JackBridge { if (lib == nullptr) { - fprintf(stderr, "Failed to load JACK DLL, reason:\n%s\n", lib_error(filename)); + d_stderr("Failed to load JACK DLL, reason:\n%s", lib_error(filename)); return; } else { - fprintf(stdout, "%s loaded successfully!\n", filename); + d_stdout("%s loaded successfully!", filename); } #define JOIN(a, b) a ## b diff --git a/dpf/distrho/src/jackbridge/NativeBridge.hpp b/dpf/distrho/src/jackbridge/NativeBridge.hpp index ac96954..33793e8 100644 --- a/dpf/distrho/src/jackbridge/NativeBridge.hpp +++ b/dpf/distrho/src/jackbridge/NativeBridge.hpp @@ -49,10 +49,10 @@ struct NativeBridge { uint numMidiOuts; // JACK callbacks - JackProcessCallback jackProcessCallback = nullptr; - JackBufferSizeCallback bufferSizeCallback = nullptr; - void* jackProcessArg = nullptr; - void* jackBufferSizeArg = nullptr; + JackProcessCallback jackProcessCallback; + JackBufferSizeCallback bufferSizeCallback; + void* jackProcessArg; + void* jackBufferSizeArg; // Runtime buffers enum PortMask { diff --git a/dpf/utils/au-services-restart.sh b/dpf/utils/au-services-restart.sh new file mode 100755 index 0000000..5248174 --- /dev/null +++ b/dpf/utils/au-services-restart.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +rm -f "~/Library/Application Support/AU Lab/com.apple.audio.aulab_componentcache.plist" +rm -rf "~/Library/Caches/AudioUnitCache" +killall -9 AudioComponentRegistrar +sudo killall -9 AudioComponentRegistrar +exit 0 diff --git a/dpf/utils/generate-ttl.sh b/dpf/utils/generate-ttl.sh index 0ddbb1f..a6a724d 100755 --- a/dpf/utils/generate-ttl.sh +++ b/dpf/utils/generate-ttl.sh @@ -1,6 +1,6 @@ #!/bin/bash -# function not available on some systems +# the realpath function is not available on some systems if ! which realpath &>/dev/null; then function realpath() { [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" @@ -9,7 +9,13 @@ fi set -e -if [ ! -d bin ]; then +BIN_DIR=${1} + +if [ -z "${BIN_DIR}" ]; then + BIN_DIR=bin +fi + +if [ ! -d ${BIN_DIR} ]; then echo "Please run this script from the source root folder" exit fi @@ -17,7 +23,7 @@ fi PWD="$(dirname "${0}")" if [ -f "${PWD}/lv2_ttl_generator.exe" ]; then - GEN="${PWD}/lv2_ttl_generator.exe" + GEN="$(realpath ${PWD}/lv2_ttl_generator.exe)" EXT=dll else GEN="$(realpath ${PWD}/lv2_ttl_generator)" @@ -28,7 +34,7 @@ else fi fi -cd bin +cd ${BIN_DIR} FOLDERS=`find . -type d -name \*.lv2` for i in ${FOLDERS}; do diff --git a/dpf/utils/package-osx-bundles.sh b/dpf/utils/package-osx-bundles.sh index 2291ec6..8406a19 100755 --- a/dpf/utils/package-osx-bundles.sh +++ b/dpf/utils/package-osx-bundles.sh @@ -1,32 +1,63 @@ #!/bin/bash +# the realpath function is not available on some systems +if ! which realpath &>/dev/null; then + function realpath() { + [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}" + } +fi + set -e +DPF_UTILS_DIR="$(dirname $(realpath ${0}))" + if [ -d bin ]; then cd bin +elif [ -d build/bin ]; then + cd build/bin else echo "Please run this script from the root folder" exit fi -NAME="$(basename $(git rev-parse --show-toplevel))" -SNAME="$(echo ${NAME} | tr -d ' ' | tr '/' '-')" +# can be overridden by environment variables +MACOS_PKG_LICENSE_FILE=${MACOS_PKG_LICENSE_FILE:=""} +MACOS_PKG_NAME=${MACOS_PKG_NAME:="$(basename $(git rev-parse --show-toplevel))"} +MACOS_PKG_SNAME=${MACOS_PKG_SNAME:="$(echo ${MACOS_PKG_NAME} | tr -d ' ' | tr '/' '-')"} +MACOS_PKG_SYMBOL=${MACOS_PKG_SYMBOL:="studio.kx.distrho.plugins.${MACOS_PKG_SNAME}"} +MACOS_PKG_WELCOME_TXT=${MACOS_PKG_WELCOME_TXT:=${DPF_UTILS_DIR}/plugin.pkg/welcome.txt.in} + +# backwards compat +if [ -n "${WELCOME_TXT}" ]; then + MACOS_PKG_WELCOME_TXT="${WELCOME_TXT}" +fi SKIP_START="" +if [ -n "${MACOS_INSTALLER_DEV_ID}" ]; then + PKG_SIGN_ARGS=(--sign "${MACOS_INSTALLER_DEV_ID}") +fi + rm -rf pkg mkdir pkg +if [ -z "${MACOS_PKG_LICENSE_FILE}" ]; then + SKIP_LICENSE_START="${SKIP_START}" + SKIP_LICENSE_END="${SKIP_END}" +fi + ENABLE_AU=$(find . -maxdepth 1 -name '*.component' -print -quit | grep -q '.component' && echo 1 || echo) if [ -n "${ENABLE_AU}" ]; then mkdir pkg/au cp -RL *.component pkg/au/ + [ -n "${MACOS_APP_DEV_ID}" ] && codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime pkg/au/*.component pkgbuild \ - --identifier "studio.kx.distrho.plugins.${SNAME}.components" \ + --identifier "${MACOS_PKG_SYMBOL}-components" \ --install-location "/Library/Audio/Plug-Ins/Components/" \ --root "${PWD}/pkg/au/" \ - ../dpf-${SNAME}-components.pkg + "${PKG_SIGN_ARGS[@]}" \ + ../dpf-${MACOS_PKG_SNAME}-components.pkg else SKIP_AU_START="${SKIP_START}" SKIP_AU_END="${SKIP_END}" @@ -36,11 +67,13 @@ ENABLE_CLAP=$(find . -maxdepth 1 -name '*.clap' -print -quit | grep -q '.clap' & if [ -n "${ENABLE_CLAP}" ]; then mkdir pkg/clap cp -RL *.clap pkg/clap/ + [ -n "${MACOS_APP_DEV_ID}" ] && codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime pkg/clap/*.clap pkgbuild \ - --identifier "studio.kx.distrho.plugins.${SNAME}.clapbundles" \ + --identifier "${MACOS_PKG_SYMBOL}-clapbundles" \ --install-location "/Library/Audio/Plug-Ins/CLAP/" \ --root "${PWD}/pkg/clap/" \ - ../dpf-${SNAME}-clapbundles.pkg + "${PKG_SIGN_ARGS[@]}" \ + ../dpf-${MACOS_PKG_SNAME}-clapbundles.pkg else SKIP_CLAP_START="${SKIP_START}" SKIP_CLAP_END="${SKIP_END}" @@ -50,11 +83,13 @@ ENABLE_LV2=$(find . -maxdepth 1 -name '*.lv2' -print -quit | grep -q '.lv2' && e if [ -n "${ENABLE_LV2}" ]; then mkdir pkg/lv2 cp -RL *.lv2 pkg/lv2/ + [ -n "${MACOS_APP_DEV_ID}" ] && codesign -s "${MACOS_APP_DEV_ID}" --force --verbose --option=runtime pkg/lv2/*.lv2/*.dylib pkgbuild \ - --identifier "studio.kx.distrho.plugins.${SNAME}.lv2bundles" \ + --identifier "${MACOS_PKG_SYMBOL}-lv2bundles" \ --install-location "/Library/Audio/Plug-Ins/LV2/" \ --root "${PWD}/pkg/lv2/" \ - ../dpf-${SNAME}-lv2bundles.pkg + "${PKG_SIGN_ARGS[@]}" \ + ../dpf-${MACOS_PKG_SNAME}-lv2bundles.pkg else SKIP_LV2_START="${SKIP_START}" SKIP_LV2_END="${SKIP_END}" @@ -64,11 +99,13 @@ ENABLE_VST2=$(find . -maxdepth 1 -name '*.vst' -print -quit | grep -q '.vst' && if [ -n "${ENABLE_VST2}" ]; then mkdir pkg/vst2 cp -RL *.vst pkg/vst2/ + [ -n "${MACOS_APP_DEV_ID}" ] && codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime pkg/vst2/*.vst pkgbuild \ - --identifier "studio.kx.distrho.plugins.${SNAME}.vst2bundles" \ + --identifier "${MACOS_PKG_SYMBOL}-vst2bundles" \ --install-location "/Library/Audio/Plug-Ins/VST/" \ --root "${PWD}/pkg/vst2/" \ - ../dpf-${SNAME}-vst2bundles.pkg + "${PKG_SIGN_ARGS[@]}" \ + ../dpf-${MACOS_PKG_SNAME}-vst2bundles.pkg else SKIP_VST2_START="${SKIP_START}" SKIP_VST2_END="${SKIP_END}" @@ -78,11 +115,13 @@ ENABLE_VST3=$(find . -maxdepth 1 -name '*.vst3' -print -quit | grep -q '.vst3' & if [ -n "${ENABLE_VST3}" ]; then mkdir pkg/vst3 cp -RL *.vst3 pkg/vst3/ + [ -n "${MACOS_APP_DEV_ID}" ] && codesign -s "${MACOS_APP_DEV_ID}" --deep --force --verbose --option=runtime pkg/vst3/*.vst3 pkgbuild \ - --identifier "studio.kx.distrho.plugins.${SNAME}.vst3bundles" \ + --identifier "${MACOS_PKG_SYMBOL}-vst3bundles" \ --install-location "/Library/Audio/Plug-Ins/VST3/" \ --root "${PWD}/pkg/vst3/" \ - ../dpf-${SNAME}-vst3bundles.pkg + "${PKG_SIGN_ARGS[@]}" \ + ../dpf-${MACOS_PKG_SNAME}-vst3bundles.pkg else SKIP_VST3_START="${SKIP_START}" SKIP_VST3_END="${SKIP_END}" @@ -90,36 +129,34 @@ fi cd .. -DPF_UTILS_DIR=$(dirname ${0}) - -# can be overridden by environment variables -WELCOME_TXT=${WELCOME_TXT:=${DPF_UTILS_DIR}/plugin.pkg/welcome.txt.in} - mkdir -p build -sed -e "s|@name@|${NAME}|" "${WELCOME_TXT}" > build/welcome.txt +sed -e "s|@name@|${MACOS_PKG_NAME}|" "${MACOS_PKG_WELCOME_TXT}" > build/welcome.txt sed -e "s|@builddir@|${PWD}/build|" \ + -e "s|@skip_license_start@|${SKIP_LICENSE_START}|" \ -e "s|@skip_au_start@|${SKIP_AU_START}|" \ -e "s|@skip_clap_start@|${SKIP_CLAP_START}|" \ -e "s|@skip_lv2_start@|${SKIP_LV2_START}|" \ -e "s|@skip_vst2_start@|${SKIP_VST2_START}|" \ -e "s|@skip_vst3_start@|${SKIP_VST3_START}|" \ + -e "s|@skip_license_end@|${SKIP_LICENSE_END}|" \ -e "s|@skip_au_end@|${SKIP_AU_END}|" \ -e "s|@skip_clap_end@|${SKIP_CLAP_END}|" \ -e "s|@skip_lv2_end@|${SKIP_LV2_END}|" \ -e "s|@skip_vst2_end@|${SKIP_VST2_END}|" \ -e "s|@skip_vst3_end@|${SKIP_VST3_END}|" \ - -e "s|@aubundleref@|dpf-${SNAME}-components.pkg|" \ - -e "s|@clapbundleref@|dpf-${SNAME}-clapbundles.pkg|" \ - -e "s|@lv2bundleref@|dpf-${SNAME}-lv2bundles.pkg|" \ - -e "s|@vst2bundleref@|dpf-${SNAME}-vst2bundles.pkg|" \ - -e "s|@vst3bundleref@|dpf-${SNAME}-vst3bundles.pkg|" \ - -e "s|@name@|${NAME}|g" \ - -e "s|@sname@|${SNAME}|g" \ + -e "s|@license_file@|${MACOS_PKG_LICENSE_FILE}|" \ + -e "s|@name@|${MACOS_PKG_NAME}|g" \ + -e "s|@sname@|${MACOS_PKG_SNAME}|g" \ + -e "s|@symbol@|${MACOS_PKG_SYMBOL}|g" \ ${DPF_UTILS_DIR}/plugin.pkg/package.xml.in > build/package.xml productbuild \ --distribution build/package.xml \ - --identifier "studio.kx.distrho.${SNAME}" \ + --identifier "${MACOS_PKG_SYMBOL}" \ --package-path "${PWD}" \ --version 0 \ - ${SNAME}-macOS.pkg + "${PKG_SIGN_ARGS[@]}" \ + ${MACOS_PKG_SNAME}-macOS.pkg + +# xcrun notarytool submit build/*-macOS.pkg --keychain-profile "build-notary" --wait +# xcrun notarytool log --keychain-profile "build-notary" 00000000-0000-0000-0000-000000000000 diff --git a/dpf/utils/plugin.pkg/package.xml.in b/dpf/utils/plugin.pkg/package.xml.in index 7d81e66..e09be28 100644 --- a/dpf/utils/plugin.pkg/package.xml.in +++ b/dpf/utils/plugin.pkg/package.xml.in @@ -2,39 +2,40 @@ @name@ + @skip_license_start@@skip_license_end@ - + @skip_au_start@ - - @aubundleref@ + + dpf-@sname@-components.pkg @skip_au_end@ @skip_clap_start@ - - @clapbundleref@ + + dpf-@sname@-clapbundles.pkg @skip_clap_end@ @skip_lv2_start@ - - @lv2bundleref@ + + dpf-@sname@-lv2bundles.pkg @skip_lv2_end@ @skip_vst2_start@ - - @vst2bundleref@ + + dpf-@sname@-vst2bundles.pkg @skip_vst2_end@ @skip_vst3_start@ - - @vst3bundleref@ + + dpf-@sname@-vst3bundles.pkg @skip_vst3_end@ - @skip_au_start@@skip_au_end@ - @skip_clap_start@@skip_clap_end@ - @skip_lv2_start@@skip_lv2_end@ - @skip_vst2_start@@skip_vst2_end@ - @skip_vst3_start@@skip_vst3_end@ + @skip_au_start@@skip_au_end@ + @skip_clap_start@@skip_clap_end@ + @skip_lv2_start@@skip_lv2_end@ + @skip_vst2_start@@skip_vst2_end@ + @skip_vst3_start@@skip_vst3_end@ diff --git a/dpf/utils/symbols/au.exp b/dpf/utils/symbols/au.exp new file mode 100644 index 0000000..3672276 --- /dev/null +++ b/dpf/utils/symbols/au.exp @@ -0,0 +1 @@ +_PluginAUFactory diff --git a/plugins/3BandEQ/DistrhoPlugin3BandEQ.hpp b/plugins/3BandEQ/DistrhoPlugin3BandEQ.hpp index 2b70a6d..36a6ba0 100644 --- a/plugins/3BandEQ/DistrhoPlugin3BandEQ.hpp +++ b/plugins/3BandEQ/DistrhoPlugin3BandEQ.hpp @@ -74,11 +74,6 @@ protected: return d_version(1, 0, 0); } - int64_t getUniqueId() const noexcept override - { - return d_cconst('D', '3', 'E', 'Q'); - } - // ------------------------------------------------------------------- // Init diff --git a/plugins/3BandEQ/DistrhoPluginInfo.h b/plugins/3BandEQ/DistrhoPluginInfo.h index 084bc1a..1e10e27 100644 --- a/plugins/3BandEQ/DistrhoPluginInfo.h +++ b/plugins/3BandEQ/DistrhoPluginInfo.h @@ -1,6 +1,6 @@ /* * DISTRHO 3BandEQ Plugin, based on 3BandEQ by Michael Gruhn - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,9 @@ #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandEQ" #define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.3BandEQ" +#define DISTRHO_PLUGIN_BRAND_ID Dstr +#define DISTRHO_PLUGIN_UNIQUE_ID D3EQ + #define DISTRHO_PLUGIN_HAS_UI 1 #define DISTRHO_PLUGIN_IS_RT_SAFE 1 #define DISTRHO_PLUGIN_NUM_INPUTS 2 @@ -32,4 +35,6 @@ #define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:EQPlugin" #define DISTRHO_PLUGIN_VST3_CATEGORIES "Fx|EQ" +#define DPF_VST3_DONT_USE_BRAND_ID + #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED diff --git a/plugins/3BandEQ/Makefile b/plugins/3BandEQ/Makefile index 998b748..0fa56be 100644 --- a/plugins/3BandEQ/Makefile +++ b/plugins/3BandEQ/Makefile @@ -23,19 +23,18 @@ FILES_UI = \ # Do some magic UI_TYPE = generic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- # Enable all possible plugin types -TARGETS = jack ladspa lv2_sep vst2 vst3 clap +TARGETS = au clap jack ladspa lv2_sep vst2 vst3 -ifeq ($(HAVE_CAIRO_OR_OPENGL),true) -ifeq ($(HAVE_LIBLO),true) +ifeq ($(HAVE_CAIRO_OR_OPENGL)$(HAVE_LIBLO),truetrue) TARGETS += dssi endif -endif all: $(TARGETS) diff --git a/plugins/3BandSplitter/DistrhoPlugin3BandSplitter.hpp b/plugins/3BandSplitter/DistrhoPlugin3BandSplitter.hpp index fd8d74e..60930fa 100644 --- a/plugins/3BandSplitter/DistrhoPlugin3BandSplitter.hpp +++ b/plugins/3BandSplitter/DistrhoPlugin3BandSplitter.hpp @@ -82,11 +82,6 @@ protected: return d_version(1, 0, 0); } - int64_t getUniqueId() const noexcept override - { - return d_cconst('D', '3', 'E', 'S'); - } - // ------------------------------------------------------------------- // Init diff --git a/plugins/3BandSplitter/DistrhoPluginInfo.h b/plugins/3BandSplitter/DistrhoPluginInfo.h index a5e57f0..ed3a7d2 100644 --- a/plugins/3BandSplitter/DistrhoPluginInfo.h +++ b/plugins/3BandSplitter/DistrhoPluginInfo.h @@ -1,6 +1,6 @@ /* * DISTRHO 3BandSplitter Plugin, based on 3BandSplitter by Michael Gruhn - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,9 @@ #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/3BandSplitter" #define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.3BandSplitter" +#define DISTRHO_PLUGIN_BRAND_ID Dstr +#define DISTRHO_PLUGIN_UNIQUE_ID D3ES + #define DISTRHO_PLUGIN_HAS_UI 1 #define DISTRHO_PLUGIN_IS_RT_SAFE 1 #define DISTRHO_PLUGIN_NUM_INPUTS 2 @@ -32,4 +35,6 @@ #define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:EQPlugin" #define DISTRHO_PLUGIN_VST3_CATEGORIES "Fx|EQ" +#define DPF_VST3_DONT_USE_BRAND_ID + #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED diff --git a/plugins/3BandSplitter/Makefile b/plugins/3BandSplitter/Makefile index 91b90c6..82bba56 100644 --- a/plugins/3BandSplitter/Makefile +++ b/plugins/3BandSplitter/Makefile @@ -23,19 +23,18 @@ FILES_UI = \ # Do some magic UI_TYPE = generic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- # Enable all possible plugin types -TARGETS = jack ladspa lv2_sep vst2 vst3 clap +TARGETS = au clap jack ladspa lv2_sep vst2 vst3 -ifeq ($(HAVE_CAIRO_OR_OPENGL),true) -ifeq ($(HAVE_LIBLO),true) +ifeq ($(HAVE_CAIRO_OR_OPENGL)$(HAVE_LIBLO),truetrue) TARGETS += dssi endif -endif all: $(TARGETS) diff --git a/plugins/AmplitudeImposer/Makefile b/plugins/AmplitudeImposer/Makefile index eee2cce..355634b 100644 --- a/plugins/AmplitudeImposer/Makefile +++ b/plugins/AmplitudeImposer/Makefile @@ -23,7 +23,8 @@ FILES_UI = \ # Do some magic UI_TYPE = generic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- diff --git a/plugins/CycleShifter/Makefile b/plugins/CycleShifter/Makefile index 8aba6d1..5d209f3 100644 --- a/plugins/CycleShifter/Makefile +++ b/plugins/CycleShifter/Makefile @@ -23,7 +23,8 @@ FILES_UI = \ # Do some magic UI_TYPE = generic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- diff --git a/plugins/MVerb/Makefile b/plugins/MVerb/Makefile index aeb93f1..a39ceca 100644 --- a/plugins/MVerb/Makefile +++ b/plugins/MVerb/Makefile @@ -22,7 +22,8 @@ FILES_UI = \ # -------------------------------------------------------------- # Do some magic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- diff --git a/plugins/Nekobi/DistrhoPluginInfo.h b/plugins/Nekobi/DistrhoPluginInfo.h index 3b11bb9..8ad35fe 100644 --- a/plugins/Nekobi/DistrhoPluginInfo.h +++ b/plugins/Nekobi/DistrhoPluginInfo.h @@ -1,6 +1,6 @@ /* * DISTRHO Nekobi Plugin, based on Nekobee by Sean Bolton and others. - * Copyright (C) 2013-2022 Filipe Coelho + * Copyright (C) 2013-2024 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as @@ -25,6 +25,9 @@ #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/Nekobi" #define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.Nekobi" +#define DISTRHO_PLUGIN_BRAND_ID Dstr +#define DISTRHO_PLUGIN_UNIQUE_ID DNek + #define DISTRHO_PLUGIN_HAS_UI 1 #define DISTRHO_PLUGIN_IS_RT_SAFE 1 #define DISTRHO_PLUGIN_IS_SYNTH 1 @@ -34,4 +37,6 @@ #define DISTRHO_UI_DEFAULT_WIDTH DistrhoArtworkNekobi::backgroundWidth #define DISTRHO_UI_DEFAULT_HEIGHT DistrhoArtworkNekobi::backgroundHeight +#define DPF_VST3_DONT_USE_BRAND_ID + #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED diff --git a/plugins/Nekobi/DistrhoPluginNekobi.hpp b/plugins/Nekobi/DistrhoPluginNekobi.hpp index 19621a1..caca231 100644 --- a/plugins/Nekobi/DistrhoPluginNekobi.hpp +++ b/plugins/Nekobi/DistrhoPluginNekobi.hpp @@ -80,11 +80,6 @@ protected: return d_version(1, 1, 0); } - int64_t getUniqueId() const noexcept override - { - return d_cconst('D', 'N', 'e', 'k'); - } - // ------------------------------------------------------------------- // Init diff --git a/plugins/Nekobi/Makefile b/plugins/Nekobi/Makefile index 0a62590..ff09fa1 100644 --- a/plugins/Nekobi/Makefile +++ b/plugins/Nekobi/Makefile @@ -23,7 +23,8 @@ FILES_UI = \ # Do some magic UI_TYPE = generic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- @@ -37,6 +38,6 @@ endif # -------------------------------------------------------------- # Enable all possible plugin types -all: jack dssi lv2_sep vst2 vst3 clap +all: au clap dssi jack lv2_sep vst2 vst3 # -------------------------------------------------------------- diff --git a/plugins/PingPongPan/DistrhoPluginInfo.h b/plugins/PingPongPan/DistrhoPluginInfo.h index 0a6fcf6..7402b54 100644 --- a/plugins/PingPongPan/DistrhoPluginInfo.h +++ b/plugins/PingPongPan/DistrhoPluginInfo.h @@ -1,6 +1,6 @@ /* * DISTRHO PingPongPan Plugin, based on PingPongPan by Michael Gruhn - * Copyright (C) 2012-2022 Filipe Coelho + * Copyright (C) 2012-2024 Filipe Coelho * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -22,6 +22,9 @@ #define DISTRHO_PLUGIN_URI "http://distrho.sf.net/plugins/PingPongPan" #define DISTRHO_PLUGIN_CLAP_ID "studio.kx.distrho.PingPongPan" +#define DISTRHO_PLUGIN_BRAND_ID Dstr +#define DISTRHO_PLUGIN_UNIQUE_ID DPPP + #define DISTRHO_PLUGIN_HAS_UI 1 #define DISTRHO_PLUGIN_IS_RT_SAFE 1 #define DISTRHO_PLUGIN_NUM_INPUTS 2 @@ -32,4 +35,6 @@ #define DISTRHO_PLUGIN_LV2_CATEGORY "lv2:SpatialPlugin" #define DISTRHO_PLUGIN_VST3_CATEGORIES "Fx|Spatial" +#define DPF_VST3_DONT_USE_BRAND_ID + #endif // DISTRHO_PLUGIN_INFO_H_INCLUDED diff --git a/plugins/PingPongPan/DistrhoPluginPingPongPan.hpp b/plugins/PingPongPan/DistrhoPluginPingPongPan.hpp index fbda80b..511eaf1 100644 --- a/plugins/PingPongPan/DistrhoPluginPingPongPan.hpp +++ b/plugins/PingPongPan/DistrhoPluginPingPongPan.hpp @@ -70,11 +70,6 @@ protected: return d_version(1, 0, 0); } - int64_t getUniqueId() const noexcept override - { - return d_cconst('D', 'P', 'P', 'P'); - } - // ------------------------------------------------------------------- // Init diff --git a/plugins/PingPongPan/Makefile b/plugins/PingPongPan/Makefile index 08355eb..1c44ea9 100644 --- a/plugins/PingPongPan/Makefile +++ b/plugins/PingPongPan/Makefile @@ -23,19 +23,18 @@ FILES_UI = \ # Do some magic UI_TYPE = generic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- # Enable all possible plugin types -TARGETS = jack ladspa lv2_sep vst2 vst3 clap +TARGETS = au clap jack ladspa lv2_sep vst2 vst3 -ifeq ($(HAVE_CAIRO_OR_OPENGL),true) -ifeq ($(HAVE_LIBLO),true) +ifeq ($(HAVE_CAIRO_OR_OPENGL)$(HAVE_LIBLO),truetrue) TARGETS += dssi endif -endif all: $(TARGETS) diff --git a/plugins/ProM/Makefile b/plugins/ProM/Makefile index 74c6a53..b39f118 100644 --- a/plugins/ProM/Makefile +++ b/plugins/ProM/Makefile @@ -26,7 +26,8 @@ HAVE_PROJECTM = $(shell pkg-config --exists libprojectM && echo true) # -------------------------------------------------------------- # Import base definitions -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.base.mk # -------------------------------------------------------------- diff --git a/plugins/SoulForce/Makefile b/plugins/SoulForce/Makefile index 23b36f6..0e27755 100644 --- a/plugins/SoulForce/Makefile +++ b/plugins/SoulForce/Makefile @@ -23,7 +23,8 @@ FILES_UI = \ # Do some magic UI_TYPE = generic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # -------------------------------------------------------------- diff --git a/plugins/glBars/Makefile b/plugins/glBars/Makefile index 8be2bb2..22de4b9 100644 --- a/plugins/glBars/Makefile +++ b/plugins/glBars/Makefile @@ -21,7 +21,8 @@ FILES_UI = \ # -------------------------------------------------------------- # Do some magic -FILE_BROWSER_DISABLED = true +SKIP_NATIVE_AUDIO_FALLBACK = true +USE_FILE_BROWSER = false include ../../dpf/Makefile.plugins.mk # --------------------------------------------------------------